From 5646e9910ecaf10df4550b4d29fb0618415551f9 Mon Sep 17 00:00:00 2001
From: 潘志宝 <979469083@qq.com>
Date: 星期四, 08 五月 2025 13:29:42 +0800
Subject: [PATCH] 检查每天的需量与这个月的最大值比较

---
 ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/PowerMaxdemandDetService.java           |   13 +
 ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/impl/PowerMaxdemandMainServiceImpl.java |   57 +++++++
 ansteel-biz/src/main/java/com/iailab/module/ansteel/power/dao/PowerMaxdemandDetDao.java                   |   14 +
 ansteel-biz/db/mysql.sql                                                                                  |   50 +++++-
 ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/impl/PowerMaxdemandDetServiceImpl.java  |   29 +++
 ansteel-biz/src/main/java/com/iailab/module/ansteel/power/entity/PowerMaxdemandMainEntity.java            |   46 +++++
 ansteel-biz/src/main/java/com/iailab/module/ansteel/power/entity/PowerMaxdemandDetEntity.java             |   55 ++++++
 ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/PowerMaxdemandMainService.java          |   18 ++
 ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPowerMaxdemandTask.java                   |  150 ++++++++++++++++++
 ansteel-biz/src/main/java/com/iailab/module/ansteel/power/dao/PowerMaxdemandMainDao.java                  |   14 +
 10 files changed, 437 insertions(+), 9 deletions(-)

