package com.iailab.module.ansteel.api.controller.admin;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants;
|
import com.iailab.framework.common.pojo.CommonResult;
|
import com.iailab.framework.common.util.date.DateUtils;
|
import com.iailab.module.ansteel.api.vo.PowerTransferDetRespVO;
|
import com.iailab.module.ansteel.api.vo.PowerTransferReqVO;
|
import com.iailab.module.ansteel.api.vo.PowerTransferRespVO;
|
import com.iailab.module.ansteel.common.enums.TransferTypeEnum;
|
import com.iailab.module.ansteel.common.utils.DecimalUtil;
|
import com.iailab.module.model.api.mcs.McsApi;
|
import com.iailab.module.model.api.mcs.dto.ChartParamDTO;
|
import com.iailab.module.model.api.mcs.dto.PredictTnValueReqVO;
|
import com.iailab.module.model.api.mdk.MdkApi;
|
import com.iailab.module.model.api.mdk.dto.MdkPredictDataDTO;
|
import com.iailab.module.model.api.mdk.dto.MdkScheduleReqDTO;
|
import com.iailab.module.model.api.mdk.dto.MdkScheduleRespDTO;
|
import com.iailab.module.model.enums.CommonConstant;
|
import io.swagger.v3.oas.annotations.Operation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.util.CollectionUtils;
|
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import java.math.BigDecimal;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
import static com.iailab.framework.common.pojo.CommonResult.success;
|
|
/**
|
* @author PanZhibao
|
* @Description
|
* @createTime 2025年03月31日
|
*/
|
@Slf4j
|
@RestController
|
@RequestMapping("/ansteel/api/model")
|
public class ModelController {
|
|
@Autowired
|
private MdkApi mdkApi;
|
|
@Autowired
|
private McsApi mcsApi;
|
|
private String RPH_SCHEDULE_CODE = "AnSteelGasSchedule";
|
|
/**
|
* 负荷移植-负荷移植建议与方案
|
*
|
* @param reqVO
|
* @return
|
*/
|
@PostMapping("/power-transfer")
|
@Operation(summary = "负荷移植-负荷移植建议与方案")
|
public CommonResult<PowerTransferRespVO> scheduleEleLoad(@RequestBody PowerTransferReqVO reqVO) {
|
log.info("异常工况下的负荷移植");
|
if (reqVO.getTingjiZhong() == null) {
|
reqVO.setTingjiZhong(0);
|
}
|
if (reqVO.getTingjiHou()== null) {
|
reqVO.setTingjiHou(0);
|
}
|
if (reqVO.getTingjiRezha()== null) {
|
reqVO.setTingjiRezha(0);
|
}
|
if (reqVO.getIsReduceCog() == null) {
|
return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), "IsReduceCog is null");
|
}
|
|
MdkScheduleReqDTO fhyzDto = new MdkScheduleReqDTO();
|
PowerTransferRespVO result = new PowerTransferRespVO();
|
List<PowerTransferDetRespVO> demandAdviceList = new ArrayList<>();
|
List<PowerTransferDetRespVO> gasAdviceList = new ArrayList<>();
|
try {
|
log.info("PowerTransferReqVO=" + JSONObject.toJSONString(reqVO));
|
Calendar calendar = Calendar.getInstance();
|
calendar.set(Calendar.SECOND,0);
|
calendar.set(Calendar.MILLISECOND,0);
|
|
// 0 建议编码
|
List<ChartParamDTO> demandParamList = mcsApi.getChartParamList(com.iailab.module.ansteel.common.constant.CommonConstant.FHYZ_DEMAND_ADVICE);
|
Map<String, ChartParamDTO> demandAdviceCodeMap = new HashMap<>();
|
List<String> demandAdviceCodeList = new ArrayList<>();
|
if (demandParamList != null) {
|
for (ChartParamDTO chartParamDTO : demandParamList) {
|
demandAdviceCodeMap.put(chartParamDTO.getParamCode(), chartParamDTO);
|
demandAdviceCodeList.add(chartParamDTO.getParamCode());
|
}
|
}
|
|
List<ChartParamDTO> gasParamList = mcsApi.getChartParamList(com.iailab.module.ansteel.common.constant.CommonConstant.FHYZ_GAS_ADVICE);
|
Map<String, ChartParamDTO> gasAdviceCodeMap = new HashMap<>();
|
List<String> gasAdviceCodeList = new ArrayList<>();
|
if (gasParamList != null) {
|
for (ChartParamDTO chartParamDTO : gasParamList) {
|
gasAdviceCodeMap.put(chartParamDTO.getParamCode(), chartParamDTO);
|
gasAdviceCodeList.add(chartParamDTO.getParamCode());
|
}
|
}
|
|
String nowH = DateUtils.format(calendar.getTime(), "hh:mm");
|
switch (TransferTypeEnum.getEumByCode(reqVO.getType())) {
|
case XF:
|
|
// 1 日平衡
|
/*日平衡动态参数
|
zhiling_params [休风高炉,休风时长]
|
jiaohua_params [是否减焦化BFG,下限]
|
testlist [热轧,厚板,中板,A系列烧结,B系列烧结]
|
GASrezhaAdvice
|
GAShoubanAdvice
|
GASzhongbanAdvice
|
GASAshaojieAdvice
|
GASBshaojieAdvice
|
*/
|
MdkScheduleReqDTO rphScheduleReqDTO = new MdkScheduleReqDTO();
|
rphScheduleReqDTO.setScheduleTime(calendar.getTime());
|
rphScheduleReqDTO.setScheduleCode(RPH_SCHEDULE_CODE);
|
Map<String, String> rphSettings = new HashMap<>();
|
List<Integer> zhilingParams = new ArrayList<>();
|
zhilingParams.add(reqVO.getBfg());
|
zhilingParams.add(reqVO.getMins());
|
rphSettings.put("zhiling_params", JSONArray.toJSONString(zhilingParams));
|
List<Integer> jiaohuaParams = new ArrayList<>();
|
jiaohuaParams.add(reqVO.getIsReduceCog() == 0 ? 0 : 1);
|
jiaohuaParams.add(reqVO.getLimit().intValue());
|
rphSettings.put("jiaohua_params", JSONArray.toJSONString(jiaohuaParams));
|
List<Integer> loadChangeState = new ArrayList<>();
|
String[] loadChangeArr = {"GASrezhaAdvice", "GAShoubanAdvice", "GASzhongbanAdvice", "GASAshaojieAdvice", "GASBshaojieAdvice"};
|
for (int i = 0; i < loadChangeArr.length; i++) {
|
loadChangeState.add(reqVO.getAdviceCodeList().contains(loadChangeArr[i]) ? 1 : 0);
|
}
|
rphSettings.put("testlist", JSONArray.toJSONString(loadChangeState));
|
rphScheduleReqDTO.setDynamicSettings(rphSettings);
|
log.info("负荷移植调用日平衡开始执行," + JSONObject.toJSONString(rphScheduleReqDTO));
|
MdkScheduleRespDTO rphRespDTO = mdkApi.doSchedule(rphScheduleReqDTO);
|
log.info("负荷移植调用日平衡执行完成," + rphRespDTO);
|
String rphStatusCode = rphRespDTO.getStatusCode();
|
if (!CommonConstant.MDK_STATUS_100.equals(rphStatusCode)) {
|
log.info("rphStatusCode=" + rphStatusCode);
|
return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), "负荷移植调用日平衡,无计算结果");
|
}
|
String gasUseAllnNew = rphRespDTO.getResult().get("Gas_Use_All_new").toString();
|
log.info("gasUseAllnNew=" + gasUseAllnNew);
|
|
// 高炉休风
|
fhyzDto.setScheduleTime(calendar.getTime());
|
fhyzDto.setScheduleCode("AnSteelpowertransfer");
|
Map<String, String> dynamicSettings = new HashMap<>();
|
Integer[] xiufengOrder = {
|
reqVO.getBfg(),
|
reqVO.getNow() == null ? Integer.parseInt(nowH) : reqVO.getNow(),
|
reqVO.getStart(),
|
reqVO.getMins()};
|
// 煤气日平衡输出
|
dynamicSettings.put("Gas_Use_All_new", gasUseAllnNew);
|
// 休风指令信息
|
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));
|
// 选择建议编码, 不选默认[-1]
|
List<Integer> choiceParams = new ArrayList<>();
|
if (CollectionUtils.isEmpty(reqVO.getAdviceCodeList())) {
|
choiceParams.add(-1);
|
} else {
|
for(String adviceCode : reqVO.getAdviceCodeList()) {
|
choiceParams.add(Integer.parseInt(demandAdviceCodeMap.get(adviceCode).getParamValue()));
|
}
|
}
|
dynamicSettings.put("choice_params", JSONArray.toJSONString(choiceParams));
|
fhyzDto.setDynamicSettings(dynamicSettings);
|
break;
|
case JX:
|
// 产线检修
|
break;
|
default:
|
return CommonResult.error(GlobalErrorCodeConstants.NOT_FOUND, "Type参数错误");
|
}
|
|
log.info("调度方案开始执行," + JSONObject.toJSONString(fhyzDto));
|
MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(fhyzDto);
|
log.info("调度方案执行完成," + mdkScheduleRespDTO);
|
|
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();
|
// String fakeData = "{\"houbanAdvice\":[1000.0,150.0,16.97],\"2#LFAdvice\":[1000.0,150.0,11.8],\"1#2#zhiyangAdvice\":[1000.0,150.0,3.0],\"shaojieAdvice\":[1000.0,150.0,8.25],\"CCPPAdvice\":[1000.0,150.0,47.3],\"demand\":[34.4,0.0,3.0,0.0,0.0],\"rezhaAdvice\":[1000.0,150.0,45.86],\"best_total_power\":129.27,\"bfg_gap\":377924.37,\"zhongbanAdvice\":[1000.0,150.0,4.12],\"3#zhiyangAdvice\":[1000.0,150.0,25.3],\"cog_gap\":[800.0,59113.58],\"baihuiAdvice\":[1000.0,150.0,1.0],\"1#LFAdvice\":[1000.0,150.0,15.98]}";
|
// Map<String, Object> data = JSONObject.parseObject(fakeData, Map.class);
|
switch (TransferTypeEnum.getEumByCode(reqVO.getType())) {
|
case XF:
|
// 高炉休风
|
result.setDemand(data.get("demand"));
|
result.setGasGap(data.get("gas_gap"));
|
result.setFadian(data.get("fadian"));
|
|
for (String adviceCode : demandAdviceCodeList) {
|
if (data.get(adviceCode) != null) {
|
demandAdviceList.add(DecimalUtil.toPowerTransferDetRespVO(demandAdviceCodeMap.get(adviceCode).getParamName(), data.get(adviceCode)));
|
}
|
}
|
for (String adviceCode : gasAdviceCodeList) {
|
if (data.get(adviceCode) != null) {
|
demandAdviceList.add(DecimalUtil.toPowerTransferDetRespVO(gasAdviceCodeMap.get(adviceCode).getParamName(), data.get(adviceCode)));
|
}
|
}
|
result.setDemandAdviceList(demandAdviceList);
|
log.info("XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXF");
|
break;
|
case JX:
|
// 产线检修
|
|
log.info("JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX");
|
break;
|
default:
|
|
break;
|
|
}
|
} catch (Exception ex) {
|
ex.printStackTrace();
|
return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), ex.getMessage());
|
}
|
log.info("result=" + JSONObject.toJSONString(result));
|
return CommonResult.success(result);
|
}
|
|
@PostMapping("/predict-data/tn-value")
|
@Operation(summary = "获取T+N预测数据")
|
public CommonResult<List<MdkPredictDataDTO>> getPredictTnValue(@RequestBody PredictTnValueReqVO reqVO) {
|
log.info("PredictTnValueReqVO:"+reqVO);
|
List<MdkPredictDataDTO> list = mcsApi.getPredictTnValue(reqVO);
|
return success(list);
|
}
|
}
|