Procházet zdrojové kódy

新增全局配置验证评卷员修改名称;新增任务复核功能

ting.yin před 4 roky
rodič
revize
846bfffd8d
18 změnil soubory, kde provedl 909 přidání a 57 odebrání
  1. 2 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkerServiceImpl.java
  2. 6 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java
  3. 16 15
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  4. 2 1
      stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/LibraryStatus.java
  5. 13 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java
  6. 215 21
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java
  7. 1 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java
  8. 6 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java
  9. 10 0
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  10. 3 2
      stmms-web/src/main/webapp/WEB-INF/application.properties
  11. 314 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/inspectedLibrary.jsp
  12. 3 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/libraryList.jsp
  13. 9 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/reset.jsp
  14. 1 0
      stmms-web/src/main/webapp/static/i18n/messages.properties
  15. 1 0
      stmms-web/src/main/webapp/static/i18n/messages_en.properties
  16. 1 0
      stmms-web/src/main/webapp/static/i18n/messages_ja.properties
  17. 1 0
      stmms-web/src/main/webapp/static/i18n/messages_zh.properties
  18. 305 0
      stmms-web/src/main/webapp/static/inspected/css/inspectedLibrary.css

+ 2 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkerServiceImpl.java

@@ -75,7 +75,7 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
     @Override
     public List<Marker> getMarkCount(int examId) {
         List<Marker> list = new LinkedList<Marker>();
-        List<Object[]> result = libraryDao.countMarkerAndStatus(examId, LibraryStatus.MARKED);
+        List<Object[]> result = libraryDao.countMarkerAndStatus(examId, LibraryStatus.MARKED, LibraryStatus.INSPECTED);
         if (result != null) {
             for (Object[] array : result) {
                 try {
@@ -93,7 +93,7 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
     public List<Marker> getMarkCount(int examId, Set<String> subjectCodes) {
         List<Marker> list = new LinkedList<Marker>();
         List<Object[]> result = libraryDao.countMarkerAndStatusAndSubjectCodeIn(examId, subjectCodes,
-                LibraryStatus.MARKED);
+                LibraryStatus.MARKED, LibraryStatus.INSPECTED);
         if (result != null) {
             for (Object[] array : result) {
                 try {

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

@@ -30,8 +30,8 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     @Query("select l1 from MarkLibrary l1 where l1.examId=?1 and l1.subjectCode=?2 and l1.groupNumber=?3 and l1.status in (?6) "
             + "and not exists (select l2 from MarkLibrary l2 where l2.studentId=l1.studentId and l2.id!=l1.id and l2.markerId=?4) "
             + "and exists (select mc.id from MarkerClass mc, ExamStudent s where l1.studentId=s.id and mc.userId=?5 and s.className=mc.className)")
-    List<MarkLibrary> findUnMarkedFilterClass(Integer examId, String subjectCode, Integer groupNumber, Integer markerId,
-            Integer userId, Set<LibraryStatus> statusSet, Pageable page);
+    List<MarkLibrary> findUnMarkedFilterClass(Integer examId, String subjectCode, Integer groupNumber,
+            Integer markerId, Integer userId, Set<LibraryStatus> statusSet, Pageable page);
 
     List<MarkLibrary> findByMarkerId(Integer markerId);
 
@@ -53,8 +53,8 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     long countByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber);
 
     @Query("select count(f) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3 and f.taskNumber=?4")
-    long countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(Integer examId, String subjectCode, Integer groupNumber,
-            Integer taskNumber);
+    long countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(Integer examId, String subjectCode,
+            Integer groupNumber, Integer taskNumber);
 
     @Query("select count(f) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3 and f.status in (?4)")
     long countByExamIdAndSubjectCodeAndGroupNumberAndStatus(Integer examId, String subjectCode, Integer groupNumber,
@@ -111,8 +111,8 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.headerId=?3, m.headerScore=?4, m.headerScoreList=?5, m.headerTime=?6, m.status=?7 "
             + " where m.studentId=?1 and m.groupNumber=?2")
-    void updateHeaderResult(Integer studentId, Integer groupNumber, Integer userId, Double totalScore, String scoreList,
-            Date updateTime, LibraryStatus arbitrated);
+    void updateHeaderResult(Integer studentId, Integer groupNumber, Integer userId, Double totalScore,
+            String scoreList, Date updateTime, LibraryStatus arbitrated);
 
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.status=?3 where m.studentId=?1 and m.groupNumber=?2")

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

@@ -146,8 +146,8 @@ public class MarkServiceImpl implements MarkService {
             if (group.getStatus() == MarkStatus.TRIAL) {
                 return trialHistoryDao.countByMarkerId(marker.getId());
             } else {
-                return libraryDao
-                        .countByMarkerAndStatus(marker.getId(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED);
+                return libraryDao.countByMarkerAndStatus(marker.getId(), LibraryStatus.MARKED,
+                        LibraryStatus.ARBITRATED, LibraryStatus.INSPECTED);
             }
         }
         return 0;
@@ -478,7 +478,7 @@ public class MarkServiceImpl implements MarkService {
                 // 状态更新
                 Date now = new Date();
                 if (libraryDao.updateProblemResult(library.getId(), LibraryStatus.PROBLEM, marker.getId(), now,
-                        result.getSpent(), LibraryStatus.WAITING, LibraryStatus.MARKED) != 0) {
+                        result.getSpent(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.INSPECTED) != 0) {
                     saveProblemHistory(result, library);
                     updateMarkedCount(group);
                     releaseLibrary(library, marker);
@@ -567,7 +567,8 @@ public class MarkServiceImpl implements MarkService {
             return false;
         }
         // 非本人的回评任务
-        if ((library.getStatus() == LibraryStatus.MARKED) && !library.getMarkerId().equals(marker.getId())) {
+        if ((library.getStatus() == LibraryStatus.MARKED || library.getStatus() == LibraryStatus.INSPECTED)
+                && !library.getMarkerId().equals(marker.getId())) {
             return false;
         }
         // 是否多评情况下已处理过该考生评卷任务
@@ -642,7 +643,8 @@ public class MarkServiceImpl implements MarkService {
 
     private ArbitrateHistory buildArbitrateHistory(List<MarkLibrary> list, Double arbitrateThreshold, Date now) {
         for (MarkLibrary library : list) {
-            if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.ARBITRATED) {
+            if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.ARBITRATED
+                    && library.getStatus() != LibraryStatus.INSPECTED) {
                 return null;
             }
         }
@@ -703,7 +705,8 @@ public class MarkServiceImpl implements MarkService {
         if (group.getStatus() == MarkStatus.FINISH) {
             return false;
         }
-        if (libraryDao.resetById(library.getId(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.PROBLEM) > 0) {
+        if (libraryDao.resetById(library.getId(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.PROBLEM,
+                LibraryStatus.INSPECTED) > 0) {
             trackDao.deleteByLibraryId(library.getId());
             specialTagDao.deleteByLibraryId(library.getId());
             resetStudentGroup(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
@@ -834,7 +837,8 @@ public class MarkServiceImpl implements MarkService {
             return false;
         }
         for (MarkLibrary library : list) {
-            if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.ARBITRATED) {
+            if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.ARBITRATED
+                    && library.getStatus() != LibraryStatus.INSPECTED) {
                 // 有非完成状态的评卷任务,直接返回
                 return false;
             }
@@ -934,12 +938,9 @@ public class MarkServiceImpl implements MarkService {
     @Transactional
     public void updateMarkedCount(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL || group.getStatus() == MarkStatus.FINISH) {
-            groupDao.updateMarkedCount(
-                    group.getExamId(),
-                    group.getSubjectCode(),
-                    group.getNumber(),
-                    (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(),
-                            group.getSubjectCode(), group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED));
+            groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(), (int) libraryDao
+                    .countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(), group.getSubjectCode(),
+                            group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED, LibraryStatus.INSPECTED));
         } else if (group.getStatus() == MarkStatus.TRIAL) {
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
                     (int) trialLibraryDao.countMarked(group.getExamId(), group.getSubjectCode(), group.getNumber()));
@@ -1148,7 +1149,7 @@ public class MarkServiceImpl implements MarkService {
         double avgSpent = 0;
         for (MarkLibrary library : list) {
             finishCount++;
-            if (library.getStatus() == LibraryStatus.MARKED) {
+            if (library.getStatus() == LibraryStatus.MARKED || library.getStatus() == LibraryStatus.INSPECTED) {
                 validCount++;
             }
             double score = library.getMarkerScore() != null ? library.getMarkerScore() : 0;
@@ -1305,7 +1306,7 @@ public class MarkServiceImpl implements MarkService {
         int count = 0;
         for (MarkLibrary library : list) {
             if (libraryDao.resetById(library.getId(), LibraryStatus.WAITING, LibraryStatus.MARKED,
-                    LibraryStatus.PROBLEM) > 0) {
+                    LibraryStatus.PROBLEM, LibraryStatus.INSPECTED) > 0) {
                 count++;
                 trackDao.deleteByLibraryId(library.getId());
                 specialTagDao.deleteByLibraryId(library.getId());

+ 2 - 1
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/LibraryStatus.java

@@ -9,7 +9,8 @@ public enum LibraryStatus {
     BACKED("已打回", 2), 
     WAIT_ARBITRATE("等待仲裁", 3), 
     ARBITRATED("已仲裁", 4),
-    PROBLEM("问题卷",5);
+    PROBLEM("问题卷",5), 
+    INSPECTED("已复核",6);
 
     private String name;
 

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

@@ -26,6 +26,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
+import cn.com.qmth.stmms.biz.exam.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;
@@ -34,6 +35,7 @@ import cn.com.qmth.stmms.biz.exam.model.SubjectiveScore;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.SubjectiveScoreSearchQuery;
 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.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.SubjectiveScoreService;
@@ -45,6 +47,7 @@ import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 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.ExamType;
 import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
@@ -84,6 +87,9 @@ public class InspectedController extends BaseExamController {
     @Autowired
     private MarkService markService;
 
+    @Autowired
+    private ExamService examService;
+
     // 并发处理互斥锁
     private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
 
@@ -93,6 +99,10 @@ public class InspectedController extends BaseExamController {
             @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
             @RequestParam(required = false) Double mainEndScore, @RequestParam(required = false) Double questionScore) {
         int examId = getSessionExamId(request);
+        Exam exam = examService.findById(examId);
+        if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
+            return "modules/exam/permission";
+        }
         WebUser wu = RequestUtils.getWebUser(request);
         query.setExamId(examId);
         query.setUpload(true);
@@ -137,7 +147,7 @@ public class InspectedController extends BaseExamController {
         return "modules/exam/inspectedList";
     }
 
-    @Logging(menu = "开始复核", type = LogType.QUERY)
+    @Logging(menu = "开始考生复核", type = LogType.QUERY)
     @RequestMapping("/start")
     @ResponseBody
     public ModelAndView start(HttpServletRequest request, RedirectAttributes redirectAttributes,
@@ -186,7 +196,7 @@ public class InspectedController extends BaseExamController {
         return view;
     }
 
-    @Logging(menu = "开始复核", type = LogType.QUERY)
+    @Logging(menu = "开始考生复核", type = LogType.QUERY)
     @RequestMapping("/startById")
     public ModelAndView startById(HttpServletRequest request, RedirectAttributes redirectAttributes,
             @RequestParam Integer studentId) {
@@ -267,7 +277,7 @@ public class InspectedController extends BaseExamController {
         return result;
     }
 
-    @Logging(menu = "评卷复核", type = LogType.UPDATE)
+    @Logging(menu = "考生评卷复核", type = LogType.UPDATE)
     @RequestMapping("/save")
     @ResponseBody
     public Object save(HttpServletRequest request, @RequestParam Integer studentId) {

+ 215 - 21
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java

@@ -1,20 +1,16 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import cn.com.qmth.stmms.biz.exam.model.*;
-import cn.com.qmth.stmms.biz.exam.service.*;
-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.mark.model.MarkLibrary;
-import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
-import cn.com.qmth.stmms.biz.mark.service.MarkService;
-import cn.com.qmth.stmms.biz.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.utils.RequestUtils;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+
+import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 
 import org.apache.commons.lang.StringUtils;
@@ -27,11 +23,43 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
-import javax.servlet.http.HttpServletRequest;
-
-import java.util.ArrayList;
-import java.util.List;
+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.MarkGroup;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+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.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+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.mark.model.MarkLibrary;
+import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
+import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
+import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
+import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
+import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.enums.MarkStatus;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
 
 @Controller("libraryController")
 @RequestMapping("/admin/exam/library")
@@ -69,6 +97,15 @@ public class LibraryController extends BaseExamController {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private MarkTrackService markTrackService;
+
+    @Autowired
+    private MarkSpecialTagService markSpecialTagService;
+
+    // 并发处理互斥锁
+    private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
+
     @Logging(menu = "评卷任务查询", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, MarkLibrarySearchQuery query,
@@ -145,8 +182,9 @@ public class LibraryController extends BaseExamController {
                     lockService.watch(LockType.EXAM_SUBJECT, library.getExamId(), library.getSubjectCode());
                     lockService.watch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
                             library.getGroupNumber());
-                    if ((library.getStatus().equals(LibraryStatus.MARKED) || library.getStatus().equals(
-                            LibraryStatus.PROBLEM))
+                    if ((library.getStatus().equals(LibraryStatus.MARKED)
+                            || library.getStatus().equals(LibraryStatus.PROBLEM) || library.getStatus().equals(
+                            LibraryStatus.INSPECTED))
                             && markService.backLibrary(library, wu.getId())) {
                         obj.accumulate("success", true);
                     } else {
@@ -195,4 +233,160 @@ public class LibraryController extends BaseExamController {
                 fileService.getPaperUri(student.getExamId(), student.getSubjectCode(), FormatType.JSON));
         return "modules/exam/jsonView";
     }
+
+    @Logging(menu = "开始任务复核", type = LogType.QUERY)
+    @RequestMapping("/inspected/start")
+    @ResponseBody
+    public ModelAndView start(HttpServletRequest request, RedirectAttributes redirectAttributes,
+            @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
+        int examId = getSessionExamId(request);
+        MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
+        WebUser wu = RequestUtils.getWebUser(request);
+        releaseByUser(wu.getUser().getId());
+        ModelAndView view = new ModelAndView("modules/exam/inspectedLibrary");
+        if (group == null) {
+            view.addObject("message", "大题不存在或评卷已结束");
+            return view;
+        } else if (group.getStatus() == MarkStatus.FINISH) {
+            view.addObject("message", "评卷已结束");
+            return view;
+        } else if (group.getStatus() == MarkStatus.TRIAL) {
+            view.addObject("message", "试评任务无需复核");
+            return view;
+        } else {
+            List<Integer> ids = new ArrayList<Integer>();
+            MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
+            query.setExamId(examId);
+            query.setSubjectCode(subjectCode);
+            query.setGroupNumber(groupNumber);
+            query.setPageNumber(1);
+            query.setPageSize(1000);
+            query.addStatus(LibraryStatus.MARKED);
+            query = libraryService.findByQuery(query);
+            if (query.getResult() != null && query.getResult().size() > 0) {
+                for (MarkLibrary library : query.getResult()) {
+                    ids.add(library.getId());
+                }
+            }
+            view.addObject("inspectCount", ids.size());
+            view.addObject("fileServer", fileService.getFileServer());
+            view.addObject("ids", StringUtils.join(ids, ","));
+            view.addObject("message", ids.size() > 0 ? "" : "没有待复核的任务");
+            return view;
+        }
+    }
+
+    @RequestMapping("/inspected/info")
+    @ResponseBody
+    public Object info(HttpServletRequest request, @RequestParam Integer libraryId) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        MarkLibrary library = libraryService.findById(libraryId);
+        JSONObject result = new JSONObject();
+        if (setCurrent(library.getId(), wu.getUser().getId())) {
+            ExamStudent student = studentService.findById(library.getStudentId());
+            result.accumulate("id", libraryId);
+            result.accumulate("studentId", library.getSecretNumber());
+            result.accumulate("subjectCode", library.getSubjectCode());
+            result.accumulate("subjectName", student.getSubjectName());
+            Marker marker = markerService.findById(library.getMarkerId());
+            User user = userService.findById(marker.getUserId());
+            result.accumulate("markerName", user.getLoginName());
+            result.accumulate("markerScore", library.getMarkerScore());
+
+            JSONArray array = new JSONArray();
+            List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                    library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
+            List<ScoreItem> scores = library.getScoreList();
+            for (int i = 0; i < questions.size(); i++) {
+                ExamQuestion question = questions.get(i);
+                JSONObject obj = new JSONObject();
+                obj.accumulate("questionNumber", question.getMainTitle() + " " + question.getQuestionNumber());
+                obj.accumulate("score", scores.get(i).getScore());
+                array.add(obj);
+            }
+            result.accumulate("questions", array);
+
+            MarkGroup group = groupService.findOne(student.getExamId(), student.getSubjectCode(),
+                    library.getGroupNumber());
+            List<String> picUrls = fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1,
+                    student.getSliceCount());
+            List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
+            List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
+            result.accumulate("picUrls", picUrls);
+            result.accumulate("pictureConfig", group.getPictureConfigList());
+            result.accumulate("markTracks", markTracks);
+            result.accumulate("markSpecialTagList", markSpecialTagList);
+            result.accumulate("success", true);
+        } else {
+            result.accumulate("success", false);
+        }
+        return result;
+    }
+
+    @Logging(menu = "考生评卷复核", type = LogType.UPDATE)
+    @RequestMapping("/inspected/save")
+    @ResponseBody
+    public Object save(HttpServletRequest request, @RequestParam Integer libraryId) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        MarkLibrary library = libraryService.findById(libraryId);
+        if (libraryId != null && library.getStatus().equals(LibraryStatus.MARKED)) {
+            library.setHeaderId(wu.getUser().getId());
+            library.setHeaderTime(new Date());
+            library.setStatus(LibraryStatus.INSPECTED);
+            libraryService.save(library);
+            releaseTask(libraryId);
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    @RequestMapping("/inspected/clear")
+    @ResponseBody
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
+    public Object clear(HttpServletRequest request, @RequestParam(required = false) Integer libraryId) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        if (libraryId != null) {
+            releaseTask(libraryId);
+        } else {
+            releaseByUser(wu.getUser().getId());
+        }
+        return true;
+    }
+
+    private boolean setCurrent(Integer taskId, Integer userId) {
+        Integer value = currentTaskMap.get(taskId);
+        if (value == null) {
+            synchronized (currentTaskMap) {
+                value = currentTaskMap.get(taskId);
+                if (value == null) {
+                    currentTaskMap.put(taskId, userId);
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+        } else {
+            return false;
+        }
+    }
+
+    private void releaseTask(Integer taskId) {
+        synchronized (currentTaskMap) {
+            currentTaskMap.remove(taskId);
+        }
+    }
+
+    private void releaseByUser(Integer userId) {
+        Set<Integer> taskIds = new HashSet<>();
+        taskIds.addAll(currentTaskMap.keySet());
+        synchronized (currentTaskMap) {
+            for (Integer taskId : taskIds) {
+                Integer value = currentTaskMap.get(taskId);
+                if (value != null && value.equals(userId)) {
+                    currentTaskMap.remove(taskId);
+                }
+            }
+        }
+    }
 }

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

@@ -100,6 +100,7 @@ public class MarkController extends BaseExamController {
             long libraryCount = libraryService.countByQuery(mQuery);
             mQuery.addStatus(LibraryStatus.MARKED);
             mQuery.addStatus(LibraryStatus.ARBITRATED);
+            mQuery.addStatus(LibraryStatus.INSPECTED);
             long markedCount = libraryService.countByQuery(mQuery);
             String percent = libraryCount > 0 ? (new DecimalFormat("####.###").format(markedCount * 100.0
                     / libraryCount) + "%") : "0%";

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

@@ -154,10 +154,11 @@ public class MarkQualityController extends BaseExamController {
         if (group != null) {
             List<MarkerVO> list = new ArrayList<MarkerVO>();
             List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subjectCode, groupNumber);
-            List<Double> scores = libraryService.findScore(examId, subjectCode, groupNumber, LibraryStatus.MARKED);
+            List<Double> scores = libraryService.findScore(examId, subjectCode, groupNumber, LibraryStatus.MARKED,
+                    LibraryStatus.INSPECTED);
             for (Marker marker : markers) {
                 List<Object[]> libraries = libraryService.findScoreCount(examId, subjectCode, groupNumber,
-                        marker.getId(), LibraryStatus.MARKED);
+                        marker.getId(), LibraryStatus.MARKED, LibraryStatus.INSPECTED);
                 Map<Double, Long> scoreCount = new HashMap<Double, Long>();
                 for (Object[] array : libraries) {
                     Double score = (Double) array[0];
@@ -193,10 +194,11 @@ public class MarkQualityController extends BaseExamController {
         List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subjectCode, groupNumber);
         for (Marker marker : markers) {
             List<Object[]> libraries = libraryService.findScoreCount(examId, subjectCode, groupNumber, marker.getId(),
-                    LibraryStatus.MARKED);
+                    LibraryStatus.MARKED, LibraryStatus.INSPECTED);
             MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
             query.setMarkerId(marker.getId());
             query.addStatus(LibraryStatus.MARKED);
+            query.addStatus(LibraryStatus.INSPECTED);
             long totalCount = libraryService.countByQuery(query);
             Map<Double, Double> scorePercent = new HashMap<Double, Double>();
             for (Object[] array : libraries) {
@@ -267,6 +269,7 @@ public class MarkQualityController extends BaseExamController {
             query.setSubjectCode(marker.getSubjectCode());
             query.setMarkerId(marker.getId());
             query.addStatus(LibraryStatus.MARKED);
+            query.addStatus(LibraryStatus.INSPECTED);
             query.setGroupNumber(marker.getGroupNumber());
             query.setMarkerScore(markerScore);
             if (pageNumber != null) {

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

@@ -21,10 +21,13 @@ import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.session.service.SessionService;
 import cn.com.qmth.stmms.common.utils.EncryptUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+
 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;
@@ -39,6 +42,7 @@ import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
 import java.util.*;
 
 @Controller
@@ -92,11 +96,15 @@ public class MarkController extends BaseController {
     @Value("${marker.forceMode}")
     private String forceMarkMode;
 
+    @Value("${marker.name.verify}")
+    private boolean nameVerify;
+
     @RequestMapping(value = "/reset", method = RequestMethod.GET)
     public ModelAndView reset(HttpServletRequest request) {
         User user = RequestUtils.getWebUser(request).getUser();
         ModelAndView modelAndView = new ModelAndView("modules/mark/reset");
         modelAndView.addObject("user", user);
+        modelAndView.addObject("nameVerify", nameVerify);
         return modelAndView;
     }
 
@@ -325,6 +333,7 @@ public class MarkController extends BaseController {
             query.setMarkerId(0);
             query.addStatus(LibraryStatus.MARKED);
             query.addStatus(LibraryStatus.ARBITRATED);
+            query.addStatus(LibraryStatus.INSPECTED);
             markedCount = libraryService.countByQuery(query);
 
             query.clearStatus();
@@ -491,6 +500,7 @@ public class MarkController extends BaseController {
             query.setSubjectCode(marker.getSubjectCode());
             query.setMarkerId(marker.getId());
             query.addStatus(LibraryStatus.MARKED);
+            query.addStatus(LibraryStatus.INSPECTED);
             query.setGroupNumber(marker.getGroupNumber());
             query.setSecretNumber(secretNumber);
             query.setPageNumber(pageNumber);

+ 3 - 2
stmms-web/src/main/webapp/WEB-INF/application.properties

@@ -23,11 +23,12 @@ mark.cleanLockSchedule=0 0 3 * * ?
 ##\u8bc4\u5377\u5458\u63a7\u5236
 marker.showBtnImportAndBtnUpdateImport=false
 marker.forceMode=
+marker.name.verify=true
 ##\u9996\u9875\u53ef\u9009\u7684logo\u6587\u4ef6
 index.logo=
 ##\u4e91\u5e73\u53f0\u5bf9\u63a5\u914d\u7f6e
-qmth.examcloud.host=iepcc-ps.ecs.qmth.com.cn
-qmth.examcloud.port=80
+qmth.examcloud.host=https://iepcc-ps.ecs.qmth.com.cn
+qmth.examcloud.port=443
 qmth.examcloud.rootOrgId=16923
 qmth.examcloud.appId=EPCC
 qmth.examcloud.secretKey=Fu234234CK!fsd9f0

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

@@ -0,0 +1,314 @@
+<%@ page language="java" pageEncoding="utf-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>云阅卷</title>
+    <meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
+    <link rel="stylesheet" href="${ctxStatic}/inspected/css/inspectedLibrary.css"/>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js "></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/answer-check/js/common.js"></script>
+    
+    <link rel="stylesheet" href="${ctxStatic}/iviewer/jquery.iviewer.css"/>
+    <script type="text/javascript" src="${ctxStatic}/iviewer/jquery.iviewer.js"></script>
+    
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery-ui.min.js"></script>
+    <script type="text/javascript" src="${ctxStatic}/mark-new/js/jquery.mousewheel.min.js"></script>
+    
+        <script type="text/javascript" src="${ctxStatic}/utils/image-utils.js"></script>
+
+</head>
+<body id="index">
+<div class="wp">
+    <div id="top" class="top cl">
+        <div class="z">
+            <div>
+                <span class="b">编号:</span><span class="i" id="studentId"></span><span class="pipe">|</span>
+                <span class="b">科目:</span><span class="i" id="subject"></span><span class="pipe">|</span>
+                <span class="b">评卷员:</span><span class="i" id="markerName"></span><span class="pipe">|</span>
+                <span class="b">未复核:</span><span class="i" id="progress"></span><span class="pipe">|</span>
+            </div>
+        </div>
+        <div class="y">
+            <div><span class="user">${web_user.name}</span>
+            <span><a class="close" href="javascript:window.close()">关闭</a></span>
+            </div>
+        </div>
+    </div>
+</div>
+<div class="middle">
+    <div class="middle-bg"></div>
+    <div class="box">
+        <div class="cont cl">
+            <div class="left">
+                <!-- 	          <div class="iviewer_zoom cl"> -->
+                <!-- 	            <div class="iviewer_zoom_in" id="zoom-in-button"></div> -->
+                <!--             	<div class="iviewer_zoom_out" id="zoom-out-button"></div> -->
+                <!--             	<div class="iviewer_zoom_zero" id="zoom-origin-button"></div> -->
+                <!--             	<div class="iviewer_zoom_fit" id="zoom-fit-button"></div> -->
+                <!-- 	          </div> -->
+                <div id="image-holder-track" class="image-content" style="position: relative; "></div>
+            </div>
+            <div class="right">
+                <div class="formbox">
+                    <div class="form-t">
+                        <h1><span>评分:</span><span class="i" id="markerScore"></span></h1>
+                    </div>
+                    <div class="form-m">
+                        <table class="c-table" cellpadding="0" cellspacing="0" width="100%">
+                            <thead>
+                            <tr>
+                                <th>小题</th>
+                                <td>给分</td>
+                            </tr>
+                            </thead>
+                            <tbody id="question-content">
+                            <!-- 	                  <tr> -->
+                            <!-- 	                    <th>网络教育学院2015年下半年本科学士学位主干课程考试01</th> -->
+                            <!-- 	                    <td>3.5</td> -->
+                            <!-- 	                  </tr> -->
+                            </tbody>
+                        </table>
+                    </div>
+                    <div class="form-b cl">
+                        <input type="button" id="save-button" value="确认"/>
+                        <input type="button" class="grey" id="back-button" value="打回"/>
+                    </div>
+                </div>
+            </div>
+            <div class="tipsbox">
+                <p><span class="icon error"></span><br>当前没有可复核的试卷</p>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+<script type="text/javascript">
+    var message = '${message}';
+    var ids = [${ids}];
+    var current;
+    var student;
+    var iviewer;
+    var regex = /^[a-z]+$/ig;
+    $(document).ready(function () {
+        if (message != undefined && message != '') {
+            alert(message);
+        }
+
+        $('#save-button').click(save);
+        $('#back-button').click(back);
+
+        $('#zoom-in-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('zoom_by', 1);
+            }
+        });
+        $('#zoom-out-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('zoom_by', -1);
+            }
+        });
+        $('#zoom-origin-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('set_zoom', 100);
+            }
+        });
+        $('#zoom-fit-button').click(function () {
+            if (iviewer != undefined) {
+                iviewer.iviewer('fit');
+            }
+        });
+        if (ids.length == 0) {
+            $(".cont cl").css("display", "none");
+            return;
+        }
+        $(".tipsbox").css("display", "none");
+
+        window.onbeforeunload = function () {
+            $.post('${ctx}/admin/exam/library/inspected/clear', {
+                libraryId: student.id
+            }, function (result) {
+
+            });
+        }
+
+        $('#progress').html(ids.length);
+        process(1);
+    });
+
+    function process(index) {
+
+        if (index < 1) {
+            return;
+        }
+        if (index > ids.length) {
+            alert('所有考生已处理完毕,请返回重新搜索');
+            window.location.reload();
+            return;
+        }
+        current = index;
+        $('#answer-content').empty();
+        $('#image-holder-track').hide();
+        $.post('${ctx}/admin/exam/library/inspected/info', {
+            libraryId: ids[index - 1]
+        }, function (result) {
+            if (result.success == true) {
+                student = result;
+                render();
+            } else {
+                //$('#progress').html(ids.length-current);
+                process(current + 1);
+            }
+        }).error(function () {
+            alert('获取考生信息出错');
+            onProcessFinish(true);
+        });
+    }
+
+    function onProcessFinish(error) {
+        if (!error) {
+            $('#save-button').removeAttr("disabled");
+        }
+    }
+
+    function render() {
+
+        $('#studentId').html(student.studentId);
+        $('#subject').html(student.subjectCode + '_' + student.subjectName);
+        $('#markerName').html(student.markerName);
+        $('#markerScore').html(student.markerScore);
+        $("#question-content").empty();
+        for (var i = 0; i < student.questions.length; i++) {
+            var q = student.questions[i];
+            var dom = '<tr><th>' + q.questionNumber + '</th><td>' + q.score + '</td></tr>';
+            $("#question-content").append(dom);
+        }
+
+        /*     if(iviewer==undefined){
+                  iviewer = $('#image-holder-track').iviewer({
+                      src: '
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        ${fileServer}' + student.sheetUrls[0],
+              zoom_delta: 1.2,
+              zoom: 'fit',
+              zoom_min: 10,
+              mousewheel: false,
+              zoom_animation: false,
+              update_on_resize: true,
+              ui_disabled: true,
+              onFinishLoad: function(ev, url) {
+                  $('#image-holder-track').show();
+                  onProcessFinish(false);
+              },
+              onErrorLoad: function(ev, url) {
+                  onProcessFinish(true);
+              }
+          });
+    }else{
+        iviewer.iviewer('loadImage', '
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        ${fileServer}' + student.sheetUrls[0]);
+    } */
+        var pane = $('<canvas id="track-builder-canvas"></canvas>').appendTo($('#image-holder-track'));
+        var canvas = document.getElementById('track-builder-canvas');
+        var ctx = canvas.getContext('2d');
+        buildImages('${fileServer}', student.picUrls, student.pictureConfig, canvas, ctx, student.markTracks, student.markSpecialTagList);
+        $('#image-holder-track').show();
+        onProcessFinish(false);
+    }
+
+    function save() {
+        if (student == undefined) {
+            return;
+        }
+        $.post('${ctx}/admin/exam/library/inspected/save', {
+            libraryId: student.id
+        }, function (result) {
+            if (result == true) {
+                $('#progress').html(ids.length - current);
+                process(current + 1);
+            } else {
+                alert('保存失败,请稍后重试');
+            }
+        });
+    }
+
+    function back() {
+        if (student == undefined) {
+            return;
+        }
+        if (!confirm('确定要打回该评卷任务吗?')) {
+            return;
+        }
+        $.post('${ctx}/admin/exam/library/back', {
+            id: student.id
+        }, function (result) {
+            if (result.success == true) {
+                $('#progress').html(ids.length - current);
+                process(current + 1);
+            } else {
+                alert(result.message);
+            }
+        });
+
+    }
+
+    function buildImages(imageServer, picUrls, config, canvas, ctx, markTracks, markSpecialTagList) {
+        new ImageLoader({
+            server: imageServer,
+            flush: true,
+            strict: false
+        }).combine(picUrls, canvas, config, function () {
+            //阅卷轨迹
+            if (markTracks != undefined && markTracks.length > 0) {
+                ctx.font = "30px Arial";
+                ctx.fillStyle = 'red';
+                for (var j = 0; j < markTracks.length; j++) {
+                    if (markTracks[j].positionX > 0 && markTracks[j].positionY > 0) {
+                        ctx.fillText(
+                            markTracks[j].score,
+                            markTracks[j].positionX * canvas.width,
+                            markTracks[j].positionY * canvas.height);
+                    }
+                }
+            }
+            if (markSpecialTagList != undefined && markSpecialTagList.length > 0) {
+                ctx.font = "30px Arial";
+                ctx.fillStyle = 'red';
+                for (var i = 0; i < markSpecialTagList.length; i++) {
+                    if (markSpecialTagList[i].positionX > 0 && markSpecialTagList[i].positionY > 0) {
+                        ctx.fillText(markSpecialTagList[i].tagName,
+                            markSpecialTagList[i].positionX * canvas.width,
+                            markSpecialTagList[i].positionY * canvas.height);
+                    }
+                }
+            }
+        })
+    }
+
+</script>
+</html>

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

@@ -64,9 +64,9 @@
         &nbsp;&nbsp;
         <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
         &nbsp;
-     <%--    <c:if test="${examType!='MULTI_MEDIA'}">
-            <a target="_blank" href="${ctx}/admin/exam/inspected/start?subjectCode=${query.subjectCode}&groupNumber=${query.groupNumber}" class="btn">待复核:${inspectedCount }</a>
-        </c:if> --%>
+        <c:if test="${examType!='MULTI_MEDIA'}">
+            <a target="_blank" href="${ctx}/admin/exam/library/inspected/start?subjectCode=${query.subjectCode}&groupNumber=${query.groupNumber}" class="btn">待复核:${inspectedCount }</a>
+        </c:if>
     </div>
 </form>
 <tags:message content="${message}"/>

+ 9 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/reset.jsp

@@ -13,7 +13,7 @@
 				require('nw.gui').Window.get().maximize();
 			}catch(e){
 			}
-
+			var nameVerify =${nameVerify};
 			$('#submit-button').click(function(){
 				var name = $('#loginName').val();
 				if(name==''){
@@ -24,6 +24,14 @@
 					showError($.i18n.prop("user.reset.name.length"));
 					return false;
 				}
+				if(nameVerify==true ){
+					//var reg = new RegExp("[\\u4E00-\\u9FFF]+");
+				    var pattern = /^[\u4E00-\u9FFF]{1,10}$/;
+						if(!pattern.test(name)){    
+						showError($.i18n.prop("user.reset.name.chinese"));
+						return false;
+					}
+				}
 
 				var password = $('#password').val();
 				var password2 = $('#password2').val();

+ 1 - 0
stmms-web/src/main/webapp/static/i18n/messages.properties

@@ -19,6 +19,7 @@ user.reset.name=\u8f93\u5165\u7528\u6237\u540d
 user.reset.password=\u8f93\u5165\u65b0\u5bc6\u7801
 user.reset.password.again=\u518d\u6b21\u8f93\u5165\u65b0\u5bc6\u7801
 user.reset.name.length=\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc710\u4e2a\u5b57
+user.reset.name.chinese=\u8bf7\u8f93\u5165\u4e2d\u6587
 user.reset.password.same=\u4e24\u6b21\u5bc6\u7801\u8bf7\u4fdd\u6301\u4e00\u81f4
 user.reset.password.length=\u5bc6\u7801\u7684\u957f\u5ea6\u81f3\u5c114\u4f4d\uff0c\u4e0d\u80fd\u8d85\u8fc78\u4f4d
 #mark-control

+ 1 - 0
stmms-web/src/main/webapp/static/i18n/messages_en.properties

@@ -19,6 +19,7 @@ user.reset.name=press your name
 user.reset.password=press new password
 user.reset.password.again=press new password again
 user.reset.name.length=length cannot exceed 10 words
+user.reset.name.chinese=\u8bf7\u8f93\u5165\u4e2d\u6587
 user.reset.password.same=please keep the same password twice
 user.reset.password.length=password must be at least 4 word,cannot exceed 8 words
 #mark-control

+ 1 - 0
stmms-web/src/main/webapp/static/i18n/messages_ja.properties

@@ -19,6 +19,7 @@ user.reset.name=\u30e6\u30fc\u30b6\u30fc\u540d
 user.reset.password=\u30d1\u30b9\u30ef\u30fc\u30c9
 user.reset.password.again=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u518d\u5165\u529b
 user.reset.name.length=\u30d1\u30b9\u30ef\u30fc\u30c9\u306f10\u6587\u5b57\u4ee5\u5185\u306b\u3057\u3066\u304f\u3060\u3055\u3044
+user.reset.name.chinese=\u8bf7\u8f93\u5165\u4e2d\u6587
 user.reset.password.same=\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u4e00\u81f4\u3057\u307e\u305b\u3093
 user.reset.password.length=4\u6587\u5b57\u4ee5\u4e0a\u30018\u6587\u5b57\u4ee5\u5185\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044
 #mark-control

+ 1 - 0
stmms-web/src/main/webapp/static/i18n/messages_zh.properties

@@ -19,6 +19,7 @@ user.reset.name=\u8f93\u5165\u7528\u6237\u540d
 user.reset.password=\u8f93\u5165\u65b0\u5bc6\u7801
 user.reset.password.again=\u518d\u6b21\u8f93\u5165\u65b0\u5bc6\u7801
 user.reset.name.length=\u957f\u5ea6\u4e0d\u80fd\u8d85\u8fc710\u4e2a\u5b57
+user.reset.name.chinese=\u8bf7\u8f93\u5165\u4e2d\u6587
 user.reset.password.same=\u4e24\u6b21\u5bc6\u7801\u8bf7\u4fdd\u6301\u4e00\u81f4
 user.reset.password.length=\u5bc6\u7801\u7684\u957f\u5ea6\u81f3\u5c114\u4f4d\uff0c\u4e0d\u80fd\u8d85\u8fc78\u4f4d
 #mark-control

+ 305 - 0
stmms-web/src/main/webapp/static/inspected/css/inspectedLibrary.css

@@ -0,0 +1,305 @@
+
+/*======common======*/
+* {
+	font-family: "微软雅黑","苹方";
+	margin: 0;
+	padding: 0;
+	list-style: none;
+	outline: none;
+	-webkit-tap-highlight-color: transparent;
+	-webkit-box-sizing: border-box;
+	box-sizing: border-box;
+}
+html, body {
+	height: 100%;
+	background: #eee;
+	color: #3C454F;
+}
+a {
+	text-decoration: none;
+}
+.ellipsis {
+	text-overflow: ellipsis;
+	overflow: hidden;
+	white-space: nowrap;
+}
+.cl:after {
+	content: ".";
+	display: block;
+	height: 0;
+	clear: both;
+	visibility: hidden;
+}
+.cl {
+	zoom: 1;
+}
+.wp {
+	overflow: hidden;
+}
+/*======top======*/
+.top {
+	display: block;
+	width: 100%;
+	height: 60px;
+	overflow: hidden;
+	padding: 10px 20px;
+	background: #5D6D7D;
+	font-size: 14px;
+	color: #FFF;
+	font-weight: bold;
+}
+.top .z {
+	float: left;
+}
+.top .y {
+	float: right;
+	text-align: right;
+}
+.top>div {
+	height: 40px;
+	overflow: hidden;
+	display: inline-table;
+}
+.top>div div{
+	display: table-cell;
+	vertical-align: middle;
+}
+.top span {
+	font-size: 18px;
+	font-weight: 700;
+}
+.top span.i {
+	color: #FFFF99;
+}
+.top span.pipe {
+	font-weight: lighter;
+	font-size: 12px;
+	padding: 0 14px;
+	color: #7D8A97;
+}
+.top span.i em {
+	font-size: 14px;
+	font-weight: 100;
+	font-style: normal;
+	color: #FFF;
+	padding-left: 5px;
+}
+.top span.user {
+	background: url(../img/user.png) no-repeat 0 50%;
+	padding-left: 20px;
+}
+/*======middle======*/
+.middle {
+	width: 100%;
+	height: -moz-calc(100vh - 60px);
+	height: -webkit-calc(100vh - 60px);
+	height: calc(100vh - 60px);
+}
+.middle .middle-bg {
+	width: 100%;
+	height: 54px;
+	overflow: hidden;
+	background: #5D6D7D;
+}
+.middle .box {
+	height: 100%;
+	margin-top: -54px;
+	padding: 0 20px;
+	overflow: hidden;
+}
+.middle .cont {
+	width: 100%;
+	height: 100%;
+	padding-right: 400px;
+}
+.middle .cont .right {
+	float: right;
+	width: 380px;
+	height: 100%;
+	background: #FFF;
+	margin-right: -400px;
+}
+.middle .cont .left {
+	position:relative;
+	float: left;
+	width: 100%;
+	height: 100%;
+	overflow: hidden;
+	background: #FFF;
+}
+.image-content {
+	width: 100%;
+	height: 100%;
+	overflow-x: auto;
+	overflow-y: auto;
+}
+.tipsbox {
+	width: 100%;
+	height: 100%;
+	background: #FFF;
+	text-align: center;
+}
+.tipsbox>p {
+	padding-top: 20%;
+	font-size: 24px;
+	font-weight: 700;
+	color: #5D6D7D;
+}
+.tipsbox>p .icon {
+	display: inline-block;
+	width: 56px;
+	height: 56px;
+	overflow: hidden;
+	margin-bottom: 20px;
+}
+.tipsbox>p .loading {
+	background: url(../img/loading.gif) no-repeat 50% 50%;
+}
+.tipsbox>p .error {
+	background: url(../img/error.png) no-repeat 50% 50%;
+}
+/*======iviewer_zoom======*/
+.iviewer_zoom {
+	position: absolute;
+	right: 40px;
+	bottom: 40px;
+	z-index: 9999;
+}
+.iviewer_zoom>div {
+	display: block;
+	width: 32px;
+	height: 32px;
+	overflow: hidden;
+	background-color: rgba(93,109,125,.85);
+	background-image: url(../img/zoom_in.png);
+	background-repeat: no-repeat;
+	background-position: 50% 50%;
+	-moz-border-radius: 10px;
+	-webkit-border-radius: 10px;
+	border-radius: 10px;
+	margin-top: 6px;
+	cursor: pointer;
+}
+.iviewer_zoom .iviewer_zoom_out {
+	background-image: url(../img/zoom_out.png);
+}
+.iviewer_zoom .iviewer_zoom_zero {
+	background-image: url(../img/zoom_zero.png);
+}
+.iviewer_zoom .iviewer_zoom_fit {
+	background-image: url(../img/zoom_fit.png);
+}
+.iviewer_zoom>div:hover {
+	background-color: rgba(93,109,125,.95);
+}
+/*======formbox======*/
+.formbox {
+	position: relative;
+	height: 100%;
+	padding: 54px 0 60px 0;
+}
+.form-t {
+	z-index: 99999;
+	position: absolute;
+	left: 0;
+	top: 0;
+	width: 100%;
+	height: 54px;
+	overflow: hidden;
+	text-align: center;
+	border-bottom: 1px solid #E0E2E4;
+	box-shadow: 0 0 20px rgba(0,0,0,.1);
+}
+.form-t h1 {
+	display: inline-table;
+	margin: 0 auto;
+	font-size: 32px;
+}
+.form-t span {
+	float: left;
+	line-height: 54px;
+	font-size: 24px;
+	font-weight: 700;
+}
+.form-t span.i {
+	font-size: 30px;
+	color: #f60;
+}
+.form-m {
+	height: 100%;
+	overflow-y: auto;
+}
+.c-table {
+	font-size: 14px;
+}
+.c-table th , .c-table td {
+	border-bottom: 1px solid #EEE;
+	padding-top: 6px;
+	padding-bottom: 6px;
+	padding-left: 10px;
+	padding-right: 10px;
+}
+.c-table th {
+	
+	font-weight: 400;
+	text-align: left;
+	padding-left: 15px;
+	padding-right: 15px;
+}
+.c-table td {
+	min-width: 60px;
+	width: 60px;
+	text-align: center;
+	border-left: 1px solid #EEE;
+}
+.c-table thead th, .c-table thead td {
+	background: #fafafa;
+	border-color: #E0E2E4;
+	padding-top: 10px;
+	padding-bottom: 10px;
+	font-size: 14px;
+	font-weight: 700;
+}
+.c-table tr:hover td,.c-table tr:hover th {
+	background-color: #FaFaFa;
+}
+.form-b {
+	z-index: 99999;
+	position: absolute;
+	left: 0;
+	bottom: 0;
+	width: 100%;
+	height: 60px;
+	overflow: hidden;
+	padding: 10px;
+	border-top: 1px solid #E0E2E4;
+	box-shadow: 0 0 20px rgba(0,0,0,.05);
+	text-align: center;
+}
+.form-b input {
+	display: inline-block;
+	width: 45%;
+	height: 40px;
+	line-height: 40px;
+	overflow: hidden;
+	border: 0;
+	-moz-border-radius: 6px;
+	-webkit-border-radius: 6px;
+	border-radius: 6px;
+	background: #5D6D7D;
+	margin: 0 5px;
+	font-size: 15px;
+	font-weight: 400;
+	color: #FFF;
+	cursor: pointer;
+}
+.form-b input:hover {
+	background: #778899;
+}
+.form-b input.grey {
+	background: #E0E2E4;
+	color: #8796A5;
+}
+.form-b input.grey:hover{
+	color: #5D6D7D;
+}