Forráskód Böngészése

自来水预测数据接口 增加预测数据自添加机制

1037015548@qq.com 1 éve
szülő
commit
7f44396dd8

+ 6 - 6
sql.properties

@@ -4,14 +4,14 @@ spring.datasource.data.password=kpr.23417.postgres
 spring.datasource.data.driver-class-name=org.postgis.DriverWrapper
 
 #pgsql 自来水水量预测数据库源
-spring.datasource.db2.jdbc-url=jdbc:postgresql_postGIS://119.96.165.176:5432/water_volume_prediction?useSSL=false&useAffectedRows=false&allowMultiQueries=true
-spring.datasource.db2.username=postgres
-spring.datasource.db2.password=kpr.23417.postgres
-spring.datasource.db2.driver-class-name=org.postgis.DriverWrapper
-#spring.datasource.db2.jdbc-url=jdbc:postgresql_postGIS://10.101.5.50:5432/water_volume_prediction?useSSL=false&useAffectedRows=false&allowMultiQueries=true
+#spring.datasource.db2.jdbc-url=jdbc:postgresql_postGIS://119.96.165.176:5432/water_volume_prediction?useSSL=false&useAffectedRows=false&allowMultiQueries=true
 #spring.datasource.db2.username=postgres
-#spring.datasource.db2.password=ygt.23417.postgres
+#spring.datasource.db2.password=kpr.23417.postgres
 #spring.datasource.db2.driver-class-name=org.postgis.DriverWrapper
+spring.datasource.db2.jdbc-url=jdbc:postgresql_postGIS://10.101.5.50:5432/water_volume_prediction?useSSL=false&useAffectedRows=false&allowMultiQueries=true
+spring.datasource.db2.username=postgres
+spring.datasource.db2.password=ygt.23417.postgres
+spring.datasource.db2.driver-class-name=org.postgis.DriverWrapper
 
 
 spring.datasource.data2.jdbc-url=jdbc:postgresql://119.96.165.176:5432/water_smart_central?useSSL=false&useAffectedRows=false&allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8

+ 323 - 0
src/main/java/com/shkpr/service/aimodelpower/bizmgr/KprAimWaterCollecationBizFun.java

@@ -1,21 +1,35 @@
 package com.shkpr.service.aimodelpower.bizmgr;
 
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.global.base.tools.FastJsonUtil;
+import com.shkpr.service.aimodelpower.commtools.TimeTool;
 import com.shkpr.service.aimodelpower.dbdao.DBMgrProxy;
 import com.shkpr.service.aimodelpower.dbdao.shizilaishuiDataSource.service.intef.WaterCollecationService;
 import com.shkpr.service.aimodelpower.dbdao.shizilaishuiDataSource.service.intef.WaterTapWaterService;
 import com.shkpr.service.aimodelpower.dto.ResponseCode;
 import com.shkpr.service.aimodelpower.dto.ResponseRes;
+import com.shkpr.service.aimodelpower.dto.TraceRunnable;
 import com.shkpr.service.aimodelpower.dto.zilaishuiModel.InPumpModel;
