工业互联网平台2.0版本后端代码
houzhongjian
2025-05-29 24996ea75ec4ca3b7d154387bfe37ec9dd387255
Merge remote-tracking branch 'origin/master'
已删除1个文件
已修改44个文件
已添加1个文件
987 ■■■■■ 文件已修改
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/IndItemCollector.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/InsertInfluxdbTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ExtremalHandle.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java 106 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/common/PointCumulateUnitEnum.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/resources/mapper/point/DaPointDao.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/db/mysql.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/db/增量SQL/2025.sql 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/DataCategoryEnum.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java 317 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestOperationRecordController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfDetController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfMainController.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotRecordController.java 139 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfDetDao.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfMainDao.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotConfDetEntity.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotRecordEntity.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfDetService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfMainService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotRecordService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestOperationRecordServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfDetServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfMainServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StScheduleSuggestPageReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordReqVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetPageReqVO.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetRespVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetSaveReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainPageReqVO.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordReqVO.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordRespVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordSaveReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-plat-sdk/pom.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-plat-sdk/src/main/java/com/iailab/sdk/util/http/IailabHttpUtils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/IndItemCollector.java
@@ -97,12 +97,12 @@
                    Object dataValue = e.getDataValue();
                    if (dataValue != null && dataValue instanceof Number) {
                        BigDecimal value = new BigDecimal(dataValue.toString());
                        if (indItem.getPrecision() != null) {
                            value = new BigDecimal(dataValue.toString()).setScale(indItem.getPrecision(), BigDecimal.ROUND_HALF_UP);
                        }
                        if (StringUtils.isNotBlank(indItem.getCoefficient())) {
                            value = value.multiply(new BigDecimal(indItem.getCoefficient()));
                        }
                        if (indItem.getPrecision() != null) {
                            value = value.setScale(indItem.getPrecision(), BigDecimal.ROUND_HALF_UP);
                        }
                        e.setDataValue(value.doubleValue());
                    }
                }
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/task/InsertInfluxdbTask.java
@@ -24,7 +24,7 @@
    @Override
    public void run(String params){
        logger.debug("insertInfluxdbTask定时任务正在执行,参数为:{}", params);
        logger.info("insertInfluxdbTask定时任务正在执行,参数为:{}", params);
        String[] split = params.split(",");
//        List<InfluxPointValuePOJO> pointValues = new ArrayList<>();
//        InfluxPointValueSimPOJO pojo = new InfluxPointValueSimPOJO();
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java
@@ -76,7 +76,7 @@
    public static final String PV = "point_value:";
    public static final long offset = 60 * 2L;
    public static final long offset = 30L;
    /**
     * 采集
@@ -100,17 +100,17 @@
            List<DaPointDTO> pointMeasureList = daPointService.getMeasurePoint(minfreq);
            pointValues.addAll(measureHandle.handle(collectTime, pointMeasureList, dataMap, listGood, listBad));
            log.info("读取计算点");
            List<DaPointDTO> pointCalculateList = daPointService.getMathPoint(minfreq);
            pointValues.addAll(calculateHandle.handle(collectTime, pointCalculateList, dataMap, listGood, listBad));
            log.info("读取累计点");
            List<DaPointDTO> pointCumulateList = daPointService.getCumulatePoint(minfreq);
            pointValues.addAll(cumulateHandle.handle(collectTime, pointCumulateList, listGood, listBad));
            pointValues.addAll(cumulateHandle.handle(collectTime, pointCumulateList, dataMap, listGood, listBad));
            log.info("读取极值点");
            List<DaPointDTO> pointExtremalList = daPointService.getExtremalPoint(minfreq);
            pointValues.addAll(extremalHandle.handle(collectTime, pointExtremalList, listGood, listBad));
            pointValues.addAll(extremalHandle.handle(collectTime, pointExtremalList, dataMap, listGood, listBad));
            log.info("读取计算点");
            List<DaPointDTO> pointCalculateList = daPointService.getMathPoint(minfreq);
            pointValues.addAll(calculateHandle.handle(collectTime, pointCalculateList, dataMap, listGood, listBad));
            log.info("存入时序库");
            log.info("pointValueTimestamp=" + (pointValues.get(0) == null ? 0 : pointValues.get(0).getTimestamp().getNano()));
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java
@@ -47,6 +47,12 @@
    private ConstantHandle constantHandle;
    @Resource
    private CumulateHandle cumulateHandle;
    @Resource
    private ExtremalHandle extremalHandle;
    @Resource
    private JavaScriptHandler javaScriptHandler;
    @Autowired
@@ -171,6 +177,8 @@
            pointNos.add(s);
            dataMap.putAll(measureHandle.getCurrent(pointNos));
            dataMap.putAll(constantHandle.getCurrent(pointNos));
            dataMap.putAll(cumulateHandle.getCurrent(pointNos));
            dataMap.putAll(extremalHandle.getCurrent(pointNos));
            if (dataMap.get(s) == null) {
                log.info("计算点数据异常");
                log.info("pointNo=" + dto.getPointNo() + ";dataMap.key=" + s);
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ConstantHandle.java
@@ -10,6 +10,7 @@
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
/**
@@ -33,9 +34,13 @@
            return result;
        }
        dtos.forEach(dto -> {
            InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto);
            BigDecimal defaultValue = dto.getDefaultValue();
            BigDecimal coefficient = dto.getUnittransfactor() == null ? BigDecimal.ONE : dto.getUnittransfactor();
            defaultValue = defaultValue.multiply(coefficient);
            InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto,defaultValue);
            pojo.setTimestamp(GenInfluxPointValueUtils.getByMin(collectTime, DataPointFreqEnum.getEumByCode(dto.getMinfreqid())));
            dataMap.put(dto.getPointNo(), dto.getDefaultValue());
            dataMap.put(dto.getPointNo(), defaultValue);
            result.add(pojo);
            listGood.add(dto.getPointNo());
        });
@@ -49,7 +54,8 @@
        List<DaPointDTO> pointConstantList = daPointService.getConstantPoint(pointNos);
        if (!CollectionUtils.isEmpty(pointConstantList)) {
            pointConstantList.forEach(item -> {
                data.put(item.getPointNo(), item.getDefaultValue());
                BigDecimal coefficient = item.getUnittransfactor() == null ? BigDecimal.ONE : item.getUnittransfactor();
                data.put(item.getPointNo(), item.getDefaultValue().multiply(coefficient));
            });
        }
        return data;
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CumulateHandle.java
@@ -23,6 +23,7 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
 * 累计点处理
@@ -45,7 +46,7 @@
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, List<String> listGood, List<String> listBad) {
    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap, List<String> listGood, List<String> listBad) {
        List<InfluxPointValuePOJO> result = new ArrayList<>();
        try {
            log.info("累计点处理开始");
@@ -59,6 +60,7 @@
                    BigDecimal calValue = new BigDecimal(rawValue.toString()).multiply(coefficient);
                    InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, calValue);
                    pojo.setTimestamp(GenInfluxPointValueUtils.getByMin(collectTime, DataPointFreqEnum.getEumByCode(dto.getMinfreqid())));
                    dataMap.put(dto.getPointNo(), calValue);
                    result.add(pojo);
                } catch (Exception ex) {
                    ex.printStackTrace();
@@ -90,6 +92,9 @@
                Object rawValue = singleCompute(item, calendar.getTime());
                BigDecimal coefficient = item.getUnittransfactor() == null ? BigDecimal.ONE : item.getUnittransfactor();
                value = new BigDecimal(rawValue.toString()).multiply(coefficient);
                // 写入缓存
                redisTemplate.opsForValue().set(PointCollector.PV + item.getPointNo(),
                        new BigDecimal(value.toString()).doubleValue(), PointCollector.offset, TimeUnit.SECONDS);
            }
            data.put(item.getPointNo(), value);
        });
@@ -126,7 +131,7 @@
        List<ApiPointValueDTO> dataList = new ArrayList<>();
        List<ApiPointValueDTO> dataListTemp = dataPointApi.queryPointHistoryValue(queryDto);
        if (dto.getIsCumuNeg() != null && dto.getIsCumuNeg().equals(0)) {
            for(ApiPointValueDTO item : dataListTemp) {
            for (ApiPointValueDTO item : dataListTemp) {
                if (item.getV() > 0) {
                    dataList.add(item);
                }
@@ -163,7 +168,7 @@
        long start = startTime.getTime();
        long end = endTime.getTime();
        long oneMin = 1000L * DataPointFreqEnum.getEumByCode(minfreqid).getValue();
        long mins = (end - start) / oneMin;
        long mins = ((end - start) / oneMin) + 1;
        //找出缺少项
        Map<Long, Double> sourceDataMap = new HashMap<>(dataList.size());
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/ExtremalHandle.java
@@ -20,6 +20,7 @@
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
/**
@@ -43,7 +44,7 @@
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, List<String> listGood, List<String> listBad) {
    public List<InfluxPointValuePOJO> handle(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> dataMap, List<String> listGood, List<String> listBad) {
        List<InfluxPointValuePOJO> result = new ArrayList<>();
        try {
            log.info("极值点处理开始");
@@ -52,9 +53,12 @@
            }
            dtos.forEach(dto -> {
                try {
                    Object value = singleCompute(dto, collectTime, listGood, listBad);
                    InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, value);
                    Object rawValue = singleCompute(dto, collectTime, listGood, listBad);
                    BigDecimal coefficient = dto.getUnittransfactor() == null ? BigDecimal.ONE : dto.getUnittransfactor();
                    BigDecimal calValue = new BigDecimal(rawValue.toString()).multiply(coefficient);
                    InfluxPointValuePOJO pojo = GenInfluxPointValueUtils.getByPoint(dto, calValue);
                    pojo.setTimestamp(GenInfluxPointValueUtils.getByMin(collectTime, DataPointFreqEnum.getEumByCode(dto.getMinfreqid())));
                    dataMap.put(dto.getPointNo(), calValue);
                    result.add(pojo);
                } catch (Exception ex) {
                    ex.printStackTrace();
@@ -83,6 +87,8 @@
                value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo());
            } else {
                value = singleCompute(item, calendar.getTime(), new ArrayList<>(), new ArrayList<>());
                BigDecimal coefficient = item.getUnittransfactor() == null ? BigDecimal.ONE : item.getUnittransfactor();
                value = new BigDecimal(value.toString()).multiply(coefficient);
            }
            data.put(item.getPointNo(), value);
        });
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java
@@ -224,61 +224,61 @@
    public Map<String, Object> getCurrent(List<String> pointNos) {
        Map<String, Object> data = new HashMap<>();
        List<DaPointDTO> pointMeasureList = daPointService.getMeasurePoint(pointNos);
        pointMeasureList.forEach(
                item -> {
                    try {
                        Object value = CommonConstant.BAD_VALUE;
                        boolean hasKey = redisTemplate.hasKey(PointCollector.PV + item.getPointNo());
                        if (hasKey) {
                            value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo());
                        }
                        if(hasKey && StrUtils.isNumeric(value.toString()) &&
                                new BigDecimal(value.toString()).compareTo(CommonConstant.BAD_VALUE) != 0 ) {
                            value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo());
                        } else if (DataSourceType.OPCUA.getCode().equals(item.getSourceType())) {
                            value = opcUaCollector.getTagValue(item.getSourceId(), item.getTagNo());
                        } else if (DataSourceType.ModBus.getCode().equals(item.getSourceType())) {
                            value = modBusCollector.getTagValue(item.getSourceId(), item.getTagNo());
                        } else if (DataSourceType.KIO.getCode().equals(item.getSourceType())) {
                            value = kingIOCollector.getTagValue(item.getSourceId(), item.getTagNo());
                        } else if (DataSourceType.HTTP.getCode().equals(item.getSourceType())) {
                            if (SourceApiEnum.iHyperDB.getCode().equals(item.getSourceName())) {
                                value = httpCollectorForIhd.getTagValue(item.getSourceId(), item.getTagNo(), item.getDimension(), item.getValueType());
                            } else if (SourceApiEnum.ASDB.getCode().equals(item.getSourceName())) {
                                value = httpCollectorForAsdb.getTagValue(item.getSourceId(), item.getTagNo());
                            } else if (SourceApiEnum.ASDE.getCode().equals(item.getSourceName())) {
                                value = httpCollectorForAsde.getTagValue(item.getSourceId(), item.getTagNo());
                            } else if (SourceApiEnum.ASDC.getCode().equals(item.getSourceName())) {
                                value = httpCollectorForAsdc.getTagValue(item.getSourceId(), item.getTagNo());
                            } else if (SourceApiEnum.ASDY.getCode().equals(item.getSourceName())) {
                                value = httpCollectorForAsdy.getTagValue(item.getSourceId(), item.getTagNo());
                            }
                        } else {
                            log.info("没有匹配的TagNo=" + item.getTagNo());
                        }
                        log.info("TagNo=" + item.getTagNo() + ",value=" + value.toString());
                        if (!PointDataTypeEnum.BOOLEAN.getCode().equals(item.getDataType())) {
                            BigDecimal decValue =  new BigDecimal(value.toString());
                            if (PointDataTypeEnum.FLOAT.getCode().equals(item.getDataType())) {
                                decValue = decValue.setScale(2, BigDecimal.ROUND_HALF_UP);
                            } else if (PointDataTypeEnum.INT.getCode().equals(item.getDataType())) {
                                decValue = decValue.setScale(0, BigDecimal.ROUND_HALF_UP);
                            }
                            data.put(item.getPointNo(), decValue);
                        } else {
                            data.put(item.getPointNo(), value);
                        }
                        if (!hasKey) {
                            // 存入缓存
                            toRedis(value, item);
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
        for (DaPointDTO item : pointMeasureList) {
            try {
                Object value = CommonConstant.BAD_VALUE;
                boolean hasKey = redisTemplate.hasKey(PointCollector.PV + item.getPointNo());
                if (hasKey && !StrUtils.isNumeric(value.toString())) {
                    value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo());
                    data.put(item.getPointNo(), value);
                    continue;
                } else if(hasKey && StrUtils.isNumeric(value.toString()) && new BigDecimal(value.toString()).compareTo(CommonConstant.BAD_VALUE) != 0 ) {
                    value = redisTemplate.opsForValue().get(PointCollector.PV + item.getPointNo());
                    data.put(item.getPointNo(), value);
                    continue;
                } else if (DataSourceType.OPCUA.getCode().equals(item.getSourceType())) {
                    value = opcUaCollector.getTagValue(item.getSourceId(), item.getTagNo());
                } else if (DataSourceType.ModBus.getCode().equals(item.getSourceType())) {
                    value = modBusCollector.getTagValue(item.getSourceId(), item.getTagNo());
                } else if (DataSourceType.KIO.getCode().equals(item.getSourceType())) {
                    value = kingIOCollector.getTagValue(item.getSourceId(), item.getTagNo());
                } else if (DataSourceType.HTTP.getCode().equals(item.getSourceType())) {
                    if (SourceApiEnum.iHyperDB.getCode().equals(item.getSourceName())) {
                        value = httpCollectorForIhd.getTagValue(item.getSourceId(), item.getTagNo(), item.getDimension(), item.getValueType());
                    } else if (SourceApiEnum.ASDB.getCode().equals(item.getSourceName())) {
                        value = httpCollectorForAsdb.getTagValue(item.getSourceId(), item.getTagNo());
                    } else if (SourceApiEnum.ASDE.getCode().equals(item.getSourceName())) {
                        value = httpCollectorForAsde.getTagValue(item.getSourceId(), item.getTagNo());
                    } else if (SourceApiEnum.ASDC.getCode().equals(item.getSourceName())) {
                        value = httpCollectorForAsdc.getTagValue(item.getSourceId(), item.getTagNo());
                    } else if (SourceApiEnum.ASDY.getCode().equals(item.getSourceName())) {
                        value = httpCollectorForAsdy.getTagValue(item.getSourceId(), item.getTagNo());
                    }
                } else {
                    log.info("没有匹配的TagNo=" + item.getTagNo());
                }
        );
                log.info("TagNo=" + item.getTagNo() + ",value=" + value.toString());
                if (!PointDataTypeEnum.BOOLEAN.getCode().equals(item.getDataType())) {
                    BigDecimal coefficient = item.getUnittransfactor() == null ? BigDecimal.ONE : item.getUnittransfactor();
                    BigDecimal decValue =  new BigDecimal(value.toString()).multiply(coefficient);
                    if (PointDataTypeEnum.FLOAT.getCode().equals(item.getDataType())) {
                        decValue = decValue.setScale(2, BigDecimal.ROUND_HALF_UP);
                    } else if (PointDataTypeEnum.INT.getCode().equals(item.getDataType())) {
                        decValue = decValue.setScale(0, BigDecimal.ROUND_HALF_UP);
                    }
                    data.put(item.getPointNo(), decValue);
                } else {
                    data.put(item.getPointNo(), value);
                }
                if (!hasKey) {
                    // 存入缓存
                    toRedis(value, item);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return data;
    }
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/common/PointCumulateUnitEnum.java
@@ -1,6 +1,5 @@
package com.iailab.module.data.point.common;
import com.iailab.framework.common.util.date.DateUtils;
import lombok.AllArgsConstructor;
import lombok.Getter;
@@ -27,6 +26,14 @@
    DAY("day", (end, length) -> {
        Calendar cal = (Calendar) end.clone();
        cal.add(Calendar.DAY_OF_MONTH, -length);
        return cal;
    }),
    THIS_DAY("this_day", (end, length) -> {
        Calendar cal = (Calendar) end.clone();
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal;
    }),
    THIS_MONTH("this_month", (end, length) -> {
@@ -67,7 +74,7 @@
            }
        }
        Calendar startCal = unit.calculate(endTime, length);
        Calendar startCal = unit.calculate(endTime, length - 1);
        return startCal.getTime();
    }
}
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -427,7 +428,7 @@
        // 2. 遍历,逐个创建 or 更新
        PointImportRespVO respVO = PointImportRespVO.builder().createPointnames(new ArrayList<>())
                .updatePointnames(new ArrayList<>()).failurePointnames(new LinkedHashMap<>()).build();
        importPoints.forEach(importPoint -> {
        for(PointImportExcelVO importPoint : importPoints) {
            // 判断如果不存在,再进行插入
            DaPointEntity existPoint = null;
            if (StringUtils.isNotBlank(importPoint.getPointNo())) {
@@ -439,6 +440,9 @@
                daPointEntity.setId(UUID.randomUUID().toString());
                daPointEntity.setIsEnable(CommonConstant.IS_ENABLE);
                daPointEntity.setCreateTime(new Date());
                if(PointTypeEnum.getEumByCode(daPointEntity.getPointType()) == null) {
                    continue;
                }
                switch (PointTypeEnum.getEumByCode(daPointEntity.getPointType())) {
                    case MEASURE_POINT:
                        DaMeasurePointDTO measurePoint = new DaMeasurePointDTO();
@@ -462,6 +466,7 @@
                        cumulatePoint.setMomentPoint(importPoint.getMomentPoint());
                        cumulatePoint.setLength(importPoint.getLength());
                        cumulatePoint.setDivisor(importPoint.getDivisor());
                        cumulatePoint.setIsCumuNeg(importPoint.getIsCumuNeg());
                        daCumulatePointService.add(cumulatePoint, daPointEntity.getId());
                        daPointEntity.setPointNo(daSequenceNumService.getAndIncreaseByCode(IncreaseCodeEnum.POINT_L.name()));
                    default:
@@ -471,13 +476,13 @@
                daPointDao.insert(daPointEntity);
                daPointCollectStatusService.add(daPointEntity.getPointNo());
                respVO.getCreatePointnames().add(importPoint.getPointName());
                return;
                continue;
            }
            // 如果存在,判断是否允许更新
            if (!isUpdateSupport) {
                respVO.getFailurePointnames().put(importPoint.getPointName(), POINT_EXISTS.getMsg());
                return;
                continue;
            }
            DaPointEntity updatePoint = BeanUtils.toBean(importPoint, DaPointEntity.class);
@@ -490,8 +495,6 @@
                    measurePoint.setSourceId(sourcesIdMap.get(importPoint.getSourceType()).get(importPoint.getSourceName()));
                    measurePoint.setTagNo(importPoint.getTagNo());
                    daMeasurePointService.update(measurePoint, new QueryWrapper<DaMeasurePointEntity>().eq("point_id",updatePoint.getId()));
                    break;
                case CALCULATE_POINT:
                    break;
@@ -499,7 +502,7 @@
                    break;
            }
            respVO.getUpdatePointnames().add(importPoint.getPointName());
        });
        }
        return respVO;
    }
iailab-module-data/iailab-module-data-biz/src/main/resources/mapper/point/DaPointDao.xml
@@ -161,6 +161,7 @@
        t1.point_type,
        t1.store_type,
        t1.data_type,
        t1.unittransfactor,
        t1.minfreqid
        FROM t_da_point t1
        <where>
iailab-module-model/iailab-module-model-biz/db/mysql.sql
@@ -1028,11 +1028,9 @@
                                                   `adjust_value_rule` varchar(36) DEFAULT NULL COMMENT '调整值计算规则',
                                                   `is_enable` tinyint DEFAULT NULL COMMENT '是否启用(0禁用 1启用)',
                                                   `create_time` datetime DEFAULT NULL,
                                                   PRIMARY KEY (`id`),
                                                   UNIQUE KEY `config_code` (`config_code`)
                                                   `adjust_coefficient` decimal(10,6) DEFAULT '1.000000' COMMENT '调整系数',
                                                   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='预测结果自动调整配置表';
alter table t_mm_predict_auto_adjust_config add column `adjust_coefficient` decimal(10,6) DEFAULT 1 COMMENT '调整系数';
-- 预测项影响因素
iailab-module-model/iailab-module-model-biz/db/增量SQL/2025.sql
@@ -43,6 +43,7 @@
    `conf_id`      varchar(36) COMMENT '快照配置ID',
    `data_type`    varchar(20) DEFAULT NULL COMMENT '数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)',
    `data_no`      varchar(36) COMMENT '数据编号',
    `data_name`    varchar(36) COMMENT '数据名称',
    `left_length`  integer COMMENT '左侧长度(min)',
    `right_length` integer COMMENT '右侧侧长度(min)',
    `sort`         integer COMMENT '排序',
@@ -57,20 +58,21 @@
CREATE TABLE `t_st_suggest_snapshot_record`
(
    `id`           varchar(36) NOT NULL,
    `suggest_id`   varchar(36) COMMENT '建议ID(只记录采纳)',
    `operation_id` varchar(36) COMMENT '操作记录ID(只记录采纳)',
    `model_id`     varchar(36) DEFAULT NULL COMMENT '模型ID',
    `data_type`    varchar(20) DEFAULT NULL COMMENT '数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)',
    `data_no`      varchar(36) COMMENT '数据编号',
    `schedule_time`     datetime    DEFAULT NULL COMMENT '调度时间',
    `start_time`   datetime    DEFAULT NULL COMMENT '开始时间',
    `end_time`     datetime    DEFAULT NULL COMMENT '结束时间',
    `json_value`   varchar(50) COMMENT '序列化的数据',
    `sort`         integer COMMENT '排序',
    `id`            varchar(36) NOT NULL,
    `suggest_id`    varchar(36) COMMENT '建议ID(只记录采纳)',
    `operation_id`  varchar(36) COMMENT '操作记录ID(只记录采纳)',
    `model_id`      varchar(36) DEFAULT NULL COMMENT '模型ID',
    `data_type`     varchar(20) DEFAULT NULL COMMENT '数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)',
    `data_no`       varchar(36) COMMENT '数据编号',
    `data_name`     varchar(36) COMMENT '数据名称',
    `schedule_time` datetime    DEFAULT NULL COMMENT '调度时间',
    `start_time`    datetime    DEFAULT NULL COMMENT '开始时间',
    `end_time`      datetime    DEFAULT NULL COMMENT '结束时间',
    `json_value`    varchar(50) COMMENT '序列化的数据',
    `sort`          integer COMMENT '排序',
    PRIMARY KEY (`id`) USING BTREE,
    KEY            `idx_suggest_id` (`suggest_id`) USING BTREE
    KEY             `idx_suggest_id` (`suggest_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='调度建议快照记录表';
ALTER TABLE `iailab_expert_tenant_shasteel`.`t_st_suggest_operation_record`
ALTER TABLE `t_st_suggest_operation_record`
    ADD COLUMN `reason` varchar(255) NULL COMMENT '原因' AFTER `operate`;
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
@@ -1022,6 +1022,7 @@
        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());
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/DataCategoryEnum.java
对比新文件
@@ -0,0 +1,37 @@
package com.iailab.module.model.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
 * @author Jay
 */
@Getter
@AllArgsConstructor
public enum DataCategoryEnum {
    DATAPOINT("DATAPOINT", "测点"),
    IND("IND", "指标"),
    PLAN("PLAN", "计划"),
    PREDICT_ITEM_N("PREDICT_ITEM_N", "T+N预测值"),
    PREDICT_ITEM_L("PREDICT_ITEM_L", "T+L预测值"),
    PREDICT_ITEM_C("PREDICT_ITEM_C", "当时预测值");
    private String code;
    private String desc;
    public static PreLineTypeEnum getEumByCode(String code) {
        if (code == null) {
            return null;
        }
        for (PreLineTypeEnum statusEnum : PreLineTypeEnum.values()) {
            if (statusEnum.getCode().equals(code)) {
                return statusEnum;
            }
        }
        return null;
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAutoAdjustConfigService.java
@@ -20,7 +20,7 @@
    MmPredictAutoAdjustConfigEntity getInfo(String id);
    MmPredictAutoAdjustConfigEntity getByCode(String code);
    List<MmPredictAutoAdjustConfigEntity> getByCode(String code);
    void create(MmPredictAutoAdjustConfigEntity entity);
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAutoAdjustConfigServiceImpl.java
@@ -60,8 +60,8 @@
    }
    @Override
    public MmPredictAutoAdjustConfigEntity getByCode(String code) {
        return baseDao.selectOne("config_code",code,"is_enable",1);
    public List<MmPredictAutoAdjustConfigEntity> getByCode(String code) {
        return baseDao.selectList(MmPredictAutoAdjustConfigEntity::getConfigCode,code,MmPredictAutoAdjustConfigEntity::getIsEnable,1);
    }
    @Override
@@ -85,164 +85,185 @@
    public boolean autoAdjustByCode(String configCode,long adjustStartTime) {
        log.info("开始自动调整:configCode:" + configCode + ",adjustStartTime:" + new Date(adjustStartTime));
        // 查询调整配置
        MmPredictAutoAdjustConfigEntity configEntity = getByCode(configCode);
        if (configEntity == null) {
            log.info("自动调整失败原因:configEntity为null");
        List<MmPredictAutoAdjustConfigEntity> configEntityList = getByCode(configCode);
        if (CollectionUtils.isEmpty(configEntityList)) {
            log.info("自动调整失败原因:configEntityList为空");
            return false;
        }
        // 根据outputId分组
        Map<String, List<MmPredictAutoAdjustConfigEntity>> outputIdMap = configEntityList.stream().collect(Collectors.groupingBy(MmPredictAutoAdjustConfigEntity::getOutputId));
        for (Map.Entry<String, List<MmPredictAutoAdjustConfigEntity>> entry : outputIdMap.entrySet()) {
            String outputId = entry.getKey();
            // 查询调整用户adjustStartTime 至 adjustStartTime - 预测长度 * 预测粒度 范围的值
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(adjustStartTime);
            Date endTime = calendar.getTime();
            ItemVO item = mmPredictItemService.getItemByOutPutId(outputId);
            if (item == null) {
                log.info("自动调整失败原因:getItemByOutPutId为null,outputId:" + outputId);
                continue;
            }
            calendar.add(Calendar.SECOND,item.getPredictLength() * item.getGranularity() * -1);
            Date startTime = calendar.getTime();
        // 查询调整用户adjustStartTime 至 adjustStartTime - 预测长度 * 预测粒度 范围的值
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(adjustStartTime);
        Date endTime = calendar.getTime();
        ItemVO item = mmPredictItemService.getItemByOutPutId(configEntity.getOutputId());
        if (item == null) {
            log.info("自动调整失败原因:getItemByOutPutId为null,outputId:" + configEntity.getOutputId());
            return false;
        }
        calendar.add(Calendar.SECOND,item.getPredictLength() * item.getGranularity() * -1);
        Date startTime = calendar.getTime();
        ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO();
        ApiPointDTO pointInfo = dataPointApi.getInfoById(configEntity.getPointId());
        queryDTO.setPointNo(pointInfo.getPointNo());
        queryDTO.setEnd(endTime);
        queryDTO.setStart(startTime);
        List<ApiPointValueDTO> apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO);
        if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
            log.info("自动调整失败原因:测点数据长度为0。queryDTO:" + queryDTO);
            return false;
        }
        // 过滤掉-2
        apiPointValueDTOS = apiPointValueDTOS.stream().filter(e -> !Double.valueOf(e.getV()).equals(-2.0)).collect(Collectors.toList());
        if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
            log.info("自动调整失败原因:过滤掉-2之后测点数据长度为0。queryDTO:" + queryDTO);
            return false;
        }
            // 获取预测历史结果
            InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
            pojo.setType(DataTypeEnum.FLOAT_LAST_BAK.getCode());
            pojo.setOutPutId(outputId);
            List<InfluxModelResultVO> influxModelResult = influxDBService.queryModelResults(pojo, new Date(adjustStartTime), new Date(adjustStartTime));
            if (CollectionUtils.isEmpty(influxModelResult)) {
                log.info("自动调整失败原因:预测历史结果为空。itemNo:" + item.getItemNo() + ",itemName:" + item.getItemName() + ",outputId:" + outputId + ",time:" + adjustStartTime);
                continue;
            }
        // 获取预测历史结果
        InfluxModelResultPOJO pojo = new InfluxModelResultPOJO();
        pojo.setType(DataTypeEnum.FLOAT_LAST.getCode());
        pojo.setOutPutId(configEntity.getOutputId());
        List<InfluxModelResultVO> influxModelResult = influxDBService.queryModelResults(pojo, new Date(adjustStartTime), new Date(adjustStartTime));
        if (CollectionUtils.isEmpty(influxModelResult)) {
            log.info("自动调整失败原因:预测历史结果为空。itemNo:" + item.getItemNo() + ",itemName" + item.getItemName() + ",outputId" + configEntity.getOutputId() + ",time" + adjustStartTime);
            return false;
        }
        // 触发规则
        AutoAdjustTriggerRuleEnum triggerRuleEnum = AutoAdjustTriggerRuleEnum.fromCode(configEntity.getTriggerRule());
        Double adjustValue = null;
        // 判断是否符合触发条件 并计算调整值
        switch (triggerRuleEnum) {
            case SLOPE:
                // 计算每个△t的斜率,任意一个大于触发值则认为该区间有调整
                Calendar slopeCalendar = Calendar.getInstance();
                slopeCalendar.setTime(startTime);
                Date slopeStartTime = slopeCalendar.getTime();
                slopeCalendar.add(Calendar.MINUTE,configEntity.getT());
                Date slopeEndTime = slopeCalendar.getTime();
                if (slopeEndTime.after(endTime)) {
                    log.info("自动调整失败原因:△t设置过大,大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
                    return false;
            // 计算所有影响用户的最终调整值
            Double finalAdjustValue = 0.0;
            for (MmPredictAutoAdjustConfigEntity configEntity : entry.getValue()) {
                Double adjustValue = null;
                // 查询影响用户历史值
                ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO();
                ApiPointDTO pointInfo = dataPointApi.getInfoById(configEntity.getPointId());
                if (pointInfo == null) {
                    log.info("自动调整失败原因:影响用户pointInfo为空。pointId:" + configEntity.getPointId() + "configCode:" + configEntity.getConfigCode() + "configName:" + configEntity.getConfigName());
                    continue;
                }
                while (!slopeEndTime.after(endTime)) {
                    //计算斜率
                    //△t开始时间测点值
                    Date finalSlopeStartTime = slopeStartTime;
                    Optional<ApiPointValueDTO> startOptional = apiPointValueDTOS.stream().filter(apiPointValueDTO -> apiPointValueDTO.getT().equals(finalSlopeStartTime)).findFirst();
                    //△t结束时间测点值
                    Date finalSlopeEndTime = slopeEndTime;
                    Optional<ApiPointValueDTO> endOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(finalSlopeEndTime)).findFirst();
                    if (startOptional.isPresent() && endOptional.isPresent()) {
                        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) {
                            // 计算调整值 并跳出循环
                            adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS);
                            log.info("计算调整值:" + adjustValue + ",斜率:" + slope + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",slopeStartTime:" + slopeStartTime + ",slopeEndTime:" + slopeEndTime);
                            break;
                log.info("自动调整开始处理:configName:" + configEntity.getConfigName() + "影响用户:" + pointInfo.getPointName());
                queryDTO.setPointNo(pointInfo.getPointNo());
                queryDTO.setEnd(endTime);
                queryDTO.setStart(startTime);
                List<ApiPointValueDTO> apiPointValueDTOS = dataPointApi.queryPointHistoryValue(queryDTO);
                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
                    log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:测点数据长度为0。queryDTO:" + queryDTO);
                    continue;
                }
                // 过滤掉-2
                apiPointValueDTOS = apiPointValueDTOS.stream().filter(e -> !Double.valueOf(e.getV()).equals(-2.0)).collect(Collectors.toList());
                if (CollectionUtils.isEmpty(apiPointValueDTOS)) {
                    log.info("影响用户调整失败原因:过滤掉-2之后测点数据长度为0。queryDTO:" + queryDTO);
                    continue;
                }
                // 触发规则
                AutoAdjustTriggerRuleEnum triggerRuleEnum = AutoAdjustTriggerRuleEnum.fromCode(configEntity.getTriggerRule());
                // 判断是否符合触发条件 并计算调整值
                switch (triggerRuleEnum) {
                    case SLOPE:
                        // 计算每个△t的斜率,任意一个大于触发值则认为该区间有调整
                        Calendar slopeCalendar = Calendar.getInstance();
                        slopeCalendar.setTime(startTime);
                        Date slopeStartTime = slopeCalendar.getTime();
                        slopeCalendar.add(Calendar.MINUTE,configEntity.getT());
                        Date slopeEndTime = slopeCalendar.getTime();
                        if (slopeEndTime.after(endTime)) {
                            log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:△t设置过大,大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
                            continue;
                        }
                        log.info("斜率不满足条件,斜率:" + slope);
                    }
                    // 下一个△t
                    slopeStartTime = slopeCalendar.getTime();
                    slopeCalendar.add(Calendar.MINUTE,configEntity.getT());
                    slopeEndTime = slopeCalendar.getTime();
                }
                break;
            case AVERAGE_GAP:
                // 计算每两个△t的平均差,任意一个大于触发值则认为该区间有调整
                Calendar averageCalendar = Calendar.getInstance();
                averageCalendar.setTime(startTime);
                Date averageStartTime = averageCalendar.getTime();
                averageCalendar.add(Calendar.MINUTE,configEntity.getT());
                Date averageMiddleTime = averageCalendar.getTime();
                averageCalendar.add(Calendar.MINUTE,configEntity.getT());
                Date averageEndTime = averageCalendar.getTime();
                if (averageEndTime.after(endTime)) {
                    log.info("自动调整失败原因:△t设置过大,△t*2大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
                    return false;
                }
                while (!averageEndTime.after(endTime)) {
                    //计算均值差
                    //前△t测点平均值
                    Date finalAverageStartTime = averageStartTime;
                    Date finalAverageMiddleTime = averageMiddleTime;
                    OptionalDouble startAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageStartTime) && !e.getT().after(finalAverageMiddleTime)).mapToDouble(ApiPointValueDTO::getV).average();
                    //后△t测点平均值
                    Date finalAverageEndTime = averageEndTime;
                    OptionalDouble endAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageMiddleTime) && !e.getT().after(finalAverageEndTime)).mapToDouble(ApiPointValueDTO::getV).average();
                    if (startAverage.isPresent() && endAverage.isPresent()) {
                        double averageGapValue = startAverage.getAsDouble() - endAverage.getAsDouble();
                        // 均值差,大于等于触发值则进行调整
                        if (Double.valueOf(Math.abs(averageGapValue)).compareTo(configEntity.getTriggerValue()) >= 0) {
                            // 计算调整值 并跳出循环
                            adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS);
                            log.info("计算调整值:" + adjustValue + ",均值差:" + averageGapValue + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",averageStartTime:" + averageStartTime + ",averageMiddleTime:" + averageMiddleTime + ",averageEndTime:" + averageEndTime);
                            break;
                        while (!slopeEndTime.after(endTime)) {
                            //计算斜率
                            //△t开始时间测点值
                            Date finalSlopeStartTime = slopeStartTime;
                            Optional<ApiPointValueDTO> startOptional = apiPointValueDTOS.stream().filter(apiPointValueDTO -> apiPointValueDTO.getT().equals(finalSlopeStartTime)).findFirst();
                            //△t结束时间测点值
                            Date finalSlopeEndTime = slopeEndTime;
                            Optional<ApiPointValueDTO> endOptional = apiPointValueDTOS.stream().filter(e -> e.getT().equals(finalSlopeEndTime)).findFirst();
                            if (startOptional.isPresent() && endOptional.isPresent()) {
                                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) {
                                    // 计算调整值 并跳出循环
                                    adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS);
                                    log.info("计算调整值:" + adjustValue + ",斜率:" + slope + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",slopeStartTime:" + slopeStartTime + ",slopeEndTime:" + slopeEndTime);
                                    break;
                                }
                                log.info("斜率不满足条件,斜率:" + slope);
                            }
                            // 下一个△t
                            slopeStartTime = slopeCalendar.getTime();
                            slopeCalendar.add(Calendar.MINUTE,configEntity.getT());
                            slopeEndTime = slopeCalendar.getTime();
                        }
                        log.info("均值差不满足条件,均值差:" + averageGapValue);
                    }
                        break;
                    case AVERAGE_GAP:
                        // 计算每两个△t的平均差,任意一个大于触发值则认为该区间有调整
                        Calendar averageCalendar = Calendar.getInstance();
                        averageCalendar.setTime(startTime);
                        Date averageStartTime = averageCalendar.getTime();
                        averageCalendar.add(Calendar.MINUTE,configEntity.getT());
                        Date averageMiddleTime = averageCalendar.getTime();
                        averageCalendar.add(Calendar.MINUTE,configEntity.getT());
                        Date averageEndTime = averageCalendar.getTime();
                    // 下一个△t
                    averageStartTime = averageMiddleTime;
                    averageMiddleTime = averageEndTime;
                    averageCalendar.add(Calendar.MINUTE,configEntity.getT());
                    averageEndTime = averageCalendar.getTime();
                        if (averageEndTime.after(endTime)) {
                            log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:△t设置过大,△t*2大于模型预测长度 * 预测粒度。△t:" + configEntity.getT());
                            continue;
                        }
                        while (!averageEndTime.after(endTime)) {
                            //计算均值差
                            //前△t测点平均值
                            Date finalAverageStartTime = averageStartTime;
                            Date finalAverageMiddleTime = averageMiddleTime;
                            OptionalDouble startAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageStartTime) && !e.getT().after(finalAverageMiddleTime)).mapToDouble(ApiPointValueDTO::getV).average();
                            //后△t测点平均值
                            Date finalAverageEndTime = averageEndTime;
                            OptionalDouble endAverage = apiPointValueDTOS.stream().filter(e -> e.getT().after(finalAverageMiddleTime) && !e.getT().after(finalAverageEndTime)).mapToDouble(ApiPointValueDTO::getV).average();
                            if (startAverage.isPresent() && endAverage.isPresent()) {
                                double averageGapValue = startAverage.getAsDouble() - endAverage.getAsDouble();
                                // 均值差,大于等于触发值则进行调整
                                if (Double.valueOf(Math.abs(averageGapValue)).compareTo(configEntity.getTriggerValue()) >= 0) {
                                    // 计算调整值 并跳出循环
                                    adjustValue = AutoAdjustValueRuleEnum.getAdjustValue(configEntity.getAdjustValueRule(), apiPointValueDTOS);
                                    log.info("计算调整值:" + adjustValue + ",均值差:" + averageGapValue + ",pointNo:" + pointInfo.getPointNo() + ",pointName:" + pointInfo.getPointName() + ",averageStartTime:" + averageStartTime + ",averageMiddleTime:" + averageMiddleTime + ",averageEndTime:" + averageEndTime);
                                    break;
                                }
                                log.info("均值差不满足条件,均值差:" + averageGapValue);
                            }
                            // 下一个△t
                            averageStartTime = averageMiddleTime;
                            averageMiddleTime = averageEndTime;
                            averageCalendar.add(Calendar.MINUTE,configEntity.getT());
                            averageEndTime = averageCalendar.getTime();
                        }
                        break;
                    default:
                        log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:未知触发规则,triggerRule" + configEntity.getTriggerRule());
                        continue;
                }
                break;
            default:
                log.info("自动调整失败原因:未知触发规则,triggerRule" + configEntity.getTriggerRule());
                return false;
        }
        if (adjustValue == null) {
            log.info("自动调整失败原因:未达到触发条件");
            return false;
                if (adjustValue == null) {
                    log.info("影响用户[" + pointInfo.getPointName() + "]调整失败原因:未达到触发条件");
                    continue;
                }
                // 调整系数
                adjustValue = adjustValue * configEntity.getAdjustCoefficient();
                // 调整方向
                adjustValue = adjustValue * configEntity.getAdjustDirection();
                // 累加到最终调整值
                finalAdjustValue += adjustValue;
            }
            // 执行调整
            if (finalAdjustValue.equals(0.0)) {
                log.info("自动调整失败原因:finalAdjustValue为0,outputId:" + outputId + ",configCode:" + configCode);
                continue;
            }
            List<InfluxModelResultPOJO> lastList = new ArrayList<>();
            for (InfluxModelResultVO resultVO : influxModelResult) {
                InfluxModelResultLastSimPOJO adjustPojo = new InfluxModelResultLastSimPOJO();
                // 设置新的调整值
                adjustPojo.setValue(Double.parseDouble(resultVO.getValue().toString()) + finalAdjustValue);
                adjustPojo.setTimestamp(resultVO.getTimestamp());
                adjustPojo.setOutPutId(outputId);
                lastList.add(adjustPojo);
            }
            // 相同时间直接覆盖旧值
            influxDBService.asyncWriteModelResults(lastList);
            log.info("t+l自动调整。configCode:" + configCode + ",adjustValue:" + finalAdjustValue + ",itemNo:" + item.getItemNo() + ",itemName:" + item.getItemName() + ",outputId:" + outputId + ",adjustTime:" + adjustStartTime);
        }
        // 调整系数
        adjustValue = adjustValue * configEntity.getAdjustCoefficient();
        // 调整方向
        adjustValue = adjustValue * configEntity.getAdjustDirection();
        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 + ",itemNo:" + item.getItemNo() + ",itemName" + item.getItemName() + ",outputId" + configEntity.getOutputId() + ",adjustTime:" + adjustStartTime);
        return true;
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestOperationRecordController.java
@@ -20,9 +20,7 @@
import static com.iailab.framework.common.pojo.CommonResult.success;
/**
 * @author PanZhibao
 * @Description
 * @createTime 2024年12月25日
 * @author Jay
 */
