package com.iailab.module.model.mdk.predict.impl; import com.alibaba.fastjson.JSON; import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity; import com.iailab.module.model.mcs.pre.service.MmItemOutputService; import com.iailab.module.model.mcs.pre.service.MmItemResultJsonService; import com.iailab.module.model.mcs.sche.service.StAdjustResultService; import com.iailab.module.model.mdk.common.exceptions.ItemInvokeException; import com.iailab.module.model.mdk.factory.ItemEntityFactory; import com.iailab.module.model.mdk.predict.PredictItemHandler; import com.iailab.module.model.mdk.vo.ItemVO; import com.iailab.module.model.mdk.vo.PredictResultVO; import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.*; /** * @author PanZhibao * @Description * @createTime 2024年09月01日 */ @Slf4j @Component public class PredictItemMergeHandlerImpl implements PredictItemHandler { @Autowired private ItemEntityFactory itemEntityFactory; @Autowired private MmItemResultJsonService mmItemResultJsonService; @Autowired private MmItemOutputService mmItemOutputService; @Autowired private StAdjustResultService stAdjustResultService; /** * MergeItem预测 * * @param predictTime * @param predictItemDto * @return * @throws ItemInvokeException */ @Override public PredictResultVO predict(Date predictTime, ItemVO predictItemDto, Map predictValueMap) throws ItemInvokeException { PredictResultVO predictResult = new PredictResultVO(); String itemId = predictItemDto.getId(); try { String expression = itemEntityFactory.getMergeItem(itemId).getExpression(); int predictLength = itemEntityFactory.getItemById(itemId).getPredictLength(); double[] predictResultMat = new double[predictLength]; String[] mathOutPutId = expression.split("[\\+ \\-]"); ArrayList operator = new ArrayList<>(); for (int i = 0; i < expression.length(); i++) { if (expression.charAt(i) == '+' || expression.charAt(i) == '-') { operator.add(expression.charAt(i)); } } //是否为计算预测项 if (mathOutPutId.length > 1) { for (Integer i = 0; i < predictLength; i++) { double sum = 0.0; sum = predictValueMap.get(mathOutPutId[0])[i]; for (int j = 1; j < mathOutPutId.length; j++) { if (operator.get(j - 1) == '+') { sum += predictValueMap.get(mathOutPutId[j])[i]; } if (operator.get(j - 1) == '-') { sum -= predictValueMap.get(mathOutPutId[j])[i]; } } predictResultMat[i] = sum; } } predictResult.setPredictId(itemId); List outputServiceByItemid = mmItemOutputService.getByItemid(itemId); if (!CollectionUtils.isEmpty(outputServiceByItemid)) { Map predictMatrixs = new HashMap<>(); predictMatrixs.put(outputServiceByItemid.get(0), predictResultMat); predictResult.setPredictMatrixs(predictMatrixs); } predictResult.setPredictTime(predictTime); } catch (Exception e) { log.error("merge项预测失败,itemId:" + itemId); e.printStackTrace(); throw e; } log.info("merge项预测完成,itemId:" + itemId + ",结果:" + JSON.toJSONString(predictResult)); return predictResult; } @Override public PredictResultVO predictAdjust(Date predictTime, ItemVO predictItemDto, List deviationList) throws ItemInvokeException { PredictResultVO predictResult = new PredictResultVO(); String itemId = predictItemDto.getId(); try { String expression = itemEntityFactory.getMergeItem(itemId).getExpression(); int predictLength = itemEntityFactory.getItemById(itemId).getPredictLength(); double[] predictResultMat = new double[predictLength]; String[] mathOutPutId = expression.split("[\\+ \\-]"); ArrayList operator = new ArrayList<>(); for (int i = 0; i < expression.length(); i++) { if (expression.charAt(i) == '+' || expression.charAt(i) == '-') { operator.add(expression.charAt(i)); } } Map predictValueMap = new HashMap<>(); for (int k = 0; k < mathOutPutId.length; k++) { String outPutId = mathOutPutId[k]; double[] outPutValue = stAdjustResultService.getSimpleData(outPutId, predictTime, predictLength); if (outPutValue == null) { outPutValue = mmItemResultJsonService.getSimpleData(outPutId, predictTime, predictLength); } predictValueMap.put(outPutId, outPutValue); } //是否为计算预测项 if (mathOutPutId.length > 1) { for (int i = 0; i < predictLength; i++) { double sum = predictValueMap.get(mathOutPutId[0])[i]; for (int j = 1; j < mathOutPutId.length; j++) { if (operator.get(j - 1) == '+') { sum += predictValueMap.get(mathOutPutId[j])[i]; } if (operator.get(j - 1) == '-') { sum -= predictValueMap.get(mathOutPutId[j])[i]; } } predictResultMat[i] = sum; } } predictResult.setPredictId(itemId); List outputServiceByItemid = mmItemOutputService.getByItemid(itemId); if (!CollectionUtils.isEmpty(outputServiceByItemid)) { Map predictMatrixs = new HashMap<>(); predictMatrixs.put(outputServiceByItemid.get(0), predictResultMat); predictResult.setPredictMatrixs(predictMatrixs); } predictResult.setPredictTime(predictTime); } catch (Exception e) { log.error("merge项预测失败,itemId:" + itemId); e.printStackTrace(); throw e; } log.info("merge项预测完成,itemId:" + itemId + ",结果:" + JSON.toJSONString(predictResult)); return predictResult; } }