+import com.shkpr.service.aimodelpower.globalmgr.ThreadTaskMgr;
+import com.shkpr.service.aimodelpower.globalmgr.TraceLogMgr;
 import com.shkpr.service.aimodelpower.jsonbean.zilaishui.JPTbMHourWater;
 import com.shkpr.service.aimodelpower.jsonbean.zilaishui.JPTbMWater;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.YearMonth;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
 import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.stream.Collectors;
 
 /**
@@ -34,6 +48,10 @@ public class KprAimWaterCollecationBizFun {
     public static WaterCollecationService getWaterTapWaterApi(){
         return DBMgrProxy.getInstance().applyWaterCollecationService();
     }
+    public static WaterTapWaterService getWaterTapApi(){
+        return DBMgrProxy.getInstance().applyWaterTapWaterService();
+    }
+
     static DateTimeFormatter formater = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     static DateTimeFormatter formater2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
@@ -278,4 +296,309 @@ public class KprAimWaterCollecationBizFun {
             return responseRes;
         }
     }
+
+    //TODO 定时任务 定时添加预测数据
+    public static void insertYuceDataScheduled(){
+        System.out.println("添加预测日数据正在进行"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
+        try {
+            //先获取配置项 根据配置项来进行逻辑添加
+            List<Map<String, Object>> configRes = getWaterTapWaterApi().getWaterYuceConfig(false, 0, 0, "");
+            if(!CollectionUtils.isEmpty(configRes)){
+                Map<String,Object> config = configRes.get(0);
+                Integer isMonth = Integer.valueOf(config.get("is_month").toString());//是否预测指定月份 0 是 1否(判定是否走自添加逻辑)
+                String month = config.get("month").toString();//指定预测年月 yyyy-mm
+                Double randomCode = Double.valueOf(config.get("random_code").toString());//上下随机石百分比范围
+                if(isMonth==0){
+                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                    String yearStr = month.split("-")[0];
+                    String monthStr = month.split("-")[1];
+                    LocalDateTime startDate = LocalDateTime.now().withYear(Integer.valueOf(yearStr))
+                            .withMonth(Integer.valueOf(monthStr)).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+                    LocalDateTime endDate = startDate.with(TemporalAdjusters.lastDayOfMonth());
+                    //TODO 总体逻辑: 先查询指定月上一年的每日平均值,再按平均值的上下啊百分比去插入指定的浮动百分比数据
+                    List<Map<String, Object>> configList = getWaterTapApi().getWaterCollectionConfigList(null);
+                    List<Map<String,Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0,"");
+                    if (!CollectionUtils.isEmpty(configList)&&!CollectionUtils.isEmpty(orgConfig)) {
+                        //TODO 按照组织机构分组
+                        Map<Object, List<Map<String, Object>>> groupedData =
+                                configList.stream().collect(Collectors.groupingBy(item -> item.get("org_name")));
+                        final CountDownLatch latch = new CountDownLatch(groupedData.keySet().size());
+                        for (Object key:groupedData.keySet()){
+                            try {
+                                ThreadTaskMgr.runTask(new TraceRunnable(TraceLogMgr.getTraceId()) {
+                                    @Override
+                                    public void function() {
+                                        //TODO ①计算水厂指定月每日平均值
+                                        List<Map<String,Object>> recordAllRes = getWaterTapApi()
+                                                .getWaterCollectionRecordAllListAll(" WHERE 1=1 " +
+                                                        " AND org_name = '"+key.toString()+"'" +
+                                                        " AND \"time\"::timestamp BETWEEN  '"+startDate.format(formatter)+"' "+"AND '"+endDate.format(formatter)+"'");
+                                        if(!CollectionUtils.isEmpty(recordAllRes)){
+                                            int days = YearMonth.from(startDate).lengthOfMonth();//获取月份天数
+                                            Double numAge = 0.0;//日平均值
+                                            Double numMonthAll = null;//月总值
+                                            for (int i = 1;i<=days;i++){
+                                                LocalDateTime dateNow = startDate.withDayOfMonth(i);//当前循环时间
+                                                Double numAll = null;//日总值
+                                                //TODO 筛选成当前循环时间的集合
+                                                List<Map<String,Object>> daysRecord = recordAllRes.stream().filter(item ->
+                                                        LocalDateTime.parse(item.get("time").toString(),formatter).toLocalDate().equals(dateNow.toLocalDate()))
+                                                        .collect(Collectors.toList());
+                                                for (Map<String,Object> mapEntity : daysRecord){
+                                                    //TODO 筛选与当前天一样的数据在计算平均值,数据相加除以24小时 (recordAllRes内容为这天每小时的数据)
+                                                    if(numAll == null){
+                                                        numAll = 0.0;
+                                                    }
+                                                    numAll += Double.valueOf(mapEntity.get("value").toString());
+                                                }
+                                                if(numMonthAll==null){
+                                                    numMonthAll = 0.0;
+                                                }
+                                                numMonthAll+= numAll==null?0.0:numAll;
+                                            }
+                                            if(numMonthAll!=null){
+                                                numAge = numMonthAll/days;
+                                            }
+
+                                            //TODO ②正式插入或修改日预测数据表
+                                            Optional<String> orgIdOptional = orgConfig.stream()
+                                                    .filter(item -> key.toString().replace("(", "(").replace(")", ")")
+                                                            .equals(item.get("org_name").toString().replace("(", "(").replace(")", ")")))
+                                                    .map(item -> item.get("org_id").toString())
+                                                    .findFirst();
+                                            String orgId = orgIdOptional.orElse(null);
+                                            if (!StringUtils.isEmpty(orgId)) {
+                                                //预测比对时间如果不是今年,则变为今年的时间
+                                                for (int i = 1;i<=days;i++) {
+                                                    LocalDateTime dateNow = startDate.withDayOfMonth(i);//当前循环时间
+                                                    Double numAll = null;//日总值
+                                                    //TODO 筛选成当前循环时间的集合
+                                                    List<Map<String,Object>> daysRecord = recordAllRes.stream().filter(item ->
+                                                            LocalDateTime.parse(item.get("time").toString(),formatter).toLocalDate().equals(dateNow.toLocalDate()))
+                                                            .collect(Collectors.toList());
+                                                    for (Map<String,Object> mapEntity : daysRecord){
+                                                        //TODO 筛选与当前天一样的数据在计算平均值,数据相加除以24小时 (recordAllRes内容为这天每小时的数据)
+                                                        if(numAll == null){
+                                                            numAll = 0.0;
+                                                        }
+                                                        numAll += Double.valueOf(mapEntity.get("value").toString());
+                                                    }
+                                                    //TODO 数据库操作
+                                                    Map<String, Object> recordAllEntity = new LinkedHashMap<>();//需要添加的实体数据,此处要用有序map
+                                                    DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                                                    recordAllEntity.put("Date", dateNow.withYear(LocalDateTime.now().getYear()).toLocalDate().format(formatter2));
+                                                    recordAllEntity.put("Month", dateNow.withYear(LocalDateTime.now().getYear()).getMonth().getValue());
+                                                    recordAllEntity.put("Week", dateNow.withYear(LocalDateTime.now().getYear()).getDayOfWeek().getValue());
+                                                    recordAllEntity.put("ActualWaterWithdrawals", "");
+
+                                                    //实际从该时间查询结果中得出(当前年当前日的实际数据)
+                                                    String newStartDate = dateNow.withYear(LocalDateTime.now().getYear()).format(formatter);
+                                                    String newEndDate = dateNow.withYear(LocalDateTime.now().getYear()).minusDays(-1).minusSeconds(1).format(formatter);
+                                                    List<Map<String,Object>> newRecordAllRes = getWaterTapApi()
+                                                            .getWaterCollectionRecordAllListAll(" WHERE 1=1 " +
+                                                                    " AND org_name = '"+key.toString()+"'" +
+                                                                    " AND \"time\"::timestamp BETWEEN  '"+newStartDate
+                                                                    +"' "+"AND '"+newEndDate+"'");
+                                                    String actualWaterSupply = null;
+                                                    if(!CollectionUtils.isEmpty(newRecordAllRes)){
+                                                        actualWaterSupply = String.valueOf(newRecordAllRes.stream()
+                                                                .mapToDouble(record -> {
+                                                                    Object value = record.get("value");
+                                                                    if (value instanceof Number) {
+                                                                        return ((Number) value).doubleValue();
+                                                                    } else if (value instanceof String) {
+                                                                        try {
+                                                                            return Double.parseDouble((String) value);
+                                                                        } catch (NumberFormatException e) {
+                                                                            // 处理或记录错误,这里简单返回0
+                                                                            return 0;
+                                                                        }
+                                                                    }
+                                                                    return 0;
+                                                                })
+                                                                .sum());
+                                                    }
+
+                                                    recordAllEntity.put("ActualWaterSupply", actualWaterSupply);
+                                                    recordAllEntity.put("ForecastWaterWithdrawals", "");
+                                                    //TODO 随机数逻辑
+                                                    int randomUpOrDown = ThreadLocalRandom.current().nextInt(2);//随机向上或者向下 0表示向下 1表示向上
+                                                    Double randomWater = randomUpOrDown == 0 ?
+                                                            numAge - (numAge * (randomCode / 100)) :
+                                                            numAge + (numAge * (randomCode / 100));
+                                                    recordAllEntity.put("ForecastActualWaterSupply", randomWater);
+                                                    recordAllEntity.put("isAbnormal", 0);
+                                                    recordAllEntity.put("isForecast", 0);
+                                                    recordAllEntity.put("LastModifyTime", LocalDateTime.now().format(formatter));
+                                                    // 如果找到了org_id,就将其赋值给orgId,否则orgId为null
+                                                    recordAllEntity.put("orgId", orgId);
+
+                                                    //TODO 添加or修改
+                                                    Integer insertRes = getWaterTapApi().insertOrUpdateTbmWater(recordAllEntity);
+                                                    if (insertRes < 1) {
+                                                        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
+                                                                , mStrClassName
+                                                                , mStrClassName
+                                                                , String.format("Batch insertYuceDataScheduled ERROR:{%s} ",
+                                                                        "新增或修改失败"));
+                                                    }
+                                                }
+                                            }
+                                        }
+                                        latch.countDown();
+                                    }
+                                });
+                            }catch(Exception ex){
+                                LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
+                                        , mStrClassName
+                                        , mStrClassName
+                                        , String.format("Batch insertYuceDataScheduled ERROR:{%s} ",
+                                                ex.getLocalizedMessage()));
+                            }
+                        }
+                        try{latch.await();}catch(Exception ex){}
+                    }
+                    System.out.println("添加预测日数据结束"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
+                }else{
+
+                }
+            }
+        }catch(Exception ex){
+            ex.printStackTrace();
+        }
+    }
+
+    //TODO 定时任务 定时添加小时预测数据
+    public static void insertYuceHourDataScheduled(){
+        System.out.println("添加预测小时数据正在进行"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
+        try {
+            //先获取配置项 根据配置项来进行逻辑添加
+            List<Map<String, Object>> configRes = getWaterTapWaterApi().getWaterYuceConfig(false, 0, 0, "");
+            if(!CollectionUtils.isEmpty(configRes)){
+                Map<String,Object> config = configRes.get(0);
+                Integer isMonth = Integer.valueOf(config.get("is_month").toString());//是否预测指定月份 0 是 1否(判定是否走自添加逻辑)
+                String month = config.get("month").toString();//指定预测年月 yyyy-mm
+                Double randomCode = Double.valueOf(config.get("random_code").toString());//上下随机石百分比范围
+                if(isMonth==0){
+                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                    String yearStr = month.split("-")[0];
+                    String monthStr = month.split("-")[1];
+                    LocalDateTime startDate = LocalDateTime.now().withYear(Integer.valueOf(yearStr))
+                            .withMonth(Integer.valueOf(monthStr)).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
+                    LocalDateTime endDate = startDate.with(TemporalAdjusters.lastDayOfMonth());
+                    //TODO 总体逻辑: 先查询指定月上一年的每日平均值,再按平均值的上下啊百分比去插入指定的浮动百分比数据
+                    List<Map<String, Object>> configList = getWaterTapApi().getWaterCollectionConfigList(null);
+                    List<Map<String,Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false,0,0,"");
+                    if (!CollectionUtils.isEmpty(configList)&&!CollectionUtils.isEmpty(orgConfig)) {
+                        //TODO 按照组织机构分组
+                        Map<Object, List<Map<String, Object>>> groupedData =
+                                configList.stream().collect(Collectors.groupingBy(item -> item.get("org_name")));
+                        final CountDownLatch latch = new CountDownLatch(groupedData.keySet().size());
+                        for (Object key:groupedData.keySet()){
+                            try {
+                                ThreadTaskMgr.runTask(new TraceRunnable(TraceLogMgr.getTraceId()) {
+                                    @Override
+                                    public void function() {
+                                        //TODO ①计算水厂指定月每日小时平均值
+                                        List<Map<String,Object>> recordAllRes = getWaterTapApi()
+                                                .getWaterCollectionRecordAllListAll(" WHERE 1=1 " +
+                                                        " AND org_name = '"+key.toString()+"'" +
+                                                        " AND \"time\"::timestamp BETWEEN  '"+startDate.format(formatter)+"' "+"AND '"+endDate.format(formatter)+"'");
+                                        if(!CollectionUtils.isEmpty(recordAllRes)){
+                                            int days = YearMonth.from(startDate).lengthOfMonth();//获取月份天数
+                                            for (int i = 1;i<=days;i++){
+                                                LocalDateTime dateNow = startDate.withDayOfMonth(i);//当前循环时间
+                                                Double numAll = null;//日总值
+                                                Double numAge = 0.0;//日小时平均值
+                                                //TODO 筛选成当前循环时间的集合
+                                                List<Map<String,Object>> daysRecord = recordAllRes.stream().filter(item ->
+                                                        LocalDateTime.parse(item.get("time").toString(),formatter).toLocalDate().equals(dateNow.toLocalDate()))
+                                                        .collect(Collectors.toList());
+                                                for (Map<String,Object> mapEntity : daysRecord){
+                                                    //TODO 筛选与当前天一样的数据在计算平均值,数据相加除以24小时 (recordAllRes内容为这天每小时的数据)
+                                                    if(numAll == null){
+                                                        numAll = 0.0;
+                                                    }
+                                                    numAll += Double.valueOf(mapEntity.get("value").toString());
+                                                }
+                                                if (numAll!=null){
+                                                    numAge = numAll/24;
+                                                }
+                                                //TODO ②正式插入或修改日预测数据表
+                                                Optional<String> orgIdOptional = orgConfig.stream()
+                                                        .filter(item -> key.toString().replace("(", "(").replace(")", ")")
+                                                                .equals(item.get("org_name").toString().replace("(", "(").replace(")", ")")))
+                                                        .map(item -> item.get("org_id").toString())
+                                                        .findFirst();
+                                                String orgId = orgIdOptional.orElse(null);
+                                                if (!StringUtils.isEmpty(orgId)) {
+                                                    //预测比对时间如果不是今年,则变为今年的时间
+                                                    //TODO 一天24小时
+                                                    for (int j = 0;j<24;j++) {
+                                                        //TODO 数据库操作
+                                                        Map<String, Object> recordAllEntity = new LinkedHashMap<>();//需要添加的实体数据,此处要用有序map
+                                                        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                                                        recordAllEntity.put("Date", dateNow.withYear(LocalDateTime.now().getYear()).toLocalDate().format(formatter2));
+                                                        // 创建一个LocalTime实例,设置为指定小时,分钟和秒数为0
+                                                        LocalTime time = LocalTime.of(j, 0, 0);
+                                                        // 创建一个DateTimeFormatter用于格式化时间
+                                                        DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("HH:mm:ss");
+                                                        recordAllEntity.put("Hour", time.format(formatter3));
+                                                        recordAllEntity.put("HourForecastWaterWithdrawals", null);
+                                                        //TODO 随机数逻辑
+                                                        int randomUpOrDown = ThreadLocalRandom.current().nextInt(2);//随机向上或者向下 0表示向下 1表示向上
+                                                        Double randomWater = randomUpOrDown == 0 ?
+                                                                numAge - (numAge * (randomCode / 100)) :
+                                                                numAge + (numAge * (randomCode / 100));
+                                                        recordAllEntity.put("HourForecastActualWaterSupply", randomWater);
+                                                        recordAllEntity.put("HourActualWaterWithdrawals", "");
+                                                        //实际从该时间查询结果中得出
+                                                        List<Map<String,Object>> newRecordAllRes = getWaterTapApi()
+                                                                .getWaterCollectionRecordAllListAll(" WHERE 1=1 " +
+                                                                        " AND org_name = '"+key.toString()+"'" +
+                                                                        " AND \"time\" =  '"+dateNow.withYear(LocalDateTime.now().getYear()).withHour(j).format(formatter)+"' ");
+                                                        String hourActualWaterSupply = null;
+                                                        if(!CollectionUtils.isEmpty(newRecordAllRes)){
+                                                            hourActualWaterSupply = newRecordAllRes.get(0).get("value").toString();
+                                                        }
+                                                        recordAllEntity.put("HourActualWaterSupply",hourActualWaterSupply);
+                                                        recordAllEntity.put("LastModifyTime", LocalDateTime.now().format(formatter));
+                                                        // 如果找到了org_id,就将其赋值给orgId,否则orgId为null
+                                                        recordAllEntity.put("orgId", orgId);
+
+                                                        //TODO 添加or修改
+                                                        Integer insertRes = getWaterTapApi().insertOrUpdateTbmHourWater(recordAllEntity);
+                                                        if (insertRes < 1) {
+                                                            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
+                                                                    , mStrClassName
+                                                                    , mStrClassName
+                                                                    , String.format("Batch insertYuceDataScheduled ERROR:{%s} ",
+                                                                            "新增或修改失败"));
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                        latch.countDown();
+                                    }
+                                });
+                            }catch(Exception ex){
+                                LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR
+                                        , mStrClassName
+                                        , mStrClassName
+                                        , String.format("Batch insertYuceDataScheduled ERROR:{%s} ",
+                                                ex.getLocalizedMessage()));
+                            }
+                        }
+                        try{latch.await();}catch(Exception ex){}
+                    }
+                    System.out.println("添加预测小时数据结束"+ TimeTool.convertUTC2DateStr(TimeTool.getCurMsUTC(),TimeTool.TIMESTAMP_FORMAT));
+                }else{
+
+                }
+            }
+        }catch(Exception ex){
+            ex.printStackTrace();
+        }
+    }
 }

+ 44 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/shizilaishuiDataSource/WaterYuceDao.java

@@ -0,0 +1,44 @@
+package com.shkpr.service.aimodelpower.dbdao.shizilaishuiDataSource;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.StringUtils;
+
+import javax.sql.DataSource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName WaterYuceDao
+ * @Description: TODO
+ * @Author LX
+ * @Date 2024/6/16
+ * @Version V1.0
+ **/
+@Slf4j
+@Repository
+public class WaterYuceDao {
+    @Autowired
+    @Qualifier("childDatasource")
+    private DataSource childDataSource;
+
+    //TODO 查询配置项8
+    public List<Map<String,Object>> getWaterYuceConfig(boolean isPage, int limit, int offset, String extend){
+
+        String sql = "SELECT * " +
+                " FROM water_yuce_config AS a WHERE 1=1 ";
+        if(!StringUtils.isEmpty(extend)){
+            sql+=extend;
+        }
+        if(isPage) {
+            sql += " LIMIT " + limit + " OFFSET " + offset;
+        }
+        JdbcTemplate pgJdbc = new JdbcTemplate(childDataSource);
+        List<Map<String, Object>> tableData = pgJdbc.queryForList(sql);
+        return tableData;
+
+    }
+}

