Selaa lähdekoodia

add
设备历史数据、报警数据、修改数据改为批量存储

lifang 1 kuukausi sitten
vanhempi
commit
a367667a74

+ 12 - 1
nb-admin/src/main/resources/application-dev.yml

@@ -188,7 +188,18 @@ oss:
     accessSecret: "R7hOvMfiHb0PYroDqUDXAYgB9htQss"
     endpoint: "oss-cn-hangzhou.aliyuncs.com"
     bucketName: "tuoren-nb-dev"
-
+mqtt:
+  client:
+    id: nb-netpump-client-dev
+  broker:
+    url: tcp://192.168.100.115:1883
+    username: hospital
+    password: 1qaz!QAZ
+  connect-options:
+    clean-session: true
+    connection-timeout: 30
+    keep-alive-interval: 60
+    automatic-reconnect: true
 notify:
   wechat:
     url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=c3e093fe-5125-47d5-a171-0f4be2f61a78

+ 38 - 3
nb-admin/src/main/resources/application-prod.yml

@@ -85,7 +85,7 @@ spring:
           enabled: true
           # 慢SQL记录
           log-slow-sql: true
-          slow-sql-millis: 1000
+          slow-sql-millis: 10000
           merge-sql: true
         wall:
           config:
@@ -145,6 +145,13 @@ spring:
         max-active: 16
         # #连接池最大阻塞等待时间(使用负值表示没有限制)
         max-wait: -1ms
+  rabbitmq:
+    #    host: 172.18.0.1
+    host: 39.99.215.130
+    port: 5672
+    username: tuoren
+    password: tuoren123
+    virtual-host: netpump
 request:
   check:
     enable: false
@@ -169,8 +176,19 @@ iot:
         aliyunUid: "1238892013759131"
         regionId: "cn-shanghai"
         iotInstanceId: "iot-060a0bgd"
-        enable: true
         productKey: he1f6YdSWHW
+    - enable: true
+      consumer: com.nb.aliyun.service.consumer.NBAndFourGConsumerGroupService
+      name: 4G
+      config:
+        accessKey: "LTAI4G7FA9ytMc76oNkJ45YJ"
+        accessSecret: "R7hOvMfiHb0PYroDqUDXAYgB9htQss"
+        consumerGroupId: "fjMZozdJSpiDcWpxzkPG000100"
+        aliyunUid: "1238892013759131"
+        regionId: "cn-shanghai"
+        iotInstanceId: "iot-060a0bgd"
+        productKey: he1fAihB9M9
+
 
 # 阿里云对接配置
 aliyun:
@@ -194,4 +212,21 @@ oss:
     bucketName: "tuoren-nb-prod"
 notify:
   wechat:
-    url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ebeb023b-6f39-4f08-bd5a-67c5f3653107
+    url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ebeb023b-6f39-4f08-bd5a-67c5f3653107
+mqtt:
+  client:
+    id: nb-netpump-client-prod
+  broker:
+    url: tcp://iot.tuoren.com:1883
+    username: hospital
+    password: 1qaz!QAZ
+  connect-options:
+    clean-session: true
+    connection-timeout: 30
+    keep-alive-interval: 60
+    automatic-reconnect: true
+knife4j:
+  enable: true
+  production: true
+  setting:
+    custom-code: 200

+ 13 - 7
nb-core/src/main/java/com/nb/core/config/MqttConfig.java

