Procházet zdrojové kódy

河南郸城调度计划列表 详情 新增接口初版提交

1037015548@qq.com před 11 měsíci
rodič
revize
43d51af56e
38 změnil soubory, kde provedl 2141 přidání a 12 odebrání
  1. 341 6
      src/main/java/com/shkpr/service/aimodelpower/bizmgr/WODispatchPlanTmDoBizFun.java
  2. 6 2
      src/main/java/com/shkpr/service/aimodelpower/constants/ApiURI.java
  3. 213 0
      src/main/java/com/shkpr/service/aimodelpower/controllerapi/woDispatchPlan/WoDispatchPlanInfoController.java
  4. 2 2
      src/main/java/com/shkpr/service/aimodelpower/controllerfilter/third/ThirdJWTBusiFilterMgr.java
  5. 4 0
      src/main/java/com/shkpr/service/aimodelpower/controllerfilter/third/ThirdJWTCurrencyFilter.java
  6. 69 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchCmdPatchDisposalMapper.java
  7. 73 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchCmdPatchItemMapper.java
  8. 63 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchPlanRulsMapper.java
  9. 70 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchPlanTagsMapper.java
  10. 69 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WOViewDispatchPlanRulsWithTagMapper.java
  11. 46 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchCmdBatchDisposalSqlProvider.java
  12. 122 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchCmdBatchItemSqlProvider.java
  13. 50 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchPlanRulsSqlProvider.java
  14. 8 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchPlanSqlProvider.java
  15. 47 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchPlanTagsSqlProvider.java
  16. 46 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WOViewDispatchPlanRulsWithTagSqlProvider.java
  17. 107 2
      src/main/java/com/shkpr/service/aimodelpower/dbdao/services/WODispatchPlanDBServiceImpl.java
  18. 24 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/services/intef/WODispatchPlanDBService.java
  19. 21 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchCmdPatchDisposalTable.java
  20. 21 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchCmdPatchItemTable.java
  21. 18 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchPlanRulsTable.java
  22. 16 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchPlanTagsTable.java
  23. 16 0
      src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WOViewDispatchPlanRulsWithTagTable.java
  24. 21 0
      src/main/java/com/shkpr/service/aimodelpower/dto/PageRecordRes.java
  25. 22 0
      src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchCmdBatchDispoal.java
  26. 25 0
      src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchCmdBatchItemModel.java
  27. 31 0
      src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchPlanInfoDetailsModel.java
  28. 63 0
      src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchPlanInfoModel.java
  29. 23 0
      src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchPlanInfoRuleModel.java
  30. 69 0
      src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchPlanInfoSSModel.java
  31. 19 0
      src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchPlanInfoTagsModel.java
  32. 32 0
      src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchCmdBatchDispoal.java
  33. 55 0
      src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchCmdBatchItem.java
  34. 24 0
      src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchPlanInfoDetailsSS.java
  35. 36 0
      src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchPlanInfoRuleSave.java
  36. 33 0
      src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchPlanInfoSS.java
  37. 208 0
      src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchPlanInfoSave.java
  38. 28 0
      src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchPlanInfoTagsSave.java

+ 341 - 6
src/main/java/com/shkpr/service/aimodelpower/bizmgr/WODispatchPlanTmDoBizFun.java

@@ -1,7 +1,12 @@
 package com.shkpr.service.aimodelpower.bizmgr;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
 import com.global.base.tools.FastJsonUtil;
 import com.shkpr.service.aimodelpower.commtools.CommTool;
+import com.shkpr.service.aimodelpower.commtools.TimeTool;
 import com.shkpr.service.aimodelpower.components.locks.CountDownLatchEx;
 import com.shkpr.service.aimodelpower.components.locks.WODispatchPlanLockMgr;
 import com.shkpr.service.aimodelpower.constants.CommFieldStatus;
@@ -9,17 +14,35 @@ 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.dto.*;
+import com.shkpr.service.aimodelpower.dto.woDispatchPlanModel.DispatchPlanInfoDetailsModel;
+import com.shkpr.service.aimodelpower.dto.woDispatchPlanModel.DispatchPlanInfoModel;
+import com.shkpr.service.aimodelpower.dto.woDispatchPlanModel.DispatchPlanInfoSSModel;
 import com.shkpr.service.aimodelpower.globalmgr.AsyncTaskQueueMgr;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchCmdBatchItem;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchPlanInfoDetailsSS;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchPlanInfoSS;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchPlanInfoSave;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
-import java.util.List;
-import java.util.Map;
+import java.text.SimpleDateFormat;
+import java.time.DayOfWeek;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+import java.util.stream.Collectors;
 
 public class WODispatchPlanTmDoBizFun {
+    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 WODispatchPlanDBService getThisDBService(){ return DBMgrProxy.getInstance().applyWODispatchPlanApi();}
 
     public static ResponseCode produceCmd(String planId, long checkTm){
@@ -120,4 +143,316 @@ public class WODispatchPlanTmDoBizFun {
             }
         }
     }
