Browse Source

1、温度监测系统历史数据展示接口编写;

dev
mh 3 months ago
parent
commit
ec39fce418
  1. 15
      mh-admin/src/main/java/com/mh/web/controller/monitor/IndoorTempMonitorController.java
  2. 16
      mh-common/src/main/java/com/mh/common/core/domain/dto/DeviceDTO.java
  3. 45
      mh-common/src/main/java/com/mh/common/core/domain/dto/IndoorTempDTO.java
  4. 23
      mh-common/src/main/java/com/mh/common/core/domain/dto/TempHisRequest.java
  5. 217
      mh-common/src/main/java/com/mh/common/core/domain/entity/ChillersEntity.java
  6. 35
      mh-common/src/main/java/com/mh/common/core/domain/vo/IndoorTempVO.java
  7. 42
      mh-system/src/main/java/com/mh/system/mapper/device/CollectionParamsManageMapper.java
  8. 14
      mh-system/src/main/java/com/mh/system/mapper/device/DataProcessMapper.java
  9. 6
      mh-system/src/main/java/com/mh/system/service/device/IIndoorTempMonitorService.java
  10. 138
      mh-system/src/main/java/com/mh/system/service/device/impl/IndoorTempMonitorServiceImpl.java

15
mh-admin/src/main/java/com/mh/web/controller/monitor/IndoorTempMonitorController.java

@ -4,13 +4,13 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.mh.common.core.controller.BaseController;
import com.mh.common.core.domain.AjaxResult;
import com.mh.common.core.domain.dto.HouseGroupDTO;
import com.mh.common.core.domain.dto.IndoorTempDTO;
import com.mh.common.core.domain.dto.TempHisRequest;
import com.mh.common.core.domain.vo.IndoorTempVO;
import com.mh.common.core.page.TableDataInfo;
import com.mh.system.service.device.IIndoorTempMonitorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -42,9 +42,10 @@ public class IndoorTempMonitorController extends BaseController {
return getDataTable(indoorTempByFloor);
}
@GetMapping("/tempHis")
public AjaxResult getIndoorTempHisByHouseId(String houseId) {
return AjaxResult.success(indoorTempMonitorService.getIndoorTempHisByHouseId(houseId));
@PostMapping("/tempHis")
public TableDataInfo getIndoorTempHisByHouseId(@RequestBody TempHisRequest tempHisRequest) {
List<IndoorTempDTO> indoorTempHisByHouseId = indoorTempMonitorService.getIndoorTempHisByHouseId(tempHisRequest.getSystemType(), tempHisRequest.getHouseIds());
return getDataTable(indoorTempHisByHouseId);
}
}

16
mh-common/src/main/java/com/mh/common/core/domain/dto/DeviceDTO.java

@ -27,6 +27,22 @@ class DeviceDTO {
this.status = data.getStatus();
}
public String getCpmId() {
return cpmId;
}
public void setCpmId(String cpmId) {
this.cpmId = cpmId;
}
public int getOrderNum() {
return orderNum;
}
public void setOrderNum(int orderNum) {
this.orderNum = orderNum;
}
public String getOtherName() {
return otherName;
}

45
mh-common/src/main/java/com/mh/common/core/domain/dto/IndoorTempDTO.java

@ -0,0 +1,45 @@
package com.mh.common.core.domain.dto;
import com.mh.common.core.domain.vo.IndoorTempVO;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 响应给前端的室内温湿度监测
* @date 2025-03-16 10:58:39
*/
@Setter
@Getter
public class IndoorTempDTO {
private String houseId;
private String houseName;
private int orderNum;
private List<IndoorTempVO> dataList;
public IndoorTempDTO(int orderNum, String houseId, String houseName, List<IndoorTempVO> collect) {
this.orderNum = orderNum;
this.houseId = houseId;
this.houseName = houseName;
this.dataList = collect;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("orderNum", orderNum)
.append("houseId", houseId)
.append("houseName", houseName)
.append("dataList", dataList)
.toString();
}
}

