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
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
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
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
4d36bf5b1c
feat(ops): 新增安保工单事件监听器,覆盖全状态业务日志
...
监听工单创建后自动派单、状态变更记录扩展表时间点(派发/确认/
完成),统一记录业务日志,区分系统自动完单与人工完单。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 17:33:18 +08:00
784c2ed387
feat(ops): 新增安保工单核心服务与派单策略
...
包含安保工单 CRUD(创建/确认/完单)、区域人员绑定服务、
区域分配策略 SecurityAreaAssignStrategy、调度策略
SecurityScheduleStrategy,以及安保扩展查询处理器。
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-11 17:33:09 +08:00
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
b8d0a77156
feat(ops): 调整队列评分权重,楼层差×3 老化÷1.67,临界值 1 层=20 分钟
...
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
57f32e56a9
fix(ops): 收口队列 Redis 分数来源
...
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
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
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
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
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
f70402587d
feat(ops): 巡检统计接口(合格率、不合格热点区域 TOP10)
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 20:13:13 +08:00
743875e65e
feat(ops): 巡检记录分页查询接口(按区域/巡检员/结果/时间筛选)
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-05 20:11:21 +08:00
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