Compare commits

..

2 Commits

Author SHA1 Message Date
25604 10c23f3f5b 1、兼容MQTT协议 3 months ago
25604 9420aa3ac4 1、兼容MQTT协议 3 months ago
  1. 22
      pom.xml
  2. 11
      user-service/pom.xml
  3. 2
      user-service/src/main/java/com/mh/user/config/CorsConfig.java
  4. 11
      user-service/src/main/java/com/mh/user/config/DruidConfig.java
  5. 49
      user-service/src/main/java/com/mh/user/config/MyJacksonConfig.java
  6. 62
      user-service/src/main/java/com/mh/user/config/mqtt/InboundMessageRouter.java
  7. 99
      user-service/src/main/java/com/mh/user/config/mqtt/MqttConfig.java
  8. 91
      user-service/src/main/java/com/mh/user/config/mqtt/MqttInboundConfig.java
  9. 55
      user-service/src/main/java/com/mh/user/config/mqtt/MqttMessageChannel.java
  10. 51
      user-service/src/main/java/com/mh/user/config/mqtt/MqttOutboundConfig.java
  11. 1
      user-service/src/main/java/com/mh/user/constants/Constant.java
  12. 3
      user-service/src/main/java/com/mh/user/constants/DeviceEnum.java
  13. 3
      user-service/src/main/java/com/mh/user/constants/DeviceStrategyEnum.java
  14. 2
      user-service/src/main/java/com/mh/user/constants/TopicEnum.java
  15. 17
      user-service/src/main/java/com/mh/user/controller/BuildingController.java
  16. 7
      user-service/src/main/java/com/mh/user/controller/CodeTableController.java
  17. 71
      user-service/src/main/java/com/mh/user/controller/CollectionParamsManageController.java
  18. 11
      user-service/src/main/java/com/mh/user/controller/DeviceInstallController.java
  19. 46
      user-service/src/main/java/com/mh/user/controller/DeviceOperateController.java
  20. 52
      user-service/src/main/java/com/mh/user/controller/HotWaterMonitorController.java
  21. 58
      user-service/src/main/java/com/mh/user/controller/NowDataController.java
  22. 3
      user-service/src/main/java/com/mh/user/controller/SysRoleController.java
  23. 10
      user-service/src/main/java/com/mh/user/controller/SysUserController.java
  24. 179
      user-service/src/main/java/com/mh/user/dto/HotWaterBackPumpControlVO.java
  25. 118
      user-service/src/main/java/com/mh/user/dto/HotWaterCircuitPumpControlVO.java
  26. 38
      user-service/src/main/java/com/mh/user/dto/HotWaterControlDTO.java
  27. 79
      user-service/src/main/java/com/mh/user/dto/HotWaterControlListVO.java
  28. 186
      user-service/src/main/java/com/mh/user/dto/HotWaterControlVO.java
  29. 71
      user-service/src/main/java/com/mh/user/dto/HotWaterDeviceCalibrationControlVO.java
  30. 69
      user-service/src/main/java/com/mh/user/dto/HotWaterDeviceControlVO.java
  31. 316
      user-service/src/main/java/com/mh/user/dto/HotWaterHotPumpControlVO.java
  32. 63
      user-service/src/main/java/com/mh/user/dto/HotWaterNowDataDTO.java
  33. 151
      user-service/src/main/java/com/mh/user/dto/HotWaterSystemControlVO.java
  34. 4
      user-service/src/main/java/com/mh/user/entity/BuildingEntity.java
  35. 108
      user-service/src/main/java/com/mh/user/entity/CollectionParamsManageEntity.java
  36. 20
      user-service/src/main/java/com/mh/user/entity/NowDataEntity.java
  37. 1
      user-service/src/main/java/com/mh/user/entity/NowPublicDataEntity.java
  38. 2
      user-service/src/main/java/com/mh/user/entity/PumpSetEntity.java
  39. 38
      user-service/src/main/java/com/mh/user/entity/WaterPressureEntity.java
  40. 7
      user-service/src/main/java/com/mh/user/factory/BackTempControl.java
  41. 18
      user-service/src/main/java/com/mh/user/factory/Device.java
  42. 7
      user-service/src/main/java/com/mh/user/factory/EleMeter.java
  43. 7
      user-service/src/main/java/com/mh/user/factory/HeatPump.java
  44. 7
      user-service/src/main/java/com/mh/user/factory/HeatPumpStatus.java
  45. 8
      user-service/src/main/java/com/mh/user/factory/MultiControl.java
  46. 8
      user-service/src/main/java/com/mh/user/factory/PressureTrans.java
  47. 8
      user-service/src/main/java/com/mh/user/factory/StatusCheck.java
  48. 51
      user-service/src/main/java/com/mh/user/factory/SystemParams.java
  49. 8
      user-service/src/main/java/com/mh/user/factory/TempControl.java
  50. 8
      user-service/src/main/java/com/mh/user/factory/TempTrans.java
  51. 8
      user-service/src/main/java/com/mh/user/factory/TimeControl.java
  52. 8
      user-service/src/main/java/com/mh/user/factory/WaterLevelSwitch.java
  53. 8
      user-service/src/main/java/com/mh/user/factory/WtMeter.java
  54. 5
      user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java
  55. 2
      user-service/src/main/java/com/mh/user/job/DealDataJob.java
  56. 15
      user-service/src/main/java/com/mh/user/job/GetWeatherInfoJob.java
  57. 1
      user-service/src/main/java/com/mh/user/mapper/BuildingMapper.java
  58. 3
      user-service/src/main/java/com/mh/user/mapper/CodeTableMapper.java
  59. 329
      user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java
  60. 12
      user-service/src/main/java/com/mh/user/mapper/DataResultMapper.java
  61. 7
      user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java
  62. 6
      user-service/src/main/java/com/mh/user/mapper/GatewayManageMapper.java
  63. 2
      user-service/src/main/java/com/mh/user/mapper/MqttSubscriptionMapper.java
  64. 49
      user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java
  65. 2
      user-service/src/main/java/com/mh/user/mapper/PumpSetMapper.java
  66. 62
      user-service/src/main/java/com/mh/user/mapper/provider/NowDataProvider.java
  67. 13
      user-service/src/main/java/com/mh/user/model/AreaBuildingTreeModel.java
  68. 34
      user-service/src/main/java/com/mh/user/model/MyBigDecimalDeserializer.java
  69. 24
      user-service/src/main/java/com/mh/user/model/SanShiFengDatas.java
  70. 23
      user-service/src/main/java/com/mh/user/model/SanShiFengReceiver.java
  71. 33
      user-service/src/main/java/com/mh/user/model/SanShiFengStrDatas.java
  72. 5
      user-service/src/main/java/com/mh/user/model/SerialPortModel.java
  73. 15
      user-service/src/main/java/com/mh/user/model/SysUser.java
  74. 40
      user-service/src/main/java/com/mh/user/netty/task/CallbackTaskScheduler.java
  75. 2
      user-service/src/main/java/com/mh/user/service/CodeTableService.java
  76. 44
      user-service/src/main/java/com/mh/user/service/CollectionParamsManageService.java
  77. 5
      user-service/src/main/java/com/mh/user/service/DeviceControlService.java
  78. 2
      user-service/src/main/java/com/mh/user/service/DeviceInstallService.java
  79. 4
      user-service/src/main/java/com/mh/user/service/GatewayManageService.java
  80. 8
      user-service/src/main/java/com/mh/user/service/NowDataService.java
  81. 3
      user-service/src/main/java/com/mh/user/service/impl/BuildingServiceImpl.java
  82. 6
      user-service/src/main/java/com/mh/user/service/impl/CodeTableServiceImpl.java
  83. 887
      user-service/src/main/java/com/mh/user/service/impl/CollectionParamsManageServiceImpl.java
  84. 342
      user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java
  85. 118
      user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java
  86. 4
      user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java
  87. 10
      user-service/src/main/java/com/mh/user/service/impl/GatewayManageServiceImpl.java
  88. 439
      user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java
  89. 24
      user-service/src/main/java/com/mh/user/service/impl/NowPublicDataServiceImpl.java
  90. 22
      user-service/src/main/java/com/mh/user/service/mqtt/config/MqttConfig.java
  91. 47
      user-service/src/main/java/com/mh/user/service/mqtt/config/MqttInboundConfig.java
  92. 26
      user-service/src/main/java/com/mh/user/service/mqtt/config/MqttOutboundConfig.java
  93. 17
      user-service/src/main/java/com/mh/user/service/mqtt/service/IMqttManagerService.java
  94. 644
      user-service/src/main/java/com/mh/user/service/mqtt/service/impl/EventsServiceImpl.java
  95. 64
      user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttManagerServiceImpl.java
  96. 16
      user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttTopicServiceImpl.java
  97. 4
      user-service/src/main/java/com/mh/user/strategy/BackTempControlStrategy.java
  98. 4
      user-service/src/main/java/com/mh/user/strategy/DeviceStrategy.java
  99. 41
      user-service/src/main/java/com/mh/user/strategy/EleMeterStrategy.java
  100. 4
      user-service/src/main/java/com/mh/user/strategy/HeatPumpStatusStrategy.java
  101. Some files were not shown because too many files have changed in this diff Show More

22
pom.xml

@ -17,7 +17,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version> <version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
@ -50,33 +50,21 @@
<dependency> <dependency>
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId> <artifactId>spring-messaging</artifactId>
<version>5.3.39</version> <version>6.2.1</version>
</dependency> </dependency>
<!-- spring-integration-mqtt --> <!-- spring-integration-mqtt -->
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-core</artifactId>
<version>5.5.18</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.integration</groupId> <groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId> <artifactId>spring-integration-mqtt</artifactId>
<version>5.5.18</version> <version>6.3.4</version>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-integration</artifactId>-->
<!-- <version>3.4.2</version>-->
<!-- </dependency>-->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId> <artifactId>spring-boot-starter-integration</artifactId>
<version>3.4.2</version>
</dependency> </dependency>
</dependencies> </dependencies>
<dependencyManagement> <dependencyManagement>

11
user-service/pom.xml

@ -58,11 +58,6 @@
<artifactId>mybatis-spring-boot-starter</artifactId> <artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version> <version>2.3.0</version>
</dependency> </dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.2.3</version>
</dependency>
<!-- druid配置--> <!-- druid配置-->
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
@ -124,6 +119,12 @@
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.3.9</version>
</dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId> <artifactId>commons-pool2</artifactId>

2
user-service/src/main/java/com/mh/user/config/CorsConfig.java

@ -30,7 +30,7 @@ public class CorsConfig implements WebMvcConfigurer {
@Override @Override
public void addCorsMappings(CorsRegistry registry) { public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 允许跨域访问的路径 registry.addMapping("/**") // 允许跨域访问的路径
.allowedOriginPatterns("*") // 使用allowedOriginPatterns代替allowedOrigins .allowedOrigins("*") // 允许跨域访问的源
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允许请求方法 .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允许请求方法
.maxAge(168000) // 预检间隔时间 .maxAge(168000) // 预检间隔时间
.allowedHeaders("*") // 允许头部设置 .allowedHeaders("*") // 允许头部设置

11
user-service/src/main/java/com/mh/user/config/DruidConfig.java

@ -88,15 +88,14 @@ public class DruidConfig {
ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<Servlet>(new StatViewServlet(), "/druid/*"); ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<Servlet>(new StatViewServlet(), "/druid/*");
//白名单: //白名单:
servletRegistrationBean.addInitParameter("allow","127.0.0.1"); // servletRegistrationBean.addInitParameter("allow","127.0.0.1,139.196.87.48");
//IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page. //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
// servletRegistrationBean.addInitParameter("deny","192.168.1.222"); servletRegistrationBean.addInitParameter("deny","192.168.1.222");
//登录查看信息的账号密码, 用于登录Druid监控后台 //登录查看信息的账号密码, 用于登录Druid监控后台
servletRegistrationBean.addInitParameter("loginUsername", "mhtech"); servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "mh9082@!!qwedss"); servletRegistrationBean.addInitParameter("loginPassword", "admin");
//是否能够重置数据. //是否能够重置数据.
servletRegistrationBean.addInitParameter("resetEnable", "false"); servletRegistrationBean.addInitParameter("resetEnable", "true");
servletRegistrationBean.setEnabled(false);
return servletRegistrationBean; return servletRegistrationBean;
} }

49
user-service/src/main/java/com/mh/user/config/MyJacksonConfig.java

@ -1,49 +0,0 @@
package com.mh.user.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.mh.user.model.MyBigDecimalDeserializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.math.BigDecimal;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 避免使用科学计数算法
* @date 2026-01-07 14:37:11
*/
@Configuration
public class MyJacksonConfig {
@Bean("customObjectMapper")
public ObjectMapper customObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
// 注册 JavaTimeModule
mapper.registerModule(new JavaTimeModule());
// 启用 BigDecimal 作为普通格式输出(避免科学计数法)
mapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
// 注册自定义反序列化器
SimpleModule module = new SimpleModule();
module.addDeserializer(BigDecimal.class, new MyBigDecimalDeserializer());
mapper.registerModule(module);
// 启用 BigDecimal 处理浮点数
mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
return mapper;
}
}

62
user-service/src/main/java/com/mh/user/config/mqtt/InboundMessageRouter.java

@ -0,0 +1,62 @@
package com.mh.user.config.mqtt;
import com.mh.user.config.MHConfig;
import com.mh.user.constants.ChannelName;
import com.mh.user.constants.TopicEnum;
import com.mh.user.utils.SpringBeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.annotation.Router;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.integration.router.AbstractMessageRouter;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Component;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
/**
* @author LJF
* @version 1.0
* @project springboot-mqtt-demo
* @description 入站消息路由分发中心
* @date 2024-10-29 17:04:17
*/
@Slf4j
@Component
public class InboundMessageRouter extends AbstractMessageRouter {
/** 系统基础配置 */
@Autowired
private MHConfig mHConfig;
/**
* 目前只需要这个方式后期在拓展使用IntegrationFlow方式
* @param message
* @return
*/
@Router(inputChannel = ChannelName.INBOUND)
@Override
protected Collection<MessageChannel> determineTargetChannels(Message<?> message) {
MessageHeaders headers = message.getHeaders();
String topic = Objects.requireNonNull(headers.get(MqttHeaders.RECEIVED_TOPIC)).toString();
// byte[] payload = (byte[]) message.getPayload();
// log.info("从当前主题 topic: {}, 接收到的消息:{}", topic, new String(payload));
// 判断当前主题是否是当前项目的,温湿度目前写死的
if (!topic.startsWith(mHConfig.getName()) && !topic.contains("/temp")) {
log.info("当前主题 topic: {} 不是当前项目的,直接丢弃", topic);
return Collections.singleton((MessageChannel) SpringBeanUtil.getBean(ChannelName.DEFAULT_BOUND));
}
// 找到对应的主题消息通道
if (topic.contains("/temp")) {
return Collections.singleton((MessageChannel) SpringBeanUtil.getBean(ChannelName.EVENTS_UPLOAD_INBOUND));
} else {
TopicEnum topicEnum = TopicEnum.find(mHConfig.getName() + "/", topic);
MessageChannel bean = (MessageChannel) SpringBeanUtil.getBean(topicEnum.getBeanName());
return Collections.singleton(bean);
}
}
}

99
user-service/src/main/java/com/mh/user/config/mqtt/MqttConfig.java

@ -0,0 +1,99 @@
package com.mh.user.config.mqtt;
import com.mh.user.constants.MqttClientOptions;
import com.mh.user.constants.MqttProtocolEnum;
import com.mh.user.constants.MqttUseEnum;
import lombok.Data;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.util.StringUtils;
import java.util.Map;
/**
* @author LJF
* @version 1.0
* @project springboot-mqtt-demo
* @description mqtt连接配置
* @date 2024-10-29 14:44:51
*/
@Configuration
@Data
@ConfigurationProperties
public class MqttConfig {
private static Map<MqttUseEnum, MqttClientOptions> mqttSpring;
public void setMqttSpring(Map<MqttUseEnum, MqttClientOptions> mqtt) {
MqttConfig.mqttSpring = mqtt;
}
/**
* 获取mqtt基本配置
* @return
*/
static MqttClientOptions getBasicMqttClientOptions() {
if (!mqttSpring.containsKey(MqttUseEnum.BASIC)) {
throw new Error("请先配置MQTT的基本连接参数,否则无法启动项目");
}
return mqttSpring.get(MqttUseEnum.BASIC);
}
/**
* 拼接获取对应mqtt的连接地址
* @param options
* @return
*/
public static String getMqttAddress(MqttClientOptions options) {
StringBuilder addr = new StringBuilder();
addr.append(options.getProtocol().getProtocolAddr())
.append(options.getHost().trim())
.append(":")
.append(options.getPort());
if ((options.getProtocol() == MqttProtocolEnum.WS || options.getProtocol() == MqttProtocolEnum.WSS)
&& StringUtils.hasText(options.getPath())) {
addr.append(options.getPath());
}
return addr.toString();
}
public static String getBasicMqttAddress() {
return getMqttAddress(getBasicMqttClientOptions());
}
/**
* 获取连接参数注入到spring中
* @return
*/
@Bean
public MqttConnectOptions mqttConnectionOptions() {
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
MqttClientOptions customizeOptions = getBasicMqttClientOptions();
String basicMqttAddress = getBasicMqttAddress();
mqttConnectOptions.setServerURIs(new String[]{basicMqttAddress});
mqttConnectOptions.setUserName(StringUtils.hasText(customizeOptions.getUsername()) ?
customizeOptions.getUsername() : "");
mqttConnectOptions.setPassword(StringUtils.hasText(customizeOptions.getPassword()) ?
customizeOptions.getPassword().toCharArray() : new char[0]);
// 直接进行自动连接
mqttConnectOptions.setAutomaticReconnect(true);
// 时间间隔时间10s
mqttConnectOptions.setKeepAliveInterval(10);
return mqttConnectOptions;
}
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(mqttConnectionOptions());
return factory;
}
}

91
user-service/src/main/java/com/mh/user/config/mqtt/MqttInboundConfig.java

@ -0,0 +1,91 @@
package com.mh.user.config.mqtt;
import com.mh.user.constants.ChannelName;
import com.mh.user.constants.MqttClientOptions;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.IntegrationComponentScan;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.endpoint.MessageProducerSupport;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import javax.annotation.Resource;
/**
* @author LJF
* @version 1.0
* @project springboot-mqtt-demo
* @description 入站配置
* @date 2024-10-29 16:22:10
*/
@Slf4j
@Configuration
@IntegrationComponentScan
public class MqttInboundConfig {
@Autowired
private MqttPahoClientFactory mqttClientFactory;
@Resource(name = ChannelName.INBOUND)
private MessageChannel inboundChannel;
private String clientId;
/**
* 入站适配器
* @return
*/
@Bean(name = "adapter")
public MessageProducerSupport mqttInbound() {
MqttClientOptions options = MqttConfig.getBasicMqttClientOptions();
// 此处初始化的时候,默认订阅了配置文件中已经写好的topic
// 如果需要订阅多个,可以自己手动订阅,会写一个addTopic()进行添加订阅
clientId = options.getClientId() + "_consumer_" + System.currentTimeMillis();
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(
clientId,
mqttClientFactory,
options.getInboundTopic().split(","));
// System.out.println("每一次都会入站适配器吗?"+clientId);
DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
// 统一是字节处理
converter.setPayloadAsBytes(true);
// 设置消息转换器
adapter.setConverter(converter);
// 设置qos(quality of service)
// 0:最多一次传输(消息会丢失),
// 1:至少一次传输(消息会重复),
// 2:只有当消息发送成功时才确认(消息不回丢,但延迟高)。
adapter.setQos(0);
// 设置在接收已经订阅的主题信息后,发送给哪个通道,具体的发送方法需要翻上层的抽象类
adapter.setOutputChannel(inboundChannel);
return adapter;
}
/**
* 默认声明一个消息处理器用于处理无效的消息
* @return
*/
@Bean
@ServiceActivator(inputChannel = ChannelName.DEFAULT_BOUND)
public MessageHandler handler() {
return message -> {
log.info("The default channel does not handle messages." +
"\nTopic: {}" +
"\nPayload: {}",
message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC),
message.getPayload());
};
}
public String getClientId() {
return clientId;
}
}

55
user-service/src/main/java/com/mh/user/config/mqtt/MqttMessageChannel.java

@ -0,0 +1,55 @@
package com.mh.user.config.mqtt;
import com.mh.user.constants.ChannelName;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.messaging.MessageChannel;
/**
* @author LJF
* @version 1.0
* @project springboot-mqtt-demo
* @description 声明所有通道的定义类
* @date 2024-10-29 16:23:32
*/
@Slf4j
@Configuration
public class MqttMessageChannel {
@Bean(name = ChannelName.OUTBOUND)
public MessageChannel outboundChannel() {
return new DirectChannel();
}
@Bean(name = ChannelName.INBOUND)
public MessageChannel inboundChannel() {
return new DirectChannel();
}
/**
* 事件主动上报通道
* @return
*/
@Bean(name = ChannelName.EVENTS_UPLOAD_INBOUND)
public MessageChannel eventsUploadInbound() {
return new DirectChannel();
}
@Bean(name = ChannelName.EVENTS_COLLECTION_INBOUND)
public MessageChannel eventsCollectionInbound() {
return new DirectChannel();
}
@Bean(name = ChannelName.EVENTS_CONTROL_INBOUND)
public MessageChannel eventsControlInbound() {
return new DirectChannel();
}
@Bean(name = ChannelName.EVENTS_SEND_INBOUND)
public MessageChannel eventsSendInbound() {
return new DirectChannel();
}
}

51
user-service/src/main/java/com/mh/user/config/mqtt/MqttOutboundConfig.java

@ -0,0 +1,51 @@
package com.mh.user.config.mqtt;
import com.mh.user.constants.ChannelName;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.IntegrationComponentScan;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
import org.springframework.messaging.MessageHandler;
/**
* @author LJF
* @version 1.0
* @project springboot-mqtt-demo
* @description 入站配置
* @date 2024-10-29 16:22:10
*/
@Slf4j
@Configuration
@IntegrationComponentScan
public class MqttOutboundConfig {
@Autowired
private MqttPahoClientFactory mqttClientFactory;
/**
* 默认声明一个出站处理器用于处理无效的消息
* @return
*/
@Bean
@ServiceActivator(inputChannel = ChannelName.OUTBOUND)
public MessageHandler mqttOutbound() {
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(
MqttConfig.getBasicMqttClientOptions().getClientId() + "_producer_" + System.currentTimeMillis(),
mqttClientFactory);
DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
// use byte types uniformly
converter.setPayloadAsBytes(true);
messageHandler.setAsync(true);
messageHandler.setDefaultQos(0);
messageHandler.setConverter(converter);
return messageHandler;
}
}

1
user-service/src/main/java/com/mh/user/constants/Constant.java