+
+
+    //TODO 分页查询计划
+    //查询·分页
+    public static PageRecordRes<DispatchPlanInfoSSModel> queryPageList(JPDispatchPlanInfoSS jsonParam){
+        PageRecordRes<DispatchPlanInfoSSModel> oRes = new PageRecordRes<>();
+        if (jsonParam == null)
+            return oRes;
+        final String lilterExtend = jsonParam.genQueryExtend();
+        Map<String,Object> andWheres = new HashMap<>();
+        if(jsonParam.getPlanType()!=null){
+            andWheres.put("plan_type", jsonParam.getPlanType());
+        }
+        if(jsonParam.getPlanStatus()!=null){
+            andWheres.put("plan_status", jsonParam.getPlanStatus());
+        }
+        String sql = "";
+        if(jsonParam.getDownFlag()!=null) {
+            if(jsonParam.getDownFlag()==0) {
+                sql += " AND " + WODispatchPlanInfoTable.R_INFO.LAST_TAKE_TIME + " !=0 AND "
+                        + WODispatchPlanInfoTable.R_INFO.LAST_TAKE_TIME + " IS NOT NULL";
+            }else{
+                sql += " AND (" + WODispatchPlanInfoTable.R_INFO.LAST_TAKE_TIME + " = 0 OR "
+                        + WODispatchPlanInfoTable.R_INFO.LAST_TAKE_TIME + " IS NULL )";
+            }
+        }
+        int nTotals = getThisDBService().totalCountsEx("", andWheres, null, lilterExtend+sql);
+        if (nTotals > 0){
+            List<Map<String,Object>> dataList = getThisDBService().listAllWithsEx("","",
+                    jsonParam.getLimit(),
+                    jsonParam.getOffset(),
+                    andWheres,
+                    null,
+                    WODispatchPlanInfoTable.R_INFO.ID,
+                    lilterExtend+sql);
+            if(dataList==null){
+                oRes.setCode(ResponseCode.RESULT_BAD.toInt());
+            }else{
+                List<DispatchPlanInfoSSModel> ssInfoModels = dataList.isEmpty()?new ArrayList<>():
+                        FastJsonUtil.batchMap2Obj(dataList,DispatchPlanInfoSSModel.class,true);
+                oRes.setCode(ResponseCode.RESULT_NORMAL.toInt());
+                oRes.setTotal(nTotals);
+                oRes.setData(ssInfoModels);
+            }
+        }
+        return oRes;
+    }
+
+    //TODO 查询详情信息
+    public static ResponseRes selectPlanInfoView(JPDispatchPlanInfoDetailsSS oJsonParam){
+        ResponseRes oRes = new ResponseRes();
+        oRes.setRescode(ResponseCode.RESULT_BAD.toStrCode());
+        oRes.setResmsg(ResponseCode.RESULT_BAD.toStrMsg());
+        if(StringUtils.isEmpty(oJsonParam)||StringUtils.isEmpty(oJsonParam.getPlanId())){
+            oRes.setRescode(ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrCode());
+            oRes.setResmsg(ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrMsg());
+            return oRes;
+        }
+        try{
+            Map<String,Object> map = getThisDBService().viewInfo("","",oJsonParam.getPlanId());
+            if(map!=null){
+                oRes.setResdata(FastJsonUtil.toJSON(map,true));
+            }
+            oRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
+            oRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
+            return oRes;
+        }catch (Exception ex){
+            return oRes;
+        }
+    }
+
+    //TODO 新增计划
+    public static ResponseCode savePlan(JPDispatchPlanInfoSave oJsonParam){
+        try{
+            //TODO 根据计划类型计算计划的下次生效时间
+            DispatchPlanInfoModel model = new DispatchPlanInfoModel();
+            model.setPlanId("PL"+ UUID.randomUUID());
+            model.setPlanType(oJsonParam.getPlanType());
+            model.setPlanStatus(oJsonParam.getPlanStatus());
+            model.setTitle(oJsonParam.getTitle());
+            model.setUrgentLevel(oJsonParam.getUrgentLevel());
+            model.setDispatchRemark(oJsonParam.getDispatchRemark());
+            model.setDispatchLeadTime(oJsonParam.getDispatchLeadTime());
+            model.setCreatorId(oJsonParam.getCreatorId());
+            model.setCreateTime(TimeTool.getCurMsUTC());
+            model.setCycles(oJsonParam.getCycles());
+            model.setZoneId(oJsonParam.getZoneId());
+            //TODO 开始计算时间字段并设置
+            Long lastTakeTime = 0L;
+            Long nextTakeTime = 0L;//下一次生效时间
+            //TODO 分是否排班
+            if(!CollectionUtils.isEmpty(oJsonParam.getItemsList())){
+                List<JPDispatchCmdBatchItem> newList = oJsonParam.getItemsList().stream()
+                        .sorted(Comparator.comparing(JPDispatchCmdBatchItem::getHandleStartTime))
+                        .collect(Collectors.toList());
+                if(model.getPlanType()==0) {
+                    //TODO 临时计划
+                    Instant nowTime = Instant.ofEpochMilli(
+                            TimeTool.convertDateStr2UTC
+                                    (
+                                            JSONArray.parseArray(model.getCycles()).getString(0)
+                                                    +" "+
+                                                    newList.get(0).getHandleStartTime()));
+                    if(model.getDispatchLeadTime()==0) {
+                        nextTakeTime = nowTime.toEpochMilli();
+                    }else if(model.getDispatchLeadTime()>0){
+                        nextTakeTime = nowTime.minus(-model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                    }else if(model.getDispatchLeadTime()<0){
+                        nextTakeTime = nowTime.minus(model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                    }
+                }else if(model.getPlanType()==1){
+                    //TODO 日计划
+                    Instant nowTime = Instant.ofEpochMilli(
+                            TimeTool.convertDateStr2UTC
+                                    (JSONArray.parseArray(
+                                            model.getCycles()+" "+newList.get(0).getHandleStartTime()).get(0).toString()));
+                    if(model.getDispatchLeadTime()==0) {
+                        nextTakeTime = nowTime.toEpochMilli();
+                    }else if(model.getDispatchLeadTime()>0){
+                        nextTakeTime = nowTime.minus(-model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                    }else if(model.getDispatchLeadTime()<0){
+                        nextTakeTime = nowTime.minus(model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                    }
+                }else if(model.getPlanType()==2){
+                    //TODO 周计划
+                    //TODO 先取周期值里最小的数,新集合里最小的值就是最早的周几数
+                    JSONArray newJSONArray = JSONArray.parseArray(model.getCycles()).stream().sorted(
+                            // 根据
+                            Comparator.comparingLong(
+                                    e -> Long.valueOf(e.toString())
+                            )
+                            // 放开下面的注释,使用reversed()方法,就是降序 大到小
+                            // .reversed()
+                    ).collect(Collectors.toCollection(JSONArray::new));
+
+                    //TODO dayOfWeekInt 为当前时间的星期几
+                    DayOfWeek dayOfWeek = LocalDateTime.now().getDayOfWeek();
+                    Integer dayOfWeekInt = dayOfWeek.getValue();
+
+                    if(newJSONArray!=null&&!newJSONArray.isEmpty()) {
+                        //TODO 三种情况,小于等于最小值取最小(大于最大值也取最小),大于区间最小值和小于等于区间最大值(取区间最大值),大于最大值,则取下周的最小值日期
+                        for (int i = 0; i < newJSONArray.size(); i++) {
+                            LocalDate newResult = null;
+                            if (dayOfWeekInt <= newJSONArray.getInteger(0)
+                                    ||
+                                    dayOfWeekInt>newJSONArray.getInteger(newJSONArray.size()-1)) {
+                                //TODO 那么下次生效时间为本周期最小值的日期
+                                LocalDate result = LocalDate.now().with(DayOfWeek.of(newJSONArray.getInteger(0)));
+                                newResult = result; // 返回指定的星期几的日期
+                            } else if (dayOfWeekInt > newJSONArray.getInteger(i) && dayOfWeekInt <= newJSONArray.getInteger(i + 1)) {
+                                //TODO 循环到此处不会报错, 因为如果为7的话 ,循环的i+1只会增加到6,不会到7
+                                //TODO 那么下次生效时间为该区间的最大值
+                                LocalDate result = LocalDate.now().with(DayOfWeek.of(newJSONArray.getInteger(i + 1))); // 将日期调整到本周的周一
+                                newResult = result; // 返回指定的星期几的日期
+                            }else if(dayOfWeekInt > newJSONArray.getInteger(newJSONArray.size()-1)){
+                                //TODO 说明当前天已不再设置范围内,则取下一周的最小星期数日期
+                                LocalDate result = LocalDate.now().minusWeeks(-1).with(DayOfWeek.of(newJSONArray.getInteger(0))); // 将日期调整到下周的指定星期几
+                                newResult = result;
+                            }
+                            if (newResult!=null) {
+                                Instant nowTime = Instant.ofEpochMilli(
+                                        TimeTool.convertDateStr2UTC
+                                                (JSONArray.parseArray(
+                                                        newResult.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
+                                                                + " " +
+                                                                newList.get(0).getHandleStartTime()).get(0).toString()));
+                                if (model.getDispatchLeadTime() == 0) {
+                                    nextTakeTime = nowTime.toEpochMilli();
+                                } else if (model.getDispatchLeadTime() > 0) {
+                                    nextTakeTime = nowTime.minus(-model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                                } else if (model.getDispatchLeadTime() < 0) {
+                                    nextTakeTime = nowTime.minus(model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                                }
+                                break;
+                            }
+                        }
+                    }
+                }else if(model.getPlanType()==3){
+                    //TODO 月计划
+                    JSONArray newJSONArray = JSONArray.parseArray(model.getCycles()).stream().sorted(
+                            // 根据
+                            Comparator.comparingLong(
+                                    e -> Long.valueOf(e.toString())
+                            )
+                            // 放开下面的注释,使用reversed()方法,就是降序 大到小
+                            // .reversed()
+                    ).collect(Collectors.toCollection(JSONArray::new));
+
+                    Integer dayOfMonth = LocalDate.now().getDayOfMonth();//当前天号数
+                    //TODO 三种情况,小于等于最小值取最小(大于最大值也取最小),大于区间最小值和小于等于区间最大值(取区间最大值),大于最大值则取下个月的最小日期
+                    for (int i = 0; i < newJSONArray.size(); i++) {
+                        LocalDate newResult = null;
+                        if (dayOfMonth <= newJSONArray.getInteger(0)){
+                            //TODO 如果设置的值大于当前月的最后一天
+                            if(newJSONArray.getInteger(0)>LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth()){
+                                //TODO 说明是想设置最后一天,因此特殊处理一下,避免日期设置报错
+                                newResult = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+                            }else{
+                                newResult = LocalDate.now().withDayOfMonth(newJSONArray.getInteger(0));
+                            }
+                        }else if (dayOfMonth > newJSONArray.getInteger(i) && dayOfMonth <= newJSONArray.getInteger(i + 1)) {
+                            if(newJSONArray.getInteger(i + 1)>LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth()) {
+                                //TODO 说明是想设置最后一天,因此特殊处理一下,避免日期设置报错
+                                newResult = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+                            }else{
+                                newResult = LocalDate.now().withDayOfMonth(newJSONArray.getInteger(i+1));
+                            }
+                        }else if(dayOfMonth > newJSONArray.getInteger(newJSONArray.size()-1)){
+                            if(newJSONArray.getInteger(0)>LocalDate.now().minusMonths(-1).with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth()) {
+                                //TODO 说明是想设置最后一天,因此特殊处理一下,避免日期设置报错
+                                newResult = LocalDate.now().minusMonths(-1).with(TemporalAdjusters.lastDayOfMonth());
+                            }else{
+                                newResult = LocalDate.now().minusMonths(-1).withDayOfMonth(newJSONArray.getInteger(0));
+                            }
+                        }
+                        if(newResult!=null){
+                            Instant nowTime = Instant.ofEpochMilli(
+                                    TimeTool.convertDateStr2UTC
+                                            (JSONArray.parseArray(
+                                                    newResult.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
+                                                            + " " +
+                                                            newList.get(0).getHandleStartTime()).get(0).toString()));
+                            if (model.getDispatchLeadTime() == 0) {
+                                nextTakeTime = nowTime.toEpochMilli();
+                            } else if (model.getDispatchLeadTime() > 0) {
+                                nextTakeTime = nowTime.minus(-model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                            } else if (model.getDispatchLeadTime() < 0) {
+                                nextTakeTime = nowTime.minus(model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                            }
+                            break;
+                        }
+                    }
+                }else if(model.getPlanType()==4){
+                    //TODO 年计划
+                    JSONArray newJSONArray = JSONArray.parseArray(model.getCycles()).stream().sorted(
+                            // 根据
+                            Comparator.comparing(
+                                    e -> e.toString()
+                            )
+                            // 放开下面的注释,使用reversed()方法,就是降序 大到小
+                            // .reversed()
+                    ).collect(Collectors.toCollection(JSONArray::new));
+
+                    LocalDate dateNow = LocalDate.now();//当前日期
+                    //TODO 三种情况,小于等于最小值取最小(大于最大值也取最小),大于区间最小值和小于等于区间最大值(取区间最大值),大于最大值则取下个月的最小日期
+                    for (int i = 0; i < newJSONArray.size(); i++) {
+                        LocalDate newResult = null;
+                        //TODO 转换时默认为当前年
+                        LocalDate firstDate = LocalDate.parse(LocalDate.now().getYear()+"-"+newJSONArray.getString(0),DateTimeFormatter.ofPattern("MM-dd"));
+                        LocalDate nowDate =  LocalDate.parse(LocalDate.now().getYear()+"-"+newJSONArray.getString(i),DateTimeFormatter.ofPattern("MM-dd"));
+                        LocalDate nowLastDate =  LocalDate.parse(LocalDate.now().getYear()+"-"+newJSONArray.getString(i+1),DateTimeFormatter.ofPattern("MM-dd"));
+                        LocalDate lastDate =  LocalDate.parse(LocalDate.now().getYear()+"-"+newJSONArray.getString(newJSONArray.size()-1),DateTimeFormatter.ofPattern("MM-dd"));
+                        if (dateNow.isBefore(firstDate)||dateNow.isEqual(firstDate)){
+                            newResult = firstDate;
+                        }else if (dateNow.isAfter(nowDate)  && (dateNow.isBefore(nowLastDate) || dateNow.isEqual(nowLastDate) )) {
+                            newResult = nowLastDate;
+                        }else if(dateNow.isAfter(lastDate)){
+                            //TODO 说明值已为当前时间的过去时,那么设置下一年的时间为生效时间
+                            newResult = lastDate.minusYears(-1);
+                        }
+                        if(newResult!=null){
+                            Instant nowTime = Instant.ofEpochMilli(
+                                    TimeTool.convertDateStr2UTC
+                                            (JSONArray.parseArray(
+                                                    newResult.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
+                                                            + " " +
+                                                            newList.get(0).getHandleStartTime()).get(0).toString()));
+                            if (model.getDispatchLeadTime() == 0) {
+                                nextTakeTime = nowTime.toEpochMilli();
+                            } else if (model.getDispatchLeadTime() > 0) {
+                                nextTakeTime = nowTime.minus(-model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                            } else if (model.getDispatchLeadTime() < 0) {
+                                nextTakeTime = nowTime.minus(model.getDispatchLeadTime(), ChronoUnit.MINUTES).toEpochMilli();
+                            }
+                            break;
+                        }
+                    }
+
+                }
+            }
+
+            //TODO 如果当前时间与下次生效时间是同一天,但是时刻已经是过去时,那么则返回失败信息
+            Long nowTimeLong = TimeTool.getCurMsUTC();
+            if(nowTimeLong>nextTakeTime&&isSameDay(nowTimeLong,nextTakeTime)){
+                return ResponseCode.STATUS_ERROR_JSON_FORMAT;
+            }
+
+            model.setLastTakeTime(lastTakeTime);
+            model.setNextTakeTime(nextTakeTime);
+            model.setTakes(0);
+            model.setErrors("");
+            model.setSendway(oJsonParam.getSendway());
+            model.setChufaRulsFlag(oJsonParam.getChufaRulsFlag());
+
+            ResponseCode insertRes = getThisDBService().insertPlanInfoByCount(model,oJsonParam.getRulesList(),
+                    oJsonParam.getTagsList(),oJsonParam.getItemsList());
+            return insertRes;
+        }catch(Exception ex){
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mStrClassName, mStrClassName
+                    ,String.format("insert planInfo errorMsg:%s end<====",
+                            ex.getLocalizedMessage()));
+            return ResponseCode.RESULT_BAD;
+        }
+    }
+
+    private static boolean isSameDay(long timestamp1, long timestamp2) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        // 确保时区设置正确,以避免因夏令时导致的问题
+        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+        return sdf.format(new Date(timestamp1)).equals(sdf.format(new Date(timestamp2)));
+    }
 }

+ 6 - 2
src/main/java/com/shkpr/service/aimodelpower/constants/ApiURI.java

@@ -114,10 +114,14 @@ public class ApiURI {
 
     public static final String URI_INTERNAL_OPS_XXX = "/ops/**";
 
-    public static final String URI_WATER_ZILAISHUI_H = "/ai-model/currency/water/zilaishui";
-    public static final String URI_WATER_ZILAISHUI_H_XXX = URI_WATER_ZILAISHUI_H+"/**";
+    public static final String URI_CURRENCY_H="/ai-model/currency";
+    public static final String URI_CURRENCY_XXX= URI_CURRENCY_H+"/**";
+
+    public static final String URI_WATER_ZILAISHUI_H = URI_CURRENCY_H+"/water/zilaishui";
     public static final String URI_WATER_ZILAISHUI_DAY = "daydata";
     public static final String URI_WATER_ZILAISHUI_HOUR = "hourdata";
     public static final String URI_WATER_ZILAISHUI_HOUR_PUMP_IN = "hourIndata";
     public static final String URI_WATER_ZILAISHUI_HOUR_PUMP_OUT= "hourOutdata";
+
+    public static final String URI_DISPATCH_PLAN_H = URI_CURRENCY_H+"/dispatch/plan";
 }

+ 213 - 0
src/main/java/com/shkpr/service/aimodelpower/controllerapi/woDispatchPlan/WoDispatchPlanInfoController.java

@@ -0,0 +1,213 @@
+package com.shkpr.service.aimodelpower.controllerapi.woDispatchPlan;
+
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.aimodelpower.bizmgr.WODispatchPlanTmDoBizFun;
+import com.shkpr.service.aimodelpower.commtools.CommTool;
+import com.shkpr.service.aimodelpower.constants.ApiURI;
+import com.shkpr.service.aimodelpower.controllerfilter.TokenAuthenticationService;
+import com.shkpr.service.aimodelpower.controllervalid.CommonParamValidNew;
+import com.shkpr.service.aimodelpower.controllervalid.CommonParamValidSS;
+import com.shkpr.service.aimodelpower.dto.PageRecordRes;
+import com.shkpr.service.aimodelpower.dto.ResponseCode;
+import com.shkpr.service.aimodelpower.dto.ResponseRes;
+import com.shkpr.service.aimodelpower.dto.woDispatchPlanModel.DispatchPlanInfoModel;
+import com.shkpr.service.aimodelpower.dto.woDispatchPlanModel.DispatchPlanInfoSSModel;
+import com.shkpr.service.aimodelpower.exception.SelfException;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchPlanInfoDetailsSS;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchPlanInfoSS;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchPlanInfoSave;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @ClassName WoDispatchPlanInfoController
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/6/27
+ * @Version V1.0
+ **/
+@RequestMapping(ApiURI.URI_DISPATCH_PLAN_H)
+@RestController
+public class WoDispatchPlanInfoController {
+    final String MSG_SUCCESS = "success.";
+    final String MSG_FAILED = "failed.";
+    private String mStrClassName;
+    private String mBusinessType = "";
+    private AtomicInteger mSeqNotify = null
+            , mSeqList = null
+            , mSeqSS = null
+            , mSeqResetReq = null
+            , mSeqSK = null
+            , mSeqDel = null;
+    public WoDispatchPlanInfoController() {
+        mStrClassName = "WoDispatchPlanInfoController";
+        mBusinessType = "WoDispatchPlanInfoController";
+        mSeqNotify = new AtomicInteger(0);
+        mSeqList = new AtomicInteger(0);
+        mSeqSS = new AtomicInteger(0);
+        mSeqResetReq = new AtomicInteger(0);
+        mSeqSK = new AtomicInteger(0);
+        mSeqDel = new AtomicInteger(0);
+    }
+
+    @PostMapping(value = ApiURI.URI_XXX_LISTS)
+    public ResponseRes lists(HttpServletRequest request
+            , @RequestHeader(value= ApiURI.HEADER_CLIENT_TYPE, required=false) String strClientType
+            , @RequestHeader(value= ApiURI.HEADER_USER_AGENT, required=false) String strUserAgent
+            , @RequestBody(required=false) @Validated(value={CommonParamValidSS.class}) JPDispatchPlanInfoSS oJsonParam
+            , BindingResult bindRes) throws Exception{
+        final String URI_PATH = request.getRequestURI();
+        final String strPlatform = CommTool.getPlatformByAgent(strClientType, strUserAgent);
+        final String strUserId = (String)request.getAttribute(TokenAuthenticationService.HEADER_USERID);
+        if (oJsonParam == null || bindRes.hasErrors() || !oJsonParam.checkValid()){
+            throw new SelfException(ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrCode()
+                    , String.format(ApiURI.EXCEPTION_FORMAT
+                    , strPlatform
+                    , URI_PATH
+                    , ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrMsg()));
+        }
+        long llReqBefore = System.currentTimeMillis();
+        String strRunSeq = String.format("%d-%d", llReqBefore, mSeqSS.incrementAndGet());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBusinessType, mStrClassName, strUserId
+                ,String.format("%s:%s seq:{%s} param:%s begin====>"
+                        ,strPlatform
+                        ,URI_PATH
+                        ,strRunSeq
+                        ,oJsonParam.toString()));
+
+        ResponseRes<String> resResult = new ResponseRes<String>();
+        resResult.setRescode(ResponseCode.RESULT_BAD.toStrCode());
+        resResult.setResmsg(MSG_FAILED);
+        resResult.setResdata("");
+
+        PageRecordRes<DispatchPlanInfoSSModel> pageRecordRes = WODispatchPlanTmDoBizFun.queryPageList(oJsonParam);
+        if (pageRecordRes != null && pageRecordRes.getCode() == 0){
+            resResult.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
+            resResult.setResmsg(MSG_SUCCESS);
+        }
+        resResult.setResdata(oJsonParam.genJsonStrForResponse(pageRecordRes));
+        if (pageRecordRes != null)
+            pageRecordRes.clearData();
+        resResult.setTimestamp(System.currentTimeMillis());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBusinessType, mStrClassName, strUserId
+                ,String.format("%s:%s seq:{%s} rescode:{%s} resmsg:{%s} time:{%d ms} end<===="
+                        ,strPlatform
+                        ,URI_PATH
+                        ,strRunSeq
+                        ,resResult.getRescode()
+                        ,resResult.getResmsg()
+                        ,resResult.getTimestamp()-llReqBefore));
+        return resResult;
+    }
+
+    @PostMapping(value = ApiURI.URI_XXX_SK)
+    public ResponseRes sk(HttpServletRequest request
+            , @RequestHeader(value= ApiURI.HEADER_CLIENT_TYPE, required=false) String strClientType
+            , @RequestHeader(value= ApiURI.HEADER_USER_AGENT, required=false) String strUserAgent
+            , @RequestBody(required=false) @Validated(value={CommonParamValidSS.class}) JPDispatchPlanInfoDetailsSS oJsonParam
+            , BindingResult bindRes) throws Exception{
+        final String URI_PATH = request.getRequestURI();
+        final String strPlatform = CommTool.getPlatformByAgent(strClientType, strUserAgent);
+        final String strUserId = (String)request.getAttribute(TokenAuthenticationService.HEADER_USERID);
+        if (oJsonParam == null || bindRes.hasErrors()){
+            throw new SelfException(ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrCode()
+                    , String.format(ApiURI.EXCEPTION_FORMAT
+                    , strPlatform
+                    , URI_PATH
+                    , ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrMsg()));
+        }
+        long llReqBefore = System.currentTimeMillis();
+        String strRunSeq = String.format("%d-%d", llReqBefore, mSeqSS.incrementAndGet());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBusinessType, mStrClassName, strUserId
+                ,String.format("%s:%s seq:{%s} param:%s begin====>"
+                        ,strPlatform
+                        ,URI_PATH
+                        ,strRunSeq
+                        ,oJsonParam.toString()));
+
+        ResponseRes<String> resResult = new ResponseRes<String>();
+        resResult.setRescode(ResponseCode.RESULT_BAD.toStrCode());
+        resResult.setResmsg(MSG_FAILED);
+        resResult.setResdata("");
+
+        ResponseRes oRes = WODispatchPlanTmDoBizFun.selectPlanInfoView(oJsonParam);
+        if(oRes  != null ) {
+            if (ResponseCode.RESULT_NORMAL.toStrCode().equals(oRes.getRescode())) {
+                resResult.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
+                resResult.setResmsg(MSG_SUCCESS);
+                resResult.setResdata(oRes.getResdata().toString());
+            } else {
+                resResult.setRescode(oRes.getRescode());
+                resResult.setResmsg(oRes.getResmsg());
+            }
+        }
+
+        resResult.setTimestamp(System.currentTimeMillis());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBusinessType, mStrClassName, strUserId
+                ,String.format("%s:%s seq:{%s} rescode:{%s} resmsg:{%s} time:{%d ms} end<===="
+                        ,strPlatform
+                        ,URI_PATH
+                        ,strRunSeq
+                        ,resResult.getRescode()
+                        ,resResult.getResmsg()
+                        ,resResult.getTimestamp()-llReqBefore));
+        return resResult;
+    }
+
+    @PostMapping(value = ApiURI.URI_XXX_NEW_INFO)
+    public ResponseRes newInfo(HttpServletRequest request
+            , @RequestHeader(value= ApiURI.HEADER_CLIENT_TYPE, required=false) String strClientType
+            , @RequestHeader(value= ApiURI.HEADER_USER_AGENT, required=false) String strUserAgent
+            , @RequestBody(required=false) @Validated(value={CommonParamValidNew.class}) JPDispatchPlanInfoSave oJsonParam
+            , BindingResult bindRes) throws Exception{
+        final String URI_PATH = request.getRequestURI();
+        final String strPlatform = CommTool.getPlatformByAgent(strClientType, strUserAgent);
+        final String strUserId = (String)request.getAttribute(TokenAuthenticationService.HEADER_USERID);
+        if (oJsonParam == null || bindRes.hasErrors() || !oJsonParam.checkValid()){
+            throw new SelfException(ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrCode()
+                    , String.format(ApiURI.EXCEPTION_FORMAT
+                    , strPlatform
+                    , URI_PATH
+                    , ResponseCode.STATUS_ERROR_JSON_FORMAT.toStrMsg()));
+        }
+        long llReqBefore = System.currentTimeMillis();
+        String strRunSeq = String.format("%d-%d", llReqBefore, mSeqSS.incrementAndGet());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBusinessType, mStrClassName, strUserId
+                ,String.format("%s:%s seq:{%s} param:%s begin====>"
+                        ,strPlatform
+                        ,URI_PATH
+                        ,strRunSeq
+                        ,oJsonParam.toString()));
+
+        ResponseRes<String> resResult = new ResponseRes<String>();
+        resResult.setRescode(ResponseCode.RESULT_BAD.toStrCode());
+        resResult.setResmsg(MSG_FAILED);
+        resResult.setResdata("");
+
+        ResponseCode resCode = WODispatchPlanTmDoBizFun.savePlan(oJsonParam);
+        if (resCode!=null&&resCode==ResponseCode.RESULT_NORMAL){
+            resResult.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
+            resResult.setResmsg(MSG_SUCCESS);
+        }else{
+            if(resCode!=null) {
+                resResult.setRescode(resCode.toStrCode());
+                resResult.setResmsg(resCode.toStrMsg());
+            }
+        }
+        resResult.setTimestamp(System.currentTimeMillis());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, mBusinessType, mStrClassName, strUserId
+                ,String.format("%s:%s seq:{%s} rescode:{%s} resmsg:{%s} time:{%d ms} end<===="
+                        ,strPlatform
+                        ,URI_PATH
+                        ,strRunSeq
+                        ,resResult.getRescode()
+                        ,resResult.getResmsg()
+                        ,resResult.getTimestamp()-llReqBefore));
+        return resResult;
+    }
+}

