浏览代码

美术阅卷10月新增需求-新增试评考生导入功能

wangliang 5 年之前
父节点
当前提交
701e1978e3

+ 12 - 3
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/importer/StudentImporter.java

@@ -4,6 +4,7 @@ import cn.com.qmth.stmms.ms.admin.dto.StudentDTO;
 import cn.com.qmth.stmms.ms.admin.service.DataUploadService;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelError;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExportUtils;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -30,11 +31,19 @@ public class StudentImporter {
         return dataUploadService.uploadStudents(workId, isAbsent, file.getInputStream());
     }
 
+    /**
+     * 试评考生导入
+     *
+     * @param workId
+     * @param subject
+     * @param file
+     * @return
+     * @throws Exception
+     */
     @RequestMapping(value = "batchAllForTrial", method = RequestMethod.POST)
-    public List<ExcelError> batchAllForTrial(@RequestParam Long workId,
-                                             @RequestParam(required = false, defaultValue = "false") boolean isAbsent, @RequestParam MultipartFile file)
+    public List<ExcelError> batchAllForTrial(@RequestParam Long workId, @RequestParam Subject subject, @RequestParam MultipartFile file)
             throws Exception {
-        return dataUploadService.uploadStudentsForTrial(workId, isAbsent, file.getInputStream());
+        return dataUploadService.uploadStudentsForTrial(workId, subject, file.getInputStream());
     }
 
     @RequestMapping(method = RequestMethod.GET)

+ 110 - 36
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -11,14 +11,21 @@ import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelError;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelReader;
 import cn.com.qmth.stmms.ms.commons.utils.excel.ExcelReaderHandle;
 import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