@Tag(name = "模型服务 - 调度建议操作记录表")
@RestController
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfDetController.java
@@ -5,10 +5,7 @@
import com.iailab.framework.common.util.object.BeanUtils;
import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfDetEntity;
import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfDetService;
import com.iailab.module.model.mcs.sche.vo.StScheduleModelRespVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetPageReqVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetRespVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetSaveReqVO;
import com.iailab.module.model.mcs.sche.vo.*;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
@@ -25,7 +22,7 @@
 * @Description
 * @createTime 2025年05月23日
 */
@Tag(name = "调度建议快照详情")
@Tag(name = "调度建议快照配置详情")
@RestController
@RequestMapping("/model/suggest/snapshot/conf-det")
public class StSuggestSnapshotConfDetController {
@@ -61,4 +58,11 @@
        stSuggestSnapshotConfDetService.delete(id);
        return success(true);
    }
    @GetMapping("/get")
    @PreAuthorize("@ss.hasPermission('suggest:snapshot:info')")
    public CommonResult<StSuggestSnapshotConfDetRespVO> get(@RequestParam("id") String id) {
        StSuggestSnapshotConfDetRespVO result = stSuggestSnapshotConfDetService.get(id);
        return success(result);
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotConfMainController.java
@@ -3,19 +3,20 @@
import com.iailab.framework.common.pojo.CommonResult;
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.framework.common.util.object.BeanUtils;
import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfDetEntity;
import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity;
import com.iailab.module.model.api.mcs.dto.StScheduleModelOutDTO;
import com.iailab.module.model.mcs.sche.entity.*;
import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfMainService;
import com.iailab.module.model.mcs.sche.vo.StScheduleModelRespVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainSaveReqVO;
import com.iailab.module.model.mcs.sche.vo.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import static com.iailab.framework.common.pojo.CommonResult.success;
@@ -24,7 +25,7 @@
 * @Description
 * @createTime 2025年05月23日
 */
@Tag(name = "调度建议快照")
@Tag(name = "调度建议快照配置主表")
@RestController
@RequestMapping("/model/suggest/snapshot/conf-main")
public class StSuggestSnapshotConfMainController {
@@ -33,24 +34,35 @@
    private StSuggestSnapshotConfMainService stSuggestSnapshotConfMainService;
    
    @GetMapping("/page")
    @PreAuthorize("@ss.hasPermission('suggest:snapshot:query')")
    public CommonResult<PageResult<StSuggestSnapshotConfMainRespVO>> getPage(@Valid StSuggestSnapshotConfMainPageReqVO pageVO) {
        PageResult<StSuggestSnapshotConfMainEntity> pageResult = stSuggestSnapshotConfMainService.page(pageVO);
        return success(BeanUtils.toBean(pageResult, StSuggestSnapshotConfMainRespVO.class));
    }
    @GetMapping("/get")
    @PreAuthorize("@ss.hasPermission('suggest:snapshot:info')")
    public CommonResult<StSuggestSnapshotConfMainRespVO> get(@RequestParam("id") String id) {
        StSuggestSnapshotConfMainRespVO result = stSuggestSnapshotConfMainService.get(id);
        return success(result);
    }
    @PostMapping("/create")
    @PreAuthorize("@ss.hasPermission('suggest:snapshot:create')")
    public CommonResult<Boolean> create(@Valid @RequestBody StSuggestSnapshotConfMainSaveReqVO createReqVO) {
        stSuggestSnapshotConfMainService.create(createReqVO);
        return success(true);
    }
    @PutMapping("/update")
    @PreAuthorize("@ss.hasPermission('suggest:snapshot:update')")
    public CommonResult<Boolean> update(@Valid @RequestBody StSuggestSnapshotConfMainSaveReqVO updateReqVO) {
        stSuggestSnapshotConfMainService.update(updateReqVO);
        return success(true);
    }
    @DeleteMapping("/delete")
    @PreAuthorize("@ss.hasPermission('suggest:snapshot:delete')")
    @Parameter(name = "id", description = "编号", required = true, example = "1024")
    public CommonResult<Boolean> deleteTenant(@RequestParam("id") String id) {
        stSuggestSnapshotConfMainService.delete(id);
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/controller/admin/StSuggestSnapshotRecordController.java
@@ -1,40 +1,143 @@
package com.iailab.module.model.mcs.sche.controller.admin;
import com.iailab.framework.common.pojo.CommonResult;
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.module.data.api.ind.IndItemApi;
import com.iailab.module.data.api.ind.dto.ApiIndItemQueryDTO;
import com.iailab.module.data.api.ind.dto.ApiIndItemValueDTO;
import com.iailab.module.data.api.plan.PlanItemApi;
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.data.common.ApiDataQueryDTO;
import com.iailab.module.data.common.ApiDataValueDTO;
import com.iailab.module.model.api.mcs.McsApi;
import com.iailab.module.model.api.mcs.dto.PreDataBarLineReqVO;
import com.iailab.module.model.api.mcs.dto.PreDataBarLineRespVO;
import com.iailab.module.model.common.enums.DataCategoryEnum;
import com.iailab.module.model.common.utils.DateUtils;
import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotRecordService;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordChartReqVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordRespVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO;
import com.mysql.cj.util.TimeUtil;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static com.iailab.framework.common.pojo.CommonResult.success;
import static com.iailab.module.model.common.utils.DateUtils.DATE_TIME_PATTERN;
/**
 * @author Jay
 */
@Tag(name = "调度建议快照")
@RestController
@RequestMapping("/model/suggest/snapshot/record")
public class StSuggestSnapshotRecordController {
    @Autowired
    private StSuggestSnapshotRecordService stSuggestSnapshotRecordService;
    @PostMapping("/create")
    public CommonResult<Boolean> create(@Valid @RequestBody StSuggestSnapshotRecordSaveReqVO createReqVO) {
        stSuggestSnapshotRecordService.create(createReqVO);
        return success(true);
    @Autowired
    private DataPointApi dataPointApi;
    @Autowired
    private IndItemApi indItemApi;
    @Autowired
    private PlanItemApi planItemApi;
    @Autowired
    private McsApi mcsApi;
    @GetMapping("/list")
    @Parameter(name = "operationId", description = "操作id", required = true, example = "1024")
    public CommonResult<List<StSuggestSnapshotRecordRespVO>> getListByOperationId(@RequestParam("operationId") String operationId) {
        return success(stSuggestSnapshotRecordService.getListByOperationId(operationId));
    }
    @PutMapping("/update")
    public CommonResult<Boolean> update(@Valid @RequestBody StSuggestSnapshotRecordSaveReqVO updateReqVO) {
        stSuggestSnapshotRecordService.update(updateReqVO);
        return success(true);
    }
    @PostMapping("/getChartData")
    public CommonResult<List<StSuggestSnapshotRecordRespVO>> getChartData(@RequestBody List<StSuggestSnapshotRecordRespVO> reqList){
        reqList.forEach(item -> {
            List<Object[]> dataList = new ArrayList<>();
            if(DataCategoryEnum.DATAPOINT.getCode().equals(item.getDataType())){
                ApiPointValueQueryDTO queryDTO = new ApiPointValueQueryDTO();
                queryDTO.setPointNo(item.getDataNo());
                queryDTO.setStart(item.getStartTime());
                queryDTO.setEnd(item.getEndTime());
                List<ApiPointValueDTO> valueList = dataPointApi.queryPointHistoryValue(queryDTO);
                if (valueList != null && !valueList.isEmpty()){
                    for (ApiPointValueDTO apiPointValueDTO : valueList) {
                        Object[] data = new Object[2];
                        data[0] = DateUtils.format(new Date(String.valueOf(apiPointValueDTO.getT())), DATE_TIME_PATTERN);
                        data[1] = apiPointValueDTO.getV();
                        dataList.add(data);
                    }
                }
            } else if (DataCategoryEnum.IND.getCode().equals(item.getDataType())) {
                ApiIndItemQueryDTO queryDTO = new ApiIndItemQueryDTO();
                queryDTO.setItemNo(item.getDataNo());
                queryDTO.setStart(item.getStartTime());
                queryDTO.setEnd(item.getEndTime());
                List<ApiIndItemValueDTO> valueList = indItemApi.queryIndItemHistoryValue(queryDTO);
                if (valueList != null && !valueList.isEmpty()){
                    for (ApiIndItemValueDTO apiIndItemValueDTO : valueList) {
                        Object[] data = new Object[2];
                        data[0] = DateUtils.format(new Date(apiIndItemValueDTO.getDataTime()), DATE_TIME_PATTERN);
                        data[1] = apiIndItemValueDTO.getDataValue();
                        dataList.add(data);
                    }
                }
            } else if (DataCategoryEnum.PLAN.getCode().equals(item.getDataType())) {
                ApiDataQueryDTO queryDTO = new ApiDataQueryDTO();
                queryDTO.setItemNo(item.getDataNo());
                queryDTO.setStart(item.getStartTime());
                queryDTO.setEnd(item.getEndTime());
                List<ApiDataValueDTO> valueList = planItemApi.queryPlanItemHistoryValue(queryDTO);
                if (valueList != null && !valueList.isEmpty()){
                    for (ApiDataValueDTO apiDataValueDTO : valueList) {
                        Object[] data = new Object[2];
                        data[0] = DateUtils.format(apiDataValueDTO.getDataTime(), DATE_TIME_PATTERN);
                        data[1] = apiDataValueDTO.getDataValue();
                        dataList.add(data);
                    }
                }
            } else if (DataCategoryEnum.PREDICT_ITEM_N.getCode().equals(item.getDataType())) {
                dataList = getPreDataList(item, "N");
            }else if (DataCategoryEnum.PREDICT_ITEM_L.getCode().equals(item.getDataType())) {
                dataList = getPreDataList(item, "L");
            }else if (DataCategoryEnum.PREDICT_ITEM_C.getCode().equals(item.getDataType())) {
                dataList = getPreDataList(item, "C");
            }
            item.setDataList(dataList);
    @DeleteMapping("/delete")
    @Parameter(name = "id", description = "编号", required = true, example = "1024")
    public CommonResult<Boolean> deleteTenant(@RequestParam("id") String id) {
        stSuggestSnapshotRecordService.delete(id);
        return success(true);
        });
        return success(reqList);
    }
    private List<Object[]> getPreDataList(StSuggestSnapshotRecordRespVO resVo, String type){
        List<Object[]> dataList = new ArrayList<>();
        PreDataBarLineReqVO reqVO  = new PreDataBarLineReqVO();
        List<String> outIds = new ArrayList<>();
        outIds.add(resVo.getDataNo());
        reqVO.setOutIds(outIds);
        reqVO.setStartTime(resVo.getStartTime());
        reqVO.setEndTime(resVo.getEndTime());
        PreDataBarLineRespVO result = mcsApi.getPreDataCharts(reqVO);
        if (result == null || result.getDataViewList() == null || result.getDataViewList().isEmpty()){
            return dataList;
        }
        if ("N".equals(type) && result.getDataViewList().get(0).getPreDataN()!=null){
            dataList = result.getDataViewList().get(0).getPreDataN();
        }else if ("L".equals(type) && result.getDataViewList().get(0).getPreDataL()!=null){
            dataList = result.getDataViewList().get(0).getPreDataL();
        }else if ("C".equals(type) && result.getDataViewList().get(0).getCurData()!=null){
            dataList = result.getDataViewList().get(0).getCurData();
        }
        return dataList;
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java
@@ -25,6 +25,7 @@
    default PageResult<StScheduleSuggestEntity> selectPage(StScheduleSuggestPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<StScheduleSuggestEntity>()
                .likeIfPresent(StScheduleSuggestEntity::getTitle, reqVO.getTitle())
                .eqIfPresent(StScheduleSuggestEntity::getStatus, reqVO.getStatus())
                .eqIfPresent(StScheduleSuggestEntity::getModelId, reqVO.getModelId())
                .likeIfPresent(StScheduleSuggestEntity::getScheduleObj, reqVO.getScheduleObj())
                .orderByDesc(StScheduleSuggestEntity::getCreateTime));
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfDetDao.java
@@ -4,11 +4,9 @@
import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity;
import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfDetEntity;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetPageReqVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * @author Jay
@@ -17,6 +15,7 @@
@Mapper
public interface StSuggestSnapshotConfDetDao extends BaseMapperX<StSuggestSnapshotConfDetEntity> {
    default PageResult<StSuggestSnapshotConfDetEntity> selectPage(StSuggestSnapshotConfDetPageReqVO reqVO) {
        return selectPage(reqVO);
        return selectPage(reqVO,new LambdaQueryWrapperX<StSuggestSnapshotConfDetEntity>()
                .likeIfPresent(StSuggestSnapshotConfDetEntity::getConfId,reqVO.getConfId()));
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StSuggestSnapshotConfMainDao.java
@@ -6,13 +6,8 @@
import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity;
import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity;
import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * @author Jay
@@ -21,6 +16,7 @@
@Mapper
public interface StSuggestSnapshotConfMainDao extends BaseMapperX<StSuggestSnapshotConfMainEntity> {
    default PageResult<StSuggestSnapshotConfMainEntity> selectPage(StSuggestSnapshotConfMainPageReqVO reqVO) {
        return selectPage(reqVO);
        return selectPage(reqVO,new LambdaQueryWrapperX<StSuggestSnapshotConfMainEntity>()
                .likeIfPresent(StSuggestSnapshotConfMainEntity::getModelId,reqVO.getModelId()));
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotConfDetEntity.java
@@ -3,7 +3,6 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.iailab.framework.mybatis.core.dataobject.BaseDO;
import lombok.Data;
import java.io.Serializable;
@@ -14,7 +13,7 @@
 */
@Data
@TableName("t_st_suggest_snapshot_conf_det")
public class StSuggestSnapshotConfDetEntity extends BaseDO {
public class StSuggestSnapshotConfDetEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
@@ -39,12 +38,17 @@
    private String dataNo;
    /**
     * 数据名称
     */
    private String dataName;
    /**
     * 左侧长度(min)
     */
    private Integer leftLength;
    /**
     * 右侧侧长度(min)
     * 右侧长度(min)
     */
    private Integer rightLength;
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/entity/StSuggestSnapshotRecordEntity.java
@@ -13,7 +13,7 @@
 */
@Data
@TableName("t_st_suggest_snapshot_conf_main")
@TableName("t_st_suggest_snapshot_record")
public class StSuggestSnapshotRecordEntity implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -49,6 +49,11 @@
    private String dataNo;
    /**
     * 数据名称
     */
    private String dataName;
    /**
     * 开始时间
     */
    private Date scheduleTime;
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfDetService.java
@@ -23,4 +23,6 @@
    void delete(String id);
    List<StSuggestSnapshotConfDetRespVO> getByConfId(String confId);
    StSuggestSnapshotConfDetRespVO get(String id);
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotConfMainService.java
@@ -2,6 +2,7 @@
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.framework.common.service.BaseService;
import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity;
import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO;
@@ -20,4 +21,6 @@
    void delete(String id);
    StSuggestSnapshotConfMainRespVO getByModelIdAndScheduleObj(String modelId,  String scheduleObj);
    StSuggestSnapshotConfMainRespVO get(String id);
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StSuggestSnapshotRecordService.java
@@ -1,11 +1,11 @@
package com.iailab.module.model.mcs.sche.service;
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.framework.common.service.BaseService;
import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotRecordEntity;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordChartReqVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordRespVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO;
import java.util.List;
/**
 * @author Jay
@@ -17,4 +17,6 @@
    void update(StSuggestSnapshotRecordSaveReqVO createReqVO);
    void delete(String id);
    List<StSuggestSnapshotRecordRespVO> getListByOperationId(String operationId);
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestOperationRecordServiceImpl.java
@@ -2,6 +2,7 @@
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.framework.common.service.impl.BaseServiceImpl;
import com.iailab.framework.common.util.collection.CollectionUtils;
import com.iailab.framework.common.util.object.BeanUtils;
import com.iailab.module.model.mcs.sche.dao.StSuggestOperationRecordDao;
import com.iailab.module.model.mcs.sche.entity.StSuggestOperationRecordEntity;
@@ -47,28 +48,37 @@
        entity.setId(UUID.randomUUID().toString());
        entity.setHandleTime(new Date());
        baseDao.insert(entity);
        //获取调度建议快照配置表信息
        StSuggestSnapshotConfMainRespVO confMain = stSuggestSnapshotConfMainService.getByModelIdAndScheduleObj(reqVo.getModelId(), reqVo.getSuggestId());
        if (confMain != null){
            StSuggestSnapshotRecordSaveReqVO snapshotRecordSaveReqVO = new StSuggestSnapshotRecordSaveReqVO();
            snapshotRecordSaveReqVO.setModelId(entity.getModelId());
            List<StSuggestSnapshotConfDetRespVO> confDetList = stSuggestSnapshotConfDetService.getByConfId(confMain.getId());
            confDetList.forEach(confDet -> {
                snapshotRecordSaveReqVO.setDataNo(confDet.getDataNo());
                snapshotRecordSaveReqVO.setDataType(confDet.getDataType());
                snapshotRecordSaveReqVO.setScheduleTime(entity.getScheduleTime());
                //计算开始时间,开始时间为当前调度时间减去快照配置表配置的左侧时间长度
                LocalDateTime localStartDateTime =  entity.getScheduleTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().minusMinutes(confDet.getLeftLength());
                Date startTime = Date.from(localStartDateTime.atZone(ZoneId.systemDefault()).toInstant());
                snapshotRecordSaveReqVO.setStartTime(startTime);
                //计算结束时间,结束时间为当前调度时间加上快照配置表配置的右侧时间长度
                LocalDateTime localEndDateTime =  entity.getScheduleTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().plusMinutes(confDet.getRightLength());
                Date endTime = Date.from(localEndDateTime.atZone(ZoneId.systemDefault()).toInstant());
                snapshotRecordSaveReqVO.setEndTime(endTime);
                stSuggestSnapshotRecordService.create(snapshotRecordSaveReqVO);
            });
        if (!"采纳建议".equals(reqVo.getOperate())){
            return;
        }
        //获取调度建议快照配置表信息
        StSuggestSnapshotConfMainRespVO confMain = stSuggestSnapshotConfMainService.getByModelIdAndScheduleObj(reqVo.getModelId(), reqVo.getScheduleObj());
        if (confMain == null) {
            return;
        }
        List<StSuggestSnapshotConfDetRespVO> confDetList = stSuggestSnapshotConfDetService.getByConfId(confMain.getId());
        if (CollectionUtils.isAnyEmpty(confDetList)) {
            return;
        }
        confDetList.forEach(confDet -> {
            StSuggestSnapshotRecordSaveReqVO snapshotRecordSaveReqVO = new StSuggestSnapshotRecordSaveReqVO();
            snapshotRecordSaveReqVO.setSuggestId(reqVo.getSuggestId());
            snapshotRecordSaveReqVO.setModelId(entity.getModelId());
            snapshotRecordSaveReqVO.setOperationId(entity.getId());
            snapshotRecordSaveReqVO.setDataNo(confDet.getDataNo());
            snapshotRecordSaveReqVO.setDataType(confDet.getDataType());
            snapshotRecordSaveReqVO.setDataName(confDet.getDataName());
            snapshotRecordSaveReqVO.setScheduleTime(entity.getScheduleTime());
            //计算开始时间,开始时间为当前调度时间减去快照配置表配置的左侧时间长度
            LocalDateTime localStartDateTime =  entity.getScheduleTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().minusMinutes(confDet.getLeftLength() ==  null ? 60 : confDet.getLeftLength());
            Date startTime = Date.from(localStartDateTime.atZone(ZoneId.systemDefault()).toInstant());
            snapshotRecordSaveReqVO.setStartTime(startTime);
            //计算结束时间,结束时间为当前调度时间加上快照配置表配置的右侧时间长度
            LocalDateTime localEndDateTime =  entity.getScheduleTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().plusMinutes(confDet.getRightLength() ==  null ? 60 : confDet.getLeftLength());
            Date endTime = Date.from(localEndDateTime.atZone(ZoneId.systemDefault()).toInstant());
            snapshotRecordSaveReqVO.setEndTime(endTime);
            stSuggestSnapshotRecordService.create(snapshotRecordSaveReqVO);
        });
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfDetServiceImpl.java
@@ -11,6 +11,7 @@
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetPageReqVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetRespVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfDetSaveReqVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainRespVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -59,4 +60,9 @@
    public List<StSuggestSnapshotConfDetRespVO> getByConfId(String confId) {
        return ConvertUtils.sourceToTarget(baseDao.selectList("conf_id", confId), StSuggestSnapshotConfDetRespVO.class);
    }
    @Override
    public StSuggestSnapshotConfDetRespVO get(String id) {
        return ConvertUtils.sourceToTarget( baseDao.selectById(id), StSuggestSnapshotConfDetRespVO.class);
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotConfMainServiceImpl.java
@@ -6,6 +6,7 @@
import com.iailab.framework.common.util.object.BeanUtils;
import com.iailab.framework.common.util.object.ConvertUtils;
import com.iailab.module.model.mcs.sche.dao.StSuggestSnapshotConfMainDao;
import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity;
import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotConfMainEntity;
import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotConfMainService;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotConfMainPageReqVO;
@@ -53,4 +54,9 @@
    public StSuggestSnapshotConfMainRespVO getByModelIdAndScheduleObj(String modelId,  String scheduleObj) {
        return ConvertUtils.sourceToTarget( baseDao.selectOne("model_id", modelId,  "schedule_obj", scheduleObj), StSuggestSnapshotConfMainRespVO.class);
    }
    @Override
    public StSuggestSnapshotConfMainRespVO get(String id) {
        return ConvertUtils.sourceToTarget( baseDao.selectById(id), StSuggestSnapshotConfMainRespVO.class);
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StSuggestSnapshotRecordServiceImpl.java
@@ -1,24 +1,19 @@
package com.iailab.module.model.mcs.sche.service.impl;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
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.framework.common.util.object.BeanUtils;
import com.iailab.framework.common.util.object.ConvertUtils;
import com.iailab.module.model.mcs.sche.dao.StSuggestSnapshotRecordDao;
import com.iailab.module.model.mcs.sche.entity.StScheduleModelEntity;
import com.iailab.module.model.mcs.sche.entity.StSuggestSnapshotRecordEntity;
import com.iailab.module.model.mcs.sche.service.StSuggestSnapshotRecordService;
import com.iailab.module.model.mcs.sche.vo.StScheduleModelRespVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordChartReqVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordRespVO;
import com.iailab.module.model.mcs.sche.vo.StSuggestSnapshotRecordSaveReqVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.UUID;
import static com.iailab.framework.common.pojo.CommonResult.success;
/**
@@ -52,4 +47,9 @@
    public void delete(String id) {
        baseDao.deleteById(id);
    }
    @Override
    public List<StSuggestSnapshotRecordRespVO> getListByOperationId(String operationId) {
        return ConvertUtils.sourceToTarget(baseDao.selectList("operation_id",  operationId), StSuggestSnapshotRecordRespVO.class);
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StScheduleSuggestPageReqVO.java
@@ -30,6 +30,9 @@
    @Schema(description = "调整对象,模糊匹配", example = "")
    private String scheduleObj;
    @Schema(description = "状态", example = "")
    private String status;
    @Schema(description = "预测时间", example = "")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date predictTime;
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestOperationRecordReqVO.java
@@ -63,4 +63,8 @@
    @Schema(description = "建议ID")
    private String suggestId;
    @Schema(description = "调整对象")
    private String scheduleObj;
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetPageReqVO.java
@@ -1,7 +1,10 @@
package com.iailab.module.model.mcs.sche.vo;
import com.iailab.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
@@ -9,7 +12,9 @@
 */
@Schema(description = "模型服务 - 调度建议快照配置分页 Request VO")
@Data
public class StSuggestSnapshotConfDetPageReqVO {
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class StSuggestSnapshotConfDetPageReqVO extends PageParam {
    @Schema(description = "模型ID")
    private String confId;
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetReqVO.java
@@ -20,6 +20,9 @@
    @Schema(description = "数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)")
    private String dataType;
    @Schema(description = "数据名称")
    private String dataName;
    @Schema(description = "数据编号")
    private String dataNo;
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetRespVO.java
@@ -20,6 +20,9 @@
    @Schema(description = "数据类型(DATAPOINT,IND,PLAN,PREDICTITEM)")
    private String dataType;
    @Schema(description = "数据名称")
    private String dataName;
    @Schema(description = "数据编号")
    private String dataNo;
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfDetSaveReqVO.java
@@ -23,6 +23,9 @@
    @Schema(description = "数据编号")
    private String dataNo;
    @Schema(description = "数据名称")
    private String dataName;
    @Schema(description = "左侧长度(min)")
    private Integer leftLength;
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotConfMainPageReqVO.java
@@ -1,8 +1,11 @@
package com.iailab.module.model.mcs.sche.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.iailab.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
@@ -12,7 +15,9 @@
 */
@Schema(description = "模型服务 - 调度建议快照配置详情分页 Request VO")
@Data
public class StSuggestSnapshotConfMainPageReqVO {
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class StSuggestSnapshotConfMainPageReqVO extends PageParam {
    @Schema(description = "标题")
    private String title;
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordReqVO.java
文件已删除
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordRespVO.java
@@ -5,6 +5,7 @@
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
@@ -32,6 +33,9 @@
    @Schema(description = "数据编号")
    private String dataNo;
    @Schema(description = "数据名称")
    private String dataName;
    @Schema(description = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date startTime;
@@ -46,5 +50,7 @@
    @Schema(description = "排序")
    private Integer sort;
    @Schema(description = "数据列表")
    List<Object[]> dataList;
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/vo/StSuggestSnapshotRecordSaveReqVO.java
@@ -32,6 +32,9 @@
    @Schema(description = "数据编号")
    private String dataNo;
    @Schema(description = "数据名称")
    private String dataName;
    @Schema(description = "调度时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date scheduleTime;
iailab-module-model/iailab-module-model-biz/src/main/resources/application.yml
@@ -232,6 +232,9 @@
      - t_mm_predict_influence_factor
      - t_mm_predict_influence_factor_result
      - t_st_suggest_operation_record
      - t_st_suggest_snapshot_conf_det
      - t_st_suggest_snapshot_conf_main
      - t_st_suggest_snapshot_record
  app:
    app-key: model
    app-secret: 85b0df7edc3df3611913df34ed695011
iailab-plat-sdk/pom.xml
@@ -9,6 +9,7 @@
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>iailab-plat-sdk</artifactId>
    <version>1.0.1</version>
    <packaging>jar</packaging>
    <name>${project.artifactId}</name>
iailab-plat-sdk/src/main/java/com/iailab/sdk/util/http/IailabHttpUtils.java
@@ -90,7 +90,7 @@
            httpPost.addHeader("Content-Type", "application/json;charset=UTF-8");
            httpPost.addHeader("Authorization", "Bearer " + IailabClient.accessToken);
            httpPost.addHeader("Tenant-Id", SdkAutoConfiguration.TENANT_ID.toString());
            StringEntity stringEntity = new StringEntity(json);
            StringEntity stringEntity = new StringEntity(json,"UTF-8");
            stringEntity.setContentEncoding("UTF-8");
            stringEntity.setContentType("application/json");
            httpPost.setEntity(stringEntity);