Commit Graph

393 Commits

Author SHA1 Message Date
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
78aba0d1ed refactor(system): 用户头像预签名改为 @OssPresignUrl 声明式处理
在 AuthPermissionInfoRespVO、OAuth2UserInfoRespVO、UserProfileRespVO、
UserRespVO 的 avatar 字段添加 @OssPresignUrl 注解,移除
AuthController、OAuth2UserController、UserController、
UserProfileController 中手动调用 fileApi.presignGetUrl 的代码,
Controller 回归薄层职责。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 15:06:43 +08:00
lzh
ff153dd1a9 refactor(infra): 文件列表接口接入 @OssPresignUrl 自动预签名
FileRespVO.url 字段添加 @OssPresignUrl 注解,移除 Controller 中
手动调用 presignGetUrl 的逻辑,由框架层 ResponseBodyAdvice 统一处理。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 15:06:23 +08:00
lzh
807d44e398 feat(infra): 批量预签名 API 及单体/微服务双模式自动配置
新增 FileApi.presignGetUrls 批量签名接口(@NotEmpty + @Size(max=500)),
FileServiceImpl 实现带 null 守卫。

自动配置设计:
- 单体模式:ViewshFileAutoConfiguration 直连 FileService
- 微服务模式:OssPresignUrlApiAutoConfiguration 通过 Feign 代理
- 通过 @ConditionalOnMissingBean 互斥,保证同一 JVM 只有一个实现

新增 OssPresignHelper 工具类,供 Handler 层处理动态 Map 字段
(如 extInfo 中的图片 URL),提供静默降级的单个/批量/JSON数组签名方法。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 15:06:05 +08:00
lzh
f3299bd655 feat(framework): 新增 @OssPresignUrl 注解与 ResponseBodyAdvice 自动预签名框架
基于 ResponseBodyAdvice 拦截 CommonResult 响应体,通过反射递归扫描
VO 中标注 @OssPresignUrl 的 String 字段,去重后批量调用
OssPresignUrlApi 一次性完成预签名,再回填到对应字段。

核心设计:
- supports() 阶段通过泛型静态分析判断 VO 是否含注解字段,
  无注解的接口零开销跳过(类似字典翻译注解思路)
