RealExamFaultService.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. package com.ruoyi.sim.service.impl;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.github.jsonzou.jmockdata.JMockData;
  5. import com.ruoyi.common.core.domain.AjaxResult;
  6. import com.ruoyi.common.utils.DateUtils;
  7. import com.ruoyi.sim.constant.CommConst;
  8. import com.ruoyi.sim.constant.FaultConst;
  9. import com.ruoyi.sim.domain.vo.RealExamFaultReportPart1Vo;
  10. import com.ruoyi.sim.domain.vo.RealExamFaultReportPart2Vo;
  11. import com.ruoyi.sim.domain.vo.RealExamFaultReportPart3Vo;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import org.springframework.beans.BeanUtils;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Service;
  18. import com.ruoyi.sim.mapper.RealExamFaultMapper;
  19. import com.ruoyi.sim.domain.RealExamFault;
  20. import org.springframework.transaction.annotation.Transactional;
  21. /**
  22. * 考试故障关联Service业务层处理
  23. *
  24. * @author tom
  25. * @date 2024-12-15
  26. */
  27. @Service
  28. public class RealExamFaultService {
  29. @Autowired
  30. private RealExamFaultMapper realExamFaultMapper;
  31. @Autowired
  32. private FaultService faultService;
  33. /**
  34. * 查询考试故障关联
  35. *
  36. * @param refId 考试故障关联主键
  37. * @return 考试故障关联
  38. */
  39. public RealExamFault selectRealExamFaultByRefId(Long refId) {
  40. return realExamFaultMapper.selectRealExamFaultByRefId(refId);
  41. }
  42. /**
  43. * 查询考试故障关联列表
  44. *
  45. * @param realExamFault 考试故障关联
  46. * @return 考试故障关联
  47. */
  48. public List<RealExamFault> selectRealExamFaultList(RealExamFault realExamFault) {
  49. return realExamFaultMapper.selectRealExamFaultList(realExamFault);
  50. }
  51. /**
  52. * 新增考试故障关联
  53. *
  54. * @param realExamFault 考试故障关联
  55. * @return 结果
  56. */
  57. public int insertRealExamFault(RealExamFault realExamFault) {
  58. realExamFault.setCreateTime(DateUtils.getNowDate());
  59. return realExamFaultMapper.insertRealExamFault(realExamFault);
  60. }
  61. /**
  62. * 修改考试故障关联
  63. *
  64. * @param realExamFault 考试故障关联
  65. * @return 结果
  66. */
  67. @Transactional
  68. public int updateRealExamFault(RealExamFault realExamFault) {
  69. realExamFault.setUpdateTime(DateUtils.getNowDate());
  70. return realExamFaultMapper.updateRealExamFault(realExamFault);
  71. }
  72. /**
  73. * 批量删除考试故障关联
  74. *
  75. * @param refIds 需要删除的考试故障关联主键
  76. * @return 结果
  77. */
  78. public int deleteRealExamFaultByRefIds(Long[] refIds) {
  79. return realExamFaultMapper.deleteRealExamFaultByRefIds(refIds);
  80. }
  81. /**
  82. * 删除考试故障关联信息
  83. *
  84. * @param refId 考试故障关联主键
  85. * @return 结果
  86. */
  87. public int deleteRealExamFaultByRefId(Long refId) {
  88. return realExamFaultMapper.deleteRealExamFaultByRefId(refId);
  89. }
  90. // -------------------------------- tom add --------------------------------
  91. private static final Logger l = LoggerFactory.getLogger(RealExamFaultService.class);
  92. public void updateRefStateByRefId(final long refId, final String state) {
  93. if (!existByRefId(refId)) {
  94. return;
  95. }
  96. RealExamFault f = selectRealExamFaultByRefId(refId);
  97. f.setRefState(state);
  98. updateRealExamFault(f);
  99. }
  100. public boolean existByRefId(final Long refId) {
  101. RealExamFault f = selectRealExamFaultByRefId(refId);
  102. return f != null;
  103. }
  104. /**
  105. * 初始化状态的 关联列表。
  106. *
  107. * @param examId
  108. * @return
  109. */
  110. public List<RealExamFault> listAllType2InitStateByExamId(Long examId) {
  111. RealExamFault q = new RealExamFault();
  112. q.setExamId(examId);
  113. q.setRefType(RealExamFault.Type.TYPE_2);
  114. q.setRefState(RealExamFault.State.INIT);
  115. return realExamFaultMapper.selectRealExamFaultList(q);
  116. }
  117. public List<RealExamFault> listAllType2FlagYesClearedStateByExamId(Long examId) {
  118. RealExamFault q = new RealExamFault();
  119. q.setExamId(examId);
  120. q.setRefType(RealExamFault.Type.TYPE_2);
  121. q.setRefState(RealExamFault.State.CLEARED);
  122. q.setFlag(RealExamFault.Flag.YES);
  123. return realExamFaultMapper.selectRealExamFaultList(q);
  124. }
  125. public List<RealExamFault> listAllType2ByExamId(Long examId) {
  126. RealExamFault q = new RealExamFault();
  127. q.setExamId(examId);
  128. q.setRefType(RealExamFault.Type.TYPE_2);
  129. return realExamFaultMapper.selectRealExamFaultList(q);
  130. }
  131. /**
  132. * reset real_exam_fault 表中关联数据
  133. *
  134. * @param examId
  135. */
  136. @Transactional
  137. public void resetAllType2(final Long examId) {
  138. listAllType2(examId).stream().forEach(ref -> {
  139. ref.setRefState(RealExamFault.State.INIT);
  140. ref.setAnswerRight(RealExamFault.AnswerRight.UNKNOWN);
  141. ref.setChoiceQuestionValue("");
  142. ref.setChoiceAnswerValue("");
  143. ref.setSimFaultQuestionValue("");
  144. ref.setSimFaultAnswerValue("");
  145. ref.setMinus(0L);
  146. updateRealExamFault(ref);
  147. });
  148. }
  149. public void reset(final Long examId) {
  150. RealExamFault q = new RealExamFault();
  151. q.setExamId(examId);
  152. }
  153. /**
  154. *
  155. * @param examId
  156. * @return
  157. */
  158. public List<RealExamFault> listAllType2State2and3ByExamId(Long examId) {
  159. List<RealExamFault> list = new ArrayList<>();
  160. {
  161. RealExamFault q = new RealExamFault();
  162. q.setExamId(examId);
  163. q.setRefType(RealExamFault.Type.TYPE_2);
  164. q.setRefState(RealExamFault.State.WRITTEN);
  165. list.addAll(realExamFaultMapper.selectRealExamFaultList(q));
  166. }
  167. {
  168. RealExamFault q = new RealExamFault();
  169. q.setExamId(examId);
  170. q.setRefType(RealExamFault.Type.TYPE_2);
  171. q.setRefState(RealExamFault.State.LOOP_READ);
  172. list.addAll(realExamFaultMapper.selectRealExamFaultList(q));
  173. }
  174. return list;
  175. }
  176. public List<RealExamFault> listAllType2(Long examId) {
  177. RealExamFault q = new RealExamFault();
  178. q.setExamId(examId);
  179. q.setRefType(RealExamFault.Type.TYPE_2);
  180. return realExamFaultMapper.selectRealExamFaultList(q);
  181. }
  182. /**
  183. * 全部下发Ok?
  184. *
  185. * @param examId
  186. * @return
  187. */
  188. public boolean isAllType2StateXiaFa(long examId) {
  189. List<RealExamFault> list = listAllType2(examId);
  190. for (RealExamFault ref : list) {
  191. String state = ref.getRefState();
  192. if (RealExamFault.State.WRITTEN.equals(state) || RealExamFault.State.LOOP_READ.equals(state)) {
  193. continue;
  194. } else {
  195. return false;
  196. }
  197. }
  198. return true;
  199. }
  200. /**
  201. * 全部清除并下发选中Ok?
  202. * // 如果全部下发完毕 修改RealExam状态
  203. * <p>
  204. * // todo:单独一个故障,特殊处理
  205. *
  206. * @param examId
  207. * @return
  208. */
  209. public boolean isType2ExamPrepareStartOk(long examId) {
  210. RealExamFault q = new RealExamFault();
  211. q.setExamId(examId);
  212. q.setRefType(RealExamFault.Type.TYPE_2);
  213. List<RealExamFault> list = selectRealExamFaultList(q);
  214. for (RealExamFault ref : list) {
  215. // 关于 flag
  216. String flag = ref.getFlag();
  217. if (RealExamFault.Flag.YES.equals(flag)) {
  218. if (!RealExamFault.State.WRITTEN.equals(ref.getRefState())) {
  219. return false;
  220. }
  221. } else if (RealExamFault.Flag.NO.equals(flag)) {
  222. if (!RealExamFault.State.LOOP_READ.equals(ref.getRefState())) {
  223. return false;
  224. }
  225. }
  226. // 关于答题值
  227. String qV = ref.getSimFaultQuestionValue();
  228. if (qV == null || qV.isBlank() || qV.length() != CommConst.LENGTH_8) {
  229. return false;
  230. }
  231. }
  232. return true;
  233. }
  234. /**
  235. * QuestionValue and AnswerValue not isBlank
  236. *
  237. * @param examId
  238. * @return
  239. */
  240. public boolean isType2ExamPrepareSubmitOk(long examId) {
  241. RealExamFault q = new RealExamFault();
  242. q.setExamId(examId);
  243. q.setRefType(RealExamFault.Type.TYPE_2);
  244. List<RealExamFault> list = selectRealExamFaultList(q);
  245. for (RealExamFault ref : list) {
  246. // todo:需要更多check
  247. if (StringUtils.isBlank(ref.getSimFaultQuestionValue()) || StringUtils.isBlank(ref.getSimFaultAnswerValue())) {
  248. return false;
  249. }
  250. }
  251. return true;
  252. }
  253. public boolean isState(Long refId, String state) {
  254. RealExamFault f = selectRealExamFaultByRefId(refId);
  255. if (f == null) {
  256. return false;
  257. }
  258. return state.equals(f.getRefState());
  259. }
  260. @Transactional
  261. public void calculateMinusByRealExamId(long examId) {
  262. l.info("calculateMinusByRealExamId realExamId : {}", examId);
  263. RealExamFault q = new RealExamFault();
  264. q.setExamId(examId);
  265. selectRealExamFaultList(q).forEach(ref -> {
  266. calculateMinus(ref.getRefId());
  267. });
  268. }
  269. /**
  270. * 计算减分 + 判断对错。
  271. *
  272. * @param refId
  273. * @return 每条关联计算结果。
  274. */
  275. @Transactional
  276. public AjaxResult calculateMinus(Long refId) {
  277. l.info("calculateMinus refId : {}", refId);
  278. RealExamFault ref = selectRealExamFaultByRefId(refId);
  279. // check
  280. if (ref == null) {
  281. throw new RuntimeException("calculateMinus");
  282. }
  283. if (!RealExamFault.Flag.YES.equals(ref.getFlag())) {
  284. // throw new RuntimeException("calculateMinus");
  285. l.warn("not yes");
  286. return AjaxResult.error("not yes");
  287. }
  288. // default minus 0
  289. int minus = 0;
  290. String answerRight = RealExamFault.AnswerRight.UNKNOWN;
  291. l.info("ref = {}", ref);
  292. String refType = ref.getRefType();
  293. final String qV = ref.getSimFaultQuestionValue();
  294. final String aV = ref.getSimFaultAnswerValue();
  295. if (RealExamFault.Type.TYPE_1.equals(refType)) {
  296. // todo:选择题的算减分
  297. // todo:细化实现
  298. }
  299. if (RealExamFault.Type.TYPE_2.equals(refType)) {
  300. // check
  301. if (StringUtils.isAnyBlank(qV, aV)) {
  302. // todo:一般不应该出现的情况
  303. return AjaxResult.error("数据报文异常!");
  304. }
  305. // 模拟器故障 的 计算减分 + 判断对错
  306. if (FaultConst.JUDGE_SET.contains(ref.getFaultId())) {
  307. String aVLast = aV.substring(6, 8);
  308. if (CommConst.ANSWER_LAST_RIGHT_MSG.equals(aVLast)) {
  309. minus = 0;
  310. answerRight = RealExamFault.AnswerRight.YES;
  311. } else if (CommConst.ANSWER_LAST_WRONG_MSG.equals(aVLast)) {
  312. minus = 25;
  313. answerRight = RealExamFault.AnswerRight.NO;
  314. } else {
  315. return AjaxResult.error("数据报文异常!");
  316. }
  317. } else if (!StringUtils.equals(qV, aV)) {
  318. // 扣0分
  319. minus = 0;
  320. answerRight = RealExamFault.AnswerRight.YES;
  321. } else {
  322. // 扣25分 故障未排除
  323. minus = 25;
  324. answerRight = RealExamFault.AnswerRight.NO;
  325. }
  326. }
  327. ref.setMinus((long) minus);
  328. ref.setAnswerRight(answerRight);
  329. // 更新减分数据。
  330. updateRealExamFault(ref);
  331. return AjaxResult.success();
  332. }
  333. public List<RealExamFaultReportPart1Vo> getReportListPart1(final Long examId) {
  334. RealExamFault q = new RealExamFault();
  335. q.setExamId(examId);
  336. q.setRefType(RealExamFault.Type.TYPE_2);
  337. q.setFlag(RealExamFault.Flag.YES);
  338. List<RealExamFault> list1 = selectRealExamFaultList(q);
  339. List<RealExamFaultReportPart1Vo> list2 = new ArrayList<>();
  340. list1.forEach(ref -> {
  341. RealExamFaultReportPart1Vo vo = new RealExamFaultReportPart1Vo();
  342. BeanUtils.copyProperties(ref, vo);
  343. vo.setFault(faultService.selectFaultByFaultId(ref.getFaultId()));
  344. list2.add(vo);
  345. });
  346. return list2;
  347. }
  348. public List<RealExamFaultReportPart2Vo> getReportListPart2(final Long examId) {
  349. RealExamFaultReportPart2Vo r1 = JMockData.mock(RealExamFaultReportPart2Vo.class);
  350. RealExamFaultReportPart2Vo r2 = JMockData.mock(RealExamFaultReportPart2Vo.class);
  351. RealExamFaultReportPart2Vo r3 = JMockData.mock(RealExamFaultReportPart2Vo.class);
  352. List<RealExamFaultReportPart2Vo> list = new ArrayList<>();
  353. list.add(r1);
  354. list.add(r2);
  355. list.add(r3);
  356. // todo:
  357. return null;
  358. }
  359. public RealExamFaultReportPart3Vo getReportPart3(final Long examId) {
  360. RealExamFaultReportPart3Vo r1 = JMockData.mock(RealExamFaultReportPart3Vo.class);
  361. // todo:
  362. return null;
  363. }
  364. /**
  365. * 删除mx_real_exam_fault表关联数据
  366. *
  367. * @param examId
  368. */
  369. public void deleteRefByExamId(Long examId) {
  370. RealExamFault q = new RealExamFault();
  371. q.setExamId(examId);
  372. List<RealExamFault> list = selectRealExamFaultList(q);
  373. list.forEach(ef -> {
  374. deleteRealExamFaultByRefId(ef.getRefId());
  375. });
  376. }
  377. }