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.
938 lines
24 KiB
938 lines
24 KiB
package task
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"recook/internal/v2/lib/jcook"
|
|
"recook/internal/v2/lib/shama"
|
|
"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"
|
|
}
|
|
|
|
type RecookShaMaCategory struct {
|
|
ID uint
|
|
ShaMaCategory string `gorm:"column:shama_category"`
|
|
RecookCategory string `gorm:"column:recook_category"`
|
|
}
|
|
|
|
func (o RecookShaMaCategory) TableName() string {
|
|
return "recook_shama_category"
|
|
}
|
|
|
|
func SyncTax() {
|
|
fmt.Println("start")
|
|
c := jcook.GetClient()
|
|
fmt.Println("start")
|
|
var OutputReg, _ = regexp.Compile("outputVAT:(?s:(\\d+))")
|
|
page := 0
|
|
for {
|
|
fmt.Println("start")
|
|
var gs []goods.RecookGoodsInfoModel
|
|
err := mysql2.Db.Preload("SkuPath").Limit(1000).Offset(page*1000).Find(&gs, "third_party_type = 3").Error
|
|
fmt.Println(err)
|
|
if len(gs) == 0 {
|
|
fmt.Println("end")
|
|
break
|
|
}
|
|
for _, v := range gs {
|
|
for _, j := range v.SkuPath {
|
|
skuID, _ := strconv.Atoi(j.ThirdPartySkuId)
|
|
rq := jcook.SkuDetailReq{
|
|
SkuIDSet: []uint{uint(skuID)},
|
|
}
|
|
var m goods.RecookSkuInvoiceModel
|
|
mysql2.Db.First(&m, "sku_id = ?", v.SkuPath[0].Id)
|
|
if m.Id > 0 {
|
|
continue
|
|
}
|
|
var res []jcook.SkuDetailResp
|
|
if err := c.Exec(rq, &res); err != nil {
|
|
return
|
|
}
|
|
data := res[0]
|
|
r1 := OutputReg.FindAllStringSubmatch(data.SkuDetailBase.Tax, -1)
|
|
tax := r1[0][1]
|
|
tax1, _ := decimal.NewFromString(tax)
|
|
mysql2.Db.Create(&goods.RecookSkuInvoiceModel{
|
|
SkuId: v.SkuPath[0].Id,
|
|
GoodsId: v.SkuPath[0].GoodsId,
|
|
GoodsName: "jcook商品",
|
|
TaxSn: "",
|
|
TaxName: "",
|
|
Unit: "",
|
|
TaxRate: tax1,
|
|
PlatformRate: tax1,
|
|
DeductionRate: tax1,
|
|
})
|
|
}
|
|
|
|
}
|
|
page += 1
|
|
}
|
|
|
|
}
|
|
|
|
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 ShaMaPriceSync() {
|
|
client := shama.GetClient()
|
|
var sl []goods.RecookGoodsSkuModel
|
|
mysql2.Db.Find(&sl, "third_party_type = 4")
|
|
//fmt.Println(len(sl))
|
|
for _, v := range sl {
|
|
id, _ := strconv.Atoi(v.ThirdPartySkuId)
|
|
r := shama.SkuDetailReq{SkuIDSet: []uint{uint(id)}}
|
|
var resp []shama.SkuDetailResp
|
|
if err := client.Exec(r, &resp); err != nil {
|
|
fmt.Println(err.Error())
|
|
continue
|
|
} else {
|
|
// j.SkuDetailBase.SupplyPrice
|
|
mysql2.Db.Model(v).Updates(map[string]interface{}{
|
|
"sale_purchase_price": resp[0].SkuDetailBase.SupplyPrice,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
func ShaMaSyncAllSku() {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
log.Println(err)
|
|
}
|
|
}()
|
|
var cate []RecookShaMaCategory
|
|
mysql2.Db.Find(&cate)
|
|
|
|
temp := make([]RecookShaMaCategory, 0)
|
|
for _, v := range cate {
|
|
temp = append(temp, RecookShaMaCategory{
|
|
ShaMaCategory: strings.TrimSpace(v.ShaMaCategory),
|
|
RecookCategory: strings.TrimSpace(v.RecookCategory),
|
|
})
|
|
}
|
|
|
|
var page uint = 1
|
|
var size uint = 20
|
|
for {
|
|
if err := ShaMaSyncPageData(page, size, temp); err != nil {
|
|
if err == empty {
|
|
break
|
|
}
|
|
}
|
|
page += 1
|
|
}
|
|
}
|
|
|
|
func ShaMaSyncPageData(page, size uint, categories []RecookShaMaCategory) error {
|
|
c := shama.GetClient()
|
|
r := jcook.SkuListReq{
|
|
Page: page,
|
|
PageSize: size,
|
|
}
|
|
|
|
var skuEntries shama.SkuListResp
|
|
if err := c.Exec(r, &skuEntries); err != nil {
|
|
log.Println(err.Error())
|
|
return err
|
|
}
|
|
if len(skuEntries.Entries) == 0 {
|
|
return empty
|
|
}
|
|
ids := make([]uint, 0)
|
|
if e := mysql2.Db.Transaction(func(tx *gorm.DB) error {
|
|
for _, v := range skuEntries.Entries {
|
|
var t goods.RecookGoodsSkuModel
|
|
rCate := ""
|
|
for _, cate := range categories {
|
|
if v.CategoryThirdName == cate.ShaMaCategory {
|
|
rCate = cate.RecookCategory
|
|
break
|
|
}
|
|
}
|
|
if rCate == "" {
|
|
fmt.Println("分类错误:", v.CategoryThirdName, v.SkuID)
|
|
continue
|
|
}
|
|
tx.First(&t, "third_party_sku_id = ? AND third_party_type = 4", strconv.Itoa(int(v.SkuID)))
|
|
if t.Id > 0 {
|
|
continue
|
|
}
|
|
var second goods.RecookGoodsCategoryModel
|
|
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
|
|
}
|
|
|
|
ids = append(ids, v.SkuID)
|
|
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(ids) == 0 {
|
|
return nil
|
|
}
|
|
|
|
rq := shama.SkuBrotherReq{
|
|
SkuIDSet: ids,
|
|
}
|
|
var bes []shama.SkuBrotherResp
|
|
if err := c.Exec(rq, &bes); err != nil {
|
|
return err
|
|
}
|
|
for index := range bes {
|
|
bes[index].BrotherSkuIDs = append(bes[index].BrotherSkuIDs, ids[index])
|
|
}
|
|
|
|
for _, v := range bes {
|
|
var res []jcook.SkuDetailResp
|
|
rq2 := jcook.SkuDetailReq{
|
|
SkuIDSet: v.BrotherSkuIDs,
|
|
}
|
|
if err := c.Exec(rq2, &res); err != nil {
|
|
return err
|
|
}
|
|
if len(res) == 0 {
|
|
fmt.Println("detail err:", v.BrotherSkuIDs)
|
|
continue
|
|
}
|
|
|
|
var gs1 goods.RecookGoodsInfoModel
|
|
VendorID := 3000
|
|
rCate := ""
|
|
for _, cate := range categories {
|
|
if res[0].SkuDetailBase.CategoryThirdName == cate.ShaMaCategory {
|
|
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)
|
|
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 {
|
|
var t1 goods.RecookGoodsSkuModel
|
|
tx.First(&t1, "third_party_sku_id = ? AND third_party_type = 4", 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
|
|
}
|
|
ojb := 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: 4,
|
|
TMallPrice: "",
|
|
TMallUrl: "",
|
|
JdPrice: j.SkuDetailBase.GuidePrice.String(),
|
|
JdUrl: "",
|
|
// SalePurchasePrice: j.SkuDetailBase.SupplyPrice,
|
|
GysSkuID: 0,
|
|
}
|
|
if j.SkuDetailBase.Kind == 1 {
|
|
ojb.PurchasePrice = j.SkuDetailBase.SupplyPrice
|
|
} else {
|
|
ojb.SalePurchasePrice = j.SkuDetailBase.SupplyPrice
|
|
}
|
|
gsk1[j.SkuDetailBase.SkuID] = ojb
|
|
}
|
|
}
|
|
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: 4,
|
|
}
|
|
|
|
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 SyncAllSku(brand string) {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
log.Println(err)
|
|
}
|
|
}()
|
|
var cate []RecookJCookCategory
|
|
mysql2.Db.Find(&cate)
|
|
|
|
temp := make([]RecookJCookCategory, 0)
|
|
for _, v := range cate {
|
|
temp = append(temp, RecookJCookCategory{
|
|
JCookCategory: strings.TrimSpace(v.JCookCategory),
|
|
RecookCategory: strings.TrimSpace(v.RecookCategory),
|
|
})
|
|
}
|
|
|
|
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, temp); 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
|
|
}
|
|
|
|
ids := make([]uint, 0)
|
|
if e := mysql2.Db.Transaction(func(tx *gorm.DB) error {
|
|
for _, v := range skuEntries.Entries {
|
|
var t goods.RecookGoodsSkuModel
|
|
if v.BrandName == "" {
|
|
v.BrandName = "京东优选"
|
|
}
|
|
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
|
|
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
|
|
}
|
|
|
|
ids = append(ids, v.SkuID)
|
|
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
|
|
}
|
|
}
|
|
}
|
|
|
|
rq := jcook.SkuBrotherReq{
|
|
SkuIDSet: ids,
|
|
}
|
|
var bes []jcook.SkuBrotherResp
|
|
if err := c.Exec(rq, &bes); err != nil {
|
|
return err
|
|
}
|
|
for index, v := range bes {
|
|
if len(v.BrotherSkuIDs) == 0 {
|
|
bes[index].BrotherSkuIDs = append(bes[index].BrotherSkuIDs, ids[index])
|
|
}
|
|
}
|
|
|
|
for _, v := range bes {
|
|
if len(v.BrotherSkuIDs) == 0 {
|
|
continue
|
|
}
|
|
start := 0
|
|
step := 20
|
|
total := len(v.BrotherSkuIDs)
|
|
after2 := make([][]uint, 0)
|
|
for {
|
|
if start >= total {
|
|
break
|
|
}
|
|
if total-start < step {
|
|
step = total - start
|
|
}
|
|
after2 = append(after2, v.BrotherSkuIDs[start:start+step])
|
|
start = start + step
|
|
}
|
|
|
|
var res []jcook.SkuDetailResp
|
|
for _, j := range after2 {
|
|
var r1 []jcook.SkuDetailResp
|
|
rq2 := jcook.SkuDetailReq{
|
|
SkuIDSet: j,
|
|
}
|
|
if err := c.Exec(rq2, &r1); err != nil {
|
|
return err
|
|
}
|
|
res = append(res, r1...)
|
|
}
|
|
|
|
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)
|
|
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)
|
|
dataAttr := make([]goods.RecookGoodsAttributeModel, 0)
|
|
for index, a := range attr {
|
|
aName := "规格"
|
|
if index == 1 {
|
|
aName = "尺寸"
|
|
}
|
|
aValue := a
|
|
if aValue == "" {
|
|
aValue = "标准"
|
|
}
|
|
var aa goods.RecookGoodsAttributeModel
|
|
tx.First(&aa, "goods_id = ? and value = ?", gs1.Id, aValue) //查找重复数据
|
|
if aa.Id > 0 {
|
|
dataAttr = append(attrMap[k], aa) //使用已有数据
|
|
} else {
|
|
data1 = append(data1, goods.RecookGoodsAttributeModel{
|
|
GoodsId: gs1.Id,
|
|
Name: aName,
|
|
Value: aValue,
|
|
})
|
|
dataAttr = data1
|
|
}
|
|
attrMap[k] = dataAttr
|
|
}
|
|
if len(data1) != 0 {
|
|
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
|
|
mysql2.Db.Find(&gs, "third_party_type = 3")
|
|
|
|
for _, vi := range gs {
|
|
var gsk []goods.RecookGoodsSkuModel
|
|
mysql2.Db.Find(&gsk, "goods_id = ?", vi.Id)
|
|
|
|
client := jcook.GetClient()
|
|
if len(gsk) == 0 {
|
|
continue
|
|
}
|
|
s1 := gsk[0]
|
|
skuId, _ := strconv.Atoi(s1.ThirdPartySkuId)
|
|
if skuId == 0 {
|
|
continue
|
|
}
|
|
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 {
|
|
d1 := res[0]
|
|
if len(d1.Images) == 0 {
|
|
return nil
|
|
}
|
|
|
|
tx.Delete(&goods.RecookGoodsDetailPhotoModel{}, "goods_id = ?", s1.GoodsId)
|
|
tx.Delete(&goods.RecookGoodsMainPhotoModel{}, "goods_id = ?", s1.GoodsId)
|
|
|
|
temp := make([]goods.RecookGoodsMainPhotoModel, 0)
|
|
|
|
if len(d1.Images) == 1 {
|
|
d1.Images = append(d1.Images, jcook.SkuImage{
|
|
Url: d1.Images[0].Url,
|
|
IsPrimer: false,
|
|
OrderSort: 1,
|
|
})
|
|
}
|
|
for index, v := range d1.Images {
|
|
isMaster := 0
|
|
if v.IsPrimer {
|
|
isMaster = 1
|
|
}
|
|
temp = append(temp, goods.RecookGoodsMainPhotoModel{
|
|
GoodsId: s1.GoodsId,
|
|
Url: v.Url,
|
|
Name: "",
|
|
IsMaster: isMaster,
|
|
OrderNo: index,
|
|
Width: 0,
|
|
Height: 0,
|
|
Hash: "",
|
|
})
|
|
}
|
|
tx.Create(&temp)
|
|
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: s1.GoodsId,
|
|
Url: kt,
|
|
Name: "api",
|
|
OrderNo: ki,
|
|
Width: 0,
|
|
Height: 0,
|
|
})
|
|
}
|
|
tx.Create(dp)
|
|
return nil
|
|
})
|
|
|
|
}
|
|
|
|
}
|