diff --git a/mh-admin/src/main/java/com/mh/MHRunner.java b/mh-admin/src/main/java/com/mh/MHRunner.java new file mode 100644 index 0000000..9338c21 --- /dev/null +++ b/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 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); + } + } + } +} diff --git a/mh-admin/src/main/java/com/mh/web/controller/device/CollectionParamsManageController.java b/mh-admin/src/main/java/com/mh/web/controller/device/CollectionParamsManageController.java index 72edd8e..0e6ab92 100644 --- a/mh-admin/src/main/java/com/mh/web/controller/device/CollectionParamsManageController.java +++ b/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) diff --git a/mh-admin/src/main/java/com/mh/web/controller/device/OperationController.java b/mh-admin/src/main/java/com/mh/web/controller/device/OperationController.java index 8d32dbe..c3dd029 100644 --- a/mh-admin/src/main/java/com/mh/web/controller/device/OperationController.java +++ b/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 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 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(); + } + } diff --git a/mh-admin/src/main/java/com/mh/web/controller/mqtt/MqttSubsController.java b/mh-admin/src/main/java/com/mh/web/controller/mqtt/MqttSubsController.java new file mode 100644 index 0000000..5df8ee3 --- /dev/null +++ b/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 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)); + } + +} diff --git a/mh-common/src/main/java/com/mh/common/annotation/ControlDeviceAno.java b/mh-common/src/main/java/com/mh/common/annotation/ControlDeviceAno.java new file mode 100644 index 0000000..ddfd78b --- /dev/null +++ b/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; + +} diff --git a/mh-common/src/main/java/com/mh/common/constant/Constants.java b/mh-common/src/main/java/com/mh/common/constant/Constants.java index 2246c12..b1b4ae4 100644 --- a/mh-common/src/main/java/com/mh/common/constant/Constants.java +++ b/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"; /** * 角色权限分隔符 diff --git a/mh-common/src/main/java/com/mh/common/core/domain/entity/CollectionParamsManage.java b/mh-common/src/main/java/com/mh/common/core/domain/entity/CollectionParamsManage.java index dbc42f0..aac07fe 100644 --- a/mh-common/src/main/java/com/mh/common/core/domain/entity/CollectionParamsManage.java +++ b/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 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 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(); } } diff --git a/mh-common/src/main/java/com/mh/common/core/domain/entity/ConsumptionAnalyzeEntity.java b/mh-common/src/main/java/com/mh/common/core/domain/entity/ConsumptionAnalyze.java similarity index 96% rename from mh-common/src/main/java/com/mh/common/core/domain/entity/ConsumptionAnalyzeEntity.java rename to mh-common/src/main/java/com/mh/common/core/domain/entity/ConsumptionAnalyze.java index e2acc7d..16700c6 100644 --- a/mh-common/src/main/java/com/mh/common/core/domain/entity/ConsumptionAnalyzeEntity.java +++ b/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; diff --git a/mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceControlLog.java b/mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceControlLog.java new file mode 100644 index 0000000..7e37924 --- /dev/null +++ b/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(); + } +} diff --git a/mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceReportEntity.java b/mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceReport.java similarity index 94% rename from mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceReportEntity.java rename to mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceReport.java index 7562e16..3410064 100644 --- a/mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceReportEntity.java +++ b/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; diff --git a/mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceTypeEnergyEntity.java b/mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceTypeEnergy.java similarity index 97% rename from mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceTypeEnergyEntity.java rename to mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceTypeEnergy.java index 964f3f4..4878a98 100644 --- a/mh-common/src/main/java/com/mh/common/core/domain/entity/DeviceTypeEnergyEntity.java +++ b/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; diff --git a/mh-common/src/main/java/com/mh/common/core/domain/entity/MqttSubscription.java b/mh-common/src/main/java/com/mh/common/core/domain/entity/MqttSubscription.java new file mode 100644 index 0000000..7f56ea9 --- /dev/null +++ b/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 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 getParams() { + return params; + } + + @Override + public void setParams(Map 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(); + } +} diff --git a/mh-common/src/main/java/com/mh/common/core/domain/entity/OrderEntity.java b/mh-common/src/main/java/com/mh/common/core/domain/entity/OrderEntity.java new file mode 100644 index 0000000..58018ff --- /dev/null +++ b/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(); + } +} diff --git a/mh-common/src/main/java/com/mh/common/enums/ComputeEnum.java b/mh-common/src/main/java/com/mh/common/enums/ComputeEnum.java index 6f5aeeb..1dc4437 100644 --- a/mh-common/src/main/java/com/mh/common/enums/ComputeEnum.java +++ b/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> getDataList( - Map.Entry>> entry) { + public ArrayList> getDataList( + Map.Entry>> entry) { - ArrayList> result = new ArrayList<>(); + ArrayList> result = new ArrayList<>(); //获取到电表的数据,按照表号分组分组,紧接着再按照小时分组。需要计算分组后的数据取出最大值 - Map> deviceMap = entry.getValue(); + Map> deviceMap = entry.getValue(); String deviceNum = entry.getKey(); - Set>> groupEntryList = deviceMap.entrySet(); - for (Map.Entry> listEntry : groupEntryList) { + Set>> groupEntryList = deviceMap.entrySet(); + for (Map.Entry> listEntry : groupEntryList) { LocalDateTime key = listEntry.getKey(); - List value = listEntry.getValue(); - DeviceReportEntity maxEntity = value.stream() + List value = listEntry.getValue(); + DeviceReport maxEntity = value.stream() .max(Comparator.comparing(obj -> Double.valueOf(obj.getCurValue()))) .orElse(null); - HashMap map = new HashMap<>(); + HashMap map = new HashMap<>(); map.put(key, maxEntity); result.add(map); } @@ -44,21 +44,21 @@ public enum ComputeEnum implements ComputeService { */ CLOUD("冷量计数据处理", 2) { @Override - public ArrayList> getDataList( - Map.Entry>> entry) { - ArrayList> result = new ArrayList<>(); + public ArrayList> getDataList( + Map.Entry>> entry) { + ArrayList> result = new ArrayList<>(); //获取到电表的数据,按照表号分组分组,紧接着再按照小时分组。需要计算分组后的数据取出最大值 - Map> deviceMap = entry.getValue(); + Map> deviceMap = entry.getValue(); String deviceNum = entry.getKey(); - Set>> groupEntryList = deviceMap.entrySet(); - for (Map.Entry> listEntry : groupEntryList) { + Set>> groupEntryList = deviceMap.entrySet(); + for (Map.Entry> listEntry : groupEntryList) { LocalDateTime key = listEntry.getKey(); - List value = listEntry.getValue(); - DeviceReportEntity maxEntity = value.stream() + List value = listEntry.getValue(); + DeviceReport maxEntity = value.stream() .max(Comparator.comparing(obj -> Double.valueOf(obj.getCurValue()))) .orElse(null); - HashMap map = new HashMap<>(); + HashMap map = new HashMap<>(); map.put(key, maxEntity); result.add(map); } @@ -71,8 +71,8 @@ public enum ComputeEnum implements ComputeService { */ COLD("温度计数据处理", 1) { @Override - public ArrayList> getDataList( - Map.Entry>> entry) { + public ArrayList> getDataList( + Map.Entry>> entry) { return null; } }; @@ -109,6 +109,6 @@ public enum ComputeEnum implements ComputeService { return lookup.get(key); } - public abstract ArrayList> getDataList( - Map.Entry>> entry); + public abstract ArrayList> getDataList( + Map.Entry>> entry); } diff --git a/mh-common/src/main/java/com/mh/common/enums/ComputeService.java b/mh-common/src/main/java/com/mh/common/enums/ComputeService.java index c9c4445..b4885d3 100644 --- a/mh-common/src/main/java/com/mh/common/enums/ComputeService.java +++ b/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> getDataList( - Map.Entry>> data); + ArrayList> getDataList( + Map.Entry>> data); } diff --git a/mh-common/src/main/java/com/mh/common/enums/ControlTypeEnum.java b/mh-common/src/main/java/com/mh/common/enums/ControlTypeEnum.java new file mode 100644 index 0000000..d2c2d07 --- /dev/null +++ b/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; + } + +} diff --git a/mh-common/src/main/java/com/mh/common/utils/DateUtils.java b/mh-common/src/main/java/com/mh/common/utils/DateUtils.java index 3fc96d9..30803f4 100644 --- a/mh-common/src/main/java/com/mh/common/utils/DateUtils.java +++ b/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); + } } diff --git a/mh-framework/src/main/java/com/mh/framework/aspectj/ControlDeviceAspect.java b/mh-framework/src/main/java/com/mh/framework/aspectj/ControlDeviceAspect.java new file mode 100644 index 0000000..03be5ab --- /dev/null +++ b/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 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(); + } + +} diff --git a/mh-framework/src/main/java/com/mh/framework/dealdata/DataProcessService.java b/mh-framework/src/main/java/com/mh/framework/dealdata/DataProcessService.java index 2918d97..70e4112 100644 --- a/mh-framework/src/main/java/com/mh/framework/dealdata/DataProcessService.java +++ b/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 dataMinList); + void insertDatabase(List dataMinList); /** * 查询data_ + type + year 表中未处理的数据 @@ -65,7 +64,7 @@ public interface DataProcessService { * @param hourList 报表数据 * @param type 报表类型 */ - void batchInsertTable(List hourList, String type); + void batchInsertTable(List hourList, String type); /** @@ -81,7 +80,7 @@ public interface DataProcessService { * @param dataList 数据集 * @param tableType */ - void batchInsertOrUpdate(List dataList, String tableType); + void batchInsertOrUpdate(List dataList, String tableType); /** * 查询倍率 diff --git a/mh-framework/src/main/java/com/mh/framework/dealdata/impl/DataProcessServiceImpl.java b/mh-framework/src/main/java/com/mh/framework/dealdata/impl/DataProcessServiceImpl.java index 385f319..daf56be 100644 --- a/mh-framework/src/main/java/com/mh/framework/dealdata/impl/DataProcessServiceImpl.java +++ b/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 dataMinList) { + public void insertDatabase(List 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 batchList = dataMinList.subList(i, Math.min(i + batchSize, dataMinList.size())); + List 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 curResults = null; - List lastResults = null; + List curResults = null; + List lastResults = null; HashMap 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> map = new HashMap<>(); - List curIdList = curResults.stream().map(DeviceReportEntity::getId).collect(Collectors.toList()); - List lastIdList = lastResults.stream().map(DeviceReportEntity::getId).collect(Collectors.toList()); + List curIdList = curResults.stream().map(DeviceReport::getId).collect(Collectors.toList()); + List 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 ids = curResults.stream().map(DeviceReportEntity::getId).collect(Collectors.toList()); + List ids = curResults.stream().map(DeviceReport::getId).collect(Collectors.toList()); HashMap> map = new HashMap<>(); map.put("curIds", ids); @@ -299,7 +296,7 @@ public class DataProcessServiceImpl implements DataProcessService { } @Override - public void batchInsertTable(List hourList, String type) { + public void batchInsertTable(List hourList, String type) { } @@ -341,9 +338,9 @@ public class DataProcessServiceImpl implements DataProcessService { } @Override - public void batchInsertOrUpdate(List dataList, String type) { + public void batchInsertOrUpdate(List dataList, String type) { String tableName; - for (DeviceReportEntity data : dataList) { + for (DeviceReport data : dataList) { //不分表 月、年 tableName = "data_" + type; int num = 0; diff --git a/mh-framework/src/main/java/com/mh/framework/mqtt/config/MqttInboundConfig.java b/mh-framework/src/main/java/com/mh/framework/mqtt/config/MqttInboundConfig.java index c72e245..d3e4c71 100644 --- a/mh-framework/src/main/java/com/mh/framework/mqtt/config/MqttInboundConfig.java +++ b/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; + } } diff --git a/mh-framework/src/main/java/com/mh/framework/mqtt/service/impl/MqttGatewayServiceImpl.java b/mh-framework/src/main/java/com/mh/framework/mqtt/service/impl/MqttGatewayServiceImpl.java index 9ab6fb2..fa8961e 100644 --- a/mh-framework/src/main/java/com/mh/framework/mqtt/service/impl/MqttGatewayServiceImpl.java +++ b/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) diff --git a/mh-framework/src/main/java/com/mh/framework/mqtt/service/impl/MqttTopicServiceImpl.java b/mh-framework/src/main/java/com/mh/framework/mqtt/service/impl/MqttTopicServiceImpl.java index 1a6eeb7..6911a17 100644 --- a/mh-framework/src/main/java/com/mh/framework/mqtt/service/impl/MqttTopicServiceImpl.java +++ b/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; diff --git a/mh-quartz/src/main/java/com/mh/quartz/task/DealDataTask.java b/mh-quartz/src/main/java/com/mh/quartz/task/DealDataTask.java index a03460b..c7e840b 100644 --- a/mh-quartz/src/main/java/com/mh/quartz/task/DealDataTask.java +++ b/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 dataMinList = new ArrayList<>(); + List 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 map = dataProcessService.queryUntreatedData("min"); //需要处理的数据 - List dataList = (List) map.get("data"); + List dataList = (List) map.get("data"); //处理完成后需要将数据设置为已处理,grade = 1, Map> idMap = (Map>) map.get("idMap"); //遍历分组 - Map>> collect = getMeterNumMap(dataList, ChronoUnit.HOURS); + Map>> collect = getMeterNumMap(dataList, ChronoUnit.HOURS); //小时表数据集合 - List hourList = new ArrayList<>(); + List hourList = new ArrayList<>(); //TODO 分组好的数据计算后插入数据表 - for (Map.Entry>> entry : collect.entrySet()) { + for (Map.Entry>> entry : collect.entrySet()) { //表号 String key = entry.getKey(); - Map> value = entry.getValue(); - Set>> entries = value.entrySet(); + Map> value = entry.getValue(); + Set>> entries = value.entrySet(); String deviceType = null; - for (Map.Entry> listEntry : entries) { + for (Map.Entry> listEntry : entries) { deviceType = listEntry.getValue().get(0).getDeviceType(); break; } //分组计算,得到一组当前表号的以时间分组的数据,循环计算第一条的当前读数是上一条的上次读数 - ComputeEnum computeEnum = ComputeEnum.get(Integer.parseInt(deviceType)); - assert deviceType != null; - List> dealDataList = + List> dealDataList = ComputeEnum.get(Integer.parseInt(deviceType)).getDataList(entry); - List> sortedList = dealDataList.stream() + List> 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 calcListData(List hourList, - String key, String tableType, - List> dealDataList) { + private List calcListData(List hourList, + String key, String tableType, + List> dealDataList) { - ArrayList tempList = new ArrayList<>(); + ArrayList tempList = new ArrayList<>(); for (int i = 0; i < dealDataList.size(); i++) { if (i == 0) { - Map reportEntityMap = dealDataList.get(i); + Map 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> entrySet = reportEntityMap.entrySet(); - for (Map.Entry entityEntry : entrySet) { + Set> entrySet = reportEntityMap.entrySet(); + for (Map.Entry 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 curMap = dealDataList.get(i); - Set> curEntrySet = curMap.entrySet(); - for (Map.Entry curEntry : curEntrySet) { + DeviceReport lastEntity = tempList.get(lastIndex); + Map curMap = dealDataList.get(i); + Set> curEntrySet = curMap.entrySet(); + for (Map.Entry 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,8 +371,8 @@ public class DealDataTask { * @param interval 时间间隔 * @return */ - private Map>> getMeterNumMap(List dataList, - TemporalUnit interval) { + private Map>> getMeterNumMap(List dataList, + TemporalUnit interval) { // 获取 MinuteData 对象集合,其中的时间戳是 java.util.Date 类型 //1:数据格式为先按照表号分组,设备类型里的数据再按照小时分组 //2:小时分组的数据就是DeviceReportEntity实体类 @@ -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 untreatedList = dataProcessService.queryUntreatedData("hour"); //需要处理的数据 - List dataList = (List) untreatedList.get("data"); + List dataList = (List) untreatedList.get("data"); //处理完成后需要将数据设置为已处理,grade = 1, Map> idMap = (Map>) untreatedList.get("idMap"); //<表号:<时间:List<集合>>> 按照日区分 - Map>> dayMap = getMeterNumMap(dataList, ChronoUnit.DAYS); - List dayList = new ArrayList<>(); - List monthList = new ArrayList<>(); + Map>> dayMap = getMeterNumMap(dataList, ChronoUnit.DAYS); + List dayList = new ArrayList<>(); + List monthList = new ArrayList<>(); // 使用流对每个内部的Map进行排序 dayMap.forEach((key, value) -> { - Map> sortedMap = value.entrySet().stream() + Map> 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>> monthMap = getMeterNumMap(dataList, ChronoUnit.MONTHS); - Map>> monthMap = getMeterNumMapByMonth(dataList, ChronoUnit.MONTHS); - List monthInsert = getMonthListData(monthList, monthMap); + Map>> monthMap = getMeterNumMapByMonth(dataList, ChronoUnit.MONTHS); + List monthInsert = getMonthListData(monthList, monthMap); dataProcessService.batchInsertOrUpdate(monthInsert, "month"); // 按照年区分 @@ -455,32 +450,32 @@ public class DealDataTask { * @param monthMap * @return */ - private List getMonthListData(List monthList, Map>> monthMap) { - Set>>> entries = monthMap.entrySet(); - for (Map.Entry>> entry : entries) { + private List getMonthListData(List monthList, Map>> monthMap) { + Set>>> entries = monthMap.entrySet(); + for (Map.Entry>> entry : entries) { String deviceNum = entry.getKey(); - Map> value = entry.getValue(); - List deviceList = new ArrayList<>(); - List monthInsert = new ArrayList<>(); - List tempList = new ArrayList<>(); - Set>> monthEntries = value.entrySet(); - for (Map.Entry> monthEntry : monthEntries) { + Map> value = entry.getValue(); + List deviceList = new ArrayList<>(); + List monthInsert = new ArrayList<>(); + List tempList = new ArrayList<>(); + Set>> monthEntries = value.entrySet(); + for (Map.Entry> monthEntry : monthEntries) { //月份 YearMonth key = monthEntry.getKey(); //集合 - List monthEntryValue = monthEntry.getValue(); + List 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 getDeviceReportEntities(Map>> dayMap, - List dayList, - String tableType) { - for (Map.Entry>> entry : dayMap.entrySet()) { + private List getDeviceReportEntities(Map>> dayMap, + List dayList, + String tableType) { + for (Map.Entry>> entry : dayMap.entrySet()) { //表号 String key = entry.getKey(); - Map> value = entry.getValue(); + Map> value = entry.getValue(); String deviceType = null; - for (Map.Entry> listEntry : value.entrySet()) { + for (Map.Entry> listEntry : value.entrySet()) { deviceType = listEntry.getValue().get(0).getDeviceType(); } //取到的最大值 assert deviceType != null; - List> dayMapList = + List> dayMapList = ComputeEnum.get(Integer.parseInt(deviceType)).getDataList(entry); dayList = calcListData(dayList, key, tableType, dayMapList); @@ -565,15 +560,15 @@ public class DealDataTask { * @param interval * @return */ - private Map>> getMeterNumMapByMonth(List dataList, - TemporalUnit interval) { + private Map>> getMeterNumMapByMonth(List dataList, + TemporalUnit interval) { return dataList.stream() .map(data -> { LocalDateTime dateTime = LocalDateTime.ofInstant(data.getCurTime().toInstant(), ZoneId.systemDefault()); data.setLocalDateTime(dateTime); return data; }) - .collect(Collectors.groupingBy(DeviceReportEntity::getDeviceNum, + .collect(Collectors.groupingBy(DeviceReport::getDeviceNum, Collectors.groupingBy( report -> YearMonth.from(report.getLocalDateTime()), LinkedHashMap::new, diff --git a/mh-system/src/main/java/com/mh/system/mapper/device/DataProcessMapper.java b/mh-system/src/main/java/com/mh/system/mapper/device/DataProcessMapper.java index 4364bba..2d15fe7 100644 --- a/mh-system/src/main/java/com/mh/system/mapper/device/DataProcessMapper.java +++ b/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 " + "" + - "(#{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})" + "" + "") void batchInsertChiller(@Param("batchList") List 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 { ")" + "" + "") - void insertDataMin(@Param("batchList") List batchList, + void insertDataMin(@Param("batchList") List 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 queryUntreatedData(String tableName); + List 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 diff --git a/mh-system/src/main/java/com/mh/system/mapper/device/DeviceControlLogMapper.java b/mh-system/src/main/java/com/mh/system/mapper/device/DeviceControlLogMapper.java new file mode 100644 index 0000000..35ca9cf --- /dev/null +++ b/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 { +} diff --git a/mh-system/src/main/java/com/mh/system/mapper/energy/EnergyAnalyzeMapper.java b/mh-system/src/main/java/com/mh/system/mapper/energy/EnergyAnalyzeMapper.java index eaec735..f3a2954 100644 --- a/mh-system/src/main/java/com/mh/system/mapper/energy/EnergyAnalyzeMapper.java +++ b/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,12 +66,12 @@ public interface EnergyAnalyzeMapper { " and dh.device_type = #{paramType}" + "" + "") - List queryManyTable(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("len") String dateLen, - @Param("paramType") String paramType); + List queryManyTable(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("len") String dateLen, + @Param("paramType") String paramType); /** * 单表查询操作 @@ -104,12 +102,12 @@ public interface EnergyAnalyzeMapper { " and dh.device_type = #{paramType}" + "" + "") - List queryOneTable(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("len") String dateLen, - @Param("paramType") String paramType); + List queryOneTable(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("len") String dateLen, + @Param("paramType") String paramType); @Select("" ) - List queryDeviceOneTable(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("len") String dateLen, - @Param("params") List params); + List queryDeviceOneTable(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("len") String dateLen, + @Param("params") List params); @Select("" ) - List queryDeviceManyTable(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("len") String dateLen, - @Param("params") List params); + List queryDeviceManyTable(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("len") String dateLen, + @Param("params") List params); } diff --git a/mh-system/src/main/java/com/mh/system/mapper/energy/EnergyMapper.java b/mh-system/src/main/java/com/mh/system/mapper/energy/EnergyMapper.java index 00b710c..d81e49b 100644 --- a/mh-system/src/main/java/com/mh/system/mapper/energy/EnergyMapper.java +++ b/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,12 +56,12 @@ public interface EnergyMapper { " )" + " group by device_type,convert(varchar(${len}), cur_time, 120)" + "") - List queryManyTable(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("len") String dateLen, - @Param("paramType") String paramType); + List queryManyTable(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("len") String dateLen, + @Param("paramType") String paramType); /** * 单表查询操作 @@ -87,12 +87,12 @@ public interface EnergyMapper { " )" + " group by device_type,convert(varchar(${len}), cur_time, 120)" + "") - List queryOneTable(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("len") String dateLen, - @Param("paramType") String paramType); + List queryOneTable(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("len") String dateLen, + @Param("paramType") String paramType); /** * 查询能耗分析同比 @@ -104,17 +104,17 @@ public interface EnergyMapper { * @param paramType * @return */ - List queryManyTableYoy(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("yoyStartTime") String yoyStartTime, - @Param("yoyEndTime") String yoyEndTime, - @Param("yoyLastTableName") String yoyLastTableName, - @Param("yoyCurTableName") String yoyCurTableName, - @Param("len") String dateLen, - @Param("paramType") String paramType, - @Param("timeType") String timeType); + List queryManyTableYoy(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("yoyStartTime") String yoyStartTime, + @Param("yoyEndTime") String yoyEndTime, + @Param("yoyLastTableName") String yoyLastTableName, + @Param("yoyCurTableName") String yoyCurTableName, + @Param("len") String dateLen, + @Param("paramType") String paramType, + @Param("timeType") String timeType); /** @@ -130,15 +130,15 @@ public interface EnergyMapper { * @param timeType * @return */ - List queryOneTableYoy(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("yoyStartTime") String yoyStartTime, - @Param("yoyEndTime") String yoyEndTime, - @Param("len") String dateLen, - @Param("paramType") String paramType, - @Param("timeType") String timeType); + List queryOneTableYoy(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("yoyStartTime") String yoyStartTime, + @Param("yoyEndTime") String yoyEndTime, + @Param("len") String dateLen, + @Param("paramType") String paramType, + @Param("timeType") String timeType); /** * 查询能耗分析环比(查询类型是month,year) @@ -152,14 +152,14 @@ public interface EnergyMapper { * @param timeType * @return */ - List queryMonthAndYearMom(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("momStartTime") String yoyStartTime, - @Param("momEndTime") String yoyEndTime, - @Param("tableName") String tableName, - @Param("len") String dateLen, - @Param("paramType") String paramType, - @Param("timeType") String timeType); + List queryMonthAndYearMom(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("momStartTime") String yoyStartTime, + @Param("momEndTime") String yoyEndTime, + @Param("tableName") String tableName, + @Param("len") String dateLen, + @Param("paramType") String paramType, + @Param("timeType") String timeType); /** * 单表查询能耗分析环比(查询类型是hour,day) @@ -173,14 +173,14 @@ public interface EnergyMapper { * @param timeType * @return */ - List queryOneTableMom(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("momStartTime") String yoyStartTime, - @Param("momEndTime") String yoyEndTime, - @Param("tableName") String tableName, - @Param("len") String dateLen, - @Param("paramType") String paramType, - @Param("timeType") String timeType); + List queryOneTableMom(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("momStartTime") String yoyStartTime, + @Param("momEndTime") String yoyEndTime, + @Param("tableName") String tableName, + @Param("len") String dateLen, + @Param("paramType") String paramType, + @Param("timeType") String timeType); /** * 多表查询能耗分析环比(查询类型是hour,day) @@ -195,15 +195,15 @@ public interface EnergyMapper { * @param timeType * @return */ - List queryManyTableMom(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("momStartTime") String yoyStartTime, - @Param("momEndTime") String yoyEndTime, - @Param("tableName1") String tableName1, - @Param("tableName2") String tableName2, - @Param("len") String dateLen, - @Param("paramType") String paramType, - @Param("timeType") String timeType); + List queryManyTableMom(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("momStartTime") String yoyStartTime, + @Param("momEndTime") String yoyEndTime, + @Param("tableName1") String tableName1, + @Param("tableName2") String tableName2, + @Param("len") String dateLen, + @Param("paramType") String paramType, + @Param("timeType") String timeType); /** * 查询各个机房设备的用电量(查询月,年) @@ -215,12 +215,12 @@ public interface EnergyMapper { * @param deviceType * @return */ - List queryDeviceOneTable(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("len") String dateLen, - @Param("deviceType") String deviceType); + List queryDeviceOneTable(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("len") String dateLen, + @Param("deviceType") String deviceType); /** * 查询各个机房设备的用电量(查询小时,天) @@ -232,12 +232,12 @@ public interface EnergyMapper { * @param deviceType * @return */ - List queryDeviceManyTable(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("len") String dateLen, - @Param("deviceType") String deviceType); + List queryDeviceManyTable(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("len") String dateLen, + @Param("deviceType") String deviceType); /** * 查询系统分析折线图 @@ -247,10 +247,10 @@ public interface EnergyMapper { * @param endTime * @return */ - List queryLineDataSysByOne(@Param("curTable") String curTable, - @Param("curCopTable") String curCopTable, - @Param("startTime") String startTime, - @Param("endTime") String endTime); + List queryLineDataSysByOne(@Param("curTable") String curTable, + @Param("curCopTable") String curCopTable, + @Param("startTime") String startTime, + @Param("endTime") String endTime); /** * 查询系统分析折线图 @@ -262,12 +262,12 @@ public interface EnergyMapper { * @param endTime * @return */ - List queryLineDataSysByMany(@Param("lastTable") String lastTable, - @Param("curTable") String curTable, - @Param("lastCopTable") String lastCopTable, - @Param("curCopTable") String curCopTable, - @Param("startTime") String startTime, - @Param("endTime") String endTime); + List queryLineDataSysByMany(@Param("lastTable") String lastTable, + @Param("curTable") String curTable, + @Param("lastCopTable") String lastCopTable, + @Param("curCopTable") String curCopTable, + @Param("startTime") String startTime, + @Param("endTime") String endTime); /** * 查询各个设备的折线图数据 @@ -278,11 +278,11 @@ public interface EnergyMapper { * @param deviceType * @return */ - List queryDeviceLineManyTable(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("deviceType") String deviceType); + List queryDeviceLineManyTable(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("deviceType") String deviceType); @Select("select isnull(sum(calc_value),0) from ${tableName} " + " where device_type = 'cloud' " + diff --git a/mh-system/src/main/java/com/mh/system/mapper/energy/EnergyQueryMapper.java b/mh-system/src/main/java/com/mh/system/mapper/energy/EnergyQueryMapper.java index 0970a72..f5e0616 100644 --- a/mh-system/src/main/java/com/mh/system/mapper/energy/EnergyQueryMapper.java +++ b/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,14 +100,14 @@ public interface EnergyQueryMapper { "" + " group by device_type,convert(varchar(${len}), cur_time, 120)" + "") - List queryManyTable(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("len") String dateLen, - @Param("paramType") String paramType, - @Param("haveMeter") boolean haveMeter, - @Param("haveCloud") boolean haveCloud); + List queryManyTable(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("len") String dateLen, + @Param("paramType") String paramType, + @Param("haveMeter") boolean haveMeter, + @Param("haveCloud") boolean haveCloud); /** * 单表查询操作 @@ -155,13 +155,13 @@ public interface EnergyQueryMapper { "" + " group by device_type,convert(varchar(${len}), cur_time, 120)" + "") - List queryOneTable(@Param("startTime") String startTime, - @Param("endTime") String endTime, - @Param("lastTableName") String lastTableName, - @Param("curTableName") String curTableName, - @Param("len") String dateLen, - @Param("paramType") String paramType, - @Param("haveMeter") boolean haveMeter, - @Param("haveCloud") boolean haveCloud); + List queryOneTable(@Param("startTime") String startTime, + @Param("endTime") String endTime, + @Param("lastTableName") String lastTableName, + @Param("curTableName") String curTableName, + @Param("len") String dateLen, + @Param("paramType") String paramType, + @Param("haveMeter") boolean haveMeter, + @Param("haveCloud") boolean haveCloud); } diff --git a/mh-system/src/main/java/com/mh/system/mapper/mqtt/MqttSubscriptionMapper.java b/mh-system/src/main/java/com/mh/system/mapper/mqtt/MqttSubscriptionMapper.java new file mode 100644 index 0000000..1bebfb4 --- /dev/null +++ b/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 { +} diff --git a/mh-system/src/main/java/com/mh/system/service/device/IDeviceControlLogService.java b/mh-system/src/main/java/com/mh/system/service/device/IDeviceControlLogService.java new file mode 100644 index 0000000..6be489f --- /dev/null +++ b/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 findPage(DeviceControlLog deviceControlLog); + +} diff --git a/mh-system/src/main/java/com/mh/system/service/device/impl/CollectionParamsManageServiceImpl.java b/mh-system/src/main/java/com/mh/system/service/device/impl/CollectionParamsManageServiceImpl.java index 4ded95b..1e4ff72 100644 --- a/mh-system/src/main/java/com/mh/system/service/device/impl/CollectionParamsManageServiceImpl.java +++ b/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); } diff --git a/mh-system/src/main/java/com/mh/system/service/device/impl/DeviceControlLogServiceImpl.java b/mh-system/src/main/java/com/mh/system/service/device/impl/DeviceControlLogServiceImpl.java new file mode 100644 index 0000000..1ce50f8 --- /dev/null +++ b/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 findPage(DeviceControlLog deviceControlLog) { + return List.of(); + } +} diff --git a/mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyAnalyzeServiceImpl.java b/mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyAnalyzeServiceImpl.java index d0538dd..3a3eef8 100644 --- a/mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyAnalyzeServiceImpl.java +++ b/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 lastTableName = new AtomicReference<>("data_" + vo.getTimeType()); AtomicReference curTableName = new AtomicReference<>("data_" + vo.getTimeType()); String timeType = vo.getTimeType(); - List deviceTypeEnergyEntities = null; + List 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 result = deviceTypeEnergyEntities.stream() - .collect(Collectors.groupingBy(DeviceTypeEnergyEntity::getDeviceTypeRange)) + .collect(Collectors.groupingBy(DeviceTypeEnergy::getDeviceTypeRange)) .entrySet().stream().collect(Collectors.toMap( - Map.Entry>::getKey, + Map.Entry>::getKey, entry -> { - List value = entry.getValue(); + List 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 chiller = createDeviceTypeData(deviceTypeEnergyEntities, 10, 0); + List chiller = createDeviceTypeData(deviceTypeEnergyEntities, 10, 0); // 查询各个冷冻泵的 10-19 - List chillerPump = createDeviceTypeData(deviceTypeEnergyEntities, 20, 10); + List chillerPump = createDeviceTypeData(deviceTypeEnergyEntities, 20, 10); // 查询各个冷却泵的 20-29 - List coolPump = createDeviceTypeData(deviceTypeEnergyEntities, 30, 20); + List coolPump = createDeviceTypeData(deviceTypeEnergyEntities, 30, 20); // 查询各个冷却塔的 30-39 - List coolTower = createDeviceTypeData(deviceTypeEnergyEntities, 40, 30); + List coolTower = createDeviceTypeData(deviceTypeEnergyEntities, 40, 30); // 从device_manage查询不是总表的 List deviceByOther = collectionParamsManageMapper.getDeviceByOther(null); @@ -157,7 +155,7 @@ public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService { AtomicReference lastTableName = new AtomicReference<>("data_" + vo.getTimeType()); AtomicReference curTableName = new AtomicReference<>("data_" + vo.getTimeType()); String timeType = vo.getTimeType(); - List deviceTypeEnergyEntities = null; + List deviceTypeEnergyEntities = null; // 表格数据 if ("month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType)) { // 单表 @@ -177,23 +175,23 @@ public class EnergyAnalyzeServiceImpl implements EnergyAnalyzeService { return List.of(); } // 分组拿出各个设备 - Map> deviceNumMap = deviceTypeEnergyEntities.stream() - .sorted(Comparator.comparing(DeviceTypeEnergyEntity::getTimeStr)) - .collect(Collectors.groupingBy(DeviceTypeEnergyEntity::getDeviceNum)); + Map> deviceNumMap = deviceTypeEnergyEntities.stream() + .sorted(Comparator.comparing(DeviceTypeEnergy::getTimeStr)) + .collect(Collectors.groupingBy(DeviceTypeEnergy::getDeviceNum)); List title = new ArrayList<>(); List timeStr = new ArrayList<>(); List columnData = new ArrayList<>(); // 组装对应需要查询的数据 int i = 0; - for (Map.Entry> stringListEntry : deviceNumMap.entrySet()) { + for (Map.Entry> stringListEntry : deviceNumMap.entrySet()) { title.add(stringListEntry.getKey()); - List value = stringListEntry.getValue(); + List 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 copLineData, String[] lineTimeStrArr) { + private static String[] getArr(List copLineData, String[] lineTimeStrArr) { String[] lineCopArr = new String[lineTimeStrArr.length]; for (int i = 0; i < lineTimeStrArr.length; i++) { int j = i; - Optional first = copLineData.stream().filter(s -> lineTimeStrArr[j].equalsIgnoreCase(s.getTimeStr())).findFirst(); + Optional 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 getResultData(List coolTower) { + private static List getResultData(List 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 chiller, CollectionParamsManage deviceManageEntity) { + private static void reassignData(List 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 createDeviceTypeData(List deviceTypeEnergyEntities, int x, int x1) { + private static List createDeviceTypeData(List 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()); } diff --git a/mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyQueryServiceImpl.java b/mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyQueryServiceImpl.java index 1893e09..dd9bf5e 100644 --- a/mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyQueryServiceImpl.java +++ b/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 consumptionAnalyzeEntities = null; + List consumptionAnalyzeEntities = null; // 表格数据 if ("month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType)) { // 单表 @@ -62,14 +62,14 @@ public class EnergyQueryServiceImpl implements IEnergyQueryService { return AjaxResult.success(); } // 分组并按时间排序操作,拿到冷量记和电表数据 - Map> collect = consumptionAnalyzeEntities.stream() + Map> 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 meterData = new ArrayList<>(); - List coldData = new ArrayList<>(); - for (Map.Entry> nmap : collect.entrySet()) { + list -> list.stream().sorted(Comparator.comparing(ConsumptionAnalyze::getTimeStr)).collect(Collectors.toList())))); + List meterData = new ArrayList<>(); + List coldData = new ArrayList<>(); + for (Map.Entry> 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 copLineData, String[] lineTimeStrArr) { + private static String[] getArr(List copLineData, String[] lineTimeStrArr) { String[] lineCopArr = new String[lineTimeStrArr.length]; for (int i = 0; i < lineTimeStrArr.length; i++) { int j = i; - Optional first = copLineData.stream().filter(s -> lineTimeStrArr[j].equalsIgnoreCase(s.getTimeStr())).findFirst(); + Optional first = copLineData.stream().filter(s -> lineTimeStrArr[j].equalsIgnoreCase(s.getTimeStr())).findFirst(); if (first.isPresent()) { lineCopArr[i] = first.get().getCurValue(); } else { diff --git a/mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyServiceImpl.java b/mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyServiceImpl.java index ac2702b..1545e4d 100644 --- a/mh-system/src/main/java/com/mh/system/service/energy/impl/EnergyServiceImpl.java +++ b/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>> futures = new ArrayList<>(); futures.add(executor.submit(() -> { - List consumptionAnalyzeEntities; + List 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 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 consumptionAnalyzeEntities = energyMapper.queryDeviceLineManyTable(vo.getStartTime(), vo.getEndTime(), lastTable, curTable, vo.getDeviceType()); + List 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 map = new HashMap<>(); map.put("timeStrLineArr", timeStrArr); @@ -141,7 +141,7 @@ public class EnergyServiceImpl implements IEnergyService { CountDownLatch latch = new CountDownLatch(2); List>> futures = new ArrayList<>(); futures.add(executor.submit(() -> { - List consumptionAnalyzeEntities = null; + List consumptionAnalyzeEntities = null; // 表格数据 if ("month".equalsIgnoreCase(timeType) || "year".equalsIgnoreCase(timeType)) { // 单表 @@ -162,14 +162,14 @@ public class EnergyServiceImpl implements IEnergyService { return null; } // 分组并按时间排序操作,拿到冷量记和电表数据 - Map> collect = consumptionAnalyzeEntities.stream() + Map> 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 meterData = new ArrayList<>(); - List coldData = new ArrayList<>(); - for (Map.Entry> nmap : collect.entrySet()) { + list -> list.stream().sorted(Comparator.comparing(ConsumptionAnalyze::getTimeStr)).collect(Collectors.toList())))); + List meterData = new ArrayList<>(); + List coldData = new ArrayList<>(); + for (Map.Entry> 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 lineData; + List 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> collectLine = lineData.stream() + Map> 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 meterLineData = new ArrayList<>(); // List coldLineData = new ArrayList<>(); // List copLineData = new ArrayList<>(); - List efrColdLineData = new ArrayList<>(); - List efrMeterLineData = new ArrayList<>(); - for (Map.Entry> nmap : collectLine.entrySet()) { + List efrColdLineData = new ArrayList<>(); + List efrMeterLineData = new ArrayList<>(); + for (Map.Entry> 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 copLineData, String[] lineTimeStrArr) { + private static String[] getArr(List copLineData, String[] lineTimeStrArr) { String[] lineCopArr = new String[lineTimeStrArr.length]; for (int i = 0; i < lineTimeStrArr.length; i++) { int j = i; - Optional first = copLineData.stream().filter(s -> lineTimeStrArr[j].equalsIgnoreCase(s.getTimeStr())).findFirst(); + Optional 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 consumptionAnalyzeEntities; + List 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 consumptionAnalyzeEntities = null; + List 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 consumptionAnalyzeEntities, String compareType) { + private static AjaxResult getConsumptionDTOHttpResult(List 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)) { diff --git a/mh-system/src/main/java/com/mh/system/service/mqtt/IMqttSubscriptionService.java b/mh-system/src/main/java/com/mh/system/service/mqtt/IMqttSubscriptionService.java new file mode 100644 index 0000000..bf10e6a --- /dev/null +++ b/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 selectMqttSubList(MqttSubscription mqttSubscription); + + MqttSubscription selectMqttSubById(String msId); + + int insertMqttSub(MqttSubscription mqttSubscription); + + int updateMqttSub(MqttSubscription mqttSubscription); + + int deleteMqttSubByIds(String[] msIds); + +} diff --git a/mh-system/src/main/java/com/mh/system/service/mqtt/impl/MqttSubscriptionServiceImpl.java b/mh-system/src/main/java/com/mh/system/service/mqtt/impl/MqttSubscriptionServiceImpl.java new file mode 100644 index 0000000..fb24087 --- /dev/null +++ b/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 selectMqttSubList(MqttSubscription mqttSubscription) { + if (mqttSubscription == null) { + return List.of(); + } + QueryWrapper 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; + } +} diff --git a/mh-system/src/main/java/com/mh/system/service/operation/IOperationDeviceService.java b/mh-system/src/main/java/com/mh/system/service/operation/IOperationDeviceService.java new file mode 100644 index 0000000..fd6d1fd --- /dev/null +++ b/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 changeValues); + +} diff --git a/mh-system/src/main/java/com/mh/system/service/operation/impl/OperationDeviceServiceImpl.java b/mh-system/src/main/java/com/mh/system/service/operation/impl/OperationDeviceServiceImpl.java new file mode 100644 index 0000000..4e52b46 --- /dev/null +++ b/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 changeValues) { + // 拼接发送的报文 + AdvantechResponse sendData = new AdvantechResponse<>(); + try { + List 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 getAdvantechDatas(List changeValues) { + List 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; + } +} diff --git a/mh-system/src/main/resources/mapper/system/EnergyMapper.xml b/mh-system/src/main/resources/mapper/system/EnergyMapper.xml index 33d5b4b..47ce370 100644 --- a/mh-system/src/main/resources/mapper/system/EnergyMapper.xml +++ b/mh-system/src/main/resources/mapper/system/EnergyMapper.xml @@ -62,7 +62,7 @@ order by timeStr - 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 @@ - 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 @@ - select t1.timeStr, t1.sumValue as curValue, @@ -255,7 +255,7 @@ order by timeStr - + @@ -318,7 +318,7 @@ - select t1.timeStr, t1.sumValue as curValue, @@ -395,7 +395,7 @@ order by timeStr - select t1.timeStr, t1.sumValue as curValue, @@ -487,7 +487,7 @@ order by timeStr - select sum(calc_value) as curValue, device_type as deviceType, @@ -528,7 +528,7 @@ order by timeStr - select sum(calc_value) as curValue, @@ -605,7 +605,7 @@ order by timeStr - 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 <= #{endTime} and exists ( @@ -650,7 +650,7 @@ group by device_type, cur_time - 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 <= #{endTime} and exists ( @@ -733,7 +733,7 @@ group by device_type, cur_time - select sum(calc_value) as curValue, diff --git a/sql/表结构设计.sql b/sql/表结构设计.sql index 56c6e82..e27a356 100644 --- a/sql/表结构设计.sql +++ b/sql/表结构设计.sql @@ -470,4 +470,63 @@ COMMENT ON COLUMN alarm_rules.update_by IS '更新该记录的用户'; 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); \ No newline at end of file +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 '更新者'; \ No newline at end of file