From 7a6448d105a2c3c5b6b265e1b82bdcfc456981db Mon Sep 17 00:00:00 2001 From: ZHW <1941286652@qq.com> Date: Mon, 5 Jan 2026 21:17:45 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=89=87=E5=8C=BA=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E4=BF=A1=E6=81=AF=E5=92=8C=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E7=89=87=E5=8C=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/web/src/views/area/Campus.vue | 114 +++++++++++++++++- .../web/src/views/personnel/Admin.vue | 75 +++++++++--- 2 files changed, 171 insertions(+), 18 deletions(-) diff --git a/src/main/resources/web/src/views/area/Campus.vue b/src/main/resources/web/src/views/area/Campus.vue index 5666ada..69d9579 100644 --- a/src/main/resources/web/src/views/area/Campus.vue +++ b/src/main/resources/web/src/views/area/Campus.vue @@ -51,7 +51,11 @@ {{ campus.areaName }} {{ getCityName(campus.parentAreaId) }} {{ campus.address }} - {{ getManagerName(campus.manager) }} + + {{ managerNames[campus.areaId] }} + 加载中... + 未知负责人 + {{ campus.managerPhone }} {{ formatDate(campus.createdTime) }} @@ -348,6 +352,10 @@ const saving = ref(false) // 添加保存状态 const deleting = ref(false) // 添加删除状态 const loadingStats = ref(false) // 添加统计加载状态 +// 添加管理员姓名缓存 +const managerNames = ref>({}) // 存储管理员姓名的缓存 +const loadingManagerNames = ref([]) // 正在加载的管理员ID + // 表单数据 const formData = ref({ areaId: '', @@ -420,6 +428,84 @@ const totalPages = computed(() => { return Math.ceil(filteredCount / pageSize.value) }) +// 异步获取管理员姓名 +const loadManagerName = async (areaId: string, managerId: string) => { + if (!managerId) { + managerNames.value[areaId] = '未分配' + return + } + + // 避免重复加载 + if (loadingManagerNames.value.includes(areaId)) return + + loadingManagerNames.value.push(areaId) + + try { + const response = await request<{ + code: number + msg: string + data: Admin + }>(`/api/web/admin/${managerId}`, { + method: 'GET', + }) + + if (response.code === 200 && response.data) { + managerNames.value[areaId] = response.data.adminName + } else { + managerNames.value[areaId] = '未知负责人' + } + } catch (error) { + console.error('获取管理员姓名失败:', error) + managerNames.value[areaId] = '未知负责人' + } finally { + loadingManagerNames.value = loadingManagerNames.value.filter(id => id !== areaId) + } +} + +// 批量加载所有管理员姓名 +const loadAllManagerNames = async () => { + for (const campus of campusList.value) { + await loadManagerName(campus.areaId, campus.manager) + } +} + +// 更新管理员的区域ID +const updateAdminAreaId = async (adminId: string, areaId: string) => { + try { + const response = await request<{ + code: number + msg: string + data: Admin + }>('/api/web/admin/save', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${authStore.token}` + }, + body: JSON.stringify({ + adminId: adminId, + areaId: areaId + }) + }); + + if (response.code === 200) { + // 更新本地缓存 + const adminIndex = allAdminList.value.findIndex(admin => admin.adminId === adminId); + if (adminIndex !== -1) { // 确保索引有效 + const admin = allAdminList.value[adminIndex]; + if (admin) { // 确保元素存在 + admin.areaId = areaId; + } + } + console.log('管理员区域ID更新成功'); + } else { + console.error('更新管理员区域ID失败:', response.msg); + } + } catch (error) { + console.error('更新管理员区域ID请求失败:', error); + } +} + // 获取所有校区列表(通过多次调用市区接口获取所有校区) const fetchCampusList = async () => { loading.value = true @@ -472,6 +558,9 @@ const fetchCampusList = async () => { } campusList.value = allCampuses + + // 加载所有管理员姓名 + await loadAllManagerNames() } catch (error: any) { console.error('请求异常:', error) const errorMsg = error.message.includes('401') || error.message.includes('403') @@ -562,11 +651,14 @@ const fetchAdminList = async () => { } -// 处理负责人选择变化 - 修改为传递管理员ID而不是姓名 -const onManagerChange = () => { +// 处理负责人选择变化 - 修改为传递管理员ID而不是姓名,但不在此处更新管理员的areaId +const onManagerChange = async () => { if (selectedManager.value) { formData.value.manager = selectedManager.value.adminId // 传递管理员ID而非姓名 formData.value.managerPhone = selectedManager.value.phone + + // 在负责人选择变化时,不立即更新管理员的areaId,因为此时校区的areaId可能还未确定 + // 管理员的areaId将在校区保存成功后更新 } else { formData.value.manager = '' formData.value.managerPhone = '' @@ -612,6 +704,11 @@ const handleEdit = (campus: Area) => { selectedManager.value = matchedByName || null } + // 确保管理员的areaId与校区一致 + if (selectedManager.value && campus.areaId) { + selectedManager.value.areaId = campus.areaId; + } + showModal.value = true } @@ -699,6 +796,7 @@ const handleSave = async () => { 'Authorization': `Bearer ${authStore.token}` // 添加认证头 }, body: JSON.stringify({ + areaId: formData.value.areaId, areaName: formData.value.areaName, areaType: 'campus', parentAreaId: formData.value.parentAreaId, @@ -709,6 +807,10 @@ const handleSave = async () => { }) if (response?.code === 200 && response?.data) { + // 更新管理员的areaId + if (selectedManager.value && response.data.areaId) { + await updateAdminAreaId(selectedManager.value.adminId, response.data.areaId); + } await fetchCampusList() // 重新获取列表 showModal.value = false } else { @@ -759,6 +861,10 @@ const handleSave = async () => { }) if (response?.code === 200 && response?.data) { + // 更新管理员的areaId - 使用响应中的areaId + if (selectedManager.value && response.data.areaId) { + await updateAdminAreaId(selectedManager.value.adminId, response.data.areaId); + } await fetchCampusList() // 重新获取列表 showModal.value = false } else { @@ -783,7 +889,7 @@ const handleSave = async () => { } -// 根据管理员ID获取管理员姓名 +// 根据管理员ID获取管理员姓名 - 使用后端接口 const getManagerName = (managerId: string) => { if (!managerId) return '未分配' const admin = allAdminList.value.find(admin => admin.adminId === managerId) diff --git a/src/main/resources/web/src/views/personnel/Admin.vue b/src/main/resources/web/src/views/personnel/Admin.vue index 0209116..a6453ec 100644 --- a/src/main/resources/web/src/views/personnel/Admin.vue +++ b/src/main/resources/web/src/views/personnel/Admin.vue @@ -42,7 +42,7 @@ {{ formatRole(admin.role) }} - {{ admin.areaName || (admin.areaId ? getAreaNameById(admin.areaId) : '') || '未关联区域' }} + {{ getAreaNameFromCache(admin.areaId) || admin.areaName || '未关联区域' }} - @@ -182,7 +182,7 @@
- {{ getAreaNameById(originalAdminData.areaId) }} + {{ getAreaNameFromCache(originalAdminData.areaId) || originalAdminData.areaName || '未关联区域' }}
@@ -268,6 +268,9 @@ const loading = ref(false) const showAddModal = ref(false) const showEditModal = ref(false) +// 区域名称缓存 +const areaNameCache = ref>({}) + // 未分配的区域列表(未设置负责人的片区) const unassignedAreas = ref([]) @@ -327,6 +330,54 @@ const loadUnassignedAreas = async () => { } } +// 根据区域ID获取区域名称 - 调用后端接口 +const getAreaNameById = async (areaId: string | undefined): Promise => { + if (!areaId) return '未知区域' + + try { + const token = authStore.token + if (!token) { + console.warn('未获取到 Token,跳转到登录页') + await router.push('/login') + return '未知区域' + } + + const response = await request>(`/api/web/area/${areaId}`, { + method: 'GET', + }) + + if (response.code === 200 && response.data) { + const areaName = response.data.areaName || '未知区域' + // 缓存区域名称 + areaNameCache.value[areaId] = areaName + return areaName + } else { + console.error('获取区域信息失败:', response.message) + return '未知区域' + } + } catch (error: any) { + console.error('请求区域信息异常:', error) + return '未知区域' + } +} + +// 从缓存获取区域名称(同步) +const getAreaNameFromCache = (areaId: string | undefined): string => { + if (!areaId) return '未知区域' + return areaNameCache.value[areaId] || '' +} + +// 预加载区域名称到缓存 +const preloadAreaNames = async (adminList: Admin[]) => { + const areaIds = adminList + .filter(admin => admin.role === 'ROLE_AREA_ADMIN' && admin.areaId && !areaNameCache.value[admin.areaId]) + .map(admin => admin.areaId!) + + for (const areaId of areaIds) { + await getAreaNameById(areaId) + } +} + // 获取管理员列表 const fetchAdminList = async () => { loading.value = true @@ -349,15 +400,20 @@ const fetchAdminList = async () => { }) if (response.code === 200) { - admins.value = (response.data || []).map((admin: any) => ({ + const adminList = (response.data || []).map((admin: any) => ({ adminId: admin.adminId || '', - name: admin.adminName || '未知姓名', // 正确映射 + name: admin.adminName || '未知姓名', account: admin.adminId || '', phone: admin.phone || '未知电话', role: admin.role || '未知角色', areaId: admin.areaId, - areaName: admin.areaName || undefined // 添加区域名称 + areaName: admin.areaName || undefined })) + + admins.value = adminList + + // 预加载区域名称 + await preloadAreaNames(adminList) } else { const errorMsg = response.message || `获取失败(错误码:${response.code})` console.error('获取管理员列表失败:', errorMsg) @@ -391,15 +447,6 @@ const formatRole = (role: string): string => { return roleMap[role] || role } -// 根据区域ID获取区域名称 -// 在script部分添加类型安全的函数 -const getAreaNameById = (areaId: string | undefined): string => { - if (!areaId) return '未知区域' - const area = unassignedAreas.value.find(a => a.areaId === areaId) - return area ? area.areaName : '未知区域' -} - - // 筛选后的管理员列表 const filteredAdmins = computed(() => { return admins.value.filter(admin => { -- 2.34.1 From d3bc9a28f5b7a895636058208ca0e4cec332bf7c Mon Sep 17 00:00:00 2001 From: ZHW <1941286652@qq.com> Date: Tue, 6 Jan 2026 19:10:19 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/web/src/api/types/workorder.ts | 13 +++++++- .../src/views/personnel/MaintenanceRecord.vue | 33 ++++++++++--------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/main/resources/web/src/api/types/workorder.ts b/src/main/resources/web/src/api/types/workorder.ts index a91c25c..230b597 100644 --- a/src/main/resources/web/src/api/types/workorder.ts +++ b/src/main/resources/web/src/api/types/workorder.ts @@ -1,10 +1,21 @@ // src/api/types/workorder.ts +// src/api/types/workorder.ts export interface WorkOrder { orderId: string deviceId: string areaId: string + orderType: 'repair' | 'maintenance' | 'inspection' // 添加此属性 description: string + priority: 'low' | 'medium' | 'high' | 'urgent' // 添加此属性 status: 'pending' | 'processing' | 'reviewing' | 'completed' | 'timeout' - createdTime?: string assignedRepairmanId?: string + createdTime?: string + grabbedTime?: string // 添加此属性 + deadline?: string // 添加此属性 + completedTime?: string // 添加此属性 + dealNote?: string // 添加此属性 + imgUrl?: string // 添加此属性 + createdBy: string // 添加此属性 + updatedTime?: string // 添加此属性 + alertId?: string // 添加此属性 } diff --git a/src/main/resources/web/src/views/personnel/MaintenanceRecord.vue b/src/main/resources/web/src/views/personnel/MaintenanceRecord.vue index 8258212..31400ec 100644 --- a/src/main/resources/web/src/views/personnel/MaintenanceRecord.vue +++ b/src/main/resources/web/src/views/personnel/MaintenanceRecord.vue @@ -259,9 +259,9 @@ const currentOrder = ref({ orderId: '', deviceId: '', areaId: '', - orderType: 'repair', + orderType: 'repair', // 已存在,保持不变 description: '', - priority: 'medium', + priority: 'medium', // 已存在,保持不变 status: 'pending', assignedRepairmanId: '', createdTime: undefined, @@ -860,21 +860,22 @@ onMounted(() => { flex-direction: column; } - .btn-back { - background: #f0f0f0; - color: #333; - border: 1px solid #ddd; - padding: 8px 16px; - border-radius: 4px; - font-size: 14px; - cursor: pointer; - transition: all 0.3s; - } +/* 在 MaintenanceRecord.vue 中更新按钮样式 */ +.btn-back { + background: #f0f0f0; + color: #333; + border: none; /* 移除边框 */ + padding: 8px 16px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; + transition: background 0.3s; +} + +.btn-back:hover { + background: #e0e0e0; +} - .btn-back:hover { - background: #e0e0e0; - border-color: #bbb; - } .modal-content { width: 95%; -- 2.34.1