fix(distribution): 修复收号站订单详情权限、专属支付通道路由、大盘统计与仲裁积分隔离

- 修复 FindOrder 在收号站模式(two_party_distributor_receive / three_party)下的 403 权限判定,放行参与方站点成员并精准计算收益
- 串联 distribution_site_payment_channels 至 payment.Start 核心支付发起流程,分销订单优先使用绑定的专属商户通道
- 修复数据大盘 GetDashboardAnalytics 趋势中 ReceivedCount 恒为 0 的问题,并对齐今日订单与 GMV 统计
- 修复 dispute/arbitration.go 仲裁完成时向分销租客发放成长积分的泄漏风险
- 提现管理新增 distribution_site_name/distribution_site_code 字段并在后台列表与详情弹窗中区分展示分销站
- GetPublicSiteInfo 增加 X-Distribution-Site-Code 请求头兜底支持
This commit is contained in:
yml2213
2026-09-11 10:31:14 +08:00
parent 6acdead0f0
commit 9ae763dee6
15 changed files with 427 additions and 84 deletions
@@ -16,11 +16,7 @@ import (
// Start 发起订单支付,并按请求支付方式选择对应默认渠道配置。
func (r *Repository) Start(ctx context.Context, userID uint64, orderID uint64, req StartPaymentRequest, clientIP string) (*PaymentDTO, error) {
req.PayWay = normalizePayWay(req.PayWay)
defaultConfig, err := r.defaultRuntimeConfig(ctx, req.PayWay)
if err != nil {
return nil, ErrPaymentUnavailable
}
payment, orderRow, err := r.preparePayment(ctx, userID, orderID, req, *defaultConfig)
payment, orderRow, err := r.preparePayment(ctx, userID, orderID, req)
if err != nil {
return nil, err
}
@@ -122,7 +118,7 @@ func (r *Repository) Start(ctx context.Context, userID uint64, orderID uint64, r
}
// preparePayment 创建或复用订单支付单,并写入本次命中的支付配置 ID。
func (r *Repository) preparePayment(ctx context.Context, userID uint64, orderID uint64, req StartPaymentRequest, runtimeConfig runtimePaymentConfig) (*model.PaymentOrder, *model.RentalOrder, error) {
func (r *Repository) preparePayment(ctx context.Context, userID uint64, orderID uint64, req StartPaymentRequest) (*model.PaymentOrder, *model.RentalOrder, error) {
var paymentID uint64
var orderRow model.RentalOrder
err := r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
@@ -139,13 +135,17 @@ func (r *Repository) preparePayment(ctx context.Context, userID uint64, orderID
if amountCent <= 0 {
return ErrPaymentCannotStart
}
runtimeConfig, err := r.resolveOrderRuntimeConfig(ctx, tx, row.DistributionSiteID, req.PayWay)
if err != nil {
return err
}
var existing model.PaymentOrder
err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).
err = tx.Clauses(clause.Locking{Strength: "UPDATE"}).
Where("order_id = ? AND biz_type = ?", row.ID, "order_pay").
Order("id DESC").
First(&existing).Error
if err == nil {
if canReuseOrderPayment(existing, runtimeConfig) {
if canReuseOrderPayment(existing, *runtimeConfig) {
existing.PayWay = firstNonEmpty(req.PayWay, existing.PayWay, runtimeConfig.PayWay, "ZFBZF")
existing.JSPayFlag = firstNonEmpty(req.JSPayFlag, existing.JSPayFlag, runtimeConfig.JSPayFlag, "2")
existing.AmountCent = amountCent
@@ -165,7 +165,7 @@ func (r *Repository) preparePayment(ctx context.Context, userID uint64, orderID
} else if err != gorm.ErrRecordNotFound {
return err
}
payment, err := newOrderPayment(row, amountCent, req, runtimeConfig)
payment, err := newOrderPayment(row, amountCent, req, *runtimeConfig)
if err != nil {
return err
}