| | |
| | | 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.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.StAdjustConfigDetEntity; |
| | | 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.StScheduleRecordService; |
| | | import com.iailab.module.model.mcs.sche.service.StScheduleSchemeService; |
| | | import com.iailab.module.model.mcs.sche.service.StScheduleSuggestService; |
| | | 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; |
| | |
| | | private MmItemResultJsonService mmItemResultJsonService; |
| | | |
| | | @Autowired |
| | | private StAdjustResultService stAdjustResultService; |
| | | |
| | | @Autowired |
| | | private ChartService chartService; |
| | | |
| | | @Autowired |
| | |
| | | @Autowired |
| | | private InfluxDBService influxDBService; |
| | | |
| | | @Autowired |
| | | private ElectricityPriceSegmentedService electricityPriceSegmentedService; |
| | | |
| | | @Autowired |
| | | private StScheduleModelService stScheduleModelService; |
| | | |
| | | @Autowired |
| | | private StScheduleModelSettingService stScheduleModelSettingService; |
| | | |
| | | @Autowired |
| | | private StAdjustConfigService stAdjustConfigService; |
| | | |
| | | private int HOUR_MINS = 60; |
| | | |
| | | @Override |
| | |
| | | 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 -> { |
| | |
| | | break; |
| | | } |
| | | } |
| | | ItemVO predictItem = mmPredictItemService.getItemByIdFromCache(output.getItemid()); |
| | | ItemVO predictItem = mmPredictItemService.getItemById(output.getItemid()); |
| | | if (predictItem.getLastTime() != null) { |
| | | predictTime = predictItem.getLastTime(); |
| | | } else { |
| | |
| | | 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)); |
| | | // 模拟调整曲线 |
| | | 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())) { |
| | |
| | | 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)); |
| | | } |
| | | 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); |
| | |
| | | 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.getCumulpoint(), startTime, endTime)); |
| | | } |
| | | 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)); |
| | | |
| | | viewMap.put(out.getResultName(), viewDto); |
| | | } |
| | | result.setStartTime(startTime); |
| | |
| | | } else { |
| | | dataView.setRealData(new ArrayList<>()); |
| | | } |
| | | dataView.setCurData(mmItemResultJsonService.getData(outPut.getId(), predictTime, timeFormat)); |
| | | dataView.setCurData(mmItemResultJsonService.getData(outPut.getId(), predictTime, timeFormat, 3)); |
| | | // 调整预测值 |
| | | dataView.setAdjData(stAdjustResultService.getData(outPut.getId(),predictTime,timeFormat)); |
| | | dataView.setLineType(lineType.getCode()); |
| | | switch (lineType) { |
| | | case TN: |
| | |
| | | }).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))); |
| | | dataView.setPreCumulant(new BigDecimal(curList.stream().mapToDouble(Double::doubleValue).sum()) |
| | | .divide(new BigDecimal(HOUR_MINS), 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); |
| | |
| | | } 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); |
| | |
| | | */ |
| | | private List<Object[]> getHisData(String pointId, Date startTime, Date endTime) { |
| | | List<Object[]> result = new ArrayList<>(); |
| | | if (StringUtils.isBlank(pointId)) { |
| | | return result; |
| | | } |
| | | ApiPointDTO pointDTO = dataPointApi.getInfoById(pointId); |
| | | ApiPointValueQueryDTO queryPointDto = new ApiPointValueQueryDTO(); |
| | | queryPointDto.setPointNo(pointDTO.getPointNo()); |
| | |
| | | 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); |
| | | values[1] = new BigDecimal(item.getV()).setScale(3, BigDecimal.ROUND_HALF_UP); |
| | | result.add(values); |
| | | }); |
| | | 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); |
| | | values[1] = new BigDecimal(item.getV()).setScale(3, BigDecimal.ROUND_HALF_UP); |
| | | result.add(values); |
| | | }); |
| | | return result; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<ScheduleSuggestRespDTO> listScheduleSuggest(Map<String, Object> params) { |
| | | return Collections.emptyList(); |
| | | public List<ScheduleSuggestRespDTO> listScheduleSuggest(ScheduleSuggestReqDTO vo) { |
| | | return stScheduleSuggestService.list(vo); |
| | | } |
| | | |
| | | @Override |
| | |
| | | result.put(key, BigDecimal.ZERO); |
| | | } |
| | | MmItemOutputEntity outPut = mmItemOutputService.getByItemid(predictItem.getId(), itemNo[1], itemNo[2]); |
| | | |
| | | String outputId = outPut.getId(); |
| | | // 如果第5个参数为1,则取累计值 |
| | | if ("1".equals(itemNo[4])){ |
| | | outputId = outPut.getId() + CommonDict.CUMULANT_SUFFIX; |
| | | } |
| | | Date predictTime = predictItem.getLastTime(); |
| | | List<Object[]> curData = mmItemResultJsonService.getData(outPut.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); |
| | | List<Object[]> curData = mmItemResultJsonService.getData(outputId, 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 Map<String,List<Object[]>> getElectricPredictData(String itemCode) { |
| | | ItemVO predictItem = mmPredictItemService.getItemByItemNo(itemCode); |
| | | if (null == predictItem) { |
| | | return new HashMap<>(); |
| | | } |
| | | List<Integer> resultIndexs = new ArrayList<>(); |
| | | resultIndexs.add(0); |
| | | resultIndexs.add(1); |
| | | resultIndexs.add(2); |
| | | List<MmItemOutputEntity> outPuts = mmItemOutputService.getByItemid(predictItem.getId(),"predictValues",resultIndexs); |
| | | if (CollectionUtils.isEmpty(outPuts)) { |
| | | return new HashMap<>(); |
| | | } |
| | | InfluxModelResultByOutPutIdsPOJO pojo = new InfluxModelResultByOutPutIdsPOJO(); |
| | | pojo.setOutPutIds(outPuts.stream().map(MmItemOutputEntity::getId).collect(Collectors.toList())); |
| | | pojo.setType(DataTypeEnum.FLOAT.getCode()); |
| | | Calendar calendar = Calendar.getInstance(); |
| | | calendar.setTime(predictItem.getLastTime()); |
| | | calendar.add(Calendar.DAY_OF_YEAR, 7); |
| | | Map<String, List<InfluxModelResultVO>> outPutDatas = influxDBService.queryModelResultsByOutPutIds(pojo, predictItem.getLastTime(), calendar.getTime()); |
| | | Map<String,List<Object[]>> result = new HashMap<>(outPuts.size()); |
| | | for (MmItemOutputEntity 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<Map<String, Object>> getRealTimeStatus(List<Map<String, Object>> machines) { |
| | | List<String> pointNos = new ArrayList<>(16); |
| | | for (Map<String, Object> machine : machines) { |
| | | List<String> list = (List<String>) machine.get("pointNos"); |
| | | pointNos.addAll(list); |
| | | } |
| | | Map<String, Object> pointValues = dataPointApi.queryPointsRealValue(pointNos); |
| | | List<Map<String, Object>> results = new ArrayList<>(); |
| | | for (Map<String, Object> machine : machines) { |
| | | List<String> pointNoList = (List<String>) machine.get("pointNos"); |
| | | if (!pointValues.containsKey(pointNoList.get(0)) || !pointValues.containsKey(pointNoList.get(1))) { |
| | | machine.put("status",false); |
| | | machine.put("num",0); |
| | | results.add(machine); |
| | | continue; |
| | | } |
| | | Double PValue = Double.valueOf(pointValues.get(pointNoList.get(0)).toString()); |
| | | Double QValue = Double.valueOf(pointValues.get(pointNoList.get(1)).toString()); |
| | | Double cos = calculateCos(PValue, QValue); |
| | | if (cos.equals(0.0)) { |
| | | machine.put("status",false); |
| | | machine.put("num",0); |
| | | }else { |
| | | machine.put("status",true); |
| | | machine.put("num",cos); |
| | | } |
| | | results.add(machine); |
| | | } |
| | | return results; |
| | | } |
| | | |
| | | @Override |
| | | public Map<String, List<Object[]>> getPredictDataItemNo(PreDataItemNoReqVO reqVO) { |
| | | if (StringUtils.isBlank(reqVO.getItemNo()) || null == reqVO.getStartTime() || null == reqVO.getEndTime()) { |
| | | 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()); |
| | | }}; |
| | |
| | | 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; |
| | | } |
| | | |
| | | @Override |
| | | public List<StAdjustConfigDetDTO> getAdjustConfigListByModelId(String modelId) { |
| | | List<StAdjustConfigDetEntity> list = stAdjustConfigService.getDetByModelId(modelId); |
| | | return ConvertUtils.sourceToTarget(list, StAdjustConfigDetDTO.class); |
| | | } |
| | | |
| | | /** |
| | | * 计算功率因数 p²/(根号:p²+Q²) |
| | | **/ |