ting.yin 3 роки тому
батько
коміт
594b6263ea

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

@@ -0,0 +1,21 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+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 AnswerCardDao extends PagingAndSortingRepository<AnswerCard, AnswerCardPK>,
+        JpaSpecificationExecutor<AnswerCard> {
+
+    @Query("select s from AnswerCard s where s.pk.examId=?1 and s.pk.number=?2")
+    AnswerCard findByExamIdAndNumber(Integer examId, Integer number);
+
+    @Query("select q from AnswerCard q where q.pk.examId=?1 order by q.pk.number")
+    List<AnswerCard> findByExamId(Integer examId);
+
+}

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

@@ -1,12 +0,0 @@
-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> {
-
-}

+ 16 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/AnswerCard.java

@@ -46,12 +46,24 @@ public class AnswerCard implements Serializable {
     @Column(name = "update_time")
     private Date updateTime;
 
-    public AnswerCardPK getPk() {
-        return pk;
+    public AnswerCard() {
+        this.pk = new AnswerCardPK();
     }
 
-    public void setPk(AnswerCardPK pk) {
-        this.pk = pk;
+    public Integer getExamId() {
+        return pk.getExamId();
+    }
+
+    public void setExamId(Integer examId) {
+        pk.setExamId(examId);
+    }
+
+    public Integer getNumber() {
+        return pk.getNumber();
+    }
+
+    public void setNumber(Integer number) {
+        pk.setNumber(number);
     }
 
     public String getSubjectCode() {

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

@@ -16,6 +16,10 @@ public class AnswerCardPK implements Serializable {
     @Column(name = "number", nullable = false)
     private Integer number;
 
+    public AnswerCardPK() {
+
+    }
+
     public Integer getExamId() {
         return examId;
     }

+ 14 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java

@@ -150,6 +150,12 @@ public class Exam implements Serializable {
     @Column(name = "sheet_view", nullable = false)
     private boolean sheetView;
 
+    /**
+     * 扫描配置
+     */
+    @Column(name = "scan_config", nullable = true)
+    private String scanConfig;
+
     public Integer getId() {
         return id;
     }
@@ -362,4 +368,12 @@ public class Exam implements Serializable {
         this.sheetView = sheetView;
     }
 
+    public String getScanConfig() {
+        return scanConfig;
+    }
+
+    public void setScanConfig(String scanConfig) {
+        this.scanConfig = scanConfig;
+    }
+
 }

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

@@ -1,5 +1,19 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.exam.model.AnswerCard;
+
 public interface AnswerCardService {
 
+    List<AnswerCard> findByExamId(Integer examId);
+
+    AnswerCard findByExamIdAndNumber(Integer examId, Integer number);
+
+    int findMaxNumberByExamId(Integer examId);
+
+    void save(AnswerCard card);
+
+    void delete(AnswerCard card);
+
 }

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

@@ -1,10 +1,13 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
+import java.util.List;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
-import cn.com.qmth.stmms.biz.exam.dao.ExamCardDao;
+import cn.com.qmth.stmms.biz.exam.dao.AnswerCardDao;
 import cn.com.qmth.stmms.biz.exam.model.AnswerCard;
 import cn.com.qmth.stmms.biz.exam.service.AnswerCardService;
 
@@ -12,6 +15,39 @@ import cn.com.qmth.stmms.biz.exam.service.AnswerCardService;
 public class AnswerCardServiceImpl extends BaseQueryService<AnswerCard> implements AnswerCardService {
 
     @Autowired
-    private ExamCardDao cardDao;
+    private AnswerCardDao cardDao;
+
+    @Override
+    public AnswerCard findByExamIdAndNumber(Integer examId, Integer number) {
+        return cardDao.findByExamIdAndNumber(examId, number);
+    }
+
+    @Override
+    public int findMaxNumberByExamId(Integer examId) {
+        List<AnswerCard> cards = this.findByExamId(examId);
+        int number = 0;
+        for (AnswerCard card : cards) {
+            if (number < card.getNumber()) {
+                number = card.getNumber();
+            }
+        }
+        return number;
+    }
+
+    @Override
+    public List<AnswerCard> findByExamId(Integer examId) {
+        return cardDao.findByExamId(examId);
+    }
+
+    @Transactional
+    @Override
+    public void save(AnswerCard card) {
+        this.cardDao.save(card);
+    }
 
+    @Transactional
+    @Override
+    public void delete(AnswerCard card) {
+        this.cardDao.delete(card);
+    }
 }

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/enums/FileType.java

@@ -7,7 +7,7 @@ public enum FileType {
 
     SHEET("原图", "sheet/%d/%s/%s-%d.%s"), SLICE("裁切图", "slice/%d/%s/%s-%d.%s"), JSON("作答内容", "json/%d/%s/%s.%s"), PACKAGE(
             "签到表", "package/%d/%s/%d.%s"), PAPER("试卷", "paper/%d/%s.%s"), ANSWER("标答", "answer/%d/%s.%s"), CARD("题卡",
-            "card/%d/%s.%s"), EXCHANGE("文件", "exchange/%s");
+            "card/%d/%s.%s"), EXCHANGE("文件", "exchange/%s"), ANSWER_CARD("题卡", "card/answer/%d/%s.%s");
 
     private String name;
 

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

@@ -67,4 +67,8 @@ public interface FileService {
 
     byte[] downloadJson(int examId, String secretNumber) throws Exception;
 
+    void uploadAnswerCard(InputStream inputStream, String md5, int examId, int number) throws Exception;
+
+    String getAnswerCardUri(int examId, int number);
+
 }

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

@@ -297,6 +297,16 @@ public class FileServiceImpl implements FileService, InitializingBean, Disposabl
         return FileType.EXCHANGE.getPath(name);
     }
 
+    @Override
+    public void uploadAnswerCard(InputStream ins, String md5, int examId, int number) throws Exception {
+        store.write(getAnswerCardUri(examId, number), ins, md5);
+    }
+
+    @Override
+    public String getAnswerCardUri(int examId, int number) {
+        return FileType.ANSWER_CARD.getPath(examId, number, FormatType.ZIP);
+    }
+
     public static void main(String[] args) throws Exception {
         FileServiceImpl service = new FileServiceImpl();
         // service.fileServerString = "123";
@@ -313,4 +323,5 @@ public class FileServiceImpl implements FileService, InitializingBean, Disposabl
         service.downloadSheet(1, "16110003", 1);
         System.out.println("success");
     }
+
 }

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

@@ -3,7 +3,7 @@ package cn.com.qmth.stmms.common.enums;
 public enum Role {
 
     SYS_ADMIN("系统管理员", 1), SCHOOL_ADMIN("学校管理员", 2), SCANNER("扫描员", 3), SUBJECT_HEADER("科组长", 4), MARKER("评卷员", 5), SCHOOL_VIEWER(
-            "学校查询员", 6), SCHOOL_DEV("学校接口调用", 7), INSPECTOR("复核员", 8);
+            "学校查询员", 6), SCHOOL_DEV("学校接口调用", 7), INSPECTOR("复核员", 8), SCAN_ADMIN("扫描管理员", 2);
 
     private String name;
 

+ 126 - 118
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CardController.java

@@ -1,8 +1,9 @@
 package cn.com.qmth.stmms.api.controller;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
-import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -20,32 +21,23 @@ 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.AnswerCard;
 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.AnswerCardService;
 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.CardSource;
 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.DateUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
-import com.google.common.io.ByteStreams;
-
 @Controller("cardController")
 @RequestMapping("/api/card")
 public class CardController extends BaseApiController {
@@ -62,109 +54,125 @@ public class CardController extends BaseApiController {
     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)));
-    // }
+    private AnswerCardService answerCardService;
+
+    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 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;
+    }
+
+    @RequestMapping(value = "/answer/save", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN })
+    @ResponseBody
+    public JSONObject answerCardSave(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam(required = false) Integer number, @RequestParam(required = false) String subjectCode,
+            @RequestParam String source, @RequestParam Integer paperCount, @RequestParam Boolean singlePage,
+            @RequestParam Boolean needAdapte, @RequestParam(required = false) String parameter,
+            @RequestParam(required = false) String remark, @RequestParam String md5, @RequestParam MultipartFile file) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        subjectCode = StringUtils.trimToNull(subjectCode);
+        validateExam(au, examId, ExamType.SCAN_IMAGE);
+        if (subjectCode != null) {
+            validateExamSubject(examId, subjectCode);
+        }
+        try {
+            if (number != null) {
+                fileService.uploadAnswerCard(file.getInputStream(), md5, examId, number);
+            } else {
+                number = answerCardService.findMaxNumberByExamId(examId) + 1;
+                fileService.uploadAnswerCard(file.getInputStream(), md5, examId, number);
+            }
+            AnswerCard card = answerCardService.findByExamIdAndNumber(examId, number);
+            if (card == null) {
+                card = new AnswerCard();
+                card.setExamId(examId);
+                card.setNumber(number);
+            }
+            card.setNeedAdapte(needAdapte);
+            card.setPaperCount(paperCount);
+            card.setParameter(parameter);
+            card.setRemark(remark);
+            card.setSinglePage(singlePage);
+            card.setSource(CardSource.valueOf(source));
+            card.setSubjectCode(subjectCode);
+            card.setUpdateTime(new Date());
+            answerCardService.save(card);
+            JSONObject result = new JSONObject();
+            result.accumulate("number", number);
+            result.accumulate("updateTime", DateUtils.formatDateTime(new Date()));
+            return result;
+        } catch (Exception e) {
+            log.error("card upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("card upload error: " + e.getMessage());
+        }
+    }
+
+    @RequestMapping(value = "/answer/query", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCAN_ADMIN })
+    @ResponseBody
+    public JSONArray answerQuery(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam(required = false) Integer number) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        validateExam(au, examId, ExamType.SCAN_IMAGE);
+        JSONArray array = new JSONArray();
+        List<AnswerCard> cards = new ArrayList<AnswerCard>();
+        if (number == null) {
+            cards = answerCardService.findByExamId(examId);
+        } else {
+            cards.add(answerCardService.findByExamIdAndNumber(examId, number));
+        }
+        for (AnswerCard answerCard : cards) {
+            JSONObject result = new JSONObject();
+            result.accumulate("examId", answerCard.getExamId());
+            result.accumulate("number", answerCard.getNumber());
+            result.accumulate("subjectCode", StringUtils.trimToEmpty(answerCard.getSubjectCode()));
+            if (answerCard.getSubjectCode() != null) {
+                ExamSubject subject = subjectService.find(examId, answerCard.getSubjectCode());
+                result.accumulate("subjectName", subject.getName());
+            } else {
+                result.accumulate("subjectName", "");
+            }
+            result.accumulate("paperCount", answerCard.getPaperCount() == null ? "" : answerCard.getPaperCount());
+            result.accumulate("path", answerCard.getNumber());
+            result.accumulate("source", answerCard.getSource().toString());
+            result.accumulate("parameter", answerCard.getParameter());
+            result.accumulate("singlePage", answerCard.getSinglePage());
+            result.accumulate("remark", StringUtils.trimToEmpty(answerCard.getRemark()));
+            result.accumulate("updateTime", answerCard.getUpdateTime().getTime());
+            array.add(result);
+        }
+        return array;
+    }
+
+    @RequestMapping(value = "/answer/delete", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN })
+    @ResponseBody
+    public JSONObject answerDelete(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam Integer number) {
+        ApiUser au = RequestUtils.getApiUser(request);
+        validateExam(au, examId, ExamType.SCAN_IMAGE);
+        AnswerCard card = answerCardService.findByExamIdAndNumber(examId, number);
+        if (card == null) {
+            throw ApiException.QUERY_PARAM_ERROR.appendMessage(": number error");
+        }
+        answerCardService.delete(card);
+        JSONObject result = new JSONObject();
+        result.accumulate("updateTime", System.currentTimeMillis());
+        return result;
+    }
 
 }