StudentServiceImpl.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package cn.com.qmth.am.service.impl;
  2. import java.util.ArrayList;
  3. import java.util.HashSet;
  4. import java.util.LinkedHashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Set;
  8. import org.apache.commons.collections4.CollectionUtils;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Service;
  13. import org.springframework.transaction.annotation.Transactional;
  14. import com.qmth.boot.core.exception.StatusException;
  15. import cn.com.qmth.am.bean.ImagePosition;
  16. import cn.com.qmth.am.bean.OcrDto;
  17. import cn.com.qmth.am.bean.StudentScoreVo;
  18. import cn.com.qmth.am.bean.StudentVo;
  19. import cn.com.qmth.am.bean.TrackPosition;
  20. import cn.com.qmth.am.config.SysProperty;
  21. import cn.com.qmth.am.entity.QuestionEntity;
  22. import cn.com.qmth.am.enums.AnswerRangeType;
  23. import cn.com.qmth.am.enums.DataStatus;
  24. import cn.com.qmth.am.service.QuestionService;
  25. import cn.com.qmth.am.service.StmmsService;
  26. import cn.com.qmth.am.service.StudentScoreService;
  27. import cn.com.qmth.am.service.StudentService;
  28. @Service
  29. public class StudentServiceImpl implements StudentService {
  30. private static final Logger log = LoggerFactory.getLogger(StudentService.class);
  31. @Autowired
  32. private StudentService studentService;
  33. @Autowired
  34. private SysProperty sysProperty;
  35. @Autowired
  36. private StmmsService stmmsService;
  37. @Autowired
  38. private StudentScoreService studentScoreService;
  39. @Autowired
  40. private QuestionService questionService;
  41. @Override
  42. public void importStudent() {
  43. List<QuestionEntity> qs = questionService.findToDispose();
  44. if (CollectionUtils.isEmpty(qs)) {
  45. return;
  46. }
  47. Map<String, List<QuestionEntity>> qmap = new LinkedHashMap<>();
  48. for (QuestionEntity q : qs) {
  49. String key = q.getExamId() + "-" + q.getSubjectCode();
  50. List<QuestionEntity> tem = qmap.get(key);
  51. if (tem == null) {
  52. tem = new ArrayList<>();
  53. qmap.put(key, tem);
  54. }
  55. tem.add(q);
  56. }
  57. for (List<QuestionEntity> qlist : qmap.values()) {
  58. List<StudentVo> students = stmmsService.getUploadStudent(qlist.get(0).getExamId(),
  59. qlist.get(0).getSubjectCode(), sysProperty.getStudentCount());
  60. if (CollectionUtils.isEmpty(students)) {
  61. continue;
  62. }
  63. updateQuestionsStatus(qlist, DataStatus.PROCESSING);
  64. try {
  65. studentScoreService.saveByQuestion(qlist, students);
  66. updateQuestionsStatus(qlist, DataStatus.SUCCESS);
  67. } catch (Exception e) {
  68. log.error("同步考生出错", e);
  69. updateQuestionsStatus(qlist, DataStatus.FAILED);
  70. }
  71. }
  72. }
  73. private void updateQuestionsStatus(List<QuestionEntity> qlist, DataStatus st) {
  74. for (QuestionEntity q : qlist) {
  75. questionService.updateStatus(q.getId(), st);
  76. }
  77. }
  78. @Override
  79. public void buildImage(OcrDto ocrDto) {
  80. if (DataStatus.WAITING.equals(ocrDto.getScore().getAnswerStatus())
  81. || DataStatus.FAILED.equals(ocrDto.getScore().getAnswerStatus())) {
  82. if (AnswerRangeType.TRACK.equals(ocrDto.getQuetion().getAnswerRangeType())
  83. && CollectionUtils.isEmpty(ocrDto.getScore().getImagePosition())) {
  84. return;
  85. } else if (AnswerRangeType.ALL.equals(ocrDto.getQuetion().getAnswerRangeType())
  86. && ocrDto.getScore().getSheetCount() == null) {
  87. return;
  88. }
  89. studentService.createSlice(ocrDto);
  90. }
  91. }
  92. @Override
  93. public void createSlice(OcrDto ocrDto) {
  94. if (ocrDto.getQuetion() == null) {
  95. studentScoreService.updateAnswerErr(ocrDto.getScore().getId(), "未找到试题信息");
  96. return;
  97. }
  98. try {
  99. studentScoreService.createSlice(ocrDto);
  100. } catch (Exception e) {
  101. if (e instanceof StatusException) {
  102. studentScoreService.updateAnswerErr(ocrDto.getScore().getId(), e.getMessage());
  103. } else {
  104. log.error("系统异常", e);
  105. studentScoreService.updateAnswerErr(ocrDto.getScore().getId(), "系统异常");
  106. }
  107. }
  108. }
  109. @Transactional
  110. @Override
  111. public void reset(Long examId, String subjectCode) {
  112. studentScoreService.removeBy(examId, subjectCode);
  113. }
  114. @Transactional
  115. @Override
  116. public void clear(Long examId, String subjectCode) {
  117. studentScoreService.removeBy(examId, subjectCode);
  118. questionService.removeBy(examId, subjectCode);
  119. }
  120. @Override
  121. public void updateMarkingScore(QuestionEntity q, StudentScoreVo score) {
  122. List<Double> list = stmmsService.getMarkScore(score.getStudentId(), q.getMainNumber(), q.getSubNumber());
  123. if (CollectionUtils.isEmpty(list)) {
  124. return;
  125. }
  126. score.setMarkingScore(list.get(0));
  127. if (AnswerRangeType.TRACK.equals(q.getAnswerRangeType())) {
  128. score.setIps(getImagePosition(score.getStudentId(), q.getMainNumber() + "." + q.getSubNumber()));
  129. studentScoreService.updateMarkingScoreAndTrack(score);
  130. } else {
  131. studentScoreService.updateMarkingScore(score);
  132. }
  133. }
  134. private List<ImagePosition> getImagePosition(Long studentId, String questionNumber) {
  135. List<ImagePosition> ret = new ArrayList<>();
  136. List<TrackPosition> tps = stmmsService.getTrackPosition(studentId, questionNumber);
  137. Set<String> set = new HashSet<>();
  138. for (TrackPosition tp : tps) {
  139. Boolean left = tp.getPositionX() < 0.5;
  140. String key = left.toString() + tp.getOffsetIndex();
  141. if (!set.contains(key)) {
  142. ImagePosition ip = new ImagePosition();
  143. ip.setLeft(left);
  144. ip.setPageIndex(tp.getOffsetIndex());
  145. ret.add(ip);
  146. }
  147. }
  148. return ret;
  149. }
  150. }