test(distribution): add e2e scenario 1 test and fix tx deadlock in MarkSettlementBatch

This commit is contained in:
yml2213
2026-09-09 13:34:35 +08:00
parent 4aab9e7e33
commit cf4bea9b6d
2 changed files with 347 additions and 6 deletions
@@ -69,14 +69,18 @@ func NewRepository(db *gorm.DB, redis ...*redis.Client) *Repository {
}
func (r *Repository) hasGlobalDistributionAccess(ctx context.Context, adminID uint64) (bool, error) {
return r.hasGlobalDistributionAccessWithDB(ctx, r.db, adminID)
}
func (r *Repository) hasGlobalDistributionAccessWithDB(ctx context.Context, db *gorm.DB, adminID uint64) (bool, error) {
if adminID == 0 {
return true, nil
}
if r.db == nil {
if db == nil {
return false, nil
}
var n int64
if err := r.db.WithContext(ctx).Table("roles").
if err := db.WithContext(ctx).Table("roles").
Joins("JOIN admin_user_roles aur ON aur.role_id = roles.id").
Where("aur.admin_user_id = ? AND roles.code = ?", adminID, "super_admin").
Count(&n).Error; err != nil {
@@ -85,7 +89,7 @@ func (r *Repository) hasGlobalDistributionAccess(ctx context.Context, adminID ui
if n > 0 {
return true, nil
}
if err := r.db.WithContext(ctx).Table("permissions").
if err := db.WithContext(ctx).Table("permissions").
Joins("JOIN role_permissions rp ON rp.permission_id = permissions.id").
Joins("JOIN admin_user_roles aur ON aur.role_id = rp.role_id").
Where("aur.admin_user_id = ? AND permissions.code = ?", adminID, "distribution:all_view").
@@ -142,10 +146,17 @@ func (r *Repository) ScopeSiteID(ctx context.Context, adminID, requested uint64)
// ensureSiteAccess 校验管理员可访问指定站点。
// 仅超级管理员或持有 distribution:all_view 的账号可跨站;无成员记录不再视为超管。
func (r *Repository) ensureSiteAccess(ctx context.Context, adminID, siteID uint64) error {
return r.ensureSiteAccessWithDB(ctx, r.db, adminID, siteID)
}
func (r *Repository) ensureSiteAccessWithDB(ctx context.Context, db *gorm.DB, adminID, siteID uint64) error {
if adminID == 0 {
return nil
}
global, err := r.hasGlobalDistributionAccess(ctx, adminID)
if db == nil {
db = r.db
}
global, err := r.hasGlobalDistributionAccessWithDB(ctx, db, adminID)
if err != nil {
return err
}
@@ -156,7 +167,7 @@ func (r *Repository) ensureSiteAccess(ctx context.Context, adminID, siteID uint6
return ErrSiteAccessDenied
}
var allowed int64
if err := r.db.WithContext(ctx).Model(&model.DistributionSiteMember{}).
if err := db.WithContext(ctx).Model(&model.DistributionSiteMember{}).
Where("admin_user_id = ? AND site_id = ? AND status = 'active'", adminID, siteID).Count(&allowed).Error; err != nil {
return err
}
@@ -809,7 +820,7 @@ func (r *Repository) MarkSettlementBatch(ctx context.Context, adminID, id uint64
}
return err
}
if err := r.ensureSiteAccess(ctx, adminID, row.SiteID); err != nil {
if err := r.ensureSiteAccessWithDB(ctx, tx, adminID, row.SiteID); err != nil {
return err
}
if row.Status == "settled" {