+ 2 - 2
src/main/java/com/shkpr/service/aimodelpower/controllerfilter/third/ThirdJWTBusiFilterMgr.java

@@ -34,11 +34,11 @@ public class ThirdJWTBusiFilterMgr extends JWTAuthenticationFilter {
 
         mRequestMatcherForCustomXXX = new AntPathRequestMatcher(ApiURI.URI_CUSTOMIZE_XXX);
         mRequestMatcherForReportForm = new AntPathRequestMatcher(ApiURI.URI_COMM_REPORT_FORM_XXX);
-        mRequestMatcherForCurrency = new AntPathRequestMatcher(ApiURI.URI_WATER_ZILAISHUI_H_XXX);
+        mRequestMatcherForCurrency = new AntPathRequestMatcher(ApiURI.URI_CURRENCY_XXX);
         mFilterForTaskFiles = new ThirdJWTTaskFilesBusiFilter(ApiURI.URI_FILES_XXX, authenticationManager);
         mFilterForCustomXXX = new ThirdJWTCustomXXXFilter(ApiURI.URI_CUSTOMIZE_XXX, authenticationManager);
         mFilterForReportForm = new ThirdJWTCommReportFormFilter(ApiURI.URI_COMM_REPORT_FORM_XXX, authenticationManager);
-        mFilterForCurrency = new ThirdJWTCurrencyFilter(ApiURI.URI_WATER_ZILAISHUI_H_XXX, authenticationManager);
+        mFilterForCurrency = new ThirdJWTCurrencyFilter(ApiURI.URI_CURRENCY_XXX, authenticationManager);
         setControllerCheck(null);
     }
 

