潘志宝
3 天以前 f0670785bd3909a066fcd28a4e2110f6534c7434
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
@@ -12,6 +12,7 @@
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.MdkPredictDataDTO;
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;
@@ -23,6 +24,7 @@
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.entity.MmPredictModelEntity;
import com.iailab.module.model.mcs.pre.enums.PredGranularityEnum;
import com.iailab.module.model.mcs.pre.service.*;
import com.iailab.module.model.mcs.pre.vo.MmItemOutputRespVO;
@@ -32,7 +34,10 @@
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.StScheduleRecordRespVO;
import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestSaveReqVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestOperationRecordReqVO;
import com.iailab.module.model.mdk.vo.DataValueVO;
import com.iailab.module.model.mdk.vo.ItemVO;
import com.iailab.module.model.mpk.service.ChartParamService;
import com.iailab.module.model.mpk.service.ChartService;
@@ -92,6 +97,9 @@
    private StScheduleSuggestService stScheduleSuggestService;
    @Autowired
    private StSuggestSnapshotRecordService stSuggestSnapshotRecordService;
    @Autowired
    private PlanItemApi planItemApi;
    @Autowired
@@ -119,8 +127,16 @@
    private StScheduleModelSettingService stScheduleModelSettingService;
    @Autowired
    private MmPredictAutoAdjustConfigService autoAdjustService;
    private int HOUR_MINS = 60;
    private MmPredictModelService mmPredictModelService;
    @Autowired
    private MmModelArithSettingsService mmModelArithSettingsService;
    @Autowired
    private StSuggestOperationRecordService stSuggestOperationRecordService;
    @Autowired
    private StSuggestSnapshotConfDetService stSuggestSnapshotConfDetService;
    @Override
    public List<PredictItemTreeDTO> getPredictItemTree() {
@@ -141,6 +157,7 @@
                PredictItemTreeDTO chd = new PredictItemTreeDTO();
                chd.setLabel(item1.getItemName());
                chd.setId(item1.getId());
                chd.setDisabled(true);
                List<PredictItemTreeDTO> chd1 = new ArrayList<>();
                List<MmItemOutputEntity> outList = mmItemOutputService.getByItemid(item1.getId());
                if (!CollectionUtils.isEmpty(outList)) {
@@ -162,131 +179,7 @@
    @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);
            calendar.add(Calendar.MINUTE, 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, reqVO.getPrec()));
            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.setPreDataLOriginal(mmItemResultLastPointService.getData(output.getId(), startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, DataTypeEnum.FLOAT_LAST_BAK));
            viewDto.setCurData(mmItemResultJsonService.getData(output.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
            // 模拟调整曲线
            viewDto.setAdjData(stAdjustResultService.getData(output.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
            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));
            }
            //处理预测累计
            if (output.getIscumulant() == 1) {
                if (StringUtils.isNotBlank(output.getCumulpoint())) {
                    viewDto.setCumulantRealData(getHisData(output.getCumulpoint(), startTime, endTime, reqVO.getPrec()));
                }
                viewDto.setCumulantPreData(mmItemResultService.getData(output.getId() + CommonDict.CUMULANT_SUFFIX, startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
            }
            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;
        return mmItemResultService.getPreDataCharts(reqVO);
    }
    @Override
@@ -417,7 +310,7 @@
        }
        if (!CollectionUtils.isEmpty(realDataMap)) {
            Object curReal = realDataMap.get(DateUtils.format(predictTime, timeFormat)) == null ?
                    dataView.getRealData().get(dataView.getRealData().size() - 1) : realDataMap.get(DateUtils.format(predictTime, timeFormat));
                    dataView.getRealData().get(dataView.getRealData().size() - 1)[1] : realDataMap.get(DateUtils.format(predictTime, timeFormat));
            // 当前值T0 + 当前预测值 20250409
            dataView.setCurData(mmItemResultJsonService.getData(outPut.getId(), predictTime, timeFormat, decimalPlaces, true, curReal));
        } else {
@@ -458,12 +351,23 @@
        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));
                try {
                    return new Double(t[1].toString());
                } catch (NumberFormatException e) {
                    return null;
                }
            }).filter(Objects::nonNull).collect(Collectors.toList());
            if (!curList.isEmpty()) {
                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));
            } else {
                dataView.setPreMax(null);
                dataView.setPreMin(null);
                dataView.setPreLast(null);
                dataView.setPreCumulant(null);
            }
        }
        String alarmObj = chartParams.get(CommonConstant.ALARM_OBJ);
