ting.yin 4 년 전
부모
커밋
7f3e307e0e

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java

@@ -35,7 +35,7 @@ public class ExamQuestion implements Serializable {
     @Column(name = "sub_number", nullable = false)
     private String subNumber;
 
-    @Column(name = "main_title", nullable = false, length = 32)
+    @Column(name = "main_title", nullable = false, length = 128)
     private String mainTitle;
 
     @Column(name = "group_number", nullable = true)

+ 4 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/FileService.java

@@ -55,7 +55,9 @@ public interface FileService {
 
     boolean sheetExist(int examId, String examNumber, int index);
 
-    boolean sliceExist(int examId, String secreNumber, int index);
+    boolean sliceExist(int examId, String secretNumber, int index);
 
-    boolean jsonExist(int examId, String secreNumber);
+    boolean jsonExist(int examId, String secretNumber);
+
+    byte[] downloadJson(int examId, String secretNumber) throws Exception;
 }

+ 12 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/impl/FileServiceImpl.java

@@ -6,6 +6,7 @@ import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.file.store.FileStore;
 import cn.com.qmth.stmms.biz.file.store.impl.DiskStore;
 import cn.com.qmth.stmms.biz.file.store.impl.OssStore;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.DisposableBean;
 import org.springframework.beans.factory.InitializingBean;
@@ -245,12 +246,19 @@ public class FileServiceImpl implements FileService, InitializingBean, Disposabl
         service.fileStore = "oss://LTAI4FnJ2pgV6aGceYcCkeEi:ktrMEVE7PfoxRPeJUPDFeygOIH4aU7@qmth-test.oss-cn-shenzhen.aliyuncs.com";
         service.afterPropertiesSet();
 
-        //DiskStore ds = new DiskStore("/Users/luoshi/Downloads");
-        //String md5 = BinaryUtil.toBase64String(BinaryUtil.calculateMd5(ds.read("123456.jpg")));
-        //        service.uploadSheet(new FileInputStream("/Users/luoshi/Downloads/123456.jpg"),
-        //                "7e9b368ff5da88ff2413c2c9083c481d", 1, "123456", 1);
+        // DiskStore ds = new DiskStore("/Users/luoshi/Downloads");
+        // String md5 =
+        // BinaryUtil.toBase64String(BinaryUtil.calculateMd5(ds.read("123456.jpg")));
+        // service.uploadSheet(new
+        // FileInputStream("/Users/luoshi/Downloads/123456.jpg"),
+        // "7e9b368ff5da88ff2413c2c9083c481d", 1, "123456", 1);
         service.downloadSheet(1, "16110003", 1);
         System.out.println("success");
     }
 
+    @Override
+    public byte[] downloadJson(int examId, String secretNumber) throws Exception {
+        return store.read(getJsonUri(examId, secretNumber));
+    }
+
 }

+ 42 - 14
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/OrgUtil.java

@@ -10,6 +10,7 @@ import java.net.URL;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -212,28 +213,55 @@ public class OrgUtil {
     }
 
     public List<School> getOrgs() {
-        String str = this.httpAction(null, null);
         List<School> schools = new ArrayList<School>();
-        JSONArray orgArray = JSONArray.fromObject(str);
-        for (int i = 0; i < orgArray.size(); i++) {
-            JSONObject org = orgArray.getJSONObject(i);
-            School school = new School();
-            school.setAccessKey(org.getString("accessKey"));
-            school.setAccessSecret(org.getString("accessSecret"));
-            school.setCode(org.getString("code"));
-            school.setName(org.getString("name"));
-            school.setLogoUrl(org.getString("logo"));
-            school.setEnable(true);
-            schools.add(school);
+        int pageNumber = 1;
+        int pageSize = 100;
+        while (pageNumber != 0) {
+            Map<String, Object> datas = new HashMap<String, Object>();
+            datas.put("pageNumber", pageNumber);
+            datas.put("pageSize", pageSize);
+            String str = this.httpAction(null, datas);
+            JSONArray orgArray = JSONArray.fromObject(str);
+            if (orgArray.size() == pageSize) {
+                pageNumber++;
+            } else {
+                pageNumber = 0;
+            }
+            for (int i = 0; i < orgArray.size(); i++) {
+                JSONObject org = orgArray.getJSONObject(i);
+                School school = new School();
+                school.setAccessKey(org.getString("accessKey"));
+                school.setAccessSecret(org.getString("accessSecret"));
+                school.setCode(org.getString("code"));
+                school.setName(org.getString("name"));
+                school.setLogoUrl(org.getString("logo"));
+                school.setEnable(true);
+                schools.add(school);
+            }
         }
+
         return schools;
     }
 
     public static void main(String[] args) throws IOException {
         OrgUtil orgUtil = new OrgUtil("7bbdc11570bc474dbf50e0d4a5dff328", "IOodRvbp2LspJTHOScgB7Yx8MRloMpyl",
                 "https://solar.qmth.com.cn", "/api/open/org/query");
-        String str = orgUtil.httpAction(null, null);
-        System.out.println(str);
+        int pageNumber = 1;
+        int pageSize = 1;
+
+        while (pageNumber != 0) {
+            Map<String, Object> datas = new HashMap<String, Object>();
+            datas.put("pageNumber", pageNumber);
+            datas.put("pageSize", pageSize);
+            String str = orgUtil.httpAction(null, datas);
+            JSONArray orgArray = JSONArray.fromObject(str);
+            if (orgArray.size() == pageSize) {
+                pageNumber++;
+            } else {
+                pageNumber = 0;
+            }
+            System.out.println(str);
+        }
 
     }
 }

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

