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.

161 lines
6.3 KiB

package goods
import (
"recook/internal/define"
"recook/internal/model/order"
"github.com/shopspring/decimal"
)
var rate = decimal.NewFromFloat(1.03)
type Sku struct {
ID uint `gorm:"column:id;primary_key" json:"id"`
GoodsID uint `gorm:"column:goods_id" json:"goodsId"`
Name string `gorm:"column:name" json:"name"`
CombineID string `gorm:"column:combine_id" json:"combineId"`
PicURL string `gorm:"column:pic_url" json:"picUrl"`
Code string `gorm:"column:code" json:"code"`
PurchasePrice decimal.Decimal `gorm:"column:purchase_price" json:"purchasePrice"` //采购价
OriginalPrice decimal.Decimal `gorm:"column:original_price" json:"originalPrice"` // 原价
DiscountPrice decimal.Decimal `gorm:"column:discount_price" json:"discountPrice"` // 折扣价
CommissionRate decimal.Decimal `gorm:"column:commission_rate" json:"commissionRate"` // 佣金比
Commission decimal.Decimal `gorm:"column:commission" json:"commission"` // 佣金
SalePrice decimal.Decimal `json:"sale_price" gorm:"-"`
ControlPrice decimal.Decimal `gorm:"column:control_price" json:"controlPrice"` // 供应商最低控价
SalesVolume uint `gorm:"column:sales_volume" json:"salesVolume"` // 销售量 销售量只简单累加
Inventory uint `gorm:"column:inventory" json:"inventory"` // 库存量 可以直接补货
SalesVolumeInc uint `gorm:"column:sales_volume_inc" json:"salesVolumeInc"` // 销售量的增量
Coupon decimal.Decimal `gorm:"coupon" json:"coupon"`
GoodsNum string `gorm:"goods_num" json:"goodsNum"` //商品货号
BmSkuId string `gorm:"bm_sku_id" json:"bm_sku_id"` //舶茂的skuid
BmShopId string `gorm:"bm_shop_id" json:"bm_shop_id"` //舶茂的商家id
ThirdPartySkuId string `gorm:"column:third_party_sku_id" json:"thirdPartySkuId"` //第三方skuid
ThirdPartyType int `gorm:"column:third_party_type" json:"thirdPartySkuType"` //第三方类型
SaleInventory uint `json:"sale_inventory" gorm:"column:sale_inventory"`
Limit uint `json:"limit" gorm:"column:limit_num"`
Min uint `json:"min" gorm:"column:min_num"`
SalePurchasePrice decimal.Decimal `json:"sale_purchase_price" gorm:"column:sale_purchase_price"` // 批发供货价
SaleVolume2 uint `json:"sale_volume2" gorm:"column:sale_volume2"`
SaleVolumeInc2 uint `json:"sale_volume_inc2" gorm:"column:sale_volume_inc2"`
EffectTime int `json:"effect"`
EffectDayType int `json:"effect_day_type"`
ExtraPrice decimal.Decimal `json:"extra_price"`
SaleExtraPrice decimal.Decimal `json:"sale_extra_price"`
}
// TableName sets the insert table name for this struct type
func (r *Sku) TableName() string {
return "recook_goods_sku"
}
func (r *Sku) GetBase() decimal.Decimal {
cost := r.PurchasePrice.Mul(rate)
if !r.ExtraPrice.IsZero() {
cost = r.PurchasePrice.Add(r.ExtraPrice)
}
base := r.DiscountPrice.Sub(cost).Mul(decimal.NewFromFloat32(define.Coefficient))
return base.Round(2)
}
func (r *Sku) GetSelfProfit(level int) decimal.Decimal {
base := r.GetBase()
switch level {
case 0:
return decimal.Zero
case 1:
self := base.Mul(order.Self.GetProfit()).Round(2)
brand := base.Mul(order.Brand.GetProfit()).Round(2)
return self.Add(brand)
case 2:
// 店铺买
self := base.Mul(order.Self.GetProfit()).Round(2)
brand := base.Mul(order.Brand.GetProfit()).Round(2)
shop := base.Mul(order.Shop.GetProfit()).Round(2)
return self.Add(brand).Add(shop)
case 10:
// 子公司 100%自购
return base.Mul(order.All.GetProfit())
default:
return decimal.Zero
}
}
func (r *Sku) GetSalePrice(level int) decimal.Decimal {
if r.SalePurchasePrice.IsZero() {
return decimal.Zero
}
if level == 10 {
if !r.SaleExtraPrice.IsZero() {
return r.SalePurchasePrice.Add(r.SaleExtraPrice)
}
return r.SalePurchasePrice.Mul(rate).Round(2)
}
p := r.SalePurchasePrice
if !r.SaleExtraPrice.IsZero() {
p = r.SalePurchasePrice.Add(r.SaleExtraPrice)
} else {
p = r.SalePurchasePrice.Mul(rate)
}
s1 := p.Round(2).Mul(decimal.NewFromFloat(1.2)).Round(2)
return s1
}
type AllPrice struct {
OriginalPrice decimal.Decimal `gorm:"column:original_price" json:"originalPrice"` // 重新计算折扣价
DiscountPrice decimal.Decimal `gorm:"column:discount_price" json:"discountPrice"`
Commission decimal.Decimal `gorm:"column:commission" json:"commission"`
PurchasePrice decimal.Decimal `gorm:"column:purchase_price" json:"purchasePrice"`
Min uint `gorm:"column:min_num" json:"min"`
Limit uint `gorm:"column:limit_num" json:"limit"`
SalePrice decimal.Decimal `gorm:"column:sale_price" json:"sale_price"`
SalePurchasePrice decimal.Decimal `gorm:"column:sale_purchase_price" json:"-"`
ExtraPrice decimal.Decimal `gorm:"column:extra_price" json:"-"`
SaleExtraPrice decimal.Decimal `gorm:"column:sale_extra_price" json:"-"`
}
func (o AllPrice) GetSalePrice(level int) decimal.Decimal {
if o.SalePurchasePrice.IsZero() {
return decimal.Zero
}
if level == 10 {
if !o.SaleExtraPrice.IsZero() {
return o.SalePurchasePrice.Add(o.SaleExtraPrice)
}
return o.SalePurchasePrice.Mul(rate).Round(2)
}
p := o.SalePurchasePrice
if !o.SaleExtraPrice.IsZero() {
p = o.SalePurchasePrice.Add(o.SaleExtraPrice)
} else {
p = o.SalePurchasePrice.Mul(rate)
}
s1 := p.Round(2).Mul(decimal.NewFromFloat(1.2)).Round(2)
return s1
}
func (o AllPrice) GetSelfProfit(level int) decimal.Decimal {
base := o.Commission
switch level {
case 0:
return decimal.Zero
case 1:
self := base.Mul(order.Self.GetProfit()).Round(2)
brand := base.Mul(order.Brand.GetProfit()).Round(2)
return self.Add(brand)
case 2:
// 店铺买
self := base.Mul(order.Self.GetProfit()).Round(2)
brand := base.Mul(order.Brand.GetProfit()).Round(2)
shop := base.Mul(order.Shop.GetProfit()).Round(2)
return self.Add(brand).Add(shop)
case 10:
// 子公司 100%自购
return base.Mul(order.All.GetProfit())
default:
return decimal.Zero
}
}