diff --git a/ansteel-biz/db/mysql.sql b/ansteel-biz/db/mysql.sql
index 79191c2..9943a34 100644
--- a/ansteel-biz/db/mysql.sql
+++ b/ansteel-biz/db/mysql.sql
@@ -785,18 +785,50 @@
 DROP TABLE IF EXISTS `t_gas_pred_conf`;
 CREATE TABLE `t_gas_pred_conf`
 (
-    `id`         varchar(36) NOT NULL COMMENT 'id',
-    `chart_code` varchar(50) NULL DEFAULT NULL COMMENT '预测图编号',
-    `user_type`  varchar(50) NULL DEFAULT NULL COMMENT '用户类型(发生,消耗)',
-    `item_no`    varchar(50) NULL DEFAULT NULL COMMENT '预测项编号',
-    `item_name`  varchar(50) NULL DEFAULT NULL COMMENT '预测项名称',
-    `out_key`    varchar(50) NULL DEFAULT NULL COMMENT '预测项输出key',
-    `out_name`   varchar(50) NULL DEFAULT NULL COMMENT '预测项输出名称',
+    `id`              varchar(36) NOT NULL COMMENT 'id',
+    `chart_code`      varchar(50) NULL DEFAULT NULL COMMENT '预测图编号',
+    `user_type`       varchar(50) NULL DEFAULT NULL COMMENT '用户类型(发生,消耗)',
+    `item_no`         varchar(50) NULL DEFAULT NULL COMMENT '预测项编号',
+    `item_name`       varchar(50) NULL DEFAULT NULL COMMENT '预测项名称',
+    `out_key`         varchar(50) NULL DEFAULT NULL COMMENT '预测项输出key',
+    `out_name`        varchar(50) NULL DEFAULT NULL COMMENT '预测项输出名称',
     `is_default_load` int DEFAULT NULL COMMENT '是否默认加载',
-    `sort`       int NULL DEFAULT NULL COMMENT '排序',
+    `sort`            int NULL DEFAULT NULL COMMENT '排序',
     PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT '煤气预测析配置';
 
 ALTER TABLE `t_gas_pred_conf`
-ADD COLUMN `out_id` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '预测项输出id' AFTER `item_name`,
+    ADD COLUMN `out_id` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '预测项输出id' AFTER `item_name`,
 ADD COLUMN `is_default_load` int DEFAULT NULL COMMENT '是否默认加载' AFTER `out_name`;
+
+-- ----------------------------
+-- 负荷移植-最大需量发生记录
+-- ----------------------------
+DROP TABLE IF EXISTS `t_power_maxdemand_main`;
+CREATE TABLE `t_power_maxdemand_main`
+(
+    `id`         varchar(36) NOT NULL COMMENT 'id',
+    `occur_time` datetimeL COMMENT '发生时间',
+    `code`       varchar(50) NULL DEFAULT NULL COMMENT '编号',
+    `name`       varchar(50) NULL DEFAULT NULL COMMENT '名称',
+    `max_demand` decimal(10, 2) NULL DEFAULT NULL COMMENT '最大需量',
+    PRIMARY KEY (`id`) USING BTREE,
+    key          idx_code (code)
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT '负荷移植最大需量发生记录';
+
+-- ----------------------------
+-- 负荷移植-最大需量发生记录详情
+-- ----------------------------
+DROP TABLE IF EXISTS `t_power_maxdemand_det`;
+CREATE TABLE `t_power_maxdemand_det`
+(
+    `id`         varchar(36) NOT NULL COMMENT 'id',
+    `rel_id`     varchar(36) NULL DEFAULT NULL COMMENT '关联ID',
+    `occur_time` datetime COMMENT '发生时间',
+    `code`       varchar(50) NULL DEFAULT NULL COMMENT '编号',
+    `name`       varchar(50) NULL DEFAULT NULL COMMENT '名称',
+    `max_demand` decimal(10, 2) NULL DEFAULT NULL COMMENT '最大需量',
+    `sort`       int NULL DEFAULT NULL COMMENT '排序',
+    PRIMARY KEY (`id`) USING BTREE,
+    key          idx_rel_id (rel_id)
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT '负荷移植最大需量发生记录详情';
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPowerMaxdemandTask.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPowerMaxdemandTask.java
new file mode 100644
index 0000000..076de83
--- /dev/null
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPowerMaxdemandTask.java
@@ -0,0 +1,150 @@
+package com.iailab.module.ansteel.job.task;
+
+import com.iailab.module.ansteel.common.utils.DecimalUtil;
+import com.iailab.module.ansteel.power.entity.PowerDemandEntity;
+import com.iailab.module.ansteel.power.entity.PowerMaxdemandDetEntity;
+import com.iailab.module.ansteel.power.entity.PowerMaxdemandMainEntity;
+import com.iailab.module.ansteel.power.entity.PowerNetDropdownEntity;
+import com.iailab.module.ansteel.power.service.PowerDemandService;
+import com.iailab.module.ansteel.power.service.PowerMaxdemandDetService;
+import com.iailab.module.ansteel.power.service.PowerMaxdemandMainService;
+import com.iailab.module.ansteel.power.service.PowerNetDropdownService;
+import com.iailab.module.data.api.point.DataPointApi;
+import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
+import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * 检查每天的需量与这个月的最大值比较
+ * 如果大于,则保存
+ * 每天23:59执行
+ *
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年05月08日
+ */
+@Component("runPowerMaxdemandTask")
+public class RunPowerMaxdemandTask implements ITask {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private PowerDemandService powerDemandService;
+
+    @Autowired
+    private PowerMaxdemandMainService powerMaxdemandMainService;
+
+    @Autowired
+    private PowerNetDropdownService powerNetDropdownService;
+
+    @Autowired
+    private PowerMaxdemandDetService powerMaxdemandDetService;
+
+    @Resource
+    private DataPointApi dataPointApi;
+
+    @Override
+    public void run(String params) {
+        logger.info("RunPowerMaxdemandTask start");
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.MILLISECOND, 0);
+        calendar.set(Calendar.SECOND, 0);
+        Date nowTime = calendar.getTime();
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        Date dayStart = calendar.getTime();
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        Date monStart = calendar.getTime();
+        try {
+            Map<String, Object> params0 = new HashMap<>();
+            List<PowerDemandEntity> demandList = powerDemandService.list(params0);
+            if (CollectionUtils.isEmpty(demandList)) {
+                logger.info("demandList is empty");
+                return;
+            }
+            for (PowerDemandEntity demand : demandList) {
+                // 查询今天的最大需量
+                ApiPointValueQueryDTO pointValueQuery0 = new ApiPointValueQueryDTO();
+                pointValueQuery0.setStart(dayStart);
+                pointValueQuery0.setEnd(nowTime);
+                pointValueQuery0.setPointNo(demand.getCurDemand());
+                Map<String, Object> maxValue = dataPointApi.queryPointMaxValue(pointValueQuery0);
+                BigDecimal todayMax = BigDecimal.ZERO;
+                if (CollectionUtils.isEmpty(maxValue) && maxValue.containsKey(demand.getCurDemand())) {
+                    todayMax = new BigDecimal(maxValue.get(demand.getCurDemand()).toString());
+                }
+
+                List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(pointValueQuery0);
+                if (CollectionUtils.isEmpty(valueList)) {
+                    logger.info("valueList is empty");
+                    continue;
+                }
+                Date occurTime = new Date(nowTime.getTime());
+                for (ApiPointValueDTO apiPointValueDTO : valueList) {
+                    if (Math.abs(apiPointValueDTO.getV() - todayMax.doubleValue()) < 0.001) {
+                        occurTime = apiPointValueDTO.getT();
+                        break;
+                    }
+                }
+
+                // 查询本月需量发生记录
+                BigDecimal monthMax = powerMaxdemandMainService.getMax(demand.getCode(), monStart, nowTime);
+
+                // 保存记录
+                if (todayMax.compareTo(monthMax) <= 0) {
+                    continue;
+                }
+                PowerMaxdemandMainEntity mainEntity = new PowerMaxdemandMainEntity();
+                mainEntity.setCode(demand.getCode());
+                mainEntity.setName(demand.getName());
+                mainEntity.setOccurTime(occurTime);
+                mainEntity.setMaxDemand(todayMax);
+                String mainId = powerMaxdemandMainService.add(mainEntity);
+
+                Map<String, Object> params1 = new HashMap<>();
+                params1.put("pCode", demand.getCode());
+                List<PowerNetDropdownEntity> dropdownList = powerNetDropdownService.list(params1);
+                if (CollectionUtils.isEmpty(dropdownList)) {
+                    logger.info("dropdownList is empty");
+                    continue;
+                }
+                for (PowerNetDropdownEntity dropdown : dropdownList) {
+                    if (StringUtils.isBlank(dropdown.getExt1())) {
+                        continue;
+                    }
+                    Calendar calendar1 = Calendar.getInstance();
+                    calendar1.setTime(occurTime);
+                    calendar1.add(Calendar.MINUTE, 1);
+                    ApiPointValueQueryDTO pointValueQuery1 = new ApiPointValueQueryDTO();
+                    pointValueQuery1.setStart(occurTime);
+                    pointValueQuery1.setEnd(calendar1.getTime());
+                    pointValueQuery1.setPointNo(dropdown.getExt1());
+                    List<ApiPointValueDTO> valueList1 = dataPointApi.queryPointHistoryValue(pointValueQuery1);
+                    if (CollectionUtils.isEmpty(valueList1)) {
+                        logger.info("valueList1 is empty");
+                        continue;
+                    }
+                    PowerMaxdemandDetEntity detEntity = new PowerMaxdemandDetEntity();
+                    detEntity.setRelId(mainId);
+                    detEntity.setCode(dropdown.getNodeCode());
+                    detEntity.setName(dropdown.getNodeName());
+                    detEntity.setOccurTime(occurTime);
+                    detEntity.setMaxDemand(BigDecimal.valueOf(valueList1.get(0).getV()));
+                    powerMaxdemandDetService.add(detEntity);
+                }
+            }
+            logger.info("RunPowerMaxdemandTask end");
+        } catch (Exception e) {
+            logger.error("RunPowerMaxdemandTask error", e);
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/dao/PowerMaxdemandDetDao.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/dao/PowerMaxdemandDetDao.java
new file mode 100644
index 0000000..a7151ff
--- /dev/null
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/dao/PowerMaxdemandDetDao.java
@@ -0,0 +1,14 @@
+package com.iailab.module.ansteel.power.dao;
+
+import com.iailab.framework.common.dao.BaseDao;
+import com.iailab.module.ansteel.power.entity.PowerMaxdemandDetEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年05月07日
+ */
+@Mapper
+public interface PowerMaxdemandDetDao extends BaseDao<PowerMaxdemandDetEntity> {
+}
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/dao/PowerMaxdemandMainDao.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/dao/PowerMaxdemandMainDao.java
new file mode 100644
index 0000000..507a805
--- /dev/null
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/dao/PowerMaxdemandMainDao.java
@@ -0,0 +1,14 @@
+package com.iailab.module.ansteel.power.dao;
+
+import com.iailab.framework.common.dao.BaseDao;
+import com.iailab.module.ansteel.power.entity.PowerMaxdemandMainEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年05月07日
+ */
+@Mapper
+public interface PowerMaxdemandMainDao extends BaseDao<PowerMaxdemandMainEntity> {
+}
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/entity/PowerMaxdemandDetEntity.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/entity/PowerMaxdemandDetEntity.java
new file mode 100644
index 0000000..b241d86
--- /dev/null
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/entity/PowerMaxdemandDetEntity.java
@@ -0,0 +1,55 @@
+package com.iailab.module.ansteel.power.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年05月07日
+ */
+@Data
+@TableName("t_power_maxdemand_det")
+public class PowerMaxdemandDetEntity implements Serializable {
+
+    /**
+     * id
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 关联ID
+     */
+    private String relId;
+
+    /**
+     * 发生时间
+     */
+    private Date occurTime;
+
+    /**
+     * 编号
+     */
+    private String code;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 最大需量
+     */
+    private BigDecimal maxDemand;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+}
\ No newline at end of file
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/entity/PowerMaxdemandMainEntity.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/entity/PowerMaxdemandMainEntity.java
new file mode 100644
index 0000000..bd61d3c
--- /dev/null
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/entity/PowerMaxdemandMainEntity.java
@@ -0,0 +1,46 @@
+package com.iailab.module.ansteel.power.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年05月07日
+ */
+@Data
+@TableName("t_power_maxdemand_main")
+public class PowerMaxdemandMainEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 发生时间
+     */
+    private Date occurTime;
+
+    /**
+     * 编号
+     */
+    private String code;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 最大需量
+     */
+    private BigDecimal maxDemand;
+}
\ No newline at end of file
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/PowerMaxdemandDetService.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/PowerMaxdemandDetService.java
new file mode 100644
index 0000000..416d38d
--- /dev/null
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/PowerMaxdemandDetService.java
@@ -0,0 +1,13 @@
+package com.iailab.module.ansteel.power.service;
+
+import com.iailab.module.ansteel.power.entity.PowerMaxdemandDetEntity;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年05月07日
+ */
+public interface PowerMaxdemandDetService {
+
+    void add(PowerMaxdemandDetEntity entity);
+}
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/PowerMaxdemandMainService.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/PowerMaxdemandMainService.java
new file mode 100644
index 0000000..c7f38c3
--- /dev/null
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/PowerMaxdemandMainService.java
@@ -0,0 +1,18 @@
+package com.iailab.module.ansteel.power.service;
+
+import com.iailab.module.ansteel.power.entity.PowerMaxdemandMainEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年05月07日
+ */
+public interface PowerMaxdemandMainService {
+
+    String add(PowerMaxdemandMainEntity entity);
+
+    BigDecimal getMax(String code, Date start, Date end);
+}
\ No newline at end of file
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/impl/PowerMaxdemandDetServiceImpl.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/impl/PowerMaxdemandDetServiceImpl.java
new file mode 100644
index 0000000..4ba3704
--- /dev/null
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/impl/PowerMaxdemandDetServiceImpl.java
@@ -0,0 +1,29 @@
+package com.iailab.module.ansteel.power.service.impl;
+
+import com.iailab.module.ansteel.power.dao.PowerMaxdemandDetDao;
+import com.iailab.module.ansteel.power.entity.PowerMaxdemandDetEntity;
+import com.iailab.module.ansteel.power.service.PowerMaxdemandDetService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.UUID;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年05月07日
+ */
+@Slf4j
+@Service
+public class PowerMaxdemandDetServiceImpl implements PowerMaxdemandDetService {
+
+    @Resource
+    private PowerMaxdemandDetDao powerMaxdemandDetDao;
+
+    @Override
+    public void add(PowerMaxdemandDetEntity entity) {
+        entity.setId(UUID.randomUUID().toString());
+        powerMaxdemandDetDao.insert(entity);
+    }
+}
\ No newline at end of file
diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/impl/PowerMaxdemandMainServiceImpl.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/impl/PowerMaxdemandMainServiceImpl.java
new file mode 100644
index 0000000..8bbf620
--- /dev/null
+++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/impl/PowerMaxdemandMainServiceImpl.java
@@ -0,0 +1,57 @@
+package com.iailab.module.ansteel.power.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.iailab.module.ansteel.power.dao.PowerMaxdemandMainDao;
+import com.iailab.module.ansteel.power.entity.PowerMaxdemandMainEntity;
+import com.iailab.module.ansteel.power.service.PowerMaxdemandMainService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2025年05月07日
+ */
+@Slf4j
+@Service
+public class PowerMaxdemandMainServiceImpl implements PowerMaxdemandMainService {
+
+    @Autowired
+    private PowerMaxdemandMainDao powerMaxdemandMainDao;
+
+    @Override
+    public String add(PowerMaxdemandMainEntity entity) {
+        entity.setId(UUID.randomUUID().toString());
+        powerMaxdemandMainDao.insert(entity);
+        return entity.getId();
+    }
+
+    @Override
+    public BigDecimal getMax(String code, Date start, Date end) {
+        BigDecimal max = new BigDecimal(0);
+        QueryWrapper<PowerMaxdemandMainEntity> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("code", code)
+                .ge("occur_time", start)
+                .le("occur_time", end);
+        List<PowerMaxdemandMainEntity> list = powerMaxdemandMainDao.selectList(queryWrapper);
+        if (CollectionUtils.isEmpty(list)) {
+            return max;
+        }
+        List<Double> demandValueList = list.stream().map(item -> {
+            return item.getMaxDemand().doubleValue();
+        }).collect(Collectors.toList());
+
+        max = new BigDecimal(demandValueList.stream().max(Double::compareTo).get());
+        log.info("max : {}", max);
+        return max;
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3