浏览代码

测试bug修复-0811

xiaof 4 年之前
父节点
当前提交
6403ae3e1d

+ 4 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -342,6 +342,10 @@ public class DataUploadService {
         if (Objects.isNull(work)) {
             throw new Exception("没有此工作区,请检查workId是否正确");
         }
+        List<Paper> papers = paperRepo.findByWorkIdAndSubject(workId, subject);
+        if(papers.isEmpty() || papers.size() == 0){
+            throw new Exception("没有采集数据,不能导入试评数据");
+        }
         List<MarkSubject> markSubjectList = work.getSubjects().stream().filter(o -> o.getId().toUpperCase().contains(subject.toString().toUpperCase()))
                 .collect(Collectors.toList());
         MarkSubject markSubject = markSubjectList.get(0);

+ 154 - 26
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -720,7 +720,7 @@ public class CollectApi {
 
 
     /**
-     * 导出图片
+     * 分数图片导出
      *
      * @param imageType
      * @param areaId
@@ -730,23 +730,20 @@ public class CollectApi {
      * @param nameRule   1:考号+姓名,2:流水号
      * @param startScore
      * @param endScore
-     * @param request
-     * @param response
      * @return
      * @throws IOException
      */
-    @RequestMapping(value = "file/image/export", method = {RequestMethod.GET})
-    public String imageExamNumberExport(@RequestParam Long workId,
-                                        @RequestParam String imageType,
-                                        @RequestParam Long areaId,
-                                        @RequestParam String school,
-                                        @RequestParam String examRoom,
-                                        @RequestParam String subject,
-                                        @RequestParam String nameRule,
-                                        @RequestParam Integer startScore,
-                                        @RequestParam Integer endScore,
-                                        HttpServletRequest request,
-                                        HttpServletResponse response) throws IOException {
+    @RequestMapping(value = "file/image/exportScorePictures", method = {RequestMethod.GET})
+    public String exportScorePictures(@RequestParam(defaultValue = "分数图片") String exportType,
+                                      @RequestParam Long workId,
+                                      @RequestParam String imageType,
+                                      @RequestParam Long areaId,
+                                      @RequestParam String school,
+                                      @RequestParam String examRoom,
+                                      @RequestParam String subject,
+                                      @RequestParam String nameRule,
+                                      @RequestParam Integer startScore,
+                                      @RequestParam Integer endScore) throws IOException {
         if (StringUtils.isBlank(imageType)) {
             throw new RuntimeException("请选择图片类型");
         }
@@ -773,11 +770,15 @@ public class CollectApi {
             if (StringUtils.isNotBlank(examRoom)) {
                 sql.append(" and s.exam_room = '").append(examRoom).append("'");
             }
-            if (startScore != null) {
-                sql.append(" and p.score > ").append(startScore);
+            if (startScore != null && endScore != null) {
+                sql.append(" and p.score >= ").append(startScore);
+                sql.append(" and p.score <= ").append(endScore);
+            }
+            if (startScore != null && endScore == null) {
+                sql.append(" and p.score = ").append(startScore);
             }
-            if (startScore != null) {
-                sql.append(" and p.score < ").append(endScore);
+            if (startScore == null && endScore != null) {
+                sql.append(" and p.score = ").append(endScore);
             }
             List<Map<String, Object>> paperList = jdbcTemplate.queryForList(sql.toString());
             AtomicInteger atomicInteger = new AtomicInteger(0);
@@ -798,16 +799,33 @@ public class CollectApi {
                 String path = systemConfig.getSheetDir() + File.separator + workId + File.separator + subject1
                         + File.separator + areaCode;
                 File file = new File(path + File.separator + fileName + ".jpg");
-                //todo  图片存放路径要改 2020-08-08
-                String exportDir = systemConfig.getLocalhostPath() + File.separator + "export" + File.separator + workId + File.separator + subject
-                        + File.separator + areaCode;
+                //组装导出目录
+                StringJoiner expSj = new StringJoiner(File.separator);
+                expSj.add(systemConfig.getLocalhostPath()).add("图片导出").add(exportType).add(String.valueOf(workId)).add(subject);
+                if (areaId != null) {
+                    expSj.add(String.valueOf(areaId));
+                }
+                if (StringUtils.isNotBlank(school)) {
+                    expSj.add(school);
+                }
+                if (StringUtils.isNotBlank(examRoom)) {
+                    expSj.add(examRoom);
+                }
                 //原图或者水印图
                 if (Objects.equals("1", imageType)) {
-                    exportDir = exportDir + File.separator + "sheet";
+                    expSj.add("sheet");
                 } else if (Objects.equals("2", imageType)) {
-                    exportDir = exportDir + File.separator + "watermark";
+                    expSj.add("watermark");
                 }
-                File out = new File(exportDir);
+                //分数
+                if(startScore != null && endScore != null){
+                    expSj.add(startScore + "-" + endScore);
+                } else if(startScore != null && endScore == null){
+                    expSj.add(startScore.toString());
+                }else if(startScore == null && endScore != null){
+                    expSj.add(endScore.toString());
+                }
+                File out = new File(expSj.toString());
                 if (!out.exists()) {
                     out.mkdirs();
                 }
@@ -822,7 +840,7 @@ public class CollectApi {
                 } else {
                     throw new RuntimeException("命名参数有误");
                 }
-                File expFile = new File(exportDir + File.separator + outFileName + ".jpg");
+                File expFile = new File(expSj.toString() + File.separator + outFileName + ".jpg");
                 //水印图片
                 if (Objects.equals("1", imageType)) {
                     //读取指定路径下面的文件
@@ -863,8 +881,118 @@ public class CollectApi {
     }
 
 
+    /**
+     * 图片解密、重命名导出
+     *
+     * @param imageType
+     * @param areaId
+     * @param subject
+     * @return
+     * @throws IOException
+     */
+    @RequestMapping(value = "file/image/exportDecryptPictures", method = {RequestMethod.GET})
+    public String exportDecryptPictures(@RequestParam(defaultValue = "图片解密") String exportType,
+                                        @RequestParam Long workId,
+                                        @RequestParam String imageType,
+                                        @RequestParam Long areaId,
+                                        @RequestParam String subject) throws IOException {
+        if (StringUtils.isBlank(imageType)) {
+            throw new RuntimeException("请选择图片类型");
+        }
+        if (areaId == null) {
+            throw new RuntimeException("请选择考点");
+        }
+        if (StringUtils.isBlank(subject)) {
+            throw new RuntimeException("请选择科目");
+        }
+
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        int count = 0;
+        try {
+            //首先根据workId和阶段去查所有试卷
+            StringBuffer sql = new StringBuffer();
+            sql.append("SELECT s.id studentId, p.work_id workId, p.subject, p.area_code areaCode, p.exam_number examNumber FROM paper p LEFT JOIN student s ON p.work_id = s.work_id AND p.exam_number = s.exam_number WHERE p.score is not null and p.work_id = ").append(workId).append(" AND p.subject = '").append(subject).append("'");
+            if (areaId != null) {
+                sql.append(" and p.area_code = ").append(areaId);
+            }
+            List<Map<String, Object>> paperList = jdbcTemplate.queryForList(sql.toString());
+            for (Map map : paperList) {
+                Long studentId = Long.valueOf(map.get("studentId").toString());
+                String subject0 = map.get("subject").toString();
+                Subject subject1 = Subject.valueOf(subject0);
+                String areaCode = map.get("areaCode").toString();
+                String examNumber = map.get("examNumber").toString();
+
+                String fileName = examNumber;
+                //图片加密、命名规则为随机码的,都是需要md5
+                if (ParamCache.paramMap.get(workId).getNameRule() == 1 || ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+                    fileName = MD5Util.getImageRuleMd5(workId, subject1.ordinal(), areaCode, examNumber, studentId);
+                }
+                String path;
+                if(Objects.equals("1", imageType)){
+                    path = systemConfig.getImageDir() + File.separator + workId + File.separator + subject1
+                            + File.separator + areaCode;
+                } else if (Objects.equals("2", imageType)){
+                    path = systemConfig.getImageDir() + File.separator + workId + File.separator + subject1
+                            + File.separator + areaCode;
+                } else {
+                    throw new Exception("图片类型有误");
+                }
+                File file = new File(path + File.separator + fileName + ".jpg");
+                //组装导出目录
+                StringJoiner expSj = new StringJoiner(File.separator);
+                expSj.add(systemConfig.getLocalhostPath()).add("图片导出").add(exportType).add(String.valueOf(workId)).add(subject);
+                if (areaId != null) {
+                    expSj.add(String.valueOf(areaId));
+                }
+                //原图或者裁剪图
+                if (Objects.equals("1", imageType)) {
+                    expSj.add("sheet");
+                } else if (Objects.equals("2", imageType)) {
+                    expSj.add("images");
+                }
+                File out = new File(expSj.toString());
+                if (!out.exists()) {
+                    out.mkdirs();
+                }
+                File expFile = new File(expSj.toString() + File.separator + examNumber + ".jpg");
+                //水印图片
+                //读取指定路径下面的文件
+                inputStream = new FileInputStream(file);
+                outputStream = new FileOutputStream(expFile);
+                if (ParamCache.paramMap.get(workId).getImageEncrypt() == 1) {
+                    outputStream = SystemConstant.writeStream(inputStream, outputStream);
+                } else {
+                    outputStream = SystemConstant.writeStreamFomal(inputStream, outputStream);
+                }
+                inputStream.close();
+                outputStream.flush();
+                outputStream.close();
+                count++;
+
+                LOGGER.info("studentId:{},subjdect:{},md5:{}", studentId, subject1, fileName);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            //强制将缓存区的数据进行输出
+            if (Objects.nonNull(outputStream)) {
+                outputStream.flush();
+                //关流
+                outputStream.close();
+            }
+            if (Objects.nonNull(inputStream)) {
+                inputStream.close();
+            }
+        }
+        return "导出照片成功,共导出了" + count + "张照片";
+    }
+
+
     /**
      * 生成分数水印图片
+     *
      * @param str
      * @return
      */

+ 4 - 2
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkLogRepo.java

@@ -37,8 +37,10 @@ public interface MarkLogRepo extends JpaRepository<MarkLog, Long>, JpaSpecificat
 
     void deleteByPaperIdIn(List<Long> paperIds);
 
-    @Query("select distinct s.createUserName as createUserName, max(s.id) as id from MarkLog s where s.createRole = '采集员' and s.workId = ?1 group by s.createUserName")
-    Page<Map> findByWorkId(@Param("workId") Long workId, Pageable pageable);
+    @Query("select s.createUserName as createUserName, max(s.id) as id from MarkLog s where s.createRole = '采集员' and s.workId = ?1 group by s.createUserName")
+    List<Map> findByWorkId(@Param("workId") Long workId);
 
     List<MarkLog> findByWorkIdAndSubjectAndOperTypeAndPaperIdIn(Long workId, Subject subject, MarkLogOperType one_click_levEl, List<Long> paperIds);
+
+    Page<Map> findByIdIn(List<Long> longs, Pageable pageable);
 }

+ 35 - 13
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/controller/MarkLogController.java

@@ -21,14 +21,15 @@ import org.springframework.data.jpa.domain.Specification;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
 import javax.servlet.http.HttpServletRequest;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
 
 //import io.swagger.annotations.Api;
 //import io.swagger.annotations.ApiOperation;
@@ -230,15 +231,36 @@ public class MarkLogController {
      */
     @RequestMapping(value = "/equipmentMonitor", method = RequestMethod.GET)
     public Object saveCollectLog(Long workId, Pageable pageable) {
-        Page<Map> mapPage = markLogRepo.findByWorkId(workId, pageable);
-        List<Map> list = mapPage.getContent();
-        for (Map map : list) {
-            MarkLog markLog = markLogRepo.findOne(Long.valueOf(map.get("id").toString()));
-            Paper paper = paperRepo.findOne(markLog.getPaperId());
-            PaperDTO paperDTO = paperAssembler.toDTO(paper);
-            map.put("imgSrc", paperDTO.getImgSrc());
-            map.put("thumbSrc", paperDTO.getThumbSrc());
+        List<Map> mapList = markLogRepo.findByWorkId(workId);
+        if (!mapList.isEmpty() && mapList.size() > 0) {
+            List<Long> longs = mapList.stream().map(m->Long.valueOf(m.get("id").toString())).collect(Collectors.toList());
+
+            Specification<MarkLog> specification = (root, query, builder) -> {
+                List<Predicate> predicates = new ArrayList<>();
+                if(longs != null && longs.size() > 0) {
+                    CriteriaBuilder.In<Object> in = builder.in(root.get("id"));
+                    for (Long id : longs) {
+                        in.value(id);
+                    }
+                    predicates.add(builder.and(builder.and(in)));
+                }
+                return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+            };
+            Page<MarkLog> markLogs = markLogRepo.findAll(specification, pageable);
+            List<MarkLog> list = markLogs.getContent();
+            List<Map> arrayList = new ArrayList<>();
+            for (MarkLog markLog : list) {
+                Map map = new HashMap();
+                map.put("createUserName", markLog.getCreateUserName());
+                Paper paper = paperRepo.findOne(markLog.getPaperId());
+                PaperDTO paperDTO = paperAssembler.toDTO(paper);
+                map.put("imgSrc", paperDTO.getImgSrc());
+                map.put("thumbSrc", paperDTO.getThumbSrc());
+                arrayList.add(map);
+            }
+
+            return new PageableDTO(arrayList, markLogs.getTotalElements(), markLogs.getTotalPages(), pageable.getPageNumber());
         }
-        return new PageableDTO(list, mapPage.getTotalElements(), mapPage.getTotalPages(), pageable.getPageNumber());
+        return null;
     }
 }

+ 44 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java

@@ -26,6 +26,7 @@ import org.springframework.data.jpa.domain.Specification;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.orm.jpa.vendor.OpenJpaDialect;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.persistence.criteria.CriteriaBuilder;
@@ -248,6 +249,7 @@ public class MarkTaskApi {
      * @return
      */
     @RequestMapping(value = "{markTask}", method = RequestMethod.PATCH)
+    @Transactional
     public ResponseEntity marking(@PathVariable MarkTask markTask, @RequestBody HashMap<String, String> body) {
         MarkStage stage = MarkStage.valueOf(body.get("stage"));
         String result = body.get("result");
@@ -271,6 +273,48 @@ public class MarkTaskApi {
         return new ResponseEntity(markTaskAssembler.toDTO(markTask, oldRejected), HttpStatus.OK);
     }
 
+    /**
+     * 批量提交评卷任务
+     *
+     * @param body     评卷内容
+     * @return
+     */
+    @RequestMapping(value = "batch", method = RequestMethod.PATCH)
+    public ResponseEntity batch(@RequestBody HashMap<String, String> body) {
+        MarkStage stage = MarkStage.valueOf(body.get("stage"));
+        String markIds = body.get("taskIds");
+        String result = body.get("result");
+        if(Objects.isNull(markIds)){
+            throw new RuntimeException("请选择待评试卷");
+        }
+        String[] ids = markIds.split(",");
+        List<MarkTaskDTO> list = new ArrayList<>();
+        for (String id : ids) {
+            MarkTask markTask = markTaskRepo.findOne(Long.valueOf(id));
+            boolean oldRejected = markTask.isRejected();
+            if (stage == null || result == null) {
+                return new ResponseEntity(HttpStatus.BAD_REQUEST);
+            }
+            switch (stage) {
+                case LEVEL:
+                    synchronized (this) {
+                        markingService.levelMark(markTask, result);
+                    }
+                    break;
+                case SCORE:
+                    Integer score = Integer.parseInt(result);
+                    synchronized (this) {
+                        markingService.scoring(markTask, score);
+                    }
+                    break;
+            }
+            MarkTaskDTO markTaskDTO = markTaskAssembler.toDTO(markTask, oldRejected);
+            list.add(markTaskDTO);
+        }
+
+        return new ResponseEntity(list, HttpStatus.OK);
+    }
+
     /**
      * 跳过评卷任务
      *