## ADDED Requirements ### Requirement: 管理员绑定系统账号与企微成员 系统 SHALL 从已配置自建应用的可见通讯录分页查询成员,并允许管理员将系统账号绑定到 `(corp_id, userid)`;列表和详情 SHALL 返回 userid、姓名及绑定状态,手机号和邮箱不得作为绑定前置条件,不得提供用户扫码自助绑定流程。 #### Scenario: 从通讯录选择成员绑定账号 - **WHEN** 管理员在账号列表为系统账号选择一个应用可见的企微成员 - **THEN** 系统保存 corp_id、userid 和展示快照,后续审批可使用该 userid 作为申请人 #### Scenario: 绑定不可见成员 - **WHEN** 管理员提交不在当前企微应用可见范围内的 userid - **THEN** 系统返回参数或权限错误且不保存绑定 ### Requirement: 业务场景绑定企微后台模板 系统 SHALL 允许管理员配置业务类型、企微 `template_id` 和业务字段到控件 ID/类型/选项 key 的映射;模板必须已在企微后台创建,系统 MUST 通过模板详情接口校验映射,不得在本系统创建审批节点或审批人规则。 #### Scenario: 发布有效场景配置 - **WHEN** 管理员提交的模板存在且所有必填业务字段均能映射到有效控件 - **THEN** 系统启用该场景并保存模板结构校验结果 #### Scenario: 模板控件已经变化 - **WHEN** 模板详情与已配置的控件 ID、类型或选项 key 不一致 - **THEN** 系统阻止新审批提交并返回明确配置错误,不影响存量审批同步 ### Requirement: 使用绑定成员发起模板审批 退款和员工线下代充值 SHALL 通过现有 Approval Port 创建通用审批实例和提交 Outbox;企微 Adapter MUST 对已绑定的内部员工使用本人 userid,对代理等非企微账号使用应用已配置且当前可见的默认发起人 userid,并使用 template_id、`use_template_approver=1` 和映射后的控件值调用 `oa/applyevent`。成功后保存 `sp_no`,业务 Domain/Application 不得解析企微 DTO 或状态码;通用实例中的真实业务提交人不得被默认企微发起人覆盖。 #### Scenario: 成功发起审批 - **WHEN** 提交人已绑定企微成员、场景有效且业务申请校验通过 - **THEN** 系统原子保存业务单、通用审批实例和提交事件,并最终把企微 sp_no 关联到该实例 #### Scenario: 发起前置不完整 - **WHEN** 内部提交人未绑定且应用未配置可用默认发起人、代理提交时默认发起人不可见、模板无效或 Adapter 未配置 - **THEN** 系统在写入业务单、审批实例和 Outbox 前失败关闭 #### Scenario: 代理发起退款审批 - **WHEN** 代理账号提交退款且应用已配置当前可见的默认发起人 - **THEN** 企微审批以默认成员作为 creator_userid 发起,但本地业务申请和通用审批实例仍记录代理为真实提交人 #### Scenario: 提交结果未知 - **WHEN** 调用企微超时且无法判断审批是否创建成功 - **THEN** 系统标记结果未知并进入查询恢复,不得直接创建第二张审批单 ### Requirement: 回调和轮询共同同步审批结果 系统 MUST 验证并解密 `sys_approval_change` 回调、快速响应,再按 sp_no 获取审批详情并幂等翻译为标准决策;系统 MUST 周期性查询未终态审批并通过批量单号/详情接口补偿回调遗漏。 #### Scenario: 重复审批回调 - **WHEN** 同一审批状态变化被企微重复推送 - **THEN** 系统只产生一次对应标准终态和一次业务终态处理 #### Scenario: 回调丢失 - **WHEN** 企微审批已终态但系统未收到回调 - **THEN** 轮询任务通过审批详情发现终态并驱动相同的标准决策同步用例 ### Requirement: 审批人员只做可选读取映射 系统 SHALL 从已同步审批详情的流程节点取得审批人 userid,并批量映射系统账号;能映射时返回审批人 ID/名称,不能映射时返回空值,不得为展示字段实时逐条调用企微或建立本地审批人规则。 #### Scenario: 审批人已绑定系统账号 - **WHEN** 列表关联的企微审批详情包含已绑定 userid - **THEN** 列表返回对应系统账号 ID 和名称