BandingTaskClassServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. package com.xjrsoft.module.banding.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  6. import com.github.yulichang.base.MPJBaseServiceImpl;
  7. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  8. import com.xjrsoft.common.enums.DeleteMark;
  9. import com.xjrsoft.common.enums.EnabledMark;
  10. import com.xjrsoft.common.enums.YesOrNoEnum;
  11. import com.xjrsoft.common.exception.MyException;
  12. import com.xjrsoft.common.model.result.RT;
  13. import com.xjrsoft.common.utils.VoToColumnUtil;
  14. import com.xjrsoft.module.banding.dto.BandingTaskClassPageDto;
  15. import com.xjrsoft.module.banding.dto.BandingTaskClassStudentPageDto;
  16. import com.xjrsoft.module.banding.dto.UpdateBandingClassDto;
  17. import com.xjrsoft.module.banding.entity.BandingTask;
  18. import com.xjrsoft.module.banding.entity.BandingTaskClass;
  19. import com.xjrsoft.module.banding.entity.BandingTaskClassStudent;
  20. import com.xjrsoft.module.banding.mapper.BandingTaskClassMapper;
  21. import com.xjrsoft.module.banding.mapper.BandingTaskClassStudentMapper;
  22. import com.xjrsoft.module.banding.mapper.BandingTaskMapper;
  23. import com.xjrsoft.module.banding.service.IBandingTaskClassService;
  24. import com.xjrsoft.module.banding.vo.BandingTaskClassPageVo;
  25. import com.xjrsoft.module.banding.vo.BandingTaskClassStudentListVo;
  26. import com.xjrsoft.module.banding.vo.BandingTaskClassSureListVo;
  27. import com.xjrsoft.module.base.entity.BaseClass;
  28. import com.xjrsoft.module.base.entity.BaseClassroom;
  29. import com.xjrsoft.module.base.entity.BaseMajorSet;
  30. import com.xjrsoft.module.base.mapper.BaseClassMapper;
  31. import com.xjrsoft.module.base.service.IBaseClassroomService;
  32. import com.xjrsoft.module.base.service.IBaseMajorSetService;
  33. import com.xjrsoft.module.organization.entity.User;
  34. import com.xjrsoft.module.organization.service.IUserService;
  35. import com.xjrsoft.module.system.entity.DictionaryDetail;
  36. import com.xjrsoft.module.system.entity.DictionaryItem;
  37. import com.xjrsoft.module.system.mapper.DictionarydetailMapper;
  38. import com.xjrsoft.module.teacher.entity.BaseTeacher;
  39. import lombok.AllArgsConstructor;
  40. import org.camunda.bpm.engine.TaskService;
  41. import org.springframework.stereotype.Service;
  42. import org.springframework.transaction.annotation.Transactional;
  43. import java.util.ArrayList;
  44. import java.util.Date;
  45. import java.util.HashMap;
  46. import java.util.List;
  47. import java.util.Map;
  48. import java.util.stream.Collectors;
  49. /**
  50. * @title: 新生分班任务
  51. * @Author dzx
  52. * @Date: 2024-07-01
  53. * @Version 1.0
  54. */
  55. @Service
  56. @AllArgsConstructor
  57. public class BandingTaskClassServiceImpl extends MPJBaseServiceImpl<BandingTaskClassMapper, BandingTaskClass> implements IBandingTaskClassService {
  58. private final BandingTaskMapper bandingTaskMapper;
  59. private final BandingTaskClassStudentMapper classStudentMapper;
  60. private final IBaseClassroomService classroomService;
  61. private final IUserService userService;
  62. private final IBaseMajorSetService majorSetService;
  63. private final DictionarydetailMapper detailMapper;
  64. private final BaseClassMapper classMapper;
  65. @Override
  66. public Boolean add(BandingTaskClass bandingTaskClass) {
  67. bandingTaskClass.setCreateDate(new Date());
  68. this.baseMapper.insert(bandingTaskClass);
  69. return true;
  70. }
  71. @Override
  72. public Boolean update(BandingTaskClass bandingTaskClass) {
  73. bandingTaskClass.setModifyDate(new Date());
  74. this.baseMapper.updateById(bandingTaskClass);
  75. return true;
  76. }
  77. @Override
  78. @Transactional(rollbackFor = Exception.class)
  79. public Boolean delete(List<Long> ids) {
  80. this.baseMapper.deleteBatchIds(ids);
  81. return true;
  82. }
  83. @Override
  84. public List<BandingTaskClassPageVo> getList(BandingTaskClassPageDto dto) {
  85. BandingTask bandingTask = bandingTaskMapper.selectById(dto.getBandingTaskId());
  86. dto.setGradeId(bandingTask.getGradeId());
  87. dto.setEnrollType(bandingTask.getEnrollType());
  88. return this.baseMapper.getList(dto);
  89. }
  90. @Override
  91. public Boolean reset(Long bandingTaskId) {
  92. List<BandingTaskClass> classList = this.baseMapper.selectList(
  93. new QueryWrapper<BandingTaskClass>().lambda()
  94. .eq(BandingTaskClass::getBandingTaskId, bandingTaskId)
  95. .eq(BandingTaskClass::getStatus, 0)
  96. );
  97. for (BandingTaskClass bandingTaskClass : classList) {
  98. bandingTaskClass.setModifyDate(new Date());
  99. bandingTaskClass.setHeight(null);
  100. bandingTaskClass.setScore(null);
  101. this.baseMapper.updateById(bandingTaskClass);
  102. }
  103. List<Long> classIds = classList.stream().map(BandingTaskClass::getId).collect(Collectors.toList());
  104. if(!classIds.isEmpty()){
  105. classStudentMapper.delete(
  106. new QueryWrapper<BandingTaskClassStudent>().lambda()
  107. .in(BandingTaskClassStudent::getBandingTaskClassId, classIds)
  108. );
  109. }
  110. return true;
  111. }
  112. @Override
  113. public List<BandingTaskClassStudentListVo> classStudent(BandingTaskClassStudentPageDto dto) {
  114. BandingTask bandingTask = bandingTaskMapper.selectById(dto.getBandingTaskId());
  115. dto.setGradeId(bandingTask.getGradeId());
  116. dto.setEnrollType(bandingTask.getEnrollType());
  117. return this.baseMapper.getClassStudent(dto);
  118. }
  119. @Override
  120. public List<BandingTaskClassSureListVo> getClassSure(BandingTaskClassStudentPageDto dto) {
  121. return this.baseMapper.getClassSure(dto);
  122. }
  123. @Override
  124. public Boolean importData(Long bandingTaskId, List<Map<Integer, Object>> excelDataList) {
  125. List<BaseClassroom> classroomList = classroomService.list(
  126. new QueryWrapper<BaseClassroom>().lambda()
  127. .eq(BaseClassroom::getDeleteMark, DeleteMark.NODELETE.getCode())
  128. );
  129. Map<String, Long> classroomMap = new HashMap<>();
  130. for (BaseClassroom classroom : classroomList) {
  131. classroomMap.put(classroom.getName(), classroom.getId());
  132. }
  133. List<User> userList = userService.list(
  134. new MPJLambdaWrapper<User>()
  135. .select(User::getId)
  136. .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
  137. .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
  138. );
  139. Map<String, Long> userMap = new HashMap<>();
  140. for (User user : userList) {
  141. userMap.put(user.getName(), user.getId());
  142. }
  143. List<BaseMajorSet> majorSetList = majorSetService.list(
  144. new QueryWrapper<BaseMajorSet>().lambda()
  145. );
  146. Map<String, Long> majorSetMap = new HashMap<>();
  147. for (BaseMajorSet majorSet : majorSetList) {
  148. majorSetMap.put(majorSet.getName(), majorSet.getId());
  149. }
  150. List<DictionaryDetail> classType = detailMapper.selectJoinList(DictionaryDetail.class,
  151. new MPJLambdaWrapper<DictionaryDetail>()
  152. .select(DictionaryDetail::getId)
  153. .select(DictionaryDetail.class, x -> VoToColumnUtil.fieldsToColumns(DictionaryDetail.class).contains(x.getProperty()))
  154. .innerJoin(DictionaryItem.class, DictionaryItem::getId, DictionaryDetail::getItemId)
  155. .eq(DictionaryItem::getCode, "class_type")
  156. );
  157. Map<String, String> classTypeMap = classType.stream().collect(Collectors.toMap(DictionaryDetail::getName, DictionaryDetail::getCode));
  158. List<BandingTaskClass> classList = new ArrayList<>();
  159. Date createDate = new Date();
  160. for (Map<Integer, Object> taskClass : excelDataList) {
  161. classList.add(new BandingTaskClass(){{
  162. setBandingTaskId(bandingTaskId);
  163. setCreateDate(createDate);
  164. setName(taskClass.get(1).toString());
  165. setMajorSetId(majorSetMap.get(taskClass.get(0).toString().trim()));
  166. setNumber(Integer.parseInt(taskClass.get(2).toString()));
  167. setClassroomId(classroomMap.get(taskClass.get(4).toString()));
  168. if(taskClass.get(5) != null){
  169. setClassType(classTypeMap.get(taskClass.get(5).toString()));
  170. }
  171. if(taskClass.get(6) != null){
  172. setIsOrderClass(YesOrNoEnum.getCode(taskClass.get(6).toString()));
  173. }
  174. if(taskClass.get(7) != null){
  175. setSortCode(Integer.parseInt(taskClass.get(7).toString()));
  176. }
  177. setTeacherId(userMap.get(taskClass.get(3).toString()));
  178. }});
  179. }
  180. Boolean result = this.saveBatch(classList);
  181. return result;
  182. }
  183. @Override
  184. @Transactional(rollbackFor = Exception.class)
  185. public Boolean updateNull(List<BandingTaskClass> updNullList) {
  186. for (BandingTaskClass taskClass : updNullList) {
  187. UpdateWrapper<BandingTaskClass> updateWrapper = new UpdateWrapper<>();
  188. updateWrapper.eq("id", taskClass.getId());
  189. updateWrapper.setSql("sort_code = null");
  190. this.baseMapper.update(taskClass, updateWrapper);
  191. }
  192. return true;
  193. }
  194. @Override
  195. @Transactional(rollbackFor = Exception.class)
  196. public Boolean saveClass(List<UpdateBandingClassDto> dtoList) {
  197. List<BandingTaskClass> insList = new ArrayList<>();//新增班级
  198. List<BandingTaskClass> updList = new ArrayList<>();//修改班级
  199. List<BandingTaskClass> updNullList = new ArrayList<>();//修改班级
  200. List<String> errorList = new ArrayList<>();//修改班级
  201. BandingTask task = bandingTaskMapper.selectById(dtoList.get(0).getBandingTaskId());
  202. List<BaseClass> classList = classMapper.selectList(
  203. new QueryWrapper<BaseClass>().lambda()
  204. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  205. .eq(BaseClass::getGradeId, task.getGradeId())
  206. );
  207. Map<String, BaseClass> classMap = classList.stream().collect(Collectors.toMap(BaseClass::getName, x -> x));
  208. List<BaseClass> updateClassList = new ArrayList<>();//修改班级
  209. List<BaseClass> insertClassList = new ArrayList<>();//修改班级
  210. List<BaseMajorSet> majorSetList = majorSetService.list(
  211. new QueryWrapper<BaseMajorSet>().lambda()
  212. .eq(BaseMajorSet::getDeleteMark, DeleteMark.NODELETE.getCode())
  213. );
  214. Map<Long, Long> majorDeptMap = majorSetList.stream().collect(Collectors.toMap(BaseMajorSet::getId, BaseMajorSet::getDepartmentId));
  215. for (UpdateBandingClassDto dto : dtoList) {
  216. if(dto.getSortCode() != null){
  217. List<BandingTaskClass> list = this.list(
  218. new QueryWrapper<BandingTaskClass>().lambda()
  219. .eq(BandingTaskClass::getSortCode, dto.getSortCode())
  220. .eq(BandingTaskClass::getBandingTaskId, dto.getBandingTaskId())
  221. .ne(dto.getId() != null,BandingTaskClass::getId, dto.getId())
  222. );
  223. if(!list.isEmpty()){
  224. errorList.add(dto.getName());
  225. }
  226. }
  227. BandingTaskClass taskClass = BeanUtil.toBean(dto, BandingTaskClass.class);
  228. if(taskClass.getId() != null){
  229. taskClass.setModifyDate(new Date());
  230. if(taskClass.getSortCode() == null){
  231. updNullList.add(taskClass);
  232. }else{
  233. updList.add(taskClass);
  234. }
  235. }else{
  236. taskClass.setCreateDate(new Date());
  237. insList.add(taskClass);
  238. }
  239. if(classMap.containsKey(taskClass.getName())){
  240. BaseClass baseClass = classMap.get(taskClass.getName());
  241. baseClass.setClassType(taskClass.getClassType());
  242. baseClass.setTeacherId(taskClass.getTeacherId());
  243. baseClass.setMajorSetId(taskClass.getMajorSetId());
  244. baseClass.setClassroomId(taskClass.getClassroomId());
  245. baseClass.setIsOrderClass(taskClass.getIsOrderClass());
  246. baseClass.setOrgId(majorDeptMap.get(taskClass.getMajorSetId()));
  247. updateClassList.add(baseClass);
  248. }else{
  249. BaseClass baseClass = new BaseClass();
  250. baseClass.setClassType(taskClass.getClassType());
  251. baseClass.setTeacherId(taskClass.getTeacherId());
  252. baseClass.setMajorSetId(taskClass.getMajorSetId());
  253. baseClass.setClassroomId(taskClass.getClassroomId());
  254. baseClass.setIsOrderClass(taskClass.getIsOrderClass());
  255. baseClass.setOrgId(majorDeptMap.get(taskClass.getMajorSetId()));
  256. baseClass.setGradeId(task.getGradeId());
  257. insertClassList.add(baseClass);
  258. }
  259. }
  260. if(!errorList.isEmpty()){
  261. throw new MyException(errorList.toString().replace("[", "").replace("]", "") + ",分班排序重复");
  262. }
  263. if(!updNullList.isEmpty()){
  264. this.updateNull(updNullList);
  265. }
  266. if(!insertClassList.isEmpty()){
  267. for (BaseClass baseClass : insertClassList) {
  268. classMapper.insert(baseClass);
  269. }
  270. }
  271. if(!updateClassList.isEmpty()){
  272. for (BaseClass baseClass : updateClassList) {
  273. classMapper.updateById(baseClass);
  274. }
  275. }
  276. this.saveBatch(insList);
  277. return this.updateBatchById(updList);
  278. }
  279. /**
  280. * 班级管理中,修改信息时同步修改新生分班中的班级信息
  281. * @param baseClass
  282. * @return
  283. */
  284. @Override
  285. @Transactional(rollbackFor = Exception.class)
  286. public Boolean updateByBaseClass(BaseClass baseClass) {
  287. List<BandingTask> bandingTasks = bandingTaskMapper.selectList(
  288. new QueryWrapper<BandingTask>().lambda()
  289. .eq(BandingTask::getDeleteMark, DeleteMark.NODELETE.getCode())
  290. .eq(BandingTask::getGradeId, baseClass.getGradeId())
  291. .orderByDesc(BandingTask::getId)
  292. .eq(BandingTask::getStatus, 0)
  293. );
  294. if(bandingTasks.isEmpty()){
  295. return true;
  296. }
  297. BandingTaskClass one = this.getOne(
  298. new MPJLambdaWrapper<BandingTaskClass>()
  299. .select(BandingTask::getId)
  300. .select(BandingTask.class, x -> VoToColumnUtil.fieldsToColumns(BandingTask.class).contains(x.getProperty()))
  301. .innerJoin(BandingTask.class, BandingTask::getId, BandingTaskClass::getBandingTaskId)
  302. .eq(BandingTaskClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  303. .eq(BandingTaskClass::getName, baseClass.getName())
  304. .eq(BandingTask::getGradeId, baseClass.getGradeId())
  305. .eq(BandingTask::getStatus, 1)
  306. );
  307. if(one == null){
  308. BandingTask task = bandingTasks.get(0);
  309. one = new BandingTaskClass();
  310. one.setBandingTaskId(task.getId());
  311. one.setIsOrderClass(baseClass.getIsOrderClass());
  312. one.setClassType(baseClass.getClassType());
  313. one.setTeacherId(baseClass.getTeacherId());
  314. one.setMajorSetId(baseClass.getMajorSetId());
  315. one.setClassroomId(baseClass.getClassroomId());
  316. one.setDeleteMark(DeleteMark.NODELETE.getCode());
  317. one.setCreateDate(new Date());
  318. one.setEnabledMark(EnabledMark.ENABLED.getCode());
  319. one.setName(baseClass.getName());
  320. one.setCreateUserId(StpUtil.getLoginIdAsLong());
  321. this.save(one);
  322. }else{
  323. one.setIsOrderClass(baseClass.getIsOrderClass());
  324. one.setClassType(baseClass.getClassType());
  325. one.setTeacherId(baseClass.getTeacherId());
  326. one.setMajorSetId(baseClass.getMajorSetId());
  327. one.setClassroomId(baseClass.getClassroomId());
  328. one.setModifyDate(new Date());
  329. one.setModifyUserId(StpUtil.getLoginIdAsLong());
  330. this.updateById(one);
  331. }
  332. return true;
  333. }
  334. }