TRX 1 rok temu
rodzic
commit
832d52b66b
14 zmienionych plików z 389 dodań i 1 usunięć
  1. 18 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/mqtt/SendMessageModel.java
  2. 4 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/org/UserCountAddParam.java
  3. 34 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/mqtt/MqttController.java
  4. 19 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/iotCenter/conf/IotCenterConf.java
  5. 2 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/iotCenter/package-info.java
  6. 98 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/MqttServiceImpl.java
  7. 10 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/QueueNameConfig.java
  8. 36 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/client/MQClient.java
  9. 21 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/conf/MQConf.java
  10. 81 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/config/ConsumerConfiguration.java
  11. 22 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/config/TopicConfiguration.java
  12. 33 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/constant/MQConstant.java
  13. 3 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/DictInfoServiceImpl.java
  14. 8 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/SchoolUserServiceImpl.java

+ 18 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/mqtt/SendMessageModel.java

@@ -0,0 +1,18 @@
+package com.zhongshu.card.client.model.mqtt;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/5/20
+ */
+@Data
+public class SendMessageModel {
+
+    @Schema(description = "接收信息的Topic,格式如:v1/device/001/on", required = true)
+    private String topic;
+
+    @Schema(description = "消息内容", required = true)
+    private String message;
+}

+ 4 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/org/UserCountAddParam.java

@@ -1,6 +1,7 @@
 package com.zhongshu.card.client.model.org;
 
 import com.zhongshu.card.client.model.base.SuperParam;
+import com.zhongshu.card.client.utils.type.CertificateType;
 import com.zhongshu.card.client.utils.type.OrganizationUserType;
 import com.zhongshu.card.client.utils.type.Sex;
 import com.zhongshu.card.client.utils.type.UserState;
