BandingTaskClassServiceImpl.java 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  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. return this.baseMapper.getClassStudent(dto);
  149. }
  150. @Override
  151. public List<BandingTaskClassSureListVo> getClassSure(BandingTaskClassStudentPageDto dto) {
  152. return this.baseMapper.getClassSure(dto);
  153. }
  154. @Override
  155. public Boolean importData(Long bandingTaskId, List<Map<Integer, Object>> excelDataList) {
  156. List<BaseClassroom> classroomList = classroomService.list(
  157. new QueryWrapper<BaseClassroom>().lambda()
  158. .eq(BaseClassroom::getDeleteMark, DeleteMark.NODELETE.getCode())
  159. );
  160. Map<String, Long> classroomMap = new HashMap<>();
  161. for (BaseClassroom classroom : classroomList) {
  162. classroomMap.put(classroom.getName(), classroom.getId());
  163. }
  164. List<User> userList = userService.list(
  165. new MPJLambdaWrapper<User>()
  166. .select(User::getId)
  167. .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
  168. .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
  169. );
  170. Map<String, Long> userMap = new HashMap<>();
  171. for (User user : userList) {
  172. userMap.put(user.getName(), user.getId());
  173. }
  174. List<BaseMajorSet> majorSetList = majorSetService.list(
  175. new QueryWrapper<BaseMajorSet>().lambda()
  176. );
  177. Map<String, Long> majorSetMap = new HashMap<>();
  178. for (BaseMajorSet majorSet : majorSetList) {
  179. majorSetMap.put(majorSet.getName(), majorSet.getId());
  180. }
  181. List<DictionaryDetail> classType = detailMapper.selectJoinList(DictionaryDetail.class,
  182. new MPJLambdaWrapper<DictionaryDetail>()
  183. .select(DictionaryDetail::getId)
  184. .select(DictionaryDetail.class, x -> VoToColumnUtil.fieldsToColumns(DictionaryDetail.class).contains(x.getProperty()))
  185. .innerJoin(DictionaryItem.class, DictionaryItem::getId, DictionaryDetail::getItemId)
  186. .eq(DictionaryItem::getCode, "class_type")
  187. );
  188. Map<String, String> classTypeMap = classType.stream().collect(Collectors.toMap(DictionaryDetail::getName, DictionaryDetail::getCode));
  189. List<BandingTaskClass> classList = new ArrayList<>();
  190. Date createDate = new Date();
  191. for (Map<Integer, Object> taskClass : excelDataList) {
  192. classList.add(new BandingTaskClass(){{
  193. setBandingTaskId(bandingTaskId);
  194. setCreateDate(createDate);
  195. setName(taskClass.get(1).toString());
  196. setMajorSetId(majorSetMap.get(taskClass.get(0).toString().trim()));
  197. setNumber(Integer.parseInt(taskClass.get(2).toString()));
  198. setClassroomId(classroomMap.get(taskClass.get(4).toString()));
  199. if(taskClass.get(5) != null){
  200. setClassType(classTypeMap.get(taskClass.get(5).toString()));
  201. }
  202. if(taskClass.get(6) != null){
  203. setIsOrderClass(YesOrNoEnum.getCode(taskClass.get(6).toString()));
  204. }
  205. if(taskClass.get(7) != null){
  206. setSortCode(Integer.parseInt(taskClass.get(7).toString()));
  207. }
  208. setTeacherId(userMap.get(taskClass.get(3).toString()));
  209. }});
  210. }
  211. Boolean result = this.saveBatch(classList);
  212. return result;
  213. }
  214. @Override
  215. @Transactional(rollbackFor = Exception.class)
  216. public Boolean updateNull(List<BandingTaskClass> updNullList) {
  217. for (BandingTaskClass taskClass : updNullList) {
  218. UpdateWrapper<BandingTaskClass> updateWrapper = new UpdateWrapper<>();
  219. updateWrapper.eq("id", taskClass.getId());
  220. updateWrapper.setSql("sort_code = null");
  221. this.baseMapper.update(taskClass, updateWrapper);
  222. }
  223. return true;
  224. }
  225. @Override
  226. @Transactional(rollbackFor = Exception.class)
  227. public Boolean saveClass(List<UpdateBandingClassDto> dtoList) {
  228. List<BandingTaskClass> insList = new ArrayList<>();//新增班级
  229. List<BandingTaskClass> updList = new ArrayList<>();//修改班级
  230. List<BandingTaskClass> updNullList = new ArrayList<>();//修改班级
  231. List<String> errorList = new ArrayList<>();//修改班级
  232. UpdateBandingClassDto updateBandingClassDto = dtoList.get(0);
  233. BandingTask task;
  234. if(updateBandingClassDto.getBandingTaskId() == null){
  235. BandingTaskClass taskClass = this.getById(updateBandingClassDto.getId());
  236. task = bandingTaskMapper.selectById(taskClass.getBandingTaskId());
  237. }else{
  238. task = bandingTaskMapper.selectById(updateBandingClassDto.getBandingTaskId());
  239. }
  240. List<BaseClass> classList = classMapper.selectList(
  241. new QueryWrapper<BaseClass>().lambda()
  242. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  243. .eq(BaseClass::getGradeId, task.getGradeId())
  244. .eq(BaseClass::getEnrollType, task.getEnrollType())
  245. );
  246. List<BaseClass> classCodes = classList.stream().filter(x -> x.getCode() != null).collect(Collectors.toList());
  247. Collections.sort(classCodes, Comparator.comparing(BaseClass::getCode));
  248. String classCode = null;
  249. if(!classCodes.isEmpty()){
  250. classCode = classCodes.get(0).getCode();
  251. }
  252. Map<Long, BaseClass> classMap = classList.stream().collect(Collectors.toMap(BaseClass::getId, x -> x));
  253. List<BaseMajorSet> majorSetList = majorSetService.list(
  254. new QueryWrapper<BaseMajorSet>().lambda()
  255. .eq(BaseMajorSet::getDeleteMark, DeleteMark.NODELETE.getCode())
  256. );
  257. Map<Long, Long> majorDeptMap = majorSetList.stream().collect(Collectors.toMap(BaseMajorSet::getId, BaseMajorSet::getDepartmentId));
  258. BaseGrade baseGrade = gradeMapper.selectById(task.getGradeId());
  259. int i = 0;
  260. if(NumberUtil.isNumber(classCode)){
  261. i = Integer.parseInt(classCode.trim().substring(classCode.length() - 3));
  262. }
  263. for (UpdateBandingClassDto dto : dtoList) {
  264. if(dto.getSortCode() != null){
  265. List<BandingTaskClass> list = this.list(
  266. new QueryWrapper<BandingTaskClass>().lambda()
  267. .eq(BandingTaskClass::getSortCode, dto.getSortCode())
  268. .eq(BandingTaskClass::getBandingTaskId, dto.getBandingTaskId())
  269. .ne(dto.getId() != null,BandingTaskClass::getId, dto.getId())
  270. );
  271. if(!list.isEmpty()){
  272. errorList.add(dto.getName());
  273. }
  274. }
  275. if(dto.getId() != null){
  276. //修改
  277. BandingTaskClass sourceObj = this.getById(dto.getId());
  278. BeanUtil.copyProperties(dto, sourceObj);
  279. sourceObj.setModifyDate(new Date());
  280. if(sourceObj.getBaseClassId() != null){
  281. BaseClass baseClass = classMap.get(sourceObj.getBaseClassId());
  282. baseClass.setName(sourceObj.getName());
  283. baseClass.setClassType(sourceObj.getClassType());
  284. baseClass.setTeacherId(sourceObj.getTeacherId());
  285. baseClass.setMajorSetId(sourceObj.getMajorSetId());
  286. baseClass.setClassroomId(sourceObj.getClassroomId());
  287. baseClass.setIsOrderClass(sourceObj.getIsOrderClass());
  288. baseClass.setOrgId(majorDeptMap.get(sourceObj.getMajorSetId()));
  289. baseClass.setEnrollType(task.getEnrollType());
  290. if(baseClass.getCode() == null){
  291. i ++;
  292. baseClass.setCode(baseGrade.getTitle().replace("年", "") + String.format("%03d", i));
  293. }
  294. classMapper.updateById(baseClass);
  295. teacherChangeMapper.insert(new BaseClassTeacherChange(){{
  296. setClassId(baseClass.getId());
  297. setBeforeTeacherId(baseClass.getTeacherId());
  298. setAfterTeacherId(sourceObj.getTeacherId());
  299. setDeleteMark(DeleteMark.NODELETE.getCode());
  300. setEnabledMark(EnabledMark.ENABLED.getCode());
  301. setCreateDate(LocalDateTime.now());
  302. }});
  303. //给该老师添加班主任角色
  304. if (baseClass.getTeacherId() != null) {
  305. long count = roleRelationService.count(
  306. new QueryWrapper<UserRoleRelation>().lambda()
  307. .eq(UserRoleRelation::getUserId, baseClass.getTeacherId())
  308. .eq(UserRoleRelation::getRoleId, RoleEnum.CLASSTE.getCode())
  309. );
  310. if (count == 0) {
  311. roleRelationService.save(
  312. new UserRoleRelation() {{
  313. setRoleId(RoleEnum.CLASSTE.getCode());
  314. setUserId(baseClass.getTeacherId());
  315. }}
  316. );
  317. }
  318. }
  319. }else{
  320. i ++;
  321. BaseClass baseClass = new BaseClass();
  322. baseClass.setClassType(sourceObj.getClassType());
  323. baseClass.setTeacherId(sourceObj.getTeacherId());
  324. baseClass.setMajorSetId(sourceObj.getMajorSetId());
  325. baseClass.setClassroomId(sourceObj.getClassroomId());
  326. baseClass.setIsOrderClass(sourceObj.getIsOrderClass());
  327. baseClass.setOrgId(majorDeptMap.get(sourceObj.getMajorSetId()));
  328. baseClass.setName(sourceObj.getName());
  329. baseClass.setGradeId(task.getGradeId());
  330. baseClass.setEnrollType(task.getEnrollType());
  331. baseClass.setIsGraduate(1);
  332. baseClass.setCreateUserId(StpUtil.getLoginIdAsLong());
  333. baseClass.setCreateDate(new Date());
  334. baseClass.setCode(baseGrade.getTitle().replace("年", "") + String.format("%03d", i));
  335. classMapper.insert(baseClass);
  336. sourceObj.setBaseClassId(baseClass.getId());
  337. teacherChangeMapper.insert(new BaseClassTeacherChange(){{
  338. setClassId(baseClass.getId());
  339. setAfterTeacherId(sourceObj.getTeacherId());
  340. setDeleteMark(DeleteMark.NODELETE.getCode());
  341. setEnabledMark(EnabledMark.ENABLED.getCode());
  342. setCreateDate(LocalDateTime.now());
  343. }});
  344. if (baseClass.getTeacherId() != null) {
  345. long count = roleRelationService.count(
  346. new QueryWrapper<UserRoleRelation>().lambda()
  347. .eq(UserRoleRelation::getUserId, baseClass.getTeacherId())
  348. .eq(UserRoleRelation::getRoleId, RoleEnum.CLASSTE.getCode())
  349. );
  350. if (count == 0) {
  351. roleRelationService.save(
  352. new UserRoleRelation() {{
  353. setRoleId(RoleEnum.CLASSTE.getCode());
  354. setUserId(baseClass.getTeacherId());
  355. }}
  356. );
  357. }
  358. }
  359. }
  360. if(sourceObj.getSortCode() == null){
  361. updNullList.add(sourceObj);
  362. }else{
  363. updList.add(sourceObj);
  364. }
  365. }else{
  366. //新增
  367. i ++;
  368. BandingTaskClass taskClass = BeanUtil.toBean(dto, BandingTaskClass.class);
  369. taskClass.setCreateDate(new Date());
  370. BaseClass baseClass = new BaseClass();
  371. baseClass.setClassType(taskClass.getClassType());
  372. baseClass.setTeacherId(taskClass.getTeacherId());
  373. baseClass.setMajorSetId(taskClass.getMajorSetId());
  374. baseClass.setClassroomId(taskClass.getClassroomId());
  375. baseClass.setIsOrderClass(taskClass.getIsOrderClass());
  376. baseClass.setOrgId(majorDeptMap.get(taskClass.getMajorSetId()));
  377. baseClass.setName(taskClass.getName());
  378. baseClass.setGradeId(task.getGradeId());
  379. baseClass.setEnrollType(task.getEnrollType());
  380. baseClass.setIsGraduate(1);
  381. baseClass.setCreateUserId(StpUtil.getLoginIdAsLong());
  382. baseClass.setCreateDate(new Date());
  383. baseClass.setCode(baseGrade.getTitle().replace("年", "") + String.format("%03d", i));
  384. classMapper.insert(baseClass);
  385. if (baseClass.getTeacherId() != null) {
  386. long count = roleRelationService.count(
  387. new QueryWrapper<UserRoleRelation>().lambda()
  388. .eq(UserRoleRelation::getUserId, baseClass.getTeacherId())
  389. .eq(UserRoleRelation::getRoleId, RoleEnum.CLASSTE.getCode())
  390. );
  391. if (count == 0) {
  392. roleRelationService.save(
  393. new UserRoleRelation() {{
  394. setRoleId(RoleEnum.CLASSTE.getCode());
  395. setUserId(baseClass.getTeacherId());
  396. }}
  397. );
  398. }
  399. }
  400. taskClass.setBaseClassId(baseClass.getId());
  401. insList.add(taskClass);
  402. }
  403. }
  404. if(!errorList.isEmpty()){
  405. throw new MyException(errorList.toString().replace("[", "").replace("]", "") + ",分班排序重复");
  406. }
  407. if(!updNullList.isEmpty()){
  408. this.updateNull(updNullList);
  409. }
  410. CompletableFuture.runAsync(() -> {
  411. List<UserRoleRelation> userRoleRelationList = roleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));
  412. redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
  413. });
  414. this.saveBatch(insList);
  415. return this.updateBatchById(updList);
  416. }
  417. /**
  418. * 班级管理中,修改信息时同步修改新生分班中的班级信息
  419. */
  420. @Override
  421. @Transactional(rollbackFor = Exception.class)
  422. public Boolean updateByBaseClass(BaseClass baseClass) {
  423. List<BandingTask> bandingTasks = bandingTaskMapper.selectList(
  424. new QueryWrapper<BandingTask>().lambda()
  425. .eq(BandingTask::getDeleteMark, DeleteMark.NODELETE.getCode())
  426. .eq(BandingTask::getGradeId, baseClass.getGradeId())
  427. .eq(BandingTask::getEnrollType, baseClass.getEnrollType())
  428. .orderByDesc(BandingTask::getId)
  429. );
  430. if(bandingTasks.isEmpty()){
  431. return true;
  432. }
  433. BandingTaskClass one = this.getOne(
  434. new MPJLambdaWrapper<BandingTaskClass>()
  435. .select(BandingTaskClass::getId)
  436. .select(BandingTaskClass.class, x -> VoToColumnUtil.fieldsToColumns(BandingTaskClass.class).contains(x.getProperty()))
  437. .eq(BandingTaskClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  438. .eq(BandingTaskClass::getBaseClassId, baseClass.getId())
  439. );
  440. if(one == null){
  441. BandingTask task = bandingTasks.get(0);
  442. one = new BandingTaskClass();
  443. one.setBandingTaskId(task.getId());
  444. one.setIsOrderClass(baseClass.getIsOrderClass());
  445. one.setClassType(baseClass.getClassType());
  446. one.setTeacherId(baseClass.getTeacherId());
  447. one.setMajorSetId(baseClass.getMajorSetId());
  448. one.setClassroomId(baseClass.getClassroomId());
  449. one.setDeleteMark(DeleteMark.NODELETE.getCode());
  450. one.setCreateDate(new Date());
  451. one.setEnabledMark(EnabledMark.ENABLED.getCode());
  452. one.setName(baseClass.getName());
  453. one.setCreateUserId(StpUtil.getLoginIdAsLong());
  454. this.save(one);
  455. }else{
  456. one.setIsOrderClass(baseClass.getIsOrderClass());
  457. one.setClassType(baseClass.getClassType());
  458. one.setTeacherId(baseClass.getTeacherId());
  459. one.setMajorSetId(baseClass.getMajorSetId());
  460. one.setClassroomId(baseClass.getClassroomId());
  461. one.setModifyDate(new Date());
  462. one.setModifyUserId(StpUtil.getLoginIdAsLong());
  463. this.updateById(one);
  464. }
  465. return true;
  466. }
  467. /**
  468. * 新增分班任务后,自动初始化班级数据
  469. */
  470. @Override
  471. @Transactional(rollbackFor = Exception.class)
  472. public Boolean initClassByBaseClass(BandingTask bandingTask) {
  473. List<BaseClass> classList = classMapper.selectList(
  474. new QueryWrapper<BaseClass>().lambda()
  475. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  476. .eq(BaseClass::getGradeId, bandingTask.getGradeId())
  477. .eq(BaseClass::getIsGraduate, 1)
  478. .eq(BaseClass::getEnrollType, bandingTask.getEnrollType())
  479. );
  480. List<BandingTaskClass> insList = new ArrayList<>();//新增班级
  481. for (BaseClass baseClass : classList) {
  482. BandingTaskClass one = new BandingTaskClass();
  483. one.setBandingTaskId(bandingTask.getId());
  484. one.setIsOrderClass(baseClass.getIsOrderClass());
  485. one.setClassType(baseClass.getClassType());
  486. one.setTeacherId(baseClass.getTeacherId());
  487. one.setMajorSetId(baseClass.getMajorSetId());
  488. one.setClassroomId(baseClass.getClassroomId());
  489. one.setDeleteMark(DeleteMark.NODELETE.getCode());
  490. one.setCreateDate(new Date());
  491. one.setEnabledMark(EnabledMark.ENABLED.getCode());
  492. one.setName(baseClass.getName());
  493. one.setCreateUserId(StpUtil.getLoginIdAsLong());
  494. one.setStatus(0);
  495. one.setBaseClassId(baseClass.getId());
  496. insList.add(one);
  497. }
  498. if(!insList.isEmpty()){
  499. this.saveBatch(insList);
  500. }
  501. return true;
  502. }
  503. @Override
  504. @Transactional(rollbackFor = Exception.class)
  505. public Boolean deleteClass(List<Long> ids) {
  506. if(!ids.isEmpty()){
  507. List<BandingTaskClassStudent> list = classStudentMapper.selectList(
  508. new QueryWrapper<BandingTaskClassStudent>().lambda()
  509. .in(BandingTaskClassStudent::getBandingTaskClassId, ids)
  510. .eq(BandingTaskClassStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
  511. );
  512. if(!list.isEmpty()){
  513. throw new MyException("该班级下已分配学生,无法删除");
  514. }
  515. }
  516. List<BandingTaskClass> classList = this.listByIds(ids);
  517. for (BandingTaskClass taskClass : classList) {
  518. BandingTask bandingTask = bandingTaskMapper.selectById(taskClass.getBandingTaskId());
  519. BaseClass baseClass = classMapper.selectOne(
  520. new QueryWrapper<BaseClass>().lambda()
  521. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  522. .eq(BaseClass::getGradeId, bandingTask.getGradeId())
  523. .eq(BaseClass::getName, taskClass.getName())
  524. .eq(BaseClass::getIsGraduate, 1)
  525. .eq(BaseClass::getEnrollType, bandingTask.getEnrollType())
  526. );
  527. classMapper.deleteById(baseClass);
  528. this.removeById(taskClass);
  529. }
  530. return true;
  531. }
  532. @Override
  533. public BandingTaskClassReportStatisticsVo getTryReadingReportClassStatistics(StudentTryReadingReportPageDto dto) {
  534. BandingTaskClassReportStatisticsVo result = new BandingTaskClassReportStatisticsVo();
  535. if(dto.getClassId() == 0L){
  536. StudentReportPlan plan = reportPlanService.getLastTryReadingPlan();
  537. BandingTask bandingTask = bandingTaskMapper.selectById(plan.getBandingTaskId());
  538. List<EnrollmentPlan> enrollmentPlans = enrollmentPlanMapper.selectList(
  539. new QueryWrapper<EnrollmentPlan>().lambda()
  540. .eq(EnrollmentPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
  541. .eq(EnrollmentPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
  542. .eq(EnrollmentPlan::getEnrollType, bandingTask.getEnrollType())
  543. .eq(EnrollmentPlan::getGradeId, bandingTask.getGradeId())
  544. .orderByDesc(EnrollmentPlan::getId)
  545. );
  546. if(!enrollmentPlans.isEmpty()){
  547. dto.setEnrollmentPlanId(enrollmentPlans.get(0).getId());
  548. }
  549. }else{
  550. BandingTaskClass taskClass = this.getById(dto.getClassId());
  551. BandingTask task = bandingTaskMapper.selectById(taskClass.getBandingTaskId());
  552. List<EnrollmentPlan> enrollmentPlanList = enrollmentPlanMapper.selectList(
  553. new QueryWrapper<EnrollmentPlan>().lambda()
  554. .eq(EnrollmentPlan::getEnrollType, task.getEnrollType())
  555. .eq(EnrollmentPlan::getGradeId, task.getGradeId())
  556. .eq(EnrollmentPlan::getEnabledMark, EnabledMark.ENABLED.getCode())
  557. .eq(EnrollmentPlan::getDeleteMark, DeleteMark.NODELETE.getCode())
  558. .orderByDesc(EnrollmentPlan::getId)
  559. );
  560. if(!enrollmentPlanList.isEmpty()){
  561. dto.setEnrollmentPlanId(enrollmentPlanList.get(0).getId());
  562. }
  563. }
  564. dto.setClassId(dto.getClassId());
  565. List<StudentReportRecordPlanPageVo> tryReadingList = reportRecordMapper.getTryReadingList(dto);
  566. result.setAllCount(tryReadingList.size());
  567. //女生人数
  568. List<StudentReportRecordPlanPageVo> femaleList = tryReadingList.stream()
  569. .filter(x -> x.getGender() != null && GenderDictionaryEnum.MALE.getValue().equals(x.getGender()))
  570. .collect(Collectors.toList());
  571. result.setMaleCount(femaleList.size());
  572. //男生人数
  573. List<StudentReportRecordPlanPageVo> maleList = tryReadingList.stream()
  574. .filter(x -> x.getGender() != null && GenderDictionaryEnum.FEMALE.getValue().equals(x.getGender()))
  575. .collect(Collectors.toList());
  576. result.setFemaleCount(maleList.size());
  577. //已到人数
  578. List<StudentReportRecordPlanPageVo> arrivedList = tryReadingList.stream()
  579. .filter(x -> x.getIsReport() == 1)
  580. .collect(Collectors.toList());
  581. result.setArrivedCount(arrivedList.size());
  582. //未到人数
  583. List<StudentReportRecordPlanPageVo> notArrivedList = tryReadingList.stream()
  584. .filter(x -> x.getIsReport() == 0)
  585. .collect(Collectors.toList());
  586. result.setNotArrivedCount(notArrivedList.size());
  587. if(result.getAllCount() != 0){
  588. BigDecimal divide = BigDecimal.valueOf(result.getArrivedCount()).divide(BigDecimal.valueOf(result.getAllCount()), 4, RoundingMode.HALF_UP);
  589. result.setReportRate(divide.doubleValue() + "");
  590. }
  591. return result;
  592. }
  593. @Override
  594. public Boolean removeByBaseClass(BaseClass baseClass) {
  595. boolean remove = this.remove(
  596. new QueryWrapper<BandingTaskClass>().lambda()
  597. .eq(BandingTaskClass::getBaseClassId, baseClass.getId())
  598. );
  599. return remove;
  600. }
  601. }