Commit Graph

127 Commits

Author SHA1 Message Date
lzh
825c8eecca refactor(ops): 提取 AreaPathBuilder 公共组件,消除保洁/安保 buildAreaPath 重复代码
将 CleanOrderServiceImpl 中的 buildAreaPath 私有方法提取到 ops-biz 公共层
AreaPathBuilder 组件,供各业务模块(保洁、安保等)共享使用。同时优化:
- 用正则 matches("\d+") 替代 try-catch NumberFormatException 做数字校验
- 增加相邻重复ID去重保护

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 10:30:03 +08:00
lzh
0345d0fe39 fix(ops): TTS 业务日志去除冗余"语音播报:"前缀
VoiceBroadcastService 和 TtsQueueConsumer 记录 TTS_SENT 日志时
直接使用播报文本内容,title 由 LogType.TTS_SENT 的 description
"语音播报"提供,避免 message 中重复出现。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:34:53 +08:00
lzh
6c8c57b932 fix(ops): 保洁工单日志去重,修复到岗/完成日志设备字段为 null
- AuditEventHandler 跳过 BEACON_ARRIVE_CONFIRMED 和
  BEACON_COMPLETE_REQUESTED 审计事件,避免与状态变更日志重复
- recordOrderArrivedLog 当 payload 无 deviceKey 时从工单主表兜底,
  null 字段不再输出
- recordOrderCompletedLog 同样增加 deviceKey 兜底逻辑

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:34:42 +08:00
lzh
5f804605c7 refactor(ops): 收口散落的 eventType 硬编码为 LogType 枚举引用
替换 CleanOrderCreateEventHandler、OrderLifecycleManagerImpl、
DispatchEngineImpl 中的字符串常量为 LogType.XXX.getCode(),
同时将 DispatchEngine 的 @BusinessLog description 改为"工单自动派发"。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:34:30 +08:00
lzh
713ae744ac feat(ops): 客流阈值触发静默处理,工单完成时重置计数器防竞态
1. 已派发/已到达(DISPATCHED/CONFIRMED/ARRIVED)状态静默忽略客流触发,
   仅排队中(PENDING/QUEUED)状态才升级优先级
2. 工单完成时先重置IoT客流计数器再清除活跃标记,防止残留计数
   和MQ消息延迟导致的竞态误创建工单
3. 工单取消时仅清除活跃标记不重置计数器,保留客流数据以便尽快
   重新触发

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 22:28:11 +08:00
lzh
a9fd9313cc feat(ops): 重构派单队列评分逻辑,支持楼层差与等待老化综合排序
- 新增 QueueScoreCalculator/QueueScoreContext/QueueScoreResult,统一按优先级分 + 楼层差分 - 等待老化分计算队列总分,并将 PRIORITY_WEIGHT 调整为 1500
- OrderQueueService 新增 rebuildWaitingTasksByUserId 接口,OrderQueueServiceEnhanced 支持按执行人重算 WAITING 队列、以当前执行工单楼层为基准动态重排,并在事务提交后同步刷新 Redis
- RedisOrderQueueServiceImpl 支持持久化 baseFloorNo、targetFloorNo、floorDiff、waitMinutes、scoreUpdateTime 等评分明细,清队列时同时清理关联 Hash,避免脏数据残留
- DispatchEngineImpl、CleanerPriorityScheduleStrategy、BadgeDeviceScheduleStrategy 调整为非抢占式派单:P0 忙碌时仅入队等待,空闲时直接派发,自动派单前按总分重排并派发下一单
- CleanOrderServiceImpl 取消 P0 自动打断链路,升级到 P0 后仅重算等待队列并发送通知;补充 QueueScoreCalculatorTest、OrderQueueServiceEnhancedTest、CleanerPriorityScheduleStrategyTest、CleanOrderEndToEndTest 覆盖新行为
2026-03-07 21:15:10 +08:00
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
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
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
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
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
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
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
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
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
955c825e2c feat(ops,iot): 保洁前端 API 层和区域管理新增
新增保洁业务前端 API 接口层(工牌、工单、仪表盘)和运营区域管理完整功能,包含 Service/Controller/Test 三层结构。

主要功能:

1. IoT 设备查询 API(RPC 接口)
   - IotDeviceQueryApi: 提供设备简化信息查询
   - IotDeviceSimpleRespDTO: 设备简化 DTO

2. 保洁工牌管理
   - CleanBadgeService/Impl: 工牌通知、优先级调整、手动完成
   - BadgeNotifyReqDTO/UpgradePriorityReqDTO/ManualCompleteOrderReqDTO

