ur96 issues创建

This commit is contained in:
2026-07-22 16:12:28 +09:00
parent cf5dcd28ea
commit 39cdbdcfef
6 changed files with 123 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
# 01 — 建立店铺业务员归属持久化基线
**What to build:** 店铺可以持久保存一个可空的平台业务员账号 ID并能通过普通索引支持后续精确筛选。上线迁移不回填存量店铺、不推断历史归属也不建立数据库外键或账号关联标签应用回滚时允许保留已经写入的归属事实。
**Blocked by:** None — can start immediately
**Status:** ready-for-agent
**架构通道:** Infrastructure。
**完整业务边界:** 本票只建立店铺业务员归属的数据承载和索引能力。明确不实现账号候选校验、创建继承、编辑权限、查询投影、通知发送或账号停用后的级联处理,也不迁移未触碰的店铺旧代码。
- [ ] 店铺数据结构支持可空业务员账号 ID数据库类型、模型类型和空值语义一致。
- [ ] 业务员账号 ID 建立非唯一普通索引,迁移不包含数据库外键、级联动作或存量数据回填。
- [ ] 账号停用、软删除或重新启用不会自动清空或改写店铺保存的业务员 ID。
- [ ] 迁移向上、向下及再次向上均可验证,应用回滚策略允许新增字段及既有归属数据继续保留。
- [ ] PostgreSQL 集成测试验证空值保存、正 ID 保存、索引定义和软删除账号不影响历史关联。
- [ ] 迁移、模型及相关常量和注释遵守项目数据库、Model 与中文注释规范。

View File

@@ -0,0 +1,19 @@
# 02 — 平台创建店铺时设置或继承业务员
**What to build:** 超级管理员和平台账号创建店铺时,可以显式选择当前可用的平台业务员、显式创建为空归属,或在字段缺失时一次性继承所选上级店铺当前保存的业务员 ID。店铺、初始主账号、默认角色、主钱包、分佣钱包、业务员归属及成功审计作为一个完整创建用例原子提交。
**Blocked by:** 01 — 建立店铺业务员归属持久化基线
**Status:** ready-for-agent
**架构通道:** 主通道为简单写 Application辅助通道为 Infrastructure。
**完整业务边界:** 本票迁移并收口平台操作者的店铺创建完整用例。明确不迁移店铺删除、启停及其他无关 CRUD不创建 Shop 聚合,不实现代理账号的请求字段拒绝规则。
- [ ] 创建命令真实区分业务员字段缺失、显式 `null`、零值和正整数Handler 不自行猜测三态语义。
- [ ] 超级管理员和平台账号显式传正 ID 时,只能绑定当前启用、未删除的普通平台账号;超级管理员、代理、企业、停用和软删除账号均不可人工新绑定。
- [ ] 显式 `null` 创建为空归属;字段缺失且有上级时复制上级当前保存的原始 ID字段缺失且无上级时创建为空归属。
- [ ] 上级保存的业务员即使当前停用或软删除,字段缺失时仍按历史 ID 原值继承,不把继承误作人工候选校验。
- [ ] 店铺、初始主账号、账号角色、店铺角色、两个钱包、业务员归属和关键成功审计在同一数据库事务内成功或回滚,任一步失败不留下半成品。
- [ ] 创建事件记录归属来源 `inherited/explicit/empty`、上级店铺 ID 和最终业务员 ID并符合统一审计写入契约。
- [ ] Application、PostgreSQL 与 HTTP 集成测试覆盖平台创建矩阵、字段四态、候选失效、事务回滚和统一中文错误。

View File

