package com.iailab.module.model.api;
|
|
import com.iailab.framework.common.pojo.PageResult;
|
import com.iailab.framework.common.util.date.DateUtils;
|
import com.iailab.framework.common.util.object.ConvertUtils;
|
import com.iailab.module.data.api.plan.PlanItemApi;
|
import com.iailab.module.data.api.plan.dto.ApiPlanDataDTO;
|
import com.iailab.module.data.api.point.DataPointApi;
|
import com.iailab.module.data.api.point.dto.ApiPointDTO;
|
import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
|
import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
|
import com.iailab.module.data.common.ApiDataQueryDTO;
|
import com.iailab.module.model.api.mcs.McsApi;
|
import com.iailab.module.model.api.mcs.dto.*;
|
import com.iailab.module.model.api.mdk.dto.StScheduleRecordVO;
|
import com.iailab.module.model.common.enums.CommonDict;
|
import com.iailab.module.model.common.enums.DataTypeEnum;
|
import com.iailab.module.model.common.enums.PreLineTypeEnum;
|
import com.iailab.module.model.enums.CommonConstant;
|
import com.iailab.module.model.influxdb.pojo.InfluxModelResultByOutPutIdsPOJO;
|
import com.iailab.module.model.influxdb.service.InfluxDBService;
|
import com.iailab.module.model.influxdb.vo.InfluxModelResultVO;
|
import com.iailab.module.model.mcs.pre.entity.DmModuleEntity;
|
import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity;
|
import com.iailab.module.model.mcs.pre.entity.MmPredictAlarmMessageEntity;
|
import com.iailab.module.model.mcs.pre.service.*;
|
import com.iailab.module.model.mcs.pre.vo.MmItemOutputRespVO;
|
import com.iailab.module.model.mcs.pre.vo.MmPredictAlarmMessageSaveReqVO;
|
import com.iailab.module.model.mcs.pre.vo.MmPredictItemRespVO;
|
import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity;
|
import com.iailab.module.model.mcs.sche.entity.StScheduleSuggestEntity;
|
import com.iailab.module.model.mcs.sche.service.*;
|
import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestSaveReqVO;
|
import com.iailab.module.model.mdk.vo.ItemVO;
|
import com.iailab.module.model.mpk.service.ChartParamService;
|
import com.iailab.module.model.mpk.service.ChartService;
|
import com.iailab.module.model.mpk.service.ElectricityPriceSegmentedService;
|
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.validation.annotation.Validated;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import java.math.BigDecimal;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author PanZhibao
|
* @Description
|
* @createTime 2024年11月13日
|
*/
|
@Slf4j
|
@RestController
|
@Validated
|
public class McsApiImpl implements McsApi {
|
|
@Autowired
|
private DataPointApi dataPointApi;
|
|
@Autowired
|
private DmModuleService dmModuleService;
|
|
@Autowired
|
private MmPredictItemService mmPredictItemService;
|
|
@Autowired
|
private MmItemOutputService mmItemOutputService;
|
|
@Autowired
|
private MmItemResultService mmItemResultService;
|
|
@Autowired
|
private MmItemResultLastPointService mmItemResultLastPointService;
|
|
@Autowired
|
private MmItemResultJsonService mmItemResultJsonService;
|
|
@Autowired
|
private ChartService chartService;
|
|
@Autowired
|
private MmPredictAlarmMessageService mmPredictAlarmMessageService;
|
|
@Autowired
|
private StScheduleSuggestService stScheduleSuggestService;
|
|
@Autowired
|
private PlanItemApi planItemApi;
|
|
@Autowired
|
private MmPredictAlarmConfigService mmPredictAlarmConfigService;
|
|
@Autowired
|
private StScheduleSchemeService stScheduleSchemeService;
|
|
@Autowired
|
private StScheduleRecordService stScheduleRecordService;
|
|
@Autowired
|
private ChartParamService chartParamService;
|
|
@Autowired
|
private InfluxDBService influxDBService;
|
|
@Autowired
|
private ElectricityPriceSegmentedService electricityPriceSegmentedService;
|
|
@Autowired
|
private StScheduleModelService stScheduleModelService;
|
|
@Autowired
|
private StScheduleModelSettingService stScheduleModelSettingService;
|
|
|
private int HOUR_MINS = 60;
|
|
@Override
|
public List<PredictItemTreeDTO> getPredictItemTree() {
|
List<PredictItemTreeDTO> result = new ArrayList<>();
|
|
List<DmModuleEntity> moduleList = dmModuleService.list(new HashMap<>());
|
if (CollectionUtils.isEmpty(moduleList)) {
|
return result;
|
}
|
moduleList.forEach(item -> {
|
PredictItemTreeDTO moduleOpt = new PredictItemTreeDTO();
|
moduleOpt.setId(item.getId());
|
moduleOpt.setLabel(item.getModulename());
|
moduleOpt.setDisabled(true);
|
List<PredictItemTreeDTO> children = new ArrayList<>();
|
List<ItemVO> itemList = mmPredictItemService.getByModuleId(item.getId());
|
itemList.forEach(item1 -> {
|
PredictItemTreeDTO chd = new PredictItemTreeDTO();
|
chd.setLabel(item1.getItemName());
|
chd.setId(item1.getId());
|
List<PredictItemTreeDTO> chd1 = new ArrayList<>();
|
List<MmItemOutputEntity> outList = mmItemOutputService.getByItemid(item1.getId());
|
if (!CollectionUtils.isEmpty(outList)) {
|
outList.forEach(out -> {
|
PredictItemTreeDTO chd2 = new PredictItemTreeDTO();
|
chd2.setId(out.getId());
|
chd2.setLabel(out.getResultName());
|
chd1.add(chd2);
|
});
|
}
|
chd.setChildren(chd1);
|
children.add(chd);
|
});
|
moduleOpt.setChildren(children);
|
result.add(moduleOpt);
|
});
|
return result;
|
}
|
|
@Override
|
public PreDataBarLineRespVO getPreDataCharts(PreDataBarLineReqVO reqVO) {
|
PreDataBarLineRespVO result = new PreDataBarLineRespVO();
|
List<String> outIds = reqVO.getOutIds();
|
List<String> legends = new ArrayList<>();
|
List<PreDataViewRespDTO> dataViewList = new ArrayList<>();
|
if (CollectionUtils.isEmpty(outIds)) {
|
return result;
|
}
|
Date predictTime = reqVO.getPredictTime();
|
if (predictTime == null) {
|
MmItemOutputEntity output = null;
|
for (String outId : outIds) {
|
output = mmItemOutputService.getOutPutById(outId);
|
if (output != null) {
|
break;
|
}
|
}
|
ItemVO predictItem = mmPredictItemService.getItemById(output.getItemid());
|
if (predictItem.getLastTime() != null) {
|
predictTime = predictItem.getLastTime();
|
} else {
|
Calendar calendar = Calendar.getInstance();
|
calendar.set(Calendar.MILLISECOND, 0);
|
calendar.set(Calendar.SECOND, 0);
|
predictTime = calendar.getTime();
|
}
|
}
|
Date startTime = reqVO.getStartTime();
|
if (startTime == null) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(predictTime);
|
calendar.add(Calendar.HOUR_OF_DAY, -1);
|
startTime = calendar.getTime();
|
}
|
Date endTime = reqVO.getEndTime();
|
if (endTime == null) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(predictTime);
|
calendar.add(Calendar.HOUR_OF_DAY, 1);
|
endTime = calendar.getTime();
|
}
|
|
for (int i = 0; i < outIds.size(); i++) {
|
PreDataViewRespDTO viewDto = new PreDataViewRespDTO();
|
String outId = outIds.get(i);
|
MmItemOutputEntity output = mmItemOutputService.getOutPutById(outId);
|
if (output == null) {
|
continue;
|
}
|
legends.add(output.getResultName());
|
viewDto.setItemId(output.getItemid());
|
viewDto.setOutId(outId);
|
viewDto.setResultstr(output.getResultstr());
|
viewDto.setResultName(output.getResultName());
|
viewDto.setRealData(getHisData(output.getPointid(), startTime, endTime));
|
viewDto.setPreDataN(mmItemResultService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
|
viewDto.setPreDataL(mmItemResultLastPointService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
|
viewDto.setCurData(mmItemResultJsonService.getData(output.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, 3));
|
List<Double> values = new ArrayList<>();
|
if (!CollectionUtils.isEmpty(viewDto.getRealData())) {
|
List<Double> hisValues = new ArrayList<>();
|
viewDto.getRealData().forEach(item -> {
|
values.add(Double.parseDouble(item[1].toString()));
|
hisValues.add(Double.parseDouble(item[1].toString()));
|
});
|
viewDto.setHisMax(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
viewDto.setHisMin(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
viewDto.setHisAvg(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).average().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
viewDto.setHisCumulant(new BigDecimal(hisValues.stream().mapToDouble(Double::doubleValue).sum())
|
.divide(new BigDecimal(HOUR_MINS), 2, BigDecimal.ROUND_HALF_UP));
|
}
|
if (!CollectionUtils.isEmpty(viewDto.getPreDataN())) {
|
viewDto.getPreDataN().forEach(item -> {
|
values.add(Double.parseDouble(item[1].toString()));
|
});
|
}
|
if (!CollectionUtils.isEmpty(viewDto.getPreDataL())) {
|
List<Double> preValues = new ArrayList<>();
|
viewDto.getPreDataL().forEach(item -> {
|
values.add(Double.parseDouble(item[1].toString()));
|
preValues.add(Double.parseDouble(item[1].toString()));
|
});
|
viewDto.setPreMax(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
viewDto.setPreMin(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
viewDto.setPreAvg(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).average().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
}
|
if (!CollectionUtils.isEmpty(viewDto.getCurData())) {
|
List<Double> preValues = new ArrayList<>();
|
viewDto.getCurData().forEach(item -> {
|
values.add(Double.parseDouble(item[1].toString()));
|
preValues.add(Double.parseDouble(item[1].toString()));
|
});
|
viewDto.setPreCumulant(new BigDecimal(preValues.stream().mapToDouble(Double::doubleValue).sum())
|
.divide(new BigDecimal(HOUR_MINS), 2, BigDecimal.ROUND_HALF_UP));
|
}
|
if (!CollectionUtils.isEmpty(viewDto.getAdjData())) {
|
viewDto.getAdjData().forEach(item -> {
|
values.add(Double.parseDouble(item[1].toString()));
|
});
|
}
|
if (!CollectionUtils.isEmpty(values)) {
|
viewDto.setMaxValue(new BigDecimal(values.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
viewDto.setMinValue(new BigDecimal(values.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
}
|
dataViewList.add(viewDto);
|
}
|
result.setStartTime(startTime);
|
result.setEndTime(endTime);
|
result.setPredictTime(predictTime);
|
result.setCategories(DateUtils.getTimeScale(startTime, endTime, 60));
|
result.setLegend(legends);
|
result.setDataViewList(dataViewList);
|
return result;
|
}
|
|
@Override
|
public PreDataItemChartRespVO getPreDataItemChart(PreDataItemChartReqVO reqVO) {
|
PreDataItemChartRespVO result = new PreDataItemChartRespVO();
|
ItemVO predictItem = mmPredictItemService.getItemById(reqVO.getItemId());
|
if (predictItem == null) {
|
return result;
|
}
|
if (predictItem.getLastTime() == null) {
|
return result;
|
}
|
result.setPredictTime(predictItem.getLastTime());
|
Date startTime = reqVO.getStartTime();
|
if (startTime == null) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(predictItem.getLastTime());
|
calendar.add(Calendar.SECOND, -1 * predictItem.getPredictLength() * predictItem.getGranularity());
|
startTime = calendar.getTime();
|
}
|
Date endTime = reqVO.getEndTime();
|
if (endTime == null) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(predictItem.getLastTime());
|
calendar.add(Calendar.SECOND, predictItem.getPredictLength() * predictItem.getGranularity());
|
endTime = calendar.getTime();
|
}
|
if (endTime.getTime() <= startTime.getTime()) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(startTime);
|
calendar.add(Calendar.SECOND, predictItem.getPredictLength() * predictItem.getGranularity());
|
endTime = calendar.getTime();
|
}
|
|
List<String> categories = DateUtils.getTimeScale(startTime, endTime, predictItem.getGranularity());
|
List<String> legend = new ArrayList<>();
|
LinkedHashMap<String, PreDataSampleViewRespDTO> viewMap = new LinkedHashMap<>();
|
List<MmItemOutputEntity> outs = mmItemOutputService.getByItemid(reqVO.getItemId());
|
if (CollectionUtils.isEmpty(outs)) {
|
return result;
|
}
|
for (MmItemOutputEntity out : outs) {
|
legend.add(out.getResultName());
|
PreDataSampleViewRespDTO viewDto = new PreDataSampleViewRespDTO();
|
if (StringUtils.isNotBlank(out.getPointid())) {
|
viewDto.setRealData(getHisData(out.getPointid(), startTime, endTime));
|
}
|
viewDto.setPreDataN(mmItemResultService.getData(out.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
|
//处理累计点
|
if (out.getIscumulant() == 1) {
|
if (StringUtils.isNotBlank(out.getCumulpoint())) {
|
viewDto.setCumulantRealData(getHisData(out.getPointid() + CommonDict.CUMULANT_SUFFIX, startTime, endTime));
|
}
|
viewDto.setCumulantPreData(mmItemResultService.getData(out.getId() + CommonDict.CUMULANT_SUFFIX, startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
|
}
|
|
viewMap.put(out.getResultName(), viewDto);
|
}
|
result.setStartTime(startTime);
|
result.setEndTime(endTime);
|
result.setCategories(categories);
|
result.setLegend(legend);
|
result.setViewMap(viewMap);
|
return result;
|
}
|
|
@Override
|
public PreDataSingleChartRespVO getPreDataSingleChart(PreDataSingleChartReqVO reqVO) {
|
PreDataSingleChartRespVO result = new PreDataSingleChartRespVO();
|
|
Map<String, String> chartParams = chartService.getByChartCode(reqVO.getChartCode());
|
if (CollectionUtils.isEmpty(chartParams)) {
|
return result;
|
}
|
String itemCode = chartParams.get(CommonConstant.ITEM_CODE);
|
if (itemCode == null) {
|
return result;
|
}
|
String resultStr = chartParams.get(CommonConstant.RESULT_STR);
|
if (resultStr == null) {
|
return result;
|
}
|
String resultIndex = chartParams.get(CommonConstant.RESULT_INDEX);
|
|
ItemVO predictItem = mmPredictItemService.getItemByItemNo(itemCode);
|
if (predictItem == null || predictItem.getLastTime() == null) {
|
return result;
|
}
|
String timeFormat = StringUtils.isBlank(reqVO.getTimeFormat()) ? DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND : reqVO.getTimeFormat();
|
PreLineTypeEnum lineType = chartParams.get(CommonConstant.LINE_TYPE) == null ? PreLineTypeEnum.TN : PreLineTypeEnum.getEumByCode(chartParams.get(CommonConstant.LINE_TYPE));
|
BigDecimal rangeH = chartParams.get(CommonConstant.RANGE_H) == null ? null : new BigDecimal(chartParams.get(CommonConstant.RANGE_H));
|
BigDecimal rangeL = chartParams.get(CommonConstant.RANGE_L) == null ? null : new BigDecimal(chartParams.get(CommonConstant.RANGE_L));
|
BigDecimal limitH = chartParams.get(CommonConstant.LIMIT_H) == null ? null : new BigDecimal(chartParams.get(CommonConstant.LIMIT_H));
|
BigDecimal limitL = chartParams.get(CommonConstant.LIMIT_L) == null ? null : new BigDecimal(chartParams.get(CommonConstant.LIMIT_L));
|
int lengthLeft = chartParams.get(CommonConstant.LENGTH_LEFT) == null ? predictItem.getPredictLength() : new BigDecimal(chartParams.get(CommonConstant.LENGTH_LEFT)).intValue();
|
int lengthRight = chartParams.get(CommonConstant.LENGTH_RIGHT) == null ? predictItem.getPredictLength() : new BigDecimal(chartParams.get(CommonConstant.LENGTH_RIGHT)).intValue();
|
|
Date[] timeArray = calResultTime(predictItem, reqVO.getStartTime(), reqVO.getEndTime(), lengthLeft, lengthRight);
|
Date predictTime = timeArray[0];
|
Date startTime = timeArray[1];
|
Date endTime = timeArray[2];
|
|
List<String> categories = DateUtils.getTimeScale(startTime, endTime, predictItem.getGranularity(), timeFormat);
|
List<String> legend = new ArrayList<>();
|
MmItemOutputEntity outPut = mmItemOutputService.getByItemid(predictItem.getId(), resultStr, resultIndex);
|
PreDataViewRespDTO dataView = new PreDataViewRespDTO();
|
dataView.setItemId(predictItem.getId());
|
dataView.setItemName(predictItem.getItemName());
|
dataView.setResultstr(resultStr);
|
dataView.setRangeH(rangeH);
|
dataView.setRangeL(rangeL);
|
dataView.setLimitH(limitH);
|
dataView.setLimitL(limitL);
|
if (StringUtils.isNotBlank(outPut.getPointid())) {
|
dataView.setRealData(getHisData(outPut.getPointid(), startTime, endTime, timeFormat));
|
} else {
|
dataView.setRealData(new ArrayList<>());
|
}
|
dataView.setCurData(mmItemResultJsonService.getData(outPut.getId(), predictTime, timeFormat));
|
dataView.setLineType(lineType.getCode());
|
switch (lineType) {
|
case TN:
|
dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), startTime, endTime, timeFormat));
|
break;
|
case TL:
|
dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), predictTime, endTime, timeFormat));
|
dataView.setPreDataL(mmItemResultLastPointService.getData(outPut.getId(), startTime, endTime, timeFormat));
|
break;
|
default:
|
break;
|
}
|
if (!CollectionUtils.isEmpty(dataView.getRealData())) {
|
Object[] rdo = dataView.getRealData().get(dataView.getRealData().size() - 1);
|
dataView.setCurrValue(new BigDecimal(rdo[1].toString()));
|
}
|
|
if (!CollectionUtils.isEmpty(dataView.getCurData())) {
|
List<Double> curList = dataView.getCurData().stream().map(t -> {
|
return new Double(t[1].toString());
|
}).collect(Collectors.toList());
|
dataView.setPreMax(new BigDecimal(curList.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
dataView.setPreMin(new BigDecimal(curList.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
dataView.setPreLast(new BigDecimal(curList.get(curList.size() - 1)).setScale(2, BigDecimal.ROUND_HALF_UP));
|
dataView.setPreCumulant(new BigDecimal(curList.stream().mapToDouble(Double::doubleValue).sum()).setScale(2, BigDecimal.ROUND_HALF_UP));
|
}
|
|
String alarmObj = chartParams.get(CommonConstant.ALARM_OBJ);
|
if (StringUtils.isNotBlank(alarmObj)) {
|
List<AlarmMessageRespDTO> alarmList = ConvertUtils.sourceToTarget(mmPredictAlarmMessageService.getList(alarmObj, predictTime), AlarmMessageRespDTO.class);
|
dataView.setAlarmList(alarmList);
|
if (CollectionUtils.isEmpty(alarmList)) {
|
dataView.setAlarmMessage("暂无预警信息");
|
} else {
|
dataView.setAlarmMessage(alarmList.get(0).getContent());
|
}
|
}
|
|
try {
|
String adjValuePoint = chartParams.get(CommonConstant.ADJ_VALUE_POINT);
|
if (StringUtils.isNotBlank(adjValuePoint)) {
|
List<String> pointNos = new ArrayList<>();
|
pointNos.add(adjValuePoint);
|
Map<String, Object> adjValue = dataPointApi.queryPointsRealValue(pointNos);
|
dataView.setAdjValue(new BigDecimal(adjValue.get(adjValuePoint).toString()));
|
}
|
|
String adjValueArrPoint = chartParams.get(CommonConstant.ADJ_VALUE_ARR_POINT);
|
if (StringUtils.isNotBlank(adjValueArrPoint)) {
|
String[] adjPointArr = adjValueArrPoint.split(",");
|
Map<String, Object> adjValue = dataPointApi.queryPointsRealValue(Arrays.asList(adjPointArr));
|
BigDecimal[] adjValueArr = new BigDecimal[adjPointArr.length];
|
for(int i = 0; i < adjPointArr.length; i++) {
|
adjValueArr[i] = new BigDecimal(adjValue.get(adjPointArr[i]).toString());
|
}
|
dataView.setAdjValueArr(adjValueArr);
|
}
|
} catch (Exception ex) {
|
ex.printStackTrace();
|
}
|
|
result.setPredictTime(predictTime);
|
result.setStartTime(startTime);
|
result.setEndTime(endTime);
|
result.setCategories(categories);
|
result.setLegend(legend);
|
result.setDataView(dataView);
|
return result;
|
}
|
|
@Override
|
public Map<String, List<Object[]>> getPreDataCur(PreDataJsonReqVO reqVO) {
|
Map<String, List<Object[]>> result = new HashMap<>();
|
if (reqVO == null || reqVO.getPredictTime() == null || CollectionUtils.isEmpty(reqVO.getOutputIdList())) {
|
return result;
|
}
|
reqVO.getOutputIdList().forEach(outPutId -> {
|
result.put(outPutId, mmItemResultJsonService.getData(outPutId, reqVO.getPredictTime(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
|
});
|
return result;
|
}
|
|
@Override
|
public PlanDataSingleChartRespVO getPlanDataSingleChart(PreDataSingleChartReqVO reqVO) {
|
PlanDataSingleChartRespVO result = new PlanDataSingleChartRespVO();
|
Map<String, String> chartParams = chartService.getByChartCode(reqVO.getChartCode());
|
if (CollectionUtils.isEmpty(chartParams)) {
|
return result;
|
}
|
String itemCode = chartParams.get(CommonConstant.ITEM_CODE);
|
if (itemCode == null) {
|
return result;
|
}
|
String planItemStr = chartParams.get(CommonConstant.PLAN_ITEM_LIST);
|
if (planItemStr == null) {
|
return result;
|
}
|
List<String> planItemCodeList = Arrays.asList(planItemStr.split(","));
|
|
ItemVO predictItem = mmPredictItemService.getItemByItemNo(itemCode);
|
if (predictItem == null || predictItem.getLastTime() == null) {
|
return result;
|
}
|
String timeFormat = StringUtils.isBlank(reqVO.getTimeFormat()) ? DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND : reqVO.getTimeFormat();
|
int lengthLeft = chartParams.get(CommonConstant.LENGTH_LEFT) == null ? predictItem.getPredictLength() : new BigDecimal(chartParams.get(CommonConstant.LENGTH_LEFT)).intValue();
|
int lengthRight = chartParams.get(CommonConstant.LENGTH_RIGHT) == null ? predictItem.getPredictLength() : new BigDecimal(chartParams.get(CommonConstant.LENGTH_RIGHT)).intValue();
|
Date[] timeArray = calResultTime(predictItem, reqVO.getStartTime(), reqVO.getEndTime(), lengthLeft, lengthRight);
|
Date predictTime = timeArray[0];
|
Date startTime = timeArray[1];
|
Date endTime = timeArray[2];
|
List<String> categories = DateUtils.getTimeScale(startTime, endTime, predictItem.getGranularity(), timeFormat);
|
List<String> legend = new ArrayList<>();
|
LinkedHashMap<String, List<PlanDataRecordDTO>> record = new LinkedHashMap<>();
|
ApiDataQueryDTO queryDTO = new ApiDataQueryDTO();
|
queryDTO.setItemNos(planItemCodeList);
|
queryDTO.setStart(startTime);
|
queryDTO.setEnd(endTime);
|
LinkedHashMap<String, List<ApiPlanDataDTO>> planData = planItemApi.queryPlanItemRecordValue(queryDTO);
|
if (CollectionUtils.isEmpty(planData)) {
|
planData.forEach((key, value) -> {
|
record.put(key, ConvertUtils.sourceToTarget(value, PlanDataRecordDTO.class));
|
});
|
}
|
result.setPredictTime(predictTime);
|
result.setStartTime(startTime);
|
result.setEndTime(endTime);
|
result.setCategories(categories);
|
result.setLegend(legend);
|
result.setRecord(record);
|
return result;
|
}
|
|
/**
|
* 获取真实值
|
*
|
* @param pointId
|
* @param startTime
|
* @param endTime
|
* @return
|
*/
|
private List<Object[]> getHisData(String pointId, Date startTime, Date endTime) {
|
List<Object[]> result = new ArrayList<>();
|
ApiPointDTO pointDTO = dataPointApi.getInfoById(pointId);
|
ApiPointValueQueryDTO queryPointDto = new ApiPointValueQueryDTO();
|
queryPointDto.setPointNo(pointDTO.getPointNo());
|
queryPointDto.setStart(startTime);
|
queryPointDto.setEnd(endTime);
|
List<ApiPointValueDTO> valueDTOS = dataPointApi.queryPointHistoryValue(queryPointDto);
|
if (CollectionUtils.isEmpty(valueDTOS)) {
|
return result;
|
}
|
valueDTOS.forEach(item -> {
|
Object[] values = new Object[2];
|
values[0] = DateUtils.format(item.getT(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
|
values[1] = new BigDecimal(item.getV()).setScale(2, BigDecimal.ROUND_HALF_UP);
|
result.add(values);
|
});
|
return result;
|
}
|
|
/**
|
* 获取真实值
|
*
|
* @param pointId
|
* @param startTime
|
* @param endTime
|
* @param timeFormat
|
* @return
|
*/
|
private List<Object[]> getHisData(String pointId, Date startTime, Date endTime, String timeFormat) {
|
List<Object[]> result = new ArrayList<>();
|
ApiPointDTO pointDTO = dataPointApi.getInfoById(pointId);
|
ApiPointValueQueryDTO queryPointDto = new ApiPointValueQueryDTO();
|
queryPointDto.setPointNo(pointDTO.getPointNo());
|
queryPointDto.setStart(startTime);
|
queryPointDto.setEnd(endTime);
|
List<ApiPointValueDTO> valueDTOS = dataPointApi.queryPointHistoryValue(queryPointDto);
|
if (CollectionUtils.isEmpty(valueDTOS)) {
|
return result;
|
}
|
valueDTOS.forEach(item -> {
|
Object[] values = new Object[2];
|
values[0] = DateUtils.format(item.getT(), timeFormat);
|
values[1] = new BigDecimal(item.getV()).setScale(2, BigDecimal.ROUND_HALF_UP);
|
result.add(values);
|
});
|
return result;
|
}
|
|
/**
|
* 新增预警信息
|
*
|
* @param dto
|
* @return
|
*/
|
@Override
|
public Boolean createAlarmMessage(AlarmMessageRespDTO dto) {
|
try {
|
mmPredictAlarmMessageService.create(ConvertUtils.sourceToTarget(dto, MmPredictAlarmMessageSaveReqVO.class));
|
return true;
|
} catch (Exception e) {
|
return false;
|
}
|
}
|
|
@Override
|
public List<AlarmMessageRespDTO> listAlarmMessage(Map<String, Object> params) {
|
return null;
|
}
|
|
@Override
|
public List<AlarmConfigRespDTO> listAlarmConfig(Map<String, Object> params) {
|
return mmPredictAlarmConfigService.list(params);
|
}
|
|
@Override
|
public AlarmMessageRespDTO getLastAlarmMessage(String alarmObj) {
|
MmPredictAlarmMessageEntity entity = mmPredictAlarmMessageService.getLast(alarmObj);
|
return ConvertUtils.sourceToTarget(entity, AlarmMessageRespDTO.class);
|
}
|
|
@Override
|
public Boolean createScheduleSuggest(ScheduleSuggestRespDTO dto) {
|
stScheduleSuggestService.create(ConvertUtils.sourceToTarget(dto, StScheduleSuggestSaveReqVO.class));
|
return true;
|
}
|
|
@Override
|
public List<ScheduleSuggestRespDTO> listScheduleSuggest(ScheduleSuggestReqDTO vo) {
|
return stScheduleSuggestService.list(vo);
|
}
|
|
@Override
|
public List<ScheduleSuggestRespDTO> getLastLimitScheduleSuggest(String scheduleObj, Integer limit) {
|
List<StScheduleSuggestEntity> list = stScheduleSuggestService.getList(scheduleObj, limit);
|
return ConvertUtils.sourceToTarget(list, ScheduleSuggestRespDTO.class);
|
}
|
|
@Override
|
public Boolean modifyPredictModelSetting(List<PredictModelSettingReqDTO> dtos) {
|
return true;
|
}
|
|
@Override
|
public Boolean modifyScheduleModelSetting(List<ScheduleModelSettingReqDTO> dtos) {
|
return true;
|
}
|
|
@Override
|
public List<StScheduleSchemeDTO> listScheduleScheme(String triggerMethod, String triggerCondition) {
|
Map<String, Object> params = new HashMap<>();
|
params.put("triggerMethod", triggerMethod);
|
params.put("triggerCondition", triggerCondition);
|
return stScheduleSchemeService.list(params);
|
}
|
|
@Override
|
public List<ChartParamDTO> getChartParamList(String chartCode) {
|
if (StringUtils.isBlank(chartCode)) {
|
return null;
|
}
|
return chartParamService.list(chartCode);
|
}
|
|
@Override
|
public PageResult<StAlarmAndSuggestRespVO> getAlarmAndSuggestPage(StAlarmAndSuggestPageReqVO reqVO) {
|
return stScheduleSchemeService.getAlarmAndSuggestPage(reqVO);
|
}
|
|
@Override
|
public Map<String, Map<String, Double>> getPreDoubleData(PreDoubleDataReqVO reqVO) {
|
List<MmPredictItemRespVO> doubleItemOutPuts = mmPredictItemService.getDoubleOutPutsByItemNos(reqVO.getItemNos());
|
|
//<itemNo,<resultStr,double>>
|
Map<String, Map<String, Double>> result = new HashMap<>(reqVO.getItemNos().size());
|
|
for (MmPredictItemRespVO mmPredictItemRespVO : doubleItemOutPuts) {
|
List<String> outPutIds = mmPredictItemRespVO.getOutPuts().stream().map(MmItemOutputRespVO::getId).collect(Collectors.toList());
|
InfluxModelResultByOutPutIdsPOJO pojo = new InfluxModelResultByOutPutIdsPOJO();
|
pojo.setOutPutIds(outPutIds);
|
pojo.setType(DataTypeEnum.FLOAT.getCode());
|
Map<String, List<InfluxModelResultVO>> outPutIdDoubles = influxDBService.queryModelResultsByOutPutIds(pojo, mmPredictItemRespVO.getLastTime(), mmPredictItemRespVO.getLastTime());
|
Map<String, Double> outPutIdDouble = new HashMap<>(outPutIds.size());
|
for (MmItemOutputRespVO outPut : mmPredictItemRespVO.getOutPuts()) {
|
String outPutId = outPut.getId();
|
if (outPutIdDoubles.containsKey(outPutId)) {
|
List<InfluxModelResultVO> influxModelResultVOS = outPutIdDoubles.get(outPutId);
|
if (!CollectionUtils.isEmpty(influxModelResultVOS)) {
|
outPutIdDouble.put(outPut.getResultstr(),Double.valueOf(influxModelResultVOS.get(0).getValue().toString()));
|
}
|
}
|
}
|
result.put(mmPredictItemRespVO.getItemno(),outPutIdDouble);
|
}
|
return result;
|
}
|
|
public Map<String, BigDecimal> getPredictLastValue(PredictLastValueReqVO reqVO) {
|
Map<String, BigDecimal> result = new HashMap<>(reqVO.getItemNos().size());
|
if (CollectionUtils.isEmpty(reqVO.getItemNos())) {
|
return result;
|
}
|
List<String[]> itemNos = reqVO.getItemNos();
|
for (String[] itemNo : itemNos) {
|
String key = itemNo[0] + "_" + itemNo[1] + "_" + itemNo[2];
|
ItemVO predictItem = mmPredictItemService.getItemByItemNo(itemNo[0]);
|
if (predictItem == null || predictItem.getLastTime() == null) {
|
result.put(key, BigDecimal.ZERO);
|
}
|
MmItemOutputEntity outPut = mmItemOutputService.getByItemid(predictItem.getId(), itemNo[1], itemNo[2]);
|
|
Date predictTime = predictItem.getLastTime();
|
List<Object[]> curData = mmItemResultJsonService.getData(outPut.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
|
if(CollectionUtils.isEmpty(curData)) {
|
result.put(key, BigDecimal.ZERO);
|
} else {
|
result.put(key, new BigDecimal(curData.get(curData.size() - 1)[1].toString()));
|
}
|
}
|
return result;
|
}
|
|
@Override
|
public List<StScheduleRecordVO> getLastScheduleData(String scheduleCode, Integer limit) {
|
if (StringUtils.isBlank(scheduleCode)) {
|
return null;
|
}
|
return stScheduleRecordService.getLastScheduleResult(scheduleCode,limit);
|
}
|
|
@Override
|
public Map<String, List<Object[]>> getPredictDataItemNo(PreDataItemNoReqVO reqVO) {
|
if (StringUtils.isBlank(reqVO.getItemNo())) {
|
return new HashMap<>();
|
}
|
ItemVO predictItem = mmPredictItemService.getItemByItemNo(reqVO.getItemNo());
|
if (null == predictItem) {
|
return new HashMap<>();
|
}
|
|
// 默认开始时间:运行时间
|
if (null == reqVO.getStartTime()) {
|
reqVO.setStartTime(predictItem.getLastTime());
|
}
|
// 默认结束时间:运行时间+预测长度*粒度
|
if (null == reqVO.getEndTime()) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(predictItem.getLastTime());
|
calendar.add(Calendar.SECOND,predictItem.getPredictLength() * predictItem.getGranularity());
|
reqVO.setEndTime(calendar.getTime());
|
}
|
|
List<String> itemNos = new ArrayList<String>(){{
|
add(reqVO.getItemNo());
|
}};
|
List<MmPredictItemRespVO> ItemRespVOs = mmPredictItemService.getArrayOutPutsByItemNos(itemNos);
|
if (CollectionUtils.isEmpty(ItemRespVOs)) {
|
return new HashMap<>();
|
}
|
List<MmItemOutputRespVO> outPuts = ItemRespVOs.get(0).getOutPuts();
|
if (CollectionUtils.isEmpty(outPuts)) {
|
return new HashMap<>();
|
}
|
|
InfluxModelResultByOutPutIdsPOJO pojo = new InfluxModelResultByOutPutIdsPOJO();
|
pojo.setOutPutIds(outPuts.stream().map(MmItemOutputRespVO::getId).collect(Collectors.toList()));
|
pojo.setType(DataTypeEnum.FLOAT.getCode());
|
Map<String, List<InfluxModelResultVO>> outPutDatas = influxDBService.queryModelResultsByOutPutIds(pojo, reqVO.getStartTime(), reqVO.getEndTime());
|
Map<String,List<Object[]>> result = new HashMap<>(outPuts.size());
|
for (MmItemOutputRespVO outPut : outPuts) {
|
String outPutId = outPut.getId();
|
if (outPutDatas.containsKey(outPutId)) {
|
List<InfluxModelResultVO> influxModelResultVOS = outPutDatas.get(outPutId);
|
result.put(null == outPut.getResultIndex() ? outPut.getResultstr() : outPut.getResultstr()+"_"+outPut.getResultIndex(),influxModelResultVOS.stream().map(e -> {
|
Object[] values = new Object[2];
|
values[0] = DateUtils.format(Date.from(e.getTimestamp()), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
|
values[1] = Double.valueOf(e.getValue().toString());
|
return values;
|
}).collect(Collectors.toList()));
|
}
|
}
|
return result;
|
}
|
|
@Override
|
public List<ElectricityPriceSegmentedDTO> getElectricityPriceList(String year, String time) {
|
return electricityPriceSegmentedService.getElectricityPriceList(year, time);
|
}
|
|
@Override
|
public Boolean createElectricityPrice(List<ElectricityPriceSegmentedDTO> list) {
|
electricityPriceSegmentedService.deleteByITimeId(list.get(0).getITimeId());
|
list.forEach(dto -> electricityPriceSegmentedService.create(dto));
|
return true;
|
}
|
|
@Override
|
public Boolean updateScheduleModelSetting(String modelCode, String key, String value) {
|
StScheduleModelEntity model = stScheduleModelService.getByModelCode(modelCode);
|
stScheduleModelSettingService.updateByModelIdAndKey(model.getId(), key, value);
|
return true;
|
}
|
|
/**
|
* 计算功率因数 p²/(根号:p²+Q²)
|
**/
|
public Double calculateCos(Double PValue,Double QValue) {
|
// 绝对值
|
PValue = Math.abs(PValue);
|
QValue = Math.abs(QValue);
|
//PValue [0,0.001] 直接判断为关闭返回0
|
if (PValue >= 0 && PValue <= 0.001) {
|
return 0.0;
|
}else {
|
BigDecimal result = new BigDecimal(PValue).divide(BigDecimal.valueOf(Math.sqrt(Math.pow(PValue, 2) + Math.pow(QValue, 2))), 2, BigDecimal.ROUND_HALF_UP);
|
return result.doubleValue();
|
}
|
}
|
|
private Date[] calResultTime(ItemVO predictItem, Date startTimeReq, Date endTimeReq, int lengthLeft, int lengthRight) {
|
Date[] result = new Date[3];
|
Date predictTime = predictItem.getLastTime();
|
Integer granularity = predictItem.getGranularity();
|
Date startTime = startTimeReq;
|
if (startTime == null) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(predictItem.getLastTime());
|
calendar.add(Calendar.SECOND, -1 * lengthLeft * granularity);
|
startTime = calendar.getTime();
|
}
|
Date endTime = endTimeReq;
|
if (endTime == null) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(predictItem.getLastTime());
|
calendar.add(Calendar.SECOND, lengthRight * granularity);
|
endTime = calendar.getTime();
|
}
|
if (endTime.getTime() <= startTime.getTime()) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(startTime);
|
calendar.add(Calendar.SECOND, lengthRight * granularity);
|
endTime = calendar.getTime();
|
}
|
result[0] = predictTime;
|
result[1] = startTime;
|
result[2] = endTime;
|
return result;
|
}
|
}
|