From f35359a84e7da72454a2d4428b9c4a8baf0f938d Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Sat, 6 Sep 2025 22:24:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=AE=A1=E6=A0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../XgDormHygieneCheckController.java | 9 +- .../service/IXgDormHygieneCheckService.java | 4 +- .../impl/XgDormHygieneCheckServiceImpl.java | 8 +- .../DormHygieneCheckMainDialog.vue | 99 ++++++++++++++++--- .../DormHygieneCheckSingleDialog.vue | 27 ++--- 5 files changed, 113 insertions(+), 34 deletions(-) diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormHygieneCheckController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormHygieneCheckController.java index a16131a9..a5c319ce 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormHygieneCheckController.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormHygieneCheckController.java @@ -172,8 +172,13 @@ public class XgDormHygieneCheckController extends BaseController { @Log(title = "宿舍卫生检查", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping("/saveCompleteData") - public R saveCompleteData(@Validated(AddGroup.class) @RequestBody XgDormHygieneCheckCompleteBo bo) { - return toAjax(xgDormHygieneCheckService.saveCompleteData(bo)); + public R saveCompleteData(@Validated(AddGroup.class) @RequestBody XgDormHygieneCheckCompleteBo bo) { + Long hygieneCheckId = xgDormHygieneCheckService.saveCompleteData(bo); + if (hygieneCheckId != null) { + return R.ok(hygieneCheckId); + } else { + return R.fail("保存宿舍卫生检查数据失败"); + } } /** diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormHygieneCheckService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormHygieneCheckService.java index 9af2b759..099301cf 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormHygieneCheckService.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormHygieneCheckService.java @@ -116,9 +116,9 @@ public interface IXgDormHygieneCheckService { * 保存完整的宿舍卫生检查数据(包含学生评分和违纪记录) * * @param bo 完整的宿舍卫生检查数据 - * @return 是否保存成功 + * @return 检查记录ID,保存失败返回null */ - Boolean saveCompleteData(XgDormHygieneCheckCompleteBo bo); + Long saveCompleteData(XgDormHygieneCheckCompleteBo bo); /** * 更新完整的宿舍卫生检查数据(包含学生评分和违纪记录) diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormHygieneCheckServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormHygieneCheckServiceImpl.java index ed0f68c1..d06141ed 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormHygieneCheckServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormHygieneCheckServiceImpl.java @@ -638,11 +638,11 @@ public class XgDormHygieneCheckServiceImpl implements IXgDormHygieneCheckService * 保存完整的宿舍卫生检查数据(包含学生评分和违纪记录) * * @param bo 完整的宿舍卫生检查数据 - * @return 是否保存成功 + * @return 检查记录ID,保存失败返回null */ @Override @Transactional(rollbackFor = Exception.class) - public Boolean saveCompleteData(XgDormHygieneCheckCompleteBo bo) { + public Long saveCompleteData(XgDormHygieneCheckCompleteBo bo) { try { // 1. 转换并保存主表数据 XgDormHygieneCheck add = MapstructUtils.convert(bo, XgDormHygieneCheck.class); @@ -652,7 +652,7 @@ public class XgDormHygieneCheckServiceImpl implements IXgDormHygieneCheckService if (!flag) { log.error("保存宿舍卫生检查主表数据失败"); - return false; + return null; } Long hygieneCheckId = add.getId(); @@ -768,7 +768,7 @@ public class XgDormHygieneCheckServiceImpl implements IXgDormHygieneCheckService } log.info("完整保存宿舍卫生检查数据成功,检查ID: {}", hygieneCheckId); - return true; + return hygieneCheckId; } catch (Exception e) { log.error("保存宿舍卫生检查数据失败", e); diff --git a/web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckMainDialog.vue b/web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckMainDialog.vue index 0e9760f0..78da6572 100644 --- a/web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckMainDialog.vue +++ b/web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckMainDialog.vue @@ -187,6 +187,16 @@ @submit="handleSingleCheckSubmit" @close="handleSingleCheckClose" /> + + + @@ -195,6 +205,7 @@ import { ref, reactive, computed, watch, getCurrentInstance, ComponentInternalIn import { ElMessage, ElMessageBox } from 'element-plus'; import { Check, Calendar } from '@element-plus/icons-vue'; import DormHygieneCheckSingleDialog from './DormHygieneCheckSingleDialog.vue'; +import DormHygieneCheckEditDialog from './DormHygieneCheckEditDialog.vue'; import request from '@/utils/request'; // 组件实例 @@ -256,11 +267,16 @@ const checkerOptions = ref([]); const floorRooms = ref([]); const completedRooms = ref>(new Set()); const allRooms = ref([]); +const roomCheckIds = ref>(new Map()); // 存储房间对应的检查记录ID // 单个房间检查弹窗相关 const singleCheckVisible = ref(false); const currentRoom = ref(null); +// 编辑弹窗相关 +const editCheckVisible = ref(false); +const currentEditData = ref(null); + // 字典数据 const xg_dorm_hygiene_check_level = ref([]); const xg_dorm_hygiene_check_type = ref([]); @@ -288,6 +304,10 @@ const singleCheckTitle = computed(() => { return currentRoom.value ? `${currentRoom.value.roomName} - 卫生检查` : '房间卫生检查'; }); +const editCheckTitle = computed(() => { + return currentRoom.value ? `${currentRoom.value.roomName} - 编辑检查记录` : '编辑检查记录'; +}); + // 生成默认检查标题 const generateDefaultCheckTitle = () => { const now = new Date(); @@ -315,6 +335,7 @@ const initForm = () => { completedRooms.value.clear(); floorRooms.value = []; allRooms.value = []; + roomCheckIds.value.clear(); // 清空房间检查记录ID映射 // 获取当前用户信息 fetchCurrentUserInfo(); @@ -364,6 +385,7 @@ const handleCampusChange = async (campusId: string | number) => { floorRooms.value = []; allRooms.value = []; completedRooms.value.clear(); + roomCheckIds.value.clear(); // 清空房间检查记录ID映射 if (campusId) { const selectedCampus = campusOptions.value.find((campus) => campus.id === campusId); @@ -401,6 +423,7 @@ const handleBuildingChange = async (buildingId: string | number) => { floorRooms.value = []; allRooms.value = []; completedRooms.value.clear(); + roomCheckIds.value.clear(); // 清空房间检查记录ID映射 if (buildingId) { const selectedBuilding = buildingOptions.value.find((building) => building.id === buildingId); @@ -500,29 +523,38 @@ const handleCheckerChange = (checkerName: string) => { }; // 房间双击处理 -const handleRoomDoubleClick = (room: any) => { +const handleRoomDoubleClick = async (room: any) => { // 验证基础信息是否完整 if (!form.checkTitle || !form.checkDate || !form.checkerName || !form.checkType || !form.checkLevel) { ElMessage.warning('请先完善检查基础信息'); return; } - // 如果房间已经检查过,询问是否重新检查 - if (completedRooms.value.has(room.id)) { - ElMessageBox.confirm(`${room.roomName} 已经检查过,是否重新检查?`, '提示', { - confirmButtonText: '重新检查', - cancelButtonText: '取消', - type: 'warning' - }) - .then(() => { - openSingleCheckDialog(room); - }) - .catch(() => { - // 用户取消 + // 检查是否已有记录ID(新增成功后会保存ID) + const checkId = roomCheckIds.value.get(room.id); + + if (checkId) { + // 有记录ID,说明已经检查过,打开编辑弹窗 + try { + const response = await request({ + url: `/dormHygieneCheck/dormHygieneCheck/${checkId}`, + method: 'get' }); - } else { - openSingleCheckDialog(room); + + if (response.code === 200 && response.data) { + currentRoom.value = room; + currentEditData.value = response.data; + editCheckVisible.value = true; + return; + } + } catch (error) { + console.error('查询检查记录详情失败:', error); + ElMessage.error('查询检查记录失败'); + } } + + // 没有记录ID,打开新增检查弹窗 + openSingleCheckDialog(room); }; // 打开单个房间检查弹窗 @@ -536,6 +568,11 @@ const handleSingleCheckSubmit = (data: any) => { // 标记房间为已完成 completedRooms.value.add(currentRoom.value.id); + // 保存检查记录ID(如果有返回) + if (data.id) { + roomCheckIds.value.set(currentRoom.value.id, data.id); + } + ElMessage.success(`${currentRoom.value.roomName} 检查完成`); singleCheckVisible.value = false; }; @@ -545,6 +582,38 @@ const handleSingleCheckClose = () => { singleCheckVisible.value = false; }; +// 编辑弹窗提交处理 +const handleEditCheckSubmit = async (data: any) => { + try { + // 调用后端API更新检查记录 + const response = await request({ + url: '/dormHygieneCheck/dormHygieneCheck/updateCompleteData', + method: 'put', + data: data + }); + + if (response.code === 200) { + // 标记房间为已完成 + completedRooms.value.add(currentRoom.value.id); + roomCheckIds.value.set(currentRoom.value.id, data.id); + + ElMessage.success(`${currentRoom.value.roomName} 检查记录更新完成`); + editCheckVisible.value = false; + } else { + ElMessage.error(response.msg || '更新失败'); + } + } catch (error) { + console.error('更新检查记录失败:', error); + ElMessage.error('更新失败,请重试'); + } +}; + +// 编辑弹窗关闭处理 +const handleEditCheckClose = () => { + editCheckVisible.value = false; + currentEditData.value = null; +}; + // 获取楼层已完成数量 const getFloorCompletedCount = (floor: string) => { const floorData = floorRooms.value.find((f) => f.floor === floor); diff --git a/web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckSingleDialog.vue b/web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckSingleDialog.vue index fd1f05e4..12051087 100644 --- a/web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckSingleDialog.vue +++ b/web/src/views/xg/xgss/dormHygieneCheck/dormHygieneCheck/DormHygieneCheckSingleDialog.vue @@ -263,6 +263,7 @@