ting.yin 1 år sedan
förälder
incheckning
fc208a8541

+ 3 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/common/domain/card/AnswerCardSubjectFile.java

@@ -6,6 +6,7 @@ import java.util.Collections;
 import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 /**
@@ -43,8 +44,8 @@ public class AnswerCardSubjectFile {
      */
     public static List<AnswerCardSubjectFile> parse(InputStream ins) throws IOException {
         ObjectMapper mapper = new ObjectMapper();
-        @SuppressWarnings("unchecked")
-        List<AnswerCardSubjectFile> list = mapper.readValue(ins, List.class);
+        List<AnswerCardSubjectFile> list = mapper.readValue(ins, new TypeReference<List<AnswerCardSubjectFile>>() {
+        });
         return list;
     }
 }

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/AnswerCardSubjectDao.java

@@ -25,7 +25,7 @@ public interface AnswerCardSubjectDao extends PagingAndSortingRepository<AnswerC
 
     AnswerCardSubject findByExamIdAndSubjectCode(Integer examId, String subjectCode);
 
-    @Query(value = "select count(s) from eb_answer_card e join eb_answer_card_subject s on e.exam_id=s.exam_id and e.number=s.card_number where e.exam_id = ?1 and e.source=?4 and e.code != ?3 and s.subject_code=?2", nativeQuery = true)
+    @Query(value = "select count(s.id) from eb_answer_card e join eb_answer_card_subject s on e.exam_id=s.exam_id and e.number=s.card_number where e.exam_id = ?1 and e.source=?4 and e.code != ?3 and s.subject_code=?2", nativeQuery = true)
     int countByExamIdAndSubjectCodeAndNotAnswerCode(int examId, String subjectCode, String code, CardSource sourse);
 
 }

+ 10 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamSearchQuery.java

