Files
aiot-platform-cloud/viewsh-module-ops/viewsh-module-ops-server
lzh c78759fd52
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
feat(ops): 新增保洁工单超时自动取消 Job + 集成测试
背景:保洁工单偶尔因设备离线/信标丢失导致卡在非终态(如 PENDING 超 12h 没派,
DISPATCHED 超 12h 没确认),靠人工清理成本高。补一个每小时跑的 XXL-Job 扫描关单。

实现:
- CleanOrderAutoCancelJob.scanAndCancel:
  * 查询 update_time 距今超 timeoutHours(默认 12h)的 CLEAN 工单
  * 状态白名单 = PENDING/QUEUED/DISPATCHED/CONFIRMED/ARRIVED,**排除 PAUSED**
    (PAUSED 是 P0 打断的产物,应由 resumeInterruptedOrder 走状态机恢复,
    此处若把它 CANCEL,会破坏 P0 完成后的 resume 链路)
  * 调用 orderLifecycleManager.cancelOrder 走完整责任链,事件监听器负责
    TTS 停播/设备关联回收/审计日志
  * cancel 前再 selectById 做乐观校验:若 update_time 已刷新或状态已变
    (COMPLETED/CANCELLED/PAUSED),跳过;避免候选装内存到实际 cancel
    之间用户刚触达的工单被误杀
  * 单单独立 try/catch 隔离,单条失败不断批
  * batchSize 限流(默认 200),事件风暴防护
- application.yaml 补默认配置:viewsh.ops.clean.auto-cancel.{timeout-hours, batch-size}
- CleanOrderAutoCancelJobTest 覆盖 6 条不变量:
  无候选零计数、全成功、部分失败不中断、乐观锁跳过 stale、终态跳过、PAUSED 跳过

XXL-Job 配置建议:
- JobHandler: cleanOrderAutoCancelJob
- Cron: 0 17 * * * ? (每小时 :17,避开整点尖峰)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 15:21:33 +08:00
..