3. 保洁工单管理
   - CleanWorkOrderService/Impl: 工单时间线查询

4. 保洁仪表盘
   - CleanDashboardService/Impl: 快速统计(待处理/进行中/已完成/在线工牌数)
   - QuickStatsRespDTO: 快速统计 DTO

5. 运营区域管理(Ops Biz)
   - OpsBusAreaService/Impl: 区域 CRUD(支持树形结构、分页查询)
   - AreaDeviceRelationService/Impl: 区域设备关联管理(绑定/解绑/批量更新)
   - OpsBusAreaMapper/AreaDeviceRelationMapper: 扩展 MyBatis 批量方法
   - 7 个 VO 类:CreateReqVO/UpdateReqVO/PageReqVO/RespVO/BindReqVO/RelationRespVO/DeviceUpdateReqVO

6. 前端 Controller(Ops Server)
   - OpsBusAreaController: 区域管理 REST API(11 个接口)
   - AreaDeviceRelationController: 设备关联 REST API(8 个接口)
   - CleanBadgeController: 工牌管理 REST API(5 个接口)
   - CleanDashboardController: 仪表盘 REST API(1 个接口)
   - CleanDeviceController: 设备管理 REST API(2 个接口)
   - CleanWorkOrderController: 工单管理 REST API(2 个接口)

7. 测试覆盖
   - OpsBusAreaServiceTest: 区域服务测试(284 行)
   - AreaDeviceRelationServiceTest: 设备关联测试(240 行)
   - OpsBusAreaControllerTest: 区域 Controller 测试(186 行)
   - AreaDeviceRelationControllerTest: 设备关联 Controller 测试(182 行)

8. API 层扩展
   - ErrorCodeConstants: 错误码常量(区域、设备关联)
   - NotifyTypeEnum: 通知类型枚举(语音、文本、震动)
   - 4 个 Badge/Order DTO: BadgeStatusRespDTO/BadgeRealtimeStatusRespDTO/OrderTimelineRespDTO

9. RPC 配置
   - RpcConfiguration: 注入 IotDeviceQueryApi

影响模块:Ops API、Ops Biz、Ops Server、Ops Environment Biz、IoT API、IoT Server

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-02 22:42:45 +08:00
lzh
bccf992848 feat(ops): 工牌设备状态服务支持 nickname 透传
在工牌设备状态管理链路中全面支持 nickname 字段透传,从 IoT 事件接收到派单策略推荐均使用用户可读的昵称。

变更范围:
- IotDeviceStatusChangedEventDTO: 新增 nickname 字段
- BadgeDeviceStatusEventHandler: 接收并透传 nickname
- BadgeDeviceStatusService/Impl: updateBadgeOnlineStatus 增加 nickname 参数
- BadgeDeviceStatusSyncJob: 对账场景保留 Redis 已有 nickname
- BadgeDeviceAreaAssignStrategy: 推荐执行人时优先使用 nickname
- BadgeDeviceDispatchTest: 测试适配 nickname 参数

影响模块:Ops Environment Biz

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-02 22:30:06 +08:00
lzh
46096a6e6b fix(iot,ops): 确保信标相关审计事件包含orderId以支持工单关联查询
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. BeaconDetectionRuleProcessor.publishAuditEvent 添加 orderId 参数
   - BEACON_ARRIVE_CONFIRMED 事件包含当前工单ID
   - BEACON_LEAVE_WARNING_SENT 事件从设备状态获取工单ID
   - TTS_REQUEST 事件不包含工单ID(非工单特定)

2. SignalLossRuleProcessor.publishAuditEvent 添加 orderId 参数
   - BEACON_COMPLETE_REQUESTED 事件包含当前工单ID
   - COMPLETE_SUPPRESSED_INVALID 事件从设备状态获取工单ID

3. CleanOrderAuditEventHandler 使用 EventLogRecord.builder()
   - 显式设置 targetId 和 targetType 字段
   - 确保 targetType="order" 当 orderId 存在时

