ansteel-biz/db/mysql.sql
@@ -908,4 +908,7 @@ `pred_result` varchar(36) DEFAULT NULL COMMENT '预测结果', `sort` int NULL DEFAULT NULL COMMENT '排序', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='功率因数管控'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='功率因数管控'; ALTER TABLE `t_power_factor_control` ADD COLUMN `data_type` varchar(20) NULL DEFAULT NULL COMMENT '数据类型' after `name`; ALTER TABLE `t_power_factor_control` ADD COLUMN `cos_index` int NULL DEFAULT NULL COMMENT '功率因素结果角标' after `pred_result`; ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/ModelController.java
@@ -69,6 +69,8 @@ reqVO.getMins()}; dynamicSettings.put("xiufeng_order", JSONArray.toJSONString(xiufengOrder)); dynamicSettings.put("jiaohua_BFG_down", reqVO.getLimit().toString()); Integer[] tingjiOrder = {reqVO.getTingjiZhong(), reqVO.getTingjiHou(), reqVO.getTingjiRezha()}; dynamicSettings.put("tingji_order", JSONArray.toJSONString(tingjiOrder)); dto.setDynamicSettings(dynamicSettings); break; case JX: ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/PowerController.java
@@ -12,6 +12,7 @@ import com.iailab.module.ansteel.api.vo.PowerCapacitorHisPageReqVO; 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; @@ -1320,8 +1321,9 @@ } @PostMapping("/factor-control/list") @Operation(summary = "功率因数管控") @Operation(summary = "功率因数调整结果查询") public CommonResult<List<PowerFactorControlDTO>> powerFactorControlList(@RequestBody PowerFactorReqVO powerFactorReqVO) { List<PowerFactorControlDTO> result = new ArrayList<>(); Map<String, Object> chartMap = new HashMap<>(); List<ChartParamDTO> chartList = mcsApi.getChartParamList(CommonConstant.POWER_CODE); chartList.forEach(item -> { @@ -1345,71 +1347,97 @@ calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MINUTE, 0); if (!CollectionUtils.isEmpty(powerFactorReqVO.getContentList())) { } MdkScheduleReqDTO dto = new MdkScheduleReqDTO(); dto.setScheduleTime(calendar.getTime()); dto.setScheduleCode("AnsteelOffPowerAC"); Map<String, String> dynamicSettings = new HashMap<>(); dynamicSettings.put("option_param", JSONArray.toJSONString(contentListNew.stream().toArray(Integer[]::new))); dynamicSettings.put("cos_param", JSONArray.toJSONString(powerFactorReqVO.getAdjustValueList().stream().toArray(String[]::new))); List<String> cosParam = new ArrayList<>(); cosParam.add(powerFactorReqVO.getAdjustValueCcpp().toString()); cosParam.add(powerFactorReqVO.getAdjustValue135().toString()); cosParam.add(powerFactorReqVO.getAdjustValueTrt().toString()); dynamicSettings.put("cos_param", JSONArray.toJSONString(cosParam)); dto.setDynamicSettings(dynamicSettings); log.info("调度方案开始执行," + JSONObject.toJSONString(dto)); MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(dto); log.info("调度方案执行完成," + mdkScheduleRespDTO); // MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(dto); //log.info("调度方案执行完成," + mdkScheduleRespDTO); String statusCode = mdkScheduleRespDTO.getStatusCode(); /*String statusCode = mdkScheduleRespDTO.getStatusCode(); if (!CommonConstant.MDK_STATUS_100.equals(statusCode)) { log.info("statusCode=" + statusCode); return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), "工序异常,无计算结果"); } Map<String, Object> data = mdkScheduleRespDTO.getResult(); List<String> adjustCosList = Arrays.asList(data.get("adjust_cos").toString().split(","));//管控结果 Map<String, Object> data = mdkScheduleRespDTO.getResult();*/ // 调整后的功率因数 // List<String> adjustCosList = Arrays.asList(data.get("adjust_cos").toString().split(",")); String fakeData = "[0.39,0.98,0.98,0 91,1.0,0.93,0.86,0.89,0.98,0.9,0.97,0.89,0.84,0.91]"; List<BigDecimal> adjustCosList = JSONArray.parseArray(fakeData, BigDecimal.class); PowerFactorControlDTO powerFactorControlDTO = new PowerFactorControlDTO(); List<PowerFactorControlDTO> result = new ArrayList<>(); List<PowerFactorControlDTO> list = powerFactorControlService.list(powerFactorControlDTO); // 无功管控结果 BigDecimal back_wugong_buchang = new BigDecimal(36.92); adjustCosList.add(back_wugong_buchang); Map<Integer, BigDecimal> adjustCosMap = new HashMap<>(); for (int i = 0; i < adjustCosList.size(); i++) { adjustCosMap.put(i, adjustCosList.get(i)); } List<PowerFactorControlEntity> list = powerFactorControlService.list(); if (CollectionUtils.isEmpty(list)) { log.info("list is empty"); return success(result); } for (int i = 0; i < list.size(); i++) { PowerFactorControlDTO controlDTO = list.get(i); PowerFactorControlEntity entity = list.get(i); PowerFactorControlDTO controlDTO = new PowerFactorControlDTO(); controlDTO.setName(entity.getName()); controlDTO.setSort(entity.getSort()); try { PredictLastValueReqVO reqVO = new PredictLastValueReqVO(); reqVO.setPredictTime(calendar.getTime()); List<String[]> itemNos = new ArrayList<>(); if (StringUtils.isNotBlank(controlDTO.getPredResult())) { itemNos.add(controlDTO.getPredResult().split(",")); // 预测结果 switch (ProcessConfDataTypeEnum.getEumByCode(entity.getDataType())) { case DATAPOINT: List<String> params1 = new ArrayList<>(); params1.add(entity.getPredResult()); Map<String, Object> pointValues = dataPointApi.queryPointsRealValue(params1); if (!CollectionUtils.isEmpty(pointValues)) { controlDTO.setPredResult(DecimalUtil.toBigDecimal(pointValues.get(entity.getPredResult()))); } break; case PREDICTVALUE: PredictLastValueReqVO reqVO = new PredictLastValueReqVO(); calendar.set(calendar.HOUR_OF_DAY, 0); reqVO.setPredictTime(calendar.getTime()); List<String[]> itemNos = new ArrayList<>(); if (StringUtils.isNotBlank(entity.getPredResult())) { itemNos.add(entity.getPredResult().split(",")); } reqVO.setItemNos(itemNos); Map<String, BigDecimal> preValues = mcsApi.getPredictValueByTime(reqVO); if (preValues.get(entity.getPredResult()) != null) { controlDTO.setPredResult(new BigDecimal(preValues.get(entity.getPredResult()).toString())); } break; default: break; } if (!CollectionUtils.isEmpty(itemNos)) { reqVO.setItemNos(itemNos); log.info("reqVO=" + JSONObject.toJSONString(reqVO)); Map<String, BigDecimal> preValues = mcsApi.getPredictValueByTime(reqVO); if (!ObjectUtils.isEmpty(preValues.get(controlDTO.getPredResult()))) { controlDTO.setPredResult(preValues.get(controlDTO.getPredResult()).toString()); } } controlDTO.setAdjustCos(adjustCosList.get(i)); // 管控结果 if (adjustCosMap.containsKey(entity.getCosIndex())) { controlDTO.setAdjustCos(adjustCosMap.get(entity.getCosIndex())); } } catch (Exception ex) { log.info(controlDTO.getName() + "获取预测值异常," + ex.getMessage()); ex.printStackTrace(); } result.add(controlDTO); } List<String> points = new ArrayList<>(); points.add(pointNo); Map<String, Object> pointsRealValue = dataPointApi.queryPointsRealValue(points); PowerFactorControlDTO controlDTO = new PowerFactorControlDTO(); controlDTO.setName("望铁关口最大无功倒送量"); controlDTO.setPredResult(pointsRealValue.get(pointNo).toString()); controlDTO.setAdjustCos(data.get("back_wugong_buchang").toString()); controlDTO.setSort(list.size() + 1); result.add(controlDTO); log.info("result===" + JSONObject.toJSONString(result)); return success(result); } ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerFactorControlDTO.java
@@ -4,6 +4,7 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; /** * 功率因数管控 @@ -19,10 +20,10 @@ private String name; @Schema(description = "预测结果") private String predResult; private BigDecimal predResult; @Schema(description = "管控结果") private String adjustCos; private BigDecimal adjustCos; @Schema(description = "排序") private Integer sort; ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerFactorReqVO.java
@@ -1,11 +1,10 @@ package com.iailab.module.ansteel.api.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; import java.util.Date; import java.math.BigDecimal; import java.util.List; /** @@ -17,10 +16,16 @@ public class PowerFactorReqVO implements Serializable { private static final long serialVersionUID = 1L; @Schema(description = "建议") @Schema(description = "投退建议内容集合") private List<String> contentList; @Schema(description = "调整值") private List<String> adjustValueList; @Schema(description = "Ccpp调整值") private BigDecimal adjustValueCcpp; @Schema(description = "135调整值") private BigDecimal adjustValue135; @Schema(description = "Trt调整值") private BigDecimal adjustValueTrt; } ansteel-biz/src/main/java/com/iailab/module/ansteel/api/vo/PowerTransferReqVO.java
@@ -33,4 +33,13 @@ @Schema(description = "焦化消耗高炉煤气下限(大于0)") private BigDecimal limit; @Schema(description = "中板停机时长") private Integer tingjiZhong; @Schema(description = "厚板停机时长") private Integer tingjiHou; @Schema(description = "热轧停机时长") private Integer tingjiRezha; } ansteel-biz/src/main/java/com/iailab/module/ansteel/common/enums/ProcessConfDataTypeEnum.java
@@ -12,6 +12,7 @@ @AllArgsConstructor public enum ProcessConfDataTypeEnum { DATAPOINT("DATAPOINT", "测点值"), PREDICTVALUE("PREDICTVALUE", "预测值"), IND("IND", "指标值(double)"), ARC("ARC", "归档数据"), MODEL("MODEL", "模型输出值"), ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunOffPowerOptimTask.java
@@ -1,5 +1,6 @@ package com.iailab.module.ansteel.job.task; import com.alibaba.fastjson.JSONObject; 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; @@ -44,29 +45,63 @@ MdkScheduleReqDTO dto = new MdkScheduleReqDTO(); dto.setScheduleTime(calendar.getTime()); dto.setScheduleCode(params); MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(dto); logger.info(params + "调度方案执行完成," + mdkScheduleRespDTO); Map<String, Object> result = mdkScheduleRespDTO.getResult(); for (Map.Entry<String, Object> entry : result.entrySet()) { String key = entry.getKey(); if (key.contains("advice") || key.contains("off_power_up_flag") || key.contains("cos")) { this.saveScheduleSuggest("无功优化", key, entry.getValue(), "WGYH", calendar.getTime()); /*MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(dto); logger.info(params + "调度方案执行完成," + mdkScheduleRespDTO);*/ // Map<String, Object> result = mdkScheduleRespDTO.getResult(); String fakeDate = "{\n" + "\t\"off_power_up_flag\": \"无功上网\",\n" + "\t\"wangtie_cos_flag\": \"功率因数达标预计0.93\",\n" + "\t\"advice1\": \"退运 钢铁变#5电容器, 容量: 20.0 MVAR, 电压等级: 220.0kV\",\n" + "\t\"advice2\": \"退运 钢铁变#6电容器, 容量: 20.0 MVAR, 电压等级: 220.0kV\",\n" + "\t\"advice3\": \"退运 钢铁变#8电容器, 容量: 20.0 MVAR, 电压等级: 220.0kV\",\n" + "\t\"advice4\": \"退运 钢铁变#9电容器, 容量: 20.0 MVAR, 电压等级: 220.0kV\",\n" + "\t\"advice5\": \"退运 钢铁变#10电容器, 容量: 20.0 MVAR, 电压等级: 220.0kV\",\n" + "\t\"advice6\": \"投运 原料场1ER电容器, 容量: 2.7 MVAR, 电压等级: 10.0kV\",\n" + "\t\"advice7\": \"投运 备煤筛焦综合电气室Ⅰ段电容补偿, 容量: 1.8 MVAR, 电压等级: 10.0kV\",\n" + "\t\"advice8\": \"投运 备煤筛焦综合电气室Ⅱ段电容补偿, 容量: 1.8 MVAR, 电压等级: 10.0kV\",\n" + "\t\"advice9\": \"投运 煤气净化综合电气室Ⅰ段电容补偿, 容量: 1.8 MVAR, 电压等级: 10.0kV\",\n" + "\t\"advice10\": \"投运 煤气净化综合电气室Ⅱ段电容补偿, 容量: 1.8 MVAR, 电压等级: 10.0kV\",\n" + "\t\"advice11\": \"CCPP功率因数建议:0.98\",\n" + "\t\"advice12\": \"135机组功率因数建议:0.97\",\n" + "\t\"advice13\": \"1#TRT功率因数建议:0.98\",\n" + "\t\"back_wugong\": 98.96\n" + "}"; Map<String, Object> result = JSONObject.parseObject(fakeDate); if (result.containsKey("off_power_up_flag")) { this.saveScheduleSuggest("无功上网标记", "off_power_up_flag", result.get("off_power_up_flag"), "WGYH", calendar.getTime(), 0); } int adviceCount = 0; for (int i = 1; i < 100; i++) { String key = "advice" + i; if (result.containsKey(key)) { adviceCount ++; } } if (mdkApi.scheduleModelOut(mdkScheduleRespDTO)) { for (int i = 1; i < (adviceCount - 2); i++) { String key = "advice" + i; if (result.containsKey(key)) { this.saveScheduleSuggest("投退建议", key, result.get(key), "WGYH", calendar.getTime(), i); } } for (int i = (adviceCount - 2); i < (adviceCount + 1); i++) { String key = "advice" + i; if (result.containsKey(key)) { this.saveScheduleSuggest("功率因数建议", key, result.get(key), "WGYH", calendar.getTime(), i); } } /*if (mdkApi.scheduleModelOut(mdkScheduleRespDTO)) { logger.info("调度方案结果下发成功"); } else { logger.error("调度方案结果下发失败"); } }*/ } catch (Exception ex) { logger.error("runOffPowerOptimTask运行异常", ex); } logger.info("runOffPowerOptimTask运行完成"); } private void saveScheduleSuggest(String title, String key, Object content, String scheduleObj, Date scheduleTime) { private void saveScheduleSuggest(String title, String key, Object content, String scheduleObj, Date scheduleTime, int sort) { if (content == null || StringUtils.isBlank(content.toString()) || "0".equals(content.toString())) { logger.info(title + "content为空"); return; @@ -76,14 +111,7 @@ suggest.setContent(content.toString()); suggest.setScheduleObj(scheduleObj); suggest.setScheduleTime(scheduleTime); suggest.setSort(0); if(key.contains("off_power_up_flag")){ suggest.setScheduleType("off"); }else if(key.contains("cos")) { suggest.setScheduleType("cos"); }else if(key.contains("advice")) { suggest.setScheduleType("advice"); } suggest.setSort(sort); mcsApi.createScheduleSuggest(suggest); } } ansteel-biz/src/main/java/com/iailab/module/ansteel/job/task/RunPowerNetAlarmTask.java
对比新文件 @@ -0,0 +1,48 @@ package com.iailab.module.ansteel.job.task; import com.iailab.module.model.api.mcs.McsApi; import com.iailab.module.model.api.mcs.dto.AlarmMessageRespDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Calendar; /** * @author PanZhibao * @Description * @createTime 2025年06月12日 */ @Component("runPowerNetAlarmTask") public class RunPowerNetAlarmTask implements ITask { private Logger logger = LoggerFactory.getLogger(getClass()); private final String ALARM_OBJ = "NetAlarm"; @Autowired private McsApi mcsApi; @Override public void run(String params) { logger.info("RunPowerNetAlarmTask定时任务正在执行,参数为:{}", params); try { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); AlarmMessageRespDTO alarmMessageRespDTO = new AlarmMessageRespDTO(); alarmMessageRespDTO.setContent("焦化甲线: 无功减少可能由该工序下电容器投运引起;原料甲线: 可能由工序检修引起; 1#炼铁线: 无功减少可能由1#TRT发电机无功增加引起; 2#氧气线: 可能由工序检修引起"); alarmMessageRespDTO.setTitle("大型发电机无功增加"); alarmMessageRespDTO.setAlarmObj(ALARM_OBJ); alarmMessageRespDTO.setAlarmTime(calendar.getTime()); alarmMessageRespDTO.setCreateTime(calendar.getTime()); mcsApi.createAlarmMessage(alarmMessageRespDTO); } catch (Exception ex) { logger.error("RunPowerNetAlarmTask运行异常"); ex.printStackTrace(); } logger.info("RunPowerNetAlarmTask运行完成"); } } ansteel-biz/src/main/java/com/iailab/module/ansteel/power/entity/PowerFactorControlEntity.java
@@ -27,7 +27,11 @@ private String name; private String dataType; private String predResult; private Integer cosIndex; private Integer sort; } ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/PowerFactorControlService.java
@@ -1,6 +1,7 @@ package com.iailab.module.ansteel.power.service; import com.iailab.module.ansteel.api.dto.PowerFactorControlDTO; import com.iailab.module.ansteel.power.entity.PowerFactorControlEntity; import java.util.List; @@ -10,5 +11,5 @@ */ public interface PowerFactorControlService { List<PowerFactorControlDTO> list(PowerFactorControlDTO powerFactorControlDTO); List<PowerFactorControlEntity> list(); } ansteel-biz/src/main/java/com/iailab/module/ansteel/power/service/impl/PowerFactorControlServiceImpl.java
@@ -24,7 +24,7 @@ private PowerFactorControlDao powerFactorControlDao; @Override public List<PowerFactorControlDTO> list(PowerFactorControlDTO powerFactorControlDTO) { return ConvertUtils.sourceToTarget(powerFactorControlDao.selectList(new QueryWrapper<PowerFactorControlEntity>().orderByAsc("sort")), PowerFactorControlDTO.class); public List<PowerFactorControlEntity> list() { return powerFactorControlDao.selectList(new QueryWrapper<PowerFactorControlEntity>().orderByAsc("sort")); } } ansteel-biz/src/main/resources/application.yaml
@@ -186,6 +186,7 @@ - t_gas_pred_conf - t_power_price_main - t_power_price_det - t_power_factor_control swagger: title: 鞍钢鲅鱼圈能源管控系统 description: 鞍钢鲅鱼圈能源管控系统 doc/鞍钢数据接口文档_master.docBinary files differ
doc/鞍钢鲅鱼圈钢铁分公司能源管控智能化提升项目使用说明书.docxBinary files differ