创建相关issues
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
# 01 — 资产详情展示可控前代换货信息
|
||||
|
||||
**What to build:** 在统一资产详情中增加稳定的 `exchange_trace` 对象,并打通当前资产作为换货新资产时的前代查询。关系以未软删除的已完成换货单为权威来源,展示旧资产的不可变标识快照和换货单号;关联资产仍在调用方现有数据权限内时返回真实 ID 并允许跳转,无权限时保留历史文本但隐藏 ID。主架构通道为 Query,数据库索引为辅助 Infrastructure;完整边界止于“当前资产 → 前代”的只读投影,不迁移换货状态机、换货写侧或资产详情的其他旧读取逻辑,也不新建关系表。
|
||||
|
||||
**Blocked by:** None — can start immediately
|
||||
|
||||
**Status:** ready-for-agent
|
||||
|
||||
- [ ] 卡和设备通过统一资产详情查询时始终返回 `exchange_trace` 对象;没有前代时 `previous_asset` 为 `null`,不省略整个对象。
|
||||
- [ ] 当前资产作为新资产出现在未软删除且状态为已完成的换货单中时,`previous_asset` 返回旧资产类型、换货单快照标识、换货单号、可空资产 ID 和可见性标记。
|
||||
- [ ] 前代标识直接使用换货单保存的不可变快照,不回查或改写关联资产的当前标识。
|
||||
- [ ] 关联前代资产通过现有卡或设备数据权限检查;有权限时返回真实 ID 和 `can_view=true`,无权限时返回 `asset_id=null` 和 `can_view=false`,且不返回店铺、客户、套餐、钱包、状态等额外信息。
|
||||
- [ ] 关系查询不应用关联资产的数据权限过滤,不会因关联资产不可见而抹掉换货关系;当前资产本身仍先经过现有权限校验,未授权请求维持原有防枚举响应。
|
||||
- [ ] 待填写、待发货、已发货待确认、已取消及软删除换货单均不会形成前代关系。
|
||||
- [ ] 查询存储故障返回统一脱敏内部错误,不会被降级为“无换货关系”,并记录包含查询方向和当前资产上下文的中文错误日志。
|
||||
- [ ] 增加已完成且未软删除范围内支持“新资产类型 + 新资产 ID”最新记录查询的非唯一部分 B-tree 索引,并验证向上迁移、向下迁移和代表性查询计划。
|
||||
- [ ] 同一资产存在多条“当前资产为新资产”的异常完成记录时,按 `completed_at` 降序、主键降序确定性选择最新一条,并记录包含当前资产、候选数量和最终换货单的中文异常日志。
|
||||
- [ ] Query 测试覆盖无关系、卡前代、设备前代、可见前代、不可见前代、非完成状态、软删除记录和异常重复完成记录。
|
||||
- [ ] HTTP 集成测试使用真实 PostgreSQL、Redis、JWT 和认证中间件,贯穿当前资产权限、资产解析、前代 Query 与统一响应格式,并证明当前资产无权限时不会因换货关系泄露其存在。
|
||||
- [ ] 更新资产详情 OpenAPI 的前代响应契约,明确 `exchange_trace` 始终存在、`previous_asset` 可为 `null`,以及 `can_view` 与可空 `asset_id` 的跳转规则。
|
||||
- [ ] 在 UR#86 中文总结中记录前代查询的架构通道、权限防泄露、异常选择规则、索引发布与回滚方式,并准备无换货、前代可见和前代不可见的人工验收步骤。
|
||||
@@ -0,0 +1,23 @@
|
||||
# 02 — 资产详情展示后代并形成双向换货链
|
||||
|
||||
**What to build:** 扩展统一资产详情换货投影,打通当前资产作为换货旧资产时的后代查询,使连续换货 A→B→C 中的中间资产 B 可以同时展示前代 A 和后代 C。后代同样使用换货单不可变快照,并按关联资产当前权限决定是否返回可跳转 ID。主架构通道为 Query,数据库索引为辅助 Infrastructure;完整边界止于单节点前代和后代的固定次数查询,不递归整条换货树、不新增换货链列表接口、不改变资产权限矩阵。
|
||||
|
||||
**Blocked by:** `.scratch/ur86-asset-exchange-trace/issues/01-asset-previous-exchange-trace.md` — 01 — 资产详情展示可控前代换货信息
|
||||
|
||||
**Status:** ready-for-agent
|
||||
|
||||
- [ ] 当前资产作为旧资产出现在未软删除且状态为已完成的换货单中时,`next_asset` 返回新资产类型、换货单快照标识、换货单号、可空资产 ID 和可见性标记;没有后代时为 `null`。
|
||||
- [ ] 卡和设备共用同一套 Query 投影逻辑,不为两种资产复制换货链查询流程。
|
||||
- [ ] 后代资产有权限时返回真实 ID 和 `can_view=true`;无权限时保留快照标识及换货单号、返回 `asset_id=null` 和 `can_view=false`,不泄露其他业务信息。
|
||||
- [ ] A→B→C 场景查询 B 时同时返回 A 和 C,`previous_asset` 与 `next_asset` 互不覆盖;查询 A 和 C 时分别只返回存在的方向。
|
||||
- [ ] 待填写、待发货、已发货待确认、已取消及软删除换货单均不会形成后代关系。
|
||||
- [ ] 增加已完成且未软删除范围内支持“旧资产类型 + 旧资产 ID”最新记录查询的非唯一部分 B-tree 索引,并验证向上迁移、向下迁移和代表性查询计划。
|
||||
- [ ] 前代和后代的关联资产可见性采用固定次数批量加载;查询次数不随设备绑定卡数量或其他列表数据增长,不产生 N+1。
|
||||
- [ ] 同一资产存在多条“当前资产为旧资产”的异常完成记录时,按 `completed_at` 降序、主键降序确定性选择最新一条,并记录包含当前资产、候选数量和最终换货单的中文异常日志。
|
||||
- [ ] Query 测试覆盖仅后代、A→B→C 中间资产、卡链、设备链、关联后代可见与不可见、非完成状态、软删除记录和异常重复完成记录。
|
||||
- [ ] HTTP 集成测试使用真实 PostgreSQL、Redis、JWT 和认证中间件,贯穿当前资产权限、资产解析、双向换货 Query 与统一响应格式,覆盖无换货、仅前代、仅后代、中间资产及关联资产不可见场景。
|
||||
- [ ] 使用代表性 PostgreSQL 数据验证两条部分索引的结构和查询计划,资产详情增加双向换货投影后仍满足项目数据库查询与 API 性能目标,且无 N+1。
|
||||
- [ ] 完成资产详情 OpenAPI 双向契约,明确 `previous_asset`、`next_asset` 的空值语义,以及仅在 `can_view=true` 且 `asset_id` 非空时允许跳转。
|
||||
- [ ] 完成 UR#86 中文总结并更新 README 索引,记录完整权限边界、异常选择规则、发布顺序和回滚方式;上线前抽样核验历史新旧资产 ID 与快照完整性,只记录异常、不回填数据。
|
||||
- [ ] 前端人工验收覆盖无换货、换货新资产、已换出旧资产和 A→B→C 中间资产;无权限关联项只显示快照标识和换货单号,不渲染链接或可点击样式。
|
||||
- [ ] 与 UR#45、UR#98 同窗发布时,仅将已实际完成的对应 Ticket 纳入发布前置检查;若形成跨 PRD 实施阻塞,必须先引用其已发布的具体 issue 文件路径和标题更新本票,不能使用模糊依赖描述。
|
||||
Reference in New Issue
Block a user