|
@@ -1,47 +1,53 @@
|
|
|
package cn.com.qmth.stmms.admin.exam;
|
|
|
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
|
|
|
+import java.util.ArrayList;
|
|
|
+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;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Controller;
|
|
|
+import org.springframework.ui.Model;
|
|
|
+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 cn.com.qmth.stmms.biz.exam.dao.SubjectiveScoreDao;
|
|
|
import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
|
|
|
-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.model.ExamSubject;
|
|
|
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
|
|
|
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.service.FileService;
|
|
|
-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.lock.LockService;
|
|
|
import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
|
|
|
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.enums.SubjectiveStatus;
|
|
|
import cn.com.qmth.stmms.common.utils.RequestUtils;
|
|
|
-import net.sf.json.JSONArray;
|
|
|
-import net.sf.json.JSONObject;
|
|
|
-import org.apache.commons.lang.StringUtils;
|
|
|
-import org.slf4j.Logger;
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.stereotype.Controller;
|
|
|
-import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
-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.*;
|
|
|
|
|
|
@Controller("inspectedController")
|
|
|
@RequestMapping("/admin/exam/inspected")
|
|
@@ -76,92 +82,103 @@ public class InspectedController extends BaseExamController {
|
|
|
@Autowired
|
|
|
private FileService fileService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private LockService lockService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SubjectiveScoreDao scoreDao;
|
|
|
+
|
|
|
// 并发处理互斥锁
|
|
|
private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
|
|
|
|
|
|
+ @RequestMapping
|
|
|
+ public String list(Model model, HttpServletRequest request, ExamStudentSearchQuery query,
|
|
|
+ @RequestParam(required = false) Integer groupNumber, @RequestParam(required = false) Double groupScore,
|
|
|
+ @RequestParam(required = false) Double questionScore) {
|
|
|
+ int examId = getSessionExamId(request);
|
|
|
+ WebUser wu = RequestUtils.getWebUser(request);
|
|
|
+ query.setExamId(examId);
|
|
|
+ List<ExamSubject> subjectList = getExamSubject(examId, wu);
|
|
|
+ if (query.getSubjectCode() == null && !subjectList.isEmpty()) {
|
|
|
+ query.setSubjectCode(subjectList.get(0).getCode());
|
|
|
+ }
|
|
|
+ if (groupNumber != null || groupScore != null || questionScore != null) {
|
|
|
+ List<Integer> studentIds = scoreDao.findStudentIdByGroupScoreAndScore(examId, query.getSubjectCode(),
|
|
|
+ groupScore, questionScore);
|
|
|
+ query.setStudentIds(studentIds);
|
|
|
+ }
|
|
|
+ query = studentService.findByQuery(query);
|
|
|
+ model.addAttribute("query", query);
|
|
|
+ model.addAttribute("subjectList", subjectList);
|
|
|
+ model.addAttribute("statusList", SubjectiveStatus.getOptionList());
|
|
|
+ return "modules/exam/inspectedList";
|
|
|
+ }
|
|
|
+
|
|
|
@Logging(menu = "开始复核", type = LogType.QUERY)
|
|
|
@RequestMapping("/start")
|
|
|
@ResponseBody
|
|
|
public ModelAndView start(HttpServletRequest request, RedirectAttributes redirectAttributes,
|
|
|
- @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
|
|
|
+ ExamStudentSearchQuery query, @RequestParam(required = false) Integer groupNumber,
|
|
|
+ @RequestParam(required = false) Double groupScore, @RequestParam(required = false) Double questionScore) {
|
|
|
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/inspected");
|
|
|
-
|
|
|
- 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);
|
|
|
- while (query.getCurrentCount() > 0) {
|
|
|
- for (MarkLibrary library : query.getResult()) {
|
|
|
- ids.add(library.getId());
|
|
|
- }
|
|
|
- query.setPageNumber(query.getPageNumber() + 1);
|
|
|
- query = libraryService.findByQuery(query);
|
|
|
- }
|
|
|
- view.addObject("fileServer", fileService.getFileServer());
|
|
|
- view.addObject("ids", StringUtils.join(ids, ","));
|
|
|
- return view;
|
|
|
+ query.setExamId(examId);
|
|
|
+ List<ExamSubject> subjectList = getExamSubject(examId, wu);
|
|
|
+ if (query.getSubjectCode() == null && !subjectList.isEmpty()) {
|
|
|
+ query.setSubjectCode(subjectList.get(0).getCode());
|
|
|
}
|
|
|
+ if (groupNumber != null || groupScore != null || questionScore != null) {
|
|
|
+ List<Integer> studentIds = scoreDao.findStudentIdByGroupScoreAndScore(examId, query.getSubjectCode(),
|
|
|
+ groupScore, questionScore);
|
|
|
+ query.setStudentIds(studentIds);
|
|
|
+ }
|
|
|
+ query = studentService.findByQuery(query);
|
|
|
+ List<Integer> ids = new ArrayList<Integer>();
|
|
|
+ for (ExamStudent student : query.getResult()) {
|
|
|
+ ids.add(student.getId());
|
|
|
+ }
|
|
|
+ view.addObject("fileServer", fileService.getFileServer());
|
|
|
+ view.addObject("ids", StringUtils.join(ids, ","));
|
|
|
+ return view;
|
|
|
}
|
|
|
|
|
|
@RequestMapping("/info")
|
|
|
@ResponseBody
|
|
|
- public Object info(HttpServletRequest request, @RequestParam Integer libraryId) {
|
|
|
+ public Object info(HttpServletRequest request, @RequestParam Integer studentId) {
|
|
|
WebUser wu = RequestUtils.getWebUser(request);
|
|
|
- MarkLibrary library = libraryService.findById(libraryId);
|
|
|
+ ExamStudent student = studentService.findById(studentId);
|
|
|
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.getStudentId());
|
|
|
- result.accumulate("subjectCode", library.getSubjectCode());
|
|
|
+ if (setCurrent(student.getId(), wu.getUser().getId())) {
|
|
|
+ result.accumulate("id", student.getId());
|
|
|
+ result.accumulate("subjectCode", student.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);
|
|
|
+ List<ScoreItem> scores = student.getScoreList(false);
|
|
|
+ for (ScoreItem scoreItem : scores) {
|
|
|
JSONObject obj = new JSONObject();
|
|
|
- obj.accumulate("questionNumber", question.getMainTitle() + " " + question.getQuestionNumber());
|
|
|
- obj.accumulate("score", scores.get(i).getScore());
|
|
|
+ obj.accumulate("questionNumber", scoreItem.getMainNumber() + "-" + scoreItem.getSubNumber());
|
|
|
+ obj.accumulate("score", scoreItem.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);
|
|
|
+ // 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);
|
|
@@ -169,18 +186,14 @@ public class InspectedController extends BaseExamController {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- @Logging(menu = "复核评卷任务", type = LogType.UPDATE)
|
|
|
+ @Logging(menu = "评卷复核", type = LogType.UPDATE)
|
|
|
@RequestMapping("/save")
|
|
|
@ResponseBody
|
|
|
- public Object save(HttpServletRequest request, @RequestParam Integer libraryId) {
|
|
|
- MarkLibrary library = libraryService.findById(libraryId);
|
|
|
- WebUser wu = RequestUtils.getWebUser(request);
|
|
|
- if (library != null && library.getStatus().equals(LibraryStatus.MARKED)) {
|
|
|
- // library.setStatus(LibraryStatus.INSPECTED);
|
|
|
- library.setHeaderId(wu.getUser().getId());
|
|
|
- library.setHeaderTime(new Date());
|
|
|
- libraryService.save(library);
|
|
|
- releaseTask(libraryId);
|
|
|
+ public Object save(HttpServletRequest request, @RequestParam Integer studentId) {
|
|
|
+ ExamStudent student = studentService.findById(studentId);
|
|
|
+ if (student != null && student.getSubjectiveStatus().equals(SubjectiveStatus.INSPECTED)) {
|
|
|
+ studentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.INSPECTED,
|
|
|
+ student.getTotalScore(), student.getSubjectiveScoreList());
|
|
|
return true;
|
|
|
} else {
|
|
|
return false;
|
|
@@ -200,6 +213,43 @@ public class InspectedController extends BaseExamController {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ @Logging(menu = "取消复核", type = LogType.UPDATE)
|
|
|
+ @RequestMapping(value = "/back", method = RequestMethod.POST)
|
|
|
+ @ResponseBody
|
|
|
+ @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
|
|
|
+ public JSONObject back(HttpServletRequest request, @RequestParam Integer id) {
|
|
|
+ JSONObject obj = new JSONObject();
|
|
|
+ ExamStudent student = studentService.findById(id);
|
|
|
+ WebUser wu = RequestUtils.getWebUser(request);
|
|
|
+ if (studentService != null) {
|
|
|
+ if (subjectCheck(student.getSubjectCode(), wu)) {
|
|
|
+ try {
|
|
|
+ if (lockService.trylock(LockType.STUDENT, student.getId())) {
|
|
|
+ studentService.updateSubjectiveStatusAndScore(id, SubjectiveStatus.MARKED,
|
|
|
+ student.getTotalScore(), student.getSubjectiveScoreList());
|
|
|
+ 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, student.getId());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ obj.accumulate("success", false);
|
|
|
+ obj.accumulate("message", "没有操作该评卷任务的权限");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ obj.accumulate("success", false);
|
|
|
+ obj.accumulate("message", "该阩不存在");
|
|
|
+ }
|
|
|
+ return obj;
|
|
|
+ }
|
|
|
+
|
|
|
private boolean setCurrent(Integer taskId, Integer userId) {
|
|
|
Integer value = currentTaskMap.get(taskId);
|
|
|
if (value == null) {
|