package com.iailab.module.model.api;
|
|
import com.iailab.framework.common.util.date.DateUtils;
|
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.model.api.mcs.McsApi;
|
import com.iailab.module.model.api.mcs.dto.*;
|
import com.iailab.module.model.common.enums.CommonConstant;
|
import com.iailab.module.model.common.enums.PreLineTypeEnum;
|
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.service.*;
|
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 lombok.extern.slf4j.Slf4j;
|
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.*;
|
|
/**
|
* @author PanZhibao
|
* @Description
|
* @createTime 2024年11月13日
|
*/
|
@Slf4j
|
@RestController
|
@Validated
|
public class McsApiImpl implements McsApi {
|
|
@Autowired
|
private DmModuleService dmModuleService;
|
|
@Autowired
|
private MmPredictItemService mmPredictItemService;
|
|
@Autowired
|
private MmItemOutputService mmItemOutputService;
|
|
@Autowired
|
private MmItemResultService mmItemResultService;
|
|
@Autowired
|
private MmItemResultLastPointService mmItemResultLastPointService;
|
|
@Autowired
|
private DataPointApi dataPointApi;
|
|
@Autowired
|
private MmItemResultJsonService mmItemResultJsonService;
|
|
@Autowired
|
private ChartService chartService;
|
|
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());
|
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.getResultstr());
|
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 = mmItemOutputService.getOutPutById(reqVO.getOutIds().get(0));
|
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.getResultstr());
|
viewDto.setItemId(output.getItemid());
|
viewDto.setOutId(outId);
|
viewDto.setResultstr(output.getResultstr());
|
viewDto.setRealData(getHisData(output.getPointid(), startTime, endTime));
|
viewDto.setPreDataN(mmItemResultService.getData(output.getId(), startTime, endTime));
|
viewDto.setPreDataL(mmItemResultLastPointService.getData(output.getId(), startTime, endTime));
|
|
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.MINUTE, -1 * predictItem.getPredictLength());
|
startTime = calendar.getTime();
|
}
|
Date endTime = reqVO.getEndTime();
|
if (endTime == null) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(predictItem.getLastTime());
|
calendar.add(Calendar.MINUTE, predictItem.getPredictLength());
|
endTime = calendar.getTime();
|
}
|
if (endTime.getTime() <= startTime.getTime()) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(startTime);
|
calendar.add(Calendar.MINUTE, predictItem.getPredictLength());
|
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.getResultstr());
|
PreDataSampleViewRespDTO viewDto = new PreDataSampleViewRespDTO();
|
viewDto.setRealData(getHisData(out.getPointid(), startTime, endTime));
|
viewDto.setPreDataN(mmItemResultService.getData(out.getId(), startTime, endTime));
|
viewMap.put(out.getResultstr(), 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;
|
}
|
ItemVO predictItem = mmPredictItemService.getItemByItemNo(itemCode);
|
if (predictItem == null || predictItem.getLastTime() == null) {
|
return result;
|
}
|
PreLineTypeEnum lineType = chartParams.get(CommonConstant.LINE_TYPE) == null ? PreLineTypeEnum.TN : PreLineTypeEnum.valueOf(chartParams.get(CommonConstant.LINE_TYPE));
|
BigDecimal rangeH = chartParams.get(CommonConstant.RANGE_H) == null ? BigDecimal.ZERO : new BigDecimal(chartParams.get(CommonConstant.RANGE_H));
|
BigDecimal rangeL = chartParams.get(CommonConstant.RANGE_L) == null ? BigDecimal.ZERO : new BigDecimal(chartParams.get(CommonConstant.RANGE_L));
|
BigDecimal limitH = chartParams.get(CommonConstant.LIMIT_H) == null ? BigDecimal.ZERO : new BigDecimal(chartParams.get(CommonConstant.LIMIT_H));
|
BigDecimal limitL = chartParams.get(CommonConstant.LIMIT_L) == null ? BigDecimal.ZERO : 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();
|
result.setPredictTime(predictItem.getLastTime());
|
Date predictTime = predictItem.getLastTime();
|
Date startTime = reqVO.getStartTime();
|
if (startTime == null) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(predictItem.getLastTime());
|
calendar.add(Calendar.MINUTE, -1 * lengthLeft);
|
startTime = calendar.getTime();
|
}
|
Date endTime = reqVO.getEndTime();
|
if (endTime == null) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(predictItem.getLastTime());
|
calendar.add(Calendar.MINUTE, lengthRight);
|
endTime = calendar.getTime();
|
}
|
if (endTime.getTime() <= startTime.getTime()) {
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(startTime);
|
calendar.add(Calendar.MINUTE, lengthRight);
|
endTime = calendar.getTime();
|
}
|
List<String> categories = DateUtils.getTimeScale(startTime, endTime, predictItem.getGranularity());
|
List<String> legend = new ArrayList<>();
|
MmItemOutputEntity outPut = mmItemOutputService.getByItemid(predictItem.getId(), resultStr);
|
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);
|
dataView.setRealData(getHisData(outPut.getPointid(), startTime, endTime));
|
dataView.setCurData(mmItemResultJsonService.getData(outPut.getId(), predictTime));
|
switch (lineType) {
|
case TN:
|
dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), startTime, endTime));
|
break;
|
case TL:
|
dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), predictTime, endTime));
|
dataView.setPreDataL(mmItemResultLastPointService.getData(outPut.getId(), startTime, endTime));
|
break;
|
default:
|
break;
|
}
|
result.setStartTime(startTime);
|
result.setEndTime(endTime);
|
result.setCategories(categories);
|
result.setLegend(legend);
|
result.setDataView(dataView);
|
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;
|
}
|
|
@Override
|
public Boolean createAlarmMessage(AlarmMessageRespDTO dto) {
|
return true;
|
}
|
|
@Override
|
public List<AlarmMessageRespDTO> listAlarmMessage(Map<String, Object> params) {
|
return null;
|
}
|
|
@Override
|
public Boolean createScheduleSuggest(ScheduleSuggestRespDTO dto) {
|
return true;
|
}
|
|
@Override
|
public List<ScheduleSuggestRespDTO> listScheduleSuggest(ScheduleSuggestReqDTO params) {
|
return null;
|
}
|
|
@Override
|
public Boolean modifyPredictModelSetting(List<PredictModelSettingReqDTO> dtos) {
|
return true;
|
}
|
|
@Override
|
public Boolean modifyScheduleModelSetting(List<ScheduleModelSettingReqDTO> dtos) {
|
return true;
|
}
|
}
|