90 lines
4.2 KiB
Markdown
90 lines
4.2 KiB
Markdown
## ADDED Requirements
|
|
|
|
### Requirement: Refund Creation Submits WeCom Approval Materials
|
|
|
|
The refund creation flow SHALL submit the refund business materials required for an external WeCom approval.
|
|
|
|
#### Scenario: Create refund with business materials
|
|
|
|
- **GIVEN** 用户打开退款创建表单
|
|
- **WHEN** 用户填写退款金额、退款原因、备注并完成附件上传
|
|
- **THEN** 系统 MUST submit the refund amount, reason, remark and attachment metadata to `POST /api/admin/refunds`
|
|
- **AND** 每个附件 MUST use the structure `{ file_key, file_name, file_size }`
|
|
|
|
#### Scenario: Submitted amount is immutable locally
|
|
|
|
- **GIVEN** 退款申请已创建并进入企微审批
|
|
- **WHEN** 用户查看退款记录
|
|
- **THEN** 页面 MUST NOT provide a local control to modify the submitted refund amount
|
|
- **AND** any changed amount MUST be submitted through the defined resubmission flow only
|
|
|
|
### Requirement: Refund Detail Displays WeCom Approval
|
|
|
|
The refund detail page SHALL display the backend-provided WeCom approval object as a read-only approval record.
|
|
|
|
#### Scenario: Display approval details
|
|
|
|
- **GIVEN** `GET /api/admin/refunds/{id}` returns an `approval` object
|
|
- **WHEN** 用户打开退款详情
|
|
- **THEN** 页面 MUST display the approval source, `sp_no`, status, status name, applicant, approvers, comments, attachments and timeline
|
|
- **AND** 页面 MUST preserve the backend approval values without locally changing or deriving them
|
|
|
|
#### Scenario: No local approval controls
|
|
|
|
- **GIVEN** 用户查看退款列表或退款详情
|
|
- **WHEN** 页面展示企微审批信息
|
|
- **THEN** 页面 MUST NOT display local approve, reject, return or manual refund confirmation buttons
|
|
- **AND** 页面 MUST NOT call local approval action endpoints for this flow
|
|
|
|
### Requirement: Refund Processing Result Is Independent From Approval
|
|
|
|
The refund detail page SHALL display business processing status separately from WeCom approval status.
|
|
|
|
#### Scenario: Display processing result
|
|
|
|
- **GIVEN** 退款详情返回 `processing_status` and its result fields
|
|
- **WHEN** 用户查看退款业务处理区域
|
|
- **THEN** 页面 MUST display the processing status, failure summary and business process result
|
|
- **AND** 页面 MUST display a system-retrying or contact-administrator message when indicated by the backend
|
|
|
|
#### Scenario: Display required lifecycle states
|
|
|
|
- **GIVEN** 后端返回审批中、通过处理中、处理成功、驳回、撤销或通过后撤销异常状态
|
|
- **WHEN** 页面渲染退款列表或详情
|
|
- **THEN** 页面 MUST show an explicit status for the returned state
|
|
- **AND** 页面 MUST NOT infer processing completion from approval status alone
|
|
|
|
### Requirement: Refund Resubmission Has Restricted Editable Fields
|
|
|
|
The refund resubmission flow SHALL allow resubmission only for rejected, revoked or deleted records and SHALL preserve immutable business snapshots.
|
|
|
|
#### Scenario: Resubmit an eligible refund
|
|
|
|
- **GIVEN** 退款状态为已驳回、已撤销或已删除
|
|
- **WHEN** 用户发起重新申请
|
|
- **THEN** 页面 MUST allow editing the refund amount, attachments and refund reason
|
|
- **AND** 系统 MUST submit the request to `POST /api/admin/refunds/{id}/resubmit`
|
|
|
|
#### Scenario: Reject resubmission for an ineligible refund
|
|
|
|
- **GIVEN** 退款记录不属于已驳回、已撤销或已删除状态
|
|
- **WHEN** 用户查看退款详情
|
|
- **THEN** 页面 MUST NOT enable the resubmission action
|
|
- **AND** 页面 MUST handle a backend rejection without creating a new approval request
|
|
|
|
#### Scenario: Preserve refund snapshots on resubmission
|
|
|
|
- **GIVEN** 用户填写重新申请表单
|
|
- **WHEN** 用户修改可编辑字段
|
|
- **THEN** 页面 MUST NOT provide controls to change the order snapshot, asset snapshot or submitter snapshot
|
|
|
|
### Requirement: Refund Pages Use Backend Approval And Processing Data
|
|
|
|
The refund list and detail pages SHALL use backend response data as the source of truth for approval and processing display.
|
|
|
|
#### Scenario: Refresh refund status
|
|
|
|
- **WHEN** 用户刷新退款列表或重新加载退款详情
|
|
- **THEN** 页面 MUST use the latest refund, approval and processing data returned by the backend
|
|
- **AND** 页面 MUST NOT reconstruct a status from stale local form data or legacy status mappings
|