# 06 — 幂等创建批量订购任务

**What to build:** 通过现有后台认证的操作员可以提交唯一 `request_id`、单个套餐、统一支付方式、CSV Key 和凭证 Key 创建批量订购任务。接口在返回已接收任务前验证对象归属和真实元数据，并在同一事务保存套餐与操作者快照、上传绑定、请求指纹、任务事实、创建审计和可靠投递事件。

**Blocked by:**

- `.scratch/ur36-bulk-package-purchase/issues/02-controlled-upload-object-ownership.md` — 02 — 交付受控直传与对象归属证明
- `.scratch/tech-public-foundation/issues/02-transactional-public-outbox-write.md` — 02 — 在业务事务中可靠写入公共 Outbox
- `.scratch/tech-public-foundation/issues/03-outbox-at-least-once-delivery.md` — 03 — 完成 Outbox 到 Asynq 的至少一次投递闭环
- `.scratch/tech-public-foundation/issues/05-command-idempotency-contract.md` — 05 — 提供创建命令幂等与并发职责契约
- `.scratch/tech-public-foundation/issues/06-unified-async-task-contract.md` — 06 — 冻结统一异步任务五态和查询契约
- `.scratch/tech-global-audit/issues/01-audit-event-write-loop.md` — 01 — 交付不可变 Audit Event 写入闭环

**Status:** ready-for-agent

**架构通道:** 复杂写 Application + Port/Adapter。

**完整业务边界:** 本票收口批量订购任务的可靠接收、幂等、上传绑定和投递事实。明确不下载或解析 CSV、不创建逐行明细、不执行订单、不增加批量权限码或任务创建人隔离。

- [ ] 请求只接受 `request_id`、`package_id`、`payment_method`、`file_key` 和 `voucher_keys`；显式提交 `shop_id` 返回统一参数错误，其他未知字段不参与业务决策。
- [ ] `wallet` 要求凭证为空；`offline` 要求 1 至 5 个有效附件；套餐存在性和 ID、编码、名称快照在创建时确定。
- [ ] CSV 与凭证必须由当前账号按正确用途申请、真实存在且元数据合法；CSV 实际大小不超过 10MB，所有 Key 在任务事务内完成绑定。
- [ ] 相同 `request_id`、操作者和规范化请求指纹返回原任务；改变套餐、支付方式、文件、凭证或操作者时返回冲突。
- [ ] 并发首写最终只产生一个任务、一次上传绑定和一个可靠事件；Asynq 暂不可用不丢失已提交任务。
- [ ] 任务使用全局五态并返回中文状态名；队列载荷只包含结构化 `task_id`，不传 `[]byte`、文件内容、临时路径或认证上下文。
- [ ] 创建成功写公共审计，记录任务号、支付方式、文件安全摘要和凭证数量，不记录预签名 URL、Token 或环境密钥。
- [ ] 新 Handler 同步注册后台路由并更新两个 OpenAPI 文档生成入口，所有响应使用统一包装和中文错误码语义。