@ -13,7 +13,6 @@ public class Constant {
public static final CharSequence CUSTOM_NAME_GUANGSHANG = "广州商学院"; public static final CharSequence CUSTOM_NAME_GUANGSHANG = "广州商学院";
public static final CharSequence CUSTOM_NAME_ZBSD = "北京师范大学珠海校区"; public static final CharSequence CUSTOM_NAME_ZBSD = "北京师范大学珠海校区";
public static final CharSequence CUSTOM_NAME_HUARUAN = "广州软件学院"; public static final CharSequence CUSTOM_NAME_HUARUAN = "广州软件学院";
public static final CharSequence CUSTOM_NAME_LIGONG = "理工学院";
public static final String WEATHER_DATA = "weather_data"; public static final String WEATHER_DATA = "weather_data";
public static final String COMMUNITY_TYPE_REAL_COM = "realCom"; public static final String COMMUNITY_TYPE_REAL_COM = "realCom";
public static final String COMMUNITY_TYPE_TCP = "tcp"; public static final String COMMUNITY_TYPE_TCP = "tcp";

3
user-service/src/main/java/com/mh/user/constants/DeviceEnum.java

@ -24,8 +24,7 @@ public enum DeviceEnum {
StatusCheckEnum("状态检测", StatusCheck.getInstance()), StatusCheckEnum("状态检测", StatusCheck.getInstance()),
TempTransEnum("温度变送器", TempTrans.getInstance()), TempTransEnum("温度变送器", TempTrans.getInstance()),
HeatPumpStatusEnum("热泵状态", HeatPumpStatus.getInstance()), HeatPumpStatusEnum("热泵状态", HeatPumpStatus.getInstance()),
MultiControlEnum("多路控制", MultiControl.getInstance()), MultiControlEnum("多路控制", MultiControl.getInstance());
SystemParamsEnum("系统", SystemParams.getInstance());
private String deviceType; private String deviceType;

3
user-service/src/main/java/com/mh/user/constants/DeviceStrategyEnum.java

@ -24,8 +24,7 @@ public enum DeviceStrategyEnum {
StatusCheckEnum("状态检测", StatusCheckStrategy.getInstance()), StatusCheckEnum("状态检测", StatusCheckStrategy.getInstance()),
TempTransEnum("温度变送器", TempTransStrategy.getInstance()), TempTransEnum("温度变送器", TempTransStrategy.getInstance()),
HeatPumpStatusEnum("热泵状态", HeatPumpStatusStrategy.getInstance()), HeatPumpStatusEnum("热泵状态", HeatPumpStatusStrategy.getInstance()),
MultiControlEnum("多路控制", MultiControlStrategy.getInstance()), MultiControlEnum("多路控制", MultiControlStrategy.getInstance());
SystemParamsEnum("系统", SystemParamsStrategy.getInstance());
private String deviceType; private String deviceType;

2
user-service/src/main/java/com/mh/user/constants/TopicEnum.java

@ -14,7 +14,7 @@ import static com.mh.user.constants.TopicConst.*;
public enum TopicEnum { public enum TopicEnum {
/** /**
* 客户端主动上报数据 * 冷水机组客户端主动上报数据
*/ */
CLIENT_UPLOAD_DATA(Pattern.compile("^" + MH_UPLOAD + EVENTS_UPLOAD + REGEX_SN + "$"), ChannelName.EVENTS_UPLOAD_INBOUND), CLIENT_UPLOAD_DATA(Pattern.compile("^" + MH_UPLOAD + EVENTS_UPLOAD + REGEX_SN + "$"), ChannelName.EVENTS_UPLOAD_INBOUND),

17
user-service/src/main/java/com/mh/user/controller/BuildingController.java

@ -5,7 +5,6 @@ import com.mh.user.annotation.SysLogger;
import com.mh.user.entity.BuildingEntity; import com.mh.user.entity.BuildingEntity;
import com.mh.user.model.AreaBuildingTreeModel; import com.mh.user.model.AreaBuildingTreeModel;
import com.mh.user.model.BuildingModel; import com.mh.user.model.BuildingModel;
import com.mh.user.service.AreaService;
import com.mh.user.service.BuildingService; import com.mh.user.service.BuildingService;
import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFSheet;
@ -30,9 +29,6 @@ public class BuildingController {
@Autowired @Autowired
private BuildingService buildingService; private BuildingService buildingService;
@Autowired
private AreaService areaService;
//保存 //保存
@SysLogger(title="楼栋信息",optDesc = "保存楼栋信息") @SysLogger(title="楼栋信息",optDesc = "保存楼栋信息")
@PostMapping(value="/save") @PostMapping(value="/save")
@ -189,9 +185,6 @@ public class BuildingController {
case 9 : case 9 :
rolName = "热泵个数"; rolName = "热泵个数";
break; break;
case 10:
rolName = "区域名称";
break;
} }
if ((rol >= 1)&&(rol <= 4)&&(sCell.equals(""))){ if ((rol >= 1)&&(rol <= 4)&&(sCell.equals(""))){
msg = rolName + "不能为空" ; msg = rolName + "不能为空" ;
@ -212,15 +205,7 @@ public class BuildingController {
uploadEntity.setTankHeight(Double.parseDouble(deviceList.get(6))); //默认(高区)水箱高度 uploadEntity.setTankHeight(Double.parseDouble(deviceList.get(6))); //默认(高区)水箱高度
uploadEntity.setLowTankHeight(Double.parseDouble(deviceList.get(7))); //低区水箱高度 uploadEntity.setLowTankHeight(Double.parseDouble(deviceList.get(7))); //低区水箱高度
uploadEntity.setPumpCount(Integer.parseInt(deviceList.get(8))); //热泵个数 uploadEntity.setPumpCount(Integer.parseInt(deviceList.get(8))); //热泵个数
uploadEntity.setAreaName(deviceList.get(9)); //区域名称
// 根据区域名称查询区域ID
int areaId = areaService.selectByAreaName(uploadEntity.getAreaName());
if (areaId != 0) {
httpResult.setMsg(uploadEntity.getAreaName() + "区域名称有误!");
httpResult.setCode(500);
return httpResult;
}
uploadEntity.setAreaId(String.valueOf(areaId));
deviceList.clear(); deviceList.clear();
uploadEntityList.add(uploadEntity); uploadEntityList.add(uploadEntity);

7
user-service/src/main/java/com/mh/user/controller/CodeTableController.java

@ -29,11 +29,4 @@ public class CodeTableController {
list=codeTableService.queryBrand(); list=codeTableService.queryBrand();
return HttpResult.ok(list); return HttpResult.ok(list);
} }
@PostMapping("/paramType")
public HttpResult queryParamType(){
List<DeviceTypeModel> list;
list=codeTableService.queryDataByName("paramType");
return HttpResult.ok(list);
}
} }

71
user-service/src/main/java/com/mh/user/controller/CollectionParamsManageController.java

@ -1,71 +0,0 @@
package com.mh.user.controller;
import com.mh.common.http.HttpResult;
import com.mh.common.utils.StringUtils;
import com.mh.user.annotation.SysLogger;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.model.DeviceModel;
import com.mh.user.service.*;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 基表参数信息管理
*/
@RestController
@RequestMapping("cpm")
public class CollectionParamsManageController {
@Autowired
private CollectionParamsManageService collectionParamsManageService;
//保存
@SysLogger(title="基表采集信息",optDesc = "保存基表采集参数信息")
@PostMapping(value="/save")
public HttpResult saveDevice(@RequestBody CollectionParamsManageEntity collectionParamsManageEntity) {
return HttpResult.ok(collectionParamsManageService.insertCPM(collectionParamsManageEntity));
}
//修改
@SysLogger(title="基表采集参数信息",optDesc = "修改基表采集参数信息")
@PostMapping(value="/update")
public HttpResult updateDevice(@RequestBody CollectionParamsManageEntity collectionParamsManageEntity) {
return HttpResult.ok(collectionParamsManageService.updateCPM(collectionParamsManageEntity));
}
// 删除多
@PostMapping(value="/deletes")
public HttpResult deleteDevices(@RequestBody String[] ids) {
return HttpResult.ok(collectionParamsManageService.deleteByIds(ids));
}
// 按条件查询
@SysLogger(title="基表采集信息",optDesc = "按条件查询基表采集参数信息")
@PostMapping(value="/query")
public HttpResult queryDevice( @RequestParam(value = "deviceInstallId", required = false)String deviceInstallId,
@RequestParam(value = "buildingId", required = false)String buildingId,
@RequestParam(value = "otherName", required = false)String otherName,
@RequestParam(value = "page", required=true)Integer page,
@RequestParam(value = "limit", required=true)Integer limit) {
try{
int count=collectionParamsManageService.selectCPMListCount(buildingId, deviceInstallId,otherName, page, limit);
List<CollectionParamsManageEntity> records=collectionParamsManageService.selectCPMList(buildingId, deviceInstallId,otherName, page, limit);
return HttpResult.ok(count,records);
}catch (Exception e){
return HttpResult.error(e.getMessage());
}
}
}

11
user-service/src/main/java/com/mh/user/controller/DeviceInstallController.java

@ -279,18 +279,12 @@ public class DeviceInstallController {
uploadEntity.setDeviceType(deviceList.get(2));//设备类型 uploadEntity.setDeviceType(deviceList.get(2));//设备类型
uploadEntity.setDataCom(deviceList.get(3));//通讯端口 uploadEntity.setDataCom(deviceList.get(3));//通讯端口
uploadEntity.setBaudRate(Integer.parseInt(deviceList.get(4)));//波特率 uploadEntity.setBaudRate(Integer.parseInt(deviceList.get(4)));//波特率
uploadEntity.setParity(deviceList.get(5));//校验位 uploadEntity.setParity(deviceList.get(5));//波特率
uploadEntity.setRatio(Double.parseDouble(deviceList.get(6)));//倍率 uploadEntity.setRatio(Double.parseDouble(deviceList.get(6)));//倍率
uploadEntity.setBrand(deviceList.get(7));//品牌 uploadEntity.setBrand(deviceList.get(7));//品牌
uploadEntity.setModel(deviceList.get(8));//型号 uploadEntity.setModel(deviceList.get(8));//型号
uploadEntity.setInstaller(deviceList.get(9));//安装人员 uploadEntity.setInstaller(deviceList.get(9));//安装人员
uploadEntity.setBuildingName(deviceList.get(10));//所属楼栋 uploadEntity.setBuildingName(deviceList.get(10));//所属楼栋
Integer buildingId = buildingService.selectBuildingIdByName(uploadEntity.getBuildingName());
if (buildingId == null) {
httpResult.setMsg(uploadEntity.getBuildingName() + "没有当前楼栋名称!");
httpResult.setCode(500);
return httpResult;
}
if (deviceList.get(11).equals("是")){ if (deviceList.get(11).equals("是")){
uploadEntity.setIsUse(1); uploadEntity.setIsUse(1);
}else{ }else{
@ -317,8 +311,7 @@ public class DeviceInstallController {
} }
} catch (IOException e) { } catch (IOException e) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
httpResult.setMsg("批量插入异常,异常信息:" + e.getMessage()); e.printStackTrace();
httpResult.setCode(500);
} }
return httpResult; return httpResult;
} }

46
user-service/src/main/java/com/mh/user/controller/DeviceOperateController.java

@ -4,7 +4,6 @@ import com.alibaba.fastjson2.JSONObject;
import com.mh.common.http.HttpResult; import com.mh.common.http.HttpResult;
import com.mh.common.utils.StringUtils; import com.mh.common.utils.StringUtils;
import com.mh.user.annotation.SysLogger; import com.mh.user.annotation.SysLogger;
import com.mh.user.config.MHConfig;
import com.mh.user.constants.Constant; import com.mh.user.constants.Constant;
import com.mh.user.entity.ControlSetEntity; import com.mh.user.entity.ControlSetEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
@ -14,11 +13,9 @@ import com.mh.user.model.DeviceModel;
import com.mh.user.model.SerialPortModel; import com.mh.user.model.SerialPortModel;
import com.mh.user.serialport.SerialPortSingle2; import com.mh.user.serialport.SerialPortSingle2;
import com.mh.user.service.*; import com.mh.user.service.*;
import com.mh.user.service.mqtt.service.IMqttGatewayService;
import com.mh.user.utils.ExchangeStringUtil; import com.mh.user.utils.ExchangeStringUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -45,14 +42,6 @@ public class DeviceOperateController {
@Autowired @Autowired
private DeviceControlService deviceControlService; private DeviceControlService deviceControlService;
@Autowired
private MHConfig mhConfig;
@Value("${control.topic}")
String controlTopic;
@Autowired
private IMqttGatewayService iMqttGatewayService;
//操作设备 //操作设备
@SysLogger(title = "控制管理", optDesc = "设置设备参数值") @SysLogger(title = "控制管理", optDesc = "设置设备参数值")
@ -60,44 +49,11 @@ public class DeviceOperateController {
public HttpResult operateDevice(@RequestBody List<SerialPortModel> params) { public HttpResult operateDevice(@RequestBody List<SerialPortModel> params) {
try { try {
Constant.WEB_FLAG = true; //单抄,暂时停止采集 Constant.WEB_FLAG = true; //单抄,暂时停止采集
// 判断通讯方式 Thread.sleep(1000);
if (deviceControlService.isMqttControl(params)) {
for (SerialPortModel serialPortModel :
params) {
String sn = deviceControlService.getSn(serialPortModel);
if (StringUtils.isBlank(sn)) {
return HttpResult.error(500, "mqtt设备未配置SN");
}
String sendOrder = deviceControlService.operationDevice(serialPortModel);
if (Constant.FAIL.equals(sendOrder)) {
return HttpResult.error(500, "fail");
}
String name = mhConfig.getName();
// 获取mqtt操作队列(后期通过mqtt队列配置发送主题)
String sendTopic = name + "/" + controlTopic + "/" + sn;
log.info("发送主题:{},消息:{}", sendTopic, sendOrder);
iMqttGatewayService.publish(sendTopic, sendOrder, 0);
// 判断当前cpmId是否是 11:固定是 启用写入时间戳
if (serialPortModel.getCpmId().equals("11")) {
// 是的话,重新写入,启用时间写入值变成 0
serialPortModel.setDataValue("0");
sendOrder = deviceControlService.operationDevice(serialPortModel);
if (Constant.FAIL.equals(sendOrder)) {
return HttpResult.error(500, "fail");
}
name = mhConfig.getName();
// 获取mqtt操作队列(后期通过mqtt队列配置发送主题)
sendTopic = name + "/" + controlTopic + "/" + sn;
log.info("发送主题:{},消息:{}", sendTopic, sendOrder);
iMqttGatewayService.publish(sendTopic, sendOrder, 0);
}
}
} else {
String returnStr = deviceControlService.readOrWriteDevice(params, Constant.WRITE); String returnStr = deviceControlService.readOrWriteDevice(params, Constant.WRITE);
if (!StringUtils.isBlank(returnStr) && "fail".equals(returnStr)) { if (!StringUtils.isBlank(returnStr) && "fail".equals(returnStr)) {
return HttpResult.error(500, "fail"); return HttpResult.error(500, "fail");
} }
}
Constant.WEB_FLAG = false; //单抄,恢复采集 Constant.WEB_FLAG = false; //单抄,恢复采集
return HttpResult.ok(); return HttpResult.ok();
} catch (Exception e) { } catch (Exception e) {

52
user-service/src/main/java/com/mh/user/controller/HotWaterMonitorController.java

@ -1,52 +0,0 @@
package com.mh.user.controller;
import com.mh.common.http.HttpResult;
import com.mh.user.dto.HotWaterControlDTO;
import com.mh.user.dto.HotWaterNowDataDTO;
import com.mh.user.service.CollectionParamsManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 热水监控
* @date 2025-12-16 16:02:20
*/
@RestController
@RequestMapping("/device/hotWater")
public class HotWaterMonitorController {
@Autowired
private CollectionParamsManageService collectionParamsManageService;
/**
* 获取生活热水监控热泵信息
* @param buildingId
* @return
*/
@GetMapping("/monitorList")
public HttpResult monitorList(@RequestParam("buildingId") String buildingId) {
List<HotWaterNowDataDTO> list = collectionParamsManageService.monitorList(buildingId);
return HttpResult. ok(list);
}
/**
* 获取生活热水监控操作信息内容
* @param buildingId
* @return
*/
@GetMapping("/operateList")
public HttpResult operateList(@RequestParam("buildingId") String buildingId) {
List<HotWaterControlDTO> list = collectionParamsManageService.operateList(buildingId);
return HttpResult.ok(list);
}
}

58
user-service/src/main/java/com/mh/user/controller/NowDataController.java

@ -17,11 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -46,9 +42,6 @@ public class NowDataController {
@Autowired @Autowired
DeviceFloorService deviceFloorService; DeviceFloorService deviceFloorService;
@Autowired
CollectionParamsManageService collectingManagerService;
@SysLogger(title = "实时监控", optDesc = "实时查看每楼栋热水运行情况") @SysLogger(title = "实时监控", optDesc = "实时查看每楼栋热水运行情况")
@PostMapping("/queryNow") @PostMapping("/queryNow")
public HttpResult queryNowData(@RequestParam(value = "buildingId") String buildingId) { public HttpResult queryNowData(@RequestParam(value = "buildingId") String buildingId) {
@ -58,22 +51,15 @@ public class NowDataController {
String maxWaterTemp = nowDataService.selectMaxTemp(buildingId); String maxWaterTemp = nowDataService.selectMaxTemp(buildingId);
String buildingName = buildingService.queryBuildingName(buildingId);//获取楼栋名称 String buildingName = buildingService.queryBuildingName(buildingId);//获取楼栋名称
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date();
// Date date = new Date(); String curDate = sdf1.format(date);
// String curDate = sdf1.format(date); curDate = curDate.substring(0, 13) + ":00:00";
// curDate = curDate.substring(0, 13) + ":00:00";
String curDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00"));
NowPublicDataEntity nowPublicData = new NowPublicDataEntity(); NowPublicDataEntity nowPublicData = new NowPublicDataEntity();
nowPublicData.setBuildingId(buildingId); nowPublicData.setBuildingId(buildingId);
nowPublicData.setBuildingName(buildingName); nowPublicData.setBuildingName(buildingName);
if (avgWaterTemp != null) {
// 判断是否有回水温度
CollectionParamsManageEntity collectionParamsManageEntity = collectingManagerService.selectDeviceInstallByOtherName("回水温度", buildingId);
if (collectionParamsManageEntity != null && collectionParamsManageEntity.getCurValue().compareTo(BigDecimal.ZERO) > 0) {
nowPublicData.setBackWaterTemp(collectionParamsManageEntity.getCurValue().setScale(1, RoundingMode.HALF_UP).toString());
} else if (avgWaterTemp != null) {
nowPublicData.setBackWaterTemp(avgWaterTemp); nowPublicData.setBackWaterTemp(avgWaterTemp);
} else { } else {
nowPublicData.setBackWaterTemp("0"); nowPublicData.setBackWaterTemp("0");
@ -131,12 +117,10 @@ public class NowDataController {
String maxWaterTemp = nowDataService.selectMaxTemp(buildingId); String maxWaterTemp = nowDataService.selectMaxTemp(buildingId);
String buildingName = buildingService.queryBuildingName(buildingId);//获取楼栋名称 String buildingName = buildingService.queryBuildingName(buildingId);//获取楼栋名称
// SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// Date date = new Date(); Date date = new Date();
// String curDate = sdf1.format(date); String curDate = sdf1.format(date);
// curDate = curDate.substring(0, 13) + ":00:00"; curDate = curDate.substring(0, 13) + ":00:00";
String curDate = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00"));
NowPublicDataEntity nowPublicData = new NowPublicDataEntity(); NowPublicDataEntity nowPublicData = new NowPublicDataEntity();
nowPublicData.setBuildingId(buildingId); nowPublicData.setBuildingId(buildingId);
@ -319,30 +303,6 @@ public class NowDataController {
} }
} }
@SysLogger(title = "压力变化表", optDesc = "压力变化查询")
@PostMapping("/waterPressure")
public HttpResult queryWaterPressure(@RequestParam(value = "buildingID") String buildingID,
@RequestParam(value = "curDate") String curDate,
@RequestParam(value = "level", defaultValue = "0") int level,
@RequestParam(value = "page") int page,
@RequestParam(value = "limit") int limit) {
try {
List<WaterPressureEntity> list;
int count;
// 校区或者区域
if (buildingID == null || buildingID.equals("") || buildingID.equals("所有楼栋") || level == 0 || level == 1) {
list = nowDataService.queryWaterPressure2(curDate, page, limit, level, buildingID);
count = list.size();
} else {
list = nowDataService.queryWaterPressure(buildingID, curDate, page, limit);
count = nowDataService.queryWaterPressureCount(buildingID, curDate);
}
return HttpResult.ok(count, list);
} catch (Exception e) {
return HttpResult.error("查询出错!" + e.getMessage());
}
}
//查询运行时长 //查询运行时长
@SysLogger(title = "运行时长", optDesc = "热泵运行时长查询") @SysLogger(title = "运行时长", optDesc = "热泵运行时长查询")
@PostMapping("/minutes") @PostMapping("/minutes")

3
user-service/src/main/java/com/mh/user/controller/SysRoleController.java

@ -119,9 +119,6 @@ public class SysRoleController {
try{ try{
List<SysRole> list=sysRoleService.queryRoles(roleName,page,limit); List<SysRole> list=sysRoleService.queryRoles(roleName,page,limit);
int count=sysRoleService.getCount(roleName,page,limit); int count=sysRoleService.getCount(roleName,page,limit);
// 过滤掉超级管理员
list.removeIf(item -> "超级管理员".equalsIgnoreCase(item.getName()));
count = count - 1;
return HttpResult.ok(count,list); return HttpResult.ok(count,list);
}catch (Exception e){ }catch (Exception e){
return HttpResult.error(); return HttpResult.error();

10
user-service/src/main/java/com/mh/user/controller/SysUserController.java

@ -148,16 +148,6 @@ public class SysUserController {
try{ try{
List<SysUser> list=sysUserService.queryUsers(userName,page,limit); List<SysUser> list=sysUserService.queryUsers(userName,page,limit);
int count=sysUserService.getCount(userName,page,limit); int count=sysUserService.getCount(userName,page,limit);
// 过滤掉超级管理员
list.removeIf(user -> SysConstants.ADMIN.equalsIgnoreCase(user.getUserName()));
// 过滤掉角色是超级管理员的
list.removeIf(user -> "超级管理员".equalsIgnoreCase(user.getRoleNames()));
count=count-2;
// 手机,邮箱进行敏感信息处理
for(SysUser user:list){
user.setMobile("******");
user.setEmail("******");
}
return HttpResult.ok(count,list); return HttpResult.ok(count,list);
}catch (Exception e){ }catch (Exception e){
return HttpResult.error(); return HttpResult.error();

179
user-service/src/main/java/com/mh/user/dto/HotWaterBackPumpControlVO.java

@ -1,179 +0,0 @@
package com.mh.user.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.StringJoiner;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 回水泵热泵控制界面VO
* @date 2025-03-14 09:00:37
*/
@Setter
@Getter
public class HotWaterBackPumpControlVO {
private String id;
private String name;
private int orderNum;
// 定时_时开1
private int oneHourTimeOpenSetOne;
private String oneHourTimeOpenSetOneId;
// 定时_分开1
private int oneMinTimeOpenSetOne;
private String oneMinTimeOpenSetOneId;
// 定时_时关1
private int oneHourTimeCloseSetOne;
private String oneHourTimeCloseSetOneId;
// 定时_分关1
private int oneMinTimeCloseSetOne;
private String oneMinTimeCloseSetOneId;
// 定时_时分开1
private String oneHourMinTimeOpenSetOneStr;
// 定时_时分关1
private String oneHourMinTimeCloseSetOneStr;
// 定时_时开2
private int oneHourTimeOpenSetTwo;
private String oneHourTimeOpenSetTwoId;
// 定时_分开2
private int oneMinTimeOpenSetTwo;
private String oneMinTimeOpenSetTwoId;
// 定时_时关2
private int oneHourTimeCloseSetTwo;
private String oneHourTimeCloseSetTwoId;
// 定时_分关2
private int oneMinTimeCloseSetTwo;
private String oneMinTimeCloseSetTwoId;
// 定时_时分开2
private String oneHourMinTimeOpenSetTwoStr;
// 定时_时分关2
private String oneHourMinTimeCloseSetTwoStr;
// 定时_时开3
private int oneHourTimeOpenSetThree;
private String oneHourTimeOpenSetThreeId;
// 定时_分开3
private int oneMinTimeOpenSetThree;
private String oneMinTimeOpenSetThreeId;
// 定时_时关3
private int oneHourTimeCloseSetThree;
private String oneHourTimeCloseSetThreeId;
// 定时_分关3
private int oneMinTimeCloseSetThree;
private String oneMinTimeCloseSetThreeId;
// 定时_时分开3
private String oneHourMinTimeOpenSetThreeStr;
// 定时_时分关3
private String oneHourMinTimeCloseSetThreeStr;
// 开延时
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private int openDelayTime;
private String openDelayTimeId;
// 温度设置
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal tempSet;
private String tempSetId;
// 累计运行时间
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal runTime;
private String runTimeId;
// 运行状态
private int runState;
private String runStateId;
// 启停控制
private int startStopControl;
private String startStopControlId;
// 故障
private int fault;
private String faultId;
// 一键启动
private int startOneKey;
private String startOneKeyId;
// 手自动切换
private int manualAutoSwitch;
private String manualAutoSwitchId;
// 选择两台回水泵启动
private int twoPumpStart;
private String twoPumpStartId;
// 温度设置上限
private BigDecimal tempSetUpperLimit;
private String tempSetUpperLimitId;
// 温度设置下限
private BigDecimal tempSetLowerLimit;
private String tempSetLowerLimitId;
@Override
public String toString() {
return new StringJoiner(", ", HotWaterBackPumpControlVO.class.getSimpleName() + "[", "]")
.add("id='" + id + "'")
.add("name='" + name + "'")
.add("orderNum=" + orderNum)
.add("oneHourTimeOpenSetOne=" + oneHourTimeOpenSetOne)
.add("oneHourTimeOpenSetOneId='" + oneHourTimeOpenSetOneId + "'")
.add("oneMinTimeOpenSetOne=" + oneMinTimeOpenSetOne)
.add("oneMinTimeOpenSetOneId='" + oneMinTimeOpenSetOneId + "'")
.add("oneHourTimeCloseSetOne=" + oneHourTimeCloseSetOne)
.add("oneHourTimeCloseSetOneId='" + oneHourTimeCloseSetOneId + "'")
.add("oneMinTimeCloseSetOne=" + oneMinTimeCloseSetOne)
.add("oneMinTimeCloseSetOneId='" + oneMinTimeCloseSetOneId + "'")
.add("oneHourTimeOpenSetTwo=" + oneHourTimeOpenSetTwo)
.add("oneHourTimeOpenSetTwoId='" + oneHourTimeOpenSetTwoId + "'")
.add("oneMinTimeOpenSetTwo=" + oneMinTimeOpenSetTwo)
.add("oneMinTimeOpenSetTwoId='" + oneMinTimeOpenSetTwoId + "'")
.add("oneHourTimeCloseSetTwo=" + oneHourTimeCloseSetTwo)
.add("oneHourTimeCloseSetTwoId='" + oneHourTimeCloseSetTwoId + "'")
.add("oneMinTimeCloseSetTwo=" + oneMinTimeCloseSetTwo)
.add("oneMinTimeCloseSetTwoId='" + oneMinTimeCloseSetTwoId + "'")
.add("oneHourTimeOpenSetThree=" + oneHourTimeOpenSetThree)
.add("oneHourTimeOpenSetThreeId='" + oneHourTimeOpenSetThreeId + "'")
.add("oneMinTimeOpenSetThree=" + oneMinTimeOpenSetThree)
.add("oneMinTimeOpenSetThreeId='" + oneMinTimeOpenSetThreeId + "'")
.add("oneHourTimeCloseSetThree=" + oneHourTimeCloseSetThree)
.add("oneHourTimeCloseSetThreeId='" + oneHourTimeCloseSetThreeId + "'")
.add("openDelayTime=" + openDelayTime)
.add("openDelayTimeId='" + openDelayTimeId + "'")
.add("tempSet=" + tempSet)
.add("tempSetId='" + tempSetId + "'")
.add("runTime=" + runTime)
.add("runTimeId='" + runTimeId + "'")
.add("runState=" + runState)
.add("runStateId='" + runStateId + "'")
.add("startStopControl=" + startStopControl)
.add("startStopControlId='" + startStopControlId + "'")
.add("fault=" + fault)
.add("faultId='" + faultId + "'")
.toString();
}
}

118
user-service/src/main/java/com/mh/user/dto/HotWaterCircuitPumpControlVO.java

@ -1,118 +0,0 @@
package com.mh.user.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.StringJoiner;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 热泵控制界面VO
* @date 2025-03-14 09:00:37
*/
@Setter
@Getter
public class HotWaterCircuitPumpControlVO {
private String id;
private String name;
private int orderNum;
// 定时_时开1
private int oneHourTimeOpenSetOne;
private String oneHourTimeOpenSetOneId;
// 定时_分开1
private int oneMinTimeOpenSetOne;
private String oneMinTimeOpenSetOneId;
// 定时_时分开1
private String oneHourMinTimeOpenSetOneStr;
// 定时_时关1
private int oneHourTimeCloseSetOne;
private String oneHourTimeCloseSetOneId;
// 定时_分关1
private int oneMinTimeCloseSetOne;
private String oneMinTimeCloseSetOneId;
// 定时_时分关1
private String oneHourMinTimeCloseSetOneStr;
// 开延时
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private int openDelayTime;
private String openDelayTimeId;
// 温差
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal tempDiff;
private String tempDiffId;
// 温差设置
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal tempDiffSet;
private String tempDiffSetId;
// 累计运行时间
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal runTime;
private String runTimeId;
// 运行状态
private int runState;
private String runStateId;
// 启停控制
private int startStopControl;
private String startStopControlId;
// 故障
private int fault;
private String faultId;
// 一键启动
private int startOneKey;
private String startOneKeyId;
// 手自动切换
private int manualAutoSwitch;
private String manualAutoSwitchId;
@Override
public String toString() {
return new StringJoiner(", ", HotWaterCircuitPumpControlVO.class.getSimpleName() + "[", "]")
.add("id='" + id + "'")
.add("name='" + name + "'")
.add("orderNum=" + orderNum)
.add("oneHourTimeOpenSetOne=" + oneHourTimeOpenSetOne)
.add("oneHourTimeOpenSetOneId='" + oneHourTimeOpenSetOneId + "'")
.add("oneMinTimeOpenSetOne=" + oneMinTimeOpenSetOne)
.add("oneMinTimeOpenSetOneId='" + oneMinTimeOpenSetOneId + "'")
.add("oneHourTimeCloseSetOne=" + oneHourTimeCloseSetOne)
.add("oneHourTimeCloseSetOneId='" + oneHourTimeCloseSetOneId + "'")
.add("oneMinTimeCloseSetOne=" + oneMinTimeCloseSetOne)
.add("oneMinTimeCloseSetOneId='" + oneMinTimeCloseSetOneId + "'")
.add("tempDiff=" + tempDiff)
.add("tempDiffId='" + tempDiffId + "'")
.add("tempDiffSet=" + tempDiffSet)
.add("tempDiffSetId='" + tempDiffSetId + "'")
.add("runTime=" + runTime)
.add("runTimeId='" + runTimeId + "'")
.add("runState=" + runState)
.add("runStateId='" + runStateId + "'")
.add("startStopControl=" + startStopControl)
.add("startStopControlId='" + startStopControlId + "'")
.add("fault=" + fault)
.add("faultId='" + faultId + "'")
.toString();
}
}

38
user-service/src/main/java/com/mh/user/dto/HotWaterControlDTO.java

@ -1,38 +0,0 @@
package com.mh.user.dto;
import lombok.Getter;
import lombok.Setter;
import org.apache.poi.ss.formula.functions.T;
import java.util.List;
import java.util.StringJoiner;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 生活热水监控dto
* @date 2025-03-14 09:13:19
*/
@Setter
@Getter
public class HotWaterControlDTO {
private String id;
private String name;
private int orderNum;
private List<?> children;
@Override
public String toString() {
return new StringJoiner(", ", HotWaterControlDTO.class.getSimpleName() + "[", "]")
.add("id='" + id + "'")
.add("name='" + name + "'")
.add("orderNum=" + orderNum)
.add("children=" + children)
.toString();
}
}

79
user-service/src/main/java/com/mh/user/dto/HotWaterControlListVO.java

@ -1,79 +0,0 @@
package com.mh.user.dto;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.Date;
import java.util.StringJoiner;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 生活热水监控需要的列表信息
* @date 2025-03-14 09:07:46
*/
@Setter
@Getter
public class HotWaterControlListVO {
private String cpmId;
private String buildingId;
private String buildingName;
private String deviceType;
private String deviceId;
private String deviceName;
private BigDecimal curValue;
private Date curTime;
private String paramTypeId;
private String otherName;
private int dtOrderNum;
private int dlOrderNum;
private int ctOrderNum;
private int digits;
public BigDecimal getCurValue() {
return curValue;
}
public void setCurValue(BigDecimal curValue) {
if (curValue!= null) {
// 保留两位小数
curValue = curValue.setScale(2, BigDecimal.ROUND_HALF_UP);
}
this.curValue = curValue;
}
@Override
public String toString() {
return new StringJoiner(", ", HotWaterControlListVO.class.getSimpleName() + "[", "]")
.add("cpmId='" + cpmId + "'")
.add("buildingId='" + buildingId + "'")
.add("buildingName='" + buildingName + "'")
.add("deviceType='" + deviceType + "'")
.add("deviceId='" + deviceId + "'")
.add("deviceName='" + deviceName + "'")
.add("curValue=" + curValue)
.add("curTime=" + curTime)
.add("paramTypeId='" + paramTypeId + "'")
.add("otherName='" + otherName + "'")
.add("dtOrderNum=" + dtOrderNum)
.add("dlOrderNum=" + dlOrderNum)
.add("ctOrderNum=" + ctOrderNum)
.toString();
}
}

186
user-service/src/main/java/com/mh/user/dto/HotWaterControlVO.java

@ -1,186 +0,0 @@
package com.mh.user.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.Date;
import java.util.StringJoiner;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 生活热水系统控制界面VO
* @date 2025-03-14 09:00:37
*/
@Setter
@Getter
public class HotWaterControlVO {
private String id;
private String name;
// 运行状态 1d
private int runningStatus;
private String runningStatusId;
// 启停控制 2
private int switchStatus;
private String switchStatusId;
// 频率设置 3
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal frequencySet;
private String frequencySetId;
// 频率 4
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal frequency;
private String frequencyId;
// 故障状态 5
private int alarmStatus;
private String alarmStatusId;
// 手动自动切换 6
private int handAutomaticSwitch;
private String handAutomaticSwitchId;
// 开控制 8
private int openSwitch;
private String openSwitchId;
// 关控制 9
private int closeSwitch;
private String closeSwitchId;
// 水位设置 10
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0.0")
private BigDecimal waterLevelSet;
private String waterLevelSetId;
// 水位 11
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0.0")
private BigDecimal waterLevel;
private String waterLevelId;
// 温度 12
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal temp;
private String tempId;
// 压力 13
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal pressure;
private String pressureId;
// 温度设置 14
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal tempSet;
private String tempSetId;
// 压力设置 15
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal pressureSet;
private String pressureSetId;
// 延时时间设置 34
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal delayTimeSet;
private String delayTimeSetId;
// 差值设置 35
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal diffValueSet;
private String diffValueSetId;
// 计数器设置 36
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal counterSet;
private String counterSetId;
// 切换时间设置 37
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal switchTimeSet;
private String switchTimeSetId;
// 故障复位状态 38
private int faultResetStatus;
private String faultResetStatusId;
// 急停状态 39
private int emergencyStopStatus;
private String emergencyStopStatusId;
// 最低设置值 44
private int minSet;
private String minSetId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date curTime;
private int orderNum;
public void setCounterSet(BigDecimal counterSet) {
if (counterSet != null) {
counterSet = counterSet.setScale(0, BigDecimal.ROUND_HALF_UP);
}
this.counterSet = counterSet;
}
@Override
public String toString() {
return new StringJoiner(", ", HotWaterControlVO.class.getSimpleName() + "[", "]")
.add("id='" + id + "'")
.add("name='" + name + "'")
.add("runningStatus=" + runningStatus)
.add("runningStatusId='" + runningStatusId + "'")
.add("switchStatus=" + switchStatus)
.add("switchStatusId='" + switchStatusId + "'")
.add("frequencySet=" + frequencySet)
.add("frequencySetId='" + frequencySetId + "'")
.add("frequency=" + frequency)
.add("frequencyId='" + frequencyId + "'")
.add("alarmStatus=" + alarmStatus)
.add("alarmStatusId='" + alarmStatusId + "'")
.add("handAutomaticSwitch=" + handAutomaticSwitch)
.add("handAutomaticSwitchId='" + handAutomaticSwitchId + "'")
.add("openSwitch=" + openSwitch)
.add("openSwitchId='" + openSwitchId + "'")
.add("closeSwitch=" + closeSwitch)
.add("closeSwitchId='" + closeSwitchId + "'")
.add("waterLevelSet=" + waterLevelSet)
.add("waterLevelSetId='" + waterLevelSetId + "'")
.add("waterLevel=" + waterLevel)
.add("waterLevelId='" + waterLevelId + "'")
.add("temp=" + temp)
.add("tempId='" + tempId + "'")
.add("pressure=" + pressure)
.add("pressureId='" + pressureId + "'")
.add("tempSet=" + tempSet)
.add("tempSetId='" + tempSetId + "'")
.add("pressureSet=" + pressureSet)
.add("pressureSetId='" + pressureSetId + "'")
.add("delayTimeSet=" + delayTimeSet)
.add("delayTimeSetId='" + delayTimeSetId + "'")
.add("diffValueSet=" + diffValueSet)
.add("diffValueSetId='" + diffValueSetId + "'")
.add("counterSet=" + counterSet)
.add("counterSetId='" + counterSetId + "'")
.add("switchTimeSet=" + switchTimeSet)
.add("switchTimeSetId='" + switchTimeSetId + "'")
.add("faultResetStatus=" + faultResetStatus)
.add("faultResetStatusId='" + faultResetStatusId + "'")
.add("emergencyStopStatus=" + emergencyStopStatus)
.add("emergencyStopStatusId='" + emergencyStopStatusId + "'")
.add("minSet=" + minSet)
.add("minSetId='" + minSetId + "'")
.add("curTime=" + curTime)
.add("orderNum=" + orderNum)
.toString();
}
}

71
user-service/src/main/java/com/mh/user/dto/HotWaterDeviceCalibrationControlVO.java

@ -1,71 +0,0 @@
package com.mh.user.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.Date;
import java.util.StringJoiner;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 设备校准控制界面VO
* @date 2025-03-14 09:00:37
*/
@Setter
@Getter
public class HotWaterDeviceCalibrationControlVO {
private String id;
private String name;
private int orderNum;
// 校准值
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal calibrationValue;
private String calibrationValueId;
// 工程量最低值
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal engineeringMinValue;
private String engineeringMinValueId;
// 工程量最高值
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal engineeringMaxValue;
private String engineeringMaxValueId;
// 数字量最低值
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal digitalMinValue;
private String digitalMinValueId;
// 数字量最高值
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal digitalMaxValue;
private String digitalMaxValueId;
@Override
public String toString() {
return new StringJoiner(", ", HotWaterDeviceCalibrationControlVO.class.getSimpleName() + "[", "]")
.add("id='" + id + "'")
.add("name='" + name + "'")
.add("orderNum=" + orderNum)
.add("calibrationValue=" + calibrationValue)
.add("calibrationValueId='" + calibrationValueId + "'")
.add("engineeringMinValue=" + engineeringMinValue)
.add("engineeringMinValueId='" + engineeringMinValueId + "'")
.add("engineeringMaxValue=" + engineeringMaxValue)
.add("engineeringMaxValueId='" + engineeringMaxValueId + "'")
.add("digitalMinValue=" + digitalMinValue)
.add("digitalMinValueId='" + digitalMinValueId + "'")
.add("digitalMaxValue=" + digitalMaxValue)
.add("digitalMaxValueId='" + digitalMaxValueId + "'")
.toString();
}
}

69
user-service/src/main/java/com/mh/user/dto/HotWaterDeviceControlVO.java

@ -1,69 +0,0 @@
package com.mh.user.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.Date;
import java.util.StringJoiner;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 生活热水系统控制界面VO
* @date 2025-03-14 09:00:37
*/
@Setter
@Getter
public class HotWaterDeviceControlVO {
private String id;
private String name;
private int orderNum;
// 累计读数
@JsonFormat(shape = JsonFormat.Shape.STRING)
private BigDecimal totalReading;
private String totalReadingId;
// 当前时间
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date currentTime;
private String currentTimeId;
/**
* 通讯失败
*/
private int communicationFailure;
private String communicationFailureId;
/**
* 通讯失败次数
* @return
*/
private int communicationFailureCount;
private String communicationFailureCountId;
/**
* modbus 复位
*/
private int reset;
private String resetId;
@Override
public String toString() {
return new StringJoiner(", ", HotWaterDeviceControlVO.class.getSimpleName() + "[", "]")
.add("id='" + id + "'")
.add("name='" + name + "'")
.add("orderNum=" + orderNum)
.add("totalReading=" + totalReading)
.add("totalReadingId='" + totalReadingId + "'")
.add("currentTime=" + currentTime)
.add("currentTimeId='" + currentTimeId + "'")
.toString();
}
}

316
user-service/src/main/java/com/mh/user/dto/HotWaterHotPumpControlVO.java

@ -1,316 +0,0 @@
package com.mh.user.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.StringJoiner;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 热泵控制界面VO
* @date 2025-03-14 09:00:37
*/
@Setter
@Getter
public class HotWaterHotPumpControlVO { // 去掉pump后的类名
private String id;
private String name;
private int orderNum;
// 热泵12定时_时开1
private int oneHourTimeOpenSetOne;
private String oneHourTimeOpenSetOneId;
// 热泵12定时_分开1 (新增分钟设置)
private int oneMinTimeOpenSetOne;
private String oneMinTimeOpenSetOneId;
// 定时_时分开1
private String oneHourMinTimeOpenSetOneStr;
// 热泵12定时_时关1
private int oneHourTimeCloseSetOne;
private String oneHourTimeCloseSetOneId;
// 热泵12定时_分关1 (新增分钟设置)
private int oneMinTimeCloseSetOne;
private String oneMinTimeCloseSetOneId;
// 定时_时分关1
private String oneHourMinTimeCloseSetOneStr;
// 热泵12定时_时开2
private int oneHourTimeOpenSetTwo;
private String oneHourTimeOpenSetTwoId;
// 热泵12定时_分开2 (新增分钟设置)
private int oneMinTimeOpenSetTwo;
private String oneMinTimeOpenSetTwoId;
// 定时_时分开2
private String oneHourMinTimeOpenSetTwoStr;
// 热泵12定时_时关2
private int oneHourTimeCloseSetTwo;
private String oneHourTimeCloseSetTwoId;
// 热泵12定时_分关2 (新增分钟设置)
private int oneMinTimeCloseSetTwo;
private String oneMinTimeCloseSetTwoId;
// 定时_时分关2
private String oneHourMinTimeCloseSetTwoStr;
// 热泵12定时_时开3
private int oneHourTimeOpenSetThree;
private String oneHourTimeOpenSetThreeId;
// 热泵12定时_分开3 (新增分钟设置)
private int oneMinTimeOpenSetThree;
private String oneMinTimeOpenSetThreeId;
// 定时_时分开3
private String oneHourMinTimeOpenSetThreeStr;
// 热泵12定时_时关3
private int oneHourTimeCloseSetThree;
private String oneHourTimeCloseSetThreeId;
// 热泵12定时_分关3 (新增分钟设置)
private int oneMinTimeCloseSetThree;
private String oneMinTimeCloseSetThreeId;
// 定时_时分关3
private String oneHourMinTimeCloseSetThreeStr;
// 热泵34定时_时开1
private int twoHourTimeOpenSetOne;
private String twoHourTimeOpenSetOneId;
// 热泵34定时_分开1 (新增分钟设置)
private int twoMinTimeOpenSetOne;
private String twoMinTimeOpenSetOneId;
// 定时_时分开1
private String twoHourMinTimeOpenSetOneStr;
// 热泵34定时_时关1
private int twoHourTimeCloseSetOne;
private String twoHourTimeCloseSetOneId;
// 热泵34定时_分关1 (新增分钟设置)
private int twoMinTimeCloseSetOne;
private String twoMinTimeCloseSetOneId;
// 定时_时分关1
private String twoHourMinTimeCloseSetOneStr;
// 热泵34定时_时开2
private int twoHourTimeOpenSetTwo;
private String twoHourTimeOpenSetTwoId;
// 热泵34定时_分开2 (新增分钟设置)
private int twoMinTimeOpenSetTwo;
private String twoMinTimeOpenSetTwoId;
// 定时_时分开2
private String twoHourMinTimeOpenSetTwoStr;
// 热泵34定时_时关2
private int twoHourTimeCloseSetTwo;
private String twoHourTimeCloseSetTwoId;
// 热泵34定时_分关2 (新增分钟设置)
private int twoMinTimeCloseSetTwo;
private String twoMinTimeCloseSetTwoId;
// 定时_时分关2
private String twoHourMinTimeCloseSetTwoStr;
// 热泵34定时_时开3
private int twoHourTimeOpenSetThree;
private String twoHourTimeOpenSetThreeId;
// 热泵34定时_分开3 (新增分钟设置)
private int twoMinTimeOpenSetThree;
private String twoMinTimeOpenSetThreeId;
// 定时_时分开3
private String twoHourMinTimeOpenSetThreeStr;
// 热泵34定时_时关3
private int twoHourTimeCloseSetThree;
private String twoHourTimeCloseSetThreeId;
// 热泵34定时_分关3 (新增分钟设置)
private int twoMinTimeCloseSetThree;
private String twoMinTimeCloseSetThreeId;
// 定时_时分关3
private String twoHourMinTimeCloseSetThreeStr;
// 热泵_开机 -> 去掉pump前缀
private String start;
private String startId;
// 热泵_关机 -> 去掉pump前缀
private String stop;
private String stopId;
// 热泵_运行状态 -> 去掉pump前缀
private int runState;
private String runStateId;
// 热泵_启停控制 -> 去掉pump前缀
private int startStopControl;
private String startStopControlId;
// 热泵_手自动切换 -> 去掉pump前缀
private int manualAutoSwitch;
private String manualAutoSwitchId;
// 热泵_12启停控制
private int startStopControlOne;
private String startStopControlOneId;
// 热泵_34启停控制
private int startStopControlTwo;
private String startStopControlTwoId;
// 热泵_12手自动切换
private int manualAutoSwitchOne;
private String manualAutoSwitchOneId;
// 热泵_34手自动切换
private int manualAutoSwitchTwo;
private String manualAutoSwitchTwoId;
// 热泵_设定温度 -> 去掉pump前缀
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal setTemp;
private String setTempId;
// 热泵_水箱温度 -> 去掉pump前缀
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal tankTemp;
private String tankTempId;
// 热泵累计运行时间 -> 去掉pump前缀
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal runTime;
private String runTimeId;
// 热泵_出水温度 -> 去掉pump前缀
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal outWaterTemp;
private String outWaterTempId;
// 热泵_进水温度 -> 去掉pump前缀
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal inWaterTemp;
private String inWaterTempId;
// 热泵_故障 -> 去掉pump前缀
private int fault;
/**
* 通讯失败
*/
private int communicationFailure;
private String communicationFailureId;
/**
* 通讯失败次数
* @return
*/
private int communicationFailureCount;
private String communicationFailureCountId;
/**
* modbus 复位
*/
private int reset;
private String resetId;
@Override
public String toString() {
return new StringJoiner(", ", HotWaterHotPumpControlVO.class.getSimpleName() + "[", "]") // 更新类名引用
.add("id='" + id + "'")
.add("name='" + name + "'")
.add("oneHourTimeOpenSetOne=" + oneHourTimeOpenSetOne)
.add("oneHourTimeOpenSetOneId='" + oneHourTimeOpenSetOneId + "'")
.add("oneMinTimeOpenSetOne=" + oneMinTimeOpenSetOne) // 新增分钟字段
.add("oneMinTimeOpenSetOneId='" + oneMinTimeOpenSetOneId + "'") // 新增分钟字段
.add("oneHourTimeCloseSetOne=" + oneHourTimeCloseSetOne)
.add("oneHourTimeCloseSetOneId='" + oneHourTimeCloseSetOneId + "'")
.add("oneMinTimeCloseSetOne=" + oneMinTimeCloseSetOne) // 新增分钟字段
.add("oneMinTimeCloseSetOneId='" + oneMinTimeCloseSetOneId + "'") // 新增分钟字段
.add("oneHourTimeOpenSetTwo=" + oneHourTimeOpenSetTwo)
.add("oneHourTimeOpenSetTwoId='" + oneHourTimeOpenSetTwoId + "'")
.add("oneMinTimeOpenSetTwo=" + oneMinTimeOpenSetTwo) // 新增分钟字段
.add("oneMinTimeOpenSetTwoId='" + oneMinTimeOpenSetTwoId + "'") // 新增分钟字段
.add("oneHourTimeCloseSetTwo=" + oneHourTimeCloseSetTwo)
.add("oneHourTimeCloseSetTwoId='" + oneHourTimeCloseSetTwoId + "'")
.add("oneMinTimeCloseSetTwo=" + oneMinTimeCloseSetTwo) // 新增分钟字段
.add("oneMinTimeCloseSetTwoId='" + oneMinTimeCloseSetTwoId + "'") // 新增分钟字段
.add("oneHourTimeOpenSetThree=" + oneHourTimeOpenSetThree)
.add("oneHourTimeOpenSetThreeId='" + oneHourTimeOpenSetThreeId + "'")
.add("oneMinTimeOpenSetThree=" + oneMinTimeOpenSetThree) // 新增分钟字段
.add("oneMinTimeOpenSetThreeId='" + oneMinTimeOpenSetThreeId + "'") // 新增分钟字段
.add("oneHourTimeCloseSetThree=" + oneHourTimeCloseSetThree)
.add("oneHourTimeCloseSetThreeId='" + oneHourTimeCloseSetThreeId + "'")
.add("oneMinTimeCloseSetThree=" + oneMinTimeCloseSetThree) // 新增分钟字段
.add("oneMinTimeCloseSetThreeId='" + oneMinTimeCloseSetThreeId + "'") // 新增分钟字段
.add("twoHourTimeOpenSetOne=" + twoHourTimeOpenSetOne)
.add("twoHourTimeOpenSetOneId='" + twoHourTimeOpenSetOneId + "'")
.add("twoMinTimeOpenSetOne=" + twoMinTimeOpenSetOne) // 新增分钟字段
.add("twoMinTimeOpenSetOneId='" + twoMinTimeOpenSetOneId + "'") // 新增分钟字段
.add("twoHourTimeCloseSetOne=" + twoHourTimeCloseSetOne)
.add("twoHourTimeCloseSetOneId='" + twoHourTimeCloseSetOneId + "'")
.add("twoMinTimeCloseSetOne=" + twoMinTimeCloseSetOne) // 新增分钟字段
.add("twoMinTimeCloseSetOneId='" + twoMinTimeCloseSetOneId + "'") // 新增分钟字段
.add("twoHourTimeOpenSetTwo=" + twoHourTimeOpenSetTwo)
.add("twoHourTimeOpenSetTwoId='" + twoHourTimeOpenSetTwoId + "'")
.add("twoMinTimeOpenSetTwo=" + twoMinTimeOpenSetTwo) // 新增分钟字段
.add("twoMinTimeOpenSetTwoId='" + twoMinTimeOpenSetTwoId + "'") // 新增分钟字段
.add("twoHourTimeCloseSetTwo=" + twoHourTimeCloseSetTwo)
.add("twoHourTimeCloseSetTwoId='" + twoHourTimeCloseSetTwoId + "'")
.add("twoMinTimeCloseSetTwo=" + twoMinTimeCloseSetTwo) // 新增分钟字段
.add("twoMinTimeCloseSetTwoId='" + twoMinTimeCloseSetTwoId + "'") // 新增分钟字段
.add("twoHourTimeOpenSetThree=" + twoHourTimeOpenSetThree)
.add("twoHourTimeOpenSetThreeId='" + twoHourTimeOpenSetThreeId + "'")
.add("twoMinTimeOpenSetThree=" + twoMinTimeOpenSetThree) // 新增分钟字段
.add("twoMinTimeOpenSetThreeId='" + twoMinTimeOpenSetThreeId + "'") // 新增分钟字段
.add("twoHourTimeCloseSetThree=" + twoHourTimeCloseSetThree)
.add("twoHourTimeCloseSetThreeId='" + twoHourTimeCloseSetThreeId + "'")
.add("twoMinTimeCloseSetThree=" + twoMinTimeCloseSetThree) // 新增分钟字段
.add("twoMinTimeCloseSetThreeId='" + twoMinTimeCloseSetThreeId + "'") // 新增分钟字段
.add("start='" + start + "'")
.add("startId='" + startId + "'")
.add("stop='" + stop + "'")
.add("stopId='" + stopId + "'")
.add("runState='" + runState + "'")
.add("runStateId='" + runStateId + "'")
.add("startStopControl='" + startStopControl + "'")
.add("startStopControlId='" + startStopControlId + "'")
.add("setTemp=" + setTemp)
.add("setTempId='" + setTempId + "'")
.add("tankTemp=" + tankTemp)
.add("tankTempId='" + tankTempId + "'")
.add("runTime=" + runTime)
.add("runTimeId='" + runTimeId + "'")
.add("outWaterTemp=" + outWaterTemp)
.add("outWaterTempId='" + outWaterTempId + "'")
.add("inWaterTemp=" + inWaterTemp)
.add("inWaterTempId='" + inWaterTempId + "'")
.add("fault=" + fault)
.toString();
}
}

63
user-service/src/main/java/com/mh/user/dto/HotWaterNowDataDTO.java

@ -1,63 +0,0 @@
package com.mh.user.dto;
import lombok.Data;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 热水实时监控列表数据
* @date 2025-03-10 15:43:36
*/
@Data
public class HotWaterNowDataDTO {
private String id;
private String curDate; //日期
private String buildingId; //楼栋编号
private String buildingName; //楼栋名称
private String pumpId; //热泵编号
private String pumpName; //热泵名称
private String tempSet; //水温设定
private String waterTemp; //水箱水温
private String runState; //运行状态
private String isFault; //是否故障
private String levelSet1; //水位设置
private String levelSet2; //水位设置
private String waterLevel1; //实际水位
private String waterLevel2; //实际水位
private String tankId; //水箱编号
private String tankName; //水箱名称
private String envTemp; //环境温度
private String upWaterState1; // 供水1泵状态
private String freq1; // 供水频率1
private String upWaterState2; // 供水2泵状态
private String freq2; // 供水频率2
private String upWaterState3; // 供水3泵状态
private String freq3; // 供水频率3
private String upWaterState4; // 供水4泵状态
private String freq4; // 供水频率4
private String useWaterState; // 补水状态
private String backWaterState; // 回水状态1
private String backWaterState2; // 回水状态2
private String pressure; // 压力
private String circulateState; // 循环泵状态1
private String circulateState2; // 循环泵状态2
private int orderNum;
}

151
user-service/src/main/java/com/mh/user/dto/HotWaterSystemControlVO.java

@ -1,151 +0,0 @@
package com.mh.user.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.Date;
import java.util.StringJoiner;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 生活热水系统控制界面VO
* @date 2025-03-14 09:00:37
*/
@Setter
@Getter
public class HotWaterSystemControlVO {
private String id;
private String name;
// 启用时间写入 1
private int timeSet;
private String timeSetId;
// 水箱温度 2
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal tankTemp;
private String tankTempId;
// 太阳能温度 3
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal solarTemp;
private String solarTempId;
// 回水温度 4
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal inTemp;
private String inTempId;
// 压力 4
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "0")
private BigDecimal pressure;
private String pressureId;
// PLC 时间
private String plcTime;
// 秒_读 6
private int scTimeRead;
private String scTimeReadId;
// 分_读 8
private int minTimeRead;
private String minTimeReadId;
// 时_读 9
private int hourTimeRead;
private String hourTimeReadId;
// 日_读 9
private int dayTimeRead;
private String dayTimeReadId;
// 月_读 10
private int monthTimeRead;
private String monthTimeReadId;
// 年_读 11
private int yearTimeRead;
private String yearTimeReadId;
// 秒_写 6
private int scTimeSet;
private String scTimeSetId;
// 分_写 8
private int minTimeSet;
private String minTimeSetId;
// 时_写 9
private int hourTimeSet;
private String hourTimeSetId;
// 日_写 9
private int dayTimeSet;
private String dayTimeSetId;
// 月_写 10
private int monthTimeSet;
private String monthTimeSetId;
// 年_写 11
private int yearTimeSet;
private String yearTimeSetId;
private int orderNum;
/**
* modbus 复位
*/
private int reset;
private String resetId;
@Override
public String toString() {
return new StringJoiner(", ", HotWaterSystemControlVO.class.getSimpleName() + "[", "]")
.add("id='" + id + "'")
.add("name='" + name + "'")
.add("timeSet=" + timeSet)
.add("timeSetId='" + timeSetId + "'")
.add("tankTemp=" + tankTemp)
.add("tankTempId='" + tankTempId + "'")
.add("solarTemp=" + solarTemp)
.add("solarTempId='" + solarTempId + "'")
.add("inTemp=" + inTemp)
.add("inTempId='" + inTempId + "'")
.add("pressure=" + pressure)
.add("pressureId='" + pressureId + "'")
.add("plcTime='" + plcTime + "'")
.add("scTimeRead=" + scTimeRead)
.add("scTimeReadId='" + scTimeReadId + "'")
.add("minTimeRead=" + minTimeRead)
.add("minTimeReadId='" + minTimeReadId + "'")
.add("hourTimeRead=" + hourTimeRead)
.add("hourTimeReadId='" + hourTimeReadId + "'")
.add("dayTimeRead=" + dayTimeRead)
.add("dayTimeReadId='" + dayTimeReadId + "'")
.add("monthTimeRead=" + monthTimeRead)
.add("monthTimeReadId='" + monthTimeReadId + "'")
.add("yearTimeRead=" + yearTimeRead)
.add("yearTimeReadId='" + yearTimeReadId + "'")
.add("scTimeSet=" + scTimeSet)
.add("scTimeSetId='" + scTimeSetId + "'")
.add("minTimeSet=" + minTimeSet)
.add("minTimeSetId='" + minTimeSetId + "'")
.add("hourTimeSet=" + hourTimeSet)
.add("hourTimeSetId='" + hourTimeSetId + "'")
.add("dayTimeSet=" + dayTimeSet)
.add("dayTimeSetId='" + dayTimeSetId + "'")
.add("monthTimeSet=" + monthTimeSet)
.add("monthTimeSetId='" + monthTimeSetId + "'")
.add("yearTimeSet=" + yearTimeSet)
.add("yearTimeSetId='" + yearTimeSetId + "'")
.add("orderNum=" + orderNum)
.toString();
}
}

4
user-service/src/main/java/com/mh/user/entity/BuildingEntity.java

@ -20,9 +20,5 @@ public class BuildingEntity {
private Double lowTankHeight; private Double lowTankHeight;
private int pumpCount; private int pumpCount;
private int sort; private int sort;
/**
* 0三旺通信1PLC通信
*/
private int commType;
} }

108
user-service/src/main/java/com/mh/user/entity/CollectionParamsManageEntity.java

@ -1,108 +0,0 @@
package com.mh.user.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.StringJoiner;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 采集参数实体类
* @date 2025-12-10 10:53:33
*/
@Getter
@Setter
public class CollectionParamsManageEntity implements Serializable {
static final long serialVersionUID = 42L;
private Long id;
/** 当前时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/** 当前时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
private Long buildingId;
/** 设备id */
private Long deviceInstallId;
/** 寄存器地址 */
private String registerAddr;
/** 功能码 */
private String funcCode;
/** 倍率 */
private Integer mtRatio;
/** 初始值 */
private BigDecimal mtInitValue;
/** 小数点 */
private Integer digits;
/** 数据类型 */
private Integer dataType;
/** 当前值 */
private BigDecimal curValue;
/** 当前时间 */
/** 当前时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date curTime;
/** 是否是总表 (0: 是, 1: 否) */
private Integer mtIsSum;
/** 单位 */
private String unit;
/** 排序 */
private Long orderNum;
/** 备注 */
private String remark;
/** 读取的寄存器大小 */
private Integer registerSize;
/** 是否使用 */
private Integer isUse;
/** 别名:mqtt上传名,唯一值 */
private String otherName;
/** 40,累计值,140瞬时值 */
private Integer grade;
/** 参数id */
private Integer paramTypeId;
/** 遥测、遥信数据类型 */
private Integer collectionType;
/** 上报质量 */
private String quality;
@Override
public String toString() {
return new StringJoiner(", ", CollectionParamsManageEntity.class.getSimpleName() + "[", "]")
.add("deviceInstallId=" + deviceInstallId)
.add("registerAddr='" + registerAddr + "'")
.add("funcCode='" + funcCode + "'")
.add("mtRatio=" + mtRatio)
.add("mtInitValue=" + mtInitValue)
.add("digits=" + digits)
.add("dataType=" + dataType)
.add("curValue=" + curValue)
.add("curTime=" + curTime)
.add("mtIsSum=" + mtIsSum)
.add("unit='" + unit + "'")
.add("orderNum=" + orderNum)
.add("remark='" + remark + "'")
.add("registerSize=" + registerSize)
.add("isUse=" + isUse)
.add("otherName='" + otherName + "'")
.add("grade=" + grade)
.add("paramTypeId=" + paramTypeId)
.add("collectionType=" + collectionType)
.add("quality='" + quality + "'")
.toString();
}
}

20
user-service/src/main/java/com/mh/user/entity/NowDataEntity.java

@ -23,24 +23,10 @@ public class NowDataEntity {
private String tankName; //水箱名称 private String tankName; //水箱名称
private String envTemp; //环境温度 private String envTemp; //环境温度
private String upWaterState; // 供水状态1 private String upWaterState; // 供水状态
private String useWaterState; // 补水状态1 private String useWaterState; // 补水状态
private String backWaterState; // 回水状态1 private String backWaterState; // 回水状态
private String upWaterState2; // 供水状态2
private String useWaterState2; // 补水状态2
private String backWaterState2; // 回水状态2
private String circulateState; // 循环泵状态1
private String circulateState2; // 循环泵状态2
private String pressure; // 压力
private String gwState; // 网关状态
} }

1
user-service/src/main/java/com/mh/user/entity/NowPublicDataEntity.java

@ -17,6 +17,5 @@ public class NowPublicDataEntity {
private String useWaterTemp; //供水温度 private String useWaterTemp; //供水温度
private String backWaterTemp; //回水温度 private String backWaterTemp; //回水温度
private String singleTemp; //单箱温度 private String singleTemp; //单箱温度
private String pressure; //压力
} }

2
user-service/src/main/java/com/mh/user/entity/PumpSetEntity.java

@ -15,7 +15,5 @@ public class PumpSetEntity {
private String closeTime1; private String closeTime1;
private String startTime2; private String startTime2;
private String closeTime2; private String closeTime2;
private String startTime3;
private String closeTime3;
} }

38
user-service/src/main/java/com/mh/user/entity/WaterPressureEntity.java

@ -1,38 +0,0 @@
package com.mh.user.entity;
import lombok.Data;
import java.util.Date;
/**
* @Author: ljf
* @Date: 2018/10/15 14:30
* @Version 1.0
* 水压数据
*/
@Data
public class WaterPressureEntity {
private Date curDate;
private String buildingID;
private String buildingName;
private String deviceAddr;
private String deviceName;
private String pressure00;
private String pressure02;
private String pressure06;
private String pressure08;
private String pressure11;
private String pressure13;
private String pressure14;
private String pressure15;
private String pressure16;
private String pressure17;
private String pressure18;
private String pressure19;
private String pressure20;
private String pressure21;
private String pressure22;
private String pressure23;
}

7
user-service/src/main/java/com/mh/user/factory/BackTempControl.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
/** /**
@ -42,9 +40,4 @@ public class BackTempControl implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return strategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
} }

18
user-service/src/main/java/com/mh/user/factory/Device.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
/** /**
@ -19,20 +17,4 @@ public interface Device {
String createOrders(DeviceCodeParamEntity deviceCodeParamEntity); String createOrders(DeviceCodeParamEntity deviceCodeParamEntity);
String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity); String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity);
/**
* 解析MQTT报文
* @param dateStr
* @param registerAddr
* @param dataStr 已经是解析好的数据
* @param operateType 操作类型读取/设置
* @param deviceInstallEntity
* @return
*/
String analysisMQTTReceiveData(String dateStr,
String registerAddr,
String dataStr,
String operateType,
DeviceInstallEntity deviceInstallEntity,
CollectionParamsManageEntity collectionParamsManageEntity);
} }

7
user-service/src/main/java/com/mh/user/factory/EleMeter.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -45,9 +43,4 @@ public class EleMeter implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return eleMeterStrategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return eleMeterStrategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return eleMeterStrategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
} }

7
user-service/src/main/java/com/mh/user/factory/HeatPump.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
/** /**
@ -42,9 +40,4 @@ public class HeatPump implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return strategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
} }

7
user-service/src/main/java/com/mh/user/factory/HeatPumpStatus.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
/** /**
@ -42,9 +40,4 @@ public class HeatPumpStatus implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return strategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
} }

8
user-service/src/main/java/com/mh/user/factory/MultiControl.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
/** /**
@ -42,10 +40,4 @@ public class MultiControl implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return strategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
} }

8
user-service/src/main/java/com/mh/user/factory/PressureTrans.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
/** /**
@ -42,10 +40,4 @@ public class PressureTrans implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return strategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
} }

8
user-service/src/main/java/com/mh/user/factory/StatusCheck.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -46,10 +44,4 @@ public class StatusCheck implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return wtMeterStrategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return wtMeterStrategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return wtMeterStrategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
} }

51
user-service/src/main/java/com/mh/user/factory/SystemParams.java

@ -1,51 +0,0 @@
package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 系统参数
* @date 2024-03-18 16:53:35
*/
public class SystemParams implements Device {
private DeviceStrategy strategy;
private static class SingletonHolder {
private static final SystemParams INSTANCE = new SystemParams();
}
private SystemParams() {
// 防止外部直接实例化
}
public static SystemParams getInstance() {
return SystemParams.SingletonHolder.INSTANCE;
}
@Override
public void setStrategy(DeviceStrategy strategy) {
this.strategy = strategy;
}
@Override
public String createOrders(DeviceCodeParamEntity deviceCodeParamEntity) {
return strategy.createOrders(deviceCodeParamEntity);
}
@Override
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
}
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return strategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
}

8
user-service/src/main/java/com/mh/user/factory/TempControl.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
/** /**
@ -42,10 +40,4 @@ public class TempControl implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return strategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
} }

8
user-service/src/main/java/com/mh/user/factory/TempTrans.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
/** /**
@ -42,10 +40,4 @@ public class TempTrans implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return strategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
} }

8
user-service/src/main/java/com/mh/user/factory/TimeControl.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
/** /**
@ -42,10 +40,4 @@ public class TimeControl implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return strategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity , collectionParamsManageEntity);
}
} }

8
user-service/src/main/java/com/mh/user/factory/WaterLevelSwitch.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
/** /**
@ -42,10 +40,4 @@ public class WaterLevelSwitch implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return strategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return strategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
} }

8
user-service/src/main/java/com/mh/user/factory/WtMeter.java

@ -1,8 +1,6 @@
package com.mh.user.factory; package com.mh.user.factory;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategy;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -46,10 +44,4 @@ public class WtMeter implements Device {
public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) { public String analysisReceiveData(String dateStr, String deviceType, String registerAddr, String brand, String buildingId, String buildingName, String dataStr, DeviceCodeParamEntity deviceCodeParamEntity) {
return wtMeterStrategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return wtMeterStrategy.analysisReceiveData(dateStr, deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity);
} }
@Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, CollectionParamsManageEntity collectionParamsManageEntity) {
return wtMeterStrategy.analysisMQTTReceiveData(dateStr, registerAddr, dataStr, operateType, deviceInstallEntity, collectionParamsManageEntity);
}
} }

5
user-service/src/main/java/com/mh/user/job/CollectionLoopRunner.java

@ -17,7 +17,6 @@ import com.mh.user.utils.ExchangeStringUtil;
import com.mh.user.utils.GetReadOrder485; import com.mh.user.utils.GetReadOrder485;
import gnu.io.SerialPort; import gnu.io.SerialPort;
import gnu.io.SerialPortEvent; import gnu.io.SerialPortEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner; import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -49,11 +48,9 @@ public class CollectionLoopRunner implements ApplicationRunner {
private GetWeatherInfoJob getWeatherInfoJob; private GetWeatherInfoJob getWeatherInfoJob;
@Resource @Resource
@Autowired(required = false)
private MqttSubscriptionService iMqttSubscriptionService; private MqttSubscriptionService iMqttSubscriptionService;
@Resource @Resource
@Autowired(required = false)
private IMqttTopicService iMqttTopicService; private IMqttTopicService iMqttTopicService;
@Override @Override
@ -70,7 +67,7 @@ public class CollectionLoopRunner implements ApplicationRunner {
// NettyEchoServer nettyEchoServer = new NettyEchoServer(); // NettyEchoServer nettyEchoServer = new NettyEchoServer();
// nettyEchoServer.bind(8098); // nettyEchoServer.bind(8098);
// 初始化mqtt订阅记录 // 初始化mqtt订阅记录
// initializeMqttSubscription(); initializeMqttSubscription();
} }
/** /**

2
user-service/src/main/java/com/mh/user/job/DealDataJob.java

@ -73,7 +73,7 @@ public class DealDataJob {
/** /**
* 采集 * 采集
*/ */
// @Scheduled(cron = "35 0/2 * * * ?") @Scheduled(cron = "35 0/2 * * * ?")
// @Scheduled(cron = "0 0/1 * * * ?") // @Scheduled(cron = "0 0/1 * * * ?")
// @Scheduled(cron = "0 0/5 * * * ?") //5分钟 // @Scheduled(cron = "0 0/5 * * * ?") //5分钟
public void collect() { public void collect() {

15
user-service/src/main/java/com/mh/user/job/GetWeatherInfoJob.java

@ -42,12 +42,12 @@ public class GetWeatherInfoJob {
/** /**
* 定时获取每天天气 * 定时获取每天天气
*/ */
@Scheduled(cron = "0 0 0 1/1 * ?") @Scheduled(cron = "0 0 0 0/1 * ? ")
public void getWeatherInfo() { public void getWeatherInfo() {
// 从系统参数中获取对应的项目区域 // 从系统参数中获取对应的项目区域
SysParamEntity sysParam = sysParamService.selectSysParam(); SysParamEntity sysParam = sysParamService.selectSysParam();
if (null != sysParam) { if (null != sysParam) {
String url = "https://restapi.amap.com/v3/weather/weatherInfo?extensions=all&key=" + amapKey + "&city=" + sysParam.getProArea(); String url = "https://restapi.amap.com/v3/weather/weatherInfo?extensions=all&key="+amapKey+"&city="+sysParam.getProArea();
String returnResult = restTemplate.getForObject(url, String.class); String returnResult = restTemplate.getForObject(url, String.class);
if (!StringUtils.isBlank(returnResult)) { if (!StringUtils.isBlank(returnResult)) {
JSONObject jsonObject = JSON.parseObject(returnResult); JSONObject jsonObject = JSON.parseObject(returnResult);
@ -61,15 +61,4 @@ public class GetWeatherInfoJob {
} }
} }
} }
/**
* 定时清除collectionParam
*/
@Scheduled(cron = "0 0 0 1/1 * ?")
public void deleteCache() {
Object wetTemp = caffeineCache.getIfPresent("collectionParams");
if (wetTemp != null) {
caffeineCache.invalidate("collectionParams");
}
}
} }

1
user-service/src/main/java/com/mh/user/mapper/BuildingMapper.java

@ -137,7 +137,6 @@ public interface BuildingMapper {
@Result(property="tankHeight",column="tankHeight"), @Result(property="tankHeight",column="tankHeight"),
@Result(property="lowTankHeight",column="low_tank_height"), @Result(property="lowTankHeight",column="low_tank_height"),
@Result(property="sort",column="sort"), @Result(property="sort",column="sort"),
@Result(property="commType",column="comm_type")
}) })
@Select("select * from building ") @Select("select * from building ")
List<BuildingEntity> selectAll(); List<BuildingEntity> selectAll();

3
user-service/src/main/java/com/mh/user/mapper/CodeTableMapper.java

@ -18,7 +18,4 @@ public interface CodeTableMapper {
//从code_table表查询品牌 //从code_table表查询品牌
@Select("select * from code_table where name='brand' ") @Select("select * from code_table where name='brand' ")
List<DeviceTypeModel> queryBrand(); List<DeviceTypeModel> queryBrand();
@Select("select * from code_table where name=#{name} ")
List<DeviceTypeModel> queryDataByName(String name);
} }

329
user-service/src/main/java/com/mh/user/mapper/CollectionParamsManageMapper.java

@ -1,329 +0,0 @@
package com.mh.user.mapper;
import com.mh.user.dto.HotWaterControlListVO;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.model.SanShiFengDatas;
import org.apache.ibatis.annotations.*;
import tk.mybatis.mapper.common.BaseMapper;
import java.math.BigDecimal;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 采集参数设备mapper类
* @date 2025-12-10 11:31:42
*/
@Mapper
public interface CollectionParamsManageMapper extends BaseMapper<CollectionParamsManageEntity> {
@Select("<script>" +
"SELECT * FROM (" +
"SELECT cpm.*, ROW_NUMBER() OVER (ORDER BY cpm.device_install_id) AS row_num " +
"FROM collection_params_manage cpm join device_install di on cpm.device_install_id = di.id where 1=1" +
"<if test='deviceInstallId != null and deviceInstallId != \"\"'>" +
"AND cpm.device_install_id = #{deviceInstallId} " +
"</if>" +
"<if test='buildingId != null and buildingId != \"\"'>" +
"AND di.building_id = #{buildingId} " +
"</if>" +
"<if test='otherName != null and otherName != \"\"'>" +
"AND cpm.other_name LIKE CONCAT('%', #{otherName}, '%') " +
"</if>" +
") AS t WHERE t.row_num BETWEEN (#{pageNum}-1)*#{pageSize} AND #{pageNum}*#{pageSize}" +
"</script>")
@Results({
@Result(column = "id", property = "id"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime"),
@Result(column = "device_install_id", property = "deviceInstallId"),
@Result(column = "register_addr", property = "registerAddr"),
@Result(column = "func_code", property = "funcCode"),
@Result(column = "mt_ratio", property = "mtRatio"),
@Result(column = "mt_init_value", property = "mtInitValue"),
@Result(column = "digits", property = "digits"),
@Result(column = "data_type", property = "dataType"),
@Result(column = "cur_value", property = "curValue"),
@Result(column = "cur_time", property = "curTime"),
@Result(column = "mt_is_sum", property = "mtIsSum"),
@Result(column = "unit", property = "unit"),
@Result(column = "order_num", property = "orderNum"),
@Result(column = "remark", property = "remark"),
@Result(column = "register_size", property = "registerSize"),
@Result(column = "is_use", property = "isUse"),
@Result(column = "other_name", property = "otherName"),
@Result(column = "grade", property = "grade"),
@Result(column = "param_type_id", property = "paramTypeId"),
@Result(column = "collection_type", property = "collectionType"),
@Result(column = "quality", property = "quality")
})
List<CollectionParamsManageEntity> selectCPMList(String buildingId,String deviceInstallId, String otherName, Integer pageNum, Integer pageSize);
@Select("<script>" +
"SELECT count(1) " +
"FROM collection_params_manage cpm join device_install di on cpm.device_install_id = di.id where 1=1" +
"<if test='deviceInstallId != null and deviceInstallId != \"\"'>" +
"AND cpm.device_install_id = #{deviceInstallId} " +
"</if>" +
"<if test='buildingId != null and buildingId != \"\"'>" +
"AND di.building_id = #{buildingId} " +
"</if>" +
"<if test='otherName != null and otherName != \"\"'>" +
"AND cpm.other_name LIKE CONCAT('%', #{otherName}, '%') " +
"</if>" +
"</script>")
int selectCPMListCount(String buildingId, String deviceInstallId, String otherName, Integer pageNum, Integer pageSize);
@Select("select count(1) from collection_params_manage where other_name = #{otherName} ")
int selectCountByOtherName(String otherName);
@Update("update collection_params_manage set cur_value = #{value}, cur_time = #{time}, quality = #{quality} where other_name = #{name} and building_id = #{buildingId}")
void updateCPMByOtherName(String name, BigDecimal value, String time, String quality, String buildingId);
@Update("<script>" +
"WITH BatchData AS (" +
"<foreach collection='batch' item='item' separator='UNION ALL'>" +
"SELECT #{item.name} AS other_name, #{item.value} AS cur_value" +
"</foreach>" +
") " +
"MERGE collection_params_manage AS target " +
"USING BatchData AS source " +
"ON (target.other_name = source.other_name AND target.building_id = #{buildingId}) " +
"WHEN MATCHED THEN " +
" UPDATE SET " +
" cur_value = source.cur_value, " +
" cur_time = #{time}, " +
" quality = #{quality};" +
"</script>")
void updateBatchCPMByOtherName(@Param("batch") List<SanShiFengDatas> batch,
@Param("time") String time,
@Param("quality") String quality,
@Param("buildingId") String buildingId);
@Select("select top 1 * from collection_params_manage where other_name = #{name} and building_id = #{buildingId} ")
@Results({
@Result(column = "id", property = "id"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime"),
@Result(column = "device_install_id", property = "deviceInstallId"),
@Result(column = "register_addr", property = "registerAddr"),
@Result(column = "func_code", property = "funcCode"),
@Result(column = "mt_ratio", property = "mtRatio"),
@Result(column = "mt_init_value", property = "mtInitValue"),
@Result(column = "digits", property = "digits"),
@Result(column = "data_type", property = "dataType"),
@Result(column = "cur_value", property = "curValue"),
@Result(column = "cur_time", property = "curTime"),
@Result(column = "mt_is_sum", property = "mtIsSum"),
@Result(column = "unit", property = "unit"),
@Result(column = "order_num", property = "orderNum"),
@Result(column = "remark", property = "remark"),
@Result(column = "register_size", property = "registerSize"),
@Result(column = "is_use", property = "isUse"),
@Result(column = "other_name", property = "otherName"),
@Result(column = "grade", property = "grade"),
@Result(column = "param_type_id", property = "paramTypeId"),
@Result(column = "collection_type", property = "collectionType"),
@Result(column = "quality", property = "quality")
})
CollectionParamsManageEntity selectDeviceInstallByOtherName(String name, String buildingId);
@Insert("insert into collection_params_manage(" +
"device_install_id, register_addr, func_code, mt_ratio, mt_init_value, digits, data_type, " +
"mt_is_sum, unit, order_num, remark, register_size, is_use, " +
"other_name, grade, param_type_id, collection_type, quality, create_time, building_id, cur_value, cur_time) " +
"values(#{deviceInstallId}, #{registerAddr}, #{funcCode}, #{mtRatio}, #{mtInitValue}, " +
"#{digits}, #{dataType}, #{mtIsSum}, #{unit}, #{orderNum}, " +
"#{remark}, #{registerSize}, #{isUse}, #{otherName}, #{grade}, #{paramTypeId}, " +
"#{collectionType}, #{quality}, getdate(), #{buildingId}, #{curValue}, #{curTime})")
void insertCPM(CollectionParamsManageEntity cpmEntity);
@Update("<script>" +
"update collection_params_manage " +
"<set>" +
"<if test='deviceInstallId != null'>device_install_id = #{deviceInstallId},</if>" +
"<if test='registerAddr != null'>register_addr = #{registerAddr},</if>" +
"<if test='funcCode != null'>func_code = #{funcCode},</if>" +
"<if test='mtRatio != null'>mt_ratio = #{mtRatio},</if>" +
"<if test='mtInitValue != null'>mt_init_value = #{mtInitValue},</if>" +
"<if test='digits != null'>digits = #{digits},</if>" +
"<if test='dataType != null'>data_type = #{dataType},</if>" +
"<if test='curValue != null'>cur_value = #{curValue},</if>" +
"<if test='curTime != null'>cur_time = #{curTime},</if>" +
"<if test='mtIsSum != null'>mt_is_sum = #{mtIsSum},</if>" +
"<if test='unit != null'>unit = #{unit},</if>" +
"<if test='orderNum != null'>order_num = #{orderNum},</if>" +
"<if test='remark != null'>remark = #{remark},</if>" +
"<if test='registerSize != null'>register_size = #{registerSize},</if>" +
"<if test='isUse != null'>is_use = #{isUse},</if>" +
"<if test='otherName != null'>other_name = #{otherName},</if>" +
"<if test='grade != null'>grade = #{grade},</if>" +
"<if test='paramTypeId != null'>param_type_id = #{paramTypeId},</if>" +
"<if test='collectionType != null'>collection_type = #{collectionType},</if>" +
"<if test='quality != null'>quality = #{quality},</if>" +
"<if test='buildingId != null'>building_id = #{buildingId},</if>" +
" update_time = getdate() " +
"</set>" +
"where id = #{id}" +
"</script>")
void updateById(CollectionParamsManageEntity cpmEntity);
@Delete("delete from collection_params_manage where id = #{msId}")
void deleteById(String msId);
@Select("SELECT " +
" cpm.id as cpm_id, " +
" di.building_id, " +
" di.building_name, " +
" di.device_type, " +
" di.id as device_id, " +
" di.device_name, " +
" cpm.other_name, " +
" COALESCE(cpm.cur_value, 0) as cur_value, " +
" cpm.cur_time, " +
" cpm.param_type_id, " +
" cpm.digits, " +
" ct.order_num AS ct_order_num, " +
" di.order_num AS dl_order_num " +
"FROM " +
" device_install di " +
" JOIN collection_params_manage cpm ON di.id = cpm.device_install_id " +
" JOIN code_table ct ON ct.des = di.device_type " +
" AND di.building_id = #{buildingId} " +
" AND ct.name = 'deviceType' " +
"ORDER BY " +
" ct.order_num, " +
" di.order_num ")
@Results({
@Result(column = "cpm_id", property = "cpmId"),
@Result(column = "building_id", property = "buildingId"),
@Result(column = "building_name", property = "buildingName"),
@Result(column = "device_type", property = "deviceType"),
@Result(column = "device_id", property = "deviceId"),
@Result(column = "device_name", property = "deviceName"),
@Result(column = "other_name", property = "otherName"),
@Result(column = "cur_value", property = "curValue"),
@Result(column = "cur_time", property = "curTime"),
@Result(column = "param_type_id", property = "paramTypeId"),
@Result(column = "digits", property = "digits"),
@Result(column = "ct_order_num", property = "ctOrderNum"),
@Result(column = "dl_order_num", property = "dlOrderNum")
})
List<HotWaterControlListVO> selectHotWaterByBuildingId(String buildingId);
@Select("SELECT " +
" top 1 gm.community_type " +
"FROM " +
" device_install di " +
" JOIN collection_params_manage cpm ON di.id = cpm.device_install_id " +
" JOIN gateway_manage gm ON di.data_com = gm.data_com " +
" AND cpm.id = #{cpmId} ")
String selectCommunicationType(String cpmId);
@Select("SELECT " +
" top 1 gm.sn " +
"FROM " +
" device_install di " +
" JOIN collection_params_manage cpm ON di.id = cpm.device_install_id " +
" JOIN gateway_manage gm ON di.data_com = gm.data_com " +
" AND cpm.id = #{cpmId} ")
String selectSn(String cpmId);
@Select("SELECT " +
" top 1 gm.gateway_name " +
"FROM " +
" device_install di " +
" JOIN collection_params_manage cpm ON di.id = cpm.device_install_id " +
" JOIN gateway_manage gm ON di.data_com = gm.data_com " +
" AND cpm.id = #{cpmId} ")
String selectPlcName(String cpmId);
@Select("select top 1 * from collection_params_manage where id = #{id}")
@Results({
@Result(column = "id", property = "id"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime"),
@Result(column = "device_install_id", property = "deviceInstallId"),
@Result(column = "register_addr", property = "registerAddr"),
@Result(column = "func_code", property = "funcCode"),
@Result(column = "mt_ratio", property = "mtRatio"),
@Result(column = "mt_init_value", property = "mtInitValue"),
@Result(column = "digits", property = "digits"),
@Result(column = "data_type", property = "dataType"),
@Result(column = "cur_value", property = "curValue"),
@Result(column = "cur_time", property = "curTime"),
@Result(column = "mt_is_sum", property = "mtIsSum"),
@Result(column = "unit", property = "unit"),
@Result(column = "order_num", property = "orderNum"),
@Result(column = "remark", property = "remark"),
@Result(column = "register_size", property = "registerSize"),
@Result(column = "is_use", property = "isUse"),
@Result(column = "other_name", property = "otherName"),
@Result(column = "grade", property = "grade"),
@Result(column = "param_type_id", property = "paramTypeId"),
@Result(column = "collection_type", property = "collectionType"),
@Result(column = "quality", property = "quality")
})
CollectionParamsManageEntity selectById(String id);
@Select("select top 1 * from collection_params_manage where device_install_id = #{deviceInstallId} and param_type_id = #{paramTypeId}")
@Results({
@Result(column = "id", property = "id"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime"),
@Result(column = "device_install_id", property = "deviceInstallId"),
@Result(column = "register_addr", property = "registerAddr"),
@Result(column = "func_code", property = "funcCode"),
@Result(column = "mt_ratio", property = "mtRatio"),
@Result(column = "mt_init_value", property = "mtInitValue"),
@Result(column = "digits", property = "digits"),
@Result(column = "data_type", property = "dataType"),
@Result(column = "cur_value", property = "curValue"),
@Result(column = "cur_time", property = "curTime"),
@Result(column = "mt_is_sum", property = "mtIsSum"),
@Result(column = "unit", property = "unit"),
@Result(column = "order_num", property = "orderNum"),
@Result(column = "remark", property = "remark"),
@Result(column = "register_size", property = "registerSize"),
@Result(column = "is_use", property = "isUse"),
@Result(column = "other_name", property = "otherName"),
@Result(column = "grade", property = "grade"),
@Result(column = "param_type_id", property = "paramTypeId"),
@Result(column = "collection_type", property = "collectionType"),
@Result(column = "quality", property = "quality")
})
CollectionParamsManageEntity selectByDeviceIdAndParamTypeId(Long deviceInstallId, String paramTypeId);
@Select("select * from collection_params_manage order by create_time desc")
@Results({
@Result(column = "id", property = "id"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime"),
@Result(column = "device_install_id", property = "deviceInstallId"),
@Result(column = "register_addr", property = "registerAddr"),
@Result(column = "func_code", property = "funcCode"),
@Result(column = "mt_ratio", property = "mtRatio"),
@Result(column = "mt_init_value", property = "mtInitValue"),
@Result(column = "digits", property = "digits"),
@Result(column = "data_type", property = "dataType"),
@Result(column = "cur_value", property = "curValue"),
@Result(column = "cur_time", property = "curTime"),
@Result(column = "mt_is_sum", property = "mtIsSum"),
@Result(column = "unit", property = "unit"),
@Result(column = "order_num", property = "orderNum"),
@Result(column = "remark", property = "remark"),
@Result(column = "register_size", property = "registerSize"),
@Result(column = "is_use", property = "isUse"),
@Result(column = "other_name", property = "otherName"),
@Result(column = "grade", property = "grade"),
@Result(column = "param_type_id", property = "paramTypeId"),
@Result(column = "collection_type", property = "collectionType"),
@Result(column = "quality", property = "quality"),
@Result(column = "building_id", property = "buildingId")
})
List<CollectionParamsManageEntity> selectAllCPMList();
}

12
user-service/src/main/java/com/mh/user/mapper/DataResultMapper.java

@ -24,7 +24,7 @@ public interface DataResultMapper {
" <if test='curValue!=null'> , cur_value = #{curValue} </if>" + " <if test='curValue!=null'> , cur_value = #{curValue} </if>" +
" <if test='ratio!=null'> , ratio = #{ratio} </if>" + " <if test='ratio!=null'> , ratio = #{ratio} </if>" +
" <if test='calcValue!=null'> , calc_value = #{calcValue} </if>" + " <if test='calcValue!=null'> , calc_value = #{calcValue} </if>" +
" where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id = #{buildingId}" + " where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType}" +
"</script>") "</script>")
void updateDataResult(DataResultEntity dataResultEntity); void updateDataResult(DataResultEntity dataResultEntity);
@ -60,18 +60,16 @@ public interface DataResultMapper {
//查询单条记录 //查询单条记录
@ResultMap("rs") @ResultMap("rs")
@Select("select top 1 * from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id = #{buildingId} ") @Select("select * from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} ")
DataResultEntity selectDataResult(@Param("curDate") String curDate, DataResultEntity selectDataResult(@Param("curDate") String curDate,
@Param("deviceAddr") String deviceAddr, @Param("deviceAddr") String deviceAddr,
@Param("deviceType") String deviceType, @Param("deviceType") String deviceType);
@Param("buildingId") String buildingId);
//查询是否存在记录 //查询是否存在记录
@Select("select count(*) from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id = #{buildingId} ") @Select("select count(*) from data_result where cur_date=#{curDate} and device_addr=#{deviceAddr} and device_type=#{deviceType} ")
// @Select("select count(*) from data_result") // @Select("select count(*) from data_result")
int selectDataResultCount(@Param("curDate") String curDate, int selectDataResultCount(@Param("curDate") String curDate,
@Param("deviceAddr") String deviceAddr, @Param("deviceAddr") String deviceAddr,
@Param("deviceType") String deviceType, @Param("deviceType") String deviceType);
@Param("buildingId") String buildingId);
} }

7
user-service/src/main/java/com/mh/user/mapper/DeviceInstallMapper.java

@ -49,7 +49,7 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
int updateDevice(DeviceInstallEntity deviceInstallEntity); int updateDevice(DeviceInstallEntity deviceInstallEntity);
//按id更新水电表读数和采集日期 //按id更新水电表读数和采集日期
@Update("update device_install set last_value=#{lastValue},last_date=#{lastDate}, is_online = '在线' where id=#{id}") @Update("update device_install set last_value=#{lastValue},last_date=#{lastDate} where id=#{id}")
void updateLastValue(@Param("id") Long id,@Param("lastValue") String lastValue,@Param("lastDate") Date lastDate); void updateLastValue(@Param("id") Long id,@Param("lastValue") String lastValue,@Param("lastDate") Date lastDate);
/** /**
* 设备管理模块 * 设备管理模块
@ -305,12 +305,11 @@ public interface DeviceInstallMapper extends BaseMapper<DeviceInstallEntity> {
@Param("buildingId") String buildingId); @Param("buildingId") String buildingId);
//更新基表初始值 //更新基表初始值
@Update("update device_install set init_value=#{initValue} where id = #{id} ") @Update("update device_install set init_value=#{initValue} where device_addr=#{deviceAddr} and device_type=#{deviceType} and building_id=#{buildingId} ")
void updateInitValue(@Param("deviceAddr") String deviceAddr, void updateInitValue(@Param("deviceAddr") String deviceAddr,
@Param("deviceType") String deviceType, @Param("deviceType") String deviceType,
@Param("buildingId") String buildingId, @Param("buildingId") String buildingId,
@Param("initValue") String initValue, @Param("initValue") String initValue);
@Param("id") Long id);
//查询最后一次采集时间 //查询最后一次采集时间
@Select("select last_date from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId}") @Select("select last_date from device_install where device_type=#{deviceType} and device_addr=#{deviceAddr} and building_id=#{buildingId}")

6
user-service/src/main/java/com/mh/user/mapper/GatewayManageMapper.java

@ -115,10 +115,4 @@ public interface GatewayManageMapper {
@Select("select top 1 grade from gateway_manage where data_com = #{dataCom} ") @Select("select top 1 grade from gateway_manage where data_com = #{dataCom} ")
int queryGatewayByDataCom(@Param("dataCom") String dataCom); int queryGatewayByDataCom(@Param("dataCom") String dataCom);
@Update("update gateway_manage set grade = #{grade}, connect_date = getdate() where sn = #{sn}")
void updateGatewayManageOnlineBySn(String sn, int grade);
@Select("select top 1 building_id from device_install di join gateway_manage gm on di.data_com = gm.data_com and gm.sn = #{sn}")
String queryBuildingIdBySn(String sn);
} }

2
user-service/src/main/java/com/mh/user/mapper/MqttSubscriptionMapper.java

@ -22,7 +22,7 @@ public interface MqttSubscriptionMapper extends BaseMapper<MqttSubscriptionEntit
"SELECT * FROM mqtt_subscription WHERE 1=1 " + "SELECT * FROM mqtt_subscription WHERE 1=1 " +
"<if test='topic != null and topic != \"\"'>AND topic = #{topic}</if>" + "<if test='topic != null and topic != \"\"'>AND topic = #{topic}</if>" +
"<if test='status != null and status != \"\"'>AND status = #{status}</if>" + "<if test='status != null and status != \"\"'>AND status = #{status}</if>" +
"ORDER BY create_time DESC " + "ORDER BY crate_time DESC " +
"</script>") "</script>")
List<MqttSubscriptionEntity> selectListByTopic(@Param("topic") String topic, List<MqttSubscriptionEntity> selectListByTopic(@Param("topic") String topic,
@Param("status") String status); @Param("status") String status);

49
user-service/src/main/java/com/mh/user/mapper/NowDataMapper.java

@ -1,6 +1,9 @@
package com.mh.user.mapper; package com.mh.user.mapper;
import com.mh.user.entity.*; import com.mh.user.entity.NowDataEntity;
import com.mh.user.entity.WaterLevelEntity;
import com.mh.user.entity.WaterTempEntity;
import com.mh.user.entity.PumpMinutesEntity;
import com.mh.user.mapper.provider.NowDataProvider; import com.mh.user.mapper.provider.NowDataProvider;
import com.mh.user.model.WaterLevelModel; import com.mh.user.model.WaterLevelModel;
import org.apache.ibatis.annotations.*; import org.apache.ibatis.annotations.*;
@ -213,7 +216,7 @@ public interface NowDataMapper {
//查询历史表记录(热泵) //查询历史表记录(热泵)
@ResultMap(value = "rs") @ResultMap(value = "rs")
@Select("select top 1 * from history_data where cur_date=#{curDate} and building_id=#{buildingId} and pump_id=#{pumpId} ") @Select("select * from history_data where cur_date=#{curDate} and building_id=#{buildingId} and pump_id=#{pumpId}")
NowDataEntity selectHistoryData(@Param("curDate") String curDate,@Param("buildingId") String buildingId,@Param("pumpId") String pumpId); NowDataEntity selectHistoryData(@Param("curDate") String curDate,@Param("buildingId") String buildingId,@Param("pumpId") String pumpId);
//判断历史表有没有记录(非热泵) //判断历史表有没有记录(非热泵)
@ -289,22 +292,6 @@ public interface NowDataMapper {
int queryWaterTempCount(@Param("buildingID") String buildingID, int queryWaterTempCount(@Param("buildingID") String buildingID,
@Param("curDate") String curDate); @Param("curDate") String curDate);
@Results({@Result(property="curDate",column="cur_date"),
@Result(property="buildingID",column="building_id"),
@Result(property="buildingName",column="building_name"),
@Result(property="deviceAddr",column="device_addr"),
@Result(property="deviceName",column="device_name")
})
@SelectProvider(type = NowDataProvider.class,method = "queryWaterPressure")
List<WaterPressureEntity> queryWaterPressure(@Param("buildingID") String buildingID,
@Param("curDate") String curDate,
@Param("page") int page,
@Param("limit") int limit);
@SelectProvider(type = NowDataProvider.class,method = "queryWaterPressureCount")
int queryWaterPressureCount(@Param("buildingID") String buildingID,
@Param("curDate") String curDate);
//查询每天24小时每个热泵温度变化情况2 //查询每天24小时每个热泵温度变化情况2
@Results({@Result(property="curDate",column="cur_date"), @Results({@Result(property="curDate",column="cur_date"),
@Result(property="buildingID",column="building_id"), @Result(property="buildingID",column="building_id"),
@ -315,17 +302,6 @@ public interface NowDataMapper {
@Param("page") int page, @Param("page") int page,
@Param("limit") int limit); @Param("limit") int limit);
@Results({@Result(property="curDate",column="cur_date"),
@Result(property="buildingID",column="building_id"),
@Result(property="buildingName",column="building_name"),
@Result(property="deviceAddr",column="device_addr"),
@Result(property="deviceName",column="device_name")
})
@SelectProvider(type = NowDataProvider.class,method = "queryWaterPressure2")
List<WaterPressureEntity> queryWaterPressure2(@Param("curDate") String curDate,
@Param("page") int page,
@Param("limit") int limit);
@SelectProvider(type = NowDataProvider.class,method = "queryWaterTempCount2") @SelectProvider(type = NowDataProvider.class,method = "queryWaterTempCount2")
int queryWaterTempCount2(@Param("curDate") String curDate); int queryWaterTempCount2(@Param("curDate") String curDate);
@ -339,21 +315,6 @@ public interface NowDataMapper {
@Options(statementType = StatementType.CALLABLE) @Options(statementType = StatementType.CALLABLE)
void proWaterLevel(@Param("curDate") String curDate,@Param("buildingID") String buildingID, @Param("deviceAddr") String deviceAddr); void proWaterLevel(@Param("curDate") String curDate,@Param("buildingID") String buildingID, @Param("deviceAddr") String deviceAddr);
//生成楼栋压力
@Select("exec pro_water_pressure #{curDate,jdbcType=VARCHAR,mode=IN}," +
"#{buildingID,jdbcType=VARCHAR,mode=IN}, " +
"#{buildingName,jdbcType=VARCHAR,mode=IN}, " +
"#{deviceAddr,jdbcType=VARCHAR,mode=IN}, " +
"#{deviceName,jdbcType=VARCHAR,mode=IN}, " +
"#{dataStr,jdbcType=VARCHAR,mode=IN}")
@Options(statementType = StatementType.CALLABLE)
void proWaterPressure(@Param("curDate") String curDate,
@Param("buildingID") String buildingID,
@Param("buildingName") String buildingName,
@Param("deviceAddr") String deviceAddr,
@Param("deviceName") String deviceName,
@Param("dataStr") String dataStr);
//在没有接收到返回值前设置监控界面热泵是否离线 //在没有接收到返回值前设置监控界面热泵是否离线
@Update("update now_data set run_state=#{strState} where building_id=#{buildingId} and pump_id=#{pumpId}") @Update("update now_data set run_state=#{strState} where building_id=#{buildingId} and pump_id=#{pumpId}")
void updateRunState(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId,@Param("strState") String strState); void updateRunState(@Param("buildingId") String buildingId,@Param("pumpId") String pumpId,@Param("strState") String strState);

2
user-service/src/main/java/com/mh/user/mapper/PumpSetMapper.java

@ -23,8 +23,6 @@ public interface PumpSetMapper {
" <if test='closeTime1!=null'> , close_time1 = #{closeTime1} </if>" + " <if test='closeTime1!=null'> , close_time1 = #{closeTime1} </if>" +
" <if test='startTime2!=null'> , start_time2 = #{startTime2} </if>" + " <if test='startTime2!=null'> , start_time2 = #{startTime2} </if>" +
" <if test='closeTime2!=null'> , close_time2 = #{closeTime2} </if>" + " <if test='closeTime2!=null'> , close_time2 = #{closeTime2} </if>" +
" <if test='startTime3!=null'> , start_time3 = #{startTime3} </if>" +
" <if test='closeTime3!=null'> , close_time3 = #{closeTime3} </if>" +
" where building_id = #{buildingId} and pump_id=#{pumpId}" + " where building_id = #{buildingId} and pump_id=#{pumpId}" +
"</script>") "</script>")
void updatePumpSet(PumpSetEntity pumpSetEntity); void updatePumpSet(PumpSetEntity pumpSetEntity);

62
user-service/src/main/java/com/mh/user/mapper/provider/NowDataProvider.java

@ -169,42 +169,6 @@ public class NowDataProvider {
return sql.toString(); return sql.toString();
} }
//从history_data查询水温
public String queryWaterPressure(String buildingID,String curDate, int page, int limit){
StringBuffer sql = new StringBuffer("");
sql.append("select * from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" +
"select t1.* from water_pressure t1 join building t2 on t1.building_id=t2.id "+
" where 1=1 ");
if (buildingID != null && !buildingID.equals("")){
sql.append(" AND t1.building_id= #{buildingID} ");
}
if (curDate!= null && !curDate.equals("")) {
sql.append(" AND convert(varchar(10),t1.cur_date,121)=#{curDate} ");
}
if ((page != 0) && (limit != 0)){
sql.append(" )T )TT where TT.rn>(#{page}-1)*#{limit} and TT.rn<=#{page}*#{limit} order by TT.device_addr ");
} else if (page == 0){
sql.append(" )T )TT order by TT.device_addr ");
}
return sql.toString();
}
//从history_data查询水温记录数
public String queryWaterPressureCount(String buildingID,String curDate){
StringBuffer sql = new StringBuffer("");
sql.append("select count(*) from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" +
"select t1.* from water_pressure t1 join building t2 on t1.building_id=t2.id "+
" where 1=1 ");
if (buildingID != null && !buildingID.equals("")){
sql.append(" AND t1.building_id= #{buildingID} ");
}
if (curDate!= null && !curDate.equals("")) {
sql.append(" AND convert(varchar(10),t1.cur_date,121)=#{curDate} ");
}
sql.append(" ) T )TT ");
return sql.toString();
}
public String queryWaterTemp2(String curDate, int page, int limit){ public String queryWaterTemp2(String curDate, int page, int limit){
StringBuffer sql = new StringBuffer(""); StringBuffer sql = new StringBuffer("");
sql.append("select top 1000 * from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" + sql.append("select top 1000 * from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" +
@ -254,32 +218,6 @@ public class NowDataProvider {
return sql.toString(); return sql.toString();
} }
public String queryWaterPressure2(String curDate, int page, int limit){
StringBuffer sql = new StringBuffer("");
sql.append("select top 1000 * from (select *,ROW_NUMBER() over(order by cur_date) as rn from (" +
"select top 1000 t1.cur_date,t1.building_id,t2.building_name,t2.sort,convert(decimal(8,1),AVG(convert(float,t1.pressure00)))as pressure00," +
"convert(decimal(8,1),AVG(convert(float,t1.pressure02)))as pressure02," +
"convert(decimal(8,1),AVG(convert(float,t1.pressure06)))as pressure06," +
"convert(decimal(8,1),AVG(convert(float,t1.pressure08)))as pressure08,convert(decimal(8,1),AVG(convert(float,t1.pressure11)))as pressure11," +
"convert(decimal(8,1),AVG(convert(float,t1.pressure13)))as pressure13," +
"convert(decimal(8,1),AVG(convert(float,t1.pressure14)))as pressure14," +
"convert(decimal(8,1),AVG(convert(float,t1.pressure15)))as pressure15," +
"convert(decimal(8,1),AVG(convert(float,t1.pressure16)))as pressure16,convert(decimal(8,1),AVG(convert(float,t1.pressure17)))as pressure17," +
"convert(decimal(8,1),AVG(convert(float,t1.pressure18)))as pressure18,convert(decimal(8,1),AVG(convert(float,t1.pressure19)))as pressure19," +
"convert(decimal(8,1),AVG(convert(float,t1.pressure20)))as pressure20,convert(decimal(8,1),AVG(convert(float,t1.pressure21)))as pressure21," +
"convert(decimal(8,1),AVG(convert(float,t1.pressure22)))as pressure22,convert(decimal(8,1),AVG(convert(float,t1.pressure23)))as pressure23 " +
" from water_pressure t1 join building t2 on t1.building_id=t2.id where 1=1 ");
if (curDate!= null && !curDate.equals("")) {
sql.append(" AND convert(varchar(10),t1.cur_date,121)=#{curDate} group by t1.building_id,t2.building_name,t2.sort,t1.cur_date order by t2.sort ");
}
if ((page != 0) && (limit != 0)){
sql.append(" )T )TT where TT.rn>(#{page}-1)*#{limit} and TT.rn<=#{page}*#{limit} order by TT.cur_date desc ");
} else if (page == 0){
sql.append(" )T )TT order by TT.cur_date desc ");
}
return sql.toString();
}
//从history_data表按时间点查询水位 //从history_data表按时间点查询水位
public String queryWaterLevelByTime(String curDate, int page, int limit){ public String queryWaterLevelByTime(String curDate, int page, int limit){
// StringBuffer sql = new StringBuffer(""); // StringBuffer sql = new StringBuffer("");

13
user-service/src/main/java/com/mh/user/model/AreaBuildingTreeModel.java

@ -25,21 +25,8 @@ public class AreaBuildingTreeModel {
*/ */
private int level; private int level;
/**
* 类型0三旺通信1PLC通信
*/
private int commType;
private List<AreaBuildingTreeModel> children; private List<AreaBuildingTreeModel> children;
public int getCommType() {
return commType;
}
public void setCommType(int commType) {
this.commType = commType;
}
public int getLevel() { public int getLevel() {
return level; return level;
} }

34
user-service/src/main/java/com/mh/user/model/MyBigDecimalDeserializer.java

@ -1,34 +0,0 @@
package com.mh.user.model;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.math.BigDecimal;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 格式化
* @date 2026-01-07 14:20:36
*/
public class MyBigDecimalDeserializer extends JsonDeserializer<BigDecimal> {
@Override
public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getValueAsString();
if (value == null || value.trim().isEmpty()) {
return BigDecimal.ZERO;
}
try {
// 直接使用字符串构造BigDecimal,能正确处理科学计数法
return new BigDecimal(value);
} catch (NumberFormatException e) {
// 如果转换失败,返回0
return BigDecimal.ZERO;
}
}
}

24
user-service/src/main/java/com/mh/user/model/SanShiFengDatas.java

@ -1,36 +1,30 @@
package com.mh.user.model; package com.mh.user.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
/** /**
* @author LJF * @author LJF
* @version 1.0 * @version 1.0
* @project EEMCS * @project EEMCS
* @description 三石峰数据体 * @description 研华数据体
* @date 2025-01-22 14:47:25 * @date 2025-01-22 14:47:25
*/ */
@Data @Data
public class SanShiFengDatas { public class SanShiFengDatas<T extends Number> {
/** /**
* 对应研华的标签值 * 对应研华的标签值
*/ */
private String name; private String tag;
/** /**
* 上报值 * 上报值
*/ */
// 使用自定义反序列化器处理科学计数法 private T value;
@JsonDeserialize(using = MyBigDecimalDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING) // 以字符串形式输出,避免科学计数法 /**
private BigDecimal value; * 质量值
// /** */
// * 质量值 private T quality;
// */
// private T quality;
} }

23
user-service/src/main/java/com/mh/user/model/SanShiFengReceiver.java

@ -3,42 +3,27 @@ package com.mh.user.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data; import lombok.Data;
import java.util.Collections;
import java.util.List; import java.util.List;
/** /**
* @author LJF * @author LJF
* @version 1.0 * @version 1.0
* @project EEMCS * @project EEMCS
* @description 三石峰网关发送接收数据 * @description 研华网关发送接收数据
* @date 2025-01-22 14:43:15 * @date 2025-01-22 14:43:15
*/ */
@Data @Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class SanShiFengReceiver<T> { public class SanShiFengReceiver<T> {
/** /**
* 数据集合 * 数据集合
*/ */
private List<T> datas; private List<T> d;
/** /**
* 主动上报数据时间带T类型 * 主动上报数据时间带T类型
*/ */
private String sn; private String ts;
private String plcName;
private String projectName;
private String time;
// // 确保在 getDatas() 方法中正确处理泛型类型
// public List<SanShiFengStrDatas> getDatas() {
// // 如果是从 JSON 反序列化,使用 TypeReference
// if (this.datas != null) {
// return (List<SanShiFengStrDatas>) this.datas;
// }
// return Collections.emptyList();
// }
} }

33
user-service/src/main/java/com/mh/user/model/SanShiFengStrDatas.java

@ -1,33 +0,0 @@
package com.mh.user.model;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 三石峰数据体
* @date 2025-01-22 14:47:25
*/
@Data
public class SanShiFengStrDatas {
/**
* 对应研华的标签值
*/
private String name;
/**
* 上报值
*/
// 使用自定义反序列化器处理科学计数法
private String value;
// /**
// * 质量值
// */
// private T quality;
}

5
user-service/src/main/java/com/mh/user/model/SerialPortModel.java

@ -35,9 +35,4 @@ public class SerialPortModel {
*/ */
private String dataValue; private String dataValue;
/**
* 对应的采集参数id
*/
private String cpmId;
} }

15
user-service/src/main/java/com/mh/user/model/SysUser.java

@ -1,6 +1,5 @@
package com.mh.user.model; package com.mh.user.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -14,24 +13,10 @@ public class SysUser extends BaseModel {
private String userName; private String userName;
/**
* 前端不显示出来
*/
@JsonIgnore
private String password; private String password;
/**
* 前端不显示出来
*/
@JsonIgnore
private String salt; private String salt;
/**
* 前端不显示出来
*/
@JsonIgnore
private String createBy;
private String email; private String email;
private String mobile; private String mobile;

40
user-service/src/main/java/com/mh/user/netty/task/CallbackTaskScheduler.java

@ -2,8 +2,10 @@ package com.mh.user.netty.task;
import com.google.common.util.concurrent.*; import com.google.common.util.concurrent.*;
import java.util.concurrent.*; import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/** /**
* @author LJF * @author LJF
@ -13,12 +15,12 @@ import java.util.concurrent.atomic.AtomicBoolean;
* @date 2023/7/3 15:34:11 * @date 2023/7/3 15:34:11
*/ */
public class CallbackTaskScheduler extends Thread { public class CallbackTaskScheduler extends Thread {
private final BlockingQueue<CallbackTask> executeTaskQueue = private ConcurrentLinkedQueue<CallbackTask> executeTaskQueue =
new LinkedBlockingQueue<>(); new ConcurrentLinkedQueue<>();
private long sleepTime = 1000 * 10;
private final ExecutorService pool = Executors.newCachedThreadPool(); private final ExecutorService pool = Executors.newCachedThreadPool();
private final ListeningExecutorService lpool = MoreExecutors.listeningDecorator(pool); ListeningExecutorService lpool = MoreExecutors.listeningDecorator(pool);
private static CallbackTaskScheduler inst = new CallbackTaskScheduler(); private static CallbackTaskScheduler inst = new CallbackTaskScheduler();
private final AtomicBoolean running = new AtomicBoolean(true);
private CallbackTaskScheduler() { private CallbackTaskScheduler() {
this.start(); this.start();
@ -26,32 +28,32 @@ public class CallbackTaskScheduler extends Thread {
//add task //add task
public static <T> void add(CallbackTask<T> executeTask) { public static <T> void add(CallbackTask<T> executeTask) {
inst.executeTaskQueue.offer(executeTask); inst.executeTaskQueue.add(executeTask);
} }
@Override @Override
public void run() { public void run() {
while (running.get()) { while (true) {
handleTask(); handleTask();
//为了避免频繁连接服务器,但是当前连接服务器过长导致失败
//threadSleep(sleepTime);
} }
} }
/** private void threadSleep(long sleepTime) {
* 停止调度器 try {
*/ Thread.sleep(sleepTime);
public static void shutdown() { } catch (Exception e) {
inst.running.set(false); e.printStackTrace();
inst.pool.shutdown(); }
} }
//任务执行 //任务执行
private void handleTask() { private void handleTask() {
try { CallbackTask executeTask = null;
// 使用 take() 阻塞等待,直到有任务 while (executeTaskQueue.peek() != null) {
CallbackTask executeTask = executeTaskQueue.take(); executeTask = executeTaskQueue.poll();
handleTask(executeTask); handleTask(executeTask);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} }
} }

2
user-service/src/main/java/com/mh/user/service/CodeTableService.java

@ -9,6 +9,4 @@ public interface CodeTableService {
List<DeviceTypeModel> queryDeviceType(); List<DeviceTypeModel> queryDeviceType();
List<DeviceTypeModel> queryBrand(); List<DeviceTypeModel> queryBrand();
List<DeviceTypeModel> queryDataByName(String name);
} }

44
user-service/src/main/java/com/mh/user/service/CollectionParamsManageService.java

@ -1,44 +0,0 @@
package com.mh.user.service;
import com.mh.user.dto.HotWaterControlDTO;
import com.mh.user.dto.HotWaterNowDataDTO;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.model.SanShiFengDatas;
import java.math.BigDecimal;
import java.util.List;
/**
* @author LJF
* @version 1.0
* @project EEMCS
* @description 采集参数管理
* @date 2025-02-14 13:58:37
*/
public interface CollectionParamsManageService {
List<CollectionParamsManageEntity> selectCPMList(String buildingId, String deviceInstallId, String otherName, Integer pageNum, Integer pageSize);
int selectCPMListCount(String buildingId, String deviceInstallId, String otherName, Integer pageNum, Integer pageSize);
CollectionParamsManageEntity selectById(String msId);
String insertCPM(CollectionParamsManageEntity mqttSubscription);
String updateCPM(CollectionParamsManageEntity mqttSubscription);
int deleteByIds(String[] msIds);
void updateCPMByOtherName(String name, BigDecimal value, String time, String buildingId);
CollectionParamsManageEntity selectDeviceInstallByOtherName(String name, String buildingId);
List<HotWaterNowDataDTO> monitorList(String buildingId);
List<HotWaterControlDTO> operateList(String floorId);
void getBatchUpdateCollectionParams(List<SanShiFengDatas> batch, String sn, String plcName, String projectName, String time, String buildingId);
List<CollectionParamsManageEntity> selectAllCPMList();
}

5
user-service/src/main/java/com/mh/user/service/DeviceControlService.java

@ -20,9 +20,4 @@ public interface DeviceControlService {
*/ */
public String readOrWriteDevice(List<SerialPortModel> params, String type); public String readOrWriteDevice(List<SerialPortModel> params, String type);
boolean isMqttControl(List<SerialPortModel> params);
String operationDevice(SerialPortModel params);
String getSn(SerialPortModel serialPortModel);
} }

2
user-service/src/main/java/com/mh/user/service/DeviceInstallService.java

@ -156,7 +156,7 @@ public interface DeviceInstallService {
void deletePump(String deviceAddr,String deviceType,String buildingId); void deletePump(String deviceAddr,String deviceType,String buildingId);
//更新基表初始值 //更新基表初始值
void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue, Long id); void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue);
//查询最后一次采集时间 //查询最后一次采集时间
String selectLastDate(String deviceType,String deviceAddr,String buildingId); String selectLastDate(String deviceType,String deviceAddr,String buildingId);

4
user-service/src/main/java/com/mh/user/service/GatewayManageService.java

@ -53,8 +53,4 @@ public interface GatewayManageService {
void updateGatewayManageOnlineByHeartBeatCode(String heartBeat, int status); void updateGatewayManageOnlineByHeartBeatCode(String heartBeat, int status);
void updateGatewayManageOnlineByImei(String imei, int status); void updateGatewayManageOnlineByImei(String imei, int status);
void updateGatewayManageOnlineBySn(String sn, int grade);
String queryBuildingIdBySn(String sn);
} }

8
user-service/src/main/java/com/mh/user/service/NowDataService.java

@ -97,15 +97,9 @@ public interface NowDataService {
int queryWaterTempCount(String buildingID,String curDate); int queryWaterTempCount(String buildingID,String curDate);
List<WaterPressureEntity> queryWaterPressure(String buildingID,String curDate,int page,int limit);
int queryWaterPressureCount(String buildingID,String curDate);
//查询每天24小时每个热泵温度变化情况2 //查询每天24小时每个热泵温度变化情况2
List<WaterTempEntity> queryWaterTemp2(String curDate,int page,int limit, int level, String buildingID); List<WaterTempEntity> queryWaterTemp2(String curDate,int page,int limit, int level, String buildingID);
List<WaterPressureEntity> queryWaterPressure2(String curDate,int page,int limit, int level, String buildingID);
int queryWaterTempCount2(String curDate, int level, String buildingID); int queryWaterTempCount2(String curDate, int level, String buildingID);
//生成楼栋温度 //生成楼栋温度
@ -160,7 +154,5 @@ public interface NowDataService {
List<MultiControlModel> queryMultiControlNowData(String buildingId); List<MultiControlModel> queryMultiControlNowData(String buildingId);
void updateMultiNowData(NowDataEntity nowDataEntity); void updateMultiNowData(NowDataEntity nowDataEntity);
void proWaterPressure(String dateStr, String buildingId, String buildingName, String registerAddr, String otherName, String dataStr);
} }

3
user-service/src/main/java/com/mh/user/service/impl/BuildingServiceImpl.java

@ -141,7 +141,6 @@ public class BuildingServiceImpl implements BuildingService {
projectNode.setSort(0); projectNode.setSort(0);
projectNode.setParentId(-1L); projectNode.setParentId(-1L);
projectNode.setLevel(0); projectNode.setLevel(0);
projectNode.setCommType(0);
projectNode.setChildren(new ArrayList<>()); projectNode.setChildren(new ArrayList<>());
// 判断区域是否有数据 // 判断区域是否有数据
@ -156,7 +155,6 @@ public class BuildingServiceImpl implements BuildingService {
buildingNode.setParentId(0L); buildingNode.setParentId(0L);
buildingNode.setSort(building.getSort()); buildingNode.setSort(building.getSort());
buildingNode.setLevel(2); buildingNode.setLevel(2);
buildingNode.setCommType(building.getCommType());
buildingNode.setChildren(null); buildingNode.setChildren(null);
return buildingNode; return buildingNode;
}) })
@ -187,7 +185,6 @@ public class BuildingServiceImpl implements BuildingService {
buildingNode.setParentId(area.getId()); buildingNode.setParentId(area.getId());
buildingNode.setSort(building.getSort()); buildingNode.setSort(building.getSort());
buildingNode.setLevel(2); buildingNode.setLevel(2);
buildingNode.setCommType(building.getCommType());
buildingNode.setChildren(null); buildingNode.setChildren(null);
return buildingNode; return buildingNode;
}) })

6
user-service/src/main/java/com/mh/user/service/impl/CodeTableServiceImpl.java

@ -6,7 +6,6 @@ import com.mh.user.service.CodeTableService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List; import java.util.List;
@Service @Service
@ -24,9 +23,4 @@ public class CodeTableServiceImpl implements CodeTableService {
public List<DeviceTypeModel> queryBrand() { public List<DeviceTypeModel> queryBrand() {
return codeTableMapper.queryBrand(); return codeTableMapper.queryBrand();
} }
@Override
public List<DeviceTypeModel> queryDataByName(String name) {
return codeTableMapper.queryDataByName(name);
}
} }

