fix(order): 修复分销收号商品在主站租用后报订单不存在的问题

This commit is contained in:
yml2213
2026-09-09 15:24:56 +08:00
parent f6ad7c34ee
commit 02d091434e
7 changed files with 85 additions and 31 deletions
+16 -10
View File
@@ -7,6 +7,7 @@ import (
"time"
"hfb_sys/backend/internal/model"
"hfb_sys/backend/internal/modules/distribution"
"gorm.io/gorm"
)
@@ -21,11 +22,13 @@ func (r *Repository) ListForUser(ctx context.Context, userID uint64, page, pageS
code = strings.TrimSpace(siteCode[0])
}
if code != "" {
base = base.Joins("INNER JOIN distribution_sites AS ds ON ds.id = o.distribution_site_id AND ds.site_code = ?", code)
countBase = countBase.Joins("INNER JOIN distribution_sites AS ds ON ds.id = o.distribution_site_id AND ds.site_code = ?", code)
base = base.Joins("INNER JOIN distribution_sites AS ds ON ds.id = o.distribution_site_id AND ds.site_code = ?", code).
Where("o.distribution_mode != ?", distribution.ModeTwoPartyDistributorReceive)
countBase = countBase.Joins("INNER JOIN distribution_sites AS ds ON ds.id = o.distribution_site_id AND ds.site_code = ?", code).
Where("o.distribution_mode != ?", distribution.ModeTwoPartyDistributorReceive)
} else {
base = base.Where("o.distribution_site_id IS NULL OR o.distribution_site_id = 0")
countBase = countBase.Where("o.distribution_site_id IS NULL OR o.distribution_site_id = 0")
base = base.Where("o.distribution_site_id IS NULL OR o.distribution_site_id = 0 OR o.distribution_mode = ?", distribution.ModeTwoPartyDistributorReceive)
countBase = countBase.Where("o.distribution_site_id IS NULL OR o.distribution_site_id = 0 OR o.distribution_mode = ?", distribution.ModeTwoPartyDistributorReceive)
}
var total int64
@@ -64,9 +67,10 @@ func (r *Repository) ListSellerHandoffs(ctx context.Context, userID uint64, quer
base = base.Where("o.status = ?", query.Status)
}
if query.SiteCode != "" {
base = base.Joins("INNER JOIN distribution_sites AS ds ON ds.id = o.distribution_site_id AND ds.site_code = ?", query.SiteCode)
base = base.Joins("INNER JOIN distribution_sites AS ds ON ds.id = o.distribution_site_id AND ds.site_code = ?", query.SiteCode).
Where("o.distribution_mode != ?", distribution.ModeTwoPartyDistributorReceive)
} else {
base = base.Where("o.distribution_site_id IS NULL OR o.distribution_site_id = 0")
base = base.Where("o.distribution_site_id IS NULL OR o.distribution_site_id = 0 OR o.distribution_mode = ?", distribution.ModeTwoPartyDistributorReceive)
}
var total int64
@@ -98,9 +102,10 @@ func (r *Repository) ListSellerHandoffs(ctx context.Context, userID uint64, quer
func (r *Repository) sellerHandoffMetrics(ctx context.Context, userID uint64, siteCode ...string) (SellerHandoffMetrics, error) {
base := r.db.WithContext(ctx).Table("rental_orders AS o").Where("o.owner_id = ?", userID)
if len(siteCode) > 0 && siteCode[0] != "" {
base = base.Joins("INNER JOIN distribution_sites AS ds ON ds.id = o.distribution_site_id AND ds.site_code = ?", siteCode[0])
base = base.Joins("INNER JOIN distribution_sites AS ds ON ds.id = o.distribution_site_id AND ds.site_code = ?", siteCode[0]).
Where("o.distribution_mode != ?", distribution.ModeTwoPartyDistributorReceive)
} else if len(siteCode) > 0 {
base = base.Where("o.distribution_site_id IS NULL OR o.distribution_site_id = 0")
base = base.Where("o.distribution_site_id IS NULL OR o.distribution_site_id = 0 OR o.distribution_mode = ?", distribution.ModeTwoPartyDistributorReceive)
}
var metrics SellerHandoffMetrics
if err := base.Session(&gorm.Session{}).Where("o.status = ? AND o.handoff_status = ?", orderStatusPendingHandoff, handoffStatusPendingOwner).Count(&metrics.PendingHandoff).Error; err != nil {
@@ -340,9 +345,10 @@ func (r *Repository) FindForUser(ctx context.Context, userID uint64, orderID uin
code = strings.TrimSpace(siteCode[0])
}
if code != "" {
query = query.Joins("INNER JOIN distribution_sites AS ds ON ds.id = o.distribution_site_id AND ds.site_code = ?", code)
query = query.Joins("INNER JOIN distribution_sites AS ds ON ds.id = o.distribution_site_id AND ds.site_code = ?", code).
Where("o.distribution_mode != ?", distribution.ModeTwoPartyDistributorReceive)
} else if len(siteCode) > 0 {
query = query.Where("o.distribution_site_id IS NULL OR o.distribution_site_id = 0")
query = query.Where("o.distribution_site_id IS NULL OR o.distribution_site_id = 0 OR o.distribution_mode = ?", distribution.ModeTwoPartyDistributorReceive)
}
if err := query.First(&row).Error; err != nil {
@@ -2018,7 +2018,7 @@ func TestListForUserAndFindForUserSiteIsolation(t *testing.T) {
}
db.Create(&mainOrder)
// Order 2: on distribution site (distribution_site_id = site.ID)
// Order 2: on distribution site (distribution_site_id = site.ID, sold on site)
distOrder := model.RentalOrder{
OrderNo: "RO_DIST_001",
ListingID: listing.ID,
@@ -2027,9 +2027,23 @@ func TestListForUserAndFindForUserSiteIsolation(t *testing.T) {
RenterID: renter.ID,
Status: orderStatusCompleted,
DistributionSiteID: &site.ID,
DistributionMode: "two_party_platform_receive",
}
db.Create(&distOrder)
// Order 3: received by distribution site, but rented/sold on main site
distRecvOrder := model.RentalOrder{
OrderNo: "RO_DIST_RECV_001",
ListingID: listing.ID,
AccountID: account.ID,
OwnerID: owner.ID,
RenterID: renter.ID,
Status: orderStatusCompleted,
DistributionSiteID: &site.ID,
DistributionMode: "two_party_distributor_receive",
}
db.Create(&distRecvOrder)
ctx := context.Background()
// 1. Query with site_code = "site_isolate_1": should return ONLY distOrder
@@ -2041,13 +2055,13 @@ func TestListForUserAndFindForUserSiteIsolation(t *testing.T) {
t.Fatalf("expected only RO_DIST_001, got %+v", distList.Items)
}
// 2. Query without siteCode (main site mode): should return ONLY mainOrder
// 2. Query without siteCode (main site mode): should return mainOrder AND distRecvOrder
mainList, err := repo.ListForUser(ctx, renter.ID, 1, 20, "")
if err != nil {
t.Fatalf("ListForUser main err: %v", err)
}
if len(mainList.Items) != 1 || mainList.Items[0].OrderNo != "RO_MAIN_001" {
t.Fatalf("expected only RO_MAIN_001, got %+v", mainList.Items)
if len(mainList.Items) != 2 {
t.Fatalf("expected 2 orders on main site, got %d: %+v", len(mainList.Items), mainList.Items)
}
// 3. FindForUser: distOrder found under "site_isolate_1"
@@ -2056,13 +2070,25 @@ func TestListForUserAndFindForUserSiteIsolation(t *testing.T) {
t.Fatalf("FindForUser distOrder failed: %v", err)
}
// 4. FindForUser: mainOrder CANNOT be accessed under "site_isolate_1"
// 4. FindForUser: distRecvOrder found under main site mode ("")
recvItem, err := repo.FindForUser(ctx, renter.ID, distRecvOrder.ID, "")
if err != nil || recvItem.OrderNo != "RO_DIST_RECV_001" {
t.Fatalf("FindForUser distRecvOrder failed on main site: %v", err)
}
// 5. FindForUser: mainOrder CANNOT be accessed under "site_isolate_1"
_, err = repo.FindForUser(ctx, renter.ID, mainOrder.ID, "site_isolate_1")
if err == nil {
t.Fatalf("expected error accessing mainOrder under distribution site, got nil")
}
// 5. FindForUser: distOrder CANNOT be accessed under main site mode ("")
// 6. FindForUser: distRecvOrder CANNOT be accessed under "site_isolate_1"
_, err = repo.FindForUser(ctx, renter.ID, distRecvOrder.ID, "site_isolate_1")
if err == nil {
t.Fatalf("expected error accessing distRecvOrder under distribution site, got nil")
}
// 7. FindForUser: distOrder CANNOT be accessed under main site mode ("")
_, err = repo.FindForUser(ctx, renter.ID, distOrder.ID, "")
if err == nil {
t.Fatalf("expected error accessing distOrder under main site mode, got nil")