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>
This commit is contained in:
@@ -146,6 +146,12 @@ viewsh:
|
||||
connect-timeout: 5000
|
||||
read-timeout: 10000
|
||||
max-retry: 2
|
||||
clean:
|
||||
auto-cancel:
|
||||
# 保洁工单 update_time 距今超过此小时数视为卡死,由 CleanOrderAutoCancelJob 自动取消
|
||||
timeout-hours: 12
|
||||
# 单次扫描/取消上限,防止事件风暴;超出的工单留给下一轮 cron
|
||||
batch-size: 200
|
||||
# API 签名配置:外部系统调用开放接口时使用(如安保工单的告警系统)
|
||||
signature:
|
||||
apps:
|
||||
|
||||
Reference in New Issue
Block a user