Commit Graph

267 Commits

Author SHA1 Message Date
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
bde680c188 fix(ops): VspNotifyClient 强制 HTTP/1.1,修复 h2c 升级导致 body 丢失
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
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
lzh
93bc1f10c3 fix(security): 规范安保工单事件日志,消除重复记录
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
修复前同一次派发产生 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
lzh
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
lzh
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
lzh
c0c9854e73 fix(security): sendCard 改为 DISPATCHED 状态变更时发送 + @EventListener
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
- 将 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
lzh
68b6f45d53 fix(ops): 修复 prod 环境 alarm-system 签名校验失败
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 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
lzh
5c868c8003 chore(ops): 更新 vsp-notify 地址为 172.17.16.14
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
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 15:46:53 +08:00
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
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
lzh
92a51adcea 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
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
lzh
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
lzh
88533c9d69 refactor(ops): 安保工单图片预签名下沉至 SecurityOrderExtQueryHandler
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
将 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
lzh
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
lzh
4796009e95 fix(test): 移除 SecurityOrderServiceTest 中无效的 setLocation 调用
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
location 由 AreaPathBuilder.buildPath() 自动生成,DTO 中无此字段,修复编译错误。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 17:25:01 +08:00
lzh
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
lzh
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
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
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
lzh
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
lzh
4a7128321e feat(ops): 安保模块构建配置与枚举扩展
- security-biz pom 新增 ops-biz、iot-api 依赖
- ops-server pom 引入 security-biz 模块
- 新增 SECURITY_GUARD 操作人类型、ALARM 来源类型
- 新增安保相关错误码
- dev/local 配置新增安保数据源

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:33:55 +08:00
lzh
2e4432e51b feat(ops): 新增安保工单 Controller 与开放接口
包含 SecurityOrderController(创建/确认/完单/自动完单)、
SecurityAreaUserController(区域人员绑定)、
SecurityOrderOpenController(外部回调),
以及对应的 VO 和权限配置。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:33:42 +08:00
lzh
0f2fb3c50e test(ops): 新增安保模块单元测试
覆盖 SecurityOrderService、SecurityOrderEventListener、
SecurityAreaAssignStrategy、SecurityOrderExtQueryHandler、
OpsAreaSecurityUserService 的核心逻辑测试。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:33:28 +08:00