12 changed files with 788 additions and 13 deletions
@ -0,0 +1,32 @@
|
||||
package com.mh.common.core.domain; |
||||
|
||||
/** |
||||
* 分页查询列过滤器 |
||||
* @author Louis |
||||
* @date Aug 19, 2018 |
||||
*/ |
||||
public class ColumnFilter { |
||||
|
||||
/** |
||||
* 过滤列名 |
||||
*/ |
||||
private String name; |
||||
/** |
||||
* 查询的值 |
||||
*/ |
||||
private String value; |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
public void setName(String name) { |
||||
this.name = name; |
||||
} |
||||
public String getValue() { |
||||
return value; |
||||
} |
||||
public void setValue(String value) { |
||||
this.value = value; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,106 @@
|
||||
package com.mh.common.core.domain.entity; |
||||
|
||||
import java.io.Serializable; |
||||
|
||||
/** |
||||
* @author LJF |
||||
* @version 1.0 |
||||
* @project NewZhujiang_Server |
||||
* @description 各个设备类型组装成的DTO |
||||
* @date 2023-12-14 15:12:30 |
||||
*/ |
||||
public class DeviceTypeEnergyEntity implements Serializable { |
||||
|
||||
private static final long serialVersionUID = 10L; |
||||
|
||||
private String calcValue; |
||||
|
||||
private String deviceNum; |
||||
|
||||
private String remark; |
||||
|
||||
private String deviceType; |
||||
|
||||
private String grade; |
||||
|
||||
private String timeStr; |
||||
|
||||
public String getTimeStr() { |
||||
return timeStr; |
||||
} |
||||
|
||||
public void setTimeStr(String timeStr) { |
||||
this.timeStr = timeStr; |
||||
} |
||||
|
||||
public String getGrade() { |
||||
return grade; |
||||
} |
||||
|
||||
public void setGrade(String grade) { |
||||
this.grade = grade; |
||||
} |
||||
|
||||
public String getCalcValue() { |
||||
return calcValue; |
||||
} |
||||
|
||||
public void setCalcValue(String calcValue) { |
||||
this.calcValue = calcValue; |
||||
} |
||||
|
||||
public String getDeviceNum() { |
||||
return deviceNum; |
||||
} |
||||
|
||||
public void setDeviceNum(String deviceNum) { |
||||
this.deviceNum = deviceNum; |
||||
} |
||||
|
||||
public String getRemark() { |
||||
return remark; |
||||
} |
||||
|
||||
public void setRemark(String remark) { |
||||
this.remark = remark; |
||||
} |
||||
|
||||
public String getDeviceType() { |
||||
return deviceType; |
||||
} |
||||
|
||||
public void setDeviceType(String deviceType) { |
||||
this.deviceType = deviceType; |
||||
} |
||||
|
||||
public String getDeviceTypeRange() { |
||||
if (Integer.parseInt(this.grade) < 10) { |
||||
return "冷水机组(kwh)"; |
||||
} else if (Integer.parseInt(this.grade) >= 10 && Integer.parseInt(this.grade) < 20) { |
||||
return "冷冻泵(kwh)"; |
||||
} else if (Integer.parseInt(this.grade) >= 20 && Integer.parseInt(this.grade) < 30) { |
||||
return "冷却泵(kwh)"; |
||||
} else if (Integer.parseInt(this.grade) >= 30 && Integer.parseInt(this.grade) < 40) { |
||||
return "冷却塔(kwh)"; |
||||
} else { |
||||
return "其他"; |
||||
} |
||||
} |
||||
|
||||
public Double getDoubleCalcValue() { |
||||
return Double.parseDouble(this.calcValue); |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return "DeviceTypeEnergyEntity{" + |
||||
"calcValue='" + calcValue + '\'' + |
||||
", deviceNum='" + deviceNum + '\'' + |
||||
", remark='" + remark + '\'' + |
||||
", deviceType='" + deviceType + '\'' + |
||||
", grade='" + grade + '\'' + |
||||
", timeStr='" + timeStr + '\'' + |
||||
'}'; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,92 @@
|
||||
package com.mh.common.core.domain.vo; |
||||
|
||||
import java.io.Serializable; |
||||
|
||||
/** |
||||
* @author LJF |
||||
* @version 1.0 |
||||
* @project NewZhujiang_Server |
||||
* @description 能耗分析接收参数 |
||||
* @date 2023/7/18 15:27:17 |
||||
*/ |
||||
public class EnergyConsumptionVO implements Serializable { |
||||
|
||||
private static final long serialVersionUID = 10L; |
||||
|
||||
/** |
||||
* 查询类型:hour,day,month,year |
||||
*/ |
||||
private String timeType; |
||||
|
||||
/** |
||||
* 开始时间yyyy-MM-dd |
||||
*/ |
||||
private String startTime; |
||||
|
||||
/** |
||||
* 结束时间:yyyy-MM-dd |
||||
*/ |
||||
private String endTime; |
||||
|
||||
/** |
||||
* 设备类型:chiller:主机,chilledWaterPump:冷冻泵,coolingPump:冷却泵,coolingTower:冷却塔 |
||||
*/ |
||||
private String deviceType; |
||||
|
||||
/** |
||||
* 参数类型:cool,electric,cop |
||||
*/ |
||||
private String paramType; |
||||
|
||||
public String getTimeType() { |
||||
return timeType; |
||||
} |
||||
|
||||
public void setTimeType(String timeType) { |
||||
this.timeType = timeType; |
||||
} |
||||
|
||||
public String getStartTime() { |
||||
return startTime; |
||||
} |
||||
|
||||
public void setStartTime(String startTime) { |
||||
this.startTime = startTime; |
||||
} |
||||
|
||||
public String getEndTime() { |
||||
return endTime; |
||||
} |
||||
|
||||
public void setEndTime(String endTime) { |
||||
this.endTime = endTime; |
||||
} |
||||
|
||||
public String getDeviceType() { |
||||
return deviceType; |
||||
} |
||||
|
||||
public void setDeviceType(String deviceType) { |
||||
this.deviceType = deviceType; |
||||
} |
||||
|
||||
public String getParamType() { |
||||
return paramType; |
||||
} |
||||
|
||||
public void setParamType(String paramType) { |
||||
this.paramType = paramType; |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return "EnergyConsumptionVO{" + |
||||
"timeType='" + timeType + '\'' + |
||||
", startTime='" + startTime + '\'' + |
||||
", endTime='" + endTime + '\'' + |
||||
", deviceType='" + deviceType + '\'' + |
||||
", paramType='" + paramType + '\'' + |
||||
'}'; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,94 @@
|
||||
package com.mh.common.core.domain.vo; |
||||
|
||||
import com.mh.common.core.domain.BaseEntity; |
||||
import org.apache.commons.lang3.builder.ToStringBuilder; |
||||
|
||||
import java.io.Serializable; |
||||
|
||||
/** |
||||
* @author LJF |
||||
* @version 1.0 |
||||
* @project NewZhujiang_Server |
||||
* @description 能耗查询公共参数 |
||||
* @date 2023-12-13 16:11:24 |
||||
*/ |
||||
public class EnergyQueryVO extends BaseEntity implements Serializable { |
||||
|
||||
private static final long serialVersionUID = 10L; |
||||
|
||||
/** |
||||
* 查询类型:hour,day,month,year |
||||
*/ |
||||
private String timeType; |
||||
|
||||
/** |
||||
* 开始时间yyyy-MM-dd |
||||
*/ |
||||
private String startTime; |
||||
|
||||
/** |
||||
* 结束时间:yyyy-MM-dd |
||||
*/ |
||||
private String endTime; |
||||
|
||||
/** |
||||
* 设备类型:chiller:主机,chilledWaterPump:冷冻泵,coolingPump:冷却泵,coolingTower:冷却塔 |
||||
*/ |
||||
private String deviceType; |
||||
|
||||
/** |
||||
* 参数类型:cool,electric,cop |
||||
*/ |
||||
private String paramType; |
||||
|
||||
public String getTimeType() { |
||||
return timeType; |
||||
} |
||||
|
||||
public void setTimeType(String timeType) { |
||||
this.timeType = timeType; |
||||
} |
||||
|
||||
public String getStartTime() { |
||||
return startTime; |
||||
} |
||||
|
||||
public void setStartTime(String startTime) { |
||||
this.startTime = startTime; |
||||
} |
||||
|
||||
public String getEndTime() { |
||||
return endTime; |
||||
} |
||||
|
||||
public void setEndTime(String endTime) { |
||||
this.endTime = endTime; |
||||
} |
||||
|
||||
public String getDeviceType() { |
||||
return deviceType; |
||||
} |
||||
|
||||
public void setDeviceType(String deviceType) { |
||||
this.deviceType = deviceType; |
||||
} |
||||
|
||||
public String getParamType() { |
||||
return paramType; |
||||
} |
||||
|
||||
public void setParamType(String paramType) { |
||||
this.paramType = paramType; |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return new ToStringBuilder(this) |
||||
.append("timeType", timeType) |
||||
.append("startTime", startTime) |
||||
.append("endTime", endTime) |
||||
.append("deviceType", deviceType) |
||||
.append("paramType", paramType) |
||||
.toString(); |
||||
} |
||||
} |
@ -0,0 +1,26 @@
|
||||
package com.mh.system.service.energy; |
||||
|
||||
import com.alibaba.fastjson2.JSONObject; |
||||
import com.mh.common.core.domain.AjaxResult; |
||||
import com.mh.common.core.domain.ColumnFilter; |
||||
import com.mh.common.core.domain.vo.EnergyQueryVO; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author LJF |
||||
* @version 1.0 |
||||
* @project NewZhujiang_Server |
||||
* @description 能源分析服务 |
||||
* @date 2023-12-13 15:50:36 |
||||
*/ |
||||
public interface EnergyAnalyzeService { |
||||
|
||||
/** |
||||
* 通过时间查询各个设备类型的用电量 |
||||
* @param vo |
||||
* @return |
||||
*/ |
||||
JSONObject sysAnalyze(EnergyQueryVO vo); |
||||
|
||||
} |
@ -0,0 +1,183 @@
|
||||
package com.mh.system.service.energy.impl; |
||||
|
||||
import com.alibaba.fastjson2.JSONObject; |
||||
import com.mh.common.constant.Constants; |
||||
import com.mh.common.core.domain.ColumnFilter; |
||||
import com.mh.common.core.domain.entity.CollectionParamsManage; |
||||
import com.mh.common.core.domain.entity.DeviceTypeEnergyEntity; |
||||
import com.mh.common.core.domain.vo.EnergyQueryVO; |
||||
import com.mh.common.utils.DateUtils; |
||||
import com.mh.system.mapper.device.CollectionParamsManageMapper; |
||||
import com.mh.system.mapper.energy.EnergyAnalyzeMapper; |
||||
import com.mh.system.service.energy.EnergyAnalyzeService; |
||||
import jakarta.annotation.Resource; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
import java.math.BigDecimal; |
||||
import java.math.RoundingMode; |
||||
import java.util.*; |
||||
import java.util.concurrent.atomic.AtomicReference; |
||||
import java.util.stream.Collectors; |
||||
|
||||
/** |
||||
* @author LJF |
||||
* @version 1.0 |
||||
* @project NewZhujiang_Server |
||||
* @description 能源分析实现类 |
||||
* @date 2023-12-14 11:50:47 |
||||
*/ |
||||
@Service |
||||
public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService { |
||||
|
||||
@Resource |
||||
private EnergyAnalyzeMapper energyAnalyzeMapper; |
||||
|
||||
@Resource |
||||
private CollectionParamsManageMapper collectionParamsManageMapper; |
||||
|
||||
@Override |
||||
public JSONObject sysAnalyze(EnergyQueryVO vo) { |
||||
DateUtils.sysEnergyDateChange(vo); |
||||
// 获取参数
|
||||
AtomicReference<String> lastTableName = new AtomicReference<>("data_" + vo.getTimeType()); |
||||
AtomicReference<String> curTableName = new AtomicReference<>("data_" + vo.getTimeType()); |
||||
String timeType = vo.getTimeType(); |
||||
List<DeviceTypeEnergyEntity> deviceTypeEnergyEntities = null; |
||||
// 表格数据
|
||||
if ("month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType)) { |
||||
// 单表
|
||||
deviceTypeEnergyEntities = energyAnalyzeMapper.queryOneTable(vo.getStartTime(), vo.getEndTime(), lastTableName.get(), curTableName.get(), DateUtils.getTimeLen(vo.getTimeType()), Constants.METER_TYPE); |
||||
} else { |
||||
lastTableName.set(lastTableName + vo.getStartTime().substring(0, 4)); |
||||
curTableName.set(curTableName + vo.getEndTime().substring(0, 4)); |
||||
if (lastTableName.get().equalsIgnoreCase(curTableName.get())) { |
||||
// 单表
|
||||
deviceTypeEnergyEntities = energyAnalyzeMapper.queryOneTable(vo.getStartTime(), vo.getEndTime(), lastTableName.get(), curTableName.get(), DateUtils.getTimeLen(vo.getTimeType()), Constants.METER_TYPE); |
||||
} else { |
||||
// 多表
|
||||
deviceTypeEnergyEntities = energyAnalyzeMapper.queryManyTable(vo.getStartTime(), vo.getEndTime(), lastTableName.get(), curTableName.get(), DateUtils.getTimeLen(vo.getTimeType()), Constants.METER_TYPE); |
||||
} |
||||
} |
||||
if (null == deviceTypeEnergyEntities || deviceTypeEnergyEntities.size() == 0) { |
||||
return new JSONObject(); |
||||
} |
||||
// 开始进行分组
|
||||
// 通过device_manage的grade进行分组,分为四类:0-9:冷水机,10-19:冷冻泵,20-29:冷却泵,30-39:冷却塔
|
||||
HashMap<String, BigDecimal> result = deviceTypeEnergyEntities.stream() |
||||
.collect(Collectors.groupingBy(DeviceTypeEnergyEntity::getDeviceTypeRange)) |
||||
.entrySet().stream().collect(Collectors.toMap( |
||||
Map.Entry<String, List<DeviceTypeEnergyEntity>>::getKey, |
||||
entry -> { |
||||
List<DeviceTypeEnergyEntity> value = entry.getValue(); |
||||
BigDecimal sum = new BigDecimal("0"); |
||||
for (DeviceTypeEnergyEntity deviceTypeEnergyEntity : value) { |
||||
sum = sum.add(new BigDecimal(deviceTypeEnergyEntity.getCalcValue())); |
||||
} |
||||
return sum; |
||||
}, |
||||
BigDecimal::add, |
||||
HashMap::new |
||||
)); |
||||
List<ColumnFilter> results = new ArrayList<>(); |
||||
for (String value : Constants.DEVICE_TYPE) { |
||||
ColumnFilter columnFilter = new ColumnFilter(); |
||||
columnFilter.setName(value); |
||||
if (result.containsKey(value)) { |
||||
columnFilter.setValue(String.valueOf(result.get(value).setScale(2, RoundingMode.HALF_UP))); |
||||
results.add(columnFilter); |
||||
} else { |
||||
columnFilter.setValue("0.00"); |
||||
results.add(columnFilter); |
||||
} |
||||
} |
||||
|
||||
// 查询各个冷水机组的 0-9
|
||||
List<DeviceTypeEnergyEntity> chiller = createDeviceTypeData(deviceTypeEnergyEntities, 10, 0); |
||||
|
||||
// 查询各个冷冻泵的 10-19
|
||||
List<DeviceTypeEnergyEntity> chillerPump = createDeviceTypeData(deviceTypeEnergyEntities, 20, 10); |
||||
|
||||
// 查询各个冷却泵的 20-29
|
||||
List<DeviceTypeEnergyEntity> coolPump = createDeviceTypeData(deviceTypeEnergyEntities, 30, 20); |
||||
|
||||
// 查询各个冷却塔的 30-39
|
||||
List<DeviceTypeEnergyEntity> coolTower = createDeviceTypeData(deviceTypeEnergyEntities, 40, 30); |
||||
|
||||
// 从device_manage查询不是总表的
|
||||
List<CollectionParamsManage> deviceByOther = collectionParamsManageMapper.getDeviceByOther(null); |
||||
|
||||
|
||||
if (deviceByOther != null && deviceByOther.size() > 0) { |
||||
// 通过stream进行分组,然后进行重新赋值,封装新对象,重新返回
|
||||
for (CollectionParamsManage deviceManageEntity : deviceByOther) { |
||||
|
||||
// 重新赋值冷水机
|
||||
reassignData(chiller, deviceManageEntity); |
||||
|
||||
// 重新赋值冷冻泵
|
||||
reassignData(chillerPump, deviceManageEntity); |
||||
|
||||
// 重新赋值冷却泵
|
||||
reassignData(coolPump, deviceManageEntity); |
||||
|
||||
// 重新赋值冷却塔
|
||||
reassignData(coolTower, deviceManageEntity); |
||||
} |
||||
} |
||||
List<ColumnFilter> chillerData = getResultData(chiller); |
||||
|
||||
List<ColumnFilter> chillerPumpData = getResultData(chillerPump); |
||||
|
||||
List<ColumnFilter> coolPumpData = getResultData(coolPump); |
||||
|
||||
List<ColumnFilter> coolTowerData = getResultData(coolTower); |
||||
|
||||
JSONObject resultJson = new JSONObject(); |
||||
resultJson.put("all", results); |
||||
resultJson.put("chiller", chillerData); |
||||
resultJson.put("chillerPump", chillerPumpData); |
||||
resultJson.put("coolPump", coolPumpData); |
||||
resultJson.put("coolTower", coolTowerData); |
||||
|
||||
return resultJson; |
||||
} |
||||
|
||||
private static List<ColumnFilter> getResultData(List<DeviceTypeEnergyEntity> coolTower) { |
||||
return coolTower.stream() |
||||
.sorted(Comparator.comparing(DeviceTypeEnergyEntity::getGrade)) |
||||
.map(val -> { |
||||
ColumnFilter data = new ColumnFilter(); |
||||
data.setName(val.getRemark()); |
||||
BigDecimal calcValue = new BigDecimal(val.getCalcValue()).setScale(2, RoundingMode.HALF_UP); |
||||
data.setValue(String.valueOf(calcValue)); |
||||
return data; |
||||
}).collect(Collectors.toList()); |
||||
} |
||||
|
||||
private static void reassignData(List<DeviceTypeEnergyEntity> chiller, CollectionParamsManage deviceManageEntity) { |
||||
chiller.stream() |
||||
.filter(val -> val.getDeviceNum().equals(deviceManageEntity.getMtNum())) |
||||
.peek(val -> { |
||||
val.setDeviceType(deviceManageEntity.getMtType()); |
||||
val.setRemark(deviceManageEntity.getRemark()); |
||||
val.setGrade(String.valueOf(deviceManageEntity.getGrade())); |
||||
}) |
||||
.sorted(Comparator.comparing(DeviceTypeEnergyEntity::getGrade)) |
||||
.collect(Collectors.toList()); |
||||
} |
||||
|
||||
private static List<DeviceTypeEnergyEntity> createDeviceTypeData(List<DeviceTypeEnergyEntity> deviceTypeEnergyEntities, int x, int x1) { |
||||
return deviceTypeEnergyEntities.stream() |
||||
.filter(val -> Integer.parseInt(val.getGrade()) < x && Integer.parseInt(val.getGrade()) >= x1) |
||||
.collect(Collectors.groupingBy(DeviceTypeEnergyEntity::getDeviceNum, Collectors.summarizingDouble(DeviceTypeEnergyEntity::getDoubleCalcValue))) |
||||
.entrySet().stream() |
||||
.map(entry -> { |
||||
DeviceTypeEnergyEntity deviceTypeEnergyEntity = new DeviceTypeEnergyEntity(); |
||||
deviceTypeEnergyEntity.setCalcValue(String.valueOf(entry.getValue().getSum())); |
||||
deviceTypeEnergyEntity.setDeviceNum(entry.getKey()); |
||||
return deviceTypeEnergyEntity; |
||||
}) |
||||
.collect(Collectors.toList()); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue