# 04 — 提供审批创建前置检查与事务接入契约

**What to build:** 退款和线下充值创建用例可以通过稳定公共接缝确认场景、当前模板和实际企微发起身份可用，并在自己的业务事务中原子创建唯一审批实例及提交 Outbox；任一前置失败时不会留下业务单、审批实例或待补提事件。

**Blocked by:**

- 02 — 完成平台账号本人扫码绑定闭环
- 03 — 发布审批场景与首个模板版本
- `.scratch/tech-public-foundation/issues/02-transactional-public-outbox-write.md` — 02 — 在业务事务中可靠写入公共 Outbox

**Status:** ready-for-agent

**架构通道:** 主通道为复杂写 Application + Domain，辅助通道为 Application Port/Adapter。

**完整业务边界:** 本票收口审批创建前置判定、真实业务提交人和企微发起身份快照、唯一审批实例以及事务内提交事件。明确不创建退款单或充值单，不定义其金额和活跃业务规则，不调用远程企微。

- [ ] 前置检查按稳定场景读取当前启用模板，并拒绝暂停中、已暂停、模板缺失或模板失效；失败发生在调用方写入任何业务事实前。
- [ ] 平台和超级管理员使用本人启用且成员可用的绑定；代理仅可在允许代理发起的退款场景使用部署配置固定成员，线下充值不允许代理发起。
- [ ] 审批实例冻结业务类型、业务 ID/编号、场景、模板版本与映射、业务快照、真实提交人账号/名称/角色/店铺快照、企微发起身份及 `self_binding/agent_proxy` 来源。
- [ ] `(biz_type,biz_id)` 唯一，非空 `sp_no` 全局唯一；状态初始为 `0=提交中`，不使用审批轮次，不建立数据库外键或 GORM 关联标签。
- [ ] 调用方可使用同一 GORM 事务创建业务事实、审批实例和结构化 `WeComApprovalSubmissionRequested` Outbox；任一步失败整体回滚，事务中不调用 Redis、Asynq、对象存储或企微。
- [ ] 公共状态常量、中文状态名及公开 DTO 描述保持唯一来源；集成测试以代表性测试业务事实验证前置失败零落库、事务回滚、并发唯一性和成功只产生一组审批事实。
