xiaof преди 4 години
родител
ревизия
8fc0a9f701

+ 47 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/QualityAnalyseController.java

@@ -239,6 +239,53 @@ public class QualityAnalyseController {
         return list;
     }
 
+    /**
+     * 累计误差报表
+     *
+     * @param workId
+     * @param subject
+     * @param areaCode
+     * @param startTime
+     * @param endTime
+     */
+    @RequestMapping(value = "deviationReport", method = RequestMethod.GET)
+    public List cumulativeReport(
+            @RequestParam Long workId,
+            @RequestParam(required = false) Subject subject,
+            @RequestParam(required = false) String areaCode,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime) {
+        List list = new ArrayList();
+        Specification<MarkTask> specification = (root, query, builder) -> {
+            List<Predicate> predicates = new ArrayList<>();
+            predicates.add(builder.equal(root.get("workId"), workId));
+            if (Objects.nonNull(subject)) {
+                predicates.add(builder.equal(root.get("subject"), subject));
+            }
+            if (Objects.nonNull(areaCode)) {
+                predicates.add(builder.equal(root.get("paper").get("areaCode"), areaCode));
+            }
+            return builder.and(predicates.toArray(new Predicate[predicates.size()]));
+        };
+        List<MarkTask> markTasks = markTaskRepo.findAll(specification);
+        if (Objects.nonNull(markTasks) && markTasks.size() > 0) {
+            Map<Long, MarkTask> markerMap = markTasks.stream().collect(Collectors.toMap(MarkTask::getMarkerId, Function.identity(), (dto1, dto2) -> dto1));
+            List<Long> markerIdList = markerMap.values().stream().map(i -> i.getMarkerId()).collect(Collectors.toList());
+            Object o = StringUtils.join(markerIdList.toArray(), ",");
+            String sql = new StringBuffer("select t.create_user_name as userName, sum(t.oper_data_after) as sumCount,t.create_user_id as userId from mark_log t where t.oper_type = ").append(MarkLogOperType.LEVEl_DEVIATION.getId()).append(" and t.create_user_id in (").append(o).append(")").toString();
+            if (Objects.nonNull(startTime)) {
+                sql = sqlUtil.sqlConditionAnd(sql, new String[]{"t.create_time"}, new String[]{startTime}, new String[]{">="});
+            }
+            if (Objects.nonNull(endTime)) {
+                sql = sqlUtil.sqlConditionAnd(sql, new String[]{"t.create_time"}, new String[]{endTime}, new String[]{"<="});
+            }
+            sql = sqlUtil.sqlGroupBy(sql, "t.create_user_id");
+            list = sqlUtil.execSqlForMap(sql);
+            list = distinctCommon(list, markerIdList, markerMap);
+        }
+        return list;
+    }
+
     /**
      * 求差值公用
      *

+ 32 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/StudentApi.java

@@ -14,6 +14,8 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 考生数据api
@@ -134,4 +136,34 @@ public class StudentApi {
         dataUploadService.uploadPaper(studentId, subject, file.getInputStream(), isManual);
     }
 
+    /**
+     * 级联查询
+     */
+    @RequestMapping(value = "select/{workId}", method = RequestMethod.GET)
+    public List<Map> addPaper(@PathVariable Long workId) {
+        List<Student> students = studentRepo.findByWorkId(workId);
+        List<String> areaNames = students.stream().map(s->s.getAreaCode()+":"+s.getAreaName()).distinct().collect(Collectors.toList());
+        List<Map> areaList = new ArrayList<>();
+        for (String areas : areaNames) {
+            String[] as = areas.split(":");
+            String areaCode = as[0];
+            String areaName = as[1];
+            Map areaMap = new HashMap();
+            areaMap.put("areaCode", areaCode);
+            areaMap.put("areaName", areaName);
+            List<String> schools = students.stream().filter(s-> Objects.equals(s.getAreaName(), areaName)).map(student -> student.getSchool()).distinct().collect(Collectors.toList());
+            List<Map> schList = new ArrayList<>();
+            for (String school : schools) {
+                Map schMap = new HashMap();
+                schMap.put("school", school);
+                List<String> rooms = students.stream().filter(s -> Objects.equals(s.getAreaName(), areaName) && Objects.equals(s.getSchool(), school)).map(student -> student.getExamRoom()).distinct().collect(Collectors.toList());
+                schMap.put("rooms", rooms);
+                schList.add(schMap);
+            }
+            areaMap.put("schools", schList);
+            areaList.add(areaMap);
+        }
+        return areaList;
+    }
+
 }

+ 11 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/constant/ArbitrateCallback.java