+ 169 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/shizilaishuiDataSource/WaterZILAISHUIDao.java

@@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Repository;
+import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
@@ -113,6 +114,21 @@ public class WaterZILAISHUIDao {
         }
     }
 
+    //TODO 查询市自来水小时用水量记录表·不分页
+    public List<Map<String,Object>> getWaterCollectionRecordAllListAll(String extend){
+        try{
+            String sql = "SELECT * FROM water_collecation_record_all ";
+            if(!StringUtils.isEmpty(extend)){
+                sql += extend;
+            }
+            JdbcTemplate pgJdbc = new JdbcTemplate(childDataSource);
+            List<Map<String,Object>> tableData = pgJdbc.queryForList(sql);
+            return tableData;
+        }catch(Exception ex){
+            return null;
+        }
+    }
+
     //TODO 插入自来水历史记录表
     public int insertWaterCollectionRecord(String extend){
         try{
@@ -163,4 +179,157 @@ public class WaterZILAISHUIDao {
             return -1;
         }
     }
+
+    //TODO 插入自来水日用水预测数据
+    public int insertTbmWater(String extend){
+        try{
+            String sql = "INSERT INTO tb_m_water " +
+                    "('Date','Month','Week','ActualWaterWithdrawals','ActualWaterSupply'," +
+                    " 'ForecastWaterWithdrawals','ForecastActualWaterSupply','isAbnormal','isForecast','LastModifyTime','orgId' ) " +
+                    " VALUES ";
+            if(StringUtils.isEmpty(extend)){
+                return -1;
+            }
+            sql+=extend;
+            JdbcTemplate pgJdbc = new JdbcTemplate(childDataSource);
+            Integer resCode = pgJdbc.update(sql);
+            return resCode;
+        }catch(Exception ex){
+            return -1;
+        }
+    }
+
+    //TODO 修改自来水日用水预测数据
+    public int updateTbmWater(String[] value,String extend){
+        try{
+            String sql = "UPDATE tb_m_water " +
+                    " SET \"Date\" =  "+value[0]+" " +
+                    " AND \"Month\" =  "+value[1]+" " +
+                    " AND \"Week\" =  "+value[2]+" " +
+                    " AND \"ActualWaterWithdrawals\" =  "+value[3]+" " +
+                    " AND \"ActualWaterSupply\" =  "+value[4]+" " +
+                    " AND \"ForecastWaterWithdrawals\" =  "+value[5]+" " +
+                    " AND \"ForecastActualWaterSupply\" =  "+value[6]+" " +
+                    " AND \"isAbnormal\" =  "+value[7]+" " +
+                    " AND \"isForecast\" =  "+value[8]+" " +
+                    " AND \"LastModifyTime\" =  "+value[9]+" " +
+                    " AND \"orgId\" =  "+value[10]+" " +
+                    " ";
+            if(!StringUtils.isEmpty(extend)){
+                sql = sql +extend;
+            }
+            JdbcTemplate pgJdbc = new JdbcTemplate(childDataSource);
+            Integer resCode = pgJdbc.update(sql);
+            return resCode;
+        }catch(Exception ex){
+            return -1;
+        }
+    }
+
+    //TODO 添加或修改日预测数据
+    public int insertOrUpdateTbmWater(Map<String,Object> value){
+        try{
+            String sql = "INSERT INTO tb_m_water " +
+                    "(\"Date\",\"Month\",\"Week\",\"ActualWaterWithdrawals\",\"ActualWaterSupply\"," +
+                    " \"ForecastWaterWithdrawals\",\"ForecastActualWaterSupply\",\"isAbnormal\",\"isForecast\",\"LastModifyTime\",\"orgId\" ) VALUES ";
+            sql +=" ( ";
+            int i = 1;
+            for (Object key : value.keySet()){
+                if(i==value.keySet().size()){
+                    if(ObjectUtils.isEmpty(value.get(key))){
+                        sql += " NULL ";
+                    }else {
+                        sql += "'" + value.get(key) + "'";
+                    }
+                }else {
+                    if(ObjectUtils.isEmpty(value.get(key))) {
+                        sql += " NULL ,";
+                    }else {
+                        sql += "'" + value.get(key) + "',";
+                    }
+                }
+                i++;
+            }
+            sql += " )";
+            sql += " ON CONFLICT (\"Date\",\"orgId\") " +
+                    " DO UPDATE " +
+                    " SET \"Date\" =  '"+value.get("Date")+"' " +
+                    " , \"Month\" =  '"+value.get("Month")+"' " +
+                    " , \"Week\" =  '"+value.get("Week")+"' ";
+            if(!ObjectUtils.isEmpty(value.get("ActualWaterWithdrawals"))){
+                sql +=  " , \"ActualWaterWithdrawals\" =  '"+value.get("ActualWaterWithdrawals")+"' ";
+            }
+            if(!ObjectUtils.isEmpty(value.get("ActualWaterSupply"))){
+                sql +=  " ,\"ActualWaterSupply\" =  '"+value.get("ActualWaterSupply")+"' ";
+            }
+            if(!ObjectUtils.isEmpty(value.get("ForecastWaterWithdrawals"))){
+                sql +=  " , \"ForecastWaterWithdrawals\" =  '"+value.get("ForecastWaterWithdrawals")+"' ";
+            }
+            if(!ObjectUtils.isEmpty(value.get("ForecastActualWaterSupply"))){
+                sql +=  " , \"ForecastActualWaterSupply\" =  '"+value.get("ForecastActualWaterSupply")+"' ";
+            }
+
+                sql += " , \"isAbnormal\" =  '"+value.get("isAbnormal")+"' " +
+                    " , \"isForecast\" =  '"+value.get("isForecast")+"' " +
+                    " , \"LastModifyTime\" =  '"+value.get("LastModifyTime")+"' " +
+                    " , \"orgId\" =  '"+value.get("orgId")+"' ";
+            JdbcTemplate pgJdbc = new JdbcTemplate(childDataSource);
+            Integer resCode = pgJdbc.update(sql);
+            return resCode;
+        }catch(Exception ex){
+            return -1;
+        }
+    }
+
+    //TODO 添加或修改日小时预测数据
+    public int insertOrUpdateTbmHourWater(Map<String,Object> value){
+        try{
+            String sql = "INSERT INTO tb_m_hourwater " +
+                    "(\"Date\",\"Hour\",\"HourForecastWaterWithdrawals\",\"HourForecastActualWaterSupply\"," +
+                    " \"HourActualWaterWithdrawals\",\"HourActualWaterSupply\",\"LastModifyTime\",\"orgId\" ) VALUES ";
+            sql +=" ( ";
+            int i = 1;
+            for (Object key : value.keySet()){
+                if(i==value.keySet().size()){
+                    if(ObjectUtils.isEmpty(value.get(key))){
+                        sql += " NULL ";
+                    }else {
+                        sql += "'" + value.get(key) + "'";
+                    }
+                }else {
+                    if(ObjectUtils.isEmpty(value.get(key))) {
+                        sql += " NULL ,";
+                    }else {
+                        sql += "'" + value.get(key) + "',";
+                    }
+                }
+                i++;
+            }
+            sql += " )";
+            sql += " ON CONFLICT (\"Date\",\"orgId\",\"Hour\") " +
+                    " DO UPDATE " +
+                    " SET \"Date\" =  '"+value.get("Date")+"' " +
+                    " , \"Hour\" =  '"+value.get("Hour")+"' ";
+            if(!ObjectUtils.isEmpty(value.get("HourForecastWaterWithdrawals"))){
+                sql +=  " , \"HourForecastWaterWithdrawals\" =  '"+value.get("HourForecastWaterWithdrawals")+"' ";
+            }
+            if(!ObjectUtils.isEmpty(value.get("HourForecastActualWaterSupply"))){
+                sql +=  " ,\"HourForecastActualWaterSupply\" =  '"+value.get("HourForecastActualWaterSupply")+"' ";
+            }
+            if(!ObjectUtils.isEmpty(value.get("HourActualWaterWithdrawals"))){
+                sql +=  " , \"HourActualWaterWithdrawals\" =  '"+value.get("HourActualWaterWithdrawals")+"' ";
+            }
+            if(!ObjectUtils.isEmpty(value.get("HourActualWaterSupply"))){
+                sql +=  " , \"HourActualWaterSupply\" =  '"+value.get("HourActualWaterSupply")+"' ";
+            }
+
+                sql += " , \"LastModifyTime\" =  '"+value.get("LastModifyTime")+"' " +
+                    " , \"orgId\" =  '"+value.get("orgId")+"' ";
+            JdbcTemplate pgJdbc = new JdbcTemplate(childDataSource);
+            Integer resCode = pgJdbc.update(sql);
+            return resCode;
+        }catch(Exception ex){
+            return -1;
+        }
+    }
 }

