Commit e715f459 authored by zhengyaoqiu's avatar zhengyaoqiu

feat(colorway): 算价逻辑补充

parent 6313d9f2
......@@ -32,6 +32,10 @@ type Product struct {
CreateAt time.Time `bson:"createAt,omitempty" json:"createAt,omitempty"`
}
func (receiver Product) FindPlatformStoreSku(platform types.Platform, store types.Store, route types.Route, skuId string) (ProductColorSkuPlatformStoreSku, bool) {
return receiver.Colors.FindPlatformStoreSku(platform, store, route, skuId)
}
type Products []Product
type ProductComposition struct {
......@@ -76,21 +80,39 @@ type ProductColor struct {
type ProductColors []ProductColor
func (receiver ProductColors) FindPlatformStoreSku(platform types.Platform, store types.Store, route types.Route, skuId string) (ProductColorSkuPlatformStoreSku, bool) {
for _, color := range receiver {
if productColorSkuPlatformStoreSku, ok := color.Skus.FindPlatformStoreSku(platform, store, route, skuId); ok {
return productColorSkuPlatformStoreSku, true
}
}
return ProductColorSkuPlatformStoreSku{}, false
}
type ProductColorSku struct {
Pc3SkuId string `bson:"pc3SkuId"`
Pc3ProductId string `bson:"pc3ProductId"`
SourceId string `bson:"sourceId"`
SiteId string `bson:"siteId"`
Size string `bson:"size"`
Stock int `bson:"stock"`
Price float64 `bson:"price"`
Currency string `bson:"currency"`
SubjectIds []string `bson:"subjectIds"`
ProductColorSkuPlatformStoreSkus []ProductColorSkuPlatformStoreSkus `bson:"productColorSkuPlatformStoreSkus"`
Pc3SkuId string `bson:"pc3SkuId"`
Pc3ProductId string `bson:"pc3ProductId"`
SourceId string `bson:"sourceId"`
SiteId string `bson:"siteId"`
Size string `bson:"size"`
Stock int `bson:"stock"`
Price float64 `bson:"price"`
Currency string `bson:"currency"`
SubjectIds []string `bson:"subjectIds"`
PlatformStoreSkus ProductColorSkuPlatformStoreSkus `bson:"platformStoreSkus"`
}
type ProductColorSkus []ProductColorSku
func (receiver ProductColorSkus) FindPlatformStoreSku(platform types.Platform, store types.Store, route types.Route, skuId string) (ProductColorSkuPlatformStoreSku, bool) {
for _, sku := range receiver {
if sku.Pc3SkuId == skuId {
return sku.PlatformStoreSkus.FindPlatformStoreSku(platform, store, route)
}
}
return ProductColorSkuPlatformStoreSku{}, false
}
type ProductTitle struct {
En string `bson:"en"`
Cn string `bson:"cn"`
......@@ -110,6 +132,7 @@ type ProductColorSkuPlatformStoreSku struct {
Price float64 `bson:"price"` // 最终价格
FixPrice *float64 `bson:"fixPrice,omitempty"` // 固定价格
FixMargin *float64 `bson:"fixMargin,omitempty"` // 固定加价率(影响计价)
FixedQty *int `bson:"fixedQty,omitempty"` // 虚拟库存
Rate float64 `bson:"rate"` // OriginCurrency -> Currency 的汇率
CnyRate float64 `bson:"cnyRate"` // Currency -> CNY 的汇率
Margin float64 `bson:"margin"` // 加价率
......@@ -126,3 +149,12 @@ type ProductColorSkuPlatformStoreSku struct {
}
type ProductColorSkuPlatformStoreSkus []ProductColorSkuPlatformStoreSku
func (receiver ProductColorSkuPlatformStoreSkus) FindPlatformStoreSku(platform types.Platform, store types.Store, route types.Route) (ProductColorSkuPlatformStoreSku, bool) {
for _, sku := range receiver {
if sku.Platform == platform && sku.Store == store && sku.Route == route {
return sku, true
}
}
return ProductColorSkuPlatformStoreSku{}, false
}
......@@ -31,7 +31,10 @@ func (l *UploadLogic) Upload(in *colorway.ProductUploadRequest) (*colorway.Produ
if err != nil {
return nil, err
}
ps := l.svcCtx.ProductConvert.Convert(productList.GetDesignerProducts())
ps, err := l.svcCtx.ProductConvert.Convert(productList.GetDesignerProducts())
if err != nil {
return nil, err
}
var writeModels []mongo.WriteModel
for _, p := range ps {
filter := bson.M{
......
package convert
import (
"context"
"errors"
"git.chillcy.com/golang/chillcy/pkg/gender"
"git.chillcy.com/golang/chillcy/pkg/slice"
"git.chillcy.com/golang/chillcy/project/pc4/pkg/rpc/pb/pc4"
"git.chillcy.com/golang/colorway/internal/pkg/database/mongo"
model "git.chillcy.com/golang/colorway/internal/pkg/database/mongo/model/product"
"git.chillcy.com/golang/colorway/internal/rpc/internal/svc/cache"
"git.chillcy.com/golang/colorway/internal/rpc/internal/svc/rate"
"go.mongodb.org/mongo-driver/bson"
mongo2 "go.mongodb.org/mongo-driver/mongo"
"sync"
)
type Product struct {
cache *cache.Cache
cache *cache.Cache
mongoManager *mongo.Manager
rate rate.Rate
brandRankCache cache.BrandRank
}
func NewProduct(cache *cache.Cache) *Product {
return &Product{cache: cache}
func NewProduct(cache *cache.Cache, mongoManager *mongo.Manager, rate rate.Rate, brandRankCache cache.BrandRank) *Product {
return &Product{cache: cache, mongoManager: mongoManager, rate: rate, brandRankCache: brandRankCache}
}
func (receiver *Product) Convert(designerProducts []*pc4.DesignerProduct) model.Products {
func (receiver *Product) Convert(designerProducts []*pc4.DesignerProduct) (model.Products, error) {
var ps model.Products
for _, designerProduct := range designerProducts {
sourceIds := getSourceIds(designerProduct)
......@@ -94,10 +103,23 @@ func (receiver *Product) Convert(designerProducts []*pc4.DesignerProduct) model.
}
}
}
p.Colors = buildProductColors(designerProduct.GetColorProducts(), ws, designerProduct.GetDesignerId())
var oldProductPointer *model.Product
oldProduct, err := receiver.mongoManager.ProductModel.FindOne(context.TODO(), bson.M{"styleId": p.StyleId})
if err != nil && !errors.Is(err, mongo2.ErrNoDocuments) {
return nil, err
}
if !errors.Is(err, mongo2.ErrNoDocuments) {
oldProductPointer = &oldProduct
}
platformStoreSkuConvert := NewPlatformStoreSku(receiver.mongoManager, receiver.rate, receiver.brandRankCache)
colors, err := buildProductColors(designerProduct.GetColorProducts(), ws, oldProductPointer, platformStoreSkuConvert)
if err != nil {
return nil, err
}
p.Colors = colors
ps = append(ps, p)
}
return ps
return ps, nil
}
func getCategory(category *pc4.CategoryV2) model.ProductCategory {
......@@ -113,15 +135,19 @@ func getCategory(category *pc4.CategoryV2) model.ProductCategory {
return pc
}
func buildProductColors(colorProducts []*pc4.ColorProduct, ws weightSelect, styleNumber string) model.ProductColors {
func buildProductColors(colorProducts []*pc4.ColorProduct, ws weightSelect, oldProductPointer *model.Product, platformStoreSkuConvert *PlatformStoreSku) (model.ProductColors, error) {
var pcs model.ProductColors
for _, colorProduct := range colorProducts {
pcs = append(pcs, buildProductColor(colorProduct, ws, styleNumber))
pc, err := buildProductColor(colorProduct, ws, oldProductPointer, platformStoreSkuConvert)
if err != nil {
return nil, err
}
pcs = append(pcs, pc)
}
return pcs
return pcs, nil
}
func buildProductColor(colorProduct *pc4.ColorProduct, ws weightSelect, styleNumber string) model.ProductColor {
func buildProductColor(colorProduct *pc4.ColorProduct, ws weightSelect, oldProductPointer *model.Product, platformStoreSkuConvert *PlatformStoreSku) (model.ProductColor, error) {
pc := model.ProductColor{}
once := &sync.Once{}
for _, productAndSkus := range colorProduct.GetProductAndSkusList() {
......@@ -142,7 +168,7 @@ func buildProductColor(colorProduct *pc4.ColorProduct, ws weightSelect, styleNum
}
for _, sku := range productAndSkus.GetSkus() {
pc.Skus = append(pc.Skus, model.ProductColorSku{
pcSku := model.ProductColorSku{
Pc3SkuId: sku.GetId(),
Pc3ProductId: product.GetId(),
SourceId: product.GetSourceId(),
......@@ -152,10 +178,16 @@ func buildProductColor(colorProduct *pc4.ColorProduct, ws weightSelect, styleNum
Price: sku.GetPriceDetail().GetNow(),
Currency: sku.GetPriceDetail().GetCurrency(),
SubjectIds: product.Subjects,
})
}
psSkus, err := platformStoreSkuConvert.Convert(product, sku, oldProductPointer)
if err != nil {
return model.ProductColor{}, err
}
pcSku.PlatformStoreSkus = psSkus
pc.Skus = append(pc.Skus, pcSku)
}
}
return pc
return pc, nil
}
func (receiver *Product) getWeightSelect(sourceIds []string) weightSelect {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment