1
0

MarkController.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  1. package cn.com.qmth.stmms.mark;
  2. import java.text.SimpleDateFormat;
  3. import java.util.ArrayList;
  4. import java.util.Calendar;
  5. import java.util.Date;
  6. import java.util.HashSet;
  7. import java.util.List;
  8. import java.util.Set;
  9. import java.util.stream.Collectors;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import cn.com.qmth.stmms.biz.exam.model.*;
  13. import cn.com.qmth.stmms.biz.exam.service.*;
  14. import net.sf.json.JSONArray;
  15. import net.sf.json.JSONObject;
  16. import org.apache.commons.lang.StringEscapeUtils;
  17. import org.apache.commons.lang.StringUtils;
  18. import org.slf4j.Logger;
  19. import org.slf4j.LoggerFactory;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.beans.factory.annotation.Value;
  22. import org.springframework.data.domain.Sort;
  23. import org.springframework.data.domain.Sort.Direction;
  24. import org.springframework.stereotype.Controller;
  25. import org.springframework.web.bind.annotation.RequestBody;
  26. import org.springframework.web.bind.annotation.RequestMapping;
  27. import org.springframework.web.bind.annotation.RequestMethod;
  28. import org.springframework.web.bind.annotation.RequestParam;
  29. import org.springframework.web.bind.annotation.ResponseBody;
  30. import org.springframework.web.servlet.ModelAndView;
  31. import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
  32. import cn.com.qmth.stmms.biz.file.service.FileService;
  33. import cn.com.qmth.stmms.biz.lock.LockService;
  34. import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
  35. import cn.com.qmth.stmms.biz.mark.model.MarkResult;
  36. import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
  37. import cn.com.qmth.stmms.biz.mark.model.ProblemType;
  38. import cn.com.qmth.stmms.biz.mark.model.SubmitResult;
  39. import cn.com.qmth.stmms.biz.mark.model.Task;
  40. import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
  41. import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
  42. import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
  43. import cn.com.qmth.stmms.biz.mark.service.MarkService;
  44. import cn.com.qmth.stmms.biz.mark.service.ProblemTypeService;
  45. import cn.com.qmth.stmms.biz.mark.service.TaskService;
  46. import cn.com.qmth.stmms.biz.mark.service.TrialService;
  47. import cn.com.qmth.stmms.biz.user.model.User;
  48. import cn.com.qmth.stmms.biz.user.service.UserService;
  49. import cn.com.qmth.stmms.common.annotation.Logging;
  50. import cn.com.qmth.stmms.common.controller.BaseController;
  51. import cn.com.qmth.stmms.common.domain.WebUser;
  52. import cn.com.qmth.stmms.common.enums.ExamStatus;
  53. import cn.com.qmth.stmms.common.enums.ExamType;
  54. import cn.com.qmth.stmms.common.enums.LibraryStatus;
  55. import cn.com.qmth.stmms.common.enums.LockType;
  56. import cn.com.qmth.stmms.common.enums.LogType;
  57. import cn.com.qmth.stmms.common.enums.MarkMode;
  58. import cn.com.qmth.stmms.common.enums.MarkStatus;
  59. import cn.com.qmth.stmms.common.session.model.StmmsSession;
  60. import cn.com.qmth.stmms.common.session.service.SessionService;
  61. import cn.com.qmth.stmms.common.utils.EncryptUtils;
  62. import cn.com.qmth.stmms.common.utils.RequestIPUtil;
  63. import cn.com.qmth.stmms.common.utils.RequestUtils;
  64. import com.fasterxml.jackson.core.JsonProcessingException;
  65. import com.fasterxml.jackson.databind.ObjectMapper;
  66. @Controller
  67. @RequestMapping("/mark")
  68. public class MarkController extends BaseController {
  69. private static Logger log = LoggerFactory.getLogger(MarkController.class);
  70. @Autowired
  71. private ExamSubjectService subjectService;
  72. @Autowired
  73. private TrialService trialService;
  74. @Autowired
  75. private MarkerService markerService;
  76. @Autowired
  77. private MarkLibraryService libraryService;
  78. @Autowired
  79. private TaskService taskService;
  80. @Autowired
  81. private MarkService markService;
  82. @Autowired
  83. private ExamService examService;
  84. @Autowired
  85. private MarkGroupService groupService;
  86. @Autowired
  87. private LockService lockService;
  88. @Autowired
  89. private ProblemTypeService problemTypeService;
  90. @Autowired
  91. private UserService userService;
  92. @Autowired
  93. private MarkerClassService markerClassService;
  94. @Autowired
  95. private SessionService sessionService;
  96. @Autowired
  97. private FileService fileService;
  98. @Autowired
  99. private ExamQuestionService questionService;
  100. @Autowired
  101. private CollationLabelService collationLabelService;
  102. @Value("${slice.split.config}")
  103. private String splitConfig;
  104. @Value("${marker.prefetch.count}")
  105. private long prefetchCount;
  106. @Value("${marker.forceMode}")
  107. private String forceMarkMode;
  108. @Value("${marker.name.verify}")
  109. private boolean nameVerify;
  110. @Value("${marker.secretNumber.hide}")
  111. private boolean secretNumberHide;
  112. private static final String DEFAULT_SECRET_NUMBER = "***";
  113. @RequestMapping(value = "/reset", method = RequestMethod.GET)
  114. public ModelAndView reset(HttpServletRequest request) {
  115. User user = RequestUtils.getWebUser(request).getUser();
  116. ModelAndView modelAndView = new ModelAndView("modules/mark/reset");
  117. modelAndView.addObject("user", user);
  118. modelAndView.addObject("nameVerify", nameVerify);
  119. return modelAndView;
  120. }
  121. @Logging(menu = "修改姓名密码", type = LogType.UPDATE)
  122. @RequestMapping(value = "/reset", method = RequestMethod.POST)
  123. public ModelAndView reset(HttpServletRequest request, User user) {
  124. User current = RequestUtils.getWebUser(request).getUser();
  125. if (current.getPassword().equalsIgnoreCase(EncryptUtils.md5(user.getPassword()))) {
  126. ModelAndView modelAndView = new ModelAndView("modules/mark/reset");
  127. modelAndView.addObject("message", "新密码不可与初始密码一致");
  128. modelAndView.addObject("user", user);
  129. modelAndView.addObject("nameVerify", nameVerify);
  130. return modelAndView;
  131. }
  132. current.setName(user.getName());
  133. current.setEmpno(user.getEmpno());
  134. current.setPassword(EncryptUtils.md5(user.getPassword()));
  135. current.setRandomPassword(null);
  136. current.setLastLoginIp(RequestIPUtil.getIpAddress(request));
  137. current.setLastLoginTime(new Date());
  138. userService.save(current);
  139. return new ModelAndView("redirect:/mark/subject-select");
  140. }
  141. @RequestMapping(value = "/subject-select", method = RequestMethod.GET)
  142. public ModelAndView select(HttpServletRequest request, @RequestParam(required = false) Integer examId) {
  143. ModelAndView modelAndView = new ModelAndView("modules/mark/subjectSelect");
  144. User user = RequestUtils.getWebUser(request).getUser();
  145. Calendar rightNow = Calendar.getInstance();
  146. rightNow.setTime(new Date());
  147. rightNow.add(Calendar.YEAR, -1);
  148. List<Exam> examList = examService.findByMarkerUserId(user.getId(), rightNow.getTime());
  149. modelAndView.addObject("examList", examList);
  150. if (examId != null) {
  151. Exam exam = examService.findById(examId);
  152. if (exam != null && exam.getStatus() == ExamStatus.START) {
  153. modelAndView.addObject("exam", exam);
  154. }
  155. }
  156. return modelAndView;
  157. }
  158. @RequestMapping(value = "/subject/query")
  159. @ResponseBody
  160. public JSONArray subjectQuery(HttpServletRequest request, @RequestParam Integer examId) {
  161. User user = RequestUtils.getWebUser(request).getUser();
  162. List<Marker> list = markerService.findByExamAndUserId(examId, user.getId());
  163. Set<String> subjectSet = new HashSet<>();
  164. JSONArray array = new JSONArray();
  165. for (Marker marker : list) {
  166. MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
  167. if (!subjectSet.contains(marker.getSubjectCode()) && marker.isEnable()
  168. && group.getStatus() != MarkStatus.FINISH) {
  169. ExamSubject subject = subjectService.find(marker.getExamId(), marker.getSubjectCode());
  170. if (subject != null) {
  171. JSONObject item = new JSONObject();
  172. item.accumulate("id", marker.getId());
  173. item.accumulate("subjectCode", subject.getCode());
  174. item.accumulate("subjectName", subject.getName());
  175. array.add(item);
  176. }
  177. subjectSet.add(marker.getSubjectCode());
  178. }
  179. }
  180. return array;
  181. }
  182. @RequestMapping(value = "/subject/group/query")
  183. @ResponseBody
  184. public JSONArray groupQuery(HttpServletRequest request, @RequestParam Integer examId,
  185. @RequestParam String subjectCode) {
  186. User user = RequestUtils.getWebUser(request).getUser();
  187. List<Marker> list = markerService.findByExamAndSubjectAndUserIdAndEnable(examId, subjectCode, user.getId(),
  188. true);
  189. JSONArray array = new JSONArray();
  190. for (Marker marker : list) {
  191. MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
  192. group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
  193. marker.getSubjectCode(), false, group.getNumber()));
  194. if (group.getStatus() != MarkStatus.FINISH) {
  195. JSONObject item = new JSONObject();
  196. item.accumulate("id", marker.getId());
  197. item.accumulate("title", group.getTitle());
  198. item.accumulate("groupNumber", group.getNumber());
  199. int percent = group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group
  200. .getLibraryCount()) : 0;
  201. if (group.getMarkedCount() > 0 && percent == 0) {
  202. percent = 1;
  203. } else if (group.getLeftCount() > 0 && percent == 100) {
  204. percent = 99;
  205. }
  206. item.accumulate("percent", percent);
  207. array.add(item);
  208. }
  209. }
  210. return array;
  211. }
  212. @RequestMapping(value = "/subject-select", method = RequestMethod.POST)
  213. public ModelAndView select(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer markerId) {
  214. WebUser user = RequestUtils.getWebUser(request);
  215. ModelAndView modelAndView = new ModelAndView("modules/mark/subjectSelect");
  216. Calendar rightNow = Calendar.getInstance();
  217. rightNow.setTime(new Date());
  218. rightNow.add(Calendar.YEAR, -1);
  219. List<Exam> examList = examService.findByMarkerUserId(user.getId(), rightNow.getTime());
  220. modelAndView.addObject("examList", examList);
  221. Marker marker = markerService.findById(markerId);
  222. if (marker == null) {
  223. modelAndView.addObject("message", "评卷分组不存在");
  224. return modelAndView;
  225. }
  226. Exam exam = examService.findById(marker.getExamId());
  227. modelAndView.addObject("exam", exam);
  228. Date now = new Date();
  229. if ((exam.getStartTime() != null && now.before(exam.getStartTime()))
  230. || (exam.getEndTime() != null && now.after(exam.getEndTime()))) {
  231. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  232. String start = exam.getStartTime() == null ? "" : " 开始时间:" + sdf.format(exam.getStartTime());
  233. String end = exam.getEndTime() == null ? "" : " 结束时间:" + sdf.format(exam.getEndTime());
  234. modelAndView.addObject("message", "不在评卷时间范围 " + start + " " + end);
  235. return modelAndView;
  236. }
  237. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  238. if (group == null) {
  239. modelAndView.addObject("message", "评卷分组不存在");
  240. return modelAndView;
  241. }
  242. if (group.getStatus() == MarkStatus.FINISH) {
  243. modelAndView.addObject("message", "评卷分组已结束");
  244. return modelAndView;
  245. }
  246. user.setMarkerId(marker.getId());
  247. StmmsSession session = RequestUtils.getSession(request);
  248. session.saveWebUser(user);
  249. sessionService.put(request, response, session);
  250. SessionExamUtils.setExamId(request, exam);
  251. return new ModelAndView("redirect:/web/mark");
  252. }
  253. @RequestMapping("/logout")
  254. public ModelAndView logout(HttpServletRequest request) {
  255. WebUser wu = RequestUtils.getWebUser(request);
  256. releaseMarker(wu.getMarker());
  257. StmmsSession session = RequestUtils.getSession(request);
  258. String logoutUrl = session.getWebUserLogoutUrl();
  259. session.setInvalid(true);
  260. if (StringUtils.isNotBlank(logoutUrl)) {
  261. return new ModelAndView("redirect:" + logoutUrl);
  262. } else {
  263. return new ModelAndView("redirect:/mark-login");
  264. }
  265. }
  266. @RequestMapping(value = "/getSetting", method = RequestMethod.POST)
  267. @ResponseBody
  268. public JSONObject getSetting(HttpServletRequest request) {
  269. JSONObject setting = new JSONObject();
  270. WebUser wu = RequestUtils.getWebUser(request);
  271. Marker marker = wu.getMarker();
  272. Exam exam = examService.findById(marker.getExamId());
  273. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  274. setting.accumulate("examType", exam.getType());
  275. setting.accumulate("remarkCount", exam.getRemarkCount() == null ? "" : exam.getRemarkCount());
  276. setting.accumulate("showObjectiveScore", exam.getShowObjectiveScore());
  277. setting.accumulate("startTime", exam.getStartTime() == null ? 0 : exam.getStartTime().getTime());
  278. setting.accumulate("endTime", exam.getEndTime() == null ? 0 : exam.getEndTime().getTime());
  279. setting.accumulate("topCount", marker.getTopCount() != null ? marker.getTopCount() : 0);
  280. setting.accumulate("enableAllZero", group.isEnableAllZero());
  281. setting.accumulate("statusValue", group.getStatus());
  282. setting.accumulate("groupNumber", group.getNumber());
  283. group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(),
  284. group.getSubjectCode(), false, group.getNumber()));
  285. setting.accumulate("groupTitle", group.getTitle());
  286. setting.accumulate("fileServer", fileService.getRandomFileServer());
  287. setting.accumulate("uiSetting",
  288. StringUtils.isBlank(marker.getMarkSetting()) ? new JSONObject() : marker.getMarkSetting());
  289. setting.accumulate("splitConfig", getSplitConfig());
  290. setting.accumulate("prefetchCount", prefetchCount);
  291. if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
  292. setting.accumulate("mode", MarkMode.COMMON);
  293. setting.accumulate("forceMode", true);
  294. setting.accumulate("forceSpecialTag", false);
  295. setting.accumulate("sheetView", false);
  296. } else {
  297. setModeAndForceMode(setting, exam, marker, group);
  298. setting.accumulate("forceSpecialTag", exam.isForceSpecialTag());
  299. setting.accumulate("sheetView", group.isSheetView() && exam.isSheetView());
  300. }
  301. setSubjectAndSheetConfig(setting, marker, exam);
  302. setting.accumulate("userName", RequestUtils.getWebUser(request).getName());
  303. setProblemType(setting, marker);
  304. setting.accumulate("selective", group.isSelective());
  305. setCollationLabel(setting, exam.getId());
  306. return setting;
  307. }
  308. private double[] getSplitConfig() {
  309. String str[] = splitConfig.split(",");
  310. double[] config = new double[str.length];
  311. for (int i = 0; i < str.length; i++) {
  312. config[i] = Double.parseDouble(str[i]);
  313. }
  314. return config;
  315. }
  316. @RequestMapping(value = "/getStatus", method = RequestMethod.POST)
  317. @ResponseBody
  318. public JSONObject status(HttpServletRequest request) {
  319. JSONObject status = new JSONObject();
  320. Marker marker = RequestUtils.getWebUser(request).getMarker();
  321. long classCount = markerClassService.countByUserIdAndExamId(marker.getUserId(), marker.getExamId());
  322. ExamSubject subject = subjectService.find(marker.getExamId(), marker.getSubjectCode());
  323. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  324. if (subject == null || group == null || group.getStatus() == MarkStatus.FINISH) {
  325. status.accumulate("valid", false);
  326. return status;
  327. }
  328. long totalCount = 0;
  329. long personCount = 0;
  330. long markedCount = 0;
  331. long problemCount = 0;
  332. long arbitrateCount = 0;
  333. if (group.getStatus() == MarkStatus.FORMAL) {
  334. MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
  335. query.setExamId(marker.getExamId());
  336. query.setSubjectCode(marker.getSubjectCode());
  337. query.setGroupNumber(marker.getGroupNumber());
  338. if (classCount > 0) {
  339. totalCount = libraryService.countByExamAndSubjectAndGroupAndFilterClass(marker.getExamId(),
  340. marker.getSubjectCode(), marker.getGroupNumber(), marker.getUserId());
  341. } else {
  342. totalCount = libraryService.countByQuery(query);
  343. }
  344. query.setMarkerId(marker.getId());
  345. query.addStatus(LibraryStatus.MARKED);
  346. query.addStatus(LibraryStatus.INSPECTED);
  347. query.addStatus(LibraryStatus.ARBITRATED);
  348. query.addStatus(LibraryStatus.WAIT_ARBITRATE);
  349. personCount = libraryService.countByQuery(query);
  350. if (classCount > 0) {
  351. markedCount = libraryService.countMarkedByExamAndSubjectAndGroupAndFilterClass(marker.getExamId(),
  352. marker.getSubjectCode(), marker.getGroupNumber(), marker.getUserId(), LibraryStatus.MARKED,
  353. LibraryStatus.INSPECTED, LibraryStatus.ARBITRATED);
  354. } else {
  355. query.setMarkerId(0);
  356. query.clearStatus();
  357. query.addStatus(LibraryStatus.MARKED);
  358. query.addStatus(LibraryStatus.INSPECTED);
  359. query.addStatus(LibraryStatus.ARBITRATED);
  360. markedCount = libraryService.countByQuery(query);
  361. }
  362. query.clearStatus();
  363. query.addStatus(LibraryStatus.PROBLEM);
  364. problemCount = libraryService.countByQuery(query);
  365. query.clearStatus();
  366. query.addStatus(LibraryStatus.WAIT_ARBITRATE);
  367. arbitrateCount = libraryService.countByQuery(query);
  368. } else if (group.getStatus() == MarkStatus.TRIAL) {
  369. totalCount = trialService.countLibrary(group.getExamId(), group.getSubjectCode(), group.getNumber());
  370. personCount = trialService.countByMarkerIdAndMarkerScoreIsNotNull(marker.getId());
  371. markedCount = trialService.countMarkedLibrary(group.getExamId(), group.getSubjectCode(), group.getNumber());
  372. }
  373. status.accumulate("personCount", personCount);
  374. status.accumulate("totalCount", totalCount);
  375. status.accumulate("markedCount", markedCount);
  376. status.accumulate("problemCount", problemCount);
  377. status.accumulate("arbitrateCount", arbitrateCount);
  378. status.accumulate("valid", totalCount > 0);
  379. return status;
  380. }
  381. @RequestMapping(value = "/getGroup", method = RequestMethod.POST)
  382. @ResponseBody
  383. public JSONArray getGroup(HttpServletRequest request) {
  384. Marker marker = RequestUtils.getWebUser(request).getMarker();
  385. JSONArray array = new JSONArray();
  386. List<Marker> markers = markerService.findByExamAndSubjectAndUserIdAndEnable(marker.getExamId(),
  387. marker.getSubjectCode(), marker.getUserId(), true);
  388. for (Marker m : markers) {
  389. JSONObject json = new JSONObject();
  390. json.accumulate("markerId", m.getId());
  391. json.accumulate("number", m.getGroupNumber());
  392. MarkGroup group = groupService.findOne(m.getExamId(), m.getSubjectCode(), m.getGroupNumber());
  393. group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(),
  394. group.getSubjectCode(), false, group.getNumber()));
  395. json.accumulate("title", group.getTitle());
  396. json.accumulate("totalCount", group.getLibraryCount());
  397. json.accumulate("markedCount", group.getMarkedCount());
  398. array.add(json);
  399. }
  400. return array;
  401. }
  402. @RequestMapping(value = "/getTask", method = RequestMethod.POST)
  403. @ResponseBody
  404. public Task getTask(HttpServletRequest request) {
  405. Marker marker = RequestUtils.getWebUser(request).getMarker();
  406. Task task = null;
  407. try {
  408. lockService.watch(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  409. lockService.watch(LockType.MARKER, marker.getId());
  410. MarkGroup group = groupService
  411. .findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  412. if (group == null) {
  413. task = new Task();
  414. task.setMessage("评卷大题不存在");
  415. } else if (group.getStatus() == MarkStatus.FINISH) {
  416. task = new Task();
  417. task.setMessage("评卷已结束");
  418. } else if (group.getStatus() == MarkStatus.TRIAL) {
  419. task = getTrialTask(marker);
  420. } else if (group.getStatus() == MarkStatus.FORMAL) {
  421. task = getFormalTask(marker);
  422. }
  423. if (task == null) {
  424. task = new Task();
  425. task.setMessage("当前无评卷任务");
  426. }
  427. } catch (Exception e) {
  428. log.error("get task error", e);
  429. } finally {
  430. lockService.unwatch(LockType.MARKER, marker.getId());
  431. lockService.unwatch(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  432. }
  433. task.setExamNumber(null);
  434. task.setStudentCode(null);
  435. if (secretNumberHide) {
  436. task.setSecretNumber(DEFAULT_SECRET_NUMBER);
  437. }
  438. return task;
  439. }
  440. private Task getFormalTask(Marker marker) {
  441. int retry = 1;
  442. Task task = null;
  443. List<MarkLibrary> list = new ArrayList<MarkLibrary>();
  444. while (task == null) {
  445. // 需要判断评卷员是否绑定了班级
  446. Set<LibraryStatus> statusSet = new HashSet<>();
  447. statusSet.add(LibraryStatus.WAITING);
  448. statusSet.add(LibraryStatus.REJECTED);
  449. long classCount = markerClassService.countByUserIdAndExamId(marker.getUserId(), marker.getExamId());
  450. list = libraryService.findUnMarked(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
  451. marker.getId(), marker.getUserId(), classCount > 0, retry, 20, statusSet);
  452. if (list.isEmpty()) {
  453. break;
  454. }
  455. for (MarkLibrary library : list) {
  456. if (markService.applyLibrary(library, marker)) {
  457. task = taskService.build(library);
  458. break;
  459. }
  460. }
  461. if (task == null) {
  462. retry++;
  463. }
  464. }
  465. return task;
  466. }
  467. private Task getTrialTask(Marker marker) {
  468. int retry = 1;
  469. Task task = null;
  470. while (task == null) {
  471. List<TrialLibrary> list = trialService.findUnMarkedLibrary(marker.getExamId(), marker.getSubjectCode(),
  472. marker.getGroupNumber(), marker.getId(), retry, 10);
  473. if (list.isEmpty()) {
  474. break;
  475. }
  476. for (TrialLibrary library : list) {
  477. if (markService.applyLibrary(library, marker)) {
  478. task = taskService.build(library);
  479. break;
  480. }
  481. }
  482. retry++;
  483. }
  484. return task;
  485. }
  486. @Logging(menu = "评卷", type = LogType.UPDATE)
  487. @RequestMapping(value = "/saveTask")
  488. @ResponseBody
  489. public JSONObject saveTask(HttpServletRequest request, @RequestBody MarkResult markResult) {
  490. JSONObject result = new JSONObject();
  491. Marker marker = RequestUtils.getWebUser(request).getMarker();
  492. boolean success = false;
  493. try {
  494. lockService.watch(LockType.EXAM_SUBJECT, marker.getExamId(), marker.getSubjectCode());
  495. lockService.watch(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  496. lockService.watch(LockType.MARKER, marker.getId());
  497. lockService.waitlock(LockType.STUDENT, markResult.getStudentId());
  498. SubmitResult sr = markService.submitTask(markResult, marker);
  499. if (sr.isSuccess()) {
  500. markService.releaseTask(sr, marker);
  501. success = true;
  502. }
  503. } catch (Exception e) {
  504. log.error("save task error", e);
  505. } finally {
  506. lockService.unlock(LockType.STUDENT, markResult.getStudentId());
  507. lockService.unwatch(LockType.MARKER, marker.getId());
  508. lockService.unwatch(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  509. lockService.unwatch(LockType.EXAM_SUBJECT, marker.getExamId(), marker.getSubjectCode());
  510. }
  511. result.accumulate("success", success);
  512. // result.accumulate("status", status(request));
  513. if (!success) {
  514. result.accumulate("message", "评卷任务提交失败,请刷新页面");
  515. }
  516. return result;
  517. }
  518. @Logging(menu = "查询回评任务", type = LogType.QUERY)
  519. @RequestMapping(value = "/getHistory", method = RequestMethod.POST)
  520. @ResponseBody
  521. public Object getHistory(HttpServletRequest request, @RequestParam int pageNumber, @RequestParam int pageSize,
  522. @RequestParam String order, @RequestParam String sort, @RequestParam(required = false) String secretNumber,
  523. @RequestParam(required = false) Double markerScore) throws Exception {
  524. Marker marker = RequestUtils.getWebUser(request).getMarker();
  525. List<Task> list = new ArrayList<>();
  526. Direction d = Direction.DESC;
  527. Sort querySort = null;
  528. if (sort.equalsIgnoreCase("ASC")) {
  529. d = Direction.ASC;
  530. }
  531. if (order.equals("markerTime")) {
  532. querySort = new Sort(d, "markerTime");
  533. } else if (order.equals("markerScore")) {
  534. querySort = new Sort(d, "markerScore").and(new Sort(Direction.DESC, "markerTime"));
  535. } else {
  536. querySort = new Sort(Direction.DESC, "markerTime");
  537. }
  538. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  539. Exam exam = examService.findById(marker.getExamId());
  540. if (group != null && group.getStatus() == MarkStatus.FORMAL) {
  541. // 正评查找已给分的评卷任务
  542. MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
  543. query.setExamId(marker.getExamId());
  544. query.setSubjectCode(marker.getSubjectCode());
  545. query.setMarkerId(marker.getId());
  546. query.addStatus(LibraryStatus.MARKED);
  547. query.addStatus(LibraryStatus.INSPECTED);
  548. query.setGroupNumber(marker.getGroupNumber());
  549. query.setStartScore(0.0);
  550. query.setSort(querySort);
  551. if (StringUtils.isNotBlank(secretNumber) && exam.getRemarkCount() != null) {
  552. query.setPageNumber(1);
  553. query.setPageSize(exam.getRemarkCount());
  554. list = taskService.findHistory(query);
  555. list = list.stream().filter(e -> e.getSecretNumber().equals(secretNumber)).collect(Collectors.toList());
  556. } else if (markerScore != null && exam.getRemarkCount() != null) {
  557. query.setPageNumber(1);
  558. query.setPageSize(exam.getRemarkCount());
  559. list = taskService.findHistory(query);
  560. list = list.stream().filter(e -> e.getMarkerScore().doubleValue() == markerScore.doubleValue())
  561. .collect(Collectors.toList());
  562. } else {
  563. query.setSecretNumber(secretNumber);
  564. query.setMarkerScore(markerScore);
  565. query.setPageNumber(pageNumber);
  566. query.setPageSize(pageSize);
  567. list = taskService.findHistory(query);
  568. }
  569. } else if (group != null && group.getStatus() == MarkStatus.TRIAL) {
  570. // 试评查找给分历史记录
  571. List<TrialLibrary> historyList = new ArrayList<TrialLibrary>();
  572. if (StringUtils.isNotBlank(secretNumber)) {
  573. historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
  574. marker.getGroupNumber(), marker.getId(), secretNumber, pageNumber, pageSize, querySort);
  575. } else if (markerScore != null) {
  576. historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
  577. marker.getGroupNumber(), marker.getId(), pageNumber, pageSize, querySort, markerScore);
  578. } else {
  579. historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
  580. marker.getGroupNumber(), marker.getId(), pageNumber, pageSize, querySort, null);
  581. }
  582. for (TrialLibrary library : historyList) {
  583. Task task = taskService.build(library);
  584. task.setPrevious(true);
  585. list.add(task);
  586. }
  587. }
  588. for (Task task : list) {
  589. task.setExamNumber(null);
  590. task.setStudentCode(null);
  591. if (secretNumberHide) {
  592. task.setSecretNumber(DEFAULT_SECRET_NUMBER);
  593. }
  594. }
  595. return list;
  596. }
  597. @Logging(menu = "修改密码", type = LogType.UPDATE)
  598. @RequestMapping(value = "/changeName", method = RequestMethod.POST)
  599. @ResponseBody
  600. public JSONObject changeName(HttpServletRequest request, @RequestParam String name,
  601. @RequestParam(required = false) String password) {
  602. User user = userService.findById(RequestUtils.getWebUser(request).getId());
  603. JSONObject result = new JSONObject();
  604. user.setName(name);
  605. if (StringUtils.isNotBlank(password)) {
  606. password = StringEscapeUtils.unescapeHtml(password);
  607. user.setPassword(EncryptUtils.md5(password));
  608. }
  609. try {
  610. user = userService.save(user);
  611. result.accumulate("success", true);
  612. } catch (Exception e) {
  613. result.accumulate("success", false);
  614. log.error("MarkController-修改名字出错", e);
  615. }
  616. return result;
  617. }
  618. @RequestMapping(value = "/updateSetting", method = RequestMethod.POST)
  619. @ResponseBody
  620. public JSONObject updateSetting(HttpServletRequest request, @RequestParam(required = false) String uiSetting,
  621. @RequestParam(required = false) String mode) {
  622. Marker marker = RequestUtils.getWebUser(request).getMarker();
  623. if (uiSetting != null) {
  624. marker.setMarkSetting(StringEscapeUtils.unescapeHtml(StringUtils.trimToNull(uiSetting)));
  625. }
  626. if (mode != null) {
  627. marker.setMode(MarkMode.findByName(mode));
  628. }
  629. markerService.save(marker);
  630. JSONObject result = new JSONObject();
  631. result.accumulate("success", true);
  632. return result;
  633. }
  634. @RequestMapping("/clear")
  635. @ResponseBody
  636. public void clear(HttpServletRequest request) {
  637. releaseMarker(RequestUtils.getWebUser(request).getMarker());
  638. }
  639. @ResponseBody
  640. @RequestMapping(value = "/subjectSelect", method = RequestMethod.POST)
  641. public Object subjectSelect(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer markerId) {
  642. WebUser user = RequestUtils.getWebUser(request);
  643. Marker old = user.getMarker();
  644. Marker marker = markerService.findById(markerId);
  645. JSONObject result = new JSONObject();
  646. if (marker == null) {
  647. result.accumulate("success", false);
  648. result.accumulate("message", "评卷分组不存在");
  649. return result;
  650. }
  651. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  652. if (group == null) {
  653. result.accumulate("success", false);
  654. result.accumulate("message", "评卷分组不存在");
  655. } else if (group.getStatus() == MarkStatus.FINISH) {
  656. result.accumulate("success", false);
  657. result.accumulate("message", "评卷分组已结束");
  658. } else {
  659. releaseMarker(old);
  660. user.setMarkerId(marker.getId());
  661. StmmsSession session = RequestUtils.getSession(request);
  662. session.saveWebUser(user);
  663. sessionService.put(request, response, session);
  664. result.accumulate("success", true);
  665. }
  666. return result;
  667. }
  668. private void releaseMarker(Marker marker) {
  669. if (marker == null) {
  670. return;
  671. }
  672. try {
  673. lockService.waitlock(LockType.MARKER, marker.getId());
  674. markService.releaseByMarker(marker);
  675. } catch (Exception e) {
  676. log.error("release marker error", e);
  677. } finally {
  678. lockService.unlock(LockType.MARKER, marker.getId());
  679. }
  680. }
  681. protected String buildPictureConfig(String sheetConfig) {
  682. String json = "";
  683. if (StringUtils.isNotBlank(sheetConfig)) {
  684. try {
  685. ObjectMapper mapper = new ObjectMapper();
  686. json = mapper.writeValueAsString(PictureConfigItem.parse(sheetConfig));
  687. } catch (JsonProcessingException e) {
  688. e.printStackTrace();
  689. }
  690. }
  691. return json;
  692. }
  693. private void setProblemType(JSONObject setting, Marker marker) {
  694. List<ProblemType> problemTypes = problemTypeService.findByExamId(marker.getExamId());
  695. ObjectMapper mapper = new ObjectMapper();
  696. try {
  697. setting.accumulate("problemTypes", mapper.writeValueAsString(problemTypes));
  698. } catch (JsonProcessingException e) {
  699. log.error("MarkController-问题类型获取出错", e);
  700. }
  701. }
  702. private void setCollationLabel(JSONObject setting, Integer examId) {
  703. List<CollationLabel> list = collationLabelService.list(examId);
  704. ObjectMapper mapper = new ObjectMapper();
  705. try {
  706. setting.accumulate("collationLabelList",mapper.writeValueAsString(list));
  707. } catch (JsonProcessingException e) {
  708. log.error("MarkController-整理异常获取出错", e);
  709. }
  710. }
  711. private void setSubjectAndSheetConfig(JSONObject setting, Marker marker, Exam exam) {
  712. ExamSubject examSubject = subjectService.find(marker.getExamId(), marker.getSubjectCode());
  713. String sheetConfig = "";
  714. if (StringUtils.isNotBlank(examSubject.getSheetConfig())) {
  715. sheetConfig = buildPictureConfig(examSubject.getSheetConfig());
  716. } else if (StringUtils.isNotBlank(exam.getSheetConfig())) {
  717. sheetConfig = buildPictureConfig(exam.getSheetConfig());
  718. }
  719. setting.accumulate("sheetConfig", sheetConfig);
  720. setting.accumulate("enableSplit",
  721. examSubject.getEnableSplit() == null ? exam.isEnableSplit() : examSubject.getEnableSplit());
  722. setting.accumulate("autoScroll",
  723. examSubject.getAutoScroll() == null ? exam.isAutoScroll() : examSubject.getAutoScroll());
  724. JSONObject subject = new JSONObject();
  725. subject.accumulate("name", examSubject.getName());
  726. subject.accumulate("code", examSubject.getCode());
  727. examSubject.setPaperAnswerUrl(fileService);
  728. subject.accumulate("paperUrl", examSubject.getPaperUrl() == null ? "" : examSubject.getPaperUrl());
  729. subject.accumulate("answerUrl", examSubject.getAnswerUrl() == null ? "" : examSubject.getAnswerUrl());
  730. setting.accumulate("subject", subject);
  731. }
  732. private void setModeAndForceMode(JSONObject setting, Exam exam, Marker marker, MarkGroup group) {
  733. MarkMode mode = null;
  734. boolean forceMode = false;
  735. if (MarkMode.findByName(forceMarkMode) != null) {
  736. // 全局配置的强制评卷模式
  737. mode = MarkMode.findByName(forceMarkMode);
  738. forceMode = true;
  739. } else {
  740. // 没有全局配置,优先从考试取强制评卷模式
  741. if (exam != null && exam.getMarkMode() != null) {
  742. mode = exam.getMarkMode();
  743. forceMode = true;
  744. } else if (group != null && group.getMarkMode() != null) {
  745. // 没有全局配置,优先从大题配置取强制评卷模式
  746. mode = group.getMarkMode();
  747. forceMode = true;
  748. }
  749. // 否则取评卷员当前记录的评卷模式
  750. if (mode == null) {
  751. mode = marker.getMode();
  752. }
  753. if (mode == null) {
  754. mode = MarkMode.COMMON;
  755. }
  756. if (marker.getMode() != mode) {
  757. marker.setMode(mode);
  758. markerService.save(marker);
  759. }
  760. }
  761. setting.accumulate("mode", mode);
  762. setting.accumulate("forceMode", forceMode);
  763. }
  764. }