package com.xjrsoft.module.room.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.base.MPJBaseServiceImpl; import com.github.yulichang.toolkit.MPJWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.xjrsoft.common.enums.DeleteMark; import com.xjrsoft.common.utils.VoToColumnUtil; import com.xjrsoft.module.base.entity.BaseClass; import com.xjrsoft.module.base.mapper.BaseClassMapper; import com.xjrsoft.module.room.dto.AdjustBedPageDto; import com.xjrsoft.module.room.dto.AdjustClassPageDto; import com.xjrsoft.module.room.dto.AdjustStudentBedDto; import com.xjrsoft.module.room.dto.DistributeClassPageDto; import com.xjrsoft.module.room.dto.DistributeRoomBedDto; import com.xjrsoft.module.room.dto.DistributeRoomBedPageDto; import com.xjrsoft.module.room.dto.RoomBedPageDto; import com.xjrsoft.module.room.entity.Room; import com.xjrsoft.module.room.entity.RoomBed; import com.xjrsoft.module.room.entity.RoomBedRecord; import com.xjrsoft.module.room.mapper.RoomBedMapper; import com.xjrsoft.module.room.mapper.RoomBedRecordMapper; import com.xjrsoft.module.room.mapper.RoomMapper; import com.xjrsoft.module.room.service.IRoomBedService; import com.xjrsoft.module.room.vo.AdjustBedClassPageVo; import com.xjrsoft.module.room.vo.AdjustBedClassStudentPageVo; import com.xjrsoft.module.room.vo.AdjustBedStudentPageVo; import com.xjrsoft.module.room.vo.ClassStudentCountVo; import com.xjrsoft.module.room.vo.DistributeClassPageVo; import com.xjrsoft.module.room.vo.DistributeResultClassVo; import com.xjrsoft.module.room.vo.DistributeResultListVo; import com.xjrsoft.module.room.vo.DistributeRoomBedPageVo; import com.xjrsoft.module.room.vo.NoBedStudentPageVo; import com.xjrsoft.module.room.vo.RoomBedExcelVo; import com.xjrsoft.module.room.vo.RoomBedPageVo; import com.xjrsoft.module.room.vo.RoomClassCountVo; import com.xjrsoft.module.student.entity.BaseStudent; import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll; import com.xjrsoft.module.student.mapper.BaseStudentMapper; import com.xjrsoft.module.teacher.entity.XjrUser; import com.xjrsoft.module.teacher.mapper.XjrUserMapper; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * @title: 寝室床位 * @Author dzx * @Date: 2023-12-27 * @Version 1.0 */ @Service @AllArgsConstructor public class RoomBedServiceImpl extends MPJBaseServiceImpl implements IRoomBedService { private final RoomMapper roomMapper; private final RoomBedMapper roomBedMapper; private final BaseStudentMapper baseStudentMapper; private final BaseClassMapper baseClassMapper; private final XjrUserMapper xjrUserMapper; private final RoomBedRecordMapper roomBedRecordMapper; @Override public Page getPage(Page page, RoomBedPageDto dto) { Page result = roomBedMapper.getPage(page, dto); return result; } @Override public List getList(RoomBedPageDto dto) { return roomBedMapper.getList(dto); } @Override public Boolean clearStudentInfo(List ids) { for (Long id : ids) { RoomBed roomBed = roomBedMapper.selectById(id); roomBed.setStudentUserId(null); // RoomBed roomBedData = BeanUtil.toBean(roomBed, RoomBed.class); // roomBedMapper.updateById(new RoomBed(){{ // setId(id); // setStudentUserId(null); // }}); UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", id); updateWrapper.setSql("student_user_id = null"); updateWrapper.setSql("is_check_in = 0"); roomBedMapper.update(roomBed, updateWrapper); } return true; } @Override public Boolean clearStudentInfoByRoomId(Long id) { List bedList = roomBedMapper.selectList( MPJWrappers.lambdaJoin().eq(RoomBed::getRoomId, id) ); for (RoomBed roomBed : bedList) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", roomBed.getId()); updateWrapper.setSql("student_user_id = null"); updateWrapper.setSql("is_check_in = 0"); roomBedMapper.update(roomBed, updateWrapper); } return true; } @Override public Boolean clearStudentInfoByBedId(Long id) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", id); updateWrapper.setSql("student_user_id = null"); updateWrapper.setSql("is_check_in = 0"); RoomBed roomBed = roomBedMapper.selectById(id); roomBedMapper.update(roomBed, updateWrapper); return true; } @Override public Page getDistributeClassInfo(Page page, DistributeClassPageDto dto) { Page classInfo = roomBedMapper.getDistributeClassInfo(page, dto); List records = classInfo.getRecords(); //查询所有班级需要安排住宿的人数,并组装成map备用 List allStayCount = roomBedMapper.getAllStayCount(); Map allStayCountMap = new HashMap<>(); for (ClassStudentCountVo classStudentCountVo : allStayCount) { allStayCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount()); } //查询所有班级需要安排住宿的男生人数,并组装成map备用 List allStayMaleCount = roomBedMapper.getAllStayMaleCount(); Map allStayMaleCountMap = new HashMap<>(); for (ClassStudentCountVo classStudentCountVo : allStayMaleCount) { allStayMaleCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount()); } //查询所有班级需要安排住宿的女生人数,并组装成map备用 List allStayFemaleCount = roomBedMapper.getAllStayFemaleCount(); Map allStayFemaleCountMap = new HashMap<>(); for (ClassStudentCountVo classStudentCountVo : allStayFemaleCount) { allStayFemaleCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount()); } //查询所有班级已经安排住宿的总人数,并组装成map备用 List allArrangedCount = roomBedMapper.getAllArrangedCount(); Map allArrangedCountMap = new HashMap<>(); for (ClassStudentCountVo classStudentCountVo : allArrangedCount) { allArrangedCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount()); } //查询所有班级已经安排住宿的男生人数,并组装成map备用 List allArrangedMaleCount = roomBedMapper.getAllArrangedMaleCount(); Map allArrangedMaleCountMap = new HashMap<>(); for (ClassStudentCountVo classStudentCountVo : allArrangedMaleCount) { allArrangedMaleCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount()); } //查询所有班级已经安排住宿的女生人数,并组装成map备用 List allArrangedFemaleCount = roomBedMapper.getAllArrangedFemaleCount(); Map allArrangedFemaleCountMap = new HashMap<>(); for (ClassStudentCountVo classStudentCountVo : allArrangedFemaleCount) { allArrangedFemaleCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount()); } for (DistributeClassPageVo record : records) { Integer needCout = 0; Integer distributeCount = 0; Integer maleCount = 0, femaleCount = 0; record.setMaleCount(maleCount); record.setFemaleCount(femaleCount); if("SB10001".equals(dto.getGender()) && allStayMaleCountMap.get(record.getId()) != null){ if(allStayMaleCountMap.get(record.getId()) != null){ maleCount = allStayMaleCountMap.get(record.getId()) - (allArrangedMaleCountMap.get(record.getId()) == null ? 0 : allArrangedMaleCountMap.get(record.getId())); } record.setMaleCount(maleCount); needCout = allStayMaleCountMap.get(record.getId()); if(allArrangedMaleCountMap.get(record.getId()) != null){ distributeCount = (allArrangedMaleCountMap.get(record.getId()) == null ? 0 : allArrangedMaleCountMap.get(record.getId())); } }else if("SB10002".equals(dto.getGender())){ if(allStayFemaleCountMap.get(record.getId()) != null){ femaleCount = allStayFemaleCountMap.get(record.getId()) - (allArrangedFemaleCountMap.get(record.getId()) == null ? 0 : allArrangedFemaleCountMap.get(record.getId())); } record.setFemaleCount(femaleCount); needCout = femaleCount; if(allArrangedFemaleCountMap.get(record.getId()) != null){ distributeCount = (allArrangedFemaleCountMap.get(record.getId()) == null ? 0 : allArrangedFemaleCountMap.get(record.getId())); } }else{ needCout = allStayCountMap.get(record.getId()); if(allArrangedCountMap.get(record.getId()) != null){ distributeCount = (allArrangedCountMap.get(record.getId()) == null ? 0 : allArrangedCountMap.get(record.getId())); } if(allStayMaleCountMap.get(record.getId()) != null){ maleCount = allStayMaleCountMap.get(record.getId()) - (allArrangedMaleCountMap.get(record.getId()) == null ? 0 : allArrangedMaleCountMap.get(record.getId())); } record.setMaleCount(maleCount); if(allStayFemaleCountMap.get(record.getId()) != null){ femaleCount = allStayFemaleCountMap.get(record.getId()) - (allArrangedFemaleCountMap.get(record.getId()) == null ? 0 : allArrangedFemaleCountMap.get(record.getId())); } record.setFemaleCount(femaleCount); } if(needCout == null){ needCout = 0; } if(distributeCount == null){ distributeCount = 0; } record.setNeedCount(needCout); record.setDistributeCount(distributeCount); } return classInfo; } @Override public Page getDistributeRoomBedInfo(Page page, DistributeRoomBedPageDto dto) { return roomBedMapper.getDistributeRoomBedInfo(page, dto); } @Override public Boolean distributeRoomBed(DistributeRoomBedDto dto) { List roomList = roomMapper.selectList(new QueryWrapper().lambda().in(Room::getId, dto.getRoomIds())); Set genderSet = new HashSet<>(); for (Room room : roomList) { if("SB10001".equals(room.getGender())){ genderSet.add(1); }else if("SB10002".equals(room.getGender())){ genderSet.add(2); } } Map genderMap = new HashMap<>(); for (Integer genderNumber : genderSet) { if(genderNumber == 1){ genderMap.put(genderNumber, "SB10001"); }else if(genderNumber == 2){ genderMap.put(genderNumber, "SB10002"); } } Date modifyDate = new Date(); Long modifyUserId = StpUtil.getLoginIdAsLong(); //查询每个班的学生,修改床位信息 int i = 0; Map classDistributeBedNumber = new HashMap<>(); Map classStudent = new HashMap<>(); for (Integer genderNumber : genderSet) { //根据性别查询出所有床位信息 List bedInfoList = roomBedMapper.selectList( new MPJLambdaWrapper() .select(RoomBed::getId) .select(RoomBed.class, x -> VoToColumnUtil.fieldsToColumns(RoomBed.class).contains(x.getProperty())) .innerJoin(Room.class, Room::getId, RoomBed::getRoomId) .eq(Room::getGender, genderMap.get(genderNumber)) .in(RoomBed::getRoomId, dto.getRoomIds()) ); for (Long classId : dto.getClassIds()) { List studentList = baseStudentMapper.selectList( MPJWrappers.lambdaJoin() .select(BaseStudent::getUserId) .eq(BaseClass::getId, classId) .eq(XjrUser::getGender, genderNumber) .eq(BaseStudentSchoolRoll::getStduyStatus, "FB3002") .eq(BaseStudent::getDeleteMark, DeleteMark.NODELETE.getCode()) .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode()) .innerJoin(XjrUser.class, XjrUser::getId, BaseStudent::getUserId) .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, BaseStudent::getUserId) .leftJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId) ); //已分配床位数 int distributeBedNumber = 0; for (BaseStudent studentInfoVo : studentList) { if(i >= bedInfoList.size()){ continue; } RoomBed roomBed = bedInfoList.get(i); roomBed.setStudentUserId(studentInfoVo.getUserId()); roomBed.setModifyDate(modifyDate); roomBed.setModifyUserId(modifyUserId); roomBedMapper.updateById(roomBed); i ++; distributeBedNumber ++; } classDistributeBedNumber.put(classId, distributeBedNumber); classStudent.put(classId, studentList.size()); } } Map classGradeMap = new HashMap<>(); baseClassMapper.selectList( MPJWrappers.lambdaJoin().in(BaseClass::getId, dto.getClassIds()) ).forEach((baseClass)->{ classGradeMap.put(baseClass.getId(), baseClass.getGradeId()); }); //插入记录表 room_bed_record Integer maxSortCode = roomBedRecordMapper.getMaxSortCode(); for (Long classId : classGradeMap.keySet()) { maxSortCode ++; Integer studentCount = classStudent.get(classId); RoomBedRecord record = new RoomBedRecord(); record.setClassId(classId); record.setGradeId(classGradeMap.get(classId)); record.setCreateDate(modifyDate); record.setSortCode(maxSortCode); record.setNeedBedNumber(classStudent.get(classId)); record.setDistributeBedNumber(classDistributeBedNumber.get(classId)); record.setDeleteMark(DeleteMark.NODELETE.getCode()); roomBedRecordMapper.insert(record); } //查询每个寝室住入的班级数量,大于2的设置为混合寝室 List classCountVoList = roomMapper.getRoomClassCount(dto.getRoomIds()); for (RoomClassCountVo roomClassCountVo : classCountVoList) { if(roomClassCountVo.getClassCount() > 1){ Room updRoom = roomMapper.selectById(roomClassCountVo.getId()); updRoom.setIsMax(1); roomMapper.updateById(updRoom); } } return true; } @Override public List getDistributeResult(DistributeRoomBedDto dto) { List list = roomBedMapper.getDistributeResult(dto); List classList = baseClassMapper.selectList( Wrappers.lambdaQuery(BaseClass.class).in(BaseClass::getId, dto.getClassIds()) .select(BaseClass.class, x -> VoToColumnUtil.fieldsToColumns(BaseClass.class).contains(x.getProperty())) ); List result = new ArrayList<>(); for (BaseClass baseClass : classList) { DistributeResultClassVo classVo = new DistributeResultClassVo(); classVo.setClassName(baseClass.getName()); List studentList = new ArrayList<>(); for (DistributeResultListVo listVo : list) { if(listVo.getClassId() == null || !listVo.getClassId().equals(baseClass.getId().toString())){ continue; } studentList.add(listVo); } classVo.setStudentList(studentList); result.add(classVo); } return result; } @Override public List getClassStudetBed(AdjustClassPageDto dto) { List classList = baseClassMapper.selectList( new QueryWrapper().lambda() .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode()) .eq(ObjectUtil.isNotNull(dto.getClassId()), BaseClass::getId, dto.getClassId()) .eq(ObjectUtil.isNotNull(dto.getGradeId()), BaseClass::getGradeId, dto.getGradeId()) ); List result = new ArrayList<>(); List allStudent = roomBedMapper.getClassStudetBed(dto); for (BaseClass classOne : classList) { List studentList = new ArrayList<>(); for (AdjustBedClassStudentPageVo adjustBedClassStudentPageVo : allStudent) { if(!classOne.getId().toString().equals(adjustBedClassStudentPageVo.getClassId())){ continue; } studentList.add(adjustBedClassStudentPageVo); } if(studentList.isEmpty()){ continue; } AdjustBedClassPageVo adjustBedClassPageVo = BeanUtil.toBean(classOne, AdjustBedClassPageVo.class); adjustBedClassPageVo.setStudentList(studentList); result.add(adjustBedClassPageVo); } return result; } @Override public List getBedStudetInfo(AdjustBedPageDto dto) { return roomBedMapper.getBedStudentInfo(dto); } @Override public Page getNoBedStudent(Page page, AdjustBedPageDto dto) { return roomBedMapper.getNoBedStudent(page, dto); } @Override public Boolean adjustBed(AdjustStudentBedDto dto) { //查询学生的性别 XjrUser xjrUser = xjrUserMapper.selectById(dto.getStudentUserId()); String studentGender = null; if(1 == xjrUser.getGender()){ studentGender = "SB10001"; }else if(2 == xjrUser.getGender()){ studentGender = "SB10002"; } RoomBed roomBedInfo = roomBedMapper.selectById(dto.getBedId()); Room room = roomMapper.selectById(roomBedInfo.getRoomId()); if(!room.getGender().equals(studentGender)){ return true; } //先清空学生原来的床位 UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("student_user_id", dto.getStudentUserId()); updateWrapper.setSql("student_user_id = null"); updateWrapper.setSql("is_check_in = 0"); RoomBed roomBed = roomBedMapper.selectOne(new QueryWrapper().lambda().eq(RoomBed::getStudentUserId, dto.getStudentUserId())); roomBedMapper.update(roomBed, updateWrapper); //再把学生保存到新的床位 roomBedMapper.updateById(new RoomBed(){{ setId(dto.getBedId()); setStudentUserId(dto.getStudentUserId()); }}); return true; } }