BandingTaskClassServiceImpl.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  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.springframework.stereotype.Service;
  41. import org.springframework.transaction.annotation.Transactional;
  42. import java.util.ArrayList;
  43. import java.util.Date;
  44. import java.util.HashMap;
  45. import java.util.List;
  46. import java.util.Map;
  47. import java.util.stream.Collectors;
  48. /**
  49. * @title: 新生分班任务
  50. * @Author dzx
  51. * @Date: 2024-07-01
  52. * @Version 1.0
  53. */
  54. @Service
  55. @AllArgsConstructor
  56. public class BandingTaskClassServiceImpl extends MPJBaseServiceImpl<BandingTaskClassMapper, BandingTaskClass> implements IBandingTaskClassService {
  57. private final BandingTaskMapper bandingTaskMapper;
  58. private final BandingTaskClassStudentMapper classStudentMapper;
  59. private final IBaseClassroomService classroomService;
  60. private final IUserService userService;
  61. private final IBaseMajorSetService majorSetService;
  62. private final DictionarydetailMapper detailMapper;
  63. private final BaseClassMapper classMapper;
  64. @Override
  65. public Boolean add(BandingTaskClass bandingTaskClass) {
  66. bandingTaskClass.setCreateDate(new Date());
  67. this.baseMapper.insert(bandingTaskClass);
  68. return true;
  69. }
  70. @Override
  71. public Boolean update(BandingTaskClass bandingTaskClass) {
  72. bandingTaskClass.setModifyDate(new Date());
  73. this.baseMapper.updateById(bandingTaskClass);
  74. return true;
  75. }
  76. @Override
  77. @Transactional(rollbackFor = Exception.class)
  78. public Boolean delete(List<Long> ids) {
  79. this.baseMapper.deleteBatchIds(ids);
  80. return true;
  81. }
  82. @Override
  83. public List<BandingTaskClassPageVo> getList(BandingTaskClassPageDto dto) {
  84. BandingTask bandingTask = bandingTaskMapper.selectById(dto.getBandingTaskId());
  85. dto.setGradeId(bandingTask.getGradeId());
  86. dto.setEnrollType(bandingTask.getEnrollType());
  87. return this.baseMapper.getList(dto);
  88. }
  89. @Override
  90. public Boolean reset(Long bandingTaskId) {
  91. List<BandingTaskClass> classList = this.baseMapper.selectList(
  92. new QueryWrapper<BandingTaskClass>().lambda()
  93. .eq(BandingTaskClass::getBandingTaskId, bandingTaskId)
  94. .eq(BandingTaskClass::getStatus, 0)
  95. );
  96. for (BandingTaskClass bandingTaskClass : classList) {
  97. bandingTaskClass.setModifyDate(new Date());
  98. bandingTaskClass.setHeight(null);
  99. bandingTaskClass.setScore(null);
  100. this.baseMapper.updateById(bandingTaskClass);
  101. }
  102. List<Long> classIds = classList.stream().map(BandingTaskClass::getId).collect(Collectors.toList());
  103. if(!classIds.isEmpty()){
  104. classStudentMapper.delete(
  105. new QueryWrapper<BandingTaskClassStudent>().lambda()
  106. .in(BandingTaskClassStudent::getBandingTaskClassId, classIds)
  107. );
  108. }
  109. return true;
  110. }
  111. @Override
  112. public List<BandingTaskClassStudentListVo> classStudent(BandingTaskClassStudentPageDto dto) {
  113. BandingTask bandingTask = bandingTaskMapper.selectById(dto.getBandingTaskId());
  114. dto.setGradeId(bandingTask.getGradeId());
  115. dto.setEnrollType(bandingTask.getEnrollType());
  116. return this.baseMapper.getClassStudent(dto);
  117. }
  118. @Override
  119. public List<BandingTaskClassSureListVo> getClassSure(BandingTaskClassStudentPageDto dto) {
  120. return this.baseMapper.getClassSure(dto);
  121. }
  122. @Override
  123. public Boolean importData(Long bandingTaskId, List<Map<Integer, Object>> excelDataList) {
  124. List<BaseClassroom> classroomList = classroomService.list(
  125. new QueryWrapper<BaseClassroom>().lambda()
  126. .eq(BaseClassroom::getDeleteMark, DeleteMark.NODELETE.getCode())
  127. );
  128. Map<String, Long> classroomMap = new HashMap<>();
  129. for (BaseClassroom classroom : classroomList) {
  130. classroomMap.put(classroom.getName(), classroom.getId());
  131. }
  132. List<User> userList = userService.list(
  133. new MPJLambdaWrapper<User>()
  134. .select(User::getId)
  135. .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
  136. .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
  137. );
  138. Map<String, Long> userMap = new HashMap<>();
  139. for (User user : userList) {
  140. userMap.put(user.getName(), user.getId());
  141. }
  142. List<BaseMajorSet> majorSetList = majorSetService.list(
  143. new QueryWrapper<BaseMajorSet>().lambda()
  144. );
  145. Map<String, Long> majorSetMap = new HashMap<>();
  146. for (BaseMajorSet majorSet : majorSetList) {
  147. majorSetMap.put(majorSet.getName(), majorSet.getId());
  148. }
  149. List<DictionaryDetail> classType = detailMapper.selectJoinList(DictionaryDetail.class,
  150. new MPJLambdaWrapper<DictionaryDetail>()
  151. .select(DictionaryDetail::getId)
  152. .select(DictionaryDetail.class, x -> VoToColumnUtil.fieldsToColumns(DictionaryDetail.class).contains(x.getProperty()))
  153. .innerJoin(DictionaryItem.class, DictionaryItem::getId, DictionaryDetail::getItemId)
  154. .eq(DictionaryItem::getCode, "class_type")
  155. );
  156. Map<String, String> classTypeMap = classType.stream().collect(Collectors.toMap(DictionaryDetail::getName, DictionaryDetail::getCode));
  157. List<BandingTaskClass> classList = new ArrayList<>();
  158. Date createDate = new Date();
  159. for (Map<Integer, Object> taskClass : excelDataList) {
  160. classList.add(new BandingTaskClass(){{
  161. setBandingTaskId(bandingTaskId);
  162. setCreateDate(createDate);
  163. setName(taskClass.get(1).toString());
  164. setMajorSetId(majorSetMap.get(taskClass.get(0).toString().trim()));
  165. setNumber(Integer.parseInt(taskClass.get(2).toString()));
  166. setClassroomId(classroomMap.get(taskClass.get(4).toString()));
  167. if(taskClass.get(5) != null){
  168. setClassType(classTypeMap.get(taskClass.get(5).toString()));
  169. }
  170. if(taskClass.get(6) != null){
  171. setIsOrderClass(YesOrNoEnum.getCode(taskClass.get(6).toString()));
  172. }
  173. if(taskClass.get(7) != null){
  174. setSortCode(Integer.parseInt(taskClass.get(7).toString()));
  175. }
  176. setTeacherId(userMap.get(taskClass.get(3).toString()));
  177. }});
  178. }
  179. Boolean result = this.saveBatch(classList);
  180. return result;
  181. }
  182. @Override
  183. @Transactional(rollbackFor = Exception.class)
  184. public Boolean updateNull(List<BandingTaskClass> updNullList) {
  185. for (BandingTaskClass taskClass : updNullList) {
  186. UpdateWrapper<BandingTaskClass> updateWrapper = new UpdateWrapper<>();
  187. updateWrapper.eq("id", taskClass.getId());
  188. updateWrapper.setSql("sort_code = null");
  189. this.baseMapper.update(taskClass, updateWrapper);
  190. }
  191. return true;
  192. }
  193. @Override
  194. @Transactional(rollbackFor = Exception.class)
  195. public Boolean saveClass(List<UpdateBandingClassDto> dtoList) {
  196. List<BandingTaskClass> insList = new ArrayList<>();//新增班级
  197. List<BandingTaskClass> updList = new ArrayList<>();//修改班级
  198. List<BandingTaskClass> updNullList = new ArrayList<>();//修改班级
  199. List<String> errorList = new ArrayList<>();//修改班级
  200. UpdateBandingClassDto updateBandingClassDto = dtoList.get(0);
  201. BandingTask task;
  202. if(updateBandingClassDto.getBandingTaskId() == null){
  203. BandingTaskClass taskClass = this.getById(updateBandingClassDto.getId());
  204. task = bandingTaskMapper.selectById(taskClass.getBandingTaskId());
  205. }else{
  206. task = bandingTaskMapper.selectById(updateBandingClassDto.getBandingTaskId());
  207. }
  208. List<BaseClass> classList = classMapper.selectList(
  209. new QueryWrapper<BaseClass>().lambda()
  210. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  211. .eq(BaseClass::getGradeId, task.getGradeId())
  212. .eq(BaseClass::getEnrollType, task.getEnrollType())
  213. );
  214. Map<String, BaseClass> classMap = classList.stream().collect(Collectors.toMap(BaseClass::getName, x -> x));
  215. List<BaseClass> updateClassList = new ArrayList<>();//修改班级
  216. List<BaseClass> insertClassList = new ArrayList<>();//修改班级
  217. List<BaseMajorSet> majorSetList = majorSetService.list(
  218. new QueryWrapper<BaseMajorSet>().lambda()
  219. .eq(BaseMajorSet::getDeleteMark, DeleteMark.NODELETE.getCode())
  220. );
  221. Map<Long, Long> majorDeptMap = majorSetList.stream().collect(Collectors.toMap(BaseMajorSet::getId, BaseMajorSet::getDepartmentId));
  222. for (UpdateBandingClassDto dto : dtoList) {
  223. if(dto.getSortCode() != null){
  224. List<BandingTaskClass> list = this.list(
  225. new QueryWrapper<BandingTaskClass>().lambda()
  226. .eq(BandingTaskClass::getSortCode, dto.getSortCode())
  227. .eq(BandingTaskClass::getBandingTaskId, dto.getBandingTaskId())
  228. .ne(dto.getId() != null,BandingTaskClass::getId, dto.getId())
  229. );
  230. if(!list.isEmpty()){
  231. errorList.add(dto.getName());
  232. }
  233. }
  234. BandingTaskClass taskClass = BeanUtil.toBean(dto, BandingTaskClass.class);
  235. if(taskClass.getId() != null){
  236. taskClass.setModifyDate(new Date());
  237. if(taskClass.getSortCode() == null){
  238. updNullList.add(taskClass);
  239. }else{
  240. updList.add(taskClass);
  241. }
  242. }else{
  243. taskClass.setCreateDate(new Date());
  244. insList.add(taskClass);
  245. }
  246. if(classMap.containsKey(taskClass.getName())){
  247. BaseClass baseClass = classMap.get(taskClass.getName());
  248. baseClass.setClassType(taskClass.getClassType());
  249. baseClass.setTeacherId(taskClass.getTeacherId());
  250. baseClass.setMajorSetId(taskClass.getMajorSetId());
  251. baseClass.setClassroomId(taskClass.getClassroomId());
  252. baseClass.setIsOrderClass(taskClass.getIsOrderClass());
  253. baseClass.setOrgId(majorDeptMap.get(taskClass.getMajorSetId()));
  254. baseClass.setEnrollType(task.getEnrollType());
  255. updateClassList.add(baseClass);
  256. }else{
  257. BaseClass baseClass = new BaseClass();
  258. baseClass.setClassType(taskClass.getClassType());
  259. baseClass.setTeacherId(taskClass.getTeacherId());
  260. baseClass.setMajorSetId(taskClass.getMajorSetId());
  261. baseClass.setClassroomId(taskClass.getClassroomId());
  262. baseClass.setIsOrderClass(taskClass.getIsOrderClass());
  263. baseClass.setOrgId(majorDeptMap.get(taskClass.getMajorSetId()));
  264. baseClass.setName(taskClass.getName());
  265. baseClass.setGradeId(task.getGradeId());
  266. baseClass.setEnrollType(task.getEnrollType());
  267. baseClass.setIsGraduate(1);
  268. baseClass.setCreateUserId(StpUtil.getLoginIdAsLong());
  269. baseClass.setCreateDate(new Date());
  270. insertClassList.add(baseClass);
  271. }
  272. }
  273. if(!errorList.isEmpty()){
  274. throw new MyException(errorList.toString().replace("[", "").replace("]", "") + ",分班排序重复");
  275. }
  276. if(!updNullList.isEmpty()){
  277. this.updateNull(updNullList);
  278. }
  279. if(!insertClassList.isEmpty()){
  280. for (BaseClass baseClass : insertClassList) {
  281. classMapper.insert(baseClass);
  282. }
  283. }
  284. if(!updateClassList.isEmpty()){
  285. for (BaseClass baseClass : updateClassList) {
  286. classMapper.updateById(baseClass);
  287. }
  288. }
  289. this.saveBatch(insList);
  290. return this.updateBatchById(updList);
  291. }
  292. /**
  293. * 班级管理中,修改信息时同步修改新生分班中的班级信息
  294. * @param baseClass
  295. * @return
  296. */
  297. @Override
  298. @Transactional(rollbackFor = Exception.class)
  299. public Boolean updateByBaseClass(BaseClass baseClass) {
  300. List<BandingTask> bandingTasks = bandingTaskMapper.selectList(
  301. new QueryWrapper<BandingTask>().lambda()
  302. .eq(BandingTask::getDeleteMark, DeleteMark.NODELETE.getCode())
  303. .eq(BandingTask::getGradeId, baseClass.getGradeId())
  304. .eq(BandingTask::getEnrollType, baseClass.getEnrollType())
  305. .orderByDesc(BandingTask::getId)
  306. .eq(BandingTask::getStatus, 0)
  307. );
  308. if(bandingTasks.isEmpty()){
  309. return true;
  310. }
  311. BandingTaskClass one = this.getOne(
  312. new MPJLambdaWrapper<BandingTaskClass>()
  313. .select(BandingTaskClass::getId)
  314. .select(BandingTaskClass.class, x -> VoToColumnUtil.fieldsToColumns(BandingTaskClass.class).contains(x.getProperty()))
  315. .innerJoin(BandingTask.class, BandingTask::getId, BandingTaskClass::getBandingTaskId)
  316. .eq(BandingTaskClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  317. .eq(BandingTaskClass::getName, baseClass.getName())
  318. .eq(BandingTask::getGradeId, baseClass.getGradeId())
  319. .eq(BandingTask::getEnrollType, baseClass.getEnrollType())
  320. .eq(BandingTask::getStatus, 0)
  321. );
  322. if(one == null){
  323. BandingTask task = bandingTasks.get(0);
  324. one = new BandingTaskClass();
  325. one.setBandingTaskId(task.getId());
  326. one.setIsOrderClass(baseClass.getIsOrderClass());
  327. one.setClassType(baseClass.getClassType());
  328. one.setTeacherId(baseClass.getTeacherId());
  329. one.setMajorSetId(baseClass.getMajorSetId());
  330. one.setClassroomId(baseClass.getClassroomId());
  331. one.setDeleteMark(DeleteMark.NODELETE.getCode());
  332. one.setCreateDate(new Date());
  333. one.setEnabledMark(EnabledMark.ENABLED.getCode());
  334. one.setName(baseClass.getName());
  335. one.setCreateUserId(StpUtil.getLoginIdAsLong());
  336. this.save(one);
  337. }else{
  338. one.setIsOrderClass(baseClass.getIsOrderClass());
  339. one.setClassType(baseClass.getClassType());
  340. one.setTeacherId(baseClass.getTeacherId());
  341. one.setMajorSetId(baseClass.getMajorSetId());
  342. one.setClassroomId(baseClass.getClassroomId());
  343. one.setModifyDate(new Date());
  344. one.setModifyUserId(StpUtil.getLoginIdAsLong());
  345. this.updateById(one);
  346. }
  347. return true;
  348. }
  349. /**
  350. * 新增分班任务后,自动初始化班级数据
  351. */
  352. @Override
  353. @Transactional(rollbackFor = Exception.class)
  354. public Boolean initClassByBaseClass(BandingTask bandingTask) {
  355. List<BaseClass> classList = classMapper.selectList(
  356. new QueryWrapper<BaseClass>().lambda()
  357. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  358. .eq(BaseClass::getGradeId, bandingTask.getGradeId())
  359. .eq(BaseClass::getIsGraduate, 1)
  360. .eq(BaseClass::getEnrollType, bandingTask.getEnrollType())
  361. );
  362. List<BandingTaskClass> insList = new ArrayList<>();//新增班级
  363. for (BaseClass baseClass : classList) {
  364. BandingTaskClass one = new BandingTaskClass();
  365. one.setBandingTaskId(bandingTask.getId());
  366. one.setIsOrderClass(baseClass.getIsOrderClass());
  367. one.setClassType(baseClass.getClassType());
  368. one.setTeacherId(baseClass.getTeacherId());
  369. one.setMajorSetId(baseClass.getMajorSetId());
  370. one.setClassroomId(baseClass.getClassroomId());
  371. one.setDeleteMark(DeleteMark.NODELETE.getCode());
  372. one.setCreateDate(new Date());
  373. one.setEnabledMark(EnabledMark.ENABLED.getCode());
  374. one.setName(baseClass.getName());
  375. one.setCreateUserId(StpUtil.getLoginIdAsLong());
  376. one.setStatus(0);
  377. insList.add(one);
  378. }
  379. if(!insList.isEmpty()){
  380. this.saveBatch(insList);
  381. }
  382. return true;
  383. }
  384. @Override
  385. @Transactional(rollbackFor = Exception.class)
  386. public Boolean deleteClass(List<Long> ids) {
  387. if(!ids.isEmpty()){
  388. List<BandingTaskClassStudent> list = classStudentMapper.selectList(
  389. new QueryWrapper<BandingTaskClassStudent>().lambda()
  390. .in(BandingTaskClassStudent::getBandingTaskClassId, ids)
  391. .eq(BandingTaskClassStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
  392. );
  393. if(!list.isEmpty()){
  394. throw new MyException("该班级下已分配学生,无法删除");
  395. }
  396. }
  397. List<BandingTaskClass> classList = this.listByIds(ids);
  398. for (BandingTaskClass taskClass : classList) {
  399. BandingTask bandingTask = bandingTaskMapper.selectById(taskClass.getBandingTaskId());
  400. BaseClass baseClass = classMapper.selectOne(
  401. new QueryWrapper<BaseClass>().lambda()
  402. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  403. .eq(BaseClass::getGradeId, bandingTask.getGradeId())
  404. .eq(BaseClass::getName, taskClass.getName())
  405. .eq(BaseClass::getIsGraduate, 1)
  406. .eq(BaseClass::getEnrollType, bandingTask.getEnrollType())
  407. );
  408. classMapper.deleteById(baseClass);
  409. this.removeById(taskClass);
  410. }
  411. return true;
  412. }
  413. }