Browse Source

打回指定

xiatian 1 year ago
parent
commit
7cf0514a38

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java

@@ -165,4 +165,8 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
             + "and exists (select mc.id from MarkerClass mc, ExamStudent s where l1.studentId=s.id  and mc.examId=?1 and mc.userId=?4 and s.className=mc.className)")
             + "and exists (select mc.id from MarkerClass mc, ExamStudent s where l1.studentId=s.id  and mc.examId=?1 and mc.userId=?4 and s.className=mc.className)")
     long countMarkedFilterClass(Integer examId, String subjectCode, Integer groupNumber, Integer userId,
     long countMarkedFilterClass(Integer examId, String subjectCode, Integer groupNumber, Integer userId,
             LibraryStatus... status);
             LibraryStatus... status);
+
+    @Modifying(clearAutomatically = true)
+    @Query("update MarkLibrary m set m.markerId=?2 where m.id=?1")
+	void assigned(Integer libraryId, Integer userId);
 }
 }

+ 6 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLibraryServiceImpl.java

@@ -328,4 +328,10 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
             }
             }
         };
         };
     }
     }
+
+    @Transactional
+	@Override
+	public void assigned(Integer libraryId, Integer userId) {
+    	libraryDao.assigned(libraryId, userId);
+	}
 }
 }

+ 11 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java

