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<String, double[]> 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<Character> 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<MmItemOutputEntity> outputServiceByItemid = mmItemOutputService.getByItemid(itemId);
|
if (!CollectionUtils.isEmpty(outputServiceByItemid)) {
|
Map<MmItemOutputEntity, double[]> 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<StAdjustDeviationDTO> 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<Character> operator = new ArrayList<>();
|
for (int i = 0; i < expression.length(); i++) {
|
if (expression.charAt(i) == '+' || expression.charAt(i) == '-') {
|
operator.add(expression.charAt(i));
|
}
|
}
|
Map<String, double[]> 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<MmItemOutputEntity> outputServiceByItemid = mmItemOutputService.getByItemid(itemId);
|
if (!CollectionUtils.isEmpty(outputServiceByItemid)) {
|
Map<MmItemOutputEntity, double[]> 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;
|
}
|
}
|