修复 UR#55 代码审查问题:事务隔离、错误包装、重复辅助函数
- resolvePackageTerms 接受 tx 参数并使用事务绑定的 Store,确保快照与写入同库 - auto_purchase.go 错误包装改用 pkgerrors.Wrap 而非标准库 errors - shop_package_batch_allocation 去除 fmt 依赖改用 strconv 拼接 - shop_series_grant 提取 effectiveBase 局部变量避免重复调用 - 测试辅助函数统一迁移至 testutil.StringPointer,删除各文件本地重复定义 - 新增 testutil.NewRedisClient 和 testutil.StringPointer Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -498,7 +498,7 @@ func (h *AutoPurchaseHandler) activateMainPackage(
|
||||
carrierID uint,
|
||||
now time.Time,
|
||||
) error {
|
||||
terms, err := h.resolvePackageTerms(ctx, pkg, order.SellerShopID)
|
||||
terms, err := h.resolvePackageTerms(ctx, tx, pkg, order.SellerShopID)
|
||||
if err != nil {
|
||||
h.logger.Error("自动购包生成套餐计时快照失败", zap.Uint("package_id", pkg.ID), zap.Error(err))
|
||||
return err
|
||||
@@ -642,7 +642,7 @@ func (h *AutoPurchaseHandler) activateAddonPackage(
|
||||
carrierID uint,
|
||||
now time.Time,
|
||||
) error {
|
||||
terms, err := h.resolvePackageTerms(ctx, pkg, order.SellerShopID)
|
||||
terms, err := h.resolvePackageTerms(ctx, tx, pkg, order.SellerShopID)
|
||||
if err != nil {
|
||||
h.logger.Error("自动购包生成加油包计时快照失败", zap.Uint("package_id", pkg.ID), zap.Error(err))
|
||||
return err
|
||||
@@ -703,12 +703,15 @@ func (h *AutoPurchaseHandler) activateAddonPackage(
|
||||
return tx.Create(usage).Error
|
||||
}
|
||||
|
||||
func (h *AutoPurchaseHandler) resolvePackageTerms(ctx context.Context, pkg *model.Package, sellerShopID *uint) (packagedomain.TermsSnapshot, error) {
|
||||
// resolvePackageTerms 在给定事务内查询分配覆盖并解析计时条款快照。
|
||||
// 必须在事务内调用,确保分配读取与 PackageUsage 写入在同一连接,避免快照与提交值不一致。
|
||||
func (h *AutoPurchaseHandler) resolvePackageTerms(ctx context.Context, tx *gorm.DB, pkg *model.Package, sellerShopID *uint) (packagedomain.TermsSnapshot, error) {
|
||||
var allocation *model.ShopPackageAllocation
|
||||
if sellerShopID != nil && *sellerShopID > 0 {
|
||||
found, err := h.shopPackageAllocationStore.GetByShopAndPackageForSystem(ctx, *sellerShopID, pkg.ID)
|
||||
store := postgres.NewShopPackageAllocationStore(tx)
|
||||
found, err := store.GetByShopAndPackageForSystem(ctx, *sellerShopID, pkg.ID)
|
||||
if err != nil && err != gorm.ErrRecordNotFound {
|
||||
return packagedomain.TermsSnapshot{}, err
|
||||
return packagedomain.TermsSnapshot{}, pkgerrors.Wrap(pkgerrors.CodeDatabaseError, err, "查询套餐分配失败")
|
||||
}
|
||||
if err == nil {
|
||||
allocation = found
|
||||
|
||||
Reference in New Issue
Block a user