Browse Source

1、主机详情接口;

dev
mh 4 days ago
parent
commit
1b035ae552
  1. 72
      mh-admin/src/main/java/com/mh/web/controller/device/ChillersParamsController.java
  2. 6
      mh-admin/src/main/resources/application-dev.yml
  3. 4
      mh-admin/src/main/resources/application-prod.yml
  4. 4
      mh-admin/src/main/resources/application-test.yml
  5. 3
      mh-common/src/main/java/com/mh/common/utils/DateUtils.java
  6. 96
      mh-framework/src/main/java/com/mh/framework/dealdata/impl/DataProcessServiceImpl.java
  7. 3
      mh-system/src/main/java/com/mh/system/mapper/device/DataProcessMapper.java
  8. 3
      mh-system/src/main/java/com/mh/system/service/energy/IEnergyService.java
  9. 117
      mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyServiceImpl.java

72
mh-admin/src/main/java/com/mh/web/controller/device/ChillersParamsController.java

@ -0,0 +1,72 @@
package com.mh.web.controller.device;
import com.mh.common.core.controller.BaseController;
import com.mh.common.core.domain.AjaxResult;
import com.mh.common.core.domain.entity.CollectionParamsManage;
import com.mh.common.core.domain.entity.CommunicationParams;
import com.mh.common.core.domain.vo.EnergyConsumptionVO;
import com.mh.common.core.domain.vo.EnergyQueryVO;
import com.mh.common.core.page.TableDataInfo;
import com.mh.common.utils.DateUtils;
import com.mh.system.service.device.ICollectionParamsManageService;
import com.mh.system.service.device.ICommunicationParamsService;
import com.mh.system.service.energy.IEnergyService;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 主机参数以及各个设备折线图数据
* @date 2025-04-29 09:21:17
*/
@RestController
@RequestMapping("/chillers")
public class ChillersParamsController extends BaseController {
private final ICollectionParamsManageService iCollectionParamsManageService;
private final IEnergyService energyService;
public ChillersParamsController(ICollectionParamsManageService iCollectionParamsManageService, IEnergyService energyService) {
this.iCollectionParamsManageService = iCollectionParamsManageService;
this.energyService = energyService;
}
/**
* 获取注解全部参数内容数据
* @param collectionParamsManage
* @return
*/
@GetMapping("/list")
public TableDataInfo list(CollectionParamsManage collectionParamsManage)
{
List<CollectionParamsManage> list = iCollectionParamsManageService.selectCollectionParamsManageList(collectionParamsManage);
// 再根据mtType进行分组
Map<String, List<CollectionParamsManage>> collect = list.stream().collect(Collectors.groupingBy(CollectionParamsManage::getMtType));
// map转list
List<Map<String, Object>> result = collect.entrySet().stream().map(entry -> {
Map<String, Object> map = new HashMap<>();
map.put("mtType", entry.getKey());
map.put("list", entry.getValue());
return map;
}).collect(Collectors.toList());
return getDataTable(result);
}
/**
* 获取折线图数据:冷冻水进出水温度和冷却水进出水温度
* @param vo
* @return
*/
@PostMapping("/lineList")
public AjaxResult lineList(@RequestBody EnergyQueryVO vo) {
return energyService.chillerLine(vo);
}
}

6
mh-admin/src/main/resources/application-dev.yml

@ -1,7 +1,7 @@
# 项目相关配置 # 项目相关配置
mh: mh:
# 名称 # 名称
name: MH name: mz
# 版本 # 版本
version: 1.0.0 version: 1.0.0
# 版权年份 # 版权年份
@ -98,8 +98,8 @@ spring:
# 主库数据源 # 主库数据源
master: master:
#添加allowMultiQueries=true 在批量更新时才不会出错 #添加allowMultiQueries=true 在批量更新时才不会出错
url: jdbc:postgresql://127.0.0.1:5432/eemcs_hw # url: jdbc:postgresql://127.0.0.1:5432/eemcs_hw_dev
# url: jdbc:postgresql://127.0.0.1:5432/eemcs url: jdbc:postgresql://127.0.0.1:5432/eemcs
username: postgres username: postgres
password: mh@803 password: mh@803
# 从库数据源 # 从库数据源