@@ -0,0 +1,19 @@
# 03 — 代理创建下级店铺时安全继承业务员
**What to build:** 代理账号创建其既有权限允许的下级店铺时,服务端从最终校验通过的直属上级店铺复制当时保存的业务员 ID代理请求只要出现业务员字段无论是相同 ID、其他 ID、零值或 `null`,均被安全拒绝。复制完成后父子店铺独立保存,后续互不级联。
**Blocked by:** 02 — 平台创建店铺时设置或继承业务员
**Status:** ready-for-agent
**架构通道:** 主通道为简单写 Application辅助通道为既有权限 Adapter。
**完整业务边界:** 本票收口代理操作者进入同一店铺创建用例时的权限与继承规则。明确不扩大代理原有可发展层级或数据范围,不允许代理人工选择业务员,不实现父子动态查询或批量级联。
- [ ] 代理创建前复用既有店铺层级和管理权限校验,所选上级必须处于调用者原本允许发展的范围。
- [ ] 请求 JSON 出现业务员字段即返回统一禁止访问错误,显式 `null`、零值、原值和其他正 ID 不得被静默忽略。
- [ ] 字段未出现时,上级有业务员则复制原始 ID上级为空则新店铺为空停用或软删除账号的历史 ID 仍可被复制。
- [ ] 复制是创建时快照:父店铺之后设置、清空或更换业务员,不改变既有子店铺或孙级店铺。
- [ ] 后续新建直属下级只读取其直属上级在本次创建时的当前保存值,不沿祖先动态追溯。
- [ ] 无权上级、企业操作者及资源不存在使用统一安全错误语义,不泄露资源是否存在。
- [ ] Application 与 HTTP 集成测试覆盖继承矩阵、恶意字段输入、无权上级、事务原子性及不级联回归。

View File

@@ -0,0 +1,22 @@
# 04 — 独立修改并审计店铺业务员归属
**What to build:** 超级管理员和平台账号编辑有权管理的店铺时,可以设置、清空或更换业务员;字段缺失则保持现状。代理可以继续更新其有权店铺的其他资料,但请求一旦出现业务员字段即被拒绝。每次实际归属变化只影响目标店铺,并留下可靠、脱敏的前后审计事实。
**Blocked by:**
- 01 — 建立店铺业务员归属持久化基线
- `.scratch/tech-global-audit/issues/01-audit-event-write-loop.md` — 01 — 交付不可变 Audit Event 写入闭环
**Status:** ready-for-agent
**架构通道:** 主通道为简单写 Application辅助通道为统一审计 Port/Adapter。
**完整业务边界:** 本票迁移并收口店铺资料更新这一完整用例中的业务员归属变更。明确不迁移店铺删除、启停或其他无关 CRUD不向父级、下级、孙级或同级传播变更不承担公共审计基础设施建设。
- [ ] 更新命令真实区分字段缺失、显式 `null`、零值和正整数;字段缺失保持原归属,`null` 清空,正 ID 校验后替换,零值按非法参数处理。
- [ ] 超级管理员和平台账号只有在通过目标店铺既有资源权限检查后才能修改归属;企业、越权平台和资源不存在使用统一安全错误语义。
- [ ] 代理更新其他资料且字段缺失时保留原归属,请求一旦出现该字段即返回统一禁止访问错误。
- [ ] 设置正 ID 时在写事务内重新校验其仍为启用、未删除的普通平台账号,候选在提交前失效时不得更新店铺。
- [ ] 实际值未变化时不生成业务员变更成功审计;设置、清空和更换记录稳定动作、前后 ID、账号名摘要和可用状态。
- [ ] 店铺变化与关键成功审计同事务提交,审计失败时业务修改回滚;拒绝和失败按公共审计策略记录且不泄露底层错误。
- [ ] 测试覆盖四类操作者、字段四态、并发候选失效、无变化更新、父子不级联、审计失败回滚和中文错误契约。

View File

