BaseClassCourseServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package com.xjrsoft.module.base.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.github.yulichang.base.MPJBaseServiceImpl;
  6. import com.xjrsoft.common.enums.ArchivesStatusEnum;
  7. import com.xjrsoft.common.exception.MyException;
  8. import com.xjrsoft.module.base.dto.BaseClassCoursePageDto;
  9. import com.xjrsoft.module.base.dto.ClassCourseReuseDto;
  10. import com.xjrsoft.module.base.entity.BaseClassCourse;
  11. import com.xjrsoft.module.base.entity.ClassCourseTextbook;
  12. import com.xjrsoft.module.base.entity.CourseBookInfo;
  13. import com.xjrsoft.module.base.mapper.BaseClassCourseMapper;
  14. import com.xjrsoft.module.base.service.IBaseClassCourseService;
  15. import com.xjrsoft.module.base.vo.BaseClassCoursePageVo;
  16. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  17. import com.xjrsoft.module.student.entity.SchoolRollStudent;
  18. import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
  19. import com.xjrsoft.module.textbook.entity.TextbookStudentClaim;
  20. import com.xjrsoft.module.textbook.mapper.TextbookStudentClaimMapper;
  21. import lombok.AllArgsConstructor;
  22. import org.springframework.stereotype.Service;
  23. import org.springframework.transaction.annotation.Transactional;
  24. import java.util.ArrayList;
  25. import java.util.Arrays;
  26. import java.util.HashMap;
  27. import java.util.List;
  28. import java.util.Map;
  29. import java.util.TreeMap;
  30. import java.util.stream.Collectors;
  31. /**
  32. * @title: 班级课程
  33. * @Author brealinxx
  34. * @Date: 2024-06-04
  35. * @Version 1.0
  36. */
  37. @Service
  38. @AllArgsConstructor
  39. public class BaseClassCourseServiceImpl extends MPJBaseServiceImpl<BaseClassCourseMapper, BaseClassCourse> implements IBaseClassCourseService {
  40. private final BaseClassCourseMapper baseClassCourseMapper;
  41. private final BaseStudentSchoolRollMapper baseStudentSchoolRollMapper;
  42. private final TextbookStudentClaimMapper textbookStudentClaimMapper;
  43. @Override
  44. public Page<BaseClassCoursePageVo> getPage(Page<BaseClassCoursePageVo> page, BaseClassCoursePageDto dto) {
  45. return baseClassCourseMapper.getPage(page, dto);
  46. }
  47. @Override
  48. public List<CourseBookInfo> getAllCourseBook(Long[] classIds, Long subjectGroupId, Long semester){
  49. return baseClassCourseMapper.getAllCourseBook(classIds, subjectGroupId, semester);
  50. }
  51. @Override
  52. public List<CourseBookInfo> getSelectedCourseBook(Long[] subjectGroupId, Long semester){
  53. return baseClassCourseMapper.getSelectedCourseBook(subjectGroupId, semester);
  54. }
  55. @Override
  56. @Transactional
  57. public Boolean updateAddCourseBook(ClassCourseTextbook dto){
  58. if (dto.getClassIds() == null || dto.getClassIds().length == 0 || dto.getBaseSemesterId() == null || dto.getBaseSemesterId() == 0) {
  59. return false;
  60. }
  61. boolean isSuccess = false;
  62. List<Long> classIdList = Arrays.asList(dto.getClassIds());
  63. //删除班级的这学期的所有课程教材
  64. LambdaQueryWrapper<BaseClassCourse> baseClassCourseLambdaQueryWrapper = new LambdaQueryWrapper<>();
  65. baseClassCourseLambdaQueryWrapper
  66. .in(BaseClassCourse::getClassId, classIdList)
  67. .eq(BaseClassCourse::getBaseSemesterId, dto.getBaseSemesterId())
  68. ;
  69. isSuccess = this.remove(baseClassCourseLambdaQueryWrapper);
  70. // 获取所有班级的所有学生
  71. LambdaQueryWrapper<BaseStudentSchoolRoll> baseStudentSchoolRollLambdaQueryWrapper = new LambdaQueryWrapper<>();
  72. baseStudentSchoolRollLambdaQueryWrapper
  73. .in(BaseStudentSchoolRoll::getClassId, classIdList)
  74. .eq(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901.getCode())
  75. ;
  76. List<BaseStudentSchoolRoll> baseStudentSchoolRolls = baseStudentSchoolRollMapper.selectList(baseStudentSchoolRollLambdaQueryWrapper);
  77. Map<Long, List<Long>> userIdsMap = baseStudentSchoolRolls.stream()
  78. .filter(student -> student.getClassId() != null && student.getUserId() != null)
  79. .collect(Collectors.groupingBy(
  80. BaseStudentSchoolRoll::getClassId, // 根据classId分组
  81. Collectors.mapping(BaseStudentSchoolRoll::getUserId, // 提取userId
  82. Collectors.toList()) // 收集到List<Long>
  83. )
  84. );
  85. List<BaseClassCourse> baseClassCourseList = new ArrayList<>();
  86. List<TextbookStudentClaim> textbookStudentClaimList = new ArrayList<>();
  87. for (Long classId : dto.getClassIds()) {
  88. for (String id : dto.getIds()) {
  89. String[] idArr = id.split("_");
  90. if (idArr[0].equals("") || idArr[1].equals("")) {
  91. continue;
  92. }
  93. Long courseId = Long.parseLong(idArr[0]);
  94. Long textbookId = Long.parseLong(idArr[1]);
  95. baseClassCourseList.add(new BaseClassCourse() {{
  96. setBaseSemesterId(dto.getBaseSemesterId());
  97. setClassId(classId);
  98. setCourseId(courseId);
  99. setTextbookId(textbookId);
  100. }});
  101. // 添加学生领取教材数据
  102. List<Long> userIds = userIdsMap.get(classId);
  103. for (Long userId : userIds) {
  104. textbookStudentClaimList.add(new TextbookStudentClaim() {{
  105. setStudentUserId(userId);
  106. setBaseSemesterId(dto.getBaseSemesterId());
  107. setClassId(classId);
  108. setTextbookId(textbookId);
  109. }});
  110. }
  111. }
  112. }
  113. for (TextbookStudentClaim textbookStudentClaim : textbookStudentClaimList) {
  114. textbookStudentClaimMapper.insert(textbookStudentClaim);
  115. }
  116. return this.saveBatch(baseClassCourseList);
  117. }
  118. @Override
  119. public void updateRemoveCourseBook(Long classId, Long courseId, Long textbookId){
  120. baseClassCourseMapper.updateRemoveClassCourseTextbooks(classId, courseId, textbookId);
  121. }
  122. @Override
  123. public void markExistingRecordsAsDeleted(Long newClassId, Long sourceClassId){
  124. baseClassCourseMapper.markExistingRecordsAsDeleted(newClassId, sourceClassId);
  125. }
  126. @Override
  127. @Transactional
  128. public Boolean duplicateCourseBook(ClassCourseReuseDto dto){
  129. LambdaQueryWrapper<BaseClassCourse> baseClassCourseLambdaQueryWrapper = new LambdaQueryWrapper<>();
  130. baseClassCourseLambdaQueryWrapper
  131. .eq(dto.getOldClassId() != null && dto.getOldClassId() > 0, BaseClassCourse::getClassId, dto.getOldClassId())
  132. .eq(dto.getOldBaseSemesterId() != null && dto.getOldBaseSemesterId() > 0, BaseClassCourse::getBaseSemesterId, dto.getOldBaseSemesterId())
  133. ;
  134. List<BaseClassCourse> baseClassCourseList = this.list(baseClassCourseLambdaQueryWrapper);
  135. if(baseClassCourseList == null || baseClassCourseList.isEmpty()){
  136. throw new MyException("该学期的该班级没有可以复用的课程!");
  137. }
  138. boolean isSuccess = false;
  139. //删除班级的所有课程教材
  140. LambdaQueryWrapper<BaseClassCourse> removeLambdaQueryWrapper = new LambdaQueryWrapper<>();
  141. removeLambdaQueryWrapper
  142. .in(BaseClassCourse::getClassId, dto.getNewClassIds())
  143. .eq(BaseClassCourse::getBaseSemesterId, dto.getNewBaseSemesterId())
  144. ;
  145. isSuccess = this.remove(removeLambdaQueryWrapper);
  146. List<BaseClassCourse> newBaseClassCourseList = new ArrayList<>();
  147. for (Long newClassId : dto.getNewClassIds()){
  148. for (BaseClassCourse baseClassCourse : baseClassCourseList){
  149. Long courseId = baseClassCourse.getCourseId();
  150. Long textbookId = baseClassCourse.getTextbookId();
  151. newBaseClassCourseList.add(new BaseClassCourse(){{
  152. setBaseSemesterId(dto.getNewBaseSemesterId());
  153. setClassId(newClassId);
  154. setCourseId(courseId);
  155. setTextbookId(textbookId);
  156. }});
  157. }
  158. }
  159. isSuccess = this.saveBatch(newBaseClassCourseList);
  160. return isSuccess;
  161. //baseClassCourseMapper.insertClassCourseTextbookCombinations(newClassId, sourceClassId, semester);
  162. }
  163. @Override
  164. public Map<String, Map<String, Object>> getSemesterTree() {
  165. List<Map<String, Object>> semesterData = baseClassCourseMapper.getAllSemesterNames();
  166. Map<String, Map<String, Object>> tree = new TreeMap<>();
  167. for (Map<String, Object> data : semesterData) {
  168. String name = (String) data.get("name");
  169. String[] parts = name.split("年");
  170. String year = parts[0]; // 年份
  171. String semesterType = parts[1].substring(0, parts[1].length() - 1); // 学期类型(春期/秋期)
  172. Long id = Long.parseLong(data.get("id").toString());
  173. if (!tree.containsKey(year + "年")) {
  174. tree.put(year + "年", new HashMap<>());
  175. }
  176. Map<String, Object> yearMap = tree.get(year + "年");
  177. if (semesterType.equals("春")) {
  178. yearMap.put("springName", name);
  179. yearMap.put("springId", id);
  180. } else if (semesterType.equals("秋")) {
  181. yearMap.put("autumnName", name);
  182. yearMap.put("autumnId", id);
  183. }
  184. }
  185. return tree;
  186. }
  187. @Override
  188. public Long GetClassIdByName(String name){
  189. return baseClassCourseMapper.getClassIdByName(name);
  190. }
  191. @Override
  192. public Long GetCourseIdByName(String name){
  193. return baseClassCourseMapper.getCourseIdByName(name);
  194. }
  195. @Override
  196. public Long GetTextbookIdByName(String name){
  197. return baseClassCourseMapper.getBookIdByName(name);
  198. }
  199. @Override
  200. public Long GetBaseSemesterIdByName(String name) {
  201. return baseClassCourseMapper.getBaseSemesterIdByName(name);
  202. }
  203. @Override
  204. public boolean checkExits(Long classId,Long courseId,Long textbookId){
  205. return baseClassCourseMapper.checkExits(classId, courseId, textbookId);
  206. }
  207. @Override
  208. public boolean checkExitsWithoutTextbook(Long classId, Long courseId) {
  209. return this.baseMapper.checkExitsWithoutTextbook(classId, courseId);
  210. }
  211. }