887
user-service/src/main/java/com/mh/user/service/impl/CollectionParamsManageServiceImpl.java

@ -1,887 +0,0 @@
package com.mh.user.service.impl;
import com.mh.common.utils.StringUtils;
import com.mh.user.constants.Constant;
import com.mh.user.dto.*;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.mapper.CollectionParamsManageMapper;
import com.mh.user.model.SanShiFengDatas;
import com.mh.user.service.CollectionParamsManageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 采集参数设备实现类
* @date 2025-12-10 11:30:54
*/
@Slf4j
@Service
public class CollectionParamsManageServiceImpl implements CollectionParamsManageService {
private final CollectionParamsManageMapper collectionParamsManageMapper;
public CollectionParamsManageServiceImpl(CollectionParamsManageMapper collectionParamsManageMapper) {
this.collectionParamsManageMapper = collectionParamsManageMapper;
}
@Override
public List<HotWaterNowDataDTO> monitorList(String buildingId) {
// 查询nowData表中数据
return Collections.emptyList();
}
@Override
public List<HotWaterControlDTO> operateList(String floorId) {
List<HotWaterControlListVO> hotWaterControlListVOS = collectionParamsManageMapper.selectHotWaterByBuildingId(floorId);
if (hotWaterControlListVOS.isEmpty()) {
return Collections.emptyList();
}
return hotWaterControlListVOS.stream()
.collect(Collectors.groupingBy(HotWaterControlListVO::getDeviceType))
.entrySet().stream()
.map(this::convertToHotWaterControlDTO)
.sorted(Comparator.comparingInt(HotWaterControlDTO::getOrderNum))
.collect(Collectors.toList());
}
private HotWaterControlDTO convertToHotWaterControlDTO(Map.Entry<String, List<HotWaterControlListVO>> houseEntry) {
HotWaterControlDTO dto = new HotWaterControlDTO();
dto.setId(houseEntry.getKey());
dto.setName(houseEntry.getValue().get(0).getDeviceType());
dto.setOrderNum(houseEntry.getValue().get(0).getCtOrderNum());
// 不需要强制转换,直接使用Object类型
List<Object> children = houseEntry.getValue().stream()
.collect(Collectors.groupingBy(HotWaterControlListVO::getDeviceId))
.entrySet().stream()
.map(dlEntry -> createDeviceVO(dlEntry, dto))
.sorted((obj1, obj2) -> {
// 根据实际对象类型获取orderNum进行排序
int order1 = getOrderNumFromObject(obj1);
int order2 = getOrderNumFromObject(obj2);
return Integer.compare(order1, order2);
})
.collect(Collectors.toList());
dto.setChildren(children);
return dto;
}
// 辅助方法:从不同的VO对象中获取orderNum
private int getOrderNumFromObject(Object obj) {
try {
if (obj != null) {
// 使用反射获取orderNum字段
java.lang.reflect.Method getOrderNumMethod = obj.getClass().getMethod("getOrderNum");
return (int) getOrderNumMethod.invoke(obj);
}
} catch (Exception e) {
// 如果发生异常,默认返回0
}
return 0;
}
private Object createDeviceVO(Map.Entry<String, List<HotWaterControlListVO>> dlEntry, HotWaterControlDTO parentDto) {
List<HotWaterControlListVO> dlItems = dlEntry.getValue();
String deviceTypeName = parentDto.getName();
switch (deviceTypeName) {
case "系统":
return createSystemControlVO(dlEntry, dlItems, parentDto);
case "热泵":
return createHotPumpControlVO(dlEntry, dlItems, parentDto);
case "循环泵":
return createCircuitPumpControlVO(dlEntry, dlItems, parentDto);
case "回水泵":
return createBackPumpControlVO(dlEntry, dlItems, parentDto);
case "设备校准":
return createDeviceCalibrationControlVO(dlEntry, dlItems, parentDto);
case "电表":
case "水表":
return createDeviceControlVO(dlEntry, dlItems, parentDto);
default:
return null;
}
}
private HotWaterSystemControlVO createSystemControlVO(
Map.Entry<String, List<HotWaterControlListVO>> dlEntry,
List<HotWaterControlListVO> dlItems,
HotWaterControlDTO parentDto) {
HotWaterSystemControlVO vo = new HotWaterSystemControlVO();
setupBasicDeviceInfo(vo, dlEntry, dlItems, parentDto);
dlItems.forEach(item -> {
switch (item.getParamTypeId()) {
case "1":
// 时间写入控制
vo.setTimeSet(item.getCurValue().intValue());
vo.setTimeSetId(item.getCpmId());
break;
case "5":
// 压力
vo.setPressure(item.getCurValue());
vo.setPressureId(item.getCpmId());
break;
case "6":
case "12":
// 回水温度
vo.setInTemp(item.getCurValue());
vo.setInTempId(item.getCpmId());
break;
case "10":
// 水箱温度
vo.setTankTemp(item.getCurValue());
vo.setTankTempId(item.getCpmId());
break;
case "20":
// 太阳能温度
vo.setSolarTemp(item.getCurValue());
vo.setSolarTempId(item.getCpmId());
break;
case "15":
// 时间
handleSystemTimeParameters(vo, item);
break;
case "28":
// modbus 重置复位
vo.setReset(item.getCurValue().intValue());
vo.setResetId(item.getCpmId());
break;
default:
break;
}
});
// 开始组装时间,写入plcTime
vo.setPlcTime(getPlcTime(vo));
return vo;
}
private String getPlcTime(HotWaterSystemControlVO vo) {
return String.format("%04d-%02d-%02d %02d:%02d:%02d",
vo.getYearTimeRead(), vo.getMonthTimeRead(), vo.getDayTimeRead(),
vo.getHourTimeRead(), vo.getMinTimeRead(), vo.getScTimeRead());
}
private void handleSystemTimeParameters(HotWaterSystemControlVO vo, HotWaterControlListVO item) {
String otherName = item.getOtherName();
int value = item.getCurValue().intValue();
String cpmId = item.getCpmId();
switch (otherName) {
case "年_读":
vo.setYearTimeRead(Integer.parseInt("20" + value));
vo.setYearTimeReadId(cpmId);
break;
case "月_读":
vo.setMonthTimeRead(value);
vo.setMonthTimeReadId(cpmId);
break;
case "日_读":
vo.setDayTimeRead(value);
vo.setDayTimeReadId(cpmId);
break;
case "时_读":
vo.setHourTimeRead(value);
vo.setHourTimeReadId(cpmId);
break;
case "分_读":
vo.setMinTimeRead(value);
vo.setMinTimeReadId(cpmId);
break;
case "秒_读":
vo.setScTimeRead(value);
vo.setScTimeReadId(cpmId);
break;
case "秒_写":
vo.setScTimeSet(value);
vo.setScTimeSetId(cpmId);
break;
case "年_写":
vo.setYearTimeSet(Integer.parseInt("20" + value));
vo.setYearTimeSetId(cpmId);
break;
case "月_写":
vo.setMonthTimeSet(value);
vo.setMonthTimeSetId(cpmId);
break;
case "日_写":
vo.setDayTimeSet(value);
vo.setDayTimeSetId(cpmId);
break;
case "时_写":
vo.setHourTimeSet(value);
vo.setHourTimeSetId(cpmId);
break;
case "分_写":
vo.setMinTimeSet(value);
vo.setMinTimeSetId(cpmId);
break;
default:
break;
}
}
private HotWaterHotPumpControlVO createHotPumpControlVO(
Map.Entry<String, List<HotWaterControlListVO>> dlEntry,
List<HotWaterControlListVO> dlItems,
HotWaterControlDTO parentDto) {
HotWaterHotPumpControlVO hotPumpVo = new HotWaterHotPumpControlVO();
setupBasicDeviceInfo(hotPumpVo, dlEntry, dlItems, parentDto);
// 判断故障状态
if (dlItems.stream().anyMatch(item ->
"3".equals(item.getParamTypeId()) && "1".equals(item.getCurValue().toString()))) {
hotPumpVo.setFault(1);
}
dlItems.forEach(item -> {
switch (item.getParamTypeId()) {
case "4":
// 时控
handleHotPumpTimeParameters(hotPumpVo, item);
break;
case "1":
// 启停控制
if (item.getOtherName().contains("12") || item.getOtherName().contains("13")) {
hotPumpVo.setStartStopControlOne(item.getCurValue().intValue());
hotPumpVo.setStartStopControlOneId(item.getCpmId());
} else if (item.getOtherName().contains("34") || item.getOtherName().contains("24")) {
hotPumpVo.setStartStopControlTwo(item.getCurValue().intValue());
hotPumpVo.setStartStopControlTwoId(item.getCpmId());
} else {
hotPumpVo.setStartStopControl(item.getCurValue().intValue());
hotPumpVo.setStartStopControlId(item.getCpmId());
}
break;
case "2":
// 运行状态
hotPumpVo.setRunState(item.getCurValue().intValue());
hotPumpVo.setRunStateId(item.getCpmId());
break;
case "10":
// 水箱温度
hotPumpVo.setTankTemp(item.getCurValue());
hotPumpVo.setTankTempId(item.getCpmId());
break;
case "11":
// 出水温度
hotPumpVo.setOutWaterTemp(item.getCurValue());
hotPumpVo.setOutWaterTempId(item.getCpmId());
break;
case "12":
/// 回水温度
hotPumpVo.setInWaterTemp(item.getCurValue());
hotPumpVo.setInWaterTempId(item.getCpmId());
break;
case "16":
// 累积运行时间
hotPumpVo.setRunTime(item.getCurValue());
hotPumpVo.setRunTimeId(item.getCpmId());
break;
case "17":
// 开
hotPumpVo.setStart(item.getCurValue().toString());
hotPumpVo.setStartId(item.getCpmId());
break;
case "18":
// 关
hotPumpVo.setStop(item.getCurValue().toString());
hotPumpVo.setStopId(item.getCpmId());
break;
case "7":
// 温度设定
hotPumpVo.setSetTemp(item.getCurValue());
hotPumpVo.setSetTempId(item.getCpmId());
break;
case "22":
// 手自动切换
if (item.getOtherName().contains("12") || item.getOtherName().contains("13")) {
hotPumpVo.setManualAutoSwitchOne(item.getCurValue().intValue());
hotPumpVo.setManualAutoSwitchOneId(item.getCpmId());
} else if (item.getOtherName().contains("34") || item.getOtherName().contains("24")) {
hotPumpVo.setManualAutoSwitchTwo(item.getCurValue().intValue());
hotPumpVo.setManualAutoSwitchTwoId(item.getCpmId());
} else {
hotPumpVo.setManualAutoSwitch(item.getCurValue().intValue());
hotPumpVo.setManualAutoSwitchId(item.getCpmId());
}
break;
case "28":
// 通讯失败复位
hotPumpVo.setReset(item.getCurValue().intValue());
hotPumpVo.setResetId(item.getCpmId());
break;
case "29":
// 通讯失败
hotPumpVo.setCommunicationFailure(item.getCurValue().intValue());
hotPumpVo.setCommunicationFailureId(item.getCpmId());
break;
case "30":
// 通讯失败次数
hotPumpVo.setCommunicationFailureCount(item.getCurValue().intValue());
hotPumpVo.setCommunicationFailureCountId(item.getCpmId());
break;
default:
break;
}
});
// 开始拼接时间,写入oneHourMinTimeOpenSetOneStr等时间参数
if (hotPumpVo.getOneHourTimeOpenSetOneId() != null && hotPumpVo.getOneMinTimeCloseSetOneId() != null) {
hotPumpVo.setOneHourMinTimeOpenSetOneStr(String.format("%02d:%02d", hotPumpVo.getOneHourTimeOpenSetOne(), hotPumpVo.getOneMinTimeOpenSetOne()));
hotPumpVo.setOneHourMinTimeCloseSetOneStr(String.format("%02d:%02d", hotPumpVo.getOneHourTimeCloseSetOne(), hotPumpVo.getOneMinTimeCloseSetOne()));
}
if (hotPumpVo.getTwoHourTimeOpenSetOneId() != null && hotPumpVo.getTwoMinTimeCloseSetOneId() != null) {
hotPumpVo.setTwoHourMinTimeOpenSetOneStr(String.format("%02d:%02d", hotPumpVo.getTwoHourTimeOpenSetOne(), hotPumpVo.getTwoMinTimeOpenSetOne()));
hotPumpVo.setTwoHourMinTimeCloseSetOneStr(String.format("%02d:%02d", hotPumpVo.getTwoHourTimeCloseSetOne(), hotPumpVo.getTwoMinTimeCloseSetOne()));
}
if (hotPumpVo.getOneHourTimeOpenSetTwoId() != null && hotPumpVo.getOneMinTimeCloseSetTwoId() != null) {
hotPumpVo.setOneHourMinTimeOpenSetTwoStr(String.format("%02d:%02d", hotPumpVo.getOneHourTimeOpenSetTwo(), hotPumpVo.getOneMinTimeOpenSetTwo()));
hotPumpVo.setOneHourMinTimeCloseSetTwoStr(String.format("%02d:%02d", hotPumpVo.getOneHourTimeCloseSetTwo(), hotPumpVo.getOneMinTimeCloseSetTwo()));
}
if (hotPumpVo.getTwoHourTimeOpenSetTwoId() != null && hotPumpVo.getTwoMinTimeCloseSetTwoId() != null) {
hotPumpVo.setTwoHourMinTimeOpenSetTwoStr(String.format("%02d:%02d", hotPumpVo.getTwoHourTimeOpenSetTwo(), hotPumpVo.getTwoMinTimeOpenSetTwo()));
hotPumpVo.setTwoHourMinTimeCloseSetTwoStr(String.format("%02d:%02d", hotPumpVo.getTwoHourTimeCloseSetTwo(), hotPumpVo.getTwoMinTimeCloseSetTwo()));
}
if (hotPumpVo.getOneHourTimeOpenSetThreeId() != null && hotPumpVo.getOneMinTimeCloseSetThreeId() != null) {
hotPumpVo.setOneHourMinTimeOpenSetThreeStr(String.format("%02d:%02d", hotPumpVo.getOneHourTimeOpenSetThree(), hotPumpVo.getOneMinTimeOpenSetThree()));
hotPumpVo.setOneHourMinTimeCloseSetThreeStr(String.format("%02d:%02d", hotPumpVo.getOneHourTimeCloseSetThree(), hotPumpVo.getOneMinTimeCloseSetThree()));
}
if (hotPumpVo.getTwoHourTimeOpenSetThreeId() != null && hotPumpVo.getTwoMinTimeCloseSetThreeId() != null) {
hotPumpVo.setTwoHourMinTimeOpenSetThreeStr(String.format("%02d:%02d", hotPumpVo.getTwoHourTimeOpenSetThree(), hotPumpVo.getTwoMinTimeOpenSetThree()));
hotPumpVo.setTwoHourMinTimeCloseSetThreeStr(String.format("%02d:%02d", hotPumpVo.getTwoHourTimeCloseSetThree(), hotPumpVo.getTwoMinTimeCloseSetThree()));
}
return hotPumpVo;
}
private void handleHotPumpTimeParameters(HotWaterHotPumpControlVO hotPumpVo, HotWaterControlListVO item) {
String otherName = item.getOtherName();
int value = item.getCurValue().intValue();
String cpmId = item.getCpmId();
// 12定时组
if (otherName.contains("12定时_时开1")) {
hotPumpVo.setOneHourTimeOpenSetOne(value);
hotPumpVo.setOneHourTimeOpenSetOneId(cpmId);
} else if (otherName.contains("12定时_时关1")) {
hotPumpVo.setOneHourTimeCloseSetOne(value);
hotPumpVo.setOneHourTimeCloseSetOneId(cpmId);
} else if (otherName.contains("12定时_时开2")) {
hotPumpVo.setOneHourTimeOpenSetTwo(value);
hotPumpVo.setOneHourTimeOpenSetTwoId(cpmId);
} else if (otherName.contains("12定时_时关2")) {
hotPumpVo.setOneHourTimeCloseSetTwo(value);
hotPumpVo.setOneHourTimeCloseSetTwoId(cpmId);
} else if (otherName.contains("12定时_时开3")) {
hotPumpVo.setOneHourTimeOpenSetThree(value);
hotPumpVo.setOneHourTimeOpenSetThreeId(cpmId);
} else if (otherName.contains("12定时_时关3")) {
hotPumpVo.setOneHourTimeCloseSetThree(value);
hotPumpVo.setOneHourTimeCloseSetThreeId(cpmId);
} else if (otherName.contains("12定时_分开1")) {
hotPumpVo.setOneMinTimeOpenSetOne(value);
hotPumpVo.setOneMinTimeOpenSetOneId(cpmId);
} else if (otherName.contains("12定时_分关1")) {
hotPumpVo.setOneMinTimeCloseSetOne(value);
hotPumpVo.setOneMinTimeCloseSetOneId(cpmId);
} else if (otherName.contains("12定时_分开2")) {
hotPumpVo.setOneMinTimeOpenSetTwo(value);
hotPumpVo.setOneMinTimeOpenSetTwoId(cpmId);
} else if (otherName.contains("12定时_分关2")) {
hotPumpVo.setOneMinTimeCloseSetTwo(value);
hotPumpVo.setOneMinTimeCloseSetTwoId(cpmId);
} else if (otherName.contains("12定时_分开3")) {
hotPumpVo.setOneMinTimeOpenSetThree(value);
hotPumpVo.setOneMinTimeOpenSetThreeId(cpmId);
} else if (otherName.contains("12定时_分关3")) {
hotPumpVo.setOneMinTimeCloseSetThree(value);
hotPumpVo.setOneMinTimeCloseSetThreeId(cpmId);
}
// 34定时组
else if (otherName.contains("34定时_时开1")) {
hotPumpVo.setTwoHourTimeOpenSetOne(value);
hotPumpVo.setTwoHourTimeOpenSetOneId(cpmId);
} else if (otherName.contains("34定时_时关1")) {
hotPumpVo.setTwoHourTimeCloseSetOne(value);
hotPumpVo.setTwoHourTimeCloseSetOneId(cpmId);
} else if (otherName.contains("34定时_时开2")) {
hotPumpVo.setTwoHourTimeOpenSetTwo(value);
hotPumpVo.setTwoHourTimeOpenSetTwoId(cpmId);
} else if (otherName.contains("34定时_时关2")) {
hotPumpVo.setTwoHourTimeCloseSetTwo(value);
hotPumpVo.setTwoHourTimeCloseSetTwoId(cpmId);
} else if (otherName.contains("34定时_时开3")) {
hotPumpVo.setTwoHourTimeOpenSetThree(value);
hotPumpVo.setTwoHourTimeOpenSetThreeId(cpmId);
} else if (otherName.contains("34定时_时关3")) {
hotPumpVo.setTwoHourTimeCloseSetThree(value);
hotPumpVo.setTwoHourTimeCloseSetThreeId(cpmId);
} else if (otherName.contains("34定时_分开1")) {
hotPumpVo.setTwoMinTimeOpenSetOne(value);
hotPumpVo.setTwoMinTimeOpenSetOneId(cpmId);
} else if (otherName.contains("34定时_分关1")) {
hotPumpVo.setTwoMinTimeCloseSetOne(value);
hotPumpVo.setTwoMinTimeCloseSetOneId(cpmId);
} else if (otherName.contains("34定时_分开2")) {
hotPumpVo.setTwoMinTimeOpenSetTwo(value);
hotPumpVo.setTwoMinTimeOpenSetTwoId(cpmId);
} else if (otherName.contains("34定时_分关2")) {
hotPumpVo.setTwoMinTimeCloseSetTwo(value);
hotPumpVo.setTwoMinTimeCloseSetTwoId(cpmId);
} else if (otherName.contains("34定时_分开3")) {
hotPumpVo.setTwoMinTimeOpenSetThree(value);
hotPumpVo.setTwoMinTimeOpenSetThreeId(cpmId);
} else if (otherName.contains("34定时_分关3")) {
hotPumpVo.setTwoMinTimeCloseSetThree(value);
hotPumpVo.setTwoMinTimeCloseSetThreeId(cpmId);
}
}
private HotWaterCircuitPumpControlVO createCircuitPumpControlVO(
Map.Entry<String, List<HotWaterControlListVO>> dlEntry,
List<HotWaterControlListVO> dlItems,
HotWaterControlDTO parentDto) {
HotWaterCircuitPumpControlVO circuitPumpVo = new HotWaterCircuitPumpControlVO();
setupBasicDeviceInfo(circuitPumpVo, dlEntry, dlItems, parentDto);
dlItems.forEach(item -> {
switch (item.getParamTypeId()) {
case "1":
// 启停控制
circuitPumpVo.setStartStopControl(item.getCurValue().intValue());
circuitPumpVo.setStartStopControlId(item.getCpmId());
break;
case "2":
// 运行状态
circuitPumpVo.setRunState(item.getCurValue().intValue());
circuitPumpVo.setRunStateId(item.getCpmId());
break;
case "3":
// 故障状态
circuitPumpVo.setFault(item.getCurValue().intValue());
circuitPumpVo.setFaultId(item.getCpmId());
break;
case "4":
// 时控
handleCircuitPumpTimeParameters(circuitPumpVo, item);
break;
case "8":
// 温差
circuitPumpVo.setTempDiff(item.getCurValue());
circuitPumpVo.setTempDiffId(item.getCpmId());
break;
case "9":
// 温差设置
circuitPumpVo.setTempDiffSet(item.getCurValue());
circuitPumpVo.setTempDiffSetId(item.getCpmId());
break;
case "15":
// 开延时时间
circuitPumpVo.setOpenDelayTime(item.getCurValue().intValue());
circuitPumpVo.setOpenDelayTimeId(item.getCpmId());
break;
case "16":
// 累计运行时间
if (item.getOtherName().contains("小时")) {
circuitPumpVo.setRunTime(item.getCurValue());
circuitPumpVo.setRunTimeId(item.getCpmId());
}
break;
case "21":
// 一键启动
circuitPumpVo.setStartOneKey(item.getCurValue().intValue());
circuitPumpVo.setStartOneKeyId(item.getCpmId());
break;
case "22":
// 手动自动切换
circuitPumpVo.setManualAutoSwitch(item.getCurValue().intValue());
circuitPumpVo.setManualAutoSwitchId(item.getCpmId());
break;
default:
break;
}
});
if (circuitPumpVo.getOneHourTimeOpenSetOneId() != null
&& circuitPumpVo.getOneHourTimeCloseSetOneId() != null
&& circuitPumpVo.getOneMinTimeOpenSetOneId() != null
&& circuitPumpVo.getOneMinTimeCloseSetOneId() != null) {
// 设置时分开写入oneHourMinTimeOpenSetOneStr,oneHourMinTimeCloseSetOneStr
circuitPumpVo.setOneHourMinTimeOpenSetOneStr(String.format("%02d:%02d", circuitPumpVo.getOneHourTimeOpenSetOne(), circuitPumpVo.getOneMinTimeOpenSetOne()));
circuitPumpVo.setOneHourMinTimeCloseSetOneStr(String.format("%02d:%02d", circuitPumpVo.getOneHourTimeCloseSetOne(), circuitPumpVo.getOneMinTimeCloseSetOne()));
}
return circuitPumpVo;
}
private void handleCircuitPumpTimeParameters(HotWaterCircuitPumpControlVO circuitPumpVo, HotWaterControlListVO item) {
String otherName = item.getOtherName();
int value = item.getCurValue().intValue();
String cpmId = item.getCpmId();
if (otherName.contains("定时_时开1")) {
circuitPumpVo.setOneHourTimeOpenSetOne(value);
circuitPumpVo.setOneHourTimeOpenSetOneId(cpmId);
} else if (otherName.contains("定时_时关1")) {
circuitPumpVo.setOneHourTimeCloseSetOne(value);
circuitPumpVo.setOneHourTimeCloseSetOneId(cpmId);
} else if (otherName.contains("定时_分开1")) {
circuitPumpVo.setOneMinTimeOpenSetOne(value);
circuitPumpVo.setOneMinTimeOpenSetOneId(cpmId);
} else if (otherName.contains("定时_分关1")) {
circuitPumpVo.setOneMinTimeCloseSetOne(value);
circuitPumpVo.setOneMinTimeCloseSetOneId(cpmId);
}
}
private HotWaterBackPumpControlVO createBackPumpControlVO(
Map.Entry<String, List<HotWaterControlListVO>> dlEntry,
List<HotWaterControlListVO> dlItems,
HotWaterControlDTO parentDto) {
HotWaterBackPumpControlVO backPumpVo = new HotWaterBackPumpControlVO();
setupBasicDeviceInfo(backPumpVo, dlEntry, dlItems, parentDto);
dlItems.forEach(item -> {
switch (item.getParamTypeId()) {
case "1":
// 启停控制
backPumpVo.setStartStopControl(item.getCurValue().intValue());
backPumpVo.setStartStopControlId(item.getCpmId());
break;
case "2":
// 运行状态
backPumpVo.setRunState(item.getCurValue().intValue());
backPumpVo.setRunStateId(item.getCpmId());
break;
case "3":
// 故障状态
backPumpVo.setFault(item.getCurValue().intValue());
backPumpVo.setFaultId(item.getCpmId());
break;
case "4":
// 时控
handleBackPumpTimeParameters(backPumpVo, item);
break;
case "7":
// 温度设置
backPumpVo.setTempSet(item.getCurValue());
backPumpVo.setTempSetId(item.getCpmId());
break;
case "15":
// 时间
backPumpVo.setOpenDelayTime(item.getCurValue().intValue());
backPumpVo.setOpenDelayTimeId(item.getCpmId());
break;
case "16":
// 累积运行时间
if (item.getOtherName().contains("小时")) {
backPumpVo.setRunTime(item.getCurValue());
backPumpVo.setRunTimeId(item.getCpmId());
}
break;
case "21":
// 一键启动
backPumpVo.setStartOneKey(item.getCurValue().intValue());
backPumpVo.setStartOneKeyId(item.getCpmId());
break;
case "22":
// 手动自动切换
backPumpVo.setManualAutoSwitch(item.getCurValue().intValue());
backPumpVo.setManualAutoSwitchId(item.getCpmId());
break;
case "25":
// 两台回水泵启动
backPumpVo.setTwoPumpStart(item.getCurValue().intValue());
backPumpVo.setTwoPumpStartId(item.getCpmId());
break;
case "26":
// 温度上限
backPumpVo.setTempSetUpperLimit(item.getCurValue());
backPumpVo.setTempSetUpperLimitId(item.getCpmId());
break;
case "27":
// 温度下限
backPumpVo.setTempSetLowerLimit(item.getCurValue());
backPumpVo.setTempSetLowerLimitId(item.getCpmId());
break;
default:
break;
}
});
if (backPumpVo.getOneHourTimeOpenSetOneId() != null
&& backPumpVo.getOneHourTimeCloseSetOneId() != null
&& backPumpVo.getOneMinTimeOpenSetOneId() != null
&& backPumpVo.getOneMinTimeCloseSetOneId() != null) {
// 设置时分开写入oneHourMinTimeOpenSetOneStr,oneHourMinTimeCloseSetOneStr
backPumpVo.setOneHourMinTimeOpenSetOneStr(String.format("%02d:%02d", backPumpVo.getOneHourTimeOpenSetOne(), backPumpVo.getOneMinTimeOpenSetOne()));
backPumpVo.setOneHourMinTimeCloseSetOneStr(String.format("%02d:%02d", backPumpVo.getOneHourTimeCloseSetOne(), backPumpVo.getOneMinTimeCloseSetOne()));
}
if (backPumpVo.getOneHourTimeOpenSetTwoId() != null
&& backPumpVo.getOneHourTimeCloseSetTwoId() != null
&& backPumpVo.getOneMinTimeOpenSetTwoId() != null
&& backPumpVo.getOneMinTimeCloseSetTwoId() != null) {
// 获取时分开写入oneHourMinTimeOpenSetTwoStr,oneHourMinTimeCloseSetTwoStr
backPumpVo.setOneHourMinTimeOpenSetTwoStr(String.format("%02d:%02d", backPumpVo.getOneHourTimeOpenSetTwo(), backPumpVo.getOneMinTimeOpenSetTwo()));
backPumpVo.setOneHourMinTimeCloseSetTwoStr(String.format("%02d:%02d", backPumpVo.getOneHourTimeCloseSetTwo(), backPumpVo.getOneMinTimeCloseSetTwo()));
}
if (backPumpVo.getOneHourTimeOpenSetThreeId() != null
&& backPumpVo.getOneHourTimeCloseSetThreeId() != null
&& backPumpVo.getOneMinTimeOpenSetThreeId() != null
&& backPumpVo.getOneMinTimeCloseSetThreeId() != null) {
// 获取时分开写入oneHourMinTimeOpenSetThreeStr,oneHourMinTimeCloseSetThreeStr
backPumpVo.setOneHourMinTimeOpenSetThreeStr(String.format("%02d:%02d", backPumpVo.getOneHourTimeOpenSetThree(), backPumpVo.getOneMinTimeOpenSetThree()));
backPumpVo.setOneHourMinTimeCloseSetThreeStr(String.format("%02d:%02d", backPumpVo.getOneHourTimeCloseSetThree(), backPumpVo.getOneMinTimeCloseSetThree()));
}
return backPumpVo;
}
private void handleBackPumpTimeParameters(HotWaterBackPumpControlVO backPumpVo, HotWaterControlListVO item) {
String otherName = item.getOtherName();
int value = item.getCurValue().intValue();
String cpmId = item.getCpmId();
if (otherName.contains("定时_时开1")) {
backPumpVo.setOneHourTimeOpenSetOne(value);
backPumpVo.setOneHourTimeOpenSetOneId(cpmId);
} else if (otherName.contains("定时_时关1")) {
backPumpVo.setOneHourTimeCloseSetOne(value);
backPumpVo.setOneHourTimeCloseSetOneId(cpmId);
} else if (otherName.contains("定时_分开1")) {
backPumpVo.setOneMinTimeOpenSetOne(value);
backPumpVo.setOneMinTimeOpenSetOneId(cpmId);
} else if (otherName.contains("定时_分关1")) {
backPumpVo.setOneMinTimeCloseSetOne(value);
backPumpVo.setOneMinTimeCloseSetOneId(cpmId);
} else if (otherName.contains("定时_时开2")) {
backPumpVo.setOneHourTimeOpenSetTwo(value);
backPumpVo.setOneHourTimeOpenSetTwoId(cpmId);
} else if (otherName.contains("定时_时关2")) {
backPumpVo.setOneHourTimeCloseSetTwo(value);
backPumpVo.setOneHourTimeCloseSetTwoId(cpmId);
} else if (otherName.contains("定时_分开2")) {
backPumpVo.setOneMinTimeOpenSetTwo(value);
backPumpVo.setOneMinTimeOpenSetTwoId(cpmId);
} else if (otherName.contains("定时_分关2")) {
backPumpVo.setOneMinTimeCloseSetTwo(value);
backPumpVo.setOneMinTimeCloseSetTwoId(cpmId);
} else if (otherName.contains("定时_时开3")) {
backPumpVo.setOneHourTimeOpenSetThree(value);
backPumpVo.setOneHourTimeOpenSetThreeId(cpmId);
} else if (otherName.contains("定时_时关3")) {
backPumpVo.setOneHourTimeCloseSetThree(value);
backPumpVo.setOneHourTimeCloseSetThreeId(cpmId);
} else if (otherName.contains("定时_分开3")) {
backPumpVo.setOneMinTimeOpenSetThree(value);
backPumpVo.setOneMinTimeOpenSetThreeId(cpmId);
} else if (otherName.contains("定时_分关3")) {
backPumpVo.setOneMinTimeCloseSetThree(value);
backPumpVo.setOneMinTimeCloseSetThreeId(cpmId);
}
}
private HotWaterDeviceCalibrationControlVO createDeviceCalibrationControlVO(
Map.Entry<String, List<HotWaterControlListVO>> dlEntry,
List<HotWaterControlListVO> dlItems,
HotWaterControlDTO parentDto) {
HotWaterDeviceCalibrationControlVO deviceCalibrationVo = new HotWaterDeviceCalibrationControlVO();
setupBasicDeviceInfo(deviceCalibrationVo, dlEntry, dlItems, parentDto);
dlItems.forEach(item -> {
switch (item.getParamTypeId()) {
case "0":
// 上下限
handleCalibrationParameters(deviceCalibrationVo, item);
break;
case "19":
// 校准值
deviceCalibrationVo.setCalibrationValue(item.getCurValue());
deviceCalibrationVo.setCalibrationValueId(item.getCpmId());
break;
default:
break;
}
});
return deviceCalibrationVo;
}
private void handleCalibrationParameters(HotWaterDeviceCalibrationControlVO deviceCalibrationVo, HotWaterControlListVO item) {
String otherName = item.getOtherName();
BigDecimal value = item.getCurValue();
String cpmId = item.getCpmId();
if (otherName.contains("工程量上限")) {
deviceCalibrationVo.setEngineeringMaxValue(value);
deviceCalibrationVo.setEngineeringMaxValueId(cpmId);
} else if (otherName.contains("工程量下限")) {
deviceCalibrationVo.setEngineeringMinValue(value);
deviceCalibrationVo.setEngineeringMinValueId(cpmId);
} else if (otherName.contains("数字量上限")) {
deviceCalibrationVo.setDigitalMaxValue(value);
deviceCalibrationVo.setDigitalMaxValueId(cpmId);
} else if (otherName.contains("数字量下限")) {
deviceCalibrationVo.setDigitalMinValue(value);
deviceCalibrationVo.setDigitalMinValueId(cpmId);
}
}
private HotWaterDeviceControlVO createDeviceControlVO(
Map.Entry<String, List<HotWaterControlListVO>> dlEntry,
List<HotWaterControlListVO> dlItems,
HotWaterControlDTO parentDto) {
HotWaterDeviceControlVO meterVo = new HotWaterDeviceControlVO();
setupBasicDeviceInfo(meterVo, dlEntry, dlItems, parentDto);
dlItems.forEach(item -> {
switch (item.getParamTypeId()) {
case "13":
case "14":
// 水电表读数
// 获取保留小数位
// 获取保留小数位
int digits = item.getDigits();
// 10的n次方
BigDecimal power = BigDecimal.ONE.scaleByPowerOfTen(digits);
BigDecimal originalValue = item.getCurValue();
// 将数值按指定小数位数格式化
BigDecimal formattedValue = originalValue.divide(power, 2, RoundingMode.HALF_UP);
item.setCurValue(formattedValue);
meterVo.setTotalReading(item.getCurValue());
meterVo.setTotalReadingId(item.getCpmId());
meterVo.setCurrentTime(item.getCurTime());
meterVo.setCurrentTimeId(item.getCpmId());
break;
case "29":
// 水电表通讯故障
meterVo.setCommunicationFailure(item.getCurValue().intValue());
meterVo.setCommunicationFailureId(item.getCpmId());
break;
case "30":
// 水电表通讯故障计数
meterVo.setCommunicationFailureCount(item.getCurValue().intValue());
meterVo.setCommunicationFailureCountId(item.getCpmId());
break;
case "28":
// 水电表通信故障复位
meterVo.setReset(item.getCurValue().intValue());
meterVo.setResetId(item.getCpmId());
break;
default:
break;
}
});
return meterVo;
}
private void setupBasicDeviceInfo(Object vo, Map.Entry<String, List<HotWaterControlListVO>> dlEntry,
List<HotWaterControlListVO> dlItems, HotWaterControlDTO parentDto) {
// 使用反射设置基本属性
try {
vo.getClass().getMethod("setId", String.class).invoke(vo, dlEntry.getKey());
vo.getClass().getMethod("setOrderNum", int.class).invoke(vo, dlItems.get(0).getDlOrderNum());
String deviceName = StringUtils.isBlank(dlItems.get(0).getDeviceName()) ?
parentDto.getName() : dlItems.get(0).getDeviceName();
vo.getClass().getMethod("setName", String.class).invoke(vo, deviceName);
} catch (Exception e) {
// 忽略反射异常
}
}
@Override
public CollectionParamsManageEntity selectDeviceInstallByOtherName(String name, String buildingId) {
return collectionParamsManageMapper.selectDeviceInstallByOtherName(name, buildingId);
}
@Override
public void updateCPMByOtherName(String name, BigDecimal value, String time, String buildingId) {
try {
collectionParamsManageMapper.updateCPMByOtherName(name, value, time, "0", buildingId);
} catch (Exception e) {
collectionParamsManageMapper.updateCPMByOtherName(name, new BigDecimal(0), time, "-1", buildingId);
}
}
@Override
public void getBatchUpdateCollectionParams(List<SanShiFengDatas> batch, String sn, String plcName, String projectName, String time, String buildingId) {
try {
collectionParamsManageMapper.updateBatchCPMByOtherName(batch, time, "0", buildingId);
} catch (Exception e) {
log.error("批量更新参数失败", e);
}
}
@Override
public List<CollectionParamsManageEntity> selectCPMList(String buildingId, String deviceInstallId, String otherName, Integer pageNum, Integer pageSize) {
return collectionParamsManageMapper.selectCPMList(buildingId, deviceInstallId, otherName, pageNum, pageSize);
}
@Override
public int selectCPMListCount(String buildingId, String deviceInstallId, String otherName, Integer pageNum, Integer pageSize) {
return collectionParamsManageMapper.selectCPMListCount(buildingId, deviceInstallId, otherName, pageNum, pageSize);
}
@Override
public CollectionParamsManageEntity selectById(String msId) {
return collectionParamsManageMapper.selectByPrimaryKey(msId);
}
@Override
public String insertCPM(CollectionParamsManageEntity cpmEntity) {
// 判断是否存在otherName
if (collectionParamsManageMapper.selectCountByOtherName(cpmEntity.getOtherName()) > 0) {
return "存在相同参数名称";
}
if (null == cpmEntity.getCurTime()) {
cpmEntity.setCurTime(new Date());
}
collectionParamsManageMapper.insertCPM(cpmEntity);
return Constant.SUCCESS;
}
@Override
public String updateCPM(CollectionParamsManageEntity cpmEntity) {
// 判断是否存在otherName
// if (collectionParamsManageMapper.selectCountByOtherName(cpmEntity.getOtherName()) > 0) {
// return "存在相同参数名称";
// }
collectionParamsManageMapper.updateById(cpmEntity);
return Constant.SUCCESS;
}
@Override
public int deleteByIds(String[] msIds) {
if (msIds != null && msIds.length > 0) {
for (String msId : msIds) {
collectionParamsManageMapper.deleteById(msId);
}
return msIds.length;
}
return 0;
}
@Override
public List<CollectionParamsManageEntity> selectAllCPMList() {
return collectionParamsManageMapper.selectAllCPMList();
}
}

