MarkController.java 15 KB

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