From 697775ce76037e4ec4a2f7de59395fc873070c71 Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期四, 12 十月 2023 17:35:25 +0800
Subject: [PATCH] 修改

---
 server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java           |    6 
 server/platform/src/main/java/com/doumee/api/MqttLogController.java                            |   90 ++++++
 server/services/src/main/java/com/doumee/service/business/MqttLogService.java                  |   97 ++++++
 server/services/src/main/java/com/doumee/core/mqtt/service/MqttToolService.java                |    4 
 server/services/src/main/java/com/doumee/service/business/DeviceService.java                   |    5 
 server/db/business.mqtt_log.permissions.sql                                                    |    6 
 server/services/src/main/java/com/doumee/service/business/BikesService.java                    |    1 
 server/services/src/main/java/com/doumee/service/business/LocksService.java                    |    1 
 server/自行车mqtt协议.md                                                                            |   43 +++
 server/platform/src/main/java/com/doumee/api/business/LocksController.java                     |    2 
 server/services/src/main/java/com/doumee/dao/business/model/Sites.java                         |    3 
 server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java     |  147 ++++++++++
 server/services/src/main/java/com/doumee/service/business/impl/DeviceSubscribeServiceImpl.java |   88 ++++++
 server/services/src/main/java/com/doumee/core/constants/Constants.java                         |   20 +
 server/services/src/main/java/com/doumee/dao/business/model/Locks.java                         |    8 
 server/services/src/main/java/com/doumee/service/business/MemberRidesService.java              |    5 
 server/services/src/main/java/com/doumee/service/business/impl/MqttLogServiceImpl.java         |  145 ++++++++++
 server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java      |    2 
 server/services/src/main/java/com/doumee/dao/business/MqttLogMapper.java                       |   12 
 server/services/src/main/java/com/doumee/dao/business/model/MqttLog.java                       |   78 +++++
 server/services/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java          |   51 +++
 server/services/src/main/java/com/doumee/service/business/impl/LocksServiceImpl.java           |    3 
 22 files changed, 792 insertions(+), 25 deletions(-)

