Parcourir la source

Merge branch 'dev_1.3.14' of http://git.qmth.com.cn/luoshi/stmms-ft into dev_1.3.14

huangjianxiong il y a 1 an
Parent
commit
14ef913fd7
34 fichiers modifiés avec 293 ajouts et 146 suppressions
  1. 3 3
      install/mysql/upgrade/1.3.14.sql
  2. 2 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/basic/service/impl/PrivilegeServiceImpl.java
  3. 23 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/config/service/impl/SystemCache.java
  4. 14 14
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  5. 4 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ScoreVerifyServiceImpl.java
  6. 8 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/TrialLibraryDao.java
  7. 1 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkCronService.java
  8. 17 30
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  9. 8 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportServiceImpl.java
  10. 3 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/school/service/impl/SchoolServiceImpl.java
  11. 5 7
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/OriginTag.java
  12. 1 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/PictureConfigTransform.java
  13. 3 5
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/PictureTag.java
  14. 1 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/config/SystemAuthController.java
  15. 24 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java
  16. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java
  17. 16 6
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  18. 48 24
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java
  19. 42 4
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScanController.java
  20. 0 7
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreVerifyController.java
  21. 3 2
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectRangeController.java
  22. 13 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/school/SchoolController.java
  23. 4 2
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java
  24. 5 0
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  25. 2 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examExport.jsp
  26. 6 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditFull.jsp
  27. 3 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/markInfo.jsp
  28. 1 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/paperList.jsp
  29. 12 9
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/rejectHistory.jsp
  30. 12 8
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/rejectList.jsp
  31. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scanInfo.jsp
  32. 1 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/sys/authInfo.jsp
  33. 4 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/sys/schoolEdit.jsp
  34. 2 2
      stmms-web/src/main/webapp/sql/upgrade/1.3.14.sql

+ 3 - 3
install/mysql/upgrade/1.3.14.sql

@@ -9,7 +9,7 @@ ALTER TABLE eb_exam_student ADD COLUMN `score_verify_flagged`	tinyint(1) DEFAULT
 UPDATE eb_exam_student set inspected=1,subjective_status='MARKED' where subjective_status='INSPECTED';
 
 ALTER TABLE eb_exam_subject ADD COLUMN `inspect_round` 	int(11) NOT NULL DEFAULT 1 COMMENT '复核轮数';
-ALTER TABLE eb_inspect_history ADD COLUMN `inspect_round` 	int(11) NOT NULL COMMENT '复核轮数';
+ALTER TABLE eb_inspect_history ADD COLUMN `inspect_round` 	int(11) NOT NULL DEFAULT 1 COMMENT '复核轮数';
 ALTER TABLE eb_exam_subject ADD COLUMN `selective` 	tinyint(1) NOT NULL DEFAULT 0 COMMENT '选做题科目';
 
 ALTER TABLE b_school ADD COLUMN `double_track`  tinyint(1)  NOT NULL DEFAULT 0 COMMENT '双评轨迹';
@@ -322,7 +322,7 @@ where p.`code` in('exam_mark','exam_mark-mark','exam_mark-group','exam_mark-mark
 ,'exam_reject_list-paper','exam_reject_list-history','exam_problem_history','exam_problem_history-reset'
 ,'exam_problem_history-batch_reset'
 ,'exam_inspected_info','exam_inspected_info-info','exam_inspected_info-list','exam_inspected_info-next_round'
-,'exam_score','exam_report_subject','exam_report_subject_range');
+,'exam_score','exam_score-export','exam_report_subject','exam_report_subject_range');
 
 INSERT INTO b_role_privilege (`school_id`, `role_code`, `privilege_code`,`enable`)
 SELECT s.id,'COLLEGE_ADMIN',p.`code`,1 from b_privilege p join b_school s   
@@ -331,7 +331,7 @@ where p.`code` in('exam_mark','exam_mark-mark','exam_mark-group','exam_mark-mark
 ,'exam_reject_list-paper','exam_reject_list-history','exam_problem_history','exam_problem_history-reset'
 ,'exam_problem_history-batch_reset'
 ,'exam_inspected_info','exam_inspected_info-info','exam_inspected_info-list','exam_inspected_info-next_round'
-,'exam_score','exam_report_subject','exam_report_subject_range');
+,'exam_score','exam_score-export','exam_report_subject','exam_report_subject_range');
 
 INSERT INTO b_role_privilege (`school_id`, `role_code`, `privilege_code`,`enable`)
 SELECT s.id,'INSPECTOR',p.`code`,1 from b_privilege p join b_school s   

+ 2 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/basic/service/impl/PrivilegeServiceImpl.java

@@ -88,7 +88,7 @@ public class PrivilegeServiceImpl extends BaseQueryService<Privilege> implements
 		sql.append(" ,'exam_reject_list-paper','exam_reject_list-history','exam_problem_history','exam_problem_history-reset'");
 		sql.append(" ,'exam_problem_history-batch_reset'");
 		sql.append(" ,'exam_inspected_info','exam_inspected_info-info','exam_inspected_info-list','exam_inspected_info-next_round'");
-		sql.append(" ,'exam_score','exam_report_subject','exam_report_subject_range')");
+		sql.append(" ,'exam_score','exam_score-export','exam_report_subject','exam_report_subject_range')");
 		sql.append(" and s.id="+schoolId);
 		Query query = entityManager.createNativeQuery(sql.toString());
 		query.executeUpdate();
@@ -102,7 +102,7 @@ public class PrivilegeServiceImpl extends BaseQueryService<Privilege> implements
 		sql.append(" ,'exam_reject_list-paper','exam_reject_list-history','exam_problem_history','exam_problem_history-reset'");
 		sql.append(" ,'exam_problem_history-batch_reset'");
 		sql.append(" ,'exam_inspected_info','exam_inspected_info-info','exam_inspected_info-list','exam_inspected_info-next_round'");
-		sql.append(" ,'exam_score','exam_report_subject','exam_report_subject_range')");
+		sql.append(" ,'exam_score','exam_score-export','exam_report_subject','exam_report_subject_range')");
 		sql.append(" and s.id="+schoolId);
 		Query query = entityManager.createNativeQuery(sql.toString());
 		query.executeUpdate();

+ 23 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/config/service/impl/SystemCache.java