@@ -9,6 +9,8 @@ import org.springframework.data.domain.Sort.Direction;
 
 public class ExamSearchQuery extends BaseQuery<Exam> {
 
+    private Integer id;
+
     private String name;
 
     private String code;
@@ -23,6 +25,14 @@ public class ExamSearchQuery extends BaseQuery<Exam> {
         setSort(new Sort(Direction.DESC, "id"));
     }
 
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
     public String getName() {
         return name;
     }

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

@@ -94,7 +94,9 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
             @Override
             public Predicate toPredicate(Root<Exam> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
                 List<Predicate> predicates = new LinkedList<Predicate>();
-
+                if (query.getId() != null) {
+                    predicates.add(cb.equal(root.get("id"), query.getId()));
+                }
                 if (query.getSchoolId() != null) {
                     predicates.add(cb.equal(root.get("schoolId"), query.getSchoolId()));
                 }

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

@@ -895,46 +895,7 @@ public class PaperController extends BaseExamController {
             for (String subjectCode : zipReader.list(false)) {
                 try {
                     if (subjectCode.equalsIgnoreCase("cards")) {
-                        InputStream ins = zipReader.read(subjectCode, "description.json");
-                        List<AnswerCardSubjectFile> courseList = AnswerCardSubjectFile.parse(ins);
-                        for (AnswerCardSubjectFile answerCardSubjectFile : courseList) {
-                            InputStream cardIns = zipReader
-                                    .read(subjectCode, answerCardSubjectFile.getCode() + ".json");
-                            CardFile cardFile = CardFile.parse(cardIns);
-                            if (cardFile.getPages().size() != 1 && cardFile.getPages().size() % 2 != 0) {
-                                error.add("[" + subjectCode + "] 科目代码卡格式解析有误;");
-                            }
-                            byte[] out = cardFile.output();
-                            String md5 = BinaryUtil.encodeMD5(out);
-                            AnswerCard card = answerCardService.findByExamIdAndCode(examId,
-                                    answerCardSubjectFile.getCode());
-                            if (card == null) {
-                                card = new AnswerCard();
-                                card.setExamId(examId);
-                                Integer number = answerCardService.findMaxNumberByExamId(examId) + 1;
-                                card.setNumber(number);
-                            }
-                            card.setMd5(md5);
-                            card.setNeedAdapte(true);
-                            card.setSliceConfig(cardFile.getSliceConfig().toString());
-                            card.setSinglePage(cardFile.getPages().size() == 1);
-                            card.setPaperCount(card.getSinglePage() ? 1 : cardFile.getPages().size() / 2);
-                            card.setSource(CardSource.WEB);
-                            card.setUpdateTime(new Date());
-                            List<String> asList = new ArrayList<String>();
-                            for (AnswerCardSubjectItem item : answerCardSubjectFile.getCourses()) {
-                                ExamSubject subject = subjectService.find(examId, item.getCode());
-                                if (subject == null) {
-                                    error.add("[" + item.getCode() + "] 科目代码不存在;");
-                                }
-                                if (answerCardService.hasSubject(examId, item.getCode(), item.getCode())) {
-                                    error.add("[" + item.getCode() + "] 科目代码已经绑定卡格式;");
-                                } else {
-                                    asList.add(item.getCode());
-                                }
-                            }
-                            answerCardService.save(card, asList);
-                        }
+                        error = this.parseCard(examId, error, zipReader);
                     } else {
                         error = this.parseSubject(examId, subjectCode, error, zipReader);
                     }
@@ -954,6 +915,66 @@ public class PaperController extends BaseExamController {
         return "redirect:/admin/exam/paper";
     }
 
+    private List<String> parseCard(int examId, List<String> error, ZipReader zipReader) throws IOException {
+        InputStream ins = zipReader.read("cards", "description.json");
+        List<AnswerCardSubjectFile> courseList = AnswerCardSubjectFile.parse(ins);
+        for (AnswerCardSubjectFile answerCardSubjectFile : courseList) {
+            try {
+                InputStream cardIns = zipReader.read("cards", answerCardSubjectFile.getCode() + ".json");
+                CardFile cardFile = CardFile.parse(cardIns);
+                if (cardFile.getPages().size() != 1 && cardFile.getPages().size() % 2 != 0) {
+                    error.add("[" + answerCardSubjectFile.getCode() + "] 科目代码卡格式解析有误;");
+                    return error;
+                }
+                byte[] out = cardFile.output();
+                String md5 = BinaryUtil.encodeMD5(out);
+                AnswerCard card = answerCardService.findByExamIdAndCode(examId, answerCardSubjectFile.getCode());
+                if (card == null) {
+                    card = new AnswerCard();
+                    card.setExamId(examId);
+                    Integer number = answerCardService.findMaxNumberByExamId(examId) + 1;
+                    card.setNumber(number);
+                }
+                card.setMd5(md5);
+                card.setNeedAdapte(true);
+                card.setSliceConfig(cardFile.getSliceConfig().toString());
+                card.setSinglePage(cardFile.getPages().size() == 1);
+                card.setPaperCount(card.getSinglePage() ? 1 : cardFile.getPages().size() / 2);
+                card.setSource(CardSource.WEB);
+                card.setUpdateTime(new Date());
+                List<String> asList = new ArrayList<String>();
+                List<ExamSubject> subjects = new ArrayList<ExamSubject>();
+                for (AnswerCardSubjectItem item : answerCardSubjectFile.getCourses()) {
+                    ExamSubject subject = subjectService.find(examId, item.getCode());
+                    if (subject == null) {
+                        error.add("[" + item.getCode() + "] 科目代码不存在;");
+                        return error;
+                    }
+                    if (answerCardService.hasSubject(examId, item.getCode(), item.getCode())) {
+                        error.add("[" + item.getCode() + "] 科目代码已经绑定卡格式;");
+                        return error;
+                    } else {
+                        asList.add(item.getCode());
+                        subject.setSliceConfig(cardFile.getSliceConfig().toString());
+                        subject.setCardType(FormatType.JSON);
+                        subjects.add(subject);
+                    }
+                }
+                answerCardService.save(card, asList);
+                fileService.uploadAnswerCard(new ByteArrayInputStream(out), md5, examId, card.getNumber());
+                for (ExamSubject examSubject : subjects) {
+                    subjectService.save(examSubject);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                log.error("parse zip data error", e);
+                error.add("[" + answerCardSubjectFile.getCode() + "] 科目代码卡格式解析有误;");
+                return error;
+            }
+        }
+        return error;
+    }
+
     private List<String> parseSubject(int examId, String subjectCode, List<String> error, ZipReader zipReader)
             throws Exception {
         ExamSubject subject = subjectService.find(examId, subjectCode);
@@ -969,6 +990,7 @@ public class PaperController extends BaseExamController {
         CardFile cardFile = CardFile.parse(cardIns);
         if (cardFile.getPages().size() != 1 && cardFile.getPages().size() % 2 != 0) {
             error.add("[" + subjectCode + "] 科目代码卡格式解析有误;");
+            return error;
         }
         byte[] out = cardFile.output();
         String md5 = BinaryUtil.encodeMD5(out);

+ 1 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamInfoController.java

@@ -90,6 +90,7 @@ public class ExamInfoController extends BaseApiController {
                         fileService.getFileServer() + fileService.getCardUri(exam.getId(), exam.getCardType()));
             }
             obj.accumulate("sliceConfig", StringUtils.trimToEmpty(exam.getSliceConfig()));
+            obj.accumulate("updateTime", exam.getUpdateTime().getTime());
             array.add(obj);
         }
         return array;

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

@@ -1,3 +1,5 @@
+-- 1.3.14
+
 USE `stmms_ft`;
 
 ALTER TABLE eb_exam_student ADD COLUMN `inspected`	tinyint(1) NOT NULL COMMENT '当前轮次是否已审核';
@@ -9,6 +11,7 @@ UPDATE eb_exam_student set inspected=1,subjective_status='MARKED' where subjecti
 ALTER TABLE eb_exam_subject ADD COLUMN `inspect_round` 	int(11) NOT NULL DEFAULT 1 COMMENT '复核轮数';
 ALTER TABLE eb_inspect_history ADD COLUMN `inspect_round` 	int(11) NOT NULL COMMENT '复核轮数';
 
+-- 更新数据
 UPDATE eb_inspect_history
 INNER JOIN 
 (
@@ -44,7 +47,7 @@ CREATE TABLE `eb_score_verify`
 )  ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='成绩校验';
   
-
+-- 卡格式相关
 ALTER TABLE eb_answer_card ADD COLUMN `dpi` 	int(11) NOT NULL COMMENT 'dpi';
 ALTER TABLE eb_answer_card ADD COLUMN `code` 	varchar(64) NOT NULL COMMENT '混扫代码';
 CREATE TABLE `eb_answer_card_subject` 
@@ -57,4 +60,17 @@ CREATE TABLE `eb_answer_card_subject`
   UNIQUE KEY `index1` (`exam_id`,`card_number`,`subjectCode`)
 )  ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='卡格式科目关联关系';
-  
+
+-- 数据订正
+INSERT INTO `eb_answer_card_subject` (
+	`exam_id`,
+	`subject_code`,
+	`card_number`
+) SELECT
+	b.exam_id,
+	b.subject_code,
+	b.number
+FROM
+	eb_answer_card b
+WHERE
+	b.subject_code is not  NULL;