Browse Source

1、项目总览:能耗分析、各个系统主要参数

dev
mh 3 months ago
parent
commit
12b078e8e2
  1. 44
      mh-admin/src/main/java/com/mh/web/controller/comprehensive/ProOverviewController.java
  2. 3
      mh-common/src/main/java/com/mh/common/core/domain/dto/OverviewEnergyDTO.java
  3. 67
      mh-common/src/main/java/com/mh/common/core/domain/entity/DataMonth.java
  4. 5
      mh-system/src/main/java/com/mh/system/mapper/SysParamsMapper.java
  5. 20
      mh-system/src/main/java/com/mh/system/mapper/energy/OverviewMapper.java
  6. 1
      mh-system/src/main/java/com/mh/system/service/ISysParamsService.java
  7. 5
      mh-system/src/main/java/com/mh/system/service/impl/SysParamsServiceImpl.java
  8. 3
      mh-system/src/main/java/com/mh/system/service/overview/IProOverviewService.java
  9. 253
      mh-system/src/main/java/com/mh/system/service/overview/impl/ProOverviewServiceImpl.java
  10. 8
      mh-system/src/main/resources/mapper/system/SysParamsMapper.xml

44
mh-admin/src/main/java/com/mh/web/controller/comprehensive/ProOverviewController.java

@ -1,12 +1,18 @@
package com.mh.web.controller.comprehensive;
import com.mh.common.annotation.Log;
import com.mh.common.config.MHConfig;
import com.mh.common.core.controller.BaseController;
import com.mh.common.core.domain.AjaxResult;
import com.mh.common.core.domain.model.LoginUser;
import com.mh.common.core.page.TableDataInfo;
import com.mh.common.enums.BusinessType;
import com.mh.common.utils.file.FileUploadUtils;
import com.mh.common.utils.file.MimeTypeUtils;
import com.mh.system.service.ISysParamsService;
import com.mh.system.service.overview.IProOverviewService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
/**
* @author LJF
@ -37,6 +43,27 @@ public class ProOverviewController extends BaseController {
return getDataTable(sysParamsService.queryList());
}
/**
* 头像上传
*/
@Log(title = "项目图标", businessType = BusinessType.UPDATE)
@PutMapping("/logo")
public AjaxResult avatar(@RequestParam("logo") MultipartFile file, @RequestParam("proId") String proId) throws Exception
{
if (!file.isEmpty())
{
String avatar = FileUploadUtils.upload(MHConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
String username = getUsername();
if (sysParamsService.updateLogo(avatar, proId, username))
{
AjaxResult ajax = AjaxResult.success();
ajax.put("imgUrl", avatar);
return ajax;
}
}
return error("上传图片异常,请联系管理员");
}
/**
* 获取项目概况
* @return
@ -50,9 +77,18 @@ public class ProOverviewController extends BaseController {
* 获取能耗分析查询最近12个月的能耗数据
* @return
*/
@GetMapping("energyAnalysis")
@GetMapping("/energyAnalysis")
public TableDataInfo energyAnalysis() {
return getDataTable(proOverviewService.energyAnalysis());
}
/**
* 各个系统主要的指标参数
* @return
*/
@GetMapping("/mainParams")
public TableDataInfo mainParams() {
return getDataTable(proOverviewService.mainParams());
}
}

3
mh-common/src/main/java/com/mh/common/core/domain/dto/OverviewEnergyDTO.java