+ 4 - 0
src/main/java/com/shkpr/service/aimodelpower/controllerfilter/third/ThirdJWTCurrencyFilter.java

@@ -24,6 +24,10 @@ public class ThirdJWTCurrencyFilter extends JWTAuthenticationFilter {
         msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_WATER_ZILAISHUI_H, ApiURI.URI_WATER_ZILAISHUI_HOUR), "POST");
         msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_WATER_ZILAISHUI_H, ApiURI.URI_WATER_ZILAISHUI_HOUR_PUMP_IN), "POST");
         msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_WATER_ZILAISHUI_H, ApiURI.URI_WATER_ZILAISHUI_HOUR_PUMP_OUT), "POST");
+
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_DISPATCH_PLAN_H, ApiURI.URI_XXX_LISTS), "POST");
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_DISPATCH_PLAN_H, ApiURI.URI_XXX_SK), "POST");
+        msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_DISPATCH_PLAN_H, ApiURI.URI_XXX_NEW_INFO), "POST");
     }
 
     public ThirdJWTCurrencyFilter(AuthenticationManager authenticationManager) {

+ 69 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchCmdPatchDisposalMapper.java

@@ -0,0 +1,69 @@
+package com.shkpr.service.aimodelpower.dbdao.mapper;
+
+import com.shkpr.service.aimodelpower.dbdao.providers.WODispatchCmdBatchDisposalSqlProvider;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.SelectProvider;
+import org.apache.ibatis.annotations.UpdateProvider;
+
+import java.util.List;
+import java.util.Map;
+
+public interface WODispatchCmdPatchDisposalMapper {
+
+    @SelectProvider(type = WODispatchCmdBatchDisposalSqlProvider.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 = WODispatchCmdBatchDisposalSqlProvider.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 = WODispatchCmdBatchDisposalSqlProvider.class, method = "getByUniqueId")
+    Map<String, Object> getOne(@Param("table") String table, @Param("filed") String filed, @Param("id") Object id);
+
+    @SelectProvider(type = WODispatchCmdBatchDisposalSqlProvider.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 = WODispatchCmdBatchDisposalSqlProvider.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 = WODispatchCmdBatchDisposalSqlProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = WODispatchCmdBatchDisposalSqlProvider.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 = WODispatchCmdBatchDisposalSqlProvider.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 = WODispatchCmdBatchDisposalSqlProvider.class, method = "batchUpdateWiths")
+    int batchUpdateWiths(@Param("andWheres") List<Map<String, Object>> andWheres
+            , @Param("datas") List<Map<String, Object>> datas);
+}

+ 73 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchCmdPatchItemMapper.java

@@ -0,0 +1,73 @@
+package com.shkpr.service.aimodelpower.dbdao.mapper;
+
+import com.shkpr.service.aimodelpower.dbdao.providers.WODispatchCmdBatchDisposalSqlProvider;
+import com.shkpr.service.aimodelpower.dbdao.providers.WODispatchCmdBatchItemSqlProvider;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.SelectProvider;
+import org.apache.ibatis.annotations.UpdateProvider;
+
+import java.util.List;
+import java.util.Map;
+
+public interface WODispatchCmdPatchItemMapper {
+
+    @SelectProvider(type = WODispatchCmdBatchItemSqlProvider.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 = WODispatchCmdBatchItemSqlProvider.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 = WODispatchCmdBatchItemSqlProvider.class, method = "getByUniqueId")
+    Map<String, Object> getOne(@Param("table") String table, @Param("filed") String filed, @Param("id") Object id);
+
+    @SelectProvider(type = WODispatchCmdBatchItemSqlProvider.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 = WODispatchCmdBatchItemSqlProvider.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 = WODispatchCmdBatchItemSqlProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = WODispatchCmdBatchItemSqlProvider.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 = WODispatchCmdBatchItemSqlProvider.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 = WODispatchCmdBatchItemSqlProvider.class, method = "batchUpdateWiths")
+    int batchUpdateWiths(@Param("andWheres") List<Map<String, Object>> andWheres
+            , @Param("datas") List<Map<String, Object>> datas);
+
+    @InsertProvider(type = WODispatchCmdBatchItemSqlProvider.class, method = "insertsThisData")
+    int insertsThisData(@Param("inserts") Map<String, Object> inserts);
+}

+ 63 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchPlanRulsMapper.java

@@ -0,0 +1,63 @@
+package com.shkpr.service.aimodelpower.dbdao.mapper;
+
+import com.shkpr.service.aimodelpower.dbdao.providers.WODispatchPlanRulsSqlProvider;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.SelectProvider;
+import org.apache.ibatis.annotations.UpdateProvider;
+
+import java.util.List;
+import java.util.Map;
+
+public interface WODispatchPlanRulsMapper {
+
+    @SelectProvider(type = WODispatchPlanRulsSqlProvider.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 = WODispatchPlanRulsSqlProvider.class, method = "getByUniqueId")
+    Map<String, Object> getOne(@Param("table") String table, @Param("filed") String filed, @Param("id") Object id);
+
+    @SelectProvider(type = WODispatchPlanRulsSqlProvider.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 = WODispatchPlanRulsSqlProvider.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 = WODispatchPlanRulsSqlProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = WODispatchPlanRulsSqlProvider.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 = WODispatchPlanRulsSqlProvider.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 = WODispatchPlanRulsSqlProvider.class, method = "batchUpdateWiths")
+    int batchUpdateWiths(@Param("andWheres") List<Map<String, Object>> andWheres
+            , @Param("datas") List<Map<String, Object>> datas);
+}

+ 70 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WODispatchPlanTagsMapper.java

@@ -0,0 +1,70 @@
+package com.shkpr.service.aimodelpower.dbdao.mapper;
+
+import com.shkpr.service.aimodelpower.dbdao.providers.WODispatchPlanTagsSqlProvider;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.SelectProvider;
+import org.apache.ibatis.annotations.UpdateProvider;
+
+import java.util.List;
+import java.util.Map;
+
+public interface WODispatchPlanTagsMapper {
+
+
+    @SelectProvider(type = WODispatchPlanTagsSqlProvider.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 = WODispatchPlanTagsSqlProvider.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 = WODispatchPlanTagsSqlProvider.class, method = "getByUniqueId")
+    Map<String, Object> getOne(@Param("table") String table, @Param("filed") String filed, @Param("id") Object id);
+
+    @SelectProvider(type = WODispatchPlanTagsSqlProvider.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 = WODispatchPlanTagsSqlProvider.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 = WODispatchPlanTagsSqlProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = WODispatchPlanTagsSqlProvider.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 = WODispatchPlanTagsSqlProvider.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 = WODispatchPlanTagsSqlProvider.class, method = "batchUpdateWiths")
+    int batchUpdateWiths(@Param("andWheres") List<Map<String, Object>> andWheres
+            , @Param("datas") List<Map<String, Object>> datas);
+}

+ 69 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/mapper/WOViewDispatchPlanRulsWithTagMapper.java

@@ -0,0 +1,69 @@
+package com.shkpr.service.aimodelpower.dbdao.mapper;
+
+import com.shkpr.service.aimodelpower.dbdao.providers.WOViewDispatchPlanRulsWithTagSqlProvider;
+import org.apache.ibatis.annotations.InsertProvider;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.SelectProvider;
+import org.apache.ibatis.annotations.UpdateProvider;
+
+import java.util.List;
+import java.util.Map;
+
+public interface WOViewDispatchPlanRulsWithTagMapper {
+
+    @SelectProvider(type = WOViewDispatchPlanRulsWithTagSqlProvider.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 = WOViewDispatchPlanRulsWithTagSqlProvider.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 = WOViewDispatchPlanRulsWithTagSqlProvider.class, method = "getByUniqueId")
+    Map<String, Object> getOne(@Param("table") String table, @Param("filed") String filed, @Param("id") Object id);
+
+    @SelectProvider(type = WOViewDispatchPlanRulsWithTagSqlProvider.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 = WOViewDispatchPlanRulsWithTagSqlProvider.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 = WOViewDispatchPlanRulsWithTagSqlProvider.class, method = "inserts")
+    int inserts(@Param("inserts") Map<String, Object> inserts);
+
+    /**
+     * update和delete返回受影响条数需要配合useAffectedRows=true
+     * @param datas
+     * @param andWheres
+     * @return
+     */
+    @UpdateProvider(type = WOViewDispatchPlanRulsWithTagSqlProvider.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 = WOViewDispatchPlanRulsWithTagSqlProvider.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 = WOViewDispatchPlanRulsWithTagSqlProvider.class, method = "batchUpdateWiths")
+    int batchUpdateWiths(@Param("andWheres") List<Map<String, Object>> andWheres
+            , @Param("datas") List<Map<String, Object>> datas);
+}

+ 46 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchCmdBatchDisposalSqlProvider.java

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

+ 122 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchCmdBatchItemSqlProvider.java

@@ -0,0 +1,122 @@
+package com.shkpr.service.aimodelpower.dbdao.providers;
+
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchCmdPatchItemTable;
+import org.springframework.util.StringUtils;
+
+import java.util.Iterator;
+import java.util.Map;
+
+public class WODispatchCmdBatchItemSqlProvider extends BaseSqlProvider implements WODispatchCmdPatchItemTable {
+    @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;
+    }
+
+    @Override
+    protected boolean isWTimeForFiled(String filedName) {
+        if (filedName.equals("handle_start_time")||filedName.equals("handle_end_time"))
+            return false;
+        return (filedName.endsWith("time"));
+    }
+
+    /**
+     * 拼接insert部分
+     * @param datas
+     * @param datasName
+     * @param strSplit
+     * @return
+     */
+    protected String genInsertsThisData(Map<String, Object> datas, String datasName, String strSplit){
+        StringBuilder sqlNames = new StringBuilder("(");
+        StringBuilder sqlValues = new StringBuilder("values(");
+        if (datas != null
+                && datas.size() > 0
+                && !StringUtils.isEmpty(datasName)
+                && !StringUtils.isEmpty(strSplit)){
+            int nCounts = 0;
+            Iterator iter = datas.entrySet().iterator();
+            while (iter.hasNext()) {
+                Map.Entry entry = (Map.Entry) iter.next();
+                String key = (String) entry.getKey();
+                if (isWGeomForFiled(key) && !isSupportPostGis())
+                    continue;
+
+                Object val = entry.getValue();
+                if (val != null){
+                    String strNeedFormat = getFormatForWrite(key);
+                    if (!StringUtils.isEmpty(strNeedFormat))
+                        strNeedFormat = String.format(",%s",strNeedFormat);
+                    if (nCounts++ == 0){
+                        sqlNames.append(key);
+                        if (key.equals("handle_start_time")||key.equals("handle_end_time")){
+                            sqlValues.append("CAST(#{"+datasName+"["+key+"]"+
+                                    "} AS time without time zone ) ");
+                        }else {
+                            sqlValues.append("#{" + datasName + "[" + key + "]" + strNeedFormat + "}");
+                        }
+                    } else{
+                        sqlNames.append(strSplit + " "+key);
+                        if (key.equals("handle_start_time")||key.equals("handle_end_time")){
+                            sqlValues.append(strSplit + " ").append("CAST(#{"+datasName+"["+key+"]"+
+                                    "} AS time without time zone ) ");
+                        }else{
+                            sqlValues.append(strSplit + " ").append("#{"+datasName+"["+key+"]"+strNeedFormat+"}");
+                        }
+                    }
+                    //#{key}表示取键为key的值
+                }
+            }
+        }
+        sqlNames.append(")");
+        sqlValues.append(")");
+        return String.format("%s %s", sqlNames, sqlValues);
+    }
+
+    public String insertsThisData(Map<String, Object> mapParams){
+        Map<String, Object> inserts = (Map<String, Object>)mapParams.get("inserts");
+        String table = getWTableName();
+        if (mapParams.containsKey("table") && !StringUtils.isEmpty(mapParams.get("table")))
+            table = (String)mapParams.get("table");
+
+        StringBuilder sql = new StringBuilder("");
+        sql.append("insert into "+table+" ");
+        String inSql = genInsertsThisData(inserts, "inserts", ",");
+        sql.append(inSql);
+        return sql.toString();
+    }
+}

+ 50 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WODispatchPlanRulsSqlProvider.java

@@ -0,0 +1,50 @@
+package com.shkpr.service.aimodelpower.dbdao.providers;
+
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchPlanInfoTable;
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchPlanRulsTable;
+import org.springframework.util.StringUtils;
+
+import java.util.Map;
+
+public class WODispatchPlanRulsSqlProvider extends BaseSqlProvider implements WODispatchPlanRulsTable {
+    @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;
+    }
+
+}

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

@@ -1,5 +1,6 @@
 package com.shkpr.service.aimodelpower.dbdao.providers;
 
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchCmdPatchItemTable;
 import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchPlanInfoTable;
 import org.springframework.util.StringUtils;
 
@@ -46,6 +47,13 @@ public class WODispatchPlanSqlProvider extends BaseSqlProvider implements WODisp
         return false;
     }
 
+    @Override
+    protected boolean isWTimeForFiled(String filedName) {
+        if (filedName.endsWith("take_time")||filedName.equals("dispatch_lead_time"))
+            return false;
+        return (filedName.endsWith("time"));
+    }
+
     /**
      * 该接口被调用时要求原始入口为:void Fun(@Param("andWheres") Map<String, Object>
      *                                      , @Param("orWheres") Map<String, Object>

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

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

+ 46 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/providers/WOViewDispatchPlanRulsWithTagSqlProvider.java

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

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

@@ -2,17 +2,24 @@ package com.shkpr.service.aimodelpower.dbdao.services;
 
 import com.global.base.log.LogLevelFlag;
 import com.global.base.log.LogPrintMgr;
+import com.global.base.tools.FastJsonUtil;
 import com.shkpr.service.aimodelpower.commtools.CommTool;
+import com.shkpr.service.aimodelpower.commtools.TimeTool;
 import com.shkpr.service.aimodelpower.constants.LogFlagBusiType;
-import com.shkpr.service.aimodelpower.dbdao.mapper.WODispatchPlanMapper;
+import com.shkpr.service.aimodelpower.dbdao.mapper.*;
 import com.shkpr.service.aimodelpower.dbdao.services.intef.WODispatchPlanDBService;
-import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchPlanInfoTable;
+import com.shkpr.service.aimodelpower.dbdao.tables.*;
+import com.shkpr.service.aimodelpower.dto.ResponseCode;
+import com.shkpr.service.aimodelpower.dto.woDispatchPlanModel.DispatchPlanInfoModel;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
 @Service
 public class WODispatchPlanDBServiceImpl implements WODispatchPlanDBService,WODispatchPlanInfoTable {
@@ -29,6 +36,26 @@ public class WODispatchPlanDBServiceImpl implements WODispatchPlanDBService,WODi
     @Autowired
     WODispatchPlanMapper woDispatchPlanMapper;
 
+    @SuppressWarnings("all")
+    @Autowired
+    WODispatchPlanRulsMapper woDispatchPlanRulsMapper;
+
+    @SuppressWarnings("all")
+    @Autowired
+    WODispatchPlanTagsMapper woDispatchPlanTagsMapper;
+
+    @SuppressWarnings("all")
+    @Autowired
+    WODispatchCmdPatchItemMapper woDispatchCmdPatchItemMapper;
+
+    @SuppressWarnings("all")
+    @Autowired
+    WODispatchCmdPatchDisposalMapper woDispatchCmdPatchDisposalMapper;
+
+    @SuppressWarnings("all")
+    @Autowired
+    WOViewDispatchPlanRulsWithTagMapper woViewDispatchPlanRulsWithTagMapper;
+
     @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;
@@ -54,6 +81,28 @@ public class WODispatchPlanDBServiceImpl implements WODispatchPlanDBService,WODi
     }
 
     @Override
+    public Map<String, Object> viewInfo(String table,String filed,String id) {
+        int nCode = 0;
+        String strMsg = "Success";
+        try {
+            Map<String, Object> mapRes = woViewDispatchPlanRulsWithTagMapper.getOne("","",id);//查询不到时也会返回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 Map<String, Object> totalWillProduceCounts(Map<String, Object> andWheres, Map<String, Object> orWheres, String orderBy, String extend) {
         int nCode = 0;
         String strMsg = "Success";
@@ -119,4 +168,60 @@ public class WODispatchPlanDBServiceImpl implements WODispatchPlanDBService,WODi
     public int batchDeleteIn(List<?> ids, String extend) {
         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 woDispatchPlanMapper.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));
+        }
+    }
+
+    //TODO 事务控制多对象添加
+    @Override
+    @Transactional(transactionManager = "mainDbTransactionManager")
+    public ResponseCode insertPlanInfoByCount(DispatchPlanInfoModel model, List<JPDispatchPlanInfoRuleSave> rulesList
+            , List<JPDispatchPlanInfoTagsSave> tagsList, List<JPDispatchCmdBatchItem> itemsList) {
+        woDispatchPlanMapper.inserts(FastJsonUtil.obj2Map(model,true));
+        if(model.getChufaRulsFlag()==1) {
+            for (JPDispatchPlanInfoRuleSave jp : rulesList) {
+                Map<String, Object> map = FastJsonUtil.obj2Map(jp, true);
+                map.put(WODispatchPlanRulsTable.W_INFO.PRIMARY_KEY, model.getPlanId());
+                woDispatchPlanRulsMapper.inserts(map);
+            }
+        }
+        for (JPDispatchPlanInfoTagsSave jp:tagsList){
+            Map<String,Object> map = FastJsonUtil.obj2Map(jp,true);
+            map.put(WODispatchPlanTagsTable.W_INFO.PRIMARY_KEY,model.getPlanId());
+            woDispatchPlanTagsMapper.inserts(map);
+        }
+        for (JPDispatchCmdBatchItem jp:itemsList){
+            Map<String,Object> map = FastJsonUtil.obj2Map(jp,true);
+            map.put(WODispatchCmdPatchItemTable.W_INFO.PRIMARY_KEY, "PLITEM"+UUID.randomUUID());
+            map.put(WODispatchCmdPatchItemTable.W_INFO.PLAN_ID, model.getPlanId());
+            map.put(WODispatchCmdPatchItemTable.W_INFO.CREATE_TIME,TimeTool.getCurMsUTC());
+            map.remove("dispoal_list");
+            //添加相应的处置建议
+            for (JPDispatchCmdBatchDispoal dispoal:jp.getDispoalList()) {
+                Map<String,Object> mapDispoal = FastJsonUtil.obj2Map(dispoal,true);
+                mapDispoal.put("key","PLITEMDIS"+UUID.randomUUID());
+                mapDispoal.put("create_time",TimeTool.getCurMsUTC());
+                mapDispoal.put(WODispatchCmdPatchDisposalTable.W_INFO.BATCH_ITEM_ID,map.get(WODispatchCmdPatchItemTable.W_INFO.PRIMARY_KEY));
+                woDispatchCmdPatchDisposalMapper.inserts(mapDispoal);
+            }
+            woDispatchCmdPatchItemMapper.insertsThisData(map);
+        }
+        return ResponseCode.RESULT_NORMAL;
+    }
+
 }

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

@@ -1,5 +1,12 @@
 package com.shkpr.service.aimodelpower.dbdao.services.intef;
 
+import com.shkpr.service.aimodelpower.dto.ResponseCode;
+import com.shkpr.service.aimodelpower.dto.woDispatchPlanModel.DispatchPlanInfoModel;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchCmdBatchItem;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchPlanInfoRuleSave;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchPlanInfoSave;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchPlanInfoTagsSave;
+
 import java.util.List;
 import java.util.Map;
 
@@ -11,9 +18,26 @@ public interface WODispatchPlanDBService extends BaseDBService {
             , Map<String, Object> orWheres
             , String orderBy
             , String extend);
+
+    Map<String,Object> viewInfo(String table,String filed,String id);
+
     Map<String, Object> totalWillProduceCounts(Map<String, Object> andWheres
             , Map<String, Object> orWheres
             , String orderBy
             , String extend);
+
+    int totalCountsEx(String table
+            , Map<String, Object> andWheres
+            , Map<String, Object> orWheres
+            , String extend);
+
+    //TODO 事务添加调度计划
+    ResponseCode insertPlanInfoByCount(DispatchPlanInfoModel model,//TODO 相关关联子对象参数
+                                       //① 计划相关触发规则
+                                       List<JPDispatchPlanInfoRuleSave> rulesList,
+                                       //② 计划附加标签项
+                                       List<JPDispatchPlanInfoTagsSave> tagsList,
+                                       //③ 排班班次项
+                                       List<JPDispatchCmdBatchItem> itemsList);
 }
 

+ 21 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchCmdPatchDisposalTable.java

@@ -0,0 +1,21 @@
+package com.shkpr.service.aimodelpower.dbdao.tables;
+
+public interface WODispatchCmdPatchDisposalTable {
+    interface R_INFO{
+        String TABLE = "";
+        String PRIMARY_KEY = "key";
+        String ALL_FILED = "*";
+        String UNIQUE_ID = "key";
+    }
+
+    interface W_INFO{
+        String TABLE = "k4_wo_dispatch_cmd_batch_disposal";
+        String PRIMARY_KEY = "key";
+        String UNIQUE_ID = "key";
+
+        String BATCH_ITEM_ID = "batch_item_id";
+
+        String CREATE_TIME="create_time";
+        String UPDATE_TIME="update_time";
+    }
+}

+ 21 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchCmdPatchItemTable.java

@@ -0,0 +1,21 @@
+package com.shkpr.service.aimodelpower.dbdao.tables;
+
+public interface WODispatchCmdPatchItemTable {
+    interface R_INFO{
+        String TABLE = "";
+        String PRIMARY_KEY = "batch_item_id";
+        String ALL_FILED = "*";
+        String UNIQUE_ID = "batch_item_id";
+    }
+
+    interface W_INFO{
+        String TABLE = "k4_wo_dispatch_cmd_batch_item";
+        String PRIMARY_KEY = "batch_item_id";
+        String UNIQUE_ID = "batch_item_id";
+
+        String PLAN_ID = "plan_id";
+
+        String CREATE_TIME="create_time";
+        String UPDATE_TIME="update_time";
+    }
+}

+ 18 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchPlanRulsTable.java

@@ -0,0 +1,18 @@
+package com.shkpr.service.aimodelpower.dbdao.tables;
+
+public interface WODispatchPlanRulsTable {
+    interface R_INFO{
+        String ID = "id";
+        String TABLE = "";
+        String PRIMARY_KEY = "plan_id";
+        String ALL_FILED = "*";
+        String UNIQUE_ID = "plan_id";
+    }
+
+    interface W_INFO{
+        String ID = "id";
+        String TABLE = "k4_wo_dispatch_plan_ruls";
+        String PRIMARY_KEY = "plan_id";
+        String UNIQUE_ID = "plan_id";
+    }
+}

+ 16 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WODispatchPlanTagsTable.java

@@ -0,0 +1,16 @@
+package com.shkpr.service.aimodelpower.dbdao.tables;
+
+public interface WODispatchPlanTagsTable {
+    interface R_INFO{
+        String TABLE = "";
+        String PRIMARY_KEY = "plan_id";
+        String ALL_FILED = "*";
+        String UNIQUE_ID = "plan_id";
+    }
+
+    interface W_INFO{
+        String TABLE = "k4_wo_dispatch_plan_tags";
+        String PRIMARY_KEY = "plan_id";
+        String UNIQUE_ID = "plan_id";
+    }
+}

+ 16 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/tables/WOViewDispatchPlanRulsWithTagTable.java

@@ -0,0 +1,16 @@
+package com.shkpr.service.aimodelpower.dbdao.tables;
+
+public interface WOViewDispatchPlanRulsWithTagTable {
+    interface R_INFO{
+        String TABLE = "v_k4_wo_dispatch_plan_ruls_with_tag";
+        String PRIMARY_KEY = "plan_id";
+        String ALL_FILED = "*";
+        String UNIQUE_ID = "plan_id";
+    }
+
+    interface W_INFO{
+        String TABLE = "";
+        String PRIMARY_KEY = "plan_id";
+        String UNIQUE_ID = "plan_id";
+    }
+}

+ 21 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/PageRecordRes.java

@@ -0,0 +1,21 @@
+package com.shkpr.service.aimodelpower.dto;
+
+import java.util.ArrayList;
+
+public class PageRecordRes<T> extends TRecordRes<T>{
+    public PageRecordRes() {
+        super();
+    }
+
+    public PageRecordRes(int code) {
+        super(code);
+    }
+
+    @Override
+    public void checkRes() {
+        if (data == null)
+            data = new ArrayList<>();
+        //total = CommTool.listSize(data); don't do this when by page, because total is sum of all page
+    }
+}
+

+ 22 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchCmdBatchDispoal.java

@@ -0,0 +1,22 @@
+package com.shkpr.service.aimodelpower.dto.woDispatchPlanModel;
+
+import lombok.Data;
+
+/**
+ * @ClassName DispatchCmdBatchDispoal
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/6/28
+ * @Version V1.0
+ **/
+@Data
+public class DispatchCmdBatchDispoal {
+    private String disposalId;//处置建议_id
+    private String batchItemId;//排班id
+    private String createTime;//数据创建时间
+    private String updateTime;//数据修改时间
+    private String data;//处置内容
+    private String did;//处置建议id(如存分区或站点id)
+    private String dname;//工单关心以及需要存储的事情(如存处置对象名称)
+    private Integer ordering;//处置建议在app上的排序值
+}

