fix(chat): 分销付款改为进入账号群,不再另建订单群
主站、分站和分站之间都只用发布时的账号群,二维码仍跟这个群走。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -90,6 +90,81 @@ func TestFindOrderConversationPrefersListingGroup(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestFindOrderConversationDistributionPrefersListingGroup(t *testing.T) {
|
||||
db := setupConversationTestDB(t)
|
||||
repo := NewRepository(db, nil, nil)
|
||||
now := time.Date(2026, 6, 18, 12, 0, 0, 0, time.UTC)
|
||||
site := model.DistributionSite{
|
||||
SiteCode: "site_listing_group",
|
||||
SiteName: "账号群分销",
|
||||
Domain: "listing-group.hfb.com",
|
||||
Status: "active",
|
||||
}
|
||||
if err := db.Create(&site).Error; err != nil {
|
||||
t.Fatalf("创建分销站点失败: %v", err)
|
||||
}
|
||||
|
||||
owner := model.User{Phone: "13800001005", Nickname: "号主"}
|
||||
renter := model.User{Phone: "13800001006", Nickname: "租客"}
|
||||
if err := db.Create(&owner).Error; err != nil {
|
||||
t.Fatalf("创建号主失败: %v", err)
|
||||
}
|
||||
if err := db.Create(&renter).Error; err != nil {
|
||||
t.Fatalf("创建租客失败: %v", err)
|
||||
}
|
||||
|
||||
order := model.RentalOrder{
|
||||
OrderNo: "ORDER-DIST-LISTING-GROUP",
|
||||
ListingID: 103,
|
||||
AccountID: 203,
|
||||
OwnerID: owner.ID,
|
||||
RenterID: renter.ID,
|
||||
Status: "renting",
|
||||
DistributionSiteID: &site.ID,
|
||||
}
|
||||
if err := db.Create(&order).Error; err != nil {
|
||||
t.Fatalf("创建订单失败: %v", err)
|
||||
}
|
||||
orderConv := model.ChatConversation{
|
||||
OrderID: &order.ID,
|
||||
DistributionSiteID: &site.ID,
|
||||
Type: ConversationTypeOrderGroup,
|
||||
Title: "订单群聊",
|
||||
Status: "active",
|
||||
}
|
||||
listingConv := model.ChatConversation{
|
||||
ListingID: &order.ListingID,
|
||||
DistributionSiteID: &site.ID,
|
||||
Type: ConversationTypeListingGroup,
|
||||
Title: "账号群",
|
||||
Status: "active",
|
||||
}
|
||||
if err := db.Create(&orderConv).Error; err != nil {
|
||||
t.Fatalf("创建订单群失败: %v", err)
|
||||
}
|
||||
if err := db.Create(&listingConv).Error; err != nil {
|
||||
t.Fatalf("创建账号群失败: %v", err)
|
||||
}
|
||||
participants := []model.ChatParticipant{
|
||||
{ConversationID: orderConv.ID, ParticipantType: "user", ParticipantID: order.RenterID, Role: "renter", JoinedAt: now},
|
||||
{ConversationID: listingConv.ID, ParticipantType: "user", ParticipantID: order.RenterID, Role: "renter", JoinedAt: now},
|
||||
}
|
||||
if err := db.Create(&participants).Error; err != nil {
|
||||
t.Fatalf("创建成员失败: %v", err)
|
||||
}
|
||||
|
||||
dto, err := repo.FindOrderConversation(t.Context(), order.RenterID, order.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("查询订单会话失败: %v", err)
|
||||
}
|
||||
if dto.ID != listingConv.ID {
|
||||
t.Fatalf("会话 ID = %d, want 账号群 %d", dto.ID, listingConv.ID)
|
||||
}
|
||||
if dto.Type != ConversationTypeListingGroup {
|
||||
t.Fatalf("会话类型 = %q, want %q", dto.Type, ConversationTypeListingGroup)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFindOrderConversationFallsBackToOrderGroup(t *testing.T) {
|
||||
db := setupConversationTestDB(t)
|
||||
repo := NewRepository(db, nil, nil)
|
||||
@@ -147,6 +222,120 @@ func TestFindOrderConversationFallsBackToOrderGroup(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestListingGroupVisibleToCrossSiteRenter(t *testing.T) {
|
||||
db := setupConversationTestDB(t)
|
||||
repo := NewRepository(db, nil, nil)
|
||||
now := time.Now()
|
||||
|
||||
renter := model.User{Phone: "13900003001", Nickname: "跨站租客"}
|
||||
if err := db.Create(&renter).Error; err != nil {
|
||||
t.Fatalf("创建租客失败: %v", err)
|
||||
}
|
||||
buySite := model.DistributionSite{
|
||||
SiteCode: "site_buyer",
|
||||
SiteName: "买家分站",
|
||||
Domain: "buyer.hfb.com",
|
||||
Status: "active",
|
||||
}
|
||||
listingSite := model.DistributionSite{
|
||||
SiteCode: "site_listing",
|
||||
SiteName: "挂货分站",
|
||||
Domain: "listing.hfb.com",
|
||||
Status: "active",
|
||||
}
|
||||
if err := db.Create(&buySite).Error; err != nil {
|
||||
t.Fatalf("创建买家分站失败: %v", err)
|
||||
}
|
||||
if err := db.Create(&listingSite).Error; err != nil {
|
||||
t.Fatalf("创建挂货分站失败: %v", err)
|
||||
}
|
||||
|
||||
mainListingID := uint64(301)
|
||||
distListingID := uint64(302)
|
||||
mainGroup := model.ChatConversation{
|
||||
ListingID: &mainListingID,
|
||||
Type: ConversationTypeListingGroup,
|
||||
Title: "主站账号群",
|
||||
Status: "active",
|
||||
}
|
||||
distGroup := model.ChatConversation{
|
||||
ListingID: &distListingID,
|
||||
DistributionSiteID: &listingSite.ID,
|
||||
Type: ConversationTypeListingGroup,
|
||||
Title: "分站账号群",
|
||||
Status: "active",
|
||||
}
|
||||
if err := db.Create(&mainGroup).Error; err != nil {
|
||||
t.Fatalf("创建主站账号群失败: %v", err)
|
||||
}
|
||||
if err := db.Create(&distGroup).Error; err != nil {
|
||||
t.Fatalf("创建分站账号群失败: %v", err)
|
||||
}
|
||||
if err := db.Create(&[]model.ChatParticipant{
|
||||
{ConversationID: mainGroup.ID, ParticipantType: "user", ParticipantID: renter.ID, Role: "renter", JoinedAt: now},
|
||||
{ConversationID: distGroup.ID, ParticipantType: "user", ParticipantID: renter.ID, Role: "renter", JoinedAt: now},
|
||||
}).Error; err != nil {
|
||||
t.Fatalf("创建成员失败: %v", err)
|
||||
}
|
||||
orders := []model.RentalOrder{
|
||||
{
|
||||
OrderNo: "ORDER-PLATFORM-RECEIVE",
|
||||
ListingID: mainListingID,
|
||||
RenterID: renter.ID,
|
||||
Status: "renting",
|
||||
DistributionSiteID: &buySite.ID,
|
||||
DistributionMode: "two_party_platform_receive",
|
||||
},
|
||||
{
|
||||
OrderNo: "ORDER-DISTRIBUTOR-RECEIVE",
|
||||
ListingID: distListingID,
|
||||
RenterID: renter.ID,
|
||||
Status: "renting",
|
||||
DistributionSiteID: &listingSite.ID,
|
||||
DistributionMode: "two_party_distributor_receive",
|
||||
},
|
||||
}
|
||||
if err := db.Create(&orders).Error; err != nil {
|
||||
t.Fatalf("创建订单失败: %v", err)
|
||||
}
|
||||
|
||||
principal := Principal{Type: "user", ID: renter.ID}
|
||||
buyList, err := repo.ListConversations(t.Context(), principal, 1, 20, buySite.SiteCode)
|
||||
if err != nil {
|
||||
t.Fatalf("查询买家分站会话失败: %v", err)
|
||||
}
|
||||
if !conversationListHas(buyList, mainGroup.ID) {
|
||||
t.Fatalf("买家分站应看到主站账号群 %d", mainGroup.ID)
|
||||
}
|
||||
if conversationListHas(buyList, distGroup.ID) {
|
||||
t.Fatalf("买家分站不应看到其他分站账号群 %d", distGroup.ID)
|
||||
}
|
||||
|
||||
mainList, err := repo.ListConversations(t.Context(), principal, 1, 20)
|
||||
if err != nil {
|
||||
t.Fatalf("查询主站会话失败: %v", err)
|
||||
}
|
||||
if !conversationListHas(mainList, mainGroup.ID) {
|
||||
t.Fatalf("主站应看到主站账号群 %d", mainGroup.ID)
|
||||
}
|
||||
if !conversationListHas(mainList, distGroup.ID) {
|
||||
t.Fatalf("主站买家应看到分站收号的账号群 %d", distGroup.ID)
|
||||
}
|
||||
}
|
||||
|
||||
func conversationListHas(result *PaginatedResult, id uint64) bool {
|
||||
items, ok := result.Items.([]ConversationDTO)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
for _, item := range items {
|
||||
if item.ID == id {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func TestChatTenantIsolation(t *testing.T) {
|
||||
db := setupConversationTestDB(t)
|
||||
repo := NewRepository(db, nil, nil)
|
||||
|
||||
Reference in New Issue
Block a user