Browse Source

1、mqtt订阅入库;

2、项目初始化之后,mqtt默认订阅;
3、获取监控列表内容数据接口编写;
4、优化实体类;
5、设备操作日志注解配置以及增删查改相关接口编写;
dev
mh 3 months ago
parent
commit
cf2bb7dc58
  1. 55
      mh-admin/src/main/java/com/mh/MHRunner.java
  2. 4
      mh-admin/src/main/java/com/mh/web/controller/device/CollectionParamsManageController.java
  3. 64
      mh-admin/src/main/java/com/mh/web/controller/device/OperationController.java
  4. 113
      mh-admin/src/main/java/com/mh/web/controller/mqtt/MqttSubsController.java
  5. 21
      mh-common/src/main/java/com/mh/common/annotation/ControlDeviceAno.java
  6. 2
      mh-common/src/main/java/com/mh/common/constant/Constants.java
  7. 42
      mh-common/src/main/java/com/mh/common/core/domain/entity/CollectionParamsManage.java
  8. 2
      mh-common/src/main/java/com/mh/common/core/domain/entity/ConsumptionAnalyze.java
  9. 87
      mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceControlLog.java
  10. 2
      mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceReport.java
  11. 2
      mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceTypeEnergy.java
  12. 114
      mh-common/src/main/java/com/mh/common/core/domain/entity/MqttSubscription.java
  13. 49
      mh-common/src/main/java/com/mh/common/core/domain/entity/OrderEntity.java
  14. 46
      mh-common/src/main/java/com/mh/common/enums/ComputeEnum.java
  15. 6
      mh-common/src/main/java/com/mh/common/enums/ComputeService.java
  16. 65
      mh-common/src/main/java/com/mh/common/enums/ControlTypeEnum.java
  17. 14
      mh-common/src/main/java/com/mh/common/utils/DateUtils.java
  18. 117
      mh-framework/src/main/java/com/mh/framework/aspectj/ControlDeviceAspect.java
  19. 11
      mh-framework/src/main/java/com/mh/framework/dealdata/DataProcessService.java
  20. 51
      mh-framework/src/main/java/com/mh/framework/dealdata/impl/DataProcessServiceImpl.java
  21. 10
      mh-framework/src/main/java/com/mh/framework/mqtt/config/MqttInboundConfig.java
  22. 2
      mh-framework/src/main/java/com/mh/framework/mqtt/service/impl/MqttGatewayServiceImpl.java
  23. 2
      mh-framework/src/main/java/com/mh/framework/mqtt/service/impl/MqttTopicServiceImpl.java
  24. 133
      mh-quartz/src/main/java/com/mh/quartz/task/DealDataTask.java
  25. 31
      mh-system/src/main/java/com/mh/system/mapper/device/DataProcessMapper.java
  26. 16
      mh-system/src/main/java/com/mh/system/mapper/device/DeviceControlLogMapper.java
  27. 12
      mh-system/src/main/java/com/mh/system/mapper/energy/EnergyAnalyzeMapper.java
  28. 26
      mh-system/src/main/java/com/mh/system/mapper/energy/EnergyMapper.java
  29. 6
      mh-system/src/main/java/com/mh/system/mapper/energy/EnergyQueryMapper.java
  30. 16
      mh-system/src/main/java/com/mh/system/mapper/mqtt/MqttSubscriptionMapper.java
  31. 30
      mh-system/src/main/java/com/mh/system/service/device/IDeviceControlLogService.java
  32. 9
      mh-system/src/main/java/com/mh/system/service/device/impl/CollectionParamsManageServiceImpl.java
  33. 33
      mh-system/src/main/java/com/mh/system/service/device/impl/DeviceControlLogServiceImpl.java
  34. 62
      mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyAnalyzeServiceImpl.java
  35. 24
      mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyQueryServiceImpl.java
  36. 60
      mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyServiceImpl.java
  37. 26
      mh-system/src/main/java/com/mh/system/service/mqtt/IMqttSubscriptionService.java
  38. 73
      mh-system/src/main/java/com/mh/system/service/mqtt/impl/MqttSubscriptionServiceImpl.java
  39. 19
      mh-system/src/main/java/com/mh/system/service/operation/IOperationDeviceService.java
  40. 59
      mh-system/src/main/java/com/mh/system/service/operation/impl/OperationDeviceServiceImpl.java
  41. 22
      mh-system/src/main/resources/mapper/system/EnergyMapper.xml
  42. 59
      sql/表结构设计.sql

55
mh-admin/src/main/java/com/mh/MHRunner.java

