|
|
|
@ -4,7 +4,6 @@ import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"recook/internal/back"
|
|
|
|
|
"recook/internal/dbc"
|
|
|
|
|
"recook/internal/model/coupon"
|
|
|
|
|
"recook/internal/model/goods"
|
|
|
|
|
"recook/internal/model/order_preview"
|
|
|
|
|
"recook/internal/model/promotion"
|
|
|
|
@ -16,7 +15,6 @@ import (
|
|
|
|
|
"strconv"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/astaxie/beego"
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
"github.com/golangkit/formatime"
|
|
|
|
|
"github.com/jinzhu/gorm"
|
|
|
|
@ -46,7 +44,6 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) {
|
|
|
|
|
}
|
|
|
|
|
ancestorID = myInfo.AncestorID
|
|
|
|
|
parentId := myInfo.ParentID
|
|
|
|
|
now := time.Now()
|
|
|
|
|
|
|
|
|
|
trolleyInfoList := make([]*shopping_trolley.Information, 0, 0)
|
|
|
|
|
for _, id := range p.IDs {
|
|
|
|
@ -216,25 +213,8 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) {
|
|
|
|
|
Storehouse: goodsInfo.Storehouse,
|
|
|
|
|
IsFerme: goodsInfo.IsFerme,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
新增秒杀拦截
|
|
|
|
|
*/
|
|
|
|
|
stock, _ := IfSecKill(time.Now(), v.SkuID)
|
|
|
|
|
if stock.Id > 0 {
|
|
|
|
|
if stock.RealStock.LessThan(decimal.NewFromInt(int64(v.Quantity))) {
|
|
|
|
|
back.Err(c, "库存不足")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
one.UnitPrice = stock.SecKillDiscountPrice
|
|
|
|
|
one.PurchasePrice = stock.SecKillPurchase
|
|
|
|
|
one.TotalCommission = stock.SecKillCommission.Mul(decimal.NewFromInt(int64(v.Quantity)))
|
|
|
|
|
one.GoodsAmount = stock.SecKillDiscountPrice.Mul(decimal.NewFromInt(int64(v.Quantity)))
|
|
|
|
|
}
|
|
|
|
|
preOrderGoodsList = append(preOrderGoodsList, &one)
|
|
|
|
|
goodsTotalAmount = goodsTotalAmount.Add(one.GoodsAmount)
|
|
|
|
|
// 0528 折扣统计完后计算总佣金
|
|
|
|
|
// goodsTotalCommission = goodsTotalCommission.Add(one.TotalCommission)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (len(jg) != 0 || len(ojg) != 0) && p.Address == "" && defaultAddr.ID == 0 {
|
|
|
|
@ -242,97 +222,6 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
couponList := make([]order_preview.CouponDetail, 0, 0)
|
|
|
|
|
brandCouponTotalAmount := decimal.NewFromFloat(0.0)
|
|
|
|
|
// 统计下每个品牌下的金额
|
|
|
|
|
for k, brand := range brandMap {
|
|
|
|
|
brandTotalAmount := decimal.NewFromFloat(0.0)
|
|
|
|
|
for _, m := range preOrderGoodsList {
|
|
|
|
|
if m.BrandID == k {
|
|
|
|
|
brandTotalAmount = brandTotalAmount.Add(m.GoodsAmount)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 计算是否可以使用品牌优惠券
|
|
|
|
|
var maxBrandCouponReceiverMid coupon.ReceiverMid
|
|
|
|
|
dbc.DB.Select("id, coupon_id, user_id, status, name, threshold, MAX(cash) AS cash, scope, brand_id, start_time, end_time").
|
|
|
|
|
First(&maxBrandCouponReceiverMid, "user_id = ? AND status = 0 AND threshold <= ? "+
|
|
|
|
|
"AND scope = 1 AND brand_id = ? "+
|
|
|
|
|
"AND start_time < ? AND end_time > ?", p.UserID, brandTotalAmount, k, now, now)
|
|
|
|
|
|
|
|
|
|
if maxBrandCouponReceiverMid.ID > 0 {
|
|
|
|
|
one := order_preview.CouponDetail{
|
|
|
|
|
BrandID: brand.ID,
|
|
|
|
|
PersonalCouponID: maxBrandCouponReceiverMid.ID,
|
|
|
|
|
Scope: 1,
|
|
|
|
|
CouponID: maxBrandCouponReceiverMid.CouponID,
|
|
|
|
|
CouponName: maxBrandCouponReceiverMid.Name,
|
|
|
|
|
DeductedAmount: decimal.NewFromInt(int64(maxBrandCouponReceiverMid.Cash)),
|
|
|
|
|
}
|
|
|
|
|
couponList = append(couponList, one)
|
|
|
|
|
brandCouponTotalAmount = brandCouponTotalAmount.Add(one.DeductedAmount)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 计算品牌优惠券折算到每个商品上的抵扣价格
|
|
|
|
|
for _, couponDetail := range couponList {
|
|
|
|
|
brandInternalGoodsList := make([]*order_preview.GoodsDetail, 0, 0)
|
|
|
|
|
brandInternalGoodsTotalAmount := decimal.NewFromFloat(0.0)
|
|
|
|
|
for i, v := range preOrderGoodsList {
|
|
|
|
|
if v.BrandID == couponDetail.BrandID {
|
|
|
|
|
brandInternalGoodsTotalAmount = brandInternalGoodsTotalAmount.Add(v.GoodsAmount)
|
|
|
|
|
brandInternalGoodsList = append(brandInternalGoodsList, preOrderGoodsList[i])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
length := len(brandInternalGoodsList)
|
|
|
|
|
previousTotalAmount := decimal.NewFromFloat(0.0)
|
|
|
|
|
for i, v := range brandInternalGoodsList {
|
|
|
|
|
if i == length-1 {
|
|
|
|
|
v.BrandCouponAmount = couponDetail.DeductedAmount.Sub(previousTotalAmount)
|
|
|
|
|
} else {
|
|
|
|
|
rate := v.GoodsAmount.Div(brandInternalGoodsTotalAmount)
|
|
|
|
|
v.BrandCouponAmount = couponDetail.DeductedAmount.Mul(rate)
|
|
|
|
|
// 修改每件商品的佣金 A商品优惠券抵扣金额Ax=x*a/(a+b+c+...+n),实际售价Ra=a-Ax,实际佣金Ra’=a’*Ra/a
|
|
|
|
|
previousTotalAmount = previousTotalAmount.Add(v.BrandCouponAmount)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 全场通用券
|
|
|
|
|
universeCouponTotalAmount := decimal.NewFromFloat(0.0)
|
|
|
|
|
var maxUniversalCouponReceiverMid coupon.ReceiverMid
|
|
|
|
|
dbc.DB.Select("id, coupon_id, user_id, status, name, threshold, MAX(cash) AS cash, scope, brand_id, start_time, end_time").
|
|
|
|
|
First(&maxUniversalCouponReceiverMid, "user_id = ? AND status = 0 AND threshold <= ? "+
|
|
|
|
|
"AND scope = 0 "+
|
|
|
|
|
"AND start_time < ? AND end_time > ?", p.UserID, goodsTotalAmount.Sub(brandCouponTotalAmount), now, now)
|
|
|
|
|
|
|
|
|
|
if maxUniversalCouponReceiverMid.ID > 0 {
|
|
|
|
|
one := order_preview.CouponDetail{
|
|
|
|
|
PersonalCouponID: maxUniversalCouponReceiverMid.ID,
|
|
|
|
|
Scope: 0,
|
|
|
|
|
CouponID: maxUniversalCouponReceiverMid.CouponID,
|
|
|
|
|
CouponName: maxUniversalCouponReceiverMid.Name,
|
|
|
|
|
DeductedAmount: decimal.NewFromInt(int64(maxUniversalCouponReceiverMid.Cash)),
|
|
|
|
|
EndTime: maxUniversalCouponReceiverMid.EndTime,
|
|
|
|
|
}
|
|
|
|
|
couponList = append(couponList, one)
|
|
|
|
|
universeCouponTotalAmount = one.DeductedAmount
|
|
|
|
|
|
|
|
|
|
// 计算通用券折算到每个商品上的优惠价格
|
|
|
|
|
length := len(preOrderGoodsList)
|
|
|
|
|
previousTotalAmount := decimal.NewFromFloat(0.0)
|
|
|
|
|
for i, v := range preOrderGoodsList {
|
|
|
|
|
if i == length-1 { // 保证没有循环小数
|
|
|
|
|
v.UniverseCouponAmount = universeCouponTotalAmount.Sub(previousTotalAmount)
|
|
|
|
|
} else {
|
|
|
|
|
rate := v.GoodsAmount.Div(goodsTotalAmount) // 每件商品的总金额占用整个订单金额的比重
|
|
|
|
|
v.UniverseCouponAmount = universeCouponTotalAmount.Mul(rate)
|
|
|
|
|
previousTotalAmount = previousTotalAmount.Add(v.UniverseCouponAmount)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 优惠券计算完成以后 修改每件商品的佣金 A商品优惠券抵扣金额Ax=x*a/(a+b+c+...+n),实际售价Ra=a-Ax,实际佣金Ra’=a’*Ra/a
|
|
|
|
|
for _, v := range preOrderGoodsList {
|
|
|
|
|
v.TotalCommission = v.GoodsAmount.Sub(v.UniverseCouponAmount).Sub(v.BrandCouponAmount).Mul(v.TotalCommission.Div(v.GoodsAmount))
|
|
|
|
|
}
|
|
|
|
@ -395,58 +284,16 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 计算瑞币折算到每个商品上的抵扣 瑞币可以抵扣物流费用,计算每个商品与总金额占比时,考虑加上运费
|
|
|
|
|
coinTotalAmount := decimal.NewFromFloat(0.0)
|
|
|
|
|
actualTotalAmount := goodsTotalAmount.Add(expressTotalFee).Sub(universeCouponTotalAmount).Sub(brandCouponTotalAmount)
|
|
|
|
|
var wallet user.Wallet
|
|
|
|
|
{
|
|
|
|
|
if err = dbc.DB.First(&wallet, "user_id = ?", p.UserID).Error; err != nil {
|
|
|
|
|
back.Err(c, err.Error())
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if wallet.Coin.GreaterThanOrEqual(decimal.NewFromInt(1)) { // 瑞币金额不小于1块钱时可以抵扣
|
|
|
|
|
//walletCoinAmount := decimal.NewFromInt(int64(wallet.Coin)).Div(decimal.NewFromInt(100)) // 将瑞币折算为实际金额
|
|
|
|
|
walletCoinAmount := wallet.Coin
|
|
|
|
|
if actualTotalAmount.GreaterThanOrEqual(walletCoinAmount) { // 只能抵扣部分价格, 全部花光瑞比
|
|
|
|
|
coinTotalAmount = walletCoinAmount
|
|
|
|
|
actualTotalAmount = actualTotalAmount.Sub(coinTotalAmount)
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
// 不能全部花光瑞比,瑞比足够支付时 将瑞币直接使用掉 订单金额为0
|
|
|
|
|
coinTotalAmount = actualTotalAmount
|
|
|
|
|
actualTotalAmount = decimal.NewFromFloat(0.0)
|
|
|
|
|
|
|
|
|
|
// 如果可以全部抵扣
|
|
|
|
|
for _, v := range preOrderGoodsList {
|
|
|
|
|
v.CoinAmount = v.GoodsAmount.Sub(v.BrandCouponAmount).Sub(v.UniverseCouponAmount)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 折算到每件商品上的抵扣
|
|
|
|
|
length := len(preOrderGoodsList)
|
|
|
|
|
previousTotalAmount := decimal.NewFromFloat(0.0)
|
|
|
|
|
for i, v := range preOrderGoodsList {
|
|
|
|
|
if i == length-1 { // 保证没有循环小数
|
|
|
|
|
v.CoinAmount = coinTotalAmount.Sub(previousTotalAmount)
|
|
|
|
|
} else {
|
|
|
|
|
rate := (v.GoodsAmount.Add(v.ExpressFee)).Div(goodsTotalAmount.Add(expressTotalFee))
|
|
|
|
|
v.CoinAmount = coinTotalAmount.Mul(rate).Round(2)
|
|
|
|
|
previousTotalAmount = previousTotalAmount.Add(v.CoinAmount)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
actualTotalAmount := goodsTotalAmount.Add(expressTotalFee)
|
|
|
|
|
|
|
|
|
|
for i, v := range preOrderGoodsList {
|
|
|
|
|
acc := v.GoodsAmount.Add(v.ExpressFee).Sub(v.BrandCouponAmount).Sub(v.UniverseCouponAmount).Sub(v.CoinAmount)
|
|
|
|
|
preOrderGoodsList[i].ActualAmount = acc
|
|
|
|
|
beego.Info(v.GoodsAmount, v.UnitPrice, v.ExpressFee, v.BrandCouponAmount, v.UniverseCouponAmount, v.CoinAmount, " = ", preOrderGoodsList[i].ActualAmount)
|
|
|
|
|
if preOrderGoodsList[i].ActualAmount.LessThan(decimal.NewFromFloat(0)) {
|
|
|
|
|
beego.Warning(v.GoodsAmount, v.UnitPrice, v.ExpressFee, v.BrandCouponAmount, v.UniverseCouponAmount, v.CoinAmount, " = ", preOrderGoodsList[i].ActualAmount)
|
|
|
|
|
back.Fail(c, "支付金额异常")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
goodsTotalCommission = goodsTotalCommission.Add(v.TotalCommission)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -456,12 +303,12 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) {
|
|
|
|
|
|
|
|
|
|
preOrderInfo := order_preview.Information{
|
|
|
|
|
AncestorID: ancestorID,
|
|
|
|
|
ParentID: uint(parentId),
|
|
|
|
|
ParentID: parentId,
|
|
|
|
|
UserID: p.UserID,
|
|
|
|
|
SharerID: 0,
|
|
|
|
|
Title: preOrderGoodsList[0].GoodsName + "等多件",
|
|
|
|
|
BrandCouponTotalAmount: brandCouponTotalAmount,
|
|
|
|
|
UniverseCouponTotalAmount: universeCouponTotalAmount,
|
|
|
|
|
BrandCouponTotalAmount: decimal.Zero,
|
|
|
|
|
UniverseCouponTotalAmount: decimal.Zero,
|
|
|
|
|
CoinTotalAmount: coinTotalAmount,
|
|
|
|
|
ExpressTotalFee: expressTotalFee,
|
|
|
|
|
GoodsTotalAmount: goodsTotalAmount,
|
|
|
|
@ -513,16 +360,6 @@ func CreatePreviewShoppingTrolleyOrder(c *gin.Context) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for i := range couponList {
|
|
|
|
|
couponDetail := couponList[i]
|
|
|
|
|
couponDetail.OrderID = preOrderInfo.ID
|
|
|
|
|
if err = tx.Create(&couponDetail).Error; err != nil {
|
|
|
|
|
back.Err(c, err.Error())
|
|
|
|
|
tx.Rollback()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for i := range preOrderGoodsList {
|
|
|
|
|
goodsDetail := preOrderGoodsList[i]
|
|
|
|
|
goodsDetail.OrderID = preOrderInfo.ID
|
|
|
|
|