package logic import ( "context" "healthapi/internal/model" "healthapi/internal/svc" "healthapi/internal/types" "healthapi/pkg/errorx" "github.com/zeromicro/go-zero/core/logx" ) type PreviewOrderLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewPreviewOrderLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PreviewOrderLogic { return &PreviewOrderLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *PreviewOrderLogic) PreviewOrder(req *types.OrderPreviewReq) (resp *types.OrderPreview, err error) { userID, err := GetUserIDFromCtx(l.ctx) if err != nil { return nil, errorx.ErrUnauthorized } // 获取用户信息(会员等级) var user model.User if err := l.svcCtx.DB.First(&user, userID).Error; err != nil { return nil, errorx.ErrUserNotFound } levelConfig := model.MemberLevelConfigs[user.MemberLevel] if levelConfig.Level == "" { levelConfig = model.MemberLevelConfigs[model.MemberLevelNormal] } // 获取购物车项 var cartItems []model.CartItem if err := l.svcCtx.DB.Where("id IN ? AND user_id = ?", req.CartItemIDs, userID).Find(&cartItems).Error; err != nil { return nil, err } if len(cartItems) == 0 { return nil, errorx.NewCodeError(400, "请选择商品") } // 计算订单金额 var totalAmount float64 respItems := make([]types.CartItem, 0, len(cartItems)) for _, cartItem := range cartItems { var product model.Product if err := l.svcCtx.DB.First(&product, cartItem.ProductID).Error; err != nil { continue } price := product.Price stock := product.Stock skuName := "" image := product.MainImage if cartItem.SkuID > 0 { var sku model.ProductSku if err := l.svcCtx.DB.First(&sku, cartItem.SkuID).Error; err == nil { price = sku.Price stock = sku.Stock skuName = sku.Name if sku.Image != "" { image = sku.Image } } } itemTotal := price * float64(cartItem.Quantity) totalAmount += itemTotal respItems = append(respItems, types.CartItem{ ID: uint(cartItem.ID), ProductID: cartItem.ProductID, SkuID: cartItem.SkuID, ProductName: product.Name, SkuName: skuName, Image: image, Price: price, Quantity: cartItem.Quantity, Selected: true, Stock: stock, }) } // 计算会员折扣 discountAmount := totalAmount * (1 - levelConfig.Discount) // 计算运费 shippingFee := float64(0) afterDiscount := totalAmount - discountAmount if afterDiscount < levelConfig.FreeShippingMin { shippingFee = 10 // 默认运费 } // 计算最大可用积分(最多抵扣20%) maxPointsDiscount := afterDiscount * 0.2 maxPointsUse := int(maxPointsDiscount * 100) if maxPointsUse > user.Points { maxPointsUse = user.Points } pointsDiscount := float64(maxPointsUse) / 100 // 最终支付金额 payAmount := afterDiscount + shippingFee resp = &types.OrderPreview{ Items: respItems, TotalAmount: totalAmount, DiscountAmount: discountAmount, ShippingFee: shippingFee, PayAmount: payAmount, MaxPointsUse: maxPointsUse, PointsDiscount: pointsDiscount, } return resp, nil }