fix: some
This commit is contained in:
25
openspec/changes/update-refund-management/proposal.md
Normal file
25
openspec/changes/update-refund-management/proposal.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Change: 退款管理契约适配(字段与状态枚举)
|
||||
|
||||
## Why
|
||||
|
||||
后端按 `docs/产品迭代8月份/refund-api-simple-2.md` 调整退款管理契约:本次未新增任何路由,前端无需新增 URL,但创建/重提/审批的请求体、列表与详情的响应字段、状态枚举(1-6)、可重提规则、审批尝试历史(`attempts[]`)、退款方式与渠道退款/失败分类展示,以及支付商户/旧支付配置新增退款用 PEM 凭证字段均发生变化。后台前端现有 `Refund` 类型、创建/重提表单、列表/详情展示与审批入口尚未对齐,需按新文档适配。
|
||||
|
||||
## What Changes
|
||||
|
||||
- 状态与枚举:`RefundStatus` 扩展 5(原路退款处理中)与 6(原路退款失败);新增 `RefundMethod`(`original_route`/`customer_account`/`asset_wallet`/`agent_wallet`)、`channel_refund_status`(0-3)与 `failure_reason` 枚举及名称映射。
|
||||
- 响应字段:列表/详情 `Refund` 补充 `method`、`method_name`、`frozen_actual_received_amount`、`customer_account_info`、`channel_refund_status(_name)`、`channel_refund_no`、`channel_refund_request_no`、`channel_refund_amount`、`channel_refunded_at`、`failure_reason(_name)`、`failure_message`、`anomaly_flag`、`anomaly_reason`、`latest_attempt_id`、`latest_approval_instance_id`、`attempts[]`、`refund_package_used_mb`、`refund_package_total_mb`;`attempts[]` 按文档定义 14 个子字段。
|
||||
- 创建退款:请求体新增 `method`(必填)与可选 `customer_account_info`;`customer_account`(客户收款信息)方式下 MUST 同时给 `customer_account_info` 与至少 1 个凭证;`actual_received_amount` 废弃、不再提交。
|
||||
- 重提退款:可重提状态扩为 3(已拒绝)/4(已退回)/6(原路退款失败),`anomaly_flag=1` 的申请禁止重提;请求体新增可选 `method`、`customer_account_info`(不传沿用原值);每次重提新建审批尝试与审批实例。
|
||||
- 审批操作:补封装 `approve`/`reject`/`return` 接口;已关联企微审批实例(`approval_instance_id`)的申请审批按钮隐藏/禁用,仅存量无实例可用。
|
||||
- 页面:列表页新增状态 5/6 展示与退款方式、冻结实收金额、渠道退款状态/流水号/金额、失败分类、异常标记、套餐已用量/总量等列;详情页展示新字段与 `attempts[]` 尝试历史;创建/重提弹窗支持退款方式与客户收款信息。
|
||||
- 支付商户:`wechat_v2` 凭证模板 optional 新增 `wx_client_cert_content`、`wx_client_key_content`(PEM 文本),不填不影响支付/查单/回调,仅原路退款按凭证不完整禁用并提示。
|
||||
- 旧支付配置:`wechat-configs` 创建/更新/查询响应新增 `wx_client_cert_content`、`wx_client_key_content`(可选),支付配置表单补齐两个可选 PEM 输入。
|
||||
- 退款导出:无新接口,`scene=refund` 导出列由后端模板扩展(本轮 2 列 + 上一轮 7 列),前端导出任务列表维持复用,不新增列定义。
|
||||
- `customer_account_info` 子字段结构以 `docs/admin-openapi.yaml` 为准;本提案先以宽松键值结构(`Record<string, string>`)承载与展示,表单按退款方式联动必填。
|
||||
- 不实现后端接口、数据库、渠道退款;不改动审批实例数据。
|
||||
|
||||
## Impact
|
||||
|
||||
- Affected specs: `refund-api`、`refund-pages`、`payment-merchant-credentials`、`wechat-configs`
|
||||
- Affected code: `src/types/api/refund.ts`、`src/api/modules/refund.ts`、`src/views/finance/refund/index.vue`、`src/views/finance/refund/detail.vue`、`src/components/business/CreateRefundDialog.vue`、`src/types/api/paymentMerchantPools.ts`、`src/views/settings/payment-merchant-pools/components/MerchantManagement.vue`、`src/types/api/paymentSettings.ts`、`src/views/settings/payment-settings/index.vue`、`src/views/settings/payment-settings/detail.vue`
|
||||
- Dependencies: `docs/产品迭代8月份/refund-api-simple-2.md`
|
||||
@@ -0,0 +1,14 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 微信直连 V2 退款凭证字段
|
||||
`wechat_v2` 商户凭证模板 MUST 在 optional 中新增 `wx_client_cert_content`、`wx_client_key_content`(PEM 文本),仅在 `provider_type=wechat_v2` 时展示;填写后用于原路退款,不填不影响支付/查单/回调。
|
||||
|
||||
#### Scenario: 商户表单展示 PEM 文本域
|
||||
- **GIVEN** 服务商类型为 `wechat_v2`
|
||||
- **WHEN** 打开新建/编辑商户表单
|
||||
- **THEN** 表单 MUST 提供「客户端证书内容」「客户端私钥内容」两个可选文本域
|
||||
|
||||
#### Scenario: 凭证不完整提示
|
||||
- **GIVEN** `wechat_v2` 商户仅填写证书内容而未填写私钥内容
|
||||
- **WHEN** 保存商户
|
||||
- **THEN** 允许保存,但前端 MUST 提示该商户因凭证不完整不可用于原路退款
|
||||
@@ -0,0 +1,59 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 退款状态与退款方式等枚举
|
||||
前端 MUST 定义并导出 `RefundStatus`(1 待审批、2 已通过、3 已拒绝、4 已退回、5 原路退款处理中、6 原路退款失败)、`RefundMethod`(`original_route`/`customer_account`/`asset_wallet`/`agent_wallet`)、`channel_refund_status`(0 未发起或不适用、1 处理中、2 已成功、3 已失败)与 `failure_reason`(`channel_rejected`/`credential_invalid`/`insufficient_balance`/`timeout_unknown`/`approval_rejected`/`revoked_after_approved`/`payment_fact_invalid`)枚举,并提供状态名/Tag 映射与可重提规则。
|
||||
|
||||
#### Scenario: 状态 5/6 正常展示
|
||||
- **GIVEN** 退款申请状态为 5 或 6
|
||||
- **WHEN** 列表/详情渲染状态
|
||||
- **THEN** 前端 MUST 展示「原路退款处理中」或「原路退款失败」,不得回退为默认样式
|
||||
|
||||
#### Scenario: 原路退款失败可重提规则
|
||||
- **GIVEN** 退款申请状态为 6(原路退款失败)
|
||||
- **WHEN** `anomaly_flag` 为 1
|
||||
- **THEN** 前端 MUST 禁止重提并隐藏/禁用重提入口
|
||||
|
||||
### Requirement: 退款响应新增字段
|
||||
`Refund` 列表项与详情 MUST 支持 `method`、`method_name`、`frozen_actual_received_amount`、`customer_account_info`、`channel_refund_status`、`channel_refund_status_name`、`channel_refund_no`、`channel_refund_request_no`、`channel_refund_amount`、`channel_refunded_at`、`failure_reason`、`failure_reason_name`、`failure_message`、`anomaly_flag`、`anomaly_reason`、`latest_attempt_id`、`latest_approval_instance_id`、`refund_package_used_mb`、`refund_package_total_mb`(单位 MB,解析不到套餐为 0)与 `attempts[]`。
|
||||
|
||||
#### Scenario: 列表展示渠道退款与失败分类
|
||||
- **GIVEN** 列表接口返回新增字段
|
||||
- **WHEN** 渲染列
|
||||
- **THEN** 前端 MUST 展示退款方式、冻结实收金额、渠道退款状态、渠道退款流水号、渠道退款金额、失败分类与异常标记
|
||||
|
||||
### Requirement: 审批尝试历史
|
||||
详情响应 MUST 支持 `attempts[]`,子字段为 `id`、`attempt_no`、`method`、`method_name`、`refund_amount`、`frozen_actual_received_amount`、`refund_reason`、`customer_account_info`、`customer_voucher_key`、`channel_refund_request_no`、`submitted_by_account_id`、`approval_instance_id`、`approval_status`、`approval_status_name`、`created_at`;详情页 MUST 按时间倒序展示尝试记录。
|
||||
|
||||
#### Scenario: 展示多次尝试记录
|
||||
- **GIVEN** 详情返回多条 attempts 记录
|
||||
- **WHEN** 渲染尝试历史
|
||||
- **THEN** 前端 MUST 展示每条尝试的编号、退款方式、金额、审批状态与时间
|
||||
|
||||
### Requirement: 创建退款请求契约
|
||||
`POST /api/admin/refunds` 请求体 MUST 携带 `method`(必填)、`order_id`、`requested_refund_amount`、`package_usage_id`、`refund_reason`,可选 `customer_account_info` 与 `refund_voucher_key`;MUST NOT 再提交 `actual_received_amount`(已废弃)。
|
||||
|
||||
#### Scenario: 客户收款信息方式校验
|
||||
- **GIVEN** 退款方式选择 `customer_account`
|
||||
- **WHEN** `customer_account_info` 为空或凭证数量为 0
|
||||
- **THEN** 前端 MUST 阻止提交并提示同时填写客户收款信息与至少 1 个凭证
|
||||
|
||||
#### Scenario: 非客户收款方式
|
||||
- **GIVEN** 退款方式为 `original_route`/`asset_wallet`/`agent_wallet`
|
||||
- **WHEN** 提交创建申请
|
||||
- **THEN** 客户收款信息与凭证 MUST 允许为空
|
||||
|
||||
### Requirement: 重提退款请求契约与可重提规则
|
||||
`POST /api/admin/refunds/{id}/resubmit` 请求体 MUST 支持可选 `method`、`customer_account_info`(不传沿用原值)、`requested_refund_amount`、`refund_reason`、`refund_voucher_key`;可重提状态 MUST 为 3(已拒绝)/4(已退回)/6(原路退款失败),`anomaly_flag=1` 的申请必须禁止重提。
|
||||
|
||||
#### Scenario: 已拒绝申请允许重提
|
||||
- **GIVEN** 退款申请状态为 3(已拒绝)且 `anomaly_flag` 不为 1
|
||||
- **WHEN** 用户点击重新提交
|
||||
- **THEN** 前端 MUST 允许重提并支持可选携带 `method` / `customer_account_info`
|
||||
|
||||
### Requirement: 审批接口封装与按钮保护
|
||||
`RefundService` MUST 提供 `approveRefund`(`approved_refund_amount`、`remark`)、`rejectRefund`(`reject_reason`)、`returnRefund`(`remark`);列表/详情审批按钮 MUST 在 `approval_instance_id` 存在时隐藏/禁用,仅存量无审批实例的申请可用。
|
||||
|
||||
#### Scenario: 已关联企微审批实例不可审批
|
||||
- **GIVEN** 退款申请已关联 `approval_instance_id`
|
||||
- **WHEN** 渲染审批操作
|
||||
- **THEN** 通过/拒绝/退回按钮 MUST 隐藏或禁用
|
||||
@@ -0,0 +1,33 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 退款列表页字段与操作适配
|
||||
列表页 MUST 展示状态 5/6(Tag),并支持新增列:退款方式、冻结实收金额(元)、渠道退款状态、渠道退款流水号、渠道退款金额(元)、失败分类、异常标记、当前退款套餐已用量(MB)、当前退款套餐总量(MB);操作列的「重新申请」MUST 按枚举可重提规则(3/4/6,6 且 `anomaly_flag=1` 禁止)控制,审批类操作 MUST 按 `approval_instance_id` 与权限控制。
|
||||
|
||||
#### Scenario: 异常标记展示
|
||||
- **GIVEN** 列表项 `anomaly_flag` 为 1
|
||||
- **WHEN** 渲染异常标记列
|
||||
- **THEN** 前端 MUST 明确标注异常并展示 `anomaly_reason`
|
||||
|
||||
### Requirement: 退款详情页尝试历史与字段展示
|
||||
详情页 MUST 展示新增响应字段(退款方式、冻结实收金额、渠道退款状态/流水号/申请号/金额/时间、失败分类/原因/消息、异常标记与原因、套餐已用量/总量),并展示 `attempts[]` 尝试历史(尝试编号、退款方式、金额、审批状态、提交时间、凭证)。
|
||||
|
||||
#### Scenario: 详情展示新字段与尝试历史
|
||||
- **GIVEN** 详情接口返回渠道退款与失败分类字段及 attempts 记录
|
||||
- **WHEN** 渲染详情页
|
||||
- **THEN** 前端 MUST 展示退款方式、渠道退款状态、失败分类与尝试历史
|
||||
|
||||
### Requirement: 创建退款弹窗
|
||||
创建弹窗 MUST 新增「退款方式」选择(`original_route` 原路退回 / `customer_account` 客户收款信息 / `asset_wallet` 资产钱包 / `agent_wallet` 代理钱包);选择 `customer_account` 时 MUST 展开客户收款信息表单并要求同时提供至少 1 个退款凭证;其余方式隐藏客户收款信息表单且凭证改为选填;MUST 移除实收金额输入与提交字段。
|
||||
|
||||
#### Scenario: 切换退款方式联动
|
||||
- **GIVEN** 创建弹窗打开且退款方式切换为 `customer_account`
|
||||
- **WHEN** 客户收款信息为空
|
||||
- **THEN** 前端 MUST 在提交时阻止并提示补充信息
|
||||
|
||||
### Requirement: 重提弹窗
|
||||
重提弹窗 MUST 支持可选重新选择退款方式与客户收款信息(不传沿用原值),其余字段沿用现有重提逻辑;成功重提后 MUST 刷新列表并提示重新审批。
|
||||
|
||||
#### Scenario: 未重新选择时沿用原值
|
||||
- **GIVEN** 重提弹窗打开且未重新选择退款方式与客户收款信息
|
||||
- **WHEN** 提交重提
|
||||
- **THEN** 请求体 MUST 不携带 `method` / `customer_account_info`,由后端沿用原值
|
||||
@@ -0,0 +1,14 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 旧支付配置退款凭证字段
|
||||
支付配置(`/api/admin/wechat-configs`)创建/更新请求 MUST 支持可选 `wx_client_cert_content`、`wx_client_key_content`(PEM 文本);列表/详情/active 响应类型 MUST 补充同名字段。
|
||||
|
||||
#### Scenario: 支付配置表单新增 PEM 输入
|
||||
- **GIVEN** 打开支付配置新建/编辑表单
|
||||
- **WHEN** 渲染表单
|
||||
- **THEN** 表单 MUST 提供「客户端证书内容」「客户端私钥内容」两个可选文本域,且不填可正常保存
|
||||
|
||||
#### Scenario: 配置详情展示 PEM 字段
|
||||
- **GIVEN** 打开支付配置详情
|
||||
- **WHEN** 详情响应包含两个 PEM 字段
|
||||
- **THEN** 前端 MUST 按既有凭证展示约定透出字段内容(不回显或仅展示存在性,按现状约定)
|
||||
24
openspec/changes/update-refund-management/tasks.md
Normal file
24
openspec/changes/update-refund-management/tasks.md
Normal file
@@ -0,0 +1,24 @@
|
||||
## 1. 类型与 API 层(refund-api)
|
||||
- [x] 1.1 `RefundStatus` 增加 5/6;新增 `RefundMethod`、`channel_refund_status`、`failure_reason` 枚举与名称映射
|
||||
- [x] 1.2 `Refund` 响应补充全部新增字段(method、冻结实收、渠道退款、失败分类、异常标记、套餐用量等)
|
||||
- [x] 1.3 新增 `RefundAttemptItem`(attempts[] 14 个子字段)
|
||||
- [x] 1.4 `CreateRefundRequest` 契约更新:`method` 必填、`customer_account_info` 可选、移除 `actual_received_amount`
|
||||
- [x] 1.5 `ResubmitRefundRequest` 契约更新:可选 `method`/`customer_account_info`、移除 `actual_received_amount`
|
||||
- [x] 1.6 `RefundService` 新增 `approveRefund`/`rejectRefund`/`returnRefund`
|
||||
## 2. 退款页面(refund-pages)
|
||||
- [x] 2.1 列表页状态 5/6 Tag 展示与新列(退款方式、冻结实收金额、渠道退款状态、渠道退款流水号、渠道退款金额、失败分类、异常标记、套餐已用量/总量)
|
||||
- [x] 2.2 `canResubmit` 改为枚举判断(3/4/6,6 且 `anomaly_flag=1` 禁止)
|
||||
- [x] 2.3 列表/详情审批按钮(通过/拒绝/退回)按 `approval_instance_id` 与权限控制
|
||||
- [x] 2.4 详情页新增字段展示与 `attempts[]` 尝试历史时间线
|
||||
- [x] 2.5 创建弹窗:退款方式选择 + 客户收款信息(customer_account 方式联动必填 + 至少 1 凭证)
|
||||
- [x] 2.6 重提弹窗:可选 `method`/`customer_account_info` 重新选择(不选沿用原值)
|
||||
## 3. 支付商户(payment-merchant-credentials)
|
||||
- [x] 3.1 `wechat_v2` 凭证模板 optional 新增 `wx_client_cert_content`、`wx_client_key_content`
|
||||
- [x] 3.2 商户表单支持两个可选 PEM 文本域
|
||||
## 4. 旧支付配置(wechat-configs)
|
||||
- [x] 4.1 `paymentSettings` 类型新增 `wx_client_cert_content`、`wx_client_key_content`
|
||||
- [x] 4.2 支付配置表单新增两个可选 PEM 输入
|
||||
## 5. 验证
|
||||
- [x] 5.1 运行 `npm run build`(含 `vue-tsc --noEmit`)
|
||||
- [x] 5.2 运行 `npm run check:encoding`
|
||||
- [x] 5.3 运行 `openspec.cmd validate update-refund-management --strict`
|
||||
Reference in New Issue
Block a user