Sfoglia il codice sorgente

河南郸城调度计划列表 定时任务和计算生效逻辑变更

1037015548@qq.com 11 mesi fa
parent
commit
7b396dc171
19 ha cambiato i file con 1051 aggiunte e 14 eliminazioni
  1. 75 0
      src/main/java/com/shkpr/service/aimodelpower/bizmgr/WODispatchDatabaseBizFun.java
  2. 133 13
      src/main/java/com/shkpr/service/aimodelpower/bizmgr/WODispatchPlanTmDoBizFun.java
  3. 8 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/DBMgrProxy.java
  4. 81 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchDatabaseDisposalMapper.java
  5. 81 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchDatabaseMapper.java
  6. 47 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchDatabaseDisposalSqlProvider.java
  7. 47 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchDatabaseSqlProvider.java
  8. 173 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/services/WODispatchDatabaseDBServiceImpl.java
  9. 155 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/services/WODispatchDatabaseDisposalDBServiceImpl.java
  10. 2 1
      src/main/java/com/shkpr/service/aimodelpower/dbdao/services/WODispatchPlanDBServiceImpl.java
  11. 19 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/services/intef/WODispatchDatabaseDBService.java
  12. 14 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/services/intef/WODispatchDatabaseDisposalDBService.java
  13. 1 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/services/intef/WODispatchPlanDBService.java
  14. 26 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchDatabaseDisposalTable.java
  15. 30 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchDatabaseTable.java
  16. 33 0
      src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchDatabaseModel/DispatchDatabaseSSModel.java
  17. 1 0
      src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchCmdBatchItemNextTimeModel.java
  18. 2 0
      src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchPlanInfoModel.java
  19. 123 0
      src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchDatabase/JPDispatchDatabaseInfoSS.java

+ 75 - 0
src/main/java/com/shkpr/service/aimodelpower/bizmgr/WODispatchDatabaseBizFun.java

@@ -0,0 +1,75 @@
+package com.shkpr.service.aimodelpower.bizmgr;
+
+import com.global.base.tools.FastJsonUtil;
+import com.shkpr.service.aimodelpower.commtools.TimeTool;
+import com.shkpr.service.aimodelpower.dbdao.DBMgrProxy;
+import com.shkpr.service.aimodelpower.dbdao.services.WODispatchDatabaseDBServiceImpl;
+import com.shkpr.service.aimodelpower.dbdao.services.intef.WODispatchCmdBatchItemDBService;
+import com.shkpr.service.aimodelpower.dbdao.services.intef.WODispatchDatabaseDBService;
+import com.shkpr.service.aimodelpower.dbdao.services.intef.WODispatchDatabaseDisposalDBService;
+import com.shkpr.service.aimodelpower.dbdao.services.intef.WODispatchPlanDBService;
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchDatabaseTable;
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchPlanInfoTable;
+import com.shkpr.service.aimodelpower.dto.PageRecordRes;
+import com.shkpr.service.aimodelpower.dto.ResponseCode;
+import com.shkpr.service.aimodelpower.dto.woDispatchDatabaseModel.DispatchDatabaseSSModel;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchDatabase.JPDispatchDatabaseInfoSS;
+
+import java.sql.Time;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName WODispatchDatabaseBizFun
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/7/16
+ * @Version V1.0
+ **/
+public class WODispatchDatabaseBizFun {
+    private final static String mStrClassName = "WODispatchPlanTmDoBizFun";
+    private final static String EMPTY_NULL = "NULL";
+    private final static  String MSG_FAILED = "failed.";
+    private final static  String MSG_SUCCESS = "success.";
+
+    private static WODispatchDatabaseDBService getThisDBService(){ return DBMgrProxy.getInstance().applyWODispatchDatabaseApi();}
+    private static WODispatchDatabaseDisposalDBService getDatabaseDisposalDBService(){ return DBMgrProxy.getInstance().applyWODispatchDatabaseDisposalApi();}
+
+    //TODO 分页查询调度方案库
+    //查询·分页
+    public static PageRecordRes<DispatchDatabaseSSModel> queryPageList(JPDispatchDatabaseInfoSS jsonParam){
+        PageRecordRes<DispatchDatabaseSSModel> oRes = new PageRecordRes<>();
+        if (jsonParam == null)
+            return oRes;
+        final String lilterExtend = jsonParam.genQueryExtend();
+        Map<String,Object> andWheres = new HashMap<>();
+        String sql = "";
+        if(jsonParam.getStartDate()!=null&&jsonParam.getEndDate()!=null) {
+            sql += " AND ("+ WODispatchDatabaseTable.R_INFO.CREATE_TIME + " BETWEEN '"
+                    + TimeTool.convertUTC2DateStr(jsonParam.getStartDate(),TimeTool.TIMESTAMP_FORMAT)
+                    +"' "+"AND '"+TimeTool.convertUTC2DateStr(jsonParam.getEndDate(), TimeTool.TIMESTAMP_FORMAT)+"')";
+        }
+        int nTotals = getThisDBService().totalCountsEx("", andWheres, null, lilterExtend+sql);
+        if (nTotals > 0){
+            List<Map<String,Object>> dataList = getThisDBService().listAllWiths(
+                    jsonParam.getLimit(),
+                    jsonParam.getOffset(),
+                    andWheres,
+                    null,
+                    WODispatchPlanInfoTable.R_INFO.ID,
+                    lilterExtend+sql);
+            if(dataList==null){
+                oRes.setCode(ResponseCode.RESULT_BAD.toInt());
+            }else{
+                List<DispatchDatabaseSSModel> ssInfoModels = dataList.isEmpty()?new ArrayList<>():
+                        FastJsonUtil.batchMap2Obj(dataList,DispatchDatabaseSSModel.class,true);
+                oRes.setCode(ResponseCode.RESULT_NORMAL.toInt());
+                oRes.setTotal(nTotals);
+                oRes.setData(ssInfoModels);
+            }
+        }
+        return oRes;
+    }
+}

+ 133 - 13
src/main/java/com/shkpr/service/aimodelpower/bizmgr/WODispatchPlanTmDoBizFun.java

@@ -114,6 +114,7 @@ public class WODispatchPlanTmDoBizFun {
                     for (DispatchCmdBatchItemModel jpItem : itemModels) {
                         DispatchCmdBatchItemNextTimeModel dispatchCmdBatchItemNextTimeModel = new DispatchCmdBatchItemNextTimeModel();
                         dispatchCmdBatchItemNextTimeModel.setHandleStartTime(jpItem.getHandleStartTime());
+                        dispatchCmdBatchItemNextTimeModel.setHandleStartTimeLimit(jpItem.getHandleEndTime());
                         itemModelNextTimes.add(dispatchCmdBatchItemNextTimeModel);
                     }
                 }
