You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
3.5 KiB

4 years ago
package shop
import (
"recook/internal/define"
4 years ago
"recook/internal/model/order"
"recook/internal/model/user"
4 years ago
"github.com/jinzhu/gorm"
4 years ago
"github.com/shopspring/decimal"
4 years ago
)
func OrderProfit(od order.Information, tx *gorm.DB) error {
var u1 user.Information
4 years ago
tx.First(&u1, "id = ?", od.UserID)
4 years ago
var s1 user.Information
4 years ago
tx.First(&s1, "id = ?", od.SharerID)
4 years ago
4 years ago
var ods []order.GoodsDetail
tx.Find(&ods, "order_id = ?", od.ID)
base := decimal.Zero
for _, v := range ods {
base = base.Add(v.GetBase().Mul(decimal.NewFromInt(int64(v.Quantity))))
}
condition := od.SharerID == od.UserID
switch od.OrderType {
case 1: // 零售收益
switch u1.Level {
case 0:
// 会员买
if condition {
// 自购平台100%
return nil
} else if s1.Level != 0 {
if s1.Level == 10 {
// 子公司导购获取全部导购收益
if err := tx.Create(order.CreateProfit(u1.RootID, order.All, base, od.ID)).Error; err != nil {
return err
}
} else {
// 40%导购补贴
if err := tx.Create(order.CreateProfit(od.SharerID, order.Guide, base, od.ID)).Error; err != nil {
return err
}
// 10%品牌补贴
if err := tx.Create(order.CreateProfit(od.SharerID, order.Brand, base, od.ID)).Error; err != nil {
return err
}
spID := od.SharerID
if s1.Level == 1 {
var sp1 user.Information
if err := tx.First(&sp1, "id = ?", s1.ParentID).Error; err != nil {
return err
}
spID = sp1.ID
}
// 20%开店补贴
if err := tx.Create(order.CreateProfit(spID, order.Shop, base, od.ID)).Error; err != nil {
return err
}
// 30%店铺补贴
if err := tx.Create(order.CreateProfit(u1.RootID, order.Company, base, od.ID)).Error; err != nil {
return err
}
}
}
case 1:
// 店主买
if err := tx.Create(order.CreateProfit(od.UserID, order.Self, base, od.ID)).Error; err != nil {
return err
}
if err := tx.Create(order.CreateProfit(od.UserID, order.Brand, base, od.ID)).Error; err != nil {
return err
}
if err := tx.Create(order.CreateProfit(u1.ParentID, order.Shop, base, od.ID)).Error; err != nil {
return err
}
// 30%店铺补贴
if err := tx.Create(order.CreateProfit(u1.RootID, order.Company, base, od.ID)).Error; err != nil {
return err
}
case 2:
// 店铺买
r1 := order.CreateProfit(od.UserID, order.Self, base, od.ID)
r2 := order.CreateProfit(od.UserID, order.Brand, base, od.ID)
r3 := order.CreateProfit(od.UserID, order.Shop, base, od.ID)
if err := tx.Create(r1).Error; err != nil {
return err
}
if err := tx.Create(r2).Error; err != nil {
return err
}
if err := tx.Create(r3).Error; err != nil {
return err
}
4 years ago
// 30%店铺补贴
if err := tx.Create(order.CreateProfit(u1.RootID, order.Company, base, od.ID)).Error; err != nil {
return err
}
case 10:
// 子公司 100%自购
if err := tx.Create(order.CreateProfit(od.UserID, order.All, base, od.ID)).Error; err != nil {
return err
}
4 years ago
}
case 2: // 批发收益
if u1.Level == 2 && u1.IsOffline {
// 实体店产生批发收益给子公司
extraBase := decimal.Zero
for _, v := range ods {
extra := v.UnitPrice.Sub(v.PurchasePrice).Mul(decimal.NewFromFloat(0.2)).Round(2)
extraBase = extraBase.Add(
extra.Mul(decimal.NewFromFloat(define.Coefficient).Round(2)).Mul(decimal.NewFromInt(int64(v.Quantity))))
}
if err := tx.Create(order.CreateProfit(u1.RootID, order.Sale, base, od.ID)).Error; err != nil {
return err
}
}
4 years ago
}
return nil
4 years ago
}