Commit Graph

339 Commits

Author SHA1 Message Date
lzh
7d1012bba7 fix(iot,ops): 修复退出检测停滞、TTS多租户重复播报,精简语音通知
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
1. 蓝牙信号缺失补偿:设备属性上报不含 bluetoothDevices 时注入 null,
   避免 RSSI 滑动窗口因无数据停滞导致退出检测延迟
2. TTS 多租户去重:TtsQueueMessage 携带 tenantId,processSingleQueue
   过滤非当前租户消息,解决 @TenantJob 导致同一播报被不同租户重复下发
3. 循环播报日志精简:仅在 broadcastLoop 启动时记录一次 TTS_SENT,
   后续重复播报不再写入 ops_business_event_log
4. 移除离岗 TTS 警告和入队语音播报,减少不必要的设备干扰

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:09:56 +08:00
lzh
7c22fe998e fix(ops): 统一 Redis 序列化为 StringRedisTemplate,修复跨模块/跨路径数据不兼容
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
BadgeDeviceStatusServiceImpl 和 RedisOrderQueueServiceImpl 原使用
RedisTemplate<String, Object>(Jackson JSON 序列化),但 Pipeline、
Lua 脚本写入的裸字符串与 Jackson 格式不兼容,导致:
- IoT 模块 StringRedisTemplate 读取工单状态比对失败(按键无法确认)
- 队列 entries() 反序列化失败(REMOVED 记录无法清理,持续报错)

修改内容:
- BadgeDeviceStatusServiceImpl: RedisTemplate → StringRedisTemplate
- RedisOrderQueueServiceImpl: RedisTemplate → StringRedisTemplate
- 所有写入值显式 String.valueOf(),读取用 parse 替代强转
- 修复 null 值写入 StringRedisSerializer 导致 NPE 的隐患
- application.yaml: TTS 播报间隔 6000ms → 3000ms

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 10:50:03 +08:00
lzh
c21c77c758 fix(ops): 修复按键播报延迟和循环停止失败问题
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
1. 播报间隔从6秒缩短为3秒
2. stopLoop 清除播报间隔锁,使后续播报可立即发送
3. 按键触发的播报改用 broadcastDirect 直接下发,不走队列

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 18:04:36 +08:00
lzh
b4de9d0df8 feat(config): 修改测试环境地址 2026-02-26 17:16:24 +08:00
lzh
68342a4f08 fix(ops): 移除废弃接口 2026-02-26 17:15:31 +08:00
lzh
5ee039b0bf feat(ops,iot): 工单语音播报循环机制 + 统一按键逻辑
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
核心改动:
- 新增循环播报机制:DISPATCHED 状态持续播报"工单来啦"直到按键确认
- 统一按键逻辑:confirmKeyId 和 queryKeyId 都路由到同一处理逻辑,
  根据工单状态智能判断行为(确认/查询/无工单提示)
