Просмотр исходного кода

江津优先更新版本 获取实时水量接口 天/小时

1037015548@qq.com 3 месяцев назад
Родитель
Сommit
64a9217bd6

+ 2 - 2
src/main/java/com/shkpr/service/aimodelpower/bizmgr/KprAimTapWaterBizFun.java

@@ -39,7 +39,7 @@ public class KprAimTapWaterBizFun {
     static DateTimeFormatter formater = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
     //TODO 小时用水量 每天整点10分检查并写入,检查范围为当前时间到昨天23点
-    public static void checkRecordAllData(){
+    public static void checkRecordAllData(int beforHour){
         //TODO 检查小时用水量
         DateTimeFormatter formater = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
@@ -59,7 +59,7 @@ public class KprAimTapWaterBizFun {
                             //TODO 根据当前配置信息item 查询远通数据中的历史数据
                             //TODO 首先查询当前水厂设备的从昨天之后到得到数据的数据
                             LocalDateTime today = LocalDateTime.now();
-                            LocalDateTime startDateTime = today.withMinute(0).withSecond(0).withNano(0).minusHours(2);
+                            LocalDateTime startDateTime = today.withMinute(0).withSecond(0).withNano(0).minusHours(beforHour);
 
                             //TODO 需计算的循环天数
 

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

@@ -506,6 +506,104 @@ public class KprAimWaterCollecationBizFun {
         }
     }
 
+    //TODO 获取小时实际水量数据
+    public static ResponseRes selectRealHourWaterList(JPRealHourWater jpTbMHourWater){
+        ResponseRes responseRes = new ResponseRes();
+        List<Map<String, Object>> list = new ArrayList<>();
+        Map<String, Object> map = new HashMap<>();
+//        map.put("id", null);
+        map.put("org_name", null);
+        map.put("time", null);
+        map.put("value", null);
+//        map.put("value_tag", null);
+//        map.put("collcation_tag_array", null);
+        list.add(map);
+        responseRes.setResdata(list);
+        responseRes.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
+        responseRes.setResmsg(ResponseCode.RESULT_NORMAL.toStrMsg());
+        try {
+            List<Map<String, Object>> orgConfig = getWaterTapWaterApi().getOrgConfig(false, 0, 0, " AND org_name not like '%水厂'");
+            if ("water_volume_prediction_jiangjin2".equals(databaseName)) {
+                orgConfig = getWaterTapWaterApi().getOrgConfig(false, 0, 0, "");
+            }
+            if(!CollectionUtils.isEmpty(orgConfig)){
+                //TODO 根据分区编号找到对应的名称
+                Optional<Map<String, Object>> mapOrg = orgConfig.stream()
+                        .filter(maps -> jpTbMHourWater.getOrgId().equals(maps.get("org_id")))
+                        .findFirst();
+                if (mapOrg.isPresent()) {
+                    Map<String,Object> currentOrg = mapOrg.get();
+                    List<Map<String,Object>> recordAllRes = getWaterTapApi()
+                            .getWaterCollectionRecordAllListAll(" WHERE 1=1 " +
+                                    " AND org_name = '"+currentOrg.get("org_name").toString()+"'" +
+                                    jpTbMHourWater.getForDateStr());
+                    recordAllRes.stream()
+                            .forEach(item -> {
+                                item.remove("id");
+                                item.remove("value_tag");
+                                item.remove("collcation_tag_array");
+                            });
+                    if(jpTbMHourWater.getDayData()){
+                        responseRes.setResdata(aggregateByDay(recordAllRes));
+                    }else{
+                        responseRes.setResdata(recordAllRes);
+                    }
+                }
+            }
+            return responseRes;
+        }catch(Exception ex){
+            responseRes.setResdata(null);
+            responseRes.setResmsg(ResponseCode.RESULT_BAD.toStrMsg());
+            responseRes.setRescode(ResponseCode.RESULT_BAD.toStrCode());
+            return responseRes;
+        }
+    }
+
+    public static List<Map<String, Object>> aggregateByDay(List<Map<String, Object>> hourlyData) {
+        // 定义日期格式
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 00:00:00");
+
+        // 按日期分组
+        Map<String, List<Map<String, Object>>> groupedByDate = hourlyData.stream()
+                .collect(Collectors.groupingBy(
+                        record -> {
+                            String timeStr = (String) record.get("time");
+                            LocalDateTime dateTime = LocalDateTime.parse(timeStr, formatter);
+                            return dateTime.format(dateFormatter);
+                        }
+                ));
+
+        // 创建结果列表
+        List<Map<String, Object>> dailyData = new ArrayList<>();
+
+        // 对每天的数据进行聚合
+        groupedByDate.forEach((date, records) -> {
+            Map<String, Object> dailyRecord = new HashMap<>();
+
+            // 保留第一个记录的id和org_name
+            dailyRecord.put("org_name", records.get(0).get("org_name"));
+            dailyRecord.put("time", date);
+
+            // 计算当天的总值(示例为求和)
+            double sum = records.stream()
+                    .mapToDouble(record -> Double.parseDouble((String) record.get("value")))
+                    .sum();
+
+            // 计算当天平均值
+            double average = sum / records.size();
+
+//            dailyRecord.put("total_value", String.valueOf(sum));
+//            dailyRecord.put("average_value", String.valueOf(average));
+//            dailyRecord.put("record_count", records.size());
+            dailyRecord.put("value", String.valueOf(sum));
+
+            dailyData.add(dailyRecord);
+        });
+
+        return dailyData;
+    }
+
     //TODO 小时取水量预测接口
     /**
      * 传入水厂id及日期,返回指定日期内的小时取水量预测数据和实际小时取水量数据

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

@@ -120,6 +120,7 @@ public class ApiURI {
     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_REAL_HOUR = "realhourdata";
     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_WATER_ZILAISHUI_HOUR_LEVEL = "hourleveldata";

+ 60 - 0
src/main/java/com/shkpr/service/aimodelpower/controllerapi/WaterCollecationController.java

@@ -15,6 +15,7 @@ import com.shkpr.service.aimodelpower.dto.ResponseCode;
 import com.shkpr.service.aimodelpower.dto.ResponseRes;
 import com.shkpr.service.aimodelpower.dto.zilaishuiModel.InPumpModel;
 import com.shkpr.service.aimodelpower.exception.SelfException;
+import com.shkpr.service.aimodelpower.jsonbean.zilaishui.JPRealHourWater;
 import com.shkpr.service.aimodelpower.jsonbean.zilaishui.JPTbLevelHourWater;
 import com.shkpr.service.aimodelpower.jsonbean.zilaishui.JPTbMHourWater;
 import com.shkpr.service.aimodelpower.jsonbean.zilaishui.JPTbMWater;
@@ -270,6 +271,65 @@ public class WaterCollecationController {
     }
 
 
+    /**
+     * @Author Lx
+     * @Description //TODO 获取实时数据曲线
+     * @Date 14:49 2025/4/24
+     * @Param
+     * @return
+     **/
+    @PostMapping(value = ApiURI.URI_WATER_ZILAISHUI_REAL_HOUR)
+    public ResponseRes realHourData(HttpServletRequest request
+            , @RequestHeader(value= ApiURI.HEADER_CLIENT_TYPE, required=false) String strClientType
+            , @RequestHeader(value= ApiURI.HEADER_USER_AGENT, required=false) String strUserAgent) throws Exception{
+        final String URI_PATH = request.getRequestURI();
+        final String strPlatform = CommTool.getPlatformByAgent(strClientType, strUserAgent);
+        final String strUserId = (String)request.getAttribute(TokenAuthenticationService.HEADER_USERID);
+        JPRealHourWater oJsonParam = FastJsonUtil.fromJSONByGson(HttpTool.getJsonBodyStr(request), JPRealHourWater.class);
+        if (oJsonParam == null
+                || !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, mSeqNotify.incrementAndGet());
+
+        ResponseRes<String> resResult = new ResponseRes<String>();
+        resResult.setRescode(ResponseCode.RESULT_NORMAL.toStrCode());
+        resResult.setResmsg(MSG_SUCCESS);
+        resResult.setResdata("");
+        try {
+            ResponseRes oRes = KprAimWaterCollecationBizFun.selectRealHourWaterList(oJsonParam);
+            if (oRes != null && ResponseCode.RESULT_NORMAL.toStrCode().equals(oRes.getRescode())) {
+                resResult.setResdata(FastJsonUtil.toJSON(oRes.getResdata()));
+            } else {
+                resResult.setRescode(ResponseCode.RESULT_BAD.toStrCode());
+                resResult.setResmsg(MSG_FAILED);
+                resResult.setResdata("");
+            }
+
+            resResult.setTimestamp(System.currentTimeMillis());
+            LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, LogFlagBusiType.BUSI_INTERNAL.toStrValue(), 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;
+        }catch(Exception ex){
+            resResult.setRescode(ResponseCode.RESULT_BAD.toStrCode());
+            resResult.setResmsg(MSG_FAILED+ex.getLocalizedMessage());
+            resResult.setResdata("");
+            return resResult;
+        }
+    }
+
+
     @PostMapping(value = ApiURI.URI_WATER_ZILAISHUI_HOUR)
     public ResponseRes hourData(HttpServletRequest request
             , @RequestHeader(value= ApiURI.HEADER_CLIENT_TYPE, required=false) String strClientType

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

@@ -22,6 +22,7 @@ public class ThirdJWTCurrencyFilter extends JWTAuthenticationFilter {
         msMapURI2Method = new HashMap<String, String>();
         msMapURI2Method.put(String.format("%s/%s", ApiURI.URI_WATER_ZILAISHUI_H, ApiURI.URI_WATER_ZILAISHUI_DAY), "POST");
         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_REAL_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_WATER_ZILAISHUI_H, ApiURI.URI_WATER_ZILAISHUI_HOUR_LEVEL), "POST");

+ 10 - 4
src/main/java/com/shkpr/service/aimodelpower/globalmgr/ScheduleTaskMgr.java

@@ -102,11 +102,17 @@ public class ScheduleTaskMgr {
         }
     }
 
+    //TODO 每天整点0五分执行检查日水量是否对齐
+    @Scheduled(cron = "0 5 * * * *")
+    public void executeThreeWork() {
+        KprAimTapWaterBizFun.checkRecordAllData(1);
+    }
+
     //TODO 每天整点的五分执行检查日用水量是否对齐,检查时间范围为当前时间到昨天
     @Scheduled(cron = "0 15 * * * *")
 //    @Scheduled(cron = "0 0/1 * * * ?")
     public void executeWork() {
-        KprAimTapWaterBizFun.checkRecordAllData();
+        KprAimTapWaterBizFun.checkRecordAllData(2);
         String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM"));
         //TODO 当前月预测日数据
         Timer timer = new Timer();
@@ -217,7 +223,7 @@ public class ScheduleTaskMgr {
             @Override
             public void run() {
                 //TODO 实际调用调度模型的接口
-                KprAimTapWaterBizFun.checkRecordAllData();
+                KprAimTapWaterBizFun.checkRecordAllData(2);
                 KprAimWaterCollecationBizFun.initPumpPowerZero();
                 KprAimWaterCollecationBizFun.insertYuceHourAddData(time);
                 KprAimWaterCollecationBizFun.insertYucePump(time);
@@ -235,7 +241,7 @@ public class ScheduleTaskMgr {
     }
 
 //    TODO 自来水的注释以下俩方法initPumpRecordAll checkPumpRecordAll
-    /*@PostConstruct
+    @PostConstruct
     public void initPumpRecordAll(){
         new Timer().schedule(new TimerTask() {
             @Override
@@ -263,7 +269,7 @@ public class ScheduleTaskMgr {
                 KprAimTapWaterBizFun.initWaterPumpReacordAll(formattedDate);
             }
         },5000);
-    }*/
+    }
 
     @PostConstruct
     public void initDatabaseName(){

+ 96 - 0
src/main/java/com/shkpr/service/aimodelpower/jsonbean/zilaishui/JPRealHourWater.java

@@ -0,0 +1,96 @@
+package com.shkpr.service.aimodelpower.jsonbean.zilaishui;
+
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.aimodelpower.commtools.TimeTool;
+import com.shkpr.service.aimodelpower.controllervalid.CommonParamValidList;
+import com.shkpr.service.aimodelpower.controllervalid.CommonParamValidSS;
+import lombok.Data;
+import org.hibernate.validator.constraints.Range;
+import org.springframework.util.StringUtils;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+
+/**
+ * @ClassName JPTbMHourWater
+ * @Description: TODO 查询实际小时数据
+ * @Author LX
+ * @Date 2024/5/27
+ * @Version V1.0
+ **/
+@Data
+public class JPRealHourWater {
+    private String orgId;//水厂id
+
+    private Long startDate;//开始日期 (实际时间为 年 月 日(就为当月的一号),时分秒为 00:00:00,如2023-03-01 00:00:00)
+
+    private Long endDate;//结束日期 (实际时间为 年 月 日(就为当月的一号),时分秒为 00:00:00,如2023-03-01 00:00:00)
+
+    //业务字段
+    private String forDateStr;
+
+    private Boolean dayData = false;
+
+    public boolean checkValid(){
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        if (startDate == null && endDate != null) {
+            return false;
+        }
+        StringBuilder strSql = new StringBuilder("");
+        if (startDate == null && endDate == null) {
+            //TODO 说明前端没传,那么默认为查今天0点到当前小时点的
+            LocalDateTime nowDate = LocalDateTime.now();//结束时间
+            nowDate = nowDate.withHour(0);
+            nowDate = nowDate.withMinute(0);
+            nowDate = nowDate.withSecond(0);
+
+            LocalDateTime startLocalDate = nowDate;
+
+            String startLocalDateStr = startLocalDate.format(formatter);
+            String endLocalDateStr = LocalDateTime.now().withMinute(0).withSecond(0).format(formatter);
+            strSql.append(" AND \"time\" BETWEEN  '" + startLocalDateStr + "' " + "AND '" + endLocalDateStr + "'");
+            forDateStr = strSql.toString();
+            startDate = TimeTool.convertDateStr2UTC(startLocalDateStr);
+            endDate = TimeTool.convertDateStr2UTC(endLocalDateStr);
+        } else if (startDate != null && endDate != null) {
+            try {
+                LocalDateTime startLocalDate = LocalDateTime.parse(TimeTool.convertUTC2DateStr(startDate, TimeTool.TIMESTAMP_FORMAT), DateTimeFormatter.ofPattern(TimeTool.TIMESTAMP_FORMAT));
+                LocalDateTime endLocalDate = LocalDateTime.parse(TimeTool.convertUTC2DateStr(endDate, TimeTool.TIMESTAMP_FORMAT), DateTimeFormatter.ofPattern(TimeTool.TIMESTAMP_FORMAT));
+//                long monthsBetween = ChronoUnit.MONTHS.between(startLocalDate, endLocalDate);
+                if (startLocalDate.isAfter(endLocalDate)) {
+                    return false;
+                } else if (endLocalDate.isBefore(startLocalDate)) {
+                    return false;
+                } else if (startLocalDate.equals(endLocalDate) || startLocalDate.isBefore(endLocalDate)) {
+                    //TODO 说明符合可组成查询日期的条件
+                    //TODO 按照需求,特殊化结束时间再加4天
+                    String startLocalDateStr = startLocalDate.format(formatter);
+                    String endLocalDateStr = endLocalDate.format(formatter);
+                    strSql.append(" AND \"time\" BETWEEN  '" + startLocalDateStr + "' " + "AND '" + endLocalDateStr + "'");
+                    forDateStr = strSql.toString();
+                    startDate = TimeTool.convertDateStr2UTC(startLocalDateStr);
+                    endDate = TimeTool.convertDateStr2UTC(endLocalDateStr);
+                }
+            } catch (Exception ex) {
+                LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, "JPCustomerMeterSS", "JPCustomerMeterSS"
+                        , String.format("errorMsg:%s====>"
+                                , ex.getLocalizedMessage()));
+                return false;
+            }
+        } else if (startDate != null && endDate == null) {//警告没事,增加代码可读性
+            //TODO 说明startDate传了  endDate没传 , 那么endDate为startDate月的最后一天
+            LocalDateTime startLocalDate = LocalDateTime.parse(TimeTool.convertUTC2DateStr(startDate, TimeTool.TIMESTAMP_FORMAT), DateTimeFormatter.ofPattern(TimeTool.TIMESTAMP_FORMAT));
+            LocalDateTime endLocalDate =  LocalDateTime.now().withMinute(0).withSecond(0);
+            String startLocalDateStr = startLocalDate.format(formatter);
+            String endLocalDateStr = endLocalDate.format(formatter);
+            strSql.append(" AND \"time\" BETWEEN  '" + startLocalDateStr + "' " + "AND '" + endLocalDateStr + "'");
+            forDateStr = strSql.toString();
+            endDate = TimeTool.convertDateStr2UTC(endLocalDateStr);
+        }
+        return true;
+    }
+}