package packagepkg import ( "time" "github.com/break/junhong_cmp_fiber/internal/model" "github.com/break/junhong_cmp_fiber/pkg/constants" "gorm.io/gorm" ) // FindAttachableMainPackageForAddon 查询加油包可挂靠的主套餐。 // 已用完但未过期的主套餐仍可挂靠;已过期、已失效的主套餐不可挂靠。 func FindAttachableMainPackageForAddon(tx *gorm.DB, carrierType string, carrierID uint, now time.Time) (*model.PackageUsage, error) { var mainPackage model.PackageUsage query := tx.Model(&model.PackageUsage{}). Where("master_usage_id IS NULL"). Where( "(status = ? OR (status IN ? AND (expires_at IS NULL OR expires_at > ?)))", constants.PackageUsageStatusPending, []int{ constants.PackageUsageStatusActive, constants.PackageUsageStatusDepleted, }, now, ). Order("priority ASC") switch carrierType { case constants.AssetWalletResourceTypeIotCard, "card": query = query.Where("iot_card_id = ?", carrierID) case constants.AssetWalletResourceTypeDevice: query = query.Where("device_id = ?", carrierID) default: return nil, gorm.ErrRecordNotFound } if err := query.First(&mainPackage).Error; err != nil { return nil, err } return &mainPackage, nil } // FindBlockingMainPackageForFormal 查询阻止购买新主套餐的现有主套餐。 // 待生效、生效中、未过期的已用完主套餐都仍占用主套餐资格;只有过期或失效后才允许再次购买主套餐。 func FindBlockingMainPackageForFormal(tx *gorm.DB, carrierType string, carrierID uint, now time.Time) (*model.PackageUsage, error) { var mainPackage model.PackageUsage query := tx.Model(&model.PackageUsage{}). Where("master_usage_id IS NULL"). Where( "(status IN ? OR (status = ? AND (expires_at IS NULL OR expires_at > ?)))", []int{ constants.PackageUsageStatusPending, constants.PackageUsageStatusActive, }, constants.PackageUsageStatusDepleted, now, ). Order("priority ASC, created_at ASC") switch carrierType { case constants.AssetWalletResourceTypeIotCard, "card": query = query.Where("iot_card_id = ?", carrierID) case constants.AssetWalletResourceTypeDevice: query = query.Where("device_id = ?", carrierID) default: return nil, gorm.ErrRecordNotFound } if err := query.First(&mainPackage).Error; err != nil { return nil, err } return &mainPackage, nil } // HasBlockingMainPackageForFormal 判断载体是否已有阻止新主套餐购买的主套餐。 func HasBlockingMainPackageForFormal(tx *gorm.DB, carrierType string, carrierID uint, now time.Time) (bool, error) { _, err := FindBlockingMainPackageForFormal(tx, carrierType, carrierID, now) if err == nil { return true, nil } if err == gorm.ErrRecordNotFound { return false, nil } return false, err }