潘志宝
9 天以前 caa63a39e63cc6fb80b97cfd94fbc0199d887931
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
@@ -23,6 +23,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.enums.PredGranularityEnum;
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.MmPredictAlarmConfigSaveReqVO;
@@ -118,7 +119,7 @@
    private StScheduleModelSettingService stScheduleModelSettingService;
    @Autowired
    private StAdjustConfigService stAdjustConfigService;
    private MmPredictAutoAdjustConfigService autoAdjustService;
    private int HOUR_MINS = 60;
    @Override
@@ -218,6 +219,7 @@
            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));
@@ -341,7 +343,7 @@
                viewDto.setCumulantPreData(mmItemResultService.getData(out.getId() + CommonDict.CUMULANT_SUFFIX, startTime, endTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
            }
            // 调整预测值
            viewDto.setAdjData(stAdjustResultService.getData(out.getId(),predictItem.getLastTime(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
            viewDto.setAdjData(stAdjustResultService.getData(out.getId(), predictItem.getLastTime(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND));
            viewMap.put(out.getResultName(), viewDto);
        }
@@ -384,6 +386,7 @@
        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();
        int decimalPlaces = chartParams.get(CommonConstant.DECIMAL_PLACES) == null ? 3 : new BigDecimal(chartParams.get(CommonConstant.DECIMAL_PLACES)).intValue();
        Date[] timeArray = calResultTime(predictItem, reqVO.getStartTime(), reqVO.getEndTime(), lengthLeft, lengthRight);
        Date predictTime = timeArray[0];
@@ -401,22 +404,35 @@
        dataView.setRangeL(rangeL);
        dataView.setLimitH(limitH);
        dataView.setLimitL(limitL);
        Map<String, Object> realDataMap = new HashMap<>();
        if (StringUtils.isNotBlank(outPut.getPointid())) {
            dataView.setRealData(getHisData(outPut.getPointid(), startTime, endTime, timeFormat));
            dataView.setRealData(getHisData(outPut.getPointid(), startTime, endTime, timeFormat, decimalPlaces));
            dataView.getRealData().forEach(item -> {
                realDataMap.put(item[0].toString(), item[1]);
            });
        } else {
            dataView.setRealData(new ArrayList<>());
        }
        dataView.setCurData(mmItemResultJsonService.getData(outPut.getId(), predictTime, timeFormat, 3));
        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));
            // 当前值T0 + 当前预测值 20250409
            dataView.setCurData(mmItemResultJsonService.getData(outPut.getId(), predictTime, timeFormat, decimalPlaces, true, curReal));
        } else {
            dataView.setCurData(mmItemResultJsonService.getData(outPut.getId(), predictTime, timeFormat, decimalPlaces));
        }
        // 调整预测值
        dataView.setAdjData(stAdjustResultService.getData(outPut.getId(),predictTime,timeFormat));
        dataView.setAdjData(stAdjustResultService.getData(outPut.getId(), predictTime, timeFormat, decimalPlaces));
        dataView.setLineType(lineType.getCode());
        switch (lineType) {
            case TN:
                dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), startTime, endTime, timeFormat));
                dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), startTime, endTime, timeFormat, decimalPlaces));
                break;
            case TL:
                dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), predictTime, endTime, timeFormat));
                dataView.setPreDataL(mmItemResultLastPointService.getData(outPut.getId(), startTime, endTime, timeFormat));
                dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), predictTime, endTime, timeFormat, decimalPlaces));
                dataView.setPreDataL(mmItemResultLastPointService.getData(outPut.getId(), startTime, endTime, timeFormat, decimalPlaces));
                break;
            default:
                break;