@@ -75,9 +75,9 @@ public class InspectedController extends BaseExamController {
             @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";
-        // }
+        if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
+            return "modules/exam/permission";
+        }
         WebUser wu = RequestUtils.getWebUser(request);
         query.setExamId(examId);
         List<ExamSubject> subjectList = getExamSubject(examId, wu);

+ 26 - 29
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkTrackController.java

@@ -3,10 +3,6 @@ package cn.com.qmth.stmms.admin.exam;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import net.sf.json.JSONObject;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -26,13 +22,11 @@ import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
-import cn.com.qmth.stmms.biz.mark.model.SpecialTagDTO;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
 import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
-import cn.com.qmth.stmms.biz.utils.OriginTag;
 
 @Controller("trackController")
 @RequestMapping("/admin/exam/track")
@@ -69,33 +63,36 @@ public class MarkTrackController extends BaseExamController {
 
     @ResponseBody
     @RequestMapping("/student")
-    public JSONObject studentTrack(@RequestParam Integer studentId) {
-        JSONObject map = new JSONObject();
-        map.accumulate("fileServer", fileService.getFileServer());
+    public Task studentTrack(@RequestParam Integer studentId) {
+        Task task = new Task();
         ExamStudent student = studentService.findById(studentId);
 
         if (student != null && student.isUpload()) {
-            List<String> sliceUrls = fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1,
-                    student.getSliceCount());
-            map.accumulate("sliceUrls", sliceUrls);
-            Map<MarkGroup, List<OriginTag>> maps = studentService.getSliceTags(student, false);
-            List<OriginTag> tags = new ArrayList<OriginTag>();
-            for (Entry<MarkGroup, List<OriginTag>> entry : maps.entrySet()) {
-                tags.addAll(entry.getValue());
-            }
-            List<SpecialTagDTO> list = new ArrayList<SpecialTagDTO>();
-            for (OriginTag originTag : tags) {
-                SpecialTagDTO dto = new SpecialTagDTO();
-                dto.setOffsetIndex(originTag.getOffsetIndex());
-                dto.setOffsetX(originTag.getOffsetX());
-                dto.setOffsetY(originTag.getOffsetY());
-                dto.setTagName(originTag.getContent());
-                list.add(dto);
-            }
-            map.accumulate("tagList", list);
-            map.accumulate("examNumber", student.getExamNumber());
+            // List<String> sliceUrls =
+            // fileService.getSliceUris(student.getExamId(),
+            // student.getSecretNumber(), 1,
+            // student.getSliceCount());
+            // map.accumulate("sliceUrls", sliceUrls);
+            // Map<MarkGroup, List<OriginTag>> maps =
+            // studentService.getSliceTags(student, false);
+            // List<OriginTag> tags = new ArrayList<OriginTag>();
+            // for (Entry<MarkGroup, List<OriginTag>> entry : maps.entrySet()) {
+            // tags.addAll(entry.getValue());
+            // }
+            // List<SpecialTagDTO> list = new ArrayList<SpecialTagDTO>();
+            // for (OriginTag originTag : tags) {
+            // SpecialTagDTO dto = new SpecialTagDTO();
+            // dto.setOffsetIndex(originTag.getOffsetIndex());
+            // dto.setOffsetX(originTag.getOffsetX());
+            // dto.setOffsetY(originTag.getOffsetY());
+            // dto.setTagName(originTag.getContent());
+            // list.add(dto);
+            // }
+            // map.accumulate("tagList", list);
+            // map.accumulate("examNumber", student.getExamNumber());
+            task = taskService.build(student);
         }
-        return map;
+        return task;
     }
 
     /**

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

@@ -512,7 +512,7 @@ public class PaperController extends BaseExamController {
             }
             if (!subjectSet.isEmpty()) {
                 ScoreCalculateThread thread = new ScoreCalculateThread(exam.getId(), subjectSet, lockService,
-                        studentService, questionService, examService, subjectService, examLock);
+                        studentService, questionService, examService, subjectService, fileService, examLock);
                 taskExecutor.submit(thread);
             }
         }

+ 18 - 7
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ScoreCalculateThread.java

@@ -1,7 +1,5 @@
 package cn.com.qmth.stmms.admin.thread;
 
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -12,6 +10,7 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import cn.com.qmth.stmms.admin.utils.StudentJsonUtils;
 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;
@@ -19,10 +18,12 @@ 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.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.utils.ScoreCalculateUtil;
 import cn.com.qmth.stmms.biz.utils.ScoreInfo;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
 
@@ -54,17 +55,20 @@ public class ScoreCalculateThread implements Runnable {
 
     private ExamService examService;
 
+    private FileService fileService;
+
     private boolean examLock;
 
     public ScoreCalculateThread(int examId, Set<String> subjectCodeSet, LockService lockService,
             ExamStudentService studentService, ExamQuestionService questionService, ExamService examService,
-            ExamSubjectService subjectService, boolean examLock) {
+            ExamSubjectService subjectService, FileService fileService, boolean examLock) {
         this.examId = examId;
         this.subjectCodeSet = subjectCodeSet != null ? subjectCodeSet : new HashSet<>();
         this.lockService = lockService;
         this.studentService = studentService;
         this.questionService = questionService;
         this.examService = examService;
+        this.fileService = fileService;
         this.examLock = examLock;
         this.objectiveMap = new HashMap<>();
         this.subjectiveMap = new HashMap<>();
@@ -97,7 +101,7 @@ public class ScoreCalculateThread implements Runnable {
                         pageSize);
                 while (list != null && list.size() > 0) {
                     for (ExamStudent student : list) {
-                        calculate(student);
+                        calculate(student, exam.getType());
                     }
                     pageNumber++;
                     list = studentService.findByExamIdAndSubjectCode(examId, subjectCode, pageNumber, pageSize);
@@ -115,15 +119,22 @@ public class ScoreCalculateThread implements Runnable {
         }
     }
 
-    private void calculate(ExamStudent student) {
+    private void calculate(ExamStudent student, ExamType examType) {
         // 未上传、缺考、违纪的考生不统分
         if (!student.isUpload() || student.isAbsent() || student.isBreach()) {
             return;
         }
         try {
+            List<ExamQuestion> oList = findQuestionList(student.getSubjectCode(), student.getPaperType(), true);
+            if (ExamType.MULTI_MEDIA.equals(examType) && oList.size() > 0) {
+                byte[] s = fileService.downloadJson(student.getExamId(), student.getSecretNumber());
+                String studentJson = new String(s, "UTF-8");
+                String answers = StudentJsonUtils.toAnswers(studentJson);
+                student.setAnswers(answers.toUpperCase());
+                studentService.save(student);
+            }
             ScoreCalculateUtil util = ScoreCalculateUtil.instance(student);
-            ScoreInfo info = util.calculate(findQuestionList(student.getSubjectCode(), student.getPaperType(), true),
-                    null);
+            ScoreInfo info = util.calculate(oList, null);
 
             student.setObjectiveScore(info.getObjectiveScore());
             student.setScoreList(info.getScoreList(), true);

+ 46 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/StudentJsonUtils.java

@@ -0,0 +1,46 @@
+package cn.com.qmth.stmms.admin.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
+import org.apache.commons.lang.StringUtils;
+
+public class StudentJsonUtils {
+
+    public static final String ANSWER_SPLIT = ",";
+
+    public static final String[] answerArray = new String[] { "#", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
+            "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
+
+    public static String toAnswers(String text) {
+        List<String> list = new ArrayList<>();
+        JSONArray array = JSONArray.fromObject(text);
+        for (int i = 0; i < array.size(); i++) {
+            JSONObject answerJson = array.getJSONObject(i);
+            Object answerObject = answerJson.get("answer");
+            String answer = "";
+            if (answerObject instanceof JSONArray) {
+                JSONArray jsonArray = (JSONArray) answerObject;
+                if (jsonArray.size() == 0) {
+                    answer = "#";
+                }
+                for (int l = 0; l < jsonArray.size(); l++) {
+                    Object o = jsonArray.get(l);
+                    if (o instanceof Integer) {
+                        int index = jsonArray.getInt(l);
+                        answer = answer + answerArray[index];
+                    }
+                }
+            } else if (answerObject instanceof Boolean) {
+                answer = answerJson.getBoolean("answer") ? "A" : "B";
+            }
+            if (StringUtils.isNotBlank(answer)) {
+                list.add(answer);
+            }
+        }
+        return StringUtils.join(list, ANSWER_SPLIT);
+    }
+}

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

@@ -133,7 +133,7 @@
                         <a class="json-link" href="${ctx}/admin/exam/library/getJson?studentId=${result.studentId}&groupNumber=${result.groupNumber}" target="_blank">原图</a>
                     </c:if>
                     <c:if test="${examType!='MULTI_MEDIA'}"> --%>
-                      	<a href="${ctx}/web/admin/exam/track/library?libraryId=${result.id}&subjectCode=${result.subjectCode}" target="_blank">轨迹图</a>
+                      	<a href="${ctx}/web/admin/exam/track/library?libraryId=${result.id}&subjectCode=${result.subjectCode}" target="_blank">查看</a>
                    <%--  </c:if> --%>
                 </c:if>
                 <c:if test="${result.status.value==1 || result.status.value==5 ||result.status.value==6}">

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

@@ -82,12 +82,8 @@
             <td>${result.markTime}</td>
             <td>${result.problemType.name}</td>
             <td>
-                <c:if test="${examType=='MULTI_MEDIA'}">
-                    <a class="json-link" href="${ctx}/admin/exam/library/getJson?studentId=${result.id}&groupNumber=${result.number}" target="_blank">原图</a>
-                </c:if>
-                <c:if test="${examType!='MULTI_MEDIA'}">
-                  	<a href="${ctx}/web/admin/exam/track/library?libraryId=${result.libraryId}" target="_blank">试卷详情</a>
-                </c:if>
+                <%--  <a class="json-link" href="${ctx}/admin/exam/library/getJson?studentId=${result.id}&groupNumber=${result.number}" target="_blank">原图</a>--%>
+               	<a href="${ctx}/web/admin/exam/track/library?libraryId=${result.libraryId}&subjectCode=${result.subjectCode}" target="_blank">试卷详情</a>
                 &nbsp;
                 <a href="##" data-id="${result.libraryId}" class="back-link">打回</a>
             </td>

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

@@ -192,11 +192,11 @@
                            data-answer-url="<c:if test="${student.answerUrl!=null}">${fileServer}${student.answerUrl}</c:if>"
                            data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">原图</a>
                         </c:if>
-                        <a href="${ctx}/web/admin/exam/track/student?studentId=${student.id}" target="_blank">轨迹图</a>
+                        <a href="${ctx}/web/admin/exam/track/student?studentId=${student.id}&subjectCode=${student.subjectCode}" target="_blank">轨迹图</a>
                     </c:if>
                     <c:if test="${examType=='MULTI_MEDIA'}">
                        <%--  <a class="json-link" href="${ctx}/admin/exam/library/getJson?studentId=${student.id}" target="_blank">原图</a> --%>
-                        <a href="${ctx}/web/admin/exam/track/student?studentId=${student.id}&subjectCode=${student.subjectCode}" target="_blank">轨迹图</a>
+                        <a href="${ctx}/web/admin/exam/track/student?studentId=${student.id}&subjectCode=${student.subjectCode}" target="_blank">原卷</a>
                     </c:if>
                 </c:if>
                 <c:if test="${student.packageUrlString!=null && student.packageUrlString!=''}">

+ 1 - 1
stmms-web/src/main/webapp/sql/stmms_ft.sql

@@ -196,7 +196,7 @@ CREATE TABLE `eb_exam_question`
     `group_number`     int(11)     DEFAULT NULL COMMENT '分组序号',
     `main_number`      int(11)     NOT NULL COMMENT '大题号',
     `sub_number`       varchar(32) NOT NULL COMMENT '小题号',
-    `main_title`       varchar(32) NOT NULL COMMENT '大题名称',
+    `main_title`       varchar(128) NOT NULL COMMENT '大题名称',
     `answer`           varchar(16)          DEFAULT NULL COMMENT '正确答案',
     `total_score`      double      NOT NULL COMMENT '满分',
     `interval_score`   double      NOT NULL COMMENT '评卷间隔分',