实现套餐生效条件覆盖与购买快照
This commit is contained in:
47
internal/service/package/usage_terms.go
Normal file
47
internal/service/package/usage_terms.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package packagepkg
|
||||
|
||||
import (
|
||||
"sync/atomic"
|
||||
|
||||
packagedomain "github.com/break/junhong_cmp_fiber/internal/domain/package"
|
||||
"github.com/break/junhong_cmp_fiber/internal/model"
|
||||
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
var historicalTermsFallbackCount atomic.Uint64
|
||||
|
||||
// ResolveUsageTerms 优先读取使用记录快照,仅对完整空快照的历史记录显式回退。
|
||||
func ResolveUsageTerms(usage *model.PackageUsage, pkg *model.Package, logger *zap.Logger) (packagedomain.TermsSnapshot, error) {
|
||||
terms := packagedomain.TermsSnapshotFromUsage(usage)
|
||||
if terms.IsValid() {
|
||||
return terms, nil
|
||||
}
|
||||
if !isEmptyHistoricalTerms(usage) {
|
||||
if logger != nil {
|
||||
logger.Error("套餐使用记录计时快照异常", zap.Uint("package_usage_id", usage.ID), zap.Uint("package_id", usage.PackageID))
|
||||
}
|
||||
return packagedomain.TermsSnapshot{}, errors.New(errors.CodeInternalError, "套餐使用记录计时快照异常")
|
||||
}
|
||||
fallback, err := packagedomain.ResolveTermsSnapshot(pkg, nil)
|
||||
if err != nil {
|
||||
return packagedomain.TermsSnapshot{}, err
|
||||
}
|
||||
historicalTermsFallbackCount.Add(1)
|
||||
if logger != nil {
|
||||
logger.Warn("历史套餐使用记录缺少计时快照,回退套餐当前配置",
|
||||
zap.Uint("package_usage_id", usage.ID), zap.Uint("package_id", usage.PackageID),
|
||||
zap.Uint64("historical_terms_fallback_count", historicalTermsFallbackCount.Load()))
|
||||
}
|
||||
return fallback, nil
|
||||
}
|
||||
|
||||
// HistoricalTermsFallbackCount 返回历史计时条款回退累计次数。
|
||||
func HistoricalTermsFallbackCount() uint64 {
|
||||
return historicalTermsFallbackCount.Load()
|
||||
}
|
||||
|
||||
func isEmptyHistoricalTerms(usage *model.PackageUsage) bool {
|
||||
return usage.ExpiryBaseSnapshot == "" && usage.CalendarTypeSnapshot == "" &&
|
||||
usage.DurationMonthsSnapshot == 0 && usage.DurationDaysSnapshot == 0
|
||||
}
|
||||
Reference in New Issue
Block a user