## 范围与原则 * 仅完善用户端(管理端与其 API 保持不变)。 * 目标:用户可在 App 端对其奖品资产执行:邀请他人填写地址、兑换积分;若用户已有默认地址,可在 App 端提交发货申请(生成待发货记录),后续由管理端流程发货。 ## 用户端功能 * 我的资产列表与详情 * 展示每条资产的当前状态:`持有`、`共享待地址`、`待发货`、`已发货`、`已兑换`。 * 操作区: * `邀请他人填写地址`:生成分享链接/二维码,显示有效期与复制按钮;允许撤销与重新生成。 * `兑换为积分`:弹窗确认兑换规则与积分值,成功后资产变为“已兑换”。 * `申请发货`(可选):当用户已有默认地址时展示;提交后资产进入“待发货”。 * 分享落地页(公域 H5/Web) * 通过一次性 `share_token` 打开表单,填写地址后提交;成功页提示“已提交,等待发货”。 * 链接过期/撤销/已消费时展示对应状态页。 ## 后端(仅用户端与公域接口) * 创建共享地址请求(App 端) * `POST /api/app/inventory/{inventory_id}/address-share/create` * 返回:`share_url`、`expires_at`、`qrcode`(可选)与当前资产状态。 * `POST /api/app/inventory/{inventory_id}/address-share/revoke` * 撤销未使用的请求,状态改为 `revoked`。 * 申请发货(App 端,可选) * `POST /api/app/inventory/{inventory_id}/request-shipping` * 条件:用户存在默认地址;未兑换/未发货。 * 行为:创建 `ShippingRecords` 为“待发货”,后续由管理端更新物流信息。 * 兑换积分(App 端) * `POST /api/app/inventory/{inventory_id}/redeem-to-points` * 规则:依据奖品配置(如 `exchange_points_amount`);写 `user_points_ledger` 动作 `REDEEM_REWARD`,更新 `user_points`;资产标记为“已兑换”。 ## 数据与安全 * 共享请求模型:`shipping_shared_address_requests`(一次性 `share_token`、有效期、状态、审计字段、地址快照或 `user_address_id`)。 * 状态机:`OWNED`→`AWAITING_ADDRESS_SHARED`→`SHIPPING_PENDING`→`SHIPPED`;或 `OWNED`→`REDEEMED`。 * 幂等与并发:事务校验资产状态;链接一次性消耗;重复操作返回已处理错误码。 * 审计:记录创建人、撤销、提交人(可匿名)、IP/UA;所有动作可追踪。 ## 前端实现(App) * App 页面 * `资产详情页`:按钮与状态展示、结果提示、列表刷新;分享弹窗含链接、二维码、有效期、撤销。 * `积分兑换弹窗`:展示规则与额度,确认后调用兑换 API。 * `申请发货`:若存在默认地址,直接申请;否则引导“邀请他人填写地址”或“去设置默认地址”。 ## 测试与验收 * 单元测试:共享请求生命周期(创建/撤销/过期/提交)、资产状态流转、兑换与申请发货幂等并发。 * 集成测试:App 端创建链接→公域表单提交→资产进入待发货;重复提交与过期处理;兑换后禁止申请发货。 * 验收:用户端操作闭环生效;状态与流水正确;无重复副作用;管理端无需改动即可继续履约。 ## 文档与 Swagger * 更新 App 与公域接口说明、错误码、状态枚举与审计字段;保留管理端文档不变。 * 执行时按 6A 规范生成 ALIGNMENT/CONSENSUS/DESIGN/TASK/ACCEPTANCE/FINAL 文档并持续维护。 ## 上线与回滚 * 先灰度用户端;监控链接使用量、失败率与发货效率。 * 如需回滚,关闭公域入口并撤销未消费请求;资产状态回退并保留审计。