+ 25 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchCmdBatchItemModel.java

@@ -0,0 +1,25 @@
+package com.shkpr.service.aimodelpower.dto.woDispatchPlanModel;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @ClassName DispatchCmdBatchItemModel
+ * @Description: TODO 水量调度指令排班项表
+ * @Author LX
+ * @Date 2024/6/28
+ * @Version V1.0
+ **/
+@Data
+public class DispatchCmdBatchItemModel {
+    private String batchItem_id;//批次项id
+    private String planId;//所属计划id
+    private String headUserId;//指定负责人uid
+    private String handleStartTime;//指定处理有效起始时间(HH:mm:ss) 日期为计划的预计开始时间
+    private String handleEndTime;//指定处理有效截止时间(HH:mm:ss) 日期为计划的预计开始时间
+    private String createTime;//数据创建时间
+    private String updateTime;//数据修改时间
+    private String handleAddress;//处置实际地址
+    private String gis;//处置地址gis坐标
+}

+ 31 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchPlanInfoDetailsModel.java

@@ -0,0 +1,31 @@
+package com.shkpr.service.aimodelpower.dto.woDispatchPlanModel;
+
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchCmdBatchItem;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchPlanInfoRuleSave;
+import com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan.JPDispatchPlanInfoTagsSave;
+
+import java.util.List;
+
+/**
+ * @ClassName DispatchPlanInfoDetailsModel
+ * @Description: TODO 计划详情信息
+ * @Author LX
+ * @Date 2024/7/8
+ * @Version V1.0
+ **/
+public class DispatchPlanInfoDetailsModel {
+    private String planId;//计划id
+
+    private String weather;//适用天气
+    private String temperature;//适用气温
+    private String param1;//复合参数预留后用
+    private String param2;//复合参数2预留后用
+    private Long sampleBeginTime;//参考样本的起始时间(毫秒级UTC),如:iot采集数据的起始时间
+    private Long sampleEndTime;//参考样本的截止时间(毫秒级UTC),如:iot采集数据的截止时间
+    private String updateTime;//创建/修改时间
+
+    private String tags;
+    private String zoneId;
+    private String zoneType;
+
+}

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

