修复超管无法回收资产的问题
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m0s

This commit is contained in:
2026-02-27 11:03:44 +08:00
parent 4189dbe98f
commit f5000f2bfc
4 changed files with 28 additions and 33 deletions

View File

@@ -419,26 +419,12 @@ func (s *Service) RecallCards(ctx context.Context, req *dto.RecallStandaloneCard
if err != nil { if err != nil {
return nil, err return nil, err
} }
// 调试日志:记录查询结果
s.logger.Info("批量查询店铺结果",
zap.Any("operator_shop_id", operatorShopID),
zap.Uints("requested_shop_ids", shopIDs),
zap.Int("returned_shops_count", len(shops)),
zap.Uints("returned_shop_ids", func() []uint {
ids := make([]uint, len(shops))
for i, shop := range shops {
ids[i] = shop.ID
}
return ids
}()))
for _, shop := range shops { for _, shop := range shops {
if s.isDirectSubordinate(operatorShopID, shop) { if s.isDirectSubordinate(operatorShopID, shop) {
directSubordinateSet[shop.ID] = true directSubordinateSet[shop.ID] = true
} }
} }
// 调试日志:记录直属下级集合
s.logger.Info("直属下级店铺集合",
zap.Any("direct_subordinate_set", directSubordinateSet))
} }
// 4. 检查绑定设备的卡 // 4. 检查绑定设备的卡
@@ -472,15 +458,17 @@ func (s *Service) RecallCards(ctx context.Context, req *dto.RecallStandaloneCard
}) })
continue continue
} }
userType := middleware.GetUserTypeFromContext(ctx)
if !directSubordinateSet[*card.ShopID] { if userType == constants.UserTypeAgent {
failedItems = append(failedItems, dto.AllocationFailedItem{ if !directSubordinateSet[*card.ShopID] {
ICCID: card.ICCID, failedItems = append(failedItems, dto.AllocationFailedItem{
Reason: "卡所属店铺不是您的直属下级", ICCID: card.ICCID,
}) Reason: "卡所属店铺不是您的直属下级",
continue })
continue
}
} }
cardIDs = append(cardIDs, card.ID) cardIDs = append(cardIDs, card.ID)
successCards = append(successCards, card) successCards = append(successCards, card)
} }

View File

@@ -7,9 +7,11 @@ import (
"github.com/break/junhong_cmp_fiber/internal/model" "github.com/break/junhong_cmp_fiber/internal/model"
"github.com/break/junhong_cmp_fiber/internal/store" "github.com/break/junhong_cmp_fiber/internal/store"
"github.com/break/junhong_cmp_fiber/pkg/constants" "github.com/break/junhong_cmp_fiber/pkg/constants"
"github.com/break/junhong_cmp_fiber/pkg/logger"
"github.com/break/junhong_cmp_fiber/pkg/middleware" "github.com/break/junhong_cmp_fiber/pkg/middleware"
"github.com/bytedance/sonic" "github.com/bytedance/sonic"
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
"go.uber.org/zap"
"gorm.io/gorm" "gorm.io/gorm"
) )
@@ -215,6 +217,11 @@ func (s *ShopStore) GetByIDs(ctx context.Context, ids []uint) ([]*model.Shop, er
var shops []*model.Shop var shops []*model.Shop
query := s.db.WithContext(ctx).Where("id IN ?", ids) query := s.db.WithContext(ctx).Where("id IN ?", ids)
// 应用数据权限过滤:代理用户只能看到自己店铺及下级店铺 // 应用数据权限过滤:代理用户只能看到自己店铺及下级店铺
subordinateShopIDs := middleware.GetSubordinateShopIDs(ctx)
logger.GetAppLogger().Debug("GetByIDs 数据权限过滤",
zap.Uints("requested_ids", ids),
zap.Any("subordinate_shop_ids", subordinateShopIDs),
zap.Int("user_type", middleware.GetUserTypeFromContext(ctx)))
query = middleware.ApplyShopIDFilter(ctx, query) query = middleware.ApplyShopIDFilter(ctx, query)
if err := query.Find(&shops).Error; err != nil { if err := query.Find(&shops).Error; err != nil {
return nil, err return nil, err

View File

@@ -34,7 +34,7 @@
"--access-mode=restricted" "--access-mode=restricted"
], ],
"environment": { "environment": {
"DATABASE_URI": "postgresql://erp_pgsql:erp_2025@cxd.whcxd.cn:16289/junhong_cmp_test?sslmode=disable" "DATABASE_URI": "postgresql://erp_pgsql:erp_2025@cxd.whcxd.cn:16159/junhong_cmp_test?sslmode=disable"
} }
} }
} }

View File