@@ -475,7 +491,7 @@
                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++) {
                for (int i = 0; i < adjPointArr.length; i++) {
                    adjValueArr[i] = new BigDecimal(adjValue.get(adjPointArr[i]).toString());
                }
                dataView.setAdjValueArr(adjValueArr);
@@ -624,6 +640,35 @@
    }
    /**
     * 获取真实值
     *
     * @param pointId
     * @param startTime
     * @param endTime
     * @param timeFormat
     * @return
     */
    private List<Object[]> getHisData(String pointId, Date startTime, Date endTime, String timeFormat, int decimalPlaces) {
        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(decimalPlaces, BigDecimal.ROUND_HALF_UP);
            result.add(values);
        });
        return result;
    }
    /**
     * 新增预警信息
     *
     * @param dto
@@ -715,18 +760,27 @@
            InfluxModelResultByOutPutIdsPOJO pojo = new InfluxModelResultByOutPutIdsPOJO();
            pojo.setOutPutIds(outPutIds);
            pojo.setType(DataTypeEnum.FLOAT.getCode());
            Map<String, List<InfluxModelResultVO>> outPutIdDoubles = influxDBService.queryModelResultsByOutPutIds(pojo, mmPredictItemRespVO.getLastTime(), mmPredictItemRespVO.getLastTime());
            // 查询时间加1粒度
            Calendar lastTime = Calendar.getInstance();
            lastTime.setTime(mmPredictItemRespVO.getLastTime());
            if (mmPredictItemRespVO.getGranularity() < PredGranularityEnum.D1.getCode()) {
                // 如果小于天粒度,则从下个时间粒度开始
                lastTime.add(Calendar.SECOND, mmPredictItemRespVO.getGranularity());
            }
            Map<String, List<InfluxModelResultVO>> outPutIdDoubles = influxDBService.queryModelResultsByOutPutIds(pojo, lastTime.getTime(), lastTime.getTime());
            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()));
                        outPutIdDouble.put(outPut.getResultstr(), Double.valueOf(influxModelResultVOS.get(0).getValue().toString()));
                    }
                }
            }
            result.put(mmPredictItemRespVO.getItemno(),outPutIdDouble);
            result.put(mmPredictItemRespVO.getItemno(), outPutIdDouble);
        }
        return result;
    }
@@ -746,14 +800,14 @@
            MmItemOutputEntity outPut = mmItemOutputService.getByItemid(predictItem.getId(), itemNo[1], itemNo[2]);
            String outputId = outPut.getId();
            // 判断是否有第五个参数,如果有第5个参数为1,则取累计值
            if (itemNo.length >= 5){
                if (StringUtils.isNotBlank(itemNo[4]) && "1".equals(itemNo[4])){
            if (itemNo.length >= 5) {
                if (StringUtils.isNotBlank(itemNo[4]) && "1".equals(itemNo[4])) {
                    outputId = outPut.getId() + CommonDict.CUMULANT_SUFFIX;
                }
            }
            Date predictTime = predictItem.getLastTime();
            List<Object[]> curData = mmItemResultJsonService.getData(outputId, predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
            if(CollectionUtils.isEmpty(curData)) {
            if (CollectionUtils.isEmpty(curData)) {
                result.put(key, BigDecimal.ZERO);
            } else {
                result.put(key, new BigDecimal(curData.get(curData.size() - 1)[1].toString()));
@@ -767,7 +821,7 @@
        if (StringUtils.isBlank(scheduleCode)) {
            return null;
        }
        return stScheduleRecordService.getLastScheduleResult(scheduleCode,limit);
        return stScheduleRecordService.getLastScheduleResult(scheduleCode, limit);
    }
    @Override
@@ -788,12 +842,12 @@
        if (null == reqVO.getEndTime()) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(predictItem.getLastTime());
            calendar.add(Calendar.SECOND,predictItem.getPredictLength() * predictItem.getGranularity());
            calendar.add(Calendar.SECOND, predictItem.getPredictLength() * predictItem.getGranularity());
            reqVO.setEndTime(calendar.getTime());
        }
        List<String> itemNos = new ArrayList<String>(){{
           add(reqVO.getItemNo());
        List<String> itemNos = new ArrayList<String>() {{
            add(reqVO.getItemNo());
        }};
        List<MmPredictItemRespVO> ItemRespVOs = mmPredictItemService.getArrayOutPutsByItemNos(itemNos);
        if (CollectionUtils.isEmpty(ItemRespVOs)) {
@@ -808,12 +862,12 @@
        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());
        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 -> {
                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());
@@ -844,7 +898,7 @@
    }
    @Override
    public Boolean updateAlarmConfig(String alarmObj,String upperLimit,String lowerLimit) {
    public Boolean updateAlarmConfig(String alarmObj, String upperLimit, String lowerLimit) {
        MmPredictAlarmConfigSaveReqVO reqVO = new MmPredictAlarmConfigSaveReqVO();
        reqVO.setAlarmObj(alarmObj);
        reqVO.setUpperLimit(BigDecimal.valueOf(Double.parseDouble(upperLimit)));
@@ -866,23 +920,23 @@
    @Override
    public MmItemOutputDTO getItemOutputByItemid(String itemid, String resultstr, String resultIndex) {
        return ConvertUtils.sourceToTarget(mmItemOutputService.getByItemid(itemid,resultstr,resultIndex),MmItemOutputDTO.class);
        return ConvertUtils.sourceToTarget(mmItemOutputService.getByItemid(itemid, resultstr, resultIndex), MmItemOutputDTO.class);
    }
    @Override
    public List<Object[]> getItemResult(PreItemResultReqVO reqVO) {
        return mmItemResultService.getData(reqVO.getOutputid(),reqVO.getStartTime(),reqVO.getEndTime(),reqVO.getTimeFormat());
        return mmItemResultService.getData(reqVO.getOutputid(), reqVO.getStartTime(), reqVO.getEndTime(), reqVO.getTimeFormat());
    }
    @Override
    public PredictItemVO getPredictItemByItemNo(String itemNo) {
        return ConvertUtils.sourceToTarget(mmPredictItemService.getItemByItemNo(itemNo),PredictItemVO.class);
        return ConvertUtils.sourceToTarget(mmPredictItemService.getItemByItemNo(itemNo), PredictItemVO.class);
    }
    @Override
    public List<Object[]> getItemResultLastPoint(PreItemResultReqVO reqVO) {
        return mmItemResultLastPointService.getData(reqVO.getOutputid(),reqVO.getStartTime(),reqVO.getEndTime(),reqVO.getTimeFormat());
        return mmItemResultLastPointService.getData(reqVO.getOutputid(), reqVO.getStartTime(), reqVO.getEndTime(), reqVO.getTimeFormat());
    }
    @Override
@@ -890,6 +944,16 @@
        return stScheduleSuggestService.useSuggest(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());
    }
    private Date[] calResultTime(ItemVO predictItem, Date startTimeReq, Date endTimeReq, int lengthLeft, int lengthRight) {
        Date[] result = new Date[3];
        Date predictTime = predictItem.getLastTime();