鞍钢鲅鱼圈能源管控系统后端代码
潘志宝
2025-06-16 c20395fa858a7ab7274234d7c7b00ff4daf20084
电网拓扑功率导出(功率日累计)
已修改5个文件
已添加2个文件
340 ■■■■ 文件已修改
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/PowerController.java 258 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerFactorExcelDTO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerFactorExcelReqDTO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerNetFactorQuery.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/common/utils/PowerUtil.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunOnPowerOptimTask.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/鞍钢数据接口文档_master.doc 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/PowerController.java
@@ -13,7 +13,6 @@
import com.iailab.module.ansteel.api.vo.PowerMaxDemandMainPageReqVO;
import com.iailab.module.ansteel.common.constant.CommonConstant;
import com.iailab.module.ansteel.common.enums.ProcessConfDataTypeEnum;
import com.iailab.module.ansteel.common.enums.TransferTypeEnum;
import com.iailab.module.ansteel.common.utils.DecimalUtil;
import com.iailab.module.ansteel.common.utils.PowerUtil;
import com.iailab.module.ansteel.power.entity.*;
@@ -27,19 +26,15 @@
import com.iailab.module.model.api.mcs.dto.PredictLastValueReqVO;
import com.iailab.module.model.api.mdk.MdkApi;
import com.iailab.module.model.api.mdk.dto.MdkScheduleReqDTO;
import com.iailab.module.model.api.mdk.dto.MdkScheduleRespDTO;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.iailab.framework.common.pojo.CommonResult.error;
@@ -115,10 +110,10 @@
    public static final String TIME = "time";
    private String pointNo = "F0000201825";
    //private String pointNo = "F0000201825";
    @GetMapping("/net-factor/list")
    @Operation(summary = "功率因数-电网拓扑")
    @Operation(summary = "功率因数-电网拓扑列表")
    public CommonResult<List<PowerNetFactorDTO>> getPowerNetFactorList(@RequestParam Map<String, Object> params) {
        log.info("功率因数电网拓扑");
        List<PowerNetFactorDTO> result = new ArrayList<>();
@@ -352,7 +347,7 @@
            Map<String, Object> pointsRealValue = dataPointApi.queryPointsRealValue(points);
            if (pointsRealValue.get(entity.getCurQ()) != null) {
                BigDecimal curQ = new BigDecimal(pointsRealValue.get(entity.getCurQ()).toString());
                if (curQ.compareTo(BigDecimal.ZERO) == entity.getCurFlag()) {
                if (entity.getCurFlag() != null && curQ.compareTo(BigDecimal.ZERO) == entity.getCurFlag()) {
                    message = entity.getNodeName() + "发生无功返送;";
                }
            }
@@ -844,6 +839,106 @@
        return success(result);
    }
    @PostMapping("/net-factor/export-day")
    @Operation(summary = "功率因数-电网拓扑功率导出(功率日累计)")
    public CommonResult<List<PowerFactorExcelDTO>> getPowerFactorExcel(@RequestBody PowerFactorExcelReqDTO dto) {
        List<PowerFactorExcelDTO> result = new ArrayList<>();
        if (dto.getStartTime() == null) {
            dto.setStartTime(new Date());
        }
        if (dto.getEndTime() == null) {
            dto.setEndTime(new Date());
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dto.getStartTime());
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        Date startTime = calendar.getTime();
        calendar.setTime(dto.getEndTime());
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        Date endTime = calendar.getTime();
        String pointNo = "=";
        String[] pointNoArr = new String[2];
        String queryType = dto.getQueryType();
        PowerNetFactorEntity powerNetFactorEntity = powerNetFactorService.getByNodeCode(dto.getNodeCode());
        Calendar curDay = Calendar.getInstance();
        curDay.setTime(startTime);
        do {
            PowerFactorExcelDTO excelDTO = new PowerFactorExcelDTO();
            switch (queryType.toUpperCase()) {
                case "P":
                    pointNo = powerNetFactorEntity.getCurP();
                    break;
                case "Q":
                    pointNo = powerNetFactorEntity.getCurQ();
                    break;
                default:
                    return success(result);
            }
            if (StringUtils.isEmpty(pointNo)) {
                return success(result);
            }
            List<Double> valueList = new ArrayList<>();
            ApiPointValueQueryDTO apiPointValueQueryDTO = new ApiPointValueQueryDTO();
            apiPointValueQueryDTO.setPointNo(pointNo);
            apiPointValueQueryDTO.setStart(curDay.getTime());
            curDay.add(Calendar.DAY_OF_YEAR, 1);
            apiPointValueQueryDTO.setEnd(curDay.getTime());
            List<ApiPointValueDTO> chartData = dataPointApi.queryPointHistoryValue(apiPointValueQueryDTO);
            for (ApiPointValueDTO pv : chartData) {
                Object[] data = new Object[2];
                data[0] = DateUtils.format(pv.getT(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
                data[1] = pv.getV();
                valueList.add(pv.getV());
            }
            double day = 0;
            double max = 0;
            double min = 0;
            double avg = 0;
            double fsl = 0;
            if (!CollectionUtils.isEmpty(valueList)) {
                day = valueList.stream().mapToDouble(Double::doubleValue).sum();
                max = valueList.stream().mapToDouble(Double::doubleValue).max().getAsDouble();
                min = valueList.stream().mapToDouble(Double::doubleValue).min().getAsDouble();
                avg = valueList.stream().mapToDouble(Double::doubleValue).average().getAsDouble();
                if (powerNetFactorEntity.getCurFlag() != null && powerNetFactorEntity.getCurFlag().intValue() != 0) {
                    for ( Double val : valueList) {
                        if (new BigDecimal(val).compareTo(BigDecimal.ZERO) != powerNetFactorEntity.getCurFlag()) {
                            // 未发生返送
                            continue;
                        }
                        fsl += val;
                    }
                }
            }
            excelDTO.setDay(new BigDecimal(day).setScale(2, BigDecimal.ROUND_HALF_UP));
            excelDTO.setMax(new BigDecimal(max).setScale(2, BigDecimal.ROUND_HALF_UP));
            excelDTO.setMin(new BigDecimal(min).setScale(2, BigDecimal.ROUND_HALF_UP));
            excelDTO.setAvg(new BigDecimal(avg).setScale(2, BigDecimal.ROUND_HALF_UP));
            // 当查询为P, Q,且有返送flag时 计算 返送累计
            if (("P".equals(queryType.toUpperCase()) || "Q".equals(queryType.toUpperCase())) &&
                    powerNetFactorEntity.getCurFlag() != null &&
                    powerNetFactorEntity.getCurFlag().intValue() != 0) {
                excelDTO.setFsl(new BigDecimal(fsl).setScale(2, BigDecimal.ROUND_HALF_UP));
            }
            excelDTO.setDate(DateUtils.format(apiPointValueQueryDTO.getStart()));
        } while (curDay.getTime().getTime() <= endTime.getTime());
        return success(result);
    }
    @PostMapping("/net-factor/history")
    @Operation(summary = "功率因数-电网拓扑功率历史")
    public CommonResult<PowerHistoryDTO> getPowerHistoryData(@RequestBody PowerNetFactorHisReqDTO dto) {
@@ -872,6 +967,7 @@
        log.info("开始查询,");
        ApiPointValueQueryDTO apiPointValueQueryDTO = new ApiPointValueQueryDTO();
        String pointNo = "";
        String[] pointNoArr = new String[2];
        switch (queryType.toUpperCase()) {
            case "P":
                pointNo = powerNetFactorQuery.getCurP();
@@ -882,11 +978,22 @@
            case "COS":
                pointNo = powerNetFactorQuery.getCurCos();
                break;
            case "DAYCOS":
                pointNoArr[0] = powerNetFactorEntity.getPDay();
                pointNoArr[1] = powerNetFactorEntity.getQDay();
                break;
            case "MONTHCOS":
                pointNoArr[0] = powerNetFactorEntity.getPMon();
                pointNoArr[1] = powerNetFactorEntity.getQMon();
                break;
            default:
                break;
        }
        //查询图表
        apiPointValueQueryDTO.setPointNo(pointNo);
        List<Object[]> dataList = new ArrayList<>();
        Calendar calendar0 = Calendar.getInstance();
        calendar0.set(Calendar.MILLISECOND, 0);
        calendar0.set(Calendar.SECOND, 0);
@@ -895,16 +1002,42 @@
        Date start = dto.getStartTime() == null ? calendar0.getTime() : dto.getStartTime();
        apiPointValueQueryDTO.setEnd(end);
        apiPointValueQueryDTO.setStart(start);
        List<ApiPointValueDTO> chartData = dataPointApi.queryPointHistoryValue(apiPointValueQueryDTO);
        List<Object[]> dataList = new ArrayList<>();
        for (ApiPointValueDTO pv : chartData) {
            Object[] data = new Object[2];
            data[0] = DateUtils.format(pv.getT(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
            data[1] = pv.getV();
            dataList.add(data);
        }
        List<String> categories = DateUtils.getTimeScale(start, end, 60);
        result.setCategories(categories);
        if (StringUtils.isNotBlank(pointNo)) {
            apiPointValueQueryDTO.setPointNo(pointNo);
            List<ApiPointValueDTO> chartData = dataPointApi.queryPointHistoryValue(apiPointValueQueryDTO);
            for (ApiPointValueDTO pv : chartData) {
                Object[] data = new Object[2];
                data[0] = DateUtils.format(pv.getT(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
                data[1] = pv.getV();
                dataList.add(data);
            }
        } else if (StringUtils.isNotBlank(pointNoArr[0]) && StringUtils.isNotBlank(pointNoArr[1])) {
            apiPointValueQueryDTO.setPointNo(pointNoArr[0]);
            List<ApiPointValueDTO> chartDataP = dataPointApi.queryPointHistoryValue(apiPointValueQueryDTO);
            Map<String, Double> dataMapP = new HashMap<>();
            for (ApiPointValueDTO pv : chartDataP) {
                dataMapP.put(DateUtils.format(pv.getT(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND), pv.getV());
            }
            apiPointValueQueryDTO.setPointNo(pointNoArr[1]);
            List<ApiPointValueDTO> chartDataQ = dataPointApi.queryPointHistoryValue(apiPointValueQueryDTO);
            Map<String, Double> dataMapQ = new HashMap<>();
            for (ApiPointValueDTO pv : chartDataQ) {
                dataMapQ.put(DateUtils.format(pv.getT(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND), pv.getV());
            }
            for (String cate : categories) {
                Object[] data = new Object[2];
                data[0] = cate;
                data[1] = PowerUtil.calculateCos(dataMapP.get(cate), dataMapQ.get(cate));
                dataList.add(data);
            }
        }
        result.setDataList(dataList);
        //查询月最大最小值
@@ -969,6 +1102,7 @@
            log.info("开始查询,");
            ApiPointValueQueryDTO apiPointValueQueryDTO = new ApiPointValueQueryDTO();
            String pointNo = "";
            String[] pointNoArr = new String[2];
            switch (queryType.toUpperCase()) {
                case "P":
                    pointNo = powerNetFactorQuery.getCurP();
@@ -979,60 +1113,70 @@
                case "COS":
                    pointNo = powerNetFactorQuery.getCurCos();
                    break;
                case "DAYCOS":
                    pointNoArr[0] = powerNetFactorEntity.getPDay();
                    pointNoArr[1] = powerNetFactorEntity.getQDay();
                    break;
                case "MONTHCOS":
                    pointNoArr[0] = powerNetFactorEntity.getPMon();
                    pointNoArr[1] = powerNetFactorEntity.getQMon();
                    break;
                default:
                    break;
            }
            //查询图表
            apiPointValueQueryDTO.setPointNo(pointNo);
            apiPointValueQueryDTO.setEnd(end0);
            apiPointValueQueryDTO.setStart(start0);
            List<ApiPointValueDTO> chartData = dataPointApi.queryPointHistoryValue(apiPointValueQueryDTO);
            List<Object[]> dataList = new ArrayList<>();
            List<Double> valueList = new ArrayList<>();
            for (ApiPointValueDTO pv : chartData) {
                Object[] data = new Object[2];
                data[0] = DateUtils.format(pv.getT(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
                data[1] = pv.getV();
                dataList.add(data);
                valueList.add(pv.getV());
            }
            powerHistoryDTO.setDataList(dataList);
            //查询月最大最小值
            /*ApiPointValueQueryDTO apiPointValueQueryDTO1 = new ApiPointValueQueryDTO();
            apiPointValueQueryDTO1.setStart(start1);
            apiPointValueQueryDTO1.setEnd(new Date());
            apiPointValueQueryDTO1.setPointNo(pointNo);
            Map<String, Object> maxV = dataPointApi.queryPointMaxValueRange(apiPointValueQueryDTO1);
            Map<String, Object> minV = dataPointApi.queryPointMaxValueRange(apiPointValueQueryDTO1);
            if (maxV != null && maxV.containsKey(pointNo)) {
                powerHistoryDTO.setMax(new BigDecimal(maxV.get(pointNo).toString()));
            }
            if (minV != null && minV.containsKey(pointNo)) {
                powerHistoryDTO.setMin(new BigDecimal(minV.get(pointNo).toString()));
            }*/
            if (StringUtils.isNotBlank(pointNo)) {
                List<Double> valueList = new ArrayList<>();
                apiPointValueQueryDTO.setPointNo(pointNo);
                List<ApiPointValueDTO> chartData = dataPointApi.queryPointHistoryValue(apiPointValueQueryDTO);
                for (ApiPointValueDTO pv : chartData) {
                    Object[] data = new Object[2];
                    data[0] = DateUtils.format(pv.getT(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
                    data[1] = pv.getV();
                    dataList.add(data);
                    valueList.add(pv.getV());
                }
            double fsl = 0;
            double max = 0;
            double min = 0;
            double avg = 0;
            if (!CollectionUtils.isEmpty(valueList)) {
                max = valueList.stream().mapToDouble(Double::doubleValue).max().getAsDouble();
                min = valueList.stream().mapToDouble(Double::doubleValue).min().getAsDouble();
                avg = valueList.stream().mapToDouble(Double::doubleValue).average().getAsDouble();
                double fsl = 0;
                double max = 0;
                double min = 0;
                double avg = 0;
                if (!CollectionUtils.isEmpty(valueList)) {
                    max = valueList.stream().mapToDouble(Double::doubleValue).max().getAsDouble();
                    min = valueList.stream().mapToDouble(Double::doubleValue).min().getAsDouble();
                    avg = valueList.stream().mapToDouble(Double::doubleValue).average().getAsDouble();
                for (Double val : valueList) {
                    if (val < 0) {
                        fsl += val;
                    if (powerNetFactorQuery.getCurFlag() != null && powerNetFactorQuery.getCurFlag().intValue() != 0) {
                        for ( Double val : valueList) {
                            if (new BigDecimal(val).compareTo(BigDecimal.ZERO) != powerNetFactorQuery.getCurFlag()) {
                                // 未发生返送
                                continue;
                            }
                            fsl += val;
                        }
                    }
                }
            }
            powerHistoryDTO.setFsl(new BigDecimal(fsl).setScale(2, BigDecimal.ROUND_HALF_UP));
            powerHistoryDTO.setMax(new BigDecimal(max).setScale(2, BigDecimal.ROUND_HALF_UP));
            powerHistoryDTO.setMin(new BigDecimal(min).setScale(2, BigDecimal.ROUND_HALF_UP));
            powerHistoryDTO.setAvg(new BigDecimal(avg).setScale(2, BigDecimal.ROUND_HALF_UP));
                powerHistoryDTO.setMax(new BigDecimal(max).setScale(2, BigDecimal.ROUND_HALF_UP));
                powerHistoryDTO.setMin(new BigDecimal(min).setScale(2, BigDecimal.ROUND_HALF_UP));
                powerHistoryDTO.setAvg(new BigDecimal(avg).setScale(2, BigDecimal.ROUND_HALF_UP));
                // 当查询为P, Q,且有返送flag时 计算 返送累计
                if (("P".equals(queryType.toUpperCase()) || "Q".equals(queryType.toUpperCase())) &&
                        powerNetFactorQuery.getCurFlag() != null &&
                        powerNetFactorQuery.getCurFlag().intValue() != 0) {
                    powerHistoryDTO.setFsl(new BigDecimal(fsl).setScale(2, BigDecimal.ROUND_HALF_UP));
                }
            } else if (StringUtils.isNotBlank(pointNoArr[0]) && StringUtils.isNotBlank(pointNoArr[1])) {
            }
            powerHistoryDTO.setDataList(dataList);
            result.put(nodeCode, powerHistoryDTO);
        }
        return success(result);
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerFactorExcelDTO.java
对比新文件
@@ -0,0 +1,38 @@
package com.iailab.module.ansteel.api.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * 功率因数导出
 *
 * @author PanZhibao
 * @Description
 * @createTime 2025年06月16日
 */
@Data
public class PowerFactorExcelDTO implements Serializable {
    private static final long serialVersionUID = 1L;
    @Schema(description = "日累计")
    private BigDecimal day;
    @Schema(description = "最大值")
    private BigDecimal max;
    @Schema(description = "最小值")
    private BigDecimal min;
    @Schema(description = "平均值")
    private BigDecimal avg;
    @Schema(description = "返送累计")
    private BigDecimal fsl;
    @Schema(description = "日期")
    private String date;
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerFactorExcelReqDTO.java
对比新文件
@@ -0,0 +1,27 @@
package com.iailab.module.ansteel.api.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * @author PanZhibao
 * @Description
 * @createTime 2025年06月16日
 */
@Data
public class PowerFactorExcelReqDTO implements Serializable {
    private static final long serialVersionUID = 1L;
    private String nodeCode;
    private String queryType;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date startTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date endTime;
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerNetFactorQuery.java
@@ -17,10 +17,12 @@
     * 当前有功
     */
    private String curP;
    /**
     * 当前无功
     */
    private String curQ;
    /**
     * 当前功率因数
     */
@@ -30,4 +32,9 @@
     * 当前需量
     */
    private String curDem;
    /**
     * 无功返送判断条件
     */
    private Integer curFlag;
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/common/utils/PowerUtil.java
@@ -14,7 +14,11 @@
    /**
     * 计算功率因数 p /(根号:p²+Q²)
     **/
    public static Double calculateCos(double PValue, double QValue) {
    public static Double calculateCos(Double PValue, Double QValue) {
        if (PValue == null || QValue == null) {
            return null;
        }
        // 绝对值
        PValue = Math.abs(PValue);
        QValue = Math.abs(QValue);
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunOnPowerOptimTask.java
@@ -46,6 +46,8 @@
    @Autowired
    private McsApi mcsApi;
    private final static double LIM = -20d;
    private final static String POINT_NO = "C0000201107";
    @Override
@@ -69,7 +71,7 @@
                flag = false;
            }
            for (ApiPointValueDTO apiPointValueDTO : valueList) {
                if (apiPointValueDTO.getV() < 0) {
                if (apiPointValueDTO.getV() < LIM) {
                    flag = false;
                    break;
                }
doc/鞍钢数据接口文档_master.doc
Binary files differ