@@ -121,8 +122,9 @@ public class WODispatchPlanTmDoBizFun {
                 nextTimeModel.setPlanType(model.getPlanType());
                 nextTimeModel.setDispatchLeadTime(model.getDispatchLeadTime());
                 nextTimeModel.setCycles(model.getCycles());
-                newNextTakeTime = (model.getPlanType()==0)?0L:returnNextTakeTime(nextTimeModel);
-                newLimitNextTakeTime = (model.getPlanType()==0)?0L:0L;//returnNextTakeTime(nextTimeModel);
+                Map<String,Long> nextMap = returnNextTakeTime(nextTimeModel);
+                newNextTakeTime = (model.getPlanType()==0)?0L:nextMap.get("nextTakeTime");
+                newLimitNextTakeTime = (model.getPlanType()==0)?0L:nextMap.get("limitNextTakeTime");//returnNextTakeTime(nextTimeModel);
 
                 if (model.getPlanType() != 0 && newNextTakeTime <= oldNextTakeTime){
                     newNextTakeTime = oldNextTakeTime;
@@ -150,12 +152,24 @@ public class WODispatchPlanTmDoBizFun {
 
                     Long sugBeginTime = 0L;
                     if(model.getDispatchLeadTime()<0){
-                        sugBeginTime = Instant.ofEpochMilli(model.getNextTakeTime())
+                        sugBeginTime = Instant.ofEpochMilli(model.getNextTakeTime()).atZone(ZoneId.systemDefault())
+                                .withHour(Integer.valueOf(item.getHandleStartTime().split(":")[0]))
+                                .withMinute(Integer.valueOf(item.getHandleStartTime().split(":")[1]))
+                                .withSecond(Integer.valueOf(item.getHandleStartTime().split(":")[2]))
+                                .toInstant()
                                 .plus(Math.abs(model.getDispatchLeadTime()),ChronoUnit.MINUTES).toEpochMilli();
                     }else if(model.getDispatchLeadTime()==0){
-                        sugBeginTime = model.getNextTakeTime();
+                        sugBeginTime = Instant.ofEpochMilli(model.getNextTakeTime()).atZone(ZoneId.systemDefault())
+                                .withHour(Integer.valueOf(item.getHandleStartTime().split(":")[0]))
+                                .withMinute(Integer.valueOf(item.getHandleStartTime().split(":")[1]))
+                                .withSecond(Integer.valueOf(item.getHandleStartTime().split(":")[2]))
+                                .toInstant().toEpochMilli();
                     }else if(model.getDispatchLeadTime()>0){
-                        sugBeginTime = Instant.ofEpochMilli(model.getNextTakeTime())
+                        sugBeginTime = Instant.ofEpochMilli(model.getNextTakeTime()).atZone(ZoneId.systemDefault())
+                                .withHour(Integer.valueOf(item.getHandleStartTime().split(":")[0]))
+                                .withMinute(Integer.valueOf(item.getHandleStartTime().split(":")[1]))
+                                .withSecond(Integer.valueOf(item.getHandleStartTime().split(":")[2]))
+                                .toInstant()
                                 .minus(Math.abs(model.getDispatchLeadTime()),ChronoUnit.MINUTES).toEpochMilli();
                     }
                     if (sugBeginTime<=0L){
@@ -445,8 +459,13 @@ public class WODispatchPlanTmDoBizFun {
 
     //TODO 公用计算下次生效时间的方法
     //TODO 分是否排班
-    public static Long returnNextTakeTime(DispatchPlanInfoNextTimeModel model){
+    public static Map<String,Long> returnNextTakeTime(DispatchPlanInfoNextTimeModel model){
+        Map<String,Long> map = new HashMap<>();
+
         Long nextTakeTime = 0L;
+        Long limitNextTakeTime = 0L;
+        map.put("nextTakeTime",nextTakeTime);
+        map.put("limitNextTakeTime",limitNextTakeTime);
         if(!CollectionUtils.isEmpty(model.getItemsList())){
             List<DispatchCmdBatchItemNextTimeModel> newList = model.getItemsList().stream()
                     .sorted(Comparator.comparing(DispatchCmdBatchItemNextTimeModel::getHandleStartTime))
@@ -459,16 +478,25 @@ public class WODispatchPlanTmDoBizFun {
                                         JSONArray.parseArray(model.getCycles()).getString(0)
                                                 +" "+
                                                 newList.get(0).getHandleStartTime()));
+                Instant endTime = Instant.ofEpochMilli(
+                        TimeTool.convertDateStr2UTC
+                                (
+                                        JSONArray.parseArray(model.getCycles()).getString(0)
+                                                +" "+
+                                                newList.get(0).getHandleStartTimeLimit()));
                 if(model.getDispatchLeadTime()==0) {
                     nextTakeTime = nowTime.toEpochMilli();
+                    limitNextTakeTime = endTime.toEpochMilli();
                 }else if(model.getDispatchLeadTime()>0){
                     nextTakeTime = nowTime.minus(-model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                    limitNextTakeTime = endTime.minus(-model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
                 }else if(model.getDispatchLeadTime()<0){
                     nextTakeTime = nowTime.minus(Math.abs(model.getDispatchLeadTime()), ChronoUnit.MINUTES).toEpochMilli();
+                    limitNextTakeTime = endTime.minus(Math.abs(model.getDispatchLeadTime()), ChronoUnit.MINUTES).toEpochMilli();
                 }
                 //TODO 如果当前时间与下次生效时间是同一天,但是时刻已经是过去时,那么则返回失败信息
                 Long nowTimeLong = TimeTool.getCurMsUTC();
-                if(nowTimeLong>nextTakeTime&&isSameDay(nowTimeLong,nextTakeTime)){
+                if(nowTimeLong>nextTakeTime&&nowTimeLong>limitNextTakeTime&&isSameDay(nowTimeLong,nextTakeTime)){
                     throw new RuntimeException(ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrCode());
                 }
             }else if(model.getPlanType()==1){
@@ -479,14 +507,23 @@ public class WODispatchPlanTmDoBizFun {
                             TimeTool.convertDateStr2UTC
                                     (JSONArray.parseArray(model.getCycles()).getString(0)
                                             +" "+item.getHandleStartTime()));
+                    Instant endTime = Instant.ofEpochMilli(
+                            TimeTool.convertDateStr2UTC
+                                    (
+                                            JSONArray.parseArray(model.getCycles()).getString(0)
+                                                    +" "+
+                                                    item.getHandleStartTimeLimit()));
                     if(nowTime.isBefore(Instant.now()) || nowTime.equals(Instant.now())){
                         isToDay = true;
                         if(model.getDispatchLeadTime()==0) {
                             nextTakeTime = nowTime.toEpochMilli();
+                            limitNextTakeTime = endTime.toEpochMilli();
                         }else if(model.getDispatchLeadTime()>0){
                             nextTakeTime = nowTime.minus(-model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                            limitNextTakeTime = endTime.minus(-model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
                         }else if(model.getDispatchLeadTime()<0){
                             nextTakeTime = nowTime.minus(Math.abs(model.getDispatchLeadTime()), ChronoUnit.MINUTES).toEpochMilli();
+                            limitNextTakeTime = endTime.minus(Math.abs(model.getDispatchLeadTime()), ChronoUnit.MINUTES).toEpochMilli();
                         }
                     }
                 }
@@ -497,23 +534,37 @@ public class WODispatchPlanTmDoBizFun {
                                 TimeTool.convertDateStr2UTC
                                         (JSONArray.parseArray(model.getCycles()).getString(0)
                                                 +" "+newList.get(0).getHandleStartTime())).toEpochMilli();
+                        limitNextTakeTime = Instant.ofEpochMilli(
+                                TimeTool.convertDateStr2UTC
+                                        (JSONArray.parseArray(model.getCycles()).getString(0)
+                                                +" "+newList.get(0).getHandleStartTimeLimit())).toEpochMilli();
                     }else if(model.getDispatchLeadTime()>0){
                         nextTakeTime = Instant.ofEpochMilli(
                                 TimeTool.convertDateStr2UTC
                                         (JSONArray.parseArray(model.getCycles()).getString(0)
                                                 +" "+newList.get(0).getHandleStartTime())).minus(-model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                        limitNextTakeTime = Instant.ofEpochMilli(
+                                TimeTool.convertDateStr2UTC
+                                        (JSONArray.parseArray(model.getCycles()).getString(0)
+                                                +" "+newList.get(0).getHandleStartTimeLimit())).minus(-model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
                     }else if(model.getDispatchLeadTime()<0){
                         nextTakeTime = Instant.ofEpochMilli(
                                 TimeTool.convertDateStr2UTC
                                         (JSONArray.parseArray(model.getCycles()).getString(0)
                                                 +" "+newList.get(0).getHandleStartTime())).minus(Math.abs(model.getDispatchLeadTime()), ChronoUnit.MINUTES).toEpochMilli();
+                        limitNextTakeTime = Instant.ofEpochMilli(
+                                TimeTool.convertDateStr2UTC
+                                        (JSONArray.parseArray(model.getCycles()).getString(0)
+                                                +" "+newList.get(0).getHandleStartTimeLimit())).minus(Math.abs(model.getDispatchLeadTime()), ChronoUnit.MINUTES).toEpochMilli();
                     }
                 }
 
                 //TODO 如果当前时间大于生效时间,说明生效时间过期,则加一天
-                if(nextTakeTime<TimeTool.getCurMsUTC()){
+                if(limitNextTakeTime<TimeTool.getCurMsUTC()){
                     nextTakeTime = Instant.ofEpochMilli(nextTakeTime)
                             .plus(1, ChronoUnit.DAYS).toEpochMilli();
+                    limitNextTakeTime = Instant.ofEpochMilli(limitNextTakeTime)
+                            .plus(1, ChronoUnit.DAYS).toEpochMilli();
                 }
             }else if(model.getPlanType()==2){
                 //TODO 周计划
@@ -529,40 +580,59 @@ public class WODispatchPlanTmDoBizFun {
 
                 //TODO 先得到所有集合对应的当前周的所有符合条件的时间
                 List<String> dateTimeStrings = new ArrayList<>();
+                List<String> dateLimitTimeStrings = new ArrayList<>();//最小截止值
                 for (Object obj:newJSONArray){
                     LocalDateTime nowDate = LocalDateTime.now().with(DayOfWeek.of(Integer.valueOf(obj.toString())));
                     for (DispatchCmdBatchItemNextTimeModel item : newList){
                         String[] times = item.getHandleStartTime().split(":");
+                        String[] timeLimits = item.getHandleStartTimeLimit().split(":");
                         dateTimeStrings.add(nowDate.withHour(Integer.valueOf(times[0]))
                                 .withMinute(Integer.valueOf(times[1])).withSecond(Integer.valueOf(times[2])).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                        dateLimitTimeStrings.add(nowDate.withHour(Integer.valueOf(timeLimits[0]))
+                                .withMinute(Integer.valueOf(timeLimits[1])).withSecond(Integer.valueOf(timeLimits[2])).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                     }
                 }
                 LocalDateTime nextDateTime = findNextTime(dateTimeStrings);
+                LocalDateTime limitNextDateTime = nextDateTime!=null?LocalDateTime.parse(dateLimitTimeStrings.get(dateTimeStrings.indexOf(nextDateTime
+                        .format(DateTimeFormatter.ofPattern(TimeTool.TIMESTAMP_FORMAT)))),DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")):null;
 
                 if(nextDateTime!=null){
                     if (model.getDispatchLeadTime() == 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime);
+                        limitNextTakeTime = reloadLocalDateTimeToLong(limitNextDateTime);
                     } else if (model.getDispatchLeadTime() > 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusMinutes(-model.getDispatchLeadTime()));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(limitNextDateTime.minusMinutes(-model.getDispatchLeadTime()));
                     } else if (model.getDispatchLeadTime() < 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusMinutes(Math.abs(model.getDispatchLeadTime())));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(limitNextDateTime.minusMinutes(Math.abs(model.getDispatchLeadTime())));
                     }
                 }else{
                     LocalTime localTime = LocalTime.parse(newList.get(0).getHandleStartTime(), DateTimeFormatter.ofPattern("HH:mm:ss"));
+                    LocalTime localTimeLimit = LocalTime.parse(newList.get(0).getHandleStartTimeLimit(), DateTimeFormatter.ofPattern("HH:mm:ss"));
                     nextDateTime = LocalDateTime.now()
                             .with(DayOfWeek.of(Integer.valueOf(newJSONArray.get(0).toString())));
                     if (model.getDispatchLeadTime() == 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTime.getHour())
                                 .withMinute(localTime.getMinute())
                                 .withSecond(localTime.getSecond()));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTimeLimit.getHour())
+                                .withMinute(localTimeLimit.getMinute())
+                                .withSecond(localTimeLimit.getSecond()));
                     } else if (model.getDispatchLeadTime() > 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTime.getHour())
                                 .withMinute(localTime.getMinute())
                                 .withSecond(localTime.getSecond()).minusMinutes(-model.getDispatchLeadTime()));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTimeLimit.getHour())
+                                .withMinute(localTimeLimit.getMinute())
+                                .withSecond(localTimeLimit.getSecond()).minusMinutes(-model.getDispatchLeadTime()));
                     } else if (model.getDispatchLeadTime() < 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTime.getHour())
                                 .withMinute(localTime.getMinute())
                                 .withSecond(localTime.getSecond()).minusMinutes(Math.abs(model.getDispatchLeadTime())));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTimeLimit.getHour())
+                                .withMinute(localTimeLimit.getMinute())
+                                .withSecond(localTimeLimit.getSecond()).minusMinutes(Math.abs(model.getDispatchLeadTime())));
                     }
                 }
             }else if(model.getPlanType()==3){
@@ -576,43 +646,62 @@ public class WODispatchPlanTmDoBizFun {
                         // .reversed()
                 ).collect(Collectors.toCollection(JSONArray::new));
 
-                //TODO 先得到所有集合对应的当前的所有符合条件的时间
+                //TODO 先得到所有集合对应的当前的所有符合条件的时间
                 List<String> dateTimeStrings = new ArrayList<>();
+                List<String> dateLimitTimeStrings = new ArrayList<>();//最小截止值
                 for (Object obj:newJSONArray){
                     LocalDateTime nowDate = LocalDateTime.now().withDayOfMonth(Integer.valueOf(obj.toString()));
                     for (DispatchCmdBatchItemNextTimeModel item : newList){
                         String[] times = item.getHandleStartTime().split(":");
+                        String[] timeLimits = item.getHandleStartTimeLimit().split(":");
                         dateTimeStrings.add(nowDate.withHour(Integer.valueOf(times[0]))
                                 .withMinute(Integer.valueOf(times[1])).withSecond(Integer.valueOf(times[2])).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                        dateLimitTimeStrings.add(nowDate.withHour(Integer.valueOf(timeLimits[0]))
+                                .withMinute(Integer.valueOf(timeLimits[1])).withSecond(Integer.valueOf(timeLimits[2])).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                     }
                 }
 
                 LocalDateTime nextDateTime = findNextTime(dateTimeStrings);
+                LocalDateTime limitNextDateTime = nextDateTime!=null?LocalDateTime.parse(dateLimitTimeStrings.get(dateTimeStrings.indexOf(nextDateTime
+                        .format(DateTimeFormatter.ofPattern(TimeTool.TIMESTAMP_FORMAT)))),DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")):null;
 
                 if(nextDateTime!=null){
                     if (model.getDispatchLeadTime() == 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime);
+                        limitNextTakeTime = reloadLocalDateTimeToLong(limitNextDateTime);
                     } else if (model.getDispatchLeadTime() > 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusMinutes(-model.getDispatchLeadTime()));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(limitNextDateTime.minusMinutes(-model.getDispatchLeadTime()));
                     } else if (model.getDispatchLeadTime() < 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusMinutes(Math.abs(model.getDispatchLeadTime())));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(limitNextDateTime.minusMinutes(Math.abs(model.getDispatchLeadTime())));
                     }
                 }else{
                     LocalTime localTime = LocalTime.parse(newList.get(0).getHandleStartTime(), DateTimeFormatter.ofPattern("HH:mm:ss"));
+                    LocalTime localTimeLimit = LocalTime.parse(newList.get(0).getHandleStartTimeLimit(), DateTimeFormatter.ofPattern("HH:mm:ss"));
                     nextDateTime = LocalDateTime.now()
                             .withDayOfMonth(newJSONArray.getInteger(0));
                     if (model.getDispatchLeadTime() == 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusMonths(-1).withHour(localTime.getHour())
                                 .withMinute(localTime.getMinute())
                                 .withSecond(localTime.getSecond()));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTimeLimit.getHour())
+                                .withMinute(localTimeLimit.getMinute())
+                                .withSecond(localTimeLimit.getSecond()));
                     } else if (model.getDispatchLeadTime() > 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusMonths(-1).withHour(localTime.getHour())
                                 .withMinute(localTime.getMinute())
                                 .withSecond(localTime.getSecond()).minusMinutes(-model.getDispatchLeadTime()));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTimeLimit.getHour())
