AssessmentTemplatePlanServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. package com.xjrsoft.module.assessment.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.util.IdUtil;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  8. import com.github.yulichang.base.MPJBaseServiceImpl;
  9. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  10. import com.xjrsoft.common.enums.DeleteMark;
  11. import com.xjrsoft.module.assessment.dto.AddAssessmentTemplatePlanDto;
  12. import com.xjrsoft.module.assessment.dto.AssessmentPlanAnswerPageDto;
  13. import com.xjrsoft.module.assessment.dto.AssessmentTemplatePlanPageDto;
  14. import com.xjrsoft.module.assessment.dto.AssessmentTemplatePlanSureDto;
  15. import com.xjrsoft.module.assessment.dto.UpdateAssessmentTemplatePlanDto;
  16. import com.xjrsoft.module.assessment.dto.UpdateAssessmentTemplatePlanTimeDto;
  17. import com.xjrsoft.module.assessment.entity.AssessmentPlanAnswerClass;
  18. import com.xjrsoft.module.assessment.entity.AssessmentPlanAnswerStudent;
  19. import com.xjrsoft.module.assessment.entity.AssessmentPlanQuestion;
  20. import com.xjrsoft.module.assessment.entity.AssessmentQuestion;
  21. import com.xjrsoft.module.assessment.entity.AssessmentTemplate;
  22. import com.xjrsoft.module.assessment.entity.AssessmentTemplatePlan;
  23. import com.xjrsoft.module.assessment.mapper.AssessmentPlanAnswerClassMapper;
  24. import com.xjrsoft.module.assessment.mapper.AssessmentPlanAnswerStudentMapper;
  25. import com.xjrsoft.module.assessment.mapper.AssessmentPlanQuestionMapper;
  26. import com.xjrsoft.module.assessment.mapper.AssessmentQuestionMapper;
  27. import com.xjrsoft.module.assessment.mapper.AssessmentTemplateMapper;
  28. import com.xjrsoft.module.assessment.mapper.AssessmentTemplatePlanMapper;
  29. import com.xjrsoft.module.assessment.service.IAssessmentTemplatePlanService;
  30. import com.xjrsoft.module.assessment.vo.AssessmentPlanAnswerPageVo;
  31. import com.xjrsoft.module.assessment.vo.AssessmentQuestionVo;
  32. import com.xjrsoft.module.assessment.vo.AssessmentTemplatePlanPageVo;
  33. import com.xjrsoft.module.assessment.vo.AssessmentTemplateQuestionVo;
  34. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  35. import com.xjrsoft.module.teacher.entity.XjrUser;
  36. import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
  37. import lombok.AllArgsConstructor;
  38. import org.springframework.stereotype.Service;
  39. import org.springframework.transaction.annotation.Transactional;
  40. import java.util.ArrayList;
  41. import java.util.HashMap;
  42. import java.util.List;
  43. import java.util.Map;
  44. import java.util.Random;
  45. /**
  46. * @title: 考核计划
  47. * @Author dzx
  48. * @Date: 2024-04-01
  49. * @Version 1.0
  50. */
  51. @Service
  52. @AllArgsConstructor
  53. public class AssessmentTemplatePlanServiceImpl extends MPJBaseServiceImpl<AssessmentTemplatePlanMapper, AssessmentTemplatePlan> implements IAssessmentTemplatePlanService {
  54. private final AssessmentTemplatePlanMapper templatePlanMapper;
  55. private final AssessmentPlanQuestionMapper planQuestionMapper;
  56. private final AssessmentPlanAnswerClassMapper answerClassMapper;
  57. private final AssessmentPlanAnswerStudentMapper studentMapper;
  58. private final AssessmentTemplateMapper assessmentTemplateMapper;
  59. private final AssessmentQuestionMapper questionMapper;
  60. private final XjrUserMapper xjrUserMapper;
  61. @Override
  62. @Transactional(rollbackFor = Exception.class)
  63. public Boolean add(AddAssessmentTemplatePlanDto dto) {
  64. AssessmentTemplate template = assessmentTemplateMapper.selectById(dto.getAssessmentTemplateId());
  65. AssessmentTemplatePlan assessmentTemplatePlan = BeanUtil.toBean(dto, AssessmentTemplatePlan.class);
  66. assessmentTemplatePlan.setScore(template.getScore());
  67. templatePlanMapper.insert(assessmentTemplatePlan);
  68. //查询模板下面的题目信息
  69. List<AssessmentQuestion> questionList = questionMapper.selectList(
  70. new QueryWrapper<AssessmentQuestion>().lambda()
  71. .eq(AssessmentQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  72. .eq(AssessmentQuestion::getAssessmentTemplateId, dto.getAssessmentTemplateId())
  73. );
  74. Map<Long, Long> parentMap = new HashMap<>();
  75. for (AssessmentQuestion assessmentQuestion : questionList) {
  76. parentMap.put(assessmentQuestion.getId(), IdUtil.getSnowflakeNextId());
  77. }
  78. for (AssessmentQuestion assessmentQuestion : questionList) {
  79. AssessmentPlanQuestion planQuestion = BeanUtil.toBean(assessmentQuestion, AssessmentPlanQuestion.class);
  80. planQuestion.setId(parentMap.get(assessmentQuestion.getId()));
  81. planQuestion.setParentId(parentMap.get(assessmentQuestion.getParentId()));
  82. planQuestion.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  83. planQuestionMapper.insert(planQuestion);
  84. }
  85. //存入班级,并根据选人方式存入答题学生
  86. for (Long classId : dto.getClassIds()) {
  87. AssessmentPlanAnswerClass answerClass = new AssessmentPlanAnswerClass();
  88. answerClass.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  89. answerClass.setClassId(classId);
  90. answerClassMapper.insert(answerClass);
  91. MPJLambdaWrapper<XjrUser> query = new MPJLambdaWrapper<>();
  92. query.leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
  93. .eq(BaseStudentSchoolRoll::getClassId, classId);
  94. List<XjrUser> studentList = xjrUserMapper.selectJoinList(XjrUser.class, query);
  95. List<XjrUser> needStudentList = new ArrayList<>();
  96. if("all".equals(dto.getType())){
  97. needStudentList.addAll(studentList);
  98. }else if("random".equals(dto.getType())){
  99. int maxCount = studentList.size();//班级最大人数
  100. if(dto.getRandomNumber() > maxCount){
  101. needStudentList.addAll(studentList);
  102. }else{
  103. List<Integer> randomList = new ArrayList<>();
  104. Random random = new Random();
  105. while(randomList.size() < dto.getRandomNumber()){
  106. int nextInt = random.nextInt(studentList.size());
  107. if(!randomList.contains(nextInt) && nextInt >= 0){
  108. randomList.add(nextInt);
  109. }
  110. }
  111. for (Integer i : randomList) {
  112. needStudentList.add(studentList.get(i));
  113. }
  114. }
  115. }
  116. for (XjrUser xjrUser : needStudentList) {
  117. AssessmentPlanAnswerStudent answer = new AssessmentPlanAnswerStudent();
  118. answer.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  119. answer.setStudentUserId(xjrUser.getId());
  120. studentMapper.insert(answer);
  121. }
  122. }
  123. return true;
  124. }
  125. @Override
  126. @Transactional(rollbackFor = Exception.class)
  127. public Boolean update(UpdateAssessmentTemplatePlanDto dto) {
  128. AssessmentTemplate template = assessmentTemplateMapper.selectById(dto.getAssessmentTemplateId());
  129. AssessmentTemplatePlan assessmentTemplatePlan = BeanUtil.toBean(dto, AssessmentTemplatePlan.class);
  130. assessmentTemplatePlan.setScore(template.getScore());
  131. templatePlanMapper.updateById(assessmentTemplatePlan);
  132. //删除以前的题目
  133. planQuestionMapper.deleteByPlanId(assessmentTemplatePlan.getId(), StpUtil.getLoginIdAsLong());
  134. //查询模板下面的题目信息
  135. List<AssessmentQuestion> questionList = questionMapper.selectList(
  136. new QueryWrapper<AssessmentQuestion>().lambda()
  137. .eq(AssessmentQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  138. .eq(AssessmentQuestion::getAssessmentTemplateId, dto.getAssessmentTemplateId())
  139. .orderByAsc(AssessmentQuestion::getCategory)
  140. );
  141. Map<Long, Long> parentMap = new HashMap<>();
  142. for (AssessmentQuestion assessmentQuestion : questionList) {
  143. parentMap.put(assessmentQuestion.getId(), IdUtil.getSnowflakeNextId());
  144. }
  145. for (AssessmentQuestion assessmentQuestion : questionList) {
  146. AssessmentPlanQuestion planQuestion = BeanUtil.toBean(assessmentQuestion, AssessmentPlanQuestion.class);
  147. planQuestion.setId(parentMap.get(assessmentQuestion.getId()));
  148. planQuestion.setParentId(parentMap.get(assessmentQuestion.getParentId()));
  149. planQuestion.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  150. planQuestionMapper.insert(planQuestion);
  151. }
  152. //删除班级和学生
  153. answerClassMapper.deleteByPlanId(assessmentTemplatePlan.getId(), StpUtil.getLoginIdAsLong());
  154. studentMapper.deleteByPlanId(assessmentTemplatePlan.getId(), StpUtil.getLoginIdAsLong());
  155. //存入班级,并根据选人方式存入答题学生
  156. for (Long classId : dto.getClassIds()) {
  157. AssessmentPlanAnswerClass answerClass = new AssessmentPlanAnswerClass();
  158. answerClass.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  159. answerClass.setClassId(classId);
  160. answerClassMapper.insert(answerClass);
  161. MPJLambdaWrapper<XjrUser> query = new MPJLambdaWrapper<>();
  162. query.leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
  163. .eq(BaseStudentSchoolRoll::getClassId, classId);
  164. List<XjrUser> studentList = xjrUserMapper.selectJoinList(XjrUser.class, query);
  165. List<XjrUser> needStudentList = new ArrayList<>();
  166. if("all".equals(dto.getType())){
  167. needStudentList.addAll(studentList);
  168. }else if("random".equals(dto.getType())){
  169. int maxCount = studentList.size();//班级最大人数
  170. if(dto.getRandomNumber() > maxCount){
  171. needStudentList.addAll(studentList);
  172. }else{
  173. List<Integer> randomList = new ArrayList<>();
  174. Random random = new Random();
  175. while(randomList.size() < dto.getRandomNumber()){
  176. int nextInt = random.nextInt(studentList.size());
  177. if(!randomList.contains(nextInt) && nextInt >= 0){
  178. randomList.add(nextInt);
  179. }
  180. }
  181. for (Integer i : randomList) {
  182. needStudentList.add(studentList.get(i));
  183. }
  184. }
  185. }
  186. for (XjrUser xjrUser : needStudentList) {
  187. AssessmentPlanAnswerStudent answer = new AssessmentPlanAnswerStudent();
  188. answer.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  189. answer.setStudentUserId(xjrUser.getId());
  190. studentMapper.insert(answer);
  191. }
  192. }
  193. return true;
  194. }
  195. @Override
  196. public Boolean updateTime(UpdateAssessmentTemplatePlanTimeDto dto) {
  197. AssessmentTemplatePlan assessmentTemplatePlan = BeanUtil.toBean(dto, AssessmentTemplatePlan.class);
  198. templatePlanMapper.updateById(assessmentTemplatePlan);
  199. return true;
  200. }
  201. @Override
  202. @Transactional(rollbackFor = Exception.class)
  203. public Boolean delete(List<Long> ids) {
  204. templatePlanMapper.deleteBatchIds(ids);
  205. planQuestionMapper.delete(Wrappers.lambdaQuery(AssessmentPlanQuestion.class).in(AssessmentPlanQuestion::getAssessmentTemplatePlanId, ids));
  206. answerClassMapper.delete(Wrappers.lambdaQuery(AssessmentPlanAnswerClass.class).in(AssessmentPlanAnswerClass::getAssessmentTemplatePlanId, ids));
  207. studentMapper.delete(Wrappers.lambdaQuery(AssessmentPlanAnswerStudent.class).in(AssessmentPlanAnswerStudent::getAssessmentTemplatePlanId, ids));
  208. return true;
  209. }
  210. @Override
  211. public Page<AssessmentTemplatePlanPageVo> getPage(Page<AssessmentTemplatePlanPageVo> page, AssessmentTemplatePlanPageDto dto) {
  212. return templatePlanMapper.getPage(page, dto);
  213. }
  214. @Override
  215. public Page<AssessmentPlanAnswerPageVo> getStudentPage(Page<AssessmentPlanAnswerPageVo> page, AssessmentPlanAnswerPageDto dto) {
  216. return templatePlanMapper.getStudentPage(page, dto);
  217. }
  218. @Override
  219. public Page<AssessmentPlanAnswerPageVo> getTeacherPage(Page<AssessmentPlanAnswerPageVo> page, AssessmentPlanAnswerPageDto dto) {
  220. return templatePlanMapper.getTeacherPage(page, dto);
  221. }
  222. @Override
  223. public Boolean sure(AssessmentTemplatePlanSureDto dto) {
  224. long teacherId = StpUtil.getLoginIdAsLong();
  225. answerClassMapper.sure(dto, teacherId);
  226. studentMapper.sure(dto, teacherId);
  227. return true;
  228. }
  229. @Override
  230. public AssessmentTemplateQuestionVo getQuestionsById(Long id) {
  231. AssessmentTemplatePlan templatePlan = templatePlanMapper.selectById(id);
  232. AssessmentTemplateQuestionVo vo = BeanUtil.toBean(templatePlan, AssessmentTemplateQuestionVo.class);
  233. List<AssessmentPlanQuestion> questionList = planQuestionMapper.selectList(
  234. new QueryWrapper<AssessmentPlanQuestion>().lambda()
  235. .eq(AssessmentPlanQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  236. .eq(AssessmentPlanQuestion::getAssessmentTemplatePlanId, id)
  237. );
  238. //循环大题
  239. List<AssessmentQuestionVo> oneList = new ArrayList<>();
  240. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  241. if(assessmentQuestion.getCategory() == 1){
  242. oneList.add(BeanUtil.toBean(assessmentQuestion, AssessmentQuestionVo.class));
  243. }
  244. }
  245. //循环小题
  246. for (AssessmentQuestionVo oneQuestion : oneList) {
  247. List<AssessmentQuestionVo> twoList = new ArrayList<>();
  248. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  249. if(assessmentQuestion.getCategory() == 2 && assessmentQuestion.getParentId().equals(oneQuestion.getId())){
  250. twoList.add(BeanUtil.toBean(assessmentQuestion, AssessmentQuestionVo.class));
  251. }
  252. }
  253. oneQuestion.setChildren(twoList);
  254. }
  255. //循环选项
  256. for (AssessmentQuestionVo oneQuestion : oneList) {
  257. for (AssessmentQuestionVo twoQuestion : oneQuestion.getChildren()) {
  258. List<AssessmentQuestionVo> optionList = new ArrayList<>();
  259. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  260. if(assessmentQuestion.getCategory() == 3 && assessmentQuestion.getParentId().equals(twoQuestion.getId())){
  261. optionList.add(BeanUtil.toBean(assessmentQuestion, AssessmentQuestionVo.class));
  262. }
  263. }
  264. twoQuestion.setOptions(optionList);
  265. }
  266. }
  267. vo.setChildren(oneList);
  268. return vo;
  269. }
  270. }