ting.yin 3 年 前
コミット
e67a53f37a

+ 12 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamCardDao.java

@@ -0,0 +1,12 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.AnswerCard;
+import cn.com.qmth.stmms.biz.exam.model.AnswerCardPK;
+
+public interface ExamCardDao extends PagingAndSortingRepository<AnswerCard, AnswerCardPK>,
+        JpaSpecificationExecutor<AnswerCard> {
+
+}

+ 121 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/AnswerCard.java

@@ -0,0 +1,121 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import cn.com.qmth.stmms.common.enums.CardSource;
+
+/**
+ * 卡格式
+ */
+@Entity
+@Table(name = "eb_exam_card")
+public class AnswerCard implements Serializable {
+
+    private static final long serialVersionUID = 9094397873995690949L;
+
+    @EmbeddedId
+    private AnswerCardPK pk;
+
+    private String subjectCode;
+
+    private Integer paperCount;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "source", length = 16, nullable = false)
+    private CardSource source;
+
+    private Boolean needAdapte;
+
+    private Boolean singlePage;
+
+    private String parameter;
+
+    private String remark;
+
+    @Temporal(TemporalType.TIMESTAMP)
+    @Column(name = "update_time")
+    private Date updateTime;
+
+    public AnswerCardPK getPk() {
+        return pk;
+    }
+
+    public void setPk(AnswerCardPK pk) {
+        this.pk = pk;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public Integer getPaperCount() {
+        return paperCount;
+    }
+
+    public void setPaperCount(Integer paperCount) {
+        this.paperCount = paperCount;
+    }
+
+    public CardSource getSource() {
+        return source;
+    }
+
+    public void setSource(CardSource source) {
+        this.source = source;
+    }
+
+    public Boolean getNeedAdapte() {
+        return needAdapte;
+    }
+
+    public void setNeedAdapte(Boolean needAdapte) {
+        this.needAdapte = needAdapte;
+    }
+
+    public Boolean getSinglePage() {
+        return singlePage;
+    }
+
+    public void setSinglePage(Boolean singlePage) {
+        this.singlePage = singlePage;
+    }
+
+    public String getParameter() {
+        return parameter;
+    }
+
+    public void setParameter(String parameter) {
+        this.parameter = parameter;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+}

+ 68 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/AnswerCardPK.java

@@ -0,0 +1,68 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class AnswerCardPK implements Serializable {
+
+    private static final long serialVersionUID = 7454931281820903561L;
+
+    @Column(name = "exam_id", nullable = false)
+    private Integer examId;
+
+    @Column(name = "number", nullable = false)
+    private Integer number;
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + ((examId == null) ? 0 : examId.hashCode());
+        result = PRIME * result + ((number == null) ? 0 : number.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        final AnswerCardPK other = (AnswerCardPK) obj;
+        if (examId == null) {
+            if (other.examId != null)
+                return false;
+        } else if (!examId.equals(other.examId))
+            return false;
+
+        if (number == null) {
+            if (other.number != null)
+                return false;
+        } else if (!number.equals(other.number))
+            return false;
+
+        return true;
+    }
+
+}

+ 5 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/AnswerCardService.java

@@ -0,0 +1,5 @@
+package cn.com.qmth.stmms.biz.exam.service;
+
+public interface AnswerCardService {
+
+}

+ 17 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/AnswerCardServiceImpl.java

@@ -0,0 +1,17 @@
+package cn.com.qmth.stmms.biz.exam.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.dao.ExamCardDao;
+import cn.com.qmth.stmms.biz.exam.model.AnswerCard;
+import cn.com.qmth.stmms.biz.exam.service.AnswerCardService;
+
+@Service
+public class AnswerCardServiceImpl extends BaseQueryService<AnswerCard> implements AnswerCardService {
+
+    @Autowired
+    private ExamCardDao cardDao;
+
+}

+ 28 - 0
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/CardSource.java

@@ -0,0 +1,28 @@
+package cn.com.qmth.stmms.common.enums;
+
+public enum CardSource {
+
+    CLIENT("本地工具"),
+
+    WEB("在线工具");
+
+    private String name;
+
+    CardSource(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public static CardSource getByName(String name) {
+        for (CardSource r : CardSource.values()) {
+            if (r.getName().equals(name)) {
+                return r;
+            }
+        }
+        return null;
+    }
+
+}

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

@@ -11,6 +11,7 @@ import javax.servlet.http.HttpServletResponse;
 import net.sf.json.JSONObject;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -110,7 +111,8 @@ public class SystemAuthController extends BaseController {
                 JSONObject json = AppLicenseUtil.parseLicense(ByteArray.fromInputStream(file.getInputStream()).value());
                 if (json != null) {
                     authCache.setAuth(true);
-                    if (json.has("control") && json.getJSONObject("control").has("expireTime")) {
+                    if (json.has("control") && json.getJSONObject("control").has("expireTime")
+                            && StringUtils.isNotBlank(json.getJSONObject("control").getString("expireTime"))) {
                         long expireTime = json.getJSONObject("control").getLong("expireTime");
                         authCache.setExpireTime(expireTime);
                         List<School> list = schoolService.parseJson(json.getString("orgs"));

+ 9 - 20
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java

@@ -128,15 +128,12 @@ public class LibraryController extends BaseExamController {
                         group.getSubjectCode(), false, group.getNumber()));
             }
         }
-        if (query.getGroupNumber() != 0) {
-            MarkLibrarySearchQuery query2 = new MarkLibrarySearchQuery();
-            query2.setExamId(examId);
-            query2.setSubjectCode(query.getSubjectCode());
-            query2.setGroupNumber(query.getGroupNumber());
-            query2.addStatus(LibraryStatus.MARKED);
-            long inspectedCount = libraryService.countByQuery(query2);
-            model.addAttribute("inspectedCount", inspectedCount);
+        long inspectedCount = 0;
+        if (query.getGroupNumber() != 0 && (LibraryStatus.MARKED.equals(status) || status == null)) {
+            query.addStatus(LibraryStatus.MARKED);
+            inspectedCount = libraryService.countByQuery(query);
         }
+        model.addAttribute("inspectedCount", inspectedCount);
         model.addAttribute("query", query);
         model.addAttribute("subjectList", getExamSubject(examId, wu));
         model.addAttribute("groupList", groupList);
@@ -225,10 +222,9 @@ public class LibraryController extends BaseExamController {
     @Logging(menu = "开始任务复核", type = LogType.QUERY)
     @RequestMapping(value = "/getTask", method = RequestMethod.POST)
     @ResponseBody
-    public Task getTask(HttpServletRequest request, RedirectAttributes redirectAttributes,
-            @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
+    public Task getTask(HttpServletRequest request, RedirectAttributes redirectAttributes, MarkLibrarySearchQuery query) {
         int examId = getSessionExamId(request);
-        MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
+        MarkGroup group = groupService.findOne(examId, query.getSubjectCode(), query.getGroupNumber());
         if (group == null) {
             return null;
         } else if (group.getStatus() == MarkStatus.FINISH) {
@@ -240,13 +236,10 @@ public class LibraryController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         int retry = 1;
         while (task == null) {
-            MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
             query.setExamId(examId);
-            query.setSubjectCode(subjectCode);
-            query.setGroupNumber(groupNumber);
+            query.addStatus(LibraryStatus.MARKED);
             query.setPageNumber(retry);
             query.setPageSize(20);
-            query.addStatus(LibraryStatus.MARKED);
             query = libraryService.findByQuery(query);
             if (query.getResult().isEmpty()) {
                 break;
@@ -312,14 +305,10 @@ public class LibraryController extends BaseExamController {
 
     @RequestMapping(value = "/getStatus", method = RequestMethod.POST)
     @ResponseBody
-    public JSONObject status(HttpServletRequest request, @RequestParam String subjectCode,
-            @RequestParam Integer groupNumber) {
+    public JSONObject status(HttpServletRequest request, MarkLibrarySearchQuery query) {
         JSONObject status = new JSONObject();
         int examId = getSessionExamId(request);
-        MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
         query.setExamId(examId);
-        query.setSubjectCode(subjectCode);
-        query.setGroupNumber(groupNumber);
         query.addStatus(LibraryStatus.MARKED);
         long inspectedCount = libraryService.countByQuery(query);
         status.accumulate("totalCount", inspectedCount);

+ 20 - 17
stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/HttpUtil.java

@@ -223,16 +223,18 @@ public class HttpUtil {
     }
 
     public static void main(String[] args) throws IOException {
-        JSONObject json = new JSONObject();
-        json.accumulate("examId", 240);
-        json.accumulate("subjectCode", "CJFX18");
-        String test = "https://ecs-test.ea100.com.cn/api/exchange/outer/question/getSubjectivePaperStruct";
-        // String dev =
-        // "https://dev.ea100.com.cn/api/exchange/outer/question/getSubjectivePaperStruct";
+        // JSONObject json = new JSONObject();
+        // json.accumulate("examId", 240);
+        // json.accumulate("subjectCode", "CJFX18");
+        // String test =
+        // "https://ecs-test.ea100.com.cn/api/exchange/outer/question/getSubjectivePaperStruct";
+        String dev = "https://ucass.exam-cloud.cn/api/exchange/outer/question/getSubjectivePaperStruct";
         long start = System.currentTimeMillis();
-        HttpUtil subjectHttp = new HttpUtil(test, "123456", "11", "17128");
+        JSONObject json = new JSONObject();
+        json.accumulate("examId", 3710);
+        HttpUtil subjectHttp = new HttpUtil(dev, "jfapejf8eif%ijipa^ii8k3jii", "ucass", "17796");
         String subjectJson = subjectHttp.httpAction(null, json.toString());
-        // System.out.println(subjectJson);
+        System.out.println(subjectJson);
         // ByteArrayOutputStream buffer = new ByteArrayOutputStream();
         // IOUtils.copy(new
         // ByteArrayInputStream(subjectJson.getBytes(StandardCharsets.UTF_8)),
@@ -254,14 +256,15 @@ public class HttpUtil {
         // String paper = paperHttp.httpAction(null, json.toString());
         // System.out.println(paper);
 
-        HttpUtil studentHttp = new HttpUtil(
-                "https://ecs-test.ea100.com.cn/api/exchange/outer/question/getSubjectiveQuestion", "123456", "11",
-                "17128");
-        json.accumulate("startId", 0);
-        json.accumulate("size", 1);
-        String studentJson = studentHttp.httpAction(null, json.toString());
-        System.out.println(studentJson);
-        long end = System.currentTimeMillis();
-        System.out.println(end - start);
+        // HttpUtil studentHttp = new HttpUtil(
+        // "https://ecs-test.ea100.com.cn/api/exchange/outer/question/getSubjectiveQuestion",
+        // "123456", "11",
+        // "17128");
+        // json.accumulate("startId", 0);
+        // json.accumulate("size", 1);
+        // String studentJson = studentHttp.httpAction(null, json.toString());
+        // System.out.println(studentJson);
+        // long end = System.currentTimeMillis();
+        // System.out.println(end - start);
     }
 }

+ 170 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CardController.java

@@ -0,0 +1,170 @@
+package cn.com.qmth.stmms.api.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.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 cn.com.qmth.stmms.admin.utils.PaperJsonUtils;
+import cn.com.qmth.stmms.api.exception.ApiException;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
+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.service.ExamPackageService;
+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.file.enums.FormatType;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.common.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.domain.ApiUser;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+
+import com.google.common.io.ByteStreams;
+
+@Controller("cardController")
+@RequestMapping("/api/card")
+public class CardController extends BaseApiController {
+
+    protected static final Logger log = LoggerFactory.getLogger(CardController.class);
+
+    @Autowired
+    private FileService fileService;
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamPackageService packageService;
+
+    // private Exam validateExam(ApiUser au, Integer examId, ExamType... types)
+    // {
+    // Exam exam = examService.findById(examId);
+    // if (exam == null || !exam.getSchoolId().equals(au.getSchoolId()) ||
+    // exam.getStatus() != ExamStatus.START) {
+    // throw ApiException.EXAM_NOT_ACCESSIBLED;
+    // }
+    // if (types != null && types.length > 0 &&
+    // !Arrays.asList(types).contains(exam.getType())) {
+    // throw ApiException.QUERY_PARAM_ERROR.replaceMessage("exam type invalid");
+    // }
+    // return exam;
+    // }
+    //
+    // private ExamPackage validateExamPackage(Integer examId, String
+    // packageCode) {
+    // ExamPackage ep = packageService.find(examId, packageCode);
+    // if (ep == null) {
+    // throw
+    // ApiException.QUERY_PARAM_ERROR.appendMessage(": packageCode error");
+    // }
+    // return ep;
+    // }
+    //
+    // private ExamSubject validateExamSubject(Integer examId, String
+    // subjectCode) {
+    // ExamSubject subject = subjectService.find(examId, subjectCode);
+    // if (subject == null) {
+    // throw
+    // ApiException.QUERY_PARAM_ERROR.appendMessage(": subjectCode error");
+    // }
+    // return subject;
+    // }
+    //
+    // private FormatType validateFormatType(FormatType type, FormatType...
+    // types) {
+    // if (type == null) {
+    // throw
+    // ApiException.FORMAT_TYPE_ERROR.replaceMessage("format type is null");
+    // }
+    // if (types != null && !Arrays.asList(types).contains(type)) {
+    // throw ApiException.FORMAT_TYPE_ERROR;
+    // }
+    // return type;
+    // }
+    //
+    // @RequestMapping(value = "/answer/save", method = RequestMethod.POST)
+    // @RoleRequire({ Role.SCHOOL_ADMIN })
+    // @ResponseBody
+    // public JSONObject uploadSheet(HttpServletRequest request, @RequestParam
+    // Integer examId,
+    // @RequestParam(required = false) String subjectCode,
+    // @RequestParam(required = false) Integer number,
+    // @RequestParam String md5, @RequestParam MultipartFile file) {
+    // ApiUser au = RequestUtils.getApiUser(request);
+    // subjectCode = StringUtils.trimToNull(subjectCode);
+    // Exam exam = validateExam(au, examId, ExamType.SCAN_IMAGE);
+    // ExamSubject subject = subjectCode != null ? validateExamSubject(examId,
+    // subjectCode) : null;
+    // try {
+    // if (subject != null) {
+    // fileService.uploadCard(file.getInputStream(), md5, examId, subjectCode,
+    // FormatType.JSON);
+    // subject.setCardType(FormatType.JSON);
+    // subjectService.save(subject);
+    // uri = fileService.getCardUri(examId, subjectCode, format);
+    // } else {
+    // fileService.uploadCard(file.getInputStream(), md5, examId, format);
+    // exam.setCardType(format);
+    // examService.save(exam);
+    // uri = fileService.getCardUri(examId, format);
+    // }
+    // } catch (Exception e) {
+    // log.error("card upload error", e);
+    // throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("card upload error: "
+    // + e.getMessage());
+    // }
+    // return result(true, fileService.getFileServer().concat(uri));
+    // }
+    //
+    // @RequestMapping(value = "/answer/query", method = RequestMethod.POST)
+    // @RoleRequire({ Role.SCHOOL_ADMIN })
+    // @ResponseBody
+    // public JSONObject answerQuery(HttpServletRequest request, @RequestParam
+    // Integer examId, @RequestParam Integer number) {
+    // ApiUser au = RequestUtils.getApiUser(request);
+    // validateExam(au, examId, ExamType.SCAN_IMAGE);
+    // ExamStudent student = validateExamStudent(examId, examNumber);
+    // validateIndex(index);
+    // try {
+    // fileService.uploadSlice(file.getInputStream(), md5, examId,
+    // student.getSecretNumber(), index);
+    // } catch (Exception e) {
+    // log.error("slice upload error", e);
+    // throw
+    // ApiException.FILE_UPLOAD_ERROR.replaceMessage("slice upload error: " +
+    // e.getMessage());
+    // }
+    // return result(true,
+    // fileService.getFileServer().concat(fileService.getSliceUri(examId,
+    // student.getSecretNumber(), index)));
+    // }
+
+}