BandingTaskClassServiceImpl.java 30 KB

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