Browse Source

新增仲裁打回

yin 6 months ago
parent
commit
fa8a139923
21 changed files with 537 additions and 173 deletions
  1. 159 19
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  2. 18 8
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java
  3. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java
  4. 3 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/TaskService.java
  5. 0 2
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java
  6. 47 19
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java
  7. 2 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ImportQueryController.java
  8. 4 4
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java
  9. 10 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java
  10. 25 13
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java
  11. 16 5
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkTrackController.java
  12. 1 5
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ProblemHistoryController.java
  13. 3 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreVerifyController.java
  14. 19 34
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectRangeController.java
  15. 6 6
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ScoreCheckThread.java
  16. 6 9
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamController.java
  17. 40 26
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamStudentController.java
  18. 172 12
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateList.jsp
  19. 0 4
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/libraryList.jsp
  20. 3 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/paperDetail.jsp
  21. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/questionEdit.jsp

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

@@ -2,14 +2,20 @@ package cn.com.qmth.stmms.biz.mark.service.Impl;
 
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
-import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
-import cn.com.qmth.stmms.biz.user.model.User;
-import cn.com.qmth.stmms.biz.user.service.UserService;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -18,19 +24,68 @@ import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import cn.com.qmth.stmms.biz.exam.dao.*;
-import cn.com.qmth.stmms.biz.exam.model.*;
-import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
+import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
+import cn.com.qmth.stmms.biz.exam.dao.MarkGroupStudentDao;
+import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
+import cn.com.qmth.stmms.biz.exam.dao.SelectiveStudentDao;
+import cn.com.qmth.stmms.biz.exam.dao.SubjectiveScoreDao;
+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.MarkGroup;
+import cn.com.qmth.stmms.biz.exam.model.MarkGroupStudent;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
+import cn.com.qmth.stmms.biz.exam.model.SelectiveStudent;
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveScore;
+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.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.InspectHistoryService;
+import cn.com.qmth.stmms.biz.exam.service.InspectedService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
+import cn.com.qmth.stmms.biz.exam.service.SubjectiveScoreService;
 import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.biz.mark.dao.*;
-import cn.com.qmth.stmms.biz.mark.model.*;
+import cn.com.qmth.stmms.biz.mark.dao.ArbitrateHistoryDao;
+import cn.com.qmth.stmms.biz.mark.dao.HeaderTagDao;
+import cn.com.qmth.stmms.biz.mark.dao.HeaderTrackDao;
+import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
+import cn.com.qmth.stmms.biz.mark.dao.MarkSpecialTagDao;
+import cn.com.qmth.stmms.biz.mark.dao.MarkTrackDao;
+import cn.com.qmth.stmms.biz.mark.dao.ProblemHistoryDao;
+import cn.com.qmth.stmms.biz.mark.dao.RejectHistoryDao;
+import cn.com.qmth.stmms.biz.mark.dao.TrialLibraryDao;
+import cn.com.qmth.stmms.biz.mark.dao.TrialTagDao;
+import cn.com.qmth.stmms.biz.mark.dao.TrialTrackDao;
+import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
+import cn.com.qmth.stmms.biz.mark.model.HeaderTrack;
+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.MarkStepDTO;
+import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
+import cn.com.qmth.stmms.biz.mark.model.ProblemHistory;
+import cn.com.qmth.stmms.biz.mark.model.RejectHistory;
+import cn.com.qmth.stmms.biz.mark.model.SubmitResult;
+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.MarkService;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
+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.biz.utils.TaskLock;
 import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
