BandingTaskClassStudentServiceImpl.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. package com.xjrsoft.module.banding.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  5. import com.github.yulichang.base.MPJBaseServiceImpl;
  6. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  7. import com.xjrsoft.common.constant.GlobalConstant;
  8. import com.xjrsoft.common.enums.DeleteMark;
  9. import com.xjrsoft.common.enums.EnabledMark;
  10. import com.xjrsoft.common.exception.MyException;
  11. import com.xjrsoft.common.utils.RedisUtil;
  12. import com.xjrsoft.common.utils.VoToColumnUtil;
  13. import com.xjrsoft.module.banding.dto.ChangeClassDto;
  14. import com.xjrsoft.module.banding.dto.StudentDto;
  15. import com.xjrsoft.module.banding.entity.BandingTask;
  16. import com.xjrsoft.module.banding.entity.BandingTaskClass;
  17. import com.xjrsoft.module.banding.entity.BandingTaskClassStudent;
  18. import com.xjrsoft.module.banding.mapper.BandingTaskClassMapper;
  19. import com.xjrsoft.module.banding.mapper.BandingTaskClassStudentMapper;
  20. import com.xjrsoft.module.banding.mapper.BandingTaskMapper;
  21. import com.xjrsoft.module.banding.service.IBandingTaskClassStudentService;
  22. import com.xjrsoft.module.banding.vo.SyncStudentDataListVo;
  23. import com.xjrsoft.module.base.entity.BaseClass;
  24. import com.xjrsoft.module.base.entity.BaseSemester;
  25. import com.xjrsoft.module.base.service.IBaseClassService;
  26. import com.xjrsoft.module.base.service.IBaseSemesterService;
  27. import com.xjrsoft.module.organization.entity.User;
  28. import com.xjrsoft.module.organization.entity.UserRoleRelation;
  29. import com.xjrsoft.module.organization.service.IUserRoleRelationService;
  30. import com.xjrsoft.module.organization.service.IUserService;
  31. import com.xjrsoft.module.student.dto.BaseNewStudentPageDto;
  32. import com.xjrsoft.module.student.entity.BaseNewStudent;
  33. import com.xjrsoft.module.student.entity.StudentReportPlan;
  34. import com.xjrsoft.module.student.entity.StudentReportRecord;
  35. import com.xjrsoft.module.student.mapper.StudentReportRecordMapper;
  36. import com.xjrsoft.module.student.service.IBaseNewStudentService;
  37. import com.xjrsoft.module.student.service.IStudentReportPlanService;
  38. import lombok.AllArgsConstructor;
  39. import org.springframework.stereotype.Service;
  40. import org.springframework.transaction.annotation.Transactional;
  41. import java.util.ArrayList;
  42. import java.util.Arrays;
  43. import java.util.Date;
  44. import java.util.HashSet;
  45. import java.util.List;
  46. import java.util.Map;
  47. import java.util.Set;
  48. import java.util.concurrent.CompletableFuture;
  49. import java.util.stream.Collectors;
  50. /**
  51. * @title: 新生分班任务
  52. * @Author dzx
  53. * @Date: 2024-07-01
  54. * @Version 1.0
  55. */
  56. @Service
  57. @AllArgsConstructor
  58. public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<BandingTaskClassStudentMapper, BandingTaskClassStudent> implements IBandingTaskClassStudentService {
  59. private final BandingTaskMapper taskMapper;
  60. private final BandingTaskClassMapper taskClassMapper;
  61. private final IStudentReportPlanService reportPlanService;
  62. private final IBaseSemesterService semesterService;
  63. private final IBaseNewStudentService newStudentService;
  64. private final StudentReportRecordMapper reportRecordMapper;
  65. private final IBaseClassService classService;
  66. private final IUserService userService;
  67. private final IUserRoleRelationService roleRelationService;
  68. private final RedisUtil redisUtil;
  69. @Override
  70. public Boolean add(BandingTaskClassStudent bandingTaskClass) {
  71. bandingTaskClass.setCreateDate(new Date());
  72. this.baseMapper.insert(bandingTaskClass);
  73. return true;
  74. }
  75. @Override
  76. public Boolean update(BandingTaskClassStudent bandingTaskClass) {
  77. bandingTaskClass.setModifyDate(new Date());
  78. this.baseMapper.updateById(bandingTaskClass);
  79. return true;
  80. }
  81. @Override
  82. @Transactional(rollbackFor = Exception.class)
  83. public Boolean delete(List<Long> ids) {
  84. this.baseMapper.deleteBatchIds(ids);
  85. return true;
  86. }
  87. @Transactional
  88. @Override
  89. public Boolean changeClass(ChangeClassDto dto) {
  90. this.baseMapper.delete(
  91. new QueryWrapper<BandingTaskClassStudent>().lambda()
  92. .in(BandingTaskClassStudent::getNewStudentId, dto.getNewStudentIds())
  93. );
  94. List<BaseNewStudent> list = newStudentService.list(
  95. new QueryWrapper<BaseNewStudent>().lambda()
  96. .in(BaseNewStudent::getId, dto.getNewStudentIds())
  97. );
  98. List<BaseNewStudent> notPaymnyList = list.stream().filter(x -> "未缴费".equals(x.getPaymnystate())).collect(Collectors.toList());
  99. if(!notPaymnyList.isEmpty() && dto.getIsHandle() == 1){
  100. throw new MyException("选择的学生中存在未交费情况,无法手动分班");
  101. }
  102. List<BandingTaskClassStudent> dataList = new ArrayList<>();
  103. long createUserId = StpUtil.getLoginIdAsLong();
  104. if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
  105. BaseClass aClass = classService.getById(dto.getBandingTaskClassId());
  106. BandingTaskClass taskClass = taskClassMapper.selectOne(
  107. new QueryWrapper<BandingTaskClass>().lambda()
  108. .eq(BandingTaskClass::getBaseClassId, aClass.getId())
  109. );
  110. for (Long newStudentId : dto.getNewStudentIds()) {
  111. dataList.add(
  112. new BandingTaskClassStudent(){{
  113. setCreateDate(new Date());
  114. setNewStudentId(newStudentId);
  115. setBandingTaskClassId(taskClass.getId());
  116. setCreateUserId(createUserId);
  117. setStatus(0);
  118. if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
  119. setStatus(1);
  120. }
  121. }}
  122. );
  123. }
  124. //新增报到计划,如果有多个分班任务确认,需要保证试读报到计划只有一个
  125. BaseSemester semester = semesterService.getCurrentSemester();
  126. List<StudentReportPlan> planList = reportPlanService.list(
  127. new QueryWrapper<StudentReportPlan>().lambda()
  128. .eq(StudentReportPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
  129. .eq(StudentReportPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
  130. .eq(StudentReportPlan::getSemesterId, semester.getId())
  131. .in(StudentReportPlan::getCategory, Arrays.asList(2, 3))
  132. );
  133. for (StudentReportPlan plan : planList) {
  134. for (Long newStudentId : dto.getNewStudentIds()) {
  135. reportRecordMapper.deleteRecordByUserIdAndPlanId(newStudentId, plan.getId());
  136. StudentReportRecord record = new StudentReportRecord();
  137. record.setCreateDate(new Date());
  138. record.setCreateUserId(StpUtil.getLoginIdAsLong());
  139. record.setUserId(newStudentId);
  140. record.setStudentReportPlanId(plan.getId());
  141. record.setDeleteMark(DeleteMark.NODELETE.getCode());
  142. record.setEnabledMark(EnabledMark.ENABLED.getCode());
  143. reportRecordMapper.insert(record);
  144. }
  145. }
  146. List<BaseNewStudent> updateList = new ArrayList<>();
  147. for (BaseNewStudent student : list) {
  148. student.setStatus(1);
  149. student.setOperateMode(2);
  150. student.setRemarks(dto.getRemarks());
  151. updateList.add(student);
  152. }
  153. if(!updateList.isEmpty()){
  154. newStudentService.updateBatchById(updateList);
  155. }
  156. // {
  157. // /**
  158. // * 新增学生数据
  159. // * 1、新增用户xjr_user,需要先查询用户信息是否已经存在
  160. // * 2、新增用户与角色的关系xjr_user_role_relation
  161. // * 3、新增学生基本信息base_student
  162. // * 4、新增学籍信息表base_student_school_roll
  163. // * 5、新增家庭信息表base_student_family
  164. // */
  165. // LocalDateTime now = LocalDateTime.now();
  166. // List<String> idNumbers = updateList.stream().map(BaseNewStudent::getCredentialNumber).collect(Collectors.toList());
  167. // List<User> students = userService.list(
  168. // new MPJLambdaWrapper<User>()
  169. // .disableLogicDel()
  170. // .in(User::getCredentialNumber, idNumbers)
  171. // .orderByAsc(User::getCreateDate)
  172. // );
  173. // Map<String, Long> userSet = new HashMap<>();
  174. // Map<String, Integer> userDeleteMarkMap = new HashMap<>();
  175. // for (User student : students) {
  176. // userSet.put(student.getCredentialNumber(), student.getId());
  177. // userDeleteMarkMap.put(student.getCredentialNumber(), student.getDeleteMark());
  178. // }
  179. // for (BaseNewStudent student : updateList) {
  180. // if(userSet.containsKey(student.getCredentialNumber())){
  181. // schoolRollService.updateStudentClass(dto.getBandingTaskClassId(), userSet.get(student.getCredentialNumber()));
  182. // Integer deleteMark = userDeleteMarkMap.get(student.getCredentialNumber());
  183. // if(deleteMark != null && deleteMark == 1){
  184. // userService.recoveryStudentInfo(userSet.get(student.getCredentialNumber()));
  185. // }
  186. // continue;
  187. // }
  188. // LocalDate birthDate = LocalDateUtil.getBirthDate(student.getCredentialNumber());
  189. // User xjrUser = new User() {{
  190. // setCreateDate(now);
  191. // setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
  192. // setName(student.getName());
  193. // setUserName(student.getCredentialNumber());
  194. // setCredentialNumber(student.getCredentialNumber());
  195. // setCredentialType("ZZLS10007");
  196. // setMobile(student.getMobile());
  197. // setEnabledMark(EnabledMark.DISABLED.getCode());
  198. // setGender(student.getGender());
  199. // setIsChangePassword(1);
  200. // setBirthDate(birthDate.atStartOfDay());
  201. // }};
  202. // userService.save(xjrUser);
  203. //
  204. // UserRoleRelation userRoleRelation = new UserRoleRelation() {{
  205. // setRoleId(RoleEnum.STUDENT.getCode());
  206. // setUserId(xjrUser.getId());
  207. // }};
  208. // roleRelationService.save(userRoleRelation);
  209. //
  210. // BaseStudent baseStudent = new BaseStudent() {{
  211. // setUserId(xjrUser.getId());
  212. // setCreateDate(now);
  213. // setStudentId(student.getCredentialNumber());
  214. // if(student.getHeight() != null){
  215. // setHeight(student.getHeight().doubleValue());
  216. // }
  217. // if(student.getWeight() != null){
  218. // setWeight(student.getWeight().doubleValue());
  219. // }
  220. // }};
  221. // studentService.save(baseStudent);
  222. //
  223. // BaseStudentSchoolRoll schoolRoll = new BaseStudentSchoolRoll() {{
  224. // setUserId(xjrUser.getId());
  225. // if(student.getScore() != null){
  226. // setGraduatedScore(student.getScore().doubleValue());
  227. // }
  228. //
  229. // setGraduatedUniversity(student.getGraduateSchool());
  230. // setClassId(dto.getBandingTaskClassId());
  231. // setMajorSetId(aClass.getMajorSetId());
  232. // setStduyStatus(student.getStduyStatus());
  233. // setEnrollType(aClass.getEnrollType());
  234. // setStudentSource(student.getSource());
  235. // setGradeId(aClass.getGradeId());
  236. // setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
  237. // setCreateDate(now);
  238. // }};
  239. // schoolRollService.save(schoolRoll);
  240. //
  241. // BaseStudentFamily studentFamily = new BaseStudentFamily() {{
  242. // setCreateDate(now);
  243. // setUserId(xjrUser.getId());
  244. // setTelephone(student.getFamilyMobile());
  245. // setAddress(student.getFamilyAddress());
  246. // }};
  247. // familyService.save(studentFamily);
  248. // }
  249. // }
  250. CompletableFuture.runAsync(() -> {
  251. List<User> userList = userService.list();
  252. redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
  253. List<UserRoleRelation> userRoleRelationList = roleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));
  254. redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
  255. });
  256. }else{
  257. List<BaseNewStudent> updateList = new ArrayList<>();
  258. for (BaseNewStudent student : list) {
  259. student.setRemarks(dto.getRemarks());
  260. updateList.add(student);
  261. }
  262. if(!updateList.isEmpty()){
  263. newStudentService.updateBatchById(updateList);
  264. }
  265. for (Long newStudentId : dto.getNewStudentIds()) {
  266. dataList.add(
  267. new BandingTaskClassStudent(){{
  268. setCreateDate(new Date());
  269. setNewStudentId(newStudentId);
  270. setBandingTaskClassId(dto.getBandingTaskClassId());
  271. setCreateUserId(createUserId);
  272. setStatus(0);
  273. if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
  274. setStatus(1);
  275. }
  276. }}
  277. );
  278. }
  279. }
  280. if(!dataList.isEmpty()){
  281. this.saveBatch(dataList);
  282. }
  283. return true;
  284. }
  285. @Override
  286. @Transactional
  287. public Boolean removeStudent(ChangeClassDto dto) {
  288. this.baseMapper.delete(
  289. new QueryWrapper<BandingTaskClassStudent>().lambda()
  290. .in(BandingTaskClassStudent::getNewStudentId, dto.getNewStudentIds())
  291. .eq(BandingTaskClassStudent::getBandingTaskClassId, dto.getBandingTaskClassId())
  292. );
  293. return true;
  294. }
  295. @Override
  296. @Transactional
  297. public Boolean removeStudent(List<Long> studentIds, Long bandingTaskId) {
  298. List<BandingTaskClassStudent> classStudents = this.baseMapper.selectList(
  299. new MPJLambdaWrapper<BandingTaskClassStudent>()
  300. .select(BandingTaskClassStudent::getId)
  301. .select(BandingTaskClassStudent.class, x -> VoToColumnUtil.fieldsToColumns(BandingTaskClassStudent.class).contains(x.getProperty()))
  302. .innerJoin(BandingTaskClass.class, BandingTaskClass::getId, BandingTaskClassStudent::getBandingTaskClassId)
  303. .in(BandingTaskClassStudent::getNewStudentId, studentIds)
  304. .eq(BandingTaskClass::getBandingTaskId, bandingTaskId)
  305. );
  306. this.removeBatchByIds(classStudents);
  307. return true;
  308. }
  309. @Override
  310. public List<BaseNewStudentPageDto> satisfyStudent(StudentDto dto) {
  311. BandingTaskClass taskClass = taskClassMapper.selectById(dto.getBandingTaskClassId());
  312. dto.setBandingTaskId(taskClass.getBandingTaskId());
  313. BandingTask task = taskMapper.selectById(taskClass.getBandingTaskId());
  314. if(task != null && task.getStatus() != null && task.getStatus() == 1){
  315. return this.baseMapper.satisfyStudentSure(dto);
  316. }
  317. return this.baseMapper.satisfyStudent(dto);
  318. }
  319. @Override
  320. public List<BaseNewStudentPageDto> surplusStudent(StudentDto dto) {
  321. BandingTaskClass taskClass = taskClassMapper.selectById(dto.getBandingTaskClassId());
  322. dto.setMajorSetId(taskClass.getMajorSetId());
  323. dto.setBandingTaskId(taskClass.getBandingTaskId());
  324. BandingTask task = taskMapper.selectById(taskClass.getBandingTaskId());
  325. if(task != null && task.getStatus() != null && task.getStatus() == 1){
  326. return this.baseMapper.satisfyStudentSure(dto);
  327. }
  328. return this.baseMapper.surplusStudent(dto);
  329. }
  330. @Override
  331. public Boolean insertStudent(ChangeClassDto dto) {
  332. List<BandingTaskClassStudent> dataList = new ArrayList<>();
  333. Date createDate = new Date();
  334. for (Long newStudentId : dto.getNewStudentIds()) {
  335. dataList.add(
  336. new BandingTaskClassStudent(){{
  337. setNewStudentId(newStudentId);
  338. setCreateDate(createDate);
  339. setStatus(0);
  340. setBandingTaskClassId(dto.getBandingTaskClassId());
  341. }}
  342. );
  343. }
  344. if(!dataList.isEmpty()){
  345. this.saveBatch(dataList);
  346. }
  347. return true;
  348. }
  349. /**
  350. * 同步修改学生的班级信息
  351. */
  352. @Override
  353. @Transactional
  354. public Boolean syncStudentData(StudentReportPlan studentReportPlan) {
  355. //先删除所有的
  356. reportRecordMapper.deleteRecordByPlanId(studentReportPlan.getId());
  357. //拷贝试读报到的数据过来
  358. StudentReportPlan tryReadingReportPlan = reportPlanService.getOne(
  359. new QueryWrapper<StudentReportPlan>().lambda()
  360. .eq(StudentReportPlan::getCategory, 2)
  361. .eq(StudentReportPlan::getBandingTaskId, studentReportPlan.getBandingTaskId())
  362. );
  363. List<StudentReportRecord> records = reportRecordMapper.selectList(
  364. new QueryWrapper<StudentReportRecord>().lambda()
  365. .eq(StudentReportRecord::getStudentReportPlanId, tryReadingReportPlan.getId())
  366. );
  367. Date createDate = new Date();
  368. Set<Long> existInsertUserIds = new HashSet<>();
  369. for (StudentReportRecord record : records) {
  370. if(existInsertUserIds.contains(record.getUserId())){
  371. continue;
  372. }
  373. record.setReportTime(null);
  374. record.setModifyUserId(null);
  375. record.setModifyDate(null);
  376. record.setCreateDate(createDate);
  377. record.setStudentReportPlanId(studentReportPlan.getId());
  378. record.setId(null);
  379. reportRecordMapper.insert(record);
  380. existInsertUserIds.add(record.getUserId());
  381. }
  382. List<SyncStudentDataListVo> syncStudentDataList = this.baseMapper.getSyncStudentDataList(studentReportPlan.getId());
  383. List<Long> newStudentIds = syncStudentDataList.stream().map(SyncStudentDataListVo::getNewStudentId).collect(Collectors.toList());
  384. //修改新生基本信息
  385. Map<Long, String> stduyStatusMap = syncStudentDataList.stream().collect(Collectors.toMap(SyncStudentDataListVo::getNewStudentId, SyncStudentDataListVo::getStduyStatus));
  386. List<BaseNewStudent> studentList = newStudentService.listByIds(newStudentIds);
  387. for (BaseNewStudent student : studentList) {
  388. student.setStduyStatus(stduyStatusMap.get(student.getId()));
  389. }
  390. newStudentService.updateBatchById(studentList);
  391. //修改班级信息
  392. Map<Long, Long> bandingTaskClassMap = syncStudentDataList.stream().filter(x -> x.getBandingTaskClassId() != null).collect(Collectors.toMap(SyncStudentDataListVo::getNewStudentId, SyncStudentDataListVo::getBandingTaskClassId));
  393. List<BandingTaskClass> taskClassList = taskClassMapper.selectList(
  394. new QueryWrapper<BandingTaskClass>().lambda()
  395. .eq(BandingTaskClass::getBandingTaskId, studentReportPlan.getBandingTaskId())
  396. );
  397. Map<Long, Long> taskClassMap = taskClassList.stream().collect(Collectors.toMap(BandingTaskClass::getBaseClassId, BandingTaskClass::getId));
  398. List<BandingTaskClassStudent> insertList = new ArrayList<>();
  399. for (BaseNewStudent student : studentList) {
  400. Long bandingTaskClassId = bandingTaskClassMap.get(student.getId());
  401. if(bandingTaskClassId == null){
  402. continue;
  403. }
  404. insertList.add(new BandingTaskClassStudent(){{
  405. setBandingTaskClassId(taskClassMap.get(bandingTaskClassId));
  406. setNewStudentId(student.getId());
  407. setCreateDate(new Date());
  408. setStatus(1);
  409. }});
  410. }
  411. if(!insertList.isEmpty()){
  412. this.remove(
  413. new QueryWrapper<BandingTaskClassStudent>().lambda()
  414. .in(BandingTaskClassStudent::getNewStudentId, newStudentIds)
  415. );
  416. this.saveBatch(insertList);
  417. }
  418. return true;
  419. }
  420. }