package gatewaylimit import ( "context" "strconv" "github.com/redis/go-redis/v9" "gorm.io/gorm" "github.com/break/junhong_cmp_fiber/pkg/constants" ) // CarrierResolver 按 ICCID 解析卡所属的本系统运营商账户(tb_iot_card.carrier_id),结果缓存在 Redis。 type CarrierResolver struct { db *gorm.DB redis *redis.Client } // NewCarrierResolver 创建运营商账户解析器。 func NewCarrierResolver(db *gorm.DB, redisClient *redis.Client) *CarrierResolver { return &CarrierResolver{db: db, redis: redisClient} } // Resolve 返回 ICCID 对应卡的运营商账户 ID;卡不存在时返回 0、nil,由调用方按未知账户处理。 func (r *CarrierResolver) Resolve(ctx context.Context, iccid string) (uint, error) { if r == nil || iccid == "" { return 0, nil } cacheKey := constants.RedisGatewayCardCarrierKey(iccid) if r.redis != nil { if raw, err := r.redis.Get(ctx, cacheKey).Result(); err == nil { if value, parseErr := strconv.ParseUint(raw, 10, 64); parseErr == nil { return uint(value), nil } } } if r.db == nil { return 0, nil } var carrierIDs []uint err := r.db.WithContext(ctx).Table("tb_iot_card"). Where("iccid = ? AND deleted_at IS NULL", iccid).Limit(1).Pluck("carrier_id", &carrierIDs).Error if err != nil { return 0, err } if len(carrierIDs) == 0 { return 0, nil } if r.redis != nil { _ = r.redis.Set(ctx, cacheKey, strconv.FormatUint(uint64(carrierIDs[0]), 10), constants.GatewayCardCarrierCacheTTL).Err() } return carrierIDs[0], nil }