ScanAnswerController.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. package cn.com.qmth.scancentral.controller.admin;
  2. import java.io.IOException;
  3. import java.net.URLEncoder;
  4. import java.util.Collection;
  5. import java.util.List;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.validation.annotation.Validated;
  9. import org.springframework.web.bind.annotation.PostMapping;
  10. import org.springframework.web.bind.annotation.RequestBody;
  11. import org.springframework.web.bind.annotation.RequestMapping;
  12. import org.springframework.web.bind.annotation.RequestMethod;
  13. import org.springframework.web.bind.annotation.RequestParam;
  14. import org.springframework.web.bind.annotation.RestController;
  15. import org.springframework.web.multipart.MultipartFile;
  16. import com.qmth.boot.api.annotation.Aac;
  17. import com.qmth.boot.api.constant.ApiConstant;
  18. import com.qmth.boot.core.collection.PageResult;
  19. import com.qmth.boot.tools.excel.ExcelWriter;
  20. import com.qmth.boot.tools.excel.enums.ExcelType;
  21. import com.qmth.boot.tools.iterator.PageListIterator;
  22. import cn.com.qmth.scancentral.bean.AnswerDeleteDomain;
  23. import cn.com.qmth.scancentral.bean.AnswerQueryDomain;
  24. import cn.com.qmth.scancentral.bean.BatchQueryDomain;
  25. import cn.com.qmth.scancentral.bean.MismatchQueryDomain;
  26. import cn.com.qmth.scancentral.bean.MismatchToggleDomain;
  27. import cn.com.qmth.scancentral.bean.PageDeleteDomain;
  28. import cn.com.qmth.scancentral.bean.omredit.OmrEditDomain;
  29. import cn.com.qmth.scancentral.bean.omredit.OmrFieldEditDomain;
  30. import cn.com.qmth.scancentral.bean.papermigrate.PaperMigrateDomain;
  31. import cn.com.qmth.scancentral.bean.refix.AnswerRefixDomain;
  32. import cn.com.qmth.scancentral.controller.BaseController;
  33. import cn.com.qmth.scancentral.entity.ExamEntity;
  34. import cn.com.qmth.scancentral.entity.ExamSummaryEntity;
  35. import cn.com.qmth.scancentral.enums.ExamMode;
  36. import cn.com.qmth.scancentral.service.BatchService;
  37. import cn.com.qmth.scancentral.service.ExamService;
  38. import cn.com.qmth.scancentral.service.ExamSummaryService;
  39. import cn.com.qmth.scancentral.service.PaperService;
  40. import cn.com.qmth.scancentral.service.StudentService;
  41. import cn.com.qmth.scancentral.vo.AnswerDeleteVo;
  42. import cn.com.qmth.scancentral.vo.AnswerExportK12Vo;
  43. import cn.com.qmth.scancentral.vo.AnswerExportVo;
  44. import cn.com.qmth.scancentral.vo.AnswerRefixVo;
  45. import cn.com.qmth.scancentral.vo.BatchQueryVo;
  46. import cn.com.qmth.scancentral.vo.MismatchToggleVo;
  47. import cn.com.qmth.scancentral.vo.PaperDeleteVo;
  48. import cn.com.qmth.scancentral.vo.PaperMigrateVo;
  49. import cn.com.qmth.scancentral.vo.ScanAnswerInfoVo;
  50. import cn.com.qmth.scancentral.vo.UpdateTimeVo;
  51. import cn.com.qmth.scancentral.vo.UriVo;
  52. import cn.com.qmth.scancentral.vo.answerquery.AnswerQueryVo;
  53. import cn.com.qmth.scancentral.vo.batchdetail.BatchDetailVo;
  54. import cn.com.qmth.scancentral.vo.mismatchquery.MismatchQueryVo;
  55. import cn.com.qmth.scancentral.vo.student.StudentExamRoomVo;
  56. import cn.com.qmth.scancentral.vo.student.StudentVo;
  57. import io.swagger.annotations.Api;
  58. import io.swagger.annotations.ApiOperation;
  59. @RestController
  60. @Api(tags = "扫描管理-答题卡接口")
  61. @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/admin/scan/answer")
  62. @Aac(strict = false, auth = true)
  63. public class ScanAnswerController extends BaseController {
  64. @Autowired
  65. private BatchService batchService;
  66. @Autowired
  67. private PaperService paperService;
  68. @Autowired
  69. private ExamService examService;
  70. @Autowired
  71. private StudentService studentService;
  72. @Autowired
  73. private ExamSummaryService examSummaryService;
  74. @ApiOperation(value = "查询答题卡扫描批次所有关联的扫描员")
  75. @RequestMapping(value = "batch/scanner", method = RequestMethod.POST)
  76. public List<String> batchScanner(@RequestParam Long examId) {
  77. return batchService.batchScanner(examId);
  78. }
  79. @ApiOperation(value = "查询答题卡扫描批次信息")
  80. @RequestMapping(value = "batch/query", method = RequestMethod.POST)
  81. public PageResult<BatchQueryVo> batchQuery(@Validated BatchQueryDomain query) {
  82. return batchService.batchQuery(query);
  83. }
  84. @ApiOperation(value = "查询答题卡扫描批次概要")
  85. @RequestMapping(value = "batch/summary", method = RequestMethod.POST)
  86. public List<Long> batchSummary(@Validated BatchQueryDomain query) {
  87. return batchService.batchSummary(query);
  88. }
  89. @ApiOperation(value = "查询答题卡扫描批次详情")
  90. @RequestMapping(value = "batch/detail", method = RequestMethod.POST)
  91. public BatchDetailVo batchDetail(@RequestParam Long id) {
  92. return batchService.batchDetail(id);
  93. }
  94. @ApiOperation(value = "查询异常答题卡信息")
  95. @RequestMapping(value = "mismatch/query", method = RequestMethod.POST)
  96. public PageResult<MismatchQueryVo> mismatchQuery(@Validated MismatchQueryDomain query) {
  97. return paperService.mismatchQuery(query);
  98. }
  99. @ApiOperation(value = "修改异常答题卡标记")
  100. @RequestMapping(value = "mismatch/toggle", method = RequestMethod.POST)
  101. public MismatchToggleVo mismatchToggle(@Validated MismatchToggleDomain domain) {
  102. return paperService.mismatchToggle(domain);
  103. }
  104. @ApiOperation(value = "答题卡扫描汇总")
  105. @PostMapping("info")
  106. public ScanAnswerInfoVo scanAnswerInfo(@RequestParam Long examId) {
  107. ExamSummaryEntity es = examSummaryService.find(examId);
  108. ScanAnswerInfoVo vo = new ScanAnswerInfoVo();
  109. vo.setTotalCount(es.getStudentCount());
  110. vo.setScannedCount(es.getAnswerScannedCount());
  111. vo.setUnexistCount(es.getAnswerUnexistCount());
  112. vo.setManualAbsentCount(es.getAnswerManualAbsentCount());
  113. vo.setOmrAbsentCount(es.getAnswerOmrAbsentCount());
  114. vo.setAbsentSuspectCount(es.getAnswerAbsentSuspectCount());
  115. vo.setAssignedCount(es.getAnswerAssignedCount());
  116. vo.setIncompleteCount(es.getAnswerIncompleteCount());
  117. return vo;
  118. }
  119. @ApiOperation(value = "查询答题卡扫描详情")
  120. @RequestMapping(value = "query", method = RequestMethod.POST)
  121. public PageResult<AnswerQueryVo> query(@Validated AnswerQueryDomain query) {
  122. return studentService.query(query);
  123. }
  124. @ApiOperation(value = "查询答题卡扫描概要")
  125. @RequestMapping(value = "summary", method = RequestMethod.POST)
  126. public List<String> summary(@Validated AnswerQueryDomain query) {
  127. return studentService.summary(query);
  128. }
  129. @ApiOperation(value = "导出答题卡扫描详情")
  130. @RequestMapping(value = "export", method = RequestMethod.POST)
  131. public void export(@Validated AnswerQueryDomain query, HttpServletResponse response) throws IOException {
  132. String fileName = URLEncoder.encode("答题卡扫描详情", "UTF-8");
  133. response.setHeader("Content-Disposition", "inline; filename=" + fileName + ".xlsx");
  134. response.setContentType("application/vnd.ms-excel");
  135. ExcelWriter writer = ExcelWriter.create(ExcelType.XLSX);
  136. ExamEntity exam = examService.getById(query.getExamId());
  137. if (ExamMode.K12.equals(exam.getMode())) {
  138. PageListIterator<AnswerExportK12Vo> iterator = new PageListIterator<AnswerExportK12Vo>(5000) {
  139. @Override
  140. public Collection<AnswerExportK12Vo> getPageList(int pageNumber, int pageSize) {
  141. query.setPageNumber(pageNumber);
  142. query.setPageSize(pageSize);
  143. return studentService.exportListK12(query);
  144. }
  145. };
  146. writer.writeObjects("扫描详情", null, AnswerExportK12Vo.class, iterator);
  147. writer.output(response.getOutputStream());
  148. } else {
  149. PageListIterator<AnswerExportVo> iterator = new PageListIterator<AnswerExportVo>(5000) {
  150. @Override
  151. public Collection<AnswerExportVo> getPageList(int pageNumber, int pageSize) {
  152. query.setPageNumber(pageNumber);
  153. query.setPageSize(pageSize);
  154. return studentService.exportList(query);
  155. }
  156. };
  157. writer.writeObjects("扫描详情", null, AnswerExportVo.class, iterator);
  158. writer.output(response.getOutputStream());
  159. }
  160. }
  161. @ApiOperation(value = "修改答题卡识别结果")
  162. @RequestMapping(value = "omr/edit", method = RequestMethod.POST)
  163. public UpdateTimeVo omrEdit(@Validated @RequestBody OmrEditDomain domain) {
  164. return studentService.omrEdit(getAccessUser(), domain);
  165. }
  166. @ApiOperation(value = "按类型修改卷型、识别结果等")
  167. @RequestMapping(value = "omr/field/edit", method = RequestMethod.POST)
  168. public UpdateTimeVo omrFieldEdit(@Validated @RequestBody OmrFieldEditDomain domain) {
  169. return studentService.omrFieldEdit(getAccessUser(), domain);
  170. }
  171. @ApiOperation(value = "更新答题卡裁切图")
  172. @RequestMapping(value = "slice/update", method = RequestMethod.POST)
  173. public UriVo sliceUpdate(@RequestParam Long paperId, @RequestParam Integer pageIndex, @RequestParam Integer index,
  174. @RequestParam MultipartFile file, @RequestParam String md5) {
  175. return paperService.adminSliceUpdate(paperId, pageIndex, index, file, md5);
  176. }
  177. @ApiOperation(value = "更新答题卡原图")
  178. @RequestMapping(value = "sheet/update", method = RequestMethod.POST)
  179. public UriVo sheetUpdate(@RequestParam Long paperId, @RequestParam Integer pageIndex,
  180. @RequestParam MultipartFile file, @RequestParam String md5) {
  181. return paperService.adminSheetUpdate(paperId, pageIndex, file, md5);
  182. }
  183. @ApiOperation(value = "上传答题卡裁切图")
  184. @RequestMapping(value = "slice/upload", method = RequestMethod.POST)
  185. public UriVo sliceUpload(@RequestParam Long paperId, @RequestParam Integer pageIndex, @RequestParam Integer index,
  186. @RequestParam MultipartFile file, @RequestParam String md5) {
  187. return paperService.adminSliceUpload(paperId, pageIndex, index, file, md5);
  188. }
  189. @ApiOperation(value = "修改答题卡扫描图片绑定考生")
  190. @RequestMapping(value = "paper/migrate", method = RequestMethod.POST)
  191. public PaperMigrateVo paperMigrate(@Validated @RequestBody PaperMigrateDomain domain) {
  192. return paperService.paperMigrate(getAccessUser(), domain);
  193. }
  194. @ApiOperation(value = "删除答题卡单页扫描结果")
  195. @RequestMapping(value = "paper/delete", method = RequestMethod.POST)
  196. public PaperDeleteVo paperDelete(@Validated PageDeleteDomain domain) {
  197. return studentService.paperDelete(getAccessUser(), domain);
  198. }
  199. @ApiOperation(value = "删除答题卡扫描结果")
  200. @RequestMapping(value = "delete", method = RequestMethod.POST)
  201. public AnswerDeleteVo answerDelete(@Validated AnswerDeleteDomain domain) {
  202. return studentService.answerDelete(getAccessUser(), domain);
  203. }
  204. @ApiOperation(value = "答题卡二次识别")
  205. @RequestMapping(value = "refix", method = RequestMethod.POST)
  206. public AnswerRefixVo refix(@Validated @RequestBody AnswerRefixDomain query) {
  207. return studentService.answerRefix(getAccessUser(), query);
  208. }
  209. @ApiOperation(value = "按考生导出答题卡扫描详情")
  210. @PostMapping(value = "student/export")
  211. public void studentExport(@Validated AnswerQueryDomain query, HttpServletResponse response) throws IOException {
  212. String fileName = URLEncoder.encode("按考生导出", "UTF-8");
  213. response.setHeader("Content-Disposition", "inline; filename=" + fileName + ".xlsx");
  214. response.setContentType("application/vnd.ms-excel");
  215. ExcelWriter writer = ExcelWriter.create(ExcelType.XLSX);
  216. PageListIterator<StudentVo> iterator = new PageListIterator<StudentVo>(5000) {
  217. @Override
  218. public Collection<StudentVo> getPageList(int pageNumber, int pageSize) {
  219. query.setPageNumber(pageNumber);
  220. query.setPageSize(pageSize);
  221. return studentService.studentExportList(query);
  222. }
  223. };
  224. writer.writeObjects("按考生导出", null, StudentVo.class, iterator);
  225. writer.output(response.getOutputStream());
  226. }
  227. @ApiOperation(value = "按考场导出答题卡扫描详情")
  228. @PostMapping(value = "exam-room/export")
  229. public void studentExamRoomExport(@Validated AnswerQueryDomain query, HttpServletResponse response)
  230. throws IOException {
  231. String fileName = URLEncoder.encode("按考场导出", "UTF-8");
  232. response.setHeader("Content-Disposition", "inline; filename=" + fileName + ".xlsx");
  233. response.setContentType("application/vnd.ms-excel");
  234. ExcelWriter writer = ExcelWriter.create(ExcelType.XLSX);
  235. PageListIterator<StudentExamRoomVo> iterator = new PageListIterator<StudentExamRoomVo>(5000) {
  236. @Override
  237. public Collection<StudentExamRoomVo> getPageList(int pageNumber, int pageSize) {
  238. query.setPageNumber(pageNumber);
  239. query.setPageSize(pageSize);
  240. return studentService.studentExamRoomExportList(query);
  241. }
  242. };
  243. writer.writeObjects("按考场导出", null, StudentExamRoomVo.class, iterator);
  244. writer.output(response.getOutputStream());
  245. }
  246. }