修复已用完套餐展示
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m51s

This commit is contained in:
2026-09-08 17:19:30 +08:00
parent c7c2b17d78
commit 3c371ab88a
7 changed files with 95 additions and 10 deletions

View File

@@ -346,7 +346,7 @@ func (s *Service) buildCardResolveResponse(ctx context.Context, card *model.IotC
// fillPackageInfo 填充当前主套餐信息到响应中
func (s *Service) fillPackageInfo(ctx context.Context, resp *dto.AssetResolveResponse, carrierType string, carrierID uint) {
usage, err := s.packageUsageStore.GetActiveMainPackage(ctx, carrierType, carrierID)
usage, err := s.packageUsageStore.GetCurrentMainPackage(ctx, carrierType, carrierID)
if err != nil || usage == nil {
return
}
@@ -881,7 +881,7 @@ func (s *Service) GetPackages(ctx context.Context, assetType string, id uint, pa
}, nil
}
// GetCurrentPackage 获取资产当前生效的主套餐
// GetCurrentPackage 获取资产当前可展示的主套餐
// callerAccountType: 调用方账号类型,"platform" 时返回成本价paid_amount其他类型不返回
func (s *Service) GetCurrentPackage(ctx context.Context, assetType string, id uint, callerAccountType string) (*dto.AssetPackageResponse, error) {
carrierType := assetType
@@ -889,14 +889,14 @@ func (s *Service) GetCurrentPackage(ctx context.Context, assetType string, id ui
carrierType = "iot_card"
}
usage, err := s.packageUsageStore.GetActiveMainPackage(ctx, carrierType, id)
usage, err := s.packageUsageStore.GetCurrentMainPackage(ctx, carrierType, id)
if err != nil {
// 记录不存在表示当前无生效套餐,属于正常业务状态,返回 nil 而非错误
// 记录不存在表示当前无套餐,属于正常业务状态,返回 nil 而非错误
// 其他 DB 错误才作为服务端错误处理
if stderrors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询当前生效套餐失败")
return nil, errors.Wrap(errors.CodeDatabaseError, err, "查询当前套餐失败")
}
return s.buildAssetPackageResponse(ctx, usage, callerAccountType), nil

View File

@@ -58,13 +58,12 @@ func (s *PackageUsageStore) Update(ctx context.Context, usage *model.PackageUsag
return s.db.WithContext(ctx).Save(usage).Error
}
// GetActiveMainPackage 查询载体的生效中主套餐
// carrierType: "iot_card" 或 "device"
// carrierID: iot_card_id 或 device_id
func (s *PackageUsageStore) GetActiveMainPackage(ctx context.Context, carrierType string, carrierID uint) (*model.PackageUsage, error) {
// GetCurrentMainPackage 查询载体当前可展示的主套餐
// 当前套餐包含生效中和已用完状态;carrierType "iot_card" 或 "device"
func (s *PackageUsageStore) GetCurrentMainPackage(ctx context.Context, carrierType string, carrierID uint) (*model.PackageUsage, error) {
var usage model.PackageUsage
query := s.db.WithContext(ctx).
Where("status = ?", constants.PackageUsageStatusActive).
Where("status IN (?, ?)", constants.PackageUsageStatusActive, constants.PackageUsageStatusDepleted).
Where("master_usage_id IS NULL"). // 主套餐的 master_usage_id 为 NULL
Order("priority ASC, activated_at ASC")