houzhongjian
2025-01-17 60fa13f76afe72a6f48416de2904d58164859382
Merge remote-tracking branch 'origin/master'
已修改37个文件
已添加3个文件
491 ■■■■■ 文件已修改
iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/DataPointApi.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointPageReqVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/point/DataPointApiImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/IndTimeLimitEnum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/JavaScriptHandler.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/IndItemCollector.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/AtomItemHandler.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/CalItemHandler.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/DerItemHandler.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/utils/IndSqlUtils.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/value/dto/QuerySourceValueDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/DaPointDao.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaMathPointService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaMathPointServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/vo/DaPointPageReqVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-biz/src/main/resources/mapper/point/DaPointDao.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PredictLastValueReqVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/db/mysql.sql 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemOutputServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDao.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/DataPointApi.java
@@ -1,5 +1,6 @@
package com.iailab.module.data.api.point;
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.module.data.api.point.dto.*;
import com.iailab.module.data.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
@@ -50,5 +51,7 @@
    @Operation(summary = "写入单个测点值")
    Boolean writePointRealValue(@RequestBody ApiPointValueWriteDTO queryDto);
    @PostMapping(PREFIX + "/query-math-point/current-value")
    @Operation(summary = "根据计算点编号查询测点集合")
    PageResult<ApiPointDTO> queryMathPointCurrentValue(@RequestBody ApiPointPageReqVO reqVO);
}
iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointDTO.java
@@ -1,5 +1,6 @@
package com.iailab.module.data.api.point.dto;
import com.iailab.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -26,4 +27,7 @@
    @Schema(description = "采集频率", required = true)
    private String minfreqid;
    @Schema(description = "当前值", required = false)
    private Object currentValue;
}
iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/point/dto/ApiPointPageReqVO.java
对比新文件
@@ -0,0 +1,19 @@
package com.iailab.module.data.api.point.dto;
import com.iailab.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
 * @author lirm
 * @Description
 * @createTime 2025年01月14日
 */
@Schema(description = "")
@Data
public class ApiPointPageReqVO extends PageParam {
    @Schema(description = "测点编码", required = true)
    private String pointNo;
}
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/admin/ApiDataController.java
@@ -1,7 +1,9 @@
package com.iailab.module.data.api.controller.admin;
import com.iailab.framework.common.pojo.CommonResult;
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.framework.common.util.date.DateUtils;
import com.iailab.framework.common.util.object.BeanUtils;
import com.iailab.framework.common.util.object.ConvertUtils;
import com.iailab.framework.excel.core.util.ExcelUtils;
import com.iailab.module.data.api.dto.DeviceValueDTO;
@@ -13,9 +15,7 @@
import com.iailab.module.data.api.plan.PlanItemApi;
import com.iailab.module.data.api.plan.dto.ApiPlanDataDTO;
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.api.point.dto.ApiPointsValueQueryDTO;
import com.iailab.module.data.api.point.dto.*;
import com.iailab.module.data.common.ApiDataQueryDTO;
import com.iailab.module.data.common.ApiDataValueDTO;
import com.iailab.module.data.common.utils.ApiSecurityUtils;
@@ -310,10 +310,12 @@
        List<IndItemValueVO> list = indItemCollector.queryValue(itemNo);
        List<ApiIndItemValueDTO> dtoList = new ArrayList<>();
        list.forEach(item -> {
            if (item != null) {
            ApiIndItemValueDTO dto = new ApiIndItemValueDTO();
            dto.setDataTime(item.getDataTime());
            dto.setDataValue(item.getDataValue().doubleValue());
            dtoList.add(dto);
            }
        });
        return success(dtoList);
    }
@@ -325,4 +327,13 @@
        List<IndItemValueVO> list = indItemCollector.queryValue(dto.getItemNo(), dto.getStart(), dto.getEnd());
        return success(ConvertUtils.sourceToTarget(list, ApiIndItemValueDTO.class));
    }
    @PermitAll
    @PostMapping("/query-math-point/current-value")
    @Operation(summary = "根据计算点编号查询测点集合")
    public CommonResult<PageResult<ApiPointDTO>> queryMathPointCurrentValue(@RequestBody ApiPointPageReqVO reqVO) {
        PageResult<ApiPointDTO> data = dataPointApi.queryMathPointCurrentValue(reqVO);
        return success(data);
    }
}
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/point/DataPointApiImpl.java
@@ -1,5 +1,6 @@
package com.iailab.module.data.api.point;
import com.iailab.framework.common.pojo.PageResult;
import com.iailab.framework.common.util.date.DateUtils;
import com.iailab.framework.common.util.object.ConvertUtils;
import com.iailab.module.data.api.point.dto.*;
@@ -7,9 +8,13 @@
import com.iailab.module.data.influxdb.service.InfluxDBService;
import com.iailab.module.data.influxdb.service.impl.InfluxDBServiceImpl;
import com.iailab.module.data.point.collection.PointCollector;
import com.iailab.module.data.point.collection.handler.CalculateHandle;
import com.iailab.module.data.point.dto.DaMathPointDTO;
import com.iailab.module.data.point.dto.DaPointDTO;
import com.iailab.module.data.point.dto.DaPointWriteValueDTO;
import com.iailab.module.data.point.service.DaMathPointService;
import com.iailab.module.data.point.service.DaPointService;
import com.iailab.module.data.point.vo.DaPointPageReqVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
@@ -17,6 +22,7 @@
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
 * @author PanZhibao
