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>