AdminController.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. package cn.com.qmth.am.controller;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.PrintWriter;
  6. import java.math.BigDecimal;
  7. import java.util.ArrayList;
  8. import java.util.Comparator;
  9. import java.util.HashMap;
  10. import java.util.HashSet;
  11. import java.util.LinkedHashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.Set;
  15. import javax.servlet.http.HttpServletResponse;
  16. import org.apache.commons.collections4.CollectionUtils;
  17. import org.apache.commons.io.FileUtils;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.web.bind.annotation.RequestMapping;
  20. import org.springframework.web.bind.annotation.RequestMethod;
  21. import org.springframework.web.bind.annotation.RequestParam;
  22. import org.springframework.web.bind.annotation.RestController;
  23. import org.springframework.web.multipart.MultipartFile;
  24. import com.alibaba.fastjson.util.IOUtils;
  25. import com.qmth.boot.api.annotation.Aac;
  26. import com.qmth.boot.api.constant.ApiConstant;
  27. import com.qmth.boot.core.concurrent.service.ConcurrentService;
  28. import cn.com.qmth.am.bean.DataKey;
  29. import cn.com.qmth.am.bean.ExportExcelDto;
  30. import cn.com.qmth.am.bean.ModelSpeed;
  31. import cn.com.qmth.am.bean.StudentScoreVo;
  32. import cn.com.qmth.am.config.SysProperty;
  33. import cn.com.qmth.am.entity.QuestionEntity;
  34. import cn.com.qmth.am.entity.StudentScoreEntity;
  35. import cn.com.qmth.am.enums.DataStatus;
  36. import cn.com.qmth.am.enums.ImportFileName;
  37. import cn.com.qmth.am.enums.LockType;
  38. import cn.com.qmth.am.service.QuestionService;
  39. import cn.com.qmth.am.service.StudentScoreService;
  40. import cn.com.qmth.am.service.StudentService;
  41. import cn.com.qmth.am.utils.Calculator;
  42. import cn.com.qmth.am.utils.ExportUtils;
  43. import io.swagger.annotations.ApiOperation;
  44. @RestController
  45. @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/admin")
  46. @Aac(strict = false, auth = false)
  47. public class AdminController {
  48. @Autowired
  49. private ModelSpeed modelSpeed;
  50. @Autowired
  51. private QuestionService questionService;
  52. @Autowired
  53. private StudentService studentService;
  54. @Autowired
  55. private StudentScoreService studentScoreService;
  56. @Autowired
  57. private SysProperty sysProperty;
  58. @Autowired
  59. private ConcurrentService concurrentService;
  60. @ApiOperation(value = "导出数据")
  61. @RequestMapping(value = "export", method = RequestMethod.GET)
  62. public void exportExcel(HttpServletResponse response, @RequestParam Long examId,
  63. @RequestParam(required = false) String subjectCode, @RequestParam(required = false) Boolean exZero,
  64. @RequestParam(required = false) Integer count, @RequestParam(required = false) Integer score) {
  65. List<ExportExcelDto> ret = new ArrayList<>();
  66. List<QuestionEntity> qs = questionService.findByExamIdAndSubject(examId, subjectCode);
  67. if (CollectionUtils.isNotEmpty(qs)) {
  68. for (QuestionEntity q : qs) {
  69. List<StudentScoreEntity> scores = studentScoreService.findBy(q.getId(), exZero, count, score);
  70. if (CollectionUtils.isNotEmpty(scores)) {
  71. ExportExcelDto dto = new ExportExcelDto();
  72. ret.add(dto);
  73. double[] a = new double[scores.size()];
  74. double[] b = new double[scores.size()];
  75. int i = 0;
  76. for (StudentScoreEntity s : scores) {
  77. a[i] = s.getAiScore();
  78. b[i] = s.getMarkingScore();
  79. i++;
  80. }
  81. dto.setExamId(q.getExamId() + "");
  82. dto.setXgxs(new BigDecimal(Calculator.correlation(a, b)).setScale(2, BigDecimal.ROUND_HALF_UP)
  83. .doubleValue() + "");
  84. double avg1 = new BigDecimal(Calculator.mean(a)).setScale(2, BigDecimal.ROUND_HALF_UP)
  85. .doubleValue();
  86. dto.setAiAvg(avg1 + "");
  87. double avg2 = new BigDecimal(Calculator.mean(b)).setScale(2, BigDecimal.ROUND_HALF_UP)
  88. .doubleValue();
  89. dto.setSubjectCode(q.getSubjectCode());
  90. dto.setMarkingAvg(avg2 + "");
  91. dto.setSubjectName(q.getSubjectName());
  92. dto.setQuestionTitle(q.getTitle());
  93. dto.setQuetionNum(q.getMainNumber() + "-" + q.getSubNumber());
  94. dto.setFullScore(q.getFullScore().toString());
  95. dto.setTotalCount(scores.size() + "");
  96. dto.setValidCount(scores.size() + "");
  97. double avgdiff = Calculator.subtract(avg1, avg2, 2);
  98. if (avgdiff < 0) {
  99. avgdiff = 0 - avgdiff;
  100. }
  101. dto.setAvgDiff(avgdiff + "");
  102. fill(scores, dto, q.getFullScore(), score);
  103. }
  104. }
  105. }
  106. ExportUtils.exportExcel("机评数据", ExportExcelDto.class, ret, response);
  107. }
  108. @ApiOperation(value = "分析数据")
  109. @RequestMapping(value = "fenxi", method = RequestMethod.GET)
  110. public void fenxi(HttpServletResponse response, @RequestParam Long examId,
  111. @RequestParam(required = false) String subjectCode, @RequestParam(required = false) Boolean exZero,
  112. @RequestParam(required = false) Integer count, @RequestParam(required = false) Integer score) {
  113. StringBuilder sb = new StringBuilder();
  114. List<QuestionEntity> qs = questionService.findByExamIdAndSubject(examId, subjectCode);
  115. if (CollectionUtils.isEmpty(qs)) {
  116. sb.append("试题数:0");
  117. returnJson(sb.toString(), response);
  118. return;
  119. }
  120. sb.append("试题数:" + qs.size() + "\r\n");
  121. for (QuestionEntity q : qs) {
  122. sb.append(
  123. "---------------------------------------------------------------------------------------------------------------------------------\r\n");
  124. List<StudentScoreEntity> scores = studentScoreService.findBy(q.getId(), exZero, count, score);
  125. if (CollectionUtils.isEmpty(scores)) {
  126. sb.append(q.getSubjectCode() + "|" + q.getMainNumber() + "|" + q.getSubNumber() + "| 相关系数:- \r\n");
  127. } else {
  128. double[] a = new double[scores.size()];
  129. double[] b = new double[scores.size()];
  130. int i = 0;
  131. for (StudentScoreEntity s : scores) {
  132. a[i] = s.getAiScore();
  133. b[i] = s.getMarkingScore();
  134. i++;
  135. }
  136. try {
  137. double ret = new BigDecimal(Calculator.correlation(a, b)).setScale(2, BigDecimal.ROUND_HALF_UP)
  138. .doubleValue();
  139. double avg1 = new BigDecimal(Calculator.mean(a)).setScale(2, BigDecimal.ROUND_HALF_UP)
  140. .doubleValue();
  141. double avg2 = new BigDecimal(Calculator.mean(b)).setScale(2, BigDecimal.ROUND_HALF_UP)
  142. .doubleValue();
  143. double diff = Calculator.absoluteDiff(avg1, avg2, 2);
  144. sb.append(q.getSubjectCode() + "|" + q.getMainNumber() + "|" + q.getSubNumber() + "| 题目满分:"
  145. + q.getFullScore() + "| 相关系数:" + ret + "| 人评均分:" + avg2 + "| 机评均分:" + avg1 + " | 均分差值:"
  146. + diff + "| 题数:" + scores.size() + " \r\n");
  147. fill(scores, sb, q.getFullScore(), score);
  148. fillMarkingCount(scores, sb);
  149. fillAiCount(scores, sb);
  150. } catch (Exception e) {
  151. sb.append(
  152. q.getSubjectCode() + "|" + q.getMainNumber() + "|" + q.getSubNumber() + "| 相关系数出错:- \r\n");
  153. }
  154. }
  155. }
  156. returnJson(sb.toString(), response);
  157. }
  158. private void fill(List<StudentScoreEntity> scores, ExportExcelDto dto, Double questionScore, Integer score) {
  159. int total = scores.size();
  160. int st = 0;
  161. Map<DataKey, Integer> ret = new HashMap<>();
  162. for (StudentScoreEntity s : scores) {
  163. DataKey k = getKey(s.getAiScore() - s.getMarkingScore());
  164. Integer tem = ret.get(k);
  165. if (tem == null) {
  166. tem = 0;
  167. }
  168. ret.put(k, tem + 1);
  169. }
  170. List<DataKey> ks = new ArrayList<>(ret.keySet());
  171. ks.sort(new Comparator<DataKey>() {
  172. @Override
  173. public int compare(DataKey o1, DataKey o2) {
  174. int c1 = o1.getIndex();
  175. int c2 = o2.getIndex();
  176. if (c1 < c2) {
  177. return -1;
  178. } else if (c1 > c2) {
  179. return 1;
  180. } else {
  181. return 0;
  182. }
  183. }
  184. });
  185. double roundedValue = Math.round(questionScore * 0.3);
  186. if (score != null) {
  187. roundedValue = score;
  188. }
  189. dto.setSameScoreRange(roundedValue + "");
  190. StringBuilder sb = new StringBuilder();
  191. for (DataKey k : ks) {
  192. Integer c = ret.get(k);
  193. if (k.getIndex() < roundedValue) {
  194. st = st + c;
  195. }
  196. sb.append(" " + k.getKey() + " " + c + " " + Calculator.percentage(c, total, 2) + " \r\n");
  197. }
  198. dto.setSame(Calculator.percentage(st, total, 2));
  199. dto.setSameCount(st + "");
  200. dto.setSameDesc(sb.toString());
  201. }
  202. private void fill(List<StudentScoreEntity> scores, StringBuilder sb, Double questionScore, Integer score) {
  203. int total = scores.size();
  204. int st = 0;
  205. Map<DataKey, Integer> ret = new HashMap<>();
  206. for (StudentScoreEntity s : scores) {
  207. DataKey k = getKey(s.getAiScore() - s.getMarkingScore());
  208. Integer tem = ret.get(k);
  209. if (tem == null) {
  210. tem = 0;
  211. }
  212. ret.put(k, tem + 1);
  213. }
  214. List<DataKey> ks = new ArrayList<>(ret.keySet());
  215. ks.sort(new Comparator<DataKey>() {
  216. @Override
  217. public int compare(DataKey o1, DataKey o2) {
  218. int c1 = o1.getIndex();
  219. int c2 = o2.getIndex();
  220. if (c1 < c2) {
  221. return -1;
  222. } else if (c1 > c2) {
  223. return 1;
  224. } else {
  225. return 0;
  226. }
  227. }
  228. });
  229. double roundedValue = Math.round(questionScore * 0.3);
  230. if (score != null) {
  231. roundedValue = score;
  232. }
  233. sb.append(" 差值分档: \r\n");
  234. for (DataKey k : ks) {
  235. Integer c = ret.get(k);
  236. if (k.getIndex() < roundedValue) {
  237. st = st + c;
  238. }
  239. sb.append(" " + k.getKey() + "\t" + c + "\t" + Calculator.percentage(c, total, 2)
  240. + " \r\n");
  241. }
  242. sb.append(" 一致率(≤" + roundedValue + "分)\t" + st + "\t" + Calculator.percentage(st, total, 2)
  243. + " \r\n");
  244. }
  245. private void fillMarkingCount(List<StudentScoreEntity> scores, StringBuilder sb) {
  246. int total = scores.size();
  247. Map<DataKey, Integer> ret = new HashMap<>();
  248. for (StudentScoreEntity s : scores) {
  249. DataKey k = getKey(s.getMarkingScore());
  250. Integer tem = ret.get(k);
  251. if (tem == null) {
  252. tem = 0;
  253. }
  254. ret.put(k, tem + 1);
  255. }
  256. List<DataKey> ks = new ArrayList<>(ret.keySet());
  257. ks.sort(new Comparator<DataKey>() {
  258. @Override
  259. public int compare(DataKey o1, DataKey o2) {
  260. int c1 = o1.getIndex();
  261. int c2 = o2.getIndex();
  262. if (c1 < c2) {
  263. return -1;
  264. } else if (c1 > c2) {
  265. return 1;
  266. } else {
  267. return 0;
  268. }
  269. }
  270. });
  271. sb.append(" 人评分档: \r\n");
  272. for (DataKey k : ks) {
  273. Integer c = ret.get(k);
  274. sb.append(" " + k.getKey() + " " + c + " " + Calculator.percentage(c, total, 2) + " \r\n");
  275. }
  276. }
  277. private void fillAiCount(List<StudentScoreEntity> scores, StringBuilder sb) {
  278. int total = scores.size();
  279. Map<DataKey, Integer> ret = new HashMap<>();
  280. for (StudentScoreEntity s : scores) {
  281. DataKey k = getKey(s.getAiScore());
  282. Integer tem = ret.get(k);
  283. if (tem == null) {
  284. tem = 0;
  285. }
  286. ret.put(k, tem + 1);
  287. }
  288. List<DataKey> ks = new ArrayList<>(ret.keySet());
  289. ks.sort(new Comparator<DataKey>() {
  290. @Override
  291. public int compare(DataKey o1, DataKey o2) {
  292. int c1 = o1.getIndex();
  293. int c2 = o2.getIndex();
  294. if (c1 < c2) {
  295. return -1;
  296. } else if (c1 > c2) {
  297. return 1;
  298. } else {
  299. return 0;
  300. }
  301. }
  302. });
  303. sb.append(" 机评分档: \r\n");
  304. for (DataKey k : ks) {
  305. Integer c = ret.get(k);
  306. sb.append(" " + k.getKey() + " " + c + " " + Calculator.percentage(c, total, 2) + " \r\n");
  307. }
  308. }
  309. private static DataKey getKey(double s) {
  310. if (s < 0) {
  311. s = 0 - s;
  312. }
  313. if (s == 0) {
  314. DataKey r = new DataKey();
  315. r.setKey("[0,0]");
  316. r.setIndex(-1);
  317. return r;
  318. }
  319. int i = 0;
  320. for (;;) {
  321. if (i < s && s <= i + 1) {
  322. DataKey r = new DataKey();
  323. r.setKey("(" + i + "," + (i + 1) + "]");
  324. r.setIndex(i);
  325. return r;
  326. }
  327. i++;
  328. }
  329. }
  330. @ApiOperation(value = "进度详情")
  331. @RequestMapping(value = "info", method = RequestMethod.GET)
  332. public void info(HttpServletResponse response, @RequestParam(required = false) Long examId) {
  333. StringBuilder sb = new StringBuilder();
  334. List<QuestionEntity> qs = questionService.list();
  335. int qstotal = 0;
  336. int qsCourse = 0;
  337. if (CollectionUtils.isNotEmpty(qs)) {
  338. Set<String> cset = new HashSet<>();
  339. qstotal = qs.size();
  340. for (QuestionEntity q : qs) {
  341. cset.add(q.getSubjectCode());
  342. }
  343. qsCourse = cset.size();
  344. }
  345. sb.append("ocr是否开启:" + (sysProperty.getOcrTaskEnable() ? "是" : "否"));
  346. sb.append(" | 评分是否开启:" + (sysProperty.getMarkingTaskEnable() ? "是" : "否"));
  347. sb.append(" | 科目总数:" + qsCourse);
  348. sb.append(" | 小题总数:" + qstotal);
  349. double ocrSpeed = modelSpeed.getOcrSpeed();
  350. double markingSpeed = modelSpeed.getMarkingSpeed();
  351. sb.append(" | ocr速度:" + Calculator.scale(ocrSpeed, 2) + "个/秒");
  352. sb.append(" | 评分速度:" + Calculator.scale(markingSpeed, 2) + "个/秒");
  353. List<StudentScoreVo> vos = studentScoreService.getInfoByExam(examId);
  354. if (CollectionUtils.isEmpty(vos)) {
  355. returnJson(sb.toString(), response);
  356. return;
  357. }
  358. int ocrTodoCount = 0;
  359. int markingTodoCount = 0;
  360. if (examId != null) {
  361. Map<String, List<StudentScoreVo>> map = new LinkedHashMap<>();
  362. for (StudentScoreVo vo : vos) {
  363. List<StudentScoreVo> tem = map.get(vo.getSubjectCode());
  364. if (tem == null) {
  365. tem = new ArrayList<>();
  366. map.put(vo.getSubjectCode(), tem);
  367. }
  368. tem.add(vo);
  369. if (!DataStatus.SUCCESS.equals(vo.getAnswerStatus())) {
  370. ocrTodoCount++;
  371. }
  372. if (!DataStatus.SUCCESS.equals(vo.getScoreStatus())) {
  373. markingTodoCount++;
  374. }
  375. }
  376. sb.append(" | ocr剩余时间:" + getLeftTime(ocrSpeed, ocrTodoCount));
  377. sb.append(" | 评分剩余时间:" + getLeftTime(markingSpeed, markingTodoCount));
  378. sb.append("\r\n");
  379. subjectInfo(sb, examId, map);
  380. } else {
  381. Map<Long, Map<String, List<StudentScoreVo>>> exams = new LinkedHashMap<>();
  382. for (StudentScoreVo vo : vos) {
  383. Map<String, List<StudentScoreVo>> sujects = exams.get(vo.getExamId());
  384. if (sujects == null) {
  385. sujects = new LinkedHashMap<>();
  386. exams.put(vo.getExamId(), sujects);
  387. }
  388. List<StudentScoreVo> tem = sujects.get(vo.getSubjectCode());
  389. if (tem == null) {
  390. tem = new ArrayList<>();
  391. sujects.put(vo.getSubjectCode(), tem);
  392. }
  393. tem.add(vo);
  394. if (!DataStatus.SUCCESS.equals(vo.getAnswerStatus())) {
  395. ocrTodoCount++;
  396. }
  397. if (!DataStatus.SUCCESS.equals(vo.getScoreStatus())) {
  398. markingTodoCount++;
  399. }
  400. }
  401. sb.append(" | ocr剩余时间:" + getLeftTime(ocrSpeed, ocrTodoCount));
  402. sb.append(" | 评分剩余时间:" + getLeftTime(markingSpeed, markingTodoCount));
  403. sb.append("\r\n");
  404. for (Long exam : exams.keySet()) {
  405. subjectInfo(sb, exam, exams.get(exam));
  406. }
  407. }
  408. returnJson(sb.toString(), response);
  409. }
  410. private String getLeftTime(double speed, int count) {
  411. if (speed == 0) {
  412. return "-";
  413. }
  414. if (count == 0) {
  415. return getText(0);
  416. }
  417. int totalSeconds = Double.valueOf(Calculator.divide(count, speed, 0) + "").intValue();
  418. return getText(totalSeconds);
  419. }
  420. private String getText(int totalSeconds) {
  421. int hours = totalSeconds / 3600;
  422. // 计算剩余秒数
  423. int remainingSecondsAfterHours = totalSeconds % 3600;
  424. // 计算分钟数
  425. int minutes = remainingSecondsAfterHours / 60;
  426. // 计算剩余秒数
  427. int seconds = remainingSecondsAfterHours % 60;
  428. return String.format("%d小时%d分%d秒", hours, minutes, seconds);
  429. }
  430. private void subjectInfo(StringBuilder sb, Long examId, Map<String, List<StudentScoreVo>> subjects) {
  431. sb.append("\r\n-------------------------------------------------------------------------------\r\n");
  432. List<QuestionEntity> qs = questionService.findByExamId(examId);
  433. sb.append("考试id:" + examId);
  434. sb.append(" | 科目总数:" + subjects.size());
  435. sb.append(" | 小题总数:" + qs.size());
  436. Map<String, Integer> qmap = new HashMap<>();
  437. for (QuestionEntity q : qs) {
  438. Integer tem = qmap.get(q.getSubjectCode());
  439. if (tem == null) {
  440. tem = 0;
  441. }
  442. qmap.put(q.getSubjectCode(), tem + 1);
  443. }
  444. for (String subject : subjects.keySet()) {
  445. sb.append("\r\n");
  446. sb.append("\r\n");
  447. sb.append(" 科目代码:" + subject);
  448. sb.append(" | 小题数:" + qmap.get(subject));
  449. List<StudentScoreVo> vos = subjects.get(subject);
  450. Set<String> studentSet = new HashSet<>();
  451. int qocrsuc = 0;
  452. int qocrfailed = 0;
  453. int qsuc = 0;
  454. int qfailed = 0;
  455. int qtotal = 0;
  456. int markingtotal = 0;
  457. if (CollectionUtils.isNotEmpty(vos)) {
  458. qtotal = vos.size();
  459. for (StudentScoreVo vo : vos) {
  460. studentSet.add(vo.getExamNumber());
  461. if (DataStatus.SUCCESS.equals(vo.getAnswerStatus())) {
  462. qocrsuc++;
  463. }
  464. if (DataStatus.FAILED.equals(vo.getAnswerStatus())) {
  465. qocrfailed++;
  466. }
  467. if (DataStatus.SUCCESS.equals(vo.getScoreStatus())) {
  468. qsuc++;
  469. }
  470. if (DataStatus.FAILED.equals(vo.getScoreStatus())) {
  471. qfailed++;
  472. }
  473. if (vo.getMarkingScore() != null) {
  474. markingtotal++;
  475. }
  476. }
  477. }
  478. if (studentSet.size() == 0) {
  479. sb.append(" | 考生总数:0");
  480. return;
  481. }
  482. sb.append(" | 考生总数:" + studentSet.size());
  483. sb.append(" | 试题总数:" + qtotal);
  484. sb.append(" | 已人评数:" + markingtotal);
  485. sb.append(" | OCR成功总数:" + qocrsuc);
  486. sb.append(" | OCR失败总数:" + qocrfailed);
  487. sb.append(" | 评分成功总数:" + qsuc);
  488. sb.append(" | 评分失败总数:" + qfailed);
  489. }
  490. }
  491. @ApiOperation(value = "上传导入文件")
  492. @RequestMapping(value = "upload", method = RequestMethod.POST)
  493. public String upload(@RequestParam MultipartFile file) {
  494. if (ImportFileName.getByName(file.getOriginalFilename()) == null) {
  495. return "上传失败,文件名错误";
  496. }
  497. File old = new File(sysProperty.getDataDir() + "/" + file.getOriginalFilename());
  498. if (old.exists()) {
  499. return "上传失败,有正在处理的文件";
  500. }
  501. InputStream in = null;
  502. try {
  503. in = file.getInputStream();
  504. FileUtils.copyInputStreamToFile(file.getInputStream(), old);
  505. } catch (IOException e) {
  506. return "上传失败," + e.getMessage();
  507. } finally {
  508. if (in != null) {
  509. try {
  510. in.close();
  511. } catch (IOException e) {
  512. }
  513. }
  514. }
  515. return "上传成功";
  516. }
  517. @ApiOperation(value = "重置数据")
  518. @RequestMapping(value = "reset", method = RequestMethod.GET)
  519. public String reset(@RequestParam Long examId, @RequestParam(required = false) String subjectCode) {
  520. boolean lock1 = concurrentService.getReadWriteLock(LockType.AI_MARKING.name()).writeLock().tryLock();
  521. if (!lock1) {
  522. return "重置失败,有任务正在处理,请稍后 再试";
  523. }
  524. boolean lock2 = concurrentService.getReadWriteLock(LockType.OCR.name()).writeLock().tryLock();
  525. if (!lock2) {
  526. return "重置失败,有任务正在处理,请稍后 再试";
  527. }
  528. try {
  529. studentService.reset(examId, subjectCode);
  530. return "重置成功";
  531. } finally {
  532. if (lock2) {
  533. concurrentService.getReadWriteLock(LockType.OCR.name()).writeLock().unlock();
  534. }
  535. if (lock1) {
  536. concurrentService.getReadWriteLock(LockType.AI_MARKING.name()).writeLock().unlock();
  537. }
  538. }
  539. }
  540. @ApiOperation(value = "删除数据")
  541. @RequestMapping(value = "clear", method = RequestMethod.GET)
  542. public String clear(@RequestParam Long examId, @RequestParam(required = false) String subjectCode) {
  543. boolean lock1 = concurrentService.getReadWriteLock(LockType.AI_MARKING.name()).writeLock().tryLock();
  544. if (!lock1) {
  545. return "删除失败,有任务正在处理,请稍后 再试";
  546. }
  547. boolean lock2 = concurrentService.getReadWriteLock(LockType.OCR.name()).writeLock().tryLock();
  548. if (!lock2) {
  549. return "删除失败,有任务正在处理,请稍后 再试";
  550. }
  551. try {
  552. studentService.clear(examId, subjectCode);
  553. return "删除成功";
  554. } finally {
  555. if (lock2) {
  556. concurrentService.getReadWriteLock(LockType.OCR.name()).writeLock().unlock();
  557. }
  558. if (lock1) {
  559. concurrentService.getReadWriteLock(LockType.AI_MARKING.name()).writeLock().unlock();
  560. }
  561. }
  562. }
  563. @ApiOperation(value = "机评开关")
  564. @RequestMapping(value = "marking/status", method = RequestMethod.GET)
  565. public String markingStatus(@RequestParam Boolean enable) {
  566. sysProperty.setMarkingTaskEnable(enable);
  567. return "设置成功:" + enable;
  568. }
  569. @ApiOperation(value = "ocr开关")
  570. @RequestMapping(value = "ocr/status", method = RequestMethod.GET)
  571. public String ocrStatus(@RequestParam Boolean enable) {
  572. sysProperty.setOcrTaskEnable(enable);
  573. return "设置成功:" + enable;
  574. }
  575. private void returnJson(String body, HttpServletResponse response) {
  576. response.setContentType("application/json;charset=utf-8");
  577. PrintWriter writer = null;
  578. try {
  579. writer = response.getWriter();
  580. writer.write(body);
  581. } catch (IOException e) {
  582. } finally {
  583. IOUtils.close(writer);
  584. }
  585. }
  586. }