MarkController.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. package cn.com.qmth.stmms.mark;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.List;
  5. import javax.servlet.http.HttpServletRequest;
  6. import org.apache.commons.lang.StringUtils;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.stereotype.Controller;
  12. import org.springframework.web.bind.annotation.RequestBody;
  13. import org.springframework.web.bind.annotation.RequestMapping;
  14. import org.springframework.web.bind.annotation.RequestMethod;
  15. import org.springframework.web.bind.annotation.RequestParam;
  16. import org.springframework.web.bind.annotation.ResponseBody;
  17. import org.springframework.web.servlet.ModelAndView;
  18. import cn.com.qmth.stmms.biz.exam.model.Exam;
  19. import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
  20. import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
  21. import cn.com.qmth.stmms.biz.exam.model.Marker;
  22. import cn.com.qmth.stmms.biz.exam.model.Tag;
  23. import cn.com.qmth.stmms.biz.exam.service.ExamService;
  24. import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
  25. import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
  26. import cn.com.qmth.stmms.biz.exam.service.MarkerService;
  27. import cn.com.qmth.stmms.biz.exam.service.TagService;
  28. import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
  29. import cn.com.qmth.stmms.biz.mark.model.MarkResult;
  30. import cn.com.qmth.stmms.biz.mark.model.Task;
  31. import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
  32. import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
  33. import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
  34. import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
  35. import cn.com.qmth.stmms.biz.mark.service.MarkService;
  36. import cn.com.qmth.stmms.biz.mark.service.TaskService;
  37. import cn.com.qmth.stmms.biz.mark.service.TrialService;
  38. import cn.com.qmth.stmms.biz.mark.service.Impl.MarkLockService;
  39. import cn.com.qmth.stmms.common.controller.BaseController;
  40. import cn.com.qmth.stmms.common.enums.LibraryStatus;
  41. import cn.com.qmth.stmms.common.enums.MarkMode;
  42. import cn.com.qmth.stmms.common.enums.MarkStatus;
  43. import cn.com.qmth.stmms.common.utils.RequestUtils;
  44. import net.sf.json.JSONArray;
  45. import net.sf.json.JSONObject;
  46. @Controller
  47. @RequestMapping("/mark")
  48. public class MarkController extends BaseController {
  49. private static Logger log = LoggerFactory.getLogger(MarkController.class);
  50. @Autowired
  51. private ExamSubjectService subjectService;
  52. @Autowired
  53. private TrialService trialService;
  54. @Autowired
  55. private MarkerService markerService;
  56. @Autowired
  57. private MarkLibraryService libraryService;
  58. @Autowired
  59. private TaskService taskService;
  60. @Autowired
  61. private TagService tagService;
  62. @Autowired
  63. private MarkService markService;
  64. @Autowired
  65. private ExamService examService;
  66. @Autowired
  67. private MarkGroupService groupService;
  68. @Autowired
  69. private MarkLockService lockService;
  70. @Value("${slice.image.server}")
  71. private String sliceServer;
  72. @Value("${sheet.image.server}")
  73. private String sheetServer;
  74. @Value("${card.server}")
  75. private String cardServer;
  76. @Value("${marker.forceMode}")
  77. private String forceMarkMode;
  78. @RequestMapping(value = "/reset", method = RequestMethod.GET)
  79. public ModelAndView reset(HttpServletRequest request) {
  80. Marker marker = RequestUtils.getWebUser(request).getMarker();
  81. ModelAndView modelAndView = new ModelAndView("modules/mark/reset");
  82. modelAndView.addObject("marker", marker);
  83. return modelAndView;
  84. }
  85. @RequestMapping(value = "/reset", method = RequestMethod.POST)
  86. public ModelAndView reset(HttpServletRequest request, Marker marker) {
  87. Marker current = RequestUtils.getWebUser(request).getMarker();
  88. current.setName(marker.getName());
  89. current.setPassword(marker.getPassword());
  90. current.setLastLoginIp(request.getRemoteAddr());
  91. current.setLastLoginTime(new Date());
  92. markerService.save(current);
  93. return new ModelAndView("redirect:/mark/index");
  94. }
  95. @RequestMapping("/index")
  96. public ModelAndView index(HttpServletRequest request, @RequestParam(value = "mode", required = false) String mode) {
  97. Marker marker = RequestUtils.getWebUser(request).getMarker();
  98. ModelAndView modelAndView = getMarkModeView(marker, MarkMode.findByName(mode));
  99. preProcess(marker, modelAndView);
  100. return modelAndView;
  101. }
  102. private ModelAndView getMarkModeView(Marker marker, MarkMode mode) {
  103. boolean forceMode = false;
  104. MarkMode sysMode = MarkMode.findByName(forceMarkMode);
  105. if (sysMode != null) {
  106. // 全局配置的强制评卷模式
  107. mode = sysMode;
  108. forceMode = true;
  109. } else {
  110. // 没有全局配置,优先从大题配置取强制评卷模式
  111. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(),
  112. marker.getGroupNumber());
  113. if (group != null && group.getMarkMode() != null) {
  114. mode = group.getMarkMode();
  115. forceMode = true;
  116. }
  117. // 否则取评卷员当前记录的评卷模式
  118. if (mode == null) {
  119. mode = marker.getMode();
  120. }
  121. if (mode == null) {
  122. mode = MarkMode.COMMON;
  123. }
  124. if (marker.getMode() != mode) {
  125. marker.setMode(mode);
  126. markerService.save(marker);
  127. }
  128. }
  129. ModelAndView view = new ModelAndView(
  130. mode == MarkMode.TRACK ? "modules/mark/markTrack" : "modules/mark/markNew");
  131. view.addObject("forceMode", forceMode);
  132. return view;
  133. }
  134. @RequestMapping("/logout")
  135. public ModelAndView logout(HttpServletRequest request) {
  136. Marker marker = RequestUtils.getWebUser(request).getMarker();
  137. markService.releaseByMarker(marker);
  138. return new ModelAndView("redirect:/mark-logout");
  139. }
  140. /**
  141. * 进入评卷界面后的通用预处理
  142. *
  143. * @param marker
  144. * @param session
  145. * @param modelAndView
  146. * @param modelAndView
  147. */
  148. private void preProcess(Marker marker, ModelAndView modelAndView) {
  149. modelAndView.addObject("sliceServer", sliceServer);
  150. modelAndView.addObject("sheetServer", sheetServer);
  151. modelAndView.addObject("cardServer", cardServer);
  152. modelAndView.addObject("marker", marker);
  153. modelAndView.addObject("subject", subjectService.find(marker.getExamId(), marker.getSubjectCode()));
  154. Exam exam = examService.findById(marker.getExamId());
  155. modelAndView.addObject("forceSpecialTag", exam.isForceSpecialTag());
  156. markService.releaseByMarker(marker);
  157. }
  158. @RequestMapping("/clear")
  159. @ResponseBody
  160. public void clear(HttpServletRequest request) {
  161. Marker marker = RequestUtils.getWebUser(request).getMarker();
  162. if (marker != null) {
  163. // 清除该评卷员当前正在评卷的指定任务
  164. markService.releaseByMarker(marker);
  165. }
  166. }
  167. @RequestMapping("/status")
  168. @ResponseBody
  169. public JSONObject status(HttpServletRequest request) {
  170. JSONObject status = new JSONObject();
  171. Marker marker = RequestUtils.getWebUser(request).getMarker();
  172. ExamSubject subject = subjectService.find(marker.getExamId(), marker.getSubjectCode());
  173. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  174. if (subject == null || group == null || group.getStatus() == MarkStatus.FINISH) {
  175. status.accumulate("valid", false);
  176. return status;
  177. }
  178. long totalCount = 0;
  179. long personCount = 0;
  180. long markedCount = 0;
  181. long exceptionCount = 0;
  182. long topCount = 0;
  183. if (group.getStatus() == MarkStatus.FORMAL) {
  184. topCount = marker.getTopCount() != null ? marker.getTopCount() : 0;
  185. MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
  186. query.setExamId(marker.getExamId());
  187. query.setSubjectCode(marker.getSubjectCode());
  188. query.setGroupNumber(marker.getGroupNumber());
  189. totalCount = libraryService.countByQuery(query);
  190. query.setMarkerId(marker.getId());
  191. personCount = libraryService.countByQuery(query);
  192. query.setMarkerId(0);
  193. query.addStatus(LibraryStatus.MARKED);
  194. query.addStatus(LibraryStatus.ARBITRATED);
  195. markedCount = libraryService.countByQuery(query);
  196. query.clearStatus();
  197. query.addStatus(LibraryStatus.WAIT_ARBITRATE);
  198. exceptionCount = libraryService.countByQuery(query);
  199. } else if (group.getStatus() == MarkStatus.TRIAL) {
  200. totalCount = trialService.countLibrary(group.getExamId(), group.getSubjectCode(), group.getNumber());
  201. personCount = trialService.countMarkerHistory(marker.getId());
  202. markedCount = personCount;
  203. }
  204. status.accumulate("personCount", personCount);
  205. status.accumulate("totalCount", totalCount);
  206. status.accumulate("markedCount", markedCount);
  207. status.accumulate("exceptionCount", exceptionCount);
  208. status.accumulate("valid", totalCount > 0);
  209. status.accumulate("topCount", topCount);
  210. return status;
  211. }
  212. @RequestMapping("/gettask")
  213. @ResponseBody
  214. public Task getTask(HttpServletRequest request) {
  215. Marker marker = RequestUtils.getWebUser(request).getMarker();
  216. lockService.waitUnlockMarker(marker.getId());
  217. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  218. Task task = null;
  219. if (group == null) {
  220. task = new Task();
  221. task.setExist(false);
  222. task.setMessage("评卷大题不存在");
  223. } else if (group.getStatus() == MarkStatus.FINISH) {
  224. task = new Task();
  225. task.setExist(false);
  226. task.setMessage("评卷已结束");
  227. } else if (group.getStatus() == MarkStatus.TRIAL) {
  228. task = getTrialTask(marker);
  229. } else if (group.getStatus() == MarkStatus.FORMAL) {
  230. task = getFormalTask(marker);
  231. }
  232. if (task == null) {
  233. task = new Task();
  234. task.setExist(false);
  235. task.setMessage("当前无评卷任务");
  236. }
  237. return task;
  238. }
  239. private Task getFormalTask(Marker marker) {
  240. int retry = 1;
  241. Task task = null;
  242. while (retry <= 10 && task == null) {
  243. List<MarkLibrary> list = libraryService.findUnMarked(marker.getExamId(), marker.getSubjectCode(),
  244. marker.getGroupNumber(), marker.getId(), retry, 20);
  245. if (list.isEmpty()) {
  246. break;
  247. }
  248. for (MarkLibrary library : list) {
  249. if (markService.applyLibrary(library, marker)) {
  250. task = taskService.build(library);
  251. break;
  252. }
  253. }
  254. if (task == null) {
  255. retry++;
  256. }
  257. }
  258. return task;
  259. }
  260. private Task getTrialTask(Marker marker) {
  261. int retry = 1;
  262. Task task = null;
  263. while (task == null) {
  264. List<TrialLibrary> list = trialService.findUnMarkedLibrary(marker.getExamId(), marker.getSubjectCode(),
  265. marker.getGroupNumber(), marker.getId(), retry, 10);
  266. if (list.isEmpty()) {
  267. break;
  268. }
  269. for (TrialLibrary library : list) {
  270. if (markService.applyLibrary(library, marker)) {
  271. task = taskService.build(library, null);
  272. break;
  273. }
  274. }
  275. retry++;
  276. }
  277. return task;
  278. }
  279. @RequestMapping(value = "/savetask", method = RequestMethod.POST)
  280. @ResponseBody
  281. public JSONObject saveTask(HttpServletRequest request, @RequestBody MarkResult markResult) {
  282. JSONObject result = new JSONObject();
  283. Marker marker = RequestUtils.getWebUser(request).getMarker();
  284. boolean success = false;
  285. try {
  286. lockService.lockMarker(marker.getId());
  287. success = markService.submitTask(markResult, marker);
  288. } catch (Exception e) {
  289. log.error("save task error", e);
  290. } finally {
  291. lockService.unlockMarker(marker.getId());
  292. }
  293. result.accumulate("success", success);
  294. result.accumulate("status", status(request));
  295. if (!success) {
  296. result.accumulate("message", "评卷任务提交失败,请刷新重试");
  297. }
  298. return result;
  299. }
  300. @RequestMapping("/gethistory")
  301. @ResponseBody
  302. public Object history(HttpServletRequest request, @RequestParam int pageNumber, @RequestParam int pageSize)
  303. throws Exception {
  304. Marker marker = RequestUtils.getWebUser(request).getMarker();
  305. List<Task> list = new ArrayList<>();
  306. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  307. if (group != null && group.getStatus() == MarkStatus.FORMAL) {
  308. // 正评查找已给分的评卷任务
  309. MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
  310. query.setExamId(marker.getExamId());
  311. query.setSubjectCode(marker.getSubjectCode());
  312. query.setMarkerId(marker.getId());
  313. query.addStatus(LibraryStatus.MARKED);
  314. query.setGroupNumber(marker.getGroupNumber());
  315. query.setPageNumber(pageNumber);
  316. query.setPageSize(pageSize);
  317. query.orderByMarkerTimeDesc();
  318. list = taskService.findByQuery(query);
  319. for (Task task : list) {
  320. task.setPrevious(true);
  321. }
  322. } else if (group != null && group.getStatus() == MarkStatus.TRIAL) {
  323. // 试评查找给分历史记录
  324. List<TrialHistory> historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
  325. marker.getGroupNumber(), marker.getId(), pageNumber, pageSize);
  326. for (TrialHistory history : historyList) {
  327. TrialLibrary library = trialService.findLibrary(history.getLibraryId());
  328. if (library != null) {
  329. Task task = taskService.build(library, history);
  330. task.setPrevious(true);
  331. list.add(task);
  332. }
  333. }
  334. }
  335. return list;
  336. }
  337. @RequestMapping("/change-name")
  338. @ResponseBody
  339. public JSONObject changeName(HttpServletRequest request, @RequestParam String name,
  340. @RequestParam(required = false) String password) {
  341. Marker marker = RequestUtils.getWebUser(request).getMarker();
  342. JSONObject result = new JSONObject();
  343. marker.setName(name);
  344. if (StringUtils.isNotEmpty(password)) {
  345. marker.setPassword(password);
  346. }
  347. marker = markerService.save(marker);
  348. result.accumulate("success", marker != null);
  349. if (marker != null) {
  350. result.accumulate("name", marker.getName());
  351. }
  352. return result;
  353. }
  354. @RequestMapping("/tags")
  355. @ResponseBody
  356. public JSONArray getTags(HttpServletRequest request) {
  357. JSONArray array = new JSONArray();
  358. List<Tag> list = tagService.findAll();
  359. for (Tag tag : list) {
  360. JSONObject obj = new JSONObject();
  361. obj.accumulate("value", tag.getId());
  362. obj.accumulate("name", tag.getName());
  363. array.add(obj);
  364. }
  365. return array;
  366. }
  367. }