Commit Graph

423 Commits

Author SHA1 Message Date
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
53f51e7336 feat(security): 安保扩展表新增 assigned_user_phone 字段及迁移脚本
建表 SQL 补充 camera_name 和 assigned_user_phone 列;
新增增量迁移脚本 ops_order_security_ext_migrate_v1.2.sql。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 14:27:04 +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
40e46d3650 fix(ci): Maven 版本改为 3.9.14 — 阿里云镜像无 3.9.9
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-23 11:29:19 +08:00
lzh
5dabc4762b fix(ci): 回退 BuildKit — Jenkins Docker 未安装 buildx,去掉无效参数
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
Jenkins 服务器 Docker 缺少 buildx 组件,DOCKER_BUILDKIT=1 导致构建报错。
回退为 legacy builder,同时移除无效的 BUILDKIT_INLINE_CACHE 参数。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 11:26:25 +08:00
lzh
4223c6b8da fix(ci): Docker 构建优化 — 修复 Maven 安装超时、启用 BuildKit、优化层缓存
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
- Dockerfile.deps/template: 改用阿里云镜像手动安装 Maven,避免 apk maven
  拉入冗余 openjdk25(600MB+)导致构建超时
- Jenkinsfile: 添加 DOCKER_BUILDKIT=1,使层缓存真正生效
- Dockerfile.deps: framework/dependencies 源码在 COPY . . 前单独复制并预编译,
  提升缓存命中率;mvn install 去掉 || true,编译失败立即报错
- .dockerignore: 补充 .git/、docs/、sql/、scripts/ 等目录,构建上下文从
  60MB 降至 ~5MB

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 11:23:44 +08:00
lzh
f393d242b7 merge: feature/cleaning-inspection 巡检模块完整功能合入 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
包含:
- 巡检模板 CRUD 及动态表单接口
- 巡检结果提交、记录分页、详情、统计接口
- 蓝牙位置校验前移至前端(信标配置下发)
- 巡检不合格自动创建整改工单(去重+优先级升级)
- iBeacon 三元组匹配(IoT 层)
- OssPresign 支持 List<String> 预签名
- 补齐 system_menu 巡检和安保权限记录

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 20:11:27 +08:00
lzh
a7b98e0e5f feat(ops): 补齐巡检和安保模块的 system_menu 权限记录
新增 13 条权限菜单(5088-5100),对齐代码中 @PreAuthorize 声明:
- 巡检记录:ops:inspection:query/create(父:保洁巡检 5087)
- 巡检模板:ops:inspection-template:query/create/update/delete(父:巡检项配置 5085)
- 安保工单:ops:security-order:create/confirm/complete(父:工单中心 5043)
- 安保人员:ops:security-area-user:query/create/update/delete(父:安保配置 5084)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 20:08:55 +08:00
lzh
d3645e1a2f chore: .gitignore 添加 .gstack/ 目录
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 15:00:44 +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
e11d3e1b6e feat(framework): OssPresignResponseBodyAdvice 支持 List<String> 字段预签名
- @OssPresignUrl 注解现在同时适用于 String 和 List<String> 字段
- 回填时防御不可变 List,自动降级为 ArrayList
- FileServiceImpl 预签名访问 URL 去除查询参数,保持持久化路径干净

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 14:59:34 +08:00
lzh
b02059a08a feat(iot): 信标检测支持 iBeacon 三元组匹配(uuid+major+minor)
BeaconPresenceConfig 新增 beaconUuid/major/minor 字段;
RssiSlidingWindowDetector.extractTargetRssi 优先 MAC 匹配,
降级为 iBeacon 三元组匹配,兼容两种设备上报格式。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 14:59:15 +08:00
lzh
41e9cb4d4e feat(ops): 巡检表结构新增检查项描述、照片字段并补齐 AUTO_INCREMENT
- ops_inspection_template 新增 item_description 字段(合格标准说明)
- ops_inspection_record 新增 photos 字段 varchar(4096),存储巡检照片 URL
- 三张巡检表 id 补 AUTO_INCREMENT
- 包含建表语句和增量 ALTER 语句

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-22 14:58:55 +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
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