Quellcode durchsuchen

美术阅卷11月新增需求-自动打回和落档定差优化

wangliang vor 5 Jahren
Ursprung
Commit
ec970e086d

+ 15 - 6
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/constant/ArbitrateCallback.java

@@ -3,6 +3,8 @@ package cn.com.qmth.stmms.ms.commons.constant;
 import com.alibaba.fastjson.JSONObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -17,10 +19,11 @@ import java.util.stream.Collectors;
  * @Author: wangliang
  * @Date: 2019/11/6
  */
+@Component
 public class ArbitrateCallback {
     private static Logger LOGGER = LoggerFactory.getLogger(ArbitrateCallback.class);
 
-    public static int MAX_DISTANCE = 2 //仲裁档位
+    public int MAX_DISTANCE = 2 //仲裁档位
             , SUM_DISTANCE = 2 * 2 + 1;//最大落差档位和
 
     /**
@@ -30,10 +33,11 @@ public class ArbitrateCallback {
      * @param maxDistance
      * @return
      */
-    public static List<Distance> judge(Map<Long, String> levelsMap, int maxDistance) {
+    @Async
+    public List<Distance> judge(Map<Long, String> levelsMap, int maxDistance, ArbitrateResult ar) {
         MAX_DISTANCE = maxDistance;
         SUM_DISTANCE = MAX_DISTANCE * 2 + 1;
-        List<Distance> result = judge(levelsMap);
+        List<Distance> result = judge(levelsMap, ar);
         if (Objects.nonNull(result)) {
             LOGGER.info("LEVELS:{},设置的隔档档位为:{},设置的最大落差值和为:{},需要打回的档位为:{}", levelsMap.values().stream().collect(Collectors.toList()), MAX_DISTANCE, SUM_DISTANCE, JSONObject.toJSONString(result));
         }
@@ -45,9 +49,11 @@ public class ArbitrateCallback {
      *
      * @param levelsMap
      * @param paperLevel
+     * @param ar
      * @return
      */
-    public static List<Distance> judge(Map<Long, String> levelsMap, String paperLevel) {
+    @Async
+    public List<Distance> judge(Map<Long, String> levelsMap, String paperLevel, ArbitrateResult ar) {
         List<Distance> result = new ArrayList<>();
         char p = paperLevel.charAt(0);
         levelsMap.forEach((k, v) -> {
@@ -60,6 +66,7 @@ public class ArbitrateCallback {
         if (Objects.nonNull(result)) {
             LOGGER.info("LEVELS:{},paperLevel为:{},档位落差为:{}", levelsMap.values().stream().collect(Collectors.toList()), paperLevel, JSONObject.toJSONString(result));
         }
+        ar.callback(result);
         return result;
     }
 
@@ -67,9 +74,10 @@ public class ArbitrateCallback {
      * 计算档位最大落差档位和档位和
      *
      * @param levelsMap
+     * @param ar
      * @return
      */
-    public static List<Distance> judge(Map<Long, String> levelsMap) {
+    public List<Distance> judge(Map<Long, String> levelsMap, ArbitrateResult ar) {
         List<Distance> result = new ArrayList<>();
         levelsMap.forEach((k, v) -> {
             char c = v.charAt(0);
@@ -85,13 +93,14 @@ public class ArbitrateCallback {
             }
             LOGGER.info("计算档位最大落差档位和档位和:{}", JSONObject.toJSONString(d));
         });
+        ar.callback(result);
         return result;
     }
 
     /**
      * 档位计算类[档位,最大档位落差,最大档位落差和,档位偏差值]
      */
-    public static class Distance {
+    public class Distance {
         char c;
         int max;
         int sum;

+ 20 - 0
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/constant/ArbitrateResult.java

@@ -0,0 +1,20 @@
+package cn.com.qmth.stmms.ms.commons.constant;
+
+import java.util.List;
+
+/**
+ * @Description: 仲裁回调接口
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/11/28
+ */
+public interface ArbitrateResult {
+
+    /**
+     * 仲裁回调方法
+     *
+     * @param list
+     */
+    void callback(List<ArbitrateCallback.Distance> list);
+}

+ 37 - 21
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/aop/MarkLogAop.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.ms.log.aop;
 
 import cn.com.qmth.stmms.ms.commons.config.LevelConfig;
 import cn.com.qmth.stmms.ms.commons.constant.ArbitrateCallback;
+import cn.com.qmth.stmms.ms.commons.constant.ArbitrateResult;
 import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
 import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
@@ -20,6 +21,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
@@ -80,6 +82,9 @@ public class MarkLogAop {
     @Autowired
     WorkRepo workRepo;
 
+    @Autowired
+    ArbitrateCallback arbitrateCallback;
+
     /**
      * 标准卷、定档、档位打回切入点
      */
@@ -109,6 +114,7 @@ public class MarkLogAop {
      * @throws Exception
      */
     @AfterReturning(value = "paperAspect()", returning = RESULT)
+    @Transactional
     public void afterReturnPaperPoint(JoinPoint joinPoint, Object result) throws Exception {
         Map<String, Object> map = getAspectCommon(joinPoint);
         JSONArray jsonArgsArray = (JSONArray) map.get(PARAM_ARGS);
@@ -151,6 +157,7 @@ public class MarkLogAop {
      * @throws Exception
      */
     @AfterReturning(value = "markAspect()", returning = RESULT)
+    @Transactional
     public void afterReturnMarkPoint(JoinPoint joinPoint, Object result) throws Exception {
         Map<String, Object> map = getAspectCommon(joinPoint);
         JSONArray jsonArgsArray = (JSONArray) map.get(PARAM_ARGS);
@@ -222,31 +229,40 @@ public class MarkLogAop {
             if (levelConfig.isAutoCallback()) {//为true则自动打回
                 List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markStage);
                 Map<Long, String> levelsMap = markTasks.stream().collect(Collectors.toMap(MarkTask::getMarkerId, o -> o.getResult().toUpperCase()));
-                List<ArbitrateCallback.Distance> list = ArbitrateCallback.judge(levelsMap, markingConfig.getDeviation());
-                //全部打回则不触发自动仲裁
-                if (Objects.nonNull(list) && list.size() > 0 && markTasks.size() != list.size()) {
-                    paper.reject(null);
-                    List<MarkLog> markLogList = new ArrayList<>();
-                    for (ArbitrateCallback.Distance d : list) {
-                        for (MarkTask m : markTasks) {
-                            if (Objects.equals(String.valueOf(d.getC()), m.getResult()) && d.getMarkId().longValue() == m.getMarkerId().longValue()) {
-                                m.setRejected(true);
-                                m.setOriginLevel(m.getResult());
-                                m.setResult(null);
-                                MarkLog markLogPrev = markLogRepo.findTopByCreateUserIdAndOperTypeAndSubjectAndExamNumberOrderByCreateTimeDesc(m.getMarkerId(), MarkLogOperType.SYSTEM_CALLBACK_LEVEl.getId(), m.getSubject().toString(), paper.getExamNumber());
-                                if (Objects.nonNull(markLogPrev)) {
-                                    operResult = Optional.ofNullable(markLogPrev.getOperDataAfter()).orElse("-");
+                LOGGER.info("this:{},markLogAop异步回调进来了", this);
+                arbitrateCallback.judge(levelsMap, markingConfig.getDeviation(), new ArbitrateResult() {
+                    @Override
+                    public void callback(List<ArbitrateCallback.Distance> list) {
+                        LOGGER.info("this:{},callback markLogAop异步回调进来了", this);
+                        String operResult = DEFAULT_RESULT;
+                        //全部打回则不触发自动仲裁
+                        if (Objects.nonNull(list) && list.size() > 0 && markTasks.size() != list.size()) {
+                            paper.reject(null);
+                            List<MarkLog> markLogList = new ArrayList<>();
+                            for (ArbitrateCallback.Distance d : list) {
+                                for (MarkTask m : markTasks) {
+                                    if (Objects.equals(String.valueOf(d.getC()), m.getResult()) && d.getMarkId().longValue() == m.getMarkerId().longValue()) {
+                                        m.setRejected(true);
+                                        m.setOriginLevel(m.getResult());
+                                        m.setResult(null);
+                                        MarkLog markLogPrev = markLogRepo.findTopByCreateUserIdAndOperTypeAndSubjectAndExamNumberOrderByCreateTimeDesc(m.getMarkerId(), MarkLogOperType.SYSTEM_CALLBACK_LEVEl.getId(), m.getSubject().toString(), paper.getExamNumber());
+                                        if (Objects.nonNull(markLogPrev)) {
+                                            operResult = Optional.ofNullable(markLogPrev.getOperDataAfter()).orElse("-");
+                                        }
+                                        //加入打回日志
+                                        MarkLog markLog = new MarkLog(m.getMarkerId(), m.getMarkerName(), Role.MARKER, m.getSubject(), paper.getExamNumber(), paper.getStudentName(), MarkLogOperType.SYSTEM_CALLBACK_LEVEl.getId(), paper.getWorkId(), paper.getId(), m.getStage(), operResult, String.valueOf(d.getC()), MarkLogOperType.SYSTEM_CALLBACK_LEVEl.getName(), work.getName());
+                                        markLogList.add(markLog);
+                                    }
                                 }
-                                //加入打回日志
-                                markLog = new MarkLog(m.getMarkerId(), m.getMarkerName(), Role.MARKER, m.getSubject(), paper.getExamNumber(), paper.getStudentName(), MarkLogOperType.SYSTEM_CALLBACK_LEVEl.getId(), paper.getWorkId(), paper.getId(), m.getStage(), operResult, String.valueOf(d.getC()), MarkLogOperType.SYSTEM_CALLBACK_LEVEl.getName(), work.getName());
-                                markLogList.add(markLog);
                             }
+                            markTaskRepo.save(markTasks);
+                            paperRepo.save(paper);
+                            markLogRepo.save(markLogList);
                         }
+                        LOGGER.info("this:{},callback markLogAop异步回调结束了", this);
                     }
-                    markTaskRepo.save(markTasks);
-                    paperRepo.save(paper);
-                    markLogRepo.save(markLogList);
-                }
+                });
+                LOGGER.info("this:{},markLogAop异步回调结束了", this);
             }
         }
         //20191107wangliang加入仲裁自动打回算法 end

+ 40 - 22
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.ms.marking.service;
 
 import cn.com.qmth.stmms.ms.commons.config.LevelConfig;
 import cn.com.qmth.stmms.ms.commons.constant.ArbitrateCallback;
+import cn.com.qmth.stmms.ms.commons.constant.ArbitrateResult;
 import cn.com.qmth.stmms.ms.core.domain.*;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
@@ -57,6 +58,9 @@ public class MarkingService {
     @Autowired
     LevelConfig levelConfig;
 
+    @Autowired
+    ArbitrateCallback arbitrateCallback;
+
     /**
      * 提交分档。如果每个评卷都提交了,则进行仲裁判定,如果没有触发仲裁就定档
      *
@@ -160,33 +164,47 @@ public class MarkingService {
      * @param markTasks
      * @param paper
      */
-    private void levelsLog(List<MarkTask> markTasks, Paper paper) {
+    @Transactional
+    public void levelsLog(List<MarkTask> markTasks, Paper paper) {
         //20191108wangliang加入档位落差值计算
+        LOG.info("this:{} levelsLog异步回调进来了", this);
         Map<Long, String> levelsMap = markTasks.stream().collect(Collectors.toMap(MarkTask::getMarkerId, o -> o.getResult().toUpperCase()));
-        List<ArbitrateCallback.Distance> list = ArbitrateCallback.judge(levelsMap, paper.getLevel());
-        String operResult = "-";
-        for (ArbitrateCallback.Distance d : list) {
-            for (MarkTask m : markTasks) {
-                if (Objects.equals(String.valueOf(d.getC()), m.getResult()) && d.getMarkId().longValue() == m.getMarkerId().longValue()) {
-                    MarkLog markLogPrev = markLogRepo.findTopByCreateUserIdAndOperTypeAndSubjectAndExamNumberOrderByCreateTimeDesc(m.getMarkerId(), MarkLogOperType.LEVEl_DIFFERENCE.getId(), m.getSubject().toString(), paper.getExamNumber());
-                    JSONObject jsonObject = new JSONObject();
-                    jsonObject.put("task", m.getResult());
-                    jsonObject.put("paper", paper.getLevel());
-                    if (Objects.isNull(markLogPrev)) {
-                        //加入档位落差值日志
-                        Work work = workRepo.findOne(paper.getWorkId());
-                        MarkLog markLog = new MarkLog(m.getMarkerId(), m.getMarkerName(), Role.MARKER, m.getSubject(), paper.getExamNumber(), paper.getStudentName(), MarkLogOperType.LEVEl_DIFFERENCE.getId(), paper.getWorkId(), paper.getId(), m.getStage(), operResult, String.valueOf(d.getDistance()), jsonObject.toJSONString(), work.getName());
-                        markLogRepo.save(markLog);
-                    } else {
-                        operResult = Optional.ofNullable(markLogPrev.getOperDataAfter()).orElse("-");
-                        markLogPrev.setOperDataBefore(operResult);
-                        markLogPrev.setOperDataAfter(String.valueOf(d.getDistance()));
-                        markLogPrev.setRemark(jsonObject.toJSONString());
-                        markLogRepo.save(markLogPrev);
+        arbitrateCallback.judge(levelsMap, paper.getLevel(), new ArbitrateResult() {
+            @Override
+            public void callback(List<ArbitrateCallback.Distance> list) {
+                LOG.info("this:{},callback levelsLog异步回调进来了", this);
+                try {
+                    Thread.sleep(5000);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+                String operResult = "-";
+                for (ArbitrateCallback.Distance d : list) {
+                    for (MarkTask m : markTasks) {
+                        if (Objects.equals(String.valueOf(d.getC()), m.getResult()) && d.getMarkId().longValue() == m.getMarkerId().longValue()) {
+                            MarkLog markLogPrev = markLogRepo.findTopByCreateUserIdAndOperTypeAndSubjectAndExamNumberOrderByCreateTimeDesc(m.getMarkerId(), MarkLogOperType.LEVEl_DIFFERENCE.getId(), m.getSubject().toString(), paper.getExamNumber());
+                            JSONObject jsonObject = new JSONObject();
+                            jsonObject.put("task", m.getResult());
+                            jsonObject.put("paper", paper.getLevel());
+                            if (Objects.isNull(markLogPrev)) {
+                                //加入档位落差值日志
+                                Work work = workRepo.findOne(paper.getWorkId());
+                                MarkLog markLog = new MarkLog(m.getMarkerId(), m.getMarkerName(), Role.MARKER, m.getSubject(), paper.getExamNumber(), paper.getStudentName(), MarkLogOperType.LEVEl_DIFFERENCE.getId(), paper.getWorkId(), paper.getId(), m.getStage(), operResult, String.valueOf(d.getDistance()), jsonObject.toJSONString(), work.getName());
+                                markLogRepo.save(markLog);
+                            } else {
+                                operResult = Optional.ofNullable(markLogPrev.getOperDataAfter()).orElse("-");
+                                markLogPrev.setOperDataBefore(operResult);
+                                markLogPrev.setOperDataAfter(String.valueOf(d.getDistance()));
+                                markLogPrev.setRemark(jsonObject.toJSONString());
+                                markLogRepo.save(markLogPrev);
+                            }
+                        }
                     }
                 }
+                LOG.info("this:{},callback levelsLog异步回调结束了", this);
             }
-        }
+        });
+        LOG.info("this:{}, levelsLog异步回调结束了", this);
     }
 
     /**