From 694e32abbfbba9fa815ff1f5184f254045b91672 Mon Sep 17 00:00:00 2001 From: yuhaiming <40624989@qq.com> Date: Tue, 23 Jun 2026 15:36:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=AE=BE=E5=A4=87=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=94=A8=E6=88=B7=E6=A0=A1=E9=AA=8C=E3=80=81?= =?UTF-8?q?ACK=20=E5=9C=A8=E7=BA=BF=E7=8A=B6=E6=80=81=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=94=B9=E9=9D=9E=E9=98=BB=E5=A1=9E=E3=80=81=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E8=B7=9F=E8=B8=AA=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AppDeviceServiceImpl#deleteWithValidByIds 校验设备归属当前用户, 避免任意已登录用户越权删除其他用户的设备及关联数据 - MqttCommandAckService#refreshDeviceOnline 由 lock.lock 改为 tryLock, 防止 MQTT 处理线程在状态刷新锁上排队堆积;状态写入幂等,跳过本次刷新 由后续 ACK 兜底 - 从版本控制中移除 logs/ 历史日志,gitignore 已忽略该目录 Co-Authored-By: Claude Opus 4.7 (1M context) --- logs/sys-console.log | 327 ------------------ logs/sys-error.2026-04-24.log.gz | Bin 9523 -> 0 bytes logs/sys-error.2026-04-25.log.gz | Bin 25870 -> 0 bytes logs/sys-error.2026-04-28.log.gz | Bin 953 -> 0 bytes logs/sys-error.2026-04-29.log.gz | Bin 4956 -> 0 bytes logs/sys-error.2026-05-07.log.gz | Bin 24101 -> 0 bytes logs/sys-error.2026-05-08.log.gz | Bin 29779 -> 0 bytes logs/sys-error.log | 1 - logs/sys-info.2026-04-24.log.gz | Bin 2316 -> 0 bytes logs/sys-info.2026-04-25.log.gz | Bin 14523 -> 0 bytes logs/sys-info.2026-04-28.log.gz | Bin 3176 -> 0 bytes logs/sys-info.2026-04-29.log.gz | Bin 1737 -> 0 bytes logs/sys-info.2026-05-07.log.gz | Bin 8260 -> 0 bytes logs/sys-info.2026-05-08.log.gz | Bin 3708 -> 0 bytes logs/sys-info.log | 323 ----------------- .../dromara/mqtt/MqttCommandAckService.java | 29 +- .../service/impl/AppDeviceServiceImpl.java | 58 +++- 17 files changed, 73 insertions(+), 665 deletions(-) delete mode 100644 logs/sys-console.log delete mode 100644 logs/sys-error.2026-04-24.log.gz delete mode 100644 logs/sys-error.2026-04-25.log.gz delete mode 100644 logs/sys-error.2026-04-28.log.gz delete mode 100644 logs/sys-error.2026-04-29.log.gz delete mode 100644 logs/sys-error.2026-05-07.log.gz delete mode 100644 logs/sys-error.2026-05-08.log.gz delete mode 100644 logs/sys-error.log delete mode 100644 logs/sys-info.2026-04-24.log.gz delete mode 100644 logs/sys-info.2026-04-25.log.gz delete mode 100644 logs/sys-info.2026-04-28.log.gz delete mode 100644 logs/sys-info.2026-04-29.log.gz delete mode 100644 logs/sys-info.2026-05-07.log.gz delete mode 100644 logs/sys-info.2026-05-08.log.gz delete mode 100644 logs/sys-info.log diff --git a/logs/sys-console.log b/logs/sys-console.log deleted file mode 100644 index 28449be..0000000 --- a/logs/sys-console.log +++ /dev/null @@ -1,327 +0,0 @@ -2026-06-13 08:59:11 [master:housekeeper] WARN com.zaxxer.hikari.pool.HikariPool - master - Thread starvation or clock leap detected (housekeeper delta=14h57m13s457ms410µs100ns). -2026-06-13 08:59:32 [MQTT Ping: water-server-8081] ERROR o.e.p.c.mqttv3.internal.ClientState - water-server-8081: Timed out as no write activity, keepAlive=60,000,000,000 lastOutboundActivity=150,167,329,517,400 lastInboundActivity=150,167,356,610,400 time=204,053,810,500,400 lastPing=150,167,329,537,400 -2026-06-13 08:59:32 [MQTT Ping: water-server-8081] WARN org.dromara.mqtt.MqttClientManager - [MQTT] 连接已断开:Timed out while waiting to write messages to the server -2026-06-13 08:59:34 [MQTT Call: water-server-8081] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 已重新连接:ssl://service.reinkun.com:8883 -2026-06-13 08:59:34 [MQTT Call: water-server-8081] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 已订阅 主题=/+/publish/finish/schedule 服务质量等级=1 -2026-06-13 08:59:34 [MQTT Call: water-server-8081] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 已订阅 主题=/+/publish/register 服务质量等级=1 -2026-06-13 08:59:34 [MQTT Call: water-server-8081] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 已订阅 主题=/+/publish/power 服务质量等级=1 -2026-06-13 08:59:34 [MQTT Call: water-server-8081] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 已订阅 主题=/+/publish/ack 服务质量等级=1 -2026-06-13 08:59:34 [MQTT Call: water-server-8081] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 已订阅 主题=/+/publish/finish/key 服务质量等级=1 -2026-06-13 08:59:34 [MQTT Call: water-server-8081] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 已订阅 主题=/+/publish/error 服务质量等级=1 -2026-06-13 08:59:34 [mqtt-consumer-7] WARN o.d.a.handler.ScheduleFinishHandler - [MQTT] 排程完成上报未找到设备绑定的排程 时间=2026-06-13 08:59:34 设备编号=01 -2026-06-13 08:59:34 [mqtt-consumer-4] INFO o.d.app.handler.DeviceDataHandler - [MQTT] 设备电量更新 时间=2026-06-13 08:59:34 设备编号=01 消息体={ - "deviceName": "Waterer_01", - "powerLevel": 50, - "charging": 0 -} -2026-06-13 08:59:34 [mqtt-consumer-7] INFO o.d.a.handler.ScheduleFinishHandler - [MQTT] 浇水排程上报已保存 时间=2026-06-13 08:59:34 设备编号=01 消息体={ - "deviceNo": "01", - "startWeek": 5, - "startTime": "2026-06-11 8:20", - "durationMin": 20, - "triggerType": "mqtt on", - "triggerON":"mqtt on", - "triggerOFF":"mqtt off" -} -2026-06-13 08:59:34 [mqtt-consumer-8] INFO o.d.a.handler.DeviceRegisterHandler - [MQTT] 设备注册 时间=2026-06-13 08:59:34 设备编号=01 消息体={ - "deviceNo": "01", - "deviceName": "Waterer_01", - "powerLevel": 63, - "deviceEm": "11667796A-Y43-2606", - "deviceSn": "260601", - "deviceMac": "dc:da:0c:fa:28:9c", - "version": "1.0" -} -2026-06-13 09:00:02 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:00:02 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[19]毫秒 -2026-06-13 09:00:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:00:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[18]毫秒 -2026-06-13 09:00:52 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:00:52 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[9]毫秒 -2026-06-13 09:01:28 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:01:28 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:02:04 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:02:04 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:02:06 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:02:06 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 09:05:12 [schedule-pool-10] INFO o.d.app.task.DeviceOfflineCheckTask - [设备离线] 检测到 1 台设备离线,已更新数据库状态,设备编号:[01] -2026-06-13 09:05:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"DC:DA:0C:FA:28:9E"}] -2026-06-13 09:05:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[3]毫秒 -2026-06-13 09:05:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:05:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:06:56 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:06:56 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 09:07:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"DC:DA:0C:FA:28:9E"}] -2026-06-13 09:07:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[8]毫秒 -2026-06-13 09:07:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:07:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[18]毫秒 -2026-06-13 09:08:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:08:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"dc:da:0c:fa:28:9c"}] -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[2]毫秒 -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:08:48 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:08:48 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:08:49 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:08:49 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:08:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:08:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 09:08:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:08:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[3]毫秒 -2026-06-13 09:08:54 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:08:54 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 09:09:18 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:09:18 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:09:19 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:09:19 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:11:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:11:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[11]毫秒 -2026-06-13 09:12:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:12:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:12:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:12:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[3]毫秒 -2026-06-13 09:13:56 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:13:56 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[18]毫秒 -2026-06-13 09:15:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:15:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 09:15:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:15:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[5]毫秒 -2026-06-13 09:15:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/scheduleDeviceList/2062827585485807618],无参数 -2026-06-13 09:15:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/scheduleDeviceList/2062827585485807618],耗时:[7]毫秒 -2026-06-13 09:15:36 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/addScheduleDevice],参数类型[JSON],参数:[{"scheduleId":"2062827585485807618","deviceNos":["1779176626954"]}] -2026-06-13 09:15:36 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/addScheduleDevice],耗时:[20]毫秒 -2026-06-13 09:15:37 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:15:37 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[11]毫秒 -2026-06-13 09:15:40 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:15:40 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[4]毫秒 -2026-06-13 09:15:46 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:15:46 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[6]毫秒 -2026-06-13 09:15:50 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:15:50 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[11]毫秒 -2026-06-13 09:15:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:15:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[6]毫秒 -2026-06-13 09:17:42 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:17:42 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 09:17:47 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:17:47 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[8]毫秒 -2026-06-13 09:17:48 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:17:48 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[9]毫秒 -2026-06-13 09:17:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:17:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[11]毫秒 -2026-06-13 09:24:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:24:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 09:24:17 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:24:17 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 09:26:05 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:26:05 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:26:07 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:26:07 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 09:27:39 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:27:39 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:27:40 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:27:40 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[22]毫秒 -2026-06-13 09:46:39 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:46:39 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[26]毫秒 -2026-06-13 09:46:42 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:46:42 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[16]毫秒 -2026-06-13 09:46:54 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":["fuck"],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:46:54 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[20]毫秒 -2026-06-13 09:46:58 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:46:58 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 09:47:10 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":["fuck"],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:47:10 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[11]毫秒 -2026-06-13 09:47:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:47:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 09:49:16 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:49:16 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 09:49:18 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:49:18 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 09:49:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":["666"],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:49:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[12]毫秒 -2026-06-13 09:49:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:49:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 09:51:11 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/waterLogList],参数类型[表单参数],参数:[{"pageNum":["1"]}] -2026-06-13 09:51:11 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/waterLogList],耗时:[34]毫秒 -2026-06-13 09:51:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:51:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 09:51:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:51:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[13]毫秒 -2026-06-13 09:51:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:51:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:51:33 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:51:33 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[7]毫秒 -2026-06-13 09:53:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:53:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 09:53:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:53:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:53:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"dc:da:0c:fa:28:9c"}] -2026-06-13 09:53:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[4]毫秒 -2026-06-13 09:53:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:53:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[13]毫秒 -2026-06-13 09:54:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:54:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:54:21 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:54:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"dc:da:0c:fa:28:9e"}] -2026-06-13 09:54:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[1]毫秒 -2026-06-13 09:54:21 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:54:46 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:54:46 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:54:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"DC:DA:0C:FA:28:9E"}] -2026-06-13 09:54:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[4]毫秒 -2026-06-13 09:54:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:54:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 09:55:12 [mqtt-consumer-16] INFO o.d.a.handler.DeviceRegisterHandler - [MQTT] 设备注册 时间=2026-06-13 09:55:12 设备编号=01 消息体={ - "deviceNo": "01", - "deviceName": "Waterer_01", - "powerLevel": 48, - "deviceEm": "11667796A-Y43-2606", - "deviceSn": "260601", - "deviceMac": "dc:da:0c:fa:28:9c", - "version": "1.0" -} -2026-06-13 09:55:12 [mqtt-consumer-13] INFO o.d.app.handler.DeviceDataHandler - [MQTT] 设备电量更新 时间=2026-06-13 09:55:12 设备编号=01 消息体={ - "deviceName": "Waterer_01", - "powerLevel": 48, - "charging": 0 -} -2026-06-13 09:55:12 [mqtt-consumer-14] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=2ab3a6e58d1b4a89919d218fda63b3f7 状态=null -2026-06-13 09:55:38 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/addDevice],参数类型[JSON],参数:[{"deviceName":"浇水设备007","wifiName":"研发部","wifiPassword":"ckkj123456","macAddress":"DC:DA:0C:FA:28:9E","deviceNo":"01"}] -2026-06-13 09:55:38 [XNIO-1 task-4] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 消息已发布 主题=/01/subscriber/cmd 消息体={"commandType":"bindDevice","deviceNo":"01","cmd":-1,"commandId":"73669072eb924e9f9772d80fb9be57f8","bindStatus":true} -2026-06-13 09:55:38 [XNIO-1 task-4] INFO o.d.a.s.i.DeviceCommandServiceImpl - [命令] 命令已下发 设备编号=01 命令类型=bindDevice 命令编号=73669072eb924e9f9772d80fb9be57f8 -2026-06-13 09:55:38 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/addDevice],耗时:[39]毫秒 -2026-06-13 09:55:38 [mqtt-consumer-11] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=73669072eb924e9f9772d80fb9be57f8 状态=null -2026-06-13 09:55:39 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:55:39 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:55:59 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:56:00 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:56:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"DC:DA:0C:FA:28:9E"}] -2026-06-13 09:56:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[1]毫秒 -2026-06-13 09:56:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:56:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[13]毫秒 -2026-06-13 09:57:15 [mqtt-consumer-8] INFO o.d.a.handler.DeviceRegisterHandler - [MQTT] 设备注册 时间=2026-06-13 09:57:15 设备编号=01 消息体={ - "deviceNo": "01", - "deviceName": "Waterer_01", - "powerLevel": 48, - "deviceEm": "11667796A-Y43-2606", - "deviceSn": "260601", - "deviceMac": "dc:da:0c:fa:28:9c", - "version": "1.0" -} -2026-06-13 09:57:15 [mqtt-consumer-8] INFO o.d.app.handler.DeviceDataHandler - [MQTT] 设备电量更新 时间=2026-06-13 09:57:15 设备编号=01 消息体={ - "deviceName": "Waterer_01", - "powerLevel": 48, - "charging": 0 -} -2026-06-13 09:57:15 [mqtt-consumer-12] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=2ab3a6e58d1b4a89919d218fda63b3f7 状态=null -2026-06-13 09:57:39 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/addDevice],参数类型[JSON],参数:[{"deviceName":"智能浇水","wifiName":"测试机","wifiPassword":"66668888","macAddress":"DC:DA:0C:FA:28:9E","deviceNo":"01"}] -2026-06-13 09:57:39 [XNIO-1 task-4] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 消息已发布 主题=/01/subscriber/cmd 消息体={"commandType":"bindDevice","deviceNo":"01","cmd":-1,"commandId":"a783262582fd41fcb09d59d55a07c9e3","bindStatus":true} -2026-06-13 09:57:39 [XNIO-1 task-4] INFO o.d.a.s.i.DeviceCommandServiceImpl - [命令] 命令已下发 设备编号=01 命令类型=bindDevice 命令编号=a783262582fd41fcb09d59d55a07c9e3 -2026-06-13 09:57:39 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/addDevice],耗时:[35]毫秒 -2026-06-13 09:57:40 [mqtt-consumer-3] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=a783262582fd41fcb09d59d55a07c9e3 状态=null -2026-06-13 09:57:40 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:57:40 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:59:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:59:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:59:57 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:59:58 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 10:02:09 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:02:09 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:02:11 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 10:02:11 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[3]毫秒 -2026-06-13 10:02:12 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:02:12 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[18]毫秒 -2026-06-13 10:03:42 [schedule-pool-5] INFO o.d.app.task.DeviceOfflineCheckTask - [设备离线] 检测到 1 台设备离线,已更新数据库状态,设备编号:[01] -2026-06-13 10:04:26 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:04:26 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:11:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 10:11:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 10:12:03 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:12:03 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[13]毫秒 -2026-06-13 10:12:20 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:20 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 10:12:23 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":["fuck"],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:23 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[13]毫秒 -2026-06-13 10:12:28 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:28 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 10:12:36 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:36 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[7]毫秒 -2026-06-13 10:12:38 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":["66"],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:38 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 10:12:42 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:42 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 10:16:20 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:16:20 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[7]毫秒 -2026-06-13 10:16:22 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:16:22 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 10:16:46 [mqtt-consumer-1] INFO o.d.a.handler.DeviceRegisterHandler - [MQTT] 设备注册 时间=2026-06-13 10:16:46 设备编号=01 消息体={ - "deviceNo": "01", - "deviceName": "Waterer_01", - "powerLevel": 48, - "deviceEm": "11667796A-Y43-2606", - "deviceSn": "260601", - "deviceMac": "dc:da:0c:fa:28:9c", - "version": "1.0" -} -2026-06-13 10:16:46 [mqtt-consumer-16] INFO o.d.app.handler.DeviceDataHandler - [MQTT] 设备电量更新 时间=2026-06-13 10:16:46 设备编号=01 消息体={ - "deviceName": "Waterer_01", - "powerLevel": 48, - "charging": 0 -} -2026-06-13 10:16:47 [mqtt-consumer-16] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=2ab3a6e58d1b4a89919d218fda63b3f7 状态=null -2026-06-13 10:16:57 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/addDevice],参数类型[JSON],参数:[{"deviceName":"还是浇水设备","wifiName":"研发部","wifiPassword":"ckkj123456","macAddress":"DC:DA:0C:FA:28:9E","deviceNo":"01"}] -2026-06-13 10:16:57 [XNIO-1 task-4] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 消息已发布 主题=/01/subscriber/cmd 消息体={"commandType":"bindDevice","deviceNo":"01","cmd":-1,"commandId":"00119ae0fc844c1c88d61052e1ded66b","bindStatus":true} -2026-06-13 10:16:57 [XNIO-1 task-4] INFO o.d.a.s.i.DeviceCommandServiceImpl - [命令] 命令已下发 设备编号=01 命令类型=bindDevice 命令编号=00119ae0fc844c1c88d61052e1ded66b -2026-06-13 10:16:57 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/addDevice],耗时:[36]毫秒 -2026-06-13 10:16:57 [mqtt-consumer-6] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=00119ae0fc844c1c88d61052e1ded66b 状态=null -2026-06-13 10:16:58 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 10:16:58 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[5]毫秒 -2026-06-13 10:17:04 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:17:04 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:18:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:18:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 10:23:12 [schedule-pool-4] INFO o.d.app.task.DeviceOfflineCheckTask - [设备离线] 检测到 1 台设备离线,已更新数据库状态,设备编号:[01] -2026-06-13 10:34:56 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:34:56 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[22]毫秒 -2026-06-13 10:34:57 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:34:57 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 10:35:05 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:35:05 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:35:05 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:35:05 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:37:22 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:37:22 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:37:22 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[18]毫秒 -2026-06-13 10:37:22 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 10:38:02 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/waterLogList],参数类型[表单参数],参数:[{"pageNum":["1"]}] -2026-06-13 10:38:02 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/waterLogList],耗时:[14]毫秒 -2026-06-13 10:38:06 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:38:06 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 10:38:08 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/waterLogList],参数类型[表单参数],参数:[{"pageNum":["1"]}] -2026-06-13 10:38:08 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/waterLogList],耗时:[12]毫秒 -2026-06-13 10:38:08 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:38:08 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 10:38:09 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:09 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:38:13 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/getUserInfo],无参数 -2026-06-13 10:38:13 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/getUserInfo],耗时:[9]毫秒 -2026-06-13 10:38:14 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:14 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 10:38:16 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/getUserInfo],无参数 -2026-06-13 10:38:16 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/getUserInfo],耗时:[6]毫秒 -2026-06-13 10:38:19 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:19 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/getUserInfo],无参数 -2026-06-13 10:38:19 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/getUserInfo],耗时:[5]毫秒 -2026-06-13 10:38:19 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 10:38:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 10:38:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 10:38:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[13]毫秒 -2026-06-13 10:38:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 10:38:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 diff --git a/logs/sys-error.2026-04-24.log.gz b/logs/sys-error.2026-04-24.log.gz deleted file mode 100644 index 592281e1b75b27e7c477eeac4509478815b50698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9523 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 diff --git a/logs/sys-error.2026-04-25.log.gz b/logs/sys-error.2026-04-25.log.gz deleted file mode 100644 index 08307f32314e4ee8db9392fbb1b917dc7381ce82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25870 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 diff --git a/logs/sys-error.2026-04-28.log.gz b/logs/sys-error.2026-04-28.log.gz deleted file mode 100644 index 46bee4774519b06019ab6efcee860cf600fe84e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 953 zcmV;q14jHGiwFP!00000|E-u$kK05Thwn&y2jBKmdp(mlj`x-(yNRQS^ch>G2U4=XidAmQ|cD9=!h^{9o+w@9cpPd5bVbh0xtkGHwBR zE<#>W`N*rdAVNX%S6Dy`3rJuaY+xI-u#g0{$p*Gb3)>)pmDs>aw6IMQ*cKbu7B#HQ zojJNX;sIBAW%B2LC>KJ^QVNkU_RKs%i{slegBv~!w0r*g`sF9vuU~Ax`RL%Vyu_T@ z;i^Q%;S5#kVwxY^*%{qEam+t1#-ee=a{KYxWThmqe8 z;!!+QCmR*$v0ADNLkhZTOHG!J)g3AV9#r};T>2@#(4W+UZ;tE1+4`Xi)799%SD)V? zN1uj{o(A)Lt;QE|kV$4ZQ0r^+(TUOblXW+A3|({Fre-TcO_VI(j4H!SyV@cV(Of?< z_jUEsv#nLwPZM>X$F6D3-CmgLy_uxh!)#<)iDuthk4*JK&-7HA8<7sxjh0Q~)9z4o zZ7K2>#?Y-7GVfeyJ^bm`i?cSaGu)ro#uxFPHNj);{kkHz58kcINQ1%6e9i1^aLvSZ z?uur1Qn_PXbA@K<$o?QfS?_$5Ip^I!=Jf76M(RT464m2k`~~vjasW5UbZl7DG)|g* zJ&@GShjvR|ioC;*gP=2r?q`#!r5)V4e)Qz})t9@gUw(ab_4XD1ogVLg{Pg;#&;Mor zNF>yfYQ2cLNhSZZe52Cm&^e1hSZO?xPCS|+y5*7de@_O7- diff --git a/logs/sys-error.2026-04-29.log.gz b/logs/sys-error.2026-04-29.log.gz deleted file mode 100644 index 38a23411602393084edf3f6ea2a80ae500b17c8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4956 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 I0^->J1Cw+GxBvhE diff --git a/logs/sys-error.2026-05-08.log.gz b/logs/sys-error.2026-05-08.log.gz deleted file mode 100644 index 2cf719e94957b956e9989dd0713e7b61bfef4975..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29779 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 He)oR>;}J?G diff --git a/logs/sys-error.log b/logs/sys-error.log deleted file mode 100644 index efa226c..0000000 --- a/logs/sys-error.log +++ /dev/null @@ -1 +0,0 @@ -2026-06-13 08:59:32 [MQTT Ping: water-server-8081] ERROR o.e.p.c.mqttv3.internal.ClientState - water-server-8081: Timed out as no write activity, keepAlive=60,000,000,000 lastOutboundActivity=150,167,329,517,400 lastInboundActivity=150,167,356,610,400 time=204,053,810,500,400 lastPing=150,167,329,537,400 diff --git a/logs/sys-info.2026-04-24.log.gz b/logs/sys-info.2026-04-24.log.gz deleted file mode 100644 index a10ea6824bcd216076f167404fcda1fa23efa326..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2316 zcmV+n3G?AKdFn5ILx3KN=4)F=zjDD_rp2I8>L|~18_yKcUNO89-bAHm<( z8o!&yX!hC^HM!&Po@A~g&*x3%P{afxR=`eZ9ld4Klebh@rPr|-#}Gm42fT*`^-mlc z0KhgxlR+%*$^ILjFMrUENo^a(_6ap7=xlI^?`g0Al!Z-f!=KH*OFGQj z@A?)6Tsyi|fE*wqx@gmYS^?UrGE4%ZFZOV z3~z-$UIXtC0Rfsw7L4)vzKce^R9j*0$N0JAeyvihWSaU(29q@P0jpfhC-oIjd8NJz zI>pq#xNnbhCkEJox07A3hcjq#*M&jJV9M5=zWB9+tz&#_n-<;}-Q4bY&Ui%!e zo0AlUPQSrX)*dGGZDkHyNRTPEAIX>P0PA8KIX* zsamCWA|{uT5ek5uWkgyG(v}gxOSL_xB_kBwCzBDSP)`pV7F-$x{eoVoj9L45oQo5g zC$_j_hgqUeB&!%sB)bQ*(}XJRaEmx?E`n>iAxkF|&w8b}R$G)wX$dCP)R;_3Q-UF2 z_!wRk@@w6Mof_(B!}6IId~iywF6>BeH(bJ;8&GENz&<8`(81`#5jyB`|E}3dv3^;bXbX;uU-oWR3{8 zx$|rIIJz@u70;Lsfg3Tq4Tn)TkZ(ZPuft?SFkOG7TjYZUcmNHaK6&}z-)DdM`}WR@ z@4l~tGBL1Tkuu59*A@adaR;Ix@U6ZH-HRQkE2j7H^&atQSXx>v+$g3Wfwc!R$AyX= z)+G_jgQgE9Q_eLuIS+7;nnO7uCsH=U>#oa#VMj2^Msy$KgnUQ+X{7gbvq_7FR#c6z zIvu_q_HYNJmcYUs#_xSf#=-mH)5kErPN50X>4#50|KEQe4IX~;F;tZz96%l28Q(KNz8bR??D>x6OrE-oL(5-&ynP#;#6`Y{s}Sa;yTKD($(NK8 zv;(;oCDwlO-j7W#1P;Q(r(CNy--pj=FaA8HEsO9n{a!5Jq0%dEf*jOKxLPqF2oQ4M za0TSBloQDBx~`0l+#mEZE?0Gx`ko>ap0q*DV@Iw47s^dT&^_)k>!bL>WEp5QK6vrn zvsX{P`0?qJS6|#e`|9(-EKBk@0Vg|;gz`V&QM!XDMkhM1Ddom&WZ2$u zYXtqF?^#jp1Kif`&c+aOcz%kv`Vci-Tg!oY7LJ-lh!QTUF#uNxzkV?>T%UIM#4?Ue zjNu6wwV*Y+9;$1??saWIkxii`j#!VB-%Qx6$m7uEb!1evs-9uUhVvJbZ+0E0KPOxu zGk0%oqrHtCG?rXf4CCFxaC^~p9qY><7B?Ae%YoIVeq80zJNEfY?@TeO)pcML)snGF z9nS?EcWr=fILro+U3h&GUXf*J|5kYXHQ_`cvxc6s;3}M1SrA56YI|8Kq`?xknE@X0 zpICrHBWR2ByB9=fLs}>EqBCMAhVIgg&?MsGz!5>F*+^!6#9O=J6?yO!eb z>2R16q4*k#9$7`OmYSe8$V-z_H{}UhE@56bYHtirUQ6t>C8MqtS7_nK`1x4) z)mp~?mNv;~l3Mr@tCEj}uYk(S!dF43W#KQ>cd8bCxuO*-MZ?NwlyeGmY7tCq;itwR zWeZ>OTFcJDS9PDr!j~OY6~=ivcME?Oll(3Gn8}-AH2*|4OR_5KE`3FkjY2S1k#S-`j%Ex1 diff --git a/logs/sys-info.2026-04-25.log.gz b/logs/sys-info.2026-04-25.log.gz deleted file mode 100644 index 5bb223bc2b91040572bce2ba1bdac7b33854afd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14523 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 I#b6-+4Vl+xWB>pF diff --git a/logs/sys-info.2026-04-28.log.gz b/logs/sys-info.2026-04-28.log.gz deleted file mode 100644 index 0ca8ce1a15908b8ed210c12072770397dbba6758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3176 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 O80&w35!Z0yHvj;P%pipT diff --git a/logs/sys-info.2026-04-29.log.gz b/logs/sys-info.2026-04-29.log.gz deleted file mode 100644 index ced839e6c81e12a727eb7b499f5932e379b144b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1737 zcmV;)1~&O0iwFP!00000|Ls^!ZxcrtzE|ph7@+?E_Jf@ z?tDG(yr0jkm9cV0X56r*k(td;z`uo-ZQ`s~1+NFL5emuzrdH9ymAR`3aa_Y2#A7Z| zTwoR`Dgxr+x?&z)qCzqrAOp=WW%S3)qj_fQ5sIRvWEPsj8Jxv)3?_c~fz^YbMaw>6 zK?hM(u`9Sw1i`cM?@Sna%pocUD=Q)t3#zD3Z(Zt+MY2JVISH`lBx*2KL&b$zG;NwW zbZR!g;&7L)G(biXe;dU0S+D}jR;gNXJR&8PNNO1BBD;yAegyyfCZ9fz&0MQdRNAuU`&@ z{-M52T^IItgW4%^3LMP4sfK`Zu#H{#n{5WfXHJRNwLxZyB4u6|4h38{?lQmyh>ROu zs;Hw-F;^~ribAhm1&xxxMKmC`2hy;ipt+B?$mS*$xW?9rV0b?I*$3_u2?k2}3dZe+r%e&%6k4X?SjgA1L`1wZu8Wyh)MSXuY&>{8DO z!RFK*YO6=GpaG%aB7#y)Fb34H9LutbWZiM7ly6M}7P~X@IMM1~Hdj-^jDdSYh&2bx z*H5m=10f4Cfhv6-U_o6b;UTE7DlX}VLUa$JwQhgc`tfe--d89Zg!XQIzWaP zP6d**#~tF;xKw9MOJ`2Vo%vjLa(Y-v#z&B3>Nq9Y?^6VW!SEVf6#Q$(mP$Y#EjxmR z>cS><>QInADhGslbC71QLm87G&~oQt6)iWoSeGGj=qi*GsxJsa?o&i0>h$GNA-{4R zy5ve!9nMI-<|4Px=pj`6FYLP%c6wk4ujw#rNAM!B92u3lgE71o_Z$+%)BV*Uak(vB z!DBQ~`i2WS1ImbD>Y_ti^gsg!pw`Z#SGWJ%{pr_*;>#yb^T?dGu$j{=$ucL00=Kab zR*?8|(}v|`(W}eeIzH1Nf<~#O%A!KiI|O16XifkbJIYHkq6ZZLDO2kj+ng)hpmsth zv?BF1JQD<5B@4kW%W*%@34KRJFVeZ3MRO!eou2)T=Q9UM6PT}oL+k_9l33b_{mxU; zHQtMx+ps_1r~q|(ar6E^f8A@{dHDMI^VZJ2SGTwOp^OitOR$_wNTrN6kVn_MeHO4+ zYY>6$U07>!GhiHMesX2uD%xl#`7E9SGmpFsPA#P`O(m!gz7{*y($QC6v$>R5)dVH3 zj@8BU@C=MJe(s8`lkh0(zL~v4rti}UbkMZ$_=E{Y0F#3Zr+^M?I)Owz2()!{eK51w zoHBdacOPMN9>Bonv8N*-fOJ!q^coMDbE(~sP6Orgg_lpB?LB(%dgsyJgIl}b-fwOH z-1_D*_*3i7_e0`ItYy_mO+fHd`zuB5X~3)Ha-4C7Mo99GgLT#HB%esBsVzk*(^!LC z<3wpmA1B~o7m|qnD;~Q$kYco9;^{tg1CS>MAwzk`)eiJU5jt`11KetgH!)j`;GlhbKb3A7Ncr1S^{>rtwg5kkD=j(4UPQl}n z9%h`5bh5o@U&|a-77tDc+RHjD>k_Y)q85Gbl+D0tKS6u1D90niAr@-4p?JvqFxE&4 zssX#SDGiQUL8Cd0qX!HT%%e$jki+mW9GSz6h8UMr2RLrR%Hkl`Z$~=Z>@0j*xBl4s z`j^)B7p*UUd-?2H>&_4H_wLibcOTz<_4`9T=)YOwDDMyAf}pLT6@`1=3ymnlXs>CK zToIpm^_!aa0zc?Q(b4n|7N8YU_f!{kmO@nWW`x?u22m_TIpK}(k;dM=hY-&@5Upc& flO9u)riyJ_NvTphmmItft+f9FIWnsq!507kC9_4( diff --git a/logs/sys-info.2026-05-07.log.gz b/logs/sys-info.2026-05-07.log.gz deleted file mode 100644 index c33aa77a502aab014df3294fcf959835e44b4fab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8260 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 diff --git a/logs/sys-info.2026-05-08.log.gz b/logs/sys-info.2026-05-08.log.gz deleted file mode 100644 index ecf503447b4392e25f1f04c430550587ffc24c85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3708 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 aV URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:00:02 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[19]毫秒 -2026-06-13 09:00:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:00:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[18]毫秒 -2026-06-13 09:00:52 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:00:52 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[9]毫秒 -2026-06-13 09:01:28 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:01:28 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:02:04 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:02:04 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:02:06 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:02:06 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 09:05:12 [schedule-pool-10] INFO o.d.app.task.DeviceOfflineCheckTask - [设备离线] 检测到 1 台设备离线,已更新数据库状态,设备编号:[01] -2026-06-13 09:05:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"DC:DA:0C:FA:28:9E"}] -2026-06-13 09:05:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[3]毫秒 -2026-06-13 09:05:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:05:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:06:56 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:06:56 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 09:07:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"DC:DA:0C:FA:28:9E"}] -2026-06-13 09:07:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[8]毫秒 -2026-06-13 09:07:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:07:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[18]毫秒 -2026-06-13 09:08:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:08:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"dc:da:0c:fa:28:9c"}] -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[2]毫秒 -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:08:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:08:48 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:08:48 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:08:49 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:08:49 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:08:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:08:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 09:08:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:08:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[3]毫秒 -2026-06-13 09:08:54 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:08:54 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 09:09:18 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:09:18 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:09:19 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:09:19 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:11:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:11:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[11]毫秒 -2026-06-13 09:12:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:12:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:12:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:12:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[3]毫秒 -2026-06-13 09:13:56 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:13:56 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[18]毫秒 -2026-06-13 09:15:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:15:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 09:15:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:15:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[5]毫秒 -2026-06-13 09:15:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/scheduleDeviceList/2062827585485807618],无参数 -2026-06-13 09:15:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/scheduleDeviceList/2062827585485807618],耗时:[7]毫秒 -2026-06-13 09:15:36 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/addScheduleDevice],参数类型[JSON],参数:[{"scheduleId":"2062827585485807618","deviceNos":["1779176626954"]}] -2026-06-13 09:15:36 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/addScheduleDevice],耗时:[20]毫秒 -2026-06-13 09:15:37 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:15:37 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[11]毫秒 -2026-06-13 09:15:40 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:15:40 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[4]毫秒 -2026-06-13 09:15:46 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:15:46 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[6]毫秒 -2026-06-13 09:15:50 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:15:50 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[11]毫秒 -2026-06-13 09:15:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:15:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[6]毫秒 -2026-06-13 09:17:42 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:17:42 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 09:17:47 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:17:47 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[8]毫秒 -2026-06-13 09:17:48 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedule/2062827585485807618],无参数 -2026-06-13 09:17:48 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedule/2062827585485807618],耗时:[9]毫秒 -2026-06-13 09:17:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:17:51 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[11]毫秒 -2026-06-13 09:24:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:24:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 09:24:17 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:24:17 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 09:26:05 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:26:05 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:26:07 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:26:07 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 09:27:39 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:27:39 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:27:40 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:27:40 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[22]毫秒 -2026-06-13 09:46:39 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:46:39 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[26]毫秒 -2026-06-13 09:46:42 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:46:42 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[16]毫秒 -2026-06-13 09:46:54 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":["fuck"],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:46:54 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[20]毫秒 -2026-06-13 09:46:58 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:46:58 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 09:47:10 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":["fuck"],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:47:10 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[11]毫秒 -2026-06-13 09:47:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:47:14 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 09:49:16 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:49:16 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 09:49:18 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:49:18 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 09:49:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":["666"],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:49:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[12]毫秒 -2026-06-13 09:49:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:49:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 09:51:11 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/waterLogList],参数类型[表单参数],参数:[{"pageNum":["1"]}] -2026-06-13 09:51:11 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/waterLogList],耗时:[34]毫秒 -2026-06-13 09:51:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 09:51:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 09:51:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:51:24 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[13]毫秒 -2026-06-13 09:51:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:51:32 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:51:33 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:51:33 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[7]毫秒 -2026-06-13 09:53:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:53:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 09:53:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:53:23 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:53:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"dc:da:0c:fa:28:9c"}] -2026-06-13 09:53:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[4]毫秒 -2026-06-13 09:53:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:53:53 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[13]毫秒 -2026-06-13 09:54:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:54:12 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:54:21 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:54:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"dc:da:0c:fa:28:9e"}] -2026-06-13 09:54:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[1]毫秒 -2026-06-13 09:54:21 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:54:46 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:54:46 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:54:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"DC:DA:0C:FA:28:9E"}] -2026-06-13 09:54:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[4]毫秒 -2026-06-13 09:54:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:54:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 09:55:12 [mqtt-consumer-16] INFO o.d.a.handler.DeviceRegisterHandler - [MQTT] 设备注册 时间=2026-06-13 09:55:12 设备编号=01 消息体={ - "deviceNo": "01", - "deviceName": "Waterer_01", - "powerLevel": 48, - "deviceEm": "11667796A-Y43-2606", - "deviceSn": "260601", - "deviceMac": "dc:da:0c:fa:28:9c", - "version": "1.0" -} -2026-06-13 09:55:12 [mqtt-consumer-13] INFO o.d.app.handler.DeviceDataHandler - [MQTT] 设备电量更新 时间=2026-06-13 09:55:12 设备编号=01 消息体={ - "deviceName": "Waterer_01", - "powerLevel": 48, - "charging": 0 -} -2026-06-13 09:55:12 [mqtt-consumer-14] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=2ab3a6e58d1b4a89919d218fda63b3f7 状态=null -2026-06-13 09:55:38 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/addDevice],参数类型[JSON],参数:[{"deviceName":"浇水设备007","wifiName":"研发部","wifiPassword":"ckkj123456","macAddress":"DC:DA:0C:FA:28:9E","deviceNo":"01"}] -2026-06-13 09:55:38 [XNIO-1 task-4] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 消息已发布 主题=/01/subscriber/cmd 消息体={"commandType":"bindDevice","deviceNo":"01","cmd":-1,"commandId":"73669072eb924e9f9772d80fb9be57f8","bindStatus":true} -2026-06-13 09:55:38 [XNIO-1 task-4] INFO o.d.a.s.i.DeviceCommandServiceImpl - [命令] 命令已下发 设备编号=01 命令类型=bindDevice 命令编号=73669072eb924e9f9772d80fb9be57f8 -2026-06-13 09:55:38 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/addDevice],耗时:[39]毫秒 -2026-06-13 09:55:38 [mqtt-consumer-11] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=73669072eb924e9f9772d80fb9be57f8 状态=null -2026-06-13 09:55:39 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:55:39 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:55:59 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:56:00 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 09:56:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/bindDeviceStatus],参数类型[JSON],参数:[{"macAddress":"DC:DA:0C:FA:28:9E"}] -2026-06-13 09:56:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/bindDeviceStatus],耗时:[1]毫秒 -2026-06-13 09:56:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:56:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[13]毫秒 -2026-06-13 09:57:15 [mqtt-consumer-8] INFO o.d.a.handler.DeviceRegisterHandler - [MQTT] 设备注册 时间=2026-06-13 09:57:15 设备编号=01 消息体={ - "deviceNo": "01", - "deviceName": "Waterer_01", - "powerLevel": 48, - "deviceEm": "11667796A-Y43-2606", - "deviceSn": "260601", - "deviceMac": "dc:da:0c:fa:28:9c", - "version": "1.0" -} -2026-06-13 09:57:15 [mqtt-consumer-8] INFO o.d.app.handler.DeviceDataHandler - [MQTT] 设备电量更新 时间=2026-06-13 09:57:15 设备编号=01 消息体={ - "deviceName": "Waterer_01", - "powerLevel": 48, - "charging": 0 -} -2026-06-13 09:57:15 [mqtt-consumer-12] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=2ab3a6e58d1b4a89919d218fda63b3f7 状态=null -2026-06-13 09:57:39 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/addDevice],参数类型[JSON],参数:[{"deviceName":"智能浇水","wifiName":"测试机","wifiPassword":"66668888","macAddress":"DC:DA:0C:FA:28:9E","deviceNo":"01"}] -2026-06-13 09:57:39 [XNIO-1 task-4] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 消息已发布 主题=/01/subscriber/cmd 消息体={"commandType":"bindDevice","deviceNo":"01","cmd":-1,"commandId":"a783262582fd41fcb09d59d55a07c9e3","bindStatus":true} -2026-06-13 09:57:39 [XNIO-1 task-4] INFO o.d.a.s.i.DeviceCommandServiceImpl - [命令] 命令已下发 设备编号=01 命令类型=bindDevice 命令编号=a783262582fd41fcb09d59d55a07c9e3 -2026-06-13 09:57:39 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/addDevice],耗时:[35]毫秒 -2026-06-13 09:57:40 [mqtt-consumer-3] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=a783262582fd41fcb09d59d55a07c9e3 状态=null -2026-06-13 09:57:40 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 09:57:40 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 09:59:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:59:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 09:59:57 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 09:59:58 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 10:02:09 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:02:09 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:02:11 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 10:02:11 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[3]毫秒 -2026-06-13 10:02:12 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:02:12 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[18]毫秒 -2026-06-13 10:03:42 [schedule-pool-5] INFO o.d.app.task.DeviceOfflineCheckTask - [设备离线] 检测到 1 台设备离线,已更新数据库状态,设备编号:[01] -2026-06-13 10:04:26 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:04:26 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:11:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 10:11:55 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[2]毫秒 -2026-06-13 10:12:03 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:12:03 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[13]毫秒 -2026-06-13 10:12:20 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:20 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 10:12:23 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":["fuck"],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:23 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[13]毫秒 -2026-06-13 10:12:28 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:28 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 10:12:36 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:36 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[7]毫秒 -2026-06-13 10:12:38 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":["66"],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:38 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[10]毫秒 -2026-06-13 10:12:42 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:12:42 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 10:16:20 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:16:20 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[7]毫秒 -2026-06-13 10:16:22 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:16:22 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 10:16:46 [mqtt-consumer-1] INFO o.d.a.handler.DeviceRegisterHandler - [MQTT] 设备注册 时间=2026-06-13 10:16:46 设备编号=01 消息体={ - "deviceNo": "01", - "deviceName": "Waterer_01", - "powerLevel": 48, - "deviceEm": "11667796A-Y43-2606", - "deviceSn": "260601", - "deviceMac": "dc:da:0c:fa:28:9c", - "version": "1.0" -} -2026-06-13 10:16:46 [mqtt-consumer-16] INFO o.d.app.handler.DeviceDataHandler - [MQTT] 设备电量更新 时间=2026-06-13 10:16:46 设备编号=01 消息体={ - "deviceName": "Waterer_01", - "powerLevel": 48, - "charging": 0 -} -2026-06-13 10:16:47 [mqtt-consumer-16] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=2ab3a6e58d1b4a89919d218fda63b3f7 状态=null -2026-06-13 10:16:57 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[POST /app/v1/addDevice],参数类型[JSON],参数:[{"deviceName":"还是浇水设备","wifiName":"研发部","wifiPassword":"ckkj123456","macAddress":"DC:DA:0C:FA:28:9E","deviceNo":"01"}] -2026-06-13 10:16:57 [XNIO-1 task-4] INFO org.dromara.mqtt.MqttClientManager - [MQTT] 消息已发布 主题=/01/subscriber/cmd 消息体={"commandType":"bindDevice","deviceNo":"01","cmd":-1,"commandId":"00119ae0fc844c1c88d61052e1ded66b","bindStatus":true} -2026-06-13 10:16:57 [XNIO-1 task-4] INFO o.d.a.s.i.DeviceCommandServiceImpl - [命令] 命令已下发 设备编号=01 命令类型=bindDevice 命令编号=00119ae0fc844c1c88d61052e1ded66b -2026-06-13 10:16:57 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[POST /app/v1/addDevice],耗时:[36]毫秒 -2026-06-13 10:16:57 [mqtt-consumer-6] INFO o.dromara.mqtt.MqttCommandAckService - [MQTT] 收到命令确认 设备编号=01 命令编号=00119ae0fc844c1c88d61052e1ded66b 状态=null -2026-06-13 10:16:58 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/device/01],无参数 -2026-06-13 10:16:58 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/device/01],耗时:[5]毫秒 -2026-06-13 10:17:04 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:17:04 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:18:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:18:48 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 10:23:12 [schedule-pool-4] INFO o.d.app.task.DeviceOfflineCheckTask - [设备离线] 检测到 1 台设备离线,已更新数据库状态,设备编号:[01] -2026-06-13 10:34:56 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:34:56 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[22]毫秒 -2026-06-13 10:34:57 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:34:57 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 10:35:05 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:35:05 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:35:05 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:35:05 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:37:22 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:37:22 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:37:22 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[18]毫秒 -2026-06-13 10:37:22 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 10:38:02 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/waterLogList],参数类型[表单参数],参数:[{"pageNum":["1"]}] -2026-06-13 10:38:02 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/waterLogList],耗时:[14]毫秒 -2026-06-13 10:38:06 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:38:06 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 10:38:08 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/waterLogList],参数类型[表单参数],参数:[{"pageNum":["1"]}] -2026-06-13 10:38:08 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/waterLogList],耗时:[12]毫秒 -2026-06-13 10:38:08 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/schedulelist],参数类型[表单参数],参数:[{"name":[""],"pageSize":["10"],"pageNum":["1"]}] -2026-06-13 10:38:08 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/schedulelist],耗时:[9]毫秒 -2026-06-13 10:38:09 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:09 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[15]毫秒 -2026-06-13 10:38:13 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/getUserInfo],无参数 -2026-06-13 10:38:13 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/getUserInfo],耗时:[9]毫秒 -2026-06-13 10:38:14 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:14 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 10:38:16 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/getUserInfo],无参数 -2026-06-13 10:38:16 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/getUserInfo],耗时:[6]毫秒 -2026-06-13 10:38:19 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:19 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/getUserInfo],无参数 -2026-06-13 10:38:19 [XNIO-1 task-4] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/getUserInfo],耗时:[5]毫秒 -2026-06-13 10:38:19 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[16]毫秒 -2026-06-13 10:38:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:21 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 10:38:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[17]毫秒 -2026-06-13 10:38:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:25 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[13]毫秒 -2026-06-13 10:38:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 -2026-06-13 10:38:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]开始请求 => URL[GET /app/v1/deviceList],无参数 -2026-06-13 10:38:27 [XNIO-1 task-3] INFO o.d.c.w.i.PlusWebInvokeTimeInterceptor - [请求]结束请求 => URL[GET /app/v1/deviceList],耗时:[14]毫秒 diff --git a/water-common/water-common-mqtt/src/main/java/org/dromara/mqtt/MqttCommandAckService.java b/water-common/water-common-mqtt/src/main/java/org/dromara/mqtt/MqttCommandAckService.java index afa8445..7a9c227 100644 --- a/water-common/water-common-mqtt/src/main/java/org/dromara/mqtt/MqttCommandAckService.java +++ b/water-common/water-common-mqtt/src/main/java/org/dromara/mqtt/MqttCommandAckService.java @@ -75,10 +75,14 @@ public class MqttCommandAckService implements IDeviceCommandAckHandler { return; } ack.setDeviceNo(deviceNo); - withCommandLock(ack.getCommandId(), () -> { + boolean ackSaved = withCommandLock(ack.getCommandId(), () -> { deletePending(ack.getCommandId()); RedisUtils.setCacheObject(ackKey(ack.getCommandId()), ack, Duration.ofSeconds(mqttProperties.getCommandAck().getAckTtlSeconds())); }); + if (!ackSaved) { + log.warn("[MQTT] ACK 处理未获得命令锁,本次跳过 设备编号={} 命令编号={}", deviceNo, ack.getCommandId()); + return; + } refreshDeviceOnline(deviceNo); log.info("[MQTT] 收到命令确认 设备编号={} 命令编号={} 状态={}", deviceNo, ack.getCommandId(), ack.getStatus()); } @@ -99,10 +103,14 @@ public class MqttCommandAckService implements IDeviceCommandAckHandler { ack.setStatus("1"); ack.setMessage(payload); - withCommandLock(commandId, () -> { + boolean ackSaved = withCommandLock(commandId, () -> { deletePending(commandId); RedisUtils.setCacheObject(ackKey(commandId), ack, Duration.ofSeconds(mqttProperties.getCommandAck().getAckTtlSeconds())); }); + if (!ackSaved) { + log.warn("[MQTT] 非 JSON ACK 处理未获得命令锁,本次跳过 设备编号={} 命令编号={}", deviceNo, commandId); + return; + } log.info("[MQTT] 收到非 JSON 命令确认 设备编号={} 命令编号={} 消息体={}", deviceNo, commandId, payload); } @@ -177,8 +185,11 @@ public class MqttCommandAckService implements IDeviceCommandAckHandler { RLock lock = RedisUtils.getClient().getLock(DEVICE_STATUS_LOCK_PREFIX + deviceNo); boolean locked = false; try { - lock.lock(10, TimeUnit.SECONDS); - locked = true; + locked = lock.tryLock(0, 10, TimeUnit.SECONDS); + if (!locked) { + // 其他线程正在刷新,本次跳过;状态写入幂等,下条 ACK 仍会兜底刷新 + return; + } Map statusCache = new HashMap<>(); statusCache.put("deviceNo", deviceNo); statusCache.put("status", "1"); @@ -193,6 +204,9 @@ public class MqttCommandAckService implements IDeviceCommandAckHandler { .set(AppDevice::getStatus, "1") .eq(AppDevice::getDeviceNo, deviceNo) ); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.warn("[MQTT] 刷新设备在线状态被中断 设备编号={}", deviceNo); } finally { if (locked && lock.isHeldByCurrentThread()) { lock.unlock(); @@ -209,20 +223,23 @@ public class MqttCommandAckService implements IDeviceCommandAckHandler { pendingIds().remove(commandId); } - private void withCommandLock(String commandId, Runnable action) { + private boolean withCommandLock(String commandId, Runnable action) { RLock lock = RedisUtils.getClient().getLock(mqttProperties.getCommandAck().getRetryLockKeyPrefix() + commandId); boolean locked = false; try { locked = lock.tryLock(0, mqttProperties.getCommandAck().getRetryLockTtlMs(), TimeUnit.MILLISECONDS); if (!locked) { - return; + return false; } action.run(); + return true; } catch (InterruptedException e) { Thread.currentThread().interrupt(); log.warn("[MQTT] 命令锁等待被中断 命令编号={}", commandId); + return false; } catch (RuntimeException e) { log.error("[MQTT] 命令锁内处理失败 命令编号={}", commandId, e); + return false; } finally { if (locked && lock.isHeldByCurrentThread()) { lock.unlock(); diff --git a/water-modules/water-app/src/main/java/org/dromara/app/service/impl/AppDeviceServiceImpl.java b/water-modules/water-app/src/main/java/org/dromara/app/service/impl/AppDeviceServiceImpl.java index b60902e..fe014ea 100644 --- a/water-modules/water-app/src/main/java/org/dromara/app/service/impl/AppDeviceServiceImpl.java +++ b/water-modules/water-app/src/main/java/org/dromara/app/service/impl/AppDeviceServiceImpl.java @@ -109,9 +109,7 @@ public class AppDeviceServiceImpl implements IAppDeviceService { AppDevice add = MapstructUtils.convert(bo, AppDevice.class); validEntityBeforeInsert(add); normalizeMacAddress(add); - if (baseMapper.selectByMac(add.getMacAddress()) != null) { - throw new ServiceException("MAC地址已存在,不能重复新增设备"); - } + ensureMacAddressAvailable(add); return baseMapper.insert(add) > 0; } @@ -120,6 +118,8 @@ public class AppDeviceServiceImpl implements IAppDeviceService { // fillBindTokenHash(bo); AppDevice update = MapstructUtils.convert(bo, AppDevice.class); validEntityBeforeUpdate(update); + normalizeMacAddress(update); + ensureMacAddressAvailable(update); return baseMapper.updateById(update) > 0; } @@ -219,7 +219,8 @@ public class AppDeviceServiceImpl implements IAppDeviceService { throw new ServiceException("设备绑定失败,请重试"); } //下发设备已绑定状态 - deviceCommandService.sendBindDeviceCommand(exists.getDeviceNo()); + //deviceCommandService.sendBindDeviceCommand(exists.getDeviceNo()); + deviceCommandService.sendBindDeviceCommand(exists.getMacAddress()); return baseMapper.selectVoById(exists.getDeviceNo()); } @@ -246,7 +247,8 @@ public class AppDeviceServiceImpl implements IAppDeviceService { AppDeviceVo device = baseMapper.selectVoById(deviceNo); if (ObjectUtil.isNotNull(device) && StringUtils.isNotBlank(device.getDeviceNo())) { // 通过业务层统一下发命令(含浇水日志记录) - String commandId = deviceCommandService.sendSwitchCommand(deviceNo, workStatus, startTime, durationMin); + //String commandId = deviceCommandService.sendSwitchCommand(deviceNo, workStatus, startTime, durationMin); + String commandId = deviceCommandService.sendSwitchCommand(device.getMacAddress(), workStatus, startTime, durationMin); log.info("[设备] 开关命令已下发 设备编号={} 命令编号={}", deviceNo, commandId); } @@ -302,6 +304,16 @@ public class AppDeviceServiceImpl implements IAppDeviceService { } } + private void ensureMacAddressAvailable(AppDevice entity) { + if (StringUtils.isBlank(entity.getMacAddress())) { + return; + } + AppDevice exists = baseMapper.selectByMac(entity.getMacAddress()); + if (exists != null && !Objects.equals(exists.getDeviceNo(), entity.getDeviceNo())) { + throw new ServiceException("MAC地址已存在,不能重复绑定设备"); + } + } + private void validEntityBeforeUpdate(AppDevice entity) { if (StringUtils.isBlank(entity.getDeviceNo())) { throw new ServiceException("设备编号不能为空"); @@ -311,12 +323,42 @@ public class AppDeviceServiceImpl implements IAppDeviceService { @Override @Transactional public Boolean deleteWithValidByIds(Collection deviceNos, Boolean isValid) { - boolean flag = baseMapper.deleteByIds(deviceNos) > 0; + if (deviceNos == null || deviceNos.isEmpty()) { + throw new ServiceException("设备编号不能为空"); + } + + List distinctDeviceNos = deviceNos.stream() + .filter(StringUtils::isNotBlank) + .distinct() + .toList(); + if (distinctDeviceNos.isEmpty()) { + throw new ServiceException("设备编号不能为空"); + } + + Long userId = LoginHelper.getUserId(); + if (userId == null) { + throw new ServiceException("用户未登录"); + } + + Long ownedCount = baseMapper.selectCount( + Wrappers.lambdaQuery() + .in(AppDevice::getDeviceNo, distinctDeviceNos) + .eq(AppDevice::getUserId, userId) + ); + if (ownedCount == null || ownedCount.intValue() != distinctDeviceNos.size()) { + throw new ServiceException("设备不存在或无权操作"); + } + + boolean flag = baseMapper.delete( + Wrappers.lambdaUpdate() + .in(AppDevice::getDeviceNo, distinctDeviceNos) + .eq(AppDevice::getUserId, userId) + ) > 0; if (flag) { schedulingDeviceMapper.delete( - new QueryWrapper().in("device_no", deviceNos) + new QueryWrapper().in("device_no", distinctDeviceNos) ); - wateringLogMapper.delete(new QueryWrapper().in("device_no", deviceNos)); + wateringLogMapper.delete(new QueryWrapper().in("device_no", distinctDeviceNos)); } return flag; }