- 三级缓存:FIELD_CACHE / ALL_FIELDS_CACHE / HAS_PRESIGN_CACHE
- 递归深度限制 MAX_SCAN_DEPTH=10 防止 StackOverflow
- 仅扫描 com.viewsh.* 包,规避 Java 17 模块系统限制
- 异常静默降级,保留原始 URL

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 15:05:42 +08:00
lzh
f792ee1678 refactor(system): 社交绑定列表逻辑下沉至 Service 层
将 SocialUserBindMapper 从 Controller 移除,数据组装逻辑移至
SocialUserService.getSocialUserBindList(),返回绑定时间字段;
修复 avatar 误用 getNickname() 的 bug

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 18:04:37 +08:00
lzh
064ccdac89 feat(system): 管理后台微信小程序一键登录接口
新增 /system/auth/weixin-mini-app-login 端点,通过微信手机号授权
匹配管理员账号并自动绑定,含绑定冲突检测:
- 同一微信已绑定其他管理员 → 拒绝
- 同一管理员已绑定其他微信 → 拒绝

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 18:01:53 +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
d123057d73 feat(system): 用户头像 URL 预签名支持
- AuthController 登录权限接口返回预签名头像
- UserController 用户列表及详情返回预签名头像
- UserProfileController 个人中心预签名头像,保存时剥离签名参数
- OAuth2UserController 用户信息接口返回预签名头像

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 17:44:41 +08:00
lzh
a567c62ae2 feat(infra): 文件列表及详情接口增加私有桶预签名
- FileController.getFilePage/getFile 对私有桶文件 URL 生成预签名访问地址

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 17:44:28 +08:00
lzh
6a9aa82bac feat(infra): S3 私有桶预签名核心能力
- S3FileClient.buildDomain() 修复 COS virtual-hosted-style 域名生成
- S3FileClient.presignGetUrl() 支持跨桶签名及 endpoint 校验
- FileApi.presignGetUrl() 修复 Feign nullable 参数注解

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-17 17:44:21 +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
b530912fe2 Merge pull request 'feat(ops): 安保工单模块完整实现' (#1) from feat/security-work-order into master
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
Reviewed-on: #1
2026-03-15 16:44:14 +08:00
lzh
c9d443a75b feat(sql): 安保工单扩展表新增 false_alarm 字段,附增量迁移脚本
- DDL: ops_order_security_ext 新增 false_alarm tinyint(1) 列
- 增量迁移: ops_order_security_ext_migrate.sql 供已部署环境 ALTER TABLE

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 10:35:30 +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
2a20f7a89f fix(framework): ApiRequestFilter 纳入 /open-api 路径,修复 open-api 多租户拦截缺失
TenantSecurityWebFilter 继承 ApiRequestFilter,之前 shouldNotFilter 仅匹配
/admin-api 和 /app-api,导致 /open-api 请求跳过租户校验,DB 层
getRequiredTenantId() 抛 NPE。现在补上 openApi prefix,外部系统需传
tenant-id Header。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 12:02:02 +08:00
lzh
6e56dcb6a2 feat(framework): API 签名、安全白名单与 Web 配置调整
- 新增 ApiSignatureProperties 配置类
- 调整签名自动配置与 Redis DAO 实现
- 更新安全白名单与 Web 属性配置
- 网关新增安保模块路由配置

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:35:05 +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
lzh
4d36bf5b1c feat(ops): 新增安保工单事件监听器,覆盖全状态业务日志
监听工单创建后自动派单、状态变更记录扩展表时间点(派发/确认/
完成),统一记录业务日志,区分系统自动完单与人工完单。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:33:18 +08:00
lzh
784c2ed387 feat(ops): 新增安保工单核心服务与派单策略
包含安保工单 CRUD(创建/确认/完单)、区域人员绑定服务、
区域分配策略 SecurityAreaAssignStrategy、调度策略
SecurityScheduleStrategy,以及安保扩展查询处理器。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:33:09 +08:00
lzh
d53d1c4584 feat(ops): 新增安保模块数据模型与 Mapper
新增安保区域人员绑定表 ops_area_security_user 和安保工单扩展表
ops_order_security_ext,以及对应的 DO 和 Mapper 接口。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 17:32:56 +08:00
lzh
b8d0a77156 feat(ops): 调整队列评分权重,楼层差×3 老化÷1.67,临界值 1 层=20 分钟
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
FLOOR_WEIGHT 20→60、AGING_WEIGHT 5→3,强化就近派单效果。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 15:59:11 +08:00
lzh
57f32e56a9 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 队列层基于优先级和时间戳的本地兜底算分逻辑

- 强制 enqueue、batchEnqueue、updatePriority 使用服务层预先计算的 queueScore

- 兼容历史缺少 queueScore 的 Redis 记录,按最低优先级处理避免旧模型重新参与排序

- 补齐 QueueSyncService 的 queueScore 映射,确保 MySQL 同步到 Redis 时保留总分

- 新增 QueueSyncServiceTest 覆盖同步链路携带 queueScore 的行为
2026-03-07 22:44:09 +08:00
lzh
af1e0c0989 fix(iot): 暂时取消作业时长不足抑制自动完成逻辑
信号丢失超时后不再校验最小有效作业时长,所有情况均直接触发自动完成。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 22:32:16 +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
26c4ce07eb feat(iot,ops): 区域设备关联接口返回更多设备信息,修复 N+1 和代码质量问题
- IotDeviceSimpleRespDTO 新增 nickname、serialNumber、state、deviceType 字段
- IotDeviceQueryApi 新增 batchGetDevices 批量查询接口
- IotDeviceQueryApiImpl 提取 toSimpleDTO 统一转换、通过产品缓存解析 productName、
  移除 blanket try-catch 让异常正确传播、删除无用 import
- AreaDeviceRelationRespVO 新增 nickname、serialNumber、deviceState、deviceType 字段
- AreaDeviceRelationServiceImpl.listByAreaId 改为批量查询避免 N+1 RPC、
  增加 null 防护;bindDevice 改为 fail-fast 不再存脏数据
- ErrorCodeConstants 新增 IOT_SERVICE_UNAVAILABLE 错误码

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 21:06:10 +08:00
lzh
e3882e1c2f fix(ops): code review 修复巡检模块6项问题
1. @Async 指定 ops-task-executor 线程池,避免使用默认线程池
2. 归属判定无工单/无标准时长时标记为 ATTRIBUTION_NORMAL(3),不再静默跳过
3. 补充 completionSeconds 字段语义注释和 standardDuration 单位转换说明
4. 整改工单默认时长 30 提取为 DEFAULT_RECTIFICATION_DURATION_MINUTES 常量
5. SQL 补充 idx_generated_order_id 和 idx_template_id 索引

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 20:40:36 +08:00
lzh
f70402587d feat(ops): 巡检统计接口(合格率、不合格热点区域 TOP10)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 20:13:13 +08:00
lzh
743875e65e feat(ops): 巡检记录分页查询接口(按区域/巡检员/结果/时间筛选)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 20:11:21 +08:00
lzh
23cf3b62b2 fix(ops): 修复巡检异步处理的 @Async 自调用和事务可见性问题
Code review 发现两个关键缺陷:
1. @Async 自调用:triggerAttributionAsync() 在同一类内调用,
   Spring AOP 代理不生效,实际同步执行
2. 事务可见性:异步任务可能在事务提交前读取未持久化数据

修复方案:
- 提取 InspectionAsyncHandler(独立 @Component),@Async 通过代理生效
- 使用 TransactionSynchronizationManager.afterCommit() 确保事务提交后触发
- 修复 InspectionRectificationServiceImpl 的 null 安全问题
- 修复 InspectionTemplateServiceImpl 更新路径缺少 id 空校验

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 19:30:01 +08:00
lzh
162bf1d20d feat(ops): 巡检整改工单自动创建(Task 7)
- InspectionRectificationService + Impl: 不合格巡检自动创建整改工单
  - 复用 CleanOrderService.createAutoCleanOrder() 对接现有工单引擎
  - sourceType = INSPECTION, priority = P1, cleaningType = SPOT
  - generated_order_id 回写到巡检记录
- InspectionRecordServiceImpl: 异步流程增加整改工单创建步骤
  - 归属判定与整改工单创建独立 try/catch,互不阻塞

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 19:23:34 +08:00
lzh
3120b1911d feat(ops): 巡检归属判定异步服务(Task 6)
- InspectionAttributionService + Impl: 归属判定核心逻辑
  - 回溯区域最近 COMPLETED 工单,获取 completionSeconds
  - 与 ops_bus_area.standardDuration 比较判定责任归属
  - T_stay >= threshold → 突发状况(2),< threshold → 个人责任(1)
  - 判定结果回写 inspection_record(lastOrderId, stayDuration, attributionResult)
- InspectionRecordServiceImpl: 注入 AttributionService,异步调用含异常兜底

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 19:18:56 +08:00
lzh
e4dde8dbc1 feat(ops): 巡检结果提交接口(Task 5)
- InspectionRecordService + Impl: 提交巡检主记录+明细,同事务保存
- 自动判定 resultStatus:任一项不合格则整体不合格
- 不合格时异步触发归属判定(Task 6 占位)
- InspectionSubmitReqVO/ItemVO: 带校验注解的请求 VO
- InspectionRecordRespVO: 巡检记录响应 VO
- InspectionController 新增 POST /submit 端点
- ErrorCodeConstants 新增 INSPECTION_RECORD_NOT_FOUND

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 19:15:01 +08:00