@@ -0,0 +1,63 @@
+package com.shkpr.service.aimodelpower.dto.woDispatchPlanModel;
+
+import lombok.Data;
+
+/**
+ * @ClassName DispatchPlanInfoModel
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/6/27
+ * @Version V1.0
+ **/
+@Data
+public class DispatchPlanInfoModel {
+    private String planId;//计划id
+
+    private Integer planType;//类型:0--临时;1--日循环;2--周循环;3--月循环;4--年循环,注:该字段新建时定义,后期不可再随意变更
+
+    private Integer planStatus;//状态:-1--注销;0--停用;1--启用
+
+    private String title;//标题
+
+    private Integer urgentLevel;//紧急程度(优先级)紧急级别:1 -- 一般;2 --重要;4 -- 紧急
+
+    private String dispatchRemark;//调度描述
+
+    private Integer dispatchLeadTime;//派单时间提前量设定(单位分钟)
+                                        //    提前或推迟的校正时间(存储单位:分钟)
+                                        //*) =0则不推迟也不提前
+                                        //*) >0则推迟触发
+                                        //*) <0则提前触发
+
+    private String creatorId;//创建人id
+
+    private Long createTime;//创建时间
+
+    private Long updateTime;//修改时间
+
+    private String cycles;//TODO 循环具体周期,如: ["yyyy-mm-dd"] 存list stringJson
+
+    private String zoneId;//监测分区id
+
+    private Long lastTakeTime;//最近成功触发的时间(毫秒级UTC),该字段计算因子:*)
+                                // 用指令工单新增成功返回结果中的时间填充
+
+    private Long nextTakeTime;//下一次预计触发的时间(毫秒级UTC),该字段计算因子:
+                                //*) type
+                                //*) cycles
+                                //*) adjust
+                                //*) 调度指令排班表中的min(sug_begin_time)
+                                //    注:【计划新建/修改计划cycles/计划触发成功后】就得计算出该值,且临时计划触发成功后需置为0以便不再参与定时扫描
+
+    private String updaterId;//修改人
+
+    private Integer takes;//总计触发次数(成功+未成功),用于后台查询分析
+
+    private String errors;//最近一次触发失败的原因,用于后台查询分析
+
+    private Integer sendway;//派单提醒方式:1--app通知;2--短信通知;3--app&短信通知
+
+    private Long id;//自增序列号
+
+    private Integer chufaRulsFlag;//是否触发保存规则 0否 1是
+}

+ 23 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchPlanInfoRuleModel.java

@@ -0,0 +1,23 @@
+package com.shkpr.service.aimodelpower.dto.woDispatchPlanModel;
+
+import lombok.Data;
+
+/**
+ * @ClassName DispatchPlanInfoRuleModel
+ * @Description: TODO 计划的智能匹配规则
+ * @Author LX
+ * @Date 2024/6/28
+ * @Version V1.0
+ **/
+@Data
+public class DispatchPlanInfoRuleModel {
+   private String weather;//适用天气
+   private String temperature;//适用气温
+   private String param1;//复合参数预留后用
+   private String param2;//复合参数2预留后用
+   private String planId;//计划id
+   private Long sampleBeginTime;//参考样本的起始时间(毫秒级UTC),如:iot采集数据的起始时间
+   private Long sampleEndTime;//参考样本的截止时间(毫秒级UTC),如:iot采集数据的截止时间
+   private String updateTime;//创建/修改时间
+
+}

+ 69 - 0
src/main/java/com/shkpr/service/aimodelpower/dto/woDispatchPlanModel/DispatchPlanInfoSSModel.java

@@ -0,0 +1,69 @@
+package com.shkpr.service.aimodelpower.dto.woDispatchPlanModel;
+
+import lombok.Data;
+
+/**
+ * @ClassName DispatchPlanInfoModel
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/6/27
+ * @Version V1.0
+ **/
+@Data
+public class DispatchPlanInfoSSModel {
+    private String planId;//计划id
+
+    private Integer planType;//类型:0--临时;1--日循环;2--周循环;3--月循环;4--年循环,注:该字段新建时定义,后期不可再随意变更
+
+    private Integer planStatus;//状态:-1--注销;0--停用;1--启用
+
+    private String title;//标题
+
+    private Integer urgentLevel;//紧急程度(优先级)紧急级别:1 -- 一般;2 --重要;4 -- 紧急
+
+    private String dispatchRemark;//调度描述
+
+    private Integer dispatchLeadTime;//派单时间提前量设定(单位分钟)
+                                        //    提前或推迟的校正时间(存储单位:分钟)
+                                        //*) =0则不推迟也不提前
+                                        //*) >0则推迟触发
+                                        //*) <0则提前触发
+
+    private String creatorId;//创建人id
+    private String creatorName;//创建人姓名
+    private String creatorOrg;//创建人组织
+
+    private Long createTime;//创建时间
+
+    private Long updateTime;//修改时间
+
+    private String cycles;//TODO 循环具体周期,如: ["yyyy-mm-dd"] 存list stringJson
+
+    private String zoneId;//监测分区id
+    private String zoneType;//监测分区类型
+    private String zone;//监测分区名称
+
+    private Long lastTakeTime;//最近成功触发的时间(毫秒级UTC),该字段计算因子:*)
+                                // 用指令工单新增成功返回结果中的时间填充
+
+    private Long nextTakeTime;//下一次预计触发的时间(毫秒级UTC),该字段计算因子:
+                                //*) type
+                                //*) cycles
+                                //*) adjust
+                                //*) 调度指令排班表中的min(sug_begin_time)
+                                //    注:【计划新建/修改计划cycles/计划触发成功后】就得计算出该值,且临时计划触发成功后需置为0以便不再参与定时扫描
+
+    private String updaterId;//修改人
+
+    private Integer takes;//总计触发次数(成功+未成功),用于后台查询分析
+
+    private String errors;//最近一次触发失败的原因,用于后台查询分析
+
+    private Integer sendway;//派单提醒方式:1--app通知;2--短信通知;3--app&短信通知
+
+    private Long id;//自增序列号
+
+    private Integer chufaRulsFlag;//是否触发保存规则 0否 1是
+    private Integer batchTotal;//排班数量
+    private String minBatchStartTime;//排班最早时刻
+}

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

@@ -0,0 +1,19 @@
+package com.shkpr.service.aimodelpower.dto.woDispatchPlanModel;
+
+import lombok.Data;
+
+/**
+ * @ClassName DispatchPlanInfoRuleModel
+ * @Description: TODO 计划附加标签项
+ * @Author LX
+ * @Date 2024/6/28
+ * @Version V1.0
+ **/
+@Data
+public class DispatchPlanInfoTagsModel {
+
+   private String planId;//计划id
+   private String key;//附加标签标识符
+   private String data;//附加标签值
+
+}

+ 32 - 0
src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchCmdBatchDispoal.java

@@ -0,0 +1,32 @@
+package com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan;
+
+import lombok.Data;
+import org.springframework.util.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName DispatchCmdBatchDispoal
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/6/28
+ * @Version V1.0
+ **/
+@Data
+public class JPDispatchCmdBatchDispoal implements Serializable {
+//    private String disposalId;//处置建议_id
+//    private String batchItemId;//排班id
+//    private String createTime;//数据创建时间
+//    private String updateTime;//数据修改时间
+    private String data;//处置内容
+    private String did;//处置对象id(如存分区或站点id)
+    private String dname;//工单关心以及需要存储的事情(如存处置对象名称)
+    private Integer ordering;//处置建议在app上的排序值
+
+    public boolean checkValid(){
+        if(StringUtils.isEmpty(data)){
+            return false;
+        }
+        return true;
+    }
+}

+ 55 - 0
src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchCmdBatchItem.java

@@ -0,0 +1,55 @@
+package com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan;
+
+import lombok.Data;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.util.List;
+
+/**
+ * @ClassName DispatchCmdBatchItemModel
+ * @Description: TODO 水量调度指令排班项表
+ * @Author LX
+ * @Date 2024/6/28
+ * @Version V1.0
+ **/
+@Data
+public class JPDispatchCmdBatchItem implements Serializable {
+//    private String batchItem_id;//批次项id
+//    private String planId;//所属计划id
+    private String headUserId;//指定负责人uid
+    private String handleStartTime;//指定处理有效起始时间(HH:mm:ss) 日期为计划的预计开始时间
+    private String handleEndTime;//指定处理有效截止时间(HH:mm:ss) 日期为计划的预计开始时间
+//    private String createTime;//数据创建时间
+//    private String updateTime;//数据修改时间
+    private String handleAddress;//处置实际地址
+    private String gis;//处置地址gis坐标
+
+    //排班对应的处置建议
+    private List<JPDispatchCmdBatchDispoal> dispoalList;
+
+    public boolean checkValid(){
+        if(StringUtils.isEmpty(headUserId)){
+            return false;
+        }
+        if(StringUtils.isEmpty(handleStartTime)||!JPDispatchPlanInfoSave.isValidTimeFormat(handleStartTime)){
+            return false;
+        }
+        if(StringUtils.isEmpty(handleEndTime)||!JPDispatchPlanInfoSave.isValidTimeFormat(handleEndTime)){
+            return false;
+        }
+        LocalTime t1 = LocalTime.parse(handleStartTime);
+        LocalTime t2 = LocalTime.parse(handleEndTime);
+        if (t2.isBefore(t1)||t2.equals(t1)){
+            return false;
+        }
+        if(!CollectionUtils.isEmpty(dispoalList)){
+            if(dispoalList.stream().anyMatch(x -> !x.checkValid())){
+                return false;
+            }
+        }
+        return true;
+    }
+}

+ 24 - 0
src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchPlanInfoDetailsSS.java

@@ -0,0 +1,24 @@
+package com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan;
+
+import com.shkpr.service.aimodelpower.jsonbean.JPPageLO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.util.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName JPDispatchPlanInfoSS
+ * @Description: TODO 调度计划查询参数
+ * @Author LX
+ * @Date 2024/6/27
+ * @Version V1.0
+ **/
+@Data
+public class JPDispatchPlanInfoDetailsSS implements Serializable{
+    private String planId;
+
+    public String genQueryExtend(){
+        return "";
+    }
+}

+ 36 - 0
src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchPlanInfoRuleSave.java

