Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Failing after 8m39s
- 迁移 000259~000265:套餐记录沉默期字段与扫描索引、套餐默认沉默期、延期政策/流水/订单/批次/明细 5 张表、默认政策与系统配置(总开关默认关闭)、企微审批白名单、卡与设备出库时间及出库记录 - 沉默期设置(订单发放、自动购包、钱包续费)、后台购买时调整(超默认值按政策免审或企微审批)、统一判定与激活闸门、排队与孤儿扫描跳过过期套餐、过期套餐禁止退款、每 10 分钟扫描 - 总开关专用接口与打开前 4 项检查;延期政策;延期资格与计费;H5 自助与后台二维码在线支付(商户池路由)、支付回调与查单恢复、线下登记、特殊/批量延期、异常重试与原路退款;沉默期审批场景与终态处理 - 换货沉默期流水与出库时间;卡/设备列表、详情、导出与出库记录接口;延期订单与即将过期套餐列表及导出;财务流水纳入延期支付 - 沉默期与出库时间回填工具 cmd/silence-backfill;前端接口变更说明 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
84 lines
2.9 KiB
Go
84 lines
2.9 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,
|
||
).
|
||
// 沉默期已过期的待生效主套餐不能再挂加油包(D21:其下加油包随主套餐不可用)
|
||
Where("NOT (status = ? AND silence_status IS NOT NULL AND silence_status = ?)", constants.PackageUsageStatusPending, constants.SilenceStatusExpired).
|
||
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
|
||
}
|