BandingTaskClassStudentServiceImpl.java 18 KB

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