LearnTeacherService.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. package com.ruoyi.web.service;
  2. import cn.hutool.core.lang.Dict;
  3. import com.google.common.collect.Maps;
  4. import com.google.common.collect.Sets;
  5. import com.ruoyi.common.annotation.Excel;
  6. import com.ruoyi.common.core.domain.TreeEntity;
  7. import com.ruoyi.common.utils.SecurityUtils;
  8. import com.ruoyi.dz.domain.DzClasses;
  9. import com.ruoyi.dz.mapper.DzClassesMapper;
  10. import com.ruoyi.enums.PaperType;
  11. import com.ruoyi.ie.domain.AMarjorPlan;
  12. import com.ruoyi.ie.mapper.AMarjorPlanMapper;
  13. import com.ruoyi.learn.domain.*;
  14. import com.ruoyi.learn.mapper.LearnDirectedKnowledgeMapper;
  15. import com.ruoyi.learn.mapper.LearnKnowledgeTreeMapper;
  16. import com.ruoyi.learn.mapper.LearnStudentMapper;
  17. import com.ruoyi.learn.mapper.LearnTestPaperMapper;
  18. import com.ruoyi.syzy.domain.BBusiWishUniversities;
  19. import com.ruoyi.syzy.mapper.BBusiWishUniversitiesMapper;
  20. import lombok.Data;
  21. import org.apache.commons.compress.utils.Lists;
  22. import org.apache.commons.lang3.ArrayUtils;
  23. import org.apache.commons.lang3.StringUtils;
  24. import org.apache.commons.lang3.tuple.Pair;
  25. import org.springframework.stereotype.Service;
  26. import org.springframework.transaction.annotation.Transactional;
  27. import org.springframework.util.CollectionUtils;
  28. import javax.validation.ValidationException;
  29. import java.util.Calendar;
  30. import java.util.List;
  31. import java.util.Map;
  32. import java.util.Set;
  33. import java.util.stream.Collectors;
  34. import java.util.stream.Stream;
  35. @Service
  36. public class LearnTeacherService {
  37. private final DzClassesMapper dzClassesMapper;
  38. private final LearnKnowledgeTreeMapper learnKnowledgeTreeMapper;
  39. private final LearnStudentMapper learnStudentMapper;
  40. private final AMarjorPlanMapper marjorPlanMapper;
  41. private final BBusiWishUniversitiesMapper busiWishUniversitiesMapper;
  42. private final LearnDirectedKnowledgeMapper learnDirectedKnowledgeMapper;
  43. private final PaperService paperService;
  44. private final LearnTestPaperMapper learnTestPaperMapper;
  45. public LearnTeacherService(DzClassesMapper dzClassesMapper, LearnKnowledgeTreeMapper learnKnowledgeTreeMapper, LearnStudentMapper learnStudentMapper, AMarjorPlanMapper marjorPlanMapper, BBusiWishUniversitiesMapper busiWishUniversitiesMapper, LearnDirectedKnowledgeMapper learnDirectedKnowledgeMapper, PaperService paperService, LearnTestPaperMapper learnTestPaperMapper) {
  46. this.dzClassesMapper = dzClassesMapper;
  47. this.learnKnowledgeTreeMapper = learnKnowledgeTreeMapper;
  48. this.learnStudentMapper = learnStudentMapper;
  49. this.marjorPlanMapper = marjorPlanMapper;
  50. this.busiWishUniversitiesMapper = busiWishUniversitiesMapper;
  51. this.learnDirectedKnowledgeMapper = learnDirectedKnowledgeMapper;
  52. this.paperService = paperService;
  53. this.learnTestPaperMapper = learnTestPaperMapper;
  54. }
  55. public List<DzClasses> getClasses(Long teacherId)
  56. {
  57. return dzClassesMapper.selectClassesForTeacher(teacherId);
  58. }
  59. public List<BBusiWishUniversities> selectUniversityList(Long teacherId, Long batchId) {
  60. return busiWishUniversitiesMapper.selectUniversityListForTeacher(teacherId, batchId);
  61. }
  62. public List<Dict> selectMajorList(Long universityId, Integer year, Long batchId) {
  63. return marjorPlanMapper.selectMajorForUniversity(universityId, year, batchId).stream().map(t -> Dict.create().set("id", t.getId()).set("majorGroup", t.getMajorGroup())
  64. .set("majorName", t.getMajorName()).set("count", t.getXuefei()).set("total", t.getPlanTotal())).collect(Collectors.toList());
  65. }
  66. @Transactional(rollbackFor = Exception.class)
  67. public String buildPapersAuto(TestPaperVO.TestPapersBuildAutoReq req) {
  68. // 查询 院校,专业组,专业计划范围, 明细一级时只有一个,否则就是批量
  69. List<LearnStudent> studentList = learnStudentMapper.selectLearnStudentsByMap(req.toMap());
  70. if(CollectionUtils.isEmpty(studentList)) {
  71. throw new ValidationException("无可用计划可检查");
  72. }
  73. Set<Long> planIdSet = Sets.newHashSet();
  74. Map<Long, List<LearnStudent>> universityMap = Maps.newHashMap();
  75. for(LearnStudent ls : studentList){
  76. planIdSet.add(ls.getMajorPlanId());
  77. List<LearnStudent> list = universityMap.get(ls.getUniversityId());
  78. if(null == list) {
  79. list = Lists.newArrayList();
  80. universityMap.put(ls.getUniversityId(), list);
  81. }
  82. list.add(ls);
  83. }
  84. // 查询已经生成的
  85. Map<Long, Map<String, LearnTestPaper>> universityDirectPaperMap = learnTestPaperMapper.selectByBatchAndUniversityIds(req.getBatchId(), universityMap.keySet()).stream()
  86. .collect(Collectors.groupingBy(LearnTestPaper::getUniversityId, Collectors.toMap(LearnTestPaper::getDirectKey, a -> a)));
  87. if(null == req.getDirectType() || !req.getDirectType()) { // 全量
  88. LearnPaper paper = new LearnPaper();
  89. paper.setPaperName(req.getTitle());
  90. paper.setYear(Calendar.getInstance().get(Calendar.YEAR));
  91. paper.setPaperType(PaperType.Test.name());
  92. paper.setSubjectId(req.getSubjectId());
  93. paper.setDirectKey("");
  94. for(Long universityId : universityMap.keySet()) {
  95. Map<String, LearnTestPaper> directPaperMap = universityDirectPaperMap.get(universityId);
  96. if(null != directPaperMap && directPaperMap.containsKey("")) {
  97. continue;
  98. }
  99. if(null == paper.getId()) {
  100. Pair<LearnPaper, List<LearnPaperQuestion>> paperResult = paperService.buildPaper(null, paper, req.getPaperDef());
  101. paperService.savePaper(paper, paperResult.getRight());
  102. }
  103. LearnTestPaper testPaper = new LearnTestPaper();
  104. testPaper.setBatchId(req.getBatchId());
  105. testPaper.setUniversityId(universityId);
  106. testPaper.setDirectKey("");
  107. testPaper.setPaperId(paper.getId());
  108. learnTestPaperMapper.insertLearnTestPaper(testPaper);
  109. }
  110. return "";
  111. }
  112. TestPaperVO.PaperDef paperDef = req.getPaperDef();
  113. if(null != req.getPlanIds() && req.getPlanIds().size() == 1) {
  114. if(!CollectionUtils.isEmpty(paperDef.getKnowIds())) {
  115. throw new ValidationException("批量时不支持自定义知识点");
  116. }
  117. }
  118. Map<Long, Map<String, LearnDirectedKnowledge>> universityDirectedKnowledgeMap = learnDirectedKnowledgeMapper.selectByUniversityIds(universityMap.keySet().toArray(new Long[universityMap.size()])).stream().collect(
  119. Collectors.groupingBy(LearnDirectedKnowledge::getUniversityId, Collectors.toMap(LearnDirectedKnowledge::getDirectKey, a -> a)));
  120. Map<Long, AMarjorPlan> planMap = marjorPlanMapper.selectAMarjorPlanByIds(planIdSet.toArray(new Long[planIdSet.size()])).stream().collect(Collectors.toMap(AMarjorPlan::getId, a -> a));
  121. LearnDirectedKnowledge directedKnowledge = null;
  122. String directedKey = null;
  123. for(Long universityId : universityMap.keySet()) {
  124. Map<String, LearnDirectedKnowledge> directedKnowledgeMap = universityDirectedKnowledgeMap.get(universityId);
  125. for(LearnStudent ls : universityMap.get(universityId)) {
  126. AMarjorPlan plan = planMap.get(ls.getMajorPlanId());
  127. String groupName = StringUtils.trimToEmpty(plan.getMajorGroup());
  128. if(CollectionUtils.isEmpty(paperDef.getKnowIds())) {
  129. if(null != (directedKnowledge = directedKnowledgeMap.get((directedKey = groupName + "_" + plan.getMajorName())))) {
  130. paperDef.setKnowIds(Stream.of(directedKnowledge.getKnowledges().split(",")).map(t -> Long.parseLong(t.trim())).collect(Collectors.toList()));
  131. } else if(null != (directedKnowledge = directedKnowledgeMap.get(directedKey = groupName))) {
  132. paperDef.setKnowIds(Stream.of(directedKnowledge.getKnowledges().split(",")).map(t -> Long.parseLong(t.trim())).collect(Collectors.toList()));
  133. } else {
  134. throw new ValidationException("院校没有配置定向知识点,生成失败: " + universityId + ":" + groupName + ":" + plan.getMajorName());
  135. }
  136. } else if(null != directedKnowledgeMap) {
  137. if(null != (directedKnowledge = directedKnowledgeMap.get((directedKey = groupName + "_" + plan.getMajorName())))) {
  138. } else if(null != (directedKnowledge = directedKnowledgeMap.get(directedKey = groupName))) {
  139. } else {
  140. throw new ValidationException("院校没有配置定向知识点,生成失败" + universityId + ":" + directedKey);
  141. }
  142. } else {
  143. throw new ValidationException("院校没有配置定向知识点,生成失败: " + universityId);
  144. }
  145. Map<String, LearnTestPaper> directPaperMap = universityDirectPaperMap.get(universityId);
  146. if(null != directPaperMap && directPaperMap.containsKey(directedKey)) {
  147. continue;
  148. }
  149. LearnPaper paper = new LearnPaper();
  150. paper.setSubjectId(req.getSubjectId());
  151. paper.setPaperName(req.getTitle());
  152. paper.setYear(plan.getYear());
  153. paper.setPaperType(PaperType.Test.name());
  154. paper.setDirectKey(directedKey);
  155. Pair<LearnPaper, List<LearnPaperQuestion>> paperResult = paperService.buildPaper(null, paper, paperDef);
  156. paperService.savePaper(paperResult.getKey(), paperResult.getValue());
  157. LearnTestPaper testPaper = new LearnTestPaper();
  158. testPaper.setBatchId(req.getBatchId());
  159. testPaper.setUniversityId(universityId);
  160. testPaper.setDirectKey(directedKey);
  161. testPaper.setPaperId(paper.getId());
  162. learnTestPaperMapper.insertLearnTestPaper(testPaper);
  163. directPaperMap.put(directedKey, testPaper);
  164. }
  165. }
  166. return "";
  167. }
  168. @Transactional(rollbackFor = Exception.class)
  169. public String buildPapersManual(TestPaperVO.TestPapersBuildManualReq req) {
  170. if(null == req.getSubjectId()) {
  171. throw new ValidationException("未选择科目");
  172. }
  173. // 查询 院校,专业组,专业计划范围, 明细一级时只有一个,否则就是批量
  174. List<LearnStudent> studentList = learnStudentMapper.selectLearnStudentsByMap(req.toMap());
  175. if(CollectionUtils.isEmpty(studentList)) {
  176. throw new ValidationException("无可用计划可检查");
  177. }
  178. Set<Long> planIdSet = Sets.newHashSet();
  179. Map<Long, List<LearnStudent>> universityMap = Maps.newHashMap();
  180. for(LearnStudent ls : studentList){
  181. planIdSet.add(ls.getMajorPlanId());
  182. List<LearnStudent> list = universityMap.get(ls.getUniversityId());
  183. if(null == list) {
  184. list = Lists.newArrayList();
  185. universityMap.put(ls.getUniversityId(), list);
  186. }
  187. list.add(ls);
  188. }
  189. // 查询已经生成的
  190. Map<Long, Map<String, LearnTestPaper>> universityDirectPaperMap = learnTestPaperMapper.selectByBatchAndUniversityIds(req.getBatchId(), universityMap.keySet()).stream()
  191. .collect(Collectors.groupingBy(LearnTestPaper::getUniversityId, Collectors.toMap(LearnTestPaper::getDirectKey, a -> a)));
  192. LearnPaper paper = new LearnPaper();
  193. paper.setPaperName(req.getTitle());
  194. paper.setYear(Calendar.getInstance().get(Calendar.YEAR));
  195. paper.setPaperType(PaperType.Test.name());
  196. if(null == req.getDirectType() || !req.getDirectType()) { // 全量
  197. paper.setSubjectId(req.getSubjectId());
  198. paper.setDirectKey("");
  199. for(Long universityId : universityMap.keySet()) {
  200. Map<String, LearnTestPaper> directPaperMap = universityDirectPaperMap.get(universityId);
  201. if(null != directPaperMap && directPaperMap.containsKey("")) {
  202. continue;
  203. }
  204. if(null == paper.getId()) {
  205. paperService.savePaper(paper, req.getQuestions());
  206. }
  207. LearnTestPaper testPaper = new LearnTestPaper();
  208. testPaper.setBatchId(req.getBatchId());
  209. testPaper.setUniversityId(universityId);
  210. testPaper.setDirectKey("");
  211. testPaper.setPaperId(paper.getId());
  212. testPaper.setConditions("");
  213. testPaper.setCreatorId(SecurityUtils.getUserId());
  214. learnTestPaperMapper.insertLearnTestPaper(testPaper);
  215. }
  216. return "";
  217. } // 定向
  218. // 准备定向数据
  219. Map<Long, Map<String, LearnDirectedKnowledge>> universityDirectedKnowledgeMap = learnDirectedKnowledgeMapper.selectByUniversityIds(universityMap.keySet().toArray(new Long[universityMap.size()])).stream().collect(
  220. Collectors.groupingBy(LearnDirectedKnowledge::getUniversityId, Collectors.toMap(LearnDirectedKnowledge::getDirectKey, a -> a)));
  221. Map<Long, AMarjorPlan> planMap = marjorPlanMapper.selectAMarjorPlanByIds(planIdSet.toArray(new Long[planIdSet.size()])).stream().collect(Collectors.toMap(AMarjorPlan::getId, a -> a));
  222. String directedKey = null;
  223. for(Long universityId : universityMap.keySet()) {
  224. Map<String, LearnTestPaper> directPaperMap = universityDirectPaperMap.get(universityId);
  225. Map<String, LearnDirectedKnowledge> directedKnowledgeMap = universityDirectedKnowledgeMap.get(universityId);
  226. for(LearnStudent ls : universityMap.get(universityId)) { // Group+Name
  227. AMarjorPlan plan = planMap.get(ls.getMajorPlanId());
  228. String groupName = StringUtils.trimToEmpty(plan.getMajorGroup());
  229. if(null != (directedKnowledgeMap.get(directedKey = groupName + "_" + plan.getMajorName()))) {
  230. if(null != directPaperMap.get(directedKey)) {
  231. continue;
  232. }
  233. } else if(null != directedKnowledgeMap.get(directedKey = groupName)) {
  234. if(null != directPaperMap.get(directedKey)) {
  235. continue;
  236. }
  237. } else {
  238. continue;
  239. }
  240. if(null == paper.getId()) {
  241. paperService.savePaper(paper, req.getQuestions());
  242. }
  243. LearnTestPaper testPaper = new LearnTestPaper();
  244. testPaper.setBatchId(req.getBatchId());
  245. testPaper.setUniversityId(universityId);
  246. testPaper.setDirectKey(directedKey);
  247. testPaper.setPaperId(paper.getId());
  248. learnTestPaperMapper.insertLearnTestPaper(testPaper);
  249. directPaperMap.put(directedKey, testPaper);
  250. }
  251. }
  252. return "";
  253. }
  254. public List<TreeNode> getKnowledgeTree(Long subjectId, Long[] planIds) {
  255. Set<Long> knowledgeIdSet = Sets.newHashSet();
  256. if(ArrayUtils.isNotEmpty(planIds)) {
  257. List<AMarjorPlan> planList = marjorPlanMapper.selectAMarjorPlanByIds(planIds);
  258. AMarjorPlan curr = planList.get(0);
  259. LearnDirectedKnowledge dkCond = new LearnDirectedKnowledge();
  260. dkCond.setUniversityId(curr.getUniversityId());
  261. dkCond.setYear(curr.getYear());
  262. Map<String, LearnDirectedKnowledge> directedKnowledgeMap = learnDirectedKnowledgeMapper.selectLearnDirectedKnowledgeList(dkCond).stream().collect(Collectors.toMap(LearnDirectedKnowledge::getDirectKey, t -> t));
  263. LearnDirectedKnowledge directedKnowledge = null;
  264. for(AMarjorPlan plan : planList) {
  265. String groupName = StringUtils.trimToEmpty(plan.getMajorGroup());
  266. if(null != (directedKnowledge = directedKnowledgeMap.get(groupName + "_" + plan.getMajorName()))) {
  267. knowledgeIdSet.addAll(Stream.of(directedKnowledge.getKnowledges().split(",")).map(t -> Long.parseLong(t.trim())).collect(Collectors.toList()));
  268. } else if(null != (directedKnowledge = directedKnowledgeMap.get(groupName))) {
  269. knowledgeIdSet.addAll(Stream.of(directedKnowledge.getKnowledges().split(",")).map(t -> Long.parseLong(t.trim())).collect(Collectors.toList()));
  270. }
  271. }
  272. }
  273. LearnKnowledgeTree ktCond = new LearnKnowledgeTree();
  274. ktCond.setSubjectId(subjectId);
  275. List<LearnKnowledgeTree> ktList = learnKnowledgeTreeMapper.selectLearnKnowledgeTreeList(ktCond);
  276. List<TreeNode> treeNodeList = Lists.newArrayList();
  277. Map<Long, TreeNode> teMap = ktList.stream().collect(Collectors.toMap(LearnKnowledgeTree::getId, t -> new TreeNode(t.getId(), t.getName())));
  278. for(LearnKnowledgeTree kt : ktList) {
  279. if(null == kt.getPid()) {
  280. treeNodeList.add(teMap.get(kt.getId()));
  281. continue;
  282. }
  283. teMap.get(kt.getPid()).getChildren().add(teMap.get(kt.getId()));
  284. }
  285. for(TreeNode tn : treeNodeList) {
  286. tn.setChecked(knowledgeIdSet);
  287. }
  288. return treeNodeList;
  289. }
  290. @Data
  291. public static class TreeNode {
  292. private Long id;
  293. private String name;
  294. private Integer status;
  295. List<TreeNode> children = Lists.newArrayList();
  296. public TreeNode(Long id, String name) {
  297. this.id = id;
  298. this.name = name;
  299. this.status = 0;
  300. }
  301. public boolean setChecked(Set<Long> idSet) {
  302. boolean checkSelf = idSet.contains(id);
  303. if(CollectionUtils.isEmpty(children)) {
  304. this.status = checkSelf ? 1 : 0;
  305. return true;
  306. }
  307. int count = 0;
  308. for(TreeNode tn : children) {
  309. if(checkSelf || idSet.contains(tn.getId())) {
  310. tn.setStatus(1);
  311. count++;
  312. }
  313. }
  314. if(children.size() == count) {
  315. this.status = 1;
  316. return true;
  317. }
  318. return false;
  319. }
  320. }
  321. }