+                                .withMinute(localTimeLimit.getMinute())
+                                .withSecond(localTimeLimit.getSecond()).minusMinutes(-model.getDispatchLeadTime()));
                     } else if (model.getDispatchLeadTime() < 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusMonths(-1).withHour(localTime.getHour())
                                 .withMinute(localTime.getMinute())
                                 .withSecond(localTime.getSecond()).minusMinutes(Math.abs(model.getDispatchLeadTime())));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTimeLimit.getHour())
+                                .withMinute(localTimeLimit.getMinute())
+                                .withSecond(localTimeLimit.getSecond()).minusMinutes(Math.abs(model.getDispatchLeadTime())));
                     }
                 }
             }else if(model.getPlanType()==4){
@@ -628,28 +717,38 @@ public class WODispatchPlanTmDoBizFun {
 
                 //TODO 先得到所有集合对应的当前周的所有符合条件的时间
                 List<String> dateTimeStrings = new ArrayList<>();
+                List<String> dateLimitTimeStrings = new ArrayList<>();//最小截止值
                 for (Object obj:newJSONArray){
                     String[] monthDays = obj.toString().split("-");
                     LocalDateTime nowDate = LocalDateTime.now().withMonth(Integer.valueOf(monthDays[0]))
                             .withDayOfMonth(Integer.valueOf(monthDays[1]));
                     for (DispatchCmdBatchItemNextTimeModel item : newList){
                         String[] times = item.getHandleStartTime().split(":");
+                        String[] timeLimits = item.getHandleStartTimeLimit().split(":");
                         dateTimeStrings.add(nowDate.withHour(Integer.valueOf(times[0]))
                                 .withMinute(Integer.valueOf(times[1])).withSecond(Integer.valueOf(times[2])).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                        dateLimitTimeStrings.add(nowDate.withHour(Integer.valueOf(timeLimits[0]))
+                                .withMinute(Integer.valueOf(timeLimits[1])).withSecond(Integer.valueOf(timeLimits[2])).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                     }
                 }
 
                 LocalDateTime nextDateTime = findNextTime(dateTimeStrings);
+                LocalDateTime limitNextDateTime = nextDateTime!=null?LocalDateTime.parse(dateLimitTimeStrings.get(dateTimeStrings.indexOf(nextDateTime
+                        .format(DateTimeFormatter.ofPattern(TimeTool.TIMESTAMP_FORMAT)))),DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")):null;
                 if(nextDateTime!=null){
                     if (model.getDispatchLeadTime() == 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime);
+                        limitNextTakeTime = reloadLocalDateTimeToLong(limitNextDateTime);
                     } else if (model.getDispatchLeadTime() > 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusMinutes(-model.getDispatchLeadTime()));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(limitNextDateTime.minusMinutes(-model.getDispatchLeadTime()));
                     } else if (model.getDispatchLeadTime() < 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusMinutes(Math.abs(model.getDispatchLeadTime())));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(limitNextDateTime.minusMinutes(Math.abs(model.getDispatchLeadTime())));
                     }
                 }else{
                     LocalTime localTime = LocalTime.parse(newList.get(0).getHandleStartTime(), DateTimeFormatter.ofPattern("HH:mm:ss"));
+                    LocalTime localTimeLimit = LocalTime.parse(newList.get(0).getHandleStartTimeLimit(), DateTimeFormatter.ofPattern("HH:mm:ss"));
                     nextDateTime = LocalDateTime.now()
                             .withMonth(Integer.valueOf(newJSONArray.get(0).toString().split("-")[0]))
                             .withDayOfMonth(Integer.valueOf(newJSONArray.get(0).toString().split("-")[1]));
@@ -657,19 +756,31 @@ public class WODispatchPlanTmDoBizFun {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusYears(-1).withHour(localTime.getHour())
                                 .withMinute(localTime.getMinute())
                                 .withSecond(localTime.getSecond()));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTimeLimit.getHour())
+                                .withMinute(localTimeLimit.getMinute())
+                                .withSecond(localTimeLimit.getSecond()));
                     } else if (model.getDispatchLeadTime() > 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusYears(-1).withHour(localTime.getHour())
                                 .withMinute(localTime.getMinute())
                                 .withSecond(localTime.getSecond()).minusMinutes(-model.getDispatchLeadTime()));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTimeLimit.getHour())