@@ -1,6 +1,5 @@
 package com.nb.core.config;
 
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -17,6 +16,18 @@ import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
  */
 @Configuration
 public class MqttConfig {
+    
+    /**
+     * 创建MQTT配置属性Bean
+     *
+     * @return MqttProperties
+     */
+    @Bean
+    @ConditionalOnMissingBean
+    public MqttProperties mqttProperties() {
+        return new MqttProperties();
+    }
+
     /**
      * 创建默认的MQTT客户端工厂
      * 当容器中没有MqttPahoClientFactory时创建
@@ -25,11 +36,8 @@ public class MqttConfig {
      * @return MqttPahoClientFactory
      */
     @Bean
-    @ConditionalOnBean(MqttProperties.class)
+    @ConditionalOnMissingBean(MqttPahoClientFactory.class)
     public MqttPahoClientFactory mqttClientFactory(MqttProperties mqttProperties) {
-        if(mqttProperties==null||mqttProperties.getBroker()==null){
-            return null;
-        }
         DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
         MqttConnectOptions options = new MqttConnectOptions();
         options.setServerURIs(new String[]{mqttProperties.getBroker().getUrl()});
@@ -44,8 +52,6 @@ public class MqttConfig {
         }
         // 设置自动重连
         options.setAutomaticReconnect(mqttProperties.getConnectOptions().isAutomaticReconnect());
-        // 设置重连相关参数
-        options.setMaxReconnectDelay(mqttProperties.getConnectOptions().getMaxReconnectDelay());
         factory.setConnectionOptions(options);
         return factory;
     }

+ 7 - 33
nb-core/src/main/java/com/nb/core/config/MqttProperties.java

@@ -17,23 +17,23 @@ public class MqttProperties {
     /**
      * 客户端配置
      */
-    private Client client = null;
+    private Client client = new Client();
     
     /**
      * 代理配置
      */
-    private Broker broker = null;
+    private Broker broker = new Broker();
     
     /**
      * 连接选项
      */
-    private ConnectOptions connectOptions = null;
+    private ConnectOptions connectOptions = new ConnectOptions();
     
     public static class Client {
         /**
          * 客户端ID
          */
-        private String id ;
+        private String id = "nb-netpump-client";
         
         public String getId() {
             return id;
@@ -48,17 +48,17 @@ public class MqttProperties {
         /**
          * 代理URL
          */
-        private String url ;
+        private String url = "tcp://192.168.100.115:1883";
         
         /**
          * 用户名
          */
-        private String username;
+        private String username = "hospital";
         
         /**
          * 密码
          */
-        private String password;
+        private String password = "1qaz!QAZ";
         
         public String getUrl() {
             return url;
@@ -106,16 +106,6 @@ public class MqttProperties {
          */
         private boolean automaticReconnect = true;
         
-        /**
-         * 重连间隔(毫秒)
-         */
-        private int reconnectDelay = 5000;
-        
-        /**
-         * 最大重连延迟(毫秒)
-         */
-        private int maxReconnectDelay = 60000;
-        
         public boolean isCleanSession() {
             return cleanSession;
         }
@@ -147,22 +137,6 @@ public class MqttProperties {
         public void setAutomaticReconnect(boolean automaticReconnect) {
             this.automaticReconnect = automaticReconnect;
         }
-        
-        public int getReconnectDelay() {
-            return reconnectDelay;
-        }
-        
-        public void setReconnectDelay(int reconnectDelay) {
-            this.reconnectDelay = reconnectDelay;
-        }
-        
-        public int getMaxReconnectDelay() {
-            return maxReconnectDelay;
-        }
-        
-        public void setMaxReconnectDelay(int maxReconnectDelay) {
-            this.maxReconnectDelay = maxReconnectDelay;
-        }
     }
     
     // Getters and Setters

+ 1 - 7
nb-core/src/main/java/com/nb/core/entity/MqttMessage.java

@@ -1,12 +1,7 @@
 package com.nb.core.entity;
 
-import com.nb.core.handler.MqttMessageHandlerManager;
 import lombok.Data;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
 
-import java.io.Serializable;
 import java.util.Date;
 import java.util.Map;
 
@@ -18,8 +13,7 @@ import java.util.Map;
  * @version 1.0.0
  */
 @Data
-public class MqttMessage implements Serializable {
-    private static final long serialVersionUID = 1L;
+public class MqttMessage {
     /**
      * 主题
      */

+ 95 - 0
nb-core/src/main/java/com/nb/core/service/MqttMessageForwardService.java

@@ -0,0 +1,95 @@
+package com.nb.core.service;
+
+import com.nb.core.entity.MqttMessage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * MQTT消息转发服务
+ * 将MQTT消息通过HTTP转发给其他服务
+ *
+ * @author YourName
+ * @version 1.0.0
+ */
+@Service
+public class MqttMessageForwardService {
+    
+    @Autowired
+    private RestTemplate restTemplate;
+    
+    /**
+     * 转发单个MQTT消息
+     *
+     * @param message MQTT消息
+     * @param targetUrl 目标服务URL
+     * @return 转发结果
+     */
+    public boolean forwardMessage(MqttMessage message, String targetUrl) {
+        try {
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            
+            HttpEntity<MqttMessage> request = new HttpEntity<>(message, headers);
+            ResponseEntity<String> response = restTemplate.postForEntity(targetUrl, request, String.class);
+            
+            return response.getStatusCode().is2xxSuccessful();
+        } catch (Exception e) {
+            // 记录日志或处理异常
+            e.printStackTrace();
+            return false;
+        }
+    }
+    
+    /**
+     * 批量转发MQTT消息
+     *
+     * @param messages MQTT消息数组
+     * @param targetUrl 目标服务URL
+     * @return 转发结果
+     */
+    public boolean forwardMessages(MqttMessage[] messages, String targetUrl) {
+        try {
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            
+            HttpEntity<MqttMessage[]> request = new HttpEntity<>(messages, headers);
+            ResponseEntity<String> response = restTemplate.postForEntity(targetUrl, request, String.class);
+            
+            return response.getStatusCode().is2xxSuccessful();
+        } catch (Exception e) {
+            // 记录日志或处理异常
+            e.printStackTrace();
+            return false;
+        }
+    }
+    
+    /**
+     * 转发MQTT消息(带自定义头信息)
+     *
+     * @param message MQTT消息
+     * @param targetUrl 目标服务URL
+     * @param customHeaders 自定义头信息
+     * @return 转发结果
+     */
+    public boolean forwardMessageWithHeaders(MqttMessage message, String targetUrl, HttpHeaders customHeaders) {
+        try {
+            if (customHeaders.getContentType() == null) {
+                customHeaders.setContentType(MediaType.APPLICATION_JSON);
+            }
+            
+            HttpEntity<MqttMessage> request = new HttpEntity<>(message, customHeaders);
+            ResponseEntity<String> response = restTemplate.postForEntity(targetUrl, request, String.class);
+            
+            return response.getStatusCode().is2xxSuccessful();
+        } catch (Exception e) {
+            // 记录日志或处理异常
+            e.printStackTrace();
+            return false;
+        }
+    }
+}

+ 94 - 59
nb-core/src/main/java/com/nb/core/utils/MqttClientUtil.java

@@ -1,8 +1,9 @@
 package com.nb.core.utils;
 
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.nb.core.entity.MqttMessage;
+import com.nb.core.service.MqttMessageForwardService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.integration.channel.DirectChannel;
 import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
 import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
@@ -14,7 +15,6 @@ import org.springframework.messaging.MessagingException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.stereotype.Component;
-import org.springframework.scheduling.annotation.Async;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
@@ -31,29 +31,30 @@ import java.util.function.Consumer;
  */
 @Component
 public class MqttClientUtil implements ApplicationContextAware {
-    public static final String CLIENT_ID = "nb-netpump"+"-"+System.currentTimeMillis();
-    private ApplicationContext applicationContext;
 
+    private ApplicationContext applicationContext;
+    
+    @Autowired(required = false)
+    private MqttMessageForwardService mqttMessageForwardService;
+    
     private final Map<String, MqttPahoMessageDrivenChannelAdapter> subscribers = new ConcurrentHashMap<>();
     
     private MqttPahoClientFactory mqttClientFactory;
-
+    
+    private String defaultClientId = "nb-netpump";
+    
     private MessageChannel mqttInputChannel;
-
-    public Boolean isOnline(){
-        return ObjectUtil.isNotNull(mqttClientFactory);
-    }
-
+    
     @PostConstruct
     public void init() {
         // 创建默认的消息通道
         mqttInputChannel = new DirectChannel();
+        
         // 尝试从Spring容器中获取MqttPahoClientFactory
         try {
             mqttClientFactory = applicationContext.getBean(MqttPahoClientFactory.class);
         } catch (Exception e) {
-            mqttClientFactory=null;
-            // 忽略异常,如果获取不到工厂则无法进行MQTT操作
+
         }
     }
 
@@ -84,42 +85,79 @@ public class MqttClientUtil implements ApplicationContextAware {
      * @param topic 主题
      * @param payload 消息内容
      */
-    public void publish(String hospitalCode,String topic, Object payload) {
-        publish(hospitalCode,topic, payload, 0, false);
+    public void publish(String topic, String payload) {
+        publish(topic, payload, 0, false);
     }
     
     /**
-     * 发布消息到指定客户端
+     * 发布消息
      * @param topic 主题
      * @param payload 消息内容
-     * @param qos 服务质量等级
+     * @param qos 服务质量等级 (0, 1, 2)
      * @param retained 是否保留消息
      */
-    public void publish(String hospitalCode, String topic, Object payload, int qos, boolean retained) {
+    public void publish(String topic, String payload, int qos, boolean retained) {
         try {
+            // 创建消息实体
+            MqttMessage message = new MqttMessage(topic, payload);
+            message.setClientId(defaultClientId + "-pub-" + System.currentTimeMillis());
+            // 确保客户端工厂已初始化
             if (mqttClientFactory == null) {
                 return;
             }
             
+            MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(defaultClientId + "-pub-" + System.currentTimeMillis(), mqttClientFactory);
+            messageHandler.setDefaultTopic(topic);
+            messageHandler.setDefaultQos(qos);
+            messageHandler.setDefaultRetained(retained);
+            // 确保处理器已初始化
+            messageHandler.afterPropertiesSet();
+            
+            org.springframework.messaging.Message<String> springMessage = 
+                org.springframework.messaging.support.MessageBuilder.withPayload(JSONUtil.toJsonStr(message)).build();
+            messageHandler.handleMessage(springMessage);
+        } catch (Exception e) {
+            throw new RuntimeException("发布MQTT消息失败: " + e.getMessage(), e);
+        }
+    }
+    
+    /**
+     * 发布消息到指定客户端
+     * @param clientId 客户端ID
+     * @param topic 主题
+     * @param payload 消息内容
+     * @param qos 服务质量等级
+     * @param retained 是否保留消息
+     */
+    public void publish(String clientId, String topic, String payload, int qos, boolean retained) {
+        try {
             // 创建消息实体
-            MqttMessage message = new MqttMessage(topic, JSONUtil.toJsonStr(payload));
-            message.setClientId(CLIENT_ID);
+            MqttMessage message = new MqttMessage(topic, payload);
+            message.setClientId(clientId + "-pub-" + System.currentTimeMillis());
+            
+            // 如果配置了转发服务,则转发消息
+            if (mqttMessageForwardService != null) {
+                // 这里可以配置转发到其他服务的URL
+                // mqttMessageForwardService.forwardMessage(message, "http://other-service/api/mqtt/receive");
+            }
+            if (mqttClientFactory == null) {
+                return;
+            }
             
-            MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(CLIENT_ID, mqttClientFactory);
-            messageHandler.setDefaultTopic("hospitalInfo/"+hospitalCode);
+            MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId + "-pub-" + System.currentTimeMillis(), mqttClientFactory);
+            messageHandler.setDefaultTopic(topic);
             messageHandler.setDefaultQos(qos);
             messageHandler.setDefaultRetained(retained);
             // 确保处理器已初始化
             messageHandler.afterPropertiesSet();
             
-            org.springframework.messaging.Message<String> springMessage =
-                org.springframework.messaging.support.MessageBuilder.withPayload(JSONUtil.toJsonStr(message)).build();
+            org.springframework.messaging.Message<String> springMessage = 
+                org.springframework.messaging.support.MessageBuilder.withPayload(payload).build();
             messageHandler.handleMessage(springMessage);
         } catch (Exception e) {
             throw new RuntimeException("发布MQTT消息失败: " + e.getMessage(), e);
         }
     }
-
     
     /**
      * 订阅主题
@@ -127,17 +165,28 @@ public class MqttClientUtil implements ApplicationContextAware {
      * @param messageHandler 消息处理器
      */
     public void subscribe(String topic, MessageHandler messageHandler) {
+        subscribe(defaultClientId + "-sub-" + System.currentTimeMillis(), topic, messageHandler);
+    }
+    
+    /**
+     * 订阅主题
+     * @param clientId 客户端ID
+     * @param topic 主题
+     * @param messageHandler 消息处理器
+     */
+    public void subscribe(String clientId, String topic, MessageHandler messageHandler) {
         try {
             if (mqttClientFactory == null) {
                 return;
             }
             // 如果已经订阅了该主题,则先取消订阅
-            if (subscribers.containsKey(topic)) {
-                unsubscribe(topic);
+            String key = clientId + ":" + topic;
+            if (subscribers.containsKey(key)) {
+                unsubscribe(clientId, topic);
             }
             
             MqttPahoMessageDrivenChannelAdapter adapter = 
-                new MqttPahoMessageDrivenChannelAdapter(CLIENT_ID, mqttClientFactory, topic);
+                new MqttPahoMessageDrivenChannelAdapter(clientId, mqttClientFactory, topic);
             adapter.setConverter(new DefaultPahoMessageConverter());
             adapter.setOutputChannel(mqttInputChannel);
             
@@ -148,7 +197,7 @@ public class MqttClientUtil implements ApplicationContextAware {
             
             adapter.start();
             
-            subscribers.put(topic, adapter);
+            subscribers.put(key, adapter);
         } catch (Exception e) {
             throw new RuntimeException("订阅MQTT主题失败: " + e.getMessage(), e);
         }
@@ -160,6 +209,16 @@ public class MqttClientUtil implements ApplicationContextAware {
      * @param messageConsumer 消息消费者
      */
     public void subscribe(String topic, Consumer<String> messageConsumer) {
+        subscribe(defaultClientId + "-sub-" + System.currentTimeMillis(), topic, messageConsumer);
+    }
+    
+    /**
+     * 订阅主题(使用函数式接口处理消息)
+     * @param clientId 客户端ID
+     * @param topic 主题
+     * @param messageConsumer 消息消费者
+     */
+    public void subscribe(String clientId, String topic, Consumer<String> messageConsumer) {
         MessageHandler handler = new MessageHandler() {
             @Override
             public void handleMessage(org.springframework.messaging.Message<?> message) throws MessagingException {
@@ -167,44 +226,20 @@ public class MqttClientUtil implements ApplicationContextAware {
                 messageConsumer.accept(payload);
             }
         };
-        subscribe(topic, handler);
+        subscribe(clientId, topic, handler);
     }
     
     /**
      * 取消订阅
+     * @param clientId 客户端ID
      * @param topic 主题
      */
-    public void unsubscribe(String topic) {
-        MqttPahoMessageDrivenChannelAdapter adapter = subscribers.get(topic);
+    public void unsubscribe(String clientId, String topic) {
+        String key = clientId + ":" + topic;
+        MqttPahoMessageDrivenChannelAdapter adapter = subscribers.get(key);
         if (adapter != null) {
-            try {
-                adapter.stop();
-            } catch (Exception e) {
-                // 忽略停止异常
-            }
-            subscribers.remove(topic);
+            adapter.stop();
+            subscribers.remove(key);
         }
     }
-
-    /**
-     * 异步发布消息
-     * @param topic 主题
-     * @param payload 消息内容
-     */
-    @Async
-    public void asyncPublish(String hospitalCode,String topic, Object payload) {
-        publish(hospitalCode,topic, payload);
-    }
-
-    /**
-     * 异步发布消息到指定客户端
-     * @param topic 主题
-     * @param payload 消息内容
-     * @param qos 服务质量等级
-     * @param retained 是否保留消息
-     */
-    @Async
-    public void asyncPublish(String hospitalCode, String topic, String payload, int qos, boolean retained) {
-        publish(hospitalCode, topic, payload, qos, retained);
-    }
 }

+ 80 - 0
nb-core/src/test/java/com/nb/core/utils/MqttClientUtilTest.java

@@ -0,0 +1,80 @@
+package com.nb.core.utils;
+
+import cn.hutool.core.util.ReflectUtil;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.springframework.context.ApplicationContext;
+import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
+import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
+
+
+/**
+ * MqttClientUtil测试类
+ *
+ * @author YourName
+ * @version 1.0.0
+ */
+public class MqttClientUtilTest {
+
+    @Mock
+    private ApplicationContext applicationContext;
+
+    @Test
+    public void testPublish() {
+        MqttClientUtil mqttClientUtil = new MqttClientUtil();
+        mqttClientUtil.setApplicationContext(applicationContext);
+        ReflectUtil.setFieldValue(mqttClientUtil, "mqttClientFactory", createDefaultClientFactory());
+
+        // 测试发布消息
+        try {
+            mqttClientUtil.publish("testtopic/123", "Hello MQTT");
+        } catch (Exception e) {
+            e.printStackTrace();
+            // 在测试环境中,由于没有实际的MQTT服务器,会抛出异常,这是预期的
+        }
+    }
+
+    @Test
+    public void testPublishWithParams() {
+        MqttClientUtil mqttClientUtil = new MqttClientUtil();
+        mqttClientUtil.setApplicationContext(applicationContext);
+        
+        // 测试发布消息(带参数)
+        try {
+            mqttClientUtil.publish("test/topic", "Hello MQTT", 1, false);
+        } catch (Exception e) {
+            // 在测试环境中,由于没有实际的MQTT服务器,会抛出异常,这是预期的
+        }
+    }
+
+    private String defaultClientId = "nb-netpump";
+
+    private String defaultBrokerUrl = "tcp://iot.tuoren.com:1883";
+
+    private String defaultUsername = "hospital";
+
+    private String defaultPassword = "1qaz!QAZ";
+    /**
+     * 创建默认的客户端工厂
+     * @return MqttPahoClientFactory
+     */
+    private MqttPahoClientFactory createDefaultClientFactory() {
+        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
+        MqttConnectOptions options = new MqttConnectOptions();
+        options.setServerURIs(new String[]{defaultBrokerUrl});
+        options.setCleanSession(true);
+        options.setConnectionTimeout(30);
+        options.setKeepAliveInterval(60);
+        if (defaultUsername != null && !defaultUsername.isEmpty()) {
+            options.setUserName(defaultUsername);
+        }
+        if (defaultPassword != null && !defaultPassword.isEmpty()) {
+            options.setPassword(defaultPassword.toCharArray());
+        }
+        // 设置自动重连
+        options.setAutomaticReconnect(true);
+        factory.setConnectionOptions(options);
+        return factory;
+    }
+}

+ 9 - 6
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/LocalBusEvaluationService.java

@@ -74,12 +74,15 @@ public class LocalBusEvaluationService extends BaseService<BusEvaluationMapper,
     @Override
     public void postSave(BusEvaluationEntity entity) {
         if(StrUtil.isNotEmpty(entity.getClinicId())){
-            clinicService.update(new UpdateWrapper<BusClinicEntity>().lambda()
-                    .eq(BusClinicEntity::getId,entity.getClinicId())
-                    .set(BusClinicEntity::getEvalTime, Optional.ofNullable(entity.getEvaluateTime()).orElse(new Date())));
-            if(CharSequenceUtil.isNotBlank(entity.getPatientId())){
-                wsPublishUtils.publishPatientMonitor(entity.getPatientId(),entity.getTenantId());
-            }
+        String adverseReactions = AdverseReactionUtil.getAdverseReactions(entity);
+        String clinicId = entity.getClinicId();
+        BusClinicEntity clinic = clinicService.getById(clinicId);
+        clinic.setLastBadEval(adverseReactions);
+        clinic.setEvalTime(Optional.ofNullable(entity.getEvaluateTime()).orElse(new Date()));
+        clinicService.updateById(clinic);
+        if(CharSequenceUtil.isNotBlank(entity.getPatientId())){
+            wsPublishUtils.publishPatientMonitor(entity.getPatientId(),entity.getTenantId());
+        }
         }
     }