|
@@ -1,20 +1,16 @@
|
|
|
package cn.com.qmth.stmms.admin.exam;
|
|
|
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.*;
|
|
|
-import cn.com.qmth.stmms.biz.exam.service.*;
|
|
|
-import cn.com.qmth.stmms.biz.file.enums.FormatType;
|
|
|
-import cn.com.qmth.stmms.biz.file.service.FileService;
|
|
|
-import cn.com.qmth.stmms.biz.lock.LockService;
|
|
|
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
|
|
|
-import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
|
|
|
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
|
|
|
-import cn.com.qmth.stmms.biz.mark.service.MarkService;
|
|
|
-import cn.com.qmth.stmms.biz.user.service.UserService;
|
|
|
-import cn.com.qmth.stmms.common.annotation.Logging;
|
|
|
-import cn.com.qmth.stmms.common.annotation.RoleRequire;
|
|
|
-import cn.com.qmth.stmms.common.domain.WebUser;
|
|
|
-import cn.com.qmth.stmms.common.enums.*;
|
|
|
-import cn.com.qmth.stmms.common.utils.RequestUtils;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+
|
|
|
+import net.sf.json.JSONArray;
|
|
|
import net.sf.json.JSONObject;
|
|
|
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
@@ -27,11 +23,43 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
import org.springframework.web.bind.annotation.RequestMethod;
|
|
|
import org.springframework.web.bind.annotation.RequestParam;
|
|
|
import org.springframework.web.bind.annotation.ResponseBody;
|
|
|
+import org.springframework.web.servlet.ModelAndView;
|
|
|
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
|
|
|
|
|
-import javax.servlet.http.HttpServletRequest;
|
|
|
-
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.Exam;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.Marker;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
|
|
|
+import cn.com.qmth.stmms.biz.file.enums.FormatType;
|
|
|
+import cn.com.qmth.stmms.biz.file.service.FileService;
|
|
|
+import cn.com.qmth.stmms.biz.lock.LockService;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
|
|
|
+import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
|
|
|
+import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
|
|
|
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
|
|
|
+import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
|
|
|
+import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
|
|
|
+import cn.com.qmth.stmms.biz.user.model.User;
|
|
|
+import cn.com.qmth.stmms.biz.user.service.UserService;
|
|
|
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
|
|
|
+import cn.com.qmth.stmms.common.annotation.Logging;
|
|
|
+import cn.com.qmth.stmms.common.annotation.RoleRequire;
|
|
|
+import cn.com.qmth.stmms.common.domain.WebUser;
|
|
|
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
|
|
|
+import cn.com.qmth.stmms.common.enums.LockType;
|
|
|
+import cn.com.qmth.stmms.common.enums.LogType;
|
|
|
+import cn.com.qmth.stmms.common.enums.MarkStatus;
|
|
|
+import cn.com.qmth.stmms.common.enums.Role;
|
|
|
+import cn.com.qmth.stmms.common.utils.RequestUtils;
|
|
|
|
|
|
@Controller("libraryController")
|
|
|
@RequestMapping("/admin/exam/library")
|
|
@@ -69,6 +97,15 @@ public class LibraryController extends BaseExamController {
|
|
|
@Autowired
|
|
|
private UserService userService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private MarkTrackService markTrackService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MarkSpecialTagService markSpecialTagService;
|
|
|
+
|
|
|
+ // 并发处理互斥锁
|
|
|
+ private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
|
|
|
+
|
|
|
@Logging(menu = "评卷任务查询", type = LogType.QUERY)
|
|
|
@RequestMapping
|
|
|
public String list(Model model, HttpServletRequest request, MarkLibrarySearchQuery query,
|
|
@@ -145,8 +182,9 @@ public class LibraryController extends BaseExamController {
|
|
|
lockService.watch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
|
|
|
lockService.watch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
|
|
|
library.getGroupNumber());
|
|
|
- if ((library.getStatus().equals(LibraryStatus.MARKED) || library.getStatus().equals(
|
|
|
- LibraryStatus.PROBLEM))
|
|
|
+ if ((library.getStatus().equals(LibraryStatus.MARKED)
|
|
|
+ || library.getStatus().equals(LibraryStatus.PROBLEM) || library.getStatus().equals(
|
|
|
+ LibraryStatus.INSPECTED))
|
|
|
&& markService.backLibrary(library, wu.getId())) {
|
|
|
obj.accumulate("success", true);
|
|
|
} else {
|
|
@@ -195,4 +233,160 @@ public class LibraryController extends BaseExamController {
|
|
|
fileService.getPaperUri(student.getExamId(), student.getSubjectCode(), FormatType.JSON));
|
|
|
return "modules/exam/jsonView";
|
|
|
}
|
|
|
+
|
|
|
+ @Logging(menu = "开始任务复核", type = LogType.QUERY)
|
|
|
+ @RequestMapping("/inspected/start")
|
|
|
+ @ResponseBody
|
|
|
+ public ModelAndView start(HttpServletRequest request, RedirectAttributes redirectAttributes,
|
|
|
+ @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
|
|
|
+ int examId = getSessionExamId(request);
|
|
|
+ MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
|
|
|
+ WebUser wu = RequestUtils.getWebUser(request);
|
|
|
+ releaseByUser(wu.getUser().getId());
|
|
|
+ ModelAndView view = new ModelAndView("modules/exam/inspectedLibrary");
|
|
|
+ if (group == null) {
|
|
|
+ view.addObject("message", "大题不存在或评卷已结束");
|
|
|
+ return view;
|
|
|
+ } else if (group.getStatus() == MarkStatus.FINISH) {
|
|
|
+ view.addObject("message", "评卷已结束");
|
|
|
+ return view;
|
|
|
+ } else if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
+ view.addObject("message", "试评任务无需复核");
|
|
|
+ return view;
|
|
|
+ } else {
|
|
|
+ List<Integer> ids = new ArrayList<Integer>();
|
|
|
+ MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
|
|
|
+ query.setExamId(examId);
|
|
|
+ query.setSubjectCode(subjectCode);
|
|
|
+ query.setGroupNumber(groupNumber);
|
|
|
+ query.setPageNumber(1);
|
|
|
+ query.setPageSize(1000);
|
|
|
+ query.addStatus(LibraryStatus.MARKED);
|
|
|
+ query = libraryService.findByQuery(query);
|
|
|
+ if (query.getResult() != null && query.getResult().size() > 0) {
|
|
|
+ for (MarkLibrary library : query.getResult()) {
|
|
|
+ ids.add(library.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ view.addObject("inspectCount", ids.size());
|
|
|
+ view.addObject("fileServer", fileService.getFileServer());
|
|
|
+ view.addObject("ids", StringUtils.join(ids, ","));
|
|
|
+ view.addObject("message", ids.size() > 0 ? "" : "没有待复核的任务");
|
|
|
+ return view;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/inspected/info")
|
|
|
+ @ResponseBody
|
|
|
+ public Object info(HttpServletRequest request, @RequestParam Integer libraryId) {
|
|
|
+ WebUser wu = RequestUtils.getWebUser(request);
|
|
|
+ MarkLibrary library = libraryService.findById(libraryId);
|
|
|
+ JSONObject result = new JSONObject();
|
|
|
+ if (setCurrent(library.getId(), wu.getUser().getId())) {
|
|
|
+ ExamStudent student = studentService.findById(library.getStudentId());
|
|
|
+ result.accumulate("id", libraryId);
|
|
|
+ result.accumulate("studentId", library.getSecretNumber());
|
|
|
+ result.accumulate("subjectCode", library.getSubjectCode());
|
|
|
+ result.accumulate("subjectName", student.getSubjectName());
|
|
|
+ Marker marker = markerService.findById(library.getMarkerId());
|
|
|
+ User user = userService.findById(marker.getUserId());
|
|
|
+ result.accumulate("markerName", user.getLoginName());
|
|
|
+ result.accumulate("markerScore", library.getMarkerScore());
|
|
|
+
|
|
|
+ JSONArray array = new JSONArray();
|
|
|
+ List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
|
|
|
+ library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
|
|
|
+ List<ScoreItem> scores = library.getScoreList();
|
|
|
+ for (int i = 0; i < questions.size(); i++) {
|
|
|
+ ExamQuestion question = questions.get(i);
|
|
|
+ JSONObject obj = new JSONObject();
|
|
|
+ obj.accumulate("questionNumber", question.getMainTitle() + " " + question.getQuestionNumber());
|
|
|
+ obj.accumulate("score", scores.get(i).getScore());
|
|
|
+ array.add(obj);
|
|
|
+ }
|
|
|
+ result.accumulate("questions", array);
|
|
|
+
|
|
|
+ MarkGroup group = groupService.findOne(student.getExamId(), student.getSubjectCode(),
|
|
|
+ library.getGroupNumber());
|
|
|
+ List<String> picUrls = fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1,
|
|
|
+ student.getSliceCount());
|
|
|
+ List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
|
|
|
+ List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
|
|
|
+ result.accumulate("picUrls", picUrls);
|
|
|
+ result.accumulate("pictureConfig", group.getPictureConfigList());
|
|
|
+ result.accumulate("markTracks", markTracks);
|
|
|
+ result.accumulate("markSpecialTagList", markSpecialTagList);
|
|
|
+ result.accumulate("success", true);
|
|
|
+ } else {
|
|
|
+ result.accumulate("success", false);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Logging(menu = "考生评卷复核", type = LogType.UPDATE)
|
|
|
+ @RequestMapping("/inspected/save")
|
|
|
+ @ResponseBody
|
|
|
+ public Object save(HttpServletRequest request, @RequestParam Integer libraryId) {
|
|
|
+ WebUser wu = RequestUtils.getWebUser(request);
|
|
|
+ MarkLibrary library = libraryService.findById(libraryId);
|
|
|
+ if (libraryId != null && library.getStatus().equals(LibraryStatus.MARKED)) {
|
|
|
+ library.setHeaderId(wu.getUser().getId());
|
|
|
+ library.setHeaderTime(new Date());
|
|
|
+ library.setStatus(LibraryStatus.INSPECTED);
|
|
|
+ libraryService.save(library);
|
|
|
+ releaseTask(libraryId);
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/inspected/clear")
|
|
|
+ @ResponseBody
|
|
|
+ @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
|
|
|
+ public Object clear(HttpServletRequest request, @RequestParam(required = false) Integer libraryId) {
|
|
|
+ WebUser wu = RequestUtils.getWebUser(request);
|
|
|
+ if (libraryId != null) {
|
|
|
+ releaseTask(libraryId);
|
|
|
+ } else {
|
|
|
+ releaseByUser(wu.getUser().getId());
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean setCurrent(Integer taskId, Integer userId) {
|
|
|
+ Integer value = currentTaskMap.get(taskId);
|
|
|
+ if (value == null) {
|
|
|
+ synchronized (currentTaskMap) {
|
|
|
+ value = currentTaskMap.get(taskId);
|
|
|
+ if (value == null) {
|
|
|
+ currentTaskMap.put(taskId, userId);
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void releaseTask(Integer taskId) {
|
|
|
+ synchronized (currentTaskMap) {
|
|
|
+ currentTaskMap.remove(taskId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void releaseByUser(Integer userId) {
|
|
|
+ Set<Integer> taskIds = new HashSet<>();
|
|
|
+ taskIds.addAll(currentTaskMap.keySet());
|
|
|
+ synchronized (currentTaskMap) {
|
|
|
+ for (Integer taskId : taskIds) {
|
|
|
+ Integer value = currentTaskMap.get(taskId);
|
|
|
+ if (value != null && value.equals(userId)) {
|
|
|
+ currentTaskMap.remove(taskId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|