## ADDED Requirements ### Requirement: 审批提交失败通知业务模块 审批实例因企微明确拒绝提交或审批表单无法构造(如缺必填控件映射)而变为“提交失败”(7)时,系统 SHALL 在同一事务内经既有终态决策通道发出决策 `submission_failed`:MUST 同时写入标准决策 Outbox 事件与决策投递记录(与其他终态决策相同,缺投递记录时业务消费者不会处理);事件标识 MUST 沿用既有格式 `approval:{审批实例标识}:submission_failed`,重复写入不产生第二个事件。决策事件结构不新增字段,失败原因由业务模块从该实例的企微审批上下文读取并脱敏后保存。决策消费入口 MUST 接受 `submission_failed`;渠道回调与轮询的审批状态推进 MUST NOT 因此接受该决策值。提交结果未知(8)MUST NOT 发出该决策,仍由既有恢复机制确认。所有已注册的审批业务类型(核销、退款、扫码注册代理、线下充值、佣金提现、提现资料资格)MUST 显式处理该决策,MUST NOT 将其按驳回处理;各业务处理前 MUST 确认审批实例仍为提交失败,否则幂等结束。 #### Scenario: 企微明确拒绝提交 - **WHEN** 某业务单的审批实例提交企微被明确拒绝 - **THEN** 审批实例变为提交失败,同一事务写入一条 `submission_failed` 决策事件,对应业务模块随后将业务单置为“审批提交失败” #### Scenario: 审批表单构造失败 - **WHEN** 某审批实例因缺少必填控件映射无法构造表单 - **THEN** 系统按提交失败处理并发出 `submission_failed` 决策 #### Scenario: 提交结果未知不发决策 - **WHEN** 审批实例提交结果未知 - **THEN** 系统不发出 `submission_failed` 决策,业务单保持审批中 #### Scenario: 业务模块确实收到决策 - **WHEN** 审批实例变为提交失败并写入决策事件 - **THEN** 该事件存在对应的决策投递记录,业务消费者能认领并处理,业务单状态发生变化,而不是被当作已处理直接结束 #### Scenario: 渠道回调不能推进到提交失败 - **WHEN** 企微回调或轮询带来的决策值为 `submission_failed` - **THEN** 审批状态推进按不受支持的决策拒绝,审批实例状态不变 #### Scenario: 决策重复投递 - **WHEN** 同一 `submission_failed` 决策被重复投递 - **THEN** 业务单状态、释放的占用与审计均只生效一次