KmtExerciseSubmitServiceImpl.java 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814
  1. package com.aijia.kmt.service.impl;
  2. import com.aijia.core.utils.StringUtil;
  3. import com.aijia.core.web.ResponseConstant;
  4. import com.aijia.core.web.ResponseEntity;
  5. import com.aijia.kmt.common.taskthread.AijiaThreadPool;
  6. import com.aijia.kmt.dto.KnowHowDetailsDTO;
  7. import com.aijia.kmt.dto.exercise.ExerciseQuestionAnswerValue;
  8. import com.aijia.kmt.dto.knowledge.KnowledgeBaseDto;
  9. import com.aijia.kmt.enums.ProofreadStatusEnum;
  10. import com.aijia.kmt.es.service.ExerciseQuestionSearchService;
  11. import com.aijia.kmt.es.service.base.BaseSearchService;
  12. import com.aijia.kmt.mapper.*;
  13. import com.aijia.kmt.po.KmtExerciseBook;
  14. import com.aijia.kmt.po.KmtExerciseQuestion;
  15. import com.aijia.kmt.po.KmtExerciseQuestionKnow;
  16. import com.aijia.kmt.po.base.IdWorker;
  17. import com.aijia.kmt.po.knowledge.ZuoybKnowHowDetailsSort;
  18. import com.aijia.kmt.po.user.TbLibManager;
  19. import com.aijia.kmt.po.user.User;
  20. import com.aijia.kmt.service.*;
  21. import com.aijia.kmt.task.SyncRefreshExerciseBookStatusTask;
  22. import com.aijia.kmt.utils.ExerciseUtil;
  23. import com.aijia.kmt.utils.JSONFileUtil;
  24. import com.aijia.kmt.utils.PropertiesUtil;
  25. import com.aijia.kmt.vo.AuditingV1Request;
  26. import com.aijia.kmt.vo.QuestionPublishRequest;
  27. import com.aijia.kmt.vo.QuestionUpdateRequest;
  28. import com.aijia.questioninfo.service.KmtExerciseQuestionInfoService;
  29. import com.aijia.train.bean.TrTrainPartUser;
  30. import com.aijia.train.bean.TrTrainUserExercise;
  31. import com.aijia.train.bean.TrTrainUserQuestionKnow;
  32. import com.aijia.train.mapper.TrainUserExerciseMapper;
  33. import com.aijia.train.mapper.TrainUserQuestionKnowMapper;
  34. import com.aijia.train.mapper.TrainUserServiceMapper;
  35. import com.aijia.utils.DateUtil;
  36. import com.alibaba.fastjson.JSON;
  37. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  38. import com.google.common.collect.Collections2;
  39. import org.apache.commons.collections4.CollectionUtils;
  40. import org.apache.commons.collections4.MapUtils;
  41. import org.apache.commons.lang3.StringUtils;
  42. import org.elasticsearch.index.query.QueryBuilder;
  43. import org.elasticsearch.index.query.QueryBuilders;
  44. import org.slf4j.Logger;
  45. import org.slf4j.LoggerFactory;
  46. import org.springframework.beans.factory.annotation.Autowired;
  47. import org.springframework.stereotype.Service;
  48. import org.springframework.transaction.annotation.Propagation;
  49. import org.springframework.transaction.annotation.Transactional;
  50. import java.util.*;
  51. import java.util.stream.Collectors;
  52. @Service
  53. public class KmtExerciseSubmitServiceImpl implements KmtExerciseSubmitService {
  54. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  55. @Autowired
  56. private KmtExerciseMapper kmtExerciseMapper;
  57. @Autowired
  58. private KmtExerciseService kmtExerciseService;
  59. @Autowired
  60. private TokenManager tokenManager;
  61. @Autowired
  62. private KmtExerciseQuestionService kmtExerciseQuestionService;
  63. @Autowired
  64. private BaseSearchService baseSearchService;
  65. @Autowired
  66. private ExerciseQuestionSearchService exerciseQuestionSearchService;
  67. @Autowired
  68. private LibManagerMapper libManagerMapper;
  69. @Autowired
  70. private UserMapper userMapper;
  71. @Autowired
  72. private HowDetailSortMapper howDetailSortMapper;
  73. @Autowired
  74. private KmtExerciseQuestionDealService kmtExerciseQuestionDealService;
  75. @Autowired
  76. private KmtExerciseQuestionInfoService questionInfoService;
  77. @Autowired
  78. private TrainUserQuestionKnowMapper userQuestionKnowMapper;
  79. @Autowired
  80. private TrainUserServiceMapper userServiceMapper;
  81. @Autowired
  82. private TrainUserExerciseMapper userExerciseMapper;
  83. @Autowired
  84. private KmtExerciseQuestionMapper kmtExerciseQuestionMapper;
  85. @Override
  86. @Transactional(propagation = Propagation.NOT_SUPPORTED)
  87. public ResponseEntity submit2Auditing(AuditingV1Request request, String userId) {
  88. ResponseEntity responseEntity = new ResponseEntity();
  89. Map<String,Object> data = new HashMap<>(8);
  90. if (CollectionUtils.isNotEmpty(request.getQuestions())) {
  91. // logger.error("2");
  92. List<String> questionIds = request.getQuestions().stream().map(QuestionUpdateRequest::getQuestionId).collect(Collectors.toList());
  93. List<KmtExerciseQuestion> questions = kmtExerciseMapper.findKmtExerciseQuestionsByIdIn(questionIds);
  94. questions.forEach(q->{
  95. List<QuestionUpdateRequest> reqList = request.getQuestions();
  96. reqList.forEach(r->{
  97. if(q.getId().equals(r.getQuestionId())){
  98. TrTrainUserExercise questionInfo = userExerciseMapper.selectOne(
  99. new QueryWrapper<TrTrainUserExercise>().eq("question_id",r.getQuestionId())
  100. .eq("user_id", userId)
  101. );
  102. if (questionInfo == null){
  103. //已经提交过的也更新
  104. questionInfo = new TrTrainUserExercise();
  105. KmtExerciseQuestion kmtExerciseQuestion = kmtExerciseQuestionMapper.selectById(q.getId());
  106. questionInfo.setQuestionId(r.getQuestionId());
  107. questionInfo.setQuestionOrg(kmtExerciseQuestion.getImage());
  108. questionInfo.setUserId(userId);
  109. questionInfo.setExerciseId(q.getBookId());
  110. questionInfo.setQuestion(q.getQuestion());
  111. questionInfo.setQuestionText(r.getQuestionText());
  112. questionInfo.setQuestionJson(q.getQuestionJson());
  113. questionInfo.setAnswer(r.getAnswer());
  114. questionInfo.setAnswerJson(r.getAnswerJson());
  115. questionInfo.setAnalysis(q.getAnalysis());
  116. questionInfo.setAnalysisJson(r.getAnalysisJson());
  117. questionInfo.setCreateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
  118. questionInfo.setStatus(request.getType()==0?2:1);
  119. if(CollectionUtils.isNotEmpty(r.getDifficultyLevels())){
  120. questionInfo.setDifficultyLevel(r.getDifficultyLevels().get(0).getType());
  121. }
  122. if(CollectionUtils.isNotEmpty(r.getQuestionTypes())){
  123. questionInfo.setQuestionType(r.getQuestionTypes().get(0).getType());
  124. }
  125. if(CollectionUtils.isNotEmpty(r.getRealExamTypes())){
  126. questionInfo.setRealExamType(r.getRealExamTypes().stream().map(k->k.getType()+"").collect(Collectors.joining(",")));
  127. }
  128. if(CollectionUtils.isNotEmpty(r.getTrainingSkills())){
  129. questionInfo.setTrainingSkill(r.getTrainingSkills().stream().map(KnowledgeBaseDto::getName).collect(Collectors.joining(",")));
  130. }
  131. userExerciseMapper.insert(questionInfo);
  132. }else{
  133. KmtExerciseQuestion kmtExerciseQuestion = kmtExerciseQuestionMapper.selectById(q.getId());
  134. questionInfo.setQuestionId(r.getQuestionId());
  135. questionInfo.setQuestionOrg(kmtExerciseQuestion.getImage());
  136. questionInfo.setUserId(userId);
  137. questionInfo.setExerciseId(q.getBookId());
  138. questionInfo.setQuestion(q.getQuestion());
  139. questionInfo.setQuestionText(r.getQuestionText());
  140. questionInfo.setQuestionJson(q.getQuestionJson());
  141. questionInfo.setAnswer(r.getAnswer());
  142. questionInfo.setAnswerJson(r.getAnswerJson());
  143. questionInfo.setAnalysis(q.getAnalysis());
  144. questionInfo.setAnalysisJson(r.getAnalysisJson());
  145. questionInfo.setCreateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
  146. questionInfo.setStatus(request.getType()==0?2:1);
  147. if(CollectionUtils.isNotEmpty(r.getDifficultyLevels())){
  148. questionInfo.setDifficultyLevel(r.getDifficultyLevels().get(0).getType());
  149. }
  150. if(CollectionUtils.isNotEmpty(r.getQuestionTypes())){
  151. questionInfo.setQuestionType(r.getQuestionTypes().get(0).getType());
  152. }
  153. if(CollectionUtils.isNotEmpty(r.getRealExamTypes())){
  154. questionInfo.setRealExamType(r.getRealExamTypes().stream().map(k->k.getType()+"").collect(Collectors.joining(",")));
  155. }
  156. if(CollectionUtils.isNotEmpty(r.getTrainingSkills())){
  157. questionInfo.setTrainingSkill(r.getTrainingSkills().stream().map(KnowledgeBaseDto::getName).collect(Collectors.joining(",")));
  158. }
  159. userExerciseMapper.updateById(questionInfo);
  160. }
  161. }
  162. });
  163. });
  164. // kmtExerciseService.appendQuestionDataFromJSONFile(questions); //读文件,把题目信息加载到实体中
  165. KmtExerciseBook book = kmtExerciseMapper.findExerciseBookById(questions.get(0).getExerciseBookId());
  166. // this.appendUser2QuestionBean(questions, book); //把加工审核人,校对人加载到实体中
  167. //走事务保存练习册,题目,知识点
  168. this.updateBookAndQuestionsAndKnow(questions, book, request,userId);
  169. /**
  170. * 更新用户状态为已提交
  171. */
  172. //查看是否所有的题目都处理提交
  173. //查询提交题目数
  174. int count = userExerciseMapper.selectCount(new QueryWrapper<TrTrainUserExercise>()
  175. .eq("user_id",userId).eq("exercise_id",questions.get(0).getBookId()).eq("status",1));
  176. //查询总题目数
  177. int qCount = kmtExerciseQuestionMapper.selectCount(new QueryWrapper<KmtExerciseQuestion>()
  178. .eq("book_id",questions.get(0).getBookId()));
  179. data.put("commitAll",1);
  180. if(count == qCount){
  181. TrTrainPartUser user = userServiceMapper.selectById(userId);
  182. user.setStudyStatus(4);
  183. userServiceMapper.updateById(user);
  184. data.put("commitAll",2);
  185. }
  186. responseEntity.success(data,"提交成功");
  187. }
  188. return responseEntity;
  189. }
  190. @Override
  191. @Transactional(propagation = Propagation.REQUIRED)
  192. public void updateBookAndQuestionsAndKnow (List<KmtExerciseQuestion> questions, KmtExerciseBook book, AuditingV1Request request,String userId){
  193. List<String> questionIds = request.getQuestions().stream().map(QuestionUpdateRequest::getQuestionId).collect(Collectors.toList());
  194. //保存大字段文件
  195. //kmtExerciseService.saveQuestionData2JSONFile(questions,userId);
  196. //删除之前的
  197. kmtExerciseMapper.deleteKmtExerciseQuestionKnowByQuestionIds(questionIds, userId);
  198. List<TrTrainUserQuestionKnow> questionKnows = new ArrayList<>();
  199. for (QuestionUpdateRequest updateRequest : request.getQuestions()) {
  200. if (CollectionUtils.isNotEmpty(updateRequest.getKnowledges())) {
  201. for (KmtExerciseQuestion question : questions) {
  202. if (question.getId().equals(updateRequest.getQuestionId())){
  203. questionKnows.addAll(this.getKmtQuestionKnow(updateRequest.getKnowledges(), question));
  204. break;
  205. }
  206. }
  207. }
  208. }
  209. if (CollectionUtils.isNotEmpty(questionKnows)) {
  210. for (TrTrainUserQuestionKnow know : questionKnows){
  211. know.setUserId(userId);
  212. userQuestionKnowMapper.insert(know);
  213. }
  214. }
  215. }
  216. /**
  217. * 获取更新的题目的当前状态下的题数
  218. * @param questions
  219. * @param type
  220. * @return
  221. */
  222. private int getQuestionStatusCount (List<KmtExerciseQuestion> questions, int type){
  223. int result = 0;
  224. if (type == 0){
  225. for (KmtExerciseQuestion q :questions){
  226. if (q.getDealStatus() == 0 || q.getDealStatus() == 1) {
  227. result += 1;
  228. }
  229. }
  230. } else if (type == 1){
  231. for (KmtExerciseQuestion q :questions){
  232. if (q.getDealStatus() == 3 || q.getDealStatus() == 7) {
  233. result += 1;
  234. }
  235. }
  236. } else if (type == 4){
  237. for (KmtExerciseQuestion q :questions){
  238. if (q.getDealStatus() == 5 || q.getDealStatus() == 8) {
  239. result += 1;
  240. }
  241. }
  242. } else if (type == 5){
  243. for (KmtExerciseQuestion q :questions){
  244. if (q.getDealStatus() == 9 || q.getDealStatus() == 10) {
  245. result += 1;
  246. }
  247. }
  248. }
  249. return result;
  250. }
  251. @Override
  252. @Transactional(propagation = Propagation.NOT_SUPPORTED)
  253. public void updateEsQuestionAndKnow (List<KmtExerciseQuestion> questions, List<String> questionIds){
  254. for (KmtExerciseQuestion kmtExerciseQuestion : questions){
  255. kmtExerciseQuestionService.saveToEs(kmtExerciseQuestion);
  256. }
  257. QueryBuilder queryBuilder = QueryBuilders.termsQuery("question_id.keyword", questionIds);
  258. exerciseQuestionSearchService.deleteByQuery("kmt_exercise_question_know", queryBuilder);
  259. List<Map<String, Object>> knowEsData = kmtExerciseMapper.findData2EsByQuestionList(questionIds);
  260. if (CollectionUtils.isNotEmpty(knowEsData)) {
  261. kmtExerciseService.appendQuestionMapFromJSONFile(knowEsData);
  262. baseSearchService.insertBatch("kmt_exercise_question_know", knowEsData, true);
  263. }
  264. }
  265. @Override
  266. public ResponseEntity publishQuestion(QuestionPublishRequest request, String userId) {
  267. ResponseEntity responseEntity = new ResponseEntity();
  268. //查询用户是否有提交数据
  269. if (CollectionUtils.isNotEmpty(request.getQuestionIds())) {
  270. List<KmtExerciseQuestion> questions = kmtExerciseMapper.findKmtExerciseQuestionsByIdIn(request.getQuestionIds());
  271. questions.forEach(q -> {
  272. TrTrainUserExercise questionInfo = userExerciseMapper.selectOne(
  273. new QueryWrapper<TrTrainUserExercise>().eq("question_id", q.getId())
  274. .eq("user_id", userId)
  275. );
  276. if (questionInfo == null) {
  277. //没有提交记录就用原来题目的信息
  278. questionInfo = new TrTrainUserExercise();
  279. KmtExerciseQuestion kmtExerciseQuestion = kmtExerciseQuestionMapper.selectById(q.getId());
  280. questionInfo.setQuestionId(q.getId());
  281. questionInfo.setQuestionOrg(kmtExerciseQuestion.getImage());
  282. questionInfo.setUserId(userId);
  283. questionInfo.setExerciseId(q.getBookId());
  284. questionInfo.setQuestion(q.getQuestion());
  285. questionInfo.setQuestionText(q.getQuestionText());
  286. questionInfo.setQuestionJson(q.getQuestionJson());
  287. questionInfo.setAnswer(q.getOptionAnswer());
  288. questionInfo.setAnswerJson(q.getAnswerJson());
  289. questionInfo.setAnalysis(q.getAnalysis());
  290. questionInfo.setAnalysisJson(q.getAnalysisJson());
  291. questionInfo.setCreateTime(DateUtil.format_yyyyMMddHHmmss(new Date()));
  292. questionInfo.setStatus(1);
  293. questionInfo.setDifficultyLevel(q.getDifficultyLevel());
  294. questionInfo.setQuestionType(q.getQuestionType());
  295. questionInfo.setRealExamType(q.getRealExamType());
  296. questionInfo.setTrainingSkill(q.getTrainingSkill());
  297. userExerciseMapper.insert(questionInfo);
  298. } else {
  299. //已经编辑过的信息更新状态
  300. questionInfo.setStatus(1);
  301. userExerciseMapper.updateById(questionInfo);
  302. }
  303. });
  304. responseEntity.success("发布成功");
  305. }else{
  306. responseEntity.failure("未查到题目信息");
  307. }
  308. return responseEntity;
  309. }
  310. /**
  311. * 是否是管理员提交
  312. * @param userId
  313. * @param type
  314. * @return
  315. */
  316. private boolean isManagerSubmit (String userId, int type){
  317. TbLibManager manager = libManagerMapper.findByUserIdAndType(userId, 18);
  318. if (manager != null) {
  319. //管理员把状态设置为3,不改任何状态
  320. return true;
  321. }
  322. return false;
  323. }
  324. /**
  325. * 是否是答案校对提交
  326. * @param type
  327. * @return
  328. */
  329. private boolean isAnswerCorrectSubmit (int type) {
  330. // 答案校对修改提交
  331. if (Objects.equals(type, 6)) {
  332. return true;
  333. }
  334. return false;
  335. }
  336. /**
  337. * 是否存在已发布的题目
  338. * @param questions
  339. * @param type
  340. * @return
  341. */
  342. private boolean isExistQuestonsPulish (List<KmtExerciseQuestion> questions, int type){
  343. boolean exist = false;
  344. if (type == 4 && questions.stream().anyMatch(q -> q.getDealStatus() == 11)) {
  345. //解析加工提交, 但是题目存在解析已发布
  346. exist = true;
  347. } else if (type == 0 && questions.stream().anyMatch(q -> q.getDealStatus() == 4 || q.getDealStatus() == 5 || q.getDealStatus() > 7)) {
  348. //题目加工提交,但是题目存在加工已发布
  349. exist = true;
  350. }
  351. return exist;
  352. }
  353. /**
  354. * 是否存在不可操作题目
  355. * @param questions
  356. * @param type
  357. * @return
  358. */
  359. private boolean isExistQuestionCantDeal (List<KmtExerciseQuestion> questions, int type){
  360. boolean exist = false;
  361. if (type == 0 && questions.stream().anyMatch(q ->
  362. q.getDealStatus() != 0 && q.getDealStatus() != 1 && q.getDealStatus() != 3 && q.getDealStatus() != 7)){
  363. exist = true;
  364. } else if (type == 1 && questions.stream().anyMatch(q -> q.getDealStatus() != 3 && q.getDealStatus() != 7)){
  365. exist = true;
  366. } else if (type == 4 && questions.stream().anyMatch(q ->
  367. q.getDealStatus() != 5 && q.getDealStatus() != 8 && q.getDealStatus() != 9 && q.getDealStatus() != 10)){
  368. exist = true;
  369. } else if (type == 5 && questions.stream().anyMatch(q -> q.getDealStatus() != 9 && q.getDealStatus() != 10)){
  370. exist = true;
  371. }
  372. return exist;
  373. }
  374. /**
  375. * 练习册加工审核是否提交了知识点
  376. * @param request
  377. * @return
  378. */
  379. private boolean isQuestionHandlerSubmitKnowledge (AuditingV1Request request){
  380. boolean result = true;
  381. if (request.getType() == 0 || request.getType() == 1 || request.getType() == 3){
  382. for (QuestionUpdateRequest questionUpdateRequest : request.getQuestions()){
  383. if (CollectionUtils.isEmpty(questionUpdateRequest.getKnowledges())){
  384. result = false;
  385. break;
  386. }
  387. }
  388. }
  389. return result;
  390. }
  391. /**
  392. * 把练习册的加工审核人,校对人加入到题目实体中
  393. * @param questions
  394. * @param book
  395. */
  396. private void appendUser2QuestionBean (List<KmtExerciseQuestion> questions, KmtExerciseBook book){
  397. if (CollectionUtils.isNotEmpty(questions)){
  398. for (KmtExerciseQuestion kmtExerciseQuestion : questions) {
  399. kmtExerciseQuestion.setHandleUserId(book.getHandleUserId());
  400. kmtExerciseQuestion.setAuditingUserId(book.getAuditingUserId());
  401. kmtExerciseQuestion.setAnalysisUserId(book.getAnalysisUserId());
  402. kmtExerciseQuestion.setAnalysisAuditerId(book.getAnalysisAuditerId());
  403. kmtExerciseQuestion.setAnswerCorrecterId(book.getAnswerCorrecterId());
  404. }
  405. }
  406. }
  407. /**
  408. * 提交审核更新为未加工,未审核
  409. * @param questionCount
  410. * @param exerciseBook
  411. * @param dealType
  412. */
  413. private void updateKmtExerciseBookFinishStatus (int questionCount, KmtExerciseBook exerciseBook, int dealType){
  414. int count = 0;
  415. if (dealType == 0){
  416. //题目加工
  417. if (exerciseBook.getHadHandle() == 0){
  418. count = kmtExerciseMapper.countUnFinishQuestionsByExerciseBookId(exerciseBook.getId(), 1);
  419. if (count <= questionCount){
  420. exerciseBook.setHadHandle(1);
  421. }
  422. }
  423. if (exerciseBook.getHadHandle() == 1 && StringUtil.isNotBlank(exerciseBook.getAuditingUserId())) {
  424. //加工完了通知加工审核老师
  425. this.push2ExerciseTeacher(exerciseBook.getAuditingUserId(), exerciseBook, 2);
  426. }
  427. exerciseBook.setHadAuditing(0);
  428. } else if (dealType == 1) {
  429. //题目发布
  430. if (exerciseBook.getHadAuditing() == 0){
  431. count = kmtExerciseMapper.countUnFinishQuestionsByExerciseBookId(exerciseBook.getId(), 2);
  432. if (count <= questionCount){
  433. exerciseBook.setHadAuditing(1);
  434. }
  435. }
  436. if (exerciseBook.getHadHandle() == 1 && exerciseBook.getHadAuditing() == 1){
  437. //加工完了通知加工审核老师
  438. exerciseBook.setProgress("已发布");
  439. if (StringUtil.isNotBlank(exerciseBook.getAnalysisUserId())){
  440. this.push2ExerciseTeacher(exerciseBook.getAnalysisUserId(),exerciseBook, 3);
  441. }
  442. }
  443. exerciseBook.setAnalysisHandled(0);
  444. } else if (dealType == 4){
  445. //题目解析加工
  446. if (exerciseBook.getAnalysisHandled() == 0){
  447. count = kmtExerciseMapper.countUnFinishQuestionsByExerciseBookId(exerciseBook.getId(), 3);
  448. if (count <= questionCount){
  449. exerciseBook.setAnalysisHandled(1);
  450. }
  451. }
  452. if (exerciseBook.getHadHandle() == 1 && exerciseBook.getHadAuditing() == 1
  453. && exerciseBook.getAnalysisHandled() == 1 && StringUtil.isNotBlank(exerciseBook.getAnalysisAuditerId())){
  454. //加工完了通知加工审核老师
  455. this.push2ExerciseTeacher(exerciseBook.getAnalysisAuditerId(), exerciseBook, 4);
  456. }
  457. exerciseBook.setAnalysisAudited(0);
  458. } else if (dealType == 5 && exerciseBook.getAnalysisAudited() == 0){
  459. //题目解析发布
  460. count = kmtExerciseMapper.countUnFinishQuestionsByExerciseBookId(exerciseBook.getId(), 4);
  461. if (count <= questionCount){
  462. exerciseBook.setAnalysisAudited(1);
  463. }
  464. }
  465. }
  466. /**
  467. * 练习册加工完推送下一个阶段的老师
  468. * @param userId
  469. * @param exerciseBook
  470. * @param type
  471. */
  472. private void push2ExerciseTeacher (String userId, KmtExerciseBook exerciseBook,int type){
  473. String key = "push_bookId"+exerciseBook.getId()+userId;
  474. if(tokenManager.exists(key)){
  475. return ;
  476. }
  477. Map<String, String> data = new HashMap<>();
  478. String template_id_short = "OPENTM206165551";
  479. User user = userMapper.selectById(userId);
  480. if (user != null && StringUtils.isNotEmpty(user.getAccount()) ){
  481. try{
  482. TbLibManager libTeacher = libManagerMapper.findByUserIdAndType(userId, 17);
  483. if (libTeacher != null){
  484. String teacherName = null;
  485. teacherName = libTeacher.getName();
  486. if (StringUtils.isEmpty(teacherName)){
  487. teacherName = user.getName();
  488. }
  489. String authName = null;
  490. switch (type){
  491. case 1: authName="题目加工"; break;
  492. case 2: authName="审核发布"; break;
  493. case 3: authName="解析加工"; break;
  494. case 4: authName="解析发布"; break;
  495. default: authName="加工"; break;
  496. }
  497. String bookType = null;
  498. switch (exerciseBook.getBookType()){
  499. case 0: bookType="整本"; break;
  500. case 1: bookType="上半本"; break;
  501. case 2: bookType="下半本"; break;
  502. case 3: bookType="不同的页码的新版练习册"; break;
  503. default: bookType=""; break;
  504. }
  505. // // 你好,你有一本 数学人教版上册四年级 整本、半本,《我爱写作业(2020)》,
  506. //
  507. // StringBuffer sb =new StringBuffer("你好,你有一本");
  508. // sb.append(exerciseBook.getCourseName()).append(exerciseBook.getVersionName()).append(exerciseBook.getSemester()==1?"上册":"下册");
  509. // sb.append(exerciseBook.getGrade()).append(bookType).append("《").append(exerciseBook.getBookName()).append("》,");
  510. // sb.append(authName+"请在规定时间内完成");
  511. // data.put("first", sb.toString());
  512. // data.put("keyword1", teacherName);
  513. // data.put("keyword2", DateUtil.format_yyyyMMddHHmmss(new Date()));
  514. // data.put("remark", "请及时登录处理,如有疑问请及时联系相关负责老师。");
  515. // SendTemplateShort sendTemplateShort = new SendTemplateShort(user.getAccount(), template_id_short, null, data);
  516. // pushTemplateService.saveAndSendPushWxTemplate(sendTemplateShort);
  517. tokenManager.setString(key,authName,12*60*60);
  518. } else {
  519. logger.error("没有老师角色" + userId);
  520. }
  521. } catch (Exception e){
  522. logger.error("推送练习册老师失败:", e);
  523. }
  524. }
  525. }
  526. /**
  527. * 更新题目信息
  528. * @param questions
  529. * @param questionUpdateRequests
  530. * @param type
  531. */
  532. private void getKmtExerciseQuestionData (List<KmtExerciseQuestion> questions, List<QuestionUpdateRequest> questionUpdateRequests,
  533. int type, boolean isAnswerCorrectSubmit) {
  534. //解析加工或解析审核
  535. if (isAnswerCorrectSubmit) {
  536. this.updateProofreadStatusSubmit(questions, questionUpdateRequests);
  537. String exerciseBookId = questions.get(0).getExerciseBookId();
  538. // 如果已经没有需要修改答案的题目,则修改练习册的校对状态为已修改
  539. List<String> questionIds = questionUpdateRequests.stream().map(QuestionUpdateRequest::getQuestionId).collect(Collectors.toList());
  540. int count = kmtExerciseMapper.countAnswerWrongQuestion(exerciseBookId, new HashSet<>(questionIds));
  541. if (count < 1) {
  542. kmtExerciseMapper.updateKmtExerciseBookProofreadStatus(exerciseBookId, ProofreadStatusEnum.ManagerModified.getCode());
  543. }
  544. } else if (type == 0) {
  545. this.updateHandlerQuestions(questions, questionUpdateRequests);
  546. } else if (type == 1) {
  547. this.updateAuditingUserQuestion(questions, questionUpdateRequests);
  548. } else if (type == 3){
  549. this.updateManagerQuestions(questions, questionUpdateRequests);
  550. } else if (type == 4) {
  551. this.updateAnalysisHandleQuestions(questions, questionUpdateRequests);
  552. } else if (type == 5) {
  553. this.updateAnalysisAuditingQuestions(questions, questionUpdateRequests);
  554. }
  555. }
  556. /**
  557. * 解析加工的提交功能,如果是加工人(题目deal_status=5,8), 记录解析加工时间, 修改题目状态
  558. * @param questions
  559. * @param questionUpdateRequests
  560. */
  561. private void updateAnalysisHandleQuestions (List<KmtExerciseQuestion> questions, List<QuestionUpdateRequest> questionUpdateRequests) {
  562. for (KmtExerciseQuestion question : questions) {
  563. for (QuestionUpdateRequest updateRequest : questionUpdateRequests) {
  564. if (question.getId().equals(updateRequest.getQuestionId())) {
  565. question.setAnalysisJson(updateRequest.getAnalysisJson());
  566. question.setAnalysis(updateRequest.getQuestionAnalysis());
  567. if (question.getDealStatus() == 5 || question.getDealStatus() == 8) {
  568. question.setAnalysisHandlerSubmitTime(new Date());
  569. question.setDealStatus(9);
  570. }
  571. }
  572. }
  573. }
  574. }
  575. /**
  576. * 解析加工的发布功能, 记录解析加工时间, 修改题目状态
  577. * @param questions
  578. * @param questionUpdateRequests
  579. */
  580. private void updateAnalysisAuditingQuestions (List<KmtExerciseQuestion> questions, List<QuestionUpdateRequest> questionUpdateRequests) {
  581. for (KmtExerciseQuestion question : questions) {
  582. for (QuestionUpdateRequest updateRequest : questionUpdateRequests) {
  583. if (question.getId().equals(updateRequest.getQuestionId())) {
  584. question.setAnalysisJson(updateRequest.getAnalysisJson());
  585. question.setAnalysis(updateRequest.getQuestionAnalysis());
  586. question.setDealStatus(11);
  587. question.setAnalysisSubmitTime(new Date());
  588. }
  589. }
  590. }
  591. }
  592. /**
  593. * 题目加工提交功能
  594. * @param questions
  595. * @param questionUpdateRequests
  596. */
  597. private void updateHandlerQuestions (List<KmtExerciseQuestion> questions, List<QuestionUpdateRequest> questionUpdateRequests) {
  598. //循坏题目
  599. for (KmtExerciseQuestion question : questions) {
  600. for (QuestionUpdateRequest updateRequest : questionUpdateRequests) {
  601. if (question.getId().equals(updateRequest.getQuestionId())) {
  602. this.updateKmtQuestionCommonData(question, updateRequest);
  603. if (question.getDealStatus() == 0 || question.getDealStatus() == 1) {
  604. question.setHandlerSubmitTime(new Date());
  605. question.setDealStatus(3);
  606. }
  607. }
  608. }
  609. }
  610. }
  611. /**
  612. * 题目审核提交发布功能
  613. * @param questions
  614. * @param questionUpdateRequests
  615. */
  616. private void updateAuditingUserQuestion (List<KmtExerciseQuestion> questions, List<QuestionUpdateRequest> questionUpdateRequests){
  617. //循坏题目
  618. for (KmtExerciseQuestion question : questions) {
  619. for (QuestionUpdateRequest updateRequest : questionUpdateRequests) {
  620. if (question.getId().equals(updateRequest.getQuestionId())) {
  621. this.updateKmtQuestionCommonData(question, updateRequest);
  622. question.setPublishTime(new Date());
  623. question.setDealStatus(5);
  624. int startX = 0;
  625. if (StringUtil.isNotBlank(question.getConciseId())){
  626. startX = Integer.parseInt(question.getConciseId());
  627. }
  628. // TODO: 2020/12/10 判断是否需要去题号
  629. if (question.getEnumerate()==1){
  630. String path = null;
  631. try {
  632. path = kmtExerciseQuestionDealService.removeQuestionNumMark(startX, question.getAnalysisSubmitType(),
  633. question.getUpdateType(), question.getEsLoaded(), question.getImage());
  634. } catch (Exception e){
  635. logger.error("异常", e);
  636. }
  637. String content = JSONFileUtil.readJSONFile(PropertiesUtil.getValue("EXERCISE_JSON_FILE_PATH") + question.getQuestionPath());
  638. if (StringUtil.isNotBlank(content) && StringUtil.isNotBlank(path)){
  639. Map<String, Object> map = JSON.parseObject(content, Map.class);
  640. ExerciseQuestionAnswerValue questionAnswerValue = ExerciseUtil.getExerciseQuestionAnswerValue(path);
  641. if (questionAnswerValue == null){
  642. map.put("question_json", "[]");
  643. } else {
  644. map.put("question_json", Collections.singletonList(questionAnswerValue));
  645. }
  646. map.put("question", "<img src='" + PropertiesUtil.getValue("STATIC_FILE_URL") + path + "'/>");
  647. JSONFileUtil.saveJSONFile(PropertiesUtil.getValue("EXERCISE_JSON_FILE_PATH") + question.getQuestionPath(), JSON.toJSONString(map));
  648. questionInfoService.updateQuestionAndJsonByQuestionId(question.getId(), map);
  649. question.setQuestionJson(JSON.toJSONString(map.get("question_json")));
  650. question.setQuestion((String)map.get("question"));
  651. }
  652. }
  653. }
  654. }
  655. }
  656. }
  657. /**
  658. * 管理员提交, 不修改题目状态
  659. * @param questions
  660. * @param questionUpdateRequests
  661. */
  662. private void updateManagerQuestions (List<KmtExerciseQuestion> questions, List<QuestionUpdateRequest> questionUpdateRequests) {
  663. //循坏题目
  664. for (KmtExerciseQuestion question : questions) {
  665. for (QuestionUpdateRequest updateRequest : questionUpdateRequests) {
  666. if (question.getId().equals(updateRequest.getQuestionId())) {
  667. this.updateKmtQuestionCommonData(question, updateRequest);
  668. }
  669. }
  670. }
  671. }
  672. /**
  673. * 校对更新提交
  674. * @param questions
  675. * @param questionUpdateRequests
  676. */
  677. private void updateProofreadStatusSubmit (List<KmtExerciseQuestion> questions, List<QuestionUpdateRequest> questionUpdateRequests) {
  678. //循坏题目
  679. for (KmtExerciseQuestion question : questions) {
  680. for (QuestionUpdateRequest updateRequest : questionUpdateRequests) {
  681. if (question.getId().equals(updateRequest.getQuestionId())) {
  682. this.updateKmtQuestionCommonData(question, updateRequest);
  683. question.setProofreadStatus(ProofreadStatusEnum.ManagerModified.getCode());
  684. }
  685. }
  686. }
  687. }
  688. /**
  689. * 更新单个题目的信息
  690. * @param question
  691. * @param updateRequest
  692. */
  693. private void updateKmtQuestionCommonData (KmtExerciseQuestion question, QuestionUpdateRequest updateRequest) {
  694. question.setQuestionText(updateRequest.getQuestionText());
  695. question.setOptionAnswer(updateRequest.getAnswer());
  696. question.setAnswerJson(updateRequest.getAnswerJson());
  697. question.setAnalysis(updateRequest.getQuestionAnalysis());
  698. question.setAnalysisJson(updateRequest.getAnalysisJson());
  699. if (CollectionUtils.isNotEmpty(updateRequest.getQuestionTypes())) {
  700. question.setQuestionType(updateRequest.getQuestionTypes().get(0).getType());
  701. }
  702. if (CollectionUtils.isNotEmpty(updateRequest.getDifficultyLevels())) {
  703. question.setDifficultyLevel(updateRequest.getDifficultyLevels().get(0).getType());
  704. }
  705. if (CollectionUtils.isNotEmpty(updateRequest.getRealExamTypes())) {
  706. List<Integer> types = updateRequest.getRealExamTypes().stream().map(KnowledgeBaseDto::getType).collect(Collectors.toList());
  707. question.setRealExamType(StringUtils.join(types, ","));
  708. }
  709. if (CollectionUtils.isNotEmpty(updateRequest.getTrainingSkills())) {
  710. List<String> names = updateRequest.getTrainingSkills().stream().map(KnowledgeBaseDto::getName).collect(Collectors.toList());
  711. question.setTrainingSkill(StringUtils.join(names, ","));
  712. }
  713. }
  714. /**
  715. * 添加题目关联的知识点 kmt_exercise_question_know, zyb_know_how_details_sort
  716. * @param knowledges
  717. * @param question
  718. */
  719. private List<TrTrainUserQuestionKnow> getKmtQuestionKnow (List<KnowHowDetailsDTO> knowledges, KmtExerciseQuestion question){
  720. //知识点不为空添加知识点
  721. List<TrTrainUserQuestionKnow> questionKnows = new ArrayList<>();
  722. if (CollectionUtils.isNotEmpty(knowledges)){
  723. for (KnowHowDetailsDTO detail : knowledges){
  724. ZuoybKnowHowDetailsSort detailsSort = howDetailSortMapper.selectById(detail.getId());
  725. if (CollectionUtils.isNotEmpty(detail.getPoints())){
  726. //有考点的情况
  727. detail.getPoints().forEach(point -> {
  728. //添加题目与考点的关联记录
  729. TrTrainUserQuestionKnow kmtExerciseQuestionKnow = new TrTrainUserQuestionKnow();
  730. kmtExerciseQuestionKnow.setId(IdWorker.generateId());
  731. ZuoybKnowHowDetailsSort pointSort = howDetailSortMapper.selectById(point.getId());
  732. kmtExerciseQuestionKnow.setQuestionId(question.getId());
  733. kmtExerciseQuestionKnow.setQuestionParentId(question.getParentId());
  734. kmtExerciseQuestionKnow.setHowDetailsId(detailsSort.getHowDetailsId());
  735. kmtExerciseQuestionKnow.setHowDetailsKdId(pointSort.getHowDetailsKdId());
  736. kmtExerciseQuestionKnow.setVersion(detailsSort.getType());
  737. kmtExerciseQuestionKnow.setLoaded(0);
  738. kmtExerciseQuestionKnow.setCreateTime(new Date());
  739. kmtExerciseQuestionKnow.setUpdateTime(new Date());
  740. kmtExerciseQuestionKnow.setHowDetailSortId(detailsSort.getId());
  741. kmtExerciseQuestionKnow.setHowDetailKdSortId(pointSort.getId());
  742. questionKnows.add(kmtExerciseQuestionKnow);
  743. });
  744. } else {
  745. //没有考点的情况只记录知识点
  746. TrTrainUserQuestionKnow kmtExerciseQuestionKnow = new TrTrainUserQuestionKnow();
  747. kmtExerciseQuestionKnow.setId(IdWorker.generateId());
  748. kmtExerciseQuestionKnow.setQuestionId(question.getId());
  749. kmtExerciseQuestionKnow.setQuestionParentId(question.getParentId());
  750. kmtExerciseQuestionKnow.setHowDetailsId(detailsSort.getHowDetailsId());
  751. kmtExerciseQuestionKnow.setHowDetailSortId(detailsSort.getId());
  752. kmtExerciseQuestionKnow.setVersion(detailsSort.getType());
  753. kmtExerciseQuestionKnow.setLoaded(0);
  754. kmtExerciseQuestionKnow.setCreateTime(new Date());
  755. kmtExerciseQuestionKnow.setUpdateTime(new Date());
  756. questionKnows.add(kmtExerciseQuestionKnow);
  757. }
  758. }
  759. }
  760. return questionKnows;
  761. }
  762. }