342
user-service/src/main/java/com/mh/user/service/impl/DataResultServiceImpl.java

@ -7,31 +7,18 @@ import com.mh.user.mapper.DeviceInstallMapper;
import com.mh.user.service.DataResultService; import com.mh.user.service.DataResultService;
import com.mh.user.service.DeviceInstallService; import com.mh.user.service.DeviceInstallService;
import com.mh.user.utils.ExchangeStringUtil; import com.mh.user.utils.ExchangeStringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.time.LocalDateTime; import java.text.ParseException;
import java.time.ZoneId; import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import static java.util.Calendar.*;
@Service @Service
public class DataResultServiceImpl implements DataResultService { public class DataResultServiceImpl implements DataResultService {
private static final Logger logger = LoggerFactory.getLogger(DataResultServiceImpl.class);
private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("0.000");
// 使用线程安全的DateTimeFormatter替代SimpleDateFormat
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Autowired @Autowired
DataResultMapper dataResultMapper; DataResultMapper dataResultMapper;
@ -41,264 +28,117 @@ public class DataResultServiceImpl implements DataResultService {
@Autowired @Autowired
DeviceInstallService deviceInstallService; DeviceInstallService deviceInstallService;
private static final double ELEC_MAX_INCREMENT = 2000;
private static final double OTHER_MAX_INCREMENT = 300;
private static final double ELEC_DAY_VALUE = 1000;
private static final double OTHER_DAY_VALUE = 100;
@Override @Override
public void saveDataResult(DataResultEntity dataResultEntity) { public void saveDataResult(DataResultEntity dataResultEntity) {
if (dataResultEntity == null) { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
logger.warn("saveDataResult: dataResultEntity is null"); double lastValue=0;
double calcValue=0;
double initValue=0;
double curValue=0;
double dayValue=0;
double newCurValue = 0;
int days=0;
try{
Date date=new Date(); //获取系统日期
if (dataResultEntity.getCurDate()==null){
dataResultEntity.setCurDate(date);
}
//从安装表获取设备信息
DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType(),dataResultEntity.getBuildingId());
double ratio=deviceInstallEntity.getRatio(); //倍率
initValue=deviceInstallEntity.getInitValue();
dayValue=deviceInstallEntity.getDayValue();
newCurValue = deviceInstallEntity.getLastValue();
if(dataResultEntity.getDeviceType().equals("电表")){
if (dataResultEntity.getCurValue() - newCurValue > 2000) {
return; return;
} }
dayValue=1000;
try { }else{
Date currentDate = new Date(); if (dataResultEntity.getCurValue() - newCurValue > 300) {
if (dataResultEntity.getCurDate() == null) {
dataResultEntity.setCurDate(currentDate);
}
// 格式化时间,按五分钟保存一次
Date formattedDate = formatToFiveMinuteInterval(dataResultEntity.getCurDate());
dataResultEntity.setCurDate(formattedDate);
// 从安装表获取设备信息
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(
dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId());
if (deviceInstallEntity == null) {
logger.warn("saveDataResult: deviceInstallEntity is null for addr={}, type={}, building={}",
dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId());
return; return;
} }
dayValue=100;
double ratio = deviceInstallEntity.getRatio(); }
double initValue = deviceInstallEntity.getInitValue(); //判断是否有记录
double dayValue = deviceInstallEntity.getDayValue(); int r = dataResultMapper.selectDataResultCount(sdf1.format(dataResultEntity.getCurDate()),
double lastValueFromInstall = deviceInstallEntity.getLastValue(); dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType());
if (r==0){//插入记录
// 判断设备类型并设置阈值 DataResultEntity data=new DataResultEntity();
boolean isElectricMeter = "电表".equals(dataResultEntity.getDeviceType()); data.setDeviceAddr(dataResultEntity.getDeviceAddr()); //通讯地址
double maxIncrement = isElectricMeter ? ELEC_MAX_INCREMENT : OTHER_MAX_INCREMENT; data.setDeviceType(dataResultEntity.getDeviceType()); //设备类型
dayValue = isElectricMeter ? ELEC_DAY_VALUE : OTHER_DAY_VALUE; String curDate=sdf1.format(dataResultEntity.getCurDate());
data.setCurDate(sdf1.parse(curDate)); //当前日期
// 检查增量是否异常 data.setCurValue(dataResultEntity.getCurValue()); //当前读数
if (dataResultEntity.getCurValue() - lastValueFromInstall > maxIncrement) { curValue=dataResultEntity.getCurValue();
logger.info("saveDataResult: increment too large, skip. curValue={}, lastValue={}, deviceAddr={}", data.setBuildingId(deviceInstallEntity.getBuildingId()); //楼栋编号
dataResultEntity.getCurValue(), lastValueFromInstall, dataResultEntity.getDeviceAddr()); data.setRatio(ratio); //倍率
return; lastValue=deviceInstallEntity.getLastValue(); //上次读数
} calcValue=(dataResultEntity.getCurValue()-lastValue)*ratio; //计算用量
DecimalFormat df = new DecimalFormat("0.000");
String curDateStr = formatDateToString(formattedDate); calcValue=Double.parseDouble(df.format(calcValue));
int recordCount = dataResultMapper.selectDataResultCount(
curDateStr, data.setCalcValue(calcValue); //用量
dataResultEntity.getDeviceAddr(), if (deviceInstallEntity.getLastDate()!=null){ //上次抄表日期
dataResultEntity.getDeviceType(), String lastDate=sdf1.format(deviceInstallEntity.getLastDate());
dataResultEntity.getBuildingId()); data.setLastDate(sdf1.parse(lastDate));
}else{
double calcValue; String lastDate=sdf1.format(date);
boolean shouldSave = false; data.setLastDate(sdf1.parse(lastDate));
if (recordCount == 0) {
// 插入新记录
DataResultEntity newData = createNewDataResult(dataResultEntity, deviceInstallEntity, formattedDate, ratio);
calcValue = newData.getCalcValue();
// 计算相差天数
Date lastDate = newData.getLastDate();
if (deviceInstallEntity.getLastDate() == null) {
lastDate = currentDate;
}
int days = (int) ExchangeStringUtil.daysBetween(formattedDate, lastDate);
shouldSave = validateAndSaveData(newData, calcValue, dayValue, days, true);
// if (shouldSave) {
// lastValue = newData.getLastValue();
// }
} else {
// 修改现有记录
DataResultEntity existingData = dataResultMapper.selectDataResult(
curDateStr,
dataResultEntity.getDeviceAddr(),
dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId());
if (existingData != null) {
double lastValue = existingData.getLastValue();
calcValue = (dataResultEntity.getCurValue() - lastValue) * ratio;
calcValue = formatDouble(calcValue);
existingData.setCurDate(formattedDate);
existingData.setCurValue(dataResultEntity.getCurValue());
existingData.setCalcValue(calcValue);
Date lastDate = existingData.getLastDate();
int days = (int) ExchangeStringUtil.daysBetween(formattedDate, lastDate);
shouldSave = validateAndSaveData(existingData, calcValue, dayValue, days, false);
}
}
// 更新安装表中的lastValue和lastDate
if (shouldSave) {
deviceInstallMapper.updateLastValue(
deviceInstallEntity.getId(),
String.valueOf(dataResultEntity.getCurValue()),
currentDate);
} }
data.setLastValue(lastValue);
// 第一次采集时初始化initValue //判断读数,并保存数据
if (initValue == 0) { days=(int)ExchangeStringUtil.daysBetween(dataResultEntity.getCurDate(),deviceInstallEntity.getLastDate()); //计算相差天数
deviceInstallMapper.updateLastValue( if (calcValue>=0 && calcValue<=dayValue){
deviceInstallEntity.getId(), dataResultMapper.saveDataResult(data); //插入新的记录
String.valueOf(dataResultEntity.getCurValue()), }else if(calcValue>dayValue){
currentDate); if(days>0){
deviceInstallMapper.updateInitValue( if(calcValue/days<=dayValue){
dataResultEntity.getDeviceAddr(), dataResultMapper.saveDataResult(data);
dataResultEntity.getDeviceType(),
dataResultEntity.getBuildingId(),
String.valueOf(dataResultEntity.getCurValue()),
deviceInstallEntity.getId());
} }
} catch (Exception e) {
logger.error("saveDataResult error for deviceAddr={}, deviceType={}",
dataResultEntity.getDeviceAddr(), dataResultEntity.getDeviceType(), e);
} }
} }
/** }else {//修改记录的curValue、calcValue
* 创建新的数据结果实体 DataResultEntity data2=dataResultMapper.selectDataResult(sdf1.format(dataResultEntity.getCurDate()),dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType());
*/ lastValue=data2.getLastValue(); //安装基表上次读数
private DataResultEntity createNewDataResult(DataResultEntity dataResultEntity, calcValue=dataResultEntity.getCurValue()-lastValue; //计算用量
DeviceInstallEntity deviceInstallEntity, String curDate=sdf1.format(dataResultEntity.getCurDate());
Date curDate, data2.setCurDate(sdf1.parse(curDate));//当前日期
double ratio) throws Exception { data2.setCurValue(dataResultEntity.getCurValue());//当前读数
DataResultEntity data = new DataResultEntity(); data2.setCalcValue(calcValue);//用量
data.setDeviceAddr(dataResultEntity.getDeviceAddr());
data.setDeviceType(dataResultEntity.getDeviceType());
data.setCurDate(curDate);
data.setCurValue(dataResultEntity.getCurValue());
data.setBuildingId(deviceInstallEntity.getBuildingId());
data.setRatio(ratio);
// 获取上一个抄表记录
Calendar calendar = Calendar.getInstance();
calendar.setTime(curDate);
calendar.add(MINUTE, -5);
String lastDateStr = formatDateToString(calendar.getTime());
DataResultEntity lastData = dataResultMapper.selectDataResult( //判断读数,并保存数据
lastDateStr, days=(int)ExchangeStringUtil.daysBetween(dataResultEntity.getCurDate(),data2.getLastDate()); //计算相差天数
dataResultEntity.getDeviceAddr(), if (calcValue>=0 && calcValue<=dayValue){
dataResultEntity.getDeviceType(), dataResultMapper.updateDataResult(data2); //更新记录
dataResultEntity.getBuildingId()); }else if(calcValue>dayValue){
if(days>0){
double lastValue; if(calcValue/days<=dayValue){
if (lastData != null) { dataResultMapper.saveDataResult(data2);
data.setLastDate(lastData.getCurDate());
data.setLastValue(lastData.getCurValue());
lastValue = lastData.getCurValue();
} else {
lastValue = deviceInstallEntity.getLastValue();
Date lastDate = deviceInstallEntity.getLastDate();
if (lastDate == null) {
lastDate = new Date();
} }
data.setLastDate(lastDate);
data.setLastValue(lastValue);
} }
double calcValue = (dataResultEntity.getCurValue() - lastValue) * ratio;
calcValue = formatDouble(calcValue);
data.setCalcValue(calcValue);
return data;
} }
/**
* 验证数据并保存
* @return 是否保存成功
*/
private boolean validateAndSaveData(DataResultEntity dataResultEntity,
double calcValue,
double dayValue,
int days,
boolean isNew) {
if (calcValue < 0) {
logger.warn("calcValue is negative: {}", calcValue);
return false;
} }
if (calcValue <= dayValue) { //修改安装表中lastValue,lastDate,ini_value的值
if (isNew) { if (calcValue>=0 && calcValue<=dayValue){
dataResultMapper.saveDataResult(dataResultEntity); deviceInstallMapper.updateLastValue(deviceInstallEntity.getId(),String.valueOf(dataResultEntity.getCurValue()),date);
} else { }else if(calcValue>dayValue){
dataResultMapper.updateDataResult(dataResultEntity); if(days>0){
if(calcValue/days<=dayValue){
deviceInstallMapper.updateLastValue(deviceInstallEntity.getId(),String.valueOf(dataResultEntity.getCurValue()),date);
} }
return true;
} else if (days > 0 && calcValue / days <= dayValue) {
dataResultMapper.saveDataResult(dataResultEntity);
return true;
} }
logger.warn("calcValue exceeds dayValue: calcValue={}, dayValue={}, days={}", calcValue, dayValue, days);
return false;
}
/**
* 格式化日期为字符串
*/
private String formatDateToString(Date date) {
if (date == null) {
return null;
}
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
return localDateTime.format(DATE_TIME_FORMATTER);
}
/**
* 格式化双精度数值
*/
private double formatDouble(double value) {
try {
return Double.parseDouble(DECIMAL_FORMAT.format(value));
} catch (NumberFormatException e) {
logger.error("Failed to format double value: {}", value, e);
return value;
} }
if(initValue==0){//第一次采集的时候
deviceInstallMapper.updateLastValue(deviceInstallEntity.getId(),String.valueOf(dataResultEntity.getCurValue()),date);
deviceInstallMapper.updateInitValue(dataResultEntity.getDeviceAddr(),dataResultEntity.getDeviceType(),dataResultEntity.getBuildingId(),String.valueOf(curValue));
} }
}catch (Exception e){
/** //e.printStackTrace();
* 将时间格式化为五分钟间隔
* 例如09:01:02 -> 09:05:00, 09:06:30 -> 09:10:00
* @param originalDate 原始时间
* @return 格式化后的时间
*/
private Date formatToFiveMinuteInterval(Date originalDate) {
if (originalDate == null) {
return new Date();
} }
Calendar calendar = Calendar.getInstance();
calendar.setTime(originalDate);
int minutes = calendar.get(MINUTE);
// 向下取整到最近的五分钟节点
int roundedMinutes = (minutes / 5) * 5;
calendar.set(MINUTE, roundedMinutes);
calendar.set(SECOND, 0);
calendar.set(MILLISECOND, 0);
return calendar.getTime();
} }
@Override @Override
@ -307,7 +147,7 @@ public class DataResultServiceImpl implements DataResultService {
} }
@Override @Override
public List<DataResultEntity> queryDataResult(String buildingId, String startDate, String endDate, String deviceType, int page, int limit) { public List<DataResultEntity> queryDataResult(String buildingId, String startDate, String endDate,String deviceType, int page, int limit) {
return dataResultMapper.queryDataResult(buildingId,startDate,endDate,deviceType,page,limit); return dataResultMapper.queryDataResult(buildingId,startDate,endDate,deviceType,page,limit);
} }

118
user-service/src/main/java/com/mh/user/service/impl/DeviceControlServiceImpl.java

@ -1,23 +1,22 @@
package com.mh.user.service.impl; package com.mh.user.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.mh.common.http.HttpResult; import com.mh.common.http.HttpResult;
import com.mh.common.utils.StringUtils; import com.mh.common.utils.StringUtils;
import com.mh.user.constants.Constant; import com.mh.user.constants.Constant;
import com.mh.user.entity.*; import com.mh.user.entity.ControlSetEntity;
import com.mh.user.mapper.CollectionParamsManageMapper; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.model.*; import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.entity.PumpSetEntity;
import com.mh.user.model.DeviceModel;
import com.mh.user.model.SerialPortModel;
import com.mh.user.serialport.SerialPortSingle2; import com.mh.user.serialport.SerialPortSingle2;
import com.mh.user.service.*; import com.mh.user.service.*;
import com.mh.user.utils.DateUtil;
import com.mh.user.utils.ExchangeStringUtil; import com.mh.user.utils.ExchangeStringUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -44,70 +43,6 @@ public class DeviceControlServiceImpl implements DeviceControlService {
@Resource @Resource
private ControlSetService controlSetService; private ControlSetService controlSetService;
@Resource
private CollectionParamsManageMapper collectionParamsManageMapper;
@Override
public String getSn(SerialPortModel serialPortModel) {
return collectionParamsManageMapper.selectSn(serialPortModel.getCpmId());
}
@Override
public boolean isMqttControl(List<SerialPortModel> params) {
if (!params.isEmpty()) {
for (SerialPortModel serialPortModel : params) {
// 判断是否是mqtt通讯
String communicationType = collectionParamsManageMapper.selectCommunicationType(serialPortModel.getCpmId());
if ("mqtt".equals(communicationType)) {
return true;
}
}
}
return false;
}
@Override
public String operationDevice(SerialPortModel params) {
// 拼接发送的报文
SanShiFengReceiver<SanShiFengStrDatas> sendData = new SanShiFengReceiver<>();
try {
List<SanShiFengStrDatas> advantechDatas = getAdvantechDatas(params);
if (null == advantechDatas) {
return Constant.FAIL;
}
sendData.setDatas(advantechDatas);
sendData.setTime(DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss"));
// 获取plcName
String plcName = collectionParamsManageMapper.selectPlcName(params.getCpmId());
sendData.setPlcName(plcName);
} catch (Exception e) {
log.error("发送mqtt控制设备指令失败", e);
return Constant.FAIL;
}
return JSONObject.toJSONString(sendData);
}
public List<SanShiFengStrDatas> getAdvantechDatas(SerialPortModel params) {
List<SanShiFengStrDatas> advantechDatas = new ArrayList<>();
String dataValue = params.getDataValue();
// 获取报文类型
// 获取报文其他信息
String otherName = "";
// 从数据库id获取设备名称
CollectionParamsManageEntity collectionParamsManage = collectionParamsManageMapper.selectById(params.getCpmId());
if (null != collectionParamsManage) {
otherName = collectionParamsManage.getOtherName();
} else {
return null;
}
// 发送报文
SanShiFengStrDatas data = new SanShiFengStrDatas();
data.setName(otherName);
data.setValue(dataValue);
advantechDatas.add(data);
return advantechDatas;
}
@Override @Override
public String readOrWriteDevice(List<SerialPortModel> params, String type) { public String readOrWriteDevice(List<SerialPortModel> params, String type) {
try { try {
@ -467,8 +402,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("06"); deviceCodeParam.setFunCode("06");
String time1 = split[1].substring(0, 2); String time1 = split[1].substring(0, 2);
String time2 = split[1].substring(3, 5); String time2 = split[1].substring(3, 5);
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
} }
break; break;
case "timeSetClose1": case "timeSetClose1":
@ -479,8 +414,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("06"); deviceCodeParam.setFunCode("06");
String time1 = split[1].substring(0, 2); String time1 = split[1].substring(0, 2);
String time2 = split[1].substring(3, 5); String time2 = split[1].substring(3, 5);
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
} }
break; break;
case "timeSetOpen2": case "timeSetOpen2":
@ -491,8 +426,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("06"); deviceCodeParam.setFunCode("06");
String time1 = split[1].substring(0, 2); String time1 = split[1].substring(0, 2);
String time2 = split[1].substring(3, 5); String time2 = split[1].substring(3, 5);
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
} }
break; break;
case "timeSetClose2": case "timeSetClose2":
@ -503,8 +438,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("06"); deviceCodeParam.setFunCode("06");
String time1 = split[1].substring(0, 2); String time1 = split[1].substring(0, 2);
String time2 = split[1].substring(3, 5); String time2 = split[1].substring(3, 5);
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
} }
break; break;
case "timeSetOpen3": case "timeSetOpen3":
@ -515,8 +450,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("06"); deviceCodeParam.setFunCode("06");
String time1 = split[1].substring(0, 2); String time1 = split[1].substring(0, 2);
String time2 = split[1].substring(3, 5); String time2 = split[1].substring(3, 5);
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
} }
break; break;
case "timeSetClose3": case "timeSetClose3":
@ -527,8 +462,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("06"); deviceCodeParam.setFunCode("06");
String time1 = split[1].substring(0, 2); String time1 = split[1].substring(0, 2);
String time2 = split[1].substring(3, 5); String time2 = split[1].substring(3, 5);
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
} }
break; break;
case "timeSetOpen4": case "timeSetOpen4":
@ -539,8 +474,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("06"); deviceCodeParam.setFunCode("06");
String time1 = split[1].substring(0, 2); String time1 = split[1].substring(0, 2);
String time2 = split[1].substring(3, 5); String time2 = split[1].substring(3, 5);
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
} }
break; break;
case "timeSetClose4": case "timeSetClose4":
@ -551,8 +486,8 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setFunCode("06"); deviceCodeParam.setFunCode("06");
String time1 = split[1].substring(0, 2); String time1 = split[1].substring(0, 2);
String time2 = split[1].substring(3, 5); String time2 = split[1].substring(3, 5);
deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); deviceCodeParam.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1) * 60 + Integer.parseInt(time2))); serialPortModel.setDataValue(String.valueOf(Integer.parseInt(time1)*60 + Integer.parseInt(time2)));
} }
break; break;
case "channelSet": case "channelSet":
@ -565,7 +500,7 @@ public class DeviceControlServiceImpl implements DeviceControlService {
break; break;
case "weekSet": case "weekSet":
// 星期设置 // 星期设置
registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(24 + (scene - 1) * 18)), 4); registerStr = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.decToHex(String.valueOf(24 + (scene-1) * 18)), 4);
if (Constant.WRITE.equals(type)) { if (Constant.WRITE.equals(type)) {
String dataValue = ExchangeStringUtil.addZeroForNum(deviceCodeParam.getDataValue(), 8); String dataValue = ExchangeStringUtil.addZeroForNum(deviceCodeParam.getDataValue(), 8);
dataValue = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.parseByte2HexStr(dataValue), 4); dataValue = ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.parseByte2HexStr(dataValue), 4);
@ -793,7 +728,7 @@ public class DeviceControlServiceImpl implements DeviceControlService {
nowDataService.upTempSet2(deviceCodeParam.getBuildingId(), serialPortModel.getDataValue(), deviceCodeParam.getDeviceAddr());//更新实时状态表 nowDataService.upTempSet2(deviceCodeParam.getBuildingId(), serialPortModel.getDataValue(), deviceCodeParam.getDeviceAddr());//更新实时状态表
log.info("楼栋编号:" + deviceCodeParam.getBuildingId() + ",设定温度:" + serialPortModel.getDataValue() + ",热泵编号:" + deviceCodeParam.getDeviceAddr()); log.info("楼栋编号:" + deviceCodeParam.getBuildingId() + ",设定温度:" + serialPortModel.getDataValue() + ",热泵编号:" + deviceCodeParam.getDeviceAddr());
} else if (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2") || deviceCodeParam.getParam().equals("时段3")) { } else if (deviceCodeParam.getParam().equals("时段1") || deviceCodeParam.getParam().equals("时段2")) {
if (deviceCodeParam.getBrand().equals("美的") || deviceCodeParam.getBrand().equals("瑞星")) { if (deviceCodeParam.getBrand().equals("美的") || deviceCodeParam.getBrand().equals("瑞星")) {
//发送指令 //发送指令
if (Constant.READ.equals(type)) { if (Constant.READ.equals(type)) {
@ -805,8 +740,6 @@ public class DeviceControlServiceImpl implements DeviceControlService {
deviceCodeParam.setRegisterAddr("0656"); //寄存器地址 deviceCodeParam.setRegisterAddr("0656"); //寄存器地址
} else if ("时段2".equals(deviceCodeParam.getParam()) && "美的".equals(deviceCodeParam.getBrand())) { } else if ("时段2".equals(deviceCodeParam.getParam()) && "美的".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("065A"); //寄存器地址 deviceCodeParam.setRegisterAddr("065A"); //寄存器地址
} else if ("时段3".equals(deviceCodeParam.getParam()) && "美的".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("065E"); //寄存器地址
} else if ("时段1".equals(deviceCodeParam.getParam()) && "瑞星".equals(deviceCodeParam.getBrand())) { } else if ("时段1".equals(deviceCodeParam.getParam()) && "瑞星".equals(deviceCodeParam.getBrand())) {
deviceCodeParam.setRegisterAddr("0028"); //寄存器地址 deviceCodeParam.setRegisterAddr("0028"); //寄存器地址
} else if ("时段2".equals(deviceCodeParam.getParam()) && "瑞星".equals(deviceCodeParam.getBrand())) { } else if ("时段2".equals(deviceCodeParam.getParam()) && "瑞星".equals(deviceCodeParam.getBrand())) {
@ -837,9 +770,6 @@ public class DeviceControlServiceImpl implements DeviceControlService {
} else if ("时段2".equals(deviceCodeParam.getParam())) { } else if ("时段2".equals(deviceCodeParam.getParam())) {
pumpData.setStartTime2(statTime); pumpData.setStartTime2(statTime);
pumpData.setCloseTime2(closeTime); pumpData.setCloseTime2(closeTime);
} else if ("时段3".equals(deviceCodeParam.getParam())) {
pumpData.setStartTime3(statTime);
pumpData.setCloseTime3(closeTime);
} }
} }
pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库 pumpSetService.savePumpSet(pumpData);//热泵信息保存数据库

4
user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java

@ -444,8 +444,8 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
} }
@Override @Override
public void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue, Long id) { public void updateInitValue(String deviceAddr, String deviceType, String buildingId, String initValue) {
deviceInstallMapper.updateInitValue(deviceAddr, deviceType, buildingId, initValue, id); deviceInstallMapper.updateInitValue(deviceAddr, deviceType, buildingId, initValue);
} }
@Override @Override