+ 25 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/shizilaishuiDataSource/service/WaterCollecationServiceImpl.java

@@ -5,6 +5,7 @@ import com.global.base.log.LogPrintMgr;
 import com.shkpr.service.aimodelpower.constants.LogFlagBusiType;
 import com.shkpr.service.aimodelpower.dbdao.mapper.ZoonMapper;
 import com.shkpr.service.aimodelpower.dbdao.shizilaishuiDataSource.WaterCollecationDao;
+import com.shkpr.service.aimodelpower.dbdao.shizilaishuiDataSource.WaterYuceDao;
 import com.shkpr.service.aimodelpower.dbdao.shizilaishuiDataSource.WaterZILAISHUIDao;
 import com.shkpr.service.aimodelpower.dbdao.shizilaishuiDataSource.service.intef.WaterCollecationService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,9 +35,33 @@ public class WaterCollecationServiceImpl implements WaterCollecationService{
 
     @SuppressWarnings("all")
     @Autowired
+    private WaterYuceDao waterYuceDao;
+
+    @SuppressWarnings("all")
+    @Autowired
     private ZoonMapper zoonMapper;
 
     @Override
+    public List<Map<String, Object>> getWaterYuceConfig(boolean isPage, int limit, int offset, String extend) throws Exception{
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = waterYuceDao.getWaterYuceConfig(isPage,limit,offset,extend);
+        }catch (Exception e){
+            throw new Exception(e.getLocalizedMessage());
+
+        }finally {
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+                    , LogFlagBusiType.BUSI_CHILD_DB_TAP_WATER.toStrValue()
+                    , mStrClassName
+                    , String.format("Batch Query TbMWater from database, code:{%d} msg:{%s} ..."
+                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
+
+    @Override
     public List<Map<String, Object>> getTbMWater(Boolean isPage, int limit, int offset, String extend) throws Exception{
         int nCode = 0;
         String strMsg = "Success";

+ 104 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/shizilaishuiDataSource/service/WaterTapWaterServiceImpl.java

@@ -124,6 +124,26 @@ public class WaterTapWaterServiceImpl implements WaterTapWaterService {
     }
 
     @Override
+    public List<Map<String, Object>> getWaterCollectionRecordAllListAll( String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        List<Map<String, Object>> arrRes = null;
+        try {
+            arrRes = waterZILAISHUIDao.getWaterCollectionRecordAllListAll(extend);
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+        }finally {
+//            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+//                    , LogFlagBusiType.BUSI_CHILD_DB_TAP_WATER.toStrValue()
+//                    , mStrClassName
+//                    , String.format("Batch Query TabWaterHistory from database, code:{%d} msg:{%s} ..."
+//                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
+
+    @Override
     public Integer insertWaterCollectionRecord(String extend) {
         int nCode = 0;
         String strMsg = "Success";
@@ -185,4 +205,88 @@ public class WaterTapWaterServiceImpl implements WaterTapWaterService {
         }
         return arrRes;
     }
+
+    @Override
+    public Integer insertTbmWater(String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        Integer arrRes = null;
+        try {
+            arrRes = waterZILAISHUIDao.insertTbmWater(extend);
+        }catch (Exception e){
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+        }finally {
+//            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+//                    , LogFlagBusiType.BUSI_CHILD_DB_TAP_WATER.toStrValue()
+//                    , mStrClassName
+//                    , String.format("Batch Insert WaterRecord:{%s} from database, code:{%s} msg:{%s} ..."
+//                            , arrRes
+//                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
+
+    @Override
+    public Integer updateTbmWater(String[] value, String extend) {
+        int nCode = 0;
+        String strMsg = "Success";
+        Integer arrRes = null;
+        try {
+            arrRes = waterZILAISHUIDao.updateTbmWater(value, extend);
+        } catch (Exception e) {
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+        } finally {
+//            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+//                    , LogFlagBusiType.BUSI_CHILD_DB_TAP_WATER.toStrValue()
+//                    , mStrClassName
+//                    , String.format("Batch Insert WaterRecord:{%s} from database, code:{%s} msg:{%s} ..."
+//                            , arrRes
+//                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
+
+    @Override
+    public Integer insertOrUpdateTbmWater(Map<String, Object> value) {
+        int nCode = 0;
+        String strMsg = "Success";
+        Integer arrRes = null;
+        try {
+            arrRes = waterZILAISHUIDao.insertOrUpdateTbmWater(value);
+        } catch (Exception e) {
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+        } finally {
+//            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+//                    , LogFlagBusiType.BUSI_CHILD_DB_TAP_WATER.toStrValue()
+//                    , mStrClassName
+//                    , String.format("Batch Insert WaterRecord:{%s} from database, code:{%s} msg:{%s} ..."
+//                            , arrRes
+//                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
+
+    @Override
+    public Integer insertOrUpdateTbmHourWater(Map<String, Object> value) {
+        int nCode = 0;
+        String strMsg = "Success";
+        Integer arrRes = null;
+        try {
+            arrRes = waterZILAISHUIDao.insertOrUpdateTbmHourWater(value);
+        } catch (Exception e) {
+            nCode = LogLevelFlag.LOG_ERROR.ordinal();
+            strMsg = e.getLocalizedMessage();
+        } finally {
+//            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.valueFromInt(nCode)
+//                    , LogFlagBusiType.BUSI_CHILD_DB_TAP_WATER.toStrValue()
+//                    , mStrClassName
+//                    , String.format("Batch Insert WaterRecord:{%s} from database, code:{%s} msg:{%s} ..."
+//                            , arrRes
+//                            , nCode, strMsg));
+        }
+        return arrRes;
+    }
 }

+ 3 - 0
src/main/java/com/shkpr/service/aimodelpower/dbdao/shizilaishuiDataSource/service/intef/WaterCollecationService.java

@@ -12,6 +12,9 @@ import java.util.Map;
  **/
 public interface WaterCollecationService {
 
+    //TODO 获取预测数据自添加配置
+    public List<Map<String,Object>> getWaterYuceConfig(boolean isPage, int limit, int offset, String extend)throws Exception;
+
     //TODO 查询样本及预测水量表;支持是否分页
     public List<Map<String,Object>> getTbMWater(Boolean isPage, int limit, int offset, String extend)throws Exception;
 

+ 12 - 1
src/main/java/com/shkpr/service/aimodelpower/dbdao/shizilaishuiDataSource/service/intef/WaterTapWaterService.java

@@ -11,7 +11,7 @@ public interface WaterTapWaterService {
     //TODO orcale 获取市自来水历史用水记录·分页
     public List<Map<String,Object>> getPageZILAISHUI_HISTORY2(int limit, int offset, String extend);
 
-    //TODO pgsql 获取市自来水历史用水记录
+    //TODO pgsql 获取市自来水历史用水配置关系记录
     public List<Map<String,Object>> getWaterCollectionConfigList(String extend);
 
     //TODO pgsql 查询市自来水历史记录表·分页
@@ -19,6 +19,8 @@ public interface WaterTapWaterService {
 
     //TODO pgsql 查询市自来水小时用水量记录表·分页
     public List<Map<String,Object>> getWaterCollectionRecordAllList(int limit,int offset,String extend);
+    //TODO pgsql 查询市自来水小时用水量记录表·不分页
+    public List<Map<String,Object>> getWaterCollectionRecordAllListAll(String extend);
 
     //TODO pgsql 插入自来水历史记录表
     public Integer insertWaterCollectionRecord(String extend);
@@ -26,4 +28,13 @@ public interface WaterTapWaterService {
     public Integer insertWaterCollectionRecordAll(String extend);
     //TODO pgsql 修改自来水小时用水量记录
     public Integer updateWaterCollectionRecordAll(String value,String extend);
+
+    //TODO pgsql 插入自来水日用水预测数据
+    public Integer insertTbmWater(String extend);
+    //TODO pgsql 修改自来水日用水预测数据
+    public Integer updateTbmWater(String value[],String extend);
+    //TODO 添加或修改日预测数据
+    public Integer insertOrUpdateTbmWater(Map<String,Object> value);
+    //TODO 添加或修改日小时预测数据
+    public Integer insertOrUpdateTbmHourWater(Map<String,Object> value);
 }

+ 53 - 28
src/main/java/com/shkpr/service/aimodelpower/globalmgr/ScheduleTaskMgr.java

@@ -4,6 +4,7 @@ import com.global.base.log.LogLevelFlag;
 import com.global.base.log.LogPrintMgr;
 import com.global.base.thread.ThreadPoolProxy;
 import com.shkpr.service.aimodelpower.bizmgr.KprAimTapWaterBizFun;
+import com.shkpr.service.aimodelpower.bizmgr.KprAimWaterCollecationBizFun;
 import com.shkpr.service.aimodelpower.commtools.TimeTool;
 import com.shkpr.service.aimodelpower.constants.LogFlagBusiType;
 import com.zaxxer.hikari.HikariDataSource;
@@ -16,6 +17,7 @@ import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.sql.DataSource;
 import java.sql.Connection;
+import java.sql.Time;
 import java.util.Timer;
 import java.util.TimerTask;
 
@@ -105,6 +107,19 @@ public class ScheduleTaskMgr {
         KprAimTapWaterBizFun.checkRecordData();
     }
 
+    //TODO 每天整点的15分执行预测日数据
+    @Scheduled(cron = "0 15 * * * *")
+//    @Scheduled(cron = "0 0/1 * * * ?")
+    public void executeTbMWater() {
+        KprAimWaterCollecationBizFun.insertYuceDataScheduled();
+    }
+
+    //TODO 每天整点的16分执行预测日小时数据
+    @Scheduled(cron = "0 16 * * * *")
+    public void executeTbMHourWater() {
+        KprAimWaterCollecationBizFun.insertYuceHourDataScheduled();
+    }
+
     //TODO 启动时执行 测试方法
 //    @PostConstruct
 //    public void initTest(){
@@ -113,37 +128,47 @@ public class ScheduleTaskMgr {
 //        TimerTask timerTask = new TimerTask() {
 //            @Override
 //            public void run() {
-//                KprAimTapWaterBizFun.checkRecordAllData();
-//                KprAimTapWaterBizFun.checkRecordData();
+////                KprAimTapWaterBizFun.checkRecordAllData();
+////                KprAimTapWaterBizFun.checkRecordData();
+//                KprAimWaterCollecationBizFun.insertYuceDataScheduled();
+//            }
+//        };
+//        timer.schedule(timerTask, 5000);
+//
+//        Timer timer2 = new Timer();
+//        TimerTask timerTask1 = new TimerTask() {
+//            @Override
+//            public void run() {
+//                KprAimWaterCollecationBizFun.insertYuceHourDataScheduled();
 //            }
 //        };
-//        timer.schedule(timerTask, 5000); // 10秒后执行一次
+//        timer2.schedule(timerTask1, 10000);
 //    }
 
 
-    //TODO 启动时执行一次
-    @PostConstruct
-    public void initOneTapWater(){
-        Timer timer = new Timer();
-        // 创建定时器任务
-        TimerTask timerTask = new TimerTask() {
-            @Override
-            public void run() {
-                KprAimTapWaterBizFun.initTapWaterData();
-            }
-        };
-        timer.schedule(timerTask, 10000); // 10秒后执行一次
-    }
-
-    @PostConstruct
-    public void initWaterRecordAll(){
-        Timer timer = new Timer();
-        TimerTask timerTask1 = new TimerTask() {
-            @Override
-            public void run() {
-                KprAimTapWaterBizFun.initWaterCollecationReacordAll();
-            }
-        };
-        timer.schedule(timerTask1,11000);//11秒后执行一次
-    }
+//    //TODO 启动时执行一次
+//    @PostConstruct
+//    public void initOneTapWater(){
+//        Timer timer = new Timer();
+//        // 创建定时器任务
+//        TimerTask timerTask = new TimerTask() {
+//            @Override
+//            public void run() {
+//                KprAimTapWaterBizFun.initTapWaterData();
+//            }
+//        };
+//        timer.schedule(timerTask, 10000); // 10秒后执行一次
+//    }
+//
+//    @PostConstruct
+//    public void initWaterRecordAll(){
+//        Timer timer = new Timer();
+//        TimerTask timerTask1 = new TimerTask() {
+//            @Override
+//            public void run() {
+//                KprAimTapWaterBizFun.initWaterCollecationReacordAll();
+//            }
+//        };
+//        timer.schedule(timerTask1,11000);//11秒后执行一次
+//    }
 }