BandingTaskClassStudentServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  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.github.yulichang.base.MPJBaseServiceImpl;
  6. import com.xjrsoft.common.enums.ArchivesStatusEnum;
  7. import com.xjrsoft.common.enums.DeleteMark;
  8. import com.xjrsoft.common.enums.EnabledMark;
  9. import com.xjrsoft.common.enums.RoleEnum;
  10. import com.xjrsoft.common.exception.MyException;
  11. import com.xjrsoft.config.CommonPropertiesConfig;
  12. import com.xjrsoft.module.banding.dto.BandingTaskClassStudentPageDto;
  13. import com.xjrsoft.module.banding.dto.ChangeClassDto;
  14. import com.xjrsoft.module.banding.entity.BandingTask;
  15. import com.xjrsoft.module.banding.entity.BandingTaskClass;
  16. import com.xjrsoft.module.banding.entity.BandingTaskClassStudent;
  17. import com.xjrsoft.module.banding.mapper.BandingTaskClassMapper;
  18. import com.xjrsoft.module.banding.mapper.BandingTaskClassStudentMapper;
  19. import com.xjrsoft.module.banding.mapper.BandingTaskMapper;
  20. import com.xjrsoft.module.banding.service.IBandingTaskClassStudentService;
  21. import com.xjrsoft.module.banding.vo.BandingTaskClassSureListVo;
  22. import com.xjrsoft.module.base.entity.BaseClass;
  23. import com.xjrsoft.module.base.entity.BaseMajorSet;
  24. import com.xjrsoft.module.base.mapper.BaseMajorSetMapper;
  25. import com.xjrsoft.module.base.service.IBaseClassService;
  26. import com.xjrsoft.module.organization.entity.User;
  27. import com.xjrsoft.module.organization.entity.UserRoleRelation;
  28. import com.xjrsoft.module.organization.service.IUserRoleRelationService;
  29. import com.xjrsoft.module.organization.service.IUserService;
  30. import com.xjrsoft.module.student.dto.BaseNewStudentPageDto;
  31. import com.xjrsoft.module.student.entity.BaseClassMajorSet;
  32. import com.xjrsoft.module.student.entity.BaseNewStudent;
  33. import com.xjrsoft.module.student.entity.BaseStudent;
  34. import com.xjrsoft.module.student.entity.BaseStudentFamily;
  35. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  36. import com.xjrsoft.module.student.mapper.BaseClassMajorSetMapper;
  37. import com.xjrsoft.module.student.service.IBaseNewStudentService;
  38. import com.xjrsoft.module.student.service.IBaseStudentFamilyService;
  39. import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
  40. import com.xjrsoft.module.student.service.IBaseStudentService;
  41. import lombok.AllArgsConstructor;
  42. import org.springframework.stereotype.Service;
  43. import org.springframework.transaction.annotation.Transactional;
  44. import java.time.LocalDate;
  45. import java.time.LocalDateTime;
  46. import java.time.format.DateTimeFormatter;
  47. import java.util.ArrayList;
  48. import java.util.Date;
  49. import java.util.HashMap;
  50. import java.util.List;
  51. import java.util.Map;
  52. import java.util.stream.Collectors;
  53. /**
  54. * @title: 新生分班任务
  55. * @Author dzx
  56. * @Date: 2024-07-01
  57. * @Version 1.0
  58. */
  59. @Service
  60. @AllArgsConstructor
  61. public class BandingTaskClassStudentServiceImpl extends MPJBaseServiceImpl<BandingTaskClassStudentMapper, BandingTaskClassStudent> implements IBandingTaskClassStudentService {
  62. private final BandingTaskClassMapper taskClassMapper;
  63. private final BandingTaskMapper bandingTaskMapper;
  64. private final IBaseNewStudentService newStudentService;
  65. private final IBaseClassService classService;
  66. private final BaseClassMajorSetMapper classMajorSetMapper;
  67. private final CommonPropertiesConfig propertiesConfig;
  68. private final IUserService userService;
  69. private final IUserRoleRelationService roleRelationService;
  70. private final IBaseStudentSchoolRollService schoolRollService;
  71. private final IBaseStudentService studentService;
  72. private final IBaseStudentFamilyService familyService;
  73. private final BaseMajorSetMapper majorSetMapper;
  74. @Override
  75. public Boolean add(BandingTaskClassStudent bandingTaskClass) {
  76. bandingTaskClass.setCreateDate(new Date());
  77. this.baseMapper.insert(bandingTaskClass);
  78. return true;
  79. }
  80. @Override
  81. public Boolean update(BandingTaskClassStudent bandingTaskClass) {
  82. bandingTaskClass.setModifyDate(new Date());
  83. this.baseMapper.updateById(bandingTaskClass);
  84. return true;
  85. }
  86. @Override
  87. @Transactional(rollbackFor = Exception.class)
  88. public Boolean delete(List<Long> ids) {
  89. this.baseMapper.deleteBatchIds(ids);
  90. return true;
  91. }
  92. @Override
  93. public Boolean changeClass(ChangeClassDto dto) {
  94. this.baseMapper.delete(
  95. new QueryWrapper<BandingTaskClassStudent>().lambda()
  96. .in(BandingTaskClassStudent::getNewStudentId, dto.getNewStudentIds())
  97. );
  98. List<BandingTaskClassStudent> dataList = new ArrayList<>();
  99. long createUserId = StpUtil.getLoginIdAsLong();
  100. for (Long newStudentId : dto.getNewStudentIds()) {
  101. dataList.add(
  102. new BandingTaskClassStudent(){{
  103. setCreateDate(new Date());
  104. setNewStudentId(newStudentId);
  105. setBandingTaskClassId(dto.getBandingTaskClassId());
  106. setCreateUserId(createUserId);
  107. setStatus(0);
  108. if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
  109. setStatus(1);
  110. }
  111. }}
  112. );
  113. }
  114. if(!dataList.isEmpty()){
  115. this.saveBatch(dataList);
  116. }
  117. if(dto.getIsHandle() != null && dto.getIsHandle() == 1){
  118. BandingTaskClass taskClass = taskClassMapper.selectById(dto.getBandingTaskClassId());
  119. List<Long> studentIds = dataList.stream().map(BandingTaskClassStudent::getNewStudentId).collect(Collectors.toList());
  120. List<BaseNewStudent> list = newStudentService.list(
  121. new QueryWrapper<BaseNewStudent>().lambda()
  122. .in(BaseNewStudent::getId, studentIds)
  123. );
  124. List<BaseNewStudent> updateList = new ArrayList<>();
  125. for (BaseNewStudent student : list) {
  126. student.setStatus(1);
  127. updateList.add(student);
  128. }
  129. if(!updateList.isEmpty()){
  130. newStudentService.updateBatchById(updateList);
  131. }
  132. createStudentData(taskClass.getBandingTaskId(), dataList, updateList);
  133. }
  134. return true;
  135. }
  136. void createStudentData(Long badingTaskId,List<BandingTaskClassStudent> classStudents, List<BaseNewStudent> updateList){
  137. Date createDate = new Date();
  138. BandingTask bandingTask = bandingTaskMapper.selectById(badingTaskId);
  139. List<BandingTaskClassSureListVo> classSure = taskClassMapper.getClassSure(new BandingTaskClassStudentPageDto() {{
  140. setBandingTaskId(badingTaskId);
  141. }});
  142. Map<Long, Integer> classTotal = classSure.stream().collect(Collectors.toMap(BandingTaskClassSureListVo::getId, BandingTaskClassSureListVo::getNumber));
  143. Map<Long, Integer> classBoy = classSure.stream().collect(Collectors.toMap(BandingTaskClassSureListVo::getId, BandingTaskClassSureListVo::getMaleCount));
  144. Map<Long, Integer> classGirl = classSure.stream().collect(Collectors.toMap(BandingTaskClassSureListVo::getId, BandingTaskClassSureListVo::getFemaleCount));
  145. //生成班级数据
  146. Map<Long, Long> classMap = new HashMap<>();
  147. Map<Long, Long> taskClassMajorMap = new HashMap<>();
  148. //查询出需要新增的班级信息
  149. List<Long> classIds = classStudents.stream().map(BandingTaskClassStudent::getBandingTaskClassId).collect(Collectors.toList());
  150. List<BandingTaskClass> classList = taskClassMapper.selectList(new QueryWrapper<BandingTaskClass>().lambda().in(BandingTaskClass::getId, classIds));
  151. Map<Long, Long> majorDeptMap = majorSetMapper.selectList(new QueryWrapper<BaseMajorSet>()).stream().collect(Collectors.toMap(BaseMajorSet::getId, BaseMajorSet::getDepartmentId));
  152. for (BandingTaskClass taskClass : classList) {
  153. BaseClass baseClass = new BaseClass() {{
  154. setName(taskClass.getName());
  155. setClassroomId(taskClass.getClassroomId());
  156. setTeacherId(taskClass.getTeacherId());
  157. setIsGraduate(1);
  158. setOrgId(majorDeptMap.get(taskClass.getMajorSetId()));
  159. setIsOrderClass(taskClass.getIsOrderClass()==null?0:taskClass.getIsOrderClass().intValue());
  160. setGradeId(bandingTask.getGradeId());
  161. setDeleteMark(DeleteMark.NODELETE.getCode());
  162. setEnrollType(bandingTask.getEnrollType());
  163. }};
  164. classService.save(baseClass);
  165. BaseClassMajorSet majorSet = new BaseClassMajorSet() {{
  166. setCreateDate(createDate);
  167. setMajorSetId(taskClass.getMajorSetId());
  168. setClassId(baseClass.getId());
  169. setPlanTotalStudent(taskClass.getNumber());
  170. setTotalStudent(classTotal.get(taskClass.getId()));
  171. setBoyNum(classBoy.get(taskClass.getId()));
  172. setGirlNum(classGirl.get(taskClass.getId()));
  173. }};
  174. classMajorSetMapper.insert(majorSet);
  175. classMap.put(taskClass.getId(), baseClass.getId());
  176. taskClassMajorMap.put(taskClass.getId(), taskClass.getMajorSetId());
  177. }
  178. /**
  179. * 新增学生数据
  180. * 1、新增用户xjr_user
  181. * 2、新增用户与角色的关系xjr_user_role_relation
  182. * 3、新增学生基本信息base_student
  183. * 4、新增学籍信息表base_student_school_roll
  184. * 5、新增家庭信息表base_student_family
  185. */
  186. LocalDateTime now = LocalDateTime.now();
  187. Map<Long, Long> studentClassRelation = classStudents.stream().collect(Collectors.toMap(BandingTaskClassStudent::getNewStudentId, BandingTaskClassStudent::getBandingTaskClassId));
  188. for (BaseNewStudent student : updateList) {
  189. LocalDate birthDate = getBirthDate(student.getCredentialNumber());
  190. User xjrUser = new User() {{
  191. setCreateDate(now);
  192. setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
  193. setName(student.getName());
  194. setUserName(student.getCredentialNumber());
  195. setCredentialNumber(student.getCredentialNumber());
  196. setCredentialType("ZZLS10007");
  197. setMobile(student.getMobile());
  198. setEnabledMark(EnabledMark.DISABLED.getCode());
  199. setGender(student.getGender());
  200. setIsChangePassword(1);
  201. setBirthDate(birthDate.atStartOfDay());
  202. }};
  203. userService.save(xjrUser);
  204. UserRoleRelation userRoleRelation = new UserRoleRelation() {{
  205. setRoleId(RoleEnum.STUDENT.getCode());
  206. setUserId(xjrUser.getId());
  207. }};
  208. roleRelationService.save(userRoleRelation);
  209. BaseStudent baseStudent = new BaseStudent() {{
  210. setUserId(xjrUser.getId());
  211. setCreateDate(now);
  212. setStudentId(student.getCredentialNumber());
  213. if(student.getHeight() != null){
  214. setHeight(student.getHeight().doubleValue());
  215. }
  216. if(student.getWeight() != null){
  217. setWeight(student.getWeight().doubleValue());
  218. }
  219. }};
  220. studentService.save(baseStudent);
  221. BaseStudentSchoolRoll schoolRoll = new BaseStudentSchoolRoll() {{
  222. setUserId(xjrUser.getId());
  223. if(student.getScore() != null){
  224. setGraduatedScore(student.getScore().doubleValue());
  225. }
  226. setGraduatedUniversity(student.getGraduateSchool());
  227. setClassId(classMap.get(studentClassRelation.get(student.getId())));
  228. setMajorSetId(taskClassMajorMap.get(studentClassRelation.get(student.getId())));
  229. setStduyStatus(student.getStduyStatus());
  230. setEnrollType(bandingTask.getEnrollType());
  231. setStudentSource(student.getSource());
  232. setGradeId(bandingTask.getGradeId());
  233. setArchivesStatus(ArchivesStatusEnum.FB2901.getCode());
  234. setCreateDate(now);
  235. }};
  236. schoolRollService.save(schoolRoll);
  237. BaseStudentFamily studentFamily = new BaseStudentFamily() {{
  238. setCreateDate(now);
  239. setUserId(xjrUser.getId());
  240. setTelephone(student.getFamilyMobile());
  241. setAddress(student.getFamilyAddress());
  242. }};
  243. familyService.save(studentFamily);
  244. }
  245. }
  246. LocalDate getBirthDate(String idCardNumber){
  247. // 获取出生日期前6位,即yyyyMM
  248. String birthdayString = idCardNumber.substring(6, 14);
  249. // 将字符串解析为LocalDate对象
  250. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
  251. try {
  252. LocalDate parse = LocalDate.parse(birthdayString, formatter);
  253. return parse;
  254. }catch (Exception e){
  255. throw new MyException("身份证号填写错误,无法提取出生日期");
  256. }
  257. }
  258. @Override
  259. public Boolean removeStudent(ChangeClassDto dto) {
  260. this.baseMapper.delete(
  261. new QueryWrapper<BandingTaskClassStudent>().lambda()
  262. .in(BandingTaskClassStudent::getNewStudentId, dto.getNewStudentIds())
  263. .eq(BandingTaskClassStudent::getBandingTaskClassId, dto.getBandingTaskClassId())
  264. );
  265. return true;
  266. }
  267. @Override
  268. public List<BaseNewStudentPageDto> satisfyStudent(Long bandingTaskClassId) {
  269. return this.baseMapper.satisfyStudent(bandingTaskClassId);
  270. }
  271. @Override
  272. public List<BaseNewStudentPageDto> surplusStudent(Long bandingTaskClassId) {
  273. BandingTaskClass taskClass = taskClassMapper.selectById(bandingTaskClassId);
  274. return this.baseMapper.surplusStudent(taskClass);
  275. }
  276. @Override
  277. public Boolean insertStudent(ChangeClassDto dto) {
  278. List<BandingTaskClassStudent> dataList = new ArrayList<>();
  279. Date createDate = new Date();
  280. for (Long newStudentId : dto.getNewStudentIds()) {
  281. dataList.add(
  282. new BandingTaskClassStudent(){{
  283. setNewStudentId(newStudentId);
  284. setCreateDate(createDate);
  285. setStatus(0);
  286. setBandingTaskClassId(dto.getBandingTaskClassId());
  287. }}
  288. );
  289. }
  290. if(!dataList.isEmpty()){
  291. this.saveBatch(dataList);
  292. }
  293. return true;
  294. }
  295. }