@ -17,6 +17,8 @@ public class OverviewEnergyDTO {
private String name;
private String unit;
private String[] data;
private String[] timeStr;
@ -25,6 +27,7 @@ public class OverviewEnergyDTO {
public String toString() {
return new ToStringBuilder(this)
.append("name", name)
.append("unit", unit)
.append("data", data)
.append("timeStr", timeStr)
.toString();

67
mh-common/src/main/java/com/mh/common/core/domain/entity/DataMonth.java

@ -0,0 +1,67 @@
package com.mh.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 月记录表
* @date 2025-03-20 09:44:46
*/
@Setter
@Getter
@TableName("data_month")
public class DataMonth {
private Long id;
private String deviceNum;
private String deviceCode;
private String deviceType;
private BigDecimal lastValue;
private Date lastTime;
private BigDecimal curValue;
private Date curTime;
private BigDecimal usedValue;
private int ratio;
private BigDecimal calcValue;
private int grade;
private String registerAddr;
@Override
public String toString() {
return new ToStringBuilder(this)
.append("id", id)
.append("deviceNum", deviceNum)
.append("deviceCode", deviceCode)
.append("deviceType", deviceType)
.append("lastValue", lastValue)
.append("lastTime", lastTime)
.append("curValue", curValue)
.append("curTime", curTime)
.append("usedValue", usedValue)
.append("ratio", ratio)
.append("calcValue", calcValue)
.append("grade", grade)
.append("registerAddr", registerAddr)
.toString();
}
}

5
mh-system/src/main/java/com/mh/system/mapper/SysParamsMapper.java

@ -1,6 +1,7 @@
package com.mh.system.mapper;
import com.mh.common.core.domain.entity.SysParams;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -14,4 +15,8 @@ import java.util.List;
public interface SysParamsMapper {
List<SysParams> selectSysParamsList();
boolean updateLogo(@Param("logo") String logo,
@Param("proId") String proId,
@Param("userName") String userName);
}

20
mh-system/src/main/java/com/mh/system/mapper/energy/OverviewMapper.java

@ -1,7 +1,9 @@
package com.mh.system.mapper.energy;
import com.mh.common.core.domain.ColumnFilter;
import com.mh.common.core.domain.entity.ChillersEntity;
import com.mh.common.core.domain.entity.CollectionParamsManage;
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;
@ -42,21 +44,29 @@ public interface OverviewMapper {
" ), 'YYYY-MM') AS month " +
") " +
"SELECT " +
" m.month, " +
" COALESCE(SUM(dm.calc_value), 0) AS calc_value_sum " +
" m.month as name, " +
" COALESCE(SUM(dm.calc_value), 0) AS value " +
"FROM months m " +
"LEFT JOIN data_month dm " +
" ON to_char(dm.cur_time, 'YYYY-MM') = m.month " +
" <if test='deviceNums != null and deviceNums.size() > 0'>" +
" AND dm.device_num IN " +
" <foreach collection='deviceNums' item='item' open='(' separator=',' close=')'>" +
" #{item.deviceNum} " +
" #{item.mtNum} " +
" </foreach>" +
" </if>" +
" AND dm.cur_time >= date_trunc('month', CURRENT_DATE) - INTERVAL '11 months' " +
"WHERE m.month <= to_char(CURRENT_DATE, 'YYYY-MM') " +
"WHERE m.month &lt;= to_char(CURRENT_DATE, 'YYYY-MM') " +
"GROUP BY m.month " +
"ORDER BY m.month; " +
"</script>")
List<ChillersEntity> energyAnalysis(@Param("deviceNums") List<CollectionParamsManage> deviceNums);
List<ColumnFilter> energyAnalysis(@Param("deviceNums") List<CollectionParamsManage> deviceNums);
@Select("<script>" +
"select sum(cur_value) from collect_param_manage where id in " +
" <foreach collection='deviceNums' item='item' open='(' separator=',' close=')'>" +
" #{item.id} " +
" </foreach>" +
"</script>")
BigDecimal selectEER(@Param("deviceNums") List<CollectionParamsManage> deviceNums);
}

1
mh-system/src/main/java/com/mh/system/service/ISysParamsService.java

@ -15,4 +15,5 @@ public interface ISysParamsService {
List<SysParams> queryList();
boolean updateLogo(String avatar, String proId, String userName);
}

5
mh-system/src/main/java/com/mh/system/service/impl/SysParamsServiceImpl.java

@ -25,4 +25,9 @@ public class SysParamsServiceImpl implements ISysParamsService {
public List<SysParams> queryList() {
return sysParamsMapper.selectSysParamsList();
}
@Override
public boolean updateLogo(String avatar, String proId, String userName) {
return sysParamsMapper.updateLogo(avatar, proId, userName);
}
}

3
mh-system/src/main/java/com/mh/system/service/overview/IProOverviewService.java

@ -1,5 +1,6 @@
package com.mh.system.service.overview;
import com.mh.common.core.domain.dto.DeviceMonitorDTO;
import com.mh.common.core.domain.dto.OverviewEnergyDTO;
import com.mh.common.core.domain.dto.ProProfileDTO;
@ -17,4 +18,6 @@ public interface IProOverviewService {
List<ProProfileDTO> getProProfile();
List<OverviewEnergyDTO> energyAnalysis();
List<DeviceMonitorDTO> mainParams();
}

253
mh-system/src/main/java/com/mh/system/service/overview/impl/ProOverviewServiceImpl.java

@ -1,11 +1,15 @@
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.DeviceMonitorDTO;
import com.mh.common.core.domain.dto.OverviewEnergyDTO;
import com.mh.common.core.domain.dto.ProProfileDTO;
import com.mh.common.core.domain.entity.ChillersEntity;
import com.mh.common.core.domain.entity.CollectionParamsManage;
import com.mh.common.core.domain.entity.DataMonth;
import com.mh.common.core.domain.entity.SysDictData;
import com.mh.common.utils.DateUtils;
import com.mh.system.mapper.SysDictDataMapper;
import com.mh.system.mapper.device.CollectionParamsManageMapper;
import com.mh.system.mapper.energy.OverviewMapper;
@ -13,8 +17,10 @@ import com.mh.system.service.overview.IProOverviewService;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author LJF
@ -38,10 +44,245 @@ public class ProOverviewServiceImpl implements IProOverviewService {
this.overviewMapper = overviewMapper;
}
@Override
public List<DeviceMonitorDTO> mainParams() {
// 查询系统类型数据
List<SysDictData> sysTypeDataList = sysDictDataMapper.selectDictDataByType("sys_type");
// 遍历系统类型查询对应需要的数据
List<DeviceMonitorDTO> deviceMonitorDTOList = new ArrayList<>();
for (SysDictData sysDictData : sysTypeDataList) {
switch (Integer.parseInt(sysDictData.getDictValue())) {
case 0:
// 查询冷源系统的EER
// 查询实时功率
List<CollectionParamsManage> realEleParams = queryCollectionParams("16", "0", 140);
BigDecimal realEle = null;
if (realEleParams != null && !realEleParams.isEmpty()) {
realEle = realEleParams.stream()
.map(CollectionParamsManage::getCurValue)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
// 查询冷源系统的产冷量
List<CollectionParamsManage> realColdParams = queryCollectionParams("17", "0", 140);
BigDecimal realCold = null;
if (realColdParams != null && !realColdParams.isEmpty()) {
// realColdParams stream流得出cur_value总和
realCold = realColdParams.stream()
.map(CollectionParamsManage::getCurValue)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
// 计算EER
BigDecimal eer = new BigDecimal("0.00");
if (realEle != null && realCold != null) {
if (realCold.compareTo(BigDecimal.ZERO) == 0 || realEle.compareTo(BigDecimal.ZERO) == 0) {
eer = new BigDecimal("0.00");
} else {
eer = realCold.divide(realEle, 2, BigDecimal.ROUND_HALF_UP);
}
}
ColumnFilter eerColumn = new ColumnFilter("eer", eer.toString());
DeviceMonitorDTO deviceMonitorDTO = new DeviceMonitorDTO();
deviceMonitorDTO.setName(sysDictData.getDictLabel());
deviceMonitorDTO.setValues(Stream.of(eerColumn).collect(Collectors.toList()));
deviceMonitorDTOList.add(deviceMonitorDTO);
break;
case 1:
// 热泵生活热水系统
// 查询供回水温度
List<CollectionParamsManage> realInAndOutTempParams = queryCollectionParams("12", "1", 140);
// 查询供水温度的平均值
BigDecimal avgOutTemp = realInAndOutTempParams.stream()
.filter(param -> param != null
&& param.getOtherName() != null
&& param.getOtherName().contains("供水"))
.map(CollectionParamsManage::getCurValue)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(new BigDecimal(realInAndOutTempParams.size()), 2, BigDecimal.ROUND_HALF_UP);
// 查询回水温度的平均值
BigDecimal avgInTemp = realInAndOutTempParams.stream()
.filter(param -> param != null
&& param.getOtherName() != null
&& param.getOtherName().contains("回水"))
.map(CollectionParamsManage::getCurValue)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(new BigDecimal(realInAndOutTempParams.size()), 2, BigDecimal.ROUND_HALF_UP);
ColumnFilter inTempColumn = new ColumnFilter("回水平均温度", avgInTemp.toString());
ColumnFilter outTempColumn = new ColumnFilter("供水平均温度", avgOutTemp.toString());
DeviceMonitorDTO deviceMonitorDTO2 = new DeviceMonitorDTO();
deviceMonitorDTO2.setName(sysDictData.getDictLabel());
deviceMonitorDTO2.setValues(Stream.of(inTempColumn, outTempColumn).collect(Collectors.toList()));
deviceMonitorDTOList.add(deviceMonitorDTO2);
break;
case 2:
// 空调风柜系统
// 查询风柜运行状态
List<CollectionParamsManage> windCabinetRunParams = queryCollectionParams("1", "2", 140);
if (windCabinetRunParams != null && !windCabinetRunParams.isEmpty()) {
// 查询风柜正在运行设备,判断cur_value=1的
long runCount = windCabinetRunParams.stream().filter(param -> param != null
&& param.getCurValue() != null
&& param.getCurValue().compareTo(BigDecimal.ONE) == 0).count();
long stopCount = windCabinetRunParams.size() - runCount;
ColumnFilter runColumn = new ColumnFilter("运行", runCount + "");
ColumnFilter stopColumn = new ColumnFilter("停止", stopCount + "");
DeviceMonitorDTO deviceMonitorDTO3 = new DeviceMonitorDTO();
deviceMonitorDTO3.setName(sysDictData.getDictLabel());
deviceMonitorDTO3.setValues(Stream.of(runColumn, stopColumn).collect(Collectors.toList()));
deviceMonitorDTOList.add(deviceMonitorDTO3);
}
break;
case 3:
// 真空锅炉采暖系统
break;
case 4:
// 室内温度监测系统
List<CollectionParamsManage> tempParams = queryCollectionParams("12", "4", 140);
// stream流判断时间cur_time是否是今天,如果是今天则判断在线,不是则判断离线
if (tempParams != null && !tempParams.isEmpty()) {
long onlineCount = tempParams.stream()
.filter(param -> param != null
&& param.getCurTime() != null
&& DateUtils.dateToString(param.getCurTime(), "yyyy-MM-dd").equals(DateUtils.dateToString(new Date(), "yyyy-MM-dd")))
.count();
long offlineCount = tempParams.size() - onlineCount;
ColumnFilter onlineColumn = new ColumnFilter("在线", onlineCount + "");
ColumnFilter offlineColumn = new ColumnFilter("离线", offlineCount + "");
DeviceMonitorDTO deviceMonitorDTO4 = new DeviceMonitorDTO();
deviceMonitorDTO4.setName(sysDictData.getDictLabel());
deviceMonitorDTO4.setValues(Stream.of(onlineColumn, offlineColumn).collect(Collectors.toList()));
deviceMonitorDTOList.add(deviceMonitorDTO4);
}
break;
case 5:
// 园林照明控制系统
break;
}
}
return deviceMonitorDTOList;
}
@Override
public List<OverviewEnergyDTO> energyAnalysis() {
List<ChillersEntity> dataList = overviewMapper.energyAnalysis(null);
return List.of();
// 查询系统类型数据
List<SysDictData> sysTypeData = sysDictDataMapper.selectDictDataByType("sys_type");
// 定义参数类型
String[] paramTypes = {"16", "17", "18", "19"};
// 初始化结果列表
List<OverviewEnergyDTO> result = new ArrayList<>();
// 使用Map存储不同类型的能源DTO
Map<String, OverviewEnergyDTO> energyMap = new HashMap<>();
energyMap.put("16", new OverviewEnergyDTO());
energyMap.put("17", new OverviewEnergyDTO());
energyMap.put("18", new OverviewEnergyDTO());
energyMap.put("19", new OverviewEnergyDTO());
for (String paramType : paramTypes) {
List<ColumnFilter> dataList = new ArrayList<>();
for (SysDictData sysDictData : sysTypeData) {
String sysType = sysDictData.getDictValue();
// 查询采集参数
List<CollectionParamsManage> collectionParamsManages = queryCollectionParams(paramType, sysType, 40);
// 合并数据
if (collectionParamsManages != null && !collectionParamsManages.isEmpty()) {
List<ColumnFilter> columnFilters = overviewMapper.energyAnalysis(collectionParamsManages);
dataList.addAll(columnFilters);
}
}
// 初始化能源数据
initialEnergyData(dataList, energyMap.get(paramType), getEnergyLabel(paramType), getEnergyUnit(paramType), result);
}
return result.isEmpty() ? List.of() : result;
}
private List<CollectionParamsManage> queryCollectionParams(String paramType, String sysType, int grade) {
QueryWrapper<CollectionParamsManage> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("param_type", paramType)
.eq("system_type", sysType)
.eq("grade", grade);
// 先查询总表
queryWrapper.eq("mt_is_sum", 0);
Long count = collectionParamsManageMapper.selectCount(queryWrapper);
if (count > 0) {
return collectionParamsManageMapper.selectList(queryWrapper);
}
// 查询分表
queryWrapper = new QueryWrapper<>();
queryWrapper.eq("param_type", paramType)
.eq("system_type", sysType)
.eq("grade", grade)
.eq("mt_is_sum", 1);
return collectionParamsManageMapper.selectList(queryWrapper);
}
private String getEnergyLabel(String paramType) {
switch (paramType) {
case "16":
return "总用电量";
case "17":
return "总产冷量";
case "18":
return "总用水量";
case "19":
return "总用气量";
default:
throw new IllegalArgumentException("Invalid param type: " + paramType);
}
}
private String getEnergyUnit(String paramType) {
switch (paramType) {
case "16":
return "kw/h";
case "17":
return "kw";
case "18":
return "t";
case "19":
return "t";
default:
throw new IllegalArgumentException("Invalid param type: " + paramType);
}
}
private static void initialEnergyData(List<ColumnFilter> dataList,
OverviewEnergyDTO ele,
String paramTypeName,
String unitName,
List<OverviewEnergyDTO> result) {
if (!dataList.isEmpty()) {
// 根据时间分组,求和取总和,再根据时间升序排序
// 使用LinkedHashMap保持时间顺序
LinkedHashMap<String, Double> eleMap = dataList.stream()
.sorted(Comparator.comparing(ColumnFilter::getName)) // 按时间字段排序
.collect(Collectors.groupingBy(
ColumnFilter::getName,
LinkedHashMap::new,
Collectors.summingDouble(value ->
new BigDecimal(value.getValue()).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(paramTypeName);
ele.setUnit(unitName);
ele.setTimeStr(timeArray);
ele.setData(valueArray);
result.add(ele);
}
}
@Override
@ -85,6 +326,10 @@ public class ProOverviewServiceImpl implements IProOverviewService {
yearGas);
} else {
// 查询分表综合
queryWrapper = new QueryWrapper<>();
queryWrapper.eq("param_type", paramType);
queryWrapper.eq("system_type", sysType);
queryWrapper.eq("grade", 40);
queryWrapper.eq("mt_is_sum", 1);
// 查询分表总和
getTotalData(paramType, queryWrapper,

8
mh-system/src/main/resources/mapper/system/SysParamsMapper.xml

@ -16,8 +16,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectSysParamsList" parameterType="SysParams" resultMap="SysParamsResult">
select id, pro_name, logo, pro_area, pro_addr, building_area, operate_start_time from sys_params limit 1
</select>
select id, pro_name, logo, pro_area, pro_addr, building_area, operate_start_time from sys_params limit 1
</select>
<update id="updateLogo">
update sys_params set logo=#{logo}, updateBy = #{userName}, updateTime = current_timestamp where id=#{proId}
</update>
</mapper>
Loading…
Cancel
Save