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 }