123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- package cn.com.qmth.stmms.mark;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.commons.lang.StringUtils;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestBody;
- 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 cn.com.qmth.stmms.biz.exam.model.Exam;
- 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.model.Tag;
- import cn.com.qmth.stmms.biz.exam.service.ExamService;
- import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
- import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
- import cn.com.qmth.stmms.biz.exam.service.MarkerService;
- import cn.com.qmth.stmms.biz.exam.service.TagService;
- import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
- import cn.com.qmth.stmms.biz.mark.model.MarkResult;
- import cn.com.qmth.stmms.biz.mark.model.Task;
- import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
- import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
- 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.TaskService;
- import cn.com.qmth.stmms.biz.mark.service.TrialService;
- import cn.com.qmth.stmms.biz.mark.service.Impl.MarkLockService;
- import cn.com.qmth.stmms.common.controller.BaseController;
- import cn.com.qmth.stmms.common.enums.LibraryStatus;
- import cn.com.qmth.stmms.common.enums.MarkMode;
- import cn.com.qmth.stmms.common.enums.MarkStatus;
- import cn.com.qmth.stmms.common.utils.RequestUtils;
- import net.sf.json.JSONArray;
- import net.sf.json.JSONObject;
- @Controller
- @RequestMapping("/mark")
- public class MarkController extends BaseController {
- private static Logger log = LoggerFactory.getLogger(MarkController.class);
- @Autowired
- private ExamSubjectService subjectService;
- @Autowired
- private TrialService trialService;
- @Autowired
- private MarkerService markerService;
- @Autowired
- private MarkLibraryService libraryService;
- @Autowired
- private TaskService taskService;
- @Autowired
- private TagService tagService;
- @Autowired
- private MarkService markService;
- @Autowired
- private ExamService examService;
- @Autowired
- private MarkGroupService groupService;
- @Autowired
- private MarkLockService lockService;
- @Value("${slice.image.server}")
- private String sliceServer;
- @Value("${sheet.image.server}")
- private String sheetServer;
- @Value("${card.server}")
- private String cardServer;
- @Value("${marker.forceMode}")
- private String forceMarkMode;
- @RequestMapping(value = "/reset", method = RequestMethod.GET)
- public ModelAndView reset(HttpServletRequest request) {
- Marker marker = RequestUtils.getWebUser(request).getMarker();
- ModelAndView modelAndView = new ModelAndView("modules/mark/reset");
- modelAndView.addObject("marker", marker);
- return modelAndView;
- }
- @RequestMapping(value = "/reset", method = RequestMethod.POST)
- public ModelAndView reset(HttpServletRequest request, Marker marker) {
- Marker current = RequestUtils.getWebUser(request).getMarker();
- current.setName(marker.getName());
- current.setPassword(marker.getPassword());
- current.setLastLoginIp(request.getRemoteAddr());
- current.setLastLoginTime(new Date());
- markerService.save(current);
- return new ModelAndView("redirect:/mark/index");
- }
- @RequestMapping("/index")
- public ModelAndView index(HttpServletRequest request, @RequestParam(value = "mode", required = false) String mode) {
- Marker marker = RequestUtils.getWebUser(request).getMarker();
- ModelAndView modelAndView = getMarkModeView(marker, MarkMode.findByName(mode));
- preProcess(marker, modelAndView);
- return modelAndView;
- }
- private ModelAndView getMarkModeView(Marker marker, MarkMode mode) {
- boolean forceMode = false;
- MarkMode sysMode = MarkMode.findByName(forceMarkMode);
- if (sysMode != null) {
- // 全局配置的强制评卷模式
- mode = sysMode;
- forceMode = true;
- } else {
- // 没有全局配置,优先从大题配置取强制评卷模式
- MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(),
- marker.getGroupNumber());
- if (group != null && group.getMarkMode() != null) {
- mode = group.getMarkMode();
- forceMode = true;
- }
- // 否则取评卷员当前记录的评卷模式
- if (mode == null) {
- mode = marker.getMode();
- }
- if (mode == null) {
- mode = MarkMode.COMMON;
- }
- if (marker.getMode() != mode) {
- marker.setMode(mode);
- markerService.save(marker);
- }
- }
- ModelAndView view = new ModelAndView(
- mode == MarkMode.TRACK ? "modules/mark/markTrack" : "modules/mark/markNew");
- view.addObject("forceMode", forceMode);
- return view;
- }
- @RequestMapping("/logout")
- public ModelAndView logout(HttpServletRequest request) {
- Marker marker = RequestUtils.getWebUser(request).getMarker();
- markService.releaseByMarker(marker);
- return new ModelAndView("redirect:/mark-logout");
- }
- /**
- * 进入评卷界面后的通用预处理
- *
- * @param marker
- * @param session
- * @param modelAndView
- * @param modelAndView
- */
- private void preProcess(Marker marker, ModelAndView modelAndView) {
- modelAndView.addObject("sliceServer", sliceServer);
- modelAndView.addObject("sheetServer", sheetServer);
- modelAndView.addObject("cardServer", cardServer);
- modelAndView.addObject("marker", marker);
- modelAndView.addObject("subject", subjectService.find(marker.getExamId(), marker.getSubjectCode()));
- Exam exam = examService.findById(marker.getExamId());
- modelAndView.addObject("forceSpecialTag", exam.isForceSpecialTag());
- markService.releaseByMarker(marker);
- }
- @RequestMapping("/clear")
- @ResponseBody
- public void clear(HttpServletRequest request) {
- Marker marker = RequestUtils.getWebUser(request).getMarker();
- if (marker != null) {
- // 清除该评卷员当前正在评卷的指定任务
- markService.releaseByMarker(marker);
- }
- }
- @RequestMapping("/status")
- @ResponseBody
- public JSONObject status(HttpServletRequest request) {
- JSONObject status = new JSONObject();
- Marker marker = RequestUtils.getWebUser(request).getMarker();
- ExamSubject subject = subjectService.find(marker.getExamId(), marker.getSubjectCode());
- MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
- if (subject == null || group == null || group.getStatus() == MarkStatus.FINISH) {
- status.accumulate("valid", false);
- return status;
- }
- long totalCount = 0;
- long personCount = 0;
- long markedCount = 0;
- long exceptionCount = 0;
- long topCount = 0;
- if (group.getStatus() == MarkStatus.FORMAL) {
- topCount = marker.getTopCount() != null ? marker.getTopCount() : 0;
- MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
- query.setExamId(marker.getExamId());
- query.setSubjectCode(marker.getSubjectCode());
- query.setGroupNumber(marker.getGroupNumber());
- totalCount = libraryService.countByQuery(query);
- query.setMarkerId(marker.getId());
- personCount = libraryService.countByQuery(query);
- query.setMarkerId(0);
- query.addStatus(LibraryStatus.MARKED);
- query.addStatus(LibraryStatus.ARBITRATED);
- markedCount = libraryService.countByQuery(query);
- query.clearStatus();
- query.addStatus(LibraryStatus.WAIT_ARBITRATE);
- exceptionCount = libraryService.countByQuery(query);
- } else if (group.getStatus() == MarkStatus.TRIAL) {
- totalCount = trialService.countLibrary(group.getExamId(), group.getSubjectCode(), group.getNumber());
- personCount = trialService.countMarkerHistory(marker.getId());
- markedCount = personCount;
- }
- status.accumulate("personCount", personCount);
- status.accumulate("totalCount", totalCount);
- status.accumulate("markedCount", markedCount);
- status.accumulate("exceptionCount", exceptionCount);
- status.accumulate("valid", totalCount > 0);
- status.accumulate("topCount", topCount);
- return status;
- }
- @RequestMapping("/gettask")
- @ResponseBody
- public Task getTask(HttpServletRequest request) {
- Marker marker = RequestUtils.getWebUser(request).getMarker();
- lockService.waitUnlockMarker(marker.getId());
- MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
- Task task = null;
- if (group == null) {
- task = new Task();
- task.setExist(false);
- task.setMessage("评卷大题不存在");
- } else if (group.getStatus() == MarkStatus.FINISH) {
- task = new Task();
- task.setExist(false);
- task.setMessage("评卷已结束");
- } else if (group.getStatus() == MarkStatus.TRIAL) {
- task = getTrialTask(marker);
- } else if (group.getStatus() == MarkStatus.FORMAL) {
- task = getFormalTask(marker);
- }
- if (task == null) {
- task = new Task();
- task.setExist(false);
- task.setMessage("当前无评卷任务");
- }
- return task;
- }
- private Task getFormalTask(Marker marker) {
- int retry = 1;
- Task task = null;
- while (retry <= 10 && task == null) {
- List<MarkLibrary> list = libraryService.findUnMarked(marker.getExamId(), marker.getSubjectCode(),
- marker.getGroupNumber(), marker.getId(), retry, 20);
- if (list.isEmpty()) {
- break;
- }
- for (MarkLibrary library : list) {
- if (markService.applyLibrary(library, marker)) {
- task = taskService.build(library);
- break;
- }
- }
- if (task == null) {
- retry++;
- }
- }
- return task;
- }
- private Task getTrialTask(Marker marker) {
- int retry = 1;
- Task task = null;
- while (task == null) {
- List<TrialLibrary> list = trialService.findUnMarkedLibrary(marker.getExamId(), marker.getSubjectCode(),
- marker.getGroupNumber(), marker.getId(), retry, 10);
- if (list.isEmpty()) {
- break;
- }
- for (TrialLibrary library : list) {
- if (markService.applyLibrary(library, marker)) {
- task = taskService.build(library, null);
- break;
- }
- }
- retry++;
- }
- return task;
- }
- @RequestMapping(value = "/savetask", method = RequestMethod.POST)
- @ResponseBody
- public JSONObject saveTask(HttpServletRequest request, @RequestBody MarkResult markResult) {
- JSONObject result = new JSONObject();
- Marker marker = RequestUtils.getWebUser(request).getMarker();
- boolean success = false;
- try {
- lockService.lockMarker(marker.getId());
- success = markService.submitTask(markResult, marker);
- } catch (Exception e) {
- log.error("save task error", e);
- } finally {
- lockService.unlockMarker(marker.getId());
- }
- result.accumulate("success", success);
- result.accumulate("status", status(request));
- if (!success) {
- result.accumulate("message", "评卷任务提交失败,请刷新重试");
- }
- return result;
- }
- @RequestMapping("/gethistory")
- @ResponseBody
- public Object history(HttpServletRequest request, @RequestParam int pageNumber, @RequestParam int pageSize)
- throws Exception {
- Marker marker = RequestUtils.getWebUser(request).getMarker();
- List<Task> list = new ArrayList<>();
- MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
- if (group != null && group.getStatus() == MarkStatus.FORMAL) {
- // 正评查找已给分的评卷任务
- MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
- query.setExamId(marker.getExamId());
- query.setSubjectCode(marker.getSubjectCode());
- query.setMarkerId(marker.getId());
- query.addStatus(LibraryStatus.MARKED);
- query.setGroupNumber(marker.getGroupNumber());
- query.setPageNumber(pageNumber);
- query.setPageSize(pageSize);
- query.orderByMarkerTimeDesc();
- list = taskService.findByQuery(query);
- for (Task task : list) {
- task.setPrevious(true);
- }
- } else if (group != null && group.getStatus() == MarkStatus.TRIAL) {
- // 试评查找给分历史记录
- List<TrialHistory> historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
- marker.getGroupNumber(), marker.getId(), pageNumber, pageSize);
- for (TrialHistory history : historyList) {
- TrialLibrary library = trialService.findLibrary(history.getLibraryId());
- if (library != null) {
- Task task = taskService.build(library, history);
- task.setPrevious(true);
- list.add(task);
- }
- }
- }
- return list;
- }
- @RequestMapping("/change-name")
- @ResponseBody
- public JSONObject changeName(HttpServletRequest request, @RequestParam String name,
- @RequestParam(required = false) String password) {
- Marker marker = RequestUtils.getWebUser(request).getMarker();
- JSONObject result = new JSONObject();
- marker.setName(name);
- if (StringUtils.isNotEmpty(password)) {
- marker.setPassword(password);
- }
- marker = markerService.save(marker);
- result.accumulate("success", marker != null);
- if (marker != null) {
- result.accumulate("name", marker.getName());
- }
- return result;
- }
- @RequestMapping("/tags")
- @ResponseBody
- public JSONArray getTags(HttpServletRequest request) {
- JSONArray array = new JSONArray();
- List<Tag> list = tagService.findAll();
- for (Tag tag : list) {
- JSONObject obj = new JSONObject();
- obj.accumulate("value", tag.getId());
- obj.accumulate("name", tag.getName());
- array.add(obj);
- }
- return array;
- }
- }
|