From 84016d2f1af47c5918d296b8f96a6c9dc311fb12 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Thu, 14 Aug 2025 01:03:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../XgDormBedStudentController.java | 11 ++++ .../xg/service/IXgDormBedStudentService.java | 8 +++ .../impl/XgDormBedStudentServiceImpl.java | 62 ++++++++++++++++++- .../dormBedStudent/dormBedStudent/index.ts | 11 ++++ web/src/views/xg/xgss/ejxyfp/ejxyfp.vue | 10 +-- web/src/views/xg/xgss/xsssfpejxy/index.vue | 2 + 6 files changed, 99 insertions(+), 5 deletions(-) diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBedStudentController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBedStudentController.java index f8fced54..55d27e67 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBedStudentController.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgDormBedStudentController.java @@ -143,6 +143,17 @@ public class XgDormBedStudentController extends BaseController { return toAjax(xgDormBedStudentService.batchRecallBeds(bo)); } + /** + * 批量回收班级分配床位(保留学院分配) + */ + @SaCheckPermission("dormBedStudent:dormBedStudent:edit") + @Log(title = "批量回收班级分配床位", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/batchRecallClassAllocation") + public R batchRecallClassAllocation(@Validated(AddGroup.class) @RequestBody XgDormBedBatchRecallBo bo) { + return toAjax(xgDormBedStudentService.batchRecallClassAllocation(bo)); + } + /** * 获取当前用户二级学院的宿舍楼树形结构 * 校区-宿舍区-宿舍楼三级结构,校区和宿舍区不可选,只有宿舍楼可以选择 diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBedStudentService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBedStudentService.java index ee168606..f9ed0f9e 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBedStudentService.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgDormBedStudentService.java @@ -96,6 +96,14 @@ public interface IXgDormBedStudentService { */ Boolean batchRecallBeds(XgDormBedBatchRecallBo bo); + /** + * 批量回收班级分配床位(保留学院分配) + * + * @param bo 批量回收请求参数 + * @return 是否成功 + */ + Boolean batchRecallClassAllocation(XgDormBedBatchRecallBo bo); + /** * 获取当前用户二级学院的宿舍楼树形结构 * 校区-宿舍区-宿舍楼三级结构,校区和宿舍区不可选,只有宿舍楼可以选择 diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedStudentServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedStudentServiceImpl.java index c33d897f..21e74c0d 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedStudentServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedStudentServiceImpl.java @@ -496,7 +496,67 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService { LambdaUpdateWrapper updateStudent = Wrappers.lambdaUpdate(); updateStudent.in(XgStudentMsg::getId, affectedStudentIds) .eq(XgStudentMsg::getDeleted, 0L) - .set(XgStudentMsg::getStudentStatus, "1") + .eq(XgStudentMsg::getStudentStatus, "1") + .set(XgStudentMsg::getExtField1, null) + .set(XgStudentMsg::getDormitoryRoom, null) + .set(XgStudentMsg::getDormitoryBuilding, null) + .set(XgStudentMsg::getUpdateTime, now) + .set(XgStudentMsg::getUpdateBy, loginUserId); + xgStudentMsgMapper.update(null, updateStudent); + } + + return true; + } + + /** + * 批量回收班级分配床位(保留学院分配) + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean batchRecallClassAllocation(XgDormBedBatchRecallBo bo) { + Date now = new Date(); + Long loginUserId = LoginHelper.getUserId(); + + // 1) 查出这些床位当前有效的分配关系(status=0, deleted=0,并且已分配给班级) + LambdaQueryWrapper activeAssignQuery = Wrappers.lambdaQuery(); + activeAssignQuery.in(XgDormBedStudent::getBedId, bo.getBedIds()) + .eq(XgDormBedStudent::getStatus, "0") + .eq(XgDormBedStudent::getDeleted, "0") + .isNotNull(XgDormBedStudent::getClassId); // 只处理已分配给班级的记录 + List activeAssignments = baseMapper.selectList(activeAssignQuery); + + if (activeAssignments.isEmpty()) { + return true; // 没有需要处理的数据 + } + + // 2) 更新分配关系:清空班级相关字段,但保留学院分配信息 + LambdaUpdateWrapper updateAssign = Wrappers.lambdaUpdate(); + updateAssign.in(XgDormBedStudent::getBedId, bo.getBedIds()) + .eq(XgDormBedStudent::getStatus, "0") + .eq(XgDormBedStudent::getDeleted, "0") + .isNotNull(XgDormBedStudent::getClassId) + .set(XgDormBedStudent::getMajorId, null) + .set(XgDormBedStudent::getClassId, null) + .set(XgDormBedStudent::getStudentId, null) + // .set(XgDormBedStudent::getAssignTime, null) + .set(XgDormBedStudent::getCheckoutTime, null) + .set(XgDormBedStudent::getUpdateTime, now) + .set(XgDormBedStudent::getUpdateBy, loginUserId); + baseMapper.update(null, updateAssign); + + // 3) XgDormBed 状态保持不变(仍然是已分配给学院的状态) + + // 4) 更新学生信息:找到受影响的studentId,设置 student_status=1,清空 + // ext_field1/dormitory_room/dormitory_building + Set affectedStudentIds = activeAssignments.stream() + .map(XgDormBedStudent::getStudentId) + .filter(java.util.Objects::nonNull) + .collect(java.util.stream.Collectors.toSet()); + if (!affectedStudentIds.isEmpty()) { + LambdaUpdateWrapper updateStudent = Wrappers.lambdaUpdate(); + updateStudent.in(XgStudentMsg::getId, affectedStudentIds) + .eq(XgStudentMsg::getDeleted, 0L) + .eq(XgStudentMsg::getStudentStatus, "1") .set(XgStudentMsg::getExtField1, null) .set(XgStudentMsg::getDormitoryRoom, null) .set(XgStudentMsg::getDormitoryBuilding, null) diff --git a/web/src/api/xg/xgss/dormBedStudent/dormBedStudent/index.ts b/web/src/api/xg/xgss/dormBedStudent/dormBedStudent/index.ts index 372eca02..1d45dd7c 100644 --- a/web/src/api/xg/xgss/dormBedStudent/dormBedStudent/index.ts +++ b/web/src/api/xg/xgss/dormBedStudent/dormBedStudent/index.ts @@ -73,6 +73,17 @@ export const batchRecallDormBeds = (data: { bedIds: Array }) => }); }; +/** + * 批量回收班级分配床位(保留学院分配) + */ +export const batchRecallClassAllocation = (data: { bedIds: Array }) => { + return request({ + url: '/dormBedStudent/dormBedStudent/batchRecallClassAllocation', + method: 'post', + data + }); +}; + /** * 获取当前用户二级学院的宿舍楼树形结构 * 校区-宿舍区-宿舍楼三级结构,校区和宿舍区不可选,只有宿舍楼可以选择 diff --git a/web/src/views/xg/xgss/ejxyfp/ejxyfp.vue b/web/src/views/xg/xgss/ejxyfp/ejxyfp.vue index 3eecf719..b41a75fd 100644 --- a/web/src/views/xg/xgss/ejxyfp/ejxyfp.vue +++ b/web/src/views/xg/xgss/ejxyfp/ejxyfp.vue @@ -369,7 +369,7 @@ import ElMessageBox from 'element-plus/es/components/message-box/index'; import RoomDialog from './components/RoomDialog.vue'; import BedDialog from './components/BedDialog.vue'; import ClassAllocationDialog from './components/ClassAllocationDialog.vue'; -import { batchRecallDormBeds } from '@/api/xg/xgss/dormBedStudent/dormBedStudent'; +import { batchRecallDormBeds, batchRecallClassAllocation } from '@/api/xg/xgss/dormBedStudent/dormBedStudent'; // const { proxy } = getCurrentInstance(); @@ -685,7 +685,7 @@ const handleBatchRecall = async () => { return; } try { - const content = `确认收回选中的 ${selectedBeds.length} 个床位吗?\n\n重要提示:回收后,学生已分配的宿舍都会回收,无法恢复`; + const content = `确认收回选中的 ${selectedBeds.length} 个床位的班级分配吗?\n\n重要提示:收回后,床位将从班级分配中移除,但仍保持分配给学院的状态。已分配给学生的宿舍信息将被清空。`; await ElMessageBox.confirm(content, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', @@ -695,8 +695,8 @@ const handleBatchRecall = async () => { return; } try { - await batchRecallDormBeds({ bedIds: selectedBeds }); - ElMessage.success('批量收回成功'); + await batchRecallClassAllocation({ bedIds: selectedBeds }); + ElMessage.success('批量收回班级分配成功'); // 刷新数据 selectableRowsCache.value = []; loadRoomData(); @@ -812,6 +812,8 @@ const handleCollegeAllocationSuccess = () => { selectableRowsCache.value = []; // 刷新房间和床位数据 loadRoomData(); + // 刷新学生信息树数据 + getStudentTreeData(); // 清空选择状态 isUpdatingSelection.value = true; try { diff --git a/web/src/views/xg/xgss/xsssfpejxy/index.vue b/web/src/views/xg/xgss/xsssfpejxy/index.vue index 51cab0c8..b85c78d9 100644 --- a/web/src/views/xg/xgss/xsssfpejxy/index.vue +++ b/web/src/views/xg/xgss/xsssfpejxy/index.vue @@ -813,6 +813,8 @@ const handleCollegeAllocationSuccess = () => { selectableRowsCache.value = []; // 刷新房间和床位数据 loadRoomData(); + // 刷新学生信息树数据 + getStudentTreeData(); // 清空选择状态 isUpdatingSelection.value = true; try {