@@ -1334,6 +1334,10 @@ public class MarkServiceImpl implements MarkService {
     private String getGroupKey(Marker marker) {
     private String getGroupKey(Marker marker) {
         return marker.getExamId() + "_" + marker.getSubjectCode() + "_" + marker.getGroupNumber();
         return marker.getExamId() + "_" + marker.getSubjectCode() + "_" + marker.getGroupNumber();
     }
     }
+    
+    private String getGroupKey(MarkLibrary library) {
+        return library.getExamId() + "_" + library.getSubjectCode() + "_" + library.getGroupNumber();
+    }
 
 
     /**
     /**
      * 重置评卷分组的连带操作
      * 重置评卷分组的连带操作
@@ -1866,4 +1870,11 @@ public class MarkServiceImpl implements MarkService {
         inspectHistoryService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         inspectHistoryService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectService.deleteByExamIdAndSubjectCode(examId, subjectCode);
     }
     }
+
+	@Override
+	public void releaseByLibrary(MarkLibrary library) {
+		TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(library));
+        taskLock.remove(library.getStudentId(), library.getTaskNumber(),library.getMarkerId());
+        taskLock.refresh(library.getMarkerId());
+	}
 }
 }

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkLibraryService.java

@@ -56,4 +56,6 @@ public interface MarkLibraryService {
 
 
     MarkLibrarySearchQuery findHistory(MarkLibrarySearchQuery query);
     MarkLibrarySearchQuery findHistory(MarkLibrarySearchQuery query);
 
 
+	void assigned(Integer libraryId, Integer userId);
+
 }
 }

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java

@@ -11,6 +11,8 @@ import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 import java.util.List;
 import java.util.List;
 
 
 public interface MarkService {
 public interface MarkService {
+	
+	void releaseByLibrary(MarkLibrary library);
 
 
     /**
     /**
      * 释放某个评卷员已完成的评卷任务
      * 释放某个评卷员已完成的评卷任务

+ 389 - 339
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java

@@ -59,365 +59,415 @@ import cn.com.qmth.stmms.common.utils.RequestUtils;
 @RequestMapping("/admin/exam/library")
 @RequestMapping("/admin/exam/library")
 public class LibraryController extends BaseExamController {
 public class LibraryController extends BaseExamController {
 
 
-    protected static Logger log = LoggerFactory.getLogger(LibraryController.class);
+	protected static Logger log = LoggerFactory.getLogger(LibraryController.class);
 
 
-    @Autowired
-    private MarkGroupService groupService;
+	@Autowired
+	private MarkGroupService groupService;
 
 
-    @Autowired
-    private MarkLibraryService libraryService;
+	@Autowired
+	private MarkLibraryService libraryService;
 
 
-    @Autowired
-    private ExamStudentService studentService;
+	@Autowired
+	private ExamStudentService studentService;
 
 
-    @Autowired
-    private MarkerService markerService;
+	@Autowired
+	private MarkerService markerService;
 
 
-    @Autowired
-    private MarkService markService;
+	@Autowired
+	private MarkService markService;
 
 
-    @Autowired
-    private LockService lockService;
+	@Autowired
+	private LockService lockService;
 
 
-    @Autowired
-    private ExamQuestionService questionService;
+	@Autowired
+	private ExamQuestionService questionService;
 
 
-    @Autowired
-    private ExamService examService;
+	@Autowired
+	private ExamService examService;
 
 
-    @Autowired
-    private FileService fileService;
+	@Autowired
+	private FileService fileService;
 
 
-    @Autowired
-    private UserService userService;
+	@Autowired
+	private UserService userService;
 
 
-    @Autowired
-    private TaskService taskService;
+	@Autowired
+	private TaskService taskService;
 
 
-    @Logging(menu = "评卷任务查询", type = LogType.QUERY)
-    @RequestMapping
-    public String list(Model model, HttpServletRequest request, MarkLibrarySearchQuery query,
-            @RequestParam(required = false) LibraryStatus status) {
-        int examId = getSessionExamId(request);
-        WebUser wu = RequestUtils.getWebUser(request);
-        List<ExamSubject> subjectList = getExamSubject(examId, wu);
-        if (subjectList.isEmpty()) {
-            return "redirect:/admin/exam/mark";
-        }
-        query.setExamId(examId);
-        if (status != null) {
-            query.addStatus(status);
-        }
-        if (status != LibraryStatus.REJECTED) {
-            query.setRejectReason(null);
-        }
-        if (StringUtils.isEmpty(query.getSubjectCode()) && !subjectList.isEmpty()) {
-            query.setSubjectCode(subjectList.get(0).getCode());
-        }
-        List<MarkGroup> groupList = groupService.findByExamAndSubjectAndStatus(examId, query.getSubjectCode(),
-                MarkStatus.FORMAL);
-        if (!groupList.isEmpty()) {
-            query = libraryService.findByQuery(query);
-            for (MarkLibrary library : query.getResult()) {
-                if (library.getMarkerId() != null) {
-                    User marker = userService.findByMarkerId(library.getMarkerId());
-                    library.setMarkerLoginName(marker.getLoginName() + "/" + marker.getName());
-                    if (library.getHeaderId() != null) {
-                        User header = userService.findById(library.getHeaderId());
-                        library.setHeaderLoginName(header.getLoginName() + "/" + header.getName());
-                    }
-                }
-            }
-            for (MarkGroup group : groupList) {
-                group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                        group.getSubjectCode(), false, group.getNumber()));
-            }
-        }
-        long inspectedCount = 0;
-        if (LibraryStatus.MARKED.equals(status) || status == null) {
-            query.addStatus(LibraryStatus.MARKED);
-            inspectedCount = libraryService.countByQuery(query);
-        }
-        model.addAttribute("inspectedCount", inspectedCount);
-        model.addAttribute("query", query);
-        model.addAttribute("subjectList", getExamSubject(examId, wu));
-        model.addAttribute("groupList", groupList);
-        model.addAttribute("statusList", LibraryStatus.getOptionList());
-        model.addAttribute("status", status);
-        List<Marker> markerList = new ArrayList<Marker>();
-        if (query.getGroupNumber() != null) {
-            MarkerSearchQuery mQuery = new MarkerSearchQuery();
-            mQuery.setExamId(examId);
-            mQuery.setSubjectCode(query.getSubjectCode());
-            mQuery.setGroupNumber(query.getGroupNumber());
-            mQuery.setPageSize(Integer.MAX_VALUE);
-            markerList = markerService.findByQuery(mQuery).getResult();
-            for (Marker marker : markerList) {
-                marker.setLoginName(userService.findById(marker.getUserId()).getLoginName());
-            }
-        }
-        model.addAttribute("markerList", markerList);
-        Exam exam = examService.findById(examId);
-        model.addAttribute("examType", exam.getType());
-        return "modules/exam/libraryList";
-    }
+	@Logging(menu = "评卷任务查询", type = LogType.QUERY)
+	@RequestMapping
+	public String list(Model model, HttpServletRequest request, MarkLibrarySearchQuery query,
+			@RequestParam(required = false) LibraryStatus status) {
+		int examId = getSessionExamId(request);
+		WebUser wu = RequestUtils.getWebUser(request);
+		List<ExamSubject> subjectList = getExamSubject(examId, wu);
+		if (subjectList.isEmpty()) {
+			return "redirect:/admin/exam/mark";
+		}
+		query.setExamId(examId);
+		if (status != null) {
+			query.addStatus(status);
+		}
+		if (status != LibraryStatus.REJECTED) {
+			query.setRejectReason(null);
+		}
+		if (StringUtils.isEmpty(query.getSubjectCode()) && !subjectList.isEmpty()) {
+			query.setSubjectCode(subjectList.get(0).getCode());
+		}
+		List<MarkGroup> groupList = groupService.findByExamAndSubjectAndStatus(examId, query.getSubjectCode(),
+				MarkStatus.FORMAL);
+		if (!groupList.isEmpty()) {
+			query = libraryService.findByQuery(query);
+			for (MarkLibrary library : query.getResult()) {
+				if (library.getMarkerId() != null) {
+					User marker = userService.findByMarkerId(library.getMarkerId());
+					library.setMarkerLoginName(marker.getLoginName() + "/" + marker.getName());
+					if (library.getHeaderId() != null) {
+						User header = userService.findById(library.getHeaderId());
+						library.setHeaderLoginName(header.getLoginName() + "/" + header.getName());
+					}
+				}
+			}
+			for (MarkGroup group : groupList) {
+				group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
+						group.getSubjectCode(), false, group.getNumber()));
+			}
+		}
+		long inspectedCount = 0;
+		if (LibraryStatus.MARKED.equals(status) || status == null) {
+			query.addStatus(LibraryStatus.MARKED);
+			inspectedCount = libraryService.countByQuery(query);
+		}
+		model.addAttribute("inspectedCount", inspectedCount);
+		model.addAttribute("query", query);
+		model.addAttribute("subjectList", getExamSubject(examId, wu));
+		model.addAttribute("groupList", groupList);
+		model.addAttribute("statusList", LibraryStatus.getOptionList());
+		model.addAttribute("status", status);
+		List<Marker> markerList = new ArrayList<Marker>();
+		if (query.getGroupNumber() != null) {
+			MarkerSearchQuery mQuery = new MarkerSearchQuery();
+			mQuery.setExamId(examId);
+			mQuery.setSubjectCode(query.getSubjectCode());
+			mQuery.setGroupNumber(query.getGroupNumber());
+			mQuery.setPageSize(Integer.MAX_VALUE);
+			markerList = markerService.findByQuery(mQuery).getResult();
+			for (Marker marker : markerList) {
+				marker.setLoginName(userService.findById(marker.getUserId()).getLoginName());
+			}
+		}
+		model.addAttribute("markerList", markerList);
+		Exam exam = examService.findById(examId);
+		model.addAttribute("examType", exam.getType());
+		return "modules/exam/libraryList";
+	}
 
 
-    @Logging(menu = "打回或重置评卷任务", type = LogType.UPDATE)
-    @RequestMapping(value = "/reject", method = RequestMethod.POST)
-    @ResponseBody
-    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.COLLEGE_ADMIN })
-    public JSONObject reject(HttpServletRequest request, @RequestParam Integer id,
-            @RequestParam(required = false, defaultValue = "false") boolean isRest,
-            @RequestParam(required = false) String reason) {
-        JSONObject obj = new JSONObject();
-        MarkLibrary library = libraryService.findById(id);
-        WebUser wu = RequestUtils.getWebUser(request);
-        if (library != null) {
-            if (subjectCheck(library.getSubjectCode(), RequestUtils.getWebUser(request))) {
-                try {
-                    lockService.watch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
-                    lockService.watch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
-                            library.getGroupNumber());
-                    lockService.waitlock(LockType.STUDENT, library.getStudentId());
-                    if ((library.getStatus().equals(LibraryStatus.MARKED)
-                            || library.getStatus().equals(LibraryStatus.PROBLEM) || library.getStatus().equals(
-                            LibraryStatus.INSPECTED))
-                            && markService.rejectLibrary(library, wu.getId(), reason, isRest)) {
-                        obj.accumulate("success", true);
-                    } else {
-                        obj.accumulate("success", false);
-                        obj.accumulate("message", "无法打回该评卷任务");
-                    }
-                } catch (Exception e) {
-                    obj.accumulate("success", false);
-                    obj.accumulate("message", "打回评卷任务失败");
-                    log.error("back library error", e);
-                } finally {
-                    lockService.unlock(LockType.STUDENT, library.getStudentId());
-                    lockService.unwatch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
-                            library.getGroupNumber());
-                    lockService.unwatch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
-                }
-            } else {
-                obj.accumulate("success", false);
-                obj.accumulate("message", "没有操作该评卷任务的权限");
-            }
-        } else {
-            obj.accumulate("success", false);
-            obj.accumulate("message", "该评卷任务不存在");
-        }
-        return obj;
-    }
+	@Logging(menu = "打回或重置评卷任务", type = LogType.UPDATE)
+	@RequestMapping(value = "/reject", method = RequestMethod.POST)
+	@ResponseBody
+	@RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.COLLEGE_ADMIN })
+	public JSONObject reject(HttpServletRequest request, @RequestParam Integer id,
+			@RequestParam(required = false, defaultValue = "false") boolean isRest,
+			@RequestParam(required = false) String reason) {
+		JSONObject obj = new JSONObject();
+		MarkLibrary library = libraryService.findById(id);
+		WebUser wu = RequestUtils.getWebUser(request);
+		if (library != null) {
+			if (subjectCheck(library.getSubjectCode(), RequestUtils.getWebUser(request))) {
+				try {
+					lockService.watch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
+					lockService.watch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
+							library.getGroupNumber());
+					lockService.waitlock(LockType.STUDENT, library.getStudentId());
+					if ((library.getStatus().equals(LibraryStatus.MARKED)
+							|| library.getStatus().equals(LibraryStatus.PROBLEM)
+							|| library.getStatus().equals(LibraryStatus.INSPECTED))
+							&& markService.rejectLibrary(library, wu.getId(), reason, isRest)) {
+						obj.accumulate("success", true);
+					} else {
+						obj.accumulate("success", false);
+						obj.accumulate("message", "无法打回该评卷任务");
+					}
+				} catch (Exception e) {
+					obj.accumulate("success", false);
+					obj.accumulate("message", "打回评卷任务失败");
+					log.error("back library error", e);
+				} finally {
+					lockService.unlock(LockType.STUDENT, library.getStudentId());
+					lockService.unwatch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
+							library.getGroupNumber());
+					lockService.unwatch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
+				}
+			} else {
+				obj.accumulate("success", false);
+				obj.accumulate("message", "没有操作该评卷任务的权限");
+			}
+		} else {
+			obj.accumulate("success", false);
+			obj.accumulate("message", "该评卷任务不存在");
+		}
+		return obj;
+	}
 
 
-    @RequestMapping(value = "/getJson", method = RequestMethod.GET)
-    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.SCHOOL_VIEWER, Role.COLLEGE_ADMIN })
-    public String getJson(Model model, HttpServletRequest request, @RequestParam Integer studentId,
-            @RequestParam(required = false) Integer groupNumber) {
-        int examId = getSessionExamId(request);
-        ExamStudent student = studentService.findById(studentId);
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(examId,
-                student.getSubjectCode(), false);
-        if (groupNumber != null) {
-            questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                    student.getSubjectCode(), false, groupNumber);
-        }
-        List<String> strings = new ArrayList<String>();
-        for (ExamQuestion examQuestion : questions) {
-            strings.add(examQuestion.getQuestionNumber());
-        }
-        String questionNumbers = String.join(",", strings);
-        model.addAttribute("questionNumbers", questionNumbers);
-        model.addAttribute("fileServer", fileService.getFileServer());
-        model.addAttribute("answerUrl", fileService.getJsonUri(student.getExamId(), student.getSecretNumber()));
-        model.addAttribute("paperUrl",
-                fileService.getPaperUri(student.getExamId(), student.getSubjectCode(), FormatType.JSON));
-        return "modules/exam/jsonView";
-    }
+	@RequestMapping(value = "/getJson", method = RequestMethod.GET)
+	@RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.SCHOOL_VIEWER, Role.COLLEGE_ADMIN })
+	public String getJson(Model model, HttpServletRequest request, @RequestParam Integer studentId,
+			@RequestParam(required = false) Integer groupNumber) {
+		int examId = getSessionExamId(request);
+		ExamStudent student = studentService.findById(studentId);
+		List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(examId,
+				student.getSubjectCode(), false);
+		if (groupNumber != null) {
+			questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, student.getSubjectCode(),
+					false, groupNumber);
+		}
+		List<String> strings = new ArrayList<String>();
+		for (ExamQuestion examQuestion : questions) {
+			strings.add(examQuestion.getQuestionNumber());
+		}
+		String questionNumbers = String.join(",", strings);
+		model.addAttribute("questionNumbers", questionNumbers);
+		model.addAttribute("fileServer", fileService.getFileServer());
+		model.addAttribute("answerUrl", fileService.getJsonUri(student.getExamId(), student.getSecretNumber()));
+		model.addAttribute("paperUrl",
+				fileService.getPaperUri(student.getExamId(), student.getSubjectCode(), FormatType.JSON));
+		return "modules/exam/jsonView";
+	}
 
 
-    @Logging(menu = "开始任务复核", type = LogType.QUERY)
-    @RequestMapping(value = "/getTask", method = RequestMethod.POST)
-    @ResponseBody
-    public Task getTask(HttpServletRequest request, RedirectAttributes redirectAttributes, MarkLibrarySearchQuery query) {
-        int examId = getSessionExamId(request);
-        MarkGroup group = groupService.findOne(examId, query.getSubjectCode(), query.getGroupNumber());
-        if (group == null) {
-            return null;
-        } else if (group.getStatus() == MarkStatus.FINISH) {
-            return null;
-        } else if (group.getStatus() == MarkStatus.TRIAL) {
-            return null;
-        }
-        Task task = null;
-        WebUser wu = RequestUtils.getWebUser(request);
-        int retry = 1;
-        while (task == null) {
-            query.setExamId(examId);
-            query.addStatus(LibraryStatus.MARKED);
-            query.setPageNumber(retry);
-            query.setPageSize(20);
-            query = libraryService.findByQuery(query);
-            if (query.getResult().isEmpty()) {
-                break;
-            }
-            for (MarkLibrary library : query.getResult()) {
-                if (libraryService.applyLibrary(library, wu.getId())) {
-                    task = taskService.build(library);
-                    break;
-                }
-            }
-            if (task == null) {
-                retry++;
-            }
-        }
-        return task;
-    }
+	@Logging(menu = "开始任务复核", type = LogType.QUERY)
+	@RequestMapping(value = "/getTask", method = RequestMethod.POST)
+	@ResponseBody
+	public Task getTask(HttpServletRequest request, RedirectAttributes redirectAttributes,
+			MarkLibrarySearchQuery query) {
+		int examId = getSessionExamId(request);
+		MarkGroup group = groupService.findOne(examId, query.getSubjectCode(), query.getGroupNumber());
+		if (group == null) {
+			return null;
+		} else if (group.getStatus() == MarkStatus.FINISH) {
+			return null;
+		} else if (group.getStatus() == MarkStatus.TRIAL) {
+			return null;
+		}
+		Task task = null;
+		WebUser wu = RequestUtils.getWebUser(request);
+		int retry = 1;
+		while (task == null) {
+			query.setExamId(examId);
+			query.addStatus(LibraryStatus.MARKED);
+			query.setPageNumber(retry);
+			query.setPageSize(20);
+			query = libraryService.findByQuery(query);
+			if (query.getResult().isEmpty()) {
+				break;
+			}
+			for (MarkLibrary library : query.getResult()) {
+				if (libraryService.applyLibrary(library, wu.getId())) {
+					task = taskService.build(library);
+					break;
+				}
+			}
+			if (task == null) {
+				retry++;
+			}
+		}
+		return task;
+	}
 
 
-    @Logging(menu = "考生评卷复核", type = LogType.UPDATE)
-    @RequestMapping(value = "/inspected/save", method = RequestMethod.POST)
-    @ResponseBody
-    public Object save(HttpServletRequest request, @RequestParam Integer libraryId) {
-        WebUser wu = RequestUtils.getWebUser(request);
-        MarkLibrary library = libraryService.findById(libraryId);
-        JSONObject obj = new JSONObject();
-        try {
-            if (libraryId != null && library.getStatus().equals(LibraryStatus.MARKED)
-                    && libraryService.hasApplied(library, wu.getId())) {
-                library.setHeaderId(wu.getUser().getId());
-                library.setHeaderTime(new Date());
-                library.setStatus(LibraryStatus.INSPECTED);
-                libraryService.save(library);
-                libraryService.releaseByLibrary(library);
-                obj.accumulate("success", true);
-            } else {
-                obj.accumulate("success", false);
-                obj.accumulate("message", "无法复核,请刷新页面");
-            }
-        } catch (Exception e) {
-            obj.accumulate("success", false);
-            obj.accumulate("message", "无法复核,请刷新页面!");
-            log.error("inspected library save error", e);
-        }
-        return obj;
-    }
+	@Logging(menu = "考生评卷复核", type = LogType.UPDATE)
+	@RequestMapping(value = "/inspected/save", method = RequestMethod.POST)
+	@ResponseBody
+	public Object save(HttpServletRequest request, @RequestParam Integer libraryId) {
+		WebUser wu = RequestUtils.getWebUser(request);
+		MarkLibrary library = libraryService.findById(libraryId);
+		JSONObject obj = new JSONObject();
+		try {
+			if (libraryId != null && library.getStatus().equals(LibraryStatus.MARKED)
+					&& libraryService.hasApplied(library, wu.getId())) {
+				library.setHeaderId(wu.getUser().getId());
+				library.setHeaderTime(new Date());
+				library.setStatus(LibraryStatus.INSPECTED);
+				libraryService.save(library);
+				libraryService.releaseByLibrary(library);
+				obj.accumulate("success", true);
+			} else {
+				obj.accumulate("success", false);
+				obj.accumulate("message", "无法复核,请刷新页面");
+			}
+		} catch (Exception e) {
+			obj.accumulate("success", false);
+			obj.accumulate("message", "无法复核,请刷新页面!");
+			log.error("inspected library save error", e);
+		}
+		return obj;
+	}
 
 
-    @RequestMapping(value = "/clear", method = RequestMethod.POST)
-    @ResponseBody
-    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.COLLEGE_ADMIN })
-    public Object clear(HttpServletRequest request, @RequestParam String subjectCode,
-            @RequestParam Integer groupNumber, @RequestParam(required = false) Integer libraryId) {
-        WebUser wu = RequestUtils.getWebUser(request);
-        JSONObject obj = new JSONObject();
-        if (libraryId != null) {
-            releaseLibrary(libraryId);
-            obj.accumulate("success", true);
-        } else {
-            int examId = getSessionExamId(request);
-            releaseUser(examId, subjectCode, groupNumber, wu.getUser().getId());
-            obj.accumulate("success", true);
-        }
-        return obj;
-    }
+	@RequestMapping(value = "/clear", method = RequestMethod.POST)
+	@ResponseBody
+	@RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.COLLEGE_ADMIN })
+	public Object clear(HttpServletRequest request, @RequestParam String subjectCode, @RequestParam Integer groupNumber,
+			@RequestParam(required = false) Integer libraryId) {
+		WebUser wu = RequestUtils.getWebUser(request);
+		JSONObject obj = new JSONObject();
+		if (libraryId != null) {
+			releaseLibrary(libraryId);
+			obj.accumulate("success", true);
+		} else {
+			int examId = getSessionExamId(request);
+			releaseUser(examId, subjectCode, groupNumber, wu.getUser().getId());
+			obj.accumulate("success", true);
+		}
+		return obj;
+	}
 
 
-    @RequestMapping(value = "/getStatus", method = RequestMethod.POST)
-    @ResponseBody
-    public JSONObject status(HttpServletRequest request, MarkLibrarySearchQuery query) {
-        JSONObject status = new JSONObject();
-        int examId = getSessionExamId(request);
-        query.setExamId(examId);
-        query.addStatus(LibraryStatus.MARKED);
-        long inspectedCount = libraryService.countByQuery(query);
-        status.accumulate("totalCount", inspectedCount);
-        status.accumulate("valid", true);
-        return status;
-    }
+	@RequestMapping(value = "/getStatus", method = RequestMethod.POST)
+	@ResponseBody
+	public JSONObject status(HttpServletRequest request, MarkLibrarySearchQuery query) {
+		JSONObject status = new JSONObject();
+		int examId = getSessionExamId(request);
+		query.setExamId(examId);
+		query.addStatus(LibraryStatus.MARKED);
+		long inspectedCount = libraryService.countByQuery(query);
+		status.accumulate("totalCount", inspectedCount);
+		status.accumulate("valid", true);
+		return status;
+	}
 
 
-    private void releaseUser(Integer examId, String subjectCode, Integer groupNumber, Integer userId) {
-        try {
-            libraryService.releaseByUserId(examId, subjectCode, groupNumber, userId);
-        } catch (Exception e) {
-            log.error("release user error", e);
-        }
-    }
+	private void releaseUser(Integer examId, String subjectCode, Integer groupNumber, Integer userId) {
+		try {
+			libraryService.releaseByUserId(examId, subjectCode, groupNumber, userId);
+		} catch (Exception e) {
+			log.error("release user error", e);
+		}
+	}
 
 
-    private void releaseLibrary(Integer libraryId) {
-        try {
-            MarkLibrary library = libraryService.findById(libraryId);
-            libraryService.releaseByLibrary(library);
-        } catch (Exception e) {
-            log.error("release library error", e);
-        }
-    }
+	private void releaseLibrary(Integer libraryId) {
+		try {
+			MarkLibrary library = libraryService.findById(libraryId);
+			libraryService.releaseByLibrary(library);
+		} catch (Exception e) {
+			log.error("release library error", e);
+		}
+	}
 
 
-    @Logging(menu = "打回", type = LogType.UPDATE)
-    @RequestMapping(value = "/rejected", method = RequestMethod.POST)
-    @ResponseBody
-    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.INSPECTOR, Role.COLLEGE_ADMIN })
-    public JSONObject rejected(HttpServletRequest request, @RequestBody RejectResult rejectResult) {
-        JSONObject obj = new JSONObject();
-        WebUser wu = RequestUtils.getWebUser(request);
-        MarkLibrary library = libraryService.findById(rejectResult.getLibraryId());
-        if (library != null) {
-            if (subjectCheck(library.getSubjectCode(), RequestUtils.getWebUser(request))) {
-                try {
-                    lockService.watch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
-                    lockService.watch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
-                            library.getGroupNumber());
-                    lockService.waitlock(LockType.STUDENT, library.getStudentId());
-                    if (((libraryService.hasApplied(library, wu.getId())
-                            && (library.getStatus().equals(LibraryStatus.MARKED)) || library.getStatus().equals(
-                            LibraryStatus.INSPECTED)) && markService.rejectLibrary(library,
-                            rejectResult.getQuestionList(), wu.getId(), rejectResult.getReason()))) {
-                        libraryService.releaseByLibrary(library);
-                        obj.accumulate("success", true);
-                    } else {
-                        obj.accumulate("success", false);
-                        obj.accumulate("message", "无法打回该评卷任务");
-                    }
-                } catch (Exception e) {
-                    obj.accumulate("success", false);
-                    obj.accumulate("message", "打回评卷任务失败");
-                    log.error("back library error", e);
-                } finally {
-                    lockService.unlock(LockType.STUDENT, library.getStudentId());
-                    lockService.unwatch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
-                            library.getGroupNumber());
-                    lockService.unwatch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
-                }
-            } else {
-                obj.accumulate("success", false);
-                obj.accumulate("message", "没有操作该评卷任务的权限");
-            }
-        } else {
-            obj.accumulate("success", false);
-            obj.accumulate("message", "该评卷任务不存在");
-        }
-        return obj;
-    }
+	@Logging(menu = "打回", type = LogType.UPDATE)
+	@RequestMapping(value = "/rejected", method = RequestMethod.POST)
+	@ResponseBody
+	@RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.INSPECTOR, Role.COLLEGE_ADMIN })
+	public JSONObject rejected(HttpServletRequest request, @RequestBody RejectResult rejectResult) {
+		JSONObject obj = new JSONObject();
+		WebUser wu = RequestUtils.getWebUser(request);
+		MarkLibrary library = libraryService.findById(rejectResult.getLibraryId());
+		if (library != null) {
+			if (subjectCheck(library.getSubjectCode(), RequestUtils.getWebUser(request))) {
+				try {
+					lockService.watch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
+					lockService.watch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
+							library.getGroupNumber());
+					lockService.waitlock(LockType.STUDENT, library.getStudentId());
+					if (((libraryService.hasApplied(library, wu.getId())
+							&& (library.getStatus().equals(LibraryStatus.MARKED))
+							|| library.getStatus().equals(LibraryStatus.INSPECTED))
+							&& markService.rejectLibrary(library, rejectResult.getQuestionList(), wu.getId(),
+									rejectResult.getReason()))) {
+						libraryService.releaseByLibrary(library);
+						obj.accumulate("success", true);
+					} else {
+						obj.accumulate("success", false);
+						obj.accumulate("message", "无法打回该评卷任务");
+					}
+				} catch (Exception e) {
+					obj.accumulate("success", false);
+					obj.accumulate("message", "打回评卷任务失败");
+					log.error("back library error", e);
+				} finally {
+					lockService.unlock(LockType.STUDENT, library.getStudentId());
+					lockService.unwatch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
+							library.getGroupNumber());
+					lockService.unwatch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
+				}
+			} else {
+				obj.accumulate("success", false);
+				obj.accumulate("message", "没有操作该评卷任务的权限");
+			}
+		} else {
+			obj.accumulate("success", false);
+			obj.accumulate("message", "该评卷任务不存在");
+		}
+		return obj;
+	}
 
 
-    @Logging(menu = "回看评卷复核任务", type = LogType.QUERY)
-    @RequestMapping(value = "/getHistory", method = RequestMethod.POST)
-    @ResponseBody
-    public Object getHistory(HttpServletRequest request, @RequestParam String subjectCode,
-            @RequestParam Integer groupNumber, @RequestParam int pageNumber, @RequestParam int pageSize)
-            throws Exception {
-        int examId = getSessionExamId(request);
-        WebUser wu = RequestUtils.getWebUser(request);
-        List<Task> list = new ArrayList<>();
-        MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
-        query.setExamId(examId);
-        query.setSubjectCode(subjectCode);
-        query.setGroupNumber(groupNumber);
-        query.addStatus(LibraryStatus.INSPECTED);
-        query.setHeaderId(wu.getId());
-        query.setPageNumber(pageNumber);
-        query.setPageSize(pageSize);
-        query.orderByHeaderTimeDesc();
-        query = libraryService.findByQuery(query);
-        for (MarkLibrary library : query.getResult()) {
-            Task task = taskService.build(library);
-            task.setPrevious(true);
-            list.add(task);
-        }
-        return list;
-    }
+	@Logging(menu = "回看评卷复核任务", type = LogType.QUERY)
+	@RequestMapping(value = "/getHistory", method = RequestMethod.POST)
+	@ResponseBody
+	public Object getHistory(HttpServletRequest request, @RequestParam String subjectCode,
+			@RequestParam Integer groupNumber, @RequestParam int pageNumber, @RequestParam int pageSize)
+			throws Exception {
+		int examId = getSessionExamId(request);
+		WebUser wu = RequestUtils.getWebUser(request);
+		List<Task> list = new ArrayList<>();
+		MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
+		query.setExamId(examId);
+		query.setSubjectCode(subjectCode);
+		query.setGroupNumber(groupNumber);
+		query.addStatus(LibraryStatus.INSPECTED);
+		query.setHeaderId(wu.getId());
+		query.setPageNumber(pageNumber);
+		query.setPageSize(pageSize);
+		query.orderByHeaderTimeDesc();
+		query = libraryService.findByQuery(query);
+		for (MarkLibrary library : query.getResult()) {
+			Task task = taskService.build(library);
+			task.setPrevious(true);
+			list.add(task);
+		}
+		return list;
+	}
+
+	@Logging(menu = "评卷员任务指定", type = LogType.UPDATE)
+	@RequestMapping(value = "assigned", method = RequestMethod.POST)
+	@ResponseBody
+	public JSONObject assigned(@RequestParam Integer libraryId, @RequestParam String marker) {
+		User user = userService.findByLoginName(marker);
+		JSONObject obj = new JSONObject();
+		obj.put("success", false);
+		if (user == null || !Role.MARKER.equals(user.getRole())) {
+			obj.put("message", "指定失败,未找到评卷员");
+			return obj;
+		}
+		MarkLibrary library = libraryService.findById(libraryId);
+		if (library == null) {
+			obj.put("message", "指定失败,未找到评卷任务");
+			return obj;
+		}
+		try {
+			lockService.watch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
+			lockService.watch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
+					library.getGroupNumber());
+			lockService.waitlock(LockType.STUDENT, library.getStudentId());
+			Marker mk=markerService.findByExamAndSubjectAndNumberAndUserId(library.getExamId(), library.getSubjectCode(),
+					library.getGroupNumber(), user.getId());
+			if (mk == null) {
+				obj.put("message", "指定失败,评卷员不在该任务分组");
+				return obj;
+			}
+			if(library.getMarkerId().equals(mk.getId())) {
+				obj.put("message", "指定失败,当前任务已属于该评卷员");
+				return obj;
+			}
+			markService.releaseByLibrary(library);
+			if(markService.applyLibrary(library, mk)) {
+				libraryService.assigned(library.getId(),mk.getId());
+				obj.put("success", true);
+			}else {
+				obj.put("message", "指定失败,请重试");
+				return obj;
+			}
+			return obj;
+		} finally {
+			lockService.unlock(LockType.STUDENT, library.getStudentId());
+			lockService.unwatch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
+					library.getGroupNumber());
+			lockService.unwatch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
+		}
+	}
 }
 }

+ 130 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/rejectList.jsp

@@ -103,14 +103,106 @@
             </td>
             </td>
             <td>
             <td>
                	<a href="${ctx}/web/admin/exam/track/library?libraryId=${result.id}&subjectCode=${result.subjectCode}" target="_blank">试卷详情</a>
                	<a href="${ctx}/web/admin/exam/track/library?libraryId=${result.id}&subjectCode=${result.subjectCode}" target="_blank">试卷详情</a>
+               	<c:if test="${result.markerLoginName!=null}">
+                    <a href="javascript:void(0)"  onclick="taskAssigned('${result.id}');">任务指定</a>
+                </c:if>
             </td>
             </td>
         </tr>
         </tr>
     </c:forEach>
     </c:forEach>
     </tbody>
     </tbody>
 </table>
 </table>
+<div class="task-assigned-win" style="display:none">
+    <div class="task-assigned-header">
+    	<input id="libraryId" type="hidden"/>
+        <p class="title">任务指定评卷员</p>
+        <p class="image-close task-assigned-close"><img src="${ctxStatic}/mark-new/images/images-close.png"/></p></div>
+    <div class="task-assigned-content"><input type="text" class="task-assigned-value" placeholder="请输入新指定评卷员账号"/><i class="task-assigned-wrong"></i></div>
+    <a href="#" class="btn btn-small btn-info task-assigned-btn">确定</a>
+</div>
 </form>
 </form>
 <div class="pagination">${query}</div>
 <div class="pagination">${query}</div>
 <%@include file="/WEB-INF/views/include/trackView.jsp" %>
 <%@include file="/WEB-INF/views/include/trackView.jsp" %>
+<style type="text/css">
+        .sort {
+            color: #0663A2;
+            cursor: pointer;
+        }
+        
+        .task-assigned-win {
+            width: 400px;
+            min-height: 150px;
+            background: #fff;
+            font-family: "微软雅黑", Fixedsys;
+            border: #5d6d7d solid 1px;
+            position: absolute;
+            left: 50%;
+            top: 50%;
+            margin: -150px 0 0 -200px;
+            text-align: center;
+            z-index: 99999;
+        }
+        
+        .task-assigned-header {
+            width: 100%;
+            height: 46px;
+            background: #5d6d7d;
+            color: #fff;
+        }
+        
+        .task-assigned-content {
+            font-size: 18px;
+            color: #005277;
+            text-align: left;
+            padding: 15px;
+            line-height: 30px;
+            word-wrap: break-word;
+        }
+        
+        .image-close {
+            margin-top: 15px;
+            margin-right: 15px;
+            cursor: pointer;
+            float: right;
+        }
+        
+        .title {
+            font-size: 22px;
+            font-weight: bold;
+            color: #fff;
+            margin: 0px;
+            padding: 13px 0 0 13px;
+            float: left;
+        }
+
+        .task-assigned-value {
+            width: 180px;
+        }
+
+        .btn-info {
+            height: 25px;
+            margin-left: 320px;
+            margin-bottom: 20px;
+        }
+        
+        .task-assigned-wrong {
+            font-size: 12px;
+            color: #f00;
+            line-height: 30px;
+            padding-left: 20px;
+        }
+        
+        #cover {
+            position: fixed;
+            z-index: 9999;
+            top: 0px;
+            left: 0px;
+            display: none;
+            width: 100%;
+            height: 100%;
+            opacity: 0.5;
+            background: #000 none repeat scroll 0% 0%;
+        }
+    </style>
 <script type="text/javascript">
 <script type="text/javascript">
     $(document).ready(function () {
     $(document).ready(function () {
         $('.track-link').click(function () {
         $('.track-link').click(function () {
@@ -193,6 +285,44 @@
         $("#searchForm").submit();
         $("#searchForm").submit();
         return false;
         return false;
     }
     }
+    
+    function taskAssigned(obj) {
+    	$('#libraryId').attr("value", obj);
+        $('.task-assigned-wrong').html('');
+        $('.task-assigned-value').val('');
+        $('.task-assigned-win').show();
+        $('#cover').show();
+    }
+    $('.task-assigned-close').click(function () {
+        $('.task-assigned-win').hide();
+        $('#cover').hide();
+    });
+    $('.task-assigned-btn').click(function () {
+        var marker = $('.task-assigned-value').val();
+        var wrongMessage = $('.task-assigned-wrong');
+        if (!marker||marker.length == 0) {
+            wrongMessage.html('账号不能为空!');
+            return false;
+        }else{
+        	wrongMessage.html('');
+        }
+        var libraryId=$("#libraryId").val();
+        $.ajax({
+        	url:"${ctx}/admin/exam/library/assigned",
+        	data:{marker: marker, libraryId: libraryId},
+        	traditional:true,
+        	type:"post",
+        	success:function (result) {
+                if (result.success == true) {
+                    alert('指定成功');
+                	$('.task-assigned-win').hide();
+                    $("#searchForm").submit();
+                } else {
+                    alert(result.message);
+                }
+        	}
+        });
+    });
 </script>
 </script>
 </body>
 </body>
 </html>
 </html>