10
user-service/src/main/java/com/mh/user/service/impl/GatewayManageServiceImpl.java

@ -108,14 +108,4 @@ public class GatewayManageServiceImpl implements GatewayManageService {
public void updateGatewayManageOnlineByImei(String imei, int status) { public void updateGatewayManageOnlineByImei(String imei, int status) {
gatewayManageMapper.updateGatewayManageOnlineByImei(imei, status); gatewayManageMapper.updateGatewayManageOnlineByImei(imei, status);
} }
@Override
public void updateGatewayManageOnlineBySn(String sn, int grade) {
gatewayManageMapper.updateGatewayManageOnlineBySn(sn, grade);
}
@Override
public String queryBuildingIdBySn(String sn) {
return gatewayManageMapper.queryBuildingIdBySn(sn);
}
} }

439
user-service/src/main/java/com/mh/user/service/impl/NowDataServiceImpl.java

@ -19,7 +19,6 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
@ -52,19 +51,11 @@ public class NowDataServiceImpl implements NowDataService {
ReentrantLock lockA = new ReentrantLock(); ReentrantLock lockA = new ReentrantLock();
ReentrantLock lockB = new ReentrantLock(); ReentrantLock lockB = new ReentrantLock();
@Autowired @Autowired
private AreaMapper areaMapper; private AreaMapper areaMapper;
@Qualifier("gatewayManageMapper") @Qualifier("gatewayManageMapper")
@Autowired @Autowired
private GatewayManageMapper gatewayManageMapper; private GatewayManageMapper gatewayManageMapper;
@Autowired
private CollectionParamsManageMapper collectionParamsManageMapper;
@Override
public void proWaterPressure(String dateStr, String buildingId, String buildingName, String registerAddr, String otherName, String dataStr) {
nowDataMapper.proWaterPressure(dateStr, buildingId, buildingName, registerAddr, otherName, dataStr);
}
@Override @Override
public void updateMultiNowData(NowDataEntity nowDataEntity) { public void updateMultiNowData(NowDataEntity nowDataEntity) {
@ -119,8 +110,8 @@ public class NowDataServiceImpl implements NowDataService {
@Override @Override
public NowDataEntity queryNowDataByPumpName(String buildingId, String buildingName, String deviceAddr, String deviceName) { public NowDataEntity queryNowDataByPumpName(String buildingId, String buildingName, String deviceAddr, String deviceName) {
int count = nowDataMapper.selectNowDataByPumName(buildingId, deviceAddr, deviceName); int count = nowDataMapper.selectNowDataByPumName(buildingId,deviceAddr,deviceName);
if (count == 0) { if (count==0){
NowDataEntity nowDataEntity = new NowDataEntity(); NowDataEntity nowDataEntity = new NowDataEntity();
nowDataEntity.setPumpId(deviceAddr); nowDataEntity.setPumpId(deviceAddr);
nowDataEntity.setPumpName(deviceName); nowDataEntity.setPumpName(deviceName);
@ -129,7 +120,7 @@ public class NowDataServiceImpl implements NowDataService {
nowDataMapper.saveNowData(nowDataEntity); nowDataMapper.saveNowData(nowDataEntity);
return nowDataEntity; return nowDataEntity;
} }
return nowDataMapper.queryNowDataByPumpName(buildingId, deviceAddr, deviceName); return nowDataMapper.queryNowDataByPumpName(buildingId,deviceAddr,deviceName);
} }
@Override @Override
@ -139,94 +130,94 @@ public class NowDataServiceImpl implements NowDataService {
//保存热泵采集数据 //保存热泵采集数据
@Override @Override
public void saveNowHistoryData(String pumpId, String deviceType, String strData, String dataType, String buildingId) { public void saveNowHistoryData(String pumpId, String deviceType, String strData,String dataType,String buildingId) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(); Date date=new Date();
String strDate = sdf1.format(date); String strDate=sdf1.format(date);
strDate = strDate.substring(0, 13) + ":00:00"; strDate=strDate.substring(0,13)+":00:00";
NowDataEntity data = new NowDataEntity(); NowDataEntity data=new NowDataEntity();
try { try{
if (dataType.equals("tempSet")) { //温度设定 if (dataType.equals("tempSet")){ //温度设定
data.setTempSet(strData); data.setTempSet(strData);
} else if (dataType.equals("waterTemp")) { //水箱水温 }else if (dataType.equals("waterTemp")){ //水箱水温
data.setWaterTemp(strData); data.setWaterTemp(strData);
} else if (dataType.equals("runState")) { //运行状态 }else if (dataType.equals("runState")){ //运行状态
data.setRunState(strData); data.setRunState(strData);
} else if (dataType.equals("isFault")) { //是否故障 }else if (dataType.equals("isFault")){ //是否故障
data.setIsFault(strData); data.setIsFault(strData);
} }
//从安装表获取设备信息 //从安装表获取设备信息
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, deviceType, buildingId); DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(pumpId,deviceType,buildingId);
//获取对应水箱信息 //获取对应水箱信息
DeviceModel tank = deviceFloorMapper.selectTankName(buildingId, "水箱", pumpId); DeviceModel tank=deviceFloorMapper.selectTankName(buildingId,"水箱",pumpId);
if (tank != null) { if (tank!=null){
data.setTankId(String.valueOf(tank.getId())); //对应水箱编号 data.setTankId(String.valueOf(tank.getId())); //对应水箱编号
data.setTankName(tank.getDeviceName()); //对应水箱名称 data.setTankName(tank.getDeviceName()); //对应水箱名称
} }
String buildingName = buildingService.queryBuildingName(buildingId); String buildingName=buildingService.queryBuildingName(buildingId);
//判断实时表是否有记录 //判断实时表是否有记录
int r1 = nowDataMapper.selectNowDataCount(deviceInstallEntity.getBuildingId(), pumpId);//判断now_data表是否存在记录 int r1 = nowDataMapper.selectNowDataCount(deviceInstallEntity.getBuildingId(),pumpId);//判断now_data表是否存在记录
if (r1 == 0) { if(r1==0){
data.setPumpId(pumpId); //通讯地址 data.setPumpId(pumpId); //通讯地址
data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址
data.setBuildingId(deviceInstallEntity.getBuildingId()); data.setBuildingId(deviceInstallEntity.getBuildingId());
data.setBuildingName(buildingName); data.setBuildingName(buildingName);
nowDataMapper.saveNowData(data); nowDataMapper.saveNowData(data);
} else { } else {
NowDataEntity data1 = nowDataMapper.selectNowData(deviceInstallEntity.getBuildingId(), pumpId); NowDataEntity data1=nowDataMapper.selectNowData(deviceInstallEntity.getBuildingId(),pumpId);
if (data1 != null) { if (data1!=null){
if (dataType.equals("tempSet")) { //温度设定 if (dataType.equals("tempSet")){ //温度设定
data1.setTempSet(strData); data1.setTempSet(strData);
} else if (dataType.equals("waterTemp")) { //水箱水温 }else if (dataType.equals("waterTemp")){ //水箱水温
data1.setWaterTemp(strData); data1.setWaterTemp(strData);
} else if (dataType.equals("runState")) { //运行状态 }else if (dataType.equals("runState")){ //运行状态
data1.setRunState(strData); data1.setRunState(strData);
} else if (dataType.equals("isFault")) { //是否故障 }else if (dataType.equals("isFault")){ //是否故障
data1.setIsFault(strData); data1.setIsFault(strData);
} }
nowDataMapper.updateNowData(data1); nowDataMapper.updateNowData(data1);
} }
} }
//判断历史表是否有记录 //判断历史表是否有记录
int r2 = nowDataMapper.selectHistoryDataCount(strDate, deviceInstallEntity.getBuildingId(), pumpId);//判断now_data表是否存在记录 int r2 = nowDataMapper.selectHistoryDataCount(strDate,deviceInstallEntity.getBuildingId(),pumpId);//判断now_data表是否存在记录
if (r2 == 0) { if (r2==0){
data.setPumpId(pumpId); //通讯地址 data.setPumpId(pumpId); //通讯地址
data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址
data.setBuildingId(deviceInstallEntity.getBuildingId()); data.setBuildingId(deviceInstallEntity.getBuildingId());
data.setBuildingName(buildingName); data.setBuildingName(buildingName);
data.setCurDate(strDate); data.setCurDate(strDate);
nowDataMapper.saveHistoryData(data); nowDataMapper.saveHistoryData(data);
} else { }else {
NowDataEntity data2 = nowDataMapper.selectHistoryData(strDate, deviceInstallEntity.getBuildingId(), pumpId); NowDataEntity data2=nowDataMapper.selectHistoryData(strDate,deviceInstallEntity.getBuildingId(),pumpId);
if (data2 != null) { if (data2!=null){
if (dataType.equals("tempSet")) { //温度设定 if (dataType.equals("tempSet")){ //温度设定
data2.setTempSet(strData); data2.setTempSet(strData);
} else if (dataType.equals("waterTemp")) { //水箱水温 }else if (dataType.equals("waterTemp")){ //水箱水温
data2.setWaterTemp(strData); data2.setWaterTemp(strData);
} else if (dataType.equals("runState")) { //运行状态 }else if (dataType.equals("runState")){ //运行状态
data2.setRunState(strData); data2.setRunState(strData);
} else if (dataType.equals("isFault")) { //是否故障 }else if (dataType.equals("isFault")){ //是否故障
data2.setIsFault(strData); data2.setIsFault(strData);
} }
nowDataMapper.updateHistoryData(data2); nowDataMapper.updateHistoryData(data2);
} }
} }
} catch (Exception e) { }catch (Exception e){
e.printStackTrace(); e.printStackTrace();
} }
} }
//非热泵温控、状态检测数据 //非热泵温控、状态检测数据
@Override @Override
public void saveNowHistoryData2(String deviceAddr, String deviceType, String strData, String dataType, String buildingId) { public void saveNowHistoryData2(String deviceAddr, String deviceType, String strData, String dataType,String buildingId) {
NowDataEntity data = new NowDataEntity(); NowDataEntity data=new NowDataEntity();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(); Date date=new Date();
String strDate = sdf1.format(date); String strDate=sdf1.format(date);
strDate = strDate.substring(0, 13) + ":00:00"; strDate=strDate.substring(0,13)+":00:00";
try { try{
switch (dataType) { switch (dataType) {
case "tempSet": //温度设定 case "tempSet": //温度设定
data.setTempSet(strData); data.setTempSet(strData);
@ -248,28 +239,28 @@ public class NowDataServiceImpl implements NowDataService {
break; break;
} }
//从安装表获取设备信息 //从安装表获取设备信息
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(deviceAddr, deviceType, buildingId); DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(deviceAddr,deviceType,buildingId);
String buildingName = buildingService.queryBuildingName(buildingId); String buildingName=buildingService.queryBuildingName(buildingId);
data.setBuildingName(buildingName); data.setBuildingName(buildingName);
// 获取项目名称 // 获取项目名称
String name = dealDataService.customName(); String name = dealDataService.customName();
if (deviceType.equals("温控") if (deviceType.equals("温控")
&& !name.contains(Constant.CUSTOM_NAME_HUAXIA) && !name.contains(Constant.CUSTOM_NAME_HUAXIA)
&& !name.contains(Constant.CUSTOM_NAME_HUARUAN)) { && !name.contains(Constant.CUSTOM_NAME_HUARUAN) ) {
log.error("进入到热泵1------------------------"); log.error("进入到热泵1------------------------");
//为了兼容旧系统,旧系统热泵信息保存在楼面表,从楼面表获取热泵资料 //为了兼容旧系统,旧系统热泵信息保存在楼面表,从楼面表获取热泵资料
PumpModel pump = deviceFloorMapper.selectDeviceId2("热泵", buildingId); PumpModel pump=deviceFloorMapper.selectDeviceId2("热泵",buildingId);
String pumpId = "1"; String pumpId="1";
String pumpName = "热泵1"; String pumpName="热泵1";
if (pump != null) { if (pump!=null){
pumpId = pump.getPumpId(); pumpId=pump.getPumpId();
pumpName = pump.getPumpName(); pumpName=pump.getPumpName();
//获取对应水箱信息 //获取对应水箱信息
DeviceModel tank = deviceFloorMapper.selectTankName(buildingId, "水箱", pumpId); DeviceModel tank=deviceFloorMapper.selectTankName(buildingId,"水箱",pumpId);
if (tank != null) { if (tank!=null){
data.setTankId(String.valueOf(tank.getId())); //对应水箱编号 data.setTankId(String.valueOf(tank.getId())); //对应水箱编号
data.setTankName(tank.getDeviceName()); //对应水箱名称 data.setTankName(tank.getDeviceName()); //对应水箱名称
} else { }else{
data.setTankId("1"); //对应水箱编号 data.setTankId("1"); //对应水箱编号
data.setTankName("水箱1"); //对应水箱名称 data.setTankName("水箱1"); //对应水箱名称
} }
@ -281,68 +272,68 @@ public class NowDataServiceImpl implements NowDataService {
data.setCurDate(strDate); data.setCurDate(strDate);
//判断实时表是否有记录 //判断实时表是否有记录
int r1 = nowDataMapper.selectNowDataCount2(buildingId);//判断now_data表是否存在记录 int r1 = nowDataMapper.selectNowDataCount2(buildingId);//判断now_data表是否存在记录
if (r1 == 0) { if (r1==0){
nowDataMapper.saveNowData(data); nowDataMapper.saveNowData(data);
} else { }else {
if (deviceType.equals("压变")) { if (deviceType.equals("压变")) {
String seat = deviceInstallService.selectSeat(deviceType, deviceAddr, buildingId); String seat=deviceInstallService.selectSeat(deviceType,deviceAddr,buildingId);
log.info("-------楼栋:" + buildingName + ",类型:" + deviceType + ",地址:" + deviceAddr + ",区位:" + seat + ",数值:" + strData + "------"); log.info("-------楼栋:"+buildingName+",类型:"+deviceType+",地址:"+deviceAddr+",区位:"+seat+",数值:"+strData+"------");
if (!StringUtils.isBlank(seat)) { if (!StringUtils.isBlank(seat)){
nowDataMapper.nowDataWaterLevel(strData, seat, buildingId); nowDataMapper.nowDataWaterLevel(strData,seat,buildingId);
} else { }else{
nowDataMapper.updateNowData2(data); nowDataMapper.updateNowData2(data);
} }
} else if (deviceType.equals("水位开关")) { }else if (deviceType.equals("水位开关")){
String seat = deviceInstallService.selectSeat(deviceType, deviceAddr, buildingId); String seat=deviceInstallService.selectSeat(deviceType,deviceAddr,buildingId);
log.info("-------楼栋:" + buildingName + ",类型:" + deviceType + ",地址:" + deviceAddr + ",区位:" + seat + ",数值:" + strData + "------"); log.info("-------楼栋:"+buildingName+",类型:"+deviceType+",地址:"+deviceAddr+",区位:"+seat+",数值:"+strData+"------");
if (seat != null) { if (seat!=null){
nowDataMapper.nowDataLevelSet(strData, seat, buildingId); nowDataMapper.nowDataLevelSet(strData,seat,buildingId);
} else { }else{
nowDataMapper.updateNowData2(data); nowDataMapper.updateNowData2(data);
} }
} else { }else{
nowDataMapper.updateNowData2(data); nowDataMapper.updateNowData2(data);
} }
} }
//判断历史表是否有记录 //判断历史表是否有记录
int r2 = nowDataMapper.selectHistoryDataCount2(strDate, buildingId);//判断history_Data表是否存在记录 int r2 = nowDataMapper.selectHistoryDataCount2(strDate,buildingId);//判断history_Data表是否存在记录
if (r2 == 0) { if (r2==0){
nowDataMapper.saveHistoryData(data); nowDataMapper.saveHistoryData(data);
} else { }else {
if (deviceType.equals("压变")) { if (deviceType.equals("压变")) {
String seat = deviceInstallService.selectSeat(deviceType, deviceAddr, buildingId); String seat=deviceInstallService.selectSeat(deviceType,deviceAddr,buildingId);
if (!StringUtils.isBlank(seat)) { if (!StringUtils.isBlank(seat)){
nowDataMapper.historyDataWaterLevel(strData, seat, buildingId, strDate); nowDataMapper.historyDataWaterLevel(strData,seat,buildingId,strDate);
log.info("------楼栋:" + buildingName + ",历史记录压变区位:" + seat + "------"); log.info("------楼栋:"+buildingName+",历史记录压变区位:"+seat+"------");
} else { }else{
nowDataMapper.updateHistoryData2(data); nowDataMapper.updateHistoryData2(data);
} }
} else if (deviceType.equals("水位开关")) { }else if (deviceType.equals("水位开关")){
String seat = deviceInstallService.selectSeat(deviceType, deviceAddr, buildingId); String seat=deviceInstallService.selectSeat(deviceType,deviceAddr,buildingId);
if (!StringUtils.isBlank(seat)) { if (!StringUtils.isBlank(seat)){
nowDataMapper.historyDataLevelSet(strData, seat, buildingId, strDate); nowDataMapper.historyDataLevelSet(strData,seat,buildingId,strDate);
log.info("------楼栋:" + buildingName + ",历史记录水位开关区位:" + seat + "------"); log.info("------楼栋:"+buildingName+",历史记录水位开关区位:"+seat+"------");
} else { }else{
nowDataMapper.updateHistoryData2(data); nowDataMapper.updateHistoryData2(data);
} }
} else { }else{
nowDataMapper.updateHistoryData2(data); nowDataMapper.updateHistoryData2(data);
} }
} }
} catch (Exception e) { }catch (Exception e){
e.printStackTrace(); e.printStackTrace();
} }
} }
//非热泵温度变送器、状态检测相关数据 //非热泵温度变送器、状态检测相关数据
@Override @Override
public void saveNowHistoryData3(String pumpId, String deviceType, String strData, String dataType, String buildingId) { public void saveNowHistoryData3(String pumpId, String deviceType, String strData,String dataType,String buildingId) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(); Date date=new Date();
String strDate = sdf1.format(date); String strDate=sdf1.format(date);
strDate = strDate.substring(0, 13) + ":00:00"; strDate=strDate.substring(0,13)+":00:00";
NowDataEntity data = new NowDataEntity(); NowDataEntity data=new NowDataEntity();
try { try{
switch (dataType) { switch (dataType) {
case "tempSet": //温度设定 case "tempSet": //温度设定
data.setTempSet(strData); data.setTempSet(strData);
@ -357,48 +348,48 @@ public class NowDataServiceImpl implements NowDataService {
data.setIsFault(strData); data.setIsFault(strData);
break; break;
} }
String buildingName = buildingService.queryBuildingName(buildingId); String buildingName=buildingService.queryBuildingName(buildingId);
//判断实时表是否有记录 //判断实时表是否有记录
int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId);//判断now_data表是否存在记录 int r1 = nowDataMapper.selectNowDataCount(buildingId,pumpId);//判断now_data表是否存在记录
if (r1 == 0) { if(r1==0){
data.setPumpId(pumpId); //热泵编号 data.setPumpId(pumpId); //热泵编号
String pumpName = "热泵" + pumpId; String pumpName="热泵"+pumpId;
data.setPumpName(pumpName); //热泵名称 data.setPumpName(pumpName); //热泵名称
data.setBuildingId(buildingId); data.setBuildingId(buildingId);
data.setBuildingName(buildingName); data.setBuildingName(buildingName);
nowDataMapper.saveNowData(data); nowDataMapper.saveNowData(data);
} else { } else {
NowDataEntity data1 = nowDataMapper.selectNowData(buildingId, pumpId); NowDataEntity data1=nowDataMapper.selectNowData(buildingId,pumpId);
if (data1 != null) { if (data1!=null){
if (dataType.equals("tempSet")) { //温度设定 if (dataType.equals("tempSet")){ //温度设定
data1.setTempSet(strData); data1.setTempSet(strData);
} else if (dataType.equals("waterTemp")) { //水箱水温 } else if (dataType.equals("waterTemp")){ //水箱水温
BigDecimal bigDecimal = new BigDecimal(strData); BigDecimal bigDecimal = new BigDecimal(strData);
if (bigDecimal.compareTo(new BigDecimal(0)) >= 0 if (bigDecimal.compareTo(new BigDecimal(0)) >= 0
&& bigDecimal.compareTo(new BigDecimal(100)) <= 0) { && bigDecimal.compareTo(new BigDecimal(100)) <= 0) {
data1.setWaterTemp(strData); data1.setWaterTemp(strData);
} }
} else if (dataType.equals("runState")) { //运行状态 }else if (dataType.equals("runState")){ //运行状态
data1.setRunState(strData); data1.setRunState(strData);
} else if (dataType.equals("isFault")) { //是否故障 }else if (dataType.equals("isFault")){ //是否故障
data1.setIsFault(strData); data1.setIsFault(strData);
} }
nowDataMapper.updateNowData(data1); nowDataMapper.updateNowData(data1);
} }
} }
//判断历史表是否有记录 //判断历史表是否有记录
int r2 = nowDataMapper.selectHistoryDataCount(strDate, buildingId, pumpId);//判断now_data表是否存在记录 int r2 = nowDataMapper.selectHistoryDataCount(strDate,buildingId,pumpId);//判断now_data表是否存在记录
if (r2 == 0) { if (r2==0){
data.setPumpId(pumpId); //热泵编号 data.setPumpId(pumpId); //热泵编号
String pumpName = "热泵" + pumpId; String pumpName="热泵"+pumpId;
data.setPumpName(pumpName); //热泵名称 data.setPumpName(pumpName); //热泵名称
data.setBuildingId(buildingId); data.setBuildingId(buildingId);
data.setBuildingName(buildingName); data.setBuildingName(buildingName);
data.setCurDate(strDate); data.setCurDate(strDate);
nowDataMapper.saveHistoryData(data); nowDataMapper.saveHistoryData(data);
} else { }else {
NowDataEntity data2 = nowDataMapper.selectHistoryData(strDate, buildingId, pumpId); NowDataEntity data2=nowDataMapper.selectHistoryData(strDate,buildingId,pumpId);
if (data2 != null) { if (data2!=null){
switch (dataType) { switch (dataType) {
case "tempSet": //温度设定 case "tempSet": //温度设定
data2.setTempSet(strData); data2.setTempSet(strData);
@ -416,7 +407,7 @@ public class NowDataServiceImpl implements NowDataService {
nowDataMapper.updateHistoryData(data2); nowDataMapper.updateHistoryData(data2);
} }
} }
} catch (Exception e) { }catch (Exception e){
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -431,138 +422,22 @@ public class NowDataServiceImpl implements NowDataService {
nowDataMapper.updateTempSet(buildingId); nowDataMapper.updateTempSet(buildingId);
nowDataMapper.updateLevelSet(buildingId); nowDataMapper.updateLevelSet(buildingId);
List<NowDataEntity> nowDataEntities = nowDataMapper.queryNowData(buildingId); List<NowDataEntity> nowDataEntities = nowDataMapper.queryNowData(buildingId);
// 处理压变设备离线状态
handlePressureTransmitterOfflineStatus(buildingId, nowDataEntities);
// 处理循环泵状态
handlePumpStatus(buildingId, nowDataEntities, "循环泵",
new HashMap<String, String>() {{
put("循环泵1", "setCirculateState");
put("循环泵2", "setCirculateState2");
}});
// 处理回水泵状态
handlePumpStatus(buildingId, nowDataEntities, "回水泵",
new HashMap<String, String>() {{
put("回水泵1", "setBackWaterState");
put("回水泵2", "setBackWaterState2");
}});
// 处理压力值和网关
handlePressureAndGatewayStatus(buildingId, nowDataEntities, "系统", "5");
return nowDataEntities;
}
private void handlePressureAndGatewayStatus(String buildingId, List<NowDataEntity> nowDataEntities, String deviceType, String paramTypeId) {
List<DeviceInstallEntity> pumpList = deviceInstallMapper.selectOfflineDevice(buildingId, deviceType);
for (DeviceInstallEntity pump : pumpList) {
CollectionParamsManageEntity pressure = collectionParamsManageMapper.selectByDeviceIdAndParamTypeId(pump.getId(), paramTypeId);
if (pressure != null) {
String pressureValue = pressure.getCurValue().setScale(1, RoundingMode.HALF_UP).toString();
if (!StringUtils.isBlank(pressureValue)) {
nowDataEntities.stream()
.filter(nowDataEntity -> buildingId.equals(nowDataEntity.getBuildingId()))
.forEach(nowDataEntity -> nowDataEntity.setPressure(pressureValue));
String dataCom = pump.getDataCom();
if (!StringUtils.isBlank(dataCom)) {
int gwState = gatewayManageMapper.queryGatewayByDataCom(dataCom);
nowDataEntities.stream()
.filter(nowDataEntity -> buildingId.equals(nowDataEntity.getBuildingId()))
.forEach(nowDataEntity -> nowDataEntity.setGwState(gwState == 0 ? "在线" : "离线"));
}
break;
}
}
}
}
/**
* 处理压变设备离线状态
*/
private void handlePressureTransmitterOfflineStatus(String buildingId, List<NowDataEntity> nowDataEntities) {
List<DeviceInstallEntity> list = deviceInstallMapper.selectOfflineDevice(buildingId, "压变"); List<DeviceInstallEntity> list = deviceInstallMapper.selectOfflineDevice(buildingId, "压变");
if (list != null && !list.isEmpty()) { if (list != null && list.size() > 0) {
for (DeviceInstallEntity deviceInstallEntity : list) { for (DeviceInstallEntity deviceInstallEntity : list) {
if (!DateUtil.isToday(deviceInstallEntity.getLastDate())) { if (!DateUtil.isToday(deviceInstallEntity.getLastDate())) {
// 使用stream流nowDataEntities,批量更新waterLevel="离线"
nowDataEntities.stream() nowDataEntities.stream()
.filter(nowDataEntity -> buildingId.equals(nowDataEntity.getBuildingId())) .filter(nowDataEntity -> buildingId.equals(nowDataEntity.getBuildingId()))
.forEach(nowDataEntity -> nowDataEntity.setWaterLevel("离线")); .forEach(nowDataEntity -> nowDataEntity.setWaterLevel("离线"));
break;
}
} }
} }
} }
return nowDataEntities;
/**
* 处理泵设备状态
*/
private void handlePumpStatus(String buildingId, List<NowDataEntity> nowDataEntities,
String deviceType, Map<String, String> pumpMethodMapping) {
List<DeviceInstallEntity> pumpList = deviceInstallMapper.selectOfflineDevice(buildingId, deviceType);
for (DeviceInstallEntity pump : pumpList) {
for (Map.Entry<String, String> entry : pumpMethodMapping.entrySet()) {
String pumpIdentifier = entry.getKey();
String methodName = entry.getValue();
if (pump.getDeviceName().contains(pumpIdentifier)) {
updatePumpStatus(nowDataEntities, buildingId, pump, methodName);
break;
}
}
}
}
/**
* 更新单个泵的状态
*/
private void updatePumpStatus(List<NowDataEntity> nowDataEntities, String buildingId,
DeviceInstallEntity pump, String setterMethodName) {
try {
// 查询对应collectionParamManage参数
CollectionParamsManageEntity runState = collectionParamsManageMapper
.selectByDeviceIdAndParamTypeId(pump.getId(), "2");
String status;
if (DateUtil.isToday(runState.getCurTime())) {
status = runState.getCurValue().intValue() == 1 ? "运行" : "不运行";
} else {
status = "离线";
}
// 使用反射调用对应setter方法
nowDataEntities.stream()
.filter(nowDataEntity -> buildingId.equals(nowDataEntity.getBuildingId()))
.forEach(nowDataEntity -> {
try {
nowDataEntity.getClass()
.getMethod(setterMethodName, String.class)
.invoke(nowDataEntity, status);
} catch (Exception e) {
// 记录日志或适当处理异常
}
});
} catch (Exception e) {
// 处理查询异常,设置为离线状态
nowDataEntities.stream()
.filter(nowDataEntity -> buildingId.equals(nowDataEntity.getBuildingId()))
.forEach(nowDataEntity -> {
try {
nowDataEntity.getClass()
.getMethod(setterMethodName, String.class)
.invoke(nowDataEntity, "离线");
} catch (Exception ex) {
// 记录日志或适当处理异常
}
});
}
} }
@Override @Override
public NowDataEntity queryNowDataByPump(String buildingId, String pumpId) { public NowDataEntity queryNowDataByPump(String buildingId,String pumpId) {
// 查询当前楼栋离线的设备 // 查询当前楼栋离线的设备
List<DeviceInstallEntity> list = deviceInstallMapper.selectOfflineDevice(buildingId, "压变"); List<DeviceInstallEntity> list = deviceInstallMapper.selectOfflineDevice(buildingId, "压变");
NowDataEntity nowDataEntity = nowDataMapper.queryNowDataByPump(buildingId, pumpId); NowDataEntity nowDataEntity = nowDataMapper.queryNowDataByPump(buildingId, pumpId);
@ -587,28 +462,28 @@ public class NowDataServiceImpl implements NowDataService {
} }
@Override @Override
public List<NowDataEntity> queryHistoryData(String curDate, String buildingId, String pumpId, String tankId, int page, int limit) { public List<NowDataEntity> queryHistoryData(String curDate, String buildingId,String pumpId,String tankId, int page, int limit) {
return nowDataMapper.queryHistoryData(curDate, buildingId, pumpId, tankId, page, limit); return nowDataMapper.queryHistoryData(curDate,buildingId,pumpId,tankId,page,limit);
} }
@Override @Override
public int getHistoryDataCount(String curDate, String buildingId, String pumpId, String tankId, int page, int limit) { public int getHistoryDataCount(String curDate, String buildingId,String pumpId,String tankId, int page, int limit) {
return nowDataMapper.getHistoryDataCount(curDate, buildingId, pumpId, tankId, page, limit); return nowDataMapper.getHistoryDataCount(curDate,buildingId,pumpId,tankId,page,limit);
} }
@Override @Override
public List<WaterLevelEntity> queryWaterLevel(String curDate, String buildingID, int page, int limit) { public List<WaterLevelEntity> queryWaterLevel(String curDate, String buildingID, int page, int limit) {
return nowDataMapper.queryWaterLevel(curDate, buildingID, page, limit); return nowDataMapper.queryWaterLevel(curDate,buildingID,page,limit);
} }
@Override @Override
public int getWaterLevelCount(String curDate, String buildingID) { public int getWaterLevelCount(String curDate, String buildingID) {
return nowDataMapper.getWaterLevelCount(curDate, buildingID); return nowDataMapper.getWaterLevelCount(curDate,buildingID);
} }
@Override @Override
public List<WaterLevelModel> queryWaterLevelByTime(String curDate, int page, int limit) { public List<WaterLevelModel> queryWaterLevelByTime(String curDate,int page,int limit) {
return nowDataMapper.queryWaterLevelByTime(curDate, page, limit); return nowDataMapper.queryWaterLevelByTime(curDate,page,limit);
} }
@Override @Override
@ -633,36 +508,36 @@ public class NowDataServiceImpl implements NowDataService {
} }
@Override @Override
public String selectSingleTemp(String pumpId, String buildingId) { public String selectSingleTemp(String pumpId,String buildingId) {
return nowDataMapper.selectSingleTemp(pumpId, buildingId); return nowDataMapper.selectSingleTemp(pumpId,buildingId);
} }
//从监视表查询热泵运行状态 //从监视表查询热泵运行状态
@Override @Override
public String selectStateCount(String buildingId) { public String selectStateCount(String buildingId) {
int count = nowDataMapper.selectStateCount(buildingId); int count=nowDataMapper.selectStateCount(buildingId);
String state = ""; String state="";
if (count == 0) { if (count==0){
state = "不运行"; state="不运行";
} else { }else{
state = "运行"; state="运行";
} }
return state; return state;
} }
@Override @Override
public String selectState(String buildingId, String pumpId) { public String selectState(String buildingId, String pumpId) {
return nowDataMapper.selectState(buildingId, pumpId); return nowDataMapper.selectState(buildingId,pumpId);
} }
@Override @Override
public void upLevelSet(String buildingId, String levelSet) { public void upLevelSet(String buildingId, String levelSet) {
nowDataMapper.upLevelSet(buildingId, levelSet); nowDataMapper.upLevelSet(buildingId,levelSet);
} }
@Override @Override
public void upTempSet(String buildingId, String tempSet) { public void upTempSet(String buildingId, String tempSet) {
nowDataMapper.upTempSet(buildingId, tempSet); nowDataMapper.upTempSet(buildingId,tempSet);
} }
@Override @Override
@ -671,28 +546,18 @@ public class NowDataServiceImpl implements NowDataService {
} }
@Override @Override
public List<WaterTempEntity> queryWaterTemp(String buildingID, String curDate, int page, int limit) { public List<WaterTempEntity> queryWaterTemp(String buildingID, String curDate,int page,int limit) {
return nowDataMapper.queryWaterTemp(buildingID, curDate, page, limit); return nowDataMapper.queryWaterTemp(buildingID,curDate,page,limit);
} }
@Override @Override
public int queryWaterTempCount(String buildingID, String curDate) { public int queryWaterTempCount(String buildingID, String curDate) {
return nowDataMapper.queryWaterTempCount(buildingID, curDate); return nowDataMapper.queryWaterTempCount(buildingID,curDate);
}
@Override
public List<WaterPressureEntity> queryWaterPressure(String buildingID, String curDate, int page, int limit) {
return nowDataMapper.queryWaterPressure(buildingID, curDate, page, limit);
}
@Override
public int queryWaterPressureCount(String buildingID, String curDate) {
return nowDataMapper.queryWaterPressureCount(buildingID, curDate);
} }
//查询所有楼栋每栋楼的平均温度 //查询所有楼栋每栋楼的平均温度
@Override @Override
public List<WaterTempEntity> queryWaterTemp2(String curDate, int page, int limit, int level, String buildingID) { public List<WaterTempEntity> queryWaterTemp2(String curDate,int page,int limit, int level, String buildingID) {
List<WaterTempEntity> waterTempEntityList = nowDataMapper.queryWaterTemp2(curDate, page, limit); List<WaterTempEntity> waterTempEntityList = nowDataMapper.queryWaterTemp2(curDate, page, limit);
// 根据level层级查询 // 根据level层级查询
if (level == 1) { if (level == 1) {
@ -703,20 +568,6 @@ public class NowDataServiceImpl implements NowDataService {
} }
return waterTempEntityList; return waterTempEntityList;
} }
@Override
public List<WaterPressureEntity> queryWaterPressure2(String curDate, int page, int limit, int level, String buildingID) {
List<WaterPressureEntity> waterPressureEntityList = nowDataMapper.queryWaterPressure2(curDate, page, limit);
// 根据level层级查询
if (level == 1) {
// 根据区域id获取对应的楼栋id
List<String> buildingIdList = buildingService.queryBuildingIdListByAreaId(buildingID);
// waterTempEntityList过滤掉非该区域的楼栋
waterPressureEntityList.removeIf(waterPressureEntity -> !buildingIdList.contains(waterPressureEntity.getBuildingID()));
}
return waterPressureEntityList;
}
//查询所有楼栋每栋楼的平均温度记录数 //查询所有楼栋每栋楼的平均温度记录数
@Override @Override
public int queryWaterTempCount2(String curDate, int level, String buildingID) { public int queryWaterTempCount2(String curDate, int level, String buildingID) {
@ -730,7 +581,7 @@ public class NowDataServiceImpl implements NowDataService {
try { try {
lockB.lock(); lockB.lock();
try { try {
nowDataMapper.proWaterTemp(curDate, buildingID, pumpID); nowDataMapper.proWaterTemp(curDate,buildingID,pumpID);
} finally { } finally {
lockB.unlock(); lockB.unlock();
} }
@ -762,11 +613,11 @@ public class NowDataServiceImpl implements NowDataService {
} }
@Override @Override
public void updateRunState(String buildingId, String pumpId, String strState, String buildingName) { public void updateRunState(String buildingId, String pumpId,String strState, String buildingName) {
DeviceInstallEntity deviceInstallEntity = deviceInstallMapper.selectDevice(pumpId, "热泵", buildingId); DeviceInstallEntity deviceInstallEntity=deviceInstallMapper.selectDevice(pumpId,"热泵",buildingId);
NowDataEntity data = new NowDataEntity(); NowDataEntity data=new NowDataEntity();
int r1 = nowDataMapper.selectNowDataCount(buildingId, pumpId);//判断now_data表是否存在记录 int r1 = nowDataMapper.selectNowDataCount(buildingId,pumpId);//判断now_data表是否存在记录
if (r1 == 0) { if(r1==0){
data.setPumpId(pumpId); //通讯地址 data.setPumpId(pumpId); //通讯地址
data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址 data.setPumpName(deviceInstallEntity.getDeviceName()); //通讯地址
data.setBuildingId(buildingId); data.setBuildingId(buildingId);
@ -774,22 +625,22 @@ public class NowDataServiceImpl implements NowDataService {
data.setRunState(strState); data.setRunState(strState);
nowDataMapper.saveNowData(data); nowDataMapper.saveNowData(data);
} }
nowDataMapper.updateRunState(buildingId, pumpId, strState); nowDataMapper.updateRunState(buildingId,pumpId,strState);
} }
@Override @Override
public void proPumpMinutes(String buildingId, String pumpId, String runState) { public void proPumpMinutes(String buildingId, String pumpId, String runState) {
nowDataMapper.proPumpMinutes(buildingId, pumpId, runState); nowDataMapper.proPumpMinutes(buildingId,pumpId,runState);
} }
@Override @Override
public List<PumpMinutesEntity> pumpMinutes(String startDate, String endDate, String buildingId, String pumpId, int page, int limit) { public List<PumpMinutesEntity> pumpMinutes(String startDate,String endDate, String buildingId, String pumpId, int page, int limit) {
return nowDataMapper.pumpMinutes(startDate, endDate, buildingId, pumpId, page, limit); return nowDataMapper.pumpMinutes(startDate,endDate,buildingId,pumpId,page,limit);
} }
@Override @Override
public int pumpMinutesCount(String startDate, String endDate, String buildingId, String pumpId) { public int pumpMinutesCount(String startDate,String endDate, String buildingId, String pumpId) {
return nowDataMapper.pumpMinutesCount(startDate, endDate, buildingId, pumpId); return nowDataMapper.pumpMinutesCount(startDate,endDate,buildingId,pumpId);
} }
@Override @Override

24
user-service/src/main/java/com/mh/user/service/impl/NowPublicDataServiceImpl.java

@ -1,11 +1,11 @@
package com.mh.user.service.impl; package com.mh.user.service.impl;
import com.mh.common.utils.StringUtils;
import com.mh.user.constants.Constant; import com.mh.user.constants.Constant;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.entity.NowPublicDataEntity; import com.mh.user.entity.NowPublicDataEntity;
import com.mh.user.mapper.*; import com.mh.user.mapper.BuildingMapper;
import com.mh.user.mapper.DeviceInstallMapper;
import com.mh.user.mapper.NowDataMapper;
import com.mh.user.mapper.NowPublicDataMapper;
import com.mh.user.model.TempModel; import com.mh.user.model.TempModel;
import com.mh.user.service.DealDataService; import com.mh.user.service.DealDataService;
import com.mh.user.service.NowPublicDataService; import com.mh.user.service.NowPublicDataService;
@ -14,8 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -41,8 +39,6 @@ public class NowPublicDataServiceImpl implements NowPublicDataService {
@Autowired @Autowired
private DealDataService dealDataService; private DealDataService dealDataService;
@Autowired
private CollectionParamsManageMapper collectionParamsManageMapper;
@Override @Override
public void saveNowPublicData(NowPublicDataEntity nowPublicDataEntity) { public void saveNowPublicData(NowPublicDataEntity nowPublicDataEntity) {
nowPublicDataMapper.saveNowPublicData(nowPublicDataEntity); nowPublicDataMapper.saveNowPublicData(nowPublicDataEntity);
@ -58,18 +54,6 @@ public class NowPublicDataServiceImpl implements NowPublicDataService {
NowPublicDataEntity nowPublicDataEntity = nowPublicDataMapper.queryNowPublicData(buildingId); NowPublicDataEntity nowPublicDataEntity = nowPublicDataMapper.queryNowPublicData(buildingId);
String maxTemp = nowDataMapper.selectMaxTemp(buildingId, null); String maxTemp = nowDataMapper.selectMaxTemp(buildingId, null);
nowPublicDataEntity.setUseWaterTemp(maxTemp); nowPublicDataEntity.setUseWaterTemp(maxTemp);
// 查询当前压力
List<DeviceInstallEntity> pumpList = deviceInstallMapper.selectOfflineDevice(buildingId, "系统");
for (DeviceInstallEntity pump : pumpList) {
CollectionParamsManageEntity pressure = collectionParamsManageMapper.selectByDeviceIdAndParamTypeId(pump.getId(), "5");
if (pressure != null) {
String pressureValue = pressure.getCurValue().setScale(1, RoundingMode.HALF_UP).toString();
if (!StringUtils.isBlank(pressureValue)) {
nowPublicDataEntity.setPressure(pressureValue);
break;
}
}
}
return nowPublicDataEntity; return nowPublicDataEntity;
} }

22
user-service/src/main/java/com/mh/user/service/mqtt/config/MqttConfig.java

@ -5,7 +5,6 @@ import com.mh.user.constants.MqttProtocolEnum;
import com.mh.user.constants.MqttUseEnum; import com.mh.user.constants.MqttUseEnum;
import lombok.Data; import lombok.Data;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -29,21 +28,10 @@ public class MqttConfig {
private static Map<MqttUseEnum, MqttClientOptions> mqttSpring; private static Map<MqttUseEnum, MqttClientOptions> mqttSpring;
// 添加MQTT启用开关
private boolean mqttEnabled = false;
public void setMqttSpring(Map<MqttUseEnum, MqttClientOptions> mqtt) { public void setMqttSpring(Map<MqttUseEnum, MqttClientOptions> mqtt) {
MqttConfig.mqttSpring = mqtt; MqttConfig.mqttSpring = mqtt;
} }
public boolean isMqttEnabled() {
return mqttEnabled;
}
public void setMqttEnabled(boolean mqttEnabled) {
this.mqttEnabled = mqttEnabled;
}
/** /**
* 获取mqtt基本配置 * 获取mqtt基本配置
* @return * @return
@ -82,8 +70,8 @@ public class MqttConfig {
* @return * @return
*/ */
@Bean @Bean
@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true", matchIfMissing = false)
public MqttConnectOptions mqttConnectionOptions() { public MqttConnectOptions mqttConnectionOptions() {
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
MqttClientOptions customizeOptions = getBasicMqttClientOptions(); MqttClientOptions customizeOptions = getBasicMqttClientOptions();
@ -93,19 +81,19 @@ public class MqttConfig {
customizeOptions.getUsername() : ""); customizeOptions.getUsername() : "");
mqttConnectOptions.setPassword(StringUtils.hasText(customizeOptions.getPassword()) ? mqttConnectOptions.setPassword(StringUtils.hasText(customizeOptions.getPassword()) ?
customizeOptions.getPassword().toCharArray() : new char[0]); customizeOptions.getPassword().toCharArray() : new char[0]);
// 设置为手动连接 // 直接进行自动连接
mqttConnectOptions.setAutomaticReconnect(true); mqttConnectOptions.setAutomaticReconnect(true);
mqttConnectOptions.setKeepAliveInterval(30); // 30秒保活 // 时间间隔时间10s
mqttConnectOptions.setKeepAliveInterval(10);
return mqttConnectOptions; return mqttConnectOptions;
} }
@Bean @Bean
@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true", matchIfMissing = false)
public MqttPahoClientFactory mqttClientFactory() { public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(mqttConnectionOptions()); factory.setConnectionOptions(mqttConnectionOptions());
return factory; return factory;
} }
}
}

47
user-service/src/main/java/com/mh/user/service/mqtt/config/MqttInboundConfig.java

@ -4,7 +4,6 @@ import com.mh.user.constants.ChannelName;
import com.mh.user.constants.MqttClientOptions; import com.mh.user.constants.MqttClientOptions;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.IntegrationComponentScan; import org.springframework.integration.annotation.IntegrationComponentScan;
@ -29,7 +28,6 @@ import javax.annotation.Resource;
@Slf4j @Slf4j
@Configuration @Configuration
@IntegrationComponentScan @IntegrationComponentScan
@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true", matchIfMissing = false)
public class MqttInboundConfig { public class MqttInboundConfig {
@Autowired @Autowired
@ -40,8 +38,6 @@ public class MqttInboundConfig {
private String clientId; private String clientId;
private MqttPahoMessageDrivenChannelAdapter adapter;
/** /**
* 入站适配器 * 入站适配器
* @return * @return
@ -49,48 +45,29 @@ public class MqttInboundConfig {
@Bean(name = "adapter") @Bean(name = "adapter")
public MessageProducerSupport mqttInbound() { public MessageProducerSupport mqttInbound() {
MqttClientOptions options = MqttConfig.getBasicMqttClientOptions(); MqttClientOptions options = MqttConfig.getBasicMqttClientOptions();
// 此处初始化的时候,默认订阅了配置文件中已经写好的topic
// 如果需要订阅多个,可以自己手动订阅,会写一个addTopic()进行添加订阅
clientId = options.getClientId() + "_consumer_" + System.currentTimeMillis(); clientId = options.getClientId() + "_consumer_" + System.currentTimeMillis();
adapter = new MqttPahoMessageDrivenChannelAdapter( MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(
clientId, clientId,
mqttClientFactory, mqttClientFactory,
options.getInboundTopic().split(",")); options.getInboundTopic().split(","));
// System.out.println("每一次都会入站适配器吗?"+clientId);
DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter(); DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
// 统一是字节处理
converter.setPayloadAsBytes(true); converter.setPayloadAsBytes(true);
// 设置消息转换器
adapter.setConverter(converter); adapter.setConverter(converter);
// 设置qos(quality of service)
// 0:最多一次传输(消息会丢失),
// 1:至少一次传输(消息会重复),
// 2:只有当消息发送成功时才确认(消息不回丢,但延迟高)。
adapter.setQos(0); adapter.setQos(0);
// 设置在接收已经订阅的主题信息后,发送给哪个通道,具体的发送方法需要翻上层的抽象类
adapter.setOutputChannel(inboundChannel); adapter.setOutputChannel(inboundChannel);
return adapter; return adapter;
} }
/**
* 手动启动MQTT连接
*/
public void startMqtt() {
if (adapter != null && !adapter.isRunning()) {
adapter.start();
log.info("MQTT入站适配器已启动");
}
}
/**
* 手动停止MQTT连接
*/
public void stopMqtt() {
if (adapter != null && adapter.isRunning()) {
adapter.stop();
log.info("MQTT入站适配器已停止");
}
}
/**
* 检查MQTT连接状态
* @return
*/
public boolean isMqttRunning() {
return adapter != null && adapter.isRunning();
}
/** /**
* 默认声明一个消息处理器用于处理无效的消息 * 默认声明一个消息处理器用于处理无效的消息
* @return * @return
@ -110,5 +87,5 @@ public class MqttInboundConfig {
public String getClientId() { public String getClientId() {
return clientId; return clientId;
} }
}
}

26
user-service/src/main/java/com/mh/user/service/mqtt/config/MqttOutboundConfig.java

@ -3,7 +3,6 @@ package com.mh.user.service.mqtt.config;
import com.mh.user.constants.ChannelName; import com.mh.user.constants.ChannelName;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.IntegrationComponentScan; import org.springframework.integration.annotation.IntegrationComponentScan;
@ -23,14 +22,11 @@ import org.springframework.messaging.MessageHandler;
@Slf4j @Slf4j
@Configuration @Configuration
@IntegrationComponentScan @IntegrationComponentScan
@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true", matchIfMissing = false)
public class MqttOutboundConfig { public class MqttOutboundConfig {
@Autowired @Autowired
private MqttPahoClientFactory mqttClientFactory; private MqttPahoClientFactory mqttClientFactory;
private MqttPahoMessageHandler messageHandler;
/** /**
* 默认声明一个出站处理器用于处理无效的消息 * 默认声明一个出站处理器用于处理无效的消息
* @return * @return
@ -38,10 +34,11 @@ public class MqttOutboundConfig {
@Bean @Bean
@ServiceActivator(inputChannel = ChannelName.OUTBOUND) @ServiceActivator(inputChannel = ChannelName.OUTBOUND)
public MessageHandler mqttOutbound() { public MessageHandler mqttOutbound() {
messageHandler = new MqttPahoMessageHandler( MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(
MqttConfig.getBasicMqttClientOptions().getClientId() + "_producer_" + System.currentTimeMillis(), MqttConfig.getBasicMqttClientOptions().getClientId() + "_producer_" + System.currentTimeMillis(),
mqttClientFactory); mqttClientFactory);
DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter(); DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
// use byte types uniformly
converter.setPayloadAsBytes(true); converter.setPayloadAsBytes(true);
messageHandler.setAsync(true); messageHandler.setAsync(true);
@ -50,24 +47,5 @@ public class MqttOutboundConfig {
return messageHandler; return messageHandler;
} }
/**
* 手动启动MQTT出站连接
*/
public void startMqtt() {
if (messageHandler != null) {
// 出站处理器通常不需要显式启动
log.info("MQTT出站处理器已准备就绪");
}
}
/**
* 手动停止MQTT出站连接
*/
public void stopMqtt() {
if (messageHandler != null) {
// 出站处理器通常不需要显式停止
log.info("MQTT出站处理器已停止");
}
}
} }

17
user-service/src/main/java/com/mh/user/service/mqtt/service/IMqttManagerService.java

@ -1,17 +0,0 @@
package com.mh.user.service.mqtt.service;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description mqtt启动停止管理接口
* @date 2025-12-19 13:59:13
*/
public interface IMqttManagerService {
void startMqtt();
void stopMqtt();
boolean isMqttRunning();
}

644
user-service/src/main/java/com/mh/user/service/mqtt/service/impl/EventsServiceImpl.java

@ -1,45 +1,19 @@
package com.mh.user.service.mqtt.service.impl; package com.mh.user.service.mqtt.service.impl;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.benmanes.caffeine.cache.Cache;
import com.mh.common.utils.StringUtils;
import com.mh.user.constants.ChannelName; import com.mh.user.constants.ChannelName;
import com.mh.user.constants.Constant;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.factory.Device;
import com.mh.user.factory.DeviceFactory;
import com.mh.user.model.SanShiFengDatas;
import com.mh.user.model.SanShiFengReceiver; import com.mh.user.model.SanShiFengReceiver;
import com.mh.user.service.CollectionParamsManageService;
import com.mh.user.service.DeviceInstallService;
import com.mh.user.service.GatewayManageService;
import com.mh.user.service.mqtt.service.IEventsService; import com.mh.user.service.mqtt.service.IEventsService;
import com.mh.user.strategy.DeviceStrategy;
import com.mh.user.strategy.DeviceStrategyFactory;
import com.mh.user.utils.DateUtil;
import io.netty.util.CharsetUtil; import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.MessageHeaders;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
/** /**
* @author LJF * @author LJF
@ -53,142 +27,8 @@ import java.util.concurrent.atomic.AtomicInteger;
public class EventsServiceImpl implements IEventsService { public class EventsServiceImpl implements IEventsService {
@Autowired @Autowired
@Qualifier("customObjectMapper")
private ObjectMapper mapper; private ObjectMapper mapper;
@Autowired
private GatewayManageService gatewayManageService;
@Autowired
private CollectionParamsManageService collectionParamManageService;
@Autowired
private DeviceInstallService deviceInstallService;
@Autowired
@Qualifier("caffeineCache")
private Cache caffeineCache;
// 常量定义
private static final int BATCH_SIZE = 100;
private static final long TIME_INTERVAL_THRESHOLD_MS = 150000; // 150秒
// 线程池配置
private static final int CORE_POOL_SIZE = 3;
private static final int MAX_POOL_SIZE = 5;
private static final int QUEUE_CAPACITY = 100;
private static final long KEEP_ALIVE_TIME = 30L;
// 缓存配置
private static final int TIME_CACHE_MAX_SIZE = 1000;
private static final int TIME_CACHE_EXPIRE_MINUTES = 30;
private static final int DEVICE_CACHE_MAX_SIZE = 500;
private static final int DEVICE_CACHE_EXPIRE_MINUTES = 60;
// 线程池
private ExecutorService deviceAnalysisExecutor;
// 本地缓存,使用带过期时间的缓存
private final ConcurrentHashMap<String, Long> timeCache = new ConcurrentHashMap<>();
// 设备缓存,避免频繁查询数据库
private final ConcurrentHashMap<Long, CachedDeviceInfo> deviceCache = new ConcurrentHashMap<>();
// Device和Strategy实例缓存
private final ConcurrentHashMap<String, Device> deviceInstanceCache = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, DeviceStrategy> strategyInstanceCache = new ConcurrentHashMap<>();
// 缓存的设备信息
private static class CachedDeviceInfo {
DeviceInstallEntity device;
long timestamp;
CachedDeviceInfo(DeviceInstallEntity device) {
this.device = device;
this.timestamp = System.currentTimeMillis();
}
boolean isExpired() {
return System.currentTimeMillis() - timestamp > TimeUnit.MINUTES.toMillis(DEVICE_CACHE_EXPIRE_MINUTES);
}
}
@PostConstruct
public void init() {
// 初始化线程池
deviceAnalysisExecutor = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAX_POOL_SIZE,
KEEP_ALIVE_TIME,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(QUEUE_CAPACITY),
new ThreadFactory() {
private final AtomicInteger threadNumber = new AtomicInteger(1);
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "device-analysis-thread-" + threadNumber.getAndIncrement());
}
},
new ThreadPoolExecutor.CallerRunsPolicy() // 改为CallerRuns,防止任务丢失
);
// 启动缓存清理定时任务
ScheduledExecutorService cleanupExecutor = Executors.newSingleThreadScheduledExecutor(r ->
new Thread(r, "cache-cleanup-thread"));
cleanupExecutor.scheduleAtFixedRate(this::cleanupCaches, 5, 5, TimeUnit.MINUTES);
log.info("EventsServiceImpl initialized, thread pool: core={}, max={}, queue={}",
CORE_POOL_SIZE, MAX_POOL_SIZE, QUEUE_CAPACITY);
}
@PreDestroy
public void destroy() {
if (deviceAnalysisExecutor != null && !deviceAnalysisExecutor.isShutdown()) {
deviceAnalysisExecutor.shutdown();
try {
if (!deviceAnalysisExecutor.awaitTermination(30, TimeUnit.SECONDS)) {
deviceAnalysisExecutor.shutdownNow();
}
} catch (InterruptedException e) {
deviceAnalysisExecutor.shutdownNow();
Thread.currentThread().interrupt();
}
log.info("EventsServiceImpl destroyed, thread pool shutdown");
}
clearAllCaches();
}
/**
* 清理过期缓存
*/
private void cleanupCaches() {
try {
long now = System.currentTimeMillis();
long expireTime = TimeUnit.MINUTES.toMillis(TIME_CACHE_EXPIRE_MINUTES);
// 清理timeCache过期条目
timeCache.entrySet().removeIf(entry -> now - entry.getValue() > expireTime);
// 清理deviceCache过期条目
deviceCache.entrySet().removeIf(entry -> entry.getValue().isExpired());
log.debug("缓存清理完成, timeCache.size={}, deviceCache.size={}",
timeCache.size(), deviceCache.size());
} catch (Exception e) {
log.error("清理缓存失败", e);
}
}
/**
* 清空所有缓存
*/
private void clearAllCaches() {
timeCache.clear();
deviceCache.clear();
deviceInstanceCache.clear();
strategyInstanceCache.clear();
}
@ServiceActivator(inputChannel = ChannelName.EVENTS_UPLOAD_INBOUND) @ServiceActivator(inputChannel = ChannelName.EVENTS_UPLOAD_INBOUND)
@Override @Override
public void handleInboundUpload(byte[] receiver, MessageHeaders headers) { public void handleInboundUpload(byte[] receiver, MessageHeaders headers) {
@ -220,490 +60,16 @@ public class EventsServiceImpl implements IEventsService {
log.info("接收到控制指令下发=>{}", sendStr); log.info("接收到控制指令下发=>{}", sendStr);
} }
private void handleInboundData(byte[] receiver, String topic, String logMessage) { private void handleInboundData(byte[] receiver,String topic, String logMessage) {
try { try {
// 使用 TypeReference 确保泛型信息被保留 SanShiFengReceiver commonTopicReceiver = new SanShiFengReceiver();
SanShiFengReceiver<SanShiFengDatas> datas = mapper.readValue(receiver, commonTopicReceiver = mapper.readValue(receiver, SanShiFengReceiver.class);
new TypeReference<SanShiFengReceiver<SanShiFengDatas>>() {}); log.info("主题:{},类型:{}: ,数据:{}", topic, logMessage, commonTopicReceiver.toString());
// log.info("主题:{},类型:{}: ,数据:{}", topic, logMessage, datas.toString()); // 不使用消息队列,查询属于哪种设备类型,然后通过策略进行数据解析
// 开始遍历 数据
String sn = datas.getSn();
String plcName = datas.getPlcName();
String projectName = datas.getProjectName();
String time = datas.getTime();
// 更新网关设备在线状态
gatewayManageService.updateGatewayManageOnlineBySn(sn, 0);
// 获取网关对应的buildingId
String buildingId = gatewayManageService.queryBuildingIdBySn(sn);
if (StringUtils.isBlank(buildingId)) {
log.error("未找到对应的buildingId, SN: {}", sn);
return;
}
// 获取数据列表
List<SanShiFengDatas> rawDataList = datas.getDatas();
if (rawDataList == null || rawDataList.isEmpty()) {
log.warn("数据列表为空,SN: {}", sn);
return;
}
// 批量更新collectionParams
processBatchUpdate(rawDataList, sn, plcName, projectName, time, buildingId);
// 检查时间间隔并处理数据
if (shouldProcessData(sn, time)) {
processDataList(rawDataList, sn, plcName, projectName, time, buildingId);
}
} catch (IOException e) { } catch (IOException e) {
log.error("处理数据时发生错误: ", e); log.error("处理数据时发生错误: ", e);
} }
} }
/**
* 批量更新collectionParams
*/
private void processBatchUpdate(List<SanShiFengDatas> rawDataList,
String sn,
String plcName,
String projectName,
String time,
String buildingId) {
try {
int size = rawDataList.size();
for (int i = 0; i < size; i += BATCH_SIZE) {
int endIndex = Math.min(i + BATCH_SIZE, size);
List<SanShiFengDatas> batch = rawDataList.subList(i, endIndex);
collectionParamManageService.getBatchUpdateCollectionParams(batch, sn, plcName, projectName, time, buildingId);
}
} catch (Exception e) {
log.error("批量更新collectionParams失败: SN={}", sn, e);
}
}
/**
* 判断是否应该处理数据基于时间间隔
*/
private boolean shouldProcessData(String sn, String time) {
if (StringUtils.isBlank(sn) || StringUtils.isBlank(time)) {
return false;
}
String cacheKey = sn + "_time";
Long lastTimestamp = timeCache.get(cacheKey);
if (lastTimestamp == null) {
timeCache.put(cacheKey, DateUtil.getTimeStamp(time));
return false;
}
try {
long currentTimeStamp = DateUtil.getTimeStamp(time);
long timeDiff = Math.abs(currentTimeStamp - lastTimestamp);
if (timeDiff >= TIME_INTERVAL_THRESHOLD_MS) {
timeCache.put(cacheKey, currentTimeStamp);
return true;
}
} catch (Exception e) {
log.error("计算时间间隔失败: SN={}, time={}", sn, time, e);
}
return false;
}
/**
* 处理数据列表修复CountDownLatch泄露问题
*/
private void processDataList(List<SanShiFengDatas> rawDataList,
String sn,
String plcName,
String projectName,
String time,
String buildingId) {
if (rawDataList == null || rawDataList.isEmpty()) {
return;
}
// 限制并发数,避免一次性创建过多任务
int size = rawDataList.size();
int maxConcurrent = Math.min(size, MAX_POOL_SIZE * 2);
CountDownLatch latch = new CountDownLatch(size);
AtomicInteger successCount = new AtomicInteger(0);
AtomicInteger failCount = new AtomicInteger(0);
// 使用信号量控制并发数
Semaphore semaphore = new Semaphore(maxConcurrent);
for (int i = 0; i < size; i++) {
final int index = i;
final SanShiFengDatas data = rawDataList.get(i);
// 提交任务
submitTaskWithFallback(() -> {
try {
semaphore.acquire();
try {
processDataItem(data, sn, plcName, projectName, time, buildingId);
successCount.incrementAndGet();
} catch (Exception e) {
log.error("处理数据项失败: index={}", index, e);
failCount.incrementAndGet();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.error("任务被中断: index={}", index, e);
} finally {
semaphore.release();
latch.countDown(); // 确保countDown一定会执行
}
});
}
// 等待所有任务完成
try {
latch.await(30, TimeUnit.SECONDS);
if (latch.getCount() > 0) {
log.warn("部分任务未在指定时间内完成, remaining={}, success={}, fail={}",
latch.getCount(), successCount.get(), failCount.get());
}
} catch (InterruptedException e) {
log.warn("等待数据处理完成被中断");
Thread.currentThread().interrupt();
}
}
/**
* 提交任务失败时直接在当前线程执行
*/
private void submitTaskWithFallback(Runnable task) {
try {
// 尝试提交到线程池
if (!deviceAnalysisExecutor.isShutdown()) {
deviceAnalysisExecutor.submit(task);
return;
}
} catch (RejectedExecutionException | IllegalStateException e) {
log.warn("任务提交失败,降级到当前线程执行");
}
// 降级:在当前线程执行
task.run();
}
private void processDataUpdateCpmItem(SanShiFengDatas data, String sn, String plcName, String projectName, String time, String buildingId) {
if (data == null) {
log.warn("数据为null,跳过处理");
return;
}
String name = data.getName();
if (StringUtils.isBlank(name)) {
log.warn("点位名称为空,跳过处理");
return;
}
BigDecimal value = data.getValue();
if (value == null) {
value = BigDecimal.ZERO;
}
try {
collectionParamManageService.updateCPMByOtherName(name, value, time, buildingId);
} catch (Exception e) {
log.error("更新collectionParamManage失败: name={}, value={}", name, value, e);
}
}
private void processDataItem(SanShiFengDatas data, String sn, String plcName, String projectName, String time, String buildingId) {
if (data == null) {
log.warn("数据为null,跳过处理");
return;
}
// 获取点位参数名称和值
String name = data.getName();
if (StringUtils.isBlank(name)) {
log.warn("点位名称为空,跳过处理");
return;
}
BigDecimal value = data.getValue();
if (value == null) {
value = BigDecimal.ZERO;
}
try {
// 获取collectionParams缓存,使用带过期时间的本地缓存
List<CollectionParamsManageEntity> collectionParams = getCollectionParamsCache();
if (collectionParams == null || collectionParams.isEmpty()) {
log.debug("collectionParams缓存为空");
return;
}
// 查找匹配的参数实体
CollectionParamsManageEntity collectionParamsManageEntity = findMatchingCollectionParams(collectionParams, name, buildingId);
if (collectionParamsManageEntity == null) {
return;
}
// 检查参数类型,过滤不需要处理的类型
if (!shouldProcessParamType(collectionParamsManageEntity.getParamTypeId())) {
return;
}
// 查询设备信息并处理
processDeviceData(collectionParamsManageEntity, time, value);
} catch (Exception e) {
log.error("处理数据项失败: name={}, value={}", name, value, e);
}
}
/**
* 获取collectionParams缓存
*/
private List<CollectionParamsManageEntity> getCollectionParamsCache() {
try {
// 优先使用caffeine缓存
List<CollectionParamsManageEntity> cachedParams = (List<CollectionParamsManageEntity>) caffeineCache.getIfPresent("collectionParams");
if (cachedParams != null) {
return cachedParams;
}
// 从数据库加载
List<CollectionParamsManageEntity> collectionParams = collectionParamManageService.selectAllCPMList();
if (collectionParams != null) {
// 放入caffeine缓存
caffeineCache.put("collectionParams", collectionParams);
log.info("collectionParams已加载到缓存,共{}条记录", collectionParams.size());
}
return collectionParams;
} catch (Exception e) {
log.error("获取collectionParams缓存失败", e);
return null;
}
}
/**
* 查找匹配的collectionParams
*/
private CollectionParamsManageEntity findMatchingCollectionParams(List<CollectionParamsManageEntity> collectionParams,
String name,
String buildingId) {
if (collectionParams == null || StringUtils.isBlank(name) || StringUtils.isBlank(buildingId)) {
return null;
}
try {
for (CollectionParamsManageEntity val : collectionParams) {
if (val == null) {
continue;
}
String otherName = val.getOtherName();
if (otherName != null && otherName.trim().equals(name.trim())) {
Object bidObj = val.getBuildingId();
if (bidObj != null && bidObj.toString().equals(buildingId)) {
return val;
}
}
}
} catch (Exception e) {
log.error("查找collectionParams失败: name={}, buildingId={}", name, buildingId, e);
}
return null;
}
/**
* 判断参数类型是否需要处理
*/
private boolean shouldProcessParamType(int paramTypeId) {
// 不需要处理的参数类型
int[] excludedTypes = {0, 3, 4, 15, 16, 17, 18, 19, 21, 22, 23, 24};
for (int excluded : excludedTypes) {
if (paramTypeId == excluded) {
return false;
}
}
return true;
}
/**
* 处理设备数据优化使用缓存减少数据库查询和对象创建
*/
private void processDeviceData(CollectionParamsManageEntity collectionParamsManageEntity,
String time,
BigDecimal value) {
if (collectionParamsManageEntity == null ||
collectionParamsManageEntity.getDeviceInstallId() == null) {
return;
}
Long deviceInstallId = collectionParamsManageEntity.getDeviceInstallId();
try {
// 从缓存获取设备信息
DeviceInstallEntity deviceInstallEntity = getDeviceFromCache(deviceInstallId);
if (deviceInstallEntity == null) {
log.warn("设备信息不存在: deviceInstallId={}", deviceInstallId);
return;
}
String deviceType = deviceInstallEntity.getDeviceType();
if (StringUtils.isBlank(deviceType)) {
log.warn("设备类型为空: deviceInstallId={}", deviceInstallEntity.getId());
return;
}
// 从缓存获取Device和Strategy实例
Device device = getDeviceInstance(deviceType);
DeviceStrategy strategy = getStrategyInstance(deviceType);
if (device == null || strategy == null) {
log.warn("创建设备或策略失败: deviceType={}", deviceType);
return;
}
// 执行分析
device.setStrategy(strategy);
device.analysisMQTTReceiveData(
time,
deviceInstallEntity.getDeviceAddr(),
value.toPlainString(),
Constant.READ,
deviceInstallEntity,
collectionParamsManageEntity);
} catch (Exception e) {
log.error("处理设备数据失败: time={}, value={}", time, value, e);
}
}
/**
* 从缓存获取设备信息
*/
private DeviceInstallEntity getDeviceFromCache(Long deviceInstallId) {
if (deviceInstallId == null) {
return null;
}
// 先从缓存获取
CachedDeviceInfo cachedInfo = deviceCache.get(deviceInstallId);
if (cachedInfo != null && !cachedInfo.isExpired()) {
return cachedInfo.device;
}
// 缓存未命中或已过期,从数据库加载
try {
DeviceInstallEntity device = deviceInstallService.selectDeviceById(deviceInstallId);
if (device != null) {
deviceCache.put(deviceInstallId, new CachedDeviceInfo(device));
}
return device;
} catch (Exception e) {
log.error("查询设备信息失败: deviceInstallId={}", deviceInstallId, e);
return null;
}
}
/**
* 获取Device实例使用缓存
*/
private Device getDeviceInstance(String deviceType) {
return deviceInstanceCache.computeIfAbsent(deviceType, type -> {
try {
return DeviceFactory.createDevice(type);
} catch (Exception e) {
log.error("创建Device实例失败: deviceType={}", type, e);
return null;
}
});
}
/**
* 获取DeviceStrategy实例使用缓存
*/
private DeviceStrategy getStrategyInstance(String deviceType) {
return strategyInstanceCache.computeIfAbsent(deviceType, type -> {
try {
return DeviceStrategyFactory.createStrategy(type);
} catch (Exception e) {
log.error("创建DeviceStrategy实例失败: deviceType={}", type, e);
return null;
}
});
}
private SanShiFengDatas convertDataItem(Object rawData) {
if (rawData == null) {
return null;
}
try {
if (rawData instanceof SanShiFengDatas) {
return (SanShiFengDatas) rawData;
} else if (rawData instanceof HashMap) {
JSONObject jsonObject = new JSONObject((HashMap<?, ?>) rawData);
return jsonObject.to(SanShiFengDatas.class);
} else {
log.warn("不支持的数据类型: {}", rawData.getClass().getName());
return null;
}
} catch (Exception e) {
log.error("数据转换异常", e);
// 尝试恢复至少name字段
String name = getJsonValueAsString(rawData, "name");
if (!StringUtils.isBlank(name)) {
SanShiFengDatas data = new SanShiFengDatas();
data.setName(name);
data.setValue(BigDecimal.ZERO);
return data;
}
return null;
}
}
/**
* 从原始数据对象中获取指定键的字符串值
*
* @param rawData 原始数据对象通常为Map类型
* @param key 要获取的键名
* @return 键对应的字符串值如果不存在或转换失败则返回null
*/
private String getJsonValueAsString(Object rawData, String key) {
if (rawData == null || StringUtils.isBlank(key)) {
return null;
}
try {
if (rawData instanceof HashMap) {
HashMap<?, ?> map = (HashMap<?, ?>) rawData;
Object value = map.get(key);
return value != null ? String.valueOf(value) : null;
} else if (rawData instanceof JSONObject) {
JSONObject jsonObject = (JSONObject) rawData;
return jsonObject.getString(key);
} else {
log.warn("不支持的数据类型: {}", rawData.getClass().getName());
return null;
}
} catch (Exception e) {
log.error("获取JSON值时发生异常,key: {}", key, e);
return null;
}
}
} }

64
user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttManagerServiceImpl.java

@ -1,64 +0,0 @@
package com.mh.user.service.mqtt.service.impl;
import com.mh.user.service.mqtt.config.MqttInboundConfig;
import com.mh.user.service.mqtt.config.MqttOutboundConfig;
import com.mh.user.service.mqtt.service.IMqttManagerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
/**
* @author LJF
* @version 1.0
* @project CHWS
* @description 管理mqtt启动和关闭
* @date 2025-12-19 13:57:41
*/
@Slf4j
@Service
@ConditionalOnProperty(name = "mqtt.enabled", havingValue = "true", matchIfMissing = false)
public class MqttManagerServiceImpl implements IMqttManagerService {
@Autowired
private MqttInboundConfig mqttInboundConfig;
@Autowired
private MqttOutboundConfig mqttOutboundConfig;
/**
* 启动MQTT连接
*/
@Override
public void startMqtt() {
try {
mqttInboundConfig.startMqtt();
mqttOutboundConfig.startMqtt();
} catch (Exception e) {
log.error("启动MQTT连接失败", e);
}
}
/**
* 停止MQTT连接
*/
@Override
public void stopMqtt() {
try {
mqttInboundConfig.stopMqtt();
mqttOutboundConfig.stopMqtt();
} catch (Exception e) {
log.error("停止MQTT连接失败", e);
}
}
/**
* 检查MQTT连接状态
* @return
*/
@Override
public boolean isMqttRunning() {
return mqttInboundConfig.isMqttRunning();
}
}

16
user-service/src/main/java/com/mh/user/service/mqtt/service/impl/MqttTopicServiceImpl.java

@ -1,12 +1,10 @@
package com.mh.user.service.mqtt.service.impl; package com.mh.user.service.mqtt.service.impl;
import com.mh.user.service.mqtt.service.IMqttTopicService; import com.mh.framework.mqtt.service.IMqttTopicService;
import org.springframework.beans.factory.annotation.Autowired; import jakarta.annotation.Resource;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter; import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/** /**
* @author LJF * @author LJF
* @version 1.0 * @version 1.0
@ -18,35 +16,25 @@ import javax.annotation.Resource;
public class MqttTopicServiceImpl implements IMqttTopicService { public class MqttTopicServiceImpl implements IMqttTopicService {
@Resource @Resource
@Autowired(required = false)
private MqttPahoMessageDrivenChannelAdapter adapter; private MqttPahoMessageDrivenChannelAdapter adapter;
@Override @Override
public void subscribe(String topic) { public void subscribe(String topic) {
if (adapter != null) {
adapter.addTopic(topic); adapter.addTopic(topic);
} }
}
@Override @Override
public void subscribe(String topic, int qos) { public void subscribe(String topic, int qos) {
if (adapter != null) {
adapter.addTopic(topic, qos); adapter.addTopic(topic, qos);
} }
}
@Override @Override
public void unsubscribe(String topic) { public void unsubscribe(String topic) {
if (adapter != null) {
adapter.removeTopic(topic); adapter.removeTopic(topic);
} }
}
@Override @Override
public String[] getSubscribedTopics() { public String[] getSubscribedTopics() {
if (adapter != null) {
return adapter.getTopic(); return adapter.getTopic();
} }
return new String[0];
}
} }

4
user-service/src/main/java/com/mh/user/strategy/BackTempControlStrategy.java

@ -1,7 +1,6 @@
package com.mh.user.strategy; package com.mh.user.strategy;
import com.mh.user.constants.Constant; import com.mh.user.constants.Constant;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity; import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.entity.NowPublicDataEntity; import com.mh.user.entity.NowPublicDataEntity;
@ -108,8 +107,7 @@ public class BackTempControlStrategy implements DeviceStrategy {
String registerAddr, String registerAddr,
String dataStr, String dataStr,
String operateType, String operateType,
DeviceInstallEntity deviceInstallEntity, DeviceInstallEntity deviceInstallEntity) {
CollectionParamsManageEntity collectionParamsManageEntity) {
String result = Constant.FAIL; String result = Constant.FAIL;
if (Integer.parseInt(dataStr) < 0) { if (Integer.parseInt(dataStr) < 0) {
log.info("回水温控报文检验失败: " + dataStr); log.info("回水温控报文检验失败: " + dataStr);

4
user-service/src/main/java/com/mh/user/strategy/DeviceStrategy.java

@ -1,6 +1,5 @@
package com.mh.user.strategy; package com.mh.user.strategy;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity; import com.mh.user.entity.DeviceInstallEntity;
@ -33,6 +32,5 @@ public interface DeviceStrategy {
String registerAddr, String registerAddr,
String dataStr, String dataStr,
String operateType, String operateType,
DeviceInstallEntity deviceInstallEntity, DeviceInstallEntity deviceInstallEntity);
CollectionParamsManageEntity collectionParamsManageEntity);
} }

41
user-service/src/main/java/com/mh/user/strategy/EleMeterStrategy.java

@ -2,7 +2,6 @@ package com.mh.user.strategy;
import com.mh.common.utils.StringUtils; import com.mh.common.utils.StringUtils;
import com.mh.user.constants.Constant; import com.mh.user.constants.Constant;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DataResultEntity; import com.mh.user.entity.DataResultEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity; import com.mh.user.entity.DeviceInstallEntity;
@ -12,8 +11,6 @@ import com.mh.user.utils.SpringBeanUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date; import java.util.Date;
/** /**
@ -49,15 +46,22 @@ public class EleMeterStrategy implements DeviceStrategy {
String deviceAddr = deviceCodeParamEntity.getDeviceAddr(); String deviceAddr = deviceCodeParamEntity.getDeviceAddr();
if (deviceAddr != null && deviceAddr.length() > 0) { if (deviceAddr != null && deviceAddr.length() > 0) {
try { try {
// 增加一个判断,判断是否是广仪电表modbus协议 广仪MODBUS协议 // 增加一个判断,判断是否是广仪电表modbus协议
if ("广仪MODBUS协议".equals(deviceCodeParamEntity.getBrand()) || deviceCodeParamEntity.getBrand().contains("广仪MODBUS")) { if ("广仪MODBUS协议".equals(deviceCodeParamEntity.getBrand())) {
str = ExchangeStringUtil.decToHex(deviceAddr); str = ExchangeStringUtil.decToHex(deviceAddr);
str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位 str = ExchangeStringUtil.addZeroForNum(str, 2); //以0补位
// if(registerAddr.equals("")){
// str=str+"0300000002";
// }else if(registerAddr.equals("")){
// str=str+"0300000002";
// }
// String funCode = ExchangeStringUtil.addZeroForNum(deviceCodeParamEntity.getFunCode(), 2);
// if ("04".equals(funCode)) {
str = str + "04" + "00010002"; str = str + "04" + "00010002";
// }
String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验 String checkWord = ExchangeStringUtil.getStrCRC16(str); //CRC16校验
str = str + checkWord; str = str + checkWord;
return str.toUpperCase(); } if ("广仪07规约".equals(deviceCodeParamEntity.getBrand())) {
} else if ("广仪07规约".equals(deviceCodeParamEntity.getBrand())) {
//0代表前面补充0,12代表长度为12,d代表参数为正数型,基表通讯号 //0代表前面补充0,12代表长度为12,d代表参数为正数型,基表通讯号
str = String.format("%012d", Long.parseLong(deviceAddr)); str = String.format("%012d", Long.parseLong(deviceAddr));
//转换位置 //转换位置
@ -70,7 +74,6 @@ public class EleMeterStrategy implements DeviceStrategy {
//检验和 //检验和
String checkSum = ExchangeStringUtil.makeChecksum(str); String checkSum = ExchangeStringUtil.makeChecksum(str);
str = "FEFEFE" + str + checkSum + "16"; str = "FEFEFE" + str + checkSum + "16";
return str.toUpperCase();
} else { } else {
//0代表前面补充0,12代表长度为12,d代表参数为正数型,基表通讯号 //0代表前面补充0,12代表长度为12,d代表参数为正数型,基表通讯号
str = String.format("%012d", Long.parseLong(deviceAddr)); str = String.format("%012d", Long.parseLong(deviceAddr));
@ -157,32 +160,16 @@ public class EleMeterStrategy implements DeviceStrategy {
} }
@Override @Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity) {
CollectionParamsManageEntity collectionParamsManageEntity) {
String data = Constant.FAIL; String data = Constant.FAIL;
if ((new BigDecimal(dataStr)).compareTo(new BigDecimal(0)) < 0) { if (Integer.parseInt(dataStr) < 0) {
return data; return data;
} }
log.info("电表表号:{},电表读数:{}", deviceInstallEntity.getDeviceAddr(), dataStr);
// 考虑dataStr是否走大数或者走小数 // 考虑dataStr是否走大数或者走小数
// 获取保留的小数位
Integer digits = collectionParamsManageEntity.getDigits();
Integer grade = collectionParamsManageEntity.getGrade();
if (grade != 40) {
return data;
}
// dataStr保留小数位
// 10的n次方
BigDecimal power = BigDecimal.ONE.scaleByPowerOfTen(digits);
// dataStr判断是否是科学表示法,是则转换为普通表示法
dataStr = ExchangeStringUtil.isScientificNotation(dataStr);
BigDecimal originalValue = new BigDecimal(dataStr);
// 将数值按指定小数位数格式化
dataStr = originalValue.divide(power, 2, RoundingMode.HALF_UP).toString();
if (Double.parseDouble(dataStr)-deviceInstallEntity.getLastValue()>1000 || Double.parseDouble(dataStr)-deviceInstallEntity.getLastValue()<0) { if (Double.parseDouble(dataStr)-deviceInstallEntity.getLastValue()>1000 || Double.parseDouble(dataStr)-deviceInstallEntity.getLastValue()<0) {
dataStr = String.valueOf(deviceInstallEntity.getLastValue()); dataStr = String.valueOf(deviceInstallEntity.getLastValue());
} }
log.info("电表表号:{},电表读数:{}", deviceInstallEntity.getDeviceAddr(), dataStr);
try { try {
DataResultEntity dataResultEntity = new DataResultEntity(); DataResultEntity dataResultEntity = new DataResultEntity();
dataResultEntity.setDeviceAddr(deviceInstallEntity.getDeviceAddr());//通讯编号 dataResultEntity.setDeviceAddr(deviceInstallEntity.getDeviceAddr());//通讯编号

4
user-service/src/main/java/com/mh/user/strategy/HeatPumpStatusStrategy.java

@ -3,7 +3,6 @@ package com.mh.user.strategy;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.mh.common.utils.StringUtils; import com.mh.common.utils.StringUtils;
import com.mh.user.constants.Constant; import com.mh.user.constants.Constant;
import com.mh.user.entity.CollectionParamsManageEntity;
import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.DeviceCodeParamEntity;
import com.mh.user.entity.DeviceInstallEntity; import com.mh.user.entity.DeviceInstallEntity;
import com.mh.user.service.BuildingService; import com.mh.user.service.BuildingService;
@ -242,8 +241,7 @@ public class HeatPumpStatusStrategy implements DeviceStrategy {
} }
@Override @Override
public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity, public String analysisMQTTReceiveData(String dateStr, String registerAddr, String dataStr, String operateType, DeviceInstallEntity deviceInstallEntity) {
CollectionParamsManageEntity collectionParamsManageEntity) {
return ""; return "";
} }
} }

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save