4
mh-admin/src/main/resources/application-prod.yml

@ -98,8 +98,8 @@ spring:
# 主库数据源 # 主库数据源
master: master:
#添加allowMultiQueries=true 在批量更新时才不会出错 #添加allowMultiQueries=true 在批量更新时才不会出错
# url: jdbc:postgresql://127.0.0.1:5505/eemcs_hw url: jdbc:postgresql://127.0.0.1:5505/eemcs_hw
url: jdbc:postgresql://127.0.0.1:5505/eemcs # url: jdbc:postgresql://127.0.0.1:5505/eemcs
username: postgres username: postgres
password: mhtech@803 password: mhtech@803
# 从库数据源 # 从库数据源

4
mh-admin/src/main/resources/application-test.yml

@ -98,9 +98,9 @@ spring:
# 主库数据源 # 主库数据源
master: master:
#添加allowMultiQueries=true 在批量更新时才不会出错 #添加allowMultiQueries=true 在批量更新时才不会出错
url: jdbc:postgresql://127.0.0.1:5432/eemcs url: jdbc:postgresql://106.55.173.225:5505/eemcs_hw
username: postgres username: postgres
password: mh@803 password: mhtech@803
# 从库数据源 # 从库数据源
slave: slave:
# 从数据源开关/默认关闭 # 从数据源开关/默认关闭

3
mh-common/src/main/java/com/mh/common/utils/DateUtils.java

