package task import ( "errors" mysql2 "git.oa00.com/go/mysql" "github.com/golangkit/formatime" "github.com/shopspring/decimal" "gorm.io/gorm" "log" "recook/internal/v2/lib/downloader" "recook/internal/v2/lib/jcook" "recook/internal/v2/model/recook/goods" "recook/tools" "regexp" "strconv" "strings" ) var empty = errors.New("entries is empty") type RecookJCookCategory struct { ID uint JCookCategory string `gorm:"column:jcook_category"` RecookCategory string `gorm:"column:recook_category"` } func (o RecookJCookCategory) TableName() string { return "recook_jcook_category" } func AttrSync() { var sk []goods.RecookGoodsSkuModel mysql2.Db.Find(&sk, "third_party_type = 3") client := jcook.GetClient() for _, v := range sk { id, _ := strconv.Atoi(v.ThirdPartySkuId) r := jcook.SkuDetailReq{ SkuIDSet: []uint{uint(id)}, } var detail []jcook.SkuDetailResp if err := client.Exec(r, &detail); err != nil { log.Println(err.Error()) continue } if len(detail) == 0 { continue } res := detail[0] r1 := strings.TrimSpace(res.SkuDetailBase.Color) if r1 == "" { continue } mysql2.Db.Model(v).Update("name", r1) mysql2.Db.Table((&goods.RecookGoodsAttributeModel{}).TableName()). Where("id = ?", v.CombineId).Update("value", r1) } } func SyncAllSku() { defer func() { if err := recover(); err != nil { log.Println(err) } }() var cate []RecookJCookCategory mysql2.Db.Find(&cate) 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 { break } continue } page += 1 } } func SyncPageData(page, size uint, categories []RecookJCookCategory) error { c := jcook.GetClient() r := jcook.SkuListReq{ Page: page, PageSize: size, } var skuEntries jcook.SkuListResp if err := c.Exec(r, &skuEntries); err != nil { log.Println(err.Error()) return err } if len(skuEntries.Entries) == 0 { return empty } //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) //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.RecookGoodsSkuModel if v.Kind == 0 || v.BrandName == "" { continue } if len(v.UpcCode) > 32 { continue } rCate := "" for _, cate := range categories { if v.CategoryThirdName == cate.JCookCategory { rCate = cate.RecookCategory break } } if rCate == "" { continue } tx.First(&t, "third_party_sku_id = ? AND third_party_type = 3", v.SkuID) if t.Id > 0 { continue } var s goods.RecookGoodsSkuModel if v.UpcCode == "" { v.UpcCode = strconv.Itoa(int(v.SkuID)) } tx.First(&s, "code = ?", v.UpcCode) if s.Id > 0 { continue } var second goods.RecookGoodsCategoryModel tx.First(&second, "name = ? AND parent_id <> 0", rCate) if second.Id == 0 { continue } var first goods.RecookGoodsCategoryModel tx.First(&first, "id = ?", second.ParentId) if first.Id == 0 { continue } skuMap[v.SkuID] = v var bt goods.RecookGoodsBrandModel tx.First(&bt, "name = ?", v.BrandName) if bt.Id == 0 { bt.Name = v.BrandName if err := tx.Create(&bt).Error; err != nil { log.Println(err.Error()) return err } } } if len(skuMap) == 0 { return nil } ids := make([]uint, 0) for k, _ := range skuMap { ids = append(ids, k) } rq := jcook.SkuBrotherReq{ SkuIDSet: ids, } var bes []jcook.SkuBrotherResp if err := c.Exec(rq, &bes); err != nil { return err } for _, v := range bes { var res []jcook.SkuDetailResp rq2 := jcook.SkuDetailReq{ SkuIDSet: v.BrotherSkuIDs, } if err := c.Exec(rq2, &res); err != nil { return err } var gs1 goods.RecookGoodsInfoModel VendorID := 1800 rCate := "" for _, cate := range categories { if res[0].SkuDetailBase.CategoryThirdName == cate.JCookCategory { rCate = cate.RecookCategory break } } 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 } 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, } 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 err := tx.Create(&image).Error; err != nil { return err } 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 } } 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 } } 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 err := tx.Create(&data).Error; err != nil { return err } } return nil }); e != nil { return e } return nil } func SyncJDImage() { var gs []goods.RecookGoodsInfoModel sub := mysql2.Db.Select("goods_id"). Table((&goods.RecookGoodsDetailPhotoModel{}).TableName()).Group("goods_id") mysql2.Db.Find(&gs, "id not in (?) AND third_party_type = 3", sub) do := downloader.New(nil, "/jcook", 10) do.Start() client := jcook.GetClient() for _, v := range gs { rq := jcook.SkuDetailReq{ SkuIDSet: []uint{v.ThirdPartyId}, } var res []jcook.SkuDetailResp if err := client.Exec(rq, &res); err != nil { continue } mysql2.Db.Transaction(func(tx *gorm.DB) error { tx.Delete(&goods.RecookGoodsDetailPhotoModel{}, "goods_id = ?", v.Id) d1 := res[0] reg := regexp.MustCompile("background-image:url\\((?s:(.*?))\\)|src=\"(?s:(.*?))\"") result := reg.FindAllStringSubmatch(d1.BigInfo.PcWDis, -1) dp := make([]goods.RecookGoodsDetailPhotoModel, 0) 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 } do.AddTask(kt) name := do.GetPath(kt) dp = append(dp, goods.RecookGoodsDetailPhotoModel{ GoodsID: v.Id, Url: name, Name: "api", OrderNo: ki, Width: 0, Height: 0, }) } tx.Create(dp) return nil }) } do.Wait() }