소스 검색

导入数据包支持混扫扩展

ting.yin 1 년 전
부모
커밋
ad7c911538

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

@@ -0,0 +1,50 @@
+package cn.com.qmth.stmms.biz.common.domain.card;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * 卡格式文件内容结构
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class AnswerCardSubjectFile {
+
+    private String code;
+
+    private List<AnswerCardSubjectItem> courses = Collections.emptyList();
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public List<AnswerCardSubjectItem> getCourses() {
+        return courses;
+    }
+
+    public void setCourses(List<AnswerCardSubjectItem> courses) {
+        this.courses = courses;
+    }
+
+    /**
+     * 从输入流解析卡格式文件
+     *
+     * @param ins
+     * @return
+     * @throws IOException
+     */
+    public static List<AnswerCardSubjectFile> parse(InputStream ins) throws IOException {
+        ObjectMapper mapper = new ObjectMapper();
+        @SuppressWarnings("unchecked")
+        List<AnswerCardSubjectFile> list = mapper.readValue(ins, List.class);
+        return list;
+    }
+}

+ 31 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/common/domain/card/AnswerCardSubjectItem.java

@@ -0,0 +1,31 @@
+package cn.com.qmth.stmms.biz.common.domain.card;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+/**
+ * 卡格式文件内容结构
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class AnswerCardSubjectItem {
+
+    private String code;
+
+    private String name;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+}

+ 3 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/AnswerCardDao.java

@@ -22,4 +22,7 @@ public interface AnswerCardDao extends PagingAndSortingRepository<AnswerCard, An
     @Query(value = "select e.* from eb_answer_card e left 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=?2 and e.code is null and s.subject_code=?2", nativeQuery = true)
     AnswerCard findByExamIdAndSubjectCodeAndCodeIsNull(Integer examId, String subjectCode, CardSource source);
 
+    @Query("select s from AnswerCard s where s.pk.examId=?1 and s.code=?2")
+    AnswerCard findByExamIdAndCode(Integer examId, String code);
+
 }

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

@@ -8,6 +8,7 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
 import cn.com.qmth.stmms.biz.exam.model.AnswerCardSubject;
+import cn.com.qmth.stmms.common.enums.CardSource;
 
 public interface AnswerCardSubjectDao extends PagingAndSortingRepository<AnswerCardSubject, Integer>,
         JpaSpecificationExecutor<AnswerCardSubject> {
@@ -24,4 +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)
+    int countByExamIdAndSubjectCodeAndNotAnswerCode(int examId, String subjectCode, String code, CardSource sourse);
+
 }

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

@@ -16,10 +16,16 @@ public interface AnswerCardService {
 
     void save(AnswerCard card, String subjectCode);
 
+    void save(AnswerCard card, List<String> subjectCode);
+
     void delete(AnswerCard card);
 
     AnswerCard findByExamIdAndSubjectCode(Integer examId, String subjectCode, CardSource source);
 
     List<AnswerCardSubject> getSubjectByExamIdAndNumber(Integer examId, Integer number);
 
+    AnswerCard findByExamIdAndCode(Integer examId, String code);
+
+    boolean hasSubject(int examId, String code, String subjectCode);
+
 }

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

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
@@ -77,4 +78,32 @@ public class AnswerCardServiceImpl extends BaseQueryService<AnswerCard> implemen
     public List<AnswerCardSubject> getSubjectByExamIdAndNumber(Integer examId, Integer number) {
         return cardSubjectDao.findByExamIdAndCardNumber(examId, number);
     }
+
+    @Override
+    public AnswerCard findByExamIdAndCode(Integer examId, String code) {
+        return cardDao.findByExamIdAndCode(examId, code);
+    }
+
+    @Transactional
+    @Override
+    public void save(AnswerCard card, List<String> subjectCodeList) {
+        if (!subjectCodeList.isEmpty()) {
+            cardSubjectDao.deleteByExamIdAndCardNumber(card.getExamId(), card.getNumber());
+            List<AnswerCardSubject> list = new ArrayList<AnswerCardSubject>();
+            for (String subjectCode : subjectCodeList) {
+                if (StringUtils.isNotBlank(subjectCode)) {
+                    AnswerCardSubject answerCardSubject = new AnswerCardSubject(card.getExamId(), card.getNumber(),
+                            subjectCode);
+                    list.add(answerCardSubject);
+                }
+            }
+            cardSubjectDao.save(list);
+        }
+        this.cardDao.save(card);
+    }
+
+    @Override
+    public boolean hasSubject(int examId, String code, String subjectCode) {
+        return cardSubjectDao.countByExamIdAndSubjectCodeAndNotAnswerCode(examId, subjectCode, code, CardSource.WEB) > 0;
+    }
 }

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

@@ -49,6 +49,8 @@ import cn.com.qmth.stmms.admin.thread.ScoreCalculateThread;
 import cn.com.qmth.stmms.admin.thread.ScoreReportThread;
 import cn.com.qmth.stmms.admin.vo.StructFile;
 import cn.com.qmth.stmms.admin.vo.StructQuestion;
+import cn.com.qmth.stmms.biz.common.domain.card.AnswerCardSubjectFile;
+import cn.com.qmth.stmms.biz.common.domain.card.AnswerCardSubjectItem;
 import cn.com.qmth.stmms.biz.common.domain.card.CardFile;
 import cn.com.qmth.stmms.biz.exam.model.AnswerCard;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
@@ -892,88 +894,49 @@ public class PaperController extends BaseExamController {
             ZipReader zipReader = new ZipReader(target);
             for (String subjectCode : zipReader.list(false)) {
                 try {
-                    ExamSubject subject = subjectService.find(examId, subjectCode);
-                    if (subject == null) {
-                        error.add("[" + subjectCode + "] 科目代码不存在;");
-                        continue;
-                    }
-                    if (subject.getTotalScore() != 0) {
-                        error.add("[" + subjectCode + "] 科目代码已经存在题目;");
-                        continue;
-                    }
-                    InputStream cardIns = zipReader.read(subjectCode, "card.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.findByExamIdAndSubjectCode(examId, subject.getCode(),
-                            CardSource.WEB);
-                    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());
-                    answerCardService.save(card, subjectCode);
-
-                    fileService.uploadAnswerCard(new ByteArrayInputStream(out), md5, examId, card.getNumber());
-                    subject.setSliceConfig(cardFile.getSliceConfig().toString());
-                    subject.setCardType(FormatType.JSON);
-                    subjectService.save(subject);
-
-                    InputStream structIns = zipReader.read(subjectCode, "struct.json");
-                    StructFile structFile = StructFile.parse(structIns);
-                    if (!structFile.getObjective().isEmpty()) {
-                        List<ExamQuestion> oList = new ArrayList<ExamQuestion>();
-                        for (StructQuestion structQuestion : structFile.getObjective()) {
-                            ExamQuestion q = structQuestion.transform();
-                            q.setPaperType(structFile.getPaperType());
-                            q.setExamId(examId);
-                            q.setSubjectCode(subject.getCode());
-                            q.setObjective(true);
-                            oList.add(q);
-                        }
-                        questionService.save(oList);
-                        examService.updateObjectiveStatus(examId, ObjectiveStatus.WAITING);
-                        subjectService.updateScore(examId, subject.getCode(), true,
-                                questionService.sumTotalScore(examId, subject.getCode(), true));
-                    }
-                    if (!structFile.getSubjective().isEmpty()) {
-                        List<ExamQuestion> sList = new ArrayList<ExamQuestion>();
-                        Map<Integer, Double> mainMap = new HashMap<Integer, Double>();
-                        for (StructQuestion structQuestion : structFile.getSubjective()) {
-                            ExamQuestion q = structQuestion.transform();
-                            q.setPaperType(structFile.getPaperType());
-                            q.setExamId(examId);
-                            q.setSubjectCode(subject.getCode());
-                            q.setObjective(false);
-                            q.setGroupNumber(q.getMainNumber());
-                            sList.add(q);
-                            Double totalScore = mainMap.get(q.getMainNumber());
-                            if (totalScore == null) {
-                                mainMap.put(q.getMainNumber(), q.getTotalScore());
-                            } else {
-                                mainMap.put(q.getMainNumber(), totalScore + q.getTotalScore());
+                    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);
                         }
-                        questionService.save(sList);
-                        for (Integer number : mainMap.keySet()) {
-                            MarkGroup group = new MarkGroup(examId, subject.getCode(), number, null,
-                                    mainMap.get(number), null, null, null, null, 0, false, false, null, false);
-                            group.setPicList(cardFile.getMarkConfigAdd(cardFile.getMarkConfig(number), 0.015));
-                            groupService.save(group);
-                        }
-                        subjectService.updateScore(examId, subject.getCode(), false,
-                                questionService.sumTotalScore(examId, subject.getCode(), false));
+                    } else {
+                        error = this.parseSubject(examId, subjectCode, error, zipReader);
                     }
                 } catch (Exception e) {
                     log.error("parse zip data error", e);
@@ -990,4 +953,92 @@ public class PaperController extends BaseExamController {
         }
         return "redirect:/admin/exam/paper";
     }
+
+    private List<String> parseSubject(int examId, String subjectCode, List<String> error, ZipReader zipReader)
+            throws Exception {
+        ExamSubject subject = subjectService.find(examId, subjectCode);
+        if (subject == null) {
+            error.add("[" + subjectCode + "] 科目代码不存在;");
+            return error;
+        }
+        if (subject.getTotalScore() != 0) {
+            error.add("[" + subjectCode + "] 科目代码已经存在题目;");
+            return error;
+        }
+        InputStream cardIns = zipReader.read(subjectCode, "card.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.findByExamIdAndSubjectCode(examId, subject.getCode(), CardSource.WEB);
+        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());
+        answerCardService.save(card, subjectCode);
+
+        fileService.uploadAnswerCard(new ByteArrayInputStream(out), md5, examId, card.getNumber());
+        subject.setSliceConfig(cardFile.getSliceConfig().toString());
+        subject.setCardType(FormatType.JSON);
+        subjectService.save(subject);
+
+        InputStream structIns = zipReader.read(subjectCode, "struct.json");
+        StructFile structFile = StructFile.parse(structIns);
+        if (!structFile.getObjective().isEmpty()) {
+            List<ExamQuestion> oList = new ArrayList<ExamQuestion>();
+            for (StructQuestion structQuestion : structFile.getObjective()) {
+                ExamQuestion q = structQuestion.transform();
+                q.setPaperType(structFile.getPaperType());
+                q.setExamId(examId);
+                q.setSubjectCode(subject.getCode());
+                q.setObjective(true);
+                oList.add(q);
+            }
+            questionService.save(oList);
+            examService.updateObjectiveStatus(examId, ObjectiveStatus.WAITING);
+            subjectService.updateScore(examId, subject.getCode(), true,
+                    questionService.sumTotalScore(examId, subject.getCode(), true));
+        }
+        if (!structFile.getSubjective().isEmpty()) {
+            List<ExamQuestion> sList = new ArrayList<ExamQuestion>();
+            Map<Integer, Double> mainMap = new HashMap<Integer, Double>();
+            for (StructQuestion structQuestion : structFile.getSubjective()) {
+                ExamQuestion q = structQuestion.transform();
+                q.setPaperType(structFile.getPaperType());
+                q.setExamId(examId);
+                q.setSubjectCode(subject.getCode());
+                q.setObjective(false);
+                q.setGroupNumber(q.getMainNumber());
+                sList.add(q);
+                Double totalScore = mainMap.get(q.getMainNumber());
+                if (totalScore == null) {
+                    mainMap.put(q.getMainNumber(), q.getTotalScore());
+                } else {
+                    mainMap.put(q.getMainNumber(), totalScore + q.getTotalScore());
+                }
+            }
+            questionService.save(sList);
+            for (Integer number : mainMap.keySet()) {
+                MarkGroup group = new MarkGroup(examId, subject.getCode(), number, null, mainMap.get(number), null,
+                        null, null, null, 0, false, false, null, false);
+                group.setPicList(cardFile.getMarkConfigAdd(cardFile.getMarkConfig(number), 0.015));
+                groupService.save(group);
+            }
+            subjectService.updateScore(examId, subject.getCode(), false,
+                    questionService.sumTotalScore(examId, subject.getCode(), false));
+        }
+        return error;
+    }
+
 }