@@ -35,6 +41,9 @@
    @Autowired
    private InfluxDBService influxDBService;
    @Autowired
    private DaMathPointService daMathPointService;
    @Override
    public ApiPointDTO getInfoById(String pointId) {
@@ -130,4 +139,30 @@
            return false;
        }
    }
    @Override
    public PageResult<ApiPointDTO> queryMathPointCurrentValue(ApiPointPageReqVO reqVO) {
        DaPointDTO daPointDTO = daPointService.getSimpleInfoByNo(reqVO.getPointNo());
        DaMathPointDTO daMathPointDTO = daMathPointService.getByPoint(daPointDTO.getId());
        String[] pointNos = daMathPointDTO.getExpression().split(CalculateHandle.regex);
        DaPointPageReqVO pageReqVO = new DaPointPageReqVO();
        pageReqVO.setPageNo(reqVO.getPageNo());
        pageReqVO.setPageSize(reqVO.getPageSize());
        pageReqVO.setPointNos(Arrays.asList(pointNos));
        PageResult<DaPointDTO> pageResult = daPointService.queryPage(pageReqVO);
        List<String> pointNosL = pageResult.getList().stream().map(item -> {
            return item.getPointNo();
        }).collect(Collectors.toList());
        Map<String, Object> currentValueMap = pointCollector.getCurrentValue(pointNosL);
        List<ApiPointDTO> dataList = new ArrayList<>();
        pageResult.getList().forEach(item -> {
            ApiPointDTO dto = new ApiPointDTO();
            dto.setPointNo(item.getPointNo());
            dto.setPointName(item.getPointName());
            dto.setCurrentValue(currentValueMap.get(item.getPointNo()).toString());
            dataList.add(dto);
        });
        return new PageResult<>(dataList, pageResult.getTotal());
    }
}
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/channel/http/collector/ihdb/HttpCollectorForIhd.java
@@ -87,6 +87,11 @@
     */
    private static final String T = "t";
    /**
     * 数据质量G:good,B:bad
     */
    private static final String Q = "q";
    private HttpApiEntity getHttpApi(String id) {
        if (apiMap.containsKey(id)) {
            return apiMap.get(id);
@@ -288,12 +293,14 @@
                if (!CollectionUtils.isEmpty(tagValueList)) {
                    for (int i = 0; i < tagValueList.size(); i++) {
                        JSONObject item = tagValueList.getJSONObject(i);
                        if (item.get(Q).toString().equals("G")) {
                        result.put(TagUtils.genTagId(DataSourceType.HTTP.getCode(), sourceName, item.get(N).toString()), item.get(V));
                    }
                }
            }
        }
    }
    }
    private void getByHtp(String url, String sourceName, Map<String, Object> result, List<Object[]> params, Date collectTime) {
        StringBuilder tagSb = new StringBuilder();
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/enums/IndTimeLimitEnum.java
@@ -17,6 +17,7 @@
    LAST_DAY_7("LAST_DAY_7", "最近7天"),
    LAST_DAY_30("LAST_DAY_30", "最近30天"),
    THIS_MONTH("THIS_MONTH", "当前月"),
    LAST_MONTH("LAST_MONTH", "上月"),
    LAST_MONTH_12("LAST_MONTH_12", "最近12个月"),
    THIS_YEAR_MONTH("THIS_YEAR_MONTH", "当年月份"),
    LAST_YEAR("LAST_YEAR", "去年"),
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/common/utils/JavaScriptHandler.java
@@ -1,6 +1,9 @@
package com.iailab.module.data.common.utils;
import javax.annotation.Resource;
import cn.hutool.script.JavaScriptEngine;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.script.ScriptEngine;
@@ -10,6 +13,7 @@
 * @author PanZhibao
 * @date 2021年06月04日 16:01
 */
@Slf4j
@Component
public class JavaScriptHandler {
@@ -20,6 +24,7 @@
        try {
            return scriptEngine.eval(script).toString();
        } catch (ScriptException e) {
            log.error("计算异常,计算公式:" + script);
            e.printStackTrace();
            return null;
        }
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/IndItemCollector.java
@@ -51,7 +51,7 @@
                result = derItemHandler.queryValue(indItem.getId());
                break;
            case CAL:
                result = calItemHandler.queryValue(itemNo);
                result = calItemHandler.queryValue(indItem.getId());
                break;
            default:
                break;
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/AtomItemHandler.java
@@ -7,6 +7,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
@@ -27,10 +28,15 @@
    private IndItemValueService indItemValueService;
    public List<IndItemValueVO> queryValue(String itemId) {
        List<IndItemValueVO> result = new ArrayList<IndItemValueVO>();
        List<IndItemValueVO> result = new ArrayList<>();
        try {
            QuerySourceValueDTO queryDto = indSqlUtils.getAtomSql(itemId);
            return indItemValueService.getSourceValue(queryDto);
            result = indItemValueService.getSourceValue(queryDto);
            if (!CollectionUtils.isEmpty(result)) {
                result.forEach(item -> {
                    item.setItemNo(queryDto.getItemNo());
                });
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/CalItemHandler.java
@@ -14,6 +14,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
@@ -63,16 +64,23 @@
                }
                IndItemEntity subItem = indItemService.getInfoByNo(s);
                ItemTypeEnum itemType = ItemTypeEnum.getEumByCode(subItem.getItemType());
                List<IndItemValueVO> vl = new ArrayList<>();
                switch (itemType) {
                    case ATOM:
                        valueMix.add(atomItemHandler.queryValue(subItem.getId()));
                        vl = atomItemHandler.queryValue(subItem.getId());
                        break;
                    case DER:
                        valueMix.add(derItemHandler.queryValue(subItem.getId()));
                        vl = derItemHandler.queryValue(subItem.getId());
                        break;
                    default:
                        break;
                }
                if (!CollectionUtils.isEmpty(vl)) {
                    vl.forEach(vi -> {
                        vi.setItemNo(s);
                    });
                }
                valueMix.add(vl);
            }
            dataLength = valueMix.get(0).size();
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/handler/DerItemHandler.java
@@ -7,6 +7,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
@@ -31,7 +32,7 @@
        List<IndItemValueVO> result = new ArrayList<IndItemValueVO>();
        try {
            QuerySourceValueDTO queryDto = indSqlUtils.getDerSql(itemId);
            return indItemValueService.getSourceValue(queryDto);
            result = indItemValueService.getSourceValue(queryDto);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/collection/utils/IndSqlUtils.java
@@ -4,10 +4,11 @@
import com.iailab.module.data.common.enums.IndStatFuncEnum;
import com.iailab.module.data.common.enums.IndTimeLimitEnum;
import com.iailab.module.data.ind.data.dto.IndDataSetDTO;
import com.iailab.module.data.ind.data.service.IndDataSetFieldService;
import com.iailab.module.data.ind.data.service.IndDataSetService;
import com.iailab.module.data.ind.item.entity.IndItemEntity;
import com.iailab.module.data.ind.item.service.IndItemAtomService;
import com.iailab.module.data.ind.item.service.IndItemDerService;
import com.iailab.module.data.ind.item.service.IndItemService;
import com.iailab.module.data.ind.item.vo.IndItemAtomVO;
import com.iailab.module.data.ind.item.vo.IndItemDerVO;
import com.iailab.module.data.ind.value.dto.QuerySourceValueDTO;
@@ -33,7 +34,7 @@
    private IndDataSetService indDataSetService;
    @Autowired
    private IndDataSetFieldService indDataSetFieldService;
    private IndItemService indItemService;
    @Autowired
    private IndItemDerService indItemDerService;
@@ -50,6 +51,8 @@
        if (indItem == null) {
            return result;
        }
        IndItemEntity itemEntity = indItemService.get(itemId);
        result.setItemNo(itemEntity.getItemNo());
        result.setIndItemAtom(indItem);
        IndDataSetDTO dataSet = indDataSetService.getDet(indItem.getDataSet());
        if (dataSet == null) {
@@ -91,6 +94,8 @@
        if (indItem == null) {
            return result;
        }
        IndItemEntity itemEntity = indItemService.get(itemId);
        result.setItemNo(itemEntity.getItemNo());
        result = getAtomSql(indItem.getAtomItemId());
        // 拼接SELECT
@@ -99,11 +104,9 @@
            selectSql.append(indItem.getDimension());
            selectSql.append(", ");
            selectSql.append(result.getSelectSql());
        }
        else if(StringUtils.isBlank(indItem.getDimension()) && StringUtils.isNotBlank(result.getIndItemAtom().getStatFunc())){
        } else if (StringUtils.isBlank(indItem.getDimension()) && StringUtils.isNotBlank(result.getIndItemAtom().getStatFunc())) {
            selectSql.append(result.getSelectSql());
        }
        else{
        } else {
            selectSql.append(result.getSelectSql());
            selectSql.append(", ");
            selectSql.append(indItem.getTimeLabel());
@@ -154,6 +157,18 @@
                whereSql.append(indItem.getTimeLabel());
                whereSql.append("='");
                whereSql.append(DateUtils.format(calendar.getTime(), PATTERN_MON));
                whereSql.append("'");
                break;
            case LAST_MONTH:
                calendar.add(Calendar.MONTH, -1); // 将当前日期减去一个月,得到上个月的日期
                whereSql.append(indItem.getTimeLabel());
                whereSql.append(" >= '");
                whereSql.append(DateUtils.format(calendar.getTime(), PATTERN_MON)); // 上个月的第一天
                calendar.add(Calendar.MONTH, 1); // 再加一个月,回到当前月
                whereSql.append("' AND '");
                whereSql.append(indItem.getTimeLabel());
                whereSql.append("' < '");
                whereSql.append(DateUtils.format(calendar.getTime(), PATTERN_MON)); // 当前月
                whereSql.append("'");
                break;
            case LAST_MONTH_12:
@@ -228,6 +243,9 @@
        }
        result = getAtomSql(indItem.getAtomItemId());
        IndItemEntity itemEntity = indItemService.get(itemId);
        result.setItemNo(itemEntity.getItemNo());
        // 拼接SELECT
        StringBuilder selectSql = new StringBuilder();
        selectSql.append(indItem.getDimension());
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/ind/value/dto/QuerySourceValueDTO.java
@@ -11,6 +11,8 @@
@Data
public class QuerySourceValueDTO {
    private String itemNo;
    private String dataSource;
    private String selectSql;
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/PointCollector.java
@@ -145,6 +145,7 @@
            data.putAll(cumulateHandle.getCurrent(pointNos));
            return data;
        } catch (Exception ex) {
            ex.printStackTrace();
            return R.error(ex.getMessage());
        }
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/CalculateHandle.java
@@ -152,6 +152,11 @@
            pointNos.add(s);
            dataMap.putAll(measureHandle.getCurrent(pointNos));
            dataMap.putAll(constantHandle.getCurrent(pointNos));
            if (dataMap.get(s) == null) {
                log.info("计算点数据异常");
                log.info("pointNo=" + dto.getPointNo() +";dataMap.key=" + s);
                return CommonConstant.BAD_VALUE;
            }
            String valueStr =  dataMap.get(s).toString();
            if (StrUtils.isNumeric(valueStr) && new BigDecimal(valueStr).compareTo(CommonConstant.BAD_VALUE) == 0) {
                log.info("BAD_VALUE:" + s);
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/collection/handler/MeasureHandle.java
@@ -120,9 +120,7 @@
    private void toCommonResult(Date collectTime, List<DaPointDTO> dtos, Map<String, Object> tagValues,
                          Map<String, Object> dataMap, List<InfluxPointValuePOJO> result,List<String> listGood,List<String> listBad) {
        if (!CollectionUtils.isEmpty(tagValues)) {
            tagValues.forEach((k, v) -> {
                dataMap.put(k, v);
            });
//            dataMap.putAll(tagValues);
            dtos.forEach(dto -> {
                String tagId = TagUtils.genTagId(dto.getSourceType(), dto.getSourceName(), dto.getTagNo());
                if (tagValues.containsKey(tagId)) {
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/dao/DaPointDao.java
@@ -3,12 +3,15 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
import com.iailab.framework.tenant.core.db.dynamic.TenantDS;
import com.iailab.module.data.api.point.dto.ApiPointDTO;
import com.iailab.module.data.point.dto.DaPointDTO;
import com.iailab.module.data.point.entity.DaPointEntity;
import com.iailab.module.data.point.vo.DaPointPageReqVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaMathPointService.java
@@ -1,8 +1,14 @@
package com.iailab.module.data.point.service;
import com.iailab.framework.common.service.BaseService;
import com.iailab.framework.common.validation.group.AddGroup;
import com.iailab.framework.common.validation.group.UpdateGroup;
import com.iailab.module.data.point.entity.DaMathPointEntity;
import com.iailab.module.data.point.dto.DaMathPointDTO;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import java.util.List;
/**
 * @author PanZhibao
@@ -22,4 +28,5 @@
    void deleteBatch(String[] ids);
    void deleteByPoint(String[] ids);
}
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/DaPointService.java
@@ -5,6 +5,8 @@
import com.iailab.module.data.point.dto.DaPointDTO;
import com.iailab.module.data.point.vo.*;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaMathPointServiceImpl.java
@@ -10,6 +10,8 @@
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
/**
@@ -61,4 +63,5 @@
        wrapper.in("point_id", Arrays.asList(ids));
        baseDao.delete(wrapper);
    }
}
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/service/impl/DaPointServiceImpl.java
@@ -6,7 +6,9 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.iailab.framework.common.constant.Constant;
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.data.api.point.dto.ApiPointDTO;
@@ -45,7 +47,7 @@
 * @createTime 2024年09月2日
 */
@Service
public class DaPointServiceImpl extends ServiceImpl<DaPointDao, DaPointEntity> implements DaPointService {
public class DaPointServiceImpl extends BaseServiceImpl<DaPointDao, DaPointEntity> implements DaPointService {
    @Autowired
    private DaMeasurePointService daMeasurePointService;
@@ -395,7 +397,7 @@
        importPoints.forEach(importPoint -> {
            // 判断如果不存在,再进行插入
            DaPointEntity existPoint = baseMapper.selectByPointName(importPoint.getPointName());
            DaPointEntity existPoint = baseDao.selectByPointName(importPoint.getPointName());
            if (existPoint == null) {
                DaPointEntity daPointEntity = ConvertUtils.sourceToTarget(importPoint, DaPointEntity.class);
                daPointEntity.setId(UUID.randomUUID().toString());
@@ -444,7 +446,7 @@
            DaPointEntity updatePoint = BeanUtils.toBean(importPoint, DaPointEntity.class);
            updatePoint.setId(existPoint.getId());
            baseMapper.updateById(updatePoint);
            baseDao.updateById(updatePoint);
            DaMeasurePointEntity measurePoint = new DaMeasurePointEntity();
            measurePoint.setSourceType(importPoint.getSourceType());
            measurePoint.setSourceId(sourcesIdMap.get(importPoint.getSourceType()).get(importPoint.getSourceName()));
iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/point/vo/DaPointPageReqVO.java
@@ -6,6 +6,8 @@
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.List;
/**
 * @author lirm
 * @Description
@@ -32,4 +34,6 @@
    private Integer isEnable;
    private String collectQuality;
    private List<String> pointNos;
}
iailab-module-data/iailab-module-data-biz/src/main/resources/application.yaml
@@ -170,7 +170,7 @@
      - t_http_tag
      - t_http_token
      - t_ind_data_set
      - t_ind_data_set_field8982
      - t_ind_data_set_field
      - t_ind_item_category
      - t_ind_item
      - t_ind_item_atom
iailab-module-data/iailab-module-data-biz/src/main/resources/mapper/point/DaPointDao.xml
@@ -71,6 +71,12 @@
            <if test="params.collectQuality != null and params.collectQuality != ''">
                and t6.collect_quality = #{params.collectQuality}
            </if>
            <if test="params.pointNos != null">
                AND t1.point_no in
                <foreach collection="params.pointNos" item="item" index="item" open="(" close=")" separator=",">
                    #{item}
                </foreach>
            </if>
        </where>
        order by t1.create_time desc, t1.point_no desc
    </select>
@@ -286,5 +292,14 @@
            </if>
        </where>
    </select>
    <select id="getPointPage" parameterType="map" resultType="com.iailab.module.data.api.point.dto.ApiPointDTO">
        select point_no pointNo,point_name pointName from t_da_point
        <where>
            point_no in
            <foreach item="value" collection="paramsMap.values" separator="," open="(" close=")">
                '${value}'
            </foreach>
        </where>
    </select>
</mapper>
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java
@@ -11,6 +11,7 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@@ -101,7 +102,19 @@
    @Operation(summary = "获取多个预测项Double类型数据")
    Map<String, Map<String, Double>> getPreDoubleData(PreDoubleDataReqVO reqVO);
    /*@PostMapping(PREFIX + "/predict-data/last-value")
    @PostMapping(PREFIX + "/predict-data/last-value")
    @Operation(summary = "获取最后预测值")
    Double getPredictLastValue();*/
    Map<String, BigDecimal> getPredictLastValue(@RequestBody PredictLastValueReqVO reqVO);
    @GetMapping("/predict-data/electric")
    @Operation(summary = "电力功率因数预测结果查询")
    Map<String,List<Object[]>> getElectricPredictData(String itemCode);
    @GetMapping("/schedule-data/last")
    @Operation(summary = "调度模型最新结果查询")
    String getLastScheduleData(String scheduleCode);
    @GetMapping("/machineRealTimeStatus")
    @Operation(summary = "发电机组实时状态查询")
    List<Map<String, Object>> getRealTimeStatus(@RequestBody List<Map<String, Object>> machines);
}
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PreDataViewRespDTO.java
@@ -57,6 +57,9 @@
    @Schema(description = "运行下限")
    private BigDecimal limitL;
    @Schema(description = "当前")
    private BigDecimal currValue;
    @Schema(description = "最大值")
    private BigDecimal maxValue;
@@ -110,4 +113,10 @@
    @Schema(description = "预警信息")
    private List<AlarmMessageRespDTO> alarmList;
    @Schema(description = "预警信息")
    private String alarmMessage;
    @Schema(description = "展示线类型")
    private String lineType;
}
iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PredictLastValueReqVO.java
对比新文件
@@ -0,0 +1,18 @@
package com.iailab.module.model.api.mcs.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
/**
 * @author PanZhibao
 * @Description
 * @createTime 2025年01月14日
 */
@Schema(description = "RPC 模型 - 预警和建议 DTO")
@Data
public class PredictLastValueReqVO {
    private List<String[]> itemNos;
}
iailab-module-model/iailab-module-model-biz/db/mysql.sql
@@ -146,7 +146,7 @@
    id          varchar(36) not null,
    outputid    varchar(36),
    predicttime datetime,
    jsonvalue   varchar(6400),
    jsonvalue   text,
    cumulant    varchar(36),
    primary key (id),
    INDEX       idx_outputid (outputid),
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java
@@ -26,6 +26,7 @@
import com.iailab.module.model.mcs.pre.vo.MmPredictAlarmMessageSaveReqVO;
import com.iailab.module.model.mcs.pre.vo.MmPredictItemRespVO;
import com.iailab.module.model.mcs.sche.entity.StScheduleSuggestEntity;
import com.iailab.module.model.mcs.sche.service.StScheduleRecordService;
import com.iailab.module.model.mcs.sche.service.StScheduleSchemeService;
import com.iailab.module.model.mcs.sche.service.StScheduleSuggestService;
import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestSaveReqVO;
@@ -40,6 +41,7 @@
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -93,6 +95,9 @@
    @Autowired
    private StScheduleSchemeService stScheduleSchemeService;
    @Autowired
    private StScheduleRecordService stScheduleRecordService;
    @Autowired
    private ChartParamService chartParamService;
@@ -150,7 +155,13 @@
        }
        Date predictTime = reqVO.getPredictTime();
        if (predictTime == null) {
            MmItemOutputEntity output = mmItemOutputService.getOutPutById(reqVO.getOutIds().get(0));
            MmItemOutputEntity output = null;
            for (String outId : outIds) {
                output = mmItemOutputService.getOutPutById(outId);
                if (output != null) {
                    break;
                }
            }
            ItemVO predictItem = mmPredictItemService.getItemByIdFromCache(output.getItemid());
            if (predictItem.getLastTime() != null) {
                predictTime = predictItem.getLastTime();
@@ -329,10 +340,10 @@
        }
        String timeFormat = StringUtils.isBlank(reqVO.getTimeFormat()) ? DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND : reqVO.getTimeFormat();
        PreLineTypeEnum lineType = chartParams.get(CommonConstant.LINE_TYPE) == null ? PreLineTypeEnum.TN : PreLineTypeEnum.getEumByCode(chartParams.get(CommonConstant.LINE_TYPE));
        BigDecimal rangeH = chartParams.get(CommonConstant.RANGE_H) == null ? BigDecimal.ZERO : new BigDecimal(chartParams.get(CommonConstant.RANGE_H));
        BigDecimal rangeL = chartParams.get(CommonConstant.RANGE_L) == null ? BigDecimal.ZERO : new BigDecimal(chartParams.get(CommonConstant.RANGE_L));
        BigDecimal limitH = chartParams.get(CommonConstant.LIMIT_H) == null ? BigDecimal.ZERO : new BigDecimal(chartParams.get(CommonConstant.LIMIT_H));
        BigDecimal limitL = chartParams.get(CommonConstant.LIMIT_L) == null ? BigDecimal.ZERO : new BigDecimal(chartParams.get(CommonConstant.LIMIT_L));
        BigDecimal rangeH = chartParams.get(CommonConstant.RANGE_H) == null ? null : new BigDecimal(chartParams.get(CommonConstant.RANGE_H));
        BigDecimal rangeL = chartParams.get(CommonConstant.RANGE_L) == null ? null : new BigDecimal(chartParams.get(CommonConstant.RANGE_L));
        BigDecimal limitH = chartParams.get(CommonConstant.LIMIT_H) == null ? null : new BigDecimal(chartParams.get(CommonConstant.LIMIT_H));
        BigDecimal limitL = chartParams.get(CommonConstant.LIMIT_L) == null ? null : new BigDecimal(chartParams.get(CommonConstant.LIMIT_L));
        int lengthLeft = chartParams.get(CommonConstant.LENGTH_LEFT) == null ? predictItem.getPredictLength() : new BigDecimal(chartParams.get(CommonConstant.LENGTH_LEFT)).intValue();
        int lengthRight = chartParams.get(CommonConstant.LENGTH_RIGHT) == null ? predictItem.getPredictLength() : new BigDecimal(chartParams.get(CommonConstant.LENGTH_RIGHT)).intValue();
@@ -358,6 +369,7 @@
            dataView.setRealData(new ArrayList<>());
        }
        dataView.setCurData(mmItemResultJsonService.getData(outPut.getId(), predictTime, timeFormat));
        dataView.setLineType(lineType.getCode());
        switch (lineType) {
            case TN:
                dataView.setPreDataN(mmItemResultService.getData(outPut.getId(), startTime, endTime, timeFormat));
@@ -369,6 +381,10 @@
            default:
                break;
        }
        if (!CollectionUtils.isEmpty(dataView.getRealData())) {
            Object[] rdo = dataView.getRealData().get(dataView.getRealData().size() - 1);
            dataView.setCurrValue(new BigDecimal(rdo[1].toString()));
        }
        if (!CollectionUtils.isEmpty(dataView.getCurData())) {
            List<Double> curList = dataView.getCurData().stream().map(t -> {
@@ -376,12 +392,20 @@
            }).collect(Collectors.toList());
            dataView.setPreMax(new BigDecimal(curList.stream().mapToDouble(Double::doubleValue).max().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
            dataView.setPreMin(new BigDecimal(curList.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP));
            dataView.setPreLast(new BigDecimal(curList.get(curList.size() - 1)));
            dataView.setPreCumulant(new BigDecimal(curList.stream().mapToDouble(Double::doubleValue).sum())
                    .divide(new BigDecimal(HOUR_MINS), 2, BigDecimal.ROUND_HALF_UP));
        }
        String alarmObj = chartParams.get(CommonConstant.ALARM_OBJ);
        if (StringUtils.isNotBlank(alarmObj)) {
            List<AlarmMessageRespDTO> alarmList = ConvertUtils.sourceToTarget(mmPredictAlarmMessageService.getList(alarmObj, predictTime), AlarmMessageRespDTO.class);
            dataView.setAlarmList(alarmList);
            if (CollectionUtils.isEmpty(alarmList)) {
                dataView.setAlarmMessage("暂无预警信息");
            } else {
                dataView.setAlarmMessage(alarmList.get(0).getContent());
            }
        }
        result.setPredictTime(predictTime);
@@ -620,27 +644,146 @@
        return result;
    }
    public Map<String, BigDecimal> getPredictLastValue(PredictLastValueReqVO reqVO) {
        Map<String, BigDecimal> result = new HashMap<>(reqVO.getItemNos().size());
        if (CollectionUtils.isEmpty(reqVO.getItemNos())) {
            return result;
        }
        List<String[]> itemNos = reqVO.getItemNos();
        for (String[] itemNo : itemNos) {
            String key = itemNo[0] + "_" + itemNo[1] + "_" + itemNo[2];
            ItemVO predictItem = mmPredictItemService.getItemByItemNo(itemNo[0]);
            if (predictItem == null || predictItem.getLastTime() == null) {
                result.put(key, BigDecimal.ZERO);
            }
            MmItemOutputEntity outPut = mmItemOutputService.getByItemid(predictItem.getId(), itemNo[1], itemNo[2]);
            Date predictTime = predictItem.getLastTime();
            List<Object[]> curData = mmItemResultJsonService.getData(outPut.getId(), predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
            if(CollectionUtils.isEmpty(curData)) {
                result.put(key, BigDecimal.ZERO);
            } else {
                result.put(key, new BigDecimal(curData.get(curData.size() - 1)[1].toString()));
            }
        }
        return result;
    }
    @Override
    public Map<String,List<Object[]>> getElectricPredictData(String itemCode) {
        ItemVO predictItem = mmPredictItemService.getItemByItemNo(itemCode);
        if (null == predictItem) {
            return new HashMap<>();
        }
        List<Integer> resultIndexs = new ArrayList<>();
        resultIndexs.add(0);
        resultIndexs.add(1);
        resultIndexs.add(2);
        List<MmItemOutputEntity> outPuts = mmItemOutputService.getByItemid(predictItem.getId(),"predictValues",resultIndexs);
        if (CollectionUtils.isEmpty(outPuts)) {
            return new HashMap<>();
        }
        InfluxModelResultByOutPutIdsPOJO pojo = new InfluxModelResultByOutPutIdsPOJO();
        pojo.setOutPutIds(outPuts.stream().map(MmItemOutputEntity::getId).collect(Collectors.toList()));
        pojo.setType(DataTypeEnum.FLOAT.getCode());
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(predictItem.getLastTime());
        calendar.add(Calendar.DAY_OF_YEAR, 7);
        Map<String, List<InfluxModelResultVO>> outPutDatas = influxDBService.queryModelResultsByOutPutIds(pojo, predictItem.getLastTime(), calendar.getTime());
        Map<String,List<Object[]>> result = new HashMap<>(outPuts.size());
        for (MmItemOutputEntity outPut : outPuts) {
            String outPutId = outPut.getId();
            if (outPutDatas.containsKey(outPutId)) {
                List<InfluxModelResultVO> influxModelResultVOS = outPutDatas.get(outPutId);
                result.put(null == outPut.getResultIndex() ? outPut.getResultstr() : outPut.getResultstr()+"_"+outPut.getResultIndex(),influxModelResultVOS.stream().map(e -> {
                    Object[] values = new Object[2];
                    values[0] = DateUtils.format(Date.from(e.getTimestamp()), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
                    values[1] = Double.valueOf(e.getValue().toString());
                    return values;
                }).collect(Collectors.toList()));
            }
        }
        return result;
    }
    @Override
    public String getLastScheduleData(String scheduleCode) {
        if (StringUtils.isBlank(scheduleCode)) {
            return null;
        }
        return stScheduleRecordService.getLastScheduleResult(scheduleCode);
    }
    @Override
    public List<Map<String, Object>> getRealTimeStatus(List<Map<String, Object>> machines) {
        List<String> pointNos = new ArrayList<>(16);
        for (Map<String, Object> machine : machines) {
            List<String> list = (List<String>) machine.get("pointNos");
            pointNos.addAll(list);
        }
        Map<String, Object> pointValues = dataPointApi.queryPointsRealValue(pointNos);
        List<Map<String, Object>> results = new ArrayList<>();
        for (Map<String, Object> machine : machines) {
            List<String> pointNoList = (List<String>) machine.get("pointNos");
            if (!pointValues.containsKey(pointNoList.get(0)) || !pointValues.containsKey(pointNoList.get(1))) {
                machine.put("status",false);
                machine.put("num",0);
                results.add(machine);
                continue;
            }
            Double PValue = Double.valueOf(pointValues.get(pointNoList.get(0)).toString());
            Double QValue = Double.valueOf(pointValues.get(pointNoList.get(1)).toString());
            Double cos = calculateCos(PValue, QValue);
            if (cos.equals(0.0)) {
                machine.put("status",false);
                machine.put("num",0);
            }else {
                machine.put("status",true);
                machine.put("num",cos);
            }
            results.add(machine);
        }
        return results;
    }
    /**
     * 计算功率因数 p²/(根号:p²+Q²)
     **/
    public Double calculateCos(Double PValue,Double QValue) {
        // 绝对值
        PValue = Math.abs(PValue);
        QValue = Math.abs(QValue);
        //PValue [0,0.001] 直接判断为关闭返回0
        if (PValue >= 0 && PValue <= 0.001) {
            return 0.0;
        }else {
            BigDecimal result = new BigDecimal(PValue).divide(BigDecimal.valueOf(Math.sqrt(Math.pow(PValue, 2) + Math.pow(QValue, 2))), 2, BigDecimal.ROUND_HALF_UP);
            return result.doubleValue();
        }
    }
    private Date[] calResultTime(ItemVO predictItem, Date startTimeReq, Date endTimeReq, int lengthLeft, int lengthRight) {
        Date[] result = new Date[3];
        Date predictTime = predictItem.getLastTime();
        Integer granularity = predictItem.getGranularity();
        Date startTime = startTimeReq;
        if (startTime == null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(predictItem.getLastTime());
            calendar.add(Calendar.MINUTE, -1 * lengthLeft);
            calendar.add(Calendar.SECOND, -1 * lengthLeft * granularity);
            startTime = calendar.getTime();
        }
        Date endTime = endTimeReq;
        if (endTime == null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(predictItem.getLastTime());
            calendar.add(Calendar.MINUTE, lengthRight);
            calendar.add(Calendar.SECOND, lengthRight * granularity);
            endTime = calendar.getTime();
        }
        if (endTime.getTime() <= startTime.getTime()) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(startTime);
            calendar.add(Calendar.MINUTE, lengthRight);
            calendar.add(Calendar.SECOND, lengthRight * granularity);
            endTime = calendar.getTime();
        }
        result[0] = predictTime;
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java
@@ -7,6 +7,7 @@
import com.iailab.module.model.api.mcs.dto.*;
import com.iailab.module.model.common.utils.ApiSecurityUtils;
import com.iailab.module.model.common.utils.ExcelUtil;
import com.iailab.module.model.influxdb.vo.InfluxModelResultVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
@@ -17,6 +18,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@@ -170,4 +172,29 @@
        Map<String, Map<String,Double>> map = mcsApi.getPreDoubleData(reqVO);
        return CommonResult.success(map);
    }
    @PostMapping("/predict-data/last-value")
    @Operation(summary = "获取最后预测值")
    public CommonResult<Map<String, BigDecimal>> getPredictLastValue(@RequestBody PredictLastValueReqVO reqVO) {
        Map<String, BigDecimal> data = mcsApi.getPredictLastValue(reqVO);
        return CommonResult.success(data);
    }
    @GetMapping("/predict-data/electric")
    @Operation(summary = "电力功率因数预测结果查询")
    public CommonResult<Map<String,List<Object[]>>> getElectricPredictData(@RequestParam String itemCode) {
        Map<String,List<Object[]>> data = mcsApi.getElectricPredictData(itemCode);
        return CommonResult.success(data);
    }
    @GetMapping("/schedule-data/last")
    @Operation(summary = "调度模型最新结果查询")
    public CommonResult<String> getLastScheduleData(@RequestParam String scheduleCode) {
        return CommonResult.success(mcsApi.getLastScheduleData(scheduleCode));
    }
    @PostMapping("/machineRealTimeStatus")
    @Operation(summary = "发电机组实时状态查询")
    CommonResult<List<Map<String, Object>>> getRealTimeStatus(@RequestBody List<Map<String, Object>> machines) {
        return CommonResult.success(mcsApi.getRealTimeStatus(machines));
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/common/config/InfluxDBInstance.java
@@ -36,7 +36,7 @@
    private Set<String> isExistBucket = new HashSet<>();
    private final static String BUCKET_NAME = "bucket_model_";
    private final static String BUCKET_NAME = "bucket_";
    private Logger logger = LoggerFactory.getLogger(getClass());
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/influxdb/service/InfluxDBService.java
@@ -16,5 +16,6 @@
    void asyncWriteModelResults(List<InfluxModelResultPOJO> pointValues);
    List<InfluxModelResultVO> queryModelResults(InfluxModelResultPOJO pojo, Date startTime, Date endTime);
    Map<String,List<InfluxModelResultVO>> queryModelResultsByOutPutIds(InfluxModelResultByOutPutIdsPOJO pojo, Date startTime, Date endTime);
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemOutputService.java
@@ -23,6 +23,7 @@
    List<MmItemOutputEntity> getByItemid(String itemId);
    MmItemOutputEntity getByItemid(String itemid, String resultstr, String resultIndex);
    List<MmItemOutputEntity> getByItemid(String itemid, String resultstr, List<Integer> resultIndexs);
    void deleteByItemId(String itemId);
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemOutputServiceImpl.java
@@ -84,6 +84,15 @@
    }
    @Override
    public List<MmItemOutputEntity> getByItemid(String itemid, String resultstr, List<Integer> resultIndexs) {
        QueryWrapper<MmItemOutputEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("itemid", itemid)
                .eq("resultstr", resultstr)
                .in(!CollectionUtils.isEmpty(resultIndexs), "result_index", resultIndexs);
        return mmItemOutputDao.selectList(queryWrapper);
    }
    @Override
    public void deleteByItemId(String itemId) {
        QueryWrapper<MmItemOutputEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("itemid", itemId);
@@ -101,7 +110,9 @@
            return outputMap.get(outputid);
        }
        MmItemOutputEntity entity = mmItemOutputDao.selectById(outputid);
        if (entity != null) {
        outputMap.put(outputid, entity);
        return entity;
        }
        return outputMap.get(outputid);
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java
@@ -25,4 +25,6 @@
                .leIfPresent(StScheduleRecordEntity::getScheduleTime, reqVO.getEndTime())
                .orderByDesc(StScheduleRecordEntity::getCreateTime));
    }
    String getLastScheduleResult(String scheduleCode);
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java
@@ -19,4 +19,6 @@
    StScheduleRecordRespVO getInfo(String id);
    void create(ScheduleResultVO resultVO);
    String getLastScheduleResult(String scheduleCode);
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordServiceImpl.java
@@ -61,4 +61,9 @@
        baseDao.insert(entity);
        stScheduleRecordDetailService.create(entity.getId(), resultVO);
    }
    @Override
    public String getLastScheduleResult(String scheduleCode) {
        return baseDao.getLastScheduleResult(scheduleCode);
    }
}
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java
@@ -63,8 +63,15 @@
            case MERGEITEM:
                // 预测值
                oneMin = granularity * 1000L;
                // 设置时间偏移量
                if (granularity >= 24*60*60) {
                    // 如果时间粒度大于等于一天,因为时区问题,特殊处理,否则时间为8:00,而非0:00
                    start = start - ((start+8*60*60*1000) % oneMin);
                    end = end - ((end+8*60*60*1000) % oneMin);
                } else {
                start = start - (start % oneMin);
                end = end - (end % oneMin);
                }
                mins = ((end - start) / oneMin);
                break;
            case DATAPOINT:
@@ -72,8 +79,14 @@
                // 测点值
                oneMin = 1000L * granularity;
                // 设置时间偏移量
                start = start - (start % oneMin) + oneMin;
                end = end - (end % oneMin) + oneMin;
                if (granularity >= 24*60*60) {
                    // 如果时间粒度大于等于一天,因为时区问题,特殊处理,否则时间为8:00,而非0:00
                    start = start - ((start+8*60*60*1000) % oneMin);
                    end = end - ((end+8*60*60*1000) % oneMin);
                } else {
                    start = start - (start % oneMin);
                    end = end - (end % oneMin);
                }
                mins = ((end - start) / oneMin);
                break;
            case IND:
iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDao.xml
对比新文件
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.iailab.module.model.mcs.sche.dao.StScheduleRecordDao">
    <select id="getLastScheduleResult" resultType="java.lang.String">
        SELECT t2.result_data FROM t_st_schedule_scheme t1 LEFT JOIN t_st_schedule_record t2 on t1.id = t2.scheme_id
        WHERE t1.`code` = #{scheduleCode} AND result_code = "100"
        ORDER BY t2.schedule_time desc
        LIMIT 1
    </select>
</mapper>