@@ -34,6 +35,9 @@ public class UserCountAddParam extends SuperParam {
     @Schema(description = "地址")
     private String address;
 
+    @Schema(description = "证件类型")
+    CertificateType certificateType = CertificateType.IDCard;
+
     @Schema(description = "证件号码")
     private String cardNumber;
 

+ 34 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/mqtt/MqttController.java

@@ -0,0 +1,34 @@
+package com.zhongshu.card.server.core.controller.mqtt;
+
+import com.zhongshu.card.client.model.mqtt.SendMessageModel;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.server.core.service.mqtt.MqttServiceImpl;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ *
+ */
+@RequestMapping("/mqttMessage")
+@RestController
+@Validated
+@Tag(name = "mqtt测试接口")
+public class MqttController {
+
+    @Autowired
+    MqttServiceImpl mqttService;
+
+    @Operation(summary = "发送指令")
+    @RequestMapping(value = "sendMessage", method = {RequestMethod.POST})
+    public ResultContent sendMessage(@RequestBody SendMessageModel param) {
+        return mqttService.sendMessage(param);
+    }
+
+}
+

+ 19 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/iotCenter/conf/IotCenterConf.java

@@ -0,0 +1,19 @@
+package com.zhongshu.card.server.core.iotCenter.conf;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@NoArgsConstructor
+@AllArgsConstructor
+@ConfigurationProperties(prefix = "iotcenter")
+public class IotCenterConf {
+    /**
+     * 物联网平台地址配置
+     */
+    private String url = "";
+}

+ 2 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/iotCenter/package-info.java

@@ -0,0 +1,2 @@
+package com.zhongshu.card.server.core.iotCenter;
+//物联网平台的相关配置

+ 98 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/MqttServiceImpl.java

@@ -0,0 +1,98 @@
+package com.zhongshu.card.server.core.service.mqtt;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.google.gson.JsonObject;
+import com.zhongshu.card.client.model.mqtt.SendMessageModel;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.server.core.dao.org.UserCountDao;
+import com.zhongshu.card.server.core.service.base.RedisService;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.service.mqtt.mqttConfig.client.MQClient;
+import com.zhongshu.card.server.core.service.mqtt.mqttConfig.constant.MQConstant;
+import com.zhongshu.card.server.core.util.DateUtils;
+import jakarta.jms.Message;
+import jakarta.jms.TextMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.activemq.artemis.jms.client.ActiveMQBytesMessage;
+import org.apache.activemq.artemis.jms.client.ActiveMQTopic;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.stereotype.Service;
+
+import java.util.UUID;
+
+/**
+ * @author TRX
+ * @date 2024/3/20
+ */
+@Slf4j
+@Service
+public class MqttServiceImpl extends SuperService {
+
+    @Autowired
+    UserCountDao userDao;
+
+    @Autowired
+    RedisService redisService;
+
+    @Autowired
+    MQClient mqClient;
+
+    /**
+     * 发送指令
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent sendMessage(SendMessageModel param) {
+        String msg = "发送成功";
+        try {
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", UUID.randomUUID().toString());
+            jsonObject.addProperty("data", param.getMessage());
+            jsonObject.addProperty("time", DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyySSS));
+            jsonObject.addProperty("ttl", 10 * 1000);
+            mqClient.sendObject(param.getTopic(), jsonObject.toString());
+            log.info("mqtt msg 发送成功");
+        } catch (Exception e) {
+            e.printStackTrace();
+            msg = "发送失败: " + e.getMessage();
+        }
+        return ResultContent.buildSuccess(msg);
+    }
+
+    //    @JmsListener(destination = "#", containerFactory = MQConstant.TopicListenerContainerFactory)
+    @JmsListener(destination = "v1/#", containerFactory = MQConstant.TopicListenerContainerFactory)
+    @JmsListener(destination = "v1.#", containerFactory = MQConstant.TopicListenerContainerFactory)
+    public void receiveMessage(Message message) {
+        // 处理接收到的消息
+        try {
+            ActiveMQTopic activeMQTopic = (ActiveMQTopic) message.getJMSDestination();
+            String topicName = activeMQTopic.getTopicName();
+            if (topicName.equals("activemq.notifications")) {
+                return;
+            }
+            log.info("receiveMessage {} 消息监听clientId: {}", message.getJMSMessageID(), message.getStringProperty("__AMQ_CID"));
+            log.info("Topic: {}", topicName);
+
+            if (message instanceof ActiveMQBytesMessage) {
+                ActiveMQBytesMessage activeMQBytesMessage = (ActiveMQBytesMessage) message;
+
+                byte[] messageBody = new byte[(int) activeMQBytesMessage.getBodyLength()];
+                // 读取消息内容到字节数组
+                activeMQBytesMessage.readBytes(messageBody);
+                String msg = new String(messageBody);
+                JSONObject json = JSONUtil.parseObj(msg);
+                log.info("消息内容:{}", json.get("msg"));
+            }
+            if (message instanceof TextMessage) {
+                TextMessage textMessage = (TextMessage) message;
+                log.info("textMessage: {}", textMessage.getText());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}

+ 10 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/QueueNameConfig.java

@@ -0,0 +1,10 @@
+package com.zhongshu.card.server.core.service.mqtt.mqttConfig;
+
+/**
+ * @author TRX
+ * @date 2024/5/11
+ */
+
+public class QueueNameConfig {
+    private String queue;
+}

+ 36 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/client/MQClient.java

@@ -0,0 +1,36 @@
+package com.zhongshu.card.server.core.service.mqtt.mqttConfig.client;
+
+import com.github.microservice.core.helper.JsonHelper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.core.JmsTemplate;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MQClient {
+
+    @Autowired
+    private JmsTemplate jmsTemplate;
+
+    @Autowired
+    private JsonHelper jsonHelper;
+
+
+    /**
+     * 发送到topic
+     */
+    public void sendObject(String topic, Object parm) {
+        jmsTemplate.convertAndSend(topic, parm);
+//        jmsTemplate.convertAndSend(new ActiveMQTopic(topic), this.jsonHelper.toJson(parm));
+    }
+
+
+    /**
+     * 发送文本消息
+     *
+     * @param topic
+     * @param text
+     */
+    public void sendText(String topic, String text) {
+        jmsTemplate.convertAndSend(topic, text);
+    }
+}

+ 21 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/conf/MQConf.java

@@ -0,0 +1,21 @@
+package com.zhongshu.card.server.core.service.mqtt.mqttConfig.conf;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@NoArgsConstructor
+@AllArgsConstructor
+@ConfigurationProperties(prefix = "mq")
+public class MQConf {
+
+    /**
+     * 消息的消费者队列
+     */
+    private int messageThreadPoolCount = 200;
+
+}

+ 81 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/config/ConsumerConfiguration.java

@@ -0,0 +1,81 @@
+package com.zhongshu.card.server.core.service.mqtt.mqttConfig.config;
+
+import com.zhongshu.card.server.core.service.mqtt.mqttConfig.conf.MQConf;
+import com.zhongshu.card.server.core.service.mqtt.mqttConfig.constant.MQConstant;
+import jakarta.jms.ConnectionFactory;
+import jakarta.jms.JMSException;
+import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
+import org.springframework.jms.config.JmsListenerContainerFactory;
+import org.springframework.jms.core.JmsTemplate;
+
+
+@Configuration
+public class ConsumerConfiguration {
+
+    private static final Logger log = LoggerFactory.getLogger(ConsumerConfiguration.class);
+    @Value("${spring.artemis.broker-url}")
+    private String host;
+
+    @Value("${spring.artemis.user}")
+    private String userName;
+
+    @Value("${spring.artemis.password}")
+    private String passWord;
+
+
+    @Autowired
+    private MQConf mqConf;
+
+    /**
+     * 配置预期量
+     *
+     * @return
+     */
+//    @Bean
+//    public ActiveMQPrefetchPolicy activeMQPrefetchPolicy() {
+//        ActiveMQPrefetchPolicy prefetchPolicy = new ActiveMQPrefetchPolicy();
+//        prefetchPolicy.setTopicPrefetch(mqConf.getMessageThreadPoolCount() * 2);
+//        prefetchPolicy.setDurableTopicPrefetch(mqConf.getMessageThreadPoolCount() * 2);
+//        prefetchPolicy.setMaximumPendingMessageLimit(mqConf.getMessageThreadPoolCount() * 2);
+//        return prefetchPolicy;
+//    }
+    @Bean
+    public ActiveMQConnectionFactory connectionFactory() {
+        log.info("init  connectionFactory");
+        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(host, userName, passWord);
+//        activeMQConnectionFactory.setPrefetchPolicy(activeMQPrefetchPolicy());
+//        //采用异步投递消息
+//        activeMQConnectionFactory.setAlwaysSyncSend(true);
+//        //优化自动确认
+//        activeMQConnectionFactory.setOptimizeAcknowledge(true);
+//
+//        activeMQConnectionFactory.setMaxRetryInterval();
+//        activeMQConnectionFactory.set
+        return activeMQConnectionFactory;
+    }
+
+
+    @Bean
+    public JmsTemplate jmsTemplate() throws JMSException {
+        JmsTemplate jmsTemplate = new JmsTemplate();
+        jmsTemplate.setConnectionFactory(connectionFactory());
+        //setting PuSubDomain to true configures JmsTemplate to work with topics instead of queues
+        jmsTemplate.setPubSubDomain(true);
+        return jmsTemplate;
+    }
+
+    @Bean(name = MQConstant.TopicListenerContainerFactory)
+    public JmsListenerContainerFactory topicListenerContainerFactory(ConnectionFactory connectionFactory) {
+        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
+        factory.setConnectionFactory(connectionFactory);
+        factory.setPubSubDomain(true);
+        return factory;
+    }
+}

+ 22 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/config/TopicConfiguration.java

@@ -0,0 +1,22 @@
+package com.zhongshu.card.server.core.service.mqtt.mqttConfig.config;
+
+import com.zhongshu.card.server.core.service.mqtt.mqttConfig.conf.MQConf;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+
+
+
+@Configuration
+public class TopicConfiguration {
+
+    @Autowired
+    private MQConf mqConfig;
+
+//
+//    @Bean
+//    public ActiveMQDestination requetQueue() {
+//        return new ActiveMQTopic(MQConstant.RequetTopic);
+//    }
+
+
+}

+ 33 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/mqtt/mqttConfig/constant/MQConstant.java

@@ -0,0 +1,33 @@
+package com.zhongshu.card.server.core.service.mqtt.mqttConfig.constant;
+
+/**
+ * 队列访问
+ */
+public class MQConstant {
+
+    /**
+     * 请求
+     */
+    public static final String RequetTopic = "mq.request";
+
+    /**
+     * 响应
+     */
+    public static final String ResponseTopic = "mq.response.";
+
+
+    /**
+     * 主题工厂
+     */
+    public static final String TopicListenerContainerFactory = "topicListenerContainerFactory";
+
+
+    /**
+     * 字符编码
+     */
+    public static final String CharSet = "UTF-8";
+
+
+
+
+}

+ 3 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/DictInfoServiceImpl.java

@@ -45,7 +45,9 @@ public class DictInfoServiceImpl extends SuperService implements DictInfoService
     @Override
     public ResultContent addDict(DictInfoParam param) {
         Assert.hasText(param.getName(), "name不能为空");
-        Assert.isNull(param.getDictInfoType(), "dictInfoType不能为空");
+        if (param.getDictInfoType() == null) {
+            return ResultContent.buildFail(String.format("dictInfoType不能为空"));
+        }
         initDefaultUserAndOid(param);
         if (param.getSort() == null) {
             param.setSort(1L);

+ 8 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/SchoolUserServiceImpl.java

@@ -216,6 +216,13 @@ public class SchoolUserServiceImpl extends SuperService implements SchoolUserSer
             }
             map.put(cardInfo.getIccid(), cardInfo.getIccid());
         }
+        String cardNumber = param.getCardNumber();
+        if (!ValidateUtils.isIDCard(cardNumber)) {
+            return ResultContent.buildFail(String.format("证件号码格式错误"));
+        }
+        String passWord = param.getCardNumber().substring(12, 18);
+        passWord = passWord.toLowerCase().replace("x", "0");
+        param.setPassWord(passWord);
 
         ResultContent resultContent = userAccountService.update(param);
         if (resultContent.isFailed()) {
@@ -342,6 +349,7 @@ public class SchoolUserServiceImpl extends SuperService implements SchoolUserSer
 
     /**
      * 得到当前用户子啊机构的所有卡片
+     *
      * @return
      */
     @Override