+                                .withMinute(localTimeLimit.getMinute())
+                                .withSecond(localTimeLimit.getSecond()).minusMinutes(-model.getDispatchLeadTime()));
                     } else if (model.getDispatchLeadTime() < 0) {
                         nextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusYears(-1).withHour(localTime.getHour())
                                 .withMinute(localTime.getMinute())
                                 .withSecond(localTime.getSecond()).minusMinutes(Math.abs(model.getDispatchLeadTime())));
+                        limitNextTakeTime = reloadLocalDateTimeToLong(nextDateTime.minusWeeks(-1).withHour(localTimeLimit.getHour())
+                                .withMinute(localTimeLimit.getMinute())
+                                .withSecond(localTimeLimit.getSecond()).minusMinutes(Math.abs(model.getDispatchLeadTime())));
                     }
                 }
             }
         }
-        return nextTakeTime;
+
+        map.put("nextTakeTime",nextTakeTime);
+        map.put("limitNextTakeTime",limitNextTakeTime);
+        return map;
     }
 
     //TODO 新增计划
@@ -691,6 +802,7 @@ public class WODispatchPlanTmDoBizFun {
             //TODO 开始计算时间字段并设置
             Long lastTakeTime = 0L;
             Long nextTakeTime = 0L;//下一次生效时间
+            Long limitNextTakeTime = 0L;//下一次生效截止时间
 
             DispatchPlanInfoNextTimeModel nextTimeModel = new DispatchPlanInfoNextTimeModel();
             nextTimeModel.setPlanType(oJsonParam.getPlanType());
@@ -699,17 +811,21 @@ public class WODispatchPlanTmDoBizFun {
                 for(JPDispatchCmdBatchItem jpItem:oJsonParam.getItemsList()){
                     DispatchCmdBatchItemNextTimeModel dispatchCmdBatchItemNextTimeModel =new DispatchCmdBatchItemNextTimeModel();
                     dispatchCmdBatchItemNextTimeModel.setHandleStartTime(jpItem.getHandleStartTime());
+                    dispatchCmdBatchItemNextTimeModel.setHandleStartTimeLimit(jpItem.getHandleEndTime());
                     itemModels.add(dispatchCmdBatchItemNextTimeModel);
                 }
             }
             nextTimeModel.setItemsList(itemModels);
             nextTimeModel.setDispatchLeadTime(oJsonParam.getDispatchLeadTime());
             nextTimeModel.setCycles(oJsonParam.getCycles());
-            nextTakeTime = returnNextTakeTime(nextTimeModel);
+            Map<String,Long> nextMap = returnNextTakeTime(nextTimeModel);
+            nextTakeTime = nextMap.get("nextTakeTime");
+            limitNextTakeTime = nextMap.get("limitNextTakeTime");
 
 
             model.setLastTakeTime(lastTakeTime);
             model.setNextTakeTime(nextTakeTime);
+            model.setLimitNextTakeTime(limitNextTakeTime);
             model.setTakes(0);
             model.setErrors("");
             model.setSendway(oJsonParam.getSendway());
@@ -770,6 +886,7 @@ public class WODispatchPlanTmDoBizFun {
 
             //TODO 开始计算时间字段并设置
             Long nextTakeTime = 0L;//下一次生效时间
+            Long limitNextTakeTime = 0L;//下一次生效时间
 
             DispatchPlanInfoNextTimeModel nextTimeModel = new DispatchPlanInfoNextTimeModel();
             nextTimeModel.setPlanType(oJsonParam.getPlanType());
@@ -778,6 +895,7 @@ public class WODispatchPlanTmDoBizFun {
                 for(JPDispatchCmdBatchItem jpItem:oJsonParam.getItemsList()){
                     DispatchCmdBatchItemNextTimeModel dispatchCmdBatchItemNextTimeModel =new DispatchCmdBatchItemNextTimeModel();
                     dispatchCmdBatchItemNextTimeModel.setHandleStartTime(jpItem.getHandleStartTime());
+                    dispatchCmdBatchItemNextTimeModel.setHandleStartTimeLimit(jpItem.getHandleEndTime());
                     itemModels.add(dispatchCmdBatchItemNextTimeModel);
                 }
             }
@@ -785,10 +903,12 @@ public class WODispatchPlanTmDoBizFun {
             nextTimeModel.setItemsList(itemModels);
             nextTimeModel.setDispatchLeadTime(oJsonParam.getDispatchLeadTime());
             nextTimeModel.setCycles(oJsonParam.getCycles());
-            nextTakeTime = returnNextTakeTime(nextTimeModel);
+            Map<String,Long> nextMap = returnNextTakeTime(nextTimeModel);
+            nextTakeTime = nextMap.get("nextTakeTime");
+            limitNextTakeTime = nextMap.get("limitNextTakeTime");
 
 
-            ResponseCode updateRes = getThisDBService().updatePlanInfoByCount(oJsonParam,nextTakeTime, oJsonParam.getRulesList(),
+            ResponseCode updateRes = getThisDBService().updatePlanInfoByCount(oJsonParam,nextTakeTime,limitNextTakeTime, oJsonParam.getRulesList(),
                     oJsonParam.getTagsList(), oJsonParam.getItemsList());
             return updateRes;
         }catch(Exception ex){

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

@@ -16,6 +16,8 @@ public class DBMgrProxy {
     private volatile WODispatchPlanDBService woDispatchPlanDBService = null;
     private volatile WODispatchCmdBatchItemDBService woDispatchCmdBatchItemDBService = null;
     private volatile WODispatchCmdInfoDBService woDispatchCmdInfoDBService = null;
+    private volatile WODispatchDatabaseDBService woDispatchDatabaseDBService = null;
+    private volatile WODispatchDatabaseDisposalDBService woDispatchDatabaseDisposalDBService= null;
 
     //TODO 其他数据源
     private volatile WaterTapWaterService waterTapWaterService = null;
@@ -58,6 +60,10 @@ public class DBMgrProxy {
             woDispatchCmdBatchItemDBService = (WODispatchCmdBatchItemDBService) SpringContextUtil.getBean(WODispatchCmdBatchItemDBService.class);
         if (woDispatchCmdInfoDBService == null)
             woDispatchCmdInfoDBService = (WODispatchCmdInfoDBService) SpringContextUtil.getBean(WODispatchCmdInfoDBService.class);
+        if (woDispatchDatabaseDBService == null)
+            woDispatchDatabaseDBService = (WODispatchDatabaseDBService) SpringContextUtil.getBean(WODispatchDatabaseDBService.class);
+        if (woDispatchDatabaseDisposalDBService == null)
+            woDispatchDatabaseDisposalDBService = (WODispatchDatabaseDisposalDBService) SpringContextUtil.getBean(WODispatchDatabaseDisposalDBService.class);
     }
 
     public RolePowerDBService applyRolePowerApi() {return rolePowerDBService;}
@@ -81,4 +87,6 @@ public class DBMgrProxy {
     public WODispatchPlanDBService applyWODispatchPlanApi() {return woDispatchPlanDBService;}
     public WODispatchCmdBatchItemDBService applyWODispatchItemApi() {return woDispatchCmdBatchItemDBService;}
     public WODispatchCmdInfoDBService applyWODispatchCmdApi() {return woDispatchCmdInfoDBService;}
+    public WODispatchDatabaseDBService applyWODispatchDatabaseApi() {return woDispatchDatabaseDBService;}
+    public WODispatchDatabaseDisposalDBService applyWODispatchDatabaseDisposalApi() {return woDispatchDatabaseDisposalDBService;}
 }

+ 81 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchDatabaseDisposalMapper.java

@@ -0,0 +1,81 @@
+package com.shkpr.service.aimodelpower.dbdao.mapper;
+
+import com.shkpr.service.aimodelpower.dbdao.providers.WODispatchDatabaseDisposalSqlProvider;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName WODispatchTagDictMapper
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/7/10
+ * @Version V1.0
+ **/
+public interface WODispatchDatabaseDisposalMapper {
+
+    @SelectProvider(type = WODispatchDatabaseDisposalSqlProvider.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 = WODispatchDatabaseDisposalSqlProvider.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 = WODispatchDatabaseDisposalSqlProvider.class, method = "getByUniqueId")
+    Map<String, Object> getOne(@Param("table") String table, @Param("filed") String filed, @Param("id") Object id);
+
+    @SelectProvider(type = WODispatchDatabaseDisposalSqlProvider.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 = WODispatchDatabaseDisposalSqlProvider.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 = WODispatchDatabaseDisposalSqlProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = WODispatchDatabaseDisposalSqlProvider.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 = WODispatchDatabaseDisposalSqlProvider.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 = WODispatchDatabaseDisposalSqlProvider.class, method = "batchUpdateWiths")
+    int batchUpdateWiths(@Param("andWheres") List<Map<String, Object>> andWheres
+            , @Param("datas") List<Map<String, Object>> datas);
+
+    @DeleteProvider(type = WODispatchDatabaseDisposalSqlProvider.class, method = "deleteWiths")
+    int deleteWiths(@Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @DeleteProvider(type = WODispatchDatabaseDisposalSqlProvider.class, method = "deleteInIds")
+    int batchDeleteIn(@Param("ids") List<? extends Object> ids, @Param("extend") String extend);
+}

+ 81 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchDatabaseMapper.java

@@ -0,0 +1,81 @@
+package com.shkpr.service.aimodelpower.dbdao.mapper;
+
+import com.shkpr.service.aimodelpower.dbdao.providers.WODispatchDatabaseSqlProvider;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName WODispatchTagDictMapper
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/7/10
+ * @Version V1.0
+ **/
+public interface WODispatchDatabaseMapper {
+
+    @SelectProvider(type = WODispatchDatabaseSqlProvider.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 = WODispatchDatabaseSqlProvider.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 = WODispatchDatabaseSqlProvider.class, method = "getByUniqueId")
+    Map<String, Object> getOne(@Param("table") String table, @Param("filed") String filed, @Param("id") Object id);
+
+    @SelectProvider(type = WODispatchDatabaseSqlProvider.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 = WODispatchDatabaseSqlProvider.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 = WODispatchDatabaseSqlProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = WODispatchDatabaseSqlProvider.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 = WODispatchDatabaseSqlProvider.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 = WODispatchDatabaseSqlProvider.class, method = "batchUpdateWiths")
+    int batchUpdateWiths(@Param("andWheres") List<Map<String, Object>> andWheres
+            , @Param("datas") List<Map<String, Object>> datas);
+
+    @DeleteProvider(type = WODispatchDatabaseSqlProvider.class, method = "deleteWiths")
+    int deleteWiths(@Param("andWheres") Map<String, Object> andWheres
+            , @Param("orWheres") Map<String, Object> orWheres
+            , @Param("extend") String extend);
+
+    @DeleteProvider(type = WODispatchDatabaseSqlProvider.class, method = "deleteInIds")
+    int batchDeleteIn(@Param("ids") List<? extends Object> ids, @Param("extend") String extend);
+}

+ 47 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchDatabaseDisposalSqlProvider.java

@@ -0,0 +1,47 @@
+package com.shkpr.service.aimodelpower.dbdao.providers;
+
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchDatabaseDisposalTable;
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchDatabaseTable;
+
+public class WODispatchDatabaseDisposalSqlProvider extends BaseSqlProvider implements WODispatchDatabaseDisposalTable{
+    @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;
+    }
+    
+}

+ 47 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchDatabaseSqlProvider.java

@@ -0,0 +1,47 @@
+package com.shkpr.service.aimodelpower.dbdao.providers;
+
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchDatabaseTable;
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchTagDictTable;
+
+public class WODispatchDatabaseSqlProvider extends BaseSqlProvider implements WODispatchDatabaseTable {
+    @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;
+    }
+    
+}

+ 173 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/services/WODispatchDatabaseDBServiceImpl.java

@@ -0,0 +1,173 @@
+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.WODispatchCmdInfoMapper;
+import com.shkpr.service.aimodelpower.dbdao.mapper.WODispatchDatabaseMapper;
+import com.shkpr.service.aimodelpower.dbdao.services.intef.WODispatchCmdInfoDBService;
+import com.shkpr.service.aimodelpower.dbdao.services.intef.WODispatchDatabaseDBService;
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchCmdInfoTable;
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchDatabaseTable;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class WODispatchDatabaseDBServiceImpl implements WODispatchDatabaseDBService,WODispatchDatabaseTable{
+    private String mStrClassName = "";
+    private String mBusinessType = "";
+    private String logTag = "";
+    public WODispatchDatabaseDBServiceImpl() {
+        mStrClassName = this.getClass().getSimpleName();
+        mBusinessType = LogFlagBusiType.BUSI_DB_WO_DISPATCH_CMD_INFO.toStrValue();
+        logTag = "Dispatch Database Info";
+    }
+
+    @SuppressWarnings("all")
+    @Autowired
+    WODispatchDatabaseMapper woDispatchDatabaseMapper;
+
+    @Override
+    public Map<String, Object> getOne(Object id) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> listAllWiths(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 = woDispatchDatabaseMapper.listAllWiths("", "", 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 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) {
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = woDispatchDatabaseMapper.batchQueryWiths("", "", 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("Batch Query %s:{andWhere.size=%d, orWhere.size=%d, orderBy=%s, extend=%s, back.size=%d} from database, code:{%d} msg:{%s} ..."
+                            , logTag
+                            , CommTool.mapSize(andWheres)
+                            , CommTool.mapSize(orWheres)
+                            , orderBy, extend
+                            , CommTool.listSize(arrRes)
+                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
+
+    @Override
+    public int totalCounts(Map<String, Object> andWheres, Map<String, Object> orWheres) {
+        return 0;
+    }
+
+    @Override
+    public int totalCountsEx(String table, Map<String, Object> andWheres, Map<String, Object> orWheres, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return woDispatchDatabaseMapper.totalCounts(table, andWheres, orWheres, extend);
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+            return 0;
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , mBusinessType
+                    , mStrClassName
+                    , String.format("Total %s lines from database, code:{%d} msg:{%s} ...", logTag, nCode, strMsg));
+        }
+    }
+
+    @Override
+    public Map<String, Object> getOneBy(Map<String, Object> andWheres, Map<String, Object> orWheres,String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            List<Map<String,Object>> listOne = woDispatchDatabaseMapper.listAllWiths("", "", 1, 0, andWheres, orWheres, "", extend);
+            Map<String, Object> res = CollectionUtils.isEmpty(listOne)?null:listOne.get(0);
+            if (res == null)
+                return new HashMap<>();
+            else
+                return res;
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+            return null;
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , LogFlagBusiType.BUSI_DB_USER.toStrValue()
+                    , mStrClassName
+                    , String.format("Get from database, code:{%d} msg:{%s} ...", nCode, strMsg));
+        }
+    }
+
+    @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) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return woDispatchDatabaseMapper.batchDeleteIn(ids, extend);
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+            return -1;
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , mBusinessType
+                    , mStrClassName
+                    , String.format("Batch Delete %s Lines:{lines=%d} from database, code:{%d} msg:{%s} ...", logTag, CommTool.listSize(ids), nCode, strMsg));
+        }
+    }
+}