@@ -703,7 +607,11 @@
    @Override
    public Boolean createScheduleSuggest(ScheduleSuggestRespDTO dto) {
        String suggestId = UUID.randomUUID().toString();
        dto.setId(suggestId);
        stScheduleSuggestService.create(ConvertUtils.sourceToTarget(dto, StScheduleSuggestSaveReqVO.class));
        // 根据建议产生快照
        stSuggestSnapshotRecordService.createSnapshotRecord(dto.getModelId(),dto.getScheduleObj(),dto.getScheduleTime(),suggestId);
        return true;
    }
@@ -786,6 +694,7 @@
        return result;
    }
    @Override
    public Map<String, BigDecimal> getPredictLastValue(PredictLastValueReqVO reqVO) {
        Map<String, BigDecimal> result = new HashMap<>(reqVO.getItemNos().size());
        if (CollectionUtils.isEmpty(reqVO.getItemNos())) {
@@ -815,6 +724,36 @@
            }
        }
        return result;
    }
    @Override
    public Map<String, BigDecimal> getPredictValueByTime(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]);
            List<Object[]> curData = mmItemResultJsonService.getData(outPut.getId(), reqVO.getPredictTime(), 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<MdkPredictDataDTO> getPredictTnValue(PredictTnValueReqVO reqVO) {
        List<DataValueVO> list = mmItemResultService.getPredictValue(reqVO.getOutId(), new Date(reqVO.getStartTime()), new Date(reqVO.getEndTime()));
        return ConvertUtils.sourceToTarget(list, MdkPredictDataDTO.class);
    }
    @Override
@@ -946,13 +885,64 @@
    }
    @Override
    public Boolean cancelUseSuggest(StAlarmAndSuggestReqVO reqVO) {
        return stScheduleSuggestService.cancelUseSuggest(reqVO);
    }
    @Override
    public Boolean ignoreSuggest(StAlarmAndSuggestReqVO reqVO) {
        return stScheduleSuggestService.ignoreSuggest(reqVO);
    }
    @Override
    public List<ScheduleSuggestRespDTO> getLastSuggest(Map<String, Object> params) {
        return stScheduleSuggestService.getLastSuggest(params);
    }
    @Override
    public Boolean autoAdjustByCode(MmPredictAutoAdjustReqVO reqVO) {
        return autoAdjustService.autoAdjustByCode(reqVO.getConfigCode(), reqVO.getAdjustStartTime());
    public Boolean updatePredictModelSetting(String modelCode, String key, String value) {
        MmPredictModelEntity model = mmPredictModelService.getByModelCode(modelCode);
        mmModelArithSettingsService.updateByModelIdAndKey(model.getId(), key, value);
        return true;
    }
    @Override
    public Boolean saveSuggestOperationRecord(SuggestOperationRecordReqVO reqVO) {
        StSuggestOperationRecordReqVO operationRecordVo = new StSuggestOperationRecordReqVO();
        operationRecordVo.setSuggestId(reqVO.getId());
        operationRecordVo.setOperate(reqVO.getOperate());
        operationRecordVo.setReason(reqVO.getReason());
        operationRecordVo.setHandler(reqVO.getHandler());
        operationRecordVo.setHandlerId(reqVO.getHandlerId());
        //获取建议信息
        StScheduleSuggestEntity entity = stScheduleSuggestService.getInfo(reqVO.getId());
        if (entity != null){
            operationRecordVo.setTitle(entity.getTitle());
            operationRecordVo.setContent(entity.getContent());
            operationRecordVo.setScheduleObj(entity.getScheduleObj());
            if (StringUtils.isNotBlank(entity.getModelId())){
                //获取模型记录信息
                StScheduleRecordRespVO scheduleRecordVO = stScheduleRecordService.getInfoByModelIdAndScheduleTime(entity.getModelId(), entity.getScheduleTime());
                operationRecordVo.setSchemeId(scheduleRecordVO.getSchemeId());
                operationRecordVo.setModelId(entity.getModelId());
                operationRecordVo.setModelName(scheduleRecordVO.getModelName());
                operationRecordVo.setScheduleTime(entity.getScheduleTime());
                operationRecordVo.setResultCode(scheduleRecordVO.getResultCode());
                operationRecordVo.setResultData(scheduleRecordVO.getResultData());
            }
        }
        stSuggestOperationRecordService.create(operationRecordVo);
        return true;
    }
    @Override
    public List<StSuggestSnapshotRecordRespVO> getSuggestSnapshotAllChartData(String suggestId) {
        return stSuggestSnapshotRecordService.getAllChartData(suggestId);
    }
    @Override
    public Boolean updateSuggestSnapshotConfDetByExt1(StSuggestSnapshotConfDetSaveReqVO updateReqVO) {
        return stSuggestSnapshotConfDetService.updateByExt1(updateReqVO);
    }
    private Date[] calResultTime(ItemVO predictItem, Date startTimeReq, Date endTimeReq, int lengthLeft, int lengthRight) {