ur49issues修正
This commit is contained in:
@@ -2,13 +2,21 @@
|
||||
|
||||
**What to build:** 为设备 CSV 批量分配提供可复用的任务基础设施:运营人员能够取得仅允许 CSV 的受控上传地址;系统可持久化并追踪异步任务,严格校验、解析和去重单列表格,安全记录行级失败,并仅以任务 ID 向异步队列投递任务。
|
||||
|
||||
**Blocked by:** None — can start immediately.
|
||||
**Blocked by:**
|
||||
|
||||
- [.scratch/ur36-bulk-package-purchase/issues/02-controlled-upload-object-ownership.md](../../ur36-bulk-package-purchase/issues/02-controlled-upload-object-ownership.md) — 02 — 交付受控直传与对象归属证明
|
||||
- [.scratch/tech-public-foundation/issues/06-unified-async-task-contract.md](../../tech-public-foundation/issues/06-unified-async-task-contract.md) — 06 — 冻结统一异步任务五态和查询契约
|
||||
- [.scratch/tech-global-audit/issues/01-audit-event-write-loop.md](../../tech-global-audit/issues/01-audit-event-write-loop.md) — 01 — 交付不可变 Audit Event 写入闭环
|
||||
|
||||
**Status:** ready-for-agent
|
||||
|
||||
**架构通道:** 主通道为 Infrastructure + Application。此任务建立任务生命周期、对象存储用途和 CSV 解析边界;不迁移既有同步设备分配、套餐系列绑定及设备导入用例。
|
||||
**架构通道:** Infrastructure(辅助:简单写 Application)。
|
||||
|
||||
- [ ] 受控上传用途只生成 `.csv` 对象键,并拒绝错误扩展名、用途、类型或不存在的对象。
|
||||
- [ ] 独立任务可记录五态生命周期、汇总、脱敏失败明细和中文错误摘要;入队失败不会遗留永久处理中任务。
|
||||
- [ ] CSV 支持 UTF-8(含 BOM)、LF/CRLF 和固定单列表头,并在任何写入前拒绝文件级错误;行级错误、重复行和计数关系可准确保留。
|
||||
- [ ] 异步载荷只包含结构化 `task_id`,不包含文件字节、临时路径或敏感上下文;解析与批量查询契约支持每批最多 200 条标识。
|
||||
**完整业务边界:** 本票收口受控上传用途、设备批量任务持久化与五态生命周期、CSV 文件级/行级校验边界、去重、失败明细、最小队列载荷及任务创建/终态审计。简单任务记录使用 Application 事务脚本,不为任务表创建空洞聚合。
|
||||
|
||||
**明确不迁移:** 不迁移既有 Excel 设备导入、同步设备分配、同步套餐系列绑定及其他未触碰异步任务。
|
||||
|
||||
- [ ] `device_batch_allocation` 受控用途只生成 `.csv` 对象键,默认 `text/csv`,并拒绝错误扩展名、用途、对象归属、实际类型或不存在的对象。
|
||||
- [ ] 独立任务保存命令、目标、操作者快照、五态、汇总、脱敏失败明细和中文错误摘要;创建任务或入队失败不会留下永久处理中任务,并写统一 Audit Event。
|
||||
- [ ] CSV 支持 UTF-8(含 BOM)、LF/CRLF 和固定单列表头;在任何业务写入前拒绝文件级错误,逐行保留空值、非法标识、未找到及重复行失败,且保持 `total_count = success_count + fail_count`。
|
||||
- [ ] 异步载荷仅为结构化 `task_id`,不含文件字节、临时路径或敏感上下文;下载后的解析和后续批量查询契约支持每批最多 200 条标识。
|
||||
|
||||
@@ -6,9 +6,13 @@
|
||||
|
||||
**Status:** ready-for-agent
|
||||
|
||||
**架构通道:** 主通道为复杂写(Application + 既有资产业务规则门面),辅助通道为 Query。完整边界覆盖任务提交、后台执行、设备/绑定卡/分配记录同事务变更与任务详情读取;不迁移既有页面勾选、ID 列表、号段、筛选和设备回收入口。
|
||||
**架构通道:** 主通道为复杂写,辅助通道为 Query。
|
||||
|
||||
**完整业务边界:** 本票收口任务提交、后台执行、设备归属/绑定卡归属与状态/资产分配记录的同事务变更、条件更新和重试幂等,以及任务详情安全读取。复杂写必须遵循 `Handler → Application UseCase → Domain → Repository/Infrastructure`;不变量、并发和审计不得一半留在旧 Service、一半迁入 Domain。
|
||||
|
||||
**明确不迁移:** 不迁移既有页面勾选、ID 列表、号段、筛选分配、设备回收和横向转移入口;既有同步分配只能作为内部业务规则门面,不能复制宽松逻辑。
|
||||
|
||||
- [ ] `batch-assign-shop` 只接受 `file_key` 与正目标代理 ID,提交时校验操作者、对象和目标权限,并返回前端轮询所需的任务标识、命令和状态。
|
||||
- [ ] 平台仅能分配平台库存,代理仅能分配自己名下设备给直属下级;同目标为幂等成功,横向转移、跨级、无权和未命中均安全拒绝。
|
||||
- [ ] 每个写批次以条件更新在同一事务内完成设备归属、绑定卡同步、状态变化和资产分配记录;重试或并发不会重复记录或覆盖其他操作。
|
||||
- [ ] 任务详情可展示目标摘要、状态名称、进度、总数、成功数、幂等数、失败数、逐行中文失败原因及起止时间,且权限与不存在使用相同安全语义。
|
||||
- [ ] 每个写批次经 Application 编排 Domain 与 Repository/Infrastructure,以条件更新在同一事务内完成设备归属、绑定卡同步、状态变化、资产分配记录和实际变更审计;重试或并发不会重复记录或覆盖其他操作。
|
||||
- [ ] 任务详情由 Query 负责权限、批量加载和 DTO 投影,只读展示目标摘要、状态名称、进度、总数、成功数、幂等数、失败数、逐行中文失败原因及起止时间;权限不足与不存在使用相同安全语义。
|
||||
|
||||
@@ -6,9 +6,13 @@
|
||||
|
||||
**Status:** ready-for-agent
|
||||
|
||||
**架构通道:** 主通道为复杂写(Application + 既有资产业务规则门面),辅助通道为 Query。完整边界覆盖任务提交、后台执行、系列变更审计和任务详情读取;不迁移既有同步系列绑定入口,且不修改设备归属、设备状态或绑定卡归属。
|
||||
**架构通道:** 主通道为复杂写,辅助通道为 Query。
|
||||
|
||||
**完整业务边界:** 本票收口任务提交、执行时实时权限重验、唯一设备匹配、套餐系列条件更新、幂等/并发处理、实际变更审计和任务详情安全读取。复杂写必须遵循 `Handler → Application UseCase → Domain → Repository/Infrastructure`;授权、设备范围、并发与审计规则完整收口,不拆散到旧 Service。
|
||||
|
||||
**明确不迁移:** 不迁移既有同步系列绑定入口;不得修改设备归属、设备状态或绑定卡归属,也不实现清除套餐系列。
|
||||
|
||||
- [ ] `batch-assign-series` 只接受 `file_key` 与正套餐系列 ID,提交时校验操作者、目标系列及授权,并返回前端轮询所需的任务创建结果。
|
||||
- [ ] 平台沿用既有系列范围;代理仅能操作自己名下设备和当前有效授权系列,Worker 执行时重新确认账号状态、店铺关系及授权。
|
||||
- [ ] 同目标系列按幂等成功处理;不同系列按既有规则条件更新,历史重复 IMEI 或跨字段多命中不会任取设备,并发变更不会被覆盖。
|
||||
- [ ] 任务终态、部分成功及全行业务失败均以统一的详情契约准确表达,且审计不泄露其他店铺或底层错误信息。
|
||||
- [ ] 同目标系列按幂等成功处理;不同系列经 Application、Domain 和 Repository/Infrastructure 按既有规则条件更新,历史重复 IMEI 或跨字段多命中不会任取设备,并发变更不会被覆盖。
|
||||
- [ ] 任务详情由 Query 只读负责权限、批量加载和 DTO 投影;终态、部分成功及全行业务失败均以统一契约准确表达,且审计与失败明细不泄露其他店铺或底层错误信息。
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
# 04 — 固化前端接口交互契约并完成发布验收
|
||||
# 04 — 固化前端接口交互契约与展示数据验收
|
||||
|
||||
**What to build:** 交付可由前端页面直接消费的 CSV 批量分配接口交互契约:上传、两个独立命令提交、任务轮询和结果展示所需字段、状态与错误语义完整一致;通过真实环境异步链路验证平台和代理场景,确保发布与回滚安全。此任务不开发前端页面。
|
||||
**What to build:** 交付可由设备管理页直接消费的 CSV 批量分配接口交互契约:受控上传、两个独立命令提交、任务轮询和结果展示需要的字段、状态与安全错误语义保持完整一致;通过接口文档和真实链路联调,确保前端无需依赖隐含规则即可呈现部分成功和逐行失败。
|
||||
|
||||
**Blocked by:** 02 — 完成 CSV 批量分配代理接口闭环;03 — 完成 CSV 批量分配套餐系列接口闭环。
|
||||
|
||||
**Status:** ready-for-agent
|
||||
|
||||
**架构通道:** 主通道为接口契约与发布验证,辅助通道为 Query。完整边界是前端可完成上传、提交、轮询和结果展示的交互闭环;明确不包含设备管理页、弹框、模板静态资源或其他前端页面实现。
|
||||
**架构通道:** Infrastructure(接口契约与前端消费验证)。
|
||||
|
||||
- [ ] 两个命令保持独立请求字段和语义,上传后仅提交 `file_key`,不使用 multipart,也不提供可同时修改代理与系列的通用操作。
|
||||
- [ ] 响应完整提供前端展示任务号、命令、目标摘要、状态及中文名称、进度、总数、成功/幂等/失败数、失败明细和时间;终态可据此停止轮询。
|
||||
- [ ] 接口文档和集成测试覆盖 CSV 上传、平台与代理权限、部分成功、文件级失败、入队失败和安全错误语义,保证前端无需依赖隐含规则。
|
||||
- [ ] 在真实 PostgreSQL、Redis、Asynq 和对象存储可用的环境中验证端到端链路;确认 Worker 未部署不开放入口,回滚不删除既有任务、分配记录或审计事实。
|
||||
**完整业务边界:** 本票收口前端调用接口时需要遵守的上传、独立命令、轮询、终态停止和结果展示数据契约,以及相应接口文档和集成验收。Query 投影只读提供页面展示数据,不承担状态写入。
|
||||
|
||||
**明确不迁移:** 不开发或改造任何前端页面、弹框、静态模板或目标选择器;不迁移原有页面勾选、ID 列表、号段或筛选入口;不新增后端模板下载接口、失败结果文件下载接口或可同时修改代理和系列的通用操作。
|
||||
|
||||
- [ ] 两个命令保持独立请求字段和语义:上传后仅提交 `file_key`,分配代理只提交正 `shop_id`,分配系列只提交正 `series_id`;不使用 multipart,也不提供可同时修改代理与系列的通用操作。
|
||||
- [ ] 接口文档明确 CSV 的受控上传用途、`.csv`/10MB 限制、UTF-8 单列表头、长设备号按字符串处理、文件级与行级错误差异,以及前端提交时的防重与重试语义;本票不实现模板或预览页面。
|
||||
- [ ] 任务创建与详情响应完整提供任务号、命令、目标摘要、状态及中文名称、进度、总数、成功/幂等/失败数、失败明细和时间;终态可据此停止轮询,部分成功不会被接口语义误标为整体失败。
|
||||
- [ ] HTTP 集成测试和接口联调覆盖 CSV 上传、平台与代理权限、部分成功、文件级失败、入队失败和安全错误语义,保证页面展示不依赖数据库查询或隐含规则。
|
||||
|
||||
Reference in New Issue
Block a user