PaperStructureServiceImpl.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package cn.com.qmth.scancentral.service.impl;
  2. import cn.com.qmth.scancentral.bean.card.CardFile;
  3. import cn.com.qmth.scancentral.bean.card.CardPage;
  4. import cn.com.qmth.scancentral.bean.card.FillArea;
  5. import cn.com.qmth.scancentral.bean.card.FillItem;
  6. import cn.com.qmth.scancentral.dao.PaperStructureDao;
  7. import cn.com.qmth.scancentral.entity.PaperStructureEntity;
  8. import cn.com.qmth.scancentral.enums.OmrField;
  9. import cn.com.qmth.scancentral.service.PaperStructureService;
  10. import cn.com.qmth.scancentral.vo.paperstructureinfo.PaperStructure;
  11. import cn.com.qmth.scancentral.vo.paperstructureinfo.PaperStructureVo;
  12. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  13. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  14. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  15. import com.qmth.boot.core.exception.ParameterException;
  16. import org.apache.commons.collections4.CollectionUtils;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.cache.annotation.CacheEvict;
  19. import org.springframework.cache.annotation.Cacheable;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import java.util.ArrayList;
  23. import java.util.Comparator;
  24. import java.util.List;
  25. import java.util.stream.Collectors;
  26. @Service
  27. public class PaperStructureServiceImpl extends ServiceImpl<PaperStructureDao, PaperStructureEntity>
  28. implements PaperStructureService {
  29. @Autowired
  30. private PaperStructureService paperStructureService;
  31. @Transactional
  32. @Override
  33. public void updateByAnswerCard(CardFile cardFile, Long examId, Integer cardNumber) {
  34. if (examId == null) {
  35. throw new ParameterException("考试ID不能为空");
  36. }
  37. if (cardNumber == null) {
  38. throw new ParameterException("卡格式编号不能为空");
  39. }
  40. paperStructureService.deleteByAnswerCard(examId, cardNumber);
  41. List<PaperStructureEntity> pss = parse(cardFile, examId, cardNumber);
  42. if (CollectionUtils.isNotEmpty(pss)) {
  43. this.saveOrUpdateBatch(pss);
  44. }
  45. }
  46. @Transactional
  47. @Override
  48. @CacheEvict(value = "PAPER_STRUCTURE", key = "#examId-#cardNumber", beforeInvocation = true)
  49. public void deleteByAnswerCard(Long examId, Integer cardNumber) {
  50. if (examId == null) {
  51. throw new ParameterException("考试ID不能为空");
  52. }
  53. if (cardNumber == null) {
  54. throw new ParameterException("卡格式编号不能为空");
  55. }
  56. QueryWrapper<PaperStructureEntity> wrapper = new QueryWrapper<>();
  57. LambdaQueryWrapper<PaperStructureEntity> lw = wrapper.lambda();
  58. lw.eq(PaperStructureEntity::getExamId, examId);
  59. lw.eq(PaperStructureEntity::getCardNumber, cardNumber);
  60. this.baseMapper.delete(wrapper);
  61. }
  62. private List<PaperStructureEntity> parse(CardFile cardFile, Long examId, Integer cardNumber) {
  63. List<PaperStructureEntity> pss = new ArrayList<>();
  64. if (cardFile.getPages() != null) {
  65. int pageCount = cardFile.getPages().size();
  66. int paperNumber = 0;
  67. int pageIndex = 0;
  68. for (int i = 0; i < pageCount; i++) {
  69. paperNumber = (i + 2) / 2;
  70. int mod = (i + 1) % 2;
  71. pageIndex = (mod == 0 ? 2 : mod);
  72. CardPage page = cardFile.getPages().get(i).getExchange();
  73. if (page.getFillArea() != null) {
  74. // 提取客观题
  75. buildStructEntity(examId, cardNumber, paperNumber, pageIndex, pss, OmrField.QUESTION,
  76. page.getFillArea().stream().filter(fillArea -> fillArea.getField().equals("question"))
  77. .sorted(Comparator.comparingInt(FillArea::getIndex)).collect(Collectors.toList()));
  78. // 提取选做题
  79. buildStructEntity(examId, cardNumber, paperNumber, pageIndex, pss, OmrField.SELECTIVE,
  80. page.getFillArea().stream().filter(fillArea -> fillArea.getField().equals("selective"))
  81. .sorted(Comparator.comparingInt(FillArea::getIndex)).collect(Collectors.toList()));
  82. }
  83. }
  84. }
  85. return pss;
  86. }
  87. @SuppressWarnings("unused")
  88. private void buildStructEntity(Long examId, Integer cardNumber, int paperNumber, int pageIndex,
  89. List<PaperStructureEntity> pss, OmrField omrField, List<FillArea> areaList) {
  90. int number = 0;
  91. for (FillArea fillArea : areaList) {
  92. for (FillItem item : fillArea.getItems()) {
  93. number++;
  94. PaperStructureEntity ps = new PaperStructureEntity();
  95. pss.add(ps);
  96. ps.setExamId(examId);
  97. ps.setCardNumber(cardNumber);
  98. ps.setPaperNumber(paperNumber);
  99. ps.setPageIndex(pageIndex);
  100. ps.setField(omrField);
  101. ps.setSingle(fillArea.isSingle());
  102. ps.setQuestionNumber(number);
  103. }
  104. }
  105. }
  106. @Override
  107. @Cacheable(value = "PAPER_STRUCTURE", key = "#examId-#cardNumber", unless = "#result == null")
  108. public PaperStructureVo getByAnswerCard(Long examId, Integer cardNumber) {
  109. if (examId == null) {
  110. throw new ParameterException("考试ID不能为空");
  111. }
  112. if (cardNumber == null) {
  113. throw new ParameterException("卡格式编号不能为空");
  114. }
  115. QueryWrapper<PaperStructureEntity> wrapper = new QueryWrapper<>();
  116. LambdaQueryWrapper<PaperStructureEntity> lw = wrapper.lambda();
  117. lw.eq(PaperStructureEntity::getExamId, examId);
  118. lw.eq(PaperStructureEntity::getCardNumber, cardNumber);
  119. List<PaperStructureEntity> list = this.list(wrapper);
  120. if (CollectionUtils.isEmpty(list)) {
  121. return null;
  122. }
  123. PaperStructureVo vo = new PaperStructureVo();
  124. List<PaperStructure> selective = new ArrayList<PaperStructure>();
  125. List<PaperStructure> question = new ArrayList<PaperStructure>();
  126. vo.setQuestion(question);
  127. vo.setSelective(selective);
  128. for (PaperStructureEntity e : list) {
  129. if (OmrField.QUESTION.equals(e.getField())) {
  130. question.add(PaperStructure.of(e));
  131. } else if (OmrField.SELECTIVE.equals(e.getField())) {
  132. question.add(PaperStructure.of(e));
  133. }
  134. }
  135. return vo;
  136. }
  137. @Override
  138. public PaperStructure getPaperStructure(Long examId, Integer cardNumber, Integer paperNumber, Integer pageIndex,
  139. Integer questionNumber, OmrField omrField) {
  140. if (examId == null) {
  141. throw new ParameterException("考试ID不能为空");
  142. }
  143. if (cardNumber == null) {
  144. throw new ParameterException("卡格式编号不能为空");
  145. }
  146. if (paperNumber == null) {
  147. throw new ParameterException("paperNumber不能为空");
  148. }
  149. if (pageIndex == null) {
  150. throw new ParameterException("pageIndex不能为空");
  151. }
  152. if (questionNumber == null) {
  153. throw new ParameterException("questionNumber不能为空");
  154. }
  155. if (omrField == null) {
  156. throw new ParameterException("omrField不能为空");
  157. }
  158. PaperStructureVo vo = paperStructureService.getByAnswerCard(examId, cardNumber);
  159. if (vo == null) {
  160. return null;
  161. }
  162. List<PaperStructure> question = null;
  163. if (OmrField.QUESTION.equals(omrField)) {
  164. question = vo.getQuestion();
  165. } else if (OmrField.SELECTIVE.equals(omrField)) {
  166. question = vo.getSelective();
  167. }
  168. if (CollectionUtils.isEmpty(question)) {
  169. return null;
  170. }
  171. for (PaperStructure ps : question) {
  172. if (paperNumber.intValue() == ps.getPaperNumber().intValue()
  173. && pageIndex.intValue() == ps.getPageIndex().intValue()
  174. && questionNumber.intValue() == ps.getQuestionNumber().intValue()) {
  175. return ps;
  176. }
  177. }
  178. return null;
  179. }
  180. }