RoomBedServiceImpl.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  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. record.setMaleCount(maleCount);
  173. needCout = allStayMaleCountMap.get(record.getId());
  174. if(allArrangedMaleCountMap.get(record.getId()) != null){
  175. distributeCount = (allArrangedMaleCountMap.get(record.getId()) == null ? 0 : allArrangedMaleCountMap.get(record.getId()));
  176. }
  177. }else if("SB10002".equals(dto.getGender())){
  178. if(allStayFemaleCountMap.get(record.getId()) != null){
  179. femaleCount = allStayFemaleCountMap.get(record.getId()) - (allArrangedFemaleCountMap.get(record.getId()) == null ? 0 : allArrangedFemaleCountMap.get(record.getId()));
  180. }
  181. record.setFemaleCount(femaleCount);
  182. needCout = femaleCount;
  183. if(allArrangedFemaleCountMap.get(record.getId()) != null){
  184. distributeCount = (allArrangedFemaleCountMap.get(record.getId()) == null ? 0 : allArrangedFemaleCountMap.get(record.getId()));
  185. }
  186. }else{
  187. needCout = allStayCountMap.get(record.getId());
  188. if(allArrangedCountMap.get(record.getId()) != null){
  189. distributeCount = (allArrangedCountMap.get(record.getId()) == null ? 0 : allArrangedCountMap.get(record.getId()));
  190. }
  191. if(allStayMaleCountMap.get(record.getId()) != null){
  192. maleCount = allStayMaleCountMap.get(record.getId()) - (allArrangedMaleCountMap.get(record.getId()) == null ? 0 : allArrangedMaleCountMap.get(record.getId()));
  193. }
  194. record.setMaleCount(maleCount);
  195. if(allStayFemaleCountMap.get(record.getId()) != null){
  196. femaleCount = allStayFemaleCountMap.get(record.getId()) - (allArrangedFemaleCountMap.get(record.getId()) == null ? 0 : allArrangedFemaleCountMap.get(record.getId()));
  197. }
  198. record.setFemaleCount(femaleCount);
  199. }
  200. if(needCout == null){
  201. needCout = 0;
  202. }
  203. if(distributeCount == null){
  204. distributeCount = 0;
  205. }
  206. record.setNeedCount(needCout);
  207. record.setDistributeCount(distributeCount);
  208. }
  209. return classInfo;
  210. }
  211. @Override
  212. public Page<DistributeRoomBedPageVo> getDistributeRoomBedInfo(Page<DistributeRoomBedPageDto> page, DistributeRoomBedPageDto dto) {
  213. return roomBedMapper.getDistributeRoomBedInfo(page, dto);
  214. }
  215. @Override
  216. public Boolean distributeRoomBed(DistributeRoomBedDto dto) {
  217. List<Room> roomList = roomMapper.selectList(new QueryWrapper<Room>().lambda().in(Room::getId, dto.getRoomIds()));
  218. Set<Integer> genderSet = new HashSet<>();
  219. for (Room room : roomList) {
  220. if("SB10001".equals(room.getGender())){
  221. genderSet.add(1);
  222. }else if("SB10002".equals(room.getGender())){
  223. genderSet.add(2);
  224. }
  225. }
  226. Map<Integer, String> genderMap = new HashMap<>();
  227. for (Integer genderNumber : genderSet) {
  228. if(genderNumber == 1){
  229. genderMap.put(genderNumber, "SB10001");
  230. }else if(genderNumber == 2){
  231. genderMap.put(genderNumber, "SB10002");
  232. }
  233. }
  234. Date modifyDate = new Date();
  235. Long modifyUserId = StpUtil.getLoginIdAsLong();
  236. //查询每个班的学生,修改床位信息
  237. int i = 0;
  238. Map<Long, Integer> classDistributeBedNumber = new HashMap<>();
  239. Map<Long, Integer> classStudent = new HashMap<>();
  240. for (Integer genderNumber : genderSet) {
  241. //根据性别查询出所有床位信息
  242. List<RoomBed> bedInfoList = roomBedMapper.selectList(
  243. new MPJLambdaWrapper<RoomBed>()
  244. .select(RoomBed::getId)
  245. .select(RoomBed.class, x -> VoToColumnUtil.fieldsToColumns(RoomBed.class).contains(x.getProperty()))
  246. .innerJoin(Room.class, Room::getId, RoomBed::getRoomId)
  247. .eq(Room::getGender, genderMap.get(genderNumber))
  248. .in(RoomBed::getRoomId, dto.getRoomIds())
  249. );
  250. for (Long classId : dto.getClassIds()) {
  251. List<BaseStudent> studentList = baseStudentMapper.selectList(
  252. MPJWrappers.<BaseStudent>lambdaJoin()
  253. .select(BaseStudent::getUserId)
  254. .eq(BaseClass::getId, classId)
  255. .eq(XjrUser::getGender, genderNumber)
  256. .eq(BaseStudentSchoolRoll::getStduyStatus, "FB3002")
  257. .eq(BaseStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
  258. .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
  259. .innerJoin(XjrUser.class, XjrUser::getId, BaseStudent::getUserId)
  260. .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, BaseStudent::getUserId)
  261. .leftJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
  262. );
  263. //已分配床位数
  264. int distributeBedNumber = 0;
  265. for (BaseStudent studentInfoVo : studentList) {
  266. if(i >= bedInfoList.size()){
  267. continue;
  268. }
  269. RoomBed roomBed = bedInfoList.get(i);
  270. roomBed.setStudentUserId(studentInfoVo.getUserId());
  271. roomBed.setModifyDate(modifyDate);
  272. roomBed.setModifyUserId(modifyUserId);
  273. roomBedMapper.updateById(roomBed);
  274. i ++;
  275. distributeBedNumber ++;
  276. }
  277. classDistributeBedNumber.put(classId, distributeBedNumber);
  278. classStudent.put(classId, studentList.size());
  279. }
  280. }
  281. Map<Long, Long> classGradeMap = new HashMap<>();
  282. baseClassMapper.selectList(
  283. MPJWrappers.<BaseClass>lambdaJoin().in(BaseClass::getId, dto.getClassIds())
  284. ).forEach((baseClass)->{
  285. classGradeMap.put(baseClass.getId(), baseClass.getGradeId());
  286. });
  287. //插入记录表 room_bed_record
  288. Integer maxSortCode = roomBedRecordMapper.getMaxSortCode();
  289. for (Long classId : classGradeMap.keySet()) {
  290. maxSortCode ++;
  291. Integer studentCount = classStudent.get(classId);
  292. RoomBedRecord record = new RoomBedRecord();
  293. record.setClassId(classId);
  294. record.setGradeId(classGradeMap.get(classId));
  295. record.setCreateDate(modifyDate);
  296. record.setSortCode(maxSortCode);
  297. record.setNeedBedNumber(classStudent.get(classId));
  298. record.setDistributeBedNumber(classDistributeBedNumber.get(classId));
  299. record.setDeleteMark(DeleteMark.NODELETE.getCode());
  300. roomBedRecordMapper.insert(record);
  301. }
  302. //查询每个寝室住入的班级数量,大于2的设置为混合寝室
  303. List<RoomClassCountVo> classCountVoList = roomMapper.getRoomClassCount(dto.getRoomIds());
  304. for (RoomClassCountVo roomClassCountVo : classCountVoList) {
  305. if(roomClassCountVo.getClassCount() > 1){
  306. Room updRoom = roomMapper.selectById(roomClassCountVo.getId());
  307. updRoom.setIsMax(1);
  308. roomMapper.updateById(updRoom);
  309. }
  310. }
  311. return true;
  312. }
  313. @Override
  314. public List<DistributeResultClassVo> getDistributeResult(DistributeRoomBedDto dto) {
  315. List<DistributeResultListVo> list = roomBedMapper.getDistributeResult(dto);
  316. List<BaseClass> classList = baseClassMapper.selectList(
  317. Wrappers.lambdaQuery(BaseClass.class).in(BaseClass::getId, dto.getClassIds())
  318. .select(BaseClass.class, x -> VoToColumnUtil.fieldsToColumns(BaseClass.class).contains(x.getProperty()))
  319. );
  320. List<DistributeResultClassVo> result = new ArrayList<>();
  321. for (BaseClass baseClass : classList) {
  322. DistributeResultClassVo classVo = new DistributeResultClassVo();
  323. classVo.setClassName(baseClass.getName());
  324. List<DistributeResultListVo> studentList = new ArrayList<>();
  325. for (DistributeResultListVo listVo : list) {
  326. if(listVo.getClassId() == null || !listVo.getClassId().equals(baseClass.getId().toString())){
  327. continue;
  328. }
  329. studentList.add(listVo);
  330. }
  331. classVo.setStudentList(studentList);
  332. result.add(classVo);
  333. }
  334. return result;
  335. }
  336. @Override
  337. public List<AdjustBedClassPageVo> getClassStudetBed(AdjustClassPageDto dto) {
  338. List<BaseClass> classList = baseClassMapper.selectList(
  339. new QueryWrapper<BaseClass>().lambda()
  340. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  341. .eq(ObjectUtil.isNotNull(dto.getClassId()), BaseClass::getId, dto.getClassId())
  342. .eq(ObjectUtil.isNotNull(dto.getGradeId()), BaseClass::getGradeId, dto.getGradeId())
  343. );
  344. List<AdjustBedClassPageVo> result = new ArrayList<>();
  345. List<AdjustBedClassStudentPageVo> allStudent = roomBedMapper.getClassStudetBed(dto);
  346. for (BaseClass classOne : classList) {
  347. List<AdjustBedClassStudentPageVo> studentList = new ArrayList<>();
  348. for (AdjustBedClassStudentPageVo adjustBedClassStudentPageVo : allStudent) {
  349. if(!classOne.getId().toString().equals(adjustBedClassStudentPageVo.getClassId())){
  350. continue;
  351. }
  352. studentList.add(adjustBedClassStudentPageVo);
  353. }
  354. if(studentList.isEmpty()){
  355. continue;
  356. }
  357. AdjustBedClassPageVo adjustBedClassPageVo = BeanUtil.toBean(classOne, AdjustBedClassPageVo.class);
  358. adjustBedClassPageVo.setStudentList(studentList);
  359. result.add(adjustBedClassPageVo);
  360. }
  361. return result;
  362. }
  363. @Override
  364. public List<AdjustBedStudentPageVo> getBedStudetInfo(AdjustBedPageDto dto) {
  365. return roomBedMapper.getBedStudentInfo(dto);
  366. }
  367. @Override
  368. public Page<NoBedStudentPageVo> getNoBedStudent(Page<AdjustBedPageDto> page, AdjustBedPageDto dto) {
  369. return roomBedMapper.getNoBedStudent(page, dto);
  370. }
  371. @Override
  372. public Boolean adjustBed(AdjustStudentBedDto dto) {
  373. //查询学生的性别
  374. XjrUser xjrUser = xjrUserMapper.selectById(dto.getStudentUserId());
  375. String studentGender = null;
  376. if(1 == xjrUser.getGender()){
  377. studentGender = "SB10001";
  378. }else if(2 == xjrUser.getGender()){
  379. studentGender = "SB10002";
  380. }
  381. RoomBed roomBedInfo = roomBedMapper.selectById(dto.getBedId());
  382. Room room = roomMapper.selectById(roomBedInfo.getRoomId());
  383. if(!room.getGender().equals(studentGender)){
  384. return true;
  385. }
  386. //先清空学生原来的床位
  387. UpdateWrapper<RoomBed> updateWrapper = new UpdateWrapper<>();
  388. updateWrapper.eq("student_user_id", dto.getStudentUserId());
  389. updateWrapper.setSql("student_user_id = null");
  390. updateWrapper.setSql("is_check_in = 0");
  391. RoomBed roomBed = roomBedMapper.selectOne(new QueryWrapper<RoomBed>().lambda().eq(RoomBed::getStudentUserId, dto.getStudentUserId()));
  392. roomBedMapper.update(roomBed, updateWrapper);
  393. //再把学生保存到新的床位
  394. roomBedMapper.updateById(new RoomBed(){{
  395. setId(dto.getBedId());
  396. setStudentUserId(dto.getStudentUserId());
  397. }});
  398. return true;
  399. }
  400. }