55ef659364
feat(ops): 手动派单遵循执行人忙碌状态,忙碌时入队等待
...
ManualOrderActionFacade.dispatch:
- 新增 strategy.isAssigneeIdle() 判断,空闲→DISPATCHED,忙碌→QUEUED
- 不再无条件直接派发
OrderBusinessStrategy:
- 新增 isAssigneeIdle() 默认方法,默认返回 true
CleanOrderBusinessStrategy:
- isAssigneeIdle 通过 BadgeDeviceStatusService.isBusy() 判断设备忙碌
SecurityOrderBusinessStrategy:
- isAssigneeIdle 通过 UserDispatchStatusService.isIdle() 判断人员忙碌
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 16:37:30 +08:00
78396cf35a
fix(ops): 调度状态补偿 QUEUED→终态跳过 DISPATCHED 场景
...
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
UserDispatchStatusEventListener:
- assigneeId 兜底从工单主表获取(forceComplete 等 payload 缺失场景)
- QUEUED→COMPLETED/CANCELLED 补偿 decrementWaitingTaskCount
UserDispatchStatusServiceImpl:
- 新增 LUA_DECREMENT_WAITING 脚本,安全递减 waitingTaskCount(不低于 0)
OpsOrderEventService:新增 8 参数 recordEvent 重载(含 operatorName)
DispatchEngineServiceAdapter:reason 文案统一为"手动派单"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 16:09:30 +08:00
06d701ed5e
refactor(ops): 通用控制器收口,手动动作移至条线控制器
...
OpsOrderController:
- 移除 create/assign/complete/cancel 接口,避免绕过条线入口
- 保留查询、元数据维护、设备/人员驱动的状态操作(accept/pause/resume)
- 新增 business-logs 查询接口
CleanWorkOrderController:新增手动创建/派单/取消端点
SecurityOrderController:新增手动派单/取消/升级优先级端点
ErrorCodeConstants:新增安保条线错误码
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 16:09:07 +08:00
1d09a50643
feat(security): 安保条线接入 ManualOrderActionFacade
...
SecurityOrderBusinessStrategy:
- validateDispatch: 去除区域绑定强限制,允许跨区域派单,保留姓名回填
- afterUpgradePriority: 队列分数重算
SecurityOrderServiceImpl:
- manualDispatch: resolveUser 一次查询同时拿姓名和手机号
- manualCancel/upgradePriority: 委托 facade,传入 operatorName
- 手动创建走 OrderAuditService 审计(告警触发仅写业务日志)
SecurityOrderEventListener:
- 3 处 resolveOperatorName() 改为从 event.payload.operatorName 读取
- 移除 AdminUserApi 依赖,消除重复远程调用
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 16:08:48 +08:00
5d91097e75
feat(clean): 保洁条线接入 ManualOrderActionFacade
...
CleanOrderBusinessStrategy:
- validateDispatch: 校验设备在线/可接单/区域匹配
- afterUpgradePriority: adjustPriority + rebuildWaitingTasks + P0 通知
CleanWorkOrderServiceImpl:
- manualCreateOrder: 主表+扩展表+创建事件+审计日志
- manualDispatch/manualCancelOrder/manualCompleteOrder/upgradePriority: 委托 facade
- 所有入口统一 resolveUserName 传入 operatorName
UpgradePriorityReqDTO:新增 newPriority/operatorId 字段
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 16:08:20 +08:00
333329c29c
refactor(clean): 抽取 CleanOrderNotificationService,解除 listener 循环依赖
...
- 通知方法(语音播报/站内信)从 CleanOrderEventListener 迁移到 CleanOrderNotificationService
- CleanOrderServiceImpl 改为依赖 NotificationService 而非 Listener
- CleanOrderEventListener 补齐 QUEUED 和 PAUSED 状态的 business log
- 派单/取消日志从 handleDispatched/handleCancelled 内联改为独立 recordXxxLog 方法
- 硬编码字符串 "CLEAN" 统一替换为 WorkOrderTypeEnum.CLEAN.getType()
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 16:07:57 +08:00
6e5366be57
feat(ops): OrderTransitionRequest 新增 operatorName,EventPublishHandler 透传到事件 payload
...
手动操作场景下 operatorName 沿 facade → request → EventPublishHandler → payload 透传,
listener 从 payload 直接读取,不再重复调用 AdminUserApi。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 16:07:34 +08:00
6b01c29cb1
feat(ops): 新增统一手动动作门面与审计服务
...
ManualOrderActionFacade:
- 统一骨架:查单校验 → 条线前置 → 状态变更 → 条线后置
- dispatch 支持 PENDING/QUEUED 状态,用独立对象更新 assignee 避免覆盖状态机已写入的 status
- cancel/complete 走 transition() 透传 operatorName 到领域事件
- dispatch/cancel/complete 业务日志由 listener 统一记录,不重复写
OrderAuditService:
- 仅用于 create/upgradePriority(不经过状态机的手动动作)
- 只写 ops_business_event_log,不写 ops_order_event(时间轴只由状态机写)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 16:07:13 +08:00
e1d967a65e
feat(ops): 新增手动操作枚举与模型定义
...
引入统一手动动作基础设施:
- ManualActionTypeEnum: 手动动作类型(创建/派单/取消/完单/升级)
- OrderActionSourceEnum: 动作来源(管理后台/开放接口)
- OrderAuditPayloadKeys: 审计 payload 标准化 key
- OrderEventTypeEnum: 事件类型枚举值对齐状态机(DISPATCHED/QUEUED/CONFIRMED)
- OperatorContext: 统一操作人上下文
- *Command: 手动动作命令模型(Dispatch/Cancel/Complete/UpgradePriority)
- OrderBusinessStrategy: 条线策略接口
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-27 15:53:20 +08:00
4dffd21751
fix(security): 工单取消日志区分操作来源
...
根据 operatorType 区分日志描述:
- SYSTEM → "系统自动取消(原因)"
- ADMIN → "管理员手动取消(原因)"
- 其他 → "安保工单已取消(原因)"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 16:14:34 +08:00
4763caf2cc
fix(ops): 移除 OrderLifecycleManager 中重复的业务日志记录
...
LifecycleManager 是通用层,业务日志统一由各业务线 EventListener 负责。
移除 cancelOrder、completeOrder(ADMIN)、pauseOrder、resumeOrder 中的
eventLogRecorder 调用,避免与 SecurityOrderEventListener 等监听器产生
重复日志记录。保留 interruptOrder 的日志(P0 打断是通用机制)。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 16:09:58 +08:00
bde680c188
fix(ops): VspNotifyClient 强制 HTTP/1.1,修复 h2c 升级导致 body 丢失
...
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
JDK 17 HttpClient 默认尝试 HTTP/2 升级(h2c),uvicorn 不支持 h2c
协商,处理 Upgrade 请求时丢弃 body,导致 Python 端收到空 {}。
强制 HTTP_1_1 禁用 h2c 升级。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 16:04:32 +08:00
93bc1f10c3
fix(security): 规范安保工单事件日志,消除重复记录
...
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
修复前同一次派发产生 4 条 ORDER_DISPATCHED 日志的问题:
- 新增 ORDER_QUEUED 枚举,handleQueued 改用正确的 event_type
- handleArrived 改用 ORDER_ARRIVED(之前错用 ORDER_CONFIRM)
- 移除 onOrderCreated 中派单成功的重复日志(由状态监听统一记录)
- 移除 DispatchEngineImpl.dispatch 上的 @BusinessLog 注解(避免与
业务层 EventListener 日志重复)
- ORDER_DISPATCHED 描述改为"工单派发",ORDER_ARRIVED 改为"人员到达"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 15:30:42 +08:00
bd70f3bc8a
fix(ops): 修复队列脏数据导致工单永远排队无法派发
...
问题:autoCompleteOrder 直接调用 orderStateMachine.forceTransition,
绕过责任链导致队列记录残留 WAITING,autoDispatchNext 反复命中脏数据
失败,人员状态永远 BUSY,新工单全部 ENQUEUE_ONLY 形成死循环。
修复:
1. SecurityOrderServiceImpl 所有状态操作统一走 OrderLifecycleManager,
移除对 OrderStateMachine 的直接依赖
2. autoDispatchNext 增加循环遍历 + 工单状态校验,跳过并清理非 QUEUED
的脏队列记录,增加 maxSkip=50 防护上限
3. forceComplete 返回值校验,失败时抛异常而非静默继续
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 15:30:02 +08:00
8406a80655
feat(ops): OrderLifecycleManager 支持 forceComplete 强制完成工单
...
新增 forced 字段到 OrderTransitionRequest,StateTransitionHandler 根据
该字段选择 transition 或 forceTransition,确保强制状态转换也走完整
责任链(队列同步 + 事件发布),避免绕过 QueueSyncHandler 产生脏数据。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 15:29:29 +08:00
c0c9854e73
fix(security): sendCard 改为 DISPATCHED 状态变更时发送 + @EventListener
...
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
- 将 sendCard 从 onOrderCreated 移至 handleDispatched
- 使用 @EventListener 替代 @TransactionalEventListener(AFTER_COMMIT)
确保 autoDispatchNext 场景的 DISPATCHED 事件也能触发
- PAUSED → DISPATCHED 恢复场景跳过重发
- 参考保洁模块 CleanOrderEventListener 的实现模式
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-26 14:06:31 +08:00
68b6f45d53
fix(ops): 修复 prod 环境 alarm-system 签名校验失败
...
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 profile 启动时 application-prod.yaml 为空,主 application.yaml
缺少 viewsh.signature.apps.alarm-system 配置,导致告警系统调用
SecurityOrderOpenController.createOrder 时报错:
[appId(alarm-system)] 找不到对应的 appSecret
将签名配置添加到主 application.yaml 作为所有环境的兜底。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 16:48:09 +08:00
5c868c8003
chore(ops): 更新 vsp-notify 地址为 172.17.16.14
...
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
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 15:46:53 +08:00
394b644a4e
feat(security): 安保工单接入队列调度,支持入队等待和负载均衡
...
改造安保调度策略,接入 UserDispatchStatusService:
SecurityScheduleStrategy:
- 读 Redis 判断人员忙碌/空闲,决策 DIRECT_DISPATCH / PUSH_AND_ENQUEUE / ENQUEUE_ONLY
- PAUSED 状态视为忙碌,不给暂停中的人员推送新工单
- 替换原来的始终 DIRECT_DISPATCH 逻辑
SecurityAreaAssignStrategy:
- Pipeline 批量读 Redis 获取每人活跃工单数
- 选负载最轻的人员,同等负载取 sort 最小
SecurityOrderEventListener:
- 新增 QUEUED 分支,入队时写入 assignee 信息到扩展表
- 取消工单后自动派发下一个等待工单(兜底从 ops_order 表获取 assigneeId)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 15:46:19 +08:00
9115e03878
feat(ops): 新增通用人员调度状态服务 UserDispatchStatusService
...
基于 Redis Hash 维护人员维度的调度状态,供安保/工程/客服业务线共用。
与保洁的 BadgeDeviceStatusService(设备维度)并行。
核心设计:
- Redis Key: ops:user:dispatch:{userId},存储 status/activeOrderCount/waitingTaskCount 等
- 所有写操作使用 Lua 脚本原子执行,保证多业务线并发安全
- 事件监听器 @EventListener(事务内同步)自动排除 CLEAN 类型
- Redis 丢数据时降级为 IDLE,下一次事件自动重建(自愈)
新增文件:
- UserDispatchStatusDTO (ops-api)
- UserDispatchStatusService 接口 (ops-biz)
- UserDispatchStatusServiceImpl - Lua 脚本实现 (ops-biz)
- UserDispatchStatusEventListener - 通用事件监听 (ops-biz)
- UserAssigneeStatusAdapter - AssigneeStatus 适配器 (ops-biz)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 15:44:42 +08:00
0dfc669488
feat(security): 安保派单补充处理人手机号,接口返回 phone 和 cameraName
...
- SecurityAreaAssignStrategy 注入 AdminUserApi,从用户表查询
nickname 和 mobile 替代冗余字段
- OpsOrderSecurityExtDO 新增 assignedUserPhone 字段
- SecurityOrderEventListener.handleDispatched 写入 assignedUserId、
assignedUserName、assignedUserPhone 到扩展表
- SecurityOrderExtQueryHandler 接口返回补充 assignedUserPhone 和
cameraName
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 14:26:54 +08:00
718d14e162
feat(ops): 派单链路全程传递 assigneeName 和 assigneePhone
...
AssigneeRecommendation、OrderDispatchContext、OrderTransitionRequest
新增 assigneePhone 字段;DispatchEngineImpl 在三条派单路径中传递
phone;EventPublishHandler 将 assigneeName 和 assigneePhone 写入
事件 payload,修复下游监听器取不到 assigneeName 的问题。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 14:26:40 +08:00
4c48f72c66
feat(security): 安保人员列表接口补充昵称和手机号
...
区域安保人员查询接口批量关联 AdminUserApi,
在响应中填充 nickname 和 mobile 字段
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 11:31:09 +08:00
c7bdf7d773
refactor(security): 清理 security-biz 中旧的 vsp 文件,更新测试
...
- 删除 security-biz/integration/vsp/ 旧目录(已迁移至 ops-biz/infrastructure/vsp/)
- 更新 SecurityOrderEventListenerVspTest import 路径
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 11:30:24 +08:00
fbc88cd620
feat(security): 拆分 VSP 通知为独立监听器 SecurityOrderVspNotifyListener
...
将 VSP 企微通知逻辑从 SecurityOrderEventListener 抽取到独立的
SecurityOrderVspNotifyListener,遵循单一职责原则:
- SecurityOrderEventListener: 派单 + 时间戳 + 业务日志
- SecurityOrderVspNotifyListener: 企微卡片发送 + 状态同步
独立 @Async + @TransactionalEventListener 避免自调用导致 @Async 失效
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 11:29:59 +08:00
55c6b0ea1c
feat(ops): 注册 SocialUserApi 并添加 vsp-notify 配置
...
- RpcConfiguration 新增 SocialUserApi Feign 客户端注册
- application.yaml 新增 viewsh.ops.vsp-notify 配置段
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 11:29:36 +08:00
8ab5ce6d01
feat(security): 安保工单扩展表新增 cameraName 字段
...
VO/DTO/DO 全链路新增摄像头名称字段,告警系统创建工单时传入,
用于企微卡片通知展示。
SQL: ALTER TABLE ops_order_security_ext ADD COLUMN camera_name VARCHAR(128) DEFAULT NULL COMMENT '摄像头名称' AFTER camera_id;
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 11:29:17 +08:00
e44c1f6f4e
feat(ops): 新增 VSP 企微通知网关基础设施
...
- VspNotifyClient/Impl: HTTP 客户端,支持网络异常重试 + 线性退避
- VspNotifyProperties/Config: 配置属性与 RestTemplate Bean(JdkClientHttpRequestFactory)
- VspSendCardReqDTO/VspSyncStatusReqDTO/VspResponseDTO: 请求响应 DTO
- WechatUserIdResolver: 企微 userId 查询工具,通过 SocialUserApi 查询,供各业务线复用
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-25 11:28:53 +08:00
47c768ec6f
feat(ops): 整改工单去重 — 已有活跃工单时升级优先级而非重复创建
...
- InspectionRectificationServiceImpl 先查区域活跃保洁工单:
排队中(PENDING/QUEUED)→升级一级优先级;已派发/已到达→静默跳过
- OpsOrderMapper 新增 selectActiveCleanOrder,使用枚举替代硬编码终态
- InspectionAsyncHandler 清理归属判定注释代码,替换为 TODO 标记
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-22 15:00:25 +08:00
f213510b03
refactor(ops): 巡检接口重构 — 位置校验前移、列表/详情分离、表单聚合
...
接口变更:
- 删除 POST /verify-location,位置校验改为前端本地蓝牙信标匹配
- 新增 GET /record/get 巡检记录详情(含明细项、照片)
- GET /list-by-area 升级为返回完整巡检表单(区域+检查项+信标配置)
- GET /record/page 返回类型改为 VO,新增区域全路径名称和巡检员姓名
- 提交和表单接口增加 inspector 角色校验
代码质量(Code Review 修复):
- 提取 buildAreaFullName 至 OpsBusAreaMapper 消除两个 Service 的重复
- 新增 buildAreaFullNameMap 批量方法,修复分页场景 N+1 查询
- getRecordDetail 中 adminUserApi 改用 getUserMap + try-catch 降级
- InspectionTemplateServiceImpl 去掉 ObjectMapper 依赖,直接 Map 取值
- RSSI 阈值取最宽松值逻辑添加语义注释
- 巡检错误码从 1-020-003 迁移至 1-020-004,修复与安保模块的码段冲突
- InspectionRecordDetailRespVO.photos 使用 @OssPresignUrl 自动预签名
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-22 15:00:07 +08:00
f9d0562a49
refactor(ops): OpsOrderController 参数统一为 @RequestBody VO
...
将 acceptOrder、completeOrder、pauseOrder、resumeOrder 四个接口
从 @RequestParam 改为 @RequestBody VO,与其他 POST 接口风格保持一致。
新增 OpsOrderAcceptReqVO、OpsOrderCompleteReqVO、OpsOrderPauseReqVO、
OpsOrderResumeReqVO 四个 Controller 层 VO 类。
注意:此变更为破坏性 API 变更,前端调用方需同步更新请求方式。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 09:45:39 +08:00
4a105da46e
refactor(ops): 提取巡检结果和归属判定枚举,替换硬编码常量
...
新增 InspectionResultEnum(合格/不合格)和 InspectionAttributionEnum
(个人责任/突发状况/正常),替换 InspectionRecordServiceImpl 和
InspectionAttributionServiceImpl 中的 private static final int 硬编码常量。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 09:43:37 +08:00
a4ab24b29c
refactor(ops): 迁移 environment-biz DTO 至 service 层 dto 包
...
将 6 个保洁业务 DTO 从 dal.dataobject 包迁移至对应 service 层:
- cleanorder/dto/: ManualCompleteOrderReqDTO, UpgradePriorityReqDTO,
CleanOrderAutoCreateReqDTO, CleanOrderPauseReqDTO, CleanOrderResumeReqDTO
- badge/dto/: BadgeNotifyReqDTO
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 09:33:27 +08:00
55e9003142
refactor(ops): 迁移 ops-biz 公共层 DTO 至 service/order/dto 包
...
将 11 个工单 DTO 从 dal.dataobject.dto 包迁移至 service.order.dto 包,
DTO 属于业务契约而非数据库实体,放在 service 层更符合分层规范。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 09:31:59 +08:00
c20a42f68a
feat(ops): 巡检记录新增快捷标签字段
...
巡检主记录和明细项新增 tags 字段(JSON 数组),支持巡检员在提交时
选择预设的快捷标签(如"地面污渍"、"垃圾未清理"),便于后续统计分析。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 09:22:25 +08:00
5ce1561437
Merge branch 'master' of http://124.222.218.198:3000/XW-AIOT/aiot-platform-cloud into feature/cleaning-inspection
2026-03-18 23:03:44 +08:00
01e9a556ab
Merge branch 'master' of http://124.222.218.198:3000/XW-AIOT/aiot-platform-cloud into feature/cleaning-inspection
2026-03-18 23:01:09 +08:00
92a51adcea
fix(ops): 安保工单自动完单支持全状态处理
...
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
autoCompleteOrder 根据当前状态分支处理:
- PENDING → transition CANCELLED(未派单,告警已解除)
- DISPATCHED/CONFIRMED/ARRIVED/PAUSED → forceTransition COMPLETED
- 已终态 → 幂等跳过
falseAlarmOrder 复用 autoCompleteOrder 逻辑,额外更新扩展表误报标记。
移除 falseAlarmOrder 未使用的 operatorId 参数。
补充 4 个单元测试覆盖新增分支。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 22:25:44 +08:00
e8a8baf62f
feat(ops): 状态机新增 forceTransition 强制跳转方法
...
适用于系统自动结单等场景,允许跳过转换规则直接跳转到终态,
但仍校验终态不可再转换,且完整记录事件流。
重构:抽取 doTransition 公共方法,transition 和 forceTransition
通过 validate 参数区分,消除重复代码。新增 TERMINAL_STATES
显式终态集合替代隐式空 Set 判断。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 22:25:17 +08:00
88533c9d69
refactor(ops): 安保工单图片预签名下沉至 SecurityOrderExtQueryHandler
...
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
将 OrderCenterController 中的 presignExtInfoImageUrls 方法移除,
预签名逻辑下沉至 SecurityOrderExtQueryHandler 数据组装阶段,
通过 OssPresignHelper 就地处理 imageUrl 和 resultImgUrls。
security-biz 新增 infra-api 依赖,RpcConfiguration 注册 FileApi。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 15:07:03 +08:00
cde78989f0
feat(ops): 工单详情安保图片 URL 预签名支持
...
- OrderCenterController.getDetail 对 extInfo 中 imageUrl/resultImgUrls 生成预签名地址
- RPC 异常时降级返回原始 URL,避免接口整体失败
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-17 17:44:51 +08:00
4796009e95
fix(test): 移除 SecurityOrderServiceTest 中无效的 setLocation 调用
...
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
location 由 AreaPathBuilder.buildPath() 自动生成,DTO 中无此字段,修复编译错误。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-15 17:25:01 +08:00
ea64ca9c61
feat(ops): 安保工单 admin-api/open-api 补全确认、提交、误报接口
...
admin-api:
- 新增 /false-alarm 误报标记接口(权限: ops:security-order:complete)
- createOrder 移除 location 字段
open-api:
- 新增 /confirm 确认工单(无需传 userId)
- 新增 /submit 提交处理结果(结果描述 + 图片)
- 新增 /false-alarm 误报标记
- createOrder 移除 location 字段
VO 优化:
- 合并 SecurityOrderFalseAlarmReqVO 和 SecurityOrderOpenConfirmReqVO
为通用 SecurityOrderIdReqVO,消除重复定义
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-15 10:33:51 +08:00
f32315f790
feat(ops): 安保工单新增误报标记、完善确认/完单接口支持 open-api 场景
...
- 新增 falseAlarmOrder 方法,标记误报并完成工单
- confirmOrder/manualCompleteOrder 支持 operatorId 为 null(open-api 自动取已分配人员)
- 新增 resolveOperatorId 辅助方法,null 时记录 warn 日志
- createSecurityOrder 移除 location 透传,改用 AreaPathBuilder 自动拼接
- 消除 createSecurityOrder 中 area 重复查询(校验 + buildPath 共用同一 DO)
- OpsOrderSecurityExtDO 新增 falseAlarm 字段
- SecurityOrderCompleteReqDTO.operatorId 移除 @NotNull 约束
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-15 10:31:50 +08:00
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
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
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
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
dc75c78d16
fix(ops): 修复业务日志 title 显示英文常量,改为中文映射
...
/business-logs 接口 title 回退取 eventType 时,通过 LogType.getByCode()
映射中文 description 作为标题。同步调整 @BusinessLog 注解 type 属性
改用 LogType 枚举。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 17:34:19 +08:00
fc9393e723
refactor(ops): 扩展 LogType 枚举,补全工单生命周期与 IoT 审计事件类型
...
新增 ORDER_CREATED/CONFIRM/ARRIVED/COMPLETED 等工单生命周期枚举、
BEACON_ARRIVE_CONFIRMED/BEACON_COMPLETE_REQUESTED 等 IoT 审计枚举,
添加 getByCode() 反查方法支持中文 title 映射。
同步新增 LogModule 常量类收口模块标识。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 17:34:08 +08:00