@@ -0,0 +1,36 @@
+package com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * @ClassName DispatchPlanInfoRuleModel
+ * @Description: TODO 计划的智能匹配规则
+ * @Author LX
+ * @Date 2024/6/28
+ * @Version V1.0
+ **/
+@Data
+public class JPDispatchPlanInfoRuleSave implements Serializable{
+   private String weather;//适用天气
+   private String temperature;//适用气温
+   private String param1;//复合参数预留后用
+   private String param2;//复合参数2预留后用
+//   private String planId;//计划id
+   private Long sampleBeginTime;//参考样本的起始时间(毫秒级UTC),如:iot采集数据的起始时间
+   private Long sampleEndTime;//参考样本的截止时间(毫秒级UTC),如:iot采集数据的截止时间
+   private String updateTime;//创建/修改时间
+
+   public boolean checkValid(){
+      if(sampleBeginTime==null||sampleBeginTime<=0L){
+         return false;
+      }
+      if(sampleEndTime==null||sampleEndTime<=0L){
+         return false;
+      }
+      return true;
+   }
+
+}

+ 33 - 0
src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchPlanInfoSS.java

@@ -0,0 +1,33 @@
+package com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan;
+
+import com.shkpr.service.aimodelpower.dbdao.tables.WODispatchPlanInfoTable;
+import com.shkpr.service.aimodelpower.jsonbean.JPPageLO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.util.StringUtils;
+
+/**
+ * @ClassName JPDispatchPlanInfoSS
+ * @Description: TODO 调度计划查询参数
+ * @Author LX
+ * @Date 2024/6/27
+ * @Version V1.0
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class JPDispatchPlanInfoSS extends JPPageLO{
+    private String title;//计划名称(标题)
+
+    private Integer downFlag;//计划是否下发 0 是 1 否
+    private Integer planType;//计划类型
+    private Integer planStatus;//计划类型
+    private String zoneId;
+
+    public String genQueryExtend(){
+        StringBuilder str = new StringBuilder("");
+        if (!StringUtils.isEmpty(this.title)) {
+            str.append(" OR title like '%" + this.title + "%' ");
+        }
+        return str.length()>0?String.format(" AND ( 1=2 %s )" ,str.toString()):str.toString();
+    }
+}

+ 208 - 0
src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchPlanInfoSave.java

@@ -0,0 +1,208 @@
+package com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan;
+
+import com.alibaba.fastjson.JSONArray;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.shkpr.service.aimodelpower.commtools.TimeTool;
+import com.shkpr.service.aimodelpower.controllervalid.CommonParamValidNew;
+import lombok.Data;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.sql.Time;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * @ClassName JPDispatchPlanInfoSave
+ * @Description: TODO 添加调度计划参数
+ * @Author LX
+ * @Date 2024/6/27
+ * @Version V1.0
+ **/
+@Data
+public class JPDispatchPlanInfoSave {
+    private Integer planType = 0;//类型:0--临时;1--日循环;2--周循环;3--月循环;4--年循环
+                                //注:该字段新建时定义,后期不可再随意变更
+
+    //TODO casualValue和casualHsm在排班有的时候排班的时刻优先级更高
+    private String casualValue;//用户选择计划生成时间(此参数用于cycles值的插入):
+                    // 如果为临时计划,值为yyyy-MM-dd
+                    // 如果为日计划,值为HH:mm:ss
+                    // 如果为周,值为1-7的数字
+                    // 如果为月,值为1-31号数,如果设置为31且循环月没有31号,则默认为该月的最后一天,值为dd
+                    // 如果为年,值为mm-dd
+
+    private String cycles="";//TODO 根据参数casualTime处理后的具体周期值,决定循环计划的生效时间
+
+    private Integer planStatus = 1;//状态:-1--注销;0--停用;1--启用
+
+    @NotBlank(groups = { CommonParamValidNew.class})
+    @Size(min = 1,max = 255, groups = { CommonParamValidNew.class})
+    private String title;//计划标题
+
+    private Integer urgentLevel=1;//紧急程度(优先级)紧急级别:1 -- 一般;2 --重要;4 -- 紧急
+
+    private String dispatchRemark;//调度计划描述
+
+    private Integer dispatchLeadTime = 0;//派单时间提前量设定(单位分钟)
+                                    //    提前或推迟的校正时间(存储单位:分钟)
+                                    //*) =0则不推迟也不提前
+                                    //*) >0则推迟触发
+                                    //*) <0则提前触发
+
+    //TODO 创建人ID
+    @NotBlank(groups = { CommonParamValidNew.class})
+    @Size(min = 1,max = 255, groups = { CommonParamValidNew.class})
+    private String creatorId;
+
+    //TODO 监测分区id
+    @NotBlank(groups = { CommonParamValidNew.class})
+    @Size(min = 1,max = 255, groups = { CommonParamValidNew.class})
+    private String zoneId;
+
+    private Integer sendway = 1;//派单提醒方式:1--app通知;2--短信通知;3--app&短信通知
+
+    private Integer chufaRulsFlag = 1;//是否触发保存规则 0否 1是 默认值1
+
+    //TODO 判断是否是时间格式
+    public static boolean isValidDateFormat(String dateTimeStr,String fomatter) {
+        try {
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(fomatter);
+            formatter.parse(dateTimeStr);
+            return true;
+        } catch (DateTimeParseException e) {
+            return false;
+        }
+    }
+
+    private static final Pattern TIME_PATTERN =
+            Pattern.compile("^([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$");
+    //TODO 判断是否为HH:mm:ss格式
+    public static boolean isValidTimeFormat(String time) {
+        if (time == null) {
+            return false;
+        }
+        return TIME_PATTERN.matcher(time).matches();
+    }
+    //TODO 判断是否为1=7的数字
+    public static boolean isOneToSeven(String str) {
+        return str.matches("[1-7]+");
+    }
+    //TODO 判断是否为1=31的数字
+    public static boolean isOneToThirtyOne(String str) {
+        return str.matches("[1-31]+");
+    }
+    //TODO 判断是否为mm-dd格式
+    public static boolean isMonthDay(String str) {
+        // 正则表达式匹配 mm-dd 格式,其中 mm 是1-12,dd 是1-31
+        return str.matches("(0?[1-9]|1[0-2])-((0?[1-9])|([1-2][0-9])|3[01])");
+    }
+
+    //TODO 相关关联子对象参数
+    //① 计划相关触发规则
+    private List<JPDispatchPlanInfoRuleSave> rulesList;
+    //② 计划附加标签项
+    private List<JPDispatchPlanInfoTagsSave> tagsList;
+    //③ 排班班次项
+    private List<JPDispatchCmdBatchItem> itemsList;
+
+    public boolean checkValid(){
+        try {
+            if (planType == null ||
+                    (planType != 0 && planType != 1 && planType != 2 && planType != 3 && planType != 4)) {
+                return false;
+            }
+            if (!StringUtils.isEmpty(casualValue)) {
+                //TODO 检查参数是否符合规格
+                if (planType == 0) {
+                    //TODO 说明是临时计划
+                    cycles += "[\"";
+                    for (Object objValue : JSONArray.parseArray(casualValue)) {
+                        if (!isValidDateFormat(objValue.toString(), "yyyy-MM-dd")) {
+                            return false;
+                        }
+                        if (LocalDate.now()
+                                .isAfter(LocalDate
+                                        .parse(objValue.toString(),
+                                                DateTimeFormatter.ofPattern("yyyy-MM-dd")))) {
+                            //TODO 如果当前时间在设置时间之后返回false
+                            return false;
+                        }
+                        cycles += objValue.toString();
+                    }
+                    cycles += "\"]";
+                } else if (planType == 1) {
+                    //TODO 说明是日循环计划
+                    //TODO 在外面代码逻辑中去设置默认为今天开始
+                    cycles = "[\"" + TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(), "yyyy-MM-dd") + "\"]";
+                } else if (planType == 2) {
+                    //TODO 说明是周计划
+                    cycles += "[\"";
+                    for (Object objValue : JSONArray.parseArray(casualValue)) {
+                        if (!isOneToSeven(objValue.toString())) {
+                            return false;
+                        }
+                        cycles += objValue.toString();
+                    }
+                    cycles += "\"]";
+                } else if (planType == 3) {
+                    cycles += "[\"";
+                    for (Object objValue : JSONArray.parseArray(casualValue)) {
+                        if (!isOneToThirtyOne(objValue.toString())) {
+                            return false;
+                        }
+                        cycles += objValue.toString();
+                    }
+                    cycles += "\"]";
+                } else if (planType == 4) {
+                    cycles += "[\"";
+                    for (Object objValue : JSONArray.parseArray(casualValue)) {
+                        if (!isMonthDay(objValue.toString())) {
+                            return false;
+                        }
+                        cycles += objValue.toString();
+                    }
+                    cycles += "\"]";
+                }
+            }
+            if (planStatus == null || (planStatus != -1 && planStatus != 0 && planStatus != 1)) {
+                return false;
+            }
+            if (urgentLevel == null || (urgentLevel != 1 && urgentLevel != 2 && urgentLevel != 4)) {
+                return false;
+            }
+            if (dispatchLeadTime == null) {
+                return false;
+            }
+            if (sendway == null || (sendway != 1 && sendway != 2 && sendway != 3)) {
+                return false;
+            }
+
+            //TODO 检查关联数据完整性
+            if (!CollectionUtils.isEmpty(rulesList)) {
+                if (rulesList.stream().anyMatch(x -> !x.checkValid())) {
+                    return false;
+                }
+            }
+            if (!CollectionUtils.isEmpty(tagsList)) {
+                if (tagsList.stream().anyMatch(x -> !x.checkValid())) {
+                    return false;
+                }
+            }
+            if (!CollectionUtils.isEmpty(itemsList)) {
+                if (itemsList.stream().anyMatch(x -> !x.checkValid())) {
+                    return false;
+                }
+            }
+            return true;
+        }catch(Exception ex){
+            return false;
+        }
+    }
+}

+ 28 - 0
src/main/java/com/shkpr/service/aimodelpower/jsonbean/woDispatchPlan/JPDispatchPlanInfoTagsSave.java

@@ -0,0 +1,28 @@
+package com.shkpr.service.aimodelpower.jsonbean.woDispatchPlan;
+
+import lombok.Data;
+import org.springframework.util.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * @ClassName DispatchPlanInfoRuleModel
+ * @Description: TODO 计划附加标签项
+ * @Author LX
+ * @Date 2024/6/28
+ * @Version V1.0
+ **/
+@Data
+public class JPDispatchPlanInfoTagsSave implements Serializable {
+
+//   private String planId;//计划id
+   private String key;//附加标签标识符
+   private String data;//附加标签值
+
+   public boolean checkValid(){
+      if(StringUtils.isEmpty(key)){
+         return false;
+      }
+      return true;
+   }
+}