@@ -39,6 +39,8 @@ public class SystemCache {
 
     private boolean doubleTrack;
 
+    private boolean groupDeleteWarn;
+
     private Long expireTime;
 
     private String fileServer;
@@ -61,6 +63,7 @@ public class SystemCache {
             if (httpUtil.getAPP()) {
                 Auth = true;
                 doubleTrack = true;
+                groupDeleteWarn = false;
             }
         } else if (s != null && SystemAuthType.OFFLINE.equals(s.getType())) {
             JSONObject json = AppLicenseUtil.parseLicense(ByteArray.fromBase64(s.getDescription()).value());
@@ -68,6 +71,7 @@ public class SystemCache {
         } else {
             Auth = false;
             doubleTrack = false;
+            groupDeleteWarn = false;
         }
         fileServer = configService.findByType(ConfigType.FILE_SERVER);
         markTime = Long.parseLong(configService.findByType(ConfigType.MARK_TIME));
@@ -113,6 +117,14 @@ public class SystemCache {
         this.doubleTrack = doubleTrack;
     }
 
+    public boolean isGroupDeleteWarn() {
+        return groupDeleteWarn;
+    }
+
+    public void setGroupDeleteWarn(boolean groupDeleteWarn) {
+        this.groupDeleteWarn = groupDeleteWarn;
+    }
+
     public void parseJson(JSONObject json) {
         if (json != null) {
             Auth = true;
@@ -137,9 +149,20 @@ public class SystemCache {
                     e.printStackTrace();
                 }
             }
+            this.groupDeleteWarn = false;
+            if (json.has("control") && json.getJSONObject("control").has("custom")
+                    && json.getJSONObject("control").getJSONObject("custom").has("enable_group_delete_warn")) {
+                try {
+                    this.groupDeleteWarn = json.getJSONObject("control").getJSONObject("custom")
+                            .getBoolean("enable_group_delete_warn");
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
         } else {
             Auth = false;
             doubleTrack = false;
+            groupDeleteWarn = false;
             expireTime = null;
         }
     }

+ 14 - 14
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java

@@ -987,6 +987,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         tag.setSize(30);
         tag.setTop(40);
         tag.setContent(lines);
+        tag.setUserRole("");
         return tag;
     }
 
@@ -1024,17 +1025,17 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             List<MarkConfigItem> configList = group.getPictureConfigList();
             if (configList.isEmpty()) {
                 // 未设置评卷区域,则自动取第一张裁切图的固定位置
-                originTags.add(new OriginTag(0, null, group.getNumber(), format.format(score), 1, 10, 10));
+                originTags.add(new OriginTag(0, "", group.getNumber(), format.format(score), 1, 10, 10));
             } else {
                 // 取第一个显示区域相对裁切图的位置
                 MarkConfigItem config = configList.get(0);
-                OriginTag tag = new OriginTag(0, null, group.getNumber(), format.format(score), config.getI(),
+                OriginTag tag = new OriginTag(0, "", group.getNumber(), format.format(score), config.getI(),
                         config.getX(), config.getY());
                 // 兼容比例模式,且元素在裁切坐标内
                 if (config.getX() <= 1 && config.getY() <= 1 && config.getI() <= sliceConfig.size()
                         && sliceConfig.get(config.getI() - 1).getW() > 0
                         && sliceConfig.get(config.getI() - 1).getH() > 0) {
-                    tag = new OriginTag(0, null, group.getNumber(), format.format(score), config.getI(), config.getX()
+                    tag = new OriginTag(0, "", group.getNumber(), format.format(score), config.getI(), config.getX()
                             * sliceConfig.get(config.getI() - 1).getW(), config.getY()
                             * sliceConfig.get(config.getI() - 1).getH());
                 }
@@ -1078,14 +1079,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             List<MarkTrack> tracks = trackService.findByLibraryId(library.getId());
             for (MarkTrack markTrack : tracks) {
                 // 未作答时只显示汉字"空"
-                originTags.add(new OriginTag(library.getMarkerId(), Role.MARKER, library.getGroupNumber(), markTrack
-                        .isUnanswered() ? "空" : format.format(markTrack.getScore()), markTrack.getOffsetIndex(),
-                        markTrack.getOffsetX(), markTrack.getOffsetY()));
+                originTags.add(new OriginTag(library.getMarkerId(), Role.MARKER.toString(), library.getGroupNumber(),
+                        markTrack.isUnanswered() ? "空" : format.format(markTrack.getScore()), markTrack
+                                .getOffsetIndex(), markTrack.getOffsetX(), markTrack.getOffsetY()));
             }
             // 添加特殊标记
             List<MarkSpecialTag> specialTags = specialTagService.findByLibraryId(library.getId());
             for (MarkSpecialTag markSpecialTag : specialTags) {
-                originTags.add(new OriginTag(library.getMarkerId(), Role.MARKER, library.getGroupNumber(),
+                originTags.add(new OriginTag(library.getMarkerId(), Role.MARKER.toString(), library.getGroupNumber(),
                         markSpecialTag.getTagName(), markSpecialTag.getOffsetIndex(), markSpecialTag.getOffsetX(),
                         markSpecialTag.getOffsetY()));
             }
@@ -1094,17 +1095,16 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         List<HeaderTag> headerTags = headerTagDao.findByStudentIdAndGroupNumberOrderByIdAsc(student.getId(),
                 group.getNumber());
         for (HeaderTag headerTag : headerTags) {
-            originTags
-                    .add(new OriginTag(headerTag.getUserId(), Role.SUBJECT_HEADER, headerTag.getGroupNumber(),
-                            headerTag.getTagName(), headerTag.getOffsetIndex(), headerTag.getOffsetX(), headerTag
-                                    .getOffsetY()));
+            originTags.add(new OriginTag(headerTag.getUserId(), Role.SUBJECT_HEADER.toString(), headerTag
+                    .getGroupNumber(), headerTag.getTagName(), headerTag.getOffsetIndex(), headerTag.getOffsetX(),
+                    headerTag.getOffsetY()));
         }
         List<HeaderTrack> headerTracks = headerTrackDao.findByPkStudentIdAndGroupNumber(student.getId(),
                 group.getNumber());
         for (HeaderTrack headerTrack : headerTracks) {
-            originTags.add(new OriginTag(headerTrack.getUserId(), Role.SUBJECT_HEADER, headerTrack.getGroupNumber(),
-                    headerTrack.isUnanswered() ? "空" : format.format(headerTrack.getScore()), headerTrack
-                            .getOffsetIndex(), headerTrack.getOffsetX(), headerTrack.getOffsetY()));
+            originTags.add(new OriginTag(headerTrack.getUserId(), Role.SUBJECT_HEADER.toString(), headerTrack
+                    .getGroupNumber(), headerTrack.isUnanswered() ? "空" : format.format(headerTrack.getScore()),
+                    headerTrack.getOffsetIndex(), headerTrack.getOffsetX(), headerTrack.getOffsetY()));
         }
         return originTags;
     }

+ 4 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ScoreVerifyServiceImpl.java

@@ -32,7 +32,7 @@ import cn.com.qmth.stmms.biz.utils.Calculator;
 
 @Service
 public class ScoreVerifyServiceImpl extends BaseQueryService<ScoreVerify> implements ScoreVerifyService {
-
+    public static final String UN_SELECTIVE_SCORE = "-1";
 	@PersistenceContext
 	private EntityManager entityManager;
 
@@ -71,6 +71,9 @@ public class ScoreVerifyServiceImpl extends BaseQueryService<ScoreVerify> implem
 		if (ret != null && !ret.isEmpty()) {
 			for (ScoreVerifyVo vo : ret) {
 				buildSheetUrl(vo);
+				if (vo.getSubjectiveScoreList() != null) {
+					vo.setSubjectiveScoreList(vo.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
+	            }
 			}
 		}
 		return ret;

+ 8 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/TrialLibraryDao.java

@@ -72,4 +72,12 @@ public interface TrialLibraryDao extends JpaRepository<TrialLibrary, Integer>, J
             + "where m.id=?1")
     void resetById(Integer id);
 
+    @Query("select f from TrialLibrary f where f.markerId=?1")
+    List<TrialLibrary> findByMarkerId(Integer markerId);
+
+    @Modifying(clearAutomatically = true)
+    @Query("update TrialLibrary m set m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null "
+            + " where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3")
+    void resetByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer number);
+
 }

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkCronService.java

@@ -204,7 +204,7 @@ public class MarkCronService {
                         subject.getCode(), MarkStatus.TRIAL);
                 long trialCount = studentService.countByExamIdAndSubjectCodeAndTrial(examId, subject.getCode(), true);
                 if (!groups.isEmpty() && trialCount < subject.getTrialCount()) {
-                    while (trialCount < subject.getTrialCount()) {
+                    while (trialCount < subject.getTrialCount() && trialCount < subject.getUploadCount()) {
                         // 取一个的考生
                         ExamStudent student = studentService.randomStudent(examId, subject.getCode());
                         if (student == null) {

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

@@ -501,33 +501,7 @@ public class MarkServiceImpl implements MarkService {
         }
         if (group.getStatus() == MarkStatus.FORMAL) {
             // 仲裁和等待仲裁的任务不被重置
-            // trackDao.deleteByMarkerId(marker.getId(),
-            // LibraryStatus.ARBITRATED, LibraryStatus.WAIT_ARBITRATE,
-            // LibraryStatus.PROBLEM);
-            // specialTagDao.deleteByMarkerId(marker.getId(),
-            // LibraryStatus.ARBITRATED, LibraryStatus.WAIT_ARBITRATE,
-            // LibraryStatus.PROBLEM);
-            // libraryDao.resetByMarkerId(marker.getId(), LibraryStatus.WAITING,
-            // LibraryStatus.ARBITRATED,
-            // LibraryStatus.WAIT_ARBITRATE, LibraryStatus.PROBLEM);
-            // 原遍历模式改为SQL批量更新模式,提高执行速度
-            // groupStudentDao.updateStatusByMarkLibraryStatus(marker.getExamId(),
-            // marker.getSubjectCode(),
-            // marker.getGroupNumber(), SubjectiveStatus.UNMARK,
-            // LibraryStatus.WAITING);
-            // scoreDao.deleteByStudentGroupStatus(marker.getExamId(),
-            // marker.getSubjectCode(), marker.getGroupNumber(),
-            // SubjectiveStatus.UNMARK);
-            // studentService.resetSubjectiveStatusByGroupStatus(marker.getExamId(),
-            // marker.getSubjectCode());
             // 只选取评卷完成状态的记录重新检查
-            // List<Integer> studentIdList =
-            // groupStudentDao.findStudentIdByGroupNumberAndStatus(marker.getExamId(),
-            // marker.getSubjectCode(), marker.getGroupNumber(),
-            // SubjectiveStatus.MARKED);
-            // for (Integer studentId : studentIdList) {
-            // checkStudentGroup(studentId, group);
-            // }
             // 遍历相关评卷任务的模式
             List<MarkLibrary> list = libraryDao.findByMarkerIdAndStatusNotIn(marker.getId(), LibraryStatus.ARBITRATED,
                     LibraryStatus.WAIT_ARBITRATE, LibraryStatus.PROBLEM);
@@ -545,6 +519,15 @@ public class MarkServiceImpl implements MarkService {
             }
             markerDao.resetById(marker.getId());
         } else if (group.getStatus() == MarkStatus.TRIAL) {
+            List<TrialLibrary> list = trialLibraryDao.findByMarkerId(marker.getId());
+            for (TrialLibrary library : list) {
+                lockService.waitlock(LockType.STUDENT, library.getStudentId());
+                updateStudentGroupStatus(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
+                        library.getGroupNumber(), SubjectiveStatus.UNMARK);
+                studentService.updateSubjectiveStatusAndScore(library.getStudentId(), SubjectiveStatus.UNMARK, 0, null);
+                inspectedService.cancelByStudent(library.getStudentId());
+                lockService.unlock(LockType.STUDENT, library.getStudentId());
+            }
             trialTagDao.deleteByMarkerId(marker.getId());
             trialTrackDao.deleteByMarkerId(marker.getId());
             trialLibraryDao.resetByMarkerId(marker.getId());
@@ -739,7 +722,9 @@ public class MarkServiceImpl implements MarkService {
         // 保存阅卷轨迹
         int unansweredCount = 0;
         if (result.getTrackList() != null && !result.isUnselective()) {
-            trackDao.deleteByLibraryId(library.getId());
+            // trackDao.deleteByLibraryId(library.getId());
+            List<MarkTrack> oldTracks = trackDao.findByPkLibraryId(library.getId());
+            trackDao.delete(oldTracks);
             List<MarkTrack> tracks = result.getTrackList(library, marker);
             for (MarkTrack markTrack : tracks) {
                 trackDao.saveAndFlush(markTrack);
@@ -1363,14 +1348,16 @@ public class MarkServiceImpl implements MarkService {
                     group.getNumber(), LibraryStatus.WAITING);
             libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(group.getExamId(),
                     group.getSubjectCode(), group.getNumber(), 3);
-            markerDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
-                    group.getNumber());
-            resetStudentGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
         } else if (group.getStatus() == MarkStatus.TRIAL) {
             trialTrackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
                     group.getNumber());
             trialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            trialLibraryDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                    group.getNumber());
         }
+        markerDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
+        resetStudentGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
         updateLibraryCount(group);
         groupDao.resetCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
         releaseByGroup(group);

+ 8 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportServiceImpl.java

@@ -185,6 +185,9 @@ public class ReportServiceImpl implements ReportService {
             // ", exam is null or status error");
             return;
         }
+        if (!lockService.trylock(LockType.SCORE_CALCULATE, examId)) {
+            return;
+        }
         if (subjectCodeSet == null) {
             subjectCodeSet = new HashSet<String>();
             List<ExamSubject> list = subjectService.list(exam.getId());
@@ -196,7 +199,6 @@ public class ReportServiceImpl implements ReportService {
         }
         log.info("start report for examId=" + examId + ", subjectCode count=" + subjectCodeSet.size());
 
-        lockService.trylock(LockType.SCORE_CALCULATE, examId);
         for (String subjectCode : subjectCodeSet) {
             // 尝试上锁,失败直接跳过
             if (!lockService.trylock(LockType.SCORE_CALCULATE, examId, subjectCode)) {
@@ -235,8 +237,10 @@ public class ReportServiceImpl implements ReportService {
     }
 
     private void statistic(ExamStudent student) {
-        if (SubjectiveStatus.MARKED.equals(student.getSubjectiveStatus())) {
-            student.setSubject(findExamSubject(student.getExamId(), student.getSubjectCode()));
+        ExamSubject subject = findExamSubject(student.getExamId(), student.getSubjectCode());
+        if (SubjectiveStatus.MARKED.equals(student.getSubjectiveStatus())
+                || (subject.getSubjectiveScore().doubleValue() == 0 && subject.getObjectiveScore() > 0)) {
+            student.setSubject(subject);
             student.setObjectiveQuestionList(findQuestionList(student.getExamId(), student.getSubjectCode(),
                     student.getPaperType(), true));
             student.setSubjectiveQuestionList(findQuestionList(student.getExamId(), student.getSubjectCode(),
@@ -451,7 +455,7 @@ public class ReportServiceImpl implements ReportService {
     private int getSumCount(JSONObject jsonObject, int start, int end) {
         int sumCount = 0;
         int currentCount = 0;
-        if (start <= end) {
+        if (start < end) {
             for (int i = start; i < end; i++) {
                 currentCount = jsonObject.getInt(String.valueOf(i));
                 sumCount = sumCount + currentCount;

+ 3 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/school/service/impl/SchoolServiceImpl.java

@@ -39,7 +39,7 @@ public class SchoolServiceImpl extends BaseQueryService<School> implements Schoo
 
     @Autowired
     private SystemAuthService authService;
-    
+
     @Autowired
     private PrivilegeService privilegeService;
 
@@ -134,7 +134,7 @@ public class SchoolServiceImpl extends BaseQueryService<School> implements Schoo
     @Override
     public void updateOrg(List<School> list) {
         for (School s : list) {
-        	boolean isCreate = false;
+            boolean isCreate = false;
             School school = schoolDao.findByCode(s.getCode());
             if (school == null) {
                 school = schoolDao.findFirstByAccessKey(s.getAccessKey());
@@ -147,7 +147,7 @@ public class SchoolServiceImpl extends BaseQueryService<School> implements Schoo
                 school.setCity("");
                 school.setCode(s.getCode());
                 school.setEnable(true);
-                school.setGroupDeleteCheck(false);
+                school.setGroupDeleteCheck(true);
                 school.setDoubleTrack(false);
                 isCreate = true;
             }

+ 5 - 7
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/OriginTag.java

@@ -1,14 +1,12 @@
 package cn.com.qmth.stmms.biz.utils;
 
-import cn.com.qmth.stmms.common.enums.Role;
-
 public class OriginTag {
 
     private Integer userId;
 
     private Integer groupNumber;
 
-    private Role userRole;
+    private String userRole;
 
     private String content;
 
@@ -22,10 +20,10 @@ public class OriginTag {
 
     }
 
-    public OriginTag(Integer userId, Role userRole, Integer groupNumber, String content, int offsetIndex,
+    public OriginTag(Integer userId, String userRole, Integer groupNumber, String content, int offsetIndex,
             double offsetX, double offsetY) {
         this.userId = userId;
-        this.userRole = userRole;
+        this.userRole = userRole == null ? "" : userRole;
         this.groupNumber = groupNumber;
         this.content = content;
         this.offsetIndex = offsetIndex;
@@ -81,11 +79,11 @@ public class OriginTag {
         this.groupNumber = groupNumber;
     }
 
-    public Role getUserRole() {
+    public String getUserRole() {
         return userRole;
     }
 
-    public void setUserRole(Role userRole) {
+    public void setUserRole(String userRole) {
         this.userRole = userRole;
     }
 

+ 1 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/PictureConfigTransform.java

@@ -2,7 +2,6 @@ package cn.com.qmth.stmms.biz.utils;
 
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.common.enums.Role;
 
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -64,7 +63,7 @@ public class PictureConfigTransform {
      *            - 在原图内的上偏移
      */
     private static void buildTag(Map<Integer, List<PictureTag>> tags, String content, int index, double left,
-            double top, int userId, Role userRole, int groupNumber) {
+            double top, int userId, String userRole, int groupNumber) {
         PictureTag tag = new PictureTag();
         tag.setContent(content);
         tag.setLeft(left);

+ 3 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/PictureTag.java

@@ -2,13 +2,11 @@ package cn.com.qmth.stmms.biz.utils;
 
 import java.util.List;
 
-import cn.com.qmth.stmms.common.enums.Role;
-
 public class PictureTag {
 
     private int userId;
 
-    private Role userRole;
+    private String userRole;
 
     private int groupNumber;
 
@@ -74,11 +72,11 @@ public class PictureTag {
         this.groupNumber = groupNumber;
     }
 
-    public Role getUserRole() {
+    public String getUserRole() {
         return userRole;
     }
 
-    public void setUserRole(Role userRole) {
+    public void setUserRole(String userRole) {
         this.userRole = userRole;
     }
 

+ 1 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/config/SystemAuthController.java

@@ -65,6 +65,7 @@ public class SystemAuthController extends BaseController {
         view.addObject("typeList", SystemAuthType.values());
         view.addObject("auth", authCache.isAuth());
         view.addObject("doubleTrack", authCache.isDoubleTrack());
+        view.addObject("groupDeleteWarn", authCache.isGroupDeleteWarn());
         view.addObject("expireTime", authCache.getExpireTime() == null ? null : new Date(authCache.getExpireTime()));
         return view;
     }

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

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.admin.exam;
 
 import java.text.DecimalFormat;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
@@ -512,6 +513,19 @@ public class InspectedController extends BaseExamController {
         }
         return "redirect:/admin/exam/inspected/list";
     }
+    
+    private void subjectCodeQuery(ExamSubjectSearchQuery query,List<String> subjectCodeIn) {
+    	if(StringUtils.isEmpty(query.getCodeIn())) {
+    		query.setCodeIn(StringUtils.join(subjectCodeIn, ","));
+    	}else {
+    		Set<String> set=new HashSet<>();
+    		for(String c:query.getCodeIn().split(",")) {
+    			set.add(c);
+    		}
+    		set.addAll(subjectCodeIn);
+    		query.setCodeIn(StringUtils.join(set, ","));
+    	}
+    }
 
     @Logging(menu = "成绩复核进度查询", type = LogType.QUERY)
     @RequestMapping(value = "/info")
@@ -529,14 +543,21 @@ public class InspectedController extends BaseExamController {
                 query.setCodeIn(subjectCodeIn);
             }
         }
-        if (wu.isSubjectHeader()) {
-            String subjectCodeIn = StringUtils.join(wu.getSubjectCodeSet(), ",");
-            query.setCodeIn(subjectCodeIn);
+//        if (wu.isSubjectHeader()) {
+//            String subjectCodeIn = StringUtils.join(wu.getSubjectCodeSet(), ",");
+//            query.setCodeIn(subjectCodeIn);
+//        }
+        List<ExamSubject> subjectList = getExamSubject(examId, wu);
+        if (StringUtils.isBlank(query.getCode()) && wu.getRole() != Role.SCHOOL_ADMIN) {
+            List<String> subjectCodeIn = new ArrayList<String>();
+            subjectList.forEach(e -> subjectCodeIn.add(e.getCode()));
+            subjectCodeQuery(query, subjectCodeIn);
         }
         query = subjectService.findByQuery(query);
         if (unFinishSet.isEmpty() && query.getFinished() != null && !query.getFinished()) {
             query.setResult(new ArrayList<ExamSubject>());
         }
+        
         List<InspectedSubjectVO> list = new LinkedList<InspectedSubjectVO>();
         for (ExamSubject subject : query.getResult()) {
             InspectedSubjectVO vo = new InspectedSubjectVO();

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

@@ -244,7 +244,7 @@ public class MarkController extends BaseExamController {
                 }
                 try {
                     lockService.waitlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
-                    if (group.getStatus() == MarkStatus.FORMAL && group.getLeftCount() == 0 && group.getLibraryCount() != 0) {
+                    if (group.getStatus() == MarkStatus.FORMAL && group.getLeftCount() == 0) {
                         groupService
                                 .updateStatus(examId, code, group.getNumber(), MarkStatus.FINISH, group.getStatus());
                     }

+ 16 - 6
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java

@@ -32,6 +32,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 import cn.com.qmth.stmms.admin.thread.MarkGroupDeleteThread;
+import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
 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;
@@ -123,6 +124,9 @@ public class MarkGroupController extends BaseExamController {
     @Value("${mark.group.delete}")
     private String markDeleteCode;
 
+    @Autowired
+    private SystemCache systemCache;
+
     @Logging(menu = "大题管理查询", type = LogType.QUERY)
     @RequestMapping
     public String list(HttpServletRequest request, Model model, @RequestParam(required = false) String subjectCode) {
@@ -270,7 +274,7 @@ public class MarkGroupController extends BaseExamController {
         if (markGroup.getStatus() == MarkStatus.TRIAL && status == MarkStatus.FORMAL) {
             allow = true;
         } else if (markGroup.getStatus() == MarkStatus.FORMAL && status == MarkStatus.FINISH
-                && markGroup.getLeftCount() == 0 && markGroup.getLibraryCount() != 0) {
+                && markGroup.getLeftCount() == 0) {
             allow = true;
         } else if (markGroup.getStatus() == MarkStatus.FINISH && status == MarkStatus.FORMAL) {
             allow = true;
@@ -398,6 +402,11 @@ public class MarkGroupController extends BaseExamController {
             }
             int percent = group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group
                     .getLibraryCount()) : 0;
+            if (group.getMarkedCount() > 0 && percent == 0) {
+                percent = 1;
+            } else if (group.getLeftCount() > 0 && percent == 100) {
+                percent = 99;
+            }
             group.setPercent(percent);
             model.addAttribute("group", group);
             model.addAttribute("questionList", questions);
@@ -409,7 +418,7 @@ public class MarkGroupController extends BaseExamController {
             model.addAttribute("exam", examService.findById(examId));
             Exam exam = examService.findById(examId);
             School school = schoolService.findById(exam.getSchoolId());
-            model.addAttribute("deleteCheck", school.isGroupDeleteCheck());
+            model.addAttribute("deleteCheck", systemCache.isGroupDeleteWarn() ? true : school.isGroupDeleteCheck());
             return "modules/exam/groupEditFull";
         } else {
             redirectAttributes.addAttribute("subjectCode", subjectCode);
@@ -431,8 +440,8 @@ public class MarkGroupController extends BaseExamController {
         }
         Exam exam = examService.findById(examId);
         School school = schoolService.findById(exam.getSchoolId());
-        if (school.isGroupDeleteCheck() && group.getLibraryCount() != 0 && group.getLeftCount() == 0
-                && !markDeleteCode.equals(deleteCode)) {
+        boolean warn = systemCache.isGroupDeleteWarn() ? true : school.isGroupDeleteCheck();
+        if (warn && group.getLibraryCount() != 0 && group.getLeftCount() == 0 && !markDeleteCode.equals(deleteCode)) {
             addMessage(redirectAttributes, "删除分组授权码不正确");
             redirectAttributes.addAttribute("subjectCode", subjectCode);
             return "redirect:/admin/exam/group";
@@ -488,7 +497,8 @@ public class MarkGroupController extends BaseExamController {
                 if (questionIds != null && reset.booleanValue()) {
                     // advance update
                     School school = schoolService.findById(exam.getSchoolId());
-                    if (school.isGroupDeleteCheck() && group.getLibraryCount() != 0 && group.getLeftCount() == 0
+                    boolean warn = systemCache.isGroupDeleteWarn() ? true : school.isGroupDeleteCheck();
+                    if (warn && group.getLibraryCount() != 0 && group.getLeftCount() == 0
                             && !markDeleteCode.equals(deleteCode)) {
                         addMessage(redirectAttributes, "分组授权码不正确");
                         redirectAttributes.addAttribute("subjectCode", subjectCode);
@@ -774,7 +784,7 @@ public class MarkGroupController extends BaseExamController {
             }
             try {
                 lockService.waitlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
-                if (group.getStatus() == MarkStatus.FORMAL && group.getLeftCount() == 0 && group.getLibraryCount() != 0) {
+                if (group.getStatus() == MarkStatus.FORMAL && group.getLeftCount() == 0) {
                     groupService.updateStatus(examId, subjectCode, number, MarkStatus.FINISH, group.getStatus());
                 }
             } finally {

+ 48 - 24
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java

@@ -1,22 +1,63 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+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;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.task.AsyncTaskExecutor;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+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 org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
 import cn.com.qmth.stmms.admin.thread.MarkerResetThread;
 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.query.MarkerSearchQuery;
-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.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerClassService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 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.MarkService;
+import cn.com.qmth.stmms.biz.mark.service.TrialService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.user.service.query.UserSearchQuery;
 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.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.enums.MarkerExcelError;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.UserSource;
 import cn.com.qmth.stmms.common.utils.EncryptUtils;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
@@ -24,27 +65,6 @@ import cn.com.qmth.stmms.common.utils.RequestUtils;
 
 import com.google.common.collect.Lists;
 
-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;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.core.task.AsyncTaskExecutor;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import java.util.*;
-
 @Controller("examMarkerController")
 @RequestMapping("/admin/exam/marker")
 public class MarkerController extends BaseExamController {
@@ -86,6 +106,9 @@ public class MarkerController extends BaseExamController {
     @Autowired
     private MarkLibraryService libraryService;
 
+    @Autowired
+    private TrialService trialService;
+
     @Qualifier("task-executor")
     @Autowired
     private AsyncTaskExecutor taskExecutor;
@@ -527,9 +550,10 @@ public class MarkerController extends BaseExamController {
             return "redirect:/admin/exam/marker";
         }
         long count = libraryService.countByMarker(markerId);
+        long trialCount = trialService.countByMarkerId(markerId);
         String subjectCode = marker.getSubjectCode();
         Integer groupNumber = marker.getGroupNumber();
-        if (count > 0) {
+        if (count > 0 || trialCount > 0) {
             addMessage(redirectAttributes, "删除评卷员失败,该评卷员已开始评卷");
         } else {
             markerService.deleteById(markerId);

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

@@ -34,6 +34,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Controller("scanInfoController")
 @RequestMapping("/admin/exam/scan")
@@ -197,8 +198,9 @@ public class ScanController extends BaseExamController {
     public ModelAndView examSite(HttpServletRequest request, ExamStudentSearchQuery query) {
         int examId = getSessionExamId(request);
         List<ScanInfoVO> list = new LinkedList<ScanInfoVO>();
+        List<String> result = studentService.findDistinctExamSite(examId);
+        result = result.stream().filter(s -> StringUtils.isNotBlank(s)).collect(Collectors.toList());
         if (StringUtils.isBlank(query.getExamSite())) {
-            List<String> result = studentService.findDistinctExamSite(examId);
             List<?> examSiteList = PageUtil.startPage(result, query.getPageNumber(), query.getPageSize());
             for (Object e : examSiteList) {
                 ScanInfoVO vo = new ScanInfoVO();
@@ -215,8 +217,8 @@ public class ScanController extends BaseExamController {
         } else {
             ScanInfoVO vo = new ScanInfoVO();
             vo.setName(query.getExamSite());
-            vo.setTotalCount(studentService.countByExamIdAndExamSite(examId, query.getCampusName()));
-            vo.setScanCount(studentService.countByExamIdAndExamSite(examId, query.getCampusName(), true));
+            vo.setTotalCount(studentService.countByExamIdAndExamSite(examId, query.getExamSite()));
+            vo.setScanCount(studentService.countByExamIdAndExamSite(examId, query.getExamSite(), true));
             vo.setScanSheetCount(studentService.countSheetCountByExamIdAndExamSite(examId, query.getExamSite()) / 2);
             list.add(vo);
 
@@ -226,10 +228,46 @@ public class ScanController extends BaseExamController {
         }
 
         ModelAndView view = new ModelAndView("modules/exam/scanInfo");
-        view.addObject("examSiteList", studentService.findDistinctExamSite(examId));
+        view.addObject("examSiteList", result);
         view.addObject("infoList", list);
         view.addObject("query", query);
         view.addObject("type", "examSite");
         return view;
     }
+
+    @Logging(menu = "扫描进度导出", type = LogType.EXPORT)
+    @RequestMapping(value = "/examSite/export", method = RequestMethod.POST)
+    public String examSiteExport(ExamStudentSearchQuery query, HttpServletRequest request,
+            HttpServletResponse response, RedirectAttributes redirectAttributes) {
+        int examId = getSessionExamId(request);
+        List<ScanInfoVO> list = new LinkedList<ScanInfoVO>();
+        List<String> result = studentService.findDistinctExamSite(examId);
+        result = result.stream().filter(s -> StringUtils.isNotBlank(s)).collect(Collectors.toList());
+        if (StringUtils.isBlank(query.getExamSite())) {
+            for (String examSite : result) {
+                ScanInfoVO vo = new ScanInfoVO();
+                vo.setName(examSite);
+                vo.setTotalCount(studentService.countByExamIdAndExamSite(examId, examSite));
+                vo.setScanCount(studentService.countByExamIdAndExamSite(examId, examSite, true));
+                vo.setScanSheetCount(studentService.countSheetCountByExamIdAndExamSite(examId, examSite) / 2);
+                list.add(vo);
+            }
+        } else {
+            ScanInfoVO vo = new ScanInfoVO();
+            vo.setName(query.getExamSite());
+            vo.setTotalCount(studentService.countByExamIdAndExamSite(examId, query.getExamSite()));
+            vo.setScanCount(studentService.countByExamIdAndExamSite(examId, query.getExamSite(), true));
+            vo.setScanSheetCount(studentService.countSheetCountByExamIdAndExamSite(examId, query.getExamSite()) / 2);
+            list.add(vo);
+        }
+        try {
+            String fileName = "扫描进度.xlsx";
+            new ExportExcel("扫描进度", ScanInfoVO.class).setDataList(list).write(response, fileName).dispose();
+            return null;
+        } catch (Exception e) {
+            e.printStackTrace();
+            addMessage(redirectAttributes, "导出扫描进度失败!" + e.getMessage());
+            return "redirect:/admin/exam/scan/examSite";
+        }
+    }
 }

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

@@ -47,8 +47,6 @@ public class ScoreVerifyController extends BaseExamController {
 
     protected static Logger log = LoggerFactory.getLogger(ScoreVerifyController.class);
 
-    public static final String UN_SELECTIVE_SCORE = "-1";
-
     @Autowired
     private ExamStudentService studentService;
 
@@ -161,11 +159,6 @@ public class ScoreVerifyController extends BaseExamController {
         Integer totalCount = scoreVerifyService.countByQuery(query.getExamId(), query.getUserId());
         if (totalCount > 0) {
             List<ScoreVerifyVo> list = scoreVerifyService.findByQuery(query);
-            for (ScoreVerifyVo e : list) {
-                if (e.getSubjectiveScoreList() != null) {
-                    e.setSubjectiveScoreList(e.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
-                }
-            }
             Integer needVerifyCount = scoreVerifyService.needVerifyCount(query.getExamId(), query.getUserId());
             query.setResult(list);
             query.setTotalCount(totalCount);

+ 3 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectRangeController.java

@@ -150,9 +150,10 @@ public class ReportSubjectRangeController extends BaseExamController {
             ZipWriter writer = ZipWriter.create(response.getOutputStream());
             if (all) {
                 Exam exam = examService.findById(examId);
+                WebUser wu = RequestUtils.getWebUser(request);
                 response.setHeader("Content-Disposition",
                         "attachment; filename=" + Encodes.urlEncode(exam.getName() + ".zip"));
-                List<ExamSubject> list = subjectService.list(examId);
+                List<ExamSubject> list = getExamSubject(examId, wu);
                 for (ExamSubject subject : list) {
                     String subjectName = subject.getCode() + "-" + subject.getName();
                     addFileToZip(examId, writer, subjectName);
@@ -242,7 +243,7 @@ public class ReportSubjectRangeController extends BaseExamController {
     private int getSumCount(JSONObject jsonObject, int start, int end) {
         int sumCount = 0;
         int currentCount = 0;
-        if (start <= end) {
+        if (start < end) {
             for (int i = start; i < end; i++) {
                 currentCount = jsonObject.getInt(String.valueOf(i));
                 sumCount = sumCount + currentCount;

+ 13 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/admin/school/SchoolController.java

@@ -73,7 +73,11 @@ public class SchoolController extends BaseController {
     @RequestMapping(value = "/add", method = RequestMethod.GET)
     public ModelAndView addInit(HttpServletRequest request) {
         ModelAndView view = new ModelAndView("modules/sys/schoolEdit");
-        view.addObject("school", new School());
+        view.addObject("doubleTrack", authCache.isDoubleTrack());
+        view.addObject("groupDeleteWarn", authCache.isGroupDeleteWarn());
+        School school = new School();
+        school.setGroupDeleteCheck(true);
+        view.addObject("school", school);
         return view;
     }
 
@@ -83,6 +87,8 @@ public class SchoolController extends BaseController {
         if (school != null) {
             ModelAndView view = new ModelAndView("modules/sys/schoolEdit");
             view.addObject("school", school);
+            view.addObject("doubleTrack", authCache.isDoubleTrack());
+            view.addObject("groupDeleteWarn", authCache.isGroupDeleteWarn());
             return view;
         } else {
             return new ModelAndView("redirect:/admin/sys/school");
@@ -103,12 +109,16 @@ public class SchoolController extends BaseController {
             school = schoolService.save(school);
             return "redirect:/admin/sys/school/admin?id=" + school.getId();
         } else {
-            previous.setDoubleTrack(school.isDoubleTrack());
+            if (authCache.isDoubleTrack()) {
+                previous.setDoubleTrack(school.isDoubleTrack());
+            }
             previous.setName(school.getName());
             previous.setProvince(school.getProvince());
             previous.setCity(school.getCity());
             previous.setAddress(school.getAddress());
-            previous.setGroupDeleteCheck(school.isGroupDeleteCheck());
+            if (!authCache.isGroupDeleteWarn()) {
+                previous.setGroupDeleteCheck(school.isGroupDeleteCheck());
+            }
             previous.setDescription(school.getDescription());
             if (StringUtils.isBlank(previous.getAccessKey()) || StringUtils.isBlank(previous.getAccessSecret())) {
                 previous.resetAccessKeyAndSecret();

+ 4 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java

@@ -161,6 +161,7 @@ public class UserController extends BaseExamController {
             @RequestParam(required = false) Boolean queryEnable,
             @RequestParam(required = false) MultipartFile studentFile) {
         User current = RequestUtils.getWebUser(request).getUser();
+        int examId = getSessionExamId(request);
         User previous = null;
         if (user.getId() != null) {
             previous = userService.findById(user.getId());
@@ -184,7 +185,6 @@ public class UserController extends BaseExamController {
                     subjectUserService.updateByUserId(user.getId(), getSubjectCodeSet(subjectCodeString));
                 }
                 if (user.getRole() == Role.COLLEGE_ADMIN) {
-                    int examId = getSessionExamId(request);
                     subjectUserService.updateByUserId(user.getId(),
                             getSubjectCodeSetByCollege(examId, user.getDescription()));
                     userService.save(user);
@@ -231,14 +231,16 @@ public class UserController extends BaseExamController {
             String message = validate(previous, subjectCodeString, examIdString);
             if (message == null) {
                 if (previous.getRole() == Role.SUBJECT_HEADER || user.getRole() == Role.INSPECTOR) {
+                    previous.refreshAccessToken();
                     subjectUserService.updateByUserId(previous.getId(), getSubjectCodeSet(subjectCodeString));
                 }
                 if (user.getRole() == Role.SCHOOL_VIEWER) {
+                    previous.refreshAccessToken();
                     userExamService.updateByUserId(user.getId(), getExamIdSet(examIdString));
                     subjectUserService.updateByUserId(previous.getId(), getSubjectCodeSet(subjectCodeString));
                 }
                 if (user.getRole() == Role.COLLEGE_ADMIN) {
-                    int examId = getSessionExamId(request);
+                    previous.refreshAccessToken();
                     subjectUserService.updateByUserId(user.getId(),
                             getSubjectCodeSetByCollege(examId, user.getDescription()));
                 }

+ 5 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -238,6 +238,11 @@ public class MarkController extends BaseController {
                 item.accumulate("groupNumber", group.getNumber());
                 int percent = group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group
                         .getLibraryCount()) : 0;
+                if (group.getMarkedCount() > 0 && percent == 0) {
+                    percent = 1;
+                } else if (group.getLeftCount() > 0 && percent == 100) {
+                    percent = 99;
+                }
                 item.accumulate("percent", percent);
                 array.add(item);
             }

+ 2 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examExport.jsp

@@ -25,14 +25,14 @@
 </head>
 
 <body>
-  <div id="accept-report">
+  <div id="accept-report" style="padding:40px 60px;">
     <div class="report-head">
       <img src="${ctxStatic}/exam-report/imgs/logo.png"  />
       <div class="company-name">
         <span>武汉启明泰和软件服务有限公司</span>
       </div>
     </div>
-    <div class="report-title bold">项目验收报告</div>
+    <div class="report-title bold"   ondblclick="getPdf()">项目验收报告</div>
     <div class="out-box">
       <img class="bg-img" src="${ctxStatic}/exam-report/imgs/logo.png" />
       <div class="in-box">

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

@@ -396,8 +396,10 @@
         }
     	var deleteCheck = '${deleteCheck}';
     	if(deleteCheck=='false'){
+    		deleteDivHide();
     		$("#inputForm").attr("action","${ctx}/admin/exam/group/update");
     		$("#inputForm").submit();
+    		return;
     	}
     	var subjectCode = '${group.subjectCode}';
     	var groupNumber = '${group.number}';
@@ -405,6 +407,7 @@
     	dialogObj = createDialog();
         dialogObj.initDialog({ progress: progress, subjectCode: subjectCode, groupNumber: groupNumber }, function (initParams,deleteCode) { 
 	        //这个回调方法里写进度小余10%的业务分支
+	        deleteDivHide();
         	if(deleteCode!=null && deleteCode!=''){
         		$("#inputForm").attr("action","${ctx}/admin/exam/group/update?deleteCode="+deleteCode);
         		$("#inputForm").submit();
@@ -418,8 +421,10 @@
     $('.delete-button').click(function () {
     	var deleteCheck = '${deleteCheck}';
     	if(deleteCheck=='false'){
+    		deleteDivHide();
     		$("#inputForm").attr("action","${ctx}/admin/exam/group/delete");
     		$("#inputForm").submit();
+    		return;
     	}
     	var subjectCode = '${group.subjectCode}';
     	var groupNumber = '${group.number}';
@@ -427,6 +432,7 @@
     	dialogObj = createDialog();
         dialogObj.initDialog({ progress: progress, subjectCode: subjectCode, groupNumber: groupNumber }, function (initParams,deleteCode) { 
 	        //这个回调方法里写进度小余10%的业务分支
+			deleteDivHide();	        
         	if(deleteCode!=null && deleteCode!=''){
         		$("#inputForm").attr("action","${ctx}/admin/exam/group/delete?deleteCode="+deleteCode);
         		$("#inputForm").submit();

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

@@ -134,6 +134,7 @@ function goExportMarker(){
 	$("#searchForm").submit();
 	return false;
 }
+if(document.getElementById('main')!=undefined){
 var markedCount =${markedCount};
 var unMarkedCount =${unMarkedCount};
 var finishCount =${finishCount};
@@ -200,6 +201,8 @@ myChart.setOption({
         color:["#7CB5EC",'#FE8463']
     }]
 })
+}
+
 	$("#codes").change(function () {
         if ($("#codes").is(':checked')) {
             $(".codes").attr("checked", true);

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

@@ -273,6 +273,7 @@
     		  yAxis: {
     			name: '科目数量',
     		    type: 'value',
+    		    minInterval:1,
     		  },
     		  series: [
     		    {	

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

@@ -118,6 +118,12 @@
             $('#group-select').empty();
             if (code == '') {
                 $('#group-select').val('').trigger('change');
+                $('#marker-select').empty();
+                $('#marker-select').append('<option value="0">不限</option>');
+                $('#marker-select').val('0').trigger('change');
+                $('#rejecter-select').empty();
+                $('#rejecter-select').append('<option value="0">不限</option>');
+                $('#rejecter-select').val('0').trigger('change');
                 return;
             }
 
@@ -138,35 +144,32 @@
             $('#marker-select').empty();
             $('#marker-select').append('<option value="0">不限</option>');
             $('#marker-select').val('0').trigger('change');
-            var subjectCode = $('#subject-select').val();
-            $.post('${ctx}/admin/exam/marker/query', {subjectCode: subjectCode}, function (result) {
+            $.post('${ctx}/admin/exam/marker/query', {subjectCode: code}, function (result) {
                 var parent = $('#marker-select');
                 var first = '';
                 for (var i = 0; i < result.length; i++) {
                     var marker = result[i];
                     $('<option value="' + marker.id + '">' + marker.loginName + '</option>').appendTo(parent);
-                    if (i == 0) {
+                    /* if (i == 0) {
                         first = marker.id;
-                    }
+                    } */
                 }
             });
             
             $('#rejecter-select').empty();
             $('#rejecter-select').append('<option value="0">不限</option>');
             $('#rejecter-select').val('0').trigger('change');
-            var subjectCode = $('#subject-select').val();
-            $.post('${ctx}/admin/exam/reject/user/query', {subjectCode: subjectCode}, function (result) {
+            $.post('${ctx}/admin/exam/reject/user/query', {subjectCode: code}, function (result) {
                 var parent = $('#rejecter-select');
                 var first = '';
                 for (var i = 0; i < result.length; i++) {
                     var marker = result[i];
                     $('<option value="' + marker.id + '">' + marker.loginName + '</option>').appendTo(parent);
-                    if (i == 0) {
+                    /* if (i == 0) {
                         first = marker.id;
-                    }
+                    } */
                 }
             });
-            
         });
     });
 

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

@@ -122,6 +122,12 @@
             $('#group-select').empty();
             if (code == '') {
                 $('#group-select').val('').trigger('change');
+                $('#marker-select').empty();
+                $('#marker-select').append('<option value="0">不限</option>');
+                $('#marker-select').val('0').trigger('change');
+                $('#rejecter-select').empty();
+                $('#rejecter-select').append('<option value="0">不限</option>');
+                $('#rejecter-select').val('0').trigger('change');
                 return;
             }
 
@@ -142,32 +148,30 @@
             $('#marker-select').empty();
             $('#marker-select').append('<option value="0">不限</option>');
             $('#marker-select').val('0').trigger('change');
-            var subjectCode = $('#subject-select').val();
-            $.post('${ctx}/admin/exam/marker/query', {subjectCode: subjectCode}, function (result) {
+            $.post('${ctx}/admin/exam/marker/query', {subjectCode: code}, function (result) {
                 var parent = $('#marker-select');
                 var first = '';
                 for (var i = 0; i < result.length; i++) {
                     var marker = result[i];
                     $('<option value="' + marker.id + '">' + marker.loginName + '</option>').appendTo(parent);
-                    if (i == 0) {
+                    /* if (i == 0) {
                         first = marker.id;
-                    }
+                    } */
                 }
             });
             
             $('#rejecter-select').empty();
             $('#rejecter-select').append('<option value="0">不限</option>');
             $('#rejecter-select').val('0').trigger('change');
-            var subjectCode = $('#subject-select').val();
-            $.post('${ctx}/admin/exam/reject/user/query', {subjectCode: subjectCode}, function (result) {
+            $.post('${ctx}/admin/exam/reject/user/query', {subjectCode: code}, function (result) {
                 var parent = $('#rejecter-select');
                 var first = '';
                 for (var i = 0; i < result.length; i++) {
                     var marker = result[i];
                     $('<option value="' + marker.id + '">' + marker.loginName + '</option>').appendTo(parent);
-                    if (i == 0) {
+                    /* if (i == 0) {
                         first = marker.id;
-                    }
+                    } */
                 }
             });
             

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

@@ -59,7 +59,7 @@
 		
 		<c:if test="${type=='examSite'}">
 		<label>考点</label>
-		<select class="input-large" name="examSiteList">
+		<select class="input-large" name="examSite">
 			<option value="">全部</option>
 			<c:forEach items="${examSiteList}" var="examSite">
 			<option value="${examSite}" <c:if test="${examSite==query.examSite}">selected</c:if>>${examSite}</option>

+ 1 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/sys/authInfo.jsp

@@ -31,6 +31,7 @@
 	        <div class="controls">
 	        	${systemAuth.type.name }
 	        	<c:if test="${doubleTrack}">:双评轨迹授权</c:if>
+	        	<c:if test="${groupDeleteWarn}">&nbsp; 开启删除分组警告</c:if>
 	        </div>
 	    </div>
 	</form:form>

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

@@ -54,18 +54,22 @@
             <form:input path="address" htmlEscape="false" maxlength="400"/>
         </div>
     </div>
+    <c:if test="${doubleTrack}">
     <div class="control-group">
         <label class="control-label">开启双评轨迹</label>
         <div class="controls">
             <input name="doubleTrack" type="checkbox" <c:if test="${school.doubleTrack}">checked</c:if>/>
         </div>
     </div>
+    </c:if>
+    <c:if test="${!groupDeleteWarn}">
 	<div class="control-group">
         <label class="control-label">删除分组授权码</label>
         <div class="controls">
             <input name="groupDeleteCheck" type="checkbox" <c:if test="${school.groupDeleteCheck}">checked</c:if>/>
         </div>
     </div>
+    </c:if>
     <div class="control-group">
         <label class="control-label">AccessKey</label>
         <div class="controls">

+ 2 - 2
stmms-web/src/main/webapp/sql/upgrade/1.3.14.sql

@@ -322,7 +322,7 @@ where p.`code` in('exam_mark','exam_mark-mark','exam_mark-group','exam_mark-mark
 ,'exam_reject_list-paper','exam_reject_list-history','exam_problem_history','exam_problem_history-reset'
 ,'exam_problem_history-batch_reset'
 ,'exam_inspected_info','exam_inspected_info-info','exam_inspected_info-list','exam_inspected_info-next_round'
-,'exam_score','exam_report_subject','exam_report_subject_range');
+,'exam_score','exam_score-export','exam_report_subject','exam_report_subject_range');
 
 INSERT INTO b_role_privilege (`school_id`, `role_code`, `privilege_code`,`enable`)
 SELECT s.id,'COLLEGE_ADMIN',p.`code`,1 from b_privilege p join b_school s   
@@ -331,7 +331,7 @@ where p.`code` in('exam_mark','exam_mark-mark','exam_mark-group','exam_mark-mark
 ,'exam_reject_list-paper','exam_reject_list-history','exam_problem_history','exam_problem_history-reset'
 ,'exam_problem_history-batch_reset'
 ,'exam_inspected_info','exam_inspected_info-info','exam_inspected_info-list','exam_inspected_info-next_round'
-,'exam_score','exam_report_subject','exam_report_subject_range');
+,'exam_score','exam_score-export','exam_report_subject','exam_report_subject_range');
 
 INSERT INTO b_role_privilege (`school_id`, `role_code`, `privilege_code`,`enable`)
 SELECT s.id,'INSPECTOR',p.`code`,1 from b_privilege p join b_school s