AssessmentTemplatePlanServiceImpl.java 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544
  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 cn.hutool.core.util.StrUtil;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  9. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  10. import com.github.yulichang.base.MPJBaseServiceImpl;
  11. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  12. import com.xjrsoft.common.enums.DeleteMark;
  13. import com.xjrsoft.common.utils.VoToColumnUtil;
  14. import com.xjrsoft.config.CommonPropertiesConfig;
  15. import com.xjrsoft.module.assessment.dto.AddAssessmentTemplatePlanDto;
  16. import com.xjrsoft.module.assessment.dto.AssessmentPlanAnswerPageDto;
  17. import com.xjrsoft.module.assessment.dto.AssessmentPlanAnswerStudentDto;
  18. import com.xjrsoft.module.assessment.dto.AssessmentPlanAnswerSubmitDto;
  19. import com.xjrsoft.module.assessment.dto.AssessmentPlanSubmitDto;
  20. import com.xjrsoft.module.assessment.dto.AssessmentQuestionResultDto;
  21. import com.xjrsoft.module.assessment.dto.AssessmentTemplatePlanPageDto;
  22. import com.xjrsoft.module.assessment.dto.AssessmentTemplatePlanSureDto;
  23. import com.xjrsoft.module.assessment.dto.UpdateAssessmentTemplatePlanDto;
  24. import com.xjrsoft.module.assessment.dto.UpdateAssessmentTemplatePlanTimeDto;
  25. import com.xjrsoft.module.assessment.entity.AssessmentPlanAnswerClass;
  26. import com.xjrsoft.module.assessment.entity.AssessmentPlanAnswerResult;
  27. import com.xjrsoft.module.assessment.entity.AssessmentPlanAnswerStudent;
  28. import com.xjrsoft.module.assessment.entity.AssessmentPlanQuestion;
  29. import com.xjrsoft.module.assessment.entity.AssessmentQuestion;
  30. import com.xjrsoft.module.assessment.entity.AssessmentTemplate;
  31. import com.xjrsoft.module.assessment.entity.AssessmentTemplatePlan;
  32. import com.xjrsoft.module.assessment.mapper.AssessmentPlanAnswerClassMapper;
  33. import com.xjrsoft.module.assessment.mapper.AssessmentPlanAnswerResultMapper;
  34. import com.xjrsoft.module.assessment.mapper.AssessmentPlanAnswerStudentMapper;
  35. import com.xjrsoft.module.assessment.mapper.AssessmentPlanQuestionMapper;
  36. import com.xjrsoft.module.assessment.mapper.AssessmentQuestionMapper;
  37. import com.xjrsoft.module.assessment.mapper.AssessmentTemplateMapper;
  38. import com.xjrsoft.module.assessment.mapper.AssessmentTemplatePlanMapper;
  39. import com.xjrsoft.module.assessment.service.IAssessmentTemplatePlanService;
  40. import com.xjrsoft.module.assessment.vo.AssessmentPlanAnswerClassResultVo;
  41. import com.xjrsoft.module.assessment.vo.AssessmentPlanAnswerDetailVo;
  42. import com.xjrsoft.module.assessment.vo.AssessmentPlanAnswerStudentPageVo;
  43. import com.xjrsoft.module.assessment.vo.AssessmentPlanAnswerStudentVo;
  44. import com.xjrsoft.module.assessment.vo.AssessmentPlanAnswerTeacherPageVo;
  45. import com.xjrsoft.module.assessment.vo.AssessmentQuestionOptionResultVo;
  46. import com.xjrsoft.module.assessment.vo.AssessmentQuestionResultVo;
  47. import com.xjrsoft.module.assessment.vo.AssessmentQuestionVo;
  48. import com.xjrsoft.module.assessment.vo.AssessmentTemplatePlanPageVo;
  49. import com.xjrsoft.module.assessment.vo.AssessmentTemplatePlanQuestionVo;
  50. import com.xjrsoft.module.assessment.vo.AssessmentTemplatePlanResultVo;
  51. import com.xjrsoft.module.assessment.vo.OneQuestionVo;
  52. import com.xjrsoft.module.assessment.vo.TwoQuestionVo;
  53. import com.xjrsoft.module.base.entity.BaseClass;
  54. import com.xjrsoft.module.base.mapper.BaseClassMapper;
  55. import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
  56. import com.xjrsoft.module.organization.service.IWeChatService;
  57. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  58. import com.xjrsoft.module.teacher.entity.XjrUser;
  59. import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
  60. import lombok.AllArgsConstructor;
  61. import org.springframework.stereotype.Service;
  62. import org.springframework.transaction.annotation.Transactional;
  63. import java.text.SimpleDateFormat;
  64. import java.util.ArrayList;
  65. import java.util.Date;
  66. import java.util.HashMap;
  67. import java.util.List;
  68. import java.util.Map;
  69. import java.util.Random;
  70. /**
  71. * @title: 考核计划
  72. * @Author dzx
  73. * @Date: 2024-04-01
  74. * @Version 1.0
  75. */
  76. @Service
  77. @AllArgsConstructor
  78. public
  79. class AssessmentTemplatePlanServiceImpl extends MPJBaseServiceImpl<AssessmentTemplatePlanMapper, AssessmentTemplatePlan> implements IAssessmentTemplatePlanService {
  80. private final AssessmentTemplatePlanMapper templatePlanMapper;
  81. private final AssessmentPlanQuestionMapper planQuestionMapper;
  82. private final AssessmentPlanAnswerClassMapper answerClassMapper;
  83. private final AssessmentPlanAnswerStudentMapper studentMapper;
  84. private final AssessmentTemplateMapper assessmentTemplateMapper;
  85. private final AssessmentQuestionMapper questionMapper;
  86. private final AssessmentPlanAnswerResultMapper resultMapper;
  87. private final XjrUserMapper xjrUserMapper;
  88. private final IWeChatService weChatService;
  89. private final CommonPropertiesConfig commonPropertiesConfig;
  90. private final BaseClassMapper baseClassMapper;
  91. @Override
  92. @Transactional(rollbackFor = Exception.class)
  93. public Boolean add(AddAssessmentTemplatePlanDto dto) {
  94. AssessmentTemplate template = assessmentTemplateMapper.selectById(dto.getAssessmentTemplateId());
  95. AssessmentTemplatePlan assessmentTemplatePlan = BeanUtil.toBean(dto, AssessmentTemplatePlan.class);
  96. assessmentTemplatePlan.setScore(template.getScore());
  97. templatePlanMapper.insert(assessmentTemplatePlan);
  98. //查询模板下面的题目信息
  99. List<AssessmentQuestion> questionList = questionMapper.selectList(
  100. new QueryWrapper<AssessmentQuestion>().lambda()
  101. .eq(AssessmentQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  102. .eq(AssessmentQuestion::getAssessmentTemplateId, dto.getAssessmentTemplateId())
  103. );
  104. Map<Long, Long> parentMap = new HashMap<>();
  105. for (AssessmentQuestion assessmentQuestion : questionList) {
  106. parentMap.put(assessmentQuestion.getId(), IdUtil.getSnowflakeNextId());
  107. }
  108. for (AssessmentQuestion assessmentQuestion : questionList) {
  109. AssessmentPlanQuestion planQuestion = BeanUtil.toBean(assessmentQuestion, AssessmentPlanQuestion.class);
  110. planQuestion.setId(parentMap.get(assessmentQuestion.getId()));
  111. planQuestion.setParentId(parentMap.get(assessmentQuestion.getParentId()));
  112. planQuestion.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  113. planQuestionMapper.insert(planQuestion);
  114. }
  115. List<BaseClass> classList = baseClassMapper.selectList(
  116. new QueryWrapper<BaseClass>().lambda()
  117. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  118. .eq(BaseClass::getIsGraduate, 1)
  119. );
  120. List<Long> classIds = new ArrayList<>();
  121. if("all".equals(dto.getType())){
  122. for (BaseClass baseClass : classList) {
  123. classIds.add(baseClass.getId());
  124. }
  125. }else if("random".equals(dto.getType())){
  126. List<Integer> randomList = new ArrayList<>();
  127. Random random = new Random();
  128. while(randomList.size() < dto.getRandomNumber()){
  129. int nextInt = random.nextInt(classList.size());
  130. if(!randomList.contains(nextInt) && nextInt >= 0){
  131. randomList.add(nextInt);
  132. }
  133. }
  134. for (Integer i : randomList) {
  135. classIds.add(classList.get(i).getId());
  136. }
  137. }
  138. dto.setClassIds(classIds);
  139. //存入班级,并根据选人方式存入答题学生
  140. for (Long classId : dto.getClassIds()) {
  141. AssessmentPlanAnswerClass answerClass = new AssessmentPlanAnswerClass();
  142. answerClass.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  143. answerClass.setClassId(classId);
  144. answerClassMapper.insert(answerClass);
  145. MPJLambdaWrapper<XjrUser> query = new MPJLambdaWrapper<>();
  146. query.leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
  147. .eq(BaseStudentSchoolRoll::getClassId, classId);
  148. List<XjrUser> studentList = xjrUserMapper.selectJoinList(XjrUser.class, query);
  149. for (XjrUser xjrUser : studentList) {
  150. AssessmentPlanAnswerStudent answer = new AssessmentPlanAnswerStudent();
  151. answer.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  152. answer.setStudentUserId(xjrUser.getId());
  153. studentMapper.insert(answer);
  154. }
  155. }
  156. return true;
  157. }
  158. @Override
  159. @Transactional(rollbackFor = Exception.class)
  160. public Boolean update(UpdateAssessmentTemplatePlanDto dto) {
  161. AssessmentTemplate template = assessmentTemplateMapper.selectById(dto.getAssessmentTemplateId());
  162. AssessmentTemplatePlan assessmentTemplatePlan = BeanUtil.toBean(dto, AssessmentTemplatePlan.class);
  163. assessmentTemplatePlan.setScore(template.getScore());
  164. templatePlanMapper.updateById(assessmentTemplatePlan);
  165. //删除以前的题目
  166. planQuestionMapper.deleteByPlanId(assessmentTemplatePlan.getId(), StpUtil.getLoginIdAsLong());
  167. //查询模板下面的题目信息
  168. List<AssessmentQuestion> questionList = questionMapper.selectList(
  169. new QueryWrapper<AssessmentQuestion>().lambda()
  170. .eq(AssessmentQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  171. .eq(AssessmentQuestion::getAssessmentTemplateId, dto.getAssessmentTemplateId())
  172. .orderByAsc(AssessmentQuestion::getCategory)
  173. );
  174. Map<Long, Long> parentMap = new HashMap<>();
  175. for (AssessmentQuestion assessmentQuestion : questionList) {
  176. parentMap.put(assessmentQuestion.getId(), IdUtil.getSnowflakeNextId());
  177. }
  178. for (AssessmentQuestion assessmentQuestion : questionList) {
  179. AssessmentPlanQuestion planQuestion = BeanUtil.toBean(assessmentQuestion, AssessmentPlanQuestion.class);
  180. planQuestion.setId(parentMap.get(assessmentQuestion.getId()));
  181. planQuestion.setParentId(parentMap.get(assessmentQuestion.getParentId()));
  182. planQuestion.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  183. planQuestionMapper.insert(planQuestion);
  184. }
  185. //删除班级和学生
  186. answerClassMapper.deleteByPlanId(assessmentTemplatePlan.getId(), StpUtil.getLoginIdAsLong());
  187. studentMapper.deleteByPlanId(assessmentTemplatePlan.getId(), StpUtil.getLoginIdAsLong());
  188. List<BaseClass> classList = baseClassMapper.selectList(
  189. new QueryWrapper<BaseClass>().lambda()
  190. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  191. .eq(BaseClass::getIsGraduate, 1)
  192. );
  193. List<Long> classIds = new ArrayList<>();
  194. if("all".equals(dto.getType())){
  195. for (BaseClass baseClass : classList) {
  196. classIds.add(baseClass.getId());
  197. }
  198. }else if("random".equals(dto.getType())){
  199. List<Integer> randomList = new ArrayList<>();
  200. Random random = new Random();
  201. while(randomList.size() < dto.getRandomNumber()){
  202. int nextInt = random.nextInt(classList.size());
  203. if(!randomList.contains(nextInt) && nextInt >= 0){
  204. randomList.add(nextInt);
  205. }
  206. }
  207. for (Integer i : randomList) {
  208. classIds.add(classList.get(i).getId());
  209. }
  210. }
  211. dto.setClassIds(classIds);
  212. //存入班级,并根据选人方式存入答题学生
  213. for (Long classId : dto.getClassIds()) {
  214. AssessmentPlanAnswerClass answerClass = new AssessmentPlanAnswerClass();
  215. answerClass.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  216. answerClass.setClassId(classId);
  217. answerClassMapper.insert(answerClass);
  218. MPJLambdaWrapper<XjrUser> query = new MPJLambdaWrapper<>();
  219. query.leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
  220. .eq(BaseStudentSchoolRoll::getClassId, classId);
  221. List<XjrUser> studentList = xjrUserMapper.selectJoinList(XjrUser.class, query);
  222. for (XjrUser xjrUser : studentList) {
  223. AssessmentPlanAnswerStudent answer = new AssessmentPlanAnswerStudent();
  224. answer.setAssessmentTemplatePlanId(assessmentTemplatePlan.getId());
  225. answer.setStudentUserId(xjrUser.getId());
  226. studentMapper.insert(answer);
  227. }
  228. }
  229. return true;
  230. }
  231. @Override
  232. public Boolean updateTime(UpdateAssessmentTemplatePlanTimeDto dto) {
  233. AssessmentTemplatePlan assessmentTemplatePlan = BeanUtil.toBean(dto, AssessmentTemplatePlan.class);
  234. templatePlanMapper.updateById(assessmentTemplatePlan);
  235. return true;
  236. }
  237. @Override
  238. @Transactional(rollbackFor = Exception.class)
  239. public Boolean delete(List<Long> ids) {
  240. templatePlanMapper.deleteBatchIds(ids);
  241. planQuestionMapper.delete(Wrappers.lambdaQuery(AssessmentPlanQuestion.class).in(AssessmentPlanQuestion::getAssessmentTemplatePlanId, ids));
  242. answerClassMapper.delete(Wrappers.lambdaQuery(AssessmentPlanAnswerClass.class).in(AssessmentPlanAnswerClass::getAssessmentTemplatePlanId, ids));
  243. studentMapper.delete(Wrappers.lambdaQuery(AssessmentPlanAnswerStudent.class).in(AssessmentPlanAnswerStudent::getAssessmentTemplatePlanId, ids));
  244. return true;
  245. }
  246. @Override
  247. public Page<AssessmentTemplatePlanPageVo> getPage(Page<AssessmentTemplatePlanPageVo> page, AssessmentTemplatePlanPageDto dto) {
  248. return templatePlanMapper.getPage(page, dto);
  249. }
  250. @Override
  251. public Page<AssessmentPlanAnswerStudentPageVo> getStudentPage(Page<AssessmentPlanAnswerStudentPageVo> page, AssessmentPlanAnswerPageDto dto) {
  252. return templatePlanMapper.getStudentPage(page, dto);
  253. }
  254. @Override
  255. public Page<AssessmentPlanAnswerTeacherPageVo> getTeacherPage(Page<AssessmentPlanAnswerTeacherPageVo> page, AssessmentPlanAnswerPageDto dto) {
  256. return templatePlanMapper.getTeacherPage(page, dto);
  257. }
  258. @Override
  259. public Boolean sure(AssessmentTemplatePlanSureDto dto) {
  260. long teacherId = StpUtil.getLoginIdAsLong();
  261. answerClassMapper.sure(dto, teacherId);
  262. studentMapper.sure(dto, teacherId);
  263. return true;
  264. }
  265. @Override
  266. public AssessmentTemplatePlanQuestionVo getQuestionsById(Long id) {
  267. AssessmentTemplatePlan templatePlan = templatePlanMapper.selectById(id);
  268. AssessmentTemplatePlanQuestionVo vo = BeanUtil.toBean(templatePlan, AssessmentTemplatePlanQuestionVo.class);
  269. List<AssessmentPlanQuestion> questionList = planQuestionMapper.selectList(
  270. new QueryWrapper<AssessmentPlanQuestion>().lambda()
  271. .eq(AssessmentPlanQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  272. .eq(AssessmentPlanQuestion::getAssessmentTemplatePlanId, id)
  273. );
  274. Integer submitStatus = studentMapper.getSubmitStatus(id, StpUtil.getLoginIdAsLong());
  275. vo.setSubmitStatus(submitStatus);
  276. AssessmentQuestionResultDto resultDto = new AssessmentQuestionResultDto();
  277. resultDto.setAssessmentTemplatePlanId(id);
  278. resultDto.setUserId(StpUtil.getLoginIdAsLong());
  279. List<AssessmentQuestionResultVo> resultList = resultMapper.getResultList(resultDto);
  280. Map<Long, String> resultMap = new HashMap<>();
  281. for (AssessmentQuestionResultVo resultVo : resultList) {
  282. resultMap.put(resultVo.getQuestionId(), resultVo.getAnswer());
  283. }
  284. //循环大题
  285. List<AssessmentQuestionVo> oneList = new ArrayList<>();
  286. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  287. if(assessmentQuestion.getCategory() == 1){
  288. oneList.add(BeanUtil.toBean(assessmentQuestion, AssessmentQuestionVo.class));
  289. }
  290. }
  291. //循环小题
  292. for (AssessmentQuestionVo oneQuestion : oneList) {
  293. List<AssessmentQuestionVo> twoList = new ArrayList<>();
  294. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  295. if(assessmentQuestion.getCategory() == 2 && assessmentQuestion.getParentId().equals(oneQuestion.getId())){
  296. AssessmentQuestionVo questionVo = BeanUtil.toBean(assessmentQuestion, AssessmentQuestionVo.class);
  297. questionVo.setValue(resultMap.get(questionVo.getId()));
  298. twoList.add(questionVo);
  299. }
  300. }
  301. oneQuestion.setChildren(twoList);
  302. }
  303. //循环选项
  304. for (AssessmentQuestionVo oneQuestion : oneList) {
  305. for (AssessmentQuestionVo twoQuestion : oneQuestion.getChildren()) {
  306. List<AssessmentQuestionVo> optionList = new ArrayList<>();
  307. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  308. if(assessmentQuestion.getCategory() == 3 && assessmentQuestion.getParentId().equals(twoQuestion.getId())){
  309. optionList.add(BeanUtil.toBean(assessmentQuestion, AssessmentQuestionVo.class));
  310. }
  311. }
  312. twoQuestion.setOptions(optionList);
  313. }
  314. }
  315. vo.setChildren(oneList);
  316. return vo;
  317. }
  318. @Override
  319. public Boolean saveAnswer(AssessmentPlanSubmitDto dto) {
  320. long studentUserId = StpUtil.getLoginIdAsLong();
  321. Date date = new Date();
  322. List<Long> questionIds = new ArrayList<>();
  323. for (AssessmentPlanAnswerSubmitDto answerSubmitDto : dto.getAnswerList()) {
  324. questionIds.add(answerSubmitDto.getQuestionId());
  325. }
  326. Map<Long, String> questionTypeMaps = new HashMap<>();
  327. planQuestionMapper.selectList(
  328. new QueryWrapper<AssessmentPlanQuestion>().lambda()
  329. .in(AssessmentPlanQuestion::getId, questionIds)
  330. ).forEach(question ->{
  331. questionTypeMaps.put(question.getId(), question.getType());
  332. });
  333. // 学生提交
  334. studentMapper.submitAnswer(dto.getAssessmentTemplatePlanId(), studentUserId);
  335. for (AssessmentPlanAnswerSubmitDto answerSubmitDto : dto.getAnswerList()) {
  336. if("multi_question".equals(questionTypeMaps.get(answerSubmitDto.getQuestionId()))){
  337. String[] split = answerSubmitDto.getAnswerId().split(",");
  338. for (String answerId : split) {
  339. AssessmentPlanAnswerResult answerStudent = new AssessmentPlanAnswerResult();
  340. answerStudent.setAssessmentTemplatePlanId(dto.getAssessmentTemplatePlanId());
  341. answerStudent.setStudentUserId(studentUserId);
  342. answerStudent.setCreateDate(date);
  343. answerStudent.setQuestionId(answerSubmitDto.getQuestionId());
  344. answerStudent.setAnswerId(answerId);
  345. resultMapper.insert(answerStudent);
  346. }
  347. }else{
  348. AssessmentPlanAnswerResult answerStudent = new AssessmentPlanAnswerResult();
  349. answerStudent.setAssessmentTemplatePlanId(dto.getAssessmentTemplatePlanId());
  350. answerStudent.setStudentUserId(studentUserId);
  351. answerStudent.setCreateDate(date);
  352. answerStudent.setQuestionId(answerSubmitDto.getQuestionId());
  353. answerStudent.setAnswerId(answerSubmitDto.getAnswerId());
  354. resultMapper.insert(answerStudent);
  355. }
  356. }
  357. return true;
  358. }
  359. @Override
  360. public List<AssessmentTemplatePlanPageVo> getMobilePage(AssessmentTemplatePlanPageDto dto) {
  361. return templatePlanMapper.getMobilePage(dto);
  362. }
  363. @Override
  364. public List<AssessmentPlanAnswerStudentVo> getAnswerStudent(AssessmentPlanAnswerStudentDto dto) {
  365. List<String> roleList = StpUtil.getRoleList();
  366. if(roleList.size() == 2 && roleList.contains("CLASSTE") && roleList.contains("TEACHER")){
  367. dto.setTeacherId(StpUtil.getLoginIdAsLong());
  368. }
  369. return templatePlanMapper.getAnswerStudent(dto);
  370. }
  371. @Override
  372. public List<Long> getSemesterClass(Long id) {
  373. return templatePlanMapper.getSemesterClass(id);
  374. }
  375. @Override
  376. public List<AssessmentPlanAnswerClassResultVo> getClassResult(Long id) {
  377. return resultMapper.getClassResult(id);
  378. }
  379. @Override
  380. public AssessmentTemplatePlanResultVo getQuestionResult(Long id) {
  381. AssessmentTemplatePlan templatePlan = templatePlanMapper.selectById(id);
  382. AssessmentTemplatePlanResultVo vo = BeanUtil.toBean(templatePlan, AssessmentTemplatePlanResultVo.class);
  383. vo.setStudentCount(studentMapper.getStudentCount(id));
  384. List<AssessmentPlanQuestion> questionList = planQuestionMapper.selectList(
  385. new QueryWrapper<AssessmentPlanQuestion>().lambda()
  386. .eq(AssessmentPlanQuestion::getDeleteMark, DeleteMark.NODELETE.getCode())
  387. .eq(AssessmentPlanQuestion::getAssessmentTemplatePlanId, id)
  388. );
  389. //循环大题
  390. List<OneQuestionVo> oneList = new ArrayList<>();
  391. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  392. if(assessmentQuestion.getCategory() == 1){
  393. oneList.add(BeanUtil.toBean(assessmentQuestion, OneQuestionVo.class));
  394. }
  395. }
  396. //循环小题
  397. for (OneQuestionVo oneQuestion : oneList) {
  398. List<TwoQuestionVo> twoList = new ArrayList<>();
  399. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  400. if(assessmentQuestion.getCategory() == 2 && assessmentQuestion.getParentId().equals(oneQuestion.getId())){
  401. TwoQuestionVo questionVo = BeanUtil.toBean(assessmentQuestion, TwoQuestionVo.class);
  402. twoList.add(questionVo);
  403. }
  404. }
  405. oneQuestion.setChildren(twoList);
  406. }
  407. List<AssessmentPlanAnswerDetailVo> questionResult = resultMapper.getQuestionResult(id);
  408. Map<String, Integer> answerCountMap = new HashMap<>();
  409. for (AssessmentPlanAnswerDetailVo countVo : questionResult) {
  410. answerCountMap.put(countVo.getQuestionId().toString() + countVo.getAnswerId(), countVo.getChooseCount());
  411. }
  412. //量表
  413. List<AssessmentPlanAnswerDetailVo> scaleQuestionResult = resultMapper.getScaleQuestionResult(id);
  414. //循环选项
  415. for (OneQuestionVo oneQuestion : oneList) {
  416. for (TwoQuestionVo twoQuestion : oneQuestion.getChildren()) {
  417. List<AssessmentQuestionOptionResultVo> optionList = new ArrayList<>();
  418. if("radio_question".equals(twoQuestion.getType()) || "multi_question".equals(twoQuestion.getType())){
  419. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  420. if(assessmentQuestion.getCategory() == 3 && assessmentQuestion.getParentId().equals(twoQuestion.getId())){
  421. AssessmentQuestionOptionResultVo questionVo = BeanUtil.toBean(assessmentQuestion, AssessmentQuestionOptionResultVo.class);
  422. Integer count = answerCountMap.get(assessmentQuestion.getParentId().toString() + assessmentQuestion.getId().toString());
  423. questionVo.setCount(count == null?0:count);
  424. questionVo.setPercentage(vo.getStudentCount());
  425. optionList.add(questionVo);
  426. }
  427. }
  428. }else if("judge_question".equals(twoQuestion.getType())){
  429. optionList.add(new AssessmentQuestionOptionResultVo(){{
  430. setName("是");
  431. Integer count = answerCountMap.get(twoQuestion.getId().toString() + "1");
  432. setPercentage(vo.getStudentCount());
  433. setCount(count == null?0:count);
  434. }});
  435. optionList.add(new AssessmentQuestionOptionResultVo(){{
  436. setName("否");
  437. Integer count = answerCountMap.get(twoQuestion.getId().toString() + "2");
  438. setPercentage(vo.getStudentCount());
  439. setCount(count == null?0:count);
  440. }});
  441. }else if("scale_question".equals(twoQuestion.getType())) {
  442. for (AssessmentPlanAnswerDetailVo detailVo : scaleQuestionResult) {
  443. if(detailVo.getQuestionId().equals(twoQuestion.getId())){
  444. optionList.add(new AssessmentQuestionOptionResultVo(){{
  445. setName(detailVo.getAnswerId());
  446. Integer count = detailVo.getChooseCount();
  447. setPercentage(vo.getStudentCount());
  448. setCount(count == null?0:count);
  449. }});
  450. }
  451. }
  452. }else if("text_question".equals(twoQuestion.getType())) {
  453. for (AssessmentPlanQuestion assessmentQuestion : questionList) {
  454. if(assessmentQuestion.getCategory() == 3 && assessmentQuestion.getParentId().equals(twoQuestion.getId())){
  455. AssessmentQuestionOptionResultVo questionVo = BeanUtil.toBean(assessmentQuestion, AssessmentQuestionOptionResultVo.class);
  456. Integer count = answerCountMap.get(assessmentQuestion.getParentId().toString() + assessmentQuestion.getId().toString());
  457. questionVo.setCount(count == null?0:count);
  458. questionVo.setPercentage(vo.getStudentCount());
  459. optionList.add(questionVo);
  460. }
  461. }
  462. }
  463. twoQuestion.setResultList(optionList);
  464. }
  465. }
  466. vo.setChildren(oneList);
  467. return vo;
  468. }
  469. @Override
  470. public Boolean sendMsg(AssessmentTemplatePlanSureDto dto) {
  471. //先查询班上的所有学生
  472. MPJLambdaWrapper<XjrUser> queryWrapper = new MPJLambdaWrapper<>();
  473. queryWrapper
  474. .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
  475. .innerJoin(AssessmentPlanAnswerStudent.class, AssessmentPlanAnswerStudent::getStudentUserId,XjrUser::getId)
  476. .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId,XjrUser::getId)
  477. .eq(BaseStudentSchoolRoll::getClassId , dto.getClassId())
  478. .eq(AssessmentPlanAnswerStudent::getAssessmentTemplatePlanId , dto.getId())
  479. .disableSubLogicDel();
  480. List<XjrUser> userList = xjrUserMapper.selectJoinList(XjrUser.class, queryWrapper);
  481. AssessmentTemplatePlan templatePlan = templatePlanMapper.selectById(dto.getId());
  482. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
  483. for (XjrUser user : userList) {
  484. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  485. weChatSendMessageDto.setUserId(user.getOpenId());
  486. weChatSendMessageDto.setTemplateId("ehYfXni7exZUmt6dJX4Ukbm9ETarFfKLfXVYwNnjKMc");
  487. weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/student/canteen/evaluate?id={}", commonPropertiesConfig.getDomainApp(), dto.getId()));
  488. weChatSendMessageDto.setMsgId(dto.getId().toString());
  489. JSONObject data = new JSONObject();
  490. data.put("thing1.DATA", templatePlan.getName());
  491. data.put("time2.DATA", sdf.format(templatePlan.getStartTime()));
  492. data.put("time3.DATA", sdf.format(templatePlan.getEndTime()));
  493. data.put("thing5.DATA", "test");
  494. data.put("thing8.DATA", "test");
  495. weChatSendMessageDto.setContent(data);
  496. weChatService.sendTemplateMessage(weChatSendMessageDto);
  497. }
  498. return true;
  499. }
  500. }