From 3468e1c88a3752971486c72d6fa48dfab2b43799 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Thu, 14 Aug 2025 19:01:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../XgDormBedStudentController.java | 12 ++++ .../xg/service/IXgDormBedStudentService.java | 9 +++ .../impl/XgDormBedStudentServiceImpl.java | 59 +++++++++++++++++++ .../dormBedStudent/dormBedStudent/index.ts | 32 +++++++--- web/src/views/xg/xgss/bzrfp/bzrfp.vue | 22 +++++-- 5 files changed, 120 insertions(+), 14 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 400a77f8..51dc01cd 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 @@ -245,4 +245,16 @@ public class XgDormBedStudentController extends BaseController { @RequestParam(required = false) Long classId) { return toAjax(xgDormBedStudentService.classTeacherRecallBeds(buildingId, classId)); } + + /** + * 班主任收回选中床位 + */ + @SaCheckPermission("dormBedStudent:dormBedStudent:edit") + @Log(title = "班主任收回选中床位", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/classTeacherRecallSelectedBeds") + public R classTeacherRecallSelectedBeds(@RequestBody List bedIds, + @RequestParam(required = false) Long classId) { + return toAjax(xgDormBedStudentService.classTeacherRecallSelectedBeds(bedIds, classId)); + } } 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 1ba9971d..b3383aee 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 @@ -174,4 +174,13 @@ public interface IXgDormBedStudentService { * @return 是否收回成功 */ Boolean classTeacherRecallBeds(Long buildingId, Long classId); + + /** + * 班主任收回选中床位 + * + * @param bedIds 床位ID列表 + * @param classId 班级ID + * @return 是否收回成功 + */ + Boolean classTeacherRecallSelectedBeds(List bedIds, Long classId); } 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 5a5409f3..41583f81 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 @@ -1747,4 +1747,63 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService { throw new RuntimeException("收回床位失败:" + e.getMessage()); } } + + /** + * 班主任收回选中床位 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean classTeacherRecallSelectedBeds(List bedIds, Long classId) { + if (bedIds == null || bedIds.isEmpty()) { + throw new IllegalArgumentException("床位ID列表不能为空"); + } + + try { + Long targetClassId = classId != null ? classId : getCurrentUserClassId(); + Date now = new Date(); + Long loginUserId = LoginHelper.getUserId(); + + log.info("班主任收回选中床位,床位IDs: {},classId:{}", bedIds, targetClassId); + + // 1. 更新 xg_student_msg 表:根据 ext_field1 = 床位id,deleted = 0,student_status = 1 + // 的数据 + // 将 dormitory_building、dormitory_room、ext_field1 置空 + if (!bedIds.isEmpty()) { + LambdaUpdateWrapper updateStudentWrapper = Wrappers.lambdaUpdate(); + updateStudentWrapper + .in(XgStudentMsg::getExtField1, + bedIds.stream().map(String::valueOf).collect(java.util.stream.Collectors.toList())) + .eq(XgStudentMsg::getDeleted, 0L) + .eq(XgStudentMsg::getStudentStatus, "1") + .set(XgStudentMsg::getDormitoryBuilding, null) + .set(XgStudentMsg::getDormitoryRoom, null) + .set(XgStudentMsg::getExtField1, null) + .set(XgStudentMsg::getUpdateTime, now) + .set(XgStudentMsg::getUpdateBy, loginUserId); + + int studentUpdateCount = xgStudentMsgMapper.update(null, updateStudentWrapper); + log.info("更新学生信息表记录数: {}", studentUpdateCount); + } + + // 2. 更新 xg_dorm_bed_student 表:根据 bed_id = 床位id,deleted = 0,status = 0 + // 将 student_id、assign_time、checkout_time 置空 + LambdaUpdateWrapper updateBedStudentWrapper = Wrappers.lambdaUpdate(); + updateBedStudentWrapper.in(XgDormBedStudent::getBedId, bedIds) + .eq(XgDormBedStudent::getDeleted, "0") + .eq(XgDormBedStudent::getStatus, "0") + .set(XgDormBedStudent::getStudentId, null) + // .set(XgDormBedStudent::getAssignTime, null) + .set(XgDormBedStudent::getCheckoutTime, null) + .set(XgDormBedStudent::getUpdateTime, now) + .set(XgDormBedStudent::getUpdateBy, loginUserId); + + int bedStudentUpdateCount = baseMapper.update(null, updateBedStudentWrapper); + log.info("更新床位学生分配表记录数: {}", bedStudentUpdateCount); + + return true; + } catch (Exception e) { + log.error("班主任收回选中床位失败", e); + throw new RuntimeException("收回选中床位失败:" + e.getMessage()); + } + } } diff --git a/web/src/api/xg/xgss/dormBedStudent/dormBedStudent/index.ts b/web/src/api/xg/xgss/dormBedStudent/dormBedStudent/index.ts index 41f7f65c..1e96e2d1 100644 --- a/web/src/api/xg/xgss/dormBedStudent/dormBedStudent/index.ts +++ b/web/src/api/xg/xgss/dormBedStudent/dormBedStudent/index.ts @@ -113,10 +113,7 @@ export const getClassTeacherDormTree = (classId?: string | number): AxiosPromise * 获取班主任管理班级的房间床位详情(带学生信息) * @param buildingId 宿舍楼ID,为空则查询所有楼栋 */ -export const getClassTeacherBedDetails = ( - buildingId?: string | number, - classId?: string | number -): AxiosPromise => { +export const getClassTeacherBedDetails = (buildingId?: string | number, classId?: string | number): AxiosPromise => { return request({ url: '/dormBedStudent/dormBedStudent/getClassTeacherBedDetails', method: 'get', @@ -163,11 +160,14 @@ export const classTeacherStudentNoAllocation = (buildingId?: string | number, cl * 班主任选择性分配床位(弹窗模式) * @param allocationParams 分配参数 {bedIds: number[], studentIds: number[], allocationType: 'random' | 'studentNo'} */ -export const classTeacherSelectiveAllocation = (allocationParams: { - bedIds: Array; - studentIds: Array; - allocationType: 'random' | 'studentNo'; -}, classId?: string | number) => { +export const classTeacherSelectiveAllocation = ( + allocationParams: { + bedIds: Array; + studentIds: Array; + allocationType: 'random' | 'studentNo'; + }, + classId?: string | number +) => { return request({ url: '/dormBedStudent/dormBedStudent/classTeacherSelectiveAllocation', method: 'post', @@ -187,3 +187,17 @@ export const classTeacherRecallBeds = (buildingId?: string | number, classId?: s params: { buildingId, classId } }); }; + +/** + * 班主任收回选中床位 + * @param bedIds 床位ID数组 + * @param classId 班级ID,可为空 + */ +export const classTeacherRecallSelectedBeds = (bedIds: number[], classId?: string | number) => { + return request({ + url: '/dormBedStudent/dormBedStudent/classTeacherRecallSelectedBeds', + method: 'post', + data: bedIds, + params: { classId } + }); +}; diff --git a/web/src/views/xg/xgss/bzrfp/bzrfp.vue b/web/src/views/xg/xgss/bzrfp/bzrfp.vue index 065d967a..37e1e522 100644 --- a/web/src/views/xg/xgss/bzrfp/bzrfp.vue +++ b/web/src/views/xg/xgss/bzrfp/bzrfp.vue @@ -98,7 +98,7 @@ 分配床位 - 收回床位 + 收回选中床位 { return; } + // 获取选中的床位ID数组 + const selectedBedIds = selectedRows.value + .filter((row) => row.isBed && row.studentId) // 只收回已分配的床位 + .map((bed) => bed.id); + + if (selectedBedIds.length === 0) { + ElMessage.warning('请先勾选要收回的床位!'); + return; + } + try { - await ElMessageBox.confirm(`确认收回 ${selectedBuilding.value.label} 的所有床位分配吗?\n\n收回后,学生的床位信息将被清空。`, '确认收回床位', { + const confirmMessage = `确认收回选中的 ${selectedBedIds.length} 个床位分配吗?\n\n收回后,这些床位上学生的床位信息将被清空。`; + + await ElMessageBox.confirm(confirmMessage, '确认收回选中床位', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }); - await classTeacherRecallBeds(selectedBuilding.value.id, activeClassId.value); - ElMessage.success('收回床位成功'); + await classTeacherRecallSelectedBeds(selectedBedIds, activeClassId.value); + ElMessage.success('收回选中床位成功'); handleAllocationSuccess(); } catch (error: any) { if (error !== 'cancel') {