RoomBedServiceImpl.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. package com.xjrsoft.module.room.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  7. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  8. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  9. import com.github.yulichang.base.MPJBaseServiceImpl;
  10. import com.github.yulichang.toolkit.MPJWrappers;
  11. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  12. import com.xjrsoft.common.enums.DeleteMark;
  13. import com.xjrsoft.common.utils.VoToColumnUtil;
  14. import com.xjrsoft.module.base.entity.BaseClass;
  15. import com.xjrsoft.module.base.mapper.BaseClassMapper;
  16. import com.xjrsoft.module.room.dto.AdjustBedPageDto;
  17. import com.xjrsoft.module.room.dto.AdjustClassPageDto;
  18. import com.xjrsoft.module.room.dto.AdjustStudentBedDto;
  19. import com.xjrsoft.module.room.dto.DistributeClassPageDto;
  20. import com.xjrsoft.module.room.dto.DistributeRoomBedDto;
  21. import com.xjrsoft.module.room.dto.DistributeRoomBedPageDto;
  22. import com.xjrsoft.module.room.dto.RoomBedPageDto;
  23. import com.xjrsoft.module.room.entity.Room;
  24. import com.xjrsoft.module.room.entity.RoomBed;
  25. import com.xjrsoft.module.room.entity.RoomBedRecord;
  26. import com.xjrsoft.module.room.mapper.RoomBedMapper;
  27. import com.xjrsoft.module.room.mapper.RoomBedRecordMapper;
  28. import com.xjrsoft.module.room.mapper.RoomMapper;
  29. import com.xjrsoft.module.room.service.IRoomBedService;
  30. import com.xjrsoft.module.room.vo.AdjustBedClassPageVo;
  31. import com.xjrsoft.module.room.vo.AdjustBedClassStudentPageVo;
  32. import com.xjrsoft.module.room.vo.AdjustBedStudentPageVo;
  33. import com.xjrsoft.module.room.vo.ClassStudentCountVo;
  34. import com.xjrsoft.module.room.vo.DistributeClassPageVo;
  35. import com.xjrsoft.module.room.vo.DistributeResultClassVo;
  36. import com.xjrsoft.module.room.vo.DistributeResultListVo;
  37. import com.xjrsoft.module.room.vo.DistributeRoomBedPageVo;
  38. import com.xjrsoft.module.room.vo.NoBedStudentPageVo;
  39. import com.xjrsoft.module.room.vo.RoomBedExcelVo;
  40. import com.xjrsoft.module.room.vo.RoomBedPageVo;
  41. import com.xjrsoft.module.room.vo.RoomClassCountVo;
  42. import com.xjrsoft.module.student.entity.BaseStudent;
  43. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  44. import com.xjrsoft.module.student.mapper.BaseStudentMapper;
  45. import com.xjrsoft.module.teacher.entity.XjrUser;
  46. import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
  47. import lombok.AllArgsConstructor;
  48. import org.springframework.stereotype.Service;
  49. import java.util.ArrayList;
  50. import java.util.Date;
  51. import java.util.HashMap;
  52. import java.util.HashSet;
  53. import java.util.List;
  54. import java.util.Map;
  55. import java.util.Set;
  56. /**
  57. * @title: 寝室床位
  58. * @Author dzx
  59. * @Date: 2023-12-27
  60. * @Version 1.0
  61. */
  62. @Service
  63. @AllArgsConstructor
  64. public class RoomBedServiceImpl extends MPJBaseServiceImpl<RoomBedMapper, RoomBed> implements IRoomBedService {
  65. private final RoomMapper roomMapper;
  66. private final RoomBedMapper roomBedMapper;
  67. private final BaseStudentMapper baseStudentMapper;
  68. private final BaseClassMapper baseClassMapper;
  69. private final XjrUserMapper xjrUserMapper;
  70. private final RoomBedRecordMapper roomBedRecordMapper;
  71. @Override
  72. public Page<RoomBedPageVo> getPage(Page<RoomBedPageVo> page, RoomBedPageDto dto) {
  73. Page<RoomBedPageVo> result = roomBedMapper.getPage(page, dto);
  74. return result;
  75. }
  76. @Override
  77. public List<RoomBedExcelVo> getList(RoomBedPageDto dto) {
  78. return roomBedMapper.getList(dto);
  79. }
  80. @Override
  81. public Boolean clearStudentInfo(List<Long> ids) {
  82. for (Long id : ids) {
  83. RoomBed roomBed = roomBedMapper.selectById(id);
  84. roomBed.setStudentUserId(null);
  85. // RoomBed roomBedData = BeanUtil.toBean(roomBed, RoomBed.class);
  86. // roomBedMapper.updateById(new RoomBed(){{
  87. // setId(id);
  88. // setStudentUserId(null);
  89. // }});
  90. UpdateWrapper<RoomBed> updateWrapper = new UpdateWrapper<>();
  91. updateWrapper.eq("id", id);
  92. updateWrapper.setSql("student_user_id = null");
  93. updateWrapper.setSql("is_check_in = 0");
  94. roomBedMapper.update(roomBed, updateWrapper);
  95. }
  96. return true;
  97. }
  98. @Override
  99. public Boolean clearStudentInfoByRoomId(Long id) {
  100. List<RoomBed> bedList = roomBedMapper.selectList(
  101. MPJWrappers.<RoomBed>lambdaJoin().eq(RoomBed::getRoomId, id)
  102. );
  103. for (RoomBed roomBed : bedList) {
  104. UpdateWrapper<RoomBed> updateWrapper = new UpdateWrapper<>();
  105. updateWrapper.eq("id", roomBed.getId());
  106. updateWrapper.setSql("student_user_id = null");
  107. updateWrapper.setSql("is_check_in = 0");
  108. roomBedMapper.update(roomBed, updateWrapper);
  109. }
  110. return true;
  111. }
  112. @Override
  113. public Boolean clearStudentInfoByBedId(Long id) {
  114. UpdateWrapper<RoomBed> updateWrapper = new UpdateWrapper<>();
  115. updateWrapper.eq("id", id);
  116. updateWrapper.setSql("student_user_id = null");
  117. updateWrapper.setSql("is_check_in = 0");
  118. RoomBed roomBed = roomBedMapper.selectById(id);
  119. roomBedMapper.update(roomBed, updateWrapper);
  120. return true;
  121. }
  122. @Override
  123. public Page<DistributeClassPageVo> getDistributeClassInfo(Page<DistributeClassPageDto> page, DistributeClassPageDto dto) {
  124. Page<DistributeClassPageVo> classInfo = roomBedMapper.getDistributeClassInfo(page, dto);
  125. List<DistributeClassPageVo> records = classInfo.getRecords();
  126. //查询所有班级需要安排住宿的人数,并组装成map备用
  127. List<ClassStudentCountVo> allStayCount = roomBedMapper.getAllStayCount();
  128. Map<String, Integer> allStayCountMap = new HashMap<>();
  129. for (ClassStudentCountVo classStudentCountVo : allStayCount) {
  130. allStayCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount());
  131. }
  132. //查询所有班级需要安排住宿的男生人数,并组装成map备用
  133. List<ClassStudentCountVo> allStayMaleCount = roomBedMapper.getAllStayMaleCount();
  134. Map<String, Integer> allStayMaleCountMap = new HashMap<>();
  135. for (ClassStudentCountVo classStudentCountVo : allStayMaleCount) {
  136. allStayMaleCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount());
  137. }
  138. //查询所有班级需要安排住宿的女生人数,并组装成map备用
  139. List<ClassStudentCountVo> allStayFemaleCount = roomBedMapper.getAllStayFemaleCount();
  140. Map<String, Integer> allStayFemaleCountMap = new HashMap<>();
  141. for (ClassStudentCountVo classStudentCountVo : allStayFemaleCount) {
  142. allStayFemaleCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount());
  143. }
  144. //查询所有班级已经安排住宿的总人数,并组装成map备用
  145. List<ClassStudentCountVo> allArrangedCount = roomBedMapper.getAllArrangedCount();
  146. Map<String, Integer> allArrangedCountMap = new HashMap<>();
  147. for (ClassStudentCountVo classStudentCountVo : allArrangedCount) {
  148. allArrangedCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount());
  149. }
  150. //查询所有班级已经安排住宿的男生人数,并组装成map备用
  151. List<ClassStudentCountVo> allArrangedMaleCount = roomBedMapper.getAllArrangedMaleCount();
  152. Map<String, Integer> allArrangedMaleCountMap = new HashMap<>();
  153. for (ClassStudentCountVo classStudentCountVo : allArrangedMaleCount) {
  154. allArrangedMaleCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount());
  155. }
  156. //查询所有班级已经安排住宿的女生人数,并组装成map备用
  157. List<ClassStudentCountVo> allArrangedFemaleCount = roomBedMapper.getAllArrangedFemaleCount();
  158. Map<String, Integer> allArrangedFemaleCountMap = new HashMap<>();
  159. for (ClassStudentCountVo classStudentCountVo : allArrangedFemaleCount) {
  160. allArrangedFemaleCountMap.put(classStudentCountVo.getClassId(), classStudentCountVo.getStudentCount());
  161. }
  162. for (DistributeClassPageVo record : records) {
  163. Integer needCout = 0;
  164. Integer distributeCount = 0;
  165. Integer maleCount = 0, femaleCount = 0;
  166. record.setMaleCount(maleCount);
  167. record.setFemaleCount(femaleCount);
  168. if("SB10001".equals(dto.getGender()) && allStayMaleCountMap.get(record.getId()) != null){
  169. if(allStayMaleCountMap.get(record.getId()) != null){
  170. maleCount = allStayMaleCountMap.get(record.getId()) - (allArrangedMaleCountMap.get(record.getId()) == null ? 0 : allArrangedMaleCountMap.get(record.getId()));
  171. }
  172. if(maleCount < 0){
  173. maleCount = 0;
  174. }
  175. record.setMaleCount(maleCount);
  176. needCout = allStayMaleCountMap.get(record.getId());
  177. if(allArrangedMaleCountMap.get(record.getId()) != null){
  178. distributeCount = (allArrangedMaleCountMap.get(record.getId()) == null ? 0 : allArrangedMaleCountMap.get(record.getId()));
  179. }
  180. }else if("SB10002".equals(dto.getGender())){
  181. if(allStayFemaleCountMap.get(record.getId()) != null){
  182. femaleCount = allStayFemaleCountMap.get(record.getId()) - (allArrangedFemaleCountMap.get(record.getId()) == null ? 0 : allArrangedFemaleCountMap.get(record.getId()));
  183. }
  184. if(femaleCount < 0){
  185. femaleCount = 0;
  186. }
  187. record.setFemaleCount(femaleCount);
  188. needCout = femaleCount;
  189. if(allArrangedFemaleCountMap.get(record.getId()) != null){
  190. distributeCount = (allArrangedFemaleCountMap.get(record.getId()) == null ? 0 : allArrangedFemaleCountMap.get(record.getId()));
  191. }
  192. }else{
  193. needCout = allStayCountMap.get(record.getId());
  194. if(allArrangedCountMap.get(record.getId()) != null){
  195. distributeCount = (allArrangedCountMap.get(record.getId()) == null ? 0 : allArrangedCountMap.get(record.getId()));
  196. }
  197. if(allStayMaleCountMap.get(record.getId()) != null){
  198. maleCount = allStayMaleCountMap.get(record.getId()) - (allArrangedMaleCountMap.get(record.getId()) == null ? 0 : allArrangedMaleCountMap.get(record.getId()));
  199. }
  200. if(maleCount < 0){
  201. maleCount = 0;
  202. }
  203. record.setMaleCount(maleCount);
  204. if(allStayFemaleCountMap.get(record.getId()) != null){
  205. femaleCount = allStayFemaleCountMap.get(record.getId()) - (allArrangedFemaleCountMap.get(record.getId()) == null ? 0 : allArrangedFemaleCountMap.get(record.getId()));
  206. }
  207. if(femaleCount < 0){
  208. femaleCount = 0;
  209. }
  210. record.setFemaleCount(femaleCount);
  211. }
  212. if(needCout == null){
  213. needCout = 0;
  214. }
  215. if(distributeCount == null){
  216. distributeCount = 0;
  217. }
  218. record.setNeedCount(needCout);
  219. record.setDistributeCount(distributeCount);
  220. }
  221. return classInfo;
  222. }
  223. @Override
  224. public Page<DistributeRoomBedPageVo> getDistributeRoomBedInfo(Page<DistributeRoomBedPageDto> page, DistributeRoomBedPageDto dto) {
  225. return roomBedMapper.getDistributeRoomBedInfo(page, dto);
  226. }
  227. @Override
  228. public Boolean distributeRoomBed(DistributeRoomBedDto dto) {
  229. List<Room> roomList = roomMapper.selectList(new QueryWrapper<Room>().lambda().in(Room::getId, dto.getRoomIds()));
  230. Set<Integer> genderSet = new HashSet<>();
  231. for (Room room : roomList) {
  232. if("SB10001".equals(room.getGender())){
  233. genderSet.add(1);
  234. }else if("SB10002".equals(room.getGender())){
  235. genderSet.add(2);
  236. }
  237. }
  238. Map<Integer, String> genderMap = new HashMap<>();
  239. for (Integer genderNumber : genderSet) {
  240. if(genderNumber == 1){
  241. genderMap.put(genderNumber, "SB10001");
  242. }else if(genderNumber == 2){
  243. genderMap.put(genderNumber, "SB10002");
  244. }
  245. }
  246. Date modifyDate = new Date();
  247. Long modifyUserId = StpUtil.getLoginIdAsLong();
  248. //查询每个班的学生,修改床位信息
  249. int i = 0;
  250. Map<Long, Integer> classDistributeBedNumber = new HashMap<>();
  251. Map<Long, Integer> classStudent = new HashMap<>();
  252. for (Integer genderNumber : genderSet) {
  253. //根据性别查询出所有空床位信息
  254. List<RoomBed> bedInfoList = roomBedMapper.selectList(
  255. new MPJLambdaWrapper<RoomBed>()
  256. .select(RoomBed::getId)
  257. .select(RoomBed.class, x -> VoToColumnUtil.fieldsToColumns(RoomBed.class).contains(x.getProperty()))
  258. .innerJoin(Room.class, Room::getId, RoomBed::getRoomId)
  259. .eq(Room::getGender, genderMap.get(genderNumber))
  260. .isNull(RoomBed::getStudentUserId)
  261. .eq(RoomBed::getIsCheckIn, 0)
  262. .in(RoomBed::getRoomId, dto.getRoomIds())
  263. );
  264. for (Long classId : dto.getClassIds()) {
  265. List<BaseStudent> studentList = baseStudentMapper.selectList(
  266. MPJWrappers.<BaseStudent>lambdaJoin()
  267. .select(BaseStudent::getUserId)
  268. .eq(BaseClass::getId, classId)
  269. .eq(XjrUser::getGender, genderNumber)
  270. .eq(BaseStudentSchoolRoll::getStduyStatus, "FB3002")
  271. .eq(BaseStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
  272. .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
  273. .innerJoin(XjrUser.class, XjrUser::getId, BaseStudent::getUserId)
  274. .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, BaseStudent::getUserId)
  275. .leftJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
  276. );
  277. //已分配床位数
  278. int distributeBedNumber = 0;
  279. for (BaseStudent studentInfoVo : studentList) {
  280. if(i >= bedInfoList.size()){
  281. continue;
  282. }
  283. RoomBed roomBed = bedInfoList.get(i);
  284. roomBed.setStudentUserId(studentInfoVo.getUserId());
  285. roomBed.setModifyDate(modifyDate);
  286. roomBed.setModifyUserId(modifyUserId);
  287. roomBedMapper.updateById(roomBed);
  288. i ++;
  289. distributeBedNumber ++;
  290. }
  291. classDistributeBedNumber.put(classId, distributeBedNumber);
  292. classStudent.put(classId, studentList.size());
  293. }
  294. }
  295. Map<Long, Long> classGradeMap = new HashMap<>();
  296. baseClassMapper.selectList(
  297. MPJWrappers.<BaseClass>lambdaJoin().in(BaseClass::getId, dto.getClassIds())
  298. ).forEach((baseClass)->{
  299. classGradeMap.put(baseClass.getId(), baseClass.getGradeId());
  300. });
  301. //插入记录表 room_bed_record
  302. Integer maxSortCode = roomBedRecordMapper.getMaxSortCode();
  303. for (Long classId : classGradeMap.keySet()) {
  304. maxSortCode ++;
  305. Integer studentCount = classStudent.get(classId);
  306. RoomBedRecord record = new RoomBedRecord();
  307. record.setClassId(classId);
  308. record.setGradeId(classGradeMap.get(classId));
  309. record.setCreateDate(modifyDate);
  310. record.setSortCode(maxSortCode);
  311. record.setNeedBedNumber(classStudent.get(classId));
  312. record.setDistributeBedNumber(classDistributeBedNumber.get(classId));
  313. record.setDeleteMark(DeleteMark.NODELETE.getCode());
  314. roomBedRecordMapper.insert(record);
  315. }
  316. //查询每个寝室住入的班级数量,大于2的设置为混合寝室
  317. List<RoomClassCountVo> classCountVoList = roomMapper.getRoomClassCount(dto.getRoomIds());
  318. for (RoomClassCountVo roomClassCountVo : classCountVoList) {
  319. if(roomClassCountVo.getClassCount() > 1){
  320. Room updRoom = roomMapper.selectById(roomClassCountVo.getId());
  321. updRoom.setIsMax(1);
  322. roomMapper.updateById(updRoom);
  323. }
  324. }
  325. return true;
  326. }
  327. @Override
  328. public List<DistributeResultClassVo> getDistributeResult(DistributeRoomBedDto dto) {
  329. List<DistributeResultListVo> list = roomBedMapper.getDistributeResult(dto);
  330. List<BaseClass> classList = baseClassMapper.selectList(
  331. Wrappers.lambdaQuery(BaseClass.class).in(BaseClass::getId, dto.getClassIds())
  332. .select(BaseClass.class, x -> VoToColumnUtil.fieldsToColumns(BaseClass.class).contains(x.getProperty()))
  333. );
  334. List<DistributeResultClassVo> result = new ArrayList<>();
  335. for (BaseClass baseClass : classList) {
  336. DistributeResultClassVo classVo = new DistributeResultClassVo();
  337. classVo.setClassName(baseClass.getName());
  338. List<DistributeResultListVo> studentList = new ArrayList<>();
  339. for (DistributeResultListVo listVo : list) {
  340. if(listVo.getClassId() == null || !listVo.getClassId().equals(baseClass.getId().toString())){
  341. continue;
  342. }
  343. studentList.add(listVo);
  344. }
  345. classVo.setStudentList(studentList);
  346. result.add(classVo);
  347. }
  348. return result;
  349. }
  350. @Override
  351. public List<AdjustBedClassPageVo> getClassStudetBed(AdjustClassPageDto dto) {
  352. List<BaseClass> classList = baseClassMapper.selectList(
  353. new QueryWrapper<BaseClass>().lambda()
  354. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  355. .eq(ObjectUtil.isNotNull(dto.getClassId()), BaseClass::getId, dto.getClassId())
  356. .eq(ObjectUtil.isNotNull(dto.getGradeId()), BaseClass::getGradeId, dto.getGradeId())
  357. );
  358. List<AdjustBedClassPageVo> result = new ArrayList<>();
  359. List<AdjustBedClassStudentPageVo> allStudent = roomBedMapper.getClassStudetBed(dto);
  360. for (BaseClass classOne : classList) {
  361. List<AdjustBedClassStudentPageVo> studentList = new ArrayList<>();
  362. for (AdjustBedClassStudentPageVo adjustBedClassStudentPageVo : allStudent) {
  363. if(!classOne.getId().toString().equals(adjustBedClassStudentPageVo.getClassId())){
  364. continue;
  365. }
  366. studentList.add(adjustBedClassStudentPageVo);
  367. }
  368. if(studentList.isEmpty()){
  369. continue;
  370. }
  371. AdjustBedClassPageVo adjustBedClassPageVo = BeanUtil.toBean(classOne, AdjustBedClassPageVo.class);
  372. adjustBedClassPageVo.setStudentList(studentList);
  373. result.add(adjustBedClassPageVo);
  374. }
  375. return result;
  376. }
  377. @Override
  378. public List<AdjustBedStudentPageVo> getBedStudetInfo(AdjustBedPageDto dto) {
  379. return roomBedMapper.getBedStudentInfo(dto);
  380. }
  381. @Override
  382. public Page<NoBedStudentPageVo> getNoBedStudent(Page<AdjustBedPageDto> page, AdjustBedPageDto dto) {
  383. return roomBedMapper.getNoBedStudent(page, dto);
  384. }
  385. @Override
  386. public Boolean adjustBed(AdjustStudentBedDto dto) {
  387. //查询学生的性别
  388. XjrUser xjrUser = xjrUserMapper.selectById(dto.getStudentUserId());
  389. String studentGender = null;
  390. if(1 == xjrUser.getGender()){
  391. studentGender = "SB10001";
  392. }else if(2 == xjrUser.getGender()){
  393. studentGender = "SB10002";
  394. }
  395. RoomBed roomBedInfo = roomBedMapper.selectById(dto.getBedId());
  396. Room room = roomMapper.selectById(roomBedInfo.getRoomId());
  397. if(!room.getGender().equals(studentGender)){
  398. return true;
  399. }
  400. //先清空学生原来的床位
  401. UpdateWrapper<RoomBed> updateWrapper = new UpdateWrapper<>();
  402. updateWrapper.eq("student_user_id", dto.getStudentUserId());
  403. updateWrapper.setSql("student_user_id = null");
  404. updateWrapper.setSql("is_check_in = 0");
  405. RoomBed roomBed = roomBedMapper.selectOne(new QueryWrapper<RoomBed>().lambda().eq(RoomBed::getStudentUserId, dto.getStudentUserId()));
  406. roomBedMapper.update(roomBed, updateWrapper);
  407. //再把学生保存到新的床位
  408. roomBedMapper.updateById(new RoomBed(){{
  409. setId(dto.getBedId());
  410. setStudentUserId(dto.getStudentUserId());
  411. }});
  412. return true;
  413. }
  414. }