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