feat: change preview

master
howell 4 years ago
parent 6aa3edbbf7
commit db235ddd74

@ -7,7 +7,6 @@ import (
"recook/configs"
"recook/internal/back"
"recook/internal/dbc"
"recook/internal/model/coupon"
"recook/internal/model/freight"
"recook/internal/model/goods"
"recook/internal/model/order_preview"
@ -61,8 +60,6 @@ func CreatePreviewNormalOrder(c *gin.Context) {
return
}
now := time.Now()
var ancestorID uint = 0
var myInfo user.Information
if err := dbc.DB.First(&myInfo, p.UserID).Error; err != nil {
@ -71,16 +68,12 @@ func CreatePreviewNormalOrder(c *gin.Context) {
}
ancestorID = myInfo.AncestorID
//todo
// 店主、店铺可以分享商品,通过分享链接直接下单的,商品佣金返还给分享者瑞币
sharerId := myInfo.ID
if p.InvitationNo != "" {
sharerId = uint(baseCode.Decode(p.InvitationNo))
}
preOrderInfo := &order_preview.Information{}
preOrderUniversalCoupon := &order_preview.CouponDetail{}
preOrderAddr := &order_preview.Addr{}
preOrderBrandCoupon := &order_preview.CouponDetail{}
preOrderGoods := &order_preview.GoodsDetail{}
actualAmount := decimal.NewFromFloat(0.0)
@ -171,7 +164,7 @@ func CreatePreviewNormalOrder(c *gin.Context) {
SkuList: []jcook.SkuQuantity{
{
goodsInfo.ThirdPartyId,
p.Quantity,
1,
},
},
}
@ -247,52 +240,7 @@ func CreatePreviewNormalOrder(c *gin.Context) {
vendorName = vendor.Username
}
}
// 品牌券 快递费不计入优惠券门槛
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, unitPrice.Mul(decimal.NewFromInt(int64(p.Quantity))), brandInfo.ID, now, now)
if maxBrandCouponReceiverMid.ID > 0 {
brandCouponReducePrice = decimal.NewFromInt(int64(maxBrandCouponReceiverMid.Cash))
}
// 购物券
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, unitPrice.Mul(decimal.NewFromInt(int64(p.Quantity))).Sub(brandCouponReducePrice), now, now)
if maxUniversalCouponReceiverMid.ID > 0 {
universeCouponReducePrice = decimal.NewFromInt(int64(maxUniversalCouponReceiverMid.Cash))
}
// todo 做判断,每次只能用一张优惠券,这里哪张面额大,用哪张减免
//新增秒杀模块
//判别是否是秒杀中的商品
var stock, _ = IfSecKill(time.Now(), p.SkuID)
if stock.Id > 0 {
//该商品在本次秒杀活动中
//判断库存
num := stock.SecKillStock.Sub(stock.SaleNum)
if num.IsZero() || num.LessThan(decimal.NewFromInt(0)) || num.LessThan(decimal.NewFromInt(int64(p.Quantity))) {
back.Err(c, "该秒杀商品库存不足")
return
}
}
//新增结束
/*
*/
actualAmount = unitPrice.Mul(decimal.NewFromInt(int64(p.Quantity))).Add(expressFee).Sub(brandCouponReducePrice).Sub(universeCouponReducePrice)
if stock.Id > 0 {
actualAmount = stock.SecKillDiscountPrice.Mul(decimal.NewFromInt(int64(p.Quantity))).Add(expressFee).Sub(brandCouponReducePrice).Sub(universeCouponReducePrice)
}
actualAmount = unitPrice.Mul(decimal.NewFromInt(int64(p.Quantity))).Add(expressFee)
var wallet user.Wallet
{
err = dbc.DB.First(&wallet, "user_id = ?", p.UserID).Error
@ -319,32 +267,19 @@ func CreatePreviewNormalOrder(c *gin.Context) {
{
{
preOrderInfo.AncestorID = ancestorID
preOrderInfo.ParentID = uint(myInfo.ParentID)
preOrderInfo.ParentID = myInfo.ParentID
preOrderInfo.SharerID = sharerId
preOrderInfo.LiveId = p.LiveId
preOrderInfo.UserID = p.UserID
//preOrderInfo.UserRole = myInfo.Role
preOrderInfo.Title = goodsInfo.GoodsName
preOrderInfo.BrandCouponTotalAmount = brandCouponReducePrice
preOrderInfo.UniverseCouponTotalAmount = universeCouponReducePrice
preOrderInfo.CoinTotalAmount = coinReducePrice
preOrderInfo.ExpressTotalFee = expressFee
preOrderInfo.GoodsTotalAmount = unitPrice.Mul(decimal.NewFromInt(int64(p.Quantity)))
// preOrderInfo.GoodsTotalCommission = commission.Mul(decimal.NewFromInt(int64(p.Quantity)))
//allAmount := unitPrice.Mul(decimal.NewFromInt(int64(p.Quantity)))
// 单笔收益 * 数量 * (总价价 - 优惠券 / 总价)
//preOrderInfo.GoodsTotalCommission = commission.Mul(decimal.NewFromInt(int64(p.Quantity))).
// Mul(allAmount).Sub(universeCouponReducePrice.Add(brandCouponReducePrice)).Div(allAmount)
preOrderInfo.GoodsTotalCommission = commission.Mul(decimal.NewFromInt(int64(p.Quantity)))
// beego.Info("commission", commission, "Quantity", p.Quantity, "allAmount", allAmount, "universeCouponReducePrice", universeCouponReducePrice, "brandCouponReducePrice", brandCouponReducePrice, "allAmount", allAmount)
preOrderInfo.ActualTotalAmount = actualAmount
preOrderInfo.Cost = cost
//若该商品在秒杀中,重新赋值
if stock.Id > 0 {
preOrderInfo.GoodsTotalAmount = stock.SecKillDiscountPrice.Mul(decimal.NewFromInt(int64(p.Quantity)))
preOrderInfo.GoodsTotalCommission = stock.SecKillCommission.Mul(decimal.NewFromInt(int64(p.Quantity)))
}
//赋值结束
err = tx.Create(&preOrderInfo).Error
if err != nil {
back.Err(c, err.Error())
@ -371,43 +306,6 @@ func CreatePreviewNormalOrder(c *gin.Context) {
}
}
// 保存优惠券
{
if maxBrandCouponReceiverMid.ID > 0 {
preOrderBrandCoupon.OrderID = preOrderInfo.ID
preOrderBrandCoupon.DeductedAmount = brandCouponReducePrice
preOrderBrandCoupon.BrandID = maxBrandCouponReceiverMid.BrandID
preOrderBrandCoupon.PersonalCouponID = maxBrandCouponReceiverMid.ID
preOrderBrandCoupon.Scope = maxBrandCouponReceiverMid.Scope
preOrderBrandCoupon.CouponID = maxBrandCouponReceiverMid.CouponID
preOrderBrandCoupon.CouponName = maxBrandCouponReceiverMid.Name
preOrderBrandCoupon.EndTime = maxBrandCouponReceiverMid.EndTime
err = tx.Create(&preOrderBrandCoupon).Error
if err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
}
if maxUniversalCouponReceiverMid.ID > 0 {
preOrderUniversalCoupon.OrderID = preOrderInfo.ID
preOrderUniversalCoupon.DeductedAmount = universeCouponReducePrice
preOrderUniversalCoupon.BrandID = maxUniversalCouponReceiverMid.BrandID
preOrderUniversalCoupon.PersonalCouponID = maxUniversalCouponReceiverMid.ID
preOrderUniversalCoupon.Scope = maxUniversalCouponReceiverMid.Scope
preOrderUniversalCoupon.CouponID = maxUniversalCouponReceiverMid.CouponID
preOrderUniversalCoupon.CouponName = maxUniversalCouponReceiverMid.Name
preOrderUniversalCoupon.EndTime = maxUniversalCouponReceiverMid.EndTime
err = tx.Create(&preOrderUniversalCoupon).Error
if err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
}
}
{
preOrderGoods.OrderID = preOrderInfo.ID
preOrderGoods.VendorID = goodsInfo.VendorID
@ -433,8 +331,6 @@ func CreatePreviewNormalOrder(c *gin.Context) {
preOrderGoods.PromotionEndTime = promotionGoods.EndTime
preOrderGoods.UnitPrice = unitPrice
preOrderGoods.PurchasePrice = sku.PurchasePrice
// preOrderGoods.TotalCommission = commission.Mul(decimal.NewFromInt(int64(p.Quantity)))
// 收益 / 单价 * (单价-(优惠券)/数量)
preOrderGoods.TotalCommission = preOrderInfo.GoodsTotalCommission
preOrderGoods.BrandCouponAmount = brandCouponReducePrice
preOrderGoods.UniverseCouponAmount = universeCouponReducePrice
@ -446,13 +342,6 @@ func CreatePreviewNormalOrder(c *gin.Context) {
preOrderGoods.Storehouse = goodsInfo.Storehouse
preOrderGoods.IsFerme = goodsInfo.IsFerme
if stock.Id > 0 {
preOrderGoods.UnitPrice = stock.SecKillDiscountPrice
preOrderGoods.PurchasePrice = stock.SecKillPurchase
preOrderGoods.TotalCommission = preOrderInfo.GoodsTotalCommission
preOrderGoods.GoodsAmount = stock.SecKillDiscountPrice.Mul(decimal.NewFromInt(int64(p.Quantity)))
}
err = tx.Create(&preOrderGoods).Error
if err != nil {
back.Err(c, err.Error())
@ -462,9 +351,6 @@ func CreatePreviewNormalOrder(c *gin.Context) {
}
}
tx.Commit()
//新增邮件提醒
go sendJTEmail(preOrderInfo.ID)
back.Suc(c, "操作成功", queryPreviewOrderGroup(preOrderInfo.ID))
}

@ -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

@ -46,7 +46,7 @@ func (a *Proxy) Stock(c *gin.Context) {
SkuList: []jcook2.SkuQuantity{
{
gs.ThirdPartyId,
p.Quantity,
1,
},
},
}

Loading…
Cancel
Save