All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 7m48s
82 lines
2.6 KiB
Go
82 lines
2.6 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
|
|
}
|
|
|
|
// FindCurrentMainPackageForQueue 查询应让新主套餐排队的现有主套餐。
|
|
// 未过期的生效中、已用完主套餐仍占用当前周期;待生效只是队列记录,不阻止继续排队购买。
|
|
func FindCurrentMainPackageForQueue(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 ?", []int{
|
|
constants.PackageUsageStatusActive,
|
|
constants.PackageUsageStatusDepleted,
|
|
}).
|
|
Where("expires_at IS NULL OR expires_at > ?", 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
|
|
}
|
|
|
|
// HasCurrentMainPackageForQueue 判断载体是否已有应让新主套餐排队的主套餐。
|
|
func HasCurrentMainPackageForQueue(tx *gorm.DB, carrierType string, carrierID uint, now time.Time) (bool, error) {
|
|
_, err := FindCurrentMainPackageForQueue(tx, carrierType, carrierID, now)
|
|
if err == nil {
|
|
return true, nil
|
|
}
|
|
if err == gorm.ErrRecordNotFound {
|
|
return false, nil
|
|
}
|
|
return false, err
|
|
}
|