影响范围:
- ops_business_event_log 表新增记录将正确包含 targetId 和 targetType
- 支持按工单ID查询所有相关审计日志
- 解决信标到岗/离岗/完成事件缺失工单关联的问题

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 10:26:06 +08:00
lzh
fc1bc609e6 test(ops): 修复测试代码中 isNull() 参数匹配问题
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
使用 any(Long.class) 替代 isNull() 以正确匹配 Long 类型参数

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 02:45:05 +08:00
lzh
83c9fb98d7 test(ops): 修复测试代码中的参数验证问题
- 修复 broadcast 方法验证,使用 isNull() 匹配 orderId 参数

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 02:43:02 +08:00
lzh
3c3443aef0 test(ops): 修复测试代码以适配方法签名变更
- 修复 sendPriorityUpgradeNotification 方法调用,添加 orderId 参数
- 修复 broadcast 方法调用,添加 ttsFlag 参数

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 02:42:04 +08:00
lzh
c6610e97f0 fix(ops): 修复 TtsQueueConsumer 中 Set/List 类型不匹配问题
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
修复了 redisTemplate.keys() 返回 Set<String> 但代码声明为 List<String> 的类型不匹配问题

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 02:26:47 +08:00
lzh
0a0f6be68e 修复 TtsQueueConsumer 缺少 Resource 注解导入
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-01 02:17:18 +08:00
lzh
2afc173e18 修复 ops_business_event_log 表中日志缺少 targetType 和 targetId 的问题
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-01 02:05:41 +08:00
lzh
41c4f57f05 新增 TTS 队列相关文件 2026-02-01 02:05:08 +08:00
lzh
fecaa28bc7 feat(ops): 优化工单查询语音播报内容
- 播报当前工单作业区域(替代工单标题)
- 播报剩余待办工单数量
- 简化播报文案,更人性化

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 01:49:35 +08:00
lzh
d2f2e06c58 test: 更新测试数据以适配配置模型变更
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
- SignalLossRuleProcessorTest: 更新测试用例
- area_device_relation_full_config.sql: 移除buttonEvent配置
- badge_device_dispatch_test_data.sql: 更新测试数据

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:57:52 +08:00
lzh
5d8c4045d4 refactor(ops): 简化AreaDevice与BadgeDevice服务实现
- AreaDeviceService: 移���设备索引缓存逻辑(由IoT模块管理)
- AreaDeviceServiceImpl: 简化实现,直接查询数据库
- BadgeDeviceStatusService: 更新接口方法签名
- BadgeDeviceStatusServiceImpl: 修复语法错误,简化实现
- BadgeDeviceStatusEventListener: 适配事件处理逻辑
- CleanOrderEventListener: 更新事件处理

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:57:38 +08:00
lzh
89e68eceb2 refactor(iot): 重构配置模型与实现双层缓存优化
- 将 buttonEvent 配置从区域级移至设备级(iot_device.config)
- 添加 getConfigWrapperByDeviceId 方法支持一对一设备查询
- 实现设备索引缓存 + 区域配置缓存的双层缓存设计
- 添加设备类型常量 DEVICE_RELATION_TYPES
- 完善 JavaDoc 注释说明配置层级划分

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:57:03 +08:00
lzh
f9742137c5 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
- Redis Sorted Set 改用 queueId 作为 member,详细信息存储在 Hash
- REMOVED 状态同步更新 Redis,避免自动派单查询到已完成任务
- 新增 getWaitingTasksByUserIdFromDb() 强制从 MySQL 读取最新数据
- 修复队列状态枚举值统一为大写

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 18:28:27 +08:00
lzh
4d34951799 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-01-30 14:50:38 +08:00
lzh
28b9a32cb6 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
- 实现空闲设备待办工单检查定时任务

- 修复事件日志 orderId 关联 (使用 targetId)

- 增强语音播报和工单事件的日志完整性
2026-01-30 12:03:24 +08:00
lzh
80278f64f6 fix(ops): 修改新工单语音 2026-01-30 10:52:53 +08:00
lzh
f818641b1a 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-01-30 09:46:36 +08:00
lzh
fe92b4cafb fix(ops): 工单完成添加语音播报和assigneeId传递 2026-01-30 09:45:16 +08:00
lzh
260d4b8220 fix(ops): 修复区域路径拼接重复问题
在构建区域完整路径时,跳过当前区域ID,避免parentPath中
包含当前区域时导致名称重复拼接

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude (MiniMax-M2.1) <noreply@anthropic.com>
2026-01-30 00:17:38 +08:00
lzh
fee974912e feat(ops): 添加工单到岗语音播报
1. VoiceBuilder 新增 buildOrderArrived() 方法
2. 到岗时播报"已到达作业区域,请开始清洁作业"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude (MiniMax-M2.1) <noreply@anthropic.com>
2026-01-29 23:36:56 +08:00