# feat(wx-security): Phase 2A UGC 接入 + 公开列表过滤 + MQ Consumer

**PR**: [#1661](https://git.1814.love:8443/wx/HL/pulls/1661) **Issue**: [#1660](https://git.1814.love:8443/wx/HL/issues/1660) **合并**: 2026-05-05

让 Phase 1 (#1659) 基础设施真正落地业务，覆盖契约 §3-§5。

## UGC API body 字段新增 `mediaTraceIds: string[]`

前端调 `POST /mp/security/media-check` 拿到 traceId 后，在以下 5 个业务 API body 中传 traceId 数组：

| API | 业务表 | 字段 |
|---|---|---|
| POST /mp/review/create | order_review | media_trace_ids |
| POST /mp/complaint/create | order_complaint | media_trace_ids |
| POST /mp/order/{}/refund | refund_application | media_trace_ids |
| POST /mp/order/.../appeal /direct-appeal | refund_application | media_trace_ids |
| POST /mp/common/feedback | user_feedback (V20260505_003 增量 SQL) | media_trace_ids |

## 公开列表强制 audit_status='APPROVED' 过滤

8 个 Mapper 公开方法叠加 wx 机审过滤：
- selectTargetApprovedPage / selectAllReviewsPage / selectFeaturedReviews / selectTargetsApprovedPage / selectSearchPage
- selectTopRatedByProduct / selectTopLikedByProduct / selectGoodWithImageByProduct / selectCustomizerReviewsPage

`/mp/review/my` 私有列表**不**过滤；`MpReviewVO` 加 `auditStatus` 字段供前端展示状态条文案：
- PENDING → "审核中,通过后展示"
- APPROVED → 无提示
- MANUAL_REVIEW → "审核中,预计 24h 内"
- REJECTED → "内容未通过审核"

## MQ Consumer 双服务订阅 wx-content-audit-result

异步审核结果广播到 order-v2 + user-service，各自按 trace_id 反查更新业务表 audit_status：

**order-v2** 反查 review/complaint/refund 三表：
- 通过 `WxSecurityFeignClient` 跨 schema 调 user-service `GET /internal/security/trace-status`（≤50 batch）拿其他 trace 状态
- `WxAuditStatusResolver` 聚合：任一 REJECTED→REJECTED / 任一 MANUAL→MANUAL / 全 APPROVED→APPROVED / 否则维持 PENDING
- REJECTED 联动：review status=REJECTED + 业务隐藏；complaint status=WITHDRAWN + 软删 deletedAt；refund 仅更新 audit_status

**user-service** 反查 user_feedback + user.avatar_trace_id：
- avatar REJECTED 时重置为 `wechat.miniapp.default-avatar-url` 配置项

## 跨服务接口 (前端不用关心,内部调用)

- `WxSecurityFeignClient` (hl-common-feign) + Fallback (返空 List 不阻塞业务)
- `GET /internal/security/trace-status?traceIds=t1,t2,...` user-service 暴露
- `POST /internal/mp/feedback` mp-service 透传 feedback 到 user-service 落库

## 跨服务统一常量

`WxAuditStatusConstants` (hl-common-core) `PENDING/APPROVED/MANUAL_REVIEW/REJECTED`，替换 17+ 散落字面量。

## 前端契约要点 (mmg)

- 评价/投诉/退款/申诉/反馈 5 个业务 API body 加 `mediaTraceIds: string[]` 字段（前端先调 `/mp/security/media-check` 拿 traceId 数组）
- 评价响应 VO 加 `auditStatus` 字段（私有列表展示用）
- 公开列表（产品评价、首页精选、定制师评价、旅行相册）已自动过滤未审核内容

## Phase 2 剩余范围（独立工单跟进）

- Phase 2B：评价举报子系统（POST /mp/review/report + 阈值 3/10）
- Phase 2C：出行人三层兜底（异步审 + 选用挡 REJECTED + 本地正则）
- Phase 2D：hl-admin 后台（复审队列 + 命中日志 + 白名单 + 举报队列 + 头像违规处置）
- Phase 2E：AES 加密回调模式（Phase 1 仅明文）

## 待办（无新增，与 Phase 1 共用）

- 微信公众平台开通「内容安全」接口权限
- 配置回调 URL + Token（明文模式）
- nacos `wechat.miniapp.webhook.token` + `wechat.miniapp.default-avatar-url`（新加，REJECTED 头像重置目标 URL，未配置则只更新 audit_status 不动 avatar）

## 测试

- mvn compile 全工程 BUILD SUCCESS
- mvn test 145/145 全绿（user-service 44 + order-v2 101）
- CR 通过：2 P0 + 3 P1 全修（详见 PR body）
- 留 cleanup PR：P1-4 / P1-5 / 6 P2