@ -0,0 +1,55 @@
package com.mh;
import com.mh.common.core.domain.entity.MqttSubscription;
import com.mh.common.utils.StringUtils;
import com.mh.framework.mqtt.service.IMqttTopicService;
import com.mh.system.service.mqtt.IMqttSubscriptionService;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 项目初始化之后的系列操作
* @date 2025-02-14 16:35:50
*/
@Component
public class MHRunner implements ApplicationRunner {
private final IMqttSubscriptionService iMqttSubscriptionService;
private final IMqttTopicService iMqttTopicService;
public MHRunner(IMqttSubscriptionService iMqttSubscriptionService, IMqttTopicService iMqttTopicService) {
this.iMqttSubscriptionService = iMqttSubscriptionService;
this.iMqttTopicService = iMqttTopicService;
}
@Override
public void run(ApplicationArguments args) throws Exception {
// 初始化mqtt订阅记录
initializeMqttSubscription();
}
/**
* 初始化mqtt订阅记录
*/
private void initializeMqttSubscription() {
MqttSubscription mqttSubscription = new MqttSubscription();
mqttSubscription.setStatus("0");
List<MqttSubscription> mqttSubscriptions = iMqttSubscriptionService.selectMqttSubList(mqttSubscription);
for (MqttSubscription subscription : mqttSubscriptions) {
try {
if (!StringUtils.isEmpty(subscription.getTopic())) {
iMqttTopicService.subscribe(subscription.getTopic(), subscription.getQos());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}

4
mh-admin/src/main/java/com/mh/web/controller/device/CollectionParamsManageController.java

@ -51,7 +51,7 @@ public class CollectionParamsManageController extends BaseController {
}
/**
* 新增网关
* 新增设备采集参数
*/
@PreAuthorize("@ss.hasPermi('system:cpm:add')")
@Log(title = "设备采集参数管理", businessType = BusinessType.INSERT)
@ -63,7 +63,7 @@ public class CollectionParamsManageController extends BaseController {
}
/**
* 修改网关信息
* 修改设备采集参数信息
*/
@PreAuthorize("@ss.hasPermi('system:cpm:edit')")
@Log(title = "设备采集参数管理", businessType = BusinessType.UPDATE)

64
mh-admin/src/main/java/com/mh/web/controller/device/OperationController.java

@ -1,8 +1,21 @@
package com.mh.web.controller.device;
import com.mh.common.annotation.ControlDeviceAno;
import com.mh.common.core.controller.BaseController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.mh.common.core.domain.AjaxResult;
import com.mh.common.core.domain.entity.CollectionParamsManage;
import com.mh.common.core.domain.entity.OrderEntity;
import com.mh.common.core.page.TableDataInfo;
import com.mh.common.utils.StringUtils;
import com.mh.framework.mqtt.service.IMqttGatewayService;
import com.mh.system.service.device.ICollectionParamsManageService;
import com.mh.system.service.operation.IOperationDeviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @author LJF
@ -11,8 +24,53 @@ import org.springframework.web.bind.annotation.RestController;
* @description 设备控制类
* @date 2025-01-15 14:11:22
*/
@Slf4j
@RestController
@RequestMapping("/device/operation")
@RequestMapping("/device")
public class OperationController extends BaseController {
private final ICollectionParamsManageService iCollectionParamsManageService;
private final IOperationDeviceService iOperationService;
private final IMqttGatewayService iMqttGatewayService;
@Autowired
public OperationController(ICollectionParamsManageService iCollectionParamsManageService, IOperationDeviceService iOperationService, IMqttGatewayService iMqttGatewayService) {
this.iCollectionParamsManageService = iCollectionParamsManageService;
this.iOperationService = iOperationService;
this.iMqttGatewayService = iMqttGatewayService;
}
/**
* 获取监控列表内容数据
*/
@PreAuthorize("@ss.hasPermi('system:cpm:list')")
@GetMapping("/monitor/list")
public TableDataInfo list(CollectionParamsManage communicationParams)
{
List<CollectionParamsManage> list = iCollectionParamsManageService.selectCollectionParamsManageList(communicationParams);
return getDataTable(list);
}
/**
* 对设备进行操作处理
*
* @param changeValues
* @return
*/
@PreAuthorize("@ss.hasPermi('system:cpm:operation')")
@PostMapping("/operation")
@ControlDeviceAno(value = "设备操作")
public AjaxResult operationDevice(@RequestBody List<OrderEntity> changeValues) {
try {
String sendOrder = iOperationService.operationDevice(changeValues);
iMqttGatewayService.publish("mh_upload/events_upload/devices", sendOrder, 1);
} catch (Exception e) {
log.error("设备操作失败", e);
return AjaxResult.error();
}
return AjaxResult.success();
}
}

113
mh-admin/src/main/java/com/mh/web/controller/mqtt/MqttSubsController.java

@ -0,0 +1,113 @@
package com.mh.web.controller.mqtt;
import com.mh.common.annotation.Log;
import com.mh.common.core.controller.BaseController;
import com.mh.common.core.domain.AjaxResult;
import com.mh.common.core.domain.entity.MqttSubscription;
import com.mh.common.core.page.TableDataInfo;
import com.mh.common.enums.BusinessType;
import com.mh.common.utils.StringUtils;
import com.mh.framework.mqtt.service.IMqttTopicService;
import com.mh.system.service.mqtt.IMqttSubscriptionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description mqtt持久化controller
* @date 2025-02-14 14:07:45
*/
@RestController
@RequestMapping("/mqtt/subs")
public class MqttSubsController extends BaseController {
@Autowired
private IMqttSubscriptionService iMqttSubscriptionService;
@Autowired
private IMqttTopicService mqttTopicService;
/**
* 获取mqtt订阅记录列表内容数据
*/
@PreAuthorize("@ss.hasPermi('system:mqtt:list')")
@GetMapping("/list")
public TableDataInfo list(MqttSubscription mqttSubscription) {
startPage();
List<MqttSubscription> list = iMqttSubscriptionService.selectMqttSubList(mqttSubscription);
return getDataTable(list);
}
/**
* 根据mqtt订阅记录id获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:mqtt:query')")
@GetMapping(value = "/{subsId}")
public AjaxResult getInfo(@PathVariable String subsId) {
return success(iMqttSubscriptionService.selectMqttSubById(subsId));
}
/**
* 新增mqtt订阅记录
*/
@PreAuthorize("@ss.hasPermi('system:mqtt:add')")
@Log(title = "mqtt订阅记录管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody MqttSubscription mqttSubscription) {
mqttSubscription.setCreateBy(getUsername());
String[] subscribedTopics = mqttTopicService.getSubscribedTopics();
boolean exists = Arrays.stream(subscribedTopics).anyMatch(val -> val.equals(mqttSubscription.getTopic()));
if (!exists) {
int i = iMqttSubscriptionService.insertMqttSub(mqttSubscription);
mqttTopicService.subscribe(mqttSubscription.getTopic(), mqttSubscription.getQos());
return toAjax(i);
}
return AjaxResult.error("topic已存在");
}
/**
* 修改mqtt订阅记录信息
*/
@PreAuthorize("@ss.hasPermi('system:mqtt:edit')")
@Log(title = "mqtt订阅记录管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody MqttSubscription mqttSubscription) {
mqttSubscription.setUpdateBy(getUsername());
// 判断是否停用订阅
mqttSubscription.setUpdateTime(new Date());
int result = iMqttSubscriptionService.updateMqttSub(mqttSubscription);
MqttSubscription mqttSubscription1 = iMqttSubscriptionService.selectMqttSubById(mqttSubscription.getId());
if (mqttSubscription.getStatus().equals("1")) {
mqttTopicService.unsubscribe(mqttSubscription.getTopic());
} else if (!Objects.equals(mqttSubscription.getQos(), mqttSubscription1.getQos()) && mqttSubscription.getStatus().equals("0")) {
mqttTopicService.unsubscribe(mqttSubscription.getTopic());
mqttTopicService.subscribe(mqttSubscription.getTopic(), mqttSubscription.getQos());
}
return toAjax(result);
}
/**
* 删除mqtt订阅记录管理
*/
@PreAuthorize("@ss.hasPermi('system:mqtt:remove')")
@Log(title = "mqtt订阅记录管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{subsIdIds}")
public AjaxResult remove(@PathVariable String[] subsIdIds) {
// 删除订阅也是直接解绑
for (String acId : subsIdIds) {
MqttSubscription mqttSubscription = iMqttSubscriptionService.selectMqttSubById(acId);
mqttTopicService.unsubscribe(mqttSubscription.getTopic());
}
return toAjax(iMqttSubscriptionService.deleteMqttSubByIds(subsIdIds));
}
}

21
mh-common/src/main/java/com/mh/common/annotation/ControlDeviceAno.java

@ -0,0 +1,21 @@
package com.mh.common.annotation;
import java.lang.annotation.*;
/**
* @author LJF
* @version 1.0
* @project NewZhujiang_Server
* @description 控制设备日志详情
* @date 2023/8/8 11:50:48
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ControlDeviceAno {
String value();
boolean isAop() default true;
}

2
mh-common/src/main/java/com/mh/common/constant/Constants.java

@ -78,7 +78,7 @@ public class Constants {
/**
* 管理员角色权限标识
*/
public static final String SUPER_ADMIN = "admin";
public static final String SUPER_ADMIN = "mhtech";
/**
* 角色权限分隔符

42
mh-common/src/main/java/com/mh/common/core/domain/entity/CollectionParamsManage.java

@ -120,9 +120,9 @@ public class CollectionParamsManage extends BaseEntity {
private String gatewayId;
/**
* 参数id
* 通信参数id
*/
private String paramId;
private String communicationParamId;
/**
* 通讯协议类型
@ -161,6 +161,32 @@ public class CollectionParamsManage extends BaseEntity {
@TableField(exist = false)
private Map<String, Object> params;
/**
* 参数类型0:运行状态1:启停状态2频率调节3频率反馈
*/
private String paramType;
/**
* 系统类型
*/
private String systemType;
public String getParamType() {
return paramType;
}
public void setParamType(String paramType) {
this.paramType = paramType;
}
public String getSystemType() {
return systemType;
}
public void setSystemType(String systemType) {
this.systemType = systemType;
}
@Override
public Map<String, Object> getParams() {
return params;
@ -357,12 +383,12 @@ public class CollectionParamsManage extends BaseEntity {
this.gatewayId = gatewayId;
}
public String getParamId() {
return paramId;
public String getCommunicationParamId() {
return communicationParamId;
}
public void setParamId(String paramId) {
this.paramId = paramId;
public void setCommunicationParamId(String communicationParamId) {
this.communicationParamId = communicationParamId;
}
public String getProtocolType() {
@ -420,7 +446,7 @@ public class CollectionParamsManage extends BaseEntity {
.append("unit", unit)
.append("sort", sort)
.append("gatewayId", gatewayId)
.append("paramId", paramId)
.append("communicationParamId", communicationParamId)
.append("protocolType", protocolType)
.append("communicationType", communicationType)
.append("registerSize", registerSize)
@ -429,6 +455,8 @@ public class CollectionParamsManage extends BaseEntity {
.append("grade", grade)
.append("searchValue", searchValue)
.append("params", params)
.append("paramType", paramType)
.append("systemType", systemType)
.toString();
}
}

2
mh-common/src/main/java/com/mh/common/core/domain/entity/ConsumptionAnalyzeEntity.java → mh-common/src/main/java/com/mh/common/core/domain/entity/ConsumptionAnalyze.java

@ -9,7 +9,7 @@ import java.io.Serializable;
* @description 能耗分析
* @date 2023/7/18 17:16:51
*/
public class ConsumptionAnalyzeEntity implements Serializable {
public class ConsumptionAnalyze implements Serializable {
private static final long serialVersionUID = 10L;

87
mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceControlLog.java

@ -0,0 +1,87 @@
package com.mh.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.util.Date;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 设备控制日历类
* @date 2025-02-13 17:32:27
*/
@TableName("device_control_log")
public class DeviceControlLog {
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
private String deviceName;
private String controlType;
private String controlContent;
private String createUser;
private Date createTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public String getControlType() {
return controlType;
}
public void setControlType(String controlType) {
this.controlType = controlType;
}
public String getControlContent() {
return controlContent;
}
public void setControlContent(String controlContent) {
this.controlContent = controlContent;
}
public String getCreateUser() {
return createUser;
}
public void setCreateUser(String createUser) {
this.createUser = createUser;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("id", id)
.append("deviceName", deviceName)
.append("controlType", controlType)
.append("controlContent", controlContent)
.append("createUser", createUser)
.append("createTime", createTime)
.toString();
}
}

2
mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceReportEntity.java → mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceReport.java

@ -12,7 +12,7 @@ import java.util.Date;
* @date : 2023/6/16
*/
@Data
public class DeviceReportEntity implements Serializable {
public class DeviceReport implements Serializable {
static final long serialVersionUID = 42L;

2
mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceTypeEnergyEntity.java → mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceTypeEnergy.java

@ -9,7 +9,7 @@ import java.io.Serializable;
* @description 各个设备类型组装成的DTO
* @date 2023-12-14 15:12:30
*/
public class DeviceTypeEnergyEntity implements Serializable {
public class DeviceTypeEnergy implements Serializable {
private static final long serialVersionUID = 10L;

114
mh-common/src/main/java/com/mh/common/core/domain/entity/MqttSubscription.java

@ -0,0 +1,114 @@
package com.mh.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.mh.common.core.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.util.Map;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description mqtt订阅管理
* @date 2025-02-14 13:47:07
*/
@TableName("mqtt_subscription")
public class MqttSubscription extends BaseEntity {
@TableId(value = "id", type = IdType.ASSIGN_UUID)
private String id;
private String topic;
private Short qos;
private String clientId;
private String status;
@TableField(exist = false)
private String searchValue;
/** 请求参数 */
@TableField(exist = false)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private Map<String, Object> params;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTopic() {
return topic;
}
public void setTopic(String topic) {
this.topic = topic;
}
public Short getQos() {
return qos;
}
public void setQos(Short qos) {
this.qos = qos;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Override
public String getSearchValue() {
return searchValue;
}
@Override
public void setSearchValue(String searchValue) {
this.searchValue = searchValue;
}
@Override
public Map<String, Object> getParams() {
return params;
}
@Override
public void setParams(Map<String, Object> params) {
this.params = params;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("id", id)
.append("topic", topic)
.append("qos", qos)
.append("clientId", clientId)
.append("status", status)
.append("searchValue", searchValue)
.append("params", params)
.toString();
}
}

49
mh-common/src/main/java/com/mh/common/core/domain/entity/OrderEntity.java

@ -0,0 +1,49 @@
package com.mh.common.core.domain.entity;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.builder.ToStringBuilder;
/**
* @author LJF
* @title
* @description 接收前端传过来的指令
* @updateTime 2020-05-28
* @throws
*/
@Setter
@Getter
public class OrderEntity {
private Integer id;
private String param;
private Integer type; // 0:修改频率,
// 1:修改开关状态,
// 2: 关闭冷却泵之前,查询最近关闭的冷却塔时间
// 3:群控手自动模式切换
// 4:修改温度
// 5:修改压力
// 6:手动,半自动切换
// 7:一键启动、
private String otherName; // 别称
public OrderEntity() {
}
public OrderEntity(Integer id, String param, Integer type, String otherName) {
this.id = id;
this.param = param;
this.type = type;
this.otherName = otherName;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("id", id)
.append("param", param)
.append("type", type)
.append("otherName", otherName)
.toString();
}
}

46
mh-common/src/main/java/com/mh/common/enums/ComputeEnum.java

@ -1,6 +1,6 @@
package com.mh.common.enums;
import com.mh.common.core.domain.entity.DeviceReportEntity;
import com.mh.common.core.domain.entity.DeviceReport;
import java.time.LocalDateTime;
import java.util.*;
@ -16,22 +16,22 @@ public enum ComputeEnum implements ComputeService {
*/
DEVICES("计量设备数据处理", 5) {
@Override
public ArrayList<Map<LocalDateTime, DeviceReportEntity>> getDataList(
Map.Entry<String, Map<LocalDateTime, List<DeviceReportEntity>>> entry) {
public ArrayList<Map<LocalDateTime, DeviceReport>> getDataList(
Map.Entry<String, Map<LocalDateTime, List<DeviceReport>>> entry) {
ArrayList<Map<LocalDateTime, DeviceReportEntity>> result = new ArrayList<>();
ArrayList<Map<LocalDateTime, DeviceReport>> result = new ArrayList<>();
//获取到电表的数据,按照表号分组分组,紧接着再按照小时分组。需要计算分组后的数据取出最大值
Map<LocalDateTime, List<DeviceReportEntity>> deviceMap = entry.getValue();
Map<LocalDateTime, List<DeviceReport>> deviceMap = entry.getValue();
String deviceNum = entry.getKey();
Set<Map.Entry<LocalDateTime, List<DeviceReportEntity>>> groupEntryList = deviceMap.entrySet();
for (Map.Entry<LocalDateTime, List<DeviceReportEntity>> listEntry : groupEntryList) {
Set<Map.Entry<LocalDateTime, List<DeviceReport>>> groupEntryList = deviceMap.entrySet();
for (Map.Entry<LocalDateTime, List<DeviceReport>> listEntry : groupEntryList) {
LocalDateTime key = listEntry.getKey();
List<DeviceReportEntity> value = listEntry.getValue();
DeviceReportEntity maxEntity = value.stream()
List<DeviceReport> value = listEntry.getValue();
DeviceReport maxEntity = value.stream()
.max(Comparator.comparing(obj -> Double.valueOf(obj.getCurValue())))
.orElse(null);
HashMap<LocalDateTime, DeviceReportEntity> map = new HashMap<>();
HashMap<LocalDateTime, DeviceReport> map = new HashMap<>();
map.put(key, maxEntity);
result.add(map);
}
@ -44,21 +44,21 @@ public enum ComputeEnum implements ComputeService {
*/
CLOUD("冷量计数据处理", 2) {
@Override
public ArrayList<Map<LocalDateTime, DeviceReportEntity>> getDataList(
Map.Entry<String, Map<LocalDateTime, List<DeviceReportEntity>>> entry) {
ArrayList<Map<LocalDateTime, DeviceReportEntity>> result = new ArrayList<>();
public ArrayList<Map<LocalDateTime, DeviceReport>> getDataList(
Map.Entry<String, Map<LocalDateTime, List<DeviceReport>>> entry) {
ArrayList<Map<LocalDateTime, DeviceReport>> result = new ArrayList<>();
//获取到电表的数据,按照表号分组分组,紧接着再按照小时分组。需要计算分组后的数据取出最大值
Map<LocalDateTime, List<DeviceReportEntity>> deviceMap = entry.getValue();
Map<LocalDateTime, List<DeviceReport>> deviceMap = entry.getValue();
String deviceNum = entry.getKey();
Set<Map.Entry<LocalDateTime, List<DeviceReportEntity>>> groupEntryList = deviceMap.entrySet();
for (Map.Entry<LocalDateTime, List<DeviceReportEntity>> listEntry : groupEntryList) {
Set<Map.Entry<LocalDateTime, List<DeviceReport>>> groupEntryList = deviceMap.entrySet();
for (Map.Entry<LocalDateTime, List<DeviceReport>> listEntry : groupEntryList) {
LocalDateTime key = listEntry.getKey();
List<DeviceReportEntity> value = listEntry.getValue();
DeviceReportEntity maxEntity = value.stream()
List<DeviceReport> value = listEntry.getValue();
DeviceReport maxEntity = value.stream()
.max(Comparator.comparing(obj -> Double.valueOf(obj.getCurValue())))
.orElse(null);
HashMap<LocalDateTime, DeviceReportEntity> map = new HashMap<>();
HashMap<LocalDateTime, DeviceReport> map = new HashMap<>();
map.put(key, maxEntity);
result.add(map);
}
@ -71,8 +71,8 @@ public enum ComputeEnum implements ComputeService {
*/
COLD("温度计数据处理", 1) {
@Override
public ArrayList<Map<LocalDateTime, DeviceReportEntity>> getDataList(
Map.Entry<String, Map<LocalDateTime, List<DeviceReportEntity>>> entry) {
public ArrayList<Map<LocalDateTime, DeviceReport>> getDataList(
Map.Entry<String, Map<LocalDateTime, List<DeviceReport>>> entry) {
return null;
}
};
@ -109,6 +109,6 @@ public enum ComputeEnum implements ComputeService {
return lookup.get(key);
}
public abstract ArrayList<Map<LocalDateTime, DeviceReportEntity>> getDataList(
Map.Entry<String, Map<LocalDateTime, List<DeviceReportEntity>>> entry);
public abstract ArrayList<Map<LocalDateTime, DeviceReport>> getDataList(
Map.Entry<String, Map<LocalDateTime, List<DeviceReport>>> entry);
}

6
mh-common/src/main/java/com/mh/common/enums/ComputeService.java

@ -1,6 +1,6 @@
package com.mh.common.enums;
import com.mh.common.core.domain.entity.DeviceReportEntity;
import com.mh.common.core.domain.entity.DeviceReport;
import java.time.LocalDateTime;
import java.util.ArrayList;
@ -19,6 +19,6 @@ public interface ComputeService {
* @param data
* @return
*/
ArrayList<Map<LocalDateTime, DeviceReportEntity>> getDataList(
Map.Entry<String, Map<LocalDateTime, List<DeviceReportEntity>>> data);
ArrayList<Map<LocalDateTime, DeviceReport>> getDataList(
Map.Entry<String, Map<LocalDateTime, List<DeviceReport>>> data);
}

65
mh-common/src/main/java/com/mh/common/enums/ControlTypeEnum.java

@ -0,0 +1,65 @@
package com.mh.common.enums;
import java.util.Objects;
/**
* @author LJF
* @version 1.0
* @project NewZhujiang_Server
* @description 操作控制类型
* @date 2023/8/8 15:07:40
*/
public enum ControlTypeEnum {
// 0:修改频率,
// 1:修改开关状态 0:关闭,1:启动,
// 2: 关闭冷却泵之前,查询最近关闭的冷却塔时间
// 3:群控手自动模式切换
// 4:修改温度
// 5:修改压力
control1(0,"修改频率"),
control2(1,"修改开关状态"),
control3(2,"关闭冷却泵之前,查询最近关闭的冷却塔时间"),
control4(3,"群控手自动模式切换"),
control5(4,"修改温度"),
control6(5,"修改压力")
;
private Integer type;
private String control;
ControlTypeEnum() {
}
ControlTypeEnum(Integer type, String control) {
this.type = type;
this.control = control;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public String getControl() {
return control;
}
public void setControl(String control) {
this.control = control;
}
public static String getByType(Integer type) {
for (ControlTypeEnum value : values()) {
if (null != type && Objects.equals(value.getType(), type)) {
return value.getControl();
}
}
return null;
}
}

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

@ -386,4 +386,18 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
}
/**
* 时间格式转 yyyy-MM-dd'T'HH:mm:ssZ
* @return
*/
public static String dateToTsStr() {
// 获取当前时间
Instant now = Instant.now();
// 转换为ZonedDateTime并设置时区为UTC
ZonedDateTime zonedDateTime = now.atZone(ZoneId.of("UTC"));
// 创建DateTimeFormatter对象并设置格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
// 格式化日期
return zonedDateTime.format(formatter);
}
}

117
mh-framework/src/main/java/com/mh/framework/aspectj/ControlDeviceAspect.java

@ -0,0 +1,117 @@
package com.mh.framework.aspectj;
import com.alibaba.fastjson2.JSON;
import com.mh.common.annotation.ControlDeviceAno;
import com.mh.common.core.domain.entity.DeviceControlLog;
import com.mh.common.core.domain.entity.OrderEntity;
import com.mh.common.enums.ControlTypeEnum;
import com.mh.common.utils.SecurityUtils;
import com.mh.system.service.device.IDeviceControlLogService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* @author LJF
* @version 1.0
* @project NewZhujiang_Server
* @description 设备控制详情内容
* @date 2023/8/8 11:55:54
*/
@Slf4j
@Aspect
@Component
public class ControlDeviceAspect {
@Autowired
private IDeviceControlLogService deviceControlLogService;
@Pointcut(value = "execution(* com.mh.*.controller..*(..)) && @annotation(com.mh.common.annotation.ControlDeviceAno)")
public void executionMethod(){}
@Pointcut(value = "execution(* com.mh.*.controller..*(..)) && @annotation(com.mh.common.annotation.ControlDeviceAno)")
public void executionNote(){}
@Before("executionMethod()")
public void controlBefore(JoinPoint joinPoint) {
log.info("前置通知");
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
log.info("获取到对应的参数==>{}",arg);
}
}
@Around(value = "execution(* com.mh.*.controller..*(..)) && @annotation(com.mh.common.annotation.ControlDeviceAno)")
public Object controlBeforeNote(ProceedingJoinPoint joinPoint) throws Throwable {
// 通知签名
Signature signature = joinPoint.getSignature();
MethodSignature msg = (MethodSignature) signature;
Object target = joinPoint.getTarget();
// 获取注解标注的方法
Method method = target.getClass().getMethod(msg.getName(), msg.getParameterTypes());
// 通过方法获取注解
ControlDeviceAno annotation = method.getAnnotation(ControlDeviceAno.class);
// Object proceed;
// 获取参数
Object[] args = joinPoint.getArgs();
log.info("注解方法标注值=={}", annotation.value());
log.info("注解方法标注=={}", annotation.isAop());
for (Object arg : args) {
log.info("方法内的参数==>{}", arg);
if (Objects.isNull(arg)) {
continue;
}
String string = JSON.toJSON(arg).toString();
List<OrderEntity> collect = JSON.parseArray(string, OrderEntity.class);
if (!CollectionUtils.isEmpty(collect)) {
for (OrderEntity orderEntity : collect) {
// DeviceMessageDTO deviceMessageDTO = deviceDisplayService.queryDeviceStatusByDeviceId(String.valueOf(orderEntity.getId()));
DeviceControlLog deviceControlLog = new DeviceControlLog();
// if (null != deviceMessageDTO) {
// deviceControlLogEntity.setDeviceName(deviceMessageDTO.getLabel());
// }
deviceControlLog.setDeviceName(orderEntity.getOtherName());
deviceControlLog.setControlType(ControlTypeEnum.getByType(orderEntity.getType()));
// 根据id查询对应的注册地址信息
if (null != orderEntity.getType() && orderEntity.getType() == 1) {
// 修改开关状态
deviceControlLog.setControlContent(orderEntity.getParam().equals("0")?"关闭":"开启");
} else if (null != orderEntity.getType() && orderEntity.getType() == 0) {
// 修改频率
deviceControlLog.setControlContent(orderEntity.getParam());
} else if (null != orderEntity.getType() && orderEntity.getType() == 3) {
// 修改手动获取全自动
deviceControlLog.setControlContent(orderEntity.getParam().equals("0")?"关闭全自动":"开启全自动");
}
deviceControlLog.setCreateUser(SecurityUtils.getUsername());
deviceControlLog.setCreateTime(new Date());
deviceControlLogService.insertData(deviceControlLog);
}
}
}
// if (!annotation.isAop()) {
// log.info("你无需处理当前注解内容");
// proceed = joinPoint.proceed();
// } else {
// log.info("进入aop判断");
// proceed = joinPoint.proceed();
//
// }
return joinPoint.proceed();
}
}

11
mh-framework/src/main/java/com/mh/framework/dealdata/DataProcessService.java

@ -1,8 +1,7 @@
package com.mh.framework.dealdata;
import com.mh.common.core.domain.entity.ChillersEntity;
import com.mh.common.core.domain.entity.CollectionParamsManage;
import com.mh.common.core.domain.entity.DeviceReportEntity;
import com.mh.common.core.domain.entity.DeviceReport;
import com.mh.common.model.request.AdvantechReceiver;
import java.util.List;
@ -45,13 +44,13 @@ public interface DataProcessService {
* @param type min hour day month year
* @return
*/
DeviceReportEntity queryLastValue(String deviceNum,String type);
DeviceReport queryLastValue(String deviceNum, String type);
/**
* 批量插入data_min表中
* @param dataMinList
*/
void insertDatabase(List<DeviceReportEntity> dataMinList);
void insertDatabase(List<DeviceReport> dataMinList);
/**
* 查询data_ + type + year 表中未处理的数据
@ -65,7 +64,7 @@ public interface DataProcessService {
* @param hourList 报表数据
* @param type 报表类型
*/
void batchInsertTable(List<DeviceReportEntity> hourList, String type);
void batchInsertTable(List<DeviceReport> hourList, String type);
/**
@ -81,7 +80,7 @@ public interface DataProcessService {
* @param dataList 数据集
* @param tableType
*/
void batchInsertOrUpdate(List<DeviceReportEntity> dataList, String tableType);
void batchInsertOrUpdate(List<DeviceReport> dataList, String tableType);
/**
* 查询倍率

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

@ -3,9 +3,8 @@ package com.mh.framework.dealdata.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.TypeReference;
import com.mh.common.constant.Constants;
import com.mh.common.core.domain.entity.ChillersEntity;
import com.mh.common.core.domain.entity.CollectionParamsManage;
import com.mh.common.core.domain.entity.DeviceReportEntity;
import com.mh.common.core.domain.entity.DeviceReport;
import com.mh.common.core.redis.RedisCache;
import com.mh.common.model.request.AdvantechDatas;
import com.mh.common.model.request.AdvantechReceiver;
@ -16,8 +15,6 @@ import com.mh.framework.dealdata.DataProcessService;
import com.mh.system.mapper.device.DataProcessMapper;
import com.mh.system.mapper.device.DatabaseMapper;
import com.mh.system.service.device.ICollectionParamsManageService;
import jakarta.annotation.Resource;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -159,7 +156,7 @@ public class DataProcessServiceImpl implements DataProcessService {
}
@Override
public DeviceReportEntity queryLastValue(String deviceNum, String type) {
public DeviceReport queryLastValue(String deviceNum, String type) {
//先查询今年的表,今年的表没有,再查上一年的表
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
@ -173,7 +170,7 @@ public class DataProcessServiceImpl implements DataProcessService {
curTable = "data_" + type + year;
lastTable = "data_" + type + (year - 1);
}
DeviceReportEntity entity = null;
DeviceReport entity = null;
entity = dataProcessMapper.queryLastValue(deviceNum, curTable);
if (entity == null) {
try {
@ -187,34 +184,34 @@ public class DataProcessServiceImpl implements DataProcessService {
}
@Override
public void insertDatabase(List<DeviceReportEntity> dataMinList) {
public void insertDatabase(List<DeviceReport> dataMinList) {
log.info("插入data_min数据,数据大小==>{}", dataMinList.size());
Calendar calendar = Calendar.getInstance();
//时间格式化0和5结尾的时间
int batchSize = 10;
// 拿出第一条数据,看看表中是否存在值,存在则进行update操作
if (dataMinList.size() > 0) {
DeviceReportEntity deviceReportEntity = dataMinList.getFirst();
String yearStr = "data_min" + DateUtils.dateToString(deviceReportEntity.getCurTime(), "yyyy-MM-dd HH:mm:ss").substring(0, 4);
DeviceReportEntity value = dataProcessMapper.isHaveData(deviceReportEntity,yearStr);
DeviceReport deviceReport = dataMinList.getFirst();
String yearStr = "data_min" + DateUtils.dateToString(deviceReport.getCurTime(), "yyyy-MM-dd HH:mm:ss").substring(0, 4);
DeviceReport value = dataProcessMapper.isHaveData(deviceReport,yearStr);
try {
if (value!= null && value.getId() > 0) {
// 存在则进行更新操作
BigDecimal bigDecimal = new BigDecimal(deviceReportEntity.getCurValue());
BigDecimal bigDecimal = new BigDecimal(deviceReport.getCurValue());
BigDecimal usedValue = bigDecimal.subtract(new BigDecimal(value.getLastValue())).setScale(2, RoundingMode.HALF_UP);
BigDecimal calcValue = usedValue.multiply(new BigDecimal(value.getRatio())).setScale(2, RoundingMode.HALF_UP);
deviceReportEntity.setId(value.getId());
int grade = deviceReportEntity.getGrade();
deviceReport.setId(value.getId());
int grade = deviceReport.getGrade();
//区分瞬时值
if (grade == 1) {
deviceReportEntity.setUsedValue(deviceReportEntity.getCurValue());
deviceReportEntity.setCalcValue(deviceReportEntity.getCurValue());
deviceReport.setUsedValue(deviceReport.getCurValue());
deviceReport.setCalcValue(deviceReport.getCurValue());
} else {
deviceReportEntity.setUsedValue(String.valueOf(usedValue));
deviceReportEntity.setCalcValue(String.valueOf(calcValue));
deviceReport.setUsedValue(String.valueOf(usedValue));
deviceReport.setCalcValue(String.valueOf(calcValue));
}
dataProcessMapper.updateDataMinByTime(deviceReportEntity, yearStr);
dataProcessMapper.updateDataMinByTime(deviceReport, yearStr);
} else {
// 不存在则进行插入操作
dataProcessMapper.insertDataMin(dataMinList.subList(0, 1), yearStr);
@ -225,7 +222,7 @@ public class DataProcessServiceImpl implements DataProcessService {
}
// 分页查询并插入数据
for (int i = 1; i < dataMinList.size(); i += batchSize) {
List<DeviceReportEntity> batchList = dataMinList.subList(i, Math.min(i + batchSize, dataMinList.size()));
List<DeviceReport> batchList = dataMinList.subList(i, Math.min(i + batchSize, dataMinList.size()));
// 执行插入语句
calendar.setTime(new Date());
int year = calendar.get(Calendar.YEAR);
@ -261,8 +258,8 @@ public class DataProcessServiceImpl implements DataProcessService {
int day = now.get(Calendar.DATE);
int hour = now.get(Calendar.HOUR_OF_DAY);
String curTable = "data_" + type + year;
List<DeviceReportEntity> curResults = null;
List<DeviceReportEntity> lastResults = null;
List<DeviceReport> curResults = null;
List<DeviceReport> lastResults = null;
HashMap<String, Object> resultMap = new HashMap<>();
if (month == 1 && day == 1 && hour == 0) {
// 是当前年份的1月1日0点到1点,需要拼接表
@ -275,8 +272,8 @@ public class DataProcessServiceImpl implements DataProcessService {
lastResults.addAll(curResults);
// BeanUtils.copyProperties(curResults, lastResults);
HashMap<String, List<Long>> map = new HashMap<>();
List<Long> curIdList = curResults.stream().map(DeviceReportEntity::getId).collect(Collectors.toList());
List<Long> lastIdList = lastResults.stream().map(DeviceReportEntity::getId).collect(Collectors.toList());
List<Long> curIdList = curResults.stream().map(DeviceReport::getId).collect(Collectors.toList());
List<Long> lastIdList = lastResults.stream().map(DeviceReport::getId).collect(Collectors.toList());
map.put("lastIds", lastIdList);
map.put("curIds", curIdList);
@ -287,7 +284,7 @@ public class DataProcessServiceImpl implements DataProcessService {
//不需要拼接表
System.out.println("不是当前年份的1月1日0点到1点");
curResults = dataProcessMapper.queryUntreatedData(curTable);
List<Long> ids = curResults.stream().map(DeviceReportEntity::getId).collect(Collectors.toList());
List<Long> ids = curResults.stream().map(DeviceReport::getId).collect(Collectors.toList());
HashMap<String, List<Long>> map = new HashMap<>();
map.put("curIds", ids);
@ -299,7 +296,7 @@ public class DataProcessServiceImpl implements DataProcessService {
}
@Override
public void batchInsertTable(List<DeviceReportEntity> hourList, String type) {
public void batchInsertTable(List<DeviceReport> hourList, String type) {
}
@ -341,9 +338,9 @@ public class DataProcessServiceImpl implements DataProcessService {
}
@Override
public void batchInsertOrUpdate(List<DeviceReportEntity> dataList, String type) {
public void batchInsertOrUpdate(List<DeviceReport> dataList, String type) {
String tableName;
for (DeviceReportEntity data : dataList) {
for (DeviceReport data : dataList) {
//不分表 月、年
tableName = "data_" + type;
int num = 0;

10
mh-framework/src/main/java/com/mh/framework/mqtt/config/MqttInboundConfig.java

@ -35,6 +35,8 @@ public class MqttInboundConfig {
@Resource(name = ChannelName.INBOUND)
private MessageChannel inboundChannel;
private String clientId;
/**
* 入站适配器
* @return
@ -44,11 +46,12 @@ public class MqttInboundConfig {
MqttClientOptions options = MqttConfig.getBasicMqttClientOptions();
// 此处初始化的时候,默认订阅了配置文件中已经写好的topic
// 如果需要订阅多个,可以自己手动订阅,会写一个addTopic()进行添加订阅
clientId = options.getClientId() + "_consumer_" + System.currentTimeMillis();
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(
options.getClientId() + "_consumer_" + System.currentTimeMillis(),
clientId,
mqttClientFactory,
options.getInboundTopic().split(","));
System.out.println("每一次都会入站适配器吗?"+clientId);
DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
// 统一是字节处理
converter.setPayloadAsBytes(true);
@ -80,5 +83,8 @@ public class MqttInboundConfig {
};
}
public String getClientId() {
return clientId;
}
}

2
mh-framework/src/main/java/com/mh/framework/mqtt/service/impl/MqttGatewayServiceImpl.java

@ -24,7 +24,7 @@ public class MqttGatewayServiceImpl implements IMqttGatewayService {
}
@Override
public void publish(String topic, String payload, int qos) {
public synchronized void publish(String topic, String payload, int qos) {
outboundChannel.send(
MessageBuilder
.withPayload(payload)

2
mh-framework/src/main/java/com/mh/framework/mqtt/service/impl/MqttTopicServiceImpl.java

@ -2,6 +2,8 @@ package com.mh.framework.mqtt.service.impl;
import com.mh.framework.mqtt.service.IMqttTopicService;
import jakarta.annotation.Resource;
import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
import org.springframework.stereotype.Service;

133
mh-quartz/src/main/java/com/mh/quartz/task/DealDataTask.java

@ -1,21 +1,18 @@
package com.mh.quartz.task;
import com.mh.common.core.domain.entity.CollectionParamsManage;
import com.mh.common.core.domain.entity.DeviceReportEntity;
import com.mh.common.core.domain.entity.DeviceReport;
import com.mh.common.core.redis.RedisCache;
import com.mh.common.enums.ComputeEnum;
import com.mh.common.utils.DateUtils;
import com.mh.framework.dealdata.DataProcessService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
import java.util.*;
@ -53,7 +50,7 @@ public class DealDataTask {
return;
}
//清空redis
// redisCache.delete Object("DEVICES");
redisCache.deleteObject("DEVICES");
//处理chillers数据
try {
//todo 处理没有对象curValue和curTime的异常
@ -97,18 +94,18 @@ public class DealDataTask {
Collectors.maxBy(Comparator.comparing(CollectionParamsManage::getCurValue)))
);
collect = sortMapByDate(collect);
List<DeviceReportEntity> dataMinList = new ArrayList<>();
List<DeviceReport> dataMinList = new ArrayList<>();
//value循环处理数据
if (collect.size() > 0) {
CollectionParamsManage entity = collect.values().stream().findFirst().get().get();
int deviceGrade = entity.getGrade();
//从数据库取值,当前的年表,当前年表没有,查询上一次年表
DeviceReportEntity lastData = dataProcessService.queryLastValue(entity.getMtNum(), "min");
DeviceReport lastData = dataProcessService.queryLastValue(entity.getMtNum(), "min");
int ratio = dataProcessService.queryRatio(entity.getMtNum()) == null ? 1 : dataProcessService.queryRatio(entity.getMtNum());
if (ObjectUtils.isEmpty(lastData) || ObjectUtils.isEmpty(lastData.getLastValue())) {
//从device_manage取出初始值
String initValue = dataProcessService.queryInitValue(entity.getMtNum());
DeviceReportEntity firstEntity = new DeviceReportEntity();
DeviceReport firstEntity = new DeviceReport();
firstEntity.setLastValue(initValue);
firstEntity.setLastTime(entity.getCurTime());
firstEntity.setCurTime(entity.getCurTime());
@ -131,7 +128,7 @@ public class DealDataTask {
} else {
Date lastDate = lastData.getLastTime();
String lastValue = lastData.getLastValue();
DeviceReportEntity firstEntity = new DeviceReportEntity();
DeviceReport firstEntity = new DeviceReport();
firstEntity.setLastValue(lastValue);
firstEntity.setLastTime(lastDate);
firstEntity.setCurTime(entity.getCurTime());
@ -161,8 +158,8 @@ public class DealDataTask {
i++;
continue;
}
DeviceReportEntity temp = new DeviceReportEntity();
DeviceReportEntity dataJ = dataMinList.get(j);
DeviceReport temp = new DeviceReport();
DeviceReport dataJ = dataMinList.get(j);
CollectionParamsManage dataI = entry.getValue().get();
//复制实体类
// BeanUtils.copyProperties(dataI, temp);
@ -232,34 +229,32 @@ public class DealDataTask {
public void dealDeviceDataHour() {
Map<String, Object> map = dataProcessService.queryUntreatedData("min");
//需要处理的数据
List<DeviceReportEntity> dataList = (List<DeviceReportEntity>) map.get("data");
List<DeviceReport> dataList = (List<DeviceReport>) map.get("data");
//处理完成后需要将数据设置为已处理,grade = 1,
Map<String, List<Long>> idMap = (Map<String, List<Long>>) map.get("idMap");
//遍历分组
Map<String, Map<LocalDateTime, List<DeviceReportEntity>>> collect = getMeterNumMap(dataList, ChronoUnit.HOURS);
Map<String, Map<LocalDateTime, List<DeviceReport>>> collect = getMeterNumMap(dataList, ChronoUnit.HOURS);
//小时表数据集合
List<DeviceReportEntity> hourList = new ArrayList<>();
List<DeviceReport> hourList = new ArrayList<>();
//TODO 分组好的数据计算后插入数据表
for (Map.Entry<String, Map<LocalDateTime, List<DeviceReportEntity>>> entry : collect.entrySet()) {
for (Map.Entry<String, Map<LocalDateTime, List<DeviceReport>>> entry : collect.entrySet()) {
//表号
String key = entry.getKey();
Map<LocalDateTime, List<DeviceReportEntity>> value = entry.getValue();
Set<Map.Entry<LocalDateTime, List<DeviceReportEntity>>> entries = value.entrySet();
Map<LocalDateTime, List<DeviceReport>> value = entry.getValue();
Set<Map.Entry<LocalDateTime, List<DeviceReport>>> entries = value.entrySet();
String deviceType = null;
for (Map.Entry<LocalDateTime, List<DeviceReportEntity>> listEntry : entries) {
for (Map.Entry<LocalDateTime, List<DeviceReport>> listEntry : entries) {
deviceType = listEntry.getValue().get(0).getDeviceType();
break;
}
//分组计算,得到一组当前表号的以时间分组的数据,循环计算第一条的当前读数是上一条的上次读数
ComputeEnum computeEnum = ComputeEnum.get(Integer.parseInt(deviceType));
assert deviceType != null;
List<Map<LocalDateTime, DeviceReportEntity>> dealDataList =
List<Map<LocalDateTime, DeviceReport>> dealDataList =
ComputeEnum.get(Integer.parseInt(deviceType)).getDataList(entry);
List<Map<LocalDateTime, DeviceReportEntity>> sortedList = dealDataList.stream()
List<Map<LocalDateTime, DeviceReport>> sortedList = dealDataList.stream()
.sorted(Comparator.comparing(temMap -> temMap.keySet().iterator().next()))
.collect(Collectors.toList());
//计算上次值,当前值
@ -285,15 +280,15 @@ public class DealDataTask {
* @param key
* @param dealDataList
*/
private List<DeviceReportEntity> calcListData(List<DeviceReportEntity> hourList,
private List<DeviceReport> calcListData(List<DeviceReport> hourList,
String key, String tableType,
List<Map<LocalDateTime, DeviceReportEntity>> dealDataList) {
List<Map<LocalDateTime, DeviceReport>> dealDataList) {
ArrayList<DeviceReportEntity> tempList = new ArrayList<>();
ArrayList<DeviceReport> tempList = new ArrayList<>();
for (int i = 0; i < dealDataList.size(); i++) {
if (i == 0) {
Map<LocalDateTime, DeviceReportEntity> reportEntityMap = dealDataList.get(i);
Map<LocalDateTime, DeviceReport> reportEntityMap = dealDataList.get(i);
//由key已知是哪个表号
//判断第一个是否有历史数据,当年表有历史数据则取当年表,无则取上一年表,去年和今年表都无则取初始值
@ -301,7 +296,7 @@ public class DealDataTask {
String lastValue = null;
Date lastDate = null;
//查询历史记录
DeviceReportEntity hourEntity = dataProcessService.queryLastValue(key, tableType);
DeviceReport hourEntity = dataProcessService.queryLastValue(key, tableType);
if (ObjectUtils.isEmpty(hourEntity)) {
//查询设备信息初始值
lastValue = dataProcessService.queryInitValue(key);
@ -310,10 +305,10 @@ public class DealDataTask {
lastDate = hourEntity.getLastTime();
}
Set<Map.Entry<LocalDateTime, DeviceReportEntity>> entrySet = reportEntityMap.entrySet();
for (Map.Entry<LocalDateTime, DeviceReportEntity> entityEntry : entrySet) {
Set<Map.Entry<LocalDateTime, DeviceReport>> entrySet = reportEntityMap.entrySet();
for (Map.Entry<LocalDateTime, DeviceReport> entityEntry : entrySet) {
LocalDateTime curTime = entityEntry.getKey();
DeviceReportEntity entity = entityEntry.getValue();
DeviceReport entity = entityEntry.getValue();
ZonedDateTime zonedDateTime = curTime.atZone(ZoneId.systemDefault());
Date date = Date.from(zonedDateTime.toInstant());
entity.setCurTime(date);
@ -339,12 +334,12 @@ public class DealDataTask {
} else {
//从上一条取当前读数和当前时间作为当前对象的上一次读数
int lastIndex = i - 1;
DeviceReportEntity lastEntity = tempList.get(lastIndex);
Map<LocalDateTime, DeviceReportEntity> curMap = dealDataList.get(i);
Set<Map.Entry<LocalDateTime, DeviceReportEntity>> curEntrySet = curMap.entrySet();
for (Map.Entry<LocalDateTime, DeviceReportEntity> curEntry : curEntrySet) {
DeviceReport lastEntity = tempList.get(lastIndex);
Map<LocalDateTime, DeviceReport> curMap = dealDataList.get(i);
Set<Map.Entry<LocalDateTime, DeviceReport>> curEntrySet = curMap.entrySet();
for (Map.Entry<LocalDateTime, DeviceReport> curEntry : curEntrySet) {
LocalDateTime curTime = curEntry.getKey();
DeviceReportEntity curEntity = curEntry.getValue();
DeviceReport curEntity = curEntry.getValue();
ZonedDateTime zonedDateTime = curTime.atZone(ZoneId.systemDefault());
Date date = Date.from(zonedDateTime.toInstant());
curEntity.setCurTime(date);
@ -376,7 +371,7 @@ public class DealDataTask {
* @param interval 时间间隔
* @return
*/
private Map<String, Map<LocalDateTime, List<DeviceReportEntity>>> getMeterNumMap(List<DeviceReportEntity> dataList,
private Map<String, Map<LocalDateTime, List<DeviceReport>>> getMeterNumMap(List<DeviceReport> dataList,
TemporalUnit interval) {
// 获取 MinuteData 对象集合,其中的时间戳是 java.util.Date 类型
//1:数据格式为先按照表号分组,设备类型里的数据再按照小时分组
@ -387,10 +382,10 @@ public class DealDataTask {
data.setLocalDateTime(dateTime);
return data;
})
.sorted(Comparator.comparing(DeviceReportEntity::getLocalDateTime))
.sorted(Comparator.comparing(DeviceReport::getLocalDateTime))
.collect(
//根据表号分组
Collectors.groupingBy(DeviceReportEntity::getDeviceNum,
Collectors.groupingBy(DeviceReport::getDeviceNum,
//根据时间间隔分组,后续是否需要根据减少分组
Collectors.groupingBy(report -> report.getLocalDateTime().truncatedTo(interval)))
@ -406,18 +401,18 @@ public class DealDataTask {
public void dealDay2Year() {
Map<String, Object> untreatedList = dataProcessService.queryUntreatedData("hour");
//需要处理的数据
List<DeviceReportEntity> dataList = (List<DeviceReportEntity>) untreatedList.get("data");
List<DeviceReport> dataList = (List<DeviceReport>) untreatedList.get("data");
//处理完成后需要将数据设置为已处理,grade = 1,
Map<String, List<Long>> idMap = (Map<String, List<Long>>) untreatedList.get("idMap");
//<表号:<时间:List<集合>>> 按照日区分
Map<String, Map<LocalDateTime, List<DeviceReportEntity>>> dayMap = getMeterNumMap(dataList, ChronoUnit.DAYS);
List<DeviceReportEntity> dayList = new ArrayList<>();
List<DeviceReportEntity> monthList = new ArrayList<>();
Map<String, Map<LocalDateTime, List<DeviceReport>>> dayMap = getMeterNumMap(dataList, ChronoUnit.DAYS);
List<DeviceReport> dayList = new ArrayList<>();
List<DeviceReport> monthList = new ArrayList<>();
// 使用流对每个内部的Map进行排序
dayMap.forEach((key, value) -> {
Map<LocalDateTime, List<DeviceReportEntity>> sortedMap = value.entrySet().stream()
Map<LocalDateTime, List<DeviceReport>> sortedMap = value.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));
@ -435,8 +430,8 @@ public class DealDataTask {
// 按照月区分
//Map<String, Map<LocalDateTime, List<DeviceReportEntity>>> monthMap = getMeterNumMap(dataList, ChronoUnit.MONTHS);
Map<String, Map<YearMonth, List<DeviceReportEntity>>> monthMap = getMeterNumMapByMonth(dataList, ChronoUnit.MONTHS);
List<DeviceReportEntity> monthInsert = getMonthListData(monthList, monthMap);
Map<String, Map<YearMonth, List<DeviceReport>>> monthMap = getMeterNumMapByMonth(dataList, ChronoUnit.MONTHS);
List<DeviceReport> monthInsert = getMonthListData(monthList, monthMap);
dataProcessService.batchInsertOrUpdate(monthInsert, "month");
// 按照年区分
@ -455,32 +450,32 @@ public class DealDataTask {
* @param monthMap
* @return
*/
private List<DeviceReportEntity> getMonthListData(List<DeviceReportEntity> monthList, Map<String, Map<YearMonth, List<DeviceReportEntity>>> monthMap) {
Set<Map.Entry<String, Map<YearMonth, List<DeviceReportEntity>>>> entries = monthMap.entrySet();
for (Map.Entry<String, Map<YearMonth, List<DeviceReportEntity>>> entry : entries) {
private List<DeviceReport> getMonthListData(List<DeviceReport> monthList, Map<String, Map<YearMonth, List<DeviceReport>>> monthMap) {
Set<Map.Entry<String, Map<YearMonth, List<DeviceReport>>>> entries = monthMap.entrySet();
for (Map.Entry<String, Map<YearMonth, List<DeviceReport>>> entry : entries) {
String deviceNum = entry.getKey();
Map<YearMonth, List<DeviceReportEntity>> value = entry.getValue();
List<DeviceReportEntity> deviceList = new ArrayList<>();
List<DeviceReportEntity> monthInsert = new ArrayList<>();
List<DeviceReportEntity> tempList = new ArrayList<>();
Set<Map.Entry<YearMonth, List<DeviceReportEntity>>> monthEntries = value.entrySet();
for (Map.Entry<YearMonth, List<DeviceReportEntity>> monthEntry : monthEntries) {
Map<YearMonth, List<DeviceReport>> value = entry.getValue();
List<DeviceReport> deviceList = new ArrayList<>();
List<DeviceReport> monthInsert = new ArrayList<>();
List<DeviceReport> tempList = new ArrayList<>();
Set<Map.Entry<YearMonth, List<DeviceReport>>> monthEntries = value.entrySet();
for (Map.Entry<YearMonth, List<DeviceReport>> monthEntry : monthEntries) {
//月份
YearMonth key = monthEntry.getKey();
//集合
List<DeviceReportEntity> monthEntryValue = monthEntry.getValue();
List<DeviceReport> monthEntryValue = monthEntry.getValue();
//筛选出最大值和最小值
DeviceReportEntity max = Collections.max(monthEntryValue, Comparator.comparing(DeviceReportEntity::getLocalDateTime));
DeviceReport max = Collections.max(monthEntryValue, Comparator.comparing(DeviceReport::getLocalDateTime));
deviceList.add(max);
}
deviceList.sort(Comparator.comparing(DeviceReportEntity::getLocalDateTime));
deviceList.sort(Comparator.comparing(DeviceReport::getLocalDateTime));
for (int i = 0; i < deviceList.size(); i++) {
String lastValue;
Date lastTime;
if (i == 0) {
DeviceReportEntity entity = deviceList.get(i);
DeviceReportEntity lastEntity = dataProcessService.queryLastValue(deviceNum, "month");
DeviceReport entity = deviceList.get(i);
DeviceReport lastEntity = dataProcessService.queryLastValue(deviceNum, "month");
if (ObjectUtils.isEmpty(lastEntity)) {
lastValue = dataProcessService.queryInitValue(deviceNum);
lastTime = entity.getCurTime();
@ -504,8 +499,8 @@ public class DealDataTask {
} else {
//从上一条取当前读数和当前时间作为当前对象的上一次读数
int lastIndex = i - 1;
DeviceReportEntity lastEntity = tempList.get(lastIndex);
DeviceReportEntity curEntity = deviceList.get(i);
DeviceReport lastEntity = tempList.get(lastIndex);
DeviceReport curEntity = deviceList.get(i);
curEntity.setLastTime(lastEntity.getCurTime());
curEntity.setLastValue(lastEntity.getCurValue());
@ -537,20 +532,20 @@ public class DealDataTask {
* @param tableType
* @return
*/
private List<DeviceReportEntity> getDeviceReportEntities(Map<String, Map<LocalDateTime, List<DeviceReportEntity>>> dayMap,
List<DeviceReportEntity> dayList,
private List<DeviceReport> getDeviceReportEntities(Map<String, Map<LocalDateTime, List<DeviceReport>>> dayMap,
List<DeviceReport> dayList,
String tableType) {
for (Map.Entry<String, Map<LocalDateTime, List<DeviceReportEntity>>> entry : dayMap.entrySet()) {
for (Map.Entry<String, Map<LocalDateTime, List<DeviceReport>>> entry : dayMap.entrySet()) {
//表号
String key = entry.getKey();
Map<LocalDateTime, List<DeviceReportEntity>> value = entry.getValue();
Map<LocalDateTime, List<DeviceReport>> value = entry.getValue();
String deviceType = null;
for (Map.Entry<LocalDateTime, List<DeviceReportEntity>> listEntry : value.entrySet()) {
for (Map.Entry<LocalDateTime, List<DeviceReport>> listEntry : value.entrySet()) {
deviceType = listEntry.getValue().get(0).getDeviceType();
}
//取到的最大值
assert deviceType != null;
List<Map<LocalDateTime, DeviceReportEntity>> dayMapList =
List<Map<LocalDateTime, DeviceReport>> dayMapList =
ComputeEnum.get(Integer.parseInt(deviceType)).getDataList(entry);
dayList = calcListData(dayList, key, tableType, dayMapList);
@ -565,7 +560,7 @@ public class DealDataTask {
* @param interval
* @return
*/
private Map<String, Map<YearMonth, List<DeviceReportEntity>>> getMeterNumMapByMonth(List<DeviceReportEntity> dataList,
private Map<String, Map<YearMonth, List<DeviceReport>>> getMeterNumMapByMonth(List<DeviceReport> dataList,
TemporalUnit interval) {
return dataList.stream()
.map(data -> {
@ -573,7 +568,7 @@ public class DealDataTask {
data.setLocalDateTime(dateTime);
return data;
})
.collect(Collectors.groupingBy(DeviceReportEntity::getDeviceNum,
.collect(Collectors.groupingBy(DeviceReport::getDeviceNum,
Collectors.groupingBy(
report -> YearMonth.from(report.getLocalDateTime()),
LinkedHashMap::new,

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

@ -1,7 +1,7 @@
package com.mh.system.mapper.device;
import com.mh.common.core.domain.entity.CollectionParamsManage;
import com.mh.common.core.domain.entity.DeviceReportEntity;
import com.mh.common.core.domain.entity.DeviceReport;
import org.apache.ibatis.annotations.*;
import java.util.Date;
@ -24,7 +24,14 @@ public interface DataProcessMapper {
"insert into ${tableName}(device_num, device_code, register_address,register_name, cur_value,cur_time,grade,register_id)" +
"values " +
"<foreach collection='batchList' item='item' index='index' separator=','>" +
"(#{item.mtNum},#{item.mtCode},#{item.registerAddr},#{item.otherName},#{item.curValue},#{item.curTime},#{item.grade},#{item.id})" +
"(#{item.mtNum}," +
"#{item.mtCode}," +
"#{item.registerAddr}," +
"#{item.otherName}," +
"cast(#{item.curValue} as numeric(24,2))," +
"#{item.curTime}," +
"#{item.grade}," +
"#{item.id})" +
"</foreach>" +
"</script>")
void batchInsertChiller(@Param("batchList") List<CollectionParamsManage> batchList, @Param("tableName") String tableName);
@ -44,10 +51,10 @@ public interface DataProcessMapper {
@Result(column = "cur_value", property = "lastValue"),
@Result(column = "ratio", property = "ratio")
})
DeviceReportEntity queryLastValue(@Param("deviceNum") String deviceNum, @Param("tableName") String tableName);
DeviceReport queryLastValue(@Param("deviceNum") String deviceNum, @Param("tableName") String tableName);
@Select("select * from ${tableName} where device_num = #{entity.deviceNum} and cur_time = #{entity.curTime} limit 1")
DeviceReportEntity isHaveData(@Param("entity") DeviceReportEntity deviceReportEntity, @Param("tableName") String tableName);
DeviceReport isHaveData(@Param("entity") DeviceReport deviceReport, @Param("tableName") String tableName);
@Update("update ${tableName} set " +
" cur_value = cast(#{entity.curValue} as numeric(24,2))," +
@ -55,7 +62,7 @@ public interface DataProcessMapper {
" calc_value = cast(#{entity.calcValue} as numeric(24,2)), " +
" cur_time = #{entity.curTime}," +
" grade = #{entity.grade} where id = #{entity.id} ")
void updateDataMinByTime(@Param("entity") DeviceReportEntity deviceReportEntity, @Param("tableName") String tableName);
void updateDataMinByTime(@Param("entity") DeviceReport deviceReport, @Param("tableName") String tableName);
/**
* 批量插入数据表中
@ -83,7 +90,7 @@ public interface DataProcessMapper {
")" +
"</foreach>" +
"</script>")
void insertDataMin(@Param("batchList") List<DeviceReportEntity> batchList,
void insertDataMin(@Param("batchList") List<DeviceReport> batchList,
@Param("tableName") String tableName);
/**
@ -93,7 +100,7 @@ public interface DataProcessMapper {
* @return
*/
@Select("select * from ${tableName} where grade = 0 order by cur_time desc")
List<DeviceReportEntity> queryUntreatedData(String tableName);
List<DeviceReport> queryUntreatedData(String tableName);
@Select("select count(1) from ${tableName} where device_num = #{deviceNum} and EXTRACT(YEAR FROM AGE(cur_time, #{curTime})) = 0;")
Integer selectDataByYY(@Param("tableName") String tableName,@Param("curTime") Date curTime,@Param("deviceNum")String deviceNum);
@ -120,23 +127,23 @@ public interface DataProcessMapper {
" cast(#{data.usedValue} as numeric(24,2))," +
" #{data.ratio}," +
" 0)")
void insertTable(@Param("data") DeviceReportEntity data,@Param("tableName") String tableName);
void insertTable(@Param("data") DeviceReport data, @Param("tableName") String tableName);
@Update("update ${tableName} set cur_time = #{data.curTime},cur_value = #{data.curValue},calc_value = (#{data.curValue} - last_value)*ratio,used_value = #{data.curValue} - last_value " +
"where device_num = #{data.deviceNum} and EXTRACT(MONTH FROM AGE(cur_time, #{curTime})) = 0 ")
void updateTableMM(@Param("data") DeviceReportEntity data,@Param("tableName") String tableName);
void updateTableMM(@Param("data") DeviceReport data, @Param("tableName") String tableName);
@Update("update ${tableName} set cur_time = #{data.curTime},cur_value = #{data.curValue},calc_value = (#{data.curValue} - last_value)*ratio,used_value = #{data.curValue} - last_value " +
"where device_num = #{data.deviceNum} and EXTRACT(YEAR FROM AGE(cur_time, #{curTime})) = 0 ")
void updateTableYY(@Param("data") DeviceReportEntity data,@Param("tableName") String tableName);
void updateTableYY(@Param("data") DeviceReport data, @Param("tableName") String tableName);
@Update("update ${tableName} set cur_time = #{data.curTime},cur_value = #{data.curValue},calc_value = (#{data.curValue} - last_value)*ratio,used_value = #{data.curValue} - last_value " +
"where device_num = #{data.deviceNum} and EXTRACT(DAY FROM AGE(cur_time, #{curTime})) = 0 ")
void updateTableDD(@Param("data") DeviceReportEntity data,@Param("tableName") String tableName);
void updateTableDD(@Param("data") DeviceReport data, @Param("tableName") String tableName);
@Update("update ${tableName} set cur_time = #{data.curTime},cur_value = #{data.curValue},calc_value = (#{data.curValue} - last_value)*ratio,used_value = #{data.curValue} - last_value " +
"where device_num = #{data.deviceNum} and EXTRACT(HOUR FROM AGE(cur_time, #{curTime})) = 0 ")
void updateTableHH(@Param("data") DeviceReportEntity data,@Param("tableName") String tableName);
void updateTableHH(@Param("data") DeviceReport data, @Param("tableName") String tableName);
/**
* 批量修改grade

16
mh-system/src/main/java/com/mh/system/mapper/device/DeviceControlLogMapper.java

@ -0,0 +1,16 @@
package com.mh.system.mapper.device;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mh.common.core.domain.entity.DeviceControlLog;
import org.apache.ibatis.annotations.Mapper;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 设备日志控制类
* @date 2025-02-13 17:35:45
*/
@Mapper
public interface DeviceControlLogMapper extends BaseMapper<DeviceControlLog> {
}

12
mh-system/src/main/java/com/mh/system/mapper/energy/EnergyAnalyzeMapper.java

@ -1,13 +1,11 @@
package com.mh.system.mapper.energy;
import com.mh.common.core.domain.ColumnFilter;
import com.mh.common.core.domain.entity.DeviceTypeEnergyEntity;
import com.mh.common.core.domain.entity.DeviceTypeEnergy;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
/**
* @author LJF
@ -68,7 +66,7 @@ public interface EnergyAnalyzeMapper {
" and dh.device_type = #{paramType}" +
"</if>" +
"</script>")
List<DeviceTypeEnergyEntity> queryManyTable(@Param("startTime") String startTime,
List<DeviceTypeEnergy> queryManyTable(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@ -104,7 +102,7 @@ public interface EnergyAnalyzeMapper {
" and dh.device_type = #{paramType}" +
"</if>" +
"</script>")
List<DeviceTypeEnergyEntity> queryOneTable(@Param("startTime") String startTime,
List<DeviceTypeEnergy> queryOneTable(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@ -138,7 +136,7 @@ public interface EnergyAnalyzeMapper {
" dh.device_num, " +
" dm.remark " +
"</script>" )
List<DeviceTypeEnergyEntity> queryDeviceOneTable(@Param("startTime") String startTime,
List<DeviceTypeEnergy> queryDeviceOneTable(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@ -198,7 +196,7 @@ public interface EnergyAnalyzeMapper {
" dh.device_num, " +
" dm.remark " +
"</script>" )
List<DeviceTypeEnergyEntity> queryDeviceManyTable(@Param("startTime") String startTime,
List<DeviceTypeEnergy> queryDeviceManyTable(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,

26
mh-system/src/main/java/com/mh/system/mapper/energy/EnergyMapper.java

@ -1,6 +1,6 @@
package com.mh.system.mapper.energy;
import com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity;
import com.mh.common.core.domain.entity.ConsumptionAnalyze;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@ -56,7 +56,7 @@ public interface EnergyMapper {
" )" +
" group by device_type,convert(varchar(${len}), cur_time, 120)" +
"</script>")
List<ConsumptionAnalyzeEntity> queryManyTable(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryManyTable(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@ -87,7 +87,7 @@ public interface EnergyMapper {
" )" +
" group by device_type,convert(varchar(${len}), cur_time, 120)" +
"</script>")
List<ConsumptionAnalyzeEntity> queryOneTable(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryOneTable(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@ -104,7 +104,7 @@ public interface EnergyMapper {
* @param paramType
* @return
*/
List<ConsumptionAnalyzeEntity> queryManyTableYoy(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryManyTableYoy(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@ -130,7 +130,7 @@ public interface EnergyMapper {
* @param timeType
* @return
*/
List<ConsumptionAnalyzeEntity> queryOneTableYoy(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryOneTableYoy(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@ -152,7 +152,7 @@ public interface EnergyMapper {
* @param timeType
* @return
*/
List<ConsumptionAnalyzeEntity> queryMonthAndYearMom(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryMonthAndYearMom(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("momStartTime") String yoyStartTime,
@Param("momEndTime") String yoyEndTime,
@ -173,7 +173,7 @@ public interface EnergyMapper {
* @param timeType
* @return
*/
List<ConsumptionAnalyzeEntity> queryOneTableMom(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryOneTableMom(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("momStartTime") String yoyStartTime,
@Param("momEndTime") String yoyEndTime,
@ -195,7 +195,7 @@ public interface EnergyMapper {
* @param timeType
* @return
*/
List<ConsumptionAnalyzeEntity> queryManyTableMom(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryManyTableMom(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("momStartTime") String yoyStartTime,
@Param("momEndTime") String yoyEndTime,
@ -215,7 +215,7 @@ public interface EnergyMapper {
* @param deviceType
* @return
*/
List<ConsumptionAnalyzeEntity> queryDeviceOneTable(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryDeviceOneTable(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@ -232,7 +232,7 @@ public interface EnergyMapper {
* @param deviceType
* @return
*/
List<ConsumptionAnalyzeEntity> queryDeviceManyTable(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryDeviceManyTable(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@ -247,7 +247,7 @@ public interface EnergyMapper {
* @param endTime
* @return
*/
List<ConsumptionAnalyzeEntity> queryLineDataSysByOne(@Param("curTable") String curTable,
List<ConsumptionAnalyze> queryLineDataSysByOne(@Param("curTable") String curTable,
@Param("curCopTable") String curCopTable,
@Param("startTime") String startTime,
@Param("endTime") String endTime);
@ -262,7 +262,7 @@ public interface EnergyMapper {
* @param endTime
* @return
*/
List<ConsumptionAnalyzeEntity> queryLineDataSysByMany(@Param("lastTable") String lastTable,
List<ConsumptionAnalyze> queryLineDataSysByMany(@Param("lastTable") String lastTable,
@Param("curTable") String curTable,
@Param("lastCopTable") String lastCopTable,
@Param("curCopTable") String curCopTable,
@ -278,7 +278,7 @@ public interface EnergyMapper {
* @param deviceType
* @return
*/
List<ConsumptionAnalyzeEntity> queryDeviceLineManyTable(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryDeviceLineManyTable(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,

6
mh-system/src/main/java/com/mh/system/mapper/energy/EnergyQueryMapper.java

@ -1,6 +1,6 @@
package com.mh.system.mapper.energy;
import com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity;
import com.mh.common.core.domain.entity.ConsumptionAnalyze;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@ -100,7 +100,7 @@ public interface EnergyQueryMapper {
"</if>" +
" group by device_type,convert(varchar(${len}), cur_time, 120)" +
"</script>")
List<ConsumptionAnalyzeEntity> queryManyTable(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryManyTable(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,
@ -155,7 +155,7 @@ public interface EnergyQueryMapper {
"</if>" +
" group by device_type,convert(varchar(${len}), cur_time, 120)" +
"</script>")
List<ConsumptionAnalyzeEntity> queryOneTable(@Param("startTime") String startTime,
List<ConsumptionAnalyze> queryOneTable(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("lastTableName") String lastTableName,
@Param("curTableName") String curTableName,

16
mh-system/src/main/java/com/mh/system/mapper/mqtt/MqttSubscriptionMapper.java

@ -0,0 +1,16 @@
package com.mh.system.mapper.mqtt;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mh.common.core.domain.entity.MqttSubscription;
import org.apache.ibatis.annotations.Mapper;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description mqtt订阅mapper类
* @date 2025-02-14 14:00:58
*/
@Mapper
public interface MqttSubscriptionMapper extends BaseMapper<MqttSubscription> {
}

30
mh-system/src/main/java/com/mh/system/service/device/IDeviceControlLogService.java

@ -0,0 +1,30 @@
package com.mh.system.service.device;
import com.mh.common.core.domain.entity.DeviceControlLog;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 设备控制日志记录类
* @date 2025-02-13 17:28:39
*/
public interface IDeviceControlLogService {
/**
* 插入值
* @param deviceControlLog
*/
void insertData(DeviceControlLog deviceControlLog);
/**
* 根据查询内容查询
* @param deviceControlLog
* @return
*/
List<DeviceControlLog> findPage(DeviceControlLog deviceControlLog);
}

9
mh-system/src/main/java/com/mh/system/service/device/impl/CollectionParamsManageServiceImpl.java

@ -2,6 +2,7 @@ package com.mh.system.service.device.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mh.common.core.domain.entity.CollectionParamsManage;
import com.mh.common.utils.StringUtils;
import com.mh.system.mapper.device.CollectionParamsManageMapper;
import com.mh.system.mapper.device.DeviceLedgerMapper;
import com.mh.system.mapper.device.GatewayManageMapper;
@ -49,6 +50,14 @@ public class CollectionParamsManageServiceImpl implements ICollectionParamsManag
if (communicationParams.getDeviceLedgerId() != null) {
queryWrapper.eq("device_ledger_id", communicationParams.getDeviceLedgerId());
}
// 根据系统类型查询对应系统的状态
if (!StringUtils.isEmpty(communicationParams.getSystemType())) {
queryWrapper.eq("system_type", communicationParams.getSystemType());
}
// 根据点位参数类型
if (!StringUtils.isEmpty(communicationParams.getParamType())) {
queryWrapper.eq("param_type", communicationParams.getParamType());
}
queryWrapper.orderByDesc("cur_time");
return collectionParamsManageMapper.selectList(queryWrapper);
}

33
mh-system/src/main/java/com/mh/system/service/device/impl/DeviceControlLogServiceImpl.java

@ -0,0 +1,33 @@
package com.mh.system.service.device.impl;
import com.mh.common.core.domain.entity.DeviceControlLog;
import com.mh.system.mapper.device.DeviceControlLogMapper;
import com.mh.system.service.device.IDeviceControlLogService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 设备日志控制实现类
* @date 2025-02-13 17:34:43
*/
@Service
public class DeviceControlLogServiceImpl implements IDeviceControlLogService {
@Resource
private DeviceControlLogMapper deviceControlLogMapper;
@Override
public void insertData(DeviceControlLog deviceControlLog) {
deviceControlLogMapper.insert(deviceControlLog);
}
@Override
public List<DeviceControlLog> findPage(DeviceControlLog deviceControlLog) {
return List.of();
}
}

62
mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyAnalyzeServiceImpl.java

@ -2,14 +2,12 @@ package com.mh.system.service.energy.impl;
import com.alibaba.fastjson2.JSONObject;
import com.mh.common.constant.Constants;
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.entity.CollectionParamsManage;
import com.mh.common.core.domain.entity.DeviceTypeEnergyEntity;
import com.mh.common.core.domain.entity.DeviceTypeEnergy;
import com.mh.common.core.domain.vo.EnergyQueryVO;
import com.mh.common.utils.DateUtils;
import com.mh.system.domain.SysOperLog;
import com.mh.system.mapper.device.CollectionParamsManageMapper;
import com.mh.system.mapper.energy.EnergyAnalyzeMapper;
import com.mh.system.service.energy.EnergyAnalyzeService;
@ -45,7 +43,7 @@ public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService {
AtomicReference<String> lastTableName = new AtomicReference<>("data_" + vo.getTimeType());
AtomicReference<String> curTableName = new AtomicReference<>("data_" + vo.getTimeType());
String timeType = vo.getTimeType();
List<DeviceTypeEnergyEntity> deviceTypeEnergyEntities = null;
List<DeviceTypeEnergy> deviceTypeEnergyEntities = null;
// 表格数据
if ("month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType)) {
// 单表
@ -67,13 +65,13 @@ public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService {
// 开始进行分组
// 通过device_manage的grade进行分组,分为四类:0-9:冷水机,10-19:冷冻泵,20-29:冷却泵,30-39:冷却塔
HashMap<String, BigDecimal> result = deviceTypeEnergyEntities.stream()
.collect(Collectors.groupingBy(DeviceTypeEnergyEntity::getDeviceTypeRange))
.collect(Collectors.groupingBy(DeviceTypeEnergy::getDeviceTypeRange))
.entrySet().stream().collect(Collectors.toMap(
Map.Entry<String, List<DeviceTypeEnergyEntity>>::getKey,
Map.Entry<String, List<DeviceTypeEnergy>>::getKey,
entry -> {
List<DeviceTypeEnergyEntity> value = entry.getValue();
List<DeviceTypeEnergy> value = entry.getValue();
BigDecimal sum = new BigDecimal("0");
for (DeviceTypeEnergyEntity deviceTypeEnergyEntity : value) {
for (DeviceTypeEnergy deviceTypeEnergyEntity : value) {
sum = sum.add(new BigDecimal(deviceTypeEnergyEntity.getCalcValue()));
}
return sum;
@ -95,16 +93,16 @@ public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService {
}
// 查询各个冷水机组的 0-9
List<DeviceTypeEnergyEntity> chiller = createDeviceTypeData(deviceTypeEnergyEntities, 10, 0);
List<DeviceTypeEnergy> chiller = createDeviceTypeData(deviceTypeEnergyEntities, 10, 0);
// 查询各个冷冻泵的 10-19
List<DeviceTypeEnergyEntity> chillerPump = createDeviceTypeData(deviceTypeEnergyEntities, 20, 10);
List<DeviceTypeEnergy> chillerPump = createDeviceTypeData(deviceTypeEnergyEntities, 20, 10);
// 查询各个冷却泵的 20-29
List<DeviceTypeEnergyEntity> coolPump = createDeviceTypeData(deviceTypeEnergyEntities, 30, 20);
List<DeviceTypeEnergy> coolPump = createDeviceTypeData(deviceTypeEnergyEntities, 30, 20);
// 查询各个冷却塔的 30-39
List<DeviceTypeEnergyEntity> coolTower = createDeviceTypeData(deviceTypeEnergyEntities, 40, 30);
List<DeviceTypeEnergy> coolTower = createDeviceTypeData(deviceTypeEnergyEntities, 40, 30);
// 从device_manage查询不是总表的
List<CollectionParamsManage> deviceByOther = collectionParamsManageMapper.getDeviceByOther(null);
@ -157,7 +155,7 @@ public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService {
AtomicReference<String> lastTableName = new AtomicReference<>("data_" + vo.getTimeType());
AtomicReference<String> curTableName = new AtomicReference<>("data_" + vo.getTimeType());
String timeType = vo.getTimeType();
List<DeviceTypeEnergyEntity> deviceTypeEnergyEntities = null;
List<DeviceTypeEnergy> deviceTypeEnergyEntities = null;
// 表格数据
if ("month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType)) {
// 单表
@ -177,23 +175,23 @@ public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService {
return List.of();
}
// 分组拿出各个设备
Map<String, List<DeviceTypeEnergyEntity>> deviceNumMap = deviceTypeEnergyEntities.stream()
.sorted(Comparator.comparing(DeviceTypeEnergyEntity::getTimeStr))
.collect(Collectors.groupingBy(DeviceTypeEnergyEntity::getDeviceNum));
Map<String, List<DeviceTypeEnergy>> deviceNumMap = deviceTypeEnergyEntities.stream()
.sorted(Comparator.comparing(DeviceTypeEnergy::getTimeStr))
.collect(Collectors.groupingBy(DeviceTypeEnergy::getDeviceNum));
List<String> title = new ArrayList<>();
List<String> timeStr = new ArrayList<>();
List<ColumnData> columnData = new ArrayList<>();
// 组装对应需要查询的数据
int i = 0;
for (Map.Entry<String, List<DeviceTypeEnergyEntity>> stringListEntry : deviceNumMap.entrySet()) {
for (Map.Entry<String, List<DeviceTypeEnergy>> stringListEntry : deviceNumMap.entrySet()) {
title.add(stringListEntry.getKey());
List<DeviceTypeEnergyEntity> value = stringListEntry.getValue();
List<DeviceTypeEnergy> value = stringListEntry.getValue();
ColumnData column = new ColumnData();
column.setName(stringListEntry.getKey());
for (DeviceTypeEnergyEntity deviceTypeEnergyEntity : value) {
for (DeviceTypeEnergy deviceTypeEnergy : value) {
if (i == 0) {
timeStr.add(deviceTypeEnergyEntity.getTimeStr());
timeStr.add(deviceTypeEnergy.getTimeStr());
} else {
break;
}
@ -230,11 +228,11 @@ public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService {
return new ArrayList<>(map.entrySet());
}
private static String[] getArr(List<DeviceTypeEnergyEntity> copLineData, String[] lineTimeStrArr) {
private static String[] getArr(List<DeviceTypeEnergy> copLineData, String[] lineTimeStrArr) {
String[] lineCopArr = new String[lineTimeStrArr.length];
for (int i = 0; i < lineTimeStrArr.length; i++) {
int j = i;
Optional<DeviceTypeEnergyEntity> first = copLineData.stream().filter(s -> lineTimeStrArr[j].equalsIgnoreCase(s.getTimeStr())).findFirst();
Optional<DeviceTypeEnergy> first = copLineData.stream().filter(s -> lineTimeStrArr[j].equalsIgnoreCase(s.getTimeStr())).findFirst();
if (first.isPresent()) {
lineCopArr[i] = first.get().getCalcValue();
} else {
@ -244,9 +242,9 @@ public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService {
return lineCopArr;
}
private static List<ColumnFilter> getResultData(List<DeviceTypeEnergyEntity> coolTower) {
private static List<ColumnFilter> getResultData(List<DeviceTypeEnergy> coolTower) {
return coolTower.stream()
.sorted(Comparator.comparing(DeviceTypeEnergyEntity::getGrade))
.sorted(Comparator.comparing(DeviceTypeEnergy::getGrade))
.map(val -> {
ColumnFilter data = new ColumnFilter();
data.setName(val.getRemark());
@ -256,7 +254,7 @@ public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService {
}).collect(Collectors.toList());
}
private static void reassignData(List<DeviceTypeEnergyEntity> chiller, CollectionParamsManage deviceManageEntity) {
private static void reassignData(List<DeviceTypeEnergy> chiller, CollectionParamsManage deviceManageEntity) {
chiller.stream()
.filter(val -> val.getDeviceNum().equals(deviceManageEntity.getMtNum()))
.peek(val -> {
@ -264,20 +262,20 @@ public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService {
val.setRemark(deviceManageEntity.getRemark());
val.setGrade(String.valueOf(deviceManageEntity.getGrade()));
})
.sorted(Comparator.comparing(DeviceTypeEnergyEntity::getGrade))
.sorted(Comparator.comparing(DeviceTypeEnergy::getGrade))
.collect(Collectors.toList());
}
private static List<DeviceTypeEnergyEntity> createDeviceTypeData(List<DeviceTypeEnergyEntity> deviceTypeEnergyEntities, int x, int x1) {
private static List<DeviceTypeEnergy> createDeviceTypeData(List<DeviceTypeEnergy> 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)))
.collect(Collectors.groupingBy(DeviceTypeEnergy::getDeviceNum, Collectors.summarizingDouble(DeviceTypeEnergy::getDoubleCalcValue)))
.entrySet().stream()
.map(entry -> {
DeviceTypeEnergyEntity deviceTypeEnergyEntity = new DeviceTypeEnergyEntity();
deviceTypeEnergyEntity.setCalcValue(String.valueOf(entry.getValue().getSum()));
deviceTypeEnergyEntity.setDeviceNum(entry.getKey());
return deviceTypeEnergyEntity;
DeviceTypeEnergy deviceTypeEnergy = new DeviceTypeEnergy();
deviceTypeEnergy.setCalcValue(String.valueOf(entry.getValue().getSum()));
deviceTypeEnergy.setDeviceNum(entry.getKey());
return deviceTypeEnergy;
})
.collect(Collectors.toList());
}

24
mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyQueryServiceImpl.java

@ -1,7 +1,7 @@
package com.mh.system.service.energy.impl;
import com.mh.common.core.domain.AjaxResult;
import com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity;
import com.mh.common.core.domain.entity.ConsumptionAnalyze;
import com.mh.common.core.domain.vo.EnergyQueryVO;
import com.mh.common.utils.DateUtils;
import com.mh.system.mapper.device.CollectionParamsManageMapper;
@ -42,7 +42,7 @@ public class EnergyQueryServiceImpl implements IEnergyQueryService {
// 判断是否有总表
boolean haveMeter = collectionParamsManageMapper.selectSummary(40, "meter") != 0;
boolean haveCloud = collectionParamsManageMapper.selectSummary(40, "cloud") != 0;
List<ConsumptionAnalyzeEntity> consumptionAnalyzeEntities = null;
List<ConsumptionAnalyze> consumptionAnalyzeEntities = null;
// 表格数据
if ("month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType)) {
// 单表
@ -62,14 +62,14 @@ public class EnergyQueryServiceImpl implements IEnergyQueryService {
return AjaxResult.success();
}
// 分组并按时间排序操作,拿到冷量记和电表数据
Map<String, List<ConsumptionAnalyzeEntity>> collect = consumptionAnalyzeEntities.stream()
Map<String, List<ConsumptionAnalyze>> collect = consumptionAnalyzeEntities.stream()
.parallel()
.collect(Collectors.groupingBy(ConsumptionAnalyzeEntity::getDeviceType, HashMap::new, Collectors
.collect(Collectors.groupingBy(ConsumptionAnalyze::getDeviceType, HashMap::new, Collectors
.collectingAndThen(Collectors.toList(),
list -> list.stream().sorted(Comparator.comparing(ConsumptionAnalyzeEntity::getTimeStr)).collect(Collectors.toList()))));
List<ConsumptionAnalyzeEntity> meterData = new ArrayList<>();
List<ConsumptionAnalyzeEntity> coldData = new ArrayList<>();
for (Map.Entry<String, List<ConsumptionAnalyzeEntity>> nmap : collect.entrySet()) {
list -> list.stream().sorted(Comparator.comparing(ConsumptionAnalyze::getTimeStr)).collect(Collectors.toList()))));
List<ConsumptionAnalyze> meterData = new ArrayList<>();
List<ConsumptionAnalyze> coldData = new ArrayList<>();
for (Map.Entry<String, List<ConsumptionAnalyze>> nmap : collect.entrySet()) {
// 获取电表的值
if (nmap.getKey().equalsIgnoreCase("meter")) {
meterData = nmap.getValue();
@ -81,10 +81,10 @@ public class EnergyQueryServiceImpl implements IEnergyQueryService {
}
String[] copArr = new String[meterData.size()];
String[] timeStrArr = meterData.stream()
.map(ConsumptionAnalyzeEntity::getTimeStr)
.map(ConsumptionAnalyze::getTimeStr)
.toArray(String[]::new);
String[] meterArr = meterData.stream()
.map(ConsumptionAnalyzeEntity::getCurValue)
.map(ConsumptionAnalyze::getCurValue)
.toArray(String[]::new);
String[] coldArr = getArr(coldData, timeStrArr);
// 计算COP=制冷量/耗电量
@ -141,11 +141,11 @@ public class EnergyQueryServiceImpl implements IEnergyQueryService {
return AjaxResult.success(listData);
}
private static String[] getArr(List<ConsumptionAnalyzeEntity> copLineData, String[] lineTimeStrArr) {
private static String[] getArr(List<ConsumptionAnalyze> copLineData, String[] lineTimeStrArr) {
String[] lineCopArr = new String[lineTimeStrArr.length];
for (int i = 0; i < lineTimeStrArr.length; i++) {
int j = i;
Optional<ConsumptionAnalyzeEntity> first = copLineData.stream().filter(s -> lineTimeStrArr[j].equalsIgnoreCase(s.getTimeStr())).findFirst();
Optional<ConsumptionAnalyze> first = copLineData.stream().filter(s -> lineTimeStrArr[j].equalsIgnoreCase(s.getTimeStr())).findFirst();
if (first.isPresent()) {
lineCopArr[i] = first.get().getCurValue();
} else {

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

@ -2,7 +2,7 @@ package com.mh.system.service.energy.impl;
import com.mh.common.core.domain.AjaxResult;
import com.mh.common.core.domain.dto.EnergyConsumptionDTO;
import com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity;
import com.mh.common.core.domain.entity.ConsumptionAnalyze;
import com.mh.common.core.domain.vo.EnergyConsumptionVO;
import com.mh.common.utils.DateUtils;
import com.mh.common.utils.EnergyThreadPoolService;
@ -44,7 +44,7 @@ public class EnergyServiceImpl implements IEnergyService {
CountDownLatch latch = new CountDownLatch(2);
List<Future<Map<String, Object>>> futures = new ArrayList<>();
futures.add(executor.submit(() -> {
List<ConsumptionAnalyzeEntity> consumptionAnalyzeEntities;
List<ConsumptionAnalyze> consumptionAnalyzeEntities;
if ("month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType)) {
// 单表
consumptionAnalyzeEntities = energyMapper.queryDeviceOneTable(vo.getStartTime(), vo.getEndTime(), lastTableName.get(), curTableName.get(), getTimeLen(vo.getTimeType()), vo.getDeviceType());
@ -60,10 +60,10 @@ public class EnergyServiceImpl implements IEnergyService {
}
// 组装赋值
String[] timeStrArr = consumptionAnalyzeEntities.stream()
.map(ConsumptionAnalyzeEntity::getTimeStr)
.map(ConsumptionAnalyze::getTimeStr)
.toArray(String[]::new);
String[] meterArr = consumptionAnalyzeEntities.stream()
.map(ConsumptionAnalyzeEntity::getCurValue)
.map(ConsumptionAnalyze::getCurValue)
.toArray(String[]::new);
Map<String, Object> map = new HashMap<>();
map.put("timeStrArr", timeStrArr);
@ -76,17 +76,17 @@ public class EnergyServiceImpl implements IEnergyService {
// 多表
String lastTable = "data_min" + vo.getStartTime().substring(0,4);
String curTable = "data_min" + vo.getEndTime().substring(0,4);
List<ConsumptionAnalyzeEntity> consumptionAnalyzeEntities = energyMapper.queryDeviceLineManyTable(vo.getStartTime(), vo.getEndTime(), lastTable, curTable, vo.getDeviceType());
List<ConsumptionAnalyze> consumptionAnalyzeEntities = energyMapper.queryDeviceLineManyTable(vo.getStartTime(), vo.getEndTime(), lastTable, curTable, vo.getDeviceType());
if (null == consumptionAnalyzeEntities || consumptionAnalyzeEntities.size() == 0) {
latch.countDown();
return null;
}
// 组装赋值
String[] timeStrArr = consumptionAnalyzeEntities.stream()
.map(ConsumptionAnalyzeEntity::getTimeStr)
.map(ConsumptionAnalyze::getTimeStr)
.toArray(String[]::new);
String[] meterArr = consumptionAnalyzeEntities.stream()
.map(ConsumptionAnalyzeEntity::getCurValue)
.map(ConsumptionAnalyze::getCurValue)
.toArray(String[]::new);
Map<String, Object> map = new HashMap<>();
map.put("timeStrLineArr", timeStrArr);
@ -141,7 +141,7 @@ public class EnergyServiceImpl implements IEnergyService {
CountDownLatch latch = new CountDownLatch(2);
List<Future<Map<String, Object>>> futures = new ArrayList<>();
futures.add(executor.submit(() -> {
List<ConsumptionAnalyzeEntity> consumptionAnalyzeEntities = null;
List<ConsumptionAnalyze> consumptionAnalyzeEntities = null;
// 表格数据
if ("month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType)) {
// 单表
@ -162,14 +162,14 @@ public class EnergyServiceImpl implements IEnergyService {
return null;
}
// 分组并按时间排序操作,拿到冷量记和电表数据
Map<String, List<ConsumptionAnalyzeEntity>> collect = consumptionAnalyzeEntities.stream()
Map<String, List<ConsumptionAnalyze>> collect = consumptionAnalyzeEntities.stream()
.parallel()
.collect(Collectors.groupingBy(ConsumptionAnalyzeEntity::getDeviceType, HashMap::new, Collectors
.collect(Collectors.groupingBy(ConsumptionAnalyze::getDeviceType, HashMap::new, Collectors
.collectingAndThen(Collectors.toList(),
list -> list.stream().sorted(Comparator.comparing(ConsumptionAnalyzeEntity::getTimeStr)).collect(Collectors.toList()))));
List<ConsumptionAnalyzeEntity> meterData = new ArrayList<>();
List<ConsumptionAnalyzeEntity> coldData = new ArrayList<>();
for (Map.Entry<String, List<ConsumptionAnalyzeEntity>> nmap : collect.entrySet()) {
list -> list.stream().sorted(Comparator.comparing(ConsumptionAnalyze::getTimeStr)).collect(Collectors.toList()))));
List<ConsumptionAnalyze> meterData = new ArrayList<>();
List<ConsumptionAnalyze> coldData = new ArrayList<>();
for (Map.Entry<String, List<ConsumptionAnalyze>> nmap : collect.entrySet()) {
// 获取电表的值
if (nmap.getKey().equalsIgnoreCase("meter")) {
meterData = nmap.getValue();
@ -181,10 +181,10 @@ public class EnergyServiceImpl implements IEnergyService {
}
String[] copArr = new String[meterData.size()];
String[] timeStrArr = meterData.stream()
.map(ConsumptionAnalyzeEntity::getTimeStr)
.map(ConsumptionAnalyze::getTimeStr)
.toArray(String[]::new);
String[] meterArr = meterData.stream()
.map(ConsumptionAnalyzeEntity::getCurValue)
.map(ConsumptionAnalyze::getCurValue)
.toArray(String[]::new);
String[] coldArr = getArr(coldData, timeStrArr);
// 计算COP=制冷量/耗电量
@ -210,7 +210,7 @@ public class EnergyServiceImpl implements IEnergyService {
}));
futures.add(executor.submit(() -> {
// 折线图数据,都是查询的分钟表,最低颗粒度
List<ConsumptionAnalyzeEntity> lineData;
List<ConsumptionAnalyze> lineData;
String lastTable = "data_min" + vo.getStartTime().substring(0, 4);
String curTable = "data_min" + vo.getEndTime().substring(0, 4);
String lastCopTable = "data_min_cop";
@ -227,17 +227,17 @@ public class EnergyServiceImpl implements IEnergyService {
return null;
}
// 分组并按时间排序操作,拿到冷量记,电表,cop数据
Map<String, List<ConsumptionAnalyzeEntity>> collectLine = lineData.stream()
Map<String, List<ConsumptionAnalyze>> collectLine = lineData.stream()
.parallel()
.collect(Collectors.groupingBy(ConsumptionAnalyzeEntity::getDeviceType, HashMap::new, Collectors
.collect(Collectors.groupingBy(ConsumptionAnalyze::getDeviceType, HashMap::new, Collectors
.collectingAndThen(Collectors.toList(),
list -> list.stream().sorted(Comparator.comparing(ConsumptionAnalyzeEntity::getTimeStr)).collect(Collectors.toList()))));
list -> list.stream().sorted(Comparator.comparing(ConsumptionAnalyze::getTimeStr)).collect(Collectors.toList()))));
// List<ConsumptionAnalyzeEntity> meterLineData = new ArrayList<>();
// List<ConsumptionAnalyzeEntity> coldLineData = new ArrayList<>();
// List<ConsumptionAnalyzeEntity> copLineData = new ArrayList<>();
List<ConsumptionAnalyzeEntity> efrColdLineData = new ArrayList<>();
List<ConsumptionAnalyzeEntity> efrMeterLineData = new ArrayList<>();
for (Map.Entry<String, List<ConsumptionAnalyzeEntity>> nmap : collectLine.entrySet()) {
List<ConsumptionAnalyze> efrColdLineData = new ArrayList<>();
List<ConsumptionAnalyze> efrMeterLineData = new ArrayList<>();
for (Map.Entry<String, List<ConsumptionAnalyze>> nmap : collectLine.entrySet()) {
// // 获取电表的值
// if (nmap.getKey().equalsIgnoreCase("meter")) {
// meterLineData = nmap.getValue();
@ -260,7 +260,7 @@ public class EnergyServiceImpl implements IEnergyService {
}
}
String[] lineTimeStrArr = efrMeterLineData.stream()
.map(ConsumptionAnalyzeEntity::getTimeStr)
.map(ConsumptionAnalyze::getTimeStr)
.toArray(String[]::new);
// String[] lineMeterArr = meterLineData.stream()
// .map(ConsumptionAnalyzeEntity::getCurValue)
@ -346,11 +346,11 @@ public class EnergyServiceImpl implements IEnergyService {
return AjaxResult.success(energyConsumptionDTO);
}
private static String[] getArr(List<ConsumptionAnalyzeEntity> copLineData, String[] lineTimeStrArr) {
private static String[] getArr(List<ConsumptionAnalyze> copLineData, String[] lineTimeStrArr) {
String[] lineCopArr = new String[lineTimeStrArr.length];
for (int i = 0; i < lineTimeStrArr.length; i++) {
int j = i;
Optional<ConsumptionAnalyzeEntity> first = copLineData.stream().filter(s -> lineTimeStrArr[j].equalsIgnoreCase(s.getTimeStr())).findFirst();
Optional<ConsumptionAnalyze> first = copLineData.stream().filter(s -> lineTimeStrArr[j].equalsIgnoreCase(s.getTimeStr())).findFirst();
if (first.isPresent()) {
lineCopArr[i] = first.get().getCurValue();
} else {
@ -363,7 +363,7 @@ public class EnergyServiceImpl implements IEnergyService {
@Override
public AjaxResult yoy(EnergyConsumptionVO vo) {
// 获取今年的值
List<ConsumptionAnalyzeEntity> consumptionAnalyzeEntities;
List<ConsumptionAnalyze> consumptionAnalyzeEntities;
String lastTableName = "data_"+vo.getTimeType();
String curTableName = "data_"+vo.getTimeType();
String startTime = vo.getStartTime();
@ -410,7 +410,7 @@ public class EnergyServiceImpl implements IEnergyService {
@Override
public AjaxResult mom(EnergyConsumptionVO vo) {
List<ConsumptionAnalyzeEntity> consumptionAnalyzeEntities = null;
List<ConsumptionAnalyze> consumptionAnalyzeEntities = null;
// 开始时间和结束时间都往前-1月或者年
String startTime = DateUtils.momDate(vo.getStartTime(), vo.getTimeType(), "start");
String endTime = DateUtils.momDate(vo.getEndTime(), vo.getTimeType(), "end");
@ -526,7 +526,7 @@ public class EnergyServiceImpl implements IEnergyService {
return AjaxResult.success(null);
}
private static AjaxResult getConsumptionDTOHttpResult(List<ConsumptionAnalyzeEntity> consumptionAnalyzeEntities, String compareType) {
private static AjaxResult getConsumptionDTOHttpResult(List<ConsumptionAnalyze> consumptionAnalyzeEntities, String compareType) {
EnergyConsumptionDTO energyConsumptionDTO = new EnergyConsumptionDTO();
if (null == consumptionAnalyzeEntities || consumptionAnalyzeEntities.size() == 0) {
return AjaxResult.success();
@ -537,7 +537,7 @@ public class EnergyServiceImpl implements IEnergyService {
String[] timeStrArr = new String[consumptionAnalyzeEntities.size()];
String[] titleArr = new String[]{"curValue", "lastValue", compareType};
for (int i = 0; i < consumptionAnalyzeEntities.size(); i++) {
ConsumptionAnalyzeEntity entity = consumptionAnalyzeEntities.get(i);
ConsumptionAnalyze entity = consumptionAnalyzeEntities.get(i);
lastValue[i] = entity.getLastValue();
curValue[i] = entity.getCurValue();
if ("yoy".equalsIgnoreCase(compareType)) {

26
mh-system/src/main/java/com/mh/system/service/mqtt/IMqttSubscriptionService.java

@ -0,0 +1,26 @@
package com.mh.system.service.mqtt;
import com.mh.common.core.domain.entity.MqttSubscription;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description mqtt订阅管理
* @date 2025-02-14 13:58:37
*/
public interface IMqttSubscriptionService {
List<MqttSubscription> selectMqttSubList(MqttSubscription mqttSubscription);
MqttSubscription selectMqttSubById(String msId);
int insertMqttSub(MqttSubscription mqttSubscription);
int updateMqttSub(MqttSubscription mqttSubscription);
int deleteMqttSubByIds(String[] msIds);
}

73
mh-system/src/main/java/com/mh/system/service/mqtt/impl/MqttSubscriptionServiceImpl.java

@ -0,0 +1,73 @@
package com.mh.system.service.mqtt.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mh.common.core.domain.entity.MqttSubscription;
import com.mh.common.utils.StringUtils;
import com.mh.system.mapper.mqtt.MqttSubscriptionMapper;
import com.mh.system.service.mqtt.IMqttSubscriptionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description mqtt订阅实现类
* @date 2025-02-14 13:59:27
*/
@Service
public class MqttSubscriptionServiceImpl implements IMqttSubscriptionService {
private final MqttSubscriptionMapper mqttSubscriptionMapper;
@Autowired
public MqttSubscriptionServiceImpl(MqttSubscriptionMapper mqttSubscriptionMapper) {
this.mqttSubscriptionMapper = mqttSubscriptionMapper;
}
@Override
public List<MqttSubscription> selectMqttSubList(MqttSubscription mqttSubscription) {
if (mqttSubscription == null) {
return List.of();
}
QueryWrapper<MqttSubscription> queryWrapper = new QueryWrapper<>();
// 订阅主题
if (!StringUtils.isEmpty(mqttSubscription.getTopic())) {
queryWrapper.like("topic", mqttSubscription.getTopic());
}
// 状态
if (!StringUtils.isEmpty(mqttSubscription.getStatus())) {
queryWrapper.eq("status", mqttSubscription.getStatus());
}
queryWrapper.orderByDesc("create_time");
return mqttSubscriptionMapper.selectList(queryWrapper);
}
@Override
public MqttSubscription selectMqttSubById(String msId) {
return mqttSubscriptionMapper.selectById(msId);
}
@Override
public int insertMqttSub(MqttSubscription mqttSubscription) {
return mqttSubscriptionMapper.insert(mqttSubscription);
}
@Override
public int updateMqttSub(MqttSubscription mqttSubscription) {
return mqttSubscriptionMapper.updateById(mqttSubscription);
}
@Override
public int deleteMqttSubByIds(String[] msIds) {
if (msIds != null && msIds.length > 0) {
for (String msId : msIds) {
mqttSubscriptionMapper.deleteById(msId);
}
return msIds.length;
}
return 0;
}
}

19
mh-system/src/main/java/com/mh/system/service/operation/IOperationDeviceService.java

@ -0,0 +1,19 @@
package com.mh.system.service.operation;
import com.mh.common.core.domain.AjaxResult;
import com.mh.common.core.domain.entity.OrderEntity;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 操作设备服务类
* @date 2025-02-14 09:30:47
*/
public interface IOperationDeviceService {
String operationDevice(List<OrderEntity> changeValues);
}

59
mh-system/src/main/java/com/mh/system/service/operation/impl/OperationDeviceServiceImpl.java

@ -0,0 +1,59 @@
package com.mh.system.service.operation.impl;
import com.alibaba.fastjson2.JSONObject;
import com.mh.common.constant.Constants;
import com.mh.common.core.domain.entity.OrderEntity;
import com.mh.common.model.request.AdvantechDatas;
import com.mh.common.model.response.AdvantechResponse;
import com.mh.common.utils.DateUtils;
import com.mh.system.service.operation.IOperationDeviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 设备操作实现类
* @date 2025-02-14 09:32:34
*/
@Slf4j
@Service
public class OperationDeviceServiceImpl implements IOperationDeviceService {
@Override
public String operationDevice(List<OrderEntity> changeValues) {
// 拼接发送的报文
AdvantechResponse<AdvantechDatas> sendData = new AdvantechResponse<>();
try {
List<AdvantechDatas> advantechDatas = getAdvantechDatas(changeValues);
sendData.setW(advantechDatas);
sendData.setTs(DateUtils.dateToTsStr());
} catch (Exception e) {
log.error("发送mqtt控制设备指令失败", e);
return Constants.FAIL;
}
return JSONObject.toJSONString(sendData);
}
private static List<AdvantechDatas> getAdvantechDatas(List<OrderEntity> changeValues) {
List<AdvantechDatas> advantechDatas = new ArrayList<>();
for (OrderEntity changeValue : changeValues) {
// 获取报文
String message = changeValue.getParam();
// 获取报文类型
Integer type = changeValue.getType();
// 获取报文其他信息
String otherName = changeValue.getOtherName();
// 发送报文
AdvantechDatas data = new AdvantechDatas();
data.setTag(otherName);
data.setValue(message);
advantechDatas.add(data);
}
return advantechDatas;
}
}

22
mh-system/src/main/resources/mapper/system/EnergyMapper.xml

@ -62,7 +62,7 @@
order by timeStr
</sql>
<select id="queryOneTableYoy" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity">
<select id="queryOneTableYoy" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyze">
select b.timeStr,b.deviceType,b.sumValue as curValue, a.sumValue as lastValue,
case when a.sumValue > 0 then concat(convert(decimal(18,2),(b.sumValue - a.sumValue)/a.sumValue*100),'%') else '同期无数据' end yoy from (
select
@ -116,7 +116,7 @@
<include refid="commonYOYWhereSql"/>
</select>
<select id="queryManyTableYoy" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity">
<select id="queryManyTableYoy" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyze">
select b.timeStr,b.deviceType,b.sumValue as curValue, a.sumValue as lastValue,
case when a.sumValue > 0 then concat(convert(decimal(18,2),(b.sumValue - a.sumValue)/a.sumValue*100),'%') else '同期无数据' end yoy from (
select sum(calc_value) as sumValue,device_type as deviceType,convert(varchar(${len}), cur_time, 120) as timeStr,
@ -170,7 +170,7 @@
<include refid="commonYOYWhereSql"/>
</select>
<select id="queryMonthAndYearMom" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity">
<select id="queryMonthAndYearMom" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyze">
select
t1.timeStr,
t1.sumValue as curValue,
@ -255,7 +255,7 @@
order by timeStr
</select>
<!-- <select id="queryMonthAndYearMom" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity">-->
<!-- <select id="queryMonthAndYearMom" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyze">-->
<!-- select-->
<!-- t1.timeStr,-->
<!-- t1.sumValue as curValue,-->
@ -318,7 +318,7 @@
<!-- order by timeStr-->
<!-- </select>-->
<select id="queryOneTableMom" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity">
<select id="queryOneTableMom" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyze">
select
t1.timeStr,
t1.sumValue as curValue,
@ -395,7 +395,7 @@
order by timeStr
</select>
<select id="queryManyTableMom" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity">
<select id="queryManyTableMom" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyze">
select
t1.timeStr,
t1.sumValue as curValue,
@ -487,7 +487,7 @@
order by timeStr
</select>
<select id="queryDeviceOneTable" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity">
<select id="queryDeviceOneTable" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyze">
select
sum(calc_value) as curValue,
device_type as deviceType,
@ -528,7 +528,7 @@
order by timeStr
</select>
<select id="queryDeviceManyTable" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity">
<select id="queryDeviceManyTable" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyze">
<if test="lastTableName != curTableName">
select
sum(calc_value) as curValue,
@ -605,7 +605,7 @@
order by timeStr
</select>
<select id="queryLineDataSysByOne" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity">
<select id="queryLineDataSysByOne" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyze">
select sum(isnull(calc_value,0.00)) as curValue, 'efrMeter' as device_type, convert(varchar(16),cur_time,20) as timeStr from ${curTable} dy
where cur_time >= #{startTime} and cur_time &lt;= #{endTime}
and exists (
@ -650,7 +650,7 @@
group by device_type, cur_time
</select>
<select id="queryLineDataSysByMany" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity">
<select id="queryLineDataSysByMany" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyze">
select sum(isnull(calc_value,0.00)) as curValue, 'efrMeter' as device_type, convert(varchar(16),cur_time,20) as timeStr from ${lastTable} dy
where cur_time >= #{startTime} and cur_time &lt;= #{endTime}
and exists (
@ -733,7 +733,7 @@
group by device_type, cur_time
</select>
<select id="queryDeviceLineManyTable" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyzeEntity">
<select id="queryDeviceLineManyTable" resultType="com.mh.common.core.domain.entity.ConsumptionAnalyze">
<if test="lastTableName != curTableName">
select
sum(calc_value) as curValue,

59
sql/表结构设计.sql

@ -471,3 +471,62 @@ CREATE INDEX idx_alarm_rules_event_type ON alarm_rules (event_type);
CREATE INDEX idx_alarm_rules_alarm_level ON alarm_rules (alarm_level);
CREATE INDEX idx_alarm_rules_alarm_type ON alarm_rules (alarm_type);
CREATE INDEX idx_alarm_rules_create_time_desc ON alarm_rules (create_time DESC);
-- 2025-02-13
ALTER TABLE public.collection_params_manage ADD param_type varchar NULL;
COMMENT ON COLUMN public.collection_params_manage.param_type IS '参数类型:0:运行状态,1:启停状态,2:频率调节,3:频率反馈';
ALTER TABLE public.collection_params_manage RENAME COLUMN param_id TO communication_param_id;
COMMENT ON COLUMN public.collection_params_manage.communication_param_id IS '通信参数ID';
ALTER TABLE public.collection_params_manage ADD system_type varchar NULL;
COMMENT ON COLUMN public.collection_params_manage.system_type IS '系统类型';
CREATE TABLE device_control_log (
id varchar(36) NOT NULL,
device_name varchar(50) ,
control_type varchar(50) ,
control_content varchar(200) ,
create_user varchar(50) ,
create_time timestamp,
CONSTRAINT PK_device_control_log PRIMARY KEY (id)
);
CREATE INDEX idx_device_control_log_create_time ON device_control_log (create_time DESC);
CREATE INDEX idx_device_control_log_device_name ON device_control_log (device_name ASC);
-- Comments for table and columns
COMMENT ON TABLE device_control_log IS '设备操作历史记录';
COMMENT ON COLUMN device_control_log.id IS 'id主键';
COMMENT ON COLUMN device_control_log.device_name IS '设备名称';
COMMENT ON COLUMN device_control_log.control_type IS '操作类型';
COMMENT ON COLUMN device_control_log.control_content IS '操作内容';
COMMENT ON COLUMN device_control_log.create_user IS '操作账号';
COMMENT ON COLUMN device_control_log.create_time IS '操作日期';
-- mqtt订阅列表
CREATE TABLE mqtt_subscriptions (
id varchar(36) PRIMARY KEY,
topic VARCHAR(255) NOT NULL UNIQUE,
qos SMALLINT NOT NULL CHECK (qos >= 0 AND qos <= 2),
client_id VARCHAR(255) NOT NULL,
status bpchar(1) NOT NULL DEFAULT '0',
remark TEXT,
create_time TIMESTAMP NOT NULL DEFAULT NOW(), -- 记录创建的时间戳
update_time TIMESTAMP NOT NULL DEFAULT NOW(), -- 记录最后一次更新的时间戳
create_by VARCHAR(100) NULL, -- 创建该记录的用户
update_by VARCHAR(100) NULL -- 更新该记录的用户
);
CREATE INDEX idx_mqtt_subscriptions_create_time ON mqtt_subscriptions (create_time DESC);
CREATE INDEX idx_topic ON mqtt_subscriptions (topic);
CREATE INDEX idx_client_id ON mqtt_subscriptions (client_id);
COMMENT ON TABLE mqtt_subscriptions IS '设备操作历史记录';
COMMENT ON COLUMN mqtt_subscriptions.id IS 'id主键';
COMMENT ON COLUMN mqtt_subscriptions.topic IS 'MQTT订阅的主题(Topic),确保唯一性。';
COMMENT ON COLUMN mqtt_subscriptions.qos IS 'QoS级别(0、1或2)';
COMMENT ON COLUMN mqtt_subscriptions.client_id IS '订阅该主题的客户端ID。';
COMMENT ON COLUMN mqtt_subscriptions.status IS '状态:0:正常,1:停用';
COMMENT ON COLUMN mqtt_subscriptions.remark IS '备注';
COMMENT ON COLUMN mqtt_subscriptions.create_time IS '创建时间';
COMMENT ON COLUMN mqtt_subscriptions.update_time IS '更新时间';
COMMENT ON COLUMN mqtt_subscriptions.create_by IS '创建者';
COMMENT ON COLUMN mqtt_subscriptions.update_by IS '更新者';
Loading…
Cancel
Save