fix(distribution): 修复分销结账退款分成计算逻辑与利润统计,优化分销订单表格列宽与展示体验

This commit is contained in:
yml2213
2026-09-09 19:34:04 +08:00
parent 19b18324a2
commit b16c45ce6f
12 changed files with 403 additions and 88 deletions
@@ -424,7 +424,7 @@ func (r *Repository) ListOrders(ctx context.Context, query DistributionOrderList
Joins("LEFT JOIN users u ON u.id = ro.renter_id")
if query.SiteID > 0 {
base = base.Where("ro.distribution_site_id = ?", query.SiteID)
base = base.Where("(ro.distribution_site_id = ? OR EXISTS (SELECT 1 FROM distribution_order_parties p WHERE p.order_id = ro.id AND (p.site_id = ? OR p.party_id = ?)))", query.SiteID, query.SiteID, query.SiteID)
}
if query.Status != "" {
base = base.Where("ro.status = ?", query.Status)
@@ -435,7 +435,13 @@ func (r *Repository) ListOrders(ctx context.Context, query DistributionOrderList
}
switch strings.TrimSpace(query.Kind) {
case "sold":
base = base.Where("EXISTS (SELECT 1 FROM distribution_order_parties p WHERE p.order_id = ro.id AND p.party_role IN ('distributor_sell','distributor_b'))")
if query.Role == "sell" {
base = base.Where("EXISTS (SELECT 1 FROM distribution_order_parties p WHERE p.order_id = ro.id AND p.party_role IN ('distributor_sell','distributor_b'))")
} else if query.Role == "receive" {
base = base.Where("EXISTS (SELECT 1 FROM distribution_order_parties p WHERE p.order_id = ro.id AND p.party_role IN ('distributor_receive','distributor_a'))")
} else {
base = base.Where("EXISTS (SELECT 1 FROM distribution_order_parties p WHERE p.order_id = ro.id AND p.party_role IN ('distributor_sell','distributor_b','distributor_receive','distributor_a'))")
}
case "receive":
base = base.Where("EXISTS (SELECT 1 FROM distribution_order_parties p WHERE p.order_id = ro.id AND p.party_role IN ('distributor_receive','distributor_a'))")
case "", "all":
@@ -486,7 +492,7 @@ func (r *Repository) ListOrders(ctx context.Context, query DistributionOrderList
var parties []model.DistributionOrderParty
pq := r.db.WithContext(ctx).Where("order_id IN ?", orderIDs)
if query.SiteID > 0 {
pq = pq.Where("site_id = ?", query.SiteID)
pq = pq.Where("(site_id = ? OR party_id = ?)", query.SiteID, query.SiteID)
}
if err := pq.Find(&parties).Error; err == nil {
partiesByOrder := make(map[uint64][]model.DistributionOrderParty)
@@ -500,6 +506,9 @@ func (r *Repository) ListOrders(ctx context.Context, query DistributionOrderList
var splitCent int64
var roles []string
for _, p := range plist {
if p.PartyType != PartyTypeSite {
continue
}
totalEarning += p.IncomeAmountCent
if p.PartyRole == "distributor_sell" || p.PartyRole == "distributor_b" {
roles = append(roles, "sell")
@@ -566,12 +575,15 @@ func (r *Repository) FindOrder(ctx context.Context, adminID, id uint64) (*Distri
return nil, err
}
var parties []model.DistributionOrderParty
if err := r.db.WithContext(ctx).Where("order_id = ? AND site_id = ?", item.OrderID, item.SiteID).Find(&parties).Error; err == nil {
if err := r.db.WithContext(ctx).Where("order_id = ? AND (site_id = ? OR party_id = ?)", item.OrderID, item.SiteID, item.SiteID).Find(&parties).Error; err == nil {
var totalEarning int64
var markupCent int64
var splitCent int64
var roles []string
for _, p := range parties {
if p.PartyType != PartyTypeSite {
continue
}
totalEarning += p.IncomeAmountCent
if p.PartyRole == "distributor_sell" || p.PartyRole == "distributor_b" {
roles = append(roles, "sell")
@@ -2079,12 +2091,12 @@ func (r *Repository) GetDashboardAnalytics(ctx context.Context, adminID, siteID
var todayProfit int64
_ = r.db.WithContext(ctx).Model(&model.DistributionOrderParty{}).
Where("site_id = ? AND created_at >= ?", siteID, todayStr+" 00:00:00").
Where("(site_id = ? OR party_id = ?) AND party_type = 'site' AND created_at >= ?", siteID, siteID, todayStr+" 00:00:00").
Select("COALESCE(SUM(profit_amount_cent), 0)").Scan(&todayProfit).Error
var monthProfit int64
_ = r.db.WithContext(ctx).Model(&model.DistributionOrderParty{}).
Where("site_id = ? AND created_at >= ?", siteID, monthStr+"-01 00:00:00").
Where("(site_id = ? OR party_id = ?) AND party_type = 'site' AND created_at >= ?", siteID, siteID, monthStr+"-01 00:00:00").
Select("COALESCE(SUM(profit_amount_cent), 0)").Scan(&monthProfit).Error
var wallet model.WalletAccount
@@ -2101,41 +2113,49 @@ func (r *Repository) GetDashboardAnalytics(ctx context.Context, adminID, siteID
var tRows []trendRow
startDate := time.Now().AddDate(0, 0, -6).Format("2006-01-02")
dateFormatExpr := "DATE_FORMAT(ro.created_at, '%Y-%m-%d')"
dateFormatPartyExpr := "DATE_FORMAT(created_at, '%Y-%m-%d')"
if r.db != nil && r.db.Dialector != nil && r.db.Dialector.Name() == "sqlite" {
dateFormatExpr = "strftime('%Y-%m-%d', ro.created_at)"
dateFormatPartyExpr = "strftime('%Y-%m-%d', created_at)"
}
selectTrendSQL := fmt.Sprintf("%s AS date_str, COUNT(ro.id) AS orders, COALESCE(SUM(f.gross_paid_amount_cent), 0) AS gmv", dateFormatExpr)
_ = r.db.WithContext(ctx).Table("rental_orders ro").
Joins("JOIN distribution_order_financials f ON f.order_id = ro.id").
Where("ro.distribution_site_id = ? AND ro.created_at >= ?", siteID, startDate+" 00:00:00").
Where("(ro.distribution_site_id = ? OR EXISTS (SELECT 1 FROM distribution_order_parties p WHERE p.order_id = ro.id AND (p.site_id = ? OR p.party_id = ?))) AND ro.created_at >= ?", siteID, siteID, siteID, startDate+" 00:00:00").
Select(selectTrendSQL).
Group(dateFormatExpr).
Order("date_str ASC").
Scan(&tRows).Error
type profitRow struct {
DateStr string `gorm:"column:date_str"`
Profit int64 `gorm:"column:profit"`
}
var pRows []profitRow
_ = r.db.WithContext(ctx).Model(&model.DistributionOrderParty{}).
Where("(site_id = ? OR party_id = ?) AND party_type = 'site' AND created_at >= ?", siteID, siteID, startDate+" 00:00:00").
Select(fmt.Sprintf("%s AS date_str, COALESCE(SUM(profit_amount_cent), 0) AS profit", dateFormatPartyExpr)).
Group(dateFormatPartyExpr).
Scan(&pRows).Error
pRowMap := make(map[string]int64, len(pRows))
for _, pr := range pRows {
pRowMap[pr.DateStr] = pr.Profit
}
tRowMap := make(map[string]trendRow, len(tRows))
for _, tr := range tRows {
tRowMap[tr.DateStr] = tr
}
for i := -6; i <= 0; i++ {
dStr := time.Now().AddDate(0, 0, i).Format("2006-01-02")
if tr, ok := tRowMap[dStr]; ok {
trendDays = append(trendDays, DistributionTrendPoint{
Date: dStr,
ReceivedCount: tr.Received,
OrderCount: tr.Orders,
GMVCent: tr.GMV,
ProfitCent: tr.Profit,
})
} else {
trendDays = append(trendDays, DistributionTrendPoint{
Date: dStr,
ReceivedCount: 0,
OrderCount: 0,
GMVCent: 0,
ProfitCent: 0,
})
}
tr := tRowMap[dStr]
trendDays = append(trendDays, DistributionTrendPoint{
Date: dStr,
ReceivedCount: tr.Received,
OrderCount: tr.Orders,
GMVCent: tr.GMV,
ProfitCent: pRowMap[dStr],
})
}
return &DistributionAnalyticsDTO{