fix: 富友订单支持退款,0 元退款不强制客户收款材料映射

- decideRefundMethods 将 fuiou 与 wechat、alipay 按线上支付处理,修复富友订单报"该订单的支付方式不支持退款"
- 客户收款信息退款仅在金额大于 0 时强制映射并提交客户收款信息与凭证;0 元退款允许客户收款信息为空

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
邹进
2026-10-23 17:00:00 +09:00
parent 1ffc923b94
commit 7ca79ebf28
3 changed files with 25 additions and 3 deletions

View File

@@ -6,6 +6,7 @@ import (
"encoding/hex"
stdErrors "errors"
"fmt"
"strconv"
"strings"
"time"
@@ -332,6 +333,7 @@ func RequiredSceneFields(businessType string) []RequiredSceneField {
}
// RequiredRefundFields 返回退款提交固定与条件必需字段;快照方式编码缺失或未知时由表单构建拒绝。
// 客户收款信息退款要求客户收款信息与凭证必须映射并提交;0 元退款不退钱,两者不强制。
func RequiredRefundFields(snapshot map[string]any) []RequiredSceneField {
methodCode, ok := snapshot[constants.ApprovalFieldRefundMethodCode].(string)
methodCode = strings.TrimSpace(methodCode)
@@ -339,12 +341,22 @@ func RequiredRefundFields(snapshot map[string]any) []RequiredSceneField {
return []RequiredSceneField{{Code: constants.ApprovalFieldRefundMethodCode, Name: "退款方式编码"}}
}
result := []RequiredSceneField{{Code: constants.ApprovalFieldRefundMethod, Name: "退款方式", RequiredMapping: true}}
if methodCode == constants.RefundMethodCustomerAccount {
if methodCode == constants.RefundMethodCustomerAccount && !isZeroAmountRefund(snapshot) {
result = append(result, RequiredSceneField{Code: constants.ApprovalFieldCustomerAccountInfo, Name: "客户收款信息"}, RequiredSceneField{Code: constants.ApprovalFieldCustomerVoucherKey, Name: "客户收款凭证"})
}
return result
}
// isZeroAmountRefund 判断快照中的申请退款金额是否为 0;金额缺失或无法解析时按非 0 处理,保持强制校验。
func isZeroAmountRefund(snapshot map[string]any) bool {
raw, ok := snapshot[constants.ApprovalFieldRequestedRefundAmount].(string)
if !ok {
return false
}
amount, err := strconv.ParseFloat(strings.TrimSpace(raw), 64)
return err == nil && amount == 0
}
// approvalBusinessTypes 返回全部已登记审批业务场景,供只读字段汇总复用。
func approvalBusinessTypes() []string {
return []string{