23
mh-common/src/main/java/com/mh/common/core/domain/dto/TempHisRequest.java

@ -0,0 +1,23 @@
package com.mh.common.core.domain.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description
* @date 2025-03-16 14:06:30
*/
@Setter
@Getter
public class TempHisRequest {
private String systemType;
private List<String> houseIds;
}

217
mh-common/src/main/java/com/mh/common/core/domain/entity/ChillersEntity.java

@ -3,6 +3,9 @@ package com.mh.common.core.domain.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
@ -15,7 +18,6 @@ import java.util.Date;
* @updateTime 2020-05-20
* @throws
*/
@Data
public class ChillersEntity implements Serializable {
static final long serialVersionUID = 42L;
@ -28,7 +30,7 @@ public class ChillersEntity implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
private int register_id;
private int registerId;
private String deviceCode; // 设备代码
private String deviceNum; // 设备码
private String collectionNum; // 冷水机组采集地址
@ -58,5 +60,216 @@ public class ChillersEntity implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date curTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public int getRegisterId() {
return registerId;
}
public void setRegisterId(int registerId) {
this.registerId = registerId;
}
public String getDeviceCode() {
return deviceCode;
}
public void setDeviceCode(String deviceCode) {
this.deviceCode = deviceCode;
}
public String getDeviceNum() {
return deviceNum;
}
public void setDeviceNum(String deviceNum) {
this.deviceNum = deviceNum;
}
public String getCollectionNum() {
return collectionNum;
}
public void setCollectionNum(String collectionNum) {
this.collectionNum = collectionNum;
}
public String getRegisterAddress() {
return registerAddress;
}
public void setRegisterAddress(String registerAddress) {
this.registerAddress = registerAddress;
}
public String getRegisterName() {
return registerName;
}
public void setRegisterName(String registerName) {
this.registerName = registerName;
}
public String getFunCode() {
return funCode;
}
public void setFunCode(String funCode) {
this.funCode = funCode;
}
public int getDigit() {
return digit;
}
public void setDigit(int digit) {
this.digit = digit;
}
public String getOtherName() {
return otherName;
}
public void setOtherName(String otherName) {
this.otherName = otherName;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public String getLastValue() {
return lastValue;
}
public void setLastValue(String lastValue) {
this.lastValue = lastValue;
}
public String getLastTime() {
return lastTime;
}
public void setLastTime(String lastTime) {
this.lastTime = lastTime;
}
public String getDataCom() {
return dataCom;
}
public void setDataCom(String dataCom) {
this.dataCom = dataCom;
}
public String getDdcAddr() {
return ddcAddr;
}
public void setDdcAddr(String ddcAddr) {
this.ddcAddr = ddcAddr;
}
public String getDeviceType() {
return deviceType;
}
public void setDeviceType(String deviceType) {
this.deviceType = deviceType;
}
public String getIP() {
return IP;
}
public void setIP(String IP) {
this.IP = IP;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public Integer getParamType() {
return paramType;
}
public void setParamType(Integer paramType) {
this.paramType = paramType;
}
public String getCurValue() {
return curValue;
}
public void setCurValue(String curValue) {
this.curValue = curValue;
}
public Date getCurTime() {
return curTime;
}
public void setCurTime(Date curTime) {
this.curTime = curTime;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("id", id)
.append("createTime", createTime)
.append("updateTime", updateTime)
.append("registerId", registerId)
.append("deviceCode", deviceCode)
.append("deviceNum", deviceNum)
.append("collectionNum", collectionNum)
.append("registerAddress", registerAddress)
.append("registerName", registerName)
.append("funCode", funCode)
.append("digit", digit)
.append("otherName", otherName)
.append("grade", grade)
.append("lastValue", lastValue)
.append("lastTime", lastTime)
.append("dataCom", dataCom)
.append("ddcAddr", ddcAddr)
.append("deviceType", deviceType)
.append("IP", IP)
.append("port", port)
.append("paramType", paramType)
.append("curValue", curValue)
.append("curTime", curTime)
.toString();
}
}

35
mh-common/src/main/java/com/mh/common/core/domain/vo/IndoorTempVO.java

@ -0,0 +1,35 @@
package com.mh.common.core.domain.vo;
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-16 10:23:00
*/
@Setter
@Getter
public class IndoorTempVO {
private String curTime;
private BigDecimal indoorTemp;
private BigDecimal indoorHumidity;
@Override
public String toString() {
return new ToStringBuilder(this)
.append("curTime", curTime)
.append("indoorTemp", indoorTemp)
.append("indoorHumidity", indoorHumidity)
.toString();
}
}

42
mh-system/src/main/java/com/mh/system/mapper/device/CollectionParamsManageMapper.java

@ -99,6 +99,32 @@ public interface CollectionParamsManageMapper extends BaseMapper<CollectionParam
" and csr.building_id = #{buildingId} ")
List<CollectionParamsManage> selectByBuildingId(@Param("buildingId") String buildingId);
@Select("<script>" +
"select " +
" cpm.id as \"cpmId\"," +
" hi.id as \"houseId\"," +
" hi.house_name as \"houseName\", " +
" hi.order_num as \"orderNum\" " +
"from " +
" cpm_space_relation csr " +
"join collection_params_manage cpm " +
"on " +
" csr.cpm_id = cpm.id " +
"join house_info hi " +
"on " +
" csr.house_id = hi.id " +
"WHERE " +
" cpm.mt_type = #{mtType}" +
" and hi.id IN " +
" <foreach collection='houseIds' item='item' open='(' separator=',' close=')'>" +
" #{item}" +
" </foreach>" +
" and cpm.param_type = #{paramType} " +
"</script>")
List<Map<String, String>> selectByHouseIdAndMtType(@Param("houseIds") List<String> houseIds,
@Param("mtType") String mtType,
@Param("paramType") String paramType);
@Select("select " +
" cpm.* " +
"from " +
@ -115,6 +141,7 @@ public interface CollectionParamsManageMapper extends BaseMapper<CollectionParam
" cpm.other_name, " +
" cpm.cur_value, " +
" cpm.cur_time, " +
" cpm.id as cpm_id, " +
" dl.status, " +
" cpm.order_num " +
"from " +
@ -135,21 +162,6 @@ public interface CollectionParamsManageMapper extends BaseMapper<CollectionParam
@Param("floorId") String floorId,
@Param("paramType") String paramType);
@Select("select " +
" cpm.id " +
"from " +
" cpm_space_relation csr " +
"join collection_params_manage cpm " +
"on " +
" csr.cpm_id = cpm.id " +
"join house_info hi " +
"on " +
" csr.house_id = hi.id " +
" and hi.id = #{houseId} " +
" and cpm.mt_type = #{mtType} ")
List<Map<String, String>> selectByHouseIdAndMtType(@Param("houseId") String houseId,
@Param("mtType") String mtType);
@Select("select " +
" cpm.id, " +

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

@ -3,6 +3,7 @@ package com.mh.system.mapper.device;
import com.mh.common.core.domain.entity.ChillersEntity;
import com.mh.common.core.domain.entity.CollectionParamsManage;
import com.mh.common.core.domain.entity.DeviceReport;
import com.mh.common.core.domain.vo.IndoorTempVO;
import org.apache.ibatis.annotations.*;
import java.util.Date;
@ -175,7 +176,14 @@ public interface DataProcessMapper {
List<ChillersEntity> selectLineDataByCodeAndRegisterAddr(@Param("tableName") String tableName,
@Param("registerId") String registerId);
@Select("select * from ${tableName} where register_id = #{registerId} order by cur_time desc")
List<ChillersEntity> selectHisDataByCodeAndRegisterAddr(@Param("tableName") String tableName,
@Param("registerId") String registerId);
@Select("<script>" +
"select to_char(cur_time, 'YYYY-MM-DD HH24:00:00') as curTime, cur_value as indoorTemp from ${tableName} " +
" where register_id in (" +
"<foreach collection ='registerIds' item='id' index = 'index' separator=','>" +
"#{id}" +
"</foreach>" +
" ) order by cur_time desc" +
"</script>")
List<IndoorTempVO> selectHisDataByCodeAndRegisterAddr(@Param("tableName") String tableName,
@Param("registerIds") List<String> registerIds);
}

6
mh-system/src/main/java/com/mh/system/service/device/IIndoorTempMonitorService.java

@ -3,7 +3,9 @@ package com.mh.system.service.device;
import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.mh.common.core.domain.dto.HouseGroupDTO;
import com.mh.common.core.domain.dto.IndoorTempDTO;
import com.mh.common.core.domain.entity.ChillersEntity;
import com.mh.common.core.domain.vo.IndoorTempVO;
import java.util.List;
@ -18,5 +20,7 @@ public interface IIndoorTempMonitorService {
List<HouseGroupDTO> getIndoorTempByFloor(String systemType, String floorId) throws JsonProcessingException;
List<ChillersEntity> getIndoorTempHisByHouseId(String houseId);
List<IndoorTempVO> getIndoorTempHisByFloorAndHouseId(String systemType, String floorId, String houseId);
List<IndoorTempDTO> getIndoorTempHisByHouseId(String systemType, List<String> houseId);
}

138
mh-system/src/main/java/com/mh/system/service/device/impl/IndoorTempMonitorServiceImpl.java

@ -4,21 +4,27 @@ import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mh.common.core.domain.dto.HouseGroupDTO;
import com.mh.common.core.domain.dto.IndoorTempDTO;
import com.mh.common.core.domain.dto.TempHumidityDTO;
import com.mh.common.core.domain.entity.ChillersEntity;
import com.mh.common.core.domain.vo.IndoorTempVO;
import com.mh.common.utils.DateUtils;
import com.mh.common.utils.StringUtils;
import com.mh.system.mapper.device.CollectionParamsManageMapper;
import com.mh.system.mapper.device.DataProcessMapper;
import com.mh.system.service.device.IIndoorTempMonitorService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author LJF
@ -46,6 +52,7 @@ public class IndoorTempMonitorServiceImpl implements IIndoorTempMonitorService {
/**
* 格式转换成json
*
* @param dataList
* @return
* @throws JsonProcessingException
@ -77,24 +84,111 @@ public class IndoorTempMonitorServiceImpl implements IIndoorTempMonitorService {
}
@Override
public List<ChillersEntity> getIndoorTempHisByHouseId(String houseId) {
String now = DateUtils.getTime();
String tableName = "chillers_data_min" + now.substring(0, 4);
// 根据房间id查询对应的cpm.id
List<Map<String, String>> list = collectionParamsManageMapper.selectByHouseIdAndMtType(houseId, "99");
if (list.isEmpty()) {
return List.of();
}
List<ChillersEntity> result = new ArrayList<>();
// 遍历查询到的cpm.id
for (Map<String, String> cpmIdMap : list) {
String id = cpmIdMap.get("id").toString();
List<ChillersEntity> chillersEntities = dataProcessMapper.selectHisDataByCodeAndRegisterAddr(tableName, id);
result.addAll(chillersEntities);
}
if (result.isEmpty()) {
return List.of();
public List<IndoorTempVO> getIndoorTempHisByFloorAndHouseId(String systemType, String floorId, String houseId) {
return List.of();
}
@Override
public List<IndoorTempDTO> getIndoorTempHisByHouseId(String systemType, List<String> houseIds) {
// 1. 使用Java 8时间API替代字符串截取
LocalDateTime now = LocalDateTime.now();
String tableName = "chillers_data_min" + now.getYear(); // 直接获取年份更安全
// 2. 增强SQL查询参数校验
if (houseIds.isEmpty()) {
log.warn("无效房间ID: {}", houseIds);
return Collections.emptyList();
}
return result;
// 3. 使用更明确的集合类型声明
List<Map<String, String>> cpmIdList = collectionParamsManageMapper.selectByHouseIdAndMtType(
houseIds,
"7", // 使用枚举常量
"12"
);
// cpmIdList用stream houseId分组遍历得出houseId,houseName, orderNum先赋值给result;
// 使用Stream分组映射
Map<String, Object> houseMapping = cpmIdList.stream()
.filter(map -> map.containsKey("houseId") && map.containsKey("houseName"))
.collect(Collectors.toMap(
map -> map.get("houseId"), // 键:houseId
map -> map.get("houseName"), // 值:houseName
(oldVal, newVal) -> oldVal // 重复键处理:保留首次出现的值
));
Map<String, Object> houseOrderMapping = cpmIdList.stream()
.filter(map -> map.containsKey("houseId") && map.containsKey("houseName"))
.collect(Collectors.toMap(
map -> map.get("houseId"), // 键:houseId
map -> map.get("orderNum"), // 值:houseName
(oldVal, newVal) -> oldVal // 重复键处理:保留首次出现的值
));
// 构建结果集合
return houseIds.stream()
.map(houseId -> {
// 根据houseId查询对应的cmpList
List<String> cpmData = cpmIdList.stream()
.filter(map -> houseId.equals(map.get("houseId")))
.map(map -> map.get("cpmId"))
.collect(Collectors.toList());
List<IndoorTempVO> rawData = dataProcessMapper.selectHisDataByCodeAndRegisterAddr(tableName, cpmData);
// 4. 优化聚合计算(单次Stream完成所有操作)
List<IndoorTempVO> collect = rawData.stream()
// .filter(vo -> isValidTimeFormat(vo.getCurTime())) // 格式校验
.collect(Collectors.groupingBy(
IndoorTempVO::getCurTime,
() -> new TreeMap<>(this::compareTimeString), // 自定义排序
Collectors.collectingAndThen(
Collectors.toList(),
this::calculateAverage
)
))
.entrySet().stream()
.map(entry -> buildResultVO(entry.getKey(), entry.getValue()))
.toList();
return new IndoorTempDTO(
Integer.parseInt(String.valueOf(houseOrderMapping.getOrDefault(houseId, 0))), // 默认值兜底
houseId,
String.valueOf(houseMapping.getOrDefault(houseId, "未知房间")), // 默认值兜底
collect); // 初始化数据列表
})
.collect(Collectors.toList());
}
// 辅助方法:时间格式校验
private boolean isValidTimeFormat(String time) {
return time != null && time.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}");
}
// 辅助方法:时间字符串比较
private int compareTimeString(String t1, String t2) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00");
LocalDateTime dt1 = LocalDateTime.parse(t1, formatter);
LocalDateTime dt2 = LocalDateTime.parse(t2, formatter);
return dt1.compareTo(dt2);
}
// 辅助方法:计算平均值
private BigDecimal calculateAverage(List<IndoorTempVO> list) {
BigDecimal sum = list.stream()
.map(IndoorTempVO::getIndoorTemp)
.reduce(BigDecimal.ZERO, BigDecimal::add);
return sum.divide(
new BigDecimal(list.size()),
2,
RoundingMode.HALF_UP
);
}
// 辅助方法:构建结果对象
private IndoorTempVO buildResultVO(String time, BigDecimal avg) {
IndoorTempVO vo = new IndoorTempVO();
vo.setCurTime(time);
vo.setIndoorTemp(avg);
return vo;
}
}

Loading…
Cancel
Save