@ -351,6 +351,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
public static String getTimeLen(String timeType) { public static String getTimeLen(String timeType) {
String timeLen = ""; String timeLen = "";
switch (timeType) { switch (timeType) {
case "min":
timeLen = "16";
break;
case "hour": case "hour":
timeLen = "13"; timeLen = "13";
break; break;

96
mh-framework/src/main/java/com/mh/framework/dealdata/impl/DataProcessServiceImpl.java

@ -9,7 +9,6 @@ import com.mh.common.core.redis.RedisCache;
import com.mh.common.model.request.AdvantechDatas; import com.mh.common.model.request.AdvantechDatas;
import com.mh.common.model.request.AdvantechReceiver; import com.mh.common.model.request.AdvantechReceiver;
import com.mh.common.model.request.OneTwoThreeTempData; import com.mh.common.model.request.OneTwoThreeTempData;
import com.mh.common.model.request.Params;
import com.mh.common.utils.DateUtils; import com.mh.common.utils.DateUtils;
import com.mh.common.utils.EnergyThreadPoolService; import com.mh.common.utils.EnergyThreadPoolService;
import com.mh.common.utils.StringUtils; import com.mh.common.utils.StringUtils;
@ -457,22 +456,91 @@ public class DataProcessServiceImpl implements DataProcessService {
@Override @Override
public void insertChillerReport(List<CollectionParamsManage> cacheList) { public void insertChillerReport(List<CollectionParamsManage> cacheList) {
// 根据时间排序 // 先根据表具类型进行分组
cacheList.sort(Comparator.comparing(CollectionParamsManage::getCurTime)); Map<String, List<CollectionParamsManage>> groupMap = cacheList
// 批量插入到chillers_data_min表 .stream()
Calendar calendar = Calendar.getInstance(); .collect(Collectors.groupingBy(CollectionParamsManage::getMtType));
calendar.setTime(new Date()); // 开始进行数据遍历
int year = calendar.get(Calendar.YEAR); for (Map.Entry<String, List<CollectionParamsManage>> entry : groupMap.entrySet()) {
String tableName = "chillers_data_min" + year; String mtType = entry.getKey();
int batchSize = 10; List<CollectionParamsManage> dataList = entry.getValue();
// 分页查询并插入数据 // 再根据mtNum分组
for (int i = 0; i < cacheList.size(); i += batchSize) { Map<String, List<CollectionParamsManage>> groupMap1 = dataList
List<CollectionParamsManage> batchList = cacheList.subList(i, Math.min(i + batchSize, cacheList.size())); .stream()
// 执行插入语句 .collect(Collectors.groupingBy(CollectionParamsManage::getMtNum));
dataProcessMapper.batchInsertChiller(batchList, tableName); // 开始进行数据遍历
for (Map.Entry<String, List<CollectionParamsManage>> entry1 : groupMap1.entrySet()) {
List<CollectionParamsManage> dataList1 = entry1.getValue();
// 进行数据处理入库操作等
try {
List<CollectionParamsManage> dealList = new ArrayList<>();
Map<Date, Optional<CollectionParamsManage>> dateOptionalMap = dealAndInsertChillers(dataList1, mtType);
for (Map.Entry<Date, Optional<CollectionParamsManage>> value : dateOptionalMap.entrySet()) {
boolean present = value.getValue().isPresent();
if (!present) {
continue;
}
dealList.add(value.getValue().get());
}
// 根据时间排序
dealList.sort(Comparator.comparing(CollectionParamsManage::getCurTime));
// 批量插入到chillers_data_min表
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int year = calendar.get(Calendar.YEAR);
String tableName = "chillers_data_min" + year;
for (CollectionParamsManage collectionParamsManage : dealList) {
// 判断是否存在,存在的话就不插入
DeviceReport deviceReport = new DeviceReport();
deviceReport.setDeviceNum(collectionParamsManage.getMtNum());
deviceReport.setCurTime(collectionParamsManage.getCurTime());
if (null == dataProcessMapper.isHaveData(deviceReport, tableName)) {
continue;
}
dataProcessMapper.batchInsertChiller(List.of(collectionParamsManage), tableName);
}
// int batchSize = 10;
// // 分页查询并插入数据
// for (int i = 0; i < cacheList.size(); i += batchSize) {
// List<CollectionParamsManage> batchList = cacheList.subList(i, Math.min(i + batchSize, cacheList.size()));
// // 执行插入语句
// dataProcessMapper.batchInsertChiller(batchList, tableName);
// }
} catch (Exception e) {
log.error("处理主机参数异常:{}", e);
}
}
} }
} }
/**
* 排序
* @param map
* @return
*/
public static Map<Date, Optional<CollectionParamsManage>> sortMapByDate(Map<Date, Optional<CollectionParamsManage>> map) {
return map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue,
LinkedHashMap::new
));
}
private Map<Date, Optional<CollectionParamsManage>> dealAndInsertChillers(List<CollectionParamsManage> dataList, String mtType) {
// 格式化时间点,然后取同样时间点的最大值
Map<Date, Optional<CollectionParamsManage>> collect = dataList.stream()
.peek(val -> val.setCurTime(DateUtils.stringToDate(DateUtils.getTimeMin(val.getCurTime(), 1), "yyyy-MM-dd HH:mm:ss")))
.collect(
Collectors.groupingBy(
CollectionParamsManage::getCurTime,
Collectors.maxBy(Comparator.comparing(CollectionParamsManage::getCurValue)))
);
return sortMapByDate(collect);
}
@Override @Override
public void batchUpdateRunTime(List<Map<String, String>> runTimeList) { public void batchUpdateRunTime(List<Map<String, String>> runTimeList) {

3
mh-system/src/main/java/com/mh/system/mapper/device/DataProcessMapper.java

@ -23,7 +23,7 @@ public interface DataProcessMapper {
* @param tableName * @param tableName
*/ */
@Select("<script>" + @Select("<script>" +
"insert into ${tableName}(device_num, device_code, register_address,register_name, cur_value,cur_time,grade,register_id)" + "insert into ${tableName}(device_num, device_code, register_address,register_name, cur_value, calc_value ,cur_time,grade,register_id)" +
"values " + "values " +
"<foreach collection='batchList' item='item' index='index' separator=','>" + "<foreach collection='batchList' item='item' index='index' separator=','>" +
"(#{item.mtNum}," + "(#{item.mtNum}," +
@ -31,6 +31,7 @@ public interface DataProcessMapper {
"#{item.registerAddr}," + "#{item.registerAddr}," +
"#{item.otherName}," + "#{item.otherName}," +
"cast(#{item.curValue} as numeric(24,2))," + "cast(#{item.curValue} as numeric(24,2))," +
"cast(#{item.curValue} as numeric(24,2))," +
"#{item.curTime}," + "#{item.curTime}," +
"#{item.grade}," + "#{item.grade}," +
"#{item.id})" + "#{item.id})" +

3
mh-system/src/main/java/com/mh/system/service/energy/IEnergyService.java

@ -2,6 +2,7 @@ package com.mh.system.service.energy;
import com.mh.common.core.domain.AjaxResult; import com.mh.common.core.domain.AjaxResult;
import com.mh.common.core.domain.vo.EnergyConsumptionVO; import com.mh.common.core.domain.vo.EnergyConsumptionVO;
import com.mh.common.core.domain.vo.EnergyQueryVO;
/** /**
* @author LJF * @author LJF
@ -23,4 +24,6 @@ public interface IEnergyService {
AjaxResult yoyMom(EnergyConsumptionVO vo); AjaxResult yoyMom(EnergyConsumptionVO vo);
AjaxResult sys(EnergyConsumptionVO vo); AjaxResult sys(EnergyConsumptionVO vo);
AjaxResult chillerLine(EnergyQueryVO vo);
} }

117
mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyServiceImpl.java

@ -1,14 +1,21 @@
package com.mh.system.service.energy.impl; package com.mh.system.service.energy.impl;
import com.alibaba.fastjson2.JSONObject;
import com.mh.common.core.domain.AjaxResult; import com.mh.common.core.domain.AjaxResult;
import com.mh.common.core.domain.ColumnData;
import com.mh.common.core.domain.ColumnFilter;
import com.mh.common.core.domain.dto.EnergyConsumptionDTO; import com.mh.common.core.domain.dto.EnergyConsumptionDTO;
import com.mh.common.core.domain.entity.ConsumptionAnalyze; import com.mh.common.core.domain.entity.ConsumptionAnalyze;
import com.mh.common.core.domain.entity.DeviceTypeEnergy;
import com.mh.common.core.domain.vo.EnergyConsumptionVO; import com.mh.common.core.domain.vo.EnergyConsumptionVO;
import com.mh.common.core.domain.vo.EnergyQueryVO;
import com.mh.common.utils.DateUtils; import com.mh.common.utils.DateUtils;
import com.mh.common.utils.EnergyThreadPoolService; import com.mh.common.utils.EnergyThreadPoolService;
import com.mh.common.utils.StringUtils; import com.mh.common.utils.StringUtils;
import com.mh.common.utils.bean.BeanUtils; import com.mh.common.utils.bean.BeanUtils;
import com.mh.system.mapper.energy.EnergyAnalyzeMapper;
import com.mh.system.mapper.energy.EnergyMapper; import com.mh.system.mapper.energy.EnergyMapper;
import com.mh.system.service.ISysDictDataService;
import com.mh.system.service.energy.IEnergyService; import com.mh.system.service.energy.IEnergyService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -38,6 +45,116 @@ public class EnergyServiceImpl implements IEnergyService {
@Resource @Resource
private EnergyMapper energyMapper; private EnergyMapper energyMapper;
@Resource
private EnergyAnalyzeMapper energyAnalyzeMapper;
@Resource
private ISysDictDataService iSysDictDataService;
private static String[] getArrChillerLine(List<DeviceTypeEnergy> copLineData, String[] lineTimeStrArr) {
String[] lineCopArr = new String[lineTimeStrArr.length];
for (int i = 0; i < lineTimeStrArr.length; i++) {
int j = i;
Optional<DeviceTypeEnergy> first = copLineData.stream().filter(s -> lineTimeStrArr[j].equalsIgnoreCase(s.getTimeStr())).findFirst();
if (first.isPresent()) {
lineCopArr[i] = first.get().getCalcValue();
} else {
lineCopArr[i] = "0.00";
}
}
return lineCopArr;
}
@Override
public AjaxResult chillerLine(EnergyQueryVO vo) {
DateUtils.sysEnergyDateChange(vo);
// 获取参数
List<ColumnFilter> paramsMap = vo.getSearchParams();
if (paramsMap.isEmpty()) {
return AjaxResult.success(new ArrayList<>());
}
List<Object> params = paramsMap.stream().map(ColumnFilter::getValue).collect(Collectors.toList());
AtomicReference<String> lastTableName = new AtomicReference<>("chillers_data_" + vo.getTimeType());
AtomicReference<String> curTableName = new AtomicReference<>("chillers_data_" + vo.getTimeType());
String timeType = vo.getTimeType();
List<DeviceTypeEnergy> deviceTypeEnergyEntities = null;
// 表格数据
if ("month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType)) {
// 单表
deviceTypeEnergyEntities = energyAnalyzeMapper.queryDeviceOneTable(vo.getStartTime(), vo.getEndTime(), lastTableName.get(), curTableName.get(), DateUtils.getTimeLen(vo.getTimeType()), params, vo.getSystemType());
} 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.queryDeviceOneTable(vo.getStartTime(), vo.getEndTime(), lastTableName.get(), curTableName.get(), DateUtils.getTimeLen(vo.getTimeType()), params, vo.getSystemType());
} else {
// 多表
deviceTypeEnergyEntities = energyAnalyzeMapper.queryDeviceManyTable(vo.getStartTime(), vo.getEndTime(), lastTableName.get(), curTableName.get(), DateUtils.getTimeLen(vo.getTimeType()), params, vo.getSystemType());
}
}
if (null == deviceTypeEnergyEntities || deviceTypeEnergyEntities.isEmpty()) {
return AjaxResult.success(new ArrayList<>());
}
// 分组拿出各个设备
Map<String, List<DeviceTypeEnergy>> deviceNumMap = deviceTypeEnergyEntities.stream()
.sorted(Comparator.comparing(DeviceTypeEnergy::getTimeStr))
.collect(Collectors.groupingBy(DeviceTypeEnergy::getDeviceNum));
List<String> title = new ArrayList<>();
List<String> titleStr = new ArrayList<>();
List<String> timeStr = new ArrayList<>();
List<ColumnData> columnData = new ArrayList<>();
// 组装对应需要查询的数据
int i = 0;
for (Map.Entry<String, List<DeviceTypeEnergy>> stringListEntry : deviceNumMap.entrySet()) {
title.add(stringListEntry.getKey());
List<DeviceTypeEnergy> value = stringListEntry.getValue();
ColumnData column = new ColumnData();
column.setName(stringListEntry.getKey());
if (value.size() > 1) {
titleStr.add(value.getFirst().getRemark());
}
for (DeviceTypeEnergy deviceTypeEnergy : value) {
if (i == 0) {
timeStr.add(deviceTypeEnergy.getTimeStr());
} else {
break;
}
}
int pageNum = Integer.parseInt(String.valueOf(vo.getPageNum()));
int pageSize = Integer.parseInt(String.valueOf(vo.getPageSize()));
if (pageNum != 0) {
int startIndex = (pageNum-1)*pageSize;
int endIndex = Math.min(pageNum * pageSize, timeStr.size());
value = value.subList(startIndex, endIndex);
column.setValue(getArrChillerLine(value, timeStr.subList(startIndex, endIndex).toArray(new String[0])));
} else {
column.setValue(getArrChillerLine(value, timeStr.toArray(new String[0])));
}
columnData.add(column);
i++;
}
int pageNum = Integer.parseInt(String.valueOf(vo.getPageNum()));
int pageSize = Integer.parseInt(String.valueOf(vo.getPageSize()));
Map<String, Object> map = new JSONObject();
map.put("title", title);
map.put("titleStr", titleStr);
if (pageNum == 0) {
map.put("timeStr", timeStr);
map.put("dataList", columnData);
} else {
int startIndex = (pageNum-1) * pageSize;
int endIndex = Math.min(pageNum * pageSize, timeStr.size());
if (startIndex > endIndex) {
return AjaxResult.success(new ArrayList<>(map.entrySet()));
}
map.put("timeStr", timeStr.subList(startIndex, endIndex));
map.put("dataList", columnData);
}
return AjaxResult.success(new ArrayList<>(map.entrySet()));
}
@Override @Override
public AjaxResult device(EnergyConsumptionVO vo) { public AjaxResult device(EnergyConsumptionVO vo) {
AtomicReference<String> lastTableName = new AtomicReference<>("data_" + vo.getTimeType()); AtomicReference<String> lastTableName = new AtomicReference<>("data_" + vo.getTimeType());

Loading…
Cancel
Save