ExportAiResult.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package com.qmth.distributed.print;
  2. import com.alibaba.fastjson.JSON;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.qmth.boot.api.exception.ApiException;
  5. import com.qmth.boot.tools.excel.ExcelWriter;
  6. import com.qmth.boot.tools.excel.enums.ExcelType;
  7. import com.qmth.distributed.print.dto.ExportAiResultDto;
  8. import com.qmth.teachcloud.common.bean.dto.mark.PictureConfig;
  9. import com.qmth.teachcloud.common.bean.vo.FilePathVo;
  10. import com.qmth.teachcloud.common.contant.SystemConstant;
  11. import com.qmth.teachcloud.common.entity.MarkQuestion;
  12. import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
  13. import com.qmth.teachcloud.common.service.FileUploadService;
  14. import com.qmth.teachcloud.common.util.FileUtil;
  15. import com.qmth.teachcloud.mark.dto.ai.SheetImageDto;
  16. import com.qmth.teachcloud.mark.entity.MarkOcrStudentQuestion;
  17. import com.qmth.teachcloud.mark.entity.MarkStudent;
  18. import com.qmth.teachcloud.mark.entity.MarkTask;
  19. import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
  20. import com.qmth.teachcloud.mark.service.MarkOcrStudentQuestionService;
  21. import com.qmth.teachcloud.mark.service.MarkQuestionService;
  22. import com.qmth.teachcloud.mark.service.MarkStudentService;
  23. import com.qmth.teachcloud.mark.service.MarkTaskService;
  24. import com.qmth.teachcloud.mark.utils.AiUtil;
  25. import org.apache.commons.collections4.CollectionUtils;
  26. import org.junit.Test;
  27. import org.junit.runner.RunWith;
  28. import org.springframework.boot.test.context.SpringBootTest;
  29. import org.springframework.test.context.junit4.SpringRunner;
  30. import javax.annotation.Resource;
  31. import java.io.File;
  32. import java.io.FileOutputStream;
  33. import java.io.IOException;
  34. import java.util.ArrayList;
  35. import java.util.HashMap;
  36. import java.util.List;
  37. import java.util.Map;
  38. import java.util.stream.Collectors;
  39. /**
  40. * 根据名单,导出测试环境AI阅卷结果
  41. */
  42. @SpringBootTest
  43. @RunWith(SpringRunner.class)
  44. public class ExportAiResult {
  45. @Resource
  46. private MarkOcrStudentQuestionService markOcrStudentQuestionService;
  47. @Resource
  48. private MarkStudentService markStudentService;
  49. @Resource
  50. private MarkQuestionService markQuestionService;
  51. @Resource
  52. private MarkTaskService markTaskService;
  53. @Resource
  54. private FileUploadService fileUploadService;
  55. private String rootPath = "/Users/xiaofei/aaaa";
  56. @Test
  57. public void export() {
  58. long questionId = 657572149854208079l;
  59. MarkQuestion markQuestion = markQuestionService.getById(questionId);
  60. List<MarkTask> markTaskList = listMarkTaskByQuestionId(questionId);
  61. List<ExportAiResultDto> list = new ArrayList<>();
  62. for (MarkTask markTask : markTaskList) {
  63. ExportAiResultDto dto = new ExportAiResultDto();
  64. // 识别区域剪切
  65. getOcrRegion(markTask, markQuestion, dto);
  66. list.add(dto);
  67. }
  68. export(list);
  69. }
  70. private void getOcrRegion(MarkTask markTask, MarkQuestion markQuestion, ExportAiResultDto dto) {
  71. List<File> deleteFileList = new ArrayList<>();
  72. Long studentId = markTask.getStudentId();
  73. // 读取考生图片
  74. MarkStudent markStudent = markStudentService.getById(studentId);
  75. dto.setStudentCode(markStudent.getStudentCode());
  76. dto.setMarkerScore(markTask.getMarkerScore());
  77. Map<Integer, SheetImageDto> fileMap = new HashMap<>();
  78. try {
  79. //考生题卡原图
  80. List<FilePathVo> filePathVoList = markStudent.listSheetPath();
  81. for (int i = 0; i < filePathVoList.size(); i++) {
  82. FilePathVo filePathVo = filePathVoList.get(i);
  83. File file = new File(rootPath + File.separator + "sheet" + File.separator + markStudent.getStudentCode() + "-" + (i + 1) + SystemConstant.JPG_PREFIX);
  84. try {
  85. if (!file.exists()) {
  86. file.getParentFile().mkdirs();
  87. file.createNewFile();
  88. }
  89. fileUploadService.downloadFile(filePathVo.getType(), filePathVo.getUploadType(), filePathVo.getPath(), file.getPath());
  90. } catch (Exception e) {
  91. return;
  92. // throw ExceptionResultEnum.ERROR.exception("读取考生原图失败" + ",考号[" + markStudent.getStudentCode() + "。" + e.getMessage());
  93. }
  94. fileMap.put(i + 1, new SheetImageDto(i + 1, file, filePathVo.getMd5(), AiUtil.imageDim(file)));
  95. deleteFileList.add(file);
  96. }
  97. // 题目评卷区
  98. List<PictureConfig> pictureConfigList = JSON.parseArray(markQuestion.getPicList(), PictureConfig.class);
  99. for (int i = 0; i < pictureConfigList.size(); i++) {
  100. PictureConfig pictureConfig = pictureConfigList.get(i);
  101. SheetImageDto sheetImageDto = fileMap.get(pictureConfig.getI());
  102. File file = new File(rootPath + File.separator + (MarkTaskStatus.MARKED.equals(markTask.getStatus()) ? "cut" : "error") + File.separator + markStudent.getStudentCode() + "-" + (i + 1) + SystemConstant.JPG_PREFIX);
  103. if (!file.exists()) {
  104. file.getParentFile().mkdirs();
  105. file.createNewFile();
  106. }
  107. AiUtil.subImg(sheetImageDto, pictureConfig, file);
  108. }
  109. List<MarkOcrStudentQuestion> markOcrStudentQuestions = markOcrStudentQuestionService.listByStudentIdAndQuestionId(studentId, markQuestion.getId());
  110. if (CollectionUtils.isNotEmpty(markOcrStudentQuestions)) {
  111. String result = markOcrStudentQuestions.stream().map(MarkOcrStudentQuestion::getOcrContent).collect(Collectors.joining(";"));
  112. dto.setOcrResult(result);
  113. }
  114. } catch (ApiException e) {
  115. } catch (IOException e) {
  116. } finally {
  117. // if (CollectionUtils.isNotEmpty(deleteFileList)) {
  118. // for (File file : deleteFileList) {
  119. // FileUtil.deleteFile(file);
  120. // }
  121. // }
  122. }
  123. }
  124. private List<MarkTask> listMarkTaskByQuestionId(Long questionId) {
  125. QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
  126. queryWrapper.lambda().eq(MarkTask::getQuestionId, questionId)
  127. .orderByAsc(MarkTask::getStudentId);
  128. return markTaskService.list(queryWrapper);
  129. }
  130. public void export(List<ExportAiResultDto> list) {
  131. try {
  132. File file = new File(rootPath + File.separator + "学生名单" + SystemConstant.EXCEL_PREFIX);
  133. if (!file.exists()) {
  134. file.getParentFile().mkdirs();
  135. file.createNewFile();
  136. }
  137. FileOutputStream outputStream = new FileOutputStream(file);
  138. ExcelWriter writer = ExcelWriter.create(ExcelType.XLSX);
  139. writer.writeObjects("学生名单", null, ExportAiResultDto.class, list.listIterator());
  140. writer.output(outputStream);
  141. outputStream.flush();
  142. outputStream.close();
  143. } catch (Exception e) {
  144. throw new RuntimeException(e);
  145. }
  146. }
  147. }