@@ -0,0 +1,20 @@
# 05 — 查询店铺业务员归属与候选账号
**What to build:** 有权用户可以在店铺列表和详情中看到相同的业务员归属摘要,按保存的业务员 ID 与其他条件组合筛选;超级管理员和平台账号还可以通过最小披露的候选接口搜索当前可人工绑定的平台业务员。停用或删除账号仍展示历史摘要及不可用状态,但不再进入候选结果。
**Blocked by:** 01 — 建立店铺业务员归属持久化基线
**Status:** ready-for-agent
**架构通道:** Query。
**完整业务边界:** 本票收口店铺列表、店铺详情和业务员候选三个读取用例及其 API 契约。明确不通过聚合根读取,不执行写操作,不把候选查询结果当作写侧最终校验,不扩大任何账号的数据权限。
- [ ] 店铺列表支持按保存的业务员 ID 精确筛选,并与店铺名、编号、联系电话、上级、层级、状态等既有条件按 AND 组合,分页和排序契约保持不变。
- [ ] 列表和详情统一返回可空业务员 ID、账号名、固定前三后四手机号摘要及可用状态空归属返回空摘要停用或软删除账号尽可能返回历史摘要并标记不可用。
- [ ] 当前页业务员账号通过一次批量查询完成投影,包含必要的软删除只读数据,不发生逐店铺 N+1 查询。
- [ ] 若当前没有独立店铺详情接口,则提供受既有数据权限保护的详情接口,并确保候选、级联、资金概况等静态路由不会被动态 ID 路由吞掉。
- [ ] 候选接口只允许超级管理员和平台账号调用,仅返回启用、未删除的普通平台账号,并提供用户名或手机号受控搜索、默认 20 和最大 100 的分页。
- [ ] 代理和企业不能调用候选接口;候选仅返回 ID、账号名和手机号摘要不复用披露范围更大的账号列表响应。
- [ ] PostgreSQL 与 HTTP 集成测试覆盖索引筛选、AND 条件、分页总数、历史投影、手机号脱敏、无 N+1、权限和静态路由顺序。
- [ ] RouteSpec 和 OpenAPI 契约同步更新;若实现过程中新增 Handler 类型,则同步两个文档生成器,否则不得为此无谓新增 Handler。

View File

@@ -0,0 +1,25 @@
# 06 — 提供业务员通知接收人解析并完成发布验证
**What to build:** 后端业务可以按店铺当前保存的业务员 ID 稳定解析一个可用的平台业务员接收人,供公共站内通知 Worker 在套餐临期、钱包低余额等场景复用。解析只认当前店铺的独立归属,账号不可用时跳过,不沿店铺层级追溯;同时完成 UR#96 后端接口、文档、迁移与发布回滚的整体验收。
**Blocked by:**
- 02 — 平台创建店铺时设置或继承业务员
- 03 — 代理创建下级店铺时安全继承业务员
- 04 — 独立修改并审计店铺业务员归属
- 05 — 查询店铺业务员归属与候选账号
**Status:** ready-for-agent
**架构通道:** 主通道为 Application + Port/Adapter辅助通道为 Query/Infrastructure。
**完整业务边界:** 本票提供公共通知能力可调用的店铺业务员接收人解析接缝,并验证 UR#96 后端交付。明确不建设通知表、通知中心、铃铛或任何前端页面,不实现 UR#33 套餐临期和 UR#97 钱包低余额的触发规则,不发送外部渠道通知,也不建设自动转派。
- [ ] 接收人解析按目标店铺当前保存的业务员 ID 查询账号,仅在账号仍为启用、未删除的普通平台账号时返回稳定账号 ID。
- [ ] 店铺无归属、账号停用、软删除或类型已不符合时返回无可用业务员接收人,不清空店铺字段且不把永久无接收人当作无限重试错误。
- [ ] 解析不读取父店铺、祖先店铺或创建人,不因上级后续变更而改变目标店铺的接收人结果。
- [ ] 接缝可被公共站内通知 Worker 复用,并与其“店铺主账号加当前可用业务员、按账号 ID 去重”的接收人规则兼容;本票不复制公共通知基础设施。
- [ ] 集成测试覆盖可用、停用、软删除、重新启用、空归属、关系更换和父级变更不影响子店铺等场景。
- [ ] 后端验收覆盖平台显式设置和清空、代理继承、父级修改不级联、列表筛选、详情投影、候选权限、审计及创建事务原子性。
- [ ] 更新 UR#96 中文总结文档和 README 入口,记录 API 契约、架构通道、通知复用边界、上线核验及应用回滚保留字段和历史归属的策略。
- [ ] 发布前只读核验店铺层级异常和平台账号状态;发布后抽查显式设置、代理继承、不级联、历史不可用账号展示及接收人解析,不运行全量回填或级联脚本。