From e3b86d096f5fef3adb42dec3f9803de9f1840cf1 Mon Sep 17 00:00:00 2001 From: liriming <1343021927@qq.com> Date: 星期四, 27 三月 2025 08:45:32 +0800 Subject: [PATCH] 新增计划修正接口 --- ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/DataController.java | 50 +++++ ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerRunStateDTO.java | 2 ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/DataApi.java | 24 ++ ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanDataChartReqVO.java | 30 +++ ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/package-info.java | 1 ansteel-biz/src/main/java/com/iailab/module/ansteel/common/constant/CommonConstant.java | 2 ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PreDataViewDTO.java | 8 ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/ApiPointValueDTO.java | 2 ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/AlarmMessageRespDTO.java | 2 ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PreDataChartRespVO.java | 2 /dev/null | 42 ---- ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanDataChartRespVO.java | 6 ansteel-biz/src/main/java/com/iailab/module/ansteel/framework/rpc/config/RpcConfiguration.java | 3 ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/impl/DataServiceImpl.java | 289 ++++++++++++++++++++++++++++ ansteel-biz/src/main/resources/application-dev.yaml | 10 ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanChartDTO.java | 69 ++++++ 16 files changed, 479 insertions(+), 63 deletions(-) diff --git a/ansteel-api/src/main/java/com/iailab/module/api/mcs/AnSteelApi.java b/ansteel-api/src/main/java/com/iailab/module/api/mcs/AnSteelApi.java deleted file mode 100644 index 5775b20..0000000 --- a/ansteel-api/src/main/java/com/iailab/module/api/mcs/AnSteelApi.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.iailab.module.api.mcs; - -import com.iailab.module.api.mcs.dto.PowerRunStateDTO; -import com.iailab.module.api.mcs.dto.PreDataChartRespVO; -import com.iailab.module.enums.ApiConstants; -import com.iailab.module.model.api.mcs.dto.PreDataSingleChartReqVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import java.util.List; - -/** - * @author lirm - * @Description - * @createTime 2025年03月17日 - */ -@FeignClient(name = ApiConstants.NAME) -@Tag(name = "RPC 服务 - 信息接口") -public interface AnSteelApi { - - String PREFIX = ApiConstants.PREFIX + "/api/mcs"; - - @GetMapping(PREFIX + "/power-run-state/list") - @Operation(summary = "发电厂机组运行情况") - List<PowerRunStateDTO> getPowerRunState(); - - @PostMapping(PREFIX + "/predict-data/charts") - @Operation(summary = "预测数据图表") - PreDataChartRespVO getPreDataChart(@RequestBody PreDataSingleChartReqVO reqVO); - -} \ No newline at end of file diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/McsServiceImpl.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/McsServiceImpl.java deleted file mode 100644 index 022aa71..0000000 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/McsServiceImpl.java +++ /dev/null @@ -1,191 +0,0 @@ -package com.iailab.module.ansteel.api; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.iailab.framework.common.util.date.DateUtils; -import com.iailab.framework.common.util.object.ConvertUtils; -import com.iailab.module.ansteel.api.dao.PowerRunStateDao; -import com.iailab.module.ansteel.common.constant.CommonConstant; -import com.iailab.module.ansteel.common.enums.PreLineTypeEnum; -import com.iailab.module.api.mcs.AnSteelApi; -import com.iailab.module.api.mcs.dto.ApiPointValueDTO; -import com.iailab.module.api.mcs.dto.PowerRunStateDTO; -import com.iailab.module.api.mcs.dto.PreDataChartRespVO; -import com.iailab.module.api.mcs.dto.PreDataViewDTO; -import com.iailab.module.data.api.point.DataPointApi; -import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO; -import com.iailab.module.model.api.mcs.McsApi; -import com.iailab.module.model.api.mcs.dto.*; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; -import org.springframework.util.ObjectUtils; - -import java.math.BigDecimal; -import java.util.*; -import java.util.stream.Collectors; - -@Slf4j -@Service -public class McsServiceImpl implements AnSteelApi { - - @Autowired - private DataPointApi dataPointApi; - - @Autowired - private McsApi mcsApi; - - @Autowired - private PowerRunStateDao powerRunStateDao; - - @Override - public List<PowerRunStateDTO> getPowerRunState() { - List<PowerRunStateDTO> list = ConvertUtils.sourceToTarget(powerRunStateDao.selectList(new QueryWrapper<>()), PowerRunStateDTO.class); - if (!CollectionUtils.isEmpty(list)) { - list.stream().map(item -> { - StringBuffer sb = new StringBuffer(); - sb.append(item.getQhRate()); - sb.append(","); - sb.append(item.getFhRate()); - sb.append(","); - sb.append(item.getGasTotal()); - sb.append(","); - sb.append(item.getGasCost()); - sb.append(","); - sb.append(item.getGasSurplus()); - sb.append(","); - sb.append(item.getBfg()); - sb.append(","); - sb.append(item.getLdg()); - sb.append(","); - sb.append(item.getCog()); - String[] arr = sb.toString().split(","); - Map<String, Object> adjValue = dataPointApi.queryPointsRealValue(Arrays.asList(arr)); - item.setQhRate(ObjectUtils.isEmpty(adjValue.get(arr[0])) ? "0" : new BigDecimal(adjValue.get(arr[0]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); - item.setFhRate(ObjectUtils.isEmpty(adjValue.get(arr[1])) ? "0" : new BigDecimal(adjValue.get(arr[1]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); - item.setGasTotal(ObjectUtils.isEmpty(adjValue.get(arr[2])) ? "0" : new BigDecimal(adjValue.get(arr[2]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); - item.setGasCost(ObjectUtils.isEmpty(adjValue.get(arr[3])) ? "0" : new BigDecimal(adjValue.get(arr[3]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); - item.setGasSurplus(ObjectUtils.isEmpty(adjValue.get(arr[4])) ? "0" : new BigDecimal(adjValue.get(arr[4]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); - item.setBfg(ObjectUtils.isEmpty(adjValue.get(arr[5])) ? "0" : new BigDecimal(adjValue.get(arr[5]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); - item.setLdg(ObjectUtils.isEmpty(adjValue.get(arr[6])) ? "0" : new BigDecimal(adjValue.get(arr[6]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); - item.setCog(ObjectUtils.isEmpty(adjValue.get(arr[7])) ? "0" : new BigDecimal(adjValue.get(arr[7]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); - - return item; - }).collect(Collectors.toList()); - } - return list; - } - - @Override - public PreDataChartRespVO getPreDataChart(PreDataSingleChartReqVO reqVO) { - Map<String, String> tMap = new HashMap<>(); - List<ChartParamDTO> list = mcsApi.getChartParamList(reqVO.getChartCode()); - if (CollectionUtils.isEmpty(list)) { - return null; - } - list.forEach(item -> { - tMap.put(item.getParamCode(), item.getParamValue()); - }); - String itemCode = tMap.get(CommonConstant.ITEM_CODE); - if (itemCode == null) { - return null; - } - String resultStr = tMap.get(CommonConstant.RESULT_STR); - if (resultStr == null) { - return null; - } - String resultIndex = tMap.get(CommonConstant.RESULT_INDEX); - - PredictItemVO predictItem = mcsApi.getPredictItemByItemNo(itemCode); - if (predictItem == null || predictItem.getLastTime() == null) { - return null; - } - String timeFormat = StringUtils.isBlank(reqVO.getTimeFormat()) ? DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND : reqVO.getTimeFormat(); - PreLineTypeEnum lineType = tMap.get(CommonConstant.LINE_TYPE) == null ? PreLineTypeEnum.TN : PreLineTypeEnum.getEumByCode(tMap.get(CommonConstant.LINE_TYPE)); - int lengthLeft = tMap.get(CommonConstant.LENGTH_LEFT) == null ? predictItem.getPredictLength() : new BigDecimal(tMap.get(CommonConstant.LENGTH_LEFT)).intValue(); - int lengthRight = tMap.get(CommonConstant.LENGTH_RIGHT) == null ? predictItem.getPredictLength() : new BigDecimal(tMap.get(CommonConstant.LENGTH_RIGHT)).intValue(); - String trendsDataH = tMap.get(CommonConstant.TRENDSDATA_H) == null ? null : tMap.get(CommonConstant.TRENDSDATA_H); - String trendsDataL = tMap.get(CommonConstant.TRENDSDATA_L) == null ? null : tMap.get(CommonConstant.TRENDSDATA_L); - - Date[] timeArray = calResultTime(predictItem, reqVO.getStartTime(), reqVO.getEndTime(), lengthLeft, lengthRight); - Date predictTime = timeArray[0]; - Date startTime = timeArray[1]; - Date endTime = timeArray[2]; - - PreDataChartRespVO result = ConvertUtils.sourceToTarget(mcsApi.getPreDataSingleChart(reqVO), PreDataChartRespVO.class); - PreDataViewRespDTO dataView = result.getDataView(); - PreDataViewDTO preDataView = ConvertUtils.sourceToTarget(dataView, PreDataViewDTO.class); - if(trendsDataH != null) { - ApiPointValueQueryDTO pointValueQueryDTO = new ApiPointValueQueryDTO(); - pointValueQueryDTO.setPointNo(trendsDataH); - List<ApiPointValueDTO> trendsDataHList = ConvertUtils.sourceToTarget(dataPointApi.queryPointHistoryValue(pointValueQueryDTO), ApiPointValueDTO.class); - preDataView.setTrendsDataH(trendsDataHList); - } - if(trendsDataL != null) { - ApiPointValueQueryDTO pointValueQueryDTO = new ApiPointValueQueryDTO(); - pointValueQueryDTO.setPointNo(trendsDataL); - List<ApiPointValueDTO> trendsDataLList = ConvertUtils.sourceToTarget(dataPointApi.queryPointHistoryValue(pointValueQueryDTO), ApiPointValueDTO.class); - preDataView.setTrendsDataL(trendsDataLList); - } - MmItemOutputDTO outputDTO = mcsApi.getItemOutputByItemid(predictItem.getId(), resultStr, resultIndex); - - PreItemResultReqVO preItemResultReqVO = new PreItemResultReqVO(); - preItemResultReqVO.setOutputid(outputDTO.getId()); - preItemResultReqVO.setStartTime(startTime); - preItemResultReqVO.setEndTime(endTime); - preItemResultReqVO.setTimeFormat(timeFormat); - switch (lineType) { - case TN: - if(reqVO.getChartCode().equals(CommonConstant.LDG_CHARRCODE)){ - preDataView.setPreData(mcsApi.getItemResult(preItemResultReqVO)); - }else{ - preDataView.setPreData(mcsApi.getItemResult(preItemResultReqVO)); - } - - break; - case TL: - if(reqVO.getChartCode().equals(CommonConstant.LDG_CHARRCODE)){ - preDataView.setPreData(mcsApi.getItemResultLastPoint(preItemResultReqVO)); - }else{ - preDataView.setPreData(mcsApi.getItemResultLastPoint(preItemResultReqVO)); - } - break; - default: - break; - } - result.setPreDataView(preDataView); - return result; - } - - private Date[] calResultTime(PredictItemVO 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.SECOND, -1 * lengthLeft * granularity); - startTime = calendar.getTime(); - } - Date endTime = endTimeReq; - if (endTime == null) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(predictItem.getLastTime()); - calendar.add(Calendar.SECOND, lengthRight * granularity); - endTime = calendar.getTime(); - } - if (endTime.getTime() <= startTime.getTime()) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(startTime); - calendar.add(Calendar.SECOND, lengthRight * granularity); - endTime = calendar.getTime(); - } - result[0] = predictTime; - result[1] = startTime; - result[2] = endTime; - return result; - } - -} \ No newline at end of file diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/DataController.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/DataController.java new file mode 100644 index 0000000..ab1b968 --- /dev/null +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/DataController.java @@ -0,0 +1,50 @@ +package com.iailab.module.ansteel.api.controller.admin; + +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.module.ansteel.api.dto.PlanDataChartReqVO; +import com.iailab.module.ansteel.api.dto.PowerRunStateDTO; +import com.iailab.module.ansteel.api.dto.PreDataChartRespVO; +import com.iailab.module.ansteel.api.service.DataApi; +import com.iailab.module.model.api.mcs.dto.PreDataSingleChartReqVO; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +import static com.iailab.framework.common.pojo.CommonResult.success; + +/** + * @author: lirm + * @date: 2025/03/17 + **/ +@RestController +@RequestMapping("/ansteel/api/mcs") +public class DataController { + + @Autowired + private DataApi dataApi; + + @GetMapping("/power-run-state/list") + @Operation(summary = "发电厂机组运行情况") + public CommonResult<List<PowerRunStateDTO>> getPowerRunState(@RequestParam Map<String, Object> params) { + List<PowerRunStateDTO> list = dataApi.getPowerRunState(); + return success(list); + } + + @PostMapping("/predict-data/charts") + @Operation(summary = "预测数据图表") + public CommonResult<PreDataChartRespVO> getPreDataChart(@RequestBody PreDataSingleChartReqVO reqVO) { + PreDataChartRespVO respVO = dataApi.getPreDataChart(reqVO); + return CommonResult.success(respVO); + } + + @PostMapping("/plan-data/charts") + @Operation(summary = "计划数据图表") + public CommonResult<Map<String, Object>> getPlanDataChart(@RequestBody PlanDataChartReqVO reqVO) { + Map<String, Object> tMap = dataApi.getPlanDataChart(reqVO); + return CommonResult.success(tMap); + } + +} \ No newline at end of file diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/McsController.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/McsController.java deleted file mode 100644 index 0e47f9c..0000000 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/McsController.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.iailab.module.ansteel.api.controller.admin; - -import com.iailab.framework.common.pojo.CommonResult; -import com.iailab.module.api.mcs.AnSteelApi; -import com.iailab.module.api.mcs.dto.PowerRunStateDTO; -import com.iailab.module.api.mcs.dto.PreDataChartRespVO; -import com.iailab.module.model.api.mcs.dto.PreDataSingleChartReqVO; -import io.swagger.v3.oas.annotations.Operation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -import static com.iailab.framework.common.pojo.CommonResult.success; - -/** - * @author: lirm - * @date: 2025/03/17 - **/ -@RestController -@RequestMapping("/ansteel/api/mcs") -public class McsController { - - @Autowired - private AnSteelApi anSteelApi; - - @GetMapping("/power-run-state/list") - @Operation(summary = "发电厂机组运行情况") - public CommonResult<List<PowerRunStateDTO>> getPowerRunState(@RequestParam Map<String, Object> params) { - List<PowerRunStateDTO> list = anSteelApi.getPowerRunState(); - return success(list); - } - - @PostMapping("/predict-data/charts") - @Operation(summary = "预测数据图表") - public CommonResult<PreDataChartRespVO> getPreDataChart(@RequestBody PreDataSingleChartReqVO reqVO) { - PreDataChartRespVO respVO = anSteelApi.getPreDataChart(reqVO); - return CommonResult.success(respVO); - } - -} \ No newline at end of file diff --git a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/AlarmMessageRespDTO.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/AlarmMessageRespDTO.java similarity index 97% rename from ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/AlarmMessageRespDTO.java rename to ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/AlarmMessageRespDTO.java index c5a5fca..695f1f2 100644 --- a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/AlarmMessageRespDTO.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/AlarmMessageRespDTO.java @@ -1,4 +1,4 @@ -package com.iailab.module.api.mcs.dto; +package com.iailab.module.ansteel.api.dto; /** * @author PanZhibao diff --git a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/ApiPointValueDTO.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/ApiPointValueDTO.java similarity index 90% rename from ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/ApiPointValueDTO.java rename to ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/ApiPointValueDTO.java index fdcbe4b..c6b9e0d 100644 --- a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/ApiPointValueDTO.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/ApiPointValueDTO.java @@ -1,4 +1,4 @@ -package com.iailab.module.api.mcs.dto; +package com.iailab.module.ansteel.api.dto; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanChartDTO.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanChartDTO.java new file mode 100644 index 0000000..1065ce7 --- /dev/null +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanChartDTO.java @@ -0,0 +1,69 @@ +package com.iailab.module.ansteel.api.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年11月03日 + */ + +public class PlanChartDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String itemNo; + + private List<String> itemNos; + + private Integer granularity; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date start; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date end; + + public String getItemNo() { + return itemNo; + } + + public void setItemNo(String itemNo) { + this.itemNo = itemNo; + } + + public List<String> getItemNos() { + return itemNos; + } + + public void setItemNos(List<String> itemNos) { + this.itemNos = itemNos; + } + + public Integer getGranularity() { + return granularity; + } + + public void setGranularity(Integer granularity) { + this.granularity = granularity; + } + + public Date getStart() { + return start; + } + + public void setStart(Date start) { + this.start = start; + } + + public Date getEnd() { + return end; + } + + public void setEnd(Date end) { + this.end = end; + } +} \ No newline at end of file diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanDataChartReqVO.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanDataChartReqVO.java new file mode 100644 index 0000000..1e469a0 --- /dev/null +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanDataChartReqVO.java @@ -0,0 +1,30 @@ +package com.iailab.module.ansteel.api.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; + +/** + * @author lirm + * @Description + * @createTime 2025年03月26日 + */ +@Data +public class PlanDataChartReqVO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "图标编码") + private String chartCode; + + @Schema(description = "开始时间") + private String startTime; + + @Schema(description = "结束时间") + private String endTime; + + @Schema(description = "预测时间") + private String predictTime; +} \ No newline at end of file diff --git a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PreDataChartRespVO.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanDataChartRespVO.java similarity index 87% copy from ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PreDataChartRespVO.java copy to ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanDataChartRespVO.java index f71e6f1..f541f01 100644 --- a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PreDataChartRespVO.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PlanDataChartRespVO.java @@ -1,4 +1,4 @@ -package com.iailab.module.api.mcs.dto; +package com.iailab.module.ansteel.api.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.iailab.module.model.api.mcs.dto.PreDataViewRespDTO; @@ -15,7 +15,7 @@ * @createTime 2024年11月18日 */ @Data -public class PreDataChartRespVO implements Serializable { +public class PlanDataChartRespVO implements Serializable { private static final long serialVersionUID = 1L; @Schema(description = "预测时间") @@ -35,8 +35,6 @@ @Schema(description = "X轴数据") private List<String> categories; - - private PreDataViewRespDTO dataView; private PreDataViewDTO preDataView; diff --git a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PowerRunStateDTO.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerRunStateDTO.java similarity index 91% rename from ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PowerRunStateDTO.java rename to ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerRunStateDTO.java index 88c5309..3d22b89 100644 --- a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PowerRunStateDTO.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PowerRunStateDTO.java @@ -1,4 +1,4 @@ -package com.iailab.module.api.mcs.dto; +package com.iailab.module.ansteel.api.dto; import lombok.Data; diff --git a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PreDataChartRespVO.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PreDataChartRespVO.java similarity index 95% rename from ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PreDataChartRespVO.java rename to ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PreDataChartRespVO.java index f71e6f1..75a48ec 100644 --- a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PreDataChartRespVO.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PreDataChartRespVO.java @@ -1,4 +1,4 @@ -package com.iailab.module.api.mcs.dto; +package com.iailab.module.ansteel.api.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.iailab.module.model.api.mcs.dto.PreDataViewRespDTO; diff --git a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PreDataViewDTO.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PreDataViewDTO.java similarity index 88% rename from ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PreDataViewDTO.java rename to ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PreDataViewDTO.java index f439cb5..bb8c4d5 100644 --- a/ansteel-api/src/main/java/com/iailab/module/api/mcs/dto/PreDataViewDTO.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/dto/PreDataViewDTO.java @@ -1,7 +1,6 @@ -package com.iailab.module.api.mcs.dto; +package com.iailab.module.ansteel.api.dto; import com.fasterxml.jackson.annotation.JsonFormat; -import com.iailab.module.model.api.mcs.dto.AlarmMessageRespDTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -81,9 +80,4 @@ @Schema(description = "历史预测值") private List<Object[]> preData; - @Schema(description = "预警信息") - private String alarmMessage; - - @Schema(description = "展示线类型") - private String lineType; } \ No newline at end of file diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/DataApi.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/DataApi.java new file mode 100644 index 0000000..1bc0686 --- /dev/null +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/DataApi.java @@ -0,0 +1,24 @@ +package com.iailab.module.ansteel.api.service; + +import com.iailab.module.ansteel.api.dto.PlanDataChartReqVO; +import com.iailab.module.ansteel.api.dto.PlanDataChartRespVO; +import com.iailab.module.ansteel.api.dto.PowerRunStateDTO; +import com.iailab.module.ansteel.api.dto.PreDataChartRespVO; +import com.iailab.module.model.api.mcs.dto.PreDataSingleChartReqVO; + +import java.util.List; +import java.util.Map; + +/** + * @author lirm + * @Description + * @createTime 2025年03月17日 + */ +public interface DataApi { + + List<PowerRunStateDTO> getPowerRunState(); + + PreDataChartRespVO getPreDataChart(PreDataSingleChartReqVO reqVO); + + Map<String, Object> getPlanDataChart(PlanDataChartReqVO reqVO); +} \ No newline at end of file diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/impl/DataServiceImpl.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/impl/DataServiceImpl.java new file mode 100644 index 0000000..6aaace5 --- /dev/null +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/impl/DataServiceImpl.java @@ -0,0 +1,289 @@ +package com.iailab.module.ansteel.api.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.iailab.framework.common.util.date.DateUtils; +import com.iailab.framework.common.util.object.ConvertUtils; +import com.iailab.module.ansteel.api.dao.PowerRunStateDao; +import com.iailab.module.ansteel.api.dto.*; +import com.iailab.module.ansteel.api.service.DataApi; +import com.iailab.module.ansteel.common.constant.CommonConstant; +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.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 lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class DataServiceImpl implements DataApi { + + @Autowired + private DataPointApi dataPointApi; + + @Autowired + private McsApi mcsApi; + + @Autowired + private PlanItemApi planItemApi; + + @Autowired + private PowerRunStateDao powerRunStateDao; + + @Override + public List<PowerRunStateDTO> getPowerRunState() { + List<PowerRunStateDTO> list = ConvertUtils.sourceToTarget(powerRunStateDao.selectList(new QueryWrapper<>()), PowerRunStateDTO.class); + if (!CollectionUtils.isEmpty(list)) { + list.stream().map(item -> { + StringBuffer sb = new StringBuffer(); + sb.append(item.getQhRate()); + sb.append(","); + sb.append(item.getFhRate()); + sb.append(","); + sb.append(item.getGasTotal()); + sb.append(","); + sb.append(item.getGasCost()); + sb.append(","); + sb.append(item.getGasSurplus()); + sb.append(","); + sb.append(item.getBfg()); + sb.append(","); + sb.append(item.getLdg()); + sb.append(","); + sb.append(item.getCog()); + String[] arr = sb.toString().split(","); + Map<String, Object> adjValue = dataPointApi.queryPointsRealValue(Arrays.asList(arr)); + item.setQhRate(ObjectUtils.isEmpty(adjValue.get(arr[0])) ? "0" : new BigDecimal(adjValue.get(arr[0]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); + item.setFhRate(ObjectUtils.isEmpty(adjValue.get(arr[1])) ? "0" : new BigDecimal(adjValue.get(arr[1]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); + item.setGasTotal(ObjectUtils.isEmpty(adjValue.get(arr[2])) ? "0" : new BigDecimal(adjValue.get(arr[2]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); + item.setGasCost(ObjectUtils.isEmpty(adjValue.get(arr[3])) ? "0" : new BigDecimal(adjValue.get(arr[3]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); + item.setGasSurplus(ObjectUtils.isEmpty(adjValue.get(arr[4])) ? "0" : new BigDecimal(adjValue.get(arr[4]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); + item.setBfg(ObjectUtils.isEmpty(adjValue.get(arr[5])) ? "0" : new BigDecimal(adjValue.get(arr[5]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); + item.setLdg(ObjectUtils.isEmpty(adjValue.get(arr[6])) ? "0" : new BigDecimal(adjValue.get(arr[6]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); + item.setCog(ObjectUtils.isEmpty(adjValue.get(arr[7])) ? "0" : new BigDecimal(adjValue.get(arr[7]).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); + + return item; + }).collect(Collectors.toList()); + } + return list; + } + + @Override + public PreDataChartRespVO getPreDataChart(PreDataSingleChartReqVO reqVO) { + Map<String, String> tMap = new HashMap<>(); + List<ChartParamDTO> list = mcsApi.getChartParamList(reqVO.getChartCode()); + if (CollectionUtils.isEmpty(list)) { + return null; + } + list.forEach(item -> { + tMap.put(item.getParamCode(), item.getParamValue()); + }); + String itemCode = tMap.get(CommonConstant.ITEM_CODE); + if (itemCode == null) { + return null; + } + String resultStr = tMap.get(CommonConstant.RESULT_STR); + if (resultStr == null) { + return null; + } + String resultIndex = tMap.get(CommonConstant.RESULT_INDEX); + + PredictItemVO predictItem = mcsApi.getPredictItemByItemNo(itemCode); + if (predictItem == null || predictItem.getLastTime() == null) { + return null; + } + String timeFormat = StringUtils.isBlank(reqVO.getTimeFormat()) ? DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND : reqVO.getTimeFormat(); + int lengthLeft = tMap.get(CommonConstant.LENGTH_LEFT) == null ? predictItem.getPredictLength() : new BigDecimal(tMap.get(CommonConstant.LENGTH_LEFT)).intValue(); + int lengthRight = tMap.get(CommonConstant.LENGTH_RIGHT) == null ? predictItem.getPredictLength() : new BigDecimal(tMap.get(CommonConstant.LENGTH_RIGHT)).intValue(); + String trendsDataH = tMap.get(CommonConstant.TRENDSDATA_H) == null ? null : tMap.get(CommonConstant.TRENDSDATA_H); + String trendsDataL = tMap.get(CommonConstant.TRENDSDATA_L) == null ? null : tMap.get(CommonConstant.TRENDSDATA_L); + + Date[] timeArray = calResultTime(predictItem, reqVO.getStartTime(), reqVO.getEndTime(), lengthLeft, lengthRight); + Date startTime = timeArray[1]; + Date endTime = timeArray[2]; + + PreDataSingleChartRespVO resultOld = mcsApi.getPreDataSingleChart(reqVO); + PreDataChartRespVO result = ConvertUtils.sourceToTarget(resultOld, PreDataChartRespVO.class); + PreDataViewDTO preDataView = ConvertUtils.sourceToTarget(resultOld.getDataView(), PreDataViewDTO.class); + if(trendsDataH != null) { + ApiPointValueQueryDTO pointValueQueryDTO = new ApiPointValueQueryDTO(); + pointValueQueryDTO.setPointNo(trendsDataH); + List<ApiPointValueDTO> trendsDataHList = ConvertUtils.sourceToTarget(dataPointApi.queryPointHistoryValue(pointValueQueryDTO), ApiPointValueDTO.class); + List<Object[]> newList = new ArrayList<>(); + trendsDataHList.forEach(item -> { + Object[] dataItem = new Object[2]; + dataItem[0] = item.getT(); + dataItem[1] = item.getV(); + newList.add(dataItem); + }); + preDataView.setTrendsDataH(newList); + } + if(trendsDataL != null) { + ApiPointValueQueryDTO pointValueQueryDTO = new ApiPointValueQueryDTO(); + pointValueQueryDTO.setPointNo(trendsDataL); + List<ApiPointValueDTO> trendsDataLList = ConvertUtils.sourceToTarget(dataPointApi.queryPointHistoryValue(pointValueQueryDTO), ApiPointValueDTO.class); + List<Object[]> newList = new ArrayList<>(); + trendsDataLList.forEach(item -> { + Object[] dataItem = new Object[2]; + dataItem[0] = item.getT(); + dataItem[1] = item.getV(); + newList.add(dataItem); + }); + preDataView.setTrendsDataL(newList); + } + MmItemOutputDTO outputDTO = mcsApi.getItemOutputByItemid(predictItem.getId(), resultStr, resultIndex); + + PreItemResultReqVO preItemResultReqVO = new PreItemResultReqVO(); + preItemResultReqVO.setOutputid(outputDTO.getId()); + preItemResultReqVO.setStartTime(startTime); + preItemResultReqVO.setEndTime(endTime); + preItemResultReqVO.setTimeFormat(timeFormat); + + preDataView.setPreData(resultOld.getDataView().getPreDataL()); + + result.setPreDataView(preDataView); + return result; + } + + private Date[] calResultTime(PredictItemVO 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.SECOND, -1 * lengthLeft * granularity); + startTime = calendar.getTime(); + } + Date endTime = endTimeReq; + if (endTime == null) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(predictItem.getLastTime()); + calendar.add(Calendar.SECOND, lengthRight * granularity); + endTime = calendar.getTime(); + } + if (endTime.getTime() <= startTime.getTime()) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startTime); + calendar.add(Calendar.SECOND, lengthRight * granularity); + endTime = calendar.getTime(); + } + result[0] = predictTime; + result[1] = startTime; + result[2] = endTime; + return result; + } + /** + * 查询原始计划、修正计划数据 + */ + @Override + public Map<String, Object> getPlanDataChart(PlanDataChartReqVO reqVO) { + Map<String, Object> result = new HashMap<>(2); + Map<String, String> tMap = new HashMap<>(); + List<ChartParamDTO> list = mcsApi.getChartParamList(reqVO.getChartCode()); + if (CollectionUtils.isEmpty(list)) { + return null; + } + list.forEach(item -> { + tMap.put(item.getParamCode(), item.getParamValue()); + }); + String planCode = tMap.get(CommonConstant.PLAN_CODE); + if (planCode == null) { + return null; + } + + Date startTime = DateUtils.parse(reqVO.getStartTime(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); + Date endTime = DateUtils.parse(reqVO.getEndTime(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); + Date predictTime = DateUtils.parse(reqVO.getPredictTime(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); + // 原始计划数据 + LinkedHashMap<String, List<String[]>> planData = getRealPlanData(planCode, startTime, endTime, predictTime); + + // 修正计划数据 + LinkedHashMap<String, List<String[]>> predData = new LinkedHashMap<>(); + predData.put(reqVO.getChartCode(), getPrePlanData(reqVO.getChartCode(), predictTime, endTime)); + result.put("planData", planData); + result.put("predData", predData); + return result; + } + + //原始计划 + public LinkedHashMap<String, List<String[]>> getRealPlanData(String planCode, Date startTime, Date endTime, Date predictTime) { + LinkedHashMap<String, List<String[]>> result = new LinkedHashMap<>(); + ApiDataQueryDTO apiDataQueryDTO = new ApiDataQueryDTO(); + apiDataQueryDTO.setItemNo(planCode); + apiDataQueryDTO.setStart(startTime); + apiDataQueryDTO.setEnd(endTime); + LinkedHashMap<String, List<ApiPlanDataDTO>> planData = planItemApi.queryPlanItemRecordValue(apiDataQueryDTO); + planData.forEach((key, value) -> { + List<String[]> recods = new ArrayList<>(); + if (!CollectionUtils.isEmpty(value)) { + value.forEach(item -> { + String[] ri = new String[3]; + ri[0] = DateUtils.format(DateUtils.parse(item.getStartTime(), DateUtils.DATE_TIME_PATTERN_STRING), "yyyy-MM-dd HH:mm:00"); + ri[1] = DateUtils.format(DateUtils.parse(item.getEndTime(), DateUtils.DATE_TIME_PATTERN_STRING), "yyyy-MM-dd HH:mm:00"); + ri[2] = "2"; + if (DateUtils.parse(item.getStartTime(), "yyyyMMddHHmmss").getTime() < predictTime.getTime()) { + ri[2] = "1"; + } + recods.add(ri); + }); + } + result.put(key, recods); + }); + return result; + } + + //修正计划 + public List<String[]> getPrePlanData(String charCode, Date startTime, Date endTime) { + List<String[]> result = new ArrayList<>(); + PreDataSingleChartReqVO queryDto = new PreDataSingleChartReqVO(); + queryDto.setChartCode(charCode); + queryDto.setStartTime(startTime); + queryDto.setEndTime(startTime); + PreDataSingleChartRespVO chartData = mcsApi.getPreDataSingleChart(queryDto); + if (CollectionUtils.isEmpty(chartData.getDataView().getPreDataN())) { + return result; + } + + double lastValue = 0; + for (int i = 0; i < chartData.getDataView().getPreDataN().size(); i++) { + Object[] dataItem = chartData.getDataView().getPreDataN().get(i); + double cv = new BigDecimal(dataItem[1].toString()).doubleValue(); + if (cv == 1 && cv != lastValue) { + String[] sa = new String[3]; + sa[0] = (String) dataItem[0]; + sa[1] = getEndTime(chartData.getDataView().getPreDataN(), i); + sa[2] = "2"; + result.add(sa); + } + lastValue = cv; + } + return result; + } + + private String getEndTime(List<Object[]> preDataN, int startIndex) { + String endTime = ""; + double lastValue = 1; + for (int i = startIndex; i < preDataN.size(); i++) { + Object[] dataItem = preDataN.get(i); + double cv = new BigDecimal(dataItem[1].toString()).doubleValue(); + if (cv == 0 && cv != lastValue) { + return (String) dataItem[0]; + } + lastValue = cv; + } + return endTime; + } +} \ No newline at end of file diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/package-info.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/package-info.java new file mode 100644 index 0000000..3763bbd --- /dev/null +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/service/package-info.java @@ -0,0 +1 @@ +package com.iailab.module.ansteel.api.service; \ No newline at end of file diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/common/constant/CommonConstant.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/common/constant/CommonConstant.java index 0f06e14..338ec1f 100644 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/common/constant/CommonConstant.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/common/constant/CommonConstant.java @@ -38,6 +38,8 @@ String ITEM_CODE = "ITEM_CODE"; + String PLAN_CODE = "PLAN_CODE"; + String ALARM_OBJ = "ALARM_OBJ"; String PLAN_ITEM_LIST = "PLAN_ITEM_LIST"; diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/framework/rpc/config/RpcConfiguration.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/framework/rpc/config/RpcConfiguration.java index 2629374..89c7a4b 100644 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/framework/rpc/config/RpcConfiguration.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/framework/rpc/config/RpcConfiguration.java @@ -1,5 +1,6 @@ package com.iailab.module.ansteel.framework.rpc.config; +import com.iailab.module.data.api.plan.PlanItemApi; import com.iailab.module.data.api.point.DataPointApi; import com.iailab.module.infra.api.config.ConfigApi; import com.iailab.module.infra.api.db.DataSourceConfigServiceApi; @@ -12,6 +13,6 @@ import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) -@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, DataSourceConfigServiceApi.class, ConfigApi.class, TenantApi.class, McsApi.class, MdkApi.class, DataPointApi.class}) +@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, DataSourceConfigServiceApi.class, ConfigApi.class, TenantApi.class, McsApi.class, MdkApi.class, DataPointApi.class, PlanItemApi.class}) public class RpcConfiguration { } diff --git a/ansteel-biz/src/main/resources/application-dev.yaml b/ansteel-biz/src/main/resources/application-dev.yaml index ad9a6d7..aa12f9c 100644 --- a/ansteel-biz/src/main/resources/application-dev.yaml +++ b/ansteel-biz/src/main/resources/application-dev.yaml @@ -35,7 +35,7 @@ primary: master datasource: master: - url: jdbc:mysql://172.16.8.100:3306/iailab_fast_tenant_ansteel?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + url: jdbc:mysql://127.0.0.1:3306/iailab_fast_tenant_ansteel?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 username: root password: 123456 slave: # 模拟从库,可根据自己需要修改 @@ -57,10 +57,10 @@ access-log: # 访问日志的配置项 enable: false token: - base-url: http://127.0.0.1:48080/admin-api/system - tenant-id: 176 - client-id: ansteel - client-secret: ansteel111111111111111 + base-url: http://127.0.0.1:48080/admin-api #平台接口url,使用时需修改成真实的ip和端口 + tenant-id: 176 #租户id + client-id: ansteel #租户OAuth2客户端id + client-secret: q3vY7K9PmFjW1xLbN6rTtZz2cV4B5sD0 #租户OAuth2客户端密钥 username: ansteel password: 123456 -- Gitblit v1.9.3