-import cn.com.qmth.stmms.ms.core.domain.*;
+import cn.com.qmth.stmms.ms.core.domain.ExamQuestion;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.Student;
+import cn.com.qmth.stmms.ms.core.domain.Work;
+import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
+import com.alibaba.fastjson.JSONObject;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
@@ -82,11 +89,6 @@ public class DataUploadService {
             FileInputStream sheetIn = null;
             FileInputStream slicein = null;
             Student student = studentRepo.findOne(studentId);
-            Work work = workRepo.findOne(student.getWorkId());
-            List<MarkSubject> markSubjectList = work.getSubjects().stream().filter(o -> o.getId().toUpperCase().contains(subject.toString().toUpperCase())).collect(Collectors.toList());
-            if (Objects.isNull(markSubjectList) || markSubjectList.size() == 0) {
-                throw new Exception("当前试卷没有找到" + subject.getName() + "科目信息");
-            }
             if (imageConfig.isImageEnc()) {
                 //保存裁切原图+文件名加密
                 String imageDir = systemConfig.getImageDir() + File.separator + student.getWorkId() + File.separator + subject
@@ -176,8 +178,8 @@ public class DataUploadService {
                 sheetIn = new FileInputStream(savePath + File.separator + student.getExamNumber() + ".jpg");
                 slicein = new FileInputStream(thumbFileName);
             }
-            Paper exist = paperRepo.findByWorkIdAndSubjectAndExamNumberAndTest(student.getWorkId(), subject,
-                    student.getExamNumber(), markSubjectList.get(0).isTest());
+            Paper exist = paperRepo.findByWorkIdAndSubjectAndExamNumber(student.getWorkId(), subject,
+                    student.getExamNumber());
             String sheetMD5 = DigestUtils.md5Hex(sheetIn);
             String sliceMD5 = DigestUtils.md5Hex(slicein);
             sheetIn.close();
@@ -196,7 +198,6 @@ public class DataUploadService {
                 paper.setSheetMD5(sheetMD5);
                 paper.setSliceMD5(sliceMD5);
                 paper.setExamRoom(student.getExamRoom());
-                paper.setTest(markSubjectList.get(0).isTest());
                 paperRepo.save(paper);
                 // 更新科目上传状态
                 /**
@@ -298,6 +299,105 @@ public class DataUploadService {
         return excelErrors;
     }
 
+    /**
+     * 试评考生导入
+     *
+     * @param workId
+     * @param subject
+     * @param inputStream
+     * @return
+     * @throws Exception
+     */
+    @Transactional
+    public List<ExcelError> uploadStudentsForTrial(Long workId, Subject subject, InputStream inputStream) throws Exception {
+        Work work = workRepo.findOne(workId);
+        if (Objects.isNull(work)) {
+            throw new Exception("没有此工作区,请检查workId是否正确");
+        }
+        //更新科目
+        work.getSubjects().stream().filter(o -> o.getId().toUpperCase().contains(subject.toString().toUpperCase()))
+                .collect(Collectors.toList())
+                .forEach(o -> {
+                    o.setTest(TrialEnum.INIT.getId());
+                    markSubjectRepo.save(o);
+                });
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put(String.valueOf(TrialEnum.INIT.getId()), subject);
+        //全量删除全量增加
+        //1.试卷
+        examQuestionRepo.deleteByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.INIT.getId());
+        //2.学生
+        studentRepo.deleteByWorkIdAndTest(workId, jsonObject.toJSONString());
+        //3.paper
+        paperRepo.deleteByWorkIdAndSubjectAndTest(workId, subject, TrialEnum.INIT.getId());
+        ExcelReader excelReader = new ExcelReader(StudentDTO.class);
+        List<ExcelError> excelErrors = excelReader.reader(inputStream, new ExcelReaderHandle() {
+
+            @Override
+            public ExcelError handle(Object obj) throws Exception {
+                try {
+                    StudentDTO dto = (StudentDTO) obj;
+
+                    String examNumber = dto.getExamNumber();
+                    //如果没有设置区域代码,用准考证前2位作为区域代码
+                    String areaCode = null;
+                    if (dto.getAreaCode() == null || dto.getAreaCode().isEmpty()) {
+                        areaCode = examNumber.substring(0, 2);
+                        dto.setAreaCode(areaCode);
+                    }
+                    //复制卷子给试评用
+                    ExamQuestion questionNew = null;
+                    ExamQuestion isExist = examQuestionRepo.findByWorkIdAndSubjectAndAreaCode(workId, subject, dto.getAreaCode());
+                    if (Objects.isNull(isExist)) {
+                        questionNew = new ExamQuestion(dto.getAreaCode(), subject, workId, dto.getAreaName());
+                        questionNew.setTest(TrialEnum.INIT.getId());
+                        examQuestionRepo.save(questionNew);
+                    } else {
+                        questionNew = new ExamQuestion();
+                        BeanUtils.copyProperties(isExist, questionNew);
+                        questionNew.setTest(TrialEnum.INIT.getId());
+                        questionNew.setId(null);
+                        examQuestionRepo.save(questionNew);
+                    }
+                    //复制学生给试评用
+                    Student studentNew = null;
+                    Student student = studentRepo.findByWorkIdAndExamNumberAndTest(workId, dto.getExamNumber(), String.valueOf(TrialEnum.DEFAULT.getId()));
+                    if (student == null) {
+                        throw new Exception("没有学生" + student.getName() + " 信息");
+                    } else {
+                        if (!student.getUploadStatus().contains("SX:1,SC:1,SM:1")) {
+                            throw new Exception("学生" + student.getName() + "未上传完试卷");
+                        }
+                        studentNew = new Student();
+                        BeanUtils.copyProperties(student, studentNew);
+                        studentNew.setId(null);
+                        studentNew.setTest(jsonObject.toJSONString());
+                        studentRepo.save(studentNew);
+                    }
+                    //复制paper
+                    Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumberAndAreaCode(workId, subject, student.getExamNumber(), dto.getAreaCode());
+                    Paper paperNew = new Paper();
+                    BeanUtils.copyProperties(paper, paperNew);
+                    paperNew.setId(null);
+                    paperNew.setTest(TrialEnum.INIT.getId());
+                    Long random = getRandom(studentNew.getWorkId(), studentNew.getExamNumber());
+                    paperNew.setRandomSeq(random);
+                    paperNew.setSecretNumber(new StringBuffer(String.valueOf(subject.ordinal())).append(questionNew.getAreaCode()).append(random).toString());
+                    paperRepo.save(paperNew);
+                } catch (Exception e) {
+                    ExcelError excelError = new ExcelError();
+                    excelError.setExcelErrorType(e.getMessage());
+                    return excelError;
+                }
+                return null;
+            }
+        });
+        if (Objects.nonNull(excelErrors) && excelErrors.size() > 0) {
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        }
+        return excelErrors;
+    }
+
     /**
      * 清空考生数据 有上传数据无法清空
      *
@@ -315,17 +415,11 @@ public class DataUploadService {
 
     @Transactional
     public Paper savePaper(Student student, Subject subject, boolean isManual) throws Exception {
-        Work work = workRepo.findOne(student.getWorkId());
-        List<MarkSubject> markSubjectList = work.getSubjects().stream().filter(o -> o.getId().toUpperCase().contains(subject.toString().toUpperCase())).collect(Collectors.toList());
-        if (Objects.isNull(markSubjectList) || markSubjectList.size() == 0) {
-            throw new Exception("当前试卷没有找到" + subject.getName() + "科目信息");
-        }
         ExamQuestion examQuestion = examQuestionRepo.findByWorkIdAndSubjectAndAreaCode(student.getWorkId(), subject, student.getAreaCode());
-        Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumberAndTest(student.getWorkId(), subject, student.getExamNumber(), markSubjectList.get(0).isTest());
+        Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumber(student.getWorkId(), subject, student.getExamNumber());
         if (paper == null) {
             Long random = getRandom(student.getWorkId(), student.getExamNumber());
             paper = new Paper(student.getWorkId(), null, subject, examQuestion, student, isManual, random);
-            paper.setTest(markSubjectList.get(0).isTest());
         }
         paper.setUploadedOn(new Date());
         paper.setManual(isManual);
@@ -414,24 +508,4 @@ public class DataUploadService {
         }
         return true;
     }
-
-    /**
-     * 上传试评学生
-     *
-     * @param workId
-     * @param isAbsent
-     * @param inputStream
-     * @return
-     */
-    @Transactional
-    public List<ExcelError> uploadStudentsForTrial(Long workId, final boolean isAbsent, InputStream inputStream) throws Exception {
-        studentRepo.deleteByWorkId(workId);
-        List<ExcelError> excelErrors = uploadStudents(workId, isAbsent, inputStream);
-        if (Objects.nonNull(excelErrors) && excelErrors.size() == 0) {
-            Work work = workRepo.findOne(workId);
-            work.getSubjects().forEach(o -> o.setTest(true));
-            markSubjectRepo.save(work.getSubjects());
-        }
-        return excelErrors;
-    }
 }

+ 3 - 2
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/TrialService.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.ms.admin.service;
 
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
 import cn.com.qmth.stmms.ms.core.domain.Work;
+import cn.com.qmth.stmms.ms.core.domain.enums.TrialEnum;
 import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -48,12 +49,12 @@ public class TrialService {
         AtomicBoolean deleteStu = new AtomicBoolean(false);
         work.getSubjects().forEach(o -> {
             if (o.getId().toUpperCase().contains(subject.toString().toUpperCase())) {
-                o.setTest(false);
+                o.setTest(TrialEnum.DEFAULT.getId());
                 o.setStage(MarkStage.INIT);
                 o.setTotalScore(0);
                 o.setSampleCount(0);
             }
-            if (!o.isTest()) {
+            if (o.getTest() == TrialEnum.DEFAULT.getId()) {
                 deleteStu.set(true);
             } else {
                 deleteStu.set(false);

+ 1 - 1
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/excel/ExcelReaderHandle.java

@@ -2,6 +2,6 @@ package cn.com.qmth.stmms.ms.commons.utils.excel;
 
 public interface ExcelReaderHandle {
 	
-	ExcelError handle(Object dto);
+	ExcelError handle(Object dto) throws Exception;
 
 }

+ 13 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/ExamQuestion.java

@@ -34,7 +34,19 @@ public class ExamQuestion implements Serializable{
     
     private String areaName;
 
-    public ExamQuestion(String areaCode, Subject subject,Long workId,String areaName) {
+    @Basic
+    @Column(name = "is_test")
+    private int test; //是否试评,0:不是,1:数据已导入,2:试评中
+
+    public int getTest() {
+        return test;
+    }
+
+    public void setTest(int test) {
+        this.test = test;
+    }
+
+    public ExamQuestion(String areaCode, Subject subject, Long workId, String areaName) {
         this.areaCode = areaCode;
         this.name = subject.getName() + this.areaCode;
         this.subject = subject;

+ 3 - 3
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkSubject.java

@@ -39,17 +39,17 @@ public class MarkSubject implements Serializable{
 
     @Basic
     @Column(name = "is_test")
-    private boolean test; //是否试评(false:不是,true:是)
+    private int test; //是否试评,0:不是,1:数据已导入,2:试评中
 
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
 
-    public boolean isTest() {
+    public int getTest() {
         return test;
     }
 
-    public void setTest(boolean test) {
+    public void setTest(int test) {
         this.test = test;
     }
 

+ 3 - 3
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java

@@ -124,17 +124,17 @@ public class Paper implements Serializable {
 
     @Basic
     @Column(name = "is_test")
-    private boolean test; //是否试评(false:不是,true:是)
+    private int test; //是否试评,0:不是,1:数据已导入,2:试评中
 
     @Basic
     @Column(name = "is_active")
     private boolean active; //是否激活(false:不是,true:是)
 
-    public boolean isTest() {
+    public int getTest() {
         return test;
     }
 
-    public void setTest(boolean test) {
+    public void setTest(int test) {
         this.test = test;
     }
 

+ 16 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Student.java

@@ -44,6 +44,22 @@ public class Student implements Serializable {
      */
     private String uploadStatus = "SX:0,SC:0,SM:0";
 
+    @Basic
+    @Column(name = "is_test")
+    private String test; //是否试评,0:不是,1:数据已导入,2:试评中
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public String getTest() {
+        return test;
+    }
+
+    public void setTest(String test) {
+        this.test = test;
+    }
+
     public Student(String name, String examNumber, String areaName, String areaCode, Long workId, String examRoom, String sourceName) {
         this.name = name;
         this.examNumber = examNumber;

+ 83 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/enums/TrialEnum.java

@@ -0,0 +1,83 @@
+package cn.com.qmth.stmms.ms.core.domain.enums;
+
+import java.util.Objects;
+
+/**
+ * @Description: 试评 enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/11/5
+ */
+public enum TrialEnum {
+
+    /**
+     * 不是试评
+     */
+    DEFAULT(0, "不是试评"),
+    /**
+     * 初始化试评数据
+     */
+    INIT(1, "初始化试评数据"),
+    /**
+     * 开始试评
+     */
+    START_TRIAL(2, "开始试评");
+
+    private int id;
+
+    private String name;
+
+    private TrialEnum(int id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * 状态转换 toId
+     *
+     * @param value
+     * @return
+     */
+    public static int convertToId(String value) {
+        if (Objects.equals(value.trim(), DEFAULT.name)) {
+            return DEFAULT.getId();
+        } else if (Objects.equals(value.trim(), INIT.name)) {
+            return INIT.getId();
+        } else {
+            return START_TRIAL.getId();
+        }
+    }
+
+    /**
+     * 状态转换 toName
+     *
+     * @param id
+     * @return
+     */
+    public static String convertToName(int id) {
+        if (id == DEFAULT.getId()) {
+            return DEFAULT.name;
+        } else if (id == INIT.getId()) {
+            return INIT.name;
+        } else {
+            return START_TRIAL.name;
+        }
+    }
+}

+ 12 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTask.java

@@ -75,6 +75,18 @@ public class MarkTask implements Serializable {
 
     private Long randomSeqNew;
 
+    @Basic
+    @Column(name = "is_test")
+    private int test; //是否试评,0:不是,1:数据已导入,2:试评中
+
+    public int getTest() {
+        return test;
+    }
+
+    public void setTest(int test) {
+        this.test = test;
+    }
+
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }

+ 8 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/ExamQuestionRepo.java

@@ -17,10 +17,17 @@ public interface ExamQuestionRepo extends JpaRepository<ExamQuestion, Long> {
 
     long countByWorkIdAndAreaCode(Long workId, String areaCode);
 
+    List<ExamQuestion> findByWorkIdAndAreaCode(Long workId, String areaCode);
+
     ExamQuestion findByWorkIdAndSubjectAndAreaCode(Long workId,
                                                    Subject subject, String areaCode);
 
+    ExamQuestion findByWorkIdAndSubjectAndAreaCodeAndTest(Long workId,
+                                                          Subject subject, String areaCode, String test);
+
     void deleteByWorkId(Long workId);
 
-    List<ExamQuestion> findAllByAreaCodeAndSubjectAndWorkId(String areaCode, Subject subject,Long workId);
+    void deleteByWorkIdAndSubjectAndTest(Long workId, Subject subject, int test);
+
+    List<ExamQuestion> findAllByAreaCodeAndSubjectAndWorkId(String areaCode, Subject subject, Long workId);
 }

+ 6 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java

@@ -124,6 +124,8 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
      */
     Paper findByWorkIdAndSubjectAndExamNumber(Long workId, Subject subject, String examNumber);
 
+    Paper findByWorkIdAndSubjectAndExamNumberAndAreaCode(Long workId, Subject subject, String examNumber, String areaCode);
+
     /**
      * 根据条件查询指定试卷
      *
@@ -133,7 +135,7 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
      * @param test
      * @return
      */
-    Paper findByWorkIdAndSubjectAndExamNumberAndTest(Long workId, Subject subject, String examNumber, boolean test);
+    Paper findByWorkIdAndSubjectAndExamNumberAndTest(Long workId, Subject subject, String examNumber, int test);
 
     /**
      * 查询同一个考生的paper
@@ -164,6 +166,7 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     /**
      * 根据条件查找paper
+     *
      * @param workId
      * @param subject
      * @param test
@@ -192,6 +195,8 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
     long countByWorkIdAndSubjectAndQuestionId(Long workId, Subject subject,
                                               Long id);
 
+    void deleteByWorkIdAndSubjectAndTest(Long workId, Subject subject, int test);
+
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 
 }

+ 5 - 3
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/StudentRepo.java

@@ -1,11 +1,9 @@
 package cn.com.qmth.stmms.ms.core.repository;
 
+import cn.com.qmth.stmms.ms.core.domain.Student;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-
-import cn.com.qmth.stmms.ms.core.domain.Student;
 import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
 
 import java.util.List;
 
@@ -17,10 +15,14 @@ public interface StudentRepo extends JpaRepository<Student, Long>, JpaSpecificat
 
     Student findByWorkIdAndExamNumber(Long workId, String examNumber);
 
+    Student findByWorkIdAndExamNumberAndTest(Long workId, String examNumber,String test);
+
     void deleteByWorkId(Long workId);
 
     List<Student> findByWorkId(Long workId);
 
     @Query(value = "select s.exam_number, s.name, s.area_name , s.area_code, s.exam_room, s.source_name from paper p join student s on p.work_id = s.work_id and p.exam_number = s.exam_number and p.area_code = s.area_code where p.work_id = ? and p.subject = ? and p.is_missing = true", nativeQuery = true)
     List<Object[]> listMissingBySubject(Long workId, String subject);
+
+    void deleteByWorkIdAndTest(Long workId,String test);
 }