package com.iailab.module.model.mcs.pre.service.impl;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.iailab.framework.common.pojo.PageResult;
|
import com.iailab.framework.common.service.impl.BaseServiceImpl;
|
import com.iailab.module.data.api.point.DataPointApi;
|
import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
|
import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO;
|
import com.iailab.module.model.common.enums.DataTypeEnum;
|
import com.iailab.module.model.influxdb.pojo.InfluxModelResultLastSimPOJO;
|
import com.iailab.module.model.influxdb.pojo.InfluxModelResultPOJO;
|
import com.iailab.module.model.influxdb.service.InfluxDBService;
|
import com.iailab.module.model.influxdb.vo.InfluxModelResultVO;
|
import com.iailab.module.model.mcs.pre.dao.MmPredictAutoAdjustConfigDao;
|
import com.iailab.module.model.mcs.pre.entity.MmPredictAutoAdjustConfigEntity;
|
import com.iailab.module.model.mcs.pre.enums.AutoAdjustTriggerRuleEnum;
|
import com.iailab.module.model.mcs.pre.enums.AutoAdjustValueRuleEnum;
|
import com.iailab.module.model.mcs.pre.service.MmPredictAutoAdjustConfigService;
|
import com.iailab.module.model.mcs.pre.service.MmPredictItemService;
|
import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigPageReqVO;
|
import com.iailab.module.model.mcs.pre.vo.MmPredictAutoAdjustConfigVO;
|
import com.iailab.module.model.mdk.vo.ItemVO;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.CollectionUtils;
|
|
import java.math.BigDecimal;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author PanZhibao
|
* @Description
|
* @createTime 2024年11月19日
|
*/
|
@Slf4j
|
@Service
|
public class MmPredictAutoAdjustConfigServiceImpl extends BaseServiceImpl<MmPredictAutoAdjustConfigDao, MmPredictAutoAdjustConfigEntity>
|
implements MmPredictAutoAdjustConfigService {
|
|
@Autowired
|
private MmPredictItemService mmPredictItemService;
|
@Autowired
|
private InfluxDBService influxDBService;
|
@Autowired
|
private DataPointApi dataPointApi;
|
|
@Override
|
public PageResult<MmPredictAutoAdjustConfigVO> page(MmPredictAutoAdjustConfigPageReqVO params) {
|
IPage<MmPredictAutoAdjustConfigVO> page = baseDao.selectPage(params);
|
return new PageResult<>(page.getRecords(), page.getTotal());
|
}
|
|
@Override
|
public MmPredictAutoAdjustConfigEntity getInfo(String id) {
|
return baseDao.selectById(id);
|
}
|
|
@Override
|
public MmPredictAutoAdjustConfigEntity getByCode(String code) {
|
return baseDao.selectOne("config_code",code);
|
}
|
|
@Override
|
public void create(MmPredictAutoAdjustConfigEntity entity) {
|
entity.setId(UUID.randomUUID().toString());
|
baseDao.insert(entity);
|
}
|
|
@Override
|
public void update(MmPredictAutoAdjustConfigEntity entity) {
|
baseDao.updateById(entity);
|
}
|
|
@Override
|
public void delete(String id) {
|
baseDao.deleteById(id);
|
}
|
|
@Override
|
public boolean autoAdjustByCode(String configCode,long adjustStartTime) {
|
// 查询调整配置
|
MmPredictAutoAdjustConfigEntity configEntity = getByCode(configCode);
|
if (configEntity == null) {
|
log.info("自动调整失败原因:configEntity为null");
|
return false;
|
}
|
|
Double adjustValue = 0.0;
|
ApiPointValueQueryDTO queryDTO;
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTimeInMillis(adjustStartTime);
|
Date endTime;
|
Date startTime;
|
List<ApiPointValueDTO> apiPointValueDTOS;
|
// 判断是否调整
|
AutoAdjustTriggerRuleEnum triggerRuleEnum = AutoAdjustTriggerRuleEnum.fromCode(configEntity.getTriggerRule());
|
switch (triggerRuleEnum) {
|
case SLOPE:
|
queryDTO = new ApiPointValueQueryDTO();
|
queryDTO.setPointNo(dataPointApi.getInfoById(configEntity.getPointId()).getPointNo());
|
endTime = calendar.getTime();
|
queryDTO.setEnd(endTime);
|
calendar.add(Calendar.MINUTE,-1 * configEntity.getT());
|
startTime = calendar.getTime();
|
queryDTO.setStart(startTime);
|
apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO);
|
if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
|
log.info("自动调整失败原因:测点数据长度为0");
|
return false;
|
}
|
apiPointValueDTOS = apiPointValueDTOS.stream().filter(e -> e.getV() != -2).collect(Collectors.toList());
|
if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
|
log.info("自动调整失败原因:测点数据长度为0");
|
return false;
|
}
|
Optional<ApiPointValueDTO> startOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(startTime)).findFirst();
|
if (!startOptional.isPresent()) {
|
log.info("自动调整失败原因:计算斜率startTime时间点测点值为null,startTime:" + startTime);
|
return false;
|
}
|
Optional<ApiPointValueDTO> endOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(endTime)).findFirst();
|
if (!endOptional.isPresent()) {
|
log.info("自动调整失败原因:计算斜率endTime时间点测点值为null,endTime:" + endTime);
|
return false;
|
}
|
ApiPointValueDTO startPointValue = startOptional.get();
|
ApiPointValueDTO endPointValue = endOptional.get();
|
|
// 计算斜率,有正负之分,代表上升或下降
|
double slope = BigDecimal.valueOf(endPointValue.getV() - startPointValue.getV()).divide(BigDecimal.valueOf(configEntity.getT())).doubleValue();
|
//斜率绝对值大于等于触发值则进行调整
|
if (Double.valueOf(Math.abs(slope)).compareTo(configEntity.getTriggerValue()) >= 0) {
|
//计算调整值
|
HashMap<String,Object> map = new HashMap<>();
|
map.put("startValue",startPointValue.getV());
|
map.put("endValue",endPointValue.getV());
|
adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), map);
|
} else {
|
log.info("自动调整失败原因:斜率小于调整值,斜率:" + slope);
|
return false;
|
}
|
break;
|
case AVERAGE_GAP:
|
queryDTO = new ApiPointValueQueryDTO();
|
queryDTO.setPointNo(dataPointApi.getInfoById(configEntity.getPointId()).getPointNo());
|
endTime = calendar.getTime();
|
queryDTO.setEnd(endTime);
|
calendar.add(Calendar.MINUTE,-1 * configEntity.getT() * 2 + 1);
|
startTime = calendar.getTime();
|
queryDTO.setStart(startTime);
|
apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO);
|
if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
|
log.info("自动调整失败原因:测点数据长度为0");
|
return false;
|
}
|
apiPointValueDTOS = apiPointValueDTOS.stream().filter(e -> e.getV() != -2).collect(Collectors.toList());
|
if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
|
log.info("自动调整失败原因:测点数据长度为0");
|
return false;
|
}
|
calendar.add(Calendar.MINUTE,configEntity.getT());
|
double startAverage = apiPointValueDTOS.stream().filter(e -> e.getT().before(calendar.getTime())).collect(Collectors.summarizingDouble(ApiPointValueDTO::getV)).getAverage();
|
double endAverage = apiPointValueDTOS.stream().filter(e -> e.getT().compareTo(calendar.getTime()) >= 0).collect(Collectors.summarizingDouble(ApiPointValueDTO::getV)).getAverage();
|
// 计算均值差,大于等于触发值则进行调整
|
if (Double.valueOf(Math.abs(startAverage - endAverage)).compareTo(configEntity.getTriggerValue()) >= 0) {
|
//计算调整值
|
HashMap<String,Object> map = new HashMap<>();
|
map.put("startValue",startAverage);
|
map.put("endValue",endAverage);
|
adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), map);
|
} else {
|
log.info("自动调整失败原因:均值差小于调整值,均值差:" + (startAverage - endAverage));
|
return false;
|
}
|
break;
|
default:
|
log.info("自动调整失败原因:未知触发规则,triggerRule" + configEntity.getTriggerRule());
|
return false;
|
}
|
|
// 调整方向
|
adjustValue = adjustValue * configEntity.getAdjustDirection();
|
|
// 获取历史结果
|
ItemVO item = mmPredictItemService.getItemByOutPutId(configEntity.getOutputId());
|
if (item == null) {
|
log.info("自动调整失败原因:getItemByOutPutId为null,outputId:" + configEntity.getOutputId());
|
return false;
|
}
|
Calendar resultCalendar = Calendar.getInstance();
|
resultCalendar.setTimeInMillis(adjustStartTime);
|
Date resultStartTime = resultCalendar.getTime();
|
resultCalendar.add(Calendar.SECOND,configEntity.getAdjustLength() * item.getGranularity());
|
Date resultEndTime = resultCalendar.getTime();
|
InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
|
pojo.setType(DataTypeEnum.FLOAT_LAST_BAK.getCode());
|
pojo.setOutPutId(configEntity.getOutputId());
|
List<InfluxModelResultVO> influxModelResult = influxDBService.queryModelResults(pojo, resultStartTime, resultEndTime);
|
|
List<InfluxModelResultPOJO> lastList = new ArrayList<>();
|
for (InfluxModelResultVO resultVO : influxModelResult) {
|
InfluxModelResultLastSimPOJO adjustPojo = new InfluxModelResultLastSimPOJO();
|
// 设置新的调整值
|
adjustPojo.setValue(Double.parseDouble(resultVO.getValue().toString()) + adjustValue);
|
adjustPojo.setTimestamp(resultVO.getTimestamp());
|
adjustPojo.setOutPutId(configEntity.getOutputId());
|
lastList.add(adjustPojo);
|
}
|
// 相同时间直接覆盖旧值
|
influxDBService.asyncWriteModelResults(lastList);
|
log.info("t+l自动调整。configCode:" + configCode + ",adjustValue:" + adjustValue + ",resultStartTime:" + resultStartTime + ",resultEndTime:" + resultEndTime + "调整长度:" + lastList.size());
|
return true;
|
}
|
}
|