- ARRIVED/COMPLETED 状态静默不播报,CANCELLED 保留取消播报
- 修复 P0:确认去重后按键不再静默,改为发查询事件给反馈
- 修复 P0:PAUSED 状态(P0打断)时停止被打断工单的循环播报
- 修复 P1:handleCompleted 补全 deviceId 兜底逻辑
- 修复 P1:stopLoop 只移除循环消息,保留非循环消息

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 17:13:03 +08:00
lzh
6cb784a2d8 feat(ops): 新增客流统计后端接口(区域汇总查询+缓存优化)
- 新增 OpsTrafficController 客流统计独立 Controller(/ops/traffic/*)
- 新增区域汇总接口:getAreaTrafficRealtime/getAreaTrafficTrend(多区域ID聚合)
- TrafficRealtimeRespVO 新增 yesterdayHourlyTrend 和 message 字段
- DeviceTrafficRealtimeRespVO 新增 yesterdayHourlyTrend 字段
- 区域接口添加 @Cacheable 5分钟 Redis 缓存
- loadAreaNameMap 添加本地缓存(5分钟TTL)避免重复全表扫描
- areaIds 参数双层限制 200 上限防止 DoS

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 16:53:08 +08:00
lzh
edaa75b838 fix(ops): 修复取消 QUEUED 工单时队列状态转换校验不允许 WAITING→REMOVED 的问题
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
队列状态流转校验缺少 WAITING→REMOVED 的转换规则,导致取消 QUEUED 工单时
队列条目未被正确清理,autoDispatchNext 查到残留的 WAITING 记录后尝试派发
已取消的工单(CANCELLED→DISPATCHED),触发 IllegalStateException 并污染
外层事务,最终抛出 UnexpectedRollbackException。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 22:49:05 +08:00
lzh
0a13ba30f6 fix(ops): 修复派发新工单时嵌套取消旧工单导致 UnexpectedRollbackException 的问题
使用 REQUIRES_NEW 独立事务隔离 handleDispatched 中的旧工单取消操作,
避免内层事务异常标记外层事务 rollback-only。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 18:00:37 +08:00
lzh
7dd3c9a5c4 fix(ops): 修复工牌设备状态残留 BUSY 导致下一工单无法派发的问题
- 新增 repairDeviceOrderConsistency 方法,检测设备关联的工单是否已终态,
  若是则清除 currentOpsOrderId 并将设备状态恢复为 IDLE
- 定时对账 Job 增加工单一致性检查,自动修复历史残留
- 新增管理员手动修复 API:POST /ops/clean/order/repair-device-status
- 修复预存 bug:valueOf("busy") 改为 fromCode("busy") 避免 IllegalArgumentException

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 17:59:54 +08:00
lzh
161f55007b fix(ops): 手动完单走完整责任链,补全队列同步、设备状态、事件发布等缺失环节
原手动完单逻辑直接更新 DB 状态,绕过了 OrderLifecycleManager 责任链,
导致队列未清理、工牌设备状态未恢复 IDLE、自动派发下一任务未触发、
事件表缺少操作人信息等问题。

改动:
- CleanWorkOrderServiceImpl.manualCompleteOrder 改为委托 OrderLifecycleManager
- OrderLifecycleManager 新增 completeOrder(orderId, operatorId, operatorType, remark) 重载
- Controller 注入 SecurityFrameworkUtils.getLoginUserId() 填充操作人
- EventPublishHandler 修复 OrderCompletedEvent.assigneeId 兜底逻辑
- 新增已完成幂等返回和已取消拒绝校验

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 17:12:01 +08:00
lzh
3e54094c3d fix(iot): 修复客流阈值触发时 IoT 模块未将区域配置回写至 Redis 缓存的问题
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
2026-02-24 18:01:39 +08:00
lzh
d85de5eeaa fix(ops): 修复 AreaDeviceApi Feign 客户端不支持 relationType 为空的查询 2026-02-24 15:45:06 +08:00
lzh
4babe493ab fix(ops): 修复 AreaDeviceController RPC 接口不支持 relationType 为空的查询 2026-02-24 15:44:39 +08:00
lzh
f17d5ef6b8 fix(ops): 同步区域设备关联配置至 Redis 缓存
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
- 修复管理后台更新、绑定、解绑设备关联配置时未清理缓存导致旧配置(如客流阈值)在24小时内依然生效的问题
- 采用 Cache-Aside 模式,在 DB 操作后主动逐出 (evictConfigCache) 对应区域的关联类型缓存,确保高可用和强一致性
- 补充 AreaDeviceService Mock,修复并更新对应单元测试
2026-02-24 14:03:49 +08:00
lzh
1a245f01ce feat(ops): 工单取消后语音播报"当前工单已取消"
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
新增 VoiceTemplate.ORDER_CANCELLED 常量,handleCancelled 在自动调度
下一个任务之前先通过 TTS 队列播报取消通知,与完成流程保持一致。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 12:49:07 +08:00
lzh
abaa737d23 fix(ops): 取消工单接口改用 @RequestBody 接收 JSON 参数
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
前端以 JSON body 传参,@RequestParam 无法读取导致 400 "请求参数缺失"。
新增 OpsOrderCancelReqDTO,Controller 改为 @RequestBody 风格,
与 create/assign/complete 等接口保持一致。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 12:33:44 +08:00
lzh
8ab7e7cc05 fix(ops): 完善手动取消工单接口的状态机、校验和事件处理
- 状态机允许 ARRIVED→CANCELLED,与业务枚举 canCancel() 保持一致
- cancelOrder 增加已取消幂等返回,已完成改用 ServiceException
- cancelOrder 构建请求时传递 assigneeId 确保事件链路完整
- CleanOrderEventListener 新增 handleCancelled:记录扩展表取消时间、
  自动调度下一个等待任务;业务日志由 LifecycleManager 统一记录

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 12:26:47 +08:00
lzh
a68ce9a28a fix(xxl-job): 配置executor IP和端口解决跨服务器回调失败
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
XXL-Job Admin部署在Infra服务器,executor运行在Prod服务器的Docker容器中,
容器内部IP不可达,需指定宿主机IP和独立端口供Admin回调。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 17:03:39 +08:00
lzh
bec46c2919 fix(rocketmq): 修正ACL配置位置到producer/consumer节点下
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
rocketmq-spring-boot-starter的access-key/secret-key需配置在
producer和consumer节点下而非rocketmq根节点,同时为所有
@RocketMQMessageListener注解添加accessKey/secretKey属性。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 16:19:42 +08:00
lzh
748b09d355 fix(rocketmq): 添加腾讯云TDMQ ACL认证配置解决连接失败
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
修复RocketMQ发送消息报"No accessKey is configured"错误,
统一各模块环境变量名为ROCKETMQ_NAMESRV_ADDR。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:50:44 +08:00
lzh
91de356a67 fix(iot-gateway): 修正RPC环境变量名为VIEWSH_IOT_GATEWAY_RPC_URL
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
Spring Boot relaxed binding将viewsh.iot.gateway.rpc.url映射为
VIEWSH_IOT_GATEWAY_RPC_URL,而非VIEWSH_GATEWAY_RPC_URL。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:17:06 +08:00
lzh
e15ebfd3d4 fix(iot-gateway): 修正RPC环境变量名不匹配导致连接失败
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
docker-compose中VIEWSH_IOT_GATEWAY_RPC_URL与yaml期望的VIEWSH_GATEWAY_RPC_URL不一致,
导致iot-gateway回退到默认值127.0.0.1:48091,容器间无法通信。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 11:39:37 +08:00
lzh
26e909cce9 fix(deploy): 迁移Nacos/TDengine/XXL-Job至Infra服务器(172.17.16.7)
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
将基础设施服务地址从Prod服务器(172.17.16.14)统一迁移至Infra服务器(172.17.16.7):
- Nacos: 172.17.16.14:8848 → 172.17.16.7:8848
- TDengine: 172.17.16.14:6041 → 172.17.16.7:6041
- XXL-Job: 172.17.16.14:19090 → 172.17.16.7:19090

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 11:22:02 +08:00
lzh
547da7cfd2 refactor(deploy): 迁移CI/CD至双服务器架构
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
- Jenkinsfile: Registry改为Infra内网172.17.16.7:5000,部署目标改为Prod内网172.17.16.14
- docker-compose: 镜像源改为172.17.16.7:5000,MySQL改为172.17.16.8,Redis改为172.17.16.13,RocketMQ改为腾讯云TDMQ
- 所有模块application-prod.yaml: 统一更新MySQL/Redis/RocketMQ默认连接地址
- deploy.sh: Registry地址同步更新

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 10:41:54 +08:00
lzh
c9195f78e9 feat(ops): 新增告警管理功能
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
添加告警请求VO、服务接口、服务实现及Controller,支持告警的基本管理操作。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 09:30:57 +08:00
lzh
b851484e4e fix(ops): 修正工作台客流趋势返回
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
2026-02-11 10:02:03 +08:00
lzh
16441e7c25 feat(ops): 实现工单统计看板功能
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
1. 修复 MyBatis 类型安全问题
   - 创建 9 个 DTO 类替换 List<Map<String, Object>>
   - 修复 @MapKey 错误,使用强类型返回值

2. 实现工单统计看板 5 大功能
   - 漏斗统计:支持时间范围过滤
   - 时段热力图:改为近 7 天,Y 轴显示日期(MM-dd)
   - 功能类型排行:替换区域排行,JOIN ops_bus_area 表
   - 今日工单时段分布:X 轴优化为每 2 小时展示
   - 近七天客流统计:独立接口,支持工作台实时趋势

3. 字典转换实现
   - 新增 DictTypeConstants.OPS_AREA_FUNCTION_TYPE(保留供未来扩展)
   - 使用硬编码 Map 实现功能类型中文转换(性能最优)
   - 添加 TODO 说明未来可切换 DictFrameworkUtils

4. SQL 优化
   - 功能类型统计:INNER JOIN ops_bus_area 表
   - 热力图查询:按日期和小时分组统计
   - 时段分布:仅统计当天数据

5. 缓存策略
   - 看板统计:5 分钟缓存(@Cacheable)
   - 客流监测:5 分钟缓存
   - 防止高并发查询压力

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 23:28:02 +08:00
lzh
113e90c726 fix(ops): 修复工单location字段重复和parent_path格式问题
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
1. 修改 parent_path 格式为以 "/" 开头(如:/1/2/3)
   - buildParentPath: 父级是根节点时返回 "/1" 而非 "1"

2. 修复 buildAreaPath 方法的去重逻辑
   - 从名称层面去重改为 ID 层面去重
   - 避免误删不同ID但名称相同的合法情况
   - 只去除数据错误导致的重复ID
   - 添加警告日志记录重复ID

3. 调整 isDescendant 方法以适配新的 parent_path 格式
   - 简化判断逻辑,移除冗余的 startsWith 检查

4. 更新测试用例以匹配新格式
   - Mock数据: parentPath("10") -> parentPath("/10")
   - 期望值: "10/1" -> "/10/1"

5. 统一 location 路径格式(不带前导斜杠)
   - 示例: "徐汇万科中心一期/A座写字楼/11楼/电梯厅"

变更影响:
- ops_bus_area.parent_path: "1" -> "/1", "1/2" -> "/1/2"
- ops_order.location: 无前导斜杠

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-10 16:14:59 +08:00
lzh
631612951c fix(iot): 修复客流统计持久化无数据和租户隔离问题
1. 解耦统计采集与工单触发:将 incrementDaily() 提前到配置检查之前,
   即使设备未配置工单触发规则,统计数据也能正常写入 Redis
2. 修复租户隔离:Redis Hash 中写入 tenantId,持久化任务读取后在
   正确的租户上下文中执行 upsert 和区域查询
3. 修复清理任务:使用 TenantUtils.executeIgnore() 避免 XXL-Job
   线程无租户上下文导致 NPE

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 13:18:48 +08:00
lzh
1147ae4503 fix(iot-gateway): 修改3d11正确ProductKey
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
2026-02-10 10:14:54 +08:00
lzh
88a6651d59 Merge branch 'feat/iot-people-counter'
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
2026-02-09 13:52:33 +08:00
lzh
41ffffe431 fix(iot): 修复 3D11 编解码器上报时间和数据过滤
- reportTime 改用 time 字段(设备上传时间)而非 endTime
- 新增 24 小时数据过滤,超时数据舍弃并返回 null
- 数据舍弃时仍返回成功响应,避免设备反复重试

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 13:52:18 +08:00
lzh
81478710de Merge branch 'feat/iot-people-counter'
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
2026-02-09 09:54:47 +08:00
lzh
cc6b11f4e9 feat(iot): 对接 3D11 单目客流计数器
在 IoT Gateway 的 Vert.x Router 上注册 /api/camera/* 专用路由,
桥接 3D11 摄像头的心跳和数据上报到现有消息总线和编解码体系。

- 新建 Camera3D11 DTO(心跳请求、数据上报请求、统一响应)
- 新建 IotCamera3D11Codec 编解码器(TYPE=CAMERA_3D11)
- 新建 IotCameraUpstreamHandler 处理心跳和数据上报
- productKey 通过 application.yaml 配置,未配置时不注册路由
- 心跳上报间隔设为 1 分钟

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 00:23:44 +08:00
lzh
0775ead5ff feat(ops): 客流工单周期化,同区域复用活跃工单并逐级升级优先级
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
解决同一区域客流持续达标时重复创建工单的问题。改为:无活跃工单时
创建新工单,有未派发工单(PENDING/QUEUED)时升级优先级一级,有已派发
工单时忽略,所有分支均重置阈值计数器。工单终态时清除活跃标记。

- 新增 TrafficActiveOrderRedisDAO 管理区域活跃工单 Redis 标记
- 新增 CleanOrderService.upgradeOneLevelPriority 逐级升级优先级
- 改造 CleanOrderCreateEventHandler 实现客流触发周期化分支逻辑
- 新增 OpsOrderMapper.selectActiveTrafficOrder 作为 DB 兜底查询

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 00:21:14 +08:00
lzh
4f737a5dd1 refactor(ops): 重构 TTS 语音播报队列,解耦 ttsFlag 与队列优先级
移除 Thread.sleep(5000) 阻塞,改由 TTS 队列按设备维度控制播报顺序和间隔:
- 解耦 ttsFlag(硬件行为 0x09)与 priority(队列位置),全部使用 0x09 发送
- TtsQueueMessage 新增 inOrder/urgent 工厂方法,VoiceBroadcastService 精简为
  broadcastInOrder(FIFO rightPush)和 broadcastUrgent(leftPush 插队)两个入口
- 同设备播报间隔 3s → 6s,消息过期时间 30s → 60s
- 修复原 leftPush+leftPop LIFO 导致连续入队顺序反转的问题

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 00:19:24 +08:00
lzh
db5266d306 fix(ops): 修复语音播报顺序和无工单误报问题
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
1. CleanOrderEventListener: 将完成通知和自动派单合并为单个异步方法,
   保证先播报"工单已完成",间隔5秒后再派发下一个任务,
   避免"新工单来啦"先于"工单已完成"播报
2. CleanNotificationConstants: 修复 buildQuery 在无工单时仍播报
   "当前工单在作业区域"的问题,原因是 areaName 为 null 时被回退为
   默认值后导致"有工单"判断永远为 true

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:43:12 +08:00
lzh
117ad2c405 fix(ops): 修复 TTS 队列 Redisson 事务不兼容和客流统计租户上下文缺失
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
1. TtsQueueConsumer: 用 SETNX+TTL 替代 watch/multi/exec 事务模式,
   解决 Redisson 不支持 WATCH 导致 exec() 抛出异常的问题
2. TrafficStatisticsPersistJob: 用 TenantUtils.executeIgnore() 包裹
   设备区域查询,解决 xxl-job 线程无租户上下文导致查询失败的问题

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 10:13:41 +08:00
lzh
a18d1a7d8d refactor(ops): 优化区域路径拼接方法 buildAreaPath
主要改进:
- 使用 Stream API 替代传统循环,代码更简洁
- 区域路径增加 "/" 分隔符,格式更规范(如"园区/A栋/B层/电梯厅")
- 改进异常处理和日志记录,提升可维护性
- 使用 Hutool StrUtil 替代 Apache Commons Lang
- 提前返回策略,减少嵌套层级

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 10:02:29 +08:00
lzh
940a968560 fix(ops): 修复日志打印问题
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
2026-02-04 00:07:45 +08:00
lzh
d34f3bd80d fix(ops): 修复 TTS 语音播报并发问题,保证顺序和间隔
问题:
- 多线程同时处理同一设备的 TTS 队列,导致多条语音同时下发
- 设备只能播报最后一条,前面的被覆盖

解决方案:
- 使用 Redis watch + multi + exec 事务保证原子性
- 使用 Redis 存储上次播报时间(跨线程/跨实例共享)
- 间隔不够时取消 watch,消息留在队列下次再试
- 播报失败时清除时间记录,允许立即重试

效果:
- 保证播报顺序:先入队的消息先播报(FIFO)
- 保证播报间隔:两条播报之间至少间隔 3 秒
- 并发安全:多线程/多实例环境下不会冲突

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 23:59:01 +08:00
lzh
5edbc9f287 fix(ops): 修复工牌关机重启后工单状态不一致漏洞
问题场景:
1. 工牌有执行中工单(ARRIVED)后关机
2. 工牌重启,Redis状态丢失/过期,设备变为IDLE
3. 系统推送新工单
4. 信标检测仍在用旧工单配置,导致状态混乱

修复方案:
1. 派发新工单前检查并清理/取消旧工单残留
2. 设备离线时自动取消未完成的工单
3. 信标检测器增加工单切换检测,清理旧检测状态

涉及文件:
- BadgeDeviceStatusEventListener: 增加旧工单清理和离线事件监听
- BadgeDeviceStatusServiceImpl: 设备离线时发布事件
- BeaconDetectionRuleProcessor: 工单切换检测

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 22:59:06 +08:00
lzh
3443d4dcd4 fix(ops): 增强 TTS 队列日志级别,方便排查语音播报问题
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
- TtsQueueProcessJob: 添��� info 级别日志输出处理结果
- TtsQueueConsumer: 将播报成功日志改为 info 级别
- 添加队列发现日志,便于追踪

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 22:18:57 +08:00
lzh
88e83895da chore(ops): 新增 TTS 语音播报队列配置项
添加 ops.tts.queue 配置:
- enabled: 是否启用队列
- interval-ms: 播报间隔
- max-queue-size: 队列最大长度

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 16:49:33 +08:00
lzh
8c03253446 feat(ops): 新增工单业务日志查询接口
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
- OpsOrderService/Impl: 新增 getOrderBusinessLogs,将 OpsBusinessEventLogDO
  转换为前端友好的 OpsOrderBusinessLogRespDTO(type/title/operator/status/extra)
- OpsOrderController: 新增 GET /business-logs/{orderId} 端点
- 新增 OpsOrderBusinessLogRespDTO 和 OpsOrderBusinessLogsRespDTO

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 15:41:04 +08:00
lzh
fe64216286 feat(ops): 新增客流统计持久化和清理任务
- 新增 OpsTrafficStatisticsDO 和 OpsTrafficStatisticsMapper(upsert + 过期清理)
- 新增 TrafficStatisticsPersistJob: 每小时从 Redis 增量持久化到 MySQL,
  支持分布式锁、负增量校准、缺失区域处理
- 新增 TrafficStatisticsCleanupJob: 每月清理 30 天前的统计记录
- 新增 SQL 建表脚本 ops_traffic_statistics
- OpsBusAreaService 新增 getAreaIdByDeviceId 方法

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 15:39:53 +08:00
lzh
13571faa59 refactor(iot,ops): 重构客流计数器重置为按区域删除阈值 key
- ResetTrafficCounterReqDTO: 废弃 newBaseValue 字段
- IotDeviceControlApiImpl: 重置逻辑改为通过区域关联查询后删除阈值 key
- CleanOrderEventListener: 简化异步重置调用,移除 triggerData 依赖

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 15:37:23 +08:00
lzh
46024fd043 refactor(iot): 重构客流计数器为增量累加模式,支持 people_out
- 删除旧 TrafficCounterBaseRedisDAO(基准值模式),新增 TrafficCounterRedisDAO
  支持阈值计数器(达标后重置)和当日累积统计(用于报表)
- TrafficThresholdRuleProcessor 改为增量原子累加,消除基准值校准逻辑
- CleanRuleProcessorManager 路由增加 people_out 支持
- TrafficCounterBaseResetJob 改为每日清除阈值计数器,持久化职责移交 Ops 模块
- 使用 SCAN 替代 KEYS 避免阻塞 Redis

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 15:34:03 +08:00
lzh
6a109954d3 fix(ops): 修复去除/admin-api/前缀 2026-02-03 14:01:43 +08:00