Files
junhong_cmp_fiber/internal/service/package/addon_main_package.go
Break 5c779cb6e0
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m50s
不允许购买第二个主套餐
2026-06-10 15:24:26 +08:00

86 lines
2.7 KiB
Go

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
}