@@ -75,6 +75,7 @@ public class ArbitrateCallback {
                     char c = v.charAt(0);
                     Distance d = new Distance(c, k);
                     d.distance = Math.abs(c - p);
+                    d.deviation = c -p;
                     result.add(d);
                     LOGGER.info("计算档位偏差值:{}", JSONObject.toJSONString(d));
                 });
@@ -121,6 +122,7 @@ public class ArbitrateCallback {
         int max;
         int sum;
         int distance;
+        int deviation;
         Long markId;
 
         public Distance(char c, Long markId) {
@@ -128,6 +130,7 @@ public class ArbitrateCallback {
             this.max = 0;
             this.sum = 0;
             this.distance = 0;
+            this.deviation = 0;
             this.markId = markId;
         }
 
@@ -170,5 +173,13 @@ public class ArbitrateCallback {
         public void setMarkId(Long markId) {
             this.markId = markId;
         }
+
+        public int getDeviation() {
+            return deviation;
+        }
+
+        public void setDeviation(int deviation) {
+            this.deviation = deviation;
+        }
     }
 }

+ 6 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkLogOperType.java

@@ -72,7 +72,12 @@ public enum MarkLogOperType {
     /**
      * 档位落差
      */
-    LEVEl_DIFFERENCE(13, "档位落差");
+    LEVEl_DIFFERENCE(13, "档位落差"),
+
+    /**
+     * 档位偏差
+     */
+    LEVEl_DEVIATION(14, "档位偏差");
 
     private int id;
 

+ 4 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/StudentRepo.java

@@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author ting.yin
@@ -31,4 +32,7 @@ public interface StudentRepo extends JpaRepository<Student, Long>, JpaSpecificat
     List<Student> findByWorkIdAndTestAndExamRoom(Long workId, String test, String examRoom);
 
     Student findByWorkIdAndRelateExamNumber(Long workId, String examNumber);
+
+//    @Query("select distinct s.areaName, s.school, s.examRoom from Student s where s.workId = ?1")
+    List<Student> findByWorkId(Long workId);
 }

+ 25 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/specification/StudentSpecification.java

@@ -23,6 +23,9 @@ public class StudentSpecification extends PagingAndSortingSpecification {
     private Boolean upload;//上传状态
     private String subject;//科目
 
+    private String school;
+    private String examRoom;
+
     public Boolean getAbsent() {
         return isAbsent;
     }
@@ -111,6 +114,22 @@ public class StudentSpecification extends PagingAndSortingSpecification {
         this.uploadStatus = uploadStatus;
     }
 
+    public String getSchool() {
+        return school;
+    }
+
+    public void setSchool(String school) {
+        this.school = school;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
     @Override
     public Specification<Student> getSpecification() {
         return (root, query, cb) -> {
@@ -154,6 +173,12 @@ public class StudentSpecification extends PagingAndSortingSpecification {
                     predicates.add(cb.equal(root.get("uploadStatus"), "SX:1,SC:1,SM:1"));
                 }
             }
+            if (getSchool() != null) {
+                predicates.add(cb.equal(root.get("school"), getSchool()));
+            }
+            if (getExamRoom() != null) {
+                predicates.add(cb.equal(root.get("examRoom"), getExamRoom()));
+            }
             return cb.and(predicates.toArray(new Predicate[predicates.size()]));
         };
     }

+ 14 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -225,6 +225,20 @@ public class MarkingService {
                                 markLogPrev.setRemark(jsonObject.toJSONString());
                                 markLogRepo.save(markLogPrev);
                             }
+                            //档位偏差
+                            MarkLog markLogDevi = markLogRepo.findTopByCreateUserIdAndOperTypeAndSubjectAndExamNumberOrderByCreateTimeDesc(m.getMarkerId(), MarkLogOperType.LEVEl_DEVIATION.getId(), m.getSubject().toString(), paper.getExamNumber());
+                            if (Objects.isNull(markLogDevi)) {//新建日志
+                                //加入档位偏差值日志
+                                Work work = workRepo.findOne(paper.getWorkId());
+                                MarkLog markLog = new MarkLog(m.getMarkerId(), m.getMarkerName(), Role.MARKER, m.getSubject(), paper.getExamNumber(), paper.getStudentName(), MarkLogOperType.LEVEl_DEVIATION.getId(), paper.getWorkId(), paper.getId(), m.getStage(), operResult, String.valueOf(d.getDeviation()), jsonObject.toJSONString(), work.getName());
+                                markLogRepo.save(markLog);
+                            } else {//更新日志
+                                operResult = Optional.ofNullable(markLogDevi.getOperDataAfter()).orElse("-");
+                                markLogDevi.setOperDataBefore(operResult);
+                                markLogDevi.setOperDataAfter(String.valueOf(d.getDeviation()));
+                                markLogDevi.setRemark(jsonObject.toJSONString());
+                                markLogRepo.save(markLogDevi);
+                            }
                         }
                     }
                 }