diff --git a/server/db/business.mqtt_log.permissions.sql b/server/db/business.mqtt_log.permissions.sql
new file mode 100644
index 0000000..3af457c
--- /dev/null
+++ b/server/db/business.mqtt_log.permissions.sql
@@ -0,0 +1,6 @@
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:mqttlog:create', '鏂板缓绯荤粺琛屼负鎿嶄綔璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:mqttlog:delete', '鍒犻櫎绯荤粺琛屼负鎿嶄綔璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:mqttlog:update', '淇敼绯荤粺琛屼负鎿嶄綔璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:mqttlog:query', '鏌ヨ绯荤粺琛屼负鎿嶄綔璁板綍琛�', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:mqttlog:exportExcel', '瀵煎嚭绯荤粺琛屼负鎿嶄綔璁板綍琛�(Excel)', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
+
diff --git a/server/platform/src/main/java/com/doumee/api/MqttLogController.java b/server/platform/src/main/java/com/doumee/api/MqttLogController.java
new file mode 100644
index 0000000..a523e62
--- /dev/null
+++ b/server/platform/src/main/java/com/doumee/api/MqttLogController.java
@@ -0,0 +1,90 @@
+package com.doumee.api;
+
+import com.doumee.api.BaseController;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.model.PageData;
+import com.doumee.dao.business.model.MqttLog;
+import com.doumee.service.business.MqttLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import javax.servlet.http.HttpServletResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/10/12 14:25
+ */
+@Api(tags = "绯荤粺琛屼负鎿嶄綔璁板綍琛�")
+@RestController
+@RequestMapping("/business/mqttLog")
+public class MqttLogController extends BaseController {
+
+    @Autowired
+    private MqttLogService mqttLogService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @RequiresPermissions("business:mqttlog:create")
+    public ApiResponse create(@RequestBody MqttLog mqttLog) {
+        return ApiResponse.success(mqttLogService.create(mqttLog));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @RequiresPermissions("business:mqttlog:delete")
+    public ApiResponse deleteById(@PathVariable String id) {
+        mqttLogService.deleteById(id);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @RequiresPermissions("business:mqttlog:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+        String [] idArray = ids.split(",");
+        List<String> idList = new ArrayList<>();
+        for (String id : idArray) {
+            idList.add(id);
+        }
+        mqttLogService.deleteByIdInBatch(idList);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @RequiresPermissions("business:mqttlog:update")
+    public ApiResponse updateById(@RequestBody MqttLog mqttLog) {
+        mqttLogService.updateById(mqttLog);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @RequiresPermissions("business:mqttlog:query")
+    public ApiResponse<PageData<MqttLog>> findPage (@RequestBody PageWrap<MqttLog> pageWrap) {
+        return ApiResponse.success(mqttLogService.findPage(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @RequiresPermissions("business:mqttlog:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<MqttLog> pageWrap, HttpServletResponse response) {
+        ExcelExporter.build(MqttLog.class).export(mqttLogService.findPage(pageWrap).getRecords(), "绯荤粺琛屼负鎿嶄綔璁板綍琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @RequiresPermissions("business:mqttlog:query")
+    public ApiResponse findById(@PathVariable String id) {
+        return ApiResponse.success(mqttLogService.findById(id));
+    }
+}
diff --git a/server/platform/src/main/java/com/doumee/api/business/LocksController.java b/server/platform/src/main/java/com/doumee/api/business/LocksController.java
index 17b88e5..532d4ee 100644
--- a/server/platform/src/main/java/com/doumee/api/business/LocksController.java
+++ b/server/platform/src/main/java/com/doumee/api/business/LocksController.java
@@ -70,7 +70,7 @@
         return ApiResponse.success(null);
     }
 
-    @ApiOperation("瀹炴椂杞︿綅淇℃伅_鍒嗛〉鏌ヨ")
+    @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @RequiresPermissions("business:locks:query")
     public ApiResponse<PageData<Locks>> findPage(@RequestBody PageWrap<Locks> pageWrap) {
diff --git a/server/services/src/main/java/com/doumee/core/constants/Constants.java b/server/services/src/main/java/com/doumee/core/constants/Constants.java
index fceeb10..dd3f48b 100644
--- a/server/services/src/main/java/com/doumee/core/constants/Constants.java
+++ b/server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -32,10 +32,15 @@
     public static final String PROJECT_FILE = "PROJECT_FILE";
     public static String REDIS_DEBUG_STR="test_";
     public  interface MqttTopic{
-        //寮�閿�
-        String openLock = "OPENLOCK";
-        //鍏抽棴閿佸ご
-        String closeLock = "CLOSELOCK";
+        //寮�閿侊紙鍙戝竷锛�
+        String topic_index = "device/lock/";
+        String openLock = "device/lock/+/unlock";
+        //閿佷俊鎭紝鍦ㄥ垵濮嬪寲銆佺姸鎬佸彉鏇存椂浼氭帹閫侀攣鐨勫畬鏁寸姸鎬�(璁㈤槄锛�
+        String lockInfo = "device/lock/+/info";
+        //杩樿溅閿佸ご锛堣闃咃級
+        String closeLock = "device/lock/+/bike";
+        //瀹炴椂鑾峰彇閿佷俊鎭紙鍙戝竷锛�
+        String getLockInfo = "device/lock/+/getInfo";
     }
 
     /**
@@ -47,6 +52,13 @@
         int all =2;
         int partful = 3;
   }
+    public interface LockStatus{
+      //  //鐘舵�侊紝0闂悎, 1鎵撳紑锛�2杩愯涓�, 3寮傚父
+        int closed =0;
+        int open =1;
+        int running =2;
+        int error= 3;
+    }
     public interface goodsorderStatus{
         int waitPay =0;
         int pay =1;
diff --git a/server/services/src/main/java/com/doumee/core/mqtt/service/MqttToolService.java b/server/services/src/main/java/com/doumee/core/mqtt/service/MqttToolService.java
index 4dfae17..0d1b97b 100644
--- a/server/services/src/main/java/com/doumee/core/mqtt/service/MqttToolService.java
+++ b/server/services/src/main/java/com/doumee/core/mqtt/service/MqttToolService.java
@@ -36,16 +36,18 @@
      * @param message
      * @param topic
      */
-    public  void pubMessage(String message,String topic){
+    public  int pubMessage(String message,String topic){
         MqttMessage mess = new MqttMessage();
         mess.setQos(1);
         mess.setRetained(true);
         mess.setPayload(message.getBytes());
         try {
             MqttClientInit.getInstance(config,callBack).publish(topic, mess);
+            return  1;
         } catch (Exception e) {
             //LOGGER.error(e.getLocalizedMessage());
         }
+        return 0;
     }
     public static void main(String[] args) {
         MqttToolService client1 = new MqttToolService();
diff --git a/server/services/src/main/java/com/doumee/dao/business/MqttLogMapper.java b/server/services/src/main/java/com/doumee/dao/business/MqttLogMapper.java
new file mode 100644
index 0000000..db8a8cc
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/MqttLogMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.MqttLog;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/10/12 14:25
+ */
+public interface MqttLogMapper extends BaseMapper<MqttLog> {
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Locks.java b/server/services/src/main/java/com/doumee/dao/business/model/Locks.java
index c760d3e..7d56295 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Locks.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Locks.java
@@ -1,5 +1,6 @@
 package com.doumee.dao.business.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -58,8 +59,8 @@
     @ExcelColumn(name="缂栧彿")
     private String code;
 
-    @ApiModelProperty(value = "鐘舵�� 0姝e父 1寮傚父", example = "1")
-    @ExcelColumn(name="鐘舵�� 0姝e父 1寮傚父")
+    @ApiModelProperty(value = "鐘舵�侊紝0闂悎, 1鎵撳紑锛�2杩愯涓�, 3寮傚父", example = "1")
+    @ExcelColumn(name="鐘舵�侊紝0闂悎, 1鎵撳紑锛�2杩愯涓�, 3寮傚父")
     private Integer status;
 
     @ApiModelProperty(value = "绔欑偣缂栫爜(鍏宠仈sites)")
@@ -69,5 +70,8 @@
     @ApiModelProperty(value = "褰撳墠閿佸畾鑷杞︾紪鍙�")
     @ExcelColumn(name="褰撳墠閿佸畾鑷杞︾紪鍙�")
     private String bikeCode;
+    @ApiModelProperty(value = "褰撳墠閿佸畾鑷杞︾紪鍙�")
+    @TableField(select = false)
+    private Sites sites;
 
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/MqttLog.java b/server/services/src/main/java/com/doumee/dao/business/model/MqttLog.java
new file mode 100644
index 0000000..71815ed
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/MqttLog.java
@@ -0,0 +1,78 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.Date;
+
+/**
+ * 绯荤粺琛屼负鎿嶄綔璁板綍琛�
+ * @author 姹熻箘韫�
+ * @date 2023/10/12 14:25
+ */
+@Data
+@ApiModel("绯荤粺琛屼负鎿嶄綔璁板綍琛�")
+@TableName("`mqtt_log`")
+public class MqttLog {
+
+    @ApiModelProperty(value = "缂栫爜")
+    @ExcelColumn(name="缂栫爜")
+    private String id;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    @ExcelColumn(name="鍒涘缓浜�")
+    private String creator;
+
+    @ApiModelProperty(value = "缂栬緫鏃堕棿")
+    @ExcelColumn(name="缂栬緫鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date editDate;
+
+    @ApiModelProperty(value = "缂栬緫浜�")
+    @ExcelColumn(name="缂栬緫浜�")
+    private String editor;
+
+    @ApiModelProperty(value = "鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�", example = "1")
+    @ExcelColumn(name="鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�")
+    @TableLogic
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String info;
+
+    @ApiModelProperty(value = "绫诲瀷 0璁㈤槄 1鍙戝竷", example = "1")
+    @ExcelColumn(name="绫诲瀷 0璁㈤槄 1鍙戝竷")
+    private Integer type;
+
+    @ApiModelProperty(value = "瀹㈡埛绔紪鐮�")
+    @ExcelColumn(name="瀹㈡埛绔紪鐮�")
+    private String clientid;
+    @ApiModelProperty(value = "鏈嶅姟鍣ㄤ俊鎭�")
+    @ExcelColumn(name="鏈嶅姟鍣ㄤ俊鎭�")
+    private String hostInfo;
+
+    @ApiModelProperty(value = "涓婚")
+    @ExcelColumn(name="涓婚")
+    private String topic;
+
+    @ApiModelProperty(value = "娑堟伅鍐呭")
+    @ExcelColumn(name="娑堟伅鍐呭")
+    private String msg;
+
+    @ApiModelProperty(value = "缁撴灉 0鎴愬姛 1澶辫触", example = "1")
+    @ExcelColumn(name="缁撴灉 0鎴愬姛 1澶辫触")
+    private Integer result;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Sites.java b/server/services/src/main/java/com/doumee/dao/business/model/Sites.java
index bedc1a3..a969ae0 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Sites.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Sites.java
@@ -78,6 +78,9 @@
     @ApiModelProperty(value = "鍦ㄦ灦杞﹁締鏁�")
     @TableField(exist = false)
     private Integer bikeCount;
+    @ApiModelProperty(value = "鍦ㄦ灦杞﹁締鏁�")
+    @TableField(exist = false)
+    private Integer allLockNum;
 
     @ApiModelProperty(value = "婊℃灦鐜�")
     @TableField(exist = false)
diff --git a/server/services/src/main/java/com/doumee/service/business/BikesService.java b/server/services/src/main/java/com/doumee/service/business/BikesService.java
index 716c4ba..90bc756 100644
--- a/server/services/src/main/java/com/doumee/service/business/BikesService.java
+++ b/server/services/src/main/java/com/doumee/service/business/BikesService.java
@@ -96,4 +96,5 @@
     long count(Bikes bikes);
 
     PageData<Bikes> findJoinPage(PageWrap<Bikes> pageWrap);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/DeviceService.java b/server/services/src/main/java/com/doumee/service/business/DeviceService.java
index 9a30d63..2170ace 100644
--- a/server/services/src/main/java/com/doumee/service/business/DeviceService.java
+++ b/server/services/src/main/java/com/doumee/service/business/DeviceService.java
@@ -1,6 +1,7 @@
 package com.doumee.service.business;
 
 import com.doumee.dao.business.model.Locks;
+import com.doumee.dao.business.model.MqttLog;
 
 /**
  * 涓庣‖浠跺鎺ユ湇鍔�
@@ -14,8 +15,10 @@
      * 涓嬪彂寮�杞﹀紑閿佹寚浠�
      * @return String
      */
-    boolean openLock(Locks locks);
+    MqttLog openLock(Locks locks);
 
     void startSubcribe();
 
+    MqttLog getLockInfo(Locks locks);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/LocksService.java b/server/services/src/main/java/com/doumee/service/business/LocksService.java
index c2c7f70..645e38b 100644
--- a/server/services/src/main/java/com/doumee/service/business/LocksService.java
+++ b/server/services/src/main/java/com/doumee/service/business/LocksService.java
@@ -94,4 +94,5 @@
      * @return long
      */
     long count(Locks locks);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/MemberRidesService.java b/server/services/src/main/java/com/doumee/service/business/MemberRidesService.java
index 985fd51..f37680e 100644
--- a/server/services/src/main/java/com/doumee/service/business/MemberRidesService.java
+++ b/server/services/src/main/java/com/doumee/service/business/MemberRidesService.java
@@ -2,6 +2,7 @@
 
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Locks;
 import com.doumee.dao.business.model.MemberRides;
 import com.doumee.dao.business.web.request.MemberRidesQuery;
 import com.doumee.dao.business.web.response.BikeLogDTO;
@@ -133,4 +134,8 @@
     void updateDuration(MemberRides memberRides);
 
     void forceBack(MemberRides memberRides);
+
+    int mqttCloseBikeEvent(MemberRides bikes);
+
+    int mqttLockInfoEvent(Locks locks);
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/MqttLogService.java b/server/services/src/main/java/com/doumee/service/business/MqttLogService.java
new file mode 100644
index 0000000..16ec774
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/MqttLogService.java
@@ -0,0 +1,97 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.MqttLog;
+import java.util.List;
+
+/**
+ * 绯荤粺琛屼负鎿嶄綔璁板綍琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/10/12 14:25
+ */
+public interface MqttLogService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param mqttLog 瀹炰綋瀵硅薄
+     * @return String
+     */
+    String create(MqttLog mqttLog);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(String id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param mqttLog 瀹炰綋瀵硅薄
+     */
+    void delete(MqttLog mqttLog);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<String> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param mqttLog 瀹炰綋瀵硅薄
+     */
+    void updateById(MqttLog mqttLog);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param mqttLogs 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<MqttLog> mqttLogs);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return MqttLog
+     */
+    MqttLog findById(String id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param mqttLog 瀹炰綋瀵硅薄
+     * @return MqttLog
+     */
+    MqttLog findOne(MqttLog mqttLog);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param mqttLog 瀹炰綋瀵硅薄
+     * @return List<MqttLog>
+     */
+    List<MqttLog> findList(MqttLog mqttLog);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<MqttLog>
+     */
+    PageData<MqttLog> findPage(PageWrap<MqttLog> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param mqttLog 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(MqttLog mqttLog);
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
index 0bc1c72..bae593e 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
@@ -1,12 +1,17 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.doumee.core.constants.Constants;
+import com.doumee.core.mqtt.config.MqttConfig;
 import com.doumee.core.mqtt.service.MqttToolService;
+import com.doumee.dao.business.MqttLogMapper;
 import com.doumee.dao.business.model.Locks;
+import com.doumee.dao.business.model.MqttLog;
 import com.doumee.service.business.DeviceService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import javax.annotation.PostConstruct;
+import java.util.Date;
 
 /**
  *  涓庣‖浠跺鎺ユ湇鍔�
@@ -17,14 +22,54 @@
 public class DeviceServiceImpl implements DeviceService {
     @Autowired
     private MqttToolService mqttToolService;
+    @Autowired
+    private MqttLogMapper mqttLogMapper;
+    @Autowired
+    private MqttConfig mqttConfig;
     @Override
     @PostConstruct
     public void startSubcribe() {
         mqttToolService.subscribe(new String[]{ Constants.MqttTopic.openLock, Constants.MqttTopic.closeLock});
     }
+
+    /**
+     * 鍙戣捣寮�閿佹寚浠�
+     * @param locks
+     * @return
+     */
     @Override
-    public boolean openLock(Locks locks) {
-        mqttToolService.pubMessage(locks.getName(), Constants.MqttTopic.openLock);
-        return true;
+    public MqttLog openLock(Locks locks) {
+        String topic =  Constants.MqttTopic.openLock.replace("+", locks.getId());
+        int result = mqttToolService.pubMessage("{}",topic);
+        MqttLog mqttLog = createPushLog(topic,result,"璇锋眰寮�閿乢"+locks.getId());
+        return mqttLog;
+    }
+    /**
+     * 瀹炴椂鏌ヨ閿佷俊鎭�
+     * @param locks
+     * @return
+     */
+    @Override
+    public MqttLog getLockInfo(Locks locks) {
+        String topic =  Constants.MqttTopic.getLockInfo.replace("+", locks.getId());
+        int result = mqttToolService.pubMessage("{}",topic);
+        MqttLog mqttLog = createPushLog(topic,result,"瀹炴椂鏌ヨ閿佷俊鎭痏"+locks.getId());
+        return mqttLog;
+    }
+
+    private MqttLog createPushLog(String topic, int result,String info) {
+        MqttLog log = new MqttLog();
+        log.setId(Constants.getUUID());
+        log.setCreateDate(new Date());
+        log.setResult(result);
+        log.setTopic(topic);
+        log.setClientid(mqttConfig.getClientid());
+        log.setHostInfo(mqttConfig.getHost());
+        log.setInfo(JSONObject.toJSONString(mqttConfig));
+        log.setType(Constants.ONE);
+        log.setMsg("");
+        log.setInfo(info);
+        mqttLogMapper.insert(log);
+        return  log;
     }
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/DeviceSubscribeServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/DeviceSubscribeServiceImpl.java
index 6da2187..fe881db 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/DeviceSubscribeServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/DeviceSubscribeServiceImpl.java
@@ -1,14 +1,23 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.doumee.core.constants.Constants;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.mqtt.config.MqttConfig;
 import com.doumee.core.mqtt.service.MqttToolService;
+import com.doumee.dao.business.MqttLogMapper;
+import com.doumee.dao.business.model.Bikes;
 import com.doumee.dao.business.model.Locks;
-import com.doumee.service.business.DeviceService;
-import com.doumee.service.business.DeviceSubcribeService;
+import com.doumee.dao.business.model.MemberRides;
+import com.doumee.dao.business.model.MqttLog;
+import com.doumee.service.business.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
+import java.util.Date;
 
 /**
  *  涓庣‖浠跺鎺ユ湇鍔�
@@ -16,10 +25,81 @@
  * @date 2023/10/09 18:06
  */
 @Service
+@Slf4j
 public class DeviceSubscribeServiceImpl implements DeviceSubcribeService {
-
+    @Autowired
+    MemberRidesService memberRidesService;
+    @Autowired
+    private MqttLogMapper mqttLogMapper;
+    @Autowired
+    private MqttConfig mqttConfig;
     @Override
     public void listener(String param,String topic) {
-        System.out.println("mqtt娑堟伅璁㈤槄==================="+param);
+       log.info("mqtt娑堟伅璁㈤槄==================="+param);
+        String info = Constants.MqttTopic.lockInfo.substring(Constants.MqttTopic.lockInfo.lastIndexOf("/")+1) ;
+        String closeLock = Constants.MqttTopic.lockInfo.substring(Constants.MqttTopic.closeLock.lastIndexOf("/")+1) ;
+        if(topic.indexOf(Constants.MqttTopic.topic_index)!=0
+                || (!StringUtils.contains(topic, info)
+                   &&!StringUtils.contains(topic,closeLock))){
+            log.error("mqtt娑堟伅璁㈤槄===========鏃犳晥鏁版嵁========"+param);
+            return;
+        }
+        String lockid =  getLockIdFromTopic(topic);
+        if(StringUtils.isBlank(lockid)){
+            //濡傛灉閿佸ご缂栫爜涓虹┖
+            log.error("mqtt娑堟伅璁㈤槄==============鏃犳晥鏁版嵁====="+param);
+            return;
+        }
+        String logId =Constants.getUUID();
+        String logInfo = "";
+        int result =0;
+        try {
+
+            if(StringUtils.contains(topic, info)){
+                //濡傛灉閿佸ご淇℃伅涓婃姤
+                Locks locks  = JSONObject.parseObject(param, Locks.class);
+                locks.setId(lockid);
+                locks.setInfo(logId);
+                result = memberRidesService.mqttLockInfoEvent(locks);
+                logInfo = "涓婃姤閿佸ご淇℃伅";
+                log.info("mqtt娑堟伅璁㈤槄=========閿佷俊鎭�==========鎴愬姛");
+            }
+            if(StringUtils.contains(topic, closeLock)){
+                //濡傛灉杩樿溅涓婃姤
+                JSONObject pjson  = JSONObject.parseObject(param);
+                String bikeCode = pjson.getString("bikeCode");
+                MemberRides bikes = new MemberRides();
+                bikes.setBikeCode(bikeCode);
+                bikes.setBackLockId(lockid);
+                bikes.setBackCommondId(logId);
+                result = memberRidesService.mqttCloseBikeEvent(bikes);
+                logInfo = "涓婃姤杩樿溅娑堟伅";
+                log.info("mqtt娑堟伅璁㈤槄=========杩樿溅==========鎴愬姛");
+            }
+        }catch (BusinessException e){
+            result =1;
+        }catch (Exception e){
+            result =1;
+        }
+        createSubLog(topic,logId,result,param,logInfo);
+    }
+    private void createSubLog(String topic, String logId, int result,String param,String info) {
+        MqttLog log = new MqttLog();
+        log.setId(logId);
+        log.setCreateDate(new Date());
+        log.setResult(result);
+        log.setTopic(topic);
+        log.setClientid(mqttConfig.getClientid());
+        log.setHostInfo(mqttConfig.getHost());
+        log.setInfo(JSONObject.toJSONString(mqttConfig));
+        log.setType(Constants.ZERO);
+        log.setMsg(param);
+        log.setInfo(info);
+        mqttLogMapper.insert(log);
+    }
+    private String getLockIdFromTopic(String topic) {
+        topic = topic.substring(0,topic.lastIndexOf("/"));
+        String id =  topic.substring( topic.lastIndexOf("/")+1);
+        return  id;
     }
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
index 8010bb4..3ec4033 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -429,13 +429,13 @@
         BigDecimal closeMoney = new BigDecimal(0.00);
         int durationSum = 0;
         //鍙栨渶楂樿溅鍨嬭绠楁柟妗堢粨绠楄鍗�
-        MemberRides topRides =null;
         for(MemberRides rides : memberRides){
             if ( isClose && Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey()!=(Constants.formatIntegerNum(rides.getStatus()))){
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠璁㈠崟鏈夋湭瀹屾垚鐨勯獞琛岋紝鏃犳硶寮哄埗缁撶畻");
             }
             durationSum += Constants.formatIntegerNum(rides.getDuration());//绱楠戣锛堣璐癸級鏃堕暱
         }
+        MemberRides topRides =memberRides.get(0);
         if(durationSum > 0 && topRides != null){
             int baseTime =Constants.formatIntegerNum(topRides.getBaseTime());
             closeMoney = Constants.formatDecimalNum(topRides.getBasePrice());
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/LocksServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/LocksServiceImpl.java
index 2a42a7d..af86451 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/LocksServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/LocksServiceImpl.java
@@ -10,6 +10,7 @@
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.service.business.SitesService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -142,4 +143,6 @@
         QueryWrapper<Locks> wrapper = new QueryWrapper<>(locks);
         return locksMapper.selectCount(wrapper);
     }
+
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java
index 0f68927..9a9669f 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java
@@ -13,9 +13,7 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.ActionLogMapper;
-import com.doumee.dao.business.LocksMapper;
-import com.doumee.dao.business.MemberRidesMapper;
+import com.doumee.dao.business.*;
 import com.doumee.dao.business.join.MemberRidesJoinMapper;
 import com.doumee.dao.business.model.*;
 import com.doumee.dao.business.web.request.MemberRidesQuery;
@@ -59,6 +57,10 @@
 
     @Autowired
     private LocksMapper locksMapper;
+    @Autowired
+    private SitesMapper sitesMapper;
+    @Autowired
+    private BikesMapper bikesMapper;
 
     @Autowired
     private GoodsorderService goodsorderService;
@@ -366,8 +368,8 @@
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀛樺湪楠戣涓溅杈嗭紝鏃犳硶鎵爜");
         };
         Locks locks = locksMapper.selectOne(new QueryWrapper<Locks>().eq("code",code).eq("isdeleted", Constants.ZERO).last("limit 1"));
-        Boolean flag = deviceService.openLock(locks);
-        if(!flag){
+        MqttLog flag = deviceService.openLock(locks);
+        if(flag.getResult() == 0){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"寮�閿佸け璐�");
         }
         //瀛樺偍楠戣璁板綍
@@ -397,4 +399,139 @@
         return memberRidesDetailResponse;
 
     }
+
+    /**
+     * 閿佸ご淇℃伅涓婃姤
+     * @param locks
+     * @return
+     */
+    @Override
+    public  int mqttLockInfoEvent(Locks locks){
+        //鍒ゆ柇妫�鏌ュ鐞嗙珯鐐归攣澶翠俊鎭�
+        Locks model = dealLockAndSite(locks);
+        //杞﹁締璁板綍
+        Bikes bikes = dealBikesByParam(model);
+
+        //鐘舵�侊紝0闂悎, 1鎵撳紑锛�2杩愯涓�, 3寮傚父
+        if(model.getStatus() == Constants.LockStatus.open){
+            //濡傛灉鏄紑閿佷笟鍔★紝鍒ゆ柇鏄惁鏈夊紑閿佷腑鐨勪俊鎭�
+            if(StringUtils.isNotBlank(locks.getBikeCode())){
+
+            }
+            MemberRides memberRides = new MemberRides();
+            memberRides.setBikeCode(model.getBikeCode());
+
+
+        }
+        return 0;
+    }
+
+    private Bikes dealBikesByParam(Locks model) {
+        QueryWrapper<Bikes> wrapper = new QueryWrapper<>();
+        wrapper.lambda().eq(Bikes::getLockId, model.getId());
+        wrapper.lambda().eq(Bikes::getSiteId, model.getSiteId());
+        Bikes bikes = bikesMapper.selectOne(wrapper.last("last 1"));
+        if(bikes != null ) {
+            if (  StringUtils.equals(model.getBikeCode(), bikes.getCode())){
+                //濡傛灉缁戝畾杞﹁締淇℃伅鍙戠敓缂栧彿锛屾洿鎹㈢粦瀹氬叧绯�
+                bikes.setCode(model.getBikeCode());
+                bikes.setParamId(getBileTypeByCode(model.getBikeCode()));
+                UpdateWrapper<Bikes> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.lambda().set(Bikes::getId, bikes.getId());
+
+                //鏇存柊鑷绔欑偣閿佸ご缁戝畾鑷杞︿俊鎭�
+                bikesMapper.updateById(bikes);
+            }
+        }else{
+            bikes = new Bikes();
+            bikes.setId(Constants.getUUID());
+            bikes.setIsdeleted(Constants.ZERO);
+            bikes.setCreateDate(new Date());
+            bikes.setSiteId(model.getSiteId());
+            bikes.setLockId(model.getId());
+            bikes.setCode(model.getBikeCode());
+            bikes.setParamId(getBileTypeByCode(model.getBikeCode()));
+            bikesMapper.insert(bikes);
+        }
+        return  bikes;
+
+    }
+
+    //TODO-----JP------------鏍规嵁杞﹁締code鍒嗘瀽杞﹁締绫诲瀷锛屽緟纭鏂规-------------------
+    private String getBileTypeByCode(String bikeCode) {
+        return null;
+    }
+
+    private Locks dealLockAndSite(Locks locks) {
+        Locks model =   locksMapper.selectById(locks.getId());
+        Date date =new Date();
+        //妫�鏌ョ珯鐐逛俊鎭紝涓嶅瓨鍦ㄥ垯鏂板
+//        boolean newSite =false;
+        Sites sites = sitesMapper.selectById(locks.getSiteId());
+        if(sites == null){
+            sites = new Sites();
+            sites.setIsdeleted(Constants.ZERO);
+            sites.setCode(locks.getSiteId());
+            sites.setId(locks.getSiteId());
+            sites.setCreateDate(date);
+            sites.setStatus(Constants.ZERO);
+            sites.setLockNum(1);
+            //鏂板閿佸ご
+            sitesMapper.insert(sites);
+//            newSite =true;
+        }
+
+        if(model == null){
+            //濡傛灉閿佸ご涓嶅瓨鍦紝鍒ゆ柇瀛樺偍
+            model = new Locks();
+            model.setId(locks.getId());
+            model.setSiteId(locks.getSiteId());
+            model.setIsdeleted(Constants.ZERO);
+            model.setCode(locks.getCode());
+            model.setSiteId(locks.getSiteId());
+            model.setBikeCode(locks.getBikeCode());
+            model.setCreateDate(date);
+            model.setStatus(locks.getStatus());
+            locksMapper.insert(model);
+         /*   UpdateWrapper<Sites> wrapper = new UpdateWrapper();
+            wrapper.eq("id",sites.getId());
+            wrapper.lambda().setSql("lock_num = COALESCE(lock_num,0)  + 1");
+            wrapper.lambda().set(Sites::getEditDate,date);
+            sitesMapper.update(null,wrapper);//绱閿佸ご鏁伴噺*/
+        }else{
+          /*  if(!StringUtils.equals(model.getId(),locks.getId())){
+                //濡傛灉绔欑偣鍙戠敓鍙樺寲锛屽師鏉ョ殑绔欑偣閿佸ご鏁伴噺-1
+                UpdateWrapper<Sites> wrapper = new UpdateWrapper();
+                wrapper.eq("id",model.getId());
+                wrapper.lambda().setSql("lock_num = COALESCE(lock_num,0)  - 1");
+                wrapper.lambda().set(Sites::getEditDate,date);
+                sitesMapper.update(null,wrapper);//绱閿佸ご鏁伴噺
+            }
+            if(!newSite){
+                //濡傛灉绔欑偣鏈彂鐢熷彉鍖栵紝 骞朵笖涓嶆槸鏂扮珯鐐癸紝绔欑偣閿佸ご+1
+                UpdateWrapper<Sites> wrapper = new UpdateWrapper();
+                wrapper.eq("id",model.getId());
+                wrapper.lambda().setSql("lock_num = COALESCE(lock_num,0)  - 1");
+                wrapper.lambda().set(Sites::getEditDate,date);
+                sitesMapper.update(null,wrapper);//绱閿佸ご鏁伴噺
+            }*/
+            model.setSiteId(locks.getSiteId());
+            model.setIsdeleted(Constants.ZERO);
+            model.setCode(locks.getCode());
+            model.setId(locks.getSiteId());
+            model.setEditDate(date);
+            model.setBikeCode(locks.getBikeCode());
+            model.setStatus(locks.getStatus());
+            locksMapper.update(null, new QueryWrapper<>(model));
+
+        }
+        model.setSites(sites);
+        return  model;
+    }
+
+    @Override
+    public  int mqttCloseBikeEvent(MemberRides bikes){
+        return  0;
+
+    }
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/MqttLogServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/MqttLogServiceImpl.java
new file mode 100644
index 0000000..d7a82f1
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/MqttLogServiceImpl.java
@@ -0,0 +1,145 @@
+package com.doumee.service.business.impl;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.MqttLogMapper;
+import com.doumee.dao.business.model.MqttLog;
+import com.doumee.service.business.MqttLogService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+
+/**
+ * 绯荤粺琛屼负鎿嶄綔璁板綍琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/10/12 14:25
+ */
+@Service
+public class MqttLogServiceImpl implements MqttLogService {
+
+    @Autowired
+    private MqttLogMapper mqttLogMapper;
+
+    @Override
+    public String create(MqttLog mqttLog) {
+        mqttLogMapper.insert(mqttLog);
+        return mqttLog.getId();
+    }
+
+    @Override
+    public void deleteById(String id) {
+        mqttLogMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(MqttLog mqttLog) {
+        UpdateWrapper<MqttLog> deleteWrapper = new UpdateWrapper<>(mqttLog);
+        mqttLogMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<String> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        mqttLogMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(MqttLog mqttLog) {
+        mqttLogMapper.updateById(mqttLog);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<MqttLog> mqttLogs) {
+        if (CollectionUtils.isEmpty(mqttLogs)) {
+            return;
+        }
+        for (MqttLog mqttLog: mqttLogs) {
+            this.updateById(mqttLog);
+        }
+    }
+
+    @Override
+    public MqttLog findById(String id) {
+        return mqttLogMapper.selectById(id);
+    }
+
+    @Override
+    public MqttLog findOne(MqttLog mqttLog) {
+        QueryWrapper<MqttLog> wrapper = new QueryWrapper<>(mqttLog);
+        return mqttLogMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<MqttLog> findList(MqttLog mqttLog) {
+        QueryWrapper<MqttLog> wrapper = new QueryWrapper<>(mqttLog);
+        return mqttLogMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<MqttLog> findPage(PageWrap<MqttLog> pageWrap) {
+        IPage<MqttLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<MqttLog> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(MqttLog::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(MqttLog::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(MqttLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(MqttLog::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(MqttLog::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(MqttLog::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(MqttLog::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(MqttLog::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getInfo() != null) {
+            queryWrapper.lambda().eq(MqttLog::getInfo, pageWrap.getModel().getInfo());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(MqttLog::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getClientid() != null) {
+            queryWrapper.lambda().eq(MqttLog::getClientid, pageWrap.getModel().getClientid());
+        }
+        if (pageWrap.getModel().getTopic() != null) {
+            queryWrapper.lambda().eq(MqttLog::getTopic, pageWrap.getModel().getTopic());
+        }
+        if (pageWrap.getModel().getMsg() != null) {
+            queryWrapper.lambda().eq(MqttLog::getMsg, pageWrap.getModel().getMsg());
+        }
+        if (pageWrap.getModel().getResult() != null) {
+            queryWrapper.lambda().eq(MqttLog::getResult, pageWrap.getModel().getResult());
+        }
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(mqttLogMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(MqttLog mqttLog) {
+        QueryWrapper<MqttLog> wrapper = new QueryWrapper<>(mqttLog);
+        return mqttLogMapper.selectCount(wrapper);
+    }
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java
index 7fdb63f..0540f81 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java
@@ -205,8 +205,8 @@
         IPage<Sites> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         QueryWrapper<Sites> queryWrapper = new QueryWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
-//        queryWrapper.select("*,(select count(r.id) from locks r where r.site_id = sites.id) as localCount" +
-        queryWrapper.select("*,(select count(r.bike_code) from locks r where r.site_id = sites.id and r.bike_code is null and r.bike_code !='' ) as bikeCount");
+        queryWrapper.select("*,(select count(r.id) from locks r where r.site_id = sites.id) as all_lock_num" +
+         ",(select count(r.bike_code) from locks r where r.site_id = sites.id and r.bike_code is null and r.bike_code !='' ) as bikeCount");
 //        Page<SitesMonitorDTO> sitesMonitorDTO = sitesMapper.getSitesMonitorDTO(page, pageWrap.getModel().getCode(), pageWrap.getModel().getName());
         queryWrapper.lambda().like(StringUtils.isNotBlank(pageWrap.getModel().getCode()),Sites::getCode,pageWrap.getModel().getCode());
         queryWrapper.lambda().like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Sites::getCode,pageWrap.getModel().getName());
@@ -215,7 +215,7 @@
 
         if (!CollectionUtils.isEmpty(sitesMonitorDTO.getRecords())){
             sitesMonitorDTO.getRecords().forEach(s->{
-                s.setRate(new BigDecimal(s.getBikeCount()).divide(new BigDecimal(s.getLockNum()).setScale(2)));
+                s.setRate(new BigDecimal(s.getBikeCount()).divide(new BigDecimal(s.getAllLockNum()).setScale(2)));
             });
         }
 
diff --git "a/server/\350\207\252\350\241\214\350\275\246mqtt\345\215\217\350\256\256.md" "b/server/\350\207\252\350\241\214\350\275\246mqtt\345\215\217\350\256\256.md"
new file mode 100644
index 0000000..6e9b418
--- /dev/null
+++ "b/server/\350\207\252\350\241\214\350\275\246mqtt\345\215\217\350\256\256.md"
@@ -0,0 +1,43 @@
+# 鑷杞� mqtt 鍗忚鏂囨。
+
+## 閫氫俊瑙勮寖
+- 姣忎釜绔欑偣涓�涓� mqtt 杩炴帴锛宑lientId 涓� SITE_绔欑偣缂栧彿
+- 涓�涓珯鐐圭敱閮ㄧ讲鍦ㄤ笂浣嶆満涓婄殑杞欢閫氳繃can鎬荤嚎涓庡涓攣閫氫俊锛屽苟涓庢湇鍔″櫒閫氳繃mqtt鍋氭秷鎭浆鍙�
+
+
+## sub: device/lock/{id}/info
+> **閿佷俊鎭紝鍦ㄥ垵濮嬪寲銆佺姸鎬佸彉鏇存椂浼氭帹閫侀攣鐨勫畬鏁寸姸鎬�**
+- 鏁版嵁
+```json
+{
+    "siteId": "1015", // 绔欑偣缂栧彿 
+    "code": "01", // 閿佺紪鍙�
+    "id": "123456789103", // 閿佸敮涓�id,鍚屼富棰榹id}
+    "status": 1, // 鐘舵�侊紝0闂悎, 1鎵撳紑锛�2杩愯涓�, 3寮傚父
+    "bikeCode": "1234567890" // 鑷杞c鍗″彿锛屾棤杞︿负绌�
+}
+```
+
+## pub: device/lock/{id}/getInfo
+> 瀹炴椂鑾峰彇閿佷俊鎭�
+- 鏁版嵁
+```json
+{}
+```
+
+## pub: device/lock/{id}/unlock
+> 寮�閿侊紝鎴愬姛澶辫触鍙叧娉╥nfo娑堟伅鎺ㄩ��
+- 鏁版嵁
+```json
+{}
+```
+
+## sub: device/lock/{id}/bike
+> 杩樿溅, 杩樿溅鎴愬姛鏃讹紝鑾峰緱鎵�杩樿溅杈唅c鍗″彿鎺ㄩ��
+- 鏁版嵁
+```json
+{
+    "bikeCode": "1234567890",
+    "time": "2023-10-13 10:12:90" // 绔欑偣涓婁綅鏈烘敹鍒拌繕杞︽寚浠ょ殑鏃堕棿锛屼粎鍋氬弬鑰冿紝璇蜂互鏈嶅姟鍣ㄦ椂闂翠负鍑�
+}
+```
\ No newline at end of file

--
Gitblit v1.9.3