From 8a74e9c0f3f9fbf5709201719431d0a2b7cb8794 Mon Sep 17 00:00:00 2001 From: 潘志宝 <979469083@qq.com> Date: 星期五, 22 十一月 2024 10:06:07 +0800 Subject: [PATCH] 计划数据图表 --- iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PlanDataSingleChartRespVO.java | 41 ++++++++++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MethodSettingService.java | 3 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/CommonConstant.java | 3 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MethodSettingServiceImpl.java | 7 + iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java | 4 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java | 9 ++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java | 116 +++++++++++++++++++++++----- iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PlanDataRecordDTO.java | 21 +++++ iailab-module-model/iailab-module-model-biz/doc/c++代码生成.md | 4 9 files changed, 180 insertions(+), 28 deletions(-) diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java index 53c2cb8..ee39d33 100644 --- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java @@ -40,6 +40,10 @@ @Operation(summary = "预测数据图表") PreDataSingleChartRespVO getPreDataSingleChart(@RequestBody PreDataSingleChartReqVO reqVO); + @PostMapping(PREFIX + "/plan-data/single-chart") + @Operation(summary = "计划数据图表") + PlanDataSingleChartRespVO getPlanDataSingleChart(@RequestBody PreDataSingleChartReqVO reqVO); + @PostMapping(PREFIX + "/alarm-message/create") @Operation(summary = "添加预警信息") Boolean createAlarmMessage(@RequestBody AlarmMessageRespDTO dto); diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PlanDataRecordDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PlanDataRecordDTO.java new file mode 100644 index 0000000..7dbc3cc --- /dev/null +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PlanDataRecordDTO.java @@ -0,0 +1,21 @@ +package com.iailab.module.model.api.mcs.dto; + +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年11月21日 + */ +@Data +@Tag(name = "计划值") +public class PlanDataRecordDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String startTime; + + private String endTime; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PlanDataSingleChartRespVO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PlanDataSingleChartRespVO.java new file mode 100644 index 0000000..e0b8fb5 --- /dev/null +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PlanDataSingleChartRespVO.java @@ -0,0 +1,41 @@ +package com.iailab.module.model.api.mcs.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年11月21日 + */ +@Data +public class PlanDataSingleChartRespVO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "预测时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date predictTime; + + @Schema(description = "开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date startTime; + + @Schema(description = "结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date endTime; + + @Schema(description = "图例") + private List<String> legend; + + @Schema(description = "X轴数据") + private List<String> categories; + + @Schema(description = "计划记录") + private LinkedHashMap<String, List<PlanDataRecordDTO>> record; +} \ No newline at end of file diff --git "a/iailab-module-model/iailab-module-model-biz/doc/c++\344\273\243\347\240\201\347\224\237\346\210\220.md" "b/iailab-module-model/iailab-module-model-biz/doc/c++\344\273\243\347\240\201\347\224\237\346\210\220.md" index 39f2003..8da115c 100644 --- "a/iailab-module-model/iailab-module-model-biz/doc/c++\344\273\243\347\240\201\347\224\237\346\210\220.md" +++ "b/iailab-module-model/iailab-module-model-biz/doc/c++\344\273\243\347\240\201\347\224\237\346\210\220.md" @@ -2,7 +2,9 @@ Windows10 x64 # 安装SmartEnergyStudio -SmartEnergyStudio提供标准的c++环境,python环境(python3.7.5及相关依赖包) +1、SmartEnergyStudio提供标准的c++环境,python环境(python3.7.5及相关依赖包) +2、安装python依赖包 +3、安装license # 安装VS2017专业版 diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java index b358b99..d93a293 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/McsApiImpl.java @@ -1,10 +1,14 @@ package com.iailab.module.model.api; import com.iailab.framework.common.util.date.DateUtils; +import com.iailab.framework.common.util.object.ConvertUtils; +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.ApiPointDTO; import com.iailab.module.data.api.point.dto.ApiPointValueDTO; import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO; +import com.iailab.module.data.common.ApiDataQueryDTO; import com.iailab.module.model.api.mcs.McsApi; import com.iailab.module.model.api.mcs.dto.*; import com.iailab.module.model.common.enums.CommonConstant; @@ -58,6 +62,9 @@ @Autowired private ChartService chartService; + + @Autowired + private PlanItemApi planItemApi; private int HOUR_MINS = 60; @@ -289,28 +296,12 @@ BigDecimal limitL = chartParams.get(CommonConstant.LIMIT_L) == null ? BigDecimal.ZERO : 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(); - result.setPredictTime(predictItem.getLastTime()); - Date predictTime = predictItem.getLastTime(); - Date startTime = reqVO.getStartTime(); - if (startTime == null) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(predictItem.getLastTime()); - calendar.add(Calendar.MINUTE, -1 * lengthLeft); - startTime = calendar.getTime(); - } - Date endTime = reqVO.getEndTime(); - if (endTime == null) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(predictItem.getLastTime()); - calendar.add(Calendar.MINUTE, lengthRight); - endTime = calendar.getTime(); - } - if (endTime.getTime() <= startTime.getTime()) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(startTime); - calendar.add(Calendar.MINUTE, lengthRight); - endTime = calendar.getTime(); - } + + Date[] timeArray = calResultTime(predictItem, reqVO.getStartTime(), reqVO.getEndTime(), lengthLeft, lengthRight); + Date predictTime = timeArray[0]; + Date startTime = timeArray[1]; + Date endTime = timeArray[2]; + List<String> categories = DateUtils.getTimeScale(startTime, endTime, predictItem.getGranularity(), timeFormat); List<String> legend = new ArrayList<>(); MmItemOutputEntity outPut = mmItemOutputService.getByItemid(predictItem.getId(), resultStr); @@ -344,11 +335,62 @@ dataView.setPreMin(new BigDecimal(curList.stream().mapToDouble(Double::doubleValue).min().getAsDouble()).setScale(2, BigDecimal.ROUND_HALF_UP)); } + result.setPredictTime(predictTime); result.setStartTime(startTime); result.setEndTime(endTime); result.setCategories(categories); result.setLegend(legend); result.setDataView(dataView); + return result; + } + + @Override + public PlanDataSingleChartRespVO getPlanDataSingleChart(PreDataSingleChartReqVO reqVO) { + PlanDataSingleChartRespVO result = new PlanDataSingleChartRespVO(); + Map<String, String> chartParams = chartService.getByChartCode(reqVO.getChartCode()); + if (CollectionUtils.isEmpty(chartParams)) { + return result; + } + String itemCode = chartParams.get(CommonConstant.ITEM_CODE); + if (itemCode == null) { + return result; + } + String planItemStr = chartParams.get(CommonConstant.PLAN_ITEM_LIST); + if (planItemStr == null) { + return result; + } + List<String> planItemCodeList = Arrays.asList(planItemStr.split(",")); + + ItemVO predictItem = mmPredictItemService.getItemByItemNo(itemCode); + if (predictItem == null || predictItem.getLastTime() == null) { + return result; + } + String timeFormat = StringUtils.isBlank(reqVO.getTimeFormat()) ? DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND : reqVO.getTimeFormat(); + 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(); + Date[] timeArray = calResultTime(predictItem, reqVO.getStartTime(), reqVO.getEndTime(), lengthLeft, lengthRight); + Date predictTime = timeArray[0]; + Date startTime = timeArray[1]; + Date endTime = timeArray[2]; + List<String> categories = DateUtils.getTimeScale(startTime, endTime, predictItem.getGranularity(), timeFormat); + List<String> legend = new ArrayList<>(); + LinkedHashMap<String, List<PlanDataRecordDTO>> record = new LinkedHashMap<>(); + ApiDataQueryDTO queryDTO = new ApiDataQueryDTO(); + queryDTO.setItemNos(planItemCodeList); + queryDTO.setStart(startTime); + queryDTO.setEnd(endTime); + LinkedHashMap<String, List<ApiPlanDataDTO>> planData = planItemApi.queryPlanItemRecordValue(queryDTO); + if (CollectionUtils.isEmpty(planData)) { + planData.forEach((key, value) -> { + record.put(key, ConvertUtils.sourceToTarget(value, PlanDataRecordDTO.class)); + }); + } + result.setPredictTime(predictTime); + result.setStartTime(startTime); + result.setEndTime(endTime); + result.setCategories(categories); + result.setLegend(legend); + result.setRecord(record); return result; } @@ -438,4 +480,34 @@ public Boolean modifyScheduleModelSetting(List<ScheduleModelSettingReqDTO> dtos) { return true; } + + + private Date[] calResultTime(ItemVO predictItem, Date startTimeReq, Date endTimeReq, int lengthLeft, int lengthRight) { + Date[] result = new Date[3]; + Date predictTime = predictItem.getLastTime(); + Date startTime = startTimeReq; + if (startTime == null) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(predictItem.getLastTime()); + calendar.add(Calendar.MINUTE, -1 * lengthLeft); + startTime = calendar.getTime(); + } + Date endTime = endTimeReq; + if (endTime == null) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(predictItem.getLastTime()); + calendar.add(Calendar.MINUTE, lengthRight); + endTime = calendar.getTime(); + } + if (endTime.getTime() <= startTime.getTime()) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startTime); + calendar.add(Calendar.MINUTE, lengthRight); + endTime = calendar.getTime(); + } + result[0] = predictTime; + result[1] = startTime; + result[2] = endTime; + return result; + } } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java index 79e2d5b..872c83d 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/controller/admin/McsApiController.java @@ -80,6 +80,15 @@ return CommonResult.success(respVO); } + @PostMapping("/plan-data/single-chart") + @Operation(summary = "预测数据图表") + public CommonResult<PlanDataSingleChartRespVO> getPlanDataSingleChart(HttpServletResponse response, HttpServletRequest + request, @RequestBody PreDataSingleChartReqVO reqVO) throws Exception { + apiSecurityUtils.validate(request); + PlanDataSingleChartRespVO respVO = mcsApi.getPlanDataSingleChart(reqVO); + return CommonResult.success(respVO); + } + @GetMapping("/predict-data/exportValue") @Operation(summary = "导出预测数据") @ApiAccessLog(operateType = EXPORT) diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/CommonConstant.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/CommonConstant.java index bcc49e6..92dac3b 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/CommonConstant.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/enums/CommonConstant.java @@ -32,6 +32,9 @@ String LIMIT_L = "LIMIT_L"; String ITEM_CODE = "ITEM_CODE"; + + String PLAN_ITEM_LIST = "PLAN_ITEM_LIST"; + String RESULT_STR = "RESULT_STR"; String LENGTH_LEFT = "LENGTH_LEFT"; diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MethodSettingService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MethodSettingService.java index fc2aff7..01dfe08 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MethodSettingService.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MethodSettingService.java @@ -2,11 +2,9 @@ import com.iailab.framework.common.service.BaseService; import com.iailab.module.model.mpk.dto.MethodSettingDTO; -import com.iailab.module.model.mpk.dto.ModelMethodDTO; import com.iailab.module.model.mpk.entity.MethodSettingEntity; import java.util.List; -import java.util.Map; /** * @description: @@ -14,5 +12,6 @@ * @date: 2024/9/14 15:10 **/ public interface MethodSettingService extends BaseService<MethodSettingEntity> { + void insertList(List<MethodSettingDTO> list, String MethodId); } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MethodSettingServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MethodSettingServiceImpl.java index 3951a35..8867eeb 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MethodSettingServiceImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MethodSettingServiceImpl.java @@ -1,12 +1,10 @@ package com.iailab.module.model.mpk.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.iailab.framework.common.service.impl.BaseServiceImpl; import com.iailab.framework.common.util.object.ConvertUtils; import com.iailab.module.model.mpk.dao.MethodSettingDao; import com.iailab.module.model.mpk.dto.MethodSettingDTO; import com.iailab.module.model.mpk.entity.MethodSettingEntity; -import com.iailab.module.model.mpk.entity.SettingSelectEntity; import com.iailab.module.model.mpk.service.MethodSettingService; import com.iailab.module.model.mpk.service.SettingSelectService; import lombok.extern.slf4j.Slf4j; @@ -16,7 +14,6 @@ import org.springframework.util.CollectionUtils; import java.util.List; -import java.util.Map; import java.util.UUID; /** @@ -35,6 +32,10 @@ List<MethodSettingEntity> entityList = ConvertUtils.sourceToTarget(list, MethodSettingEntity.class); for(int i = 0; i < entityList.size(); i++){ MethodSettingEntity entity = entityList.get(i); + if (StringUtils.isNotBlank(entity.getValue())){ + // 去掉空格 + entity.setValue(entity.getValue().trim().replace("\\s+", "")); + } entity.setId(UUID.randomUUID().toString()); entity.setMethodId(MethodId); entity.setSort(i); -- Gitblit v1.9.3