# 05 — 完成附件上传与企微异步提交闭环

**What to build:** 审批提交 Worker 可以从公共 Outbox 可靠领取审批实例，使用冻结的模板、业务快照和企微发起身份上传附件副本并调用企微发起审批；成功后绑定唯一 `sp_no`，明确失败可安全重试，已发送但响应未知时停止自动重发并等待人工恢复。

**Blocked by:**

- 04 — 提供审批创建前置检查与事务接入契约
- `.scratch/tech-public-foundation/issues/03-outbox-at-least-once-delivery.md` — 03 — 完成 Outbox 到 Asynq 的至少一次投递闭环
- `.scratch/tech-global-audit/issues/02-integration-log-attempt-loop.md` — 02 — 交付可恢复的 Integration Log 尝试闭环

**Status:** ready-for-agent

**架构通道:** 复杂写 Application + Domain，外部调用位于 Infrastructure WeCom Adapter。

**完整业务边界:** 本票收口技术提交尝试、提交租约、附件副本上传、企微表单构造和提交结果分类。明确不处理企微审批终态，不执行退款或充值资金动作，不把临时企微资料变成永久业务事实。

- [ ] Worker 通过审批状态和 `submit_lease_until` 条件领取、续租并在所有退出路径释放租约；并发 Worker 同一时刻只有租约所有者可以提交。
- [ ] 本地私有对象 Key 是申请附件权威引用；Worker 使用受控临时文件上传企微，临时 `media_id`、预签名 URL 和文件内容不进入永久业务快照、普通日志或响应。
- [ ] 企微表单严格使用实例冻结的模板映射、真实业务提交人和实际企微发起身份，审批人配置完全使用企微模板，不由系统计算或提交。
- [ ] 成功响应原子绑定唯一 `sp_no` 并进入审批中；企微明确未创建时进入提交失败，可在同一实例上技术重试且保留尝试历史。
- [ ] 可证明未发送的建连失败允许自动重试；请求已发送后超时或连接中断进入提交结果未知，持久化未知事实后禁止自动再次调用 `applyevent`。
- [ ] 测试覆盖 Outbox 重投、并发领取、租约过期恢复、部分附件失败、明确失败、未发送失败、响应未知、成功绑定和结构化 Asynq 载荷，且不依赖真实企微网络。
