鞍钢鲅鱼圈能源管控系统后端代码
56c701ab19eb16ebf2f75bdd42b4ea9da1c2a733..7df4fcb8c640fefac7bdd406cbd10ebb5e8388b9
昨天 liriming
功率因数超限报警原因溯源修改
7df4fc 对比 | 目录
昨天 liriming
功率因数超限报警原因溯源修改
e18159 对比 | 目录
昨天 liriming
Merge remote-tracking branch 'origin/master'
2debc3 对比 | 目录
昨天 liriming
无功上网与功率因数定时任务
cb3da9 对比 | 目录
昨天 潘志宝
预测回收消耗总量
a34ac2 对比 | 目录
昨天 潘志宝
Merge remote-tracking branch 'origin/master'
92c4c3 对比 | 目录
昨天 潘志宝
获取转炉煤气回收消耗总量
3e0c6b 对比 | 目录
昨天 潘志宝
获取转炉煤气回收消耗总量
7b5768 对比 | 目录
昨天 dengzedong
电力产生 焦化炼焦管控模型 建议保存
243cd9 对比 | 目录
昨天 潘志宝
需求分析
1a4dd2 对比 | 目录
昨天 潘志宝
Merge remote-tracking branch 'origin/master'
3cffa5 对比 | 目录
昨天 潘志宝
详细设计
e1e477 对比 | 目录
昨天 liriming
Merge remote-tracking branch 'origin/master'
8dd63b 对比 | 目录
昨天 liriming
干熄焦溯源新增折线图
de7613 对比 | 目录
昨天 潘志宝
接口设计
bfedda 对比 | 目录
昨天 潘志宝
Merge remote-tracking branch 'origin/master'
85acbc 对比 | 目录
昨天 潘志宝
接口设计
94180c 对比 | 目录
2 天以前 dengzedong
Merge remote-tracking branch 'origin/master'
a62b1e 对比 | 目录
2 天以前 dengzedong
焦炉煤气柜柜位 焦炉煤气富余量
fab65d 对比 | 目录
2 天以前 潘志宝
Merge remote-tracking branch 'origin/master'
adb373 对比 | 目录
2 天以前 潘志宝
接口设计
9a578e 对比 | 目录
2 天以前 dengzedong
焦炉煤气柜柜位 焦炉煤气富余量
1cf6ce 对比 | 目录
2 天以前 dengzedong
煤气建议 调整速率bug
1e71a0 对比 | 目录
2 天以前 dengzedong
煤气建议 调整速率
a6512e 对比 | 目录
已修改13个文件
已添加2个文件
493 ■■■■ 文件已修改
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/GasController.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/GasLdgCulRespDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/dto/CokingOverviewDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingOverviewEntity.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/impl/CokingOverviewServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/common/enums/SubProcessTypeEnum.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelGXJTask.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunDayScheduleModuleTask.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPowerFactorAlarmTask.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPowerNetAlarmTask.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunScheduleModuleTask.java 229 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/设计文档/鲅鱼圈钢铁分公司能源管控智能化提升项目-接口设计说明书(模版).doc 补丁 | 查看 | 原始文档 | blame | 历史
doc/设计文档/鲅鱼圈钢铁分公司能源管控智能化提升项目-详细设计说明书(模版).doc 补丁 | 查看 | 原始文档 | blame | 历史
doc/设计文档/鲅鱼圈钢铁分公司能源管控智能化提升项目-需求分析说明书(模版).docx 补丁 | 查看 | 原始文档 | blame | 历史
doc/鞍钢数据接口文档_master.doc 补丁 | 查看 | 原始文档 | blame | 历史
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/GasController.java
@@ -1,19 +1,25 @@
package com.iailab.module.ansteel.api.controller.admin;
import com.iailab.framework.common.pojo.CommonResult;
import com.iailab.module.ansteel.api.dto.PowerNetFactorDTO;
import com.iailab.framework.common.util.date.DateUtils;
import com.iailab.module.ansteel.api.dto.GasLdgCulRespDTO;
import com.iailab.module.ansteel.api.dto.PreDataViewSimpleDTO;
import com.iailab.module.ansteel.gas.entity.GasPredConfEntity;
import com.iailab.module.ansteel.gas.service.GasPredConfService;
import com.iailab.module.ansteel.power.entity.PowerNetFactorEntity;
import com.iailab.module.ansteel.page.service.PageParamService;
import com.iailab.module.model.api.mcs.McsApi;
import com.iailab.module.model.api.mcs.dto.PreDataJsonReqVO;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -32,9 +38,66 @@
    @Autowired
    private GasPredConfService gasPredConfService;
    @Autowired
    private PageParamService pageParamService;
    @Autowired
    private McsApi mcsApi;
    @GetMapping("/pred-conf/list")
    @Operation(summary = "煤气预测配置")
    public CommonResult<List<PreDataViewSimpleDTO>> getGasPredConfList(@RequestParam Map<String, Object> params) {
        return CommonResult.success(gasPredConfService.list(params));
    }
    @GetMapping("/ldg/cul")
    @Operation(summary = "获取转炉煤气回收消耗总量")
    public CommonResult<GasLdgCulRespDTO> getGasLdgCul(@RequestParam Map<String, Object> params) {
        GasLdgCulRespDTO result = new GasLdgCulRespDTO();
        String type = (String) params.get("type");
        String predictTime = (String) params.get("predictTime");
        if (StringUtils.isBlank(type) || StringUtils.isBlank(predictTime)) {
            return CommonResult.success(result);
        }
        PreDataJsonReqVO reqVO = new PreDataJsonReqVO();
        reqVO.setPredictTime(DateUtils.parse(predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
        List<String> outputIdList = new ArrayList<>();
        String xhOut = pageParamService.getValue("iLDG_XH_" + type);
        if (StringUtils.isNotBlank(xhOut)) {
            outputIdList.add(xhOut);
        }
        String hsOut = pageParamService.getValue("iLDG_HS_" + type);
        if (StringUtils.isNotBlank(hsOut)) {
            outputIdList.add(hsOut);
        }
        reqVO.setOutputIdList(outputIdList);
        if (CollectionUtils.isEmpty(outputIdList)) {
            return CommonResult.success(result);
        }
        log.info("getPreDataCur,reqVO={}", reqVO);
        Map<String, List<Object[]>> preData = mcsApi.getPreDataCur(reqVO);
        if (CollectionUtils.isEmpty(preData)) {
            return CommonResult.success(result);
        }
        if (preData.containsKey(xhOut)) {
            List<Object[]> data = preData.get(xhOut);
            double total = 0.0;
            for (int i = 0; i < data.size(); i++) {
                Object[] obj = data.get(i);
                total = total + new BigDecimal(obj[1].toString()).doubleValue();
            }
            result.setXh(new BigDecimal(total).divide(new BigDecimal(60), 2, BigDecimal.ROUND_HALF_UP));
        }
        if (preData.containsKey(hsOut)) {
            List<Object[]> data = preData.get(hsOut);
            double total = 0.0;
            for (int i = 0; i < data.size(); i++) {
                Object[] obj = data.get(i);
                total = total + new BigDecimal(obj[1].toString()).doubleValue();
            }
            result.setHs(new BigDecimal(total).divide(new BigDecimal(60), 2, BigDecimal.ROUND_HALF_UP));
        }
        return CommonResult.success(result);
    }
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/GasLdgCulRespDTO.java
对比新文件
@@ -0,0 +1,24 @@
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月26日
 */
@Schema(description = "转炉煤气回收消耗总量")
@Data
public class GasLdgCulRespDTO implements Serializable {
    private static final long serialVersionUID = 1L;
    @Schema(description = "消耗总量")
    private BigDecimal xh;
    @Schema(description = "回收总量")
    private BigDecimal hs;
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/dto/CokingOverviewDTO.java
@@ -73,6 +73,10 @@
     */
    private BigDecimal powerC;
    /**
     * 电力产生
     */
    private BigDecimal powerP;
    /**
     * 电力单耗
     */
    private BigDecimal powerOnlyC;
ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/entity/CokingOverviewEntity.java
@@ -67,6 +67,10 @@
     */
    private BigDecimal powerC;
    /**
     * 电力产生
     */
    private BigDecimal powerP;
    /**
     * 电力单耗
     */
    private BigDecimal powerOnlyC;
ansteel-biz/src/main/java/com/iailab/module/ansteel/coking/service/impl/CokingOverviewServiceImpl.java
@@ -72,7 +72,7 @@
        QueryWrapper<CokingOverviewEntity> queryWrapperMonth = new QueryWrapper<>();
        queryWrapperMonth.eq("process_type", processType);
        queryWrapperMonth.between("clock", monthStartClock,clock);
        queryWrapperMonth.select("sub_process_type","ROUND(AVG(steam_p)*30, 2) as steam_p","ROUND(AVG(dj_steam_p)*30, 2) as dj_steam_p","ROUND(AVG(steam_c)*30, 2) as steam_c","ROUND(AVG(steam_only_c)*30, 2) as steam_only_c","ROUND(AVG(steam_v)*30, 2) as steam_v","ROUND(AVG(gas_p)*30, 2) as gas_p","ROUND(AVG(gas_c)*30, 2) as gas_c","ROUND(AVG(power_c)*30, 2) as power_c","ROUND(AVG(power_only_c)*30, 2) as power_only_c","ROUND(AVG(power_c_standard)*30, 2) as power_c_standard","ROUND(AVG(idle_time)*30, 0) as idle_time","ROUND(AVG(bfg_c)*30, 2) as bfg_c","ROUND(AVG(cog_p)*30, 2) as cog_p","ROUND(AVG(cog_c)*30, 2) as cog_c","ROUND(AVG(bfg_only_c)*30, 2) as bfg_only_c","ROUND(AVG(cog_only_c)*30, 2) as cog_only_c","ROUND(AVG(gxls)*30, 0) as gxls","ROUND(AVG(run_time)*30, 0) as run_time","ROUND(AVG(work_ratio), 2) as work_ratio")
        queryWrapperMonth.select("sub_process_type","ROUND(AVG(steam_p)*30, 2) as steam_p","ROUND(AVG(dj_steam_p)*30, 2) as dj_steam_p","ROUND(AVG(steam_c)*30, 2) as steam_c","ROUND(AVG(steam_only_c)*30, 2) as steam_only_c","ROUND(AVG(steam_v)*30, 2) as steam_v","ROUND(AVG(gas_p)*30, 2) as gas_p","ROUND(AVG(gas_c)*30, 2) as gas_c","ROUND(AVG(power_c)*30, 2) as power_c","ROUND(AVG(power_p)*30, 2) as power_p","ROUND(AVG(power_only_c)*30, 2) as power_only_c","ROUND(AVG(power_c_standard)*30, 2) as power_c_standard","ROUND(AVG(idle_time)*30, 0) as idle_time","ROUND(AVG(bfg_c)*30, 2) as bfg_c","ROUND(AVG(cog_p)*30, 2) as cog_p","ROUND(AVG(cog_c)*30, 2) as cog_c","ROUND(AVG(bfg_only_c)*30, 2) as bfg_only_c","ROUND(AVG(cog_only_c)*30, 2) as cog_only_c","ROUND(AVG(gxls)*30, 0) as gxls","ROUND(AVG(run_time)*30, 0) as run_time","ROUND(AVG(work_ratio), 2) as work_ratio")
                .groupBy("sub_process_type");
        List<CokingOverviewEntity> monthList = cokingOverviewDao.selectList(queryWrapperMonth);
ansteel-biz/src/main/java/com/iailab/module/ansteel/common/enums/SubProcessTypeEnum.java
@@ -29,6 +29,8 @@
    GXJ_1("GXJ_1", "1#干熄焦"),
    GXJ_2("GXJ_2", "2#干熄焦"),
    GXJ_3("GXJ_3", "3#干熄焦"),
    MW_15_1("MW_15_1", "1#15MW机组"),
    MW_15_2("MW_15_2", "2#15MW机组"),
    BMGX("BMGX", "备煤工序"),
    JLLQ("JLLQ", "焦炉炉区"),
    GXJ("GXJ", "干熄焦"),
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunCokingTraceModelGXJTask.java
@@ -62,6 +62,9 @@
    private final static String SugObj = "GXJ";
    @Autowired
    private CokingTraceChartService cokingTraceChartService;
    private static final String jsonStr = "{\"result\":{" +
            " \"steamProd\":[[0.76,0.76],[07,0.72],[0.74,0.68]]," +
            "\"steamRow0\":[[14.0,20.7],[14.0,30.5],[14.0,35.2],[24.0,67.9],[6.0,12.3]]," +
@@ -133,6 +136,9 @@
            // 保存溯源指标
            cokingTraceIndService.saveTraceInd(relId, indType, clock, collectStartDate, endDate);
            // 保存溯源折线图
            cokingTraceChartService.save(relId, clock, indType, startDate, endDate);
        } catch (Exception ex) {
            logger.error("RunCokingTraceModelGXJTask运行异常");
            ex.printStackTrace();
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunDayScheduleModuleTask.java
@@ -1,7 +1,5 @@
package com.iailab.module.ansteel.job.task;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.iailab.module.model.api.mcs.McsApi;
import com.iailab.module.model.api.mcs.dto.ScheduleSuggestRespDTO;
import com.iailab.module.model.api.mdk.MdkApi;
@@ -13,10 +11,8 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
 * 执行天粒度调度方案定时任务
@@ -28,11 +24,15 @@
    private String AnStellCOAL = "AnStellCOAL"; //焦化备煤管控
    private String AnSteelCDQTrackImplv3 = "AnSteelCDQTrackImplv3"; //焦化干熄焦产蒸汽模型
    private String AnSteelChemProSteamTrack = "AnSteelChemProSteamTrack"; //焦化化产蒸汽消耗模型
    private String lianjiaoguankong = "lianjiaoguankong"; //焦化炼焦管控模型
    @Autowired
    private MdkApi mdkApi;
    @Autowired
    private McsApi mcsApi;
    private final String finalResultStrKey = "finalResultStr";
    private final String resultListKey = "resultList";
    @Override
@@ -82,9 +82,9 @@
                    mcsApi.createScheduleSuggest(suggestDto);
                }
            }
            //干熄焦产蒸汽 建议保存
            //焦化干熄焦产蒸汽模型 建议保存
            if (AnSteelCDQTrackImplv3.equals(code)) {
                Object finalResultStr =  mdkScheduleRespDTO.getResult().get("finalResultStr");
                Object finalResultStr =  mdkScheduleRespDTO.getResult().get(finalResultStrKey);
                if(finalResultStr != null && StringUtils.isNotBlank(finalResultStr.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("干熄焦产蒸汽建议");
@@ -95,7 +95,7 @@
                    mcsApi.createScheduleSuggest(suggestDto);
                }
                Object resultList =  mdkScheduleRespDTO.getResult().get("resultList");
                Object resultList =  mdkScheduleRespDTO.getResult().get(resultListKey);
                if(resultList != null && StringUtils.isNotBlank(resultList.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("干熄焦产蒸汽异常溯源");
@@ -106,9 +106,9 @@
                    mcsApi.createScheduleSuggest(suggestDto);
                }
            }
            //化产蒸汽消耗 建议保存
            //焦化化产蒸汽消耗模型 建议保存
            if (AnSteelChemProSteamTrack.equals(code)) {
                Object finalResultStr =  mdkScheduleRespDTO.getResult().get("finalResultStr");
                Object finalResultStr =  mdkScheduleRespDTO.getResult().get(finalResultStrKey);
                if(finalResultStr != null && StringUtils.isNotBlank(finalResultStr.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("化产蒸汽消耗建议");
@@ -119,7 +119,7 @@
                    mcsApi.createScheduleSuggest(suggestDto);
                }
                Object resultList =  mdkScheduleRespDTO.getResult().get("resultList");
                Object resultList =  mdkScheduleRespDTO.getResult().get(resultListKey);
                if(resultList != null && StringUtils.isNotBlank(resultList.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("化产蒸汽消耗异常溯源");
@@ -130,6 +130,30 @@
                    mcsApi.createScheduleSuggest(suggestDto);
                }
            }
            //焦化炼焦管控模型 建议保存
            if (lianjiaoguankong.equals(code)) {
                Object finalResultStr =  mdkScheduleRespDTO.getResult().get(finalResultStrKey);
                if(finalResultStr != null && StringUtils.isNotBlank(finalResultStr.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("炼焦管控建议");
                    suggestDto.setContent(finalResultStr.toString());
                    suggestDto.setScheduleObj("LJGK");
                    suggestDto.setScheduleTime(dto.getScheduleTime());
                    suggestDto.setCreateTime(new Date());
                    mcsApi.createScheduleSuggest(suggestDto);
                }
                Object resultList =  mdkScheduleRespDTO.getResult().get(resultListKey);
                if(resultList != null && StringUtils.isNotBlank(resultList.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("炼焦管控异常溯源");
                    suggestDto.setContent(resultList.toString());
                    suggestDto.setScheduleObj("LJGK_YCSY");
                    suggestDto.setScheduleTime(dto.getScheduleTime());
                    suggestDto.setCreateTime(new Date());
                    mcsApi.createScheduleSuggest(suggestDto);
                }
            }
        } catch (Exception ex) {
            logger.error("runDayScheduleModuleTask运行异常",ex);
        }
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPowerFactorAlarmTask.java
对比新文件
@@ -0,0 +1,105 @@
package com.iailab.module.ansteel.job.task;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.iailab.module.ansteel.common.constant.CommonConstant;
import com.iailab.module.model.api.mcs.McsApi;
import com.iailab.module.model.api.mcs.dto.AlarmMessageRespDTO;
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 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 java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
/**
 * @author lirm
 * @Description 功率因数超限报警原因溯源
 * @createTime 2025年06月26日
 */
@Component("runPowerFactorAlarmTask")
public class RunPowerFactorAlarmTask implements ITask {
    private Logger logger = LoggerFactory.getLogger(getClass());
    private final static String ALARM_OBJ = "AnSteelPowerFactorAlarm";
    private final static String substation = "substation";
    @Autowired
    private McsApi mcsApi;
    @Autowired
    private MdkApi mdkApi;
    @Override
    public void run(String params) {
        /*{'status_code': 100, 'result': {
         'substation2': {'66kVOverLimit': '焦化乙线功率因数下限越限', 'reason': '["煤气净化2#低于下限", "备煤2#低于下限", "大间台2#低于下限", "焦化总降#2电容器408分钟 退运", "焦化总降#2电容器1150分钟 投运", "备煤筛焦综合电气室Ⅱ段电容补偿14分钟 退运", "备煤筛焦综合电气室Ⅱ段电容补偿452分钟 投运", "备煤筛焦综合电气室Ⅱ段电容补偿570分钟 退运", "备煤筛焦综合电气室Ⅱ段电容补偿860分钟 投运", "备煤筛焦综合电气室Ⅱ段电容补偿920分钟 退运", "备煤筛焦综合电气室Ⅱ段电容补偿1207分钟 投运", "煤气净化综合电气室Ⅱ段电容补偿697分钟 退运", "煤气净化综合电气室Ⅱ段电容补偿866分钟 投运", "煤气净化综合电气室Ⅱ段电容补偿1430分钟 退运", "大间台综合电气室Ⅱ段电容补偿210分钟 退运", "大间台综合电气室Ⅱ段电容补偿319分钟 投运", "大间台综合电气室Ⅱ段电容补偿441分钟 退运", "大间台综合电气室Ⅱ段电容补偿690分钟 投运", "1#CDQ在第720分钟前后功率因数从0.8变化到0.9", "1#TRT在第720分钟前后功率因数从0.8变化到0.9"]'},
         'substation11': {'66kVOverLimit': '1#炼铁线功率因数下限越限', 'reason': '["1#CDQ在第720分钟前后功率因数从0.8变化到0.9", "1#TRT在第720分钟前后功率因数从0.8变化到0.9"]'},
         'substation12': {'66kVOverLimit': '2#炼铁线功率因数上限越限', 'reason': '["1#CDQ在第720分钟前后功率因数从0.8变化到0.9", "1#TRT在第720分钟前后功率因数从0.8变化到0.9"]'},
         'substation18': {'66kVOverLimit': '范氧甲线功率因数上限越限', 'reason': '["1#CDQ在第720分钟前后功率因数从0.8变化到0.9", "1#TRT在第720分钟前后功率因数从0.8变化到0.9"]'}}}
        */
        logger.info("RunPowerFactorAlarmTask定时任务正在执行,参数为:{}", params);
        try {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.MILLISECOND, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MINUTE, 0);
            MdkScheduleReqDTO dto = new MdkScheduleReqDTO();
            dto.setScheduleTime(calendar.getTime());
            dto.setScheduleCode(ALARM_OBJ);
            MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(dto);
            logger.info(params + "调度方案执行完成," + mdkScheduleRespDTO);
            if(!CommonConstant.MDK_STATUS_100.equals(mdkScheduleRespDTO.getStatusCode())){
                logger.info(params + "运行异常");
                return;
            }
            JSONObject result = new JSONObject(mdkScheduleRespDTO.getResult());
            List<String> rowKeys = new ArrayList<>();
            result.forEach((key, value) -> {
                if (StringUtils.isNotBlank(key) && key.contains(substation)) {
                    rowKeys.add(key);
                }
            });
            for (String key : rowKeys) {
                Map<String,Object> substationMap = BeanUtil.beanToMap(result.get(key));
                if (CollectionUtils.isEmpty(substationMap)) {
                    continue;
                }
                String content = "";
                JSONArray jsonArr = JSON.parseArray(substationMap.get("reason").toString());
                for(int i=0; i<jsonArr.size(); i++){
                    Object element = jsonArr.get(i);
                    content = content + JSON.toJSONString(element) + ";";
                }
                AlarmMessageRespDTO alarmMessageRespDTO = new AlarmMessageRespDTO();
                alarmMessageRespDTO.setTitle(substationMap.get("66kVOverLimit").toString());
                alarmMessageRespDTO.setContent(content);
                alarmMessageRespDTO.setAlarmObj(ALARM_OBJ);
                alarmMessageRespDTO.setAlarmTime(mdkScheduleRespDTO.getScheduleTime());
                alarmMessageRespDTO.setCreateTime(calendar.getTime());
                mcsApi.createAlarmMessage(alarmMessageRespDTO);
            }
        } catch (Exception ex) {
            logger.error("RunPowerFactorAlarmTask运行异常");
            ex.printStackTrace();
        }
        logger.info("RunPowerFactorAlarmTask运行完成");
    }
}
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPowerNetAlarmTask.java
@@ -11,14 +11,14 @@
/**
 * @author PanZhibao
 * @Description
 * @Description 无功上网报警原因溯源
 * @createTime 2025年06月12日
 */
@Component("runPowerNetAlarmTask")
public class RunPowerNetAlarmTask implements ITask {
    private Logger logger = LoggerFactory.getLogger(getClass());
    private final String ALARM_OBJ = "NetAlarm";
    private final String ALARM_OBJ = "AnSteelReactiveAlarm";
    @Autowired
    private McsApi mcsApi;
ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunScheduleModuleTask.java
@@ -16,6 +16,8 @@
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
@@ -30,6 +32,9 @@
    private String BfgCode = "AnSteelbfgstrategy"; //高炉实时调度
    private String suggestionKey = "suggestion"; //建议key
    private String warningKey = "earlywarning"; //预警key
    private String guiweiRate = "guiweiRate"; //柜位上升下降速率key
    private String gas = "gas"; //煤气富余量key
    private String flag = "flag"; //煤气富余量key
    private String cogLowerKey = "lower_limit_ad_cog_guiwei"; //COG下限key
    private String cogUpperKey = "upper_limit_ad_cog_guiwei"; //COG上限key
    private String bfgLowerKey = "lower_limit_ad_bfg_guiwei"; //BFG下限key
@@ -41,6 +46,17 @@
    private McsApi mcsApi;
    @Autowired
    private DataPointApi dataPointApi;
    /**
     * 煤气调度调整方向
     * 1:超上限;-1:超下限;0:正常
     */
    private static Map<String, BigDecimal> gasAdjustMode = new HashMap<>();
    /**
     * 煤气调度建议时间
     */
    private static Map<String, Date> gasLastSugTime = new HashMap<>();
    @Override
@@ -66,43 +82,43 @@
            //日平衡调度建议保存
            if (GasCode.equals(params)) {
                Object time8 =  mdkScheduleRespDTO.getResult().get("Time8");
                Object time8 = mdkScheduleRespDTO.getResult().get("Time8");
                Object time16 = mdkScheduleRespDTO.getResult().get("Time16");
                Object time24 =  mdkScheduleRespDTO.getResult().get("Time24");
                Object time24 = mdkScheduleRespDTO.getResult().get("Time24");
                if(time8!=null && StringUtils.isNotBlank(time8.toString())) {
                if (time8 != null && StringUtils.isNotBlank(time8.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("日平衡建议");
                    suggestDto.setContent(time8.toString());
                    suggestDto.setScheduleObj("GAS");
                    suggestDto.setScheduleTime(dto.getScheduleTime());
                    suggestDto.setCreateTime(calendar.getTime());
                    suggestDto.setCreateTime(new Date());
                    if (mcsApi.createScheduleSuggest(suggestDto)) {
                        logger.info("日平衡建议{" + time8 + "}保存成功");
                    } else {
                        logger.error("日平衡建议保存失败");
                    }
                }
                if(time16!=null && StringUtils.isNotBlank(time16.toString())) {
                if (time16 != null && StringUtils.isNotBlank(time16.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("日平衡建议");
                    suggestDto.setContent(time16.toString());
                    suggestDto.setScheduleObj("GAS");
                    suggestDto.setScheduleTime(dto.getScheduleTime());
                    suggestDto.setCreateTime(calendar.getTime());
                    suggestDto.setCreateTime(new Date());
                    if (mcsApi.createScheduleSuggest(suggestDto)) {
                        logger.info("日平衡建议{" + time16 + "}保存成功");
                    } else {
                        logger.error("日平衡建议保存失败");
                    }
                }
                if(time24!=null && StringUtils.isNotBlank(time24.toString())) {
                if (time24 != null && StringUtils.isNotBlank(time24.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("日平衡建议");
                    suggestDto.setContent(time24.toString());
                    suggestDto.setScheduleObj("GAS");
                    suggestDto.setScheduleTime(dto.getScheduleTime());
                    suggestDto.setCreateTime(calendar.getTime());
                    suggestDto.setCreateTime(new Date());
                    if (mcsApi.createScheduleSuggest(suggestDto)) {
                        logger.info("日平衡建议{" + time24 + "}保存成功");
                    } else {
@@ -112,20 +128,33 @@
            }
            //转炉实时调度
            if (LdgCode.equals(params)) {
                // 建议
                Object suggestion = mdkScheduleRespDTO.getResult().get(suggestionKey);
                if (suggestion != null && StringUtils.isNotBlank(suggestion.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("转炉实时调度建议");
                    suggestDto.setContent(suggestion.toString());
                    suggestDto.setScheduleObj("LDG");
                    suggestDto.setScheduleTime(dto.getScheduleTime());
                    suggestDto.setCreateTime(calendar.getTime());
                    if (mcsApi.createScheduleSuggest(suggestDto)) {
                        logger.info("转炉实时调度建议{" + suggestion + "}保存成功");
                    } else {
                        logger.error("转炉实时调度建议保存失败");
                // 调整速率
                String scheduleObjLDG = "LDG";
                BigDecimal adjustValue = new BigDecimal(mdkScheduleRespDTO.getResult().get(flag).toString());
                if (adjustValue.compareTo(BigDecimal.ZERO) == 0) {
                    logger.info("转炉实时调度建议 flag为0");
                }else if (gasAdjustMode.containsKey(scheduleObjLDG) && gasAdjustMode.get(scheduleObjLDG).equals(adjustValue) &&
                        gasLastSugTime.containsKey(scheduleObjLDG) && (calendar.getTime().getTime() - gasLastSugTime.get(scheduleObjLDG).getTime() <= mdkScheduleRespDTO.getAdjustRate().longValue() * 60 * 1000)) {
                    logger.info("转炉实时调度建议在有效期内");
                } else {
                    // 建议
                    Object suggestion = mdkScheduleRespDTO.getResult().get(suggestionKey);
                    if (suggestion != null && StringUtils.isNotBlank(suggestion.toString())) {
                        ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                        suggestDto.setTitle("转炉实时调度建议");
                        suggestDto.setContent(suggestion.toString());
                        suggestDto.setScheduleObj(scheduleObjLDG);
                        suggestDto.setScheduleTime(dto.getScheduleTime());
                        suggestDto.setCreateTime(new Date());
                        if (mcsApi.createScheduleSuggest(suggestDto)) {
                            logger.info("转炉实时调度建议{" + suggestion + "}保存成功");
                        } else {
                            logger.error("转炉实时调度建议保存失败");
                        }
                    }
                    // 更新调整速率
                    gasAdjustMode.put(scheduleObjLDG, adjustValue);
                    gasLastSugTime.put(scheduleObjLDG, calendar.getTime());
                }
                // 预警
                Object earlywarning = mdkScheduleRespDTO.getResult().get(warningKey);
@@ -133,7 +162,7 @@
                    AlarmMessageRespDTO alarmMessageRespDTO = new AlarmMessageRespDTO();
                    alarmMessageRespDTO.setContent(earlywarning.toString());
                    alarmMessageRespDTO.setTitle("转炉实时调度预警");
                    alarmMessageRespDTO.setAlarmObj("LDG");
                    alarmMessageRespDTO.setAlarmObj(scheduleObjLDG);
                    alarmMessageRespDTO.setAlarmTime(dto.getScheduleTime());
                    alarmMessageRespDTO.setCreateTime(calendar.getTime());
@@ -143,32 +172,76 @@
                        logger.error("转炉实时调度预警保存失败");
                    }
                }
            }
            //焦炉实时调度
            if (CogCode.equals(params)) {
                // 建议
                Object suggestion = mdkScheduleRespDTO.getResult().get(suggestionKey);
                if (suggestion != null && StringUtils.isNotBlank(suggestion.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("焦炉实时调度建议");
                    suggestDto.setContent(suggestion.toString());
                    suggestDto.setScheduleObj("COG");
                    suggestDto.setScheduleTime(dto.getScheduleTime());
                    suggestDto.setCreateTime(calendar.getTime());
                    if (mcsApi.createScheduleSuggest(suggestDto)) {
                        logger.info("焦炉实时调度建议{" + suggestion + "}保存成功");
                    } else {
                        logger.error("焦炉实时调度建议保存失败");
                // 调整速率
                String scheduleObjCOG = "COG";
                BigDecimal adjustValue = new BigDecimal(mdkScheduleRespDTO.getResult().get(flag).toString());
                if (adjustValue.compareTo(BigDecimal.ZERO) == 0) {
                    logger.info("焦炉实时调度建议 flag为0");
                }else if (gasAdjustMode.containsKey(scheduleObjCOG) && gasAdjustMode.get(scheduleObjCOG).equals(adjustValue) &&
                        gasLastSugTime.containsKey(scheduleObjCOG) && (calendar.getTime().getTime() - gasLastSugTime.get(scheduleObjCOG).getTime() <= mdkScheduleRespDTO.getAdjustRate().longValue() * 60 * 1000)) {
                    logger.info("焦炉实时调度建议在有效期内");
                }else {
                    // 建议
                    Object suggestion = mdkScheduleRespDTO.getResult().get(suggestionKey);
                    if (suggestion != null && StringUtils.isNotBlank(suggestion.toString())) {
                        ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                        suggestDto.setTitle("焦炉实时调度建议");
                        suggestDto.setContent(suggestion.toString());
                        suggestDto.setScheduleObj(scheduleObjCOG);
                        suggestDto.setScheduleTime(dto.getScheduleTime());
                        suggestDto.setSort(1);
                        suggestDto.setCreateTime(new Date());
                        if (mcsApi.createScheduleSuggest(suggestDto)) {
                            logger.info("焦炉实时调度建议{" + suggestion + "}保存成功");
                        } else {
                            logger.error("焦炉实时调度建议保存失败");
                        }
                    }
                    suggestion = mdkScheduleRespDTO.getResult().get(guiweiRate);
                    if (suggestion != null && StringUtils.isNotBlank(suggestion.toString())) {
                        ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                        suggestDto.setTitle("焦炉煤气柜柜位");
                        suggestDto.setContent(suggestion.toString());
                        suggestDto.setScheduleObj(scheduleObjCOG);
                        suggestDto.setScheduleTime(dto.getScheduleTime());
                        suggestDto.setSort(2);
                        suggestDto.setCreateTime(new Date());
                        if (mcsApi.createScheduleSuggest(suggestDto)) {
                            logger.info("焦炉实时调度建议{" + suggestion + "}保存成功");
                        } else {
                            logger.error("焦炉实时调度建议保存失败");
                        }
                    }
                    suggestion = mdkScheduleRespDTO.getResult().get(gas);
                    if (suggestion != null && StringUtils.isNotBlank(suggestion.toString())) {
                        ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                        suggestDto.setTitle("焦炉煤气富余量");
                        suggestDto.setContent(suggestion.toString());
                        suggestDto.setScheduleObj(scheduleObjCOG);
                        suggestDto.setScheduleTime(dto.getScheduleTime());
                        suggestDto.setSort(3);
                        suggestDto.setCreateTime(new Date());
                        if (mcsApi.createScheduleSuggest(suggestDto)) {
                            logger.info("焦炉实时调度建议{" + suggestion + "}保存成功");
                        } else {
                            logger.error("焦炉实时调度建议保存失败");
                        }
                    }
                    // 更新调整速率
                    gasAdjustMode.put(scheduleObjCOG, adjustValue);
                    gasLastSugTime.put(scheduleObjCOG, calendar.getTime());
                }
                // 预警
                Object earlywarning = mdkScheduleRespDTO.getResult().get(warningKey);
                if (earlywarning != null && StringUtils.isNotBlank(earlywarning.toString())) {
                    AlarmMessageRespDTO alarmMessageRespDTO = new AlarmMessageRespDTO();
                    alarmMessageRespDTO.setContent(earlywarning.toString());
                    alarmMessageRespDTO.setTitle("焦炉实时调度预警");
                    alarmMessageRespDTO.setAlarmObj("COG");
                    alarmMessageRespDTO.setAlarmObj(scheduleObjCOG);
                    alarmMessageRespDTO.setAlarmTime(dto.getScheduleTime());
                    alarmMessageRespDTO.setCreateTime(calendar.getTime());
@@ -181,7 +254,7 @@
                // 下发上下限
                Object upper = mdkScheduleRespDTO.getResult().get(cogUpperKey);
                if (upper != null) {
                    BigDecimal value = new BigDecimal(upper.toString()).setScale(2,BigDecimal.ROUND_HALF_UP);
                    BigDecimal value = new BigDecimal(upper.toString()).setScale(2, BigDecimal.ROUND_HALF_UP);
                    ApiPointValueWriteDTO pointValueWriteDTO = new ApiPointValueWriteDTO();
                    pointValueWriteDTO.setPointNo("F0000201831");
                    pointValueWriteDTO.setValue(value.doubleValue());
@@ -189,7 +262,7 @@
                }
                Object lower = mdkScheduleRespDTO.getResult().get(cogLowerKey);
                if (lower != null) {
                    BigDecimal value = new BigDecimal(lower.toString()).setScale(2,BigDecimal.ROUND_HALF_UP);
                    BigDecimal value = new BigDecimal(lower.toString()).setScale(2, BigDecimal.ROUND_HALF_UP);
                    ApiPointValueWriteDTO pointValueWriteDTO = new ApiPointValueWriteDTO();
                    pointValueWriteDTO.setPointNo("F0000201832");
                    pointValueWriteDTO.setValue(value.doubleValue());
@@ -199,20 +272,64 @@
            }
            //高炉实时调度
            if (BfgCode.equals(params)) {
                // 建议
                Object suggestion = mdkScheduleRespDTO.getResult().get(suggestionKey);
                if (suggestion != null && StringUtils.isNotBlank(suggestion.toString())) {
                    ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                    suggestDto.setTitle("高炉实时调度建议");
                    suggestDto.setContent(suggestion.toString());
                    suggestDto.setScheduleObj("BFG");
                    suggestDto.setScheduleTime(dto.getScheduleTime());
                    suggestDto.setCreateTime(calendar.getTime());
                    if (mcsApi.createScheduleSuggest(suggestDto)) {
                        logger.info("高炉实时调度建议{" + suggestion + "}保存成功");
                    } else {
                        logger.error("高炉实时调度建议保存失败");
                // 调整速率
                String scheduleObjBFG = "BFG";
                BigDecimal adjustValue = new BigDecimal(mdkScheduleRespDTO.getResult().get(flag).toString());
                if (adjustValue.compareTo(BigDecimal.ZERO) == 0) {
                    logger.info("高炉实时调度建议 flag为0");
                }else if (gasAdjustMode.containsKey(scheduleObjBFG) && gasAdjustMode.get(scheduleObjBFG).equals(adjustValue) &&
                        gasLastSugTime.containsKey(scheduleObjBFG) && (calendar.getTime().getTime() - gasLastSugTime.get(scheduleObjBFG).getTime() <= mdkScheduleRespDTO.getAdjustRate().longValue() * 60 * 1000)) {
                    logger.info("高炉实时调度建议在有效期内");
                }else {
                    // 建议
                    Object suggestion = mdkScheduleRespDTO.getResult().get(suggestionKey);
                    if (suggestion != null && StringUtils.isNotBlank(suggestion.toString())) {
                        ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                        suggestDto.setTitle("高炉实时调度建议");
                        suggestDto.setContent(suggestion.toString());
                        suggestDto.setScheduleObj(scheduleObjBFG);
                        suggestDto.setScheduleTime(dto.getScheduleTime());
                        suggestDto.setSort(1);
                        suggestDto.setCreateTime(new Date());
                        if (mcsApi.createScheduleSuggest(suggestDto)) {
                            logger.info("高炉实时调度建议{" + suggestion + "}保存成功");
                        } else {
                            logger.error("高炉实时调度建议保存失败");
                        }
                    }
                    suggestion = mdkScheduleRespDTO.getResult().get(guiweiRate);
                    if (suggestion != null && StringUtils.isNotBlank(suggestion.toString())) {
                        ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                        suggestDto.setTitle("高炉煤气柜柜位");
                        suggestDto.setContent(suggestion.toString());
                        suggestDto.setScheduleObj(scheduleObjBFG);
                        suggestDto.setScheduleTime(dto.getScheduleTime());
                        suggestDto.setSort(2);
                        suggestDto.setCreateTime(new Date());
                        if (mcsApi.createScheduleSuggest(suggestDto)) {
                            logger.info("高炉实时调度建议{" + suggestion + "}保存成功");
                        } else {
                            logger.error("高炉实时调度建议保存失败");
                        }
                    }
                    suggestion = mdkScheduleRespDTO.getResult().get(gas);
                    if (suggestion != null && StringUtils.isNotBlank(suggestion.toString())) {
                        ScheduleSuggestRespDTO suggestDto = new ScheduleSuggestRespDTO();
                        suggestDto.setTitle("高炉煤气富余量");
                        suggestDto.setContent(suggestion.toString());
                        suggestDto.setScheduleObj(scheduleObjBFG);
                        suggestDto.setScheduleTime(dto.getScheduleTime());
                        suggestDto.setSort(3);
                        suggestDto.setCreateTime(new Date());
                        if (mcsApi.createScheduleSuggest(suggestDto)) {
                            logger.info("高炉实时调度建议{" + suggestion + "}保存成功");
                        } else {
                            logger.error("高炉实时调度建议保存失败");
                        }
                    }
                    // 更新调整速率
                    gasAdjustMode.put(scheduleObjBFG, adjustValue);
                    gasLastSugTime.put(scheduleObjBFG, calendar.getTime());
                }
                // 预警
                Object earlywarning = mdkScheduleRespDTO.getResult().get(warningKey);
@@ -220,7 +337,7 @@
                    AlarmMessageRespDTO alarmMessageRespDTO = new AlarmMessageRespDTO();
                    alarmMessageRespDTO.setContent(earlywarning.toString());
                    alarmMessageRespDTO.setTitle("高炉实时调度预警");
                    alarmMessageRespDTO.setAlarmObj("BFG");
                    alarmMessageRespDTO.setAlarmObj(scheduleObjBFG);
                    alarmMessageRespDTO.setAlarmTime(dto.getScheduleTime());
                    alarmMessageRespDTO.setCreateTime(calendar.getTime());
@@ -233,7 +350,7 @@
                // 下发上下限
                Object upper = mdkScheduleRespDTO.getResult().get(bfgUupperKey);
                if (upper != null) {
                    BigDecimal value = new BigDecimal(upper.toString()).setScale(2,BigDecimal.ROUND_HALF_UP);
                    BigDecimal value = new BigDecimal(upper.toString()).setScale(2, BigDecimal.ROUND_HALF_UP);
                    ApiPointValueWriteDTO pointValueWriteDTO = new ApiPointValueWriteDTO();
                    pointValueWriteDTO.setPointNo("F0000201829");
                    pointValueWriteDTO.setValue(value.doubleValue());
@@ -241,7 +358,7 @@
                }
                Object lower = mdkScheduleRespDTO.getResult().get(bfgLowerKey);
                if (lower != null) {
                    BigDecimal value = new BigDecimal(lower.toString()).setScale(2,BigDecimal.ROUND_HALF_UP);
                    BigDecimal value = new BigDecimal(lower.toString()).setScale(2, BigDecimal.ROUND_HALF_UP);
                    ApiPointValueWriteDTO pointValueWriteDTO = new ApiPointValueWriteDTO();
                    pointValueWriteDTO.setPointNo("F0000201830");
                    pointValueWriteDTO.setValue(value.doubleValue());
@@ -250,7 +367,7 @@
            }
        } catch (Exception ex) {
            logger.error("runScheduleModuleTask运行异常",ex);
            logger.error("runScheduleModuleTask运行异常", ex);
        }
        logger.info("runScheduleModuleTask运行完成");
    }
doc/设计文档/鲅鱼圈钢铁分公司能源管控智能化提升项目-接口设计说明书(模版).doc
Binary files differ
doc/设计文档/鲅鱼圈钢铁分公司能源管控智能化提升项目-详细设计说明书(模版).doc
Binary files differ
doc/设计文档/鲅鱼圈钢铁分公司能源管控智能化提升项目-需求分析说明书(模版).docx
Binary files differ
doc/鞍钢数据接口文档_master.doc
Binary files differ