Эх сурвалжийг харах

美术阅卷10月新增需求-新增试评功能

wangliang 5 жил өмнө
parent
commit
0a3aa9b4f5

+ 35 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/TrialController.java

@@ -0,0 +1,35 @@
+package cn.com.qmth.stmms.ms.admin.api;
+
+import cn.com.qmth.stmms.ms.admin.service.TrialService;
+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;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description: 试评任务controller
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/11/4
+ */
+@RestController
+@RequestMapping("api/trial")
+public class TrialController {
+
+    @Autowired
+    TrialService trialService;
+
+    /**
+     * 删除试评任务,保留标准卷
+     *
+     * @param workId
+     * @param subject
+     */
+    @RequestMapping(value = "finishTrial", method = RequestMethod.GET)
+    public void finishTrial(@RequestParam Long workId, @RequestParam Subject subject) {
+        trialService.finishTrial(workId, subject);
+    }
+}

+ 22 - 17
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/importer/StudentImporter.java

@@ -1,11 +1,9 @@
 package cn.com.qmth.stmms.ms.admin.importer;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletResponse;
-
+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 org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -13,10 +11,10 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
-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 javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 @RestController
 @RequestMapping("import/students")
@@ -27,15 +25,22 @@ public class StudentImporter {
 
     @RequestMapping(method = RequestMethod.POST)
     public List<ExcelError> batchAll(@RequestParam Long workId,
-            @RequestParam(required = false, defaultValue = "false") boolean isAbsent, @RequestParam MultipartFile file)
+                                     @RequestParam(required = false, defaultValue = "false") boolean isAbsent, @RequestParam MultipartFile file)
             throws IOException {
         return dataUploadService.uploadStudents(workId, isAbsent, file.getInputStream());
     }
-    
+
+    @RequestMapping(value = "batchAllForTrial", method = RequestMethod.POST)
+    public List<ExcelError> batchAllForTrial(@RequestParam Long workId,
+                                             @RequestParam(required = false, defaultValue = "false") boolean isAbsent, @RequestParam MultipartFile file)
+            throws Exception {
+        return dataUploadService.uploadStudentsForTrial(workId, isAbsent, file.getInputStream());
+    }
+
     @RequestMapping(method = RequestMethod.GET)
