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 @@
@@ -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
|