@@ -21,12 +21,12 @@ func GetSubordinateShopIDs(ctx context.Context) []uint {
} }
// ApplyShopFilter 应用店铺数据权限过滤 // ApplyShopFilter 应用店铺数据权限过滤
// 平台用户/超管不添加条件SubordinateShopIDs 为 nil // 平台用户/超管不添加条件SubordinateShopIDs 为 nil 或空数组
// 代理用户WHERE shop_id IN (subordinateShopIDs) // 代理用户WHERE shop_id IN (subordinateShopIDs)
// 注意NULL shop_id 的记录对代理用户不可见 // 注意NULL shop_id 的记录对代理用户不可见
func ApplyShopFilter(ctx context.Context, query *gorm.DB) *gorm.DB { func ApplyShopFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
shopIDs := GetSubordinateShopIDs(ctx) shopIDs := GetSubordinateShopIDs(ctx)
if shopIDs == nil { if len(shopIDs) == 0 {
return query return query
} }
return query.Where("shop_id IN ?", shopIDs) return query.Where("shop_id IN ?", shopIDs)
@@ -50,11 +50,11 @@ func ApplyEnterpriseFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
// ApplyOwnerShopFilter 应用归属店铺数据权限过滤 // ApplyOwnerShopFilter 应用归属店铺数据权限过滤
// 用于 Enterprise 等使用 owner_shop_id 字段的表 // 用于 Enterprise 等使用 owner_shop_id 字段的表
// 平台用户/超管:不添加条件 // 平台用户/超管:不添加条件SubordinateShopIDs 为 nil 或空数组)
// 代理用户WHERE owner_shop_id IN (subordinateShopIDs) // 代理用户WHERE owner_shop_id IN (subordinateShopIDs)
func ApplyOwnerShopFilter(ctx context.Context, query *gorm.DB) *gorm.DB { func ApplyOwnerShopFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
shopIDs := GetSubordinateShopIDs(ctx) shopIDs := GetSubordinateShopIDs(ctx)
if shopIDs == nil { if len(shopIDs) == 0 {
return query return query
} }
return query.Where("owner_shop_id IN ?", shopIDs) return query.Where("owner_shop_id IN ?", shopIDs)
@@ -68,11 +68,11 @@ func IsUnrestricted(ctx context.Context) bool {
// ApplySellerShopFilter 应用销售店铺数据权限过滤 // ApplySellerShopFilter 应用销售店铺数据权限过滤
// 用于 Order 等使用 seller_shop_id 字段的表 // 用于 Order 等使用 seller_shop_id 字段的表
// 平台用户/超管:不添加条件 // 平台用户/超管:不添加条件SubordinateShopIDs 为 nil 或空数组)
// 代理用户WHERE seller_shop_id IN (subordinateShopIDs) // 代理用户WHERE seller_shop_id IN (subordinateShopIDs)
func ApplySellerShopFilter(ctx context.Context, query *gorm.DB) *gorm.DB { func ApplySellerShopFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
shopIDs := GetSubordinateShopIDs(ctx) shopIDs := GetSubordinateShopIDs(ctx)
if shopIDs == nil { if len(shopIDs) == 0 {
return query return query
} }
return query.Where("seller_shop_id IN ?", shopIDs) return query.Where("seller_shop_id IN ?", shopIDs)
@@ -80,11 +80,11 @@ func ApplySellerShopFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
// ApplyShopTagFilter 应用店铺标签数据权限过滤 // ApplyShopTagFilter 应用店铺标签数据权限过滤
// 用于 CardWallet 等使用 shop_id_tag 字段的表 // 用于 CardWallet 等使用 shop_id_tag 字段的表
// 平台用户/超管:不添加条件 // 平台用户/超管:不添加条件SubordinateShopIDs 为 nil 或空数组)
// 代理用户WHERE shop_id_tag IN (subordinateShopIDs) // 代理用户WHERE shop_id_tag IN (subordinateShopIDs)
func ApplyShopTagFilter(ctx context.Context, query *gorm.DB) *gorm.DB { func ApplyShopTagFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
shopIDs := GetSubordinateShopIDs(ctx) shopIDs := GetSubordinateShopIDs(ctx)
if shopIDs == nil { if len(shopIDs) == 0 {
return query return query
} }
return query.Where("shop_id_tag IN ?", shopIDs) return query.Where("shop_id_tag IN ?", shopIDs)
@@ -92,11 +92,11 @@ func ApplyShopTagFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
// ApplyShopIDFilter 应用店铺主键数据权限过滤 // ApplyShopIDFilter 应用店铺主键数据权限过滤
// 用于 Shop 表,根据 id 字段过滤 // 用于 Shop 表,根据 id 字段过滤
// 平台用户/超管:不添加条件 // 平台用户/超管:不添加条件SubordinateShopIDs 为 nil 或空数组)
// 代理用户WHERE id IN (subordinateShopIDs) // 代理用户WHERE id IN (subordinateShopIDs)
func ApplyShopIDFilter(ctx context.Context, query *gorm.DB) *gorm.DB { func ApplyShopIDFilter(ctx context.Context, query *gorm.DB) *gorm.DB {
shopIDs := GetSubordinateShopIDs(ctx) shopIDs := GetSubordinateShopIDs(ctx)
if shopIDs == nil { if len(shopIDs) == 0 {
return query return query
} }
return query.Where("id IN ?", shopIDs) return query.Where("id IN ?", shopIDs)