diff --git a/mh-admin/src/main/java/com/mh/web/controller/comprehensive/BigScreenController.java b/mh-admin/src/main/java/com/mh/web/controller/comprehensive/BigScreenController.java new file mode 100644 index 0000000..7aea05f --- /dev/null +++ b/mh-admin/src/main/java/com/mh/web/controller/comprehensive/BigScreenController.java @@ -0,0 +1,58 @@ +package com.mh.web.controller.comprehensive; + +import com.mh.common.core.controller.BaseController; +import com.mh.common.core.domain.AjaxResult; +import com.mh.common.core.domain.vo.EnergyConsumptionVO; +import com.mh.common.core.page.TableDataInfo; +import com.mh.common.utils.DateUtils; +import com.mh.system.service.overview.IBigScreenService; +import org.springframework.web.bind.annotation.*; + +/** + * @author LJF + * @version 1.0 + * @project EEMCS + * @description 大屏接口分析记录 + * @date 2025-03-21 11:43:11 + */ +@RestController +@RequestMapping("/bigScreen") +public class BigScreenController extends BaseController { + + private final IBigScreenService bigScreenService; + + public BigScreenController(IBigScreenService bigScreenService) { + this.bigScreenService = bigScreenService; + } + + /** + * 获取能耗总览和基本信息数据内容 + * @return + */ + @PostMapping("/overview") + public TableDataInfo overview(@RequestBody EnergyConsumptionVO vo){ + DateUtils.energyDateChange(vo); + return getDataTable(bigScreenService.overview(vo)); + } + + /** + * 获取子系统能耗 + * @return + */ + @PostMapping("/subSystem") + public TableDataInfo subSystem(@RequestBody EnergyConsumptionVO vo){ + DateUtils.energyDateChange(vo); + return getDataTable(bigScreenService.subSystem(vo)); + } + + /** + * 获取所有系统用电趋势 + * @return + */ + @PostMapping("/systemTrend") + public TableDataInfo systemTrend(@RequestBody EnergyConsumptionVO vo){ + DateUtils.energyDateChange(vo); + return getDataTable(bigScreenService.systemTrend(vo)); + } + +} diff --git a/mh-common/src/main/java/com/mh/common/core/domain/dto/BigScreenOverviewAndBasicDTO.java b/mh-common/src/main/java/com/mh/common/core/domain/dto/BigScreenOverviewAndBasicDTO.java new file mode 100644 index 0000000..6f9c5a3 --- /dev/null +++ b/mh-common/src/main/java/com/mh/common/core/domain/dto/BigScreenOverviewAndBasicDTO.java @@ -0,0 +1,154 @@ +package com.mh.common.core.domain.dto; + +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import java.math.BigDecimal; + +/** + * @author LJF + * @version 1.0 + * @project EEMCS + * @description 能耗总览和基本信息 + * @date 2025-03-21 14:06:49 + */ +@Getter +public class BigScreenOverviewAndBasicDTO { + + /** + * 总用电量 + */ + private BigDecimal totalEle; + + /** + * 总用水量 + */ + private BigDecimal totalWater; + + /** + * 总冷量 + */ + private BigDecimal totalCold; + + /** + * 总气量 + */ + private BigDecimal totalGas; + + /** + * 建筑面积 + */ + private BigDecimal buildingArea; + + /** + * 用电面积单耗 + */ + private BigDecimal eleUnitArea; + + /** + * 用水面积单耗 + */ + private BigDecimal waterUnitArea; + + /** + * 冷量面积单耗 + */ + private BigDecimal coldUnitArea; + + /** + * 气面积单耗 + */ + private BigDecimal gasUnitArea; + + /** + * 用电标准煤 + */ + private BigDecimal eleStandardCoal; + + /** + * 用水标准煤 + */ + private BigDecimal waterStandardCoal; + + /** + * 冷量标准煤 + */ + private BigDecimal coldStandardCoal; + + /** + * 气标准煤 + */ + private BigDecimal gasStandardCoal; + + public void setTotalEle(BigDecimal totalEle) { + this.totalEle = totalEle.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setTotalWater(BigDecimal totalWater) { + this.totalWater = totalWater.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setTotalCold(BigDecimal totalCold) { + this.totalCold = totalCold.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setTotalGas(BigDecimal totalGas) { + this.totalGas = totalGas.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setBuildingArea(BigDecimal buildingArea) { + this.buildingArea = buildingArea.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setEleUnitArea(BigDecimal eleUnitArea) { + this.eleUnitArea = eleUnitArea.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setWaterUnitArea(BigDecimal waterUnitArea) { + this.waterUnitArea = waterUnitArea.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setColdUnitArea(BigDecimal coldUnitArea) { + this.coldUnitArea = coldUnitArea.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setGasUnitArea(BigDecimal gasUnitArea) { + this.gasUnitArea = gasUnitArea.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setEleStandardCoal(BigDecimal eleStandardCoal) { + this.eleStandardCoal = eleStandardCoal.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setWaterStandardCoal(BigDecimal waterStandardCoal) { + this.waterStandardCoal = waterStandardCoal.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setColdStandardCoal(BigDecimal coldStandardCoal) { + this.coldStandardCoal = coldStandardCoal.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + public void setGasStandardCoal(BigDecimal gasStandardCoal) { + this.gasStandardCoal = gasStandardCoal.setScale(2, BigDecimal.ROUND_HALF_UP); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("totalEle", totalEle) + .append("totalWater", totalWater) + .append("totalCold", totalCold) + .append("totalGas", totalGas) + .append("buildingArea", buildingArea) + .append("eleUnitArea", eleUnitArea) + .append("waterUnitArea", waterUnitArea) + .append("coldUnitArea", coldUnitArea) + .append("gasUnitArea", gasUnitArea) + .append("eleStandardCoal", eleStandardCoal) + .append("waterStandardCoal", waterStandardCoal) + .append("coldStandardCoal", coldStandardCoal) + .append("gasStandardCoal", gasStandardCoal) + .toString(); + } +} diff --git a/mh-system/src/main/java/com/mh/system/mapper/energy/BigScreenMapper.java b/mh-system/src/main/java/com/mh/system/mapper/energy/BigScreenMapper.java new file mode 100644 index 0000000..b9df36b --- /dev/null +++ b/mh-system/src/main/java/com/mh/system/mapper/energy/BigScreenMapper.java @@ -0,0 +1,72 @@ +package com.mh.system.mapper.energy; + +import com.mh.common.core.domain.entity.DataMonth; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author LJF + * @version 1.0 + * @project EEMCS + * @description 大屏sql查询 + * @date 2025-03-21 14:46:18 + */ +@Mapper +public interface BigScreenMapper { + + @Select("") + BigDecimal selectOverviewData(@Param("tableName") String tableName, + @Param("paramType") String paramType, + @Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("mtIsSum") int mtIsSum, + @Param("grade") int grade, + @Param("systemType") String systemType); + + @Select("") + List selectDataByRangeTime(@Param("tableName") String tableName, + @Param("paramType") String paramType, + @Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("mtIsSum") int mtIsSum, + @Param("grade") int grade, + @Param("systemType") String systemType); +} diff --git a/mh-system/src/main/java/com/mh/system/mapper/energy/OverviewMapper.java b/mh-system/src/main/java/com/mh/system/mapper/energy/OverviewMapper.java index fb28c37..08981a0 100644 --- a/mh-system/src/main/java/com/mh/system/mapper/energy/OverviewMapper.java +++ b/mh-system/src/main/java/com/mh/system/mapper/energy/OverviewMapper.java @@ -28,7 +28,7 @@ public interface OverviewMapper { " " + " AND device_num IN " + " " + - " #{item.deviceNum} " + + " #{item.mtNum} " + " " + " " + "") diff --git a/mh-system/src/main/java/com/mh/system/service/overview/IBigScreenService.java b/mh-system/src/main/java/com/mh/system/service/overview/IBigScreenService.java new file mode 100644 index 0000000..4d2661f --- /dev/null +++ b/mh-system/src/main/java/com/mh/system/service/overview/IBigScreenService.java @@ -0,0 +1,36 @@ +package com.mh.system.service.overview; + +import com.mh.common.core.domain.vo.EnergyConsumptionVO; + +import java.util.List; + +/** + * @author LJF + * @version 1.0 + * @project EEMCS + * @description 大屏相关服务类 + * @date 2025-03-21 11:46:47 + */ +public interface IBigScreenService { + + /** + * 获取能耗总览数据 + * @param vo + * @return + */ + List overview(EnergyConsumptionVO vo); + + /** + * 获取子系统能耗数据 + * @param vo + * @return + */ + List subSystem(EnergyConsumptionVO vo); + + /** + * 获取系统能耗趋势 + * @param vo + * @return + */ + List systemTrend(EnergyConsumptionVO vo); +} diff --git a/mh-system/src/main/java/com/mh/system/service/overview/impl/BigScreenServiceImpl.java b/mh-system/src/main/java/com/mh/system/service/overview/impl/BigScreenServiceImpl.java new file mode 100644 index 0000000..dcc584d --- /dev/null +++ b/mh-system/src/main/java/com/mh/system/service/overview/impl/BigScreenServiceImpl.java @@ -0,0 +1,232 @@ +package com.mh.system.service.overview.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mh.common.core.domain.ColumnFilter; +import com.mh.common.core.domain.dto.BigScreenOverviewAndBasicDTO; +import com.mh.common.core.domain.dto.OverviewEnergyDTO; +import com.mh.common.core.domain.entity.CollectionParamsManage; +import com.mh.common.core.domain.entity.DataMonth; +import com.mh.common.core.domain.entity.SysParams; +import com.mh.common.core.domain.vo.EnergyConsumptionVO; +import com.mh.common.utils.DateUtils; +import com.mh.system.mapper.SysParamsMapper; +import com.mh.system.mapper.device.CollectionParamsManageMapper; +import com.mh.system.mapper.energy.BigScreenMapper; +import com.mh.system.service.overview.IBigScreenService; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author LJF + * @version 1.0 + * @project EEMCS + * @description 大屏实现类 + * @date 2025-03-21 11:47:12 + */ +@Service +public class BigScreenServiceImpl implements IBigScreenService { + + private final CollectionParamsManageMapper collectionParamsManageMapper; + + private final BigScreenMapper bigScreenMapper; + + private final SysParamsMapper sysParamsMapper; + + public BigScreenServiceImpl(CollectionParamsManageMapper collectionParamsManageMapper, BigScreenMapper bigScreenMapper, SysParamsMapper sysParamsMapper) { + this.collectionParamsManageMapper = collectionParamsManageMapper; + this.bigScreenMapper = bigScreenMapper; + this.sysParamsMapper = sysParamsMapper; + } + + @Override + public List overview(EnergyConsumptionVO vo) { + // 判断时间类型 + String tableName = getTableName(vo); + // 查询总表的数据采集参数 + String[] paramTypes = {"16", "17", "18", "19"}; + BigScreenOverviewAndBasicDTO bigScreenOverviewAndBasicDTO = new BigScreenOverviewAndBasicDTO(); + for (String paramType : paramTypes) { + int mtIsSum = queryCollectionParams(paramType, 40); + BigDecimal useValue = bigScreenMapper.selectOverviewData(tableName, paramType, vo.getStartTime(), vo.getEndTime(), mtIsSum, 40, null); + switch (paramType) { + case "16": + bigScreenOverviewAndBasicDTO.setTotalEle(useValue); + break; + case "17": + bigScreenOverviewAndBasicDTO.setTotalCold(useValue); + break; + case "18": + bigScreenOverviewAndBasicDTO.setTotalWater(useValue); + break; + case "19": + bigScreenOverviewAndBasicDTO.setTotalGas(useValue); + break; + default: + break; + } + } + // 换算标准煤 + // 用电转换,公式:标准煤量(kgce)= 用电量(kWh)×0.1229 + bigScreenOverviewAndBasicDTO.setEleStandardCoal(bigScreenOverviewAndBasicDTO.getTotalEle().multiply(new BigDecimal("0.1229"))); + // 用冷转换,公式:标准煤量(kgce)= 3.6*用冷量(kW)➗29.3076 + bigScreenOverviewAndBasicDTO.setColdStandardCoal(bigScreenOverviewAndBasicDTO.getTotalCold().multiply(new BigDecimal("3.6")).divide(new BigDecimal("29.3076"))); + // 用水转换,公式:标准煤量(kgce)=用水量(吨)×0.0857 + bigScreenOverviewAndBasicDTO.setWaterStandardCoal(bigScreenOverviewAndBasicDTO.getTotalWater().multiply(new BigDecimal("0.0857"))); + // 用气转换,公式:标准煤量(kgce)=用蒸汽量(吨)×0.0948 + bigScreenOverviewAndBasicDTO.setGasStandardCoal(bigScreenOverviewAndBasicDTO.getTotalGas().multiply(new BigDecimal("0.0948"))); + // 获取建筑面积 + List sysParams = sysParamsMapper.selectSysParamsList(); + if (!sysParams.isEmpty()) { + bigScreenOverviewAndBasicDTO.setBuildingArea(new BigDecimal(sysParams.get(0).getBuildingArea())); + // 计算单位面积能耗 + // 用电转换,公式:单位面积能耗(kWh/m2)=用电量(kWh)➗建筑面积(m2) + bigScreenOverviewAndBasicDTO.setEleUnitArea(bigScreenOverviewAndBasicDTO.getTotalEle().divide(bigScreenOverviewAndBasicDTO.getBuildingArea())); + // 用冷转换,公式:单位面积能耗(kWh/m2)=用冷量(kW)➗建筑面积(m2) + bigScreenOverviewAndBasicDTO.setColdUnitArea(bigScreenOverviewAndBasicDTO.getTotalCold().divide(bigScreenOverviewAndBasicDTO.getBuildingArea())); + // 用水转换,公式:单位面积能耗(kWh/m2)=用水量(吨)➗建筑面积(m2) + bigScreenOverviewAndBasicDTO.setWaterUnitArea(bigScreenOverviewAndBasicDTO.getTotalWater().divide(bigScreenOverviewAndBasicDTO.getBuildingArea())); + // 用气转换,公式:单位面积能耗(kWh/m2)=用蒸汽量(吨)➗建筑面积(m2) + bigScreenOverviewAndBasicDTO.setGasUnitArea(bigScreenOverviewAndBasicDTO.getTotalGas().divide(bigScreenOverviewAndBasicDTO.getBuildingArea())); + } + return List.of(bigScreenOverviewAndBasicDTO); + } + + private int queryCollectionParams(String paramType, int grade) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("param_type", paramType) + .eq("grade", grade); + + // 先查询总表 + queryWrapper.eq("mt_is_sum", 0); + Long count = collectionParamsManageMapper.selectCount(queryWrapper); + if (count > 0) { + return 0; + } + + // 查询分表 + return 1; + } + + @Override + public List subSystem(EnergyConsumptionVO vo) { + // 判断时间类型 + String tableName = getTableName(vo); + // 查询总表的数据采集参数 + String[] paramTypes = {"16", "17"}; + if (vo.getSystemType().equals("1")) { + paramTypes = new String[]{"16", "18"}; + } + HashMap mapData = new HashMap<>(); + for (String paramType : paramTypes) { + int mtIsSum = queryCollectionParams(paramType, 40); + BigDecimal useValue = bigScreenMapper.selectOverviewData(tableName, paramType, vo.getStartTime(), vo.getEndTime(), mtIsSum, 40, vo.getSystemType()); + switch (paramType) { + case "16": + mapData.put("totalEle", useValue); + break; + case "17": + mapData.put("totalCold", useValue); + break; + case "18": + mapData.put("totalWater", useValue); + break; + default: + break; + } + } + // 判断冷量为0或者电量为0,直接赋值0.00 + if (vo.getSystemType().equals("0")) { + if (mapData.get("totalCold").compareTo(BigDecimal.ZERO) == 0 || mapData.get("totalEle").compareTo(BigDecimal.ZERO) == 0) { + mapData.put("eer", BigDecimal.ZERO); + } else { + mapData.put("eer", mapData.get("totalCold").divide(mapData.get("totalEle"), 2, BigDecimal.ROUND_HALF_UP)); + } + } else if (vo.getSystemType().equals("1")) { + if (mapData.get("totalWater").compareTo(BigDecimal.ZERO) == 0 || mapData.get("totalEle").compareTo(BigDecimal.ZERO) == 0) { + mapData.put("eer", BigDecimal.ZERO); + } else { + mapData.put("eer", mapData.get("totalEle").divide(mapData.get("totalWater"), 2, BigDecimal.ROUND_HALF_UP)); + } + } + return List.of(mapData); + } + + private static String getTableName(EnergyConsumptionVO vo) { + String tableName = "data_min" + vo.getStartTime().substring(0, 4); + switch (vo.getTimeType()) { + case "year": + tableName = "data_year"; + break; + case "month": + tableName = "data_month"; + break; + case "day": + tableName = "data_min" + vo.getStartTime().substring(0, 4); + break; + default: + break; + } + return tableName; + } + + @Override + public List systemTrend(EnergyConsumptionVO vo) { + String tableName = "data_hour" + vo.getStartTime().substring(0, 4); + String dateFormat = "yyyy-MM-dd HH"; + switch (vo.getTimeType()) { + case "year": + tableName = "data_month"; + dateFormat = "yyyy-MM"; + break; + case "month": + tableName = "data_day"; + dateFormat = "yyyy-MM-dd"; + break; + case "day": + tableName = "data_hour" + vo.getStartTime().substring(0, 4); + break; + default: + break; + } + String paramType = "16"; + int mtIsSum = queryCollectionParams(paramType, 40); + List dataList = bigScreenMapper.selectDataByRangeTime(tableName, paramType, vo.getStartTime(), vo.getEndTime(), mtIsSum, 40, null); + List result = new ArrayList<>(); + OverviewEnergyDTO ele = new OverviewEnergyDTO(); + if (dataList == null || dataList.isEmpty()) { + return List.of(result); + } + // dataList使用stream流根据时间分组排序,dataMonth.calcValue求和,并根据时间升序排序 + String finalDateFormat = dateFormat; + Map> groupedData = dataList.stream() + .collect(Collectors.groupingBy(val -> DateUtils.dateToString(val.getCurTime(), finalDateFormat))); + // 根据时间分组,求和取总和,再根据时间升序排序 + // 使用LinkedHashMap保持时间顺序 + LinkedHashMap eleMap = dataList.stream() + .sorted(Comparator.comparing(val->DateUtils.dateToString(val.getCurTime(), finalDateFormat))) // 按时间字段排序 + .collect(Collectors.groupingBy( + val->DateUtils.dateToString(val.getCurTime(), finalDateFormat), + LinkedHashMap::new, + Collectors.summingDouble(value -> + value.getCalcValue().doubleValue()) + )); + + // 提取时间序列和数值序列 + String[] timeArray = eleMap.keySet().toArray(new String[0]); + String[] valueArray = eleMap.values().stream() + .map(d -> String.format("%.2f", d)) // 保留两位小数 + .toArray(String[]::new); + + // 设置到对象中 + ele.setName("耗电趋势"); + ele.setUnit("kwh"); + ele.setTimeStr(timeArray); + ele.setData(valueArray); + result.add(ele); + return result; + } + +} diff --git a/mh-system/src/main/java/com/mh/system/service/overview/impl/ProOverviewServiceImpl.java b/mh-system/src/main/java/com/mh/system/service/overview/impl/ProOverviewServiceImpl.java index d611c21..34999c2 100644 --- a/mh-system/src/main/java/com/mh/system/service/overview/impl/ProOverviewServiceImpl.java +++ b/mh-system/src/main/java/com/mh/system/service/overview/impl/ProOverviewServiceImpl.java @@ -364,23 +364,23 @@ public class ProOverviewServiceImpl implements IProOverviewService { List collectionParamsManages = collectionParamsManageMapper.selectList(queryWrapper); // 遍历计算得出总用电量 collectionParamsManages.forEach(collectionParamsManage -> { + BigDecimal curValue = collectionParamsManage.getCurValue() == null ? BigDecimal.ZERO : collectionParamsManage.getCurValue(); + BigDecimal mtInitValue = collectionParamsManage.getMtInitValue() == null ? BigDecimal.ZERO : collectionParamsManage.getMtInitValue(); + BigDecimal mtRatio = collectionParamsManage.getMtRatio() == null ? BigDecimal.ZERO : BigDecimal.valueOf(collectionParamsManage.getMtRatio()); + BigDecimal multiply = (curValue.subtract(mtInitValue)).multiply(mtRatio); // TODO switch (Integer.parseInt(paramType)) { case 16: - totalEle.add((collectionParamsManage.getCurValue().subtract(collectionParamsManage.getMtInitValue())) - .multiply(new BigDecimal(collectionParamsManage.getMtRatio()))); + totalEle.add(multiply); break; case 17: - totalCold.add((collectionParamsManage.getCurValue().subtract(collectionParamsManage.getMtInitValue())) - .multiply(new BigDecimal(collectionParamsManage.getMtRatio()))); + totalCold.add(multiply); break; case 18: - totalWater.add((collectionParamsManage.getCurValue().subtract(collectionParamsManage.getMtInitValue())) - .multiply(new BigDecimal(collectionParamsManage.getMtRatio()))); + totalWater.add(multiply); break; case 19: - totalGas.add((collectionParamsManage.getCurValue().subtract(collectionParamsManage.getMtInitValue())) - .multiply(new BigDecimal(collectionParamsManage.getMtRatio()))); + totalGas.add(multiply); break; default: break;