BandingTaskClassServiceImpl.java 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. package com.xjrsoft.module.banding.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.util.NumberUtil;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  7. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  8. import com.github.yulichang.base.MPJBaseServiceImpl;
  9. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  10. import com.xjrsoft.common.constant.GlobalConstant;
  11. import com.xjrsoft.common.enums.DeleteMark;
  12. import com.xjrsoft.common.enums.EnabledMark;
  13. import com.xjrsoft.common.enums.GenderDictionaryEnum;
  14. import com.xjrsoft.common.enums.RoleEnum;
  15. import com.xjrsoft.common.enums.YesOrNoEnum;
  16. import com.xjrsoft.common.exception.MyException;
  17. import com.xjrsoft.common.utils.RedisUtil;
  18. import com.xjrsoft.common.utils.VoToColumnUtil;
  19. import com.xjrsoft.module.banding.dto.BandingTaskClassPageDto;
  20. import com.xjrsoft.module.banding.dto.BandingTaskClassStudentPageDto;
  21. import com.xjrsoft.module.banding.dto.UpdateBandingClassDto;
  22. import com.xjrsoft.module.banding.entity.BandingTask;
  23. import com.xjrsoft.module.banding.entity.BandingTaskClass;
  24. import com.xjrsoft.module.banding.entity.BandingTaskClassStudent;
  25. import com.xjrsoft.module.banding.mapper.BandingTaskClassMapper;
  26. import com.xjrsoft.module.banding.mapper.BandingTaskClassStudentMapper;
  27. import com.xjrsoft.module.banding.mapper.BandingTaskMapper;
  28. import com.xjrsoft.module.banding.service.IBandingTaskClassService;
  29. import com.xjrsoft.module.banding.vo.BandingTaskClassPageVo;
  30. import com.xjrsoft.module.banding.vo.BandingTaskClassReportStatisticsVo;
  31. import com.xjrsoft.module.banding.vo.BandingTaskClassStudentListVo;
  32. import com.xjrsoft.module.banding.vo.BandingTaskClassSureListVo;
  33. import com.xjrsoft.module.base.entity.BaseClass;
  34. import com.xjrsoft.module.base.entity.BaseClassTeacherChange;
  35. import com.xjrsoft.module.base.entity.BaseClassroom;
  36. import com.xjrsoft.module.base.entity.BaseGrade;
  37. import com.xjrsoft.module.base.entity.BaseMajorSet;
  38. import com.xjrsoft.module.base.mapper.BaseClassMapper;
  39. import com.xjrsoft.module.base.mapper.BaseClassTeacherChangeMapper;
  40. import com.xjrsoft.module.base.mapper.BaseGradeMapper;
  41. import com.xjrsoft.module.base.service.IBaseClassroomService;
  42. import com.xjrsoft.module.base.service.IBaseMajorSetService;
  43. import com.xjrsoft.module.organization.entity.User;
  44. import com.xjrsoft.module.organization.entity.UserRoleRelation;
  45. import com.xjrsoft.module.organization.service.IUserRoleRelationService;
  46. import com.xjrsoft.module.organization.service.IUserService;
  47. import com.xjrsoft.module.student.dto.StudentTryReadingReportPageDto;
  48. import com.xjrsoft.module.student.entity.EnrollmentPlan;
  49. import com.xjrsoft.module.student.entity.StudentReportPlan;
  50. import com.xjrsoft.module.student.mapper.EnrollmentPlanMapper;
  51. import com.xjrsoft.module.student.mapper.StudentReportRecordMapper;
  52. import com.xjrsoft.module.student.service.IStudentReportPlanService;
  53. import com.xjrsoft.module.student.vo.StudentReportRecordPlanPageVo;
  54. import com.xjrsoft.module.system.entity.DictionaryDetail;
  55. import com.xjrsoft.module.system.entity.DictionaryItem;
  56. import com.xjrsoft.module.system.mapper.DictionarydetailMapper;
  57. import com.xjrsoft.module.teacher.entity.BaseTeacher;
  58. import lombok.AllArgsConstructor;
  59. import org.springframework.stereotype.Service;
  60. import org.springframework.transaction.annotation.Transactional;
  61. import java.math.BigDecimal;
  62. import java.math.RoundingMode;
  63. import java.time.LocalDateTime;
  64. import java.util.ArrayList;
  65. import java.util.Collections;
  66. import java.util.Comparator;
  67. import java.util.Date;
  68. import java.util.HashMap;
  69. import java.util.List;
  70. import java.util.Map;
  71. import java.util.concurrent.CompletableFuture;
  72. import java.util.stream.Collectors;
  73. /**
  74. * @title: 新生分班任务
  75. * @Author dzx
  76. * @Date: 2024-07-01
  77. * @Version 1.0
  78. */
  79. @Service
  80. @AllArgsConstructor
  81. public class BandingTaskClassServiceImpl extends MPJBaseServiceImpl<BandingTaskClassMapper, BandingTaskClass> implements IBandingTaskClassService {
  82. private final BandingTaskMapper bandingTaskMapper;
  83. private final BandingTaskClassStudentMapper classStudentMapper;
  84. private final IBaseClassroomService classroomService;
  85. private final IUserService userService;
  86. private final IBaseMajorSetService majorSetService;
  87. private final DictionarydetailMapper detailMapper;
  88. private final BaseClassMapper classMapper;
  89. private final StudentReportRecordMapper reportRecordMapper;
  90. private final EnrollmentPlanMapper enrollmentPlanMapper;
  91. private final IStudentReportPlanService reportPlanService;
  92. private final BaseGradeMapper gradeMapper;
  93. private final IUserRoleRelationService roleRelationService;
  94. private final RedisUtil redisUtil;
  95. private final BaseClassTeacherChangeMapper teacherChangeMapper;
  96. @Override
  97. public Boolean add(BandingTaskClass bandingTaskClass) {
  98. bandingTaskClass.setCreateDate(new Date());
  99. this.baseMapper.insert(bandingTaskClass);
  100. return true;
  101. }
  102. @Override
  103. public Boolean update(BandingTaskClass bandingTaskClass) {
  104. bandingTaskClass.setModifyDate(new Date());
  105. this.baseMapper.updateById(bandingTaskClass);
  106. return true;
  107. }
  108. @Override
  109. @Transactional(rollbackFor = Exception.class)
  110. public Boolean delete(List<Long> ids) {
  111. this.baseMapper.deleteBatchIds(ids);
  112. return true;
  113. }
  114. @Override
  115. public List<BandingTaskClassPageVo> getList(BandingTaskClassPageDto dto) {
  116. BandingTask bandingTask = bandingTaskMapper.selectById(dto.getBandingTaskId());
  117. dto.setGradeId(bandingTask.getGradeId());
  118. dto.setEnrollType(bandingTask.getEnrollType());
  119. return this.baseMapper.getList(dto);
  120. }
  121. @Override
  122. public Boolean reset(Long bandingTaskId) {
  123. List<BandingTaskClass> classList = this.baseMapper.selectList(
  124. new QueryWrapper<BandingTaskClass>().lambda()
  125. .eq(BandingTaskClass::getBandingTaskId, bandingTaskId)
  126. .eq(BandingTaskClass::getStatus, 0)
  127. );
  128. for (BandingTaskClass bandingTaskClass : classList) {
  129. bandingTaskClass.setModifyDate(new Date());
  130. bandingTaskClass.setHeight(null);
  131. bandingTaskClass.setScore(null);
  132. this.baseMapper.updateById(bandingTaskClass);
  133. }
  134. List<Long> classIds = classList.stream().map(BandingTaskClass::getId).collect(Collectors.toList());
  135. if(!classIds.isEmpty()){
  136. classStudentMapper.delete(
  137. new QueryWrapper<BandingTaskClassStudent>().lambda()
  138. .in(BandingTaskClassStudent::getBandingTaskClassId, classIds)
  139. );
  140. }
  141. return true;
  142. }
  143. @Override
  144. public List<BandingTaskClassStudentListVo> classStudent(BandingTaskClassStudentPageDto dto) {
  145. BandingTask bandingTask = bandingTaskMapper.selectById(dto.getBandingTaskId());
  146. dto.setGradeId(bandingTask.getGradeId());
  147. dto.setEnrollType(bandingTask.getEnrollType());
  148. if(bandingTask != null && bandingTask.getStatus() != null && bandingTask.getStatus() == 1){
  149. return this.baseMapper.getClassStudentSure(dto);
  150. }
  151. return this.baseMapper.getClassStudent(dto);
  152. }
  153. @Override
  154. public List<BandingTaskClassSureListVo> getClassSure(BandingTaskClassStudentPageDto dto) {
  155. BandingTask task = bandingTaskMapper.selectById(dto.getBandingTaskId());
  156. if(task != null && task.getStatus() != null && task.getStatus() == 1){
  157. return this.baseMapper.getClassSure(dto);
  158. }
  159. return this.baseMapper.getClassNotSure(dto);
  160. }
  161. @Override
  162. public Boolean importData(Long bandingTaskId, List<Map<Integer, Object>> excelDataList) {
  163. List<BaseClassroom> classroomList = classroomService.list(
  164. new QueryWrapper<BaseClassroom>().lambda()
  165. .eq(BaseClassroom::getDeleteMark, DeleteMark.NODELETE.getCode())
  166. );
  167. Map<String, Long> classroomMap = new HashMap<>();
  168. for (BaseClassroom classroom : classroomList) {
  169. classroomMap.put(classroom.getName(), classroom.getId());
  170. }
  171. List<User> userList = userService.list(
  172. new MPJLambdaWrapper<User>()
  173. .select(User::getId)
  174. .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
  175. .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
  176. );
  177. Map<String, Long> userMap = new HashMap<>();
  178. for (User user : userList) {
  179. userMap.put(user.getName(), user.getId());
  180. }
  181. List<BaseMajorSet> majorSetList = majorSetService.list(
  182. new QueryWrapper<BaseMajorSet>().lambda()
  183. );
  184. Map<String, Long> majorSetMap = new HashMap<>();
  185. for (BaseMajorSet majorSet : majorSetList) {
  186. majorSetMap.put(majorSet.getName(), majorSet.getId());
  187. }
  188. List<DictionaryDetail> classType = detailMapper.selectJoinList(DictionaryDetail.class,
  189. new MPJLambdaWrapper<DictionaryDetail>()
  190. .select(DictionaryDetail::getId)
  191. .select(DictionaryDetail.class, x -> VoToColumnUtil.fieldsToColumns(DictionaryDetail.class).contains(x.getProperty()))
  192. .innerJoin(DictionaryItem.class, DictionaryItem::getId, DictionaryDetail::getItemId)
  193. .eq(DictionaryItem::getCode, "class_type")
  194. );
  195. Map<String, String> classTypeMap = classType.stream().collect(Collectors.toMap(DictionaryDetail::getName, DictionaryDetail::getCode));
  196. List<BandingTaskClass> classList = new ArrayList<>();
  197. Date createDate = new Date();
  198. for (Map<Integer, Object> taskClass : excelDataList) {
  199. classList.add(new BandingTaskClass(){{
  200. setBandingTaskId(bandingTaskId);
  201. setCreateDate(createDate);
  202. setName(taskClass.get(1).toString());
  203. setMajorSetId(majorSetMap.get(taskClass.get(0).toString().trim()));
  204. setNumber(Integer.parseInt(taskClass.get(2).toString()));
  205. setClassroomId(classroomMap.get(taskClass.get(4).toString()));
  206. if(taskClass.get(5) != null){
  207. setClassType(classTypeMap.get(taskClass.get(5).toString()));
  208. }
  209. if(taskClass.get(6) != null){
  210. setIsOrderClass(YesOrNoEnum.getCode(taskClass.get(6).toString()));
  211. }
  212. if(taskClass.get(7) != null){
  213. setSortCode(Integer.parseInt(taskClass.get(7).toString()));
  214. }
  215. setTeacherId(userMap.get(taskClass.get(3).toString()));
  216. }});
  217. }
  218. Boolean result = this.saveBatch(classList);
  219. return result;
  220. }
  221. @Override
  222. @Transactional(rollbackFor = Exception.class)
  223. public Boolean updateNull(List<BandingTaskClass> updNullList) {
  224. for (BandingTaskClass taskClass : updNullList) {
  225. UpdateWrapper<BandingTaskClass> updateWrapper = new UpdateWrapper<>();
  226. updateWrapper.eq("id", taskClass.getId());
  227. updateWrapper.setSql("sort_code = null");
  228. this.baseMapper.update(taskClass, updateWrapper);
  229. }
  230. return true;
  231. }
  232. @Override
  233. @Transactional(rollbackFor = Exception.class)
  234. public Boolean saveClass(List<UpdateBandingClassDto> dtoList) {
  235. List<BandingTaskClass> insList = new ArrayList<>();//新增班级
  236. List<BandingTaskClass> updList = new ArrayList<>();//修改班级
  237. List<BandingTaskClass> updNullList = new ArrayList<>();//修改班级
  238. List<String> errorList = new ArrayList<>();//修改班级
  239. UpdateBandingClassDto updateBandingClassDto = dtoList.get(0);
  240. BandingTask task;
  241. if(updateBandingClassDto.getBandingTaskId() == null){
  242. BandingTaskClass taskClass = this.getById(updateBandingClassDto.getId());
  243. task = bandingTaskMapper.selectById(taskClass.getBandingTaskId());
  244. }else{
  245. task = bandingTaskMapper.selectById(updateBandingClassDto.getBandingTaskId());
  246. }
  247. List<BaseClass> classList = classMapper.selectList(
  248. new QueryWrapper<BaseClass>().lambda()
  249. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  250. .eq(BaseClass::getGradeId, task.getGradeId())
  251. .eq(BaseClass::getEnrollType, task.getEnrollType())
  252. );
  253. List<BaseClass> classCodes = classList.stream().filter(x -> x.getCode() != null).collect(Collectors.toList());
  254. Collections.sort(classCodes, Comparator.comparing(BaseClass::getCode));
  255. String classCode = null;
  256. if(!classCodes.isEmpty()){
  257. classCode = classCodes.get(0).getCode();
  258. }
  259. Map<Long, BaseClass> classMap = classList.stream().collect(Collectors.toMap(BaseClass::getId, x -> x));
  260. List<BaseMajorSet> majorSetList = majorSetService.list(
  261. new QueryWrapper<BaseMajorSet>().lambda()
  262. .eq(BaseMajorSet::getDeleteMark, DeleteMark.NODELETE.getCode())
  263. );
  264. Map<Long, Long> majorDeptMap = majorSetList.stream().collect(Collectors.toMap(BaseMajorSet::getId, BaseMajorSet::getDepartmentId));
  265. BaseGrade baseGrade = gradeMapper.selectById(task.getGradeId());
  266. int i = 0;
  267. if(NumberUtil.isNumber(classCode)){
  268. i = Integer.parseInt(classCode.trim().substring(classCode.length() - 3));
  269. }
  270. for (UpdateBandingClassDto dto : dtoList) {
  271. if(dto.getSortCode() != null){
  272. List<BandingTaskClass> list = this.list(
  273. new QueryWrapper<BandingTaskClass>().lambda()
  274. .eq(BandingTaskClass::getSortCode, dto.getSortCode())
  275. .eq(BandingTaskClass::getBandingTaskId, dto.getBandingTaskId())
  276. .ne(dto.getId() != null,BandingTaskClass::getId, dto.getId())
  277. );
  278. if(!list.isEmpty()){
  279. errorList.add(dto.getName());
  280. }
  281. }
  282. if(dto.getId() != null){
  283. //修改
  284. BandingTaskClass sourceObj = this.getById(dto.getId());
  285. BeanUtil.copyProperties(dto, sourceObj);
  286. sourceObj.setModifyDate(new Date());
  287. if(sourceObj.getBaseClassId() != null){
  288. BaseClass baseClass = classMap.get(sourceObj.getBaseClassId());
  289. baseClass.setName(sourceObj.getName());
  290. baseClass.setClassType(sourceObj.getClassType());
  291. baseClass.setTeacherId(sourceObj.getTeacherId());
  292. baseClass.setMajorSetId(sourceObj.getMajorSetId());
  293. baseClass.setClassroomId(sourceObj.getClassroomId());
  294. baseClass.setIsOrderClass(sourceObj.getIsOrderClass());
  295. baseClass.setOrgId(majorDeptMap.get(sourceObj.getMajorSetId()));
  296. baseClass.setEnrollType(task.getEnrollType());
  297. if(baseClass.getCode() == null){
  298. i ++;
  299. baseClass.setCode(baseGrade.getTitle().replace("年", "") + String.format("%03d", i));
  300. }
  301. classMapper.updateById(baseClass);
  302. teacherChangeMapper.insert(new BaseClassTeacherChange(){{
  303. setClassId(baseClass.getId());
  304. setBeforeTeacherId(baseClass.getTeacherId());
  305. setAfterTeacherId(sourceObj.getTeacherId());
  306. setDeleteMark(DeleteMark.NODELETE.getCode());
  307. setEnabledMark(EnabledMark.ENABLED.getCode());
  308. setCreateDate(LocalDateTime.now());
  309. }});
  310. //给该老师添加班主任角色
  311. if (baseClass.getTeacherId() != null) {
  312. long count = roleRelationService.count(
  313. new QueryWrapper<UserRoleRelation>().lambda()
  314. .eq(UserRoleRelation::getUserId, baseClass.getTeacherId())
  315. .eq(UserRoleRelation::getRoleId, RoleEnum.CLASSTE.getCode())
  316. );
  317. if (count == 0) {
  318. roleRelationService.save(
  319. new UserRoleRelation() {{
  320. setRoleId(RoleEnum.CLASSTE.getCode());
  321. setUserId(baseClass.getTeacherId());
  322. }}
  323. );
  324. }
  325. }
  326. }else{
  327. i ++;
  328. BaseClass baseClass = new BaseClass();
  329. baseClass.setClassType(sourceObj.getClassType());
  330. baseClass.setTeacherId(sourceObj.getTeacherId());
  331. baseClass.setMajorSetId(sourceObj.getMajorSetId());
  332. baseClass.setClassroomId(sourceObj.getClassroomId());
  333. baseClass.setIsOrderClass(sourceObj.getIsOrderClass());
  334. baseClass.setOrgId(majorDeptMap.get(sourceObj.getMajorSetId()));
  335. baseClass.setName(sourceObj.getName());
  336. baseClass.setGradeId(task.getGradeId());
  337. baseClass.setEnrollType(task.getEnrollType());
  338. baseClass.setIsGraduate(1);
  339. baseClass.setCreateUserId(StpUtil.getLoginIdAsLong());
  340. baseClass.setCreateDate(new Date());
  341. baseClass.setCode(baseGrade.getTitle().replace("年", "") + String.format("%03d", i));
  342. classMapper.insert(baseClass);
  343. sourceObj.setBaseClassId(baseClass.getId());
  344. teacherChangeMapper.insert(new BaseClassTeacherChange(){{
  345. setClassId(baseClass.getId());
  346. setAfterTeacherId(sourceObj.getTeacherId());
  347. setDeleteMark(DeleteMark.NODELETE.getCode());
  348. setEnabledMark(EnabledMark.ENABLED.getCode());
  349. setCreateDate(LocalDateTime.now());
  350. }});
  351. if (baseClass.getTeacherId() != null) {
  352. long count = roleRelationService.count(
  353. new QueryWrapper<UserRoleRelation>().lambda()
  354. .eq(UserRoleRelation::getUserId, baseClass.getTeacherId())
  355. .eq(UserRoleRelation::getRoleId, RoleEnum.CLASSTE.getCode())
  356. );
  357. if (count == 0) {
  358. roleRelationService.save(
  359. new UserRoleRelation() {{
  360. setRoleId(RoleEnum.CLASSTE.getCode());
  361. setUserId(baseClass.getTeacherId());
  362. }}
  363. );
  364. }
  365. }
  366. }
  367. if(sourceObj.getSortCode() == null){
  368. updNullList.add(sourceObj);
  369. }else{
  370. updList.add(sourceObj);
  371. }
  372. }else{
  373. //新增
  374. i ++;
  375. BandingTaskClass taskClass = BeanUtil.toBean(dto, BandingTaskClass.class);
  376. taskClass.setCreateDate(new Date());
  377. BaseClass baseClass = new BaseClass();
  378. baseClass.setClassType(taskClass.getClassType());
  379. baseClass.setTeacherId(taskClass.getTeacherId());
  380. baseClass.setMajorSetId(taskClass.getMajorSetId());
  381. baseClass.setClassroomId(taskClass.getClassroomId());
  382. baseClass.setIsOrderClass(taskClass.getIsOrderClass());
  383. baseClass.setOrgId(majorDeptMap.get(taskClass.getMajorSetId()));
  384. baseClass.setName(taskClass.getName());
  385. baseClass.setGradeId(task.getGradeId());
  386. baseClass.setEnrollType(task.getEnrollType());
  387. baseClass.setIsGraduate(1);
  388. baseClass.setCreateUserId(StpUtil.getLoginIdAsLong());
  389. baseClass.setCreateDate(new Date());
  390. baseClass.setCode(baseGrade.getTitle().replace("年", "") + String.format("%03d", i));
  391. classMapper.insert(baseClass);
  392. if (baseClass.getTeacherId() != null) {
  393. long count = roleRelationService.count(
  394. new QueryWrapper<UserRoleRelation>().lambda()
  395. .eq(UserRoleRelation::getUserId, baseClass.getTeacherId())
  396. .eq(UserRoleRelation::getRoleId, RoleEnum.CLASSTE.getCode())
  397. );
  398. if (count == 0) {
  399. roleRelationService.save(
  400. new UserRoleRelation() {{
  401. setRoleId(RoleEnum.CLASSTE.getCode());
  402. setUserId(baseClass.getTeacherId());
  403. }}
  404. );
  405. }
  406. }
  407. taskClass.setBaseClassId(baseClass.getId());
  408. insList.add(taskClass);
  409. }
  410. }
  411. if(!errorList.isEmpty()){
  412. throw new MyException(errorList.toString().replace("[", "").replace("]", "") + ",分班排序重复");
  413. }
  414. if(!updNullList.isEmpty()){
  415. this.updateNull(updNullList);
  416. }
  417. CompletableFuture.runAsync(() -> {
  418. List<UserRoleRelation> userRoleRelationList = roleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));
  419. redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
  420. });
  421. this.saveBatch(insList);
  422. return this.updateBatchById(updList);
  423. }
  424. /**
  425. * 班级管理中,修改信息时同步修改新生分班中的班级信息
  426. */
  427. @Override
  428. @Transactional(rollbackFor = Exception.class)
  429. public Boolean updateByBaseClass(BaseClass baseClass) {
  430. List<BandingTask> bandingTasks = bandingTaskMapper.selectList(
  431. new QueryWrapper<BandingTask>().lambda()
  432. .eq(BandingTask::getDeleteMark, DeleteMark.NODELETE.getCode())
  433. .eq(BandingTask::getGradeId, baseClass.getGradeId())
  434. .eq(BandingTask::getEnrollType, baseClass.getEnrollType())
  435. .orderByDesc(BandingTask::getId)
  436. );
  437. if(bandingTasks.isEmpty()){
  438. return true;
  439. }
  440. BandingTaskClass one = this.getOne(
  441. new MPJLambdaWrapper<BandingTaskClass>()
  442. .select(BandingTaskClass::getId)
  443. .select(BandingTaskClass.class, x -> VoToColumnUtil.fieldsToColumns(BandingTaskClass.class).contains(x.getProperty()))
  444. .eq(BandingTaskClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  445. .eq(BandingTaskClass::getBaseClassId, baseClass.getId())
  446. );
  447. if(one == null){
  448. BandingTask task = bandingTasks.get(0);
  449. one = new BandingTaskClass();
  450. one.setBandingTaskId(task.getId());
  451. one.setIsOrderClass(baseClass.getIsOrderClass());
  452. one.setClassType(baseClass.getClassType());
  453. one.setTeacherId(baseClass.getTeacherId());
  454. one.setMajorSetId(baseClass.getMajorSetId());
  455. one.setClassroomId(baseClass.getClassroomId());
  456. one.setDeleteMark(DeleteMark.NODELETE.getCode());
  457. one.setCreateDate(new Date());
  458. one.setBaseClassId(baseClass.getId());
  459. one.setEnabledMark(EnabledMark.ENABLED.getCode());
  460. one.setName(baseClass.getName());
  461. one.setCreateUserId(StpUtil.getLoginIdAsLong());
  462. this.save(one);
  463. }else{
  464. one.setIsOrderClass(baseClass.getIsOrderClass());
  465. one.setClassType(baseClass.getClassType());
  466. one.setTeacherId(baseClass.getTeacherId());
  467. one.setMajorSetId(baseClass.getMajorSetId());
  468. one.setClassroomId(baseClass.getClassroomId());
  469. one.setModifyDate(new Date());
  470. one.setModifyUserId(StpUtil.getLoginIdAsLong());
  471. this.updateById(one);
  472. }
  473. return true;
  474. }
  475. /**
  476. * 新增分班任务后,自动初始化班级数据
  477. */
  478. @Override
  479. @Transactional(rollbackFor = Exception.class)
  480. public Boolean initClassByBaseClass(BandingTask bandingTask) {
  481. List<BaseClass> classList = classMapper.selectList(
  482. new QueryWrapper<BaseClass>().lambda()
  483. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  484. .eq(BaseClass::getGradeId, bandingTask.getGradeId())
  485. .eq(BaseClass::getIsGraduate, 1)
  486. .eq(BaseClass::getEnrollType, bandingTask.getEnrollType())
  487. );
  488. List<BandingTaskClass> insList = new ArrayList<>();//新增班级
  489. for (BaseClass baseClass : classList) {
  490. BandingTaskClass one = new BandingTaskClass();
  491. one.setBandingTaskId(bandingTask.getId());
  492. one.setIsOrderClass(baseClass.getIsOrderClass());
  493. one.setClassType(baseClass.getClassType());
  494. one.setTeacherId(baseClass.getTeacherId());
  495. one.setMajorSetId(baseClass.getMajorSetId());
  496. one.setClassroomId(baseClass.getClassroomId());
  497. one.setDeleteMark(DeleteMark.NODELETE.getCode());
  498. one.setCreateDate(new Date());
  499. one.setEnabledMark(EnabledMark.ENABLED.getCode());
  500. one.setName(baseClass.getName());
  501. one.setCreateUserId(StpUtil.getLoginIdAsLong());
  502. one.setStatus(0);
  503. one.setBaseClassId(baseClass.getId());
  504. insList.add(one);
  505. }
  506. if(!insList.isEmpty()){
  507. this.saveBatch(insList);
  508. }
  509. return true;
  510. }
  511. @Override
  512. @Transactional(rollbackFor = Exception.class)
  513. public Boolean deleteClass(List<Long> ids) {
  514. if(!ids.isEmpty()){
  515. List<BandingTaskClassStudent> list = classStudentMapper.selectList(
  516. new QueryWrapper<BandingTaskClassStudent>().lambda()
  517. .in(BandingTaskClassStudent::getBandingTaskClassId, ids)
  518. .eq(BandingTaskClassStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
  519. );
  520. if(!list.isEmpty()){
  521. throw new MyException("该班级下已分配学生,无法删除");
  522. }
  523. }
  524. List<BandingTaskClass> classList = this.listByIds(ids);
  525. for (BandingTaskClass taskClass : classList) {
  526. BandingTask bandingTask = bandingTaskMapper.selectById(taskClass.getBandingTaskId());
  527. BaseClass baseClass = classMapper.selectOne(
  528. new QueryWrapper<BaseClass>().lambda()
  529. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  530. .eq(BaseClass::getGradeId, bandingTask.getGradeId())
  531. .eq(BaseClass::getName, taskClass.getName())
  532. .eq(BaseClass::getIsGraduate, 1)
  533. .eq(BaseClass::getEnrollType, bandingTask.getEnrollType())
  534. );
  535. classMapper.deleteById(baseClass);
  536. this.removeById(taskClass);
  537. }
  538. return true;
  539. }
  540. @Override
  541. public BandingTaskClassReportStatisticsVo getTryReadingReportClassStatistics(StudentTryReadingReportPageDto dto) {
  542. BandingTaskClassReportStatisticsVo result = new BandingTaskClassReportStatisticsVo();
  543. if(dto.getClassId() == 0L){
  544. StudentReportPlan plan = reportPlanService.getLastTryReadingPlan();
  545. BandingTask bandingTask = bandingTaskMapper.selectById(plan.getBandingTaskId());
  546. List<EnrollmentPlan> enrollmentPlans = enrollmentPlanMapper.selectList(
  547. new QueryWrapper<EnrollmentPlan>().lambda()
  548. .eq(EnrollmentPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
  549. .eq(EnrollmentPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
  550. .eq(EnrollmentPlan::getEnrollType, bandingTask.getEnrollType())
  551. .eq(EnrollmentPlan::getGradeId, bandingTask.getGradeId())
  552. .orderByDesc(EnrollmentPlan::getId)
  553. );
  554. if(!enrollmentPlans.isEmpty()){
  555. dto.setEnrollmentPlanId(enrollmentPlans.get(0).getId());
  556. }
  557. }else{
  558. BandingTaskClass taskClass = this.getById(dto.getClassId());
  559. BandingTask task = bandingTaskMapper.selectById(taskClass.getBandingTaskId());
  560. List<EnrollmentPlan> enrollmentPlanList = enrollmentPlanMapper.selectList(
  561. new QueryWrapper<EnrollmentPlan>().lambda()
  562. .eq(EnrollmentPlan::getEnrollType, task.getEnrollType())
  563. .eq(EnrollmentPlan::getGradeId, task.getGradeId())
  564. .eq(EnrollmentPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
  565. .eq(EnrollmentPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
  566. .orderByDesc(EnrollmentPlan::getId)
  567. );
  568. if(!enrollmentPlanList.isEmpty()){
  569. dto.setEnrollmentPlanId(enrollmentPlanList.get(0).getId());
  570. }
  571. }
  572. dto.setClassId(dto.getClassId());
  573. List<StudentReportRecordPlanPageVo> tryReadingList = reportRecordMapper.getTryReadingList(dto);
  574. result.setAllCount(tryReadingList.size());
  575. //女生人数
  576. List<StudentReportRecordPlanPageVo> femaleList = tryReadingList.stream()
  577. .filter(x -> x.getGender() != null && GenderDictionaryEnum.MALE.getValue().equals(x.getGender()))
  578. .collect(Collectors.toList());
  579. result.setMaleCount(femaleList.size());
  580. //男生人数
  581. List<StudentReportRecordPlanPageVo> maleList = tryReadingList.stream()
  582. .filter(x -> x.getGender() != null && GenderDictionaryEnum.FEMALE.getValue().equals(x.getGender()))
  583. .collect(Collectors.toList());
  584. result.setFemaleCount(maleList.size());
  585. //已到人数
  586. List<StudentReportRecordPlanPageVo> arrivedList = tryReadingList.stream()
  587. .filter(x -> x.getIsReport() == 1)
  588. .collect(Collectors.toList());
  589. result.setArrivedCount(arrivedList.size());
  590. //未到人数
  591. List<StudentReportRecordPlanPageVo> notArrivedList = tryReadingList.stream()
  592. .filter(x -> x.getIsReport() == 0)
  593. .collect(Collectors.toList());
  594. result.setNotArrivedCount(notArrivedList.size());
  595. if(result.getAllCount() != 0){
  596. BigDecimal divide = BigDecimal.valueOf(result.getArrivedCount()).divide(BigDecimal.valueOf(result.getAllCount()), 4, RoundingMode.HALF_UP);
  597. result.setReportRate(divide.doubleValue() + "");
  598. }
  599. return result;
  600. }
  601. @Override
  602. public Boolean removeByBaseClass(BaseClass baseClass) {
  603. boolean remove = this.remove(
  604. new QueryWrapper<BandingTaskClass>().lambda()
  605. .eq(BandingTaskClass::getBaseClassId, baseClass.getId())
  606. );
  607. return remove;
  608. }
  609. }