From d1bbf7ce31c473977a1126bd22b1442159655956 Mon Sep 17 00:00:00 2001
From: ZHW <1941286652@qq.com>
Date: Mon, 29 Dec 2025 13:36:54 +0800
Subject: [PATCH 1/3] =?UTF-8?q?=E6=A0=A1=E5=8C=BA=E7=9A=84=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../resources/web/src/views/area/Campus.vue | 53 ++-
.../web/src/views/equipment/Terminal.vue | 350 +++++++++++++++++-
.../web/src/views/personnel/Maintenance.vue | 4 +-
3 files changed, 379 insertions(+), 28 deletions(-)
diff --git a/src/main/resources/web/src/views/area/Campus.vue b/src/main/resources/web/src/views/area/Campus.vue
index b929fbf..b6ac21f 100644
--- a/src/main/resources/web/src/views/area/Campus.vue
+++ b/src/main/resources/web/src/views/area/Campus.vue
@@ -497,6 +497,7 @@ const confirmDelete = async () => {
}
}
+// 保存校区信息
// 保存校区信息
const handleSave = async () => {
saving.value = true
@@ -508,12 +509,6 @@ const handleSave = async () => {
return
}
- // 校园类型必须有父级区域ID
- if (!isEdit.value && (!formData.value.parentAreaId || formData.value.parentAreaId.trim() === '')) {
- alert('新增校区时必须选择所属市区')
- return
- }
-
// 必须选择负责人
if (!selectedManager.value) {
alert('请选择负责人')
@@ -530,7 +525,19 @@ const handleSave = async () => {
data: Area
}>('/api/web/area/update', {
method: 'PUT',
- body: JSON.stringify(formData.value)
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': `Bearer ${authStore.token}`
+ },
+ body: JSON.stringify({
+ areaId: formData.value.areaId,
+ areaName: formData.value.areaName,
+ areaType: 'campus',
+ parentAreaId: formData.value.parentAreaId,
+ address: formData.value.address,
+ manager: formData.value.manager,
+ managerPhone: formData.value.managerPhone
+ })
})
if (response?.code === 200 && response?.data) {
@@ -539,25 +546,47 @@ const handleSave = async () => {
} else {
const errorMsg = response?.msg || `更新失败(错误码:${response?.code || '未知'})`
console.error('更新校区失败:', errorMsg)
- alert(`更新校区失败:${errorMsg}`)
+ alert(`更新校区失败:${ errorMsg}`)
}
} else {
+ // 新增模式 - 添加更严格的验证
+ if (!formData.value.parentAreaId || formData.value.parentAreaId.trim() === '') {
+ alert('新增校区时必须选择所属市区')
+ return
+ }
+
+ // 验证选择的市区是否真实存在且类型为市区
+ const selectedCity = cityList.value.find(city =>
+ city.areaId === formData.value.parentAreaId && city.areaType === 'zone'
+ )
+
+ if (!selectedCity) {
+ alert('选择的市区不存在或类型错误,请重新选择')
+ return
+ }
+
// 新增模式
const newCampus = {
areaName: formData.value.areaName,
- areaType: 'campus' as const,
- parentAreaId: formData.value.parentAreaId, // 必须包含父级区域ID
+ areaType: 'campus',
+ parentAreaId: formData.value.parentAreaId,
address: formData.value.address,
manager: formData.value.manager,
managerPhone: formData.value.managerPhone
}
+ console.log('发送的校区数据:', newCampus) // 调试日志
+
response = await request<{
code: number
msg: string
data: Area
}>('/api/web/area/add', {
method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': `Bearer ${authStore.token}`
+ },
body: JSON.stringify(newCampus)
})
@@ -567,7 +596,7 @@ const handleSave = async () => {
} else {
const errorMsg = response?.msg || `新增失败(错误码:${response?.code || '未知'})`
console.error('新增校区失败:', errorMsg)
- alert(`新增校区失败:${errorMsg}`)
+ alert(`新增校区失败:${ errorMsg}`)
}
}
} catch (error: any) {
@@ -577,7 +606,7 @@ const handleSave = async () => {
: error.message.includes('Network')
? '网络连接失败,请检查网络'
: error.message || '保存失败,请稍后重试'
- alert(`保存校区失败:${errorMsg}`)
+ alert(`保存校区失败:${ errorMsg}`)
} finally {
saving.value = false
}
diff --git a/src/main/resources/web/src/views/equipment/Terminal.vue b/src/main/resources/web/src/views/equipment/Terminal.vue
index 08260a7..de89ae2 100644
--- a/src/main/resources/web/src/views/equipment/Terminal.vue
+++ b/src/main/resources/web/src/views/equipment/Terminal.vue
@@ -143,10 +143,70 @@
+
+
+
+
+
+
+
+
+
+
+
--
2.34.1
From 14b779ee5eb455297d9af2f9f25c4892286d01a6 Mon Sep 17 00:00:00 2001
From: ZHW <1941286652@qq.com>
Date: Mon, 29 Dec 2025 14:51:08 +0800
Subject: [PATCH 2/3] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=9A=84=E7=89=87?=
=?UTF-8?q?=E5=8C=BA=E5=85=B3=E8=81=94?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/main/resources/web/src/api/types/auth.ts | 46 ++--
.../web/src/views/equipment/Terminal.vue | 28 +++
.../web/src/views/equipment/WaterMaker.vue | 202 +++++++++++++++++-
3 files changed, 248 insertions(+), 28 deletions(-)
diff --git a/src/main/resources/web/src/api/types/auth.ts b/src/main/resources/web/src/api/types/auth.ts
index 92b8e1a..97d1329 100644
--- a/src/main/resources/web/src/api/types/auth.ts
+++ b/src/main/resources/web/src/api/types/auth.ts
@@ -1,29 +1,31 @@
-// src/api/types/auth.ts
-
-// 登录请求参数 - 匹配后端的 LoginRequest
+// src/main/resources/web/src/api/types/auth.ts
export interface LoginRequest {
+ username: string
+ password: string
+}
+
+export interface LoginVO {
+ token: string
+ userInfo: {
+ id: number
username: string
- password: string
- userType: string // 添加这个属性
- rememberMe?: boolean
+ realName: string
+ role: string
+ avatar: string
+ }
}
-// 通用响应结构
+// 在 '@/api/types/auth.ts' 文件中添加
export interface ResultVO {
- code: number
- message: string
- data: T
+ code: number;
+ message: string;
+ data?: T;
+ [key: string]: any;
}
-// 登录响应数据 - 匹配后端的 LoginVO
-export interface LoginVO {
- token: string
- userInfo: {
- id: number
- username: string
- realName?: string // 根据后端字段调整
- role?: string // 根据后端字段调整
- userType?: string // 添加这个字段
- avatar?: string
- }
-}
\ No newline at end of file
+
+export interface LoginResponse {
+ code: number
+ message: string
+ data: LoginVO
+}
diff --git a/src/main/resources/web/src/views/equipment/Terminal.vue b/src/main/resources/web/src/views/equipment/Terminal.vue
index de89ae2..3e6d27c 100644
--- a/src/main/resources/web/src/views/equipment/Terminal.vue
+++ b/src/main/resources/web/src/views/equipment/Terminal.vue
@@ -247,6 +247,7 @@ interface TerminalManageVO {
terminalStatus: TerminalStatus
installDate?: string
deviceId?: string
+ areaId?: string
}
// 设备类型定义
@@ -547,8 +548,17 @@ const onCityChange = async () => {
const onCampusChange = () => {
// 当选择校区时,清空当前选择的设备ID
currentTerminal.value.deviceId = undefined
+
+ // 设置areaId为选中校区的areaName(不是areaId)
+ const selectedCampus = campusList.value.find(campus => campus.areaId === selectedCampusId.value)
+ if (selectedCampus) {
+ currentTerminal.value.areaId = selectedCampus.areaName // 使用areaName作为areaId
+ } else {
+ currentTerminal.value.areaId = undefined
+ }
}
+
// 多条件过滤终端数据
const filteredTerminals = computed(() => {
return terminals.value.filter(terminal => {
@@ -673,6 +683,24 @@ const saveTerminal = async () => {
return
}
+ // 验证是否选择了校区(新增终端时)
+ if (!isEditing.value && !selectedCampusId.value) {
+ alert('请选择校区')
+ return
+ }
+
+ // 验证areaId是否已设置
+ if (!currentTerminal.value.areaId) {
+ alert('请先选择校区以确定所属片区')
+ return
+ }
+
+ // 验证是否选择了关联设备
+ if (!currentTerminal.value.deviceId) {
+ alert('请选择关联的供水机')
+ return
+ }
+
let result: ResultVO | TerminalManageVO
if (isEditing.value) {
// 更新终端
diff --git a/src/main/resources/web/src/views/equipment/WaterMaker.vue b/src/main/resources/web/src/views/equipment/WaterMaker.vue
index e2f0167..927c53f 100644
--- a/src/main/resources/web/src/views/equipment/WaterMaker.vue
+++ b/src/main/resources/web/src/views/equipment/WaterMaker.vue
@@ -150,13 +150,49 @@
+
+
-
-
+
+
+
+
-
- 最后心跳时间:
- {{ formatDate(deviceDetail.deviceInfo?.lastHeartbeatTime) }}
-
+
@@ -111,6 +108,26 @@
{{ formatDate(deviceDetail.realtimeData?.recordTime) }}
+
+
+
+
+
+
+
滤芯寿命
+
+
+
{{ deviceDetail.realtimeData?.filterLife || 0 }}%
+
+
@@ -169,11 +186,12 @@
+
diff --git a/src/main/resources/web/src/views/equipment/WaterSupplierDetail.vue b/src/main/resources/web/src/views/equipment/WaterSupplierDetail.vue
index 0a6bd5a..f817881 100644
--- a/src/main/resources/web/src/views/equipment/WaterSupplierDetail.vue
+++ b/src/main/resources/web/src/views/equipment/WaterSupplierDetail.vue
@@ -115,6 +115,25 @@
{{ formatDate(deviceDetail.realtimeData?.timestamp) }}
+
+
+
@@ -130,11 +149,12 @@
--
2.34.1