瀏覽代碼

新增调度计划定时扫描逻辑

andyliu 1 年之前
父節點
當前提交
558b6e7c90

+ 121 - 0
src/main/java/com/shkpr/service/aimodelpower/bizmgr/WODispatchPlanTmDoBizFun.java

@@ -0,0 +1,121 @@
+package com.shkpr.service.aimodelpower.bizmgr;
+
+import com.global.base.tools.FastJsonUtil;
+import com.shkpr.service.aimodelpower.commtools.CommTool;
+import com.shkpr.service.aimodelpower.components.locks.CountDownLatchEx;
+import com.shkpr.service.aimodelpower.components.locks.WODispatchPlanLockMgr;
+import com.shkpr.service.aimodelpower.constants.CommFieldStatus;
+import com.shkpr.service.aimodelpower.constants.TaskQueueDataTypeEx;
+import com.shkpr.service.aimodelpower.dbdao.DBMgrProxy;
+import com.shkpr.service.aimodelpower.dbdao.services.intef.WODispatchPlanDBService;
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchPlanInfoTable;
+import com.shkpr.service.aimodelpower.dto.CommUTMBean;
+import com.shkpr.service.aimodelpower.dto.ResponseCode;
+import com.shkpr.service.aimodelpower.dto.WODispatchCheckBean;
+import com.shkpr.service.aimodelpower.dto.WODispatchCheckTotal;
+import com.shkpr.service.aimodelpower.globalmgr.AsyncTaskQueueMgr;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+import java.util.Map;
+
+public class WODispatchPlanTmDoBizFun {
+    private static WODispatchPlanDBService getThisDBService(){ return DBMgrProxy.getInstance().applyWODispatchPlanApi();}
+
+    public static ResponseCode produceCmd(String planId, long checkTm){
+        ResponseCode code = ResponseCode.RESULT_BAD;
+        if (StringUtils.isEmpty(planId))
+            return code;
+
+        CountDownLatchEx latchEx = null;
+        int nRetry = 3;
+        do {
+            try {
+                latchEx = WODispatchPlanLockMgr.tryLatchForPlan(planId, 20000);
+            }catch (Exception e){
+                latchEx = null;
+            }
+
+            if (latchEx != null){
+                code = handleProduceCmd(planId, checkTm);
+                break;
+            }
+        }while ((--nRetry) > 0);
+
+        if (latchEx != null){
+            latchEx.countDown();
+        }else{
+            code = handleProduceCmd(planId, checkTm);
+        }
+        return code;
+    }
+
+    private static ResponseCode handleProduceCmd(String planId, long checkTm){
+        ResponseCode code = ResponseCode.RESULT_BAD;
+        //通过planId在计划视图中查询指定计划基本信息,进行如下比对:
+        //若:status==1 && checkTm == next_task_time && batch_total > 0
+        //则对排班调用接口生成指令工单,否则直接返回
+        return code;
+    }
+
+    public static void checkPlanForProduce(){
+        long lCurTime = System.currentTimeMillis();
+        Map<String, Object> mapSel = getThisDBService().totalWillProduceCounts(null
+                , null
+                , ""
+                , String.format("and status = %d and next_take_time > 0 and next_take_time <= %d"
+                        , CommFieldStatus.ENABLE
+                        , lCurTime));
+
+        if (mapSel != null && mapSel.size() > 0){
+            WODispatchCheckTotal oTotal = FastJsonUtil.map2Obj(mapSel, WODispatchCheckTotal.class, true);
+            if (oTotal != null && oTotal.getTotal() > 0){
+                long curIndex = -1L;
+                int limit = 50, offset = 0, realTotal = 0;
+                while (curIndex < oTotal.getMaxIndex()){
+                    List<Map<String, Object>> arrDbTmp = getThisDBService().listAllWithsEx(WODispatchPlanInfoTable.R_INFO.TABLE
+                            , WODispatchPlanInfoTable.R_INFO.TOTAL_PRODUCE_FILED
+                            , limit
+                            , offset
+                            ,null
+                            ,null
+                            , WODispatchPlanInfoTable.R_INFO.TOTAL_PRODUCE_ORDER
+                            , String.format("and status = %d and (id between %d and %d)"
+                                    ,CommFieldStatus.ENABLE
+                                    ,oTotal.getMinIndex()
+                                    ,oTotal.getMaxIndex()));
+                    if (CommTool.listSize(arrDbTmp) <= 0)
+                        break;
+
+                    realTotal += arrDbTmp.size();
+                    offset = realTotal;
+
+                    List<WODispatchCheckBean> arrRes = FastJsonUtil.batchMap2Obj(arrDbTmp, WODispatchCheckBean.class, true);
+                    if (CommTool.listSize(arrRes) <= 0)
+                        continue;
+
+                    for (WODispatchCheckBean oItem:arrRes){
+                        if (oItem.getId() > curIndex)
+                            curIndex = oItem.getId();
+                        if (oItem.getStatus() != CommFieldStatus.ENABLE)
+                            continue;
+
+                        boolean bProduce = false;
+                        boolean bGenNext = false;
+                        if (oItem.getBatchTotal() <= 0 || oItem.getNextTakeTime() <= 0L){
+                            bGenNext = true;
+                        }else if (oItem.getNextTakeTime() <= lCurTime){
+                            bProduce = true;
+                        }
+
+                        if (bProduce){
+                            AsyncTaskQueueMgr.getInstance().postTaskData(TaskQueueDataTypeEx.ASYNC_PRODUCE_WO_DISPATCH_CMD, new CommUTMBean(oItem.getUid(), oItem.getNextTakeTime()));
+                        }else if (bGenNext){
+                            //do nothing
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 25 - 0
src/main/java/com/shkpr/service/aimodelpower/components/locks/WODispatchPlanLockMgr.java

@@ -0,0 +1,25 @@
+package com.shkpr.service.aimodelpower.components.locks;
+
+public class WODispatchPlanLockMgr extends BaseLockMgr{
+    private static volatile WODispatchPlanLockMgr msInstance = null;
+    private static WODispatchPlanLockMgr getInstance(){
+        if (msInstance == null){
+            synchronized (WODispatchPlanLockMgr.class){
+                if (msInstance == null)
+                    msInstance = new WODispatchPlanLockMgr();
+            }
+        }
+        return msInstance;
+    }
+
+    private WODispatchPlanLockMgr() {
+    }
+
+    public static void releaseResource(){
+        getInstance().timerReleaseLatch();
+    }
+
+    public static CountDownLatchEx tryLatchForPlan(String planId, long waitMsTm) throws Exception{
+        return getInstance().tryLatchForXXX("WP_P_"+planId, waitMsTm);
+    }
+}

+ 1 - 0
src/main/java/com/shkpr/service/aimodelpower/constants/LogFlagBusiType.java

@@ -146,6 +146,7 @@ public enum  LogFlagBusiType {
     BUSI_DB_3TH_CS_ORDER_SYNCH(173,"DB 3TH CS Order Synch"),
     BUSI_DB_WARN_REPORT_PUSH_REQ_LINK(174,"DB Warn Report Push Req Link"),
     BUSI_DB_WARN_TYPE_DICT_MGR(175,"DB Warn Type Dict Mgr"),
+    BUSI_DB_WO_DISPATCH_PLAN(176,"DB WO Dispatch Info"),
 
     BUSI_CHILD_DB_TAP_WATER(176,"DB TAP WATER Mgr"),
 

+ 2 - 1
src/main/java/com/shkpr/service/aimodelpower/constants/TaskQueueDataTypeEx.java

@@ -12,7 +12,8 @@ public class TaskQueueDataTypeEx extends TaskQueueDataType {
     public static final int ASYNC_VERIFY_REPORT_FOR_JOB = ASYNC_PRODUCE_FAULT_FOR_JOB+1;
     public static final int ASYNC_ANALYSIS_WWS_DISPATCH_PLAN = ASYNC_VERIFY_REPORT_FOR_JOB+1;
     public static final int ASYNC_REPORT_PATROL_REAL_GIS = ASYNC_ANALYSIS_WWS_DISPATCH_PLAN+1;
-    public static final int ASYNC_TASK_END = 1010;
+    public static final int ASYNC_PRODUCE_WO_DISPATCH_CMD = ASYNC_REPORT_PATROL_REAL_GIS+1;
+    public static final int ASYNC_TASK_END = 1020;
 
     public static final int DELAY_TASK_BEGIN = 2000;
     public static final int DELAY_PUSH_TASK = DELAY_TASK_BEGIN+1;

+ 5 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/DBMgrProxy.java

@@ -13,6 +13,7 @@ public class DBMgrProxy {
     private volatile FileAttachmentDBService fileAttachmentDBService = null;
     private volatile TypeDefineDBService typeDefineDBService = null;
     private volatile TestGeomInfoDBService testGeomInfoDBService = null;
+    private volatile WODispatchPlanDBService woDispatchPlanDBService = null;
 
     //TODO 其他数据源
     private volatile WaterTapWaterService waterTapWaterService = null;
@@ -49,6 +50,8 @@ public class DBMgrProxy {
             waterTapWaterService = (WaterTapWaterService)SpringContextUtil.getBean(WaterTapWaterService.class);
         if (waterCollecationService == null)
             waterCollecationService = (WaterCollecationService)SpringContextUtil.getBean(WaterCollecationService.class);
+        if (woDispatchPlanDBService == null)
+            woDispatchPlanDBService = (WODispatchPlanDBService)SpringContextUtil.getBean(WODispatchPlanDBService.class);
     }
 
     public RolePowerDBService applyRolePowerApi() {return rolePowerDBService;}
@@ -68,4 +71,6 @@ public class DBMgrProxy {
     public WaterTapWaterService applyWaterTapWaterService() {return  waterTapWaterService;}
 
     public WaterCollecationService applyWaterCollecationService() {return  waterCollecationService;}
+
+    public WODispatchPlanDBService applyWODispatchPlanApi() {return woDispatchPlanDBService;}
 }

+ 72 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchPlanMapper.java

@@ -0,0 +1,72 @@
+package com.shkpr.service.aimodelpower.dbdao.mapper;
+
+import com.shkpr.service.aimodelpower.dbdao.providers.WODispatchPlanSqlProvider;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+import java.util.Map;
+
+public interface WODispatchPlanMapper {
+    @SelectProvider(type = WODispatchPlanSqlProvider.class, method = "totalWillProduceCounts")
+    Map<String, Object> totalWillProduceCounts(@Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+
+    @SelectProvider(type = WODispatchPlanSqlProvider.class, method = "totalCounts")
+    int totalCounts(@Param("table") String table
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = WODispatchPlanSqlProvider.class, method = "listAllWiths")
+    List<Map<String, Object>> listAllWiths(@Param("table") String table, @Param("filed") String file
+            , @Param("limit") int limit
+            , @Param("offset") int offset
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = WODispatchPlanSqlProvider.class, method = "getByUniqueId")
+    Map<String, Object> getOne(@Param("table") String table, @Param("filed") String filed, @Param("id") Object id);
+
+    @SelectProvider(type = WODispatchPlanSqlProvider.class, method = "batchQueryIn")
+    List<Map<String, Object>> batchQueryIn(@Param("table") String table, @Param("filed") String file
+            , @Param("ids") List<? extends Object> ids
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = WODispatchPlanSqlProvider.class, method = "batchQueryWiths")
+    List<Map<String, Object>> batchQueryWiths(@Param("table") String table, @Param("filed") String filed
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("order") String order
+            , @Param("extend") String extend);
+
+    @InsertProvider(type = WODispatchPlanSqlProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = WODispatchPlanSqlProvider.class, method = "updateWiths")
+    int updateWiths(@Param("datas") Map<String, Object> datas
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @SelectProvider(type = WODispatchPlanSqlProvider.class, method = "existsLine")
+    boolean existLine(@Param("table") String table
+            , @Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @UpdateProvider(type = WODispatchPlanSqlProvider.class, method = "batchUpdateWiths")
+    int batchUpdateWiths( @Param("andWheres") List<Map<String, Object>> andWheres
+            , @Param("datas") List<Map<String, Object>> datas);
+}

+ 83 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchPlanSqlProvider.java

@@ -0,0 +1,83 @@
+package com.shkpr.service.aimodelpower.dbdao.providers;
+
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchPlanInfoTable;
+import org.springframework.util.StringUtils;
+
+import java.util.Map;
+
+public class WODispatchPlanSqlProvider extends BaseSqlProvider implements WODispatchPlanInfoTable {
+    @Override
+    public String getRTableName() {
+        return R_INFO.TABLE;
+    }
+
+    @Override
+    public String getWTableName() {
+        return W_INFO.TABLE;
+    }
+
+    @Override
+    public String getRUniqueId() {
+        return R_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getWUniqueId() {
+        return W_INFO.UNIQUE_ID;
+    }
+
+    @Override
+    public String getSAllFiled() {
+        return R_INFO.ALL_FILED;
+    }
+
+    @Override
+    public String getRPrimaryKey() {
+        return R_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public String getWPrimaryKey() {
+        return W_INFO.PRIMARY_KEY;
+    }
+
+    @Override
+    public boolean isWJsonForFiled(String filedName) {
+        return false;
+    }
+
+    /**
+     * 该接口被调用时要求原始入口为:void Fun(@Param("andWheres") Map<String, Object>
+     *                                      , @Param("orWheres") Map<String, Object>
+     *                                      , @Param("order") String order
+     *                                      , @Param("extend") String extend)
+     * @param mapParams
+     * @return
+     */
+    public String totalWillProduceCounts(Map<String, Object> mapParams){
+        Map<String, Object> andWheres = (Map<String, Object>)mapParams.get("andWheres");
+        Map<String, Object> orWheres = (Map<String, Object>)mapParams.get("orWheres");
+        String orderBy = (String)mapParams.get("order");
+        String extend = (String)mapParams.get("extend");
+
+        StringBuilder sql = new StringBuilder("");
+        sql.append("select count(*) AS total, min("+W_INFO.ID+") AS min_index, max("+ W_INFO.ID+") AS max_index from " + getWTableName() + " where 1=1 ");
+
+        String strAndWheres = genWheres(andWheres, "andWheres", "and");
+        String strOrWheres = genWheres(orWheres, "orWheres", "or");
+        if (StringUtils.isEmpty(strAndWheres) && StringUtils.isEmpty(strOrWheres)){
+        }else{
+            if (!StringUtils.isEmpty(strAndWheres))
+                sql.append(" and " + strAndWheres);
+            if (!StringUtils.isEmpty(strOrWheres))
+                sql.append(" or " + strOrWheres);
+        }
+
+        if (!StringUtils.isEmpty(extend))
+            sql.append(" " + extend);
+        if (!StringUtils.isEmpty(orderBy))
+            sql.append(" ORDER BY " + orderBy);
+
+        return sql.toString();
+    }
+}

+ 122 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/services/WODispatchPlanDBServiceImpl.java

@@ -0,0 +1,122 @@
+package com.shkpr.service.aimodelpower.dbdao.services;
+
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.aimodelpower.commtools.CommTool;
+import com.shkpr.service.aimodelpower.constants.LogFlagBusiType;
+import com.shkpr.service.aimodelpower.dbdao.mapper.WODispatchPlanMapper;
+import com.shkpr.service.aimodelpower.dbdao.services.intef.WODispatchPlanDBService;
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchPlanInfoTable;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class WODispatchPlanDBServiceImpl implements WODispatchPlanDBService,WODispatchPlanInfoTable {
+    private String mStrClassName = "";
+    private String mBusinessType = "";
+    private String logTag = "";
+    public WODispatchPlanDBServiceImpl() {
+        mStrClassName = this.getClass().getSimpleName();
+        mBusinessType = LogFlagBusiType.BUSI_DB_WO_DISPATCH_PLAN.toStrValue();
+        logTag = "WO Dispatch Plan Info";
+    }
+
+    @SuppressWarnings("all")
+    @Autowired
+    WODispatchPlanMapper woDispatchPlanMapper;
+
+    @Override
+    public List<Map<String, Object>> listAllWithsEx(String table, String filed, int limit, int offset, Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = woDispatchPlanMapper.listAllWiths(table, filed, limit, offset, andWheres, orWheres, orderBy, extend);
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , mBusinessType
+                    , mStrClassName
+                    , String.format("List All %s lines(limit=%d, offset=%d, orderBy=%s, back.size=%d) from database, code:{%d} msg:{%s} ..."
+                            , logTag
+                            , limit, offset
+                            , orderBy
+                            , CommTool.listSize(arrRes)
+                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
+
+    @Override
+    public Map<String, Object> totalWillProduceCounts(Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            Map<String, Object> mapRes = woDispatchPlanMapper.totalWillProduceCounts(andWheres, orWheres, orderBy, extend);//查询不到时也会返回null
+            if (mapRes == null)
+                return new HashMap<>();
+            else
+                return mapRes;
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+            return null;
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , mBusinessType
+                    , mStrClassName
+                    , String.format("Total Will Produce Counts from database, code:{%d} msg:{%s} ...", nCode, strMsg));
+        }
+    }
+
+    @Override
+    public List<Map<String, Object>> listAllWiths(int limit, int offset, Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryIn(List<?> ids, String orderBy, String extend) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> batchQueryWiths(Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
+        return null;
+    }
+
+    @Override
+    public int totalCounts(Map<String, Object> andWheres, Map<String, Object> orWheres) {
+        return 0;
+    }
+
+    @Override
+    public Map<String, Object> getOne(Object id) {
+        return null;
+    }
+
+    @Override
+    public int insertByMap(Map<String, Object> maps) {
+        return 0;
+    }
+
+    @Override
+    public int updateWiths(Map<String, Object> datas, Map<String, Object> andWheres) {
+        return 0;
+    }
+
+    @Override
+    public int delete(Object id) {
+        return 0;
+    }
+
+    @Override
+    public int batchDeleteIn(List<?> ids, String extend) {
+        return 0;
+    }
+}

+ 19 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/services/intef/WODispatchPlanDBService.java

@@ -0,0 +1,19 @@
+package com.shkpr.service.aimodelpower.dbdao.services.intef;
+
+import java.util.List;
+import java.util.Map;
+
+public interface WODispatchPlanDBService extends BaseDBService {
+    List<Map<String, Object>> listAllWithsEx(String table, String filed
+            , int limit
+            , int offset
+            , Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String orderBy
+            , String extend);
+    Map<String, Object> totalWillProduceCounts(Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String orderBy
+            , String extend);
+}
+

+ 34 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchPlanInfoTable.java

@@ -0,0 +1,34 @@
+package com.shkpr.service.aimodelpower.dbdao.tables;
+
+public interface WODispatchPlanInfoTable {
+    interface R_INFO{
+        String ID = "id";
+        String TABLE = "v_k4_wo_dispatch_plan_info";
+        String PRIMARY_KEY = "plan_id";
+        String ALL_FILED = "*";
+        String UNIQUE_ID = "plan_id";
+        String STATUS = "status";
+        String CREATE_TIME = "create_time";
+        String NEXT_TAKE_TIME = "next_take_time";
+        String LAST_TAKE_TIME = "last_take_time";
+        String TYPE = "type";
+        String BATCH_TOTAL = "batch_total";
+
+        String TOTAL_PRODUCE_ORDER = "next_take_time ASC,id ASC";
+        String TOTAL_PRODUCE_FILED = new StringBuilder("id")
+                .append(",").append(UNIQUE_ID).append(" AS uid")
+                .append(",").append(STATUS)
+                .append(",").append(NEXT_TAKE_TIME)
+                .append(",").append(TYPE)
+                .append(",").append(BATCH_TOTAL).toString();
+    }
+
+    interface W_INFO{
+        String ID = "id";
+        String TABLE = "k4_wo_dispatch_plan_info";
+        String PRIMARY_KEY = "plan_id";
+        String UNIQUE_ID = "plan_id";
+        String NEXT_TAKE_TIME = "next_take_time";
+        String LAST_TAKE_TIME = "last_take_time";
+    }
+}

+ 19 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/CommUTMBean.java

@@ -0,0 +1,19 @@
+package com.shkpr.service.aimodelpower.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CommUTMBean {
+    private String uid = "";
+    private long time = 0L;
+
+    public CommUTMBean() {
+    }
+
+    public CommUTMBean(String uid, long time) {
+        this.uid = uid;
+        this.time = time;
+    }
+}

+ 18 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/WODispatchCheckBean.java

@@ -0,0 +1,18 @@
+package com.shkpr.service.aimodelpower.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class WODispatchCheckBean {
+    private long id = 0L;
+    private String uid = "";
+    private int status = -1;
+    private long nextTakeTime = 0L;
+    private int type = 0;
+    private int batchTotal = 0;//排班个数
+
+    public WODispatchCheckBean() {
+    }
+}

+ 13 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/WODispatchCheckTotal.java

@@ -0,0 +1,13 @@
+package com.shkpr.service.aimodelpower.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class WODispatchCheckTotal extends CommTotalMinMax{
+    public WODispatchCheckTotal() {
+        super();
+    }
+}
+

+ 14 - 0
src/main/java/com/shkpr/service/aimodelpower/globalmgr/ScheduleTaskMgr.java

@@ -5,8 +5,11 @@ import com.global.base.log.LogPrintMgr;
 import com.global.base.thread.ThreadPoolProxy;
 import com.shkpr.service.aimodelpower.bizmgr.KprAimTapWaterBizFun;
 import com.shkpr.service.aimodelpower.bizmgr.KprAimWaterCollecationBizFun;
+import com.shkpr.service.aimodelpower.bizmgr.WODispatchPlanTmDoBizFun;
 import com.shkpr.service.aimodelpower.commtools.TimeTool;
+import com.shkpr.service.aimodelpower.components.locks.WODispatchPlanLockMgr;
 import com.shkpr.service.aimodelpower.constants.LogFlagBusiType;
+import com.shkpr.service.aimodelpower.dto.TraceRunnable;
 import com.zaxxer.hikari.HikariDataSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -59,6 +62,7 @@ public class ScheduleTaskMgr {
         ThreadPoolProxy.getInstance().getFixedThreadPool("COMM").execute(new Runnable() {
             @Override
             public void run() {
+                WODispatchPlanLockMgr.releaseResource();
             }
         });
     }
@@ -190,4 +194,14 @@ public class ScheduleTaskMgr {
         };
         timer.schedule(timerTask1,11000);//11秒后执行一次
     }
+
+    @Scheduled(cron = "${cron.check.wo.dispatch.plan}")
+    public void checkPatrolPlan(){
+        ThreadTaskMgr.runTask(new TraceRunnable("S.CHECK.WO.DISPATCH.PLAN.PRODUCE") {
+            @Override
+            public void function() {
+                WODispatchPlanTmDoBizFun.checkPlanForProduce();
+            }
+        });
+    }
 }

+ 16 - 0
src/main/java/com/shkpr/service/aimodelpower/queues/AsyncCommTaskQueueHandler.java

@@ -1,7 +1,11 @@
 package com.shkpr.service.aimodelpower.queues;
 
 import com.global.base.taskqueue.*;
+import com.shkpr.service.aimodelpower.bizmgr.WODispatchPlanTmDoBizFun;
 import com.shkpr.service.aimodelpower.constants.TaskQueueDataTypeEx;
+import com.shkpr.service.aimodelpower.dto.CommUTMBean;
+import com.shkpr.service.aimodelpower.dto.TraceRunnable;
+import com.shkpr.service.aimodelpower.globalmgr.ThreadTaskMgr;
 import com.shkpr.service.aimodelpower.globalmgr.TraceLogMgr;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -55,6 +59,18 @@ public class AsyncCommTaskQueueHandler extends BaseTaskQueueHandler {
                             taskData = null;
                         }
                         break;
+                        case TaskQueueDataTypeEx.ASYNC_PRODUCE_WO_DISPATCH_CMD:{
+                            final CommUTMBean checkBean = (CommUTMBean)taskData.getData();
+                            ThreadTaskMgr.runTask(new TraceRunnable(traceID+".ASYNC.WO.DISPATCH.PRODUCE.JOB") {
+                                @Override
+                                public void function() {
+                                    WODispatchPlanTmDoBizFun.produceCmd(checkBean.getUid(), checkBean.getTime());
+                                }
+                            });
+                            bExeOk = true;
+                            taskData = null;
+                        }
+                        break;
                         default:{
                             bExeOk = true;
                             taskData = null;

+ 2 - 0
src/main/resources/application.properties

@@ -156,6 +156,8 @@ cloud.task.service.address=https://119.96.165.176:9090/
 cron.refresh.timer.clock=0 0-5 0 * * ?
 #每天凌晨03:00:00执行
 cron.clear.local.cache=0 0 3 * * ?
+#每隔5分钟执行一次
+cron.check.wo.dispatch.plan=0 0/5 * * * ?
 
 #自来水相关
 #查询分区类型配置: