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.

486 lines
12 KiB

package task
import (
"errors"
"fmt"
"log"
"recook/internal/v2/lib/jcook"
"recook/internal/v2/model/recook/goods"
"recook/tools"
"regexp"
"strconv"
"strings"
mysql2 "git.oa00.com/go/mysql"
"github.com/golangkit/formatime"
"github.com/shopspring/decimal"
"gorm.io/gorm"
)
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(brand string) {
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, brand, cate); err != nil {
if err == empty {
break
}
}
page += 1
}
}
func SyncPageData(page, size uint, brand string, categories []RecookJCookCategory) error {
c := jcook.GetClient()
r := jcook.SkuListReq{
Page: page,
PageSize: size,
Brand: brand,
}
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
}
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", strconv.Itoa(int(v.SkuID)))
if t.Id > 0 {
continue
}
var second goods.RecookGoodsCategoryModel
fmt.Println(rCate, "===============")
tx.Where("name = ? AND parent_id <> 0", rCate).First(&second)
if second.Id == 0 {
continue
}
var first goods.RecookGoodsCategoryModel
tx.Where("id = ?", second.ParentId).First(&first)
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
}
result := make(map[uint]bool)
for _, v := range ids {
result[v] = true
}
//for _, v := range bes {
// for _, k := range v.BrotherSkuIDs {
// result[k] = true
// }
//}
//after := make([]uint, 0)
//after2 := make([][]uint, 0)
//for k := range result {
// after = append(after, k)
//}
//total := len(after)
//start := 0
//step := 20
//for {
// if start >= total {
// break
// }
// if total-start < step {
// step = total - start
// }
// after2 = append(after2, after[start:start+step])
// start = start + step
//}
for _, v := range bes {
if len(v.BrotherSkuIDs) == 0 || len(v.BrotherSkuIDs) > 20 {
continue
}
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", strconv.Itoa(int(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(name1) == 0 {
name1 = "标准"
}
num := 500
if !j.SkuDetailBase.Status || !j.SkuDetailBase.Yn {
num = 0
}
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: uint(num),
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.Id,
PublishStatus: 0,
FreightID: 0,
Weight: decimal.NewFromFloat(weight),
Hash: tools.GenerateGoodsHashSign(),
IsJoinTeamPerformance: 0,
CreatedAt: formatime.NewSecondNow(),
UpdatedAt: formatime.NewSecondNow(),
JCookPublishStatus: 1,
ThirdPartyType: 3,
}
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
if img.IsPrimer {
master = 1
}
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(image) != 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 len(dp) != 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(id int) {
var gs []goods.RecookGoodsInfoModel
mysql2.Db.Find(&gs, "brand_id = ?", id)
ids := make([]uint, 0)
for _, v := range gs {
ids = append(ids, v.Id)
}
var gsk []goods.RecookGoodsSkuModel
mysql2.Db.Find(&gsk, "id in (?)", ids)
client := jcook.GetClient()
for _, v := range gsk {
skuId, _ := strconv.Atoi(v.ThirdPartySkuId)
rq := jcook.SkuDetailReq{
SkuIDSet: []uint{uint(skuId)},
}
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
}
dp = append(dp, goods.RecookGoodsDetailPhotoModel{
GoodsID: v.Id,
Url: kt,
Name: "api",
OrderNo: ki,
Width: 0,
Height: 0,
})
}
tx.Create(dp)
return nil
})
}
}