package exporter import ( "context" "gorm.io/gorm" "github.com/break/junhong_cmp_fiber/pkg/errors" ) // businessUserGroupNames 按执行时当前业务员账号批量推导业务用户组名称。 // 用户组不落在店铺库表上,按既有实时推导读取,多个组按排序拼接;达量预警与临期导出共用同一口径。 func businessUserGroupNames(ctx context.Context, db *gorm.DB, ownerIDs []uint) (map[uint]string, error) { result := make(map[uint]string, len(ownerIDs)) if len(ownerIDs) == 0 { return result, nil } var rows []struct { AccountID uint `gorm:"column:account_id"` GroupName string `gorm:"column:group_name"` } if err := db.WithContext(ctx).Table("tb_business_user_group_member AS m"). Select("m.account_id, g.name AS group_name"). Joins("JOIN tb_business_user_group AS g ON g.id = m.business_user_group_id AND g.deleted_at IS NULL"). Where("m.account_id IN ? AND m.deleted_at IS NULL", ownerIDs). Order("m.account_id ASC, g.sort_order ASC, g.id ASC"). Scan(&rows).Error; err != nil { return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询业务员业务用户组失败") } for _, row := range rows { if existing := result[row.AccountID]; existing != "" { result[row.AccountID] = existing + "、" + row.GroupName continue } result[row.AccountID] = row.GroupName } return result, nil } // loadAccountNames 按账号 ID 批量读取账号名称,供导出侧执行时当前归属补充。 func loadAccountNames(ctx context.Context, db *gorm.DB, accountIDs []uint) (map[uint]string, error) { result := make(map[uint]string, len(accountIDs)) if len(accountIDs) == 0 { return result, nil } var rows []struct { ID uint `gorm:"column:id"` Username string `gorm:"column:username"` } if err := db.WithContext(ctx).Table("tb_account"). Select("id, username"). Where("id IN ? AND deleted_at IS NULL", accountIDs). Scan(&rows).Error; err != nil { return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询账号名称失败") } for _, row := range rows { result[row.ID] = row.Username } return result, nil }