From c0765f153489da0c762cc7b26320708c7e20f00b Mon Sep 17 00:00:00 2001 From: howell <2827207845@qq.com> Date: Thu, 9 Dec 2021 13:17:13 +0800 Subject: [PATCH] feat: sku --- configs/config.go | 2 +- internal/dbc/mysql.go | 8 +- internal/v2/controller/task/jcook.go | 381 +++++++++++++++------------ internal/v2/lib/jcook/jcook.go | 13 + 4 files changed, 228 insertions(+), 176 deletions(-) diff --git a/configs/config.go b/configs/config.go index 2381d26..e41bf3f 100644 --- a/configs/config.go +++ b/configs/config.go @@ -185,7 +185,7 @@ const ( ConfigJCookAppKey = "5372e576b288430e41057bbb66c34d40" ConfigJCookAppSecret = "7aa6b89426f8fba6b95969331eb62f06" ConfigJCookAppChannelID = 1010246 - ConfigJCookUrl = "http://120.55.167.78:8091/api/v1/open/" + ConfigJCookUrl = "http://jcook.com.cn/api/v1/open/" ConfigJCookMqUser = "jcook11595979048443904" ConfigJCookMqPwd = "aGZ0R6" ConfigJCookMqHost = "120.55.167.78" diff --git a/internal/dbc/mysql.go b/internal/dbc/mysql.go index 33a3dd4..1896644 100755 --- a/internal/dbc/mysql.go +++ b/internal/dbc/mysql.go @@ -41,7 +41,7 @@ func SetupMysql() { } else { c = &MysqlConfig{ - Dsn: "db_recook_super:sduEb9MTSiqhweXGpxa0@tcp(112.124.200.206:3306)/db_recook?timeout=3s&readTimeout=3s&writeTimeout=3s&parseTime=true&loc=Local&charset=utf8mb4,utf8", + Dsn: "root:@Cywnulls123@tcp(127.0.0.1:3306)/db_recook?timeout=3s&readTimeout=3s&writeTimeout=3s&parseTime=true&loc=Local&charset=utf8mb4,utf8", Idle: 10, Active: 500, } @@ -95,9 +95,9 @@ func SetupNewMysql() { } } else { err := mysql2.InitMysql(&mysql2.DbConfig{ - Username: "db_recook_super", - Password: "sduEb9MTSiqhweXGpxa0", - Host: "112.124.200.206", + Username: "root", + Password: "@Cywnulls123", + Host: "127.0.0.1", Port: 3306, Extend: "timeout=3s&readTimeout=3s&writeTimeout=3s&parseTime=true&loc=Local&charset=utf8mb4,utf8\n", LogLevel: 4, diff --git a/internal/v2/controller/task/jcook.go b/internal/v2/controller/task/jcook.go index beaa793..f37049f 100644 --- a/internal/v2/controller/task/jcook.go +++ b/internal/v2/controller/task/jcook.go @@ -68,6 +68,9 @@ func SyncAllSku() { var page uint = 1 var size uint = 20 + //if err := SyncPageData(page, size, cate); err != nil { + // fmt.Println(err) + //} for { if err := SyncPageData(page, size, cate); err != nil { if err == empty { @@ -95,21 +98,21 @@ func SyncPageData(page, size uint, categories []RecookJCookCategory) error { if len(skuEntries.Entries) == 0 { return empty } - gs := make([]goods.RecookGoodsInfoModel, 0) - gsk := make([]goods.RecookGoodsSkuModel, 0) + //gs := make([]goods.RecookGoodsInfoModel, 0) + //gsk := make([]goods.RecookGoodsSkuModel, 0) skuMap := make(map[uint]jcook.SkuInfo) - skuDetailMap := make(map[uint]*jcook.SkuDetailResp) - mp := make([]goods.RecookGoodsMainPhotoModel, 0) - dp := make([]goods.RecookGoodsDetailPhotoModel, 0) - attr := make([]goods.RecookGoodsAttributeModel, 0) - invoice := make([]goods.RecookSkuInvoiceModel, 0) - attrMap := make(map[uint]goods.RecookGoodsAttributeModel) + //skuDetailMap := make(map[uint]*jcook.SkuDetailResp) + //mp := make([]goods.RecookGoodsMainPhotoModel, 0) + //dp := make([]goods.RecookGoodsDetailPhotoModel, 0) + //attr := make([]goods.RecookGoodsAttributeModel, 0) + //invoice := make([]goods.RecookSkuInvoiceModel, 0) + //attrMap := make(map[uint]goods.RecookGoodsAttributeModel) - do := downloader.New(nil, "/jcook", 10) - do.Start() + //do := downloader.New(nil, "/jcook", 10) + //do.Start() if e := mysql2.Db.Transaction(func(tx *gorm.DB) error { for _, v := range skuEntries.Entries { - var t goods.RecookGoodsInfoModel + var t goods.RecookGoodsSkuModel if v.Kind == 0 || v.BrandName == "" { continue } @@ -126,7 +129,7 @@ func SyncPageData(page, size uint, categories []RecookJCookCategory) error { if rCate == "" { continue } - tx.First(&t, "third_party_id = ? AND third_party_type = 3", v.SkuID) + tx.First(&t, "third_party_sku_id = ? AND third_party_type = 3", v.SkuID) if t.Id > 0 { continue } @@ -161,44 +164,10 @@ func SyncPageData(page, size uint, categories []RecookJCookCategory) error { return err } } - var vendorID uint = 1800 - if v.Kind == 2 { - vendorID = 2000 - } - - var status uint = 0 - if v.Status && v.Yn { - status = 1 - } - gs = append(gs, goods.RecookGoodsInfoModel{ - BrandID: bt.Id, - VendorID: vendorID, - GoodsName: v.SkuName, - Description: "", - Material: "", - Weight: decimal.Zero, - Hash: tools.GenerateGoodsHashSign(), - IsJoinTeamPerformance: 1, - CreatedAt: formatime.NewSecondNow(), - UpdatedAt: formatime.NewSecondNow(), - ThirdPartyId: v.SkuID, - ThirdPartyType: goods.RecookGoodsInfoJCook, - FirstCategoryID: first.Id, - SecondCategoryID: second.Id, - JCookPublishStatus: status, - }) - if err := tx.Model(bt).Update("goods_count", gorm.Expr("goods_count + 1")).Error; err != nil { - log.Println(err.Error()) - return err - } - } - if len(gs) == 0 { - return nil } - if err := tx.Create(&gs).Error; err != nil { - log.Println(err.Error()) - return err + if len(skuMap) == 0 { + return nil } ids := make([]uint, 0) @@ -206,155 +175,225 @@ func SyncPageData(page, size uint, categories []RecookJCookCategory) error { ids = append(ids, k) } - rq := jcook.SkuDetailReq{ + rq := jcook.SkuBrotherReq{ SkuIDSet: ids, } - var res []jcook.SkuDetailResp - if err := c.Exec(rq, &res); err != nil { + var bes []jcook.SkuBrotherResp + if err := c.Exec(rq, &bes); err != nil { return err } - - for vi, v := range res { - skuDetailMap[v.SkuDetailBase.SkuID] = &res[vi] - } - for _, v := range gs { - color := skuDetailMap[v.ThirdPartyId].SkuDetailBase.Color - if strings.TrimSpace(color) == ""{ - color = "标准" + for _, v := range bes { + var res []jcook.SkuDetailResp + rq2 := jcook.SkuDetailReq{ + SkuIDSet: v.BrotherSkuIDs, } - t := goods.RecookGoodsAttributeModel{ - GoodsId: v.Id, - Name: "规格", - Value: color, + if err := c.Exec(rq2, &res); err != nil { + return err } - attr = append(attr, t) - } - if err := tx.Create(&attr).Error; err != nil { - log.Println(err.Error()) - return err - } - for _, v := range attr { - attrMap[v.GoodsId] = v - } - for _, v := range gs { - raw := skuMap[v.ThirdPartyId].MainPhoto - do.AddTask(raw) - color := skuDetailMap[v.ThirdPartyId].SkuDetailBase.Color - if strings.TrimSpace(color) == ""{ - color = "标准" - } - gsk = append(gsk, goods.RecookGoodsSkuModel{ - GoodsId: v.Id, - Name: color, - CombineId: strconv.Itoa(int(attrMap[v.Id].Id)), - PicURL: do.GetPath(raw), - Code: skuMap[v.ThirdPartyId].UpcCode, - PurchasePrice: skuMap[v.ThirdPartyId].SupplyPrice, - OriginalPrice: skuMap[v.ThirdPartyId].SupplyPrice, - ControlPrice: skuMap[v.ThirdPartyId].SupplyPrice, - ThirdPartySkuId: strconv.Itoa(int(v.ThirdPartyId)), - ThirdPartyType: goods.RecookGoodsInfoJCook, - }) - if len(skuDetailMap[v.ThirdPartyId].Images) == 1 { - skuDetailMap[v.ThirdPartyId].Images = append(skuDetailMap[v.ThirdPartyId].Images, jcook.SkuImage{ - Url: skuDetailMap[v.ThirdPartyId].Images[0].Url, - IsPrimer: false, - OrderSort: 1, - }) + var gs1 goods.RecookGoodsInfoModel + VendorID := 1800 + rCate := "" + for _, cate := range categories { + if res[0].SkuDetailBase.CategoryThirdName == cate.JCookCategory { + rCate = cate.RecookCategory + break + } } - for ki, k := range skuDetailMap[v.ThirdPartyId].Images { - do.AddTask(k.Url) - master := 0 - if k.IsPrimer { - master = 1 + var second goods.RecookGoodsCategoryModel + tx.First(&second, "name = ? AND parent_id <> 0", rCate) + + var first goods.RecookGoodsCategoryModel + tx.First(&first, "id = ?", second.ParentId) + + name := res[0].SkuDetailBase.SkuName + name = strings.Replace(name, res[0].SkuDetailBase.Color, "", -1) + name = strings.Replace(name, res[0].SkuDetailBase.Size, "", -1) + name = strings.Replace(name, res[0].SkuDetailBase.Model, "", -1) + weight := res[0].SkuDetailBase.Weight + var bt goods.RecookGoodsBrandModel + tx.First(&bt, "name = ?", res[0].SkuDetailBase.BrandName) + gsk1 := make(map[uint]goods.RecookGoodsSkuModel) + skuAttrMap := make(map[uint][]string) + for _, j := range res { + if j.SkuDetailBase.Kind == 2 { + VendorID = 2000 } - mp = append(mp, goods.RecookGoodsMainPhotoModel{ - GoodsId: v.Id, - Url: do.GetPath(k.Url), - IsMaster: master, - Name: "api", - OrderNo: ki, - Width: 0, - Height: 0, - }) + var t1 goods.RecookGoodsSkuModel + tx.First(&t1, "third_party_sku_id = ? AND third_party_type = 3", j.SkuDetailBase.SkuID) + if t1.Id > 0 { + mysql2.Db.First(&gs1, "id = ?", t1.GoodsId) + } else { + name1 := strings.Trim(strings.Join([]string{j.SkuDetailBase.Color, j.SkuDetailBase.Size}, "+"), "+") + if j.SkuDetailBase.Color != "" { + skuAttrMap[j.SkuDetailBase.SkuID] = append(skuAttrMap[j.SkuDetailBase.SkuID], j.SkuDetailBase.Color) + } + if j.SkuDetailBase.Size != "" { + skuAttrMap[j.SkuDetailBase.SkuID] = append(skuAttrMap[j.SkuDetailBase.SkuID], j.SkuDetailBase.Size) + } + if len(skuAttrMap[j.SkuDetailBase.SkuID]) == 0 { + skuAttrMap[j.SkuDetailBase.SkuID] = append(skuAttrMap[j.SkuDetailBase.SkuID], "") + } + if len(name) == 0 { + name1 = "标准" + } + gsk1[j.SkuDetailBase.SkuID] = goods.RecookGoodsSkuModel{ + GoodsId: 0, + Name: name1, + CombineId: "", + PicURL: j.SkuDetailBase.MainPhoto, + Code: j.SkuDetailBase.UpcCode, + PurchasePrice: j.SkuDetailBase.SupplyPrice, + OriginalPrice: j.SkuDetailBase.GuidePrice, + DiscountPrice: decimal.Zero, + CommissionRate: decimal.Zero, + Commission: decimal.Zero, + ControlPrice: j.SkuDetailBase.SupplyPrice, + SalesVolume: 0, + Inventory: 0, + SalesVolumeInc: 0, + Coupon: decimal.Decimal{}, + GoodsNum: "", + BmSkuId: "", + BmShopId: "", + ThirdPartySkuId: strconv.Itoa(int(j.SkuDetailBase.SkuID)), + ThirdPartyType: 3, + TMallPrice: "", + TMallUrl: "", + JdPrice: "", + JdUrl: "", + GysSkuID: 0, + } + } + } + if len(gsk1) == 0 { + continue } + if gs1.Id == 0 { + gs1 = goods.RecookGoodsInfoModel{ + BrandID: bt.Id, + VendorID: uint(VendorID), + GoodsName: name, + Description: "", + Material: "", + FirstCategoryID: first.Id, + SecondCategoryID: second.Depth, + PublishStatus: 0, + FreightID: 0, + Weight: decimal.NewFromFloat(weight), + Hash: tools.GenerateGoodsHashSign(), + IsJoinTeamPerformance: 0, + CreatedAt: formatime.NewSecondNow(), + UpdatedAt: formatime.NewSecondNow(), + JCookPublishStatus: 1, + } - reg := regexp.MustCompile("background-image:url\\((?s:(.*?))\\)|src=\"(?s:(.*?))\"") - result := reg.FindAllStringSubmatch(skuDetailMap[v.ThirdPartyId].BigInfo.PcWDis, -1) - for ki, k := range result { - kt := k[1] - if len(strings.TrimSpace(kt)) == 0 { - if len(k) > 2 { - kt = k[2] + if err := tx.Create(&gs1).Error; err != nil { + return err + } + image := make([]goods.RecookGoodsMainPhotoModel, 00) + dp := make([]goods.RecookGoodsDetailPhotoModel, 00) + for index, img := range res[0].Images { + master := 0 + image = append(image, goods.RecookGoodsMainPhotoModel{ + GoodsId: gs1.Id, + Url: img.Url, + IsMaster: master, + Name: "api", + OrderNo: index, + Width: 0, + Height: 0, + }) + if img.IsPrimer { + master = 1 + image = append(image, goods.RecookGoodsMainPhotoModel{ + GoodsId: gs1.Id, + Url: img.Url, + IsMaster: 0, + Name: "api", + OrderNo: index, + Width: 0, + Height: 0, + }) } } - if len(strings.TrimSpace(kt)) == 0 { - continue + + if err := tx.Create(&image).Error; err != nil { + return err } - kt = strings.Trim(kt, "\\") - if !strings.HasPrefix(kt, "http") && !strings.HasPrefix(kt, "https") { - kt = "http:" + kt + reg := regexp.MustCompile("background-image:url\\((?s:(.*?))\\)|src=\"(?s:(.*?))\"") + result := reg.FindAllStringSubmatch(res[0].BigInfo.PcWDis, -1) + for ki, k := range result { + kt := k[1] + if len(strings.TrimSpace(kt)) == 0 { + if len(k) > 2 { + kt = k[2] + } + } + if len(strings.TrimSpace(kt)) == 0 { + continue + } + kt = strings.Trim(kt, "\\") + if !strings.HasPrefix(kt, "http") && !strings.HasPrefix(kt, "https") { + kt = "http:" + kt + } + dp = append(dp, goods.RecookGoodsDetailPhotoModel{ + GoodsID: gs1.Id, + Url: kt, + Name: "api", + OrderNo: ki, + Width: 0, + Height: 0, + }) + } + if err := tx.Create(&dp).Error; err != nil { + return err } - do.AddTask(kt) - dp = append(dp, goods.RecookGoodsDetailPhotoModel{ - GoodsID: v.Id, - Url: do.GetPath(kt), - Name: "api", - OrderNo: ki, - Width: 0, - Height: 0, - }) } - } - if err := tx.Create(&gsk).Error; err != nil { - log.Println(err.Error()) - return err - } - - for _, v := range gsk { - c1, _ := strconv.ParseUint(v.ThirdPartySkuId, 10, 64) - source := skuDetailMap[uint(c1)] - invoice = append(invoice, goods.RecookSkuInvoiceModel{ - SkuId: v.Id, - GoodsId: v.GoodsId, - GoodsName: "jcook商品", - TaxSn: "0000001", - TaxName: "jcook商品", - Unit: source.SkuDetailBase.Unit, - TaxRate: decimal.NewFromInt(9), - PlatformRate: decimal.NewFromInt(9), - DeductionRate: decimal.NewFromInt(9), - CreatedAt: formatime.NewSecondNow(), - UpdatedAt: formatime.NewSecondNow(), - }) - } - if len(mp) > 0 { - if err := tx.Create(&mp).Error; err != nil { - log.Println(err.Error()) - return err + attrMap := make(map[uint][]goods.RecookGoodsAttributeModel) + for k, attr := range skuAttrMap { + data1 := make([]goods.RecookGoodsAttributeModel, 0) + for index, a := range attr { + aName := "规格" + if index == 1 { + aName = "尺寸" + } + aValue := a + if aValue == "" { + aValue = "标准" + } + data1 = append(data1, goods.RecookGoodsAttributeModel{ + GoodsId: gs1.Id, + Name: aName, + Value: aValue, + }) + attrMap[k] = data1 + } + if err := tx.Create(&data1).Error; err != nil { + return err + } } - } - if len(dp) > 0 { - if err := tx.Create(&dp).Error; err != nil { - log.Println(err.Error()) - return err + data := make([]goods.RecookGoodsSkuModel, 0) + for _, value := range gsk1 { + idStr := make([]string, 0) + id, _ := strconv.Atoi(value.ThirdPartySkuId) + for _, a1 := range attrMap[uint(id)] { + idStr = append(idStr, strconv.Itoa(int(a1.Id))) + } + value.GoodsId = gs1.Id + value.CombineId = strings.Join(idStr, ",") + data = append(data, value) } - } - - if len(invoice) > 0 { - if err := tx.Create(&invoice).Error; err != nil { - log.Println(err.Error()) + if err := tx.Create(&data).Error; err != nil { return err } - } + } return nil }); e != nil { return e } - do.Wait() return nil } diff --git a/internal/v2/lib/jcook/jcook.go b/internal/v2/lib/jcook/jcook.go index 517c713..109fdc0 100644 --- a/internal/v2/lib/jcook/jcook.go +++ b/internal/v2/lib/jcook/jcook.go @@ -208,6 +208,7 @@ type SkuDetailBase struct { ShelfLife string `json:"shelf_life"` Delivery string `json:"delivery"` PlaceOfProduction string `json:"place_of_production"` + UpcCode string `json:"upc_code"` Length float64 `json:"length"` Width float64 `json:"width"` Height float64 `json:"height"` @@ -246,6 +247,18 @@ func (o SkuDetailReq) GetApiName() string { return "sku/detail" } +type SkuBrotherReq struct { + SkuIDSet []uint `json:"sku_id_set"` +} + +type SkuBrotherResp struct { + BrotherSkuIDs []uint `json:"brother_sku_ids"` +} + +func (o SkuBrotherReq) GetApiName() string { + return "sku/brother" +} + type SkuPriceReq struct { SkuIDSet []uint `json:"sku_id_set"` }