From a5dad89b61e16d76fd5556f3e78ff43ec4fe69e6 Mon Sep 17 00:00:00 2001 From: ZHW <1941286652@qq.com> Date: Tue, 16 Dec 2025 21:45:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BE=9B=E6=B0=B4=E6=9C=BA=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=9A=84=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../water/controller/WorkOrderController.java | 13 + .../water/service/WorkOrderService.java | 3 + .../water/service/WorkOrderServiceImpl.java | 6 + .../web/src/views/equipment/WaterSupplier.vue | 240 +++++++++++++++++- .../web/src/views/workorder/Completed.vue | 6 +- .../src/views/workorder/CompletedDetail.vue | 126 +++++---- .../web/src/views/workorder/Pending.vue | 24 +- .../web/src/views/workorder/Processing.vue | 6 +- .../web/src/views/workorder/Review.vue | 6 +- .../web/src/views/workorder/Timeout.vue | 64 +++-- 10 files changed, 393 insertions(+), 101 deletions(-) diff --git a/src/main/java/com/campus/water/controller/WorkOrderController.java b/src/main/java/com/campus/water/controller/WorkOrderController.java index 327cfe1..eecc63f 100644 --- a/src/main/java/com/campus/water/controller/WorkOrderController.java +++ b/src/main/java/com/campus/water/controller/WorkOrderController.java @@ -171,4 +171,17 @@ public class WorkOrderController { return ResultVO.error(500, "派单失败:" + e.getMessage()); } } + + // 获取单个工单详情 - 管理员和维修人员均可访问 +@GetMapping("/{orderId}") +@PreAuthorize("hasAnyRole('REPAIRMAN', 'SUPER_ADMIN', 'AREA_ADMIN')") +public ResultVO getOrderDetail(@PathVariable String orderId) { + try { + WorkOrder order = workOrderService.getOrderDetail(orderId); + return ResultVO.success(order); + } catch (Exception e) { + return ResultVO.error(500, "获取工单详情失败:" + e.getMessage()); + } +} + } \ No newline at end of file diff --git a/src/main/java/com/campus/water/service/WorkOrderService.java b/src/main/java/com/campus/water/service/WorkOrderService.java index 4388e78..e3220a4 100644 --- a/src/main/java/com/campus/water/service/WorkOrderService.java +++ b/src/main/java/com/campus/water/service/WorkOrderService.java @@ -4,6 +4,9 @@ import com.campus.water.entity.WorkOrder; import java.util.List; public interface WorkOrderService { + //按ID获取工单详情 + WorkOrder getOrderDetail(String orderId); + // 抢单 boolean grabOrder(String orderId, String repairmanId); diff --git a/src/main/java/com/campus/water/service/WorkOrderServiceImpl.java b/src/main/java/com/campus/water/service/WorkOrderServiceImpl.java index 0e6b182..97745aa 100644 --- a/src/main/java/com/campus/water/service/WorkOrderServiceImpl.java +++ b/src/main/java/com/campus/water/service/WorkOrderServiceImpl.java @@ -18,6 +18,12 @@ public class WorkOrderServiceImpl implements WorkOrderService { private final WorkOrderRepository workOrderRepository; private final RepairmanRepository repairmanRepository; + @Override + public WorkOrder getOrderDetail(String orderId) { + return workOrderRepository.findById(orderId) + .orElseThrow(() -> new RuntimeException("工单不存在")); + } + /** * 维修人员抢单功能 diff --git a/src/main/resources/web/src/views/equipment/WaterSupplier.vue b/src/main/resources/web/src/views/equipment/WaterSupplier.vue index 3162a55..c6b2471 100644 --- a/src/main/resources/web/src/views/equipment/WaterSupplier.vue +++ b/src/main/resources/web/src/views/equipment/WaterSupplier.vue @@ -8,7 +8,7 @@
- +
@@ -29,8 +29,10 @@ @change="handleSearch" > - - + + + + @@ -48,13 +50,13 @@
- +
- + @@ -65,7 +67,7 @@ - + - +
设备ID设备机型 设备机型 所属片区 详细位置 状态
{{ device.id }}供水机 供水机 {{ device.area }} {{ device.location }} @@ -76,10 +78,11 @@ {{ device.lastUploadTime }} +
暂无设备数据 暂无设备数据
@@ -105,6 +108,52 @@ 下一页
+ + + + + + @@ -137,6 +186,20 @@ const pageSize = 10 // 每页显示数量 const router = useRouter() const authStore = useAuthStore() +// 新增:添加设备相关状态 +const showAddModal = ref(false) +const newDevice = ref({ + deviceId: '', + deviceName: '', + areaId: 'A', + installLocation: '', + deviceType: 'water_supply' +}) + +// 新增:删除设备相关状态 +const showDeleteModal = ref(false) +const currentDeviceId = ref('') + // 加载供水机列表 const loadWaterSuppliers = async () => { try { @@ -233,6 +296,75 @@ const viewDevice = (id: string) => { router.push(`/home/equipment/water-supplier/${id}`) } +// 添加设备 +const addDevice = async () => { + try { + const token = authStore.token + if (!token) { + router.push('/login') + return + } + + const deviceToAdd = { + deviceId: newDevice.value.deviceId, + deviceName: newDevice.value.deviceName, + areaId: newDevice.value.areaId, + installLocation: newDevice.value.installLocation, + deviceType: newDevice.value.deviceType + } + + const result = await request>('/api/web/device/add', { + method: 'POST', + body: JSON.stringify(deviceToAdd) + }) + + if (result.code === 200) { + await loadWaterSuppliers() + showAddModal.value = false + alert('设备添加成功') + } else { + alert(`设备添加失败: ${result.message}`) + } + } catch (error) { + console.error('添加设备失败:', error) + alert('添加设备失败') + if ((error as Error).message.includes('401')) { + authStore.logout() + router.push('/login') + } + } +} + +// 删除设备 +const deleteDevice = async () => { + try { + const token = authStore.token + if (!token) { + router.push('/login') + return + } + + const result = await request>(`/api/web/device/delete/${currentDeviceId.value}`, { + method: 'DELETE' + }) + + if (result.code === 200) { + await loadWaterSuppliers() + showDeleteModal.value = false + alert('设备删除成功') + } else { + alert(`设备删除失败: ${result.message}`) + } + } catch (error) { + console.error('删除设备失败:', error) + alert('删除设备失败') + if ((error as Error).message.includes('401')) { + authStore.logout() + router.push('/login') + } + } +} + // 页面加载时获取数据 onMounted(() => { loadWaterSuppliers() @@ -285,6 +417,21 @@ onMounted(() => { background: #359e75; } +.btn-delete { + background: #cf1322; + color: white; + border: none; + padding: 8px 16px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; + transition: background 0.3s; +} + +.btn-delete:hover { + background: #b80c1a; +} + .filters { display: flex; gap: 12px; @@ -394,6 +541,11 @@ onMounted(() => { color: #1890ff; } +.btn-delete { + background-color: #ffebe6; + color: #cf1322; +} + .no-data { text-align: center; padding: 40px 0; @@ -423,6 +575,80 @@ onMounted(() => { cursor: not-allowed; } +/* 模态框样式 */ +.modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; +} + +.modal-content { + background: white; + padding: 24px; + border-radius: 8px; + min-width: 400px; + max-width: 500px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} + +.modal-content h3 { + margin-top: 0; + margin-bottom: 20px; + color: #333; +} + +.form-group { + margin-bottom: 16px; +} + +.form-group label { + display: block; + margin-bottom: 8px; + font-weight: 500; +} + +.form-group input, +.form-group select { + width: 100%; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + box-sizing: border-box; +} + +.form-actions { + display: flex; + justify-content: flex-end; + gap: 12px; + margin-top: 24px; +} + +.form-actions button { + padding: 8px 16px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; +} + +.form-actions button[type="button"] { + background: #f5f5f5; + border: 1px solid #ddd; + color: #333; +} + +.form-actions button[type="submit"] { + background: #42b983; + border: none; + color: white; +} + /* 响应式调整 */ @media (max-width: 768px) { .filters { diff --git a/src/main/resources/web/src/views/workorder/Completed.vue b/src/main/resources/web/src/views/workorder/Completed.vue index c5fa014..ac38596 100644 --- a/src/main/resources/web/src/views/workorder/Completed.vue +++ b/src/main/resources/web/src/views/workorder/Completed.vue @@ -26,8 +26,10 @@ diff --git a/src/main/resources/web/src/views/workorder/CompletedDetail.vue b/src/main/resources/web/src/views/workorder/CompletedDetail.vue index e410e73..5051a6b 100644 --- a/src/main/resources/web/src/views/workorder/CompletedDetail.vue +++ b/src/main/resources/web/src/views/workorder/CompletedDetail.vue @@ -116,9 +116,12 @@ + + +