-    public void download(HttpServletResponse response){
-    	List<StudentDTO> studentDTOs =new ArrayList<StudentDTO>();
-    	StudentDTO dto = new StudentDTO();
+    public void download(HttpServletResponse response) {
+        List<StudentDTO> studentDTOs = new ArrayList<StudentDTO>();
+        StudentDTO dto = new StudentDTO();
 
         dto.setExamNumber("5360001");
         dto.setName("张三");
@@ -44,7 +49,7 @@ public class StudentImporter {
         dto.setExamRoom("第1考场");
         dto.setSourceName("四川");
 
-    	studentDTOs.add(dto);
-    	ExportUtils.exportEXCEL("考生导入模板",StudentDTO.class,studentDTOs,response);
+        studentDTOs.add(dto);
+        ExportUtils.exportEXCEL("考生导入模板", StudentDTO.class, studentDTOs, response);
     }
 }

+ 37 - 26
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -11,13 +11,8 @@ 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.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.repository.ExamQuestionRepo;
-import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
-import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
-import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
+import cn.com.qmth.stmms.ms.core.domain.*;
+import cn.com.qmth.stmms.ms.core.repository.*;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.slf4j.LoggerFactory;
@@ -33,6 +28,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 import java.util.Random;
+import java.util.stream.Collectors;
 
 /**
  * 数据上传服务 Created by zhengmin on 2016/11/18.
@@ -62,6 +58,12 @@ public class DataUploadService {
     @Autowired
     ImageConfig imageConfig;
 
+    @Autowired
+    MarkSubjectRepo markSubjectRepo;
+
+    @Autowired
+    WorkRepo workRepo;
+
     /**
      * 上传考生试卷数据
      *
@@ -80,6 +82,11 @@ 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
@@ -129,7 +136,7 @@ public class DataUploadService {
                 ImageIO.write(bufferedImage, "jpg", os);
                 InputStream in1 = new ByteArrayInputStream(os.toByteArray());
 
-                writeStream(in1, outputStream1);
+                SystemConstant.writeStream(in1, outputStream1);
                 long end = System.currentTimeMillis();
                 LOGGER.info("生成原图和缩略图耗时:{}", (end - start) / 1000 + "s");
 
@@ -169,8 +176,8 @@ public class DataUploadService {
                 sheetIn = new FileInputStream(savePath + File.separator + student.getExamNumber() + ".jpg");
                 slicein = new FileInputStream(thumbFileName);
             }
-            Paper exist = paperRepo.findByWorkIdAndSubjectAndExamNumber(student.getWorkId(), subject,
-                    student.getExamNumber());
+            Paper exist = paperRepo.findByWorkIdAndSubjectAndExamNumberAndTest(student.getWorkId(), subject,
+                    student.getExamNumber(), markSubjectList.get(0).isTest());
             String sheetMD5 = DigestUtils.md5Hex(sheetIn);
             String sliceMD5 = DigestUtils.md5Hex(slicein);
             sheetIn.close();
@@ -189,6 +196,7 @@ public class DataUploadService {
                 paper.setSheetMD5(sheetMD5);
                 paper.setSliceMD5(sliceMD5);
                 paper.setExamRoom(student.getExamRoom());
+                paper.setTest(markSubjectList.get(0).isTest());
                 paperRepo.save(paper);
                 // 更新科目上传状态
                 /**
@@ -307,11 +315,17 @@ 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.findByWorkIdAndSubjectAndExamNumber(student.getWorkId(), subject, student.getExamNumber());
+        Paper paper = paperRepo.findByWorkIdAndSubjectAndExamNumberAndTest(student.getWorkId(), subject, student.getExamNumber(), markSubjectList.get(0).isTest());
         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);
@@ -402,25 +416,22 @@ public class DataUploadService {
     }
 
     /**
-     * 流写入
+     * 上传试评学生
      *
+     * @param workId
+     * @param isAbsent
      * @param inputStream
-     * @param outputStream
      * @return
-     * @throws IOException
      */
-    public OutputStream writeStream(InputStream inputStream, OutputStream outputStream) throws IOException {
-        int index = 0;
-        byte[] bytes = new byte[1024];
-        byte[] bytesEnc = new byte[1024];
-        while ((index = inputStream.read(bytes)) != -1) {
-            //将字节数组的数据全部写入到输出流中
-            for (int i = 0; i < index; i++) {
-                //通过异或运算加密
-                bytesEnc[i] = (byte) (bytes[i] ^ SystemConstant.SECRET_KEY);
-            }
-            outputStream.write(bytesEnc, 0, index);
+    @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 outputStream;
+        return excelErrors;
     }
 }

+ 79 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/TrialService.java

@@ -0,0 +1,79 @@
+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.repository.*;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * @Description: 试评任务
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/11/4
+ */
+@Service
+public class TrialService {
+
+    @Autowired
+    WorkRepo workRepo;
+
+    @Autowired
+    MarkSubjectRepo markSubjectRepo;
+
+    @Autowired
+    StudentRepo studentRepo;
+
+    @Autowired
+    MarkTaskRepo markTaskRepo;
+
+    @Autowired
+    PaperRepo paperRepo;
+
+    /**
+     * 删除试评任务,保留标准卷
+     *
+     * @param workId
+     * @param subject
+     */
+    @Transactional
+    public void finishTrial(Long workId, Subject subject) {
+        Work work = workRepo.findOne(workId);
+        //1.更新所有科目为处始状态并设置test为false
+        AtomicBoolean deleteStu = new AtomicBoolean(false);
+        work.getSubjects().forEach(o -> {
+            if (o.getId().toUpperCase().contains(subject.toString().toUpperCase())) {
+                o.setTest(false);
+                o.setStage(MarkStage.INIT);
+                o.setTotalScore(0);
+                o.setSampleCount(0);
+            }
+            if (!o.isTest()) {
+                deleteStu.set(true);
+            } else {
+                deleteStu.set(false);
+            }
+        });
+        markSubjectRepo.save(work.getSubjects());
+
+        //2.删除该科目下所有任务数据
+        markTaskRepo.deleteByWorkIdAndSubject(workId, subject);
+        //3.删除所有学生数据(只有当前work下所有科目都设置为false则删除)
+        if (deleteStu.get()) {
+            studentRepo.deleteByWorkId(workId);
+        }
+        //4.更新该科目下的试卷信息,可暂且不更新
+//        List<Paper> paperList = paperRepo.findByWorkIdAndSubjectAndTest(workId, subject, true);
+//        paperList.forEach(o -> {
+//            o.setLevel(null);//更新档位
+//            o.setScore(null);//更新分数
+//        });
+//        paperRepo.save(paperList);
+        //5.删除学生的试卷信息(服务器图片)
+    }
+}

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

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.ms.core.domain;
 
 import cn.com.qmth.stmms.ms.core.vo.Subject;
+import org.hibernate.annotations.Columns;
 
 import javax.persistence.*;
 import java.io.Serializable;
@@ -36,7 +37,23 @@ public class MarkSubject implements Serializable{
      */
     private int sampleCount;
 
-    public MarkSubject(Subject subject,Long workId) {
+    @Basic
+    @Column(name = "is_test")
+    private boolean test; //是否试评(false:不是,true:是)
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public boolean isTest() {
+        return test;
+    }
+
+    public void setTest(boolean test) {
+        this.test = test;
+    }
+
+    public MarkSubject(Subject subject, Long workId) {
         this.id = workId + "-" + subject;
         this.name = subject.getName();
         this.stage = MarkStage.INIT;

+ 9 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java

@@ -85,6 +85,15 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      */
     Long deleteByWorkIdAndSubjectAndStage(Long workId, Subject subject, MarkStage stage);
 
+    /**
+     * 删除科目下所有任务
+     *
+     * @param workId
+     * @param subject
+     * @return
+     */
+    Long deleteByWorkIdAndSubject(Long workId, Subject subject);
+
     /**
      * 统计评卷员各试题已评数及总数(分档阶段)
      *

+ 20 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java

@@ -124,6 +124,17 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
      */
     Paper findByWorkIdAndSubjectAndExamNumber(Long workId, Subject subject, String examNumber);
 
+    /**
+     * 根据条件查询指定试卷
+     *
+     * @param workId
+     * @param subject
+     * @param examNumber
+     * @param test
+     * @return
+     */
+    Paper findByWorkIdAndSubjectAndExamNumberAndTest(Long workId, Subject subject, String examNumber, boolean test);
+
     /**
      * 查询同一个考生的paper
      *
@@ -151,6 +162,15 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
 
     List<Paper> findByWorkId(Long workId);
 
+    /**
+     * 根据条件查找paper
+     * @param workId
+     * @param subject
+     * @param test
+     * @return
+     */
+    List<Paper> findByWorkIdAndSubjectAndTest(Long workId, Subject subject, boolean test);
+
     @Modifying
     @Query(nativeQuery = true, value = "update paper set inspect_range = null where inspect_range = :inspectRange")
     void resetInspectRange(@Param("inspectRange") Long inspectRange);