区分线下提号账号来源

This commit is contained in:
yml2213
2026-07-27 11:13:31 +08:00
parent 8af7333969
commit 66af387b4e
11 changed files with 483 additions and 36 deletions
@@ -181,6 +181,103 @@ func TestRepositoryListShopNamesReturnsDistinctPlatformOptions(t *testing.T) {
}
}
func TestRepositoryListAvailableListingsFiltersAccountSource(t *testing.T) {
repo, db := newPickupTestRepo(t)
internal := seedAvailableListing(t, db, "LST-SOURCE-INTERNAL", "站内账号", false)
external := seedAvailableListing(t, db, "LST-SOURCE-EXTERNAL", "外部账号", true)
if err := db.Create(&model.ListingUpload{
UploaderName: "外部号主",
SourceChannel: "淘宝",
ListingID: &external.ID,
Status: "listing_created",
}).Error; err != nil {
t.Fatalf("创建外部上传记录失败: %v", err)
}
all, err := repo.ListAvailableListings(t.Context(), AvailableListingQuery{Page: 1, PageSize: 20})
if err != nil {
t.Fatalf("ListAvailableListings() error = %v", err)
}
if all.Total != 2 || len(all.Items) != 2 {
t.Fatalf("全部来源结果 = total %d, items %d, want 2", all.Total, len(all.Items))
}
externalResult, err := repo.ListAvailableListings(t.Context(), AvailableListingQuery{
SourceType: ListingSourceExternal,
Page: 1,
PageSize: 20,
})
if err != nil {
t.Fatalf("筛选外部上传 error = %v", err)
}
if externalResult.Total != 1 || len(externalResult.Items) != 1 {
t.Fatalf("外部上传结果 = total %d, items %d, want 1", externalResult.Total, len(externalResult.Items))
}
externalItem := externalResult.Items[0]
if externalItem.ID != external.ID || !externalItem.IsExternalUpload {
t.Fatalf("外部上传账号 = id %d, external %t, want id %d", externalItem.ID, externalItem.IsExternalUpload, external.ID)
}
if externalItem.AccountSource != AccountSourceExternalPlatformManaged || externalItem.SourceChannel != "淘宝" {
t.Fatalf("外部上传来源 = %q/%q", externalItem.AccountSource, externalItem.SourceChannel)
}
if externalItem.HandoffMode != "platform" || externalItem.SettlementMode != "platform_managed" {
t.Fatalf("外部上传代管模式 = %q/%q", externalItem.HandoffMode, externalItem.SettlementMode)
}
internalResult, err := repo.ListAvailableListings(t.Context(), AvailableListingQuery{
SourceType: ListingSourceInternal,
Page: 1,
PageSize: 20,
})
if err != nil {
t.Fatalf("筛选站内上传 error = %v", err)
}
if internalResult.Total != 1 || len(internalResult.Items) != 1 {
t.Fatalf("站内上传结果 = total %d, items %d, want 1", internalResult.Total, len(internalResult.Items))
}
internalItem := internalResult.Items[0]
if internalItem.ID != internal.ID || internalItem.IsExternalUpload || internalItem.AccountSource != AccountSourceInternal {
t.Fatalf("站内上传账号 = id %d, external %t, source %q", internalItem.ID, internalItem.IsExternalUpload, internalItem.AccountSource)
}
}
func TestRepositoryCreateSnapshotsExternalAccountSource(t *testing.T) {
repo, db := newPickupTestRepo(t)
listing := seedAvailableListing(t, db, "LST-SOURCE-CREATE", "待提号外部账号", true)
upload := model.ListingUpload{
UploaderName: "外部号主",
SourceChannel: "闲鱼",
ListingID: &listing.ID,
Status: "listing_created",
}
if err := db.Create(&upload).Error; err != nil {
t.Fatalf("创建外部上传记录失败: %v", err)
}
item, err := repo.Create(t.Context(), CreateRequest{
ListingID: listing.ID,
Platform: "微信",
ProfitAmountCent: 1200,
}, 99, auditlog.Meta{RequestID: "req-source"})
if err != nil {
t.Fatalf("Create() error = %v", err)
}
if item.AccountSource != AccountSourceExternalPlatformManaged || item.SourceChannel != "闲鱼" {
t.Fatalf("创建来源快照 = %q/%q", item.AccountSource, item.SourceChannel)
}
if err := db.Delete(&upload).Error; err != nil {
t.Fatalf("删除上传关联失败: %v", err)
}
stored, err := repo.FindByID(t.Context(), item.ID)
if err != nil {
t.Fatalf("FindByID() error = %v", err)
}
if stored.AccountSource != AccountSourceExternalPlatformManaged || stored.SourceChannel != "闲鱼" {
t.Fatalf("关联删除后的来源快照 = %q/%q", stored.AccountSource, stored.SourceChannel)
}
}
func assertInt64(t *testing.T, name string, got, want int64) {
t.Helper()
if got != want {
@@ -208,14 +305,53 @@ func newPickupTestRepo(t *testing.T) (*Repository, *gorm.DB) {
&model.User{},
&model.GameAccount{},
&model.RentalListing{},
&model.ListingUpload{},
&model.AdminPickup{},
&model.AuditLog{},
&model.Notification{},
&model.ListingStatusEvent{},
); err != nil {
t.Fatalf("迁移测试表失败: %v", err)
}
return NewRepository(db), db
}
func seedAvailableListing(t *testing.T, db *gorm.DB, listingNo, title string, external bool) model.RentalListing {
t.Helper()
owner := model.User{Phone: "188" + listingNo}
if err := db.Create(&owner).Error; err != nil {
t.Fatalf("创建候选号主失败: %v", err)
}
account := model.GameAccount{
OwnerID: owner.ID,
ServerRegion: "测试区",
LoginPlatform: "微信",
Title: title,
Status: "published",
}
if err := db.Create(&account).Error; err != nil {
t.Fatalf("创建候选账号失败: %v", err)
}
listing := model.RentalListing{
ListingNo: listingNo,
AccountID: account.ID,
OwnerID: owner.ID,
PriceCent: 10000,
Status: "published",
ReviewStatus: "approved",
HandoffMode: "owner",
SettlementMode: "owner_wallet",
}
if external {
listing.HandoffMode = "platform"
listing.SettlementMode = "platform_managed"
}
if err := db.Create(&listing).Error; err != nil {
t.Fatalf("创建候选上架记录失败: %v", err)
}
return listing
}
func seedPickup(t *testing.T, db *gorm.DB, status string) model.AdminPickup {
t.Helper()
owner := model.User{Phone: "18800000000"}