MarkController.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815
  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 net.sf.json.JSONArray;
  13. import net.sf.json.JSONObject;
  14. import org.apache.commons.lang.StringEscapeUtils;
  15. import org.apache.commons.lang.StringUtils;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.beans.factory.annotation.Value;
  20. import org.springframework.data.domain.Sort;
  21. import org.springframework.data.domain.Sort.Direction;
  22. import org.springframework.stereotype.Controller;
  23. import org.springframework.web.bind.annotation.RequestBody;
  24. import org.springframework.web.bind.annotation.RequestMapping;
  25. import org.springframework.web.bind.annotation.RequestMethod;
  26. import org.springframework.web.bind.annotation.RequestParam;
  27. import org.springframework.web.bind.annotation.ResponseBody;
  28. import org.springframework.web.servlet.ModelAndView;
  29. import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
  30. import cn.com.qmth.stmms.biz.exam.model.Exam;
  31. import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
  32. import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
  33. import cn.com.qmth.stmms.biz.exam.model.Marker;
  34. import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
  35. import cn.com.qmth.stmms.biz.exam.service.ExamService;
  36. import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
  37. import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
  38. import cn.com.qmth.stmms.biz.exam.service.MarkerClassService;
  39. import cn.com.qmth.stmms.biz.exam.service.MarkerService;
  40. import cn.com.qmth.stmms.biz.file.service.FileService;
  41. import cn.com.qmth.stmms.biz.lock.LockService;
  42. import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
  43. import cn.com.qmth.stmms.biz.mark.model.MarkResult;
  44. import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
  45. import cn.com.qmth.stmms.biz.mark.model.ProblemType;
  46. import cn.com.qmth.stmms.biz.mark.model.SubmitResult;
  47. import cn.com.qmth.stmms.biz.mark.model.Task;
  48. import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
  49. import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
  50. import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
  51. import cn.com.qmth.stmms.biz.mark.service.MarkService;
  52. import cn.com.qmth.stmms.biz.mark.service.ProblemTypeService;
  53. import cn.com.qmth.stmms.biz.mark.service.TaskService;
  54. import cn.com.qmth.stmms.biz.mark.service.TrialService;
  55. import cn.com.qmth.stmms.biz.user.model.User;
  56. import cn.com.qmth.stmms.biz.user.service.UserService;
  57. import cn.com.qmth.stmms.common.annotation.Logging;
  58. import cn.com.qmth.stmms.common.controller.BaseController;
  59. import cn.com.qmth.stmms.common.domain.WebUser;
  60. import cn.com.qmth.stmms.common.enums.ExamStatus;
  61. import cn.com.qmth.stmms.common.enums.ExamType;
  62. import cn.com.qmth.stmms.common.enums.LibraryStatus;
  63. import cn.com.qmth.stmms.common.enums.LockType;
  64. import cn.com.qmth.stmms.common.enums.LogType;
  65. import cn.com.qmth.stmms.common.enums.MarkMode;
  66. import cn.com.qmth.stmms.common.enums.MarkStatus;
  67. import cn.com.qmth.stmms.common.session.model.StmmsSession;
  68. import cn.com.qmth.stmms.common.session.service.SessionService;
  69. import cn.com.qmth.stmms.common.utils.EncryptUtils;
  70. import cn.com.qmth.stmms.common.utils.RequestIPUtil;
  71. import cn.com.qmth.stmms.common.utils.RequestUtils;
  72. import com.fasterxml.jackson.core.JsonProcessingException;
  73. import com.fasterxml.jackson.databind.ObjectMapper;
  74. @Controller
  75. @RequestMapping("/mark")
  76. public class MarkController extends BaseController {
  77. private static Logger log = LoggerFactory.getLogger(MarkController.class);
  78. @Autowired
  79. private ExamSubjectService subjectService;
  80. @Autowired
  81. private TrialService trialService;
  82. @Autowired
  83. private MarkerService markerService;
  84. @Autowired
  85. private MarkLibraryService libraryService;
  86. @Autowired
  87. private TaskService taskService;
  88. @Autowired
  89. private MarkService markService;
  90. @Autowired
  91. private ExamService examService;
  92. @Autowired
  93. private MarkGroupService groupService;
  94. @Autowired
  95. private LockService lockService;
  96. @Autowired
  97. private ProblemTypeService problemTypeService;
  98. @Autowired
  99. private UserService userService;
  100. @Autowired
  101. private MarkerClassService markerClassService;
  102. @Autowired
  103. private SessionService sessionService;
  104. @Autowired
  105. private FileService fileService;
  106. @Autowired
  107. private ExamQuestionService questionService;
  108. @Value("${slice.split.config}")
  109. private String splitConfig;
  110. @Value("${marker.prefetch.count}")
  111. private long prefetchCount;
  112. @Value("${marker.forceMode}")
  113. private String forceMarkMode;
  114. @Value("${marker.name.verify}")
  115. private boolean nameVerify;
  116. @Value("${marker.secretNumber.hide}")
  117. private boolean secretNumberHide;
  118. private static final String DEFALT_SECRET_NUMBER = "***";
  119. @RequestMapping(value = "/reset", method = RequestMethod.GET)
  120. public ModelAndView reset(HttpServletRequest request) {
  121. User user = RequestUtils.getWebUser(request).getUser();
  122. ModelAndView modelAndView = new ModelAndView("modules/mark/reset");
  123. modelAndView.addObject("user", user);
  124. modelAndView.addObject("nameVerify", nameVerify);
  125. return modelAndView;
  126. }
  127. @Logging(menu = "修改姓名密码", type = LogType.UPDATE)
  128. @RequestMapping(value = "/reset", method = RequestMethod.POST)
  129. public ModelAndView reset(HttpServletRequest request, User user) {
  130. User current = RequestUtils.getWebUser(request).getUser();
  131. if (current.getPassword().equalsIgnoreCase(EncryptUtils.md5(user.getPassword()))) {
  132. ModelAndView modelAndView = new ModelAndView("modules/mark/reset");
  133. modelAndView.addObject("message", "新密码不可与初始密码一致");
  134. modelAndView.addObject("user", user);
  135. modelAndView.addObject("nameVerify", nameVerify);
  136. return modelAndView;
  137. }
  138. current.setName(user.getName());
  139. current.setEmpno(user.getEmpno());
  140. current.setPassword(EncryptUtils.md5(user.getPassword()));
  141. current.setRandomPassword(null);
  142. current.setLastLoginIp(RequestIPUtil.getIpAddress(request));
  143. current.setLastLoginTime(new Date());
  144. userService.save(current);
  145. return new ModelAndView("redirect:/mark/subject-select");
  146. }
  147. @RequestMapping(value = "/subject-select", method = RequestMethod.GET)
  148. public ModelAndView select(HttpServletRequest request, @RequestParam(required = false) Integer examId) {
  149. ModelAndView modelAndView = new ModelAndView("modules/mark/subjectSelect");
  150. User user = RequestUtils.getWebUser(request).getUser();
  151. Calendar rightNow = Calendar.getInstance();
  152. rightNow.setTime(new Date());
  153. rightNow.add(Calendar.YEAR, -1);
  154. List<Exam> examList = examService.findByMarkerUserId(user.getId(), rightNow.getTime());
  155. modelAndView.addObject("examList", examList);
  156. if (examId != null) {
  157. Exam exam = examService.findById(examId);
  158. if (exam != null && exam.getStatus() == ExamStatus.START) {
  159. modelAndView.addObject("exam", exam);
  160. }
  161. }
  162. return modelAndView;
  163. }
  164. @RequestMapping(value = "/subject/query")
  165. @ResponseBody
  166. public JSONArray subjectQuery(HttpServletRequest request, @RequestParam Integer examId) {
  167. User user = RequestUtils.getWebUser(request).getUser();
  168. List<Marker> list = markerService.findByExamAndUserId(examId, user.getId());
  169. Set<String> subjectSet = new HashSet<>();
  170. JSONArray array = new JSONArray();
  171. for (Marker marker : list) {
  172. MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
  173. if (!subjectSet.contains(marker.getSubjectCode()) && marker.isEnable()
  174. && group.getStatus() != MarkStatus.FINISH) {
  175. ExamSubject subject = subjectService.find(marker.getExamId(), marker.getSubjectCode());
  176. if (subject != null) {
  177. JSONObject item = new JSONObject();
  178. item.accumulate("id", marker.getId());
  179. item.accumulate("subjectCode", subject.getCode());
  180. item.accumulate("subjectName", subject.getName());
  181. array.add(item);
  182. }
  183. subjectSet.add(marker.getSubjectCode());
  184. }
  185. }
  186. return array;
  187. }
  188. @RequestMapping(value = "/subject/group/query")
  189. @ResponseBody
  190. public JSONArray groupQuery(HttpServletRequest request, @RequestParam Integer examId,
  191. @RequestParam String subjectCode) {
  192. User user = RequestUtils.getWebUser(request).getUser();
  193. List<Marker> list = markerService.findByExamAndSubjectAndUserIdAndEnable(examId, subjectCode, user.getId(),
  194. true);
  195. JSONArray array = new JSONArray();
  196. for (Marker marker : list) {
  197. MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
  198. group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
  199. marker.getSubjectCode(), false, group.getNumber()));
  200. if (group.getStatus() != MarkStatus.FINISH) {
  201. JSONObject item = new JSONObject();
  202. item.accumulate("id", marker.getId());
  203. item.accumulate("title", group.getTitle());
  204. item.accumulate("groupNumber", group.getNumber());
  205. int percent = group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group
  206. .getLibraryCount()) : 0;
  207. if (group.getMarkedCount() > 0 && percent == 0) {
  208. percent = 1;
  209. } else if (group.getLeftCount() > 0 && percent == 100) {
  210. percent = 99;
  211. }
  212. item.accumulate("percent", percent);
  213. array.add(item);
  214. }
  215. }
  216. return array;
  217. }
  218. @RequestMapping(value = "/subject-select", method = RequestMethod.POST)
  219. public ModelAndView select(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer markerId) {
  220. WebUser user = RequestUtils.getWebUser(request);
  221. ModelAndView modelAndView = new ModelAndView("modules/mark/subjectSelect");
  222. Calendar rightNow = Calendar.getInstance();
  223. rightNow.setTime(new Date());
  224. rightNow.add(Calendar.YEAR, -1);
  225. List<Exam> examList = examService.findByMarkerUserId(user.getId(), rightNow.getTime());
  226. modelAndView.addObject("examList", examList);
  227. Marker marker = markerService.findById(markerId);
  228. if (marker == null) {
  229. modelAndView.addObject("message", "评卷分组不存在");
  230. return modelAndView;
  231. }
  232. Exam exam = examService.findById(marker.getExamId());
  233. modelAndView.addObject("exam", exam);
  234. Date now = new Date();
  235. if ((exam.getStartTime() != null && now.before(exam.getStartTime()))
  236. || (exam.getEndTime() != null && now.after(exam.getEndTime()))) {
  237. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  238. String start = exam.getStartTime() == null ? "" : " 开始时间:" + sdf.format(exam.getStartTime());
  239. String end = exam.getEndTime() == null ? "" : " 结束时间:" + sdf.format(exam.getEndTime());
  240. modelAndView.addObject("message", "不在评卷时间范围 " + start + " " + end);
  241. return modelAndView;
  242. }
  243. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  244. if (group == null) {
  245. modelAndView.addObject("message", "评卷分组不存在");
  246. return modelAndView;
  247. }
  248. if (group.getStatus() == MarkStatus.FINISH) {
  249. modelAndView.addObject("message", "评卷分组已结束");
  250. return modelAndView;
  251. }
  252. user.setMarkerId(marker.getId());
  253. StmmsSession session = RequestUtils.getSession(request);
  254. session.saveWebUser(user);
  255. sessionService.put(request, response, session);
  256. SessionExamUtils.setExamId(request, exam);
  257. return new ModelAndView("redirect:/web/mark");
  258. }
  259. @RequestMapping("/logout")
  260. public ModelAndView logout(HttpServletRequest request) {
  261. WebUser wu = RequestUtils.getWebUser(request);
  262. releaseMarker(wu.getMarker());
  263. StmmsSession session = RequestUtils.getSession(request);
  264. String logoutUrl = session.getWebUserLogoutUrl();
  265. session.setInvalid(true);
  266. if (StringUtils.isNotBlank(logoutUrl)) {
  267. return new ModelAndView("redirect:" + logoutUrl);
  268. } else {
  269. return new ModelAndView("redirect:/mark-login");
  270. }
  271. }
  272. @RequestMapping(value = "/getSetting", method = RequestMethod.POST)
  273. @ResponseBody
  274. public JSONObject getSetting(HttpServletRequest request) {
  275. JSONObject setting = new JSONObject();
  276. WebUser wu = RequestUtils.getWebUser(request);
  277. Marker marker = wu.getMarker();
  278. Exam exam = examService.findById(marker.getExamId());
  279. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  280. setting.accumulate("examType", exam.getType());
  281. setting.accumulate("remarkCount", exam.getRemarkCount() == null ? "" : exam.getRemarkCount());
  282. setting.accumulate("showObjectiveScore", exam.getShowObjectiveScore());
  283. setting.accumulate("startTime", exam.getStartTime() == null ? 0 : exam.getStartTime().getTime());
  284. setting.accumulate("endTime", exam.getEndTime() == null ? 0 : exam.getEndTime().getTime());
  285. setting.accumulate("topCount", marker.getTopCount() != null ? marker.getTopCount() : 0);
  286. setting.accumulate("enableAllZero", group.isEnableAllZero());
  287. setting.accumulate("statusValue", group.getStatus());
  288. setting.accumulate("groupNumber", group.getNumber());
  289. group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(),
  290. group.getSubjectCode(), false, group.getNumber()));
  291. setting.accumulate("groupTitle", group.getTitle());
  292. setting.accumulate("fileServer", fileService.getRandomFileServer());
  293. setting.accumulate("uiSetting",
  294. StringUtils.isBlank(marker.getMarkSetting()) ? new JSONObject() : marker.getMarkSetting());
  295. setting.accumulate("splitConfig", getSplitConfig());
  296. setting.accumulate("prefetchCount", prefetchCount);
  297. if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
  298. setting.accumulate("mode", MarkMode.COMMON);
  299. setting.accumulate("forceMode", true);
  300. setting.accumulate("forceSpecialTag", false);
  301. setting.accumulate("sheetView", false);
  302. } else {
  303. setModeAndForceMode(setting, exam, marker, group);
  304. setting.accumulate("forceSpecialTag", exam.isForceSpecialTag());
  305. setting.accumulate("sheetView", group.isSheetView() && exam.isSheetView());
  306. }
  307. setSubjectAndSheetConfig(setting, marker, exam);
  308. setting.accumulate("userName", RequestUtils.getWebUser(request).getName());
  309. setProblemType(setting, marker);
  310. setting.accumulate("selective", group.isSelective());
  311. return setting;
  312. }
  313. private double[] getSplitConfig() {
  314. String strs[] = splitConfig.split(",");
  315. double[] config = new double[strs.length];
  316. for (int i = 0; i < strs.length; i++) {
  317. config[i] = Double.parseDouble(strs[i]);
  318. }
  319. return config;
  320. }
  321. @RequestMapping(value = "/getStatus", method = RequestMethod.POST)
  322. @ResponseBody
  323. public JSONObject status(HttpServletRequest request) {
  324. JSONObject status = new JSONObject();
  325. Marker marker = RequestUtils.getWebUser(request).getMarker();
  326. long classCount = markerClassService.countByUserIdAndExamId(marker.getUserId(), marker.getExamId());
  327. ExamSubject subject = subjectService.find(marker.getExamId(), marker.getSubjectCode());
  328. MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
  329. if (subject == null || group == null || group.getStatus() == MarkStatus.FINISH) {
  330. status.accumulate("valid", false);
  331. return status;
  332. }
  333. long totalCount = 0;
  334. long personCount = 0;
  335. long markedCount = 0;
  336. long problemCount = 0;
  337. long arbitrateCount = 0;
  338. if (group.getStatus() == MarkStatus.FORMAL) {
  339. MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
  340. query.setExamId(marker.getExamId());
  341. query.setSubjectCode(marker.getSubjectCode());
  342. query.setGroupNumber(marker.getGroupNumber());
  343. if (classCount > 0) {
  344. totalCount = libraryService.countByExamAndSubjectAndGroupAndFilterClass(marker.getExamId(),
  345. marker.getSubjectCode(), marker.getGroupNumber(), marker.getUserId());
  346. } else {
  347. totalCount = libraryService.countByQuery(query);
  348. }
  349. query.setMarkerId(marker.getId());
  350. query.addStatus(LibraryStatus.MARKED);
  351. query.addStatus(LibraryStatus.INSPECTED);
  352. personCount = libraryService.countByQuery(query);
  353. if (classCount > 0) {
  354. markedCount = libraryService.countMarkedByExamAndSubjectAndGroupAndFilterClass(marker.getExamId(),
  355. marker.getSubjectCode(), marker.getGroupNumber(), marker.getUserId(), LibraryStatus.MARKED,
  356. LibraryStatus.INSPECTED, LibraryStatus.ARBITRATED);
  357. } else {
  358. query.setMarkerId(0);
  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.countByMarkerId(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(DEFALT_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(DEFALT_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 setSubjectAndSheetConfig(JSONObject setting, Marker marker, Exam exam) {
  703. ExamSubject examSubject = subjectService.find(marker.getExamId(), marker.getSubjectCode());
  704. String sheetConfig = "";
  705. if (StringUtils.isNotBlank(examSubject.getSheetConfig())) {
  706. sheetConfig = buildPictureConfig(examSubject.getSheetConfig());
  707. } else if (StringUtils.isNotBlank(exam.getSheetConfig())) {
  708. sheetConfig = buildPictureConfig(exam.getSheetConfig());
  709. }
  710. setting.accumulate("sheetConfig", sheetConfig);
  711. setting.accumulate("enableSplit",
  712. examSubject.getEnableSplit() == null ? exam.isEnableSplit() : examSubject.getEnableSplit());
  713. setting.accumulate("autoScroll",
  714. examSubject.getAutoScroll() == null ? exam.isAutoScroll() : examSubject.getAutoScroll());
  715. JSONObject subject = new JSONObject();
  716. subject.accumulate("name", examSubject.getName());
  717. subject.accumulate("code", examSubject.getCode());
  718. examSubject.setPaperAnswerUrl(fileService);
  719. subject.accumulate("paperUrl", examSubject.getPaperUrl() == null ? "" : examSubject.getPaperUrl());
  720. subject.accumulate("answerUrl", examSubject.getAnswerUrl() == null ? "" : examSubject.getAnswerUrl());
  721. setting.accumulate("subject", subject);
  722. }
  723. private void setModeAndForceMode(JSONObject setting, Exam exam, Marker marker, MarkGroup group) {
  724. MarkMode mode = null;
  725. boolean forceMode = false;
  726. if (MarkMode.findByName(forceMarkMode) != null) {
  727. // 全局配置的强制评卷模式
  728. mode = MarkMode.findByName(forceMarkMode);
  729. forceMode = true;
  730. } else {
  731. // 没有全局配置,优先从考试取强制评卷模式
  732. if (exam != null && exam.getMarkMode() != null) {
  733. mode = exam.getMarkMode();
  734. forceMode = true;
  735. } else if (group != null && group.getMarkMode() != null) {
  736. // 没有全局配置,优先从大题配置取强制评卷模式
  737. mode = group.getMarkMode();
  738. forceMode = true;
  739. }
  740. // 否则取评卷员当前记录的评卷模式
  741. if (mode == null) {
  742. mode = marker.getMode();
  743. }
  744. if (mode == null) {
  745. mode = MarkMode.COMMON;
  746. }
  747. if (marker.getMode() != mode) {
  748. marker.setMode(mode);
  749. markerService.save(marker);
  750. }
  751. }
  752. setting.accumulate("mode", mode);
  753. setting.accumulate("forceMode", forceMode);
  754. }
  755. }