-import cn.com.qmth.stmms.common.enums.*;
+import cn.com.qmth.stmms.common.enums.ArbitrateType;
+import cn.com.qmth.stmms.common.enums.HistoryStatus;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.MarkStatus;
+import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
+import cn.com.qmth.stmms.common.enums.ScorePolicy;
+import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import cn.com.qmth.stmms.common.enums.ThirdPolicy;
+import cn.com.qmth.stmms.common.enums.TrialMode;
 import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
 
 /**
@@ -414,7 +469,7 @@ public class MarkServiceImpl implements MarkService {
     public boolean hasApplied(TrialLibrary library, Marker marker) {
         TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
         if (TrialMode.EXCLUSIVE.equals(systemCache.getTrialMode())) {
-            return  taskLock.exist(library.getId(), 1, marker.getId());
+            return taskLock.exist(library.getId(), 1, marker.getId());
         } else {
             return taskLock.exist(library.getStudentId(), 1, marker.getId());
         }
@@ -439,7 +494,7 @@ public class MarkServiceImpl implements MarkService {
             TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
             if (TrialMode.EXCLUSIVE.equals(systemCache.getTrialMode())) {
                 taskLock.remove(result.getTrialLibrary().getId(), 1, marker.getId());
-            }else{
+            } else {
                 taskLock.remove(result.getTrialLibrary().getStudentId(), 1, marker.getId());
             }
         }
@@ -512,6 +567,89 @@ public class MarkServiceImpl implements MarkService {
         markerService.deleteById(marker.getId());
     }
 
+    @Override
+    @Transactional
+    public void backArbitrate(Integer historyId, Integer userId, String reason) {
+        ArbitrateHistory history = arbitrateDao.findOne(historyId);
+        List<Integer> questionIndexList = history.getQuestionIndexList();
+        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                history.getExamId(), history.getSubjectCode(), false, history.getGroupNumber());
+        MarkGroup group = groupDao.findOne(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
+        Date now = new Date();
+        List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(history.getStudentId(),
+                history.getGroupNumber());
+        int count = 0;
+        for (MarkLibrary library : list) {
+            if (library.getTaskNumber() == 3) {
+                // 出现三评时删除第三条任务
+                problemHistoryDao.deleteByLibraryId(library.getId());
+                trackDao.deleteByLibraryId(library.getId());
+                specialTagDao.deleteByLibraryId(library.getId());
+                headerTagDao.deleteByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
+                headerTrackDao.deleteByPkStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
+                libraryDao.delete(library);
+                updateLibraryCount(group);
+                count++;
+                continue;
+            }
+            RejectHistory rejectHistory = new RejectHistory(library);
+            rejectHistory.setUserId(userId);
+            rejectHistory.setReason(reason);
+
+            if (questionIndexList.isEmpty() || questionIndexList.size() == questions.size()) {
+                // 仲裁任务直接重置该分组下所有分数被打回也重置
+                markerService.updateRejectCountById(library.getMarkerId());
+                libraryDao.resetById(library.getId(), null, reason, userId, now, LibraryStatus.REJECTED,
+                        LibraryStatus.MARKED, LibraryStatus.PROBLEM, LibraryStatus.INSPECTED, LibraryStatus.ARBITRATED,LibraryStatus.WAIT_ARBITRATE);
+                rejectHistoryDao.save(rejectHistory);
+                trackDao.deleteByLibraryId(library.getId());
+                specialTagDao.deleteByLibraryId(library.getId());
+                count++;
+                continue;
+            } else {
+                List<ScoreItem> sList = library.getMarkerScoreItem();
+                for (Integer questionIndex : questionIndexList) {
+                    ExamQuestion question = questions.get(questionIndex-1);
+                    trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(),
+                            question.getMainNumber() + "." + question.getSubNumber());
+                    scoreDao.updateRejected(library.getStudentId(), question.getMainNumber(), question.getSubNumber(),
+                            true);
+                    ScoreItem si = sList.get(questionIndex-1);
+                    si.setScore(null);
+                }
+                List<Object> markerScoreList = new ArrayList<Object>();
+                for (int i = 0; i < sList.size(); i++) {
+                    ScoreItem scoreItem = sList.get(i);
+                    if (scoreItem.getScore() != null) {
+                        markerScoreList.add(new DecimalFormat("####.###").format(scoreItem.getScore()));
+                    } else {
+                        markerScoreList.add("#");
+                    }
+                }
+                if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.REJECTED, library.getMarkerId(), null,
+                        StringUtils.join(markerScoreList, ","), null, null, reason, userId, now, LibraryStatus.MARKED,
+                        LibraryStatus.INSPECTED,LibraryStatus.ARBITRATED,LibraryStatus.WAIT_ARBITRATE) == 1) {
+                    markerService.updateRejectCountById(library.getMarkerId());
+                    rejectHistory.setRejectScoreList(StringUtils.join(markerScoreList, ","));
+                    rejectHistoryDao.save(rejectHistory);
+                    count++;
+                }
+            }
+        }
+        if (count > 0) {
+            updateMarkedCount(group);
+            resetStudentGroup(history.getStudentId(), history.getExamId(), history.getSubjectCode(),
+                    history.getGroupNumber());
+            studentService.updateSubjectiveStatusAndTimeAndInspectorId(history.getStudentId(), SubjectiveStatus.UNMARK,
+                    null, null);
+            inspectedService.cancelByStudent(history.getStudentId());
+        }
+        headerTagDao.deleteByStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
+        headerTrackDao.deleteByPkStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
+        arbitrateDao.deleteByStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
+
+    }
+
     /**
      * 根据考生删除评卷任务
      *
@@ -1123,11 +1261,12 @@ public class MarkServiceImpl implements MarkService {
                 Collections.reverse(partScoreList);
             }
             if (ScorePolicy.MIN_WITHOUT_ZERO.equals(policy)) {
-                //已排序后,去除0分
+                // 已排序后,去除0分
                 while (partScoreList.size() > selectiveCount && partScoreList.get(0) == 0) {
                     partScoreList.remove(0);
                 }
-                // partScoreList = partScoreList.stream().filter(s -> s.doubleValue() >
+                // partScoreList = partScoreList.stream().filter(s ->
+                // s.doubleValue() >
                 // 0).collect(Collectors.toList());
             }
             // 计算一个选做题分组得分
@@ -1564,24 +1703,25 @@ public class MarkServiceImpl implements MarkService {
         MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
         query.setPageNumber(1);
         query.setPageSize(1);
-        query.setSort(new Sort(Sort.Direction.DESC,"markerTime", "examNumber"));
+        query.setSort(new Sort(Sort.Direction.DESC, "markerTime", "examNumber"));
         Set<LibraryStatus> statusSet = new HashSet<>();
         statusSet.add(LibraryStatus.MARKED);
-        List<MarkLibrary> list = libraryDao.findByMarkerIdAndStatus(marker.getId(),statusSet, query);
+        List<MarkLibrary> list = libraryDao.findByMarkerIdAndStatus(marker.getId(), statusSet, query);
 
         MarkLibrarySearchQuery queryH = new MarkLibrarySearchQuery();
         queryH.setPageNumber(1);
         queryH.setPageSize(1);
-        queryH.setSort(new Sort(Sort.Direction.DESC,"headerTime", "examNumber"));
+        queryH.setSort(new Sort(Sort.Direction.DESC, "headerTime", "examNumber"));
         Set<LibraryStatus> statusSetH = new HashSet<>();
         statusSetH.add(LibraryStatus.ARBITRATED);
-        List<MarkLibrary> listH = libraryDao.findByMarkerIdAndStatus(marker.getId(),statusSetH, query);
+        List<MarkLibrary> listH = libraryDao.findByMarkerIdAndStatus(marker.getId(), statusSetH, query);
 
         MarkLibrary library = list.isEmpty() ? null : list.get(0);
         MarkLibrary libraryH = listH.isEmpty() ? null : listH.get(0);
         if (library != null && library.getMarkerTime() != null) {
             long lastMarkTime = library.getMarkerTime().getTime();
-            if (libraryH != null && libraryH.getHeaderTime() != null && libraryH.getHeaderTime().getTime()>lastMarkTime) {
+            if (libraryH != null && libraryH.getHeaderTime() != null
+                    && libraryH.getHeaderTime().getTime() > lastMarkTime) {
                 lastMarkTime = libraryH.getHeaderTime().getTime();
             }
             if (lastUpdateTime != null && lastUpdateTime > lastMarkTime) {

+ 18 - 8
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java

@@ -2,6 +2,8 @@ package cn.com.qmth.stmms.biz.mark.service.Impl;
 
 import java.util.*;
 
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.common.enums.*;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -15,10 +17,6 @@ import cn.com.qmth.stmms.biz.mark.model.*;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.service.*;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
-import cn.com.qmth.stmms.common.enums.ExamType;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 
 /**
  * 评卷任务服务实现
@@ -30,6 +28,8 @@ public class TaskServiceImpl implements TaskService {
 
     public static final double UN_SELECTIVE_SCORE = -1;
 
+    private static final String DEFAULT_SECRET_NUMBER = "***";
+
     @Autowired
     private MarkLibraryService libraryService;
 
@@ -88,12 +88,18 @@ public class TaskServiceImpl implements TaskService {
     }
 
     @Override
-    public Task build(ArbitrateHistory history, MarkGroup group) {
+    public Task build(ArbitrateHistory history, MarkGroup group, User user) {
         ExamStudent student = studentService.findByExamIdAndExamNumber(history.getExamId(), history.getExamNumber());
+        Exam exam = examService.findById(student.getExamId());
+
         Task task = new Task();
         task.setStudentId(history.getStudentId());
         task.setLibraryId(history.getId());
-        task.setSecretNumber(history.getSecretNumber());
+        if (exam.isForbiddenInfo() && !Role.SCHOOL_ADMIN.equals(user.getRole())) {
+            task.setSecretNumber(DEFAULT_SECRET_NUMBER);
+        }else{
+            task.setSecretNumber(student.getSecretNumber());
+        }
         task.setQuestionList(buildArbitrateStep(group, history));
         task.setSpecialTagList(getHeaderTagList(history.getStudentId(), group.getNumber()));
         task.setSliceUrls(
@@ -390,13 +396,17 @@ public class TaskServiceImpl implements TaskService {
     }
 
     @Override
-    public Task build(ExamStudent student) {
+    public Task build(ExamStudent student, User user) {
         ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
         Exam exam = examService.findById(student.getExamId());
 
         Task task = new Task();
         task.setStudentId(student.getId());
-        task.setSecretNumber(student.getSecretNumber());
+        if (exam.isForbiddenInfo() && !Role.SCHOOL_ADMIN.equals(user.getRole())) {
+            task.setSecretNumber(DEFAULT_SECRET_NUMBER);
+        }else{
+            task.setSecretNumber(student.getSecretNumber());
+        }
         task.setStudentCode(student.getStudentCode());
         task.setStudentName(student.getName());
         task.setExamNumber(student.getExamNumber());

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

@@ -252,4 +252,6 @@ public interface MarkService {
     void resetLibrary(MarkLibrary library);
 
     void deleteMarker(Marker marker);
+
+    void backArbitrate(Integer historyId, Integer userId, String reason);
 }

+ 3 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/TaskService.java

@@ -9,18 +9,19 @@ import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
+import cn.com.qmth.stmms.biz.user.model.User;
 
 public interface TaskService {
 
     List<Task> findByQuery(MarkLibrarySearchQuery query);
 
-    Task build(ArbitrateHistory history, MarkGroup group);
+    Task build(ArbitrateHistory history, MarkGroup group, User user);
 
     Task build(TrialLibrary library);
 
     Task build(MarkLibrary library);
 
-    Task build(ExamStudent student);
+    Task build(ExamStudent student, User user);
 
     List<Task> findHistory(MarkLibrarySearchQuery query);
 

+ 0 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java

@@ -9,8 +9,6 @@ import cn.com.qmth.stmms.common.annotation.ExcelField;
 import cn.com.qmth.stmms.common.enums.ArbitrateType;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 
-import javax.persistence.Column;
-
 public class SubjectiveQuestionDTO implements QuestionDTO {
 
     private static final String NULL_PAPER_TYPE_PLACEHOLDER = "#";

+ 47 - 19
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java

@@ -10,8 +10,6 @@ import java.util.Set;
 
 import javax.servlet.http.HttpServletRequest;
 
-import net.sf.json.JSONObject;
-
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,6 +50,7 @@ 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.ArbitrateType;
 import cn.com.qmth.stmms.common.enums.HistoryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LockType;
@@ -59,6 +58,7 @@ import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
 
 @Controller("arbitrateController")
 @RequestMapping("/admin/exam/arbitrate")
@@ -170,6 +170,7 @@ public class ArbitrateController extends BaseExamController {
         if (subjectCode != null && groupNumber != null) {
             group = groupService.findOne(examId, subjectCode, groupNumber);
             setting.accumulate("selective", group.isSelective());
+            setting.accumulate("arbitrateType", group.getArbitrateType());
         }
         ExamSubject examSubject = subjectService.find(examId, subjectCode);
         setting.accumulate("fileServer", fileService.getFileServer());
@@ -228,25 +229,52 @@ public class ArbitrateController extends BaseExamController {
     @RequestMapping(value = "/back", method = RequestMethod.POST)
     @ResponseBody
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.COLLEGE_ADMIN })
-    public JSONObject back(HttpServletRequest request, @RequestParam Integer historyId) {
+    public JSONObject back(HttpServletRequest request, @RequestParam Integer[] ids,
+            @RequestParam(required = false) String reason) {
         JSONObject obj = new JSONObject();
-        ArbitrateHistory history = arbitrateService.findById(historyId);
-        if (history != null) {
-            if (history.getStatus() != HistoryStatus.WAITING) {
-                obj.accumulate("success", false);
-                obj.accumulate("message", "该仲裁卷已被处理");
-            } else {
-                if (subjectCheck(history.getSubjectCode(), RequestUtils.getWebUser(request))) {
-                    // TODO - 需要区分全体打回和单个任务打回,下个版本实现
-                    obj.accumulate("success", true);
+        WebUser wu = RequestUtils.getWebUser(request);
+        int count = 0;
+        for (Integer historyId: ids) {
+            ArbitrateHistory history = arbitrateService.findById(historyId);
+            MarkGroup group = groupService.findOne(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
+            if (history != null && group != null
+                    && subjectCheck(history.getSubjectCode(), RequestUtils.getWebUser(request))) {
+                if (!ArbitrateType.QUESTION.equals(group.getArbitrateType())) {
+                    continue;
+//                    obj.accumulate("success", false);
+//                    obj.accumulate("message", "仅支持小题仲裁模式打回");
+                } else if (history.getStatus() != HistoryStatus.WAITING) {
+                    continue;
+//                    obj.accumulate("success", false);
+//                    obj.accumulate("message", "该仲裁卷已被处理");
                 } else {
-                    obj.accumulate("success", false);
-                    obj.accumulate("message", "没有操作该仲裁卷的权限");
+                    try {
+                        lockService.watch(LockType.EXAM_SUBJECT, history.getExamId(), history.getSubjectCode());
+                        lockService.watch(LockType.GROUP, history.getExamId(), history.getSubjectCode(),
+                                history.getGroupNumber());
+                        lockService.waitlock(LockType.STUDENT, history.getStudentId());
+                        markService.backArbitrate(historyId, wu.getUser().getId(), reason);
+                        releaseTask(history.getId());
+                        count++;
+//                        obj.accumulate("success", true);
+                    } catch (Exception e) {
+                        log.error("ArbitrateController-打回仲裁卷出错", e);
+//                        obj.accumulate("success", false);
+//                        obj.accumulate("message", "仲裁任务打回失败");
+                    } finally {
+                        lockService.unlock(LockType.STUDENT, history.getStudentId());
+                        lockService.unwatch(LockType.GROUP, history.getExamId(), history.getSubjectCode(),
+                                history.getGroupNumber());
+                        lockService.unwatch(LockType.EXAM_SUBJECT, history.getExamId(), history.getSubjectCode());
+                    }
                 }
             }
-        } else {
+        }
+        if(count>0){
+            obj.accumulate("success", true);
+        }else{
             obj.accumulate("success", false);
-            obj.accumulate("message", "该仲裁记录不存在");
+            obj.accumulate("message", "仲裁任务打回失败");
         }
         return obj;
     }
@@ -289,7 +317,7 @@ public class ArbitrateController extends BaseExamController {
             query.setSort(querySort);
             query = arbitrateService.findByQuery(query);
             for (ArbitrateHistory history : query.getResult()) {
-                Task task = taskService.build(history, group);
+                Task task = taskService.build(history, group, wu.getUser());
                 task.setPrevious(true);
                 list.add(task);
             }
@@ -310,7 +338,7 @@ public class ArbitrateController extends BaseExamController {
                 return new Task();
             }
             MarkGroup group = groupService.findOne(examId, history.getSubjectCode(), history.getGroupNumber());
-            return taskService.build(history, group);
+            return taskService.build(history, group, wu.getUser());
         }
         MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
         if (subjectCheck(subjectCode, wu) && group != null) {
@@ -330,7 +358,7 @@ public class ArbitrateController extends BaseExamController {
                 for (ArbitrateHistory history : query.getResult()) {
                     // 尝试领取该任务并上锁
                     if (setCurrent(history.getId(), wu.getUser().getId())) {
-                        return taskService.build(history, group);
+                        return taskService.build(history, group, wu.getUser());
                     } else {
                         continue;
                     }

+ 2 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ImportQueryController.java

@@ -250,9 +250,10 @@ public class ImportQueryController extends BaseExamController {
     @ResponseBody
     public Task info(HttpServletRequest request, @RequestParam Integer studentId) {
         ExamStudent student = studentService.findById(studentId);
+        WebUser wu = RequestUtils.getWebUser(request);
         Task task = null;
         if (student != null) {
-            task = taskService.build(student);
+            task = taskService.build(student,wu.getUser());
         }
         return task;
     }

+ 4 - 4
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -212,7 +212,7 @@ public class InspectedController extends BaseExamController {
             }
             releaseStudent(studentId);
             if (inspectedService.applyStudent(ExamStudentVo.of(student), wu.getId())) {
-                task = taskService.build(student);
+                task = taskService.build(student, wu.getUser());
             }
         } else if (StringUtils.isNotBlank(query.getSecretNumber())) {
             ExamStudent student = studentService.findByExamIdAndSecretNumber(examId, query.getSecretNumber());
@@ -225,7 +225,7 @@ public class InspectedController extends BaseExamController {
             }
             releaseStudent(student.getId());
             if (inspectedService.applyStudent(ExamStudentVo.of(student), wu.getId())) {
-                task = taskService.build(student);
+                task = taskService.build(student, wu.getUser());
             }
         }else {
 	        int retry = 1;
@@ -249,7 +249,7 @@ public class InspectedController extends BaseExamController {
 	            }
 	            for (ExamStudentVo student : list) {
 	                if (inspectedService.applyStudent(student, wu.getId())) {
-	                    task = taskService.build(ExamStudent.of(student));
+	                    task = taskService.build(ExamStudent.of(student), wu.getUser());
 	                    break;
 	                }
 	            }
@@ -519,7 +519,7 @@ public class InspectedController extends BaseExamController {
         query.orderByInspectTimeDesc();
         query = studentService.findByQuery(query);
         for (ExamStudent student : query.getResult()) {
-            Task task = taskService.build(student);
+            Task task = taskService.build(student, wu.getUser());
             task.setPrevious(true);
             list.add(task);
         }

+ 10 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java

@@ -96,6 +96,8 @@ public class LibraryController extends BaseExamController {
 
 	public static final String UN_SELECTIVE_SCORE = "-1";
 
+	private static final String DEFAULT_SECRET_NUMBER = "***";
+
 	@Logging(menu = "评卷任务查询", type = LogType.QUERY)
 	@RequestMapping
 	public String list(Model model, HttpServletRequest request, MarkLibrarySearchQuery query,
@@ -246,6 +248,7 @@ public class LibraryController extends BaseExamController {
 			MarkLibrarySearchQuery query) {
 		int examId = getSessionExamId(request);
 		MarkGroup group = groupService.findOne(examId, query.getSubjectCode(), query.getGroupNumber());
+		Exam exam = examService.findById(examId);
 		if (group == null) {
 			return null;
 		} else if (group.getStatus() == MarkStatus.FINISH) {
@@ -268,6 +271,9 @@ public class LibraryController extends BaseExamController {
 			for (MarkLibrary library : query.getResult()) {
 				if (libraryService.applyLibrary(library, wu.getId())) {
 					task = taskService.build(library);
+					if (exam.isForbiddenInfo() && !Role.SCHOOL_ADMIN.equals(wu.getRole())) {
+						task.setSecretNumber(DEFAULT_SECRET_NUMBER);
+					}
 					break;
 				}
 			}
@@ -408,6 +414,7 @@ public class LibraryController extends BaseExamController {
 			@RequestParam Integer groupNumber, @RequestParam int pageNumber, @RequestParam int pageSize)
 			throws Exception {
 		int examId = getSessionExamId(request);
+		Exam exam = examService.findById(examId);
 		WebUser wu = RequestUtils.getWebUser(request);
 		List<Task> list = new ArrayList<>();
 		MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
@@ -422,6 +429,9 @@ public class LibraryController extends BaseExamController {
 		query = libraryService.findByQuery(query);
 		for (MarkLibrary library : query.getResult()) {
 			Task task = taskService.build(library);
+			if (exam.isForbiddenInfo() && !Role.SCHOOL_ADMIN.equals(wu.getRole())) {
+				task.setSecretNumber(DEFAULT_SECRET_NUMBER);
+			}
 			task.setPrevious(true);
 			list.add(task);
 		}

+ 25 - 13
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java

@@ -1,13 +1,15 @@
 package cn.com.qmth.stmms.admin.exam;
 
 import java.text.DecimalFormat;
-import java.util.*;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import cn.com.qmth.stmms.biz.exam.dao.SelectiveStudentDao;
-import cn.com.qmth.stmms.biz.exam.model.SelectiveStudent;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -22,10 +24,15 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import cn.com.qmth.stmms.admin.dto.MarkInfoDTO;
 import cn.com.qmth.stmms.admin.dto.MarkerInfoDTO;
 import cn.com.qmth.stmms.admin.vo.SubjectLibraryVO;
+import cn.com.qmth.stmms.biz.exam.dao.SelectiveStudentDao;
 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.*;
+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.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.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
@@ -34,7 +41,11 @@ 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.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.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -126,7 +137,8 @@ public class MarkController extends BaseExamController {
             long count = questionService.countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(examId,
                     subject.getCode(), false);
             vo.setGroupFinish(count == 0);
-            vo.setSelectiveError(selectiveStudentDao.countByExamIdAndSubjectCodeAndLessSelectiveOrNotSelective(subject.getExamId(),subject.getCode(),true,true)!=0);
+            vo.setSelectiveError(selectiveStudentDao.countByExamIdAndSubjectCodeAndLessSelectiveOrNotSelective(
+                    subject.getExamId(), subject.getCode(), true, true) != 0);
             list.add(vo);
         }
         MarkLibrarySearchQuery mQuery = new MarkLibrarySearchQuery();
@@ -238,7 +250,7 @@ public class MarkController extends BaseExamController {
     public String finish(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
             @RequestParam String[] codes) {
         int examId = getSessionExamId(request);
-        String messages ="";
+        String messages = "";
         for (String code : codes) {
             MarkLibrarySearchQuery mQuery = new MarkLibrarySearchQuery();
             mQuery.setExamId(examId);
@@ -253,26 +265,26 @@ public class MarkController extends BaseExamController {
             }
             List<MarkGroup> groups = groupService.findByExamAndSubject(examId, code);
             for (MarkGroup group : groups) {
-                if (group == null|| group.getStatus() == MarkStatus.FINISH) {
+                if (group == null || group.getStatus() == MarkStatus.FINISH) {
                     continue;
                 }
                 try {
                     lockService.waitlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                     if (group.getStatus() == MarkStatus.FORMAL && group.getLeftCount() == 0
                             && selectiveStudentDao.countByExamIdAndSubjectCodeAndLessSelectiveOrNotSelective(
-                            group.getExamId(), group.getSubjectCode(), true, true) == 0) {
+                                    group.getExamId(), group.getSubjectCode(), true, true) == 0) {
                         groupService.updateStatus(examId, code, group.getNumber(), MarkStatus.FINISH,
                                 group.getStatus());
-                    }else{
-                        messages = " "+code ;
+                    } else {
+                        messages = " " + code;
                     }
                 } finally {
                     lockService.unlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 }
             }
         }
-        if(StringUtils.isNotBlank(messages)){
-            addMessage(redirectAttributes, messages+" 评卷未完成或选做题异常,无法关闭分组");
+        if (StringUtils.isNotBlank(messages)) {
+            addMessage(redirectAttributes, messages + " 评卷未完成或选做题异常,无法关闭分组");
         }
         return "redirect:/admin/exam/mark";
     }

+ 16 - 5
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkTrackController.java

@@ -4,6 +4,9 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,6 +37,8 @@ import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.biz.mark.service.TrialService;
 
+import javax.servlet.http.HttpServletRequest;
+
 @Controller("trackController")
 @RequestMapping("/admin/exam/track")
 public class MarkTrackController extends BaseExamController {
@@ -76,12 +81,14 @@ public class MarkTrackController extends BaseExamController {
     @Value("${slice.split.config}")
     private String splitConfig;
 
+    private static final String DEFAULT_SECRET_NUMBER = "***";
+
     @ResponseBody
     @RequestMapping("/student")
-    public Task studentTrack(@RequestParam Integer studentId) {
+    public Task studentTrack(HttpServletRequest request, @RequestParam Integer studentId) {
+        WebUser wu = RequestUtils.getWebUser(request);
         Task task = new Task();
         ExamStudent student = studentService.findById(studentId);
-
         if (student != null && student.isUpload()) {
             // List<String> sliceUrls =
             // fileService.getSliceUris(student.getExamId(),
@@ -105,7 +112,7 @@ public class MarkTrackController extends BaseExamController {
             // }
             // map.accumulate("tagList", list);
             // map.accumulate("examNumber", student.getExamNumber());
-            task = taskService.build(student);
+            task = taskService.build(student, wu.getUser());
         }
         return task;
     }
@@ -134,15 +141,19 @@ public class MarkTrackController extends BaseExamController {
 
     @ResponseBody
     @RequestMapping("/library")
-    public HashMap<String, Object> byLibrary(@RequestParam Integer libraryId) {
+    public HashMap<String, Object> byLibrary(HttpServletRequest request,@RequestParam Integer libraryId) {
+        WebUser wu = RequestUtils.getWebUser(request);
         MarkLibrary library = libraryService.findById(libraryId);
         HashMap<String, Object> map = new HashMap<String, Object>();
         Task task = taskService.build(library);
+        Exam exam = examService.findById(library.getExamId());
+        if (exam.isForbiddenInfo() && !Role.SCHOOL_ADMIN.equals(wu.getRole())) {
+            task.setSecretNumber(DEFAULT_SECRET_NUMBER);
+        }
         map.put("task", task);
         map.put("groupNumber", library.getGroupNumber());
         map.put("fileServer", fileService.getFileServer());
         map.put("splitConfig", getSplitConfig());
-        Exam exam = examService.findById(library.getExamId());
         ExamSubject examSubject = subjectService.find(library.getExamId(), library.getSubjectCode());
         map.put("enableSplit",
                 examSubject.getEnableSplit() == null ? exam.isEnableSplit() : examSubject.getEnableSplit());

+ 1 - 5
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ProblemHistoryController.java

@@ -25,7 +25,6 @@ import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 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.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
@@ -67,9 +66,6 @@ public class ProblemHistoryController extends BaseExamController {
     @Autowired
     private ExamStudentService studentService;
 
-    @Autowired
-    private ExamSubjectService subjectService;
-
     @Autowired
     private ExamService examService;
 
@@ -180,7 +176,7 @@ public class ProblemHistoryController extends BaseExamController {
                 } catch (Exception e) {
                     log.error("back library error", e);
                 } finally {
-                	lockService.unlock(LockType.STUDENT, library.getStudentId());
+                    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());

+ 3 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreVerifyController.java

@@ -224,16 +224,16 @@ public class ScoreVerifyController extends BaseExamController {
     @ResponseBody
     public ScoreVerifyInfo info(HttpServletRequest request, @RequestParam Integer studentId) {
         ExamStudent student = studentService.findById(studentId);
+        WebUser wu = RequestUtils.getWebUser(request);
         ScoreVerifyInfo info = new ScoreVerifyInfo();
         if (student != null) {
-            Task task = taskService.build(student);
+            Task task = taskService.build(student, wu.getUser());
             info.setTask(task);
             info.setFlagged(student.getScoreVerifyFlagged());
             int examId = getSessionExamId(request);
             ExamSubject examSubject = subjectService.find(examId, student.getSubjectCode());
             examSubject.setPaperAnswerUrl(fileService);
             info.setPaperUrl(examSubject.getPaperUrl() == null ? "" : examSubject.getPaperUrl());
-            WebUser wu = RequestUtils.getWebUser(request);
             scoreVerifyService.view(examId, wu.getId(), studentId);
         }
         return info;
@@ -243,10 +243,10 @@ public class ScoreVerifyController extends BaseExamController {
     @ResponseBody
     public Object tag(HttpServletRequest request, @RequestParam Integer studentId, @RequestParam boolean isTag) {
         ExamStudent student = studentService.findById(studentId);
+        WebUser wu = RequestUtils.getWebUser(request);
         JSONObject obj = new JSONObject();
         if (student != null) {
             int examId = getSessionExamId(request);
-            WebUser wu = RequestUtils.getWebUser(request);
             scoreVerifyService.tag(examId, wu.getId(), studentId, isTag);
             obj.accumulate("success", true);
         } else {

+ 19 - 34
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectRangeController.java

@@ -2,7 +2,11 @@ package cn.com.qmth.stmms.admin.report;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.util.*;
+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 javax.servlet.http.HttpServletResponse;
@@ -26,14 +30,17 @@ import cn.com.qmth.stmms.admin.thread.ScoreReportObjectiveThread;
 import cn.com.qmth.stmms.admin.thread.ScoreReportThread;
 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.service.*;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 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.report.model.ReportSubject;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
-import cn.com.qmth.stmms.biz.report.service.*;
+import cn.com.qmth.stmms.biz.report.service.ReportService;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectRangeService;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
@@ -63,9 +70,6 @@ public class ReportSubjectRangeController extends BaseExamController {
     @Autowired
     private ExamSubjectService subjectService;
 
-    @Autowired
-    private ExamQuestionService questionService;
-
     @Autowired
     private LockService lockService;
 
@@ -73,12 +77,6 @@ public class ReportSubjectRangeController extends BaseExamController {
     @Autowired
     private AsyncTaskExecutor taskExecutor;
 
-    @Autowired
-    private ExamStudentService studentService;
-
-    @Autowired
-    private MarkGroupService groupService;
-
     @Autowired
     private ExamService examService;
 
@@ -88,21 +86,6 @@ public class ReportSubjectRangeController extends BaseExamController {
     @Autowired
     private FileService fileService;
 
-    @Autowired
-    private ReportSubjectQuestionService reportSubjectQuestionService;
-
-    @Autowired
-    private ReportSubjectClassService reportSubjectClassService;
-
-    @Autowired
-    private ReportSubjectTeacherService reportSubjectTeacherService;
-
-    @Autowired
-    private ReportSubjectCollegeService reportSubjectCollegeService;
-
-    @Autowired
-    private ReportSubjectGroupService reportSubjectGroupService;
-
     @Autowired
     private ReportSubjectRangeService reportSubjectRangeService;
 
@@ -113,7 +96,7 @@ public class ReportSubjectRangeController extends BaseExamController {
         int examId = getSessionExamId(request);
         List<ExamSubject> sList = getExamSubject(examId, wu);
         if (StringUtils.isNotBlank(query.getSubjectCode()) && query.getRange() != null) {
-            if (query.getObjective()!=null && query.getObjective()) {
+            if (query.getObjective() != null && query.getObjective()) {
                 ReportSubjectRange subjectRange = reportSubjectRangeService.findOne(examId, query.getSubjectCode());
                 if (subjectRange != null && subjectRange.getObjectiveScoreRange() != null
                         && subjectRange.getObjectiveScore() != null && subjectRange.getRealityCount() != null) {
@@ -130,9 +113,10 @@ public class ReportSubjectRangeController extends BaseExamController {
             }
             model.addAttribute("locked",
                     lockService.isLocked(LockType.SCORE_CALCULATE, examId, query.getSubjectCode()));
-            model.addAttribute("showObjective",subjectService.find(examId,query.getSubjectCode()).getObjectiveScore()>0);
-        }else if(!sList.isEmpty()){
-            model.addAttribute("showObjective",sList.get(0).getObjectiveScore()>0);
+            model.addAttribute("showObjective",
+                    subjectService.find(examId, query.getSubjectCode()).getObjectiveScore() > 0);
+        } else if (!sList.isEmpty()) {
+            model.addAttribute("showObjective", sList.get(0).getObjectiveScore() > 0);
         }
         model.addAttribute("oldSubjectCode", query.getSubjectCode());
         model.addAttribute("subjectList", sList);
@@ -193,7 +177,7 @@ public class ReportSubjectRangeController extends BaseExamController {
             byte[] group = fileService.downloadReport(examId, subjectName, "分组统计分析", FormatType.XLSX);
             writer.write(new ByteArrayInputStream(group), subjectName, "分组统计分析.xlsx");
         }
-        if(fileService.reportExist(examId, subjectName, "课程客观题分段统计", FormatType.XLSX)){
+        if (fileService.reportExist(examId, subjectName, "课程客观题分段统计", FormatType.XLSX)) {
             byte[] objectiveRange = fileService.downloadReport(examId, subjectName, "课程客观题分段统计", FormatType.XLSX);
             writer.write(new ByteArrayInputStream(objectiveRange), subjectName, "课程客观题分段统计.xlsx");
             byte[] objective = fileService.downloadReport(examId, subjectName, "客观题分析", FormatType.XLSX);
@@ -214,10 +198,11 @@ public class ReportSubjectRangeController extends BaseExamController {
         if (!subjectSet.isEmpty()) {
             Map<Integer, Set<String>> map = new HashMap<Integer, Set<String>>();
             map.put(examId, subjectSet);
-            if (objective!=null && objective) {
+            if (objective != null && objective) {
                 ScoreReportObjectiveThread thread = new ScoreReportObjectiveThread(map, reportService, false);
                 taskExecutor.submit(thread);
-                return "redirect:/admin/exam/reportSubjectRange?subjectCode=" + subjectCode + "&range=" + 10 +"&objective="+objective;
+                return "redirect:/admin/exam/reportSubjectRange?subjectCode=" + subjectCode + "&range=" + 10
+                        + "&objective=" + objective;
             } else {
                 ScoreReportThread thread = new ScoreReportThread(map, reportService, false);
                 taskExecutor.submit(thread);

+ 6 - 6
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ScoreCheckThread.java

@@ -80,7 +80,7 @@ public class ScoreCheckThread implements Runnable {
 
     private void checkQuestionScore(List<ExamQuestion> questionList, List<ScoreItem> scoreList) {
         for (int i = 0; i < questionList.size(); i++) {
-            ExamQuestion question = questionList.get(i);
+            // ExamQuestion question = questionList.get(i);
 
             // double score = 0;
             // try {
@@ -106,11 +106,11 @@ public class ScoreCheckThread implements Runnable {
                 list = new LinkedList<ExamQuestion>();
             }
             // 从数据库读取后,首先将人数清零
-            for (ExamQuestion q : list) {
-                // q.setTotalCount(0);
-                // q.setZeroCount(0);
-                // q.setFullCount(0);
-            }
+            // for (ExamQuestion q : list) {
+            // q.setTotalCount(0);
+            // q.setZeroCount(0);
+            // q.setFullCount(0);
+            // }
             if (isObjective) {
                 objectiveMap.put(subjectCode, list);
             } else {

+ 6 - 9
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamController.java

@@ -4,9 +4,6 @@ import java.util.Arrays;
 
 import javax.servlet.http.HttpServletRequest;
 
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -21,7 +18,6 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import cn.com.qmth.stmms.api.exception.ApiException;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.AnswerCardService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.school.model.School;
 import cn.com.qmth.stmms.biz.school.service.SchoolService;
@@ -31,6 +27,8 @@ import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
 
 @Controller("scanExamController")
 @RequestMapping("/api/exam")
@@ -44,12 +42,10 @@ public class ExamController extends BaseApiController {
     @Autowired
     private SchoolService schoolService;
 
-    @Autowired
-    private AnswerCardService answerCardService;
-
     private Exam validateExam(ApiUser au, Integer examId, ExamType... types) {
         Exam exam = examService.findById(examId);
-        if (exam == null || !validateSchool(au.getSchoolId(), exam.getSchoolId()) || exam.getStatus() != ExamStatus.START) {
+        if (exam == null || !validateSchool(au.getSchoolId(), exam.getSchoolId())
+                || exam.getStatus() != ExamStatus.START) {
             throw ApiException.EXAM_NOT_ACCESSIBLED;
         }
         if (types != null && types.length > 0 && !Arrays.asList(types).contains(exam.getType())) {
@@ -88,7 +84,8 @@ public class ExamController extends BaseApiController {
     @RequestMapping(value = "/config/save", method = RequestMethod.POST)
     @RoleRequire({ Role.SCHOOL_ADMIN })
     @ResponseBody
-    public JSONObject configSave(HttpServletRequest request, @RequestParam Integer examId, @RequestParam String config) {
+    public JSONObject configSave(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String config) {
         ApiUser au = RequestUtils.getApiUser(request);
         Exam exam = validateExam(au, examId, ExamType.SCAN_IMAGE);
         exam.setScanConfig(StringEscapeUtils.unescapeHtml(config));

+ 40 - 26
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamStudentController.java

@@ -1,14 +1,44 @@
 package cn.com.qmth.stmms.api.controller;
 
-import cn.com.qmth.stmms.api.dto.MenualAbsentDTO;
+import java.io.IOException;
+import java.text.DecimalFormat;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.io.IOUtils;
+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.PathVariable;
+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.multipart.MultipartFile;
+
+import com.google.common.base.Strings;
+
 import cn.com.qmth.stmms.api.exception.ApiException;
 import cn.com.qmth.stmms.api.utils.AESUtil;
-import cn.com.qmth.stmms.biz.exam.model.*;
+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.InspectHistory;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.*;
+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.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.InspectHistoryService;
 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.TrialLibrary;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
@@ -17,32 +47,15 @@ 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.ApiUser;
-import cn.com.qmth.stmms.common.enums.*;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.LogType;
+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 com.google.common.base.Strings;
-
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 
-import org.apache.commons.io.IOUtils;
-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.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.http.HttpServletRequest;
-
-import java.io.IOException;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.stream.Collectors;
-
 @Controller("examStudentApiController")
 @RequestMapping("/api")
 public class ExamStudentController extends BaseApiController {
@@ -548,6 +561,7 @@ public class ExamStudentController extends BaseApiController {
             lineList = IOUtils.readLines(file.getInputStream(), "UTF-8");
             if (lineList != null && lineList.size() > 0) {
                 List<ExamStudent> studentList = new BatchGetDataUtil<ExamStudent, String>() {
+
                     @Override
                     protected List<ExamStudent> getData(List<String> dataList) {
                         List<ExamStudent> list = studentService.findByExamIdAndExamNumberIn(examId, dataList);

+ 172 - 12
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateList.jsp

@@ -5,10 +5,86 @@
     <title>仲裁管理</title>
     <meta name="decorator" content="default"/>
     <%@include file="/WEB-INF/views/include/head.jsp" %>
+
     <style type="text/css">.sort {
         color: #0663A2;
         cursor: pointer;
-    }</style>
+    }
+
+    .rejectWindow {
+        width: 500px;
+        min-height: 200px;
+        background: #fff;
+
+        padding-bottom: 30px;
+        font-family: "微软雅黑", Fixedsys;
+        border: #5d6d7d solid 1px;
+        position: absolute;
+        left: 50%;
+        top: 50%;
+        margin: -150px 0 0 -200px;
+        text-align: center;
+        z-index: 9999;
+    }
+
+    .rejectWindow .form-horizontal .control-label {
+        width: 100px;
+    }
+
+    .rejectWindow .form-horizontal .controls {
+        margin-left: 120px;
+    }
+
+    .task-header, .password-header {
+        width: 100%;
+        height: 46px;
+        background: #5d6d7d;
+        color: #fff;
+        margin-bottom: 30px;
+    }
+
+    .task-content, .password-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-count, .password-value {
+        width: 50px;
+    }
+
+    .btn-info {
+        height: 25px;
+        margin-left: 320px;
+        margin-bottom: 20px;
+    }
+
+    .wrong, .passwordWrong {
+        font-size: 12px;
+        color: #f00;
+        line-height: 30px;
+        padding-left: 20px;
+    }
+    </style>
 </head>
 <body>
 <ul class="nav nav-tabs">
@@ -73,6 +149,8 @@
         <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
 
         <c:if test="${query.totalCount>0}">
+            &nbsp;
+            <input id="btnBack" class="btn" type="button" value="打回" onclick="goBack()"/>
             &nbsp;
             <a href="##" class="btn" id="batch-process-link" target="_blank">批量处理</a>
         </c:if>
@@ -82,7 +160,7 @@
 <table id="contentTable" class="table table-striped table-bordered table-condensed">
     <thead>
     <tr>
-        <th>科目代码</th>
+        <th><input type="checkbox" id="ids">科目代码</th>
         <th>分组序号</th>
         <th>准考证号</th>
         <th>状态</th>
@@ -95,7 +173,12 @@
     <tbody>
     <c:forEach items="${query.result}" var="result">
         <tr>
-            <td>${result.subjectCode}</td>
+            <td>
+                <c:if test="${(result.status.value==0 || result.status.value==1) && (result.totalScore!= -1)}">
+                    <input type="checkbox" class="ids" name="ids" value="${result.id}">
+                </c:if>
+                    ${result.subjectCode}
+            </td>
             <td>${result.groupNumber}</td>
             <td>
                 <c:if test="${(web_user.subjectHeader==true||web_user.schoolViewer==true) && forbiddenInfo==true}">
@@ -127,29 +210,106 @@
             </td>
             <td>
                 <c:if test="${(result.status.value==0 || result.status.value==1) && (result.totalScore!= -1)}">
+                    <a href="##" data-id="${result.id}" class="back-link">打回</a>
+                    &nbsp;
                     <a href="${ctx}/web/admin/exam/arbitrate/start?historyId=${result.id}" target="_blank"
-                       class="process-link">处理</a>
+                                           class="process-link">处理</a>
                 </c:if>
             </td>
         </tr>
     </c:forEach>
     </tbody>
 </table>
+<div class="rejectWindow" style="display:none">
+    <div class="task-header">
+        <p class="title">打回</p>
+        <p class="image-close"><img src="${ctxStatic}/mark-new/images/images-close.png"/></p></div>
+    <input id="rejectId" type="hidden"/>
+    <form class="form-horizontal">
+        <div class="control-group">
+            <label class="control-label"><span
+                    style="color:red;font-size:16px;margin-right:3px">*</span>打回原因</label>
+            <div class="controls">
+                <select id="rejectReasonSelect" name="rejectReasonSelect">
+                    <option value='给分较高'>给分较高</option>
+                    <option value='给分较低'>给分较低</option>
+                    <option value='判分错误'>判分错误</option>
+                    <option value='其它'>其它</option>
+                </select>
+            </div>
+        </div>
+        <div class="control-group">
+            <label class="control-label">详情描述</label>
+            <div class="controls">
+                <textarea rows="3" id="rejectReasonInput" maxlength="60"></textarea>
+            </div>
+        </div>
+        <div style="text-align:center;">
+            <c:if test="${fnx:hasPrivilegeCode(role_privilege_codes, 'exam_mark-library-reject')}">
+                <a class="btn btn-primary task-btn">打回</a>
+            </c:if>
+            &nbsp;
+            <a class="btn task-cancel">取消</a>
+        </div>
+    </form>
+</div>
 <div class="pagination">${query}</div>
 <script type="text/javascript">
+    var check_list;
+    function goBack() {
+        check_list = [];
+        $("input[name='ids']:checked").each(function () {
+            check_list.push($(this).val())
+        })
+        if (check_list.length == 0) {
+            alert('请选择');
+            return false;
+        }
+        $('#rejectReasonInput').attr("value", "");
+        $('.rejectWindow').show();
+        return false;
+    }
+
     $('.back-link').click(function () {
-        if (!confirm('确定要打回该仲裁记录的所有评卷任务吗?')) {
-            return;
+        $('#rejectReasonInput').attr("value", "");
+        check_list = [];
+        check_list.push($(this).attr('data-id'))
+        $('.rejectWindow').show();
+    });
+    $('.image-close').click(function () {
+        $('.rejectWindow').hide();
+    });
+    $('.task-cancel').click(function () {
+        $('.rejectWindow').hide();
+    });
+    $('.task-btn').click(function () {
+        var rejectReason = $("#rejectReasonSelect").val();
+        var rejectReasonInput = $('#rejectReasonInput').val();
+
+        if (rejectReason == "" || rejectReason == undefined) {
+            alert("请选择打回原因");
+            return false;
         }
-        $.post('${ctx}/admin/exam/arbitrate/back', {id: $(this).attr('data-id')}, function (result) {
-            if (result.success == true) {
-                alert('打回成功');
-                $("#searchForm").submit();
-            } else {
-                alert(result.message);
+        if (rejectReasonInput != "" && rejectReasonInput != null) {
+            rejectReason = rejectReason + ":" + rejectReasonInput;
+        }
+        $.ajax({
+            url: "${ctx}/admin/exam/arbitrate/back",
+            data: {ids: check_list, reason: rejectReason},
+            traditional: true,
+            type: "post",
+            success: function (result) {
+                if (result.success == true) {
+                    alert('打回成功');
+                    $("#searchForm").submit();
+                } else {
+                    alert(result.message);
+                }
+                $('.rejectWindow').hide();
             }
         });
     });
+
     $('#batch-process-link').click(function () {
         var subjectCode = $('#subject-select').val();
         var groupNumber = $('#group-select').val();

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

@@ -5,10 +5,6 @@
     <title>评卷任务</title>
     <meta name="decorator" content="default"/>
     <%@include file="/WEB-INF/views/include/head.jsp" %>
-    <style type="text/css">.sort {
-        color: #0663A2;
-        cursor: pointer;
-    }</style>
     <style type="text/css">.sort {
         color: #0663A2;
         cursor: pointer;

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

@@ -56,6 +56,7 @@
 				<th>大题号</th>
 				<th>小题号</th>
 				<th>满分</th>
+				<th>给分次数</th>
 				<th>间隔分</th>
 				<th>答案</th>
 				<th>判分策略</th>
@@ -75,6 +76,8 @@
 				<td>${question.mainNumber}</td>
 				<td>${question.subNumber}</td>
 				<td><fmt:formatNumber pattern="###.###" value="${question.totalScore}"/></td>
+				<td><c:if test="${!question.objective && question.trackCount!=0}">${question.trackCount}</c:if>
+				</td>
 				<td><fmt:formatNumber pattern="###.###" value="${question.intervalScore}"/></td>
 				<td>${question.answer}</td>
 				<td>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/questionEdit.jsp

@@ -93,7 +93,7 @@
 		<div class="control-group">
 			<label class="control-label">给分次数</label>
 			<div class="controls">
-				<input name="trackCount" value="${examQuestion.trackCount }" type="number" htmlEscape="false"  maxlength="10" class="required"/>
+				<input <c:if test="${!examQuestion.objective && !enableUpdate}">disabled</c:if> name="trackCount" value="${examQuestion.trackCount }" type="number" htmlEscape="false"  maxlength="10" class="required"/>
 			</div>
 		</div>
 		<div class="control-group">