## ADDED Requirements ### Requirement: 收款方式管理 超级管理员 MUST 能够维护线下收款方式,包括名称、编码、排序、状态与备注;普通员工只能看到启用的收款方式。收款方式列表接口 MUST 返回 `{ items, page, size, total }`,并 MUST 支持 `enabled` 与 `keyword` 筛选。已被核销申请引用的收款方式 MUST NOT 被删除;引用后修改稳定编码 MUST 被后端拒绝,前端 MUST 展示错误提示。 #### Scenario: 超级管理员新增收款方式 - **GIVEN** 超级管理员已登录并拥有收款方式新增权限 - **WHEN** 其填写名称、唯一编码、排序、状态与备注并提交 - **THEN** 系统 MUST 调用新增接口并在成功后刷新列表 - **AND** 新增成功后 MUST 清空并关闭弹窗 #### Scenario: 删除被引用的收款方式 - **GIVEN** 某收款方式已被业务引用 - **WHEN** 超级管理员尝试删除该方式 - **THEN** 前端 MUST 阻止删除或展示后端返回的业务错误 - **AND** MUST 提示改为停用 #### Scenario: 修改收款方式编码 - **GIVEN** 超级管理员打开编辑弹窗 - **WHEN** 其修改稳定编码并提交 - **THEN** 前端 MUST 提交最新编码 - **AND** 若该方式已被核销申请引用,后端拒绝时前端 MUST 展示错误提示 ### Requirement: 员工代收款账单统计 账单页面 MUST 展示应收金额、已核销金额、未核销金额与待处理账单数量四项统计,数据 MUST 来自 `GET /api/admin/employee-collection-bills/statistics`,字段为 `receivable_total`、`received_total`、`unsettled_total`、`pending_bill_count`;前端 MUST NOT 通过遍历当前分页数据自行计算。 #### Scenario: 加载账单统计 - **GIVEN** 用户进入员工代收款账单页面 - **WHEN** 页面初始化或筛选条件变化 - **THEN** 前端 MUST 调用账单统计接口 - **AND** MUST 将后端返回的「分」按元格式化后展示应收、已核销与未核销金额 ### Requirement: 员工代收款账单列表与详情 账单列表响应 MUST 为 `{ items, total, page, size }`,前端 MUST 兼容 `items` / `list` / `records` 等列表字段。列表 MUST 支持按来源(`source_type`)、来源单号(`source_no`)、账单状态、客户/店铺(`customer_id`)与创建时间(`created_from` / `created_to`,`YYYY-MM-DD`)筛选,并展示账单编号、来源、关联单号、负责员工、客户/店铺、应收金额、已核销金额、未核销金额与状态。账单状态 MUST 为数字枚举:`0` 待核销、`1` 部分核销、`2` 已核销、`3` 已关闭,展示 MUST 优先使用后端 `status_name`。账单详情响应 MUST 为 `{ bill, refunds, allocations, applications }`:`refunds` MUST 展示退款金额、冲减应收、冲销前应收与处理结果,`applications` MUST 可展开查看该申请的审批尝试记录。 #### Scenario: 普通员工查看账单 - **GIVEN** 普通员工已登录 - **WHEN** 其打开账单列表 - **THEN** 列表 MUST 只展示后端返回的本人账单数据 - **AND** MUST NOT 展示仅超管可见的操作入口 #### Scenario: 打开账单详情 - **GIVEN** 用户拥有账单详情权限 - **WHEN** 其点击账单号或详情操作 - **THEN** 前端 MUST 跳转账单详情页并加载对应账单(详情数据取自 `data.bill`) - **AND** 详情 MUST 展示退款冲销、核销分摊与关联核销申请 ### Requirement: 关闭账单 超级管理员 MUST 能够关闭账单,且关闭原因必填(最多 500 字符)。仅待核销或部分核销账单可关闭;存在审批中的核销申请(`approval_pending` 为真)时,账单 MUST NOT 被关闭。 #### Scenario: 存在审批中申请时关闭账单 - **GIVEN** 账单存在审批中的核销申请 - **WHEN** 用户查看该账单操作 - **THEN** 关闭入口 MUST 被禁用或不可见 - **AND** MUST 展示不可关闭的原因提示 #### Scenario: 关闭原因必填 - **GIVEN** 账单可关闭 - **WHEN** 超级管理员打开关闭弹窗并留空原因提交 - **THEN** 前端 MUST 阻止提交并提示填写原因 ### Requirement: 创建核销申请 员工 MUST 能够使用一笔线下收款核销 1~N 张账单。创建申请 MUST 提交收款方式 `payment_method_id`、付款金额 `paid_amount`(分,大于 0)、付款方名称 `payer_name`、付款时间 `paid_at`(带时区 RFC3339)、外部交易流水号 `external_transaction_no`、付款凭证 `payment_voucher_keys`(1~5 个对象 Key)与账单分摊 `allocations`。超级管理员代办时 MUST 填写 `acting_reason`,本人办理 MUST NOT 提交该字段。提交成功后系统 MUST 自动发起企业微信审批。 #### Scenario: 一笔收款核销多张账单 - **GIVEN** 用户选择了多张可核销账单 - **WHEN** 其录入各账单核销金额、选择收款方式并填写付款事实后提交 - **THEN** 前端 MUST 校验各账单核销金额大于 0 且不超过账单未核销余额 - **AND** MUST 以 `allocations: [{ bill_id, amount }]` 提交账单分摊明细 #### Scenario: 付款金额小于核销合计 - **GIVEN** 用户已录入各账单核销金额 - **WHEN** 其填写的付款金额小于核销合计即提交 - **THEN** 前端 MUST 阻止提交并提示付款金额不能小于核销合计 #### Scenario: 缺少付款凭证 - **GIVEN** 用户已选择账单与收款方式 - **WHEN** 其未上传任何付款凭证即提交 - **THEN** 前端 MUST 阻止提交并提示上传付款凭证 #### Scenario: 缺少付款事实 - **GIVEN** 用户已选择账单与收款方式 - **WHEN** 其未填写付款方名称、付款时间或外部交易流水号即提交 - **THEN** 前端 MUST 阻止提交并提示补齐必填项 #### Scenario: 超管代办未填写原因 - **GIVEN** 超级管理员以代办身份创建申请 - **WHEN** 其未填写 `acting_reason` 即提交 - **THEN** 前端 MUST 阻止提交并提示填写代办原因 #### Scenario: 企微审批场景未配置 - **GIVEN** 企业微信审批场景尚未配置 - **WHEN** 用户提交核销申请 - **THEN** 前端 MUST 展示后端返回的 503 提示「企微审批场景未配置,请联系管理员」 - **AND** MUST 保留用户已填写的内容且不产生申请数据 ### Requirement: 核销申请列表与详情 核销申请列表响应 MUST 为 `{ items, page, size, total }`,MUST 支持按状态、收款方式与创建时间筛选;列表项 MUST 包含 `payment_method_name`、`paid_amount`、`status`、`status_name` 与 `created_at`,状态 MUST 优先展示后端 `status_name`。申请详情响应 MUST 为 `{ application, allocations, attempts }`;`attempts` MUST 按提交顺序展示全部审批尝试记录,包含付款金额、付款方、流水号、付款凭证与审批意见。 #### Scenario: 查看审批历史 - **GIVEN** 申请存在多次审批尝试记录 - **WHEN** 用户打开申请详情 - **THEN** 详情 MUST 按提交顺序展示每次尝试的提交材料与审批状态 - **AND** 历史材料 MUST NOT 因重新提交而被覆盖 ### Requirement: 核销申请重新提交 仅已驳回(`status` 为 `2`)的申请 MUST 允许修改并重新提交;重新提交 MUST 生成新的企业微信审批实例,且历史审批记录 MUST NOT 被覆盖。重新提交入口 MUST 位于核销申请列表的操作列,详情页 MUST 只读且 MUST NOT 展示业务操作按钮(仅保留返回导航)。 #### Scenario: 重新提交被驳回申请 - **GIVEN** 申请状态为已驳回 - **WHEN** 用户在核销申请列表点击「修改并重新提交」并修改账单分摊、收款方式、付款事实或付款凭证后提交 - **THEN** 前端 MUST 调用修改接口重新提交 - **AND** 成功后 MUST 刷新详情并展示新的审批实例状态 #### Scenario: 非驳回申请不可修改 - **GIVEN** 申请处于审批中或已通过 - **WHEN** 用户查看核销申请列表 - **THEN** 修改并重新提交入口 MUST 不可见或不可用 #### Scenario: 详情页只读 - **GIVEN** 用户打开账单详情或核销申请详情 - **WHEN** 页面渲染完成 - **THEN** 页面 MUST NOT 展示创建核销申请、关闭账单或修改并重新提交等业务操作按钮 - **AND** MUST 只保留返回导航 ### Requirement: 企业微信审批场景配置 企业微信审批场景 MUST 支持 `employee_collection_approval` 业务类型,复用既有的应用列表、模板控件同步、业务字段查询与字段映射保存接口。 #### Scenario: 配置员工代收款审批场景 - **GIVEN** 超级管理员打开企微审批场景页面 - **WHEN** 其选择业务类型「员工代收款审批」 - **THEN** 前端 MUST 使用 `employee_collection_approval` 调用模板同步、字段查询与保存接口 ### Requirement: 附件预签名展示 附件接口 MUST 只返回对象存储 Key(`payment_voucher_keys`);前端 MUST 通过系统既有的预签名下载接口获取实际访问地址后再展示。 #### Scenario: 查看付款凭证 - **GIVEN** 申请包含付款凭证 Key - **WHEN** 用户点击查看付款凭证 - **THEN** 前端 MUST 先批量换取预签名地址 - **AND** 图片 MUST 支持预览,非图片 MUST 支持查看或下载 ### Requirement: 订单付款凭证规则调整 由平台账号(`user_type` 为 1 或 2)操作、实际收款金额大于 0 且非赠送的线下订单会生成员工代收款账单;该场景 `payment_voucher_key` MUST 变为非必填,付款凭证改在核销申请中提交,订单字段结构 MUST 保持不变。其余线下订单 MUST 继续要求付款凭证。 #### Scenario: 线下订单生成代收款账单 - **GIVEN** 当前登录账号为平台账号,所选套餐非赠送且实际收款金额大于 0,支付方式为线下支付 - **WHEN** 用户创建该订单 - **THEN** 前端 MUST 不再强制要求上传付款凭证 - **AND** MUST 提示付款凭证将在核销申请中提交 #### Scenario: 赠送套餐或非平台账号的线下订单 - **GIVEN** 所选套餐为赠送套餐,或当前账号非平台账号,或实际收款金额为 0 - **WHEN** 用户以线下支付方式创建订单 - **THEN** 前端 MUST 继续要求上传付款凭证