+ 155 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/services/WODispatchDatabaseDisposalDBServiceImpl.java

@@ -0,0 +1,155 @@
+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.WODispatchDatabaseDisposalMapper;
+import com.shkpr.service.aimodelpower.dbdao.mapper.WODispatchDatabaseMapper;
+import com.shkpr.service.aimodelpower.dbdao.services.intef.WODispatchDatabaseDBService;
+import com.shkpr.service.aimodelpower.dbdao.services.intef.WODispatchDatabaseDisposalDBService;
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchDatabaseDisposalTable;
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchDatabaseTable;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class WODispatchDatabaseDisposalDBServiceImpl implements WODispatchDatabaseDisposalDBService,WODispatchDatabaseDisposalTable{
+    private String mStrClassName = "";
+    private String mBusinessType = "";
+    private String logTag = "";
+    public WODispatchDatabaseDisposalDBServiceImpl() {
+        mStrClassName = this.getClass().getSimpleName();
+        mBusinessType = LogFlagBusiType.BUSI_DB_WO_DISPATCH_CMD_INFO.toStrValue();
+        logTag = "Dispatch Database Info";
+    }
+
+    @SuppressWarnings("all")
+    @Autowired
+    WODispatchDatabaseDisposalMapper woDispatchDatabaseDisposalMapper;
+
+    @Override
+    public Map<String, Object> getOne(Object id) {
+        return null;
+    }
+
+    @Override
+    public List<Map<String, Object>> listAllWiths(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 = woDispatchDatabaseDisposalMapper.listAllWiths("", "", 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 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) {
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = woDispatchDatabaseDisposalMapper.batchQueryWiths("", "", 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("Batch Query %s:{andWhere.size=%d, orWhere.size=%d, orderBy=%s, extend=%s, back.size=%d} from database, code:{%d} msg:{%s} ..."
+                            , logTag
+                            , CommTool.mapSize(andWheres)
+                            , CommTool.mapSize(orWheres)
+                            , orderBy, extend
+                            , CommTool.listSize(arrRes)
+                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
+
+    @Override
+    public int totalCounts(Map<String, Object> andWheres, Map<String, Object> orWheres) {
+        return 0;
+    }
+
+    @Override
+    public Map<String, Object> getOneBy(Map<String, Object> andWheres, Map<String, Object> orWheres,String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            List<Map<String,Object>> listOne = woDispatchDatabaseDisposalMapper.listAllWiths("", "", 1, 0, andWheres, orWheres, "", extend);
+            Map<String, Object> res = CollectionUtils.isEmpty(listOne)?null:listOne.get(0);
+            if (res == null)
+                return new HashMap<>();
+            else
+                return res;
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+            return null;
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , LogFlagBusiType.BUSI_DB_USER.toStrValue()
+                    , mStrClassName
+                    , String.format("Get from database, code:{%d} msg:{%s} ...", nCode, strMsg));
+        }
+    }
+
+    @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) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            return woDispatchDatabaseDisposalMapper.batchDeleteIn(ids, extend);
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+            return -1;
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , mBusinessType
+                    , mStrClassName
+                    , String.format("Batch Delete %s Lines:{lines=%d} from database, code:{%d} msg:{%s} ...", logTag, CommTool.listSize(ids), nCode, strMsg));
+        }
+    }
+}

+ 2 - 1
src/main/java/com/shkpr/service/aimodelpower/dbdao/services/WODispatchPlanDBServiceImpl.java

@@ -266,13 +266,14 @@ public class WODispatchPlanDBServiceImpl implements WODispatchPlanDBService,WODi
 
     @Override
     @Transactional(transactionManager = "mainDbTransactionManager",rollbackFor = Exception.class)
-    public ResponseCode updatePlanInfoByCount(JPDispatchPlanInfoUpdate model,Long nextTakeTime, List<JPDispatchPlanInfoRuleSave> rulesList, List<JPDispatchPlanInfoTagsSave> tagsList, List<JPDispatchCmdBatchItem> itemsList) {
+    public ResponseCode updatePlanInfoByCount(JPDispatchPlanInfoUpdate model,Long nextTakeTime,Long limitNextTakeTime, List<JPDispatchPlanInfoRuleSave> rulesList, List<JPDispatchPlanInfoTagsSave> tagsList, List<JPDispatchCmdBatchItem> itemsList) {
         //TODO 修改计划
         Map<String,Object> andWhereUp = new HashMap<>();
         andWhereUp.put(R_INFO.PRIMARY_KEY,model.getPlanId());
         Map<String,Object> upMap = FastJsonUtil.obj2Map(model, true);
         upMap.put("update_time",TimeTool.getCurMsUTC());
         upMap.put("next_take_time",nextTakeTime);
+        upMap.put("limit_next_take_time",limitNextTakeTime);
         upMap.remove(R_INFO.PRIMARY_KEY);
         upMap.remove("casual_value");
         upMap.remove("rules_list");

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

@@ -0,0 +1,19 @@
+package com.shkpr.service.aimodelpower.dbdao.services.intef;
+
+import java.util.Map;
+
+/**
+ * @ClassName WODispatchDatabaseDBService
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/7/16
+ * @Version V1.0
+ **/
+public interface WODispatchDatabaseDBService extends BaseDBService {
+    public Map<String, Object> getOneBy(Map<String, Object> andWheres, Map<String, Object> orWheres, String extend);
+
+    int totalCountsEx(String table
+            , Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String extend);
+}

+ 14 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/services/intef/WODispatchDatabaseDisposalDBService.java

@@ -0,0 +1,14 @@
+package com.shkpr.service.aimodelpower.dbdao.services.intef;
+
+import java.util.Map;
+
+/**
+ * @ClassName WODispatchDatabaseDBService
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/7/16
+ * @Version V1.0
+ **/
+public interface WODispatchDatabaseDisposalDBService extends BaseDBService {
+    public Map<String, Object> getOneBy(Map<String, Object> andWheres, Map<String, Object> orWheres, String extend);
+}

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

@@ -39,6 +39,7 @@ public interface WODispatchPlanDBService extends BaseDBService {
     //TODO 事务修改调度计划
     ResponseCode updatePlanInfoByCount(JPDispatchPlanInfoUpdate model,//TODO 相关关联子对象参数
                                        Long nextTakeTime,
+                                       Long limitNextTakeTime,
                                        //① 计划相关触发规则
                                        List<JPDispatchPlanInfoRuleSave> rulesList,
                                        //② 计划附加标签项

+ 26 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchDatabaseDisposalTable.java

@@ -0,0 +1,26 @@
+package com.shkpr.service.aimodelpower.dbdao.tables;
+
+/**
+ * @ClassName WODispatchTagDictTable
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/7/10
+ * @Version V1.0
+ **/
+public interface WODispatchDatabaseDisposalTable {
+
+    interface R_INFO{
+        String TABLE = "k4_wo_dispatch_database_disposal";
+        String PRIMARY_KEY = "database_id";
+        String PRIMARY_KEY_TWO = "key";
+        String ALL_FILED = "*";
+        String UNIQUE_ID = "database_id";
+    }
+
+    interface W_INFO{
+        String TABLE = "k4_wo_dispatch_database_disposal";
+        String PRIMARY_KEY = "database_id";
+        String PRIMARY_KEY_TWO = "key";
+        String UNIQUE_ID = "database_id";
+    }
+}

+ 30 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchDatabaseTable.java

@@ -0,0 +1,30 @@
+package com.shkpr.service.aimodelpower.dbdao.tables;
+
+/**
+ * @ClassName WODispatchTagDictTable
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/7/10
+ * @Version V1.0
+ **/
+public interface WODispatchDatabaseTable {
+
+    interface R_INFO{
+        String TABLE = "k4_wo_dispatch_database";
+        String PRIMARY_KEY = "key";
+        String ALL_FILED = "*";
+        String UNIQUE_ID = "key";
+
+        String CREATE_TIME = "create_time";
+        String UPDATE_TIME = "update_time";
+    }
+
+    interface W_INFO{
+        String TABLE = "k4_wo_dispatch_database";
+        String PRIMARY_KEY = "key";
+        String UNIQUE_ID = "key";
+
+        String CREATE_TIME = "create_time";
+        String UPDATE_TIME = "update_time";
+    }
+}

+ 33 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchDatabaseModel/DispatchDatabaseSSModel.java

@@ -0,0 +1,33 @@
+package com.shkpr.service.aimodelpower.dto.woDispatchDatabaseModel;
+
+import lombok.Data;
+
+/**
+ * @ClassName DispatchDatabaseSSModel
+ * @Description: TODO 方案库数据模型
+ * @Author LX
+ * @Date 2024/7/16
+ * @Version V1.0
+ **/
+@Data
+public class DispatchDatabaseSSModel {
+    private Integer id;//自增序列号
+
+    private String databaseId;//方案库
+
+    private String databaseName;//方案库名称
+
+    private String weathe;//			适用天气
+    private String temperature;//				适用气温(气温范围 如 0~30) 单位℃
+    private String param1;//				复合参数2
+    private String createUser;//				创建人id(创建者id)
+    private Long sampleBeginTime;//	int8		参考样本的起始时间(毫秒级UTC),如:iot采集数据的起始时间
+    private Long sampleEndTime;//	int8		参考样本的截止时间(毫秒级UTC),如:iot采集数据的截止时间
+    private String tags;//	附属标签项JSON串,如:[{"key":"k1","name":"突发事件","data":"停电"}]
+    private String remark;//		方案库描述
+    private String zoneId	;//			监测分区ID
+    private String zoneType		;//		监测分区的主类型
+    private Long createTime		;//		数据创建时间
+    private Long updateTime		;//		数据修改时间
+
+}

+ 1 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchCmdBatchItemNextTimeModel.java

@@ -20,5 +20,6 @@ import java.util.List;
 @Data
 public class DispatchCmdBatchItemNextTimeModel implements Serializable {
     private String handleStartTime;//指定处理有效起始时间(HH:mm:ss) 日期为计划的预计开始时间
+    private String handleStartTimeLimit;//指定处理有效截止时间(HH:mm:ss)
 
 }

+ 2 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchPlanInfoModel.java

@@ -49,6 +49,8 @@ public class DispatchPlanInfoModel {
                                 //*) 调度指令排班表中的min(sug_begin_time)
                                 //    注:【计划新建/修改计划cycles/计划触发成功后】就得计算出该值,且临时计划触发成功后需置为0以便不再参与定时扫描
 
+    private Long limitNextTakeTime;
+
     private String updaterId;//修改人
 
     private Integer takes;//总计触发次数(成功+未成功),用于后台查询分析

+ 123 - 0
src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchDatabase/JPDispatchDatabaseInfoSS.java

@@ -0,0 +1,123 @@
+package com.shkpr.service.aimodelpower.jsonbean.woDispatchDatabase;
+
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.aimodelpower.commtools.TimeTool;
+import com.shkpr.service.aimodelpower.controllervalid.CommonParamValidDeal;
+import com.shkpr.service.aimodelpower.controllervalid.CommonParamValidSS;
+import com.shkpr.service.aimodelpower.jsonbean.JPPageLO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.util.StringUtils;
+
+import javax.validation.constraints.Size;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
+
+/**
+ * @ClassName JPDispatchDatabaseInfoSS
+ * @Description: TODO 方案库列表查询模型
+ * @Author LX
+ * @Date 2024/7/16
+ * @Version V1.0
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class JPDispatchDatabaseInfoSS extends JPPageLO {
+
+    @Size(min = 1, max = 255, groups = { CommonParamValidSS.class})
+    private String databaseName;//方案库名称
+
+    private String tags;//标签关键词
+
+    private String weather;//天气
+
+    private String param1;//复合参数名
+    private String param2;//复合参数名
+
+    private String temperature;//气温范围(如 0~30)
+
+    private Long startDate;//开始日期 (实际时间为 年 月 日(就为当月的一号),时分秒为 00:00:00,如2023-03-01 00:00:00)
+
+    private Long endDate;//结束日期 (实际时间为 年 月 日(就为当月的一号),时分秒为 00:00:00,如2023-03-01 00:00:00)
+
+    public boolean checkValid() {
+        if(startDate==null&&endDate!=null){
+            return false;
+        }
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(TimeTool.TIMESTAMP_FORMAT);
+        if(startDate==null&&endDate==null){
+            //TODO 说明前端没传,那么默认为当前月往前推12个月作为开始和结束条件
+            LocalDateTime endLocalDate = LocalDateTime.now().with(TemporalAdjusters.lastDayOfMonth())
+                    .withHour(23).withMinute(59).withSecond(59);//结束时间
+
+            LocalDateTime startLocalDate = endLocalDate.minusMonths(11).with(TemporalAdjusters.firstDayOfMonth())
+                    .withHour(0).withMinute(0).withSecond(0);//减11是因为包含当月
+
+            startDate = TimeTool.convertDateStr2UTC(startLocalDate.format(formatter));
+            endDate = TimeTool.convertDateStr2UTC(endLocalDate.format(formatter));
+        }else
+        if(startDate!=null&&endDate!=null){
+            try {
+                LocalDateTime startLocalDate = LocalDateTime.parse(TimeTool.convertUTC2DateStr(startDate, TimeTool.TIMESTAMP_FORMAT), DateTimeFormatter.ofPattern(TimeTool.TIMESTAMP_FORMAT));
+                LocalDateTime endLocalDate = LocalDateTime.parse(TimeTool.convertUTC2DateStr(endDate, TimeTool.TIMESTAMP_FORMAT), DateTimeFormatter.ofPattern(TimeTool.TIMESTAMP_FORMAT));
+                long monthsBetween = ChronoUnit.MONTHS.between(startLocalDate, endLocalDate);
+                //TODO 如果相差月数超过12个月,则不让查 这里大于等于12是因为如果是12的话实际上是13个月, 包含开始月
+                if(monthsBetween>=12){
+                    return false;
+                }
+                if(startLocalDate.isAfter(endLocalDate)){
+                    return false;
+                }else if(endLocalDate.isBefore(startLocalDate)){
+                    return false;
+                }else if(startLocalDate .equals(endLocalDate)||startLocalDate.isBefore(endLocalDate)){
+                    //TODO 说明符合可组成查询日期的条件
+                    startLocalDate = startLocalDate.with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0);
+                    endLocalDate = endLocalDate.with(TemporalAdjusters.lastDayOfMonth())
+                            .withHour(23).withMinute(59).withSecond(59);
+                    startDate = TimeTool.convertDateStr2UTC(startLocalDate.format(formatter));
+                    endDate = TimeTool.convertDateStr2UTC(endLocalDate.format(formatter));
+                }
+            }catch(Exception ex){
+                LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, "JPAuditDashJobNum", "JPAuditDashJobNum"
+                        ,String.format("errorMsg:%s====>"
+                                ,ex.getLocalizedMessage()));
+                return false;
+            }
+        }else
+        if(startDate!=null&&endDate==null){//警告没事,增加代码可读性
+            //TODO 说明startDate传了  endDate没传 , 那么endDate为startDate月+11的最后一天
+            LocalDateTime startLocalDate = LocalDateTime.parse(TimeTool.convertUTC2DateStr(startDate, TimeTool.TIMESTAMP_FORMAT), DateTimeFormatter.ofPattern(TimeTool.TIMESTAMP_FORMAT))
+                    .with(TemporalAdjusters.firstDayOfMonth()).withHour(0).withMinute(0).withSecond(0);
+            LocalDateTime endLocalDate = startLocalDate.minusMonths(-11).with(TemporalAdjusters.lastDayOfMonth())
+                    .withHour(23).withMinute(59).withSecond(59);
+            startDate = TimeTool.convertDateStr2UTC(startLocalDate.format(formatter));
+            endDate = TimeTool.convertDateStr2UTC(endLocalDate.format(formatter));
+        }
+
+        return true;
+    }
+
+    public String genQueryExtend(){
+        StringBuilder str = new StringBuilder("");
+        if (!StringUtils.isEmpty(this.databaseName)) {
+            str.append(" OR database_name like '%" + this.databaseName + "%' ");
+        }
+        if (!StringUtils.isEmpty(this.tags)) {
+            str.append(" OR tags like '%" + this.tags + "%' ");
+        }
+        if (!StringUtils.isEmpty(this.weather)) {
+            str.append(" OR weather like '%" + this.weather + "%' ");
+        }
+        if (!StringUtils.isEmpty(this.param1)) {
+            str.append(" OR param1 like '%" + this.param1 + "%' ");
+        }
+        if (!StringUtils.isEmpty(this.param2)) {
+            str.append(" OR param2 like '%" + this.param2 + "%' ");
+        }
+
+        return str.length()>0?String.format(" AND ( 1=2 %s )" ,str.toString()):str.toString();
+    }
+}