diff --git a/backend/internal/service/pay.go b/backend/internal/service/pay.go index 82fda24..afdeb77 100644 --- a/backend/internal/service/pay.go +++ b/backend/internal/service/pay.go @@ -741,7 +741,11 @@ func (s *PayService) ListPurchases(shopID uint64, page, pageSize int, status str return nil, err } for _, u := range users { - names[u.ID] = u.RealName + if u.RealName != "" { + names[u.ID] = u.RealName + } else { + names[u.ID] = u.Username + } } } diff --git a/backend/internal/service/pay_test.go b/backend/internal/service/pay_test.go index 0e7f69e..1451160 100644 --- a/backend/internal/service/pay_test.go +++ b/backend/internal/service/pay_test.go @@ -942,3 +942,25 @@ func TestListPurchases_UserNameJoin(t *testing.T) { assert.Equal(t, "王老板", byOtn["un-known"].UserName) assert.Empty(t, byOtn["un-missing"].UserName, "查不到用户留空") } + +// TestListPurchases_UserNameFallbackToUsername:real_name 为空(用户创建接口该字段可选)时, +// user_name 必须回退 username,不能显示空白。 +func TestListPurchases_UserNameFallbackToUsername(t *testing.T) { + db := testutil.SetupTestDB() + svc := newTestPaySvc(db, "http://pay.invalid") + shop := testutil.CreateTestShop(db, "PAY108") + user := testutil.CreateTestUser(db, shop.ID, "noreal", "pass", "admin") + // CreateTestUser 默认会填 real_name,显式置空才能命中回退分支。 + require.NoError(t, db.Model(user).Update("real_name", "").Error) + + base := time.Now().Add(-time.Hour) + createPurchaseFull(t, db, shop.ID, user.ID, "annual_pro", 599900, "un-noreal", "paid", "", base) + + list, err := svc.ListPurchases(shop.ID, 1, 20, "") + require.NoError(t, err) + byOtn := map[string]PurchaseListItem{} + for _, item := range list.Items { + byOtn[item.OutTradeNo] = item + } + assert.Equal(t, "noreal", byOtn["un-noreal"].UserName, "real_name 为空时应回退 username") +}