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

修复密号重复以及异步任务可能数据遗漏BUG

wangliang 5 жил өмнө
parent
commit
924be6d852

+ 17 - 337
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/SqlUtil.java

@@ -6,7 +6,6 @@ import org.hibernate.transform.Transformers;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManager;
@@ -27,22 +26,6 @@ public class SqlUtil {
     @Autowired
     @Autowired
     private EntityManager entityManager;
     private EntityManager entityManager;
 
 
-    /**
-     * 执行sql 把结果转换成map,支持分页
-     *
-     * @param sql
-     * @param curPage
-     * @param pageSize
-     * @param arguments
-     * @return
-     */
-    public PageInfo execSqlForMapPageInfo(String sql, Integer curPage, Integer pageSize, String... arguments) {
-        if (sql == null || curPage == null || pageSize == null || arguments == null) {
-            throw new NullPointerException();
-        }
-        return (PageInfo) execSqlTrans(sql, null, 1, true, curPage, pageSize, arguments);
-    }
-
     /**
     /**
      * 执行sql 把结果转换成map,支持分页
      * 执行sql 把结果转换成map,支持分页
      *
      *
@@ -59,54 +42,6 @@ public class SqlUtil {
         return (PageInfo) execSqlTrans(sql, null, 1, true, curPage, pageSize, arguments);
         return (PageInfo) execSqlTrans(sql, null, 1, true, curPage, pageSize, arguments);
     }
     }
 
 
-    /**
-     * sql 执行count
-     *
-     * @param sql
-     * @param execSql
-     * @param arguments
-     * @return
-     */
-    public Integer getTotalCountCustom(String sql, boolean execSql, Object... arguments) {
-        try {
-            List<Object> args = new ArrayList<>();
-            for (Object s : arguments) {
-                args.add(s);
-            }
-            String countSql = null;
-            if (!execSql) {
-                countSql = getCountSqlWithOutDistinct(sql);
-            } else {
-                countSql = sql;
-            }
-            Query query = entityManager.createNativeQuery(countSql);
-            for (int i = 0; i < args.size(); i++) {
-                query.setParameter(i + 1, args.get(i));
-            }
-            return Integer.parseInt(query.getSingleResult().toString());
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    /**
-     * 自定义sql查询
-     *
-     * @param sql
-     * @param curPage
-     * @param pageSize
-     * @param total
-     * @param arguments
-     * @return
-     */
-    public PageInfo execSqlForMapPageInfoCustom(String sql, Integer curPage, Integer pageSize, Integer total, Object... arguments) {
-        if (sql == null || curPage == null || pageSize == null || arguments == null) {
-            throw new NullPointerException();
-        }
-        return (PageInfo) execSqlTrans(sql, null, 1, true, curPage, pageSize, total, arguments);
-    }
-
     /**
     /**
      * 执行sql 把结果转换成map
      * 执行sql 把结果转换成map
      *
      *
@@ -114,7 +49,7 @@ public class SqlUtil {
      * @param arguments
      * @param arguments
      * @return
      * @return
      */
      */
-    public List<T> execSqlForMap(String sql, String... arguments) {
+    public List<T> execSqlForMap(String sql, Object... arguments) {
         if (sql == null || arguments == null) {
         if (sql == null || arguments == null) {
             throw new NullPointerException();
             throw new NullPointerException();
         }
         }
@@ -129,30 +64,14 @@ public class SqlUtil {
      * @param arguments
      * @param arguments
      * @return
      * @return
      */
      */
-    public List<T> execSqlForMap(String sql, Object... arguments) {
+    public List<T> execSqlForMapNative(String sql, Object... arguments) {
         if (sql == null || arguments == null) {
         if (sql == null || arguments == null) {
             throw new NullPointerException();
             throw new NullPointerException();
         }
         }
-        Query query = (Query) execSqlTrans(sql, null, 1, false, null, null, arguments);
+        Query query = (Query) execSqlTrans(sql, null, 1, arguments);
         return query.getResultList();
         return query.getResultList();
     }
     }
 
 
-    /**
-     * 执行sql 把结果按顺序排进List,支持分页
-     *
-     * @param sql
-     * @param curPage
-     * @param pageSize
-     * @param arguments
-     * @return
-     */
-    public PageInfo execSqlForListPageInfo(String sql, Integer curPage, Integer pageSize, String... arguments) {
-        if (sql == null || curPage == null || pageSize == null || arguments == null) {
-            throw new NullPointerException();
-        }
-        return (PageInfo) execSqlTrans(sql, null, 2, true, curPage, pageSize, arguments);
-    }
-
     /**
     /**
      * 执行sql 把结果按顺序排进List,支持分页
      * 执行sql 把结果按顺序排进List,支持分页
      *
      *
@@ -169,21 +88,6 @@ public class SqlUtil {
         return (PageInfo) execSqlTrans(sql, null, 2, true, curPage, pageSize, arguments);
         return (PageInfo) execSqlTrans(sql, null, 2, true, curPage, pageSize, arguments);
     }
     }
 
 
-    /**
-     * 执行sql 把结果按顺序排进List
-     *
-     * @param sql
-     * @param arguments
-     * @return
-     */
-    public List<T> execSqlForList(String sql, String... arguments) {
-        if (sql == null || arguments == null) {
-            throw new NullPointerException();
-        }
-        Query query = (Query) execSqlTrans(sql, null, 2, false, null, null, arguments);
-        return query.getResultList();
-    }
-
     /**
     /**
      * 执行sql 把结果按顺序排进List
      * 执行sql 把结果按顺序排进List
      *
      *
@@ -199,23 +103,6 @@ public class SqlUtil {
         return query.getResultList();
         return query.getResultList();
     }
     }
 
 
-    /**
-     * 执行sql 把结果通过setter方法注入到指定的对像属性中,支持分页
-     *
-     * @param sql
-     * @param cla
-     * @param curPage
-     * @param pageSize
-     * @param arguments
-     * @return
-     */
-    public PageInfo execSqlForAliasToBeanPageInfo(String sql, Class cla, Integer curPage, Integer pageSize, String... arguments) {
-        if (sql == null || cla == null || curPage == null || pageSize == null || arguments == null) {
-            throw new NullPointerException();
-        }
-        return (PageInfo) execSqlTrans(sql, cla, 3, true, curPage, pageSize, arguments);
-    }
-
     /**
     /**
      * 执行sql 把结果通过setter方法注入到指定的对像属性中,支持分页
      * 执行sql 把结果通过setter方法注入到指定的对像属性中,支持分页
      *
      *
@@ -233,22 +120,6 @@ public class SqlUtil {
         return (PageInfo) execSqlTrans(sql, cla, 3, true, curPage, pageSize, arguments);
         return (PageInfo) execSqlTrans(sql, cla, 3, true, curPage, pageSize, arguments);
     }
     }
 
 
-    /**
-     * 执行sql 把结果通过setter方法注入到指定的对像属性中
-     *
-     * @param sql
-     * @param cla
-     * @param arguments
-     * @return
-     */
-    public List<T> execSqlForAliasToBean(String sql, Class cla, String... arguments) {
-        if (sql == null || cla == null || arguments == null) {
-            throw new NullPointerException();
-        }
-        Query query = (Query) execSqlTrans(sql, cla, 3, false, null, null, arguments);
-        return query.getResultList();
-    }
-
     /**
     /**
      * 执行sql 把结果通过setter方法注入到指定的对像属性中
      * 执行sql 把结果通过setter方法注入到指定的对像属性中
      *
      *
@@ -288,46 +159,6 @@ public class SqlUtil {
         return query.getResultList();
         return query.getResultList();
     }
     }
 
 
-    /**
-     * 执行sql 把结果转换成map
-     *
-     * @param sql
-     * @return
-     */
-    public List<T> execSqlForMap(String sql, Class cla) {
-        Query query = entityManager.createNativeQuery(sql);
-        query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
-        return query.getResultList();
-    }
-
-    /**
-     * 执行sql 把结果按顺序排进Class bean
-     *
-     * @param sql
-     * @return
-     */
-    public List<T> execSqlForAliasToBean(String sql, Class cla) {
-        Query query = entityManager.createNativeQuery(sql, cla);
-        query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(cla));
-        return query.getResultList();
-    }
-
-    /**
-     * sql 拼接and条件
-     *
-     * @param sql
-     * @param fields
-     * @param fieldValues
-     * @param opers
-     * @return
-     */
-    public String sqlConditionAnd(String sql, String[] fields, String[] fieldValues, String[] opers) {
-        if (sql == null || fields == null || fieldValues == null || opers == null) {
-            throw new NullPointerException();
-        }
-        return sqlConditionTrans(sql, "and", fields, fieldValues, opers);
-    }
-
     /**
     /**
      * sql 拼接and条件
      * sql 拼接and条件
      *
      *
@@ -374,22 +205,6 @@ public class SqlUtil {
         return new StringBuffer(sql).append(" or FIND_IN_SET ").append("(" + fieldValue + "," + field + ")").toString();
         return new StringBuffer(sql).append(" or FIND_IN_SET ").append("(" + fieldValue + "," + field + ")").toString();
     }
     }
 
 
-    /**
-     * sql 拼接or条件
-     *
-     * @param sql
-     * @param fields
-     * @param fieldValues
-     * @param opers
-     * @return
-     */
-    public String sqlConditionOr(String sql, String[] fields, String[] fieldValues, String[] opers) {
-        if (sql == null || fields == null || fieldValues == null || opers == null) {
-            throw new NullPointerException();
-        }
-        return sqlConditionTrans(sql, "or", fields, fieldValues, opers);
-    }
-
     /**
     /**
      * sql 拼接or条件
      * sql 拼接or条件
      *
      *
@@ -480,29 +295,6 @@ public class SqlUtil {
         return new StringBuffer(sql).append(" union all ").toString();
         return new StringBuffer(sql).append(" union all ").toString();
     }
     }
 
 
-    /**
-     * sql 条件转换
-     *
-     * @param sql
-     * @param conditionStr
-     * @param fields
-     * @param fieldValues
-     * @param opers
-     * @return
-     */
-    private String sqlConditionTrans(String sql, String conditionStr, String[] fields, String[] fieldValues, String[] opers) {
-        StringBuffer stringBuffer = new StringBuffer(sql);
-        try {
-            for (int i = 0; i < fields.length; i++) {
-                stringBuffer.append(" " + conditionStr + " ").append(" " + fields[i] + " ").append(" " + opers[i] + " ").append("'" + fieldValues[i] + "'");
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException(e);
-        }
-        return stringBuffer.toString();
-    }
-
     /**
     /**
      * sql 条件转换
      * sql 条件转换
      *
      *
@@ -517,7 +309,11 @@ public class SqlUtil {
         StringBuffer stringBuffer = new StringBuffer(sql);
         StringBuffer stringBuffer = new StringBuffer(sql);
         try {
         try {
             for (int i = 0; i < fields.length; i++) {
             for (int i = 0; i < fields.length; i++) {
-                stringBuffer.append(" " + conditionStr + " ").append(" " + fields[i] + " ").append(" " + opers[i] + " ").append(fieldValues[i]);
+                if (fieldValues[i] instanceof String) {
+                    stringBuffer.append(" " + conditionStr + " ").append(" " + fields[i] + " ").append(" " + opers[i] + " ").append("'" + fieldValues[i] + "'");
+                } else {
+                    stringBuffer.append(" " + conditionStr + " ").append(" " + fields[i] + " ").append(" " + opers[i] + " ").append(fieldValues[i]);
+                }
             }
             }
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
@@ -526,36 +322,6 @@ public class SqlUtil {
         return stringBuffer.toString();
         return stringBuffer.toString();
     }
     }
 
 
-    /**
-     * sql 占位符替换
-     *
-     * @param sql
-     * @param str
-     * @param fromIndex
-     * @param count
-     * @param arguments
-     * @return
-     */
-    private String searchStrAndRep(String sql, String str, int fromIndex, int count, String... arguments) {
-        if (sql == null || str == null || arguments == null) {
-            throw new NullPointerException();
-        }
-        try {
-            int index = sql.indexOf(str, fromIndex);
-            if (index != -1) {
-                StringBuilder stringBuilder = new StringBuilder(sql);
-                stringBuilder = new StringBuilder(stringBuilder.substring(0, index)).append(stringBuilder.replace(0, index + 1, "'" + arguments[count] + "'"));
-                return searchStrAndRep(stringBuilder.toString(), str, index + 1, count + 1, arguments);
-            } else {
-                LOGGER.info("execSql:" + sql);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException(e);
-        }
-        return sql;
-    }
-
     /**
     /**
      * sql 占位符替换
      * sql 占位符替换
      *
      *
@@ -574,7 +340,11 @@ public class SqlUtil {
             int index = sql.indexOf(str, fromIndex);
             int index = sql.indexOf(str, fromIndex);
             if (index != -1) {
             if (index != -1) {
                 StringBuilder stringBuilder = new StringBuilder(sql);
                 StringBuilder stringBuilder = new StringBuilder(sql);
-                stringBuilder = new StringBuilder(stringBuilder.substring(0, index)).append(stringBuilder.replace(0, index + 1, String.valueOf(arguments[count])));
+                if (arguments[count] instanceof String) {
+                    stringBuilder = new StringBuilder(stringBuilder.substring(0, index)).append(stringBuilder.replace(0, index + 1, "'" + arguments[count] + "'"));
+                } else {
+                    stringBuilder = new StringBuilder(stringBuilder.substring(0, index)).append(stringBuilder.replace(0, index + 1, String.valueOf(arguments[count])));
+                }
                 return searchStrAndRep(stringBuilder.toString(), str, index + 1, count + 1, arguments);
                 return searchStrAndRep(stringBuilder.toString(), str, index + 1, count + 1, arguments);
             } else {
             } else {
                 LOGGER.info("execSql:" + sql);
                 LOGGER.info("execSql:" + sql);
@@ -586,10 +356,6 @@ public class SqlUtil {
         return sql;
         return sql;
     }
     }
 
 
-    public ResponseEntity<T> sqlTransEntity() {
-        return null;
-    }
-
     /**
     /**
      * sql 执行count
      * sql 执行count
      *
      *
@@ -635,59 +401,6 @@ public class SqlUtil {
         return newsql;
         return newsql;
     }
     }
 
 
-    /**
-     * sql 结果trans转换
-     *
-     * @param sql
-     * @param cla
-     * @param type
-     * @param isShowPage
-     * @param curPage
-     * @param pageSize
-     * @param arguments
-     * @return
-     */
-    private Object execSqlTrans(String sql, Class cla, int type, boolean isShowPage, Integer curPage, Integer pageSize, String... arguments) {
-        Query query = null;
-        try {
-            List<String> args = new ArrayList<String>();
-            for (String s : arguments) {
-                args.add(s);
-            }
-            Integer total = getTotalCount(sql.toString(), args);
-            total = total == null ? 0 : total;
-            query = entityManager.createNativeQuery(sql.toString());
-            switch (type) {
-                case 2:
-                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.TO_LIST);
-                    break;
-                case 3:
-                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(cla));
-                    break;
-                default:
-                    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
-                    break;
-            }
-            for (int i = 0; i < args.size(); i++) {
-                query.setParameter(i + 1, args.get(i));
-            }
-            sqlPrint(sql, arguments);
-            if (isShowPage) {
-                //设置分页信息
-                PageInfo pageInfo = new PageInfo();
-                query.setMaxResults(pageSize);
-                query.setFirstResult(curPage * pageSize);
-                pageInfo.setTotal(total);
-                pageInfo.setList(query.getResultList());
-                return pageInfo;
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException(e);
-        }
-        return query;
-    }
-
     /**
     /**
      * sql 结果trans转换
      * sql 结果trans转换
      *
      *
@@ -707,9 +420,9 @@ public class SqlUtil {
             for (Object s : arguments) {
             for (Object s : arguments) {
                 args.add(s);
                 args.add(s);
             }
             }
-            Integer total = getTotalCount(sql.toString(), args);
+            Integer total = getTotalCount(sql, args);
             total = total == null ? 0 : total;
             total = total == null ? 0 : total;
-            query = entityManager.createNativeQuery(sql.toString());
+            query = entityManager.createNativeQuery(sql);
             switch (type) {
             switch (type) {
                 case 2:
                 case 2:
                     query.unwrap(SQLQuery.class).setResultTransformer(Transformers.TO_LIST);
                     query.unwrap(SQLQuery.class).setResultTransformer(Transformers.TO_LIST);
@@ -747,20 +460,17 @@ public class SqlUtil {
      * @param sql
      * @param sql
      * @param cla
      * @param cla
      * @param type
      * @param type
-     * @param isShowPage
-     * @param curPage
-     * @param pageSize
      * @param arguments
      * @param arguments
      * @return
      * @return
      */
      */
-    private Object execSqlTrans(String sql, Class cla, int type, boolean isShowPage, Integer curPage, Integer pageSize, Integer total, Object... arguments) {
+    private Object execSqlTrans(String sql, Class cla, int type, Object... arguments) {
         Query query = null;
         Query query = null;
         try {
         try {
             List<Object> args = new ArrayList<>();
             List<Object> args = new ArrayList<>();
             for (Object s : arguments) {
             for (Object s : arguments) {
                 args.add(s);
                 args.add(s);
             }
             }
-            query = entityManager.createNativeQuery(sql.toString());
+            query = entityManager.createNativeQuery(sql);
             switch (type) {
             switch (type) {
                 case 2:
                 case 2:
                     query.unwrap(SQLQuery.class).setResultTransformer(Transformers.TO_LIST);
                     query.unwrap(SQLQuery.class).setResultTransformer(Transformers.TO_LIST);
@@ -776,15 +486,6 @@ public class SqlUtil {
                 query.setParameter(i + 1, args.get(i));
                 query.setParameter(i + 1, args.get(i));
             }
             }
             sqlPrint(sql, arguments);
             sqlPrint(sql, arguments);
-            if (isShowPage) {
-                //设置分页信息
-                PageInfo pageInfo = new PageInfo();
-                query.setMaxResults(pageSize);
-                query.setFirstResult(curPage * pageSize);
-                pageInfo.setTotal(total);
-                pageInfo.setList(query.getResultList());
-                return pageInfo;
-            }
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
             throw new RuntimeException(e);
             throw new RuntimeException(e);
@@ -792,27 +493,6 @@ public class SqlUtil {
         return query;
         return query;
     }
     }
 
 
-    /**
-     * sql打印,替代占位符
-     *
-     * @param sql
-     * @param arguments
-     * @return
-     */
-    public String sqlPrint(String sql, String... arguments) {
-        try {
-            int lastIndexOrder = sql.lastIndexOf("?");
-            if (lastIndexOrder == -1) {
-                LOGGER.error("没有?参数");
-            } else {
-                return searchStrAndRep(sql, "?", 0, 0, arguments);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return sql;
-    }
-
     /**
     /**
      * sql打印,替代占位符
      * sql打印,替代占位符
      *
      *

+ 12 - 9
stmms-ms-commons/src/test/java/cn/com/qmth/stmms/ms/commons/image/ImageThumberTest.java

@@ -1,24 +1,27 @@
 package cn.com.qmth.stmms.ms.commons.image;
 package cn.com.qmth.stmms.ms.commons.image;
 
 
-import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
+import javafx.application.Application;
 import org.junit.Test;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.scheduling.config.ScheduledTask;
+import org.springframework.test.context.junit4.SpringRunner;
 
 
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.FileInputStream;
+import javax.annotation.Resource;
 import java.io.IOException;
 import java.io.IOException;
 
 
 /**
 /**
  * Created by zhengmin on 2016/11/18.
  * Created by zhengmin on 2016/11/18.
  */
  */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
 public class ImageThumberTest {
 public class ImageThumberTest {
 
 
     @Test
     @Test
     public void test() throws IOException {
     public void test() throws IOException {
-        String s = "SC:1,SX:1,SM:0";
-        String r = s.replaceFirst("Ss:[0-1]","SX:3");
-        int c = 1;
-        System.out.println(c++);
+//        String s = "SC:1,SX:1,SM:0";
+//        String r = s.replaceFirst("Ss:[0-1]","SX:3");
+//        int c = 1;
+//        System.out.println(c++);
     }
     }
 }
 }

+ 114 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkTaskJob.java

@@ -0,0 +1,114 @@
+package cn.com.qmth.stmms.ms.core.domain;
+
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 定时任务调度 entity
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/1/19
+ */
+@Entity
+@Table(name = "mark_task_job")
+@DynamicInsert
+@DynamicUpdate
+public class MarkTaskJob implements Serializable {
+
+    private static final long serialVersionUID = -8376036816154911286L;
+
+    private Long id;
+    @NotNull
+    private String dataObject;//object
+
+    @NotNull
+    private Date createTime;//创建时间
+
+    private Boolean status;//状态,0:未记录,1:已记录
+
+    private Long workId;//workId
+
+    private Integer version = 0;
+
+    public MarkTaskJob() {
+
+    }
+
+    public MarkTaskJob(String dataObject, Boolean status, Long workId) {
+        this.dataObject = dataObject;
+        this.createTime = new Date();
+        this.status = status;
+        this.workId = workId;
+    }
+
+    @Id
+    @GeneratedValue
+    @Column(name = "id")
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    @Basic
+    @Column(name = "data_object")
+    public String getDataObject() {
+        return dataObject;
+    }
+
+    public void setDataObject(String dataObject) {
+        this.dataObject = dataObject;
+    }
+
+    @Basic
+    @Column(name = "create_time")
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Basic
+    @Column(name = "status")
+    public Boolean getStatus() {
+        return status;
+    }
+
+    public void setStatus(Boolean status) {
+        this.status = status;
+    }
+
+    @Basic
+    @Column(name = "work_id")
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    @Basic
+    @Column(name = "version")
+    public Integer getVersion() {
+        return version;
+    }
+
+    public void setVersion(Integer version) {
+        this.version = version;
+    }
+}

+ 42 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskJobRepo.java

@@ -0,0 +1,42 @@
+package cn.com.qmth.stmms.ms.core.repository;
+
+import cn.com.qmth.stmms.ms.core.domain.MarkTaskJob;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @Description: 定时任务调度 repo
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/1/19
+ */
+@Repository
+public interface MarkTaskJobRepo extends JpaRepository<MarkTaskJob, Long>, JpaSpecificationExecutor<MarkTaskJob> {
+
+    /**
+     * 根据条件查询数据
+     *
+     * @param workId
+     * @return
+     */
+    List<MarkTaskJob> findAllByStatusIsFalseAndWorkId(Long workId);
+
+    /**
+     * 更新markTaskJob
+     *
+     * @param id
+     * @param version
+     * @return
+     */
+    @Modifying
+    @Transactional
+    @Query(value = "update mark_task_job set status = true,version = ?2 + 1 where id = ?1 and version = ?2", nativeQuery = true)
+    void updateMarkTaskJobByVersion(Long id, Integer version);
+}

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

@@ -14,6 +14,12 @@ import java.util.List;
  */
  */
 public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecificationExecutor {
 public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecificationExecutor {
 
 
+    int countByMarkerIdAndPaperIdAndWorkIdAndRandomSeqNew(Long markerId, Long paperId, Long randomSeqNew, Long workId);
+
+    List<MarkTask> findByWorkIdAndStageAndPaperId(Long workId, MarkStage stage, Long paperId);
+
+    List<MarkTask> findByRandomSeqNew(Long randomSeq);
+
     /**
     /**
      * 查询指定阶段试卷的评卷任务
      * 查询指定阶段试卷的评卷任务
      *
      *

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

@@ -18,6 +18,8 @@ import java.util.List;
  */
  */
 public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationExecutor<Paper> {
 public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationExecutor<Paper> {
 
 
+    List<Paper> findByRandomSeq(Long randomSeq);
+
     int countByWorkIdAndExamNumberAndRandomSeq(Long workId, String examNumber, Long randomSeq);
     int countByWorkIdAndExamNumberAndRandomSeq(Long workId, String examNumber, Long randomSeq);
 
 
     List<Paper> findByWorkIdAndSubject(Long workId, Subject subject);
     List<Paper> findByWorkIdAndSubject(Long workId, Subject subject);

+ 57 - 34
stmms-ms-log/src/main/java/cn/com/qmth/stmms/ms/log/aop/MarkLogAop.java

@@ -25,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
 
+import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 import javax.servlet.http.HttpSession;
 import java.util.*;
 import java.util.*;
@@ -85,6 +86,9 @@ public class MarkLogAop {
     @Autowired
     @Autowired
     ArbitrateCallback arbitrateCallback;
     ArbitrateCallback arbitrateCallback;
 
 
+    @Resource
+    MarkTaskJobRepo markTaskJobRepo;
+
     /**
     /**
      * 标准卷、定档、档位打回切入点
      * 标准卷、定档、档位打回切入点
      */
      */
@@ -228,44 +232,63 @@ public class MarkLogAop {
         if (markStage.ordinal() == 1 && paper.isArbitrated()) {
         if (markStage.ordinal() == 1 && paper.isArbitrated()) {
             if (levelConfig.isAutoCallback()) {//为true则自动打回
             if (levelConfig.isAutoCallback()) {//为true则自动打回
                 List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markStage);
                 List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), markStage);
-                Map<Long, String> levelsMap = markTasks.stream().collect(Collectors.toMap(MarkTask::getMarkerId, o -> o.getResult().toUpperCase()));
-                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);
-                                    }
+                JSONObject js = new JSONObject();
+                js.put("paperId", paper.getId());
+                js.put("type", "autoCallback");
+                MarkTaskJob markTaskJob = new MarkTaskJob(js.toJSONString(), false, paper.getWorkId());
+                autoCallback(markTasks, markingConfig.getDeviation(), paper, markTaskJob, work.getName());
+                markTaskJobRepo.save(markTaskJob);
+            }
+        }
+        //20191107wangliang加入仲裁自动打回算法 end
+    }
+
+    /**
+     * 自动打回异步回调
+     *
+     * @param markTasks
+     * @param deviation
+     * @param paper
+     * @param markTaskJob
+     * @param workName
+     */
+    public void autoCallback(List<MarkTask> markTasks, int deviation, Paper paper, MarkTaskJob markTaskJob, String workName) {
+        Map<Long, String> levelsMap = markTasks.stream().collect(Collectors.toMap(MarkTask::getMarkerId, o -> o.getResult().toUpperCase()));
+        LOGGER.info("this:{} markLogAop异步回调进来了", this);
+        arbitrateCallback.judge(levelsMap, deviation, 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(), workName);
+                                markLogList.add(markLog);
                             }
                             }
-                            markTaskRepo.save(markTasks);
-                            paperRepo.save(paper);
-                            markLogRepo.save(markLogList);
                         }
                         }
-                        LOGGER.info("this:{} callback markLogAop异步回调结束了", this);
                     }
                     }
-                });
-                LOGGER.info("this:{} markLogAop异步回调结束了", this);
+                    markTaskRepo.save(markTasks);
+                    paperRepo.save(paper);
+                    markLogRepo.save(markLogList);
+                }
+                markTaskJobRepo.updateMarkTaskJobByVersion(markTaskJob.getId(), markTaskJob.getVersion());
+                LOGGER.info("this:{} callback markLogAop异步回调结束了", this);
             }
             }
-        }
-        //20191107wangliang加入仲裁自动打回算法 end
+        });
+        LOGGER.info("this:{} markLogAop异步回调结束了", this);
     }
     }
 
 
     /**
     /**
@@ -280,7 +303,7 @@ public class MarkLogAop {
      */
      */
     public Integer selectOperType(Long createUserId, Integer operTypeStart, Integer operTypeEnd, String subject, String examNumber) {
     public Integer selectOperType(Long createUserId, Integer operTypeStart, Integer operTypeEnd, String subject, String examNumber) {
         String sql = "select t.oper_type as operType, count(*) as result from mark_log as t where t.create_user_id = ? and (t.oper_type = ? or t.oper_type = ?) and t.subject = ? and t.exam_number = ? group by t.oper_type ";
         String sql = "select t.oper_type as operType, count(*) as result from mark_log as t where t.create_user_id = ? and (t.oper_type = ? or t.oper_type = ?) and t.subject = ? and t.exam_number = ? group by t.oper_type ";
-        List list = sqlUtil.execSqlForMap(sql, createUserId, operTypeStart, operTypeEnd, subject, examNumber);
+        List list = sqlUtil.execSqlForMapNative(sql, createUserId, operTypeStart, operTypeEnd, subject, examNumber);
         Integer operType = operTypeStart;
         Integer operType = operTypeStart;
         if (Objects.nonNull(list) && list.size() > 0) {
         if (Objects.nonNull(list) && list.size() > 0) {
             for (int i = 0; i < list.size(); i++) {
             for (int i = 0; i < list.size(); i++) {

+ 2 - 4
stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/Application.java

@@ -1,10 +1,10 @@
 package cn.com.qmth.stmms.ms;
 package cn.com.qmth.stmms.ms;
 
 
 
 
-import cn.com.qmth.stmms.ms.commons.utils.image.ImageCompression;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 
 import javax.imageio.IIOImage;
 import javax.imageio.IIOImage;
@@ -14,10 +14,7 @@ import javax.imageio.ImageWriter;
 import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
 import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
 import javax.imageio.stream.FileImageOutputStream;
 import javax.imageio.stream.FileImageOutputStream;
 import java.awt.*;
 import java.awt.*;
-import java.awt.geom.Point2D;
-import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.awt.image.BufferedImage;
-import java.awt.image.BufferedImageOp;
 import java.awt.image.ColorModel;
 import java.awt.image.ColorModel;
 import java.awt.image.ImageProducer;
 import java.awt.image.ImageProducer;
 import java.io.File;
 import java.io.File;
@@ -25,6 +22,7 @@ import java.io.File;
 @SpringBootApplication
 @SpringBootApplication
 @EnableTransactionManagement
 @EnableTransactionManagement
 @EnableAsync
 @EnableAsync
+@EnableScheduling
 public class Application {
 public class Application {
 
 
     public static void main(String[] args) throws Exception {
     public static void main(String[] args) throws Exception {

+ 10 - 9
stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/StartRunning.java

@@ -3,13 +3,14 @@ package cn.com.qmth.stmms.ms;
 import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
 import cn.com.qmth.stmms.ms.core.domain.Work;
 import cn.com.qmth.stmms.ms.core.domain.Work;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
+import cn.com.qmth.stmms.ms.quartz.ScheduledTask;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
-import java.util.List;
+import javax.annotation.Resource;
 import java.util.Objects;
 import java.util.Objects;
 
 
 /**
 /**
@@ -29,20 +30,20 @@ public class StartRunning implements CommandLineRunner {
     @Autowired
     @Autowired
     RandomUtil randomUtil;
     RandomUtil randomUtil;
 
 
+    @Resource
+    ScheduledTask scheduledTask;
+
     @Override
     @Override
     public void run(String... args) throws Exception {
     public void run(String... args) throws Exception {
         LOGGER.info("服务器启动时执行 start");
         LOGGER.info("服务器启动时执行 start");
-        List<Work> workList = workRepo.findAll();
-        if (Objects.isNull(workList) || workList.size() == 0) {
+        Work work = workRepo.findByActiveTrue();
+        if (Objects.isNull(work)) {
             LOGGER.info("没有创建工作区");
             LOGGER.info("没有创建工作区");
         } else {
         } else {
-            for (Work work : workList) {
-                if (work.isActive()) {
-                    randomUtil.getRandom(work.getId(), false);
-                    break;
-                }
-            }
+            randomUtil.getRandom(work.getId(), false);
         }
         }
+        scheduledTask.repairRepeatSecretNumberTask();
+        scheduledTask.markTaskJob();
         LOGGER.info("服务器启动时执行 end");
         LOGGER.info("服务器启动时执行 end");
     }
     }
 }
 }

+ 277 - 0
stmms-ms-main/src/main/java/cn/com/qmth/stmms/ms/quartz/ScheduledTask.java

@@ -0,0 +1,277 @@
+package cn.com.qmth.stmms.ms.quartz;
+
+import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
+import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.MarkTaskJob;
+import cn.com.qmth.stmms.ms.core.domain.Paper;
+import cn.com.qmth.stmms.ms.core.domain.Work;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
+import cn.com.qmth.stmms.ms.core.repository.MarkTaskJobRepo;
+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.WorkRepo;
+import cn.com.qmth.stmms.ms.log.aop.MarkLogAop;
+import cn.com.qmth.stmms.ms.marking.config.MarkingConfig;
+import cn.com.qmth.stmms.ms.marking.service.MarkingService;
+import com.alibaba.fastjson.JSONObject;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+/**
+ * @Description: quartz定时任务 task
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/1/16
+ */
+@Component
+public class ScheduledTask {
+    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(ScheduledTask.class);
+
+    @Resource
+    SqlUtil sqlUtil;
+
+    @Resource
+    RandomUtil randomUtil;
+
+    @Resource
+    PaperRepo paperRepo;
+
+    @Resource
+    MarkTaskRepo markTaskRepo;
+
+    @Resource
+    WorkRepo workRepo;
+
+    @Resource
+    MarkTaskJobRepo markTaskJobRepo;
+
+    @Resource
+    MarkLogAop markLogAop;
+
+    @Resource
+    MarkingService markingService;
+
+    @Resource
+    MarkingConfig markingConfig;
+
+    boolean repairPaper = false, repairTask = false, markTaskJob = false;
+
+    /**
+     * 修复密号重复 30秒一次
+     *
+     * @throws Exception
+     */
+    @Scheduled(cron = "0/30 * * * * ?")
+    public void repairRepeatSecretNumberTask() throws Exception {
+        if (Objects.nonNull(randomUtil.getRandomMap()) && randomUtil.getRandomMap().size() > 0) {
+            Work work = workRepo.findByActiveTrue();
+            if (Objects.nonNull(work)) {
+                if (!this.repairPaper) {
+                    LOGGER.info("repairRepeatSecretNumberTask 修复试卷密号进来了");
+                    repairRepeatPaper(work.getId());
+                    LOGGER.info("repairRepeatSecretNumberTask 修复试卷密号结束了");
+                }
+                if (!this.repairTask) {
+                    LOGGER.info("repairRepeatSecretNumberTask 修复任务密号进来了");
+                    repairRepeatTask(work.getId());
+                    LOGGER.info("repairRepeatSecretNumberTask 修复任务密号结束了");
+                }
+            }
+        }
+    }
+
+    /**
+     * 修复异步任务日志遗漏 1分钟一次
+     */
+    @Scheduled(cron = "0 0/1 * * * ?")
+    public void markTaskJob() {
+        Work work = workRepo.findByActiveTrue();
+        if (Objects.nonNull(work)) {
+            if (!markTaskJob) {
+                LOGGER.info("markTaskJob 进来了");
+                repairMarkTaskJob(work);
+                LOGGER.info("markTaskJob 结束了");
+            }
+        }
+    }
+
+    /**
+     * 修复异步任务日志遗漏
+     *
+     * @param work
+     */
+    public void repairMarkTaskJob(Work work) {
+        try {
+            List<MarkTaskJob> markTaskJobList = markTaskJobRepo.findAllByStatusIsFalseAndWorkId(work.getId());
+            if (Objects.nonNull(markTaskJobList) && markTaskJobList.size() > 0) {
+                long startTime = System.currentTimeMillis();
+                this.markTaskJob = true;
+                for (MarkTaskJob m : markTaskJobList) {
+                    long createTime = m.getCreateTime().getTime();
+                    if ((startTime - createTime) / 1000 > 60) {
+                        JSONObject jsonObject = JSONObject.parseObject(m.getDataObject());
+                        String type = String.valueOf(jsonObject.get("type"));
+                        Long paperId = Long.parseLong(String.valueOf(jsonObject.get("paperId")));
+                        Paper paper = paperRepo.findOne(paperId);
+                        List<MarkTask> markTaskList = markTaskRepo.findByWorkIdAndStageAndPaperId(work.getId(), MarkStage.LEVEL, paperId);
+                        if (Objects.nonNull(markTaskList) && markTaskList.size() > 0) {
+                            if (Objects.equals("levelsLog", type)) {
+                                markingService.levelsLog(markTaskList, paper, m);//档位差日志记录
+                            } else if (Objects.equals("autoCallback", type)) {
+                                markLogAop.autoCallback(markTaskList, markingConfig.getDeviation(), paper, m, work.getName());//自动打回记录
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        } finally {
+            this.markTaskJob = false;
+        }
+    }
+
+    /**
+     * 修复试卷密号
+     *
+     * @param workId
+     * @throws Exception
+     */
+    @Transactional
+    public void repairRepeatPaper(Long workId) throws Exception {
+        try {
+            String sql = "select * from (select p.random_seq, count(p.random_seq) as seq from paper p where p.work_id = ? group by p.random_seq) temp where temp.seq > 1";
+            List list = sqlUtil.execSqlForMapNative(sql, workId);
+            Set papers = new HashSet();
+            if (Objects.nonNull(list) && list.size() > 0) {
+                this.repairPaper = true;
+                for (int i = 0; i < list.size(); i++) {
+                    Map map = (Map) list.get(i);
+                    Long randomSeq = Long.parseLong(String.valueOf(map.get("random_seq")));
+                    List<Paper> paperList = paperRepo.findByRandomSeq(randomSeq);
+                    paperList.remove(0);//删除一条
+                    for (Paper paper : paperList) {
+                        Long randomNew = this.getRandomPaper(paper.getWorkId(), paper.getExamNumber());
+                        String secretNumberNew = paper.getSubject().ordinal() + paper.getAreaCode() + randomNew;
+                        paper.setRandomSeq(randomNew);
+                        paper.setSecretNumber(secretNumberNew);
+                        papers.add(paper);
+                    }
+                }
+            }
+            if (Objects.nonNull(papers) && papers.size() > 0) {
+                LOGGER.info("需要修改的paper数为:{}", papers.size());
+                paperRepo.save(papers);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        } finally {
+            this.repairPaper = false;
+        }
+    }
+
+    /**
+     * 修复任务密号
+     *
+     * @param workId
+     * @throws Exception
+     */
+    @Transactional
+    public void repairRepeatTask(Long workId) throws Exception {
+        try {
+            String sql = "select * from (select mt.random_seq_new, count(mt.random_seq_new) as seq from mark_task mt where mt.work_id = ? group by mt.random_seq_new) temp where temp.seq > 1";
+            List list = sqlUtil.execSqlForMapNative(sql, workId);
+            Set tasks = new HashSet();
+            if (Objects.nonNull(list) && list.size() > 0) {
+                this.repairTask = true;
+                for (int i = 0; i < list.size(); i++) {
+                    Map map = (Map) list.get(i);
+                    Long randomSeq = Long.parseLong(String.valueOf(map.get("random_seq_new")));
+                    List<MarkTask> markTaskList = markTaskRepo.findByRandomSeqNew(randomSeq);
+                    markTaskList.remove(0);//删除一条
+                    for (MarkTask markTask : markTaskList) {
+                        Long randomNew = this.getRandomTask(markTask.getMarkerId(), markTask.getPaper().getId(), markTask.getWorkId(), markTask.getPaper().getExamNumber());
+                        String secretNumberNew = markTask.getMarkerId() + markTask.getSubject().ordinal() + markTask.getPaper().getAreaCode() + randomNew;
+                        markTask.setRandomSeqNew(randomNew);
+                        markTask.setSecretNumber(secretNumberNew);
+                        tasks.add(markTask);
+                    }
+                }
+            }
+            if (Objects.nonNull(tasks) && tasks.size() > 0) {
+                LOGGER.info("需要修改的task数为:{}", tasks.size());
+                markTaskRepo.save(tasks);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        } finally {
+            this.repairTask = false;
+        }
+    }
+
+    /**
+     * 修复试卷随机号
+     *
+     * @param workId
+     * @param examNumber
+     * @return
+     * @throws Exception
+     */
+    private Long getRandomPaper(Long workId, String examNumber) throws Exception {
+        int count = 0, result = 0;
+        Long random = 0L;
+        while (true) {
+            random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size()));
+            result = paperRepo.countByWorkIdAndExamNumberAndRandomSeq(workId, examNumber, random);
+            if (result == 0 && Long.parseLong(examNumber) != random) {
+                break;
+            } else {
+                count++;
+            }
+            if (count > 1000) {
+                randomUtil.getRandom(workId, true);
+                getRandomPaper(workId, examNumber);
+            }
+        }
+        return random;
+    }
+
+    /**
+     * 修复任务随机号
+     *
+     * @param markerId
+     * @param paperId
+     * @param workId
+     * @param examNumber
+     * @return
+     * @throws Exception
+     */
+    private Long getRandomTask(Long markerId, Long paperId, Long workId, String examNumber) throws Exception {
+        int count = 0, result = 0;
+        Long random = 0L;
+        while (true) {
+            random = randomUtil.getRandomMap().get(workId).get(new Random().nextInt(randomUtil.getRandomMap().get(workId).size()));
+            result = markTaskRepo.countByMarkerIdAndPaperIdAndWorkIdAndRandomSeqNew(markerId, paperId, workId, random);
+            if (result == 0 && Long.parseLong(examNumber) != random) {
+                break;
+            } else {
+                count++;
+            }
+            if (count > 1000) {
+                randomUtil.getRandom(workId, true);
+                getRandomTask(markerId, paperId, workId, examNumber);
+            }
+        }
+        return random;
+    }
+}

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

@@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -61,6 +62,9 @@ public class MarkingService {
     @Autowired
     @Autowired
     ArbitrateCallback arbitrateCallback;
     ArbitrateCallback arbitrateCallback;
 
 
+    @Resource
+    MarkTaskJobRepo markTaskJobRepo;
+
     /**
     /**
      * 提交分档。如果每个评卷都提交了,则进行仲裁判定,如果没有触发仲裁就定档
      * 提交分档。如果每个评卷都提交了,则进行仲裁判定,如果没有触发仲裁就定档
      *
      *
@@ -168,6 +172,23 @@ public class MarkingService {
     public void levelsLog(List<MarkTask> markTasks, Paper paper) {
     public void levelsLog(List<MarkTask> markTasks, Paper paper) {
         //20191108wangliang加入档位落差值计算
         //20191108wangliang加入档位落差值计算
         LOG.info("this:{} levelsLog异步回调进来了", this);
         LOG.info("this:{} levelsLog异步回调进来了", this);
+        JSONObject js = new JSONObject();
+        js.put("paperId", paper.getId());
+        js.put("type", "levelsLog");
+        MarkTaskJob markTaskJob = new MarkTaskJob(js.toJSONString(), false, paper.getWorkId());
+        levelsLog(markTasks, paper, markTaskJob);
+        markTaskJobRepo.save(markTaskJob);
+        LOG.info("this:{} levelsLog异步回调结束了", this);
+    }
+
+    /**
+     * 档位落差值计算日志
+     *
+     * @param markTasks
+     * @param paper
+     * @param markTaskJob
+     */
+    public void levelsLog(List<MarkTask> markTasks, Paper paper, MarkTaskJob markTaskJob) {
         Map<Long, String> levelsMap = markTasks.stream().collect(Collectors.toMap(MarkTask::getMarkerId, o -> o.getResult().toUpperCase()));
         Map<Long, String> levelsMap = markTasks.stream().collect(Collectors.toMap(MarkTask::getMarkerId, o -> o.getResult().toUpperCase()));
         arbitrateCallback.judge(levelsMap, paper.getLevel(), new ArbitrateResult() {
         arbitrateCallback.judge(levelsMap, paper.getLevel(), new ArbitrateResult() {
             @Override
             @Override
@@ -196,10 +217,10 @@ public class MarkingService {
                         }
                         }
                     }
                     }
                 }
                 }
+                markTaskJobRepo.updateMarkTaskJobByVersion(markTaskJob.getId(), markTaskJob.getVersion());
                 LOG.info("this:{},callback levelsLog异步回调结束了", this);
                 LOG.info("this:{},callback levelsLog异步回调结束了", this);
             }
             }
         });
         });
-        LOG.info("this:{} levelsLog异步回调结束了", this);
     }
     }
 
 
     /**
     /**