Files
jx-callback/business/partner/purchase/jdshop/store_sku.go
2020-06-01 17:50:39 +08:00

785 lines
26 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package jdshop
import (
"fmt"
"regexp"
"strings"
"time"
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
"git.rosy.net.cn/jx-callback/globals/api"
"git.rosy.net.cn/baseapi/platformapi/yinbaoapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/business/partner/putils"
"git.rosy.net.cn/jx-callback/globals"
)
var (
sensitiveWordRegexp = regexp.MustCompile(`商品名称中含有敏感词(\[.*\])`)
)
func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID {
for _, v := range storeSkuList {
//判断京东商城上是否有这个商品了,如果有就是添加规格而不是创建商品
name := filterSensitiveWord(v.Name)
flag := false
result, err := api.JdShopAPI.SearchWare4Valid(name, 1, 100)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
return failedList, err
}
for _, v := range result.Data {
if v.Title == name {
flag = true
break
}
}
if result.TotalItem > 0 && len(result.Data) > 0 && flag {
for _, vv := range v.StoreSkuSyncInfoJds {
v.JdsWareID = result.Data[0].WareID
vv.JdsWareID = result.Data[0].WareID
updateSkusParam, err := buildUpdateSkusParam(v, vv, true)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
return failedList, err
}
vendorSkuID, err := api.JdShopAPI.UpdateSkus(updateSkusParam)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
return failedList, err
}
vv.VendorSkuID = vendorSkuID
}
} else {
createSkuParamWare, createSkuParamSkus, err := buildCreateWareParam(v)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
return failedList, err
}
createSkuResult, err := api.JdShopAPI.CreateWare(createSkuParamWare, createSkuParamSkus)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
return failedList, err
} else {
//追加商品透图
imageURL := ""
img := v.Img
if img != "" {
suffix := img[strings.LastIndex(img, "."):]
if suffix != ".png" {
if resBinary, _, err := jxutils.DownloadFileByURL(img + model.SkuNameImgToPng); err == nil {
downloadURL, err2 := jxutils.UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix()))
err = err2
imageURL, err = uploadImg(downloadURL, name, "tou")
}
} else {
imageURL, err = uploadImg(img, name, "tou")
}
}
err2 := api.JdShopAPI.TransparentImageAdd(createSkuResult.WareID, imageURL)
if err2 != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "创建商品")
return failedList, err
}
}
var paramAttrs = make(map[string]*jdshopapi.CreateSkuParamSkus)
var resultAttrs = make(map[string]int64)
for _, vv := range createSkuParamSkus {
for _, vvv := range vv.SaleAttrs {
paramAttrs[vvv.AttrValues[0]] = vv
}
}
for _, vv1 := range createSkuResult.Skus {
for _, vvv1 := range vv1.SaleAttrs {
if paramAttrs[vvv1.AttrValues[0]] != nil {
resultAttrs[paramAttrs[vvv1.AttrValues[0]].OuterID] = vv1.SkuID
}
}
}
for _, vv2 := range v.StoreSkuSyncInfoJds {
vv2.JdsWareID = createSkuResult.WareID
if resultAttrs[utils.Int2Str(vv2.SkuID)] != 0 {
vv2.VendorSkuID = utils.Int64ToStr(resultAttrs[utils.Int2Str(vv2.SkuID)])
}
}
}
}
}
return failedList, err
}
func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID {
for _, v := range storeSkuList {
name := filterSensitiveWord(v.Name)
updateWareParam := &jdshopapi.UpdateWareParam{
WareID: v.JdsWareID,
Title: name,
VenderID: jdshopapi.VenderID,
PromiseID: jdshopapi.JdsPromiseID,
}
var desc string
if v.DescImg != "" {
pic3, err2 := uploadImg2(v.DescImg, name, "desc")
err = err2
desc = `<p><img src="` + jdshopapi.JdsImgURL + pic3 + `" style="width: auto; height: auto; max-width: 100%;"><br></p><p><br></p>`
} else {
desc = `<p><br></p><p><br></p>`
}
updateWareParam.Introduction = desc
updateWareParam.MobileDesc = desc
if v.Img != "" {
pic1, err2 := uploadImg2(v.Img, name, "1")
err = err2
err = api.JdShopAPI.ImageUpdate(v.JdsWareID, 1, pic1)
if v.Img2 != "" {
pic2, err2 := uploadImg2(v.Img2, name, "2")
err = err2
err = api.JdShopAPI.ImageUpdate(v.JdsWareID, 2, pic2)
} else {
err = api.JdShopAPI.ImageUpdate(v.JdsWareID, 2, pic1)
}
err = api.JdShopAPI.ImageUpdate(v.JdsWareID, 3, pic1)
}
var features = []*jdshopapi.CreateSkuParamFeatures{
&jdshopapi.CreateSkuParamFeatures{
Key: "is7ToReturn", //不支持7天无理由退货
Value: "0",
},
&jdshopapi.CreateSkuParamFeatures{
Key: "tssp", //支持自提
Value: "",
},
// &jdshopapi.CreateSkuParamFeatures{
// Key: "fdms", //分单?
// Value: "1",
// },
}
updateWareParam.Features = features
err = api.JdShopAPI.UpdateWare(updateWareParam)
if err == nil {
//追加商品透图
imageURL := ""
img := v.Img
if img != "" {
suffix := img[strings.LastIndex(img, "."):]
if suffix != ".png" {
if resBinary, _, err := jxutils.DownloadFileByURL(img + model.SkuNameImgToPng); err == nil {
downloadURL, err2 := jxutils.UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix()))
err = err2
imageURL, err = uploadImg(downloadURL, name, "tou")
}
} else {
imageURL, err = uploadImg(img, name, "tou")
}
}
err2 := api.JdShopAPI.TransparentImageAdd(v.JdsWareID, imageURL)
if err2 != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "更新商品基础信息")
return failedList, err
}
}
for _, vv := range v.StoreSkuSyncInfoJds {
updateSkusParam, err := buildUpdateSkusParam(v, vv, false)
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "更新商品基础信息")
return failedList, err
}
vendorSkuID, err := api.JdShopAPI.UpdateSkus(updateSkusParam)
vv.VendorSkuID = vendorSkuID
}
}
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "更新商品基础信息")
}
}
return failedList, err
}
func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID {
for _, v := range storeSkuList {
// err = api.JdShopAPI.DeleteSku(utils.Str2Int64(v.VendorSkuID))
err = api.JdShopAPI.UpOrDown(utils.Str2Int64(v.VendorSkuID2), 2)
if err == nil {
err = api.JdShopAPI.DeleteWare(utils.Str2Int(v.VendorSkuID2))
}
}
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "删除商品")
}
}
return failedList, err
}
func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) {
var (
pageNo = 1
pageSize = 100
)
pageResult, err := api.JdShopAPI.SearchWare4Valid("", pageNo, pageSize)
for ; pageNo <= pageResult.TotalItem/pageSize+1; pageNo++ {
result, err := api.JdShopAPI.SearchWare4Valid("", pageNo, pageSize)
if err == nil {
for _, v := range result.Data {
if skuName := vendorSku2Jx(v); skuName != nil {
skuNameList = append(skuNameList, skuName)
}
}
}
}
return skuNameList, err
}
func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, status int) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableJdShopWrite {
var stock = 0
for _, v := range storeSkuList {
if status == model.SkuStatusNormal {
stock = 9999
}
if storeID == model.JdShopMainStoreID {
err = api.JdShopAPI.UpdateSkuStock(utils.Str2Int(v.VendorSkuID), stock)
} else {
storeSkus, err2 := dao.GetStoresSkusInfo(dao.GetDB(), []int{model.JdShopMainStoreID}, []int{v.SkuID})
err = err2
if len(storeSkus) > 0 {
if storeSkus[0].JdsID != 0 && vendorStoreID != "" {
err = api.JdShopAPI.UpdateSkuSiteStock(storeSkus[0].JdsID, stock, utils.Str2Int(vendorStoreID))
}
}
}
}
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "修改商品库存")
}
}
return failedList, err
}
func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID {
for _, v := range storeSkuList {
err = api.JdShopAPI.UpdateSkuJdPrice(utils.Str2Int(v.VendorSkuID), jxutils.IntPrice2Standard(v.VendorPrice))
}
if err != nil {
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDJDShop], "修改商品价格")
}
}
return failedList, err
}
func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if globals.EnableJdShopWrite {
}
return failedList, err
}
func (p *PurchaseHandler) GetStoreAllCategories(ctx *jxcontext.Context, storeID int, vendorStoreID string) (cats []*partner.BareCategoryInfo, err error) {
result, err := api.JdShopAPI.FindShopCategories()
for _, v := range result {
var cat = &partner.BareCategoryInfo{
VendorCatID: utils.Int64ToStr(v.CID),
Name: v.Name,
}
if v.ParentCID == 0 {
cat.Level = 1
} else {
cat.Level = 2
}
cats = append(cats, cat)
}
return cats, err
}
func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) {
if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID {
status, err2 := updateOrCreateCategories(storeCat, true)
err = err2
if status == -1 {
return fmt.Errorf("京东商城店内分类创建失败!")
}
time.Sleep(time.Second * 2)
// flag := false
// for {
result, err := api.JdShopAPI.FindShopCategories()
if err != nil {
return err
}
for _, v := range result {
if v.Name == storeCat.Name {
storeCat.VendorCatID = utils.Int64ToStr(v.CID)
// flag = true
break
}
}
// if flag {
// break
// }
// }
}
return err
}
func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) {
if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID {
status, err2 := updateOrCreateCategories(storeCat, false)
err = err2
if status == -1 {
return fmt.Errorf("京东商城店内分类更新失败!")
}
}
return err
}
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) {
if globals.EnableJdShopWrite && vendorStoreID == model.JdShopMainVendorStoreID {
_, err = api.JdShopAPI.DeleteShopCategory(utils.Str2Int64(vendorCatID))
}
return err
}
func (p *PurchaseHandler) IsErrSkuExist(err error) (isExist bool) {
return false
}
func (p *PurchaseHandler) IsErrCategoryExist(err error) (isExist bool) {
return false
}
func (p *PurchaseHandler) IsErrCategoryNotExist(err error) (isNotExist bool) {
return false
}
func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
return 1
}
func (p *PurchaseHandler) GetSensitiveWordRegexp() *regexp.Regexp {
return sensitiveWordRegexp
}
func (p *PurchaseHandler) IsErrSkuNotExist(err error) (isNotExist bool) {
return false
}
func ybSkuStatus2Jx(ybStatus int) (jxSkuStatus int) {
if ybStatus == yinbaoapi.SkuStatusEnable {
jxSkuStatus = model.SkuStatusNormal
} else if ybStatus == yinbaoapi.SkuStatusDisabled {
jxSkuStatus = model.SkuStatusDontSale
} else if ybStatus == yinbaoapi.SkuStatusDeleted {
jxSkuStatus = model.SkuStatusDeleted
}
return jxSkuStatus
}
func vendorSku2Jx(result *jdshopapi.SearchWare4ValidResultData) (skuName *partner.SkuNameInfo) {
if result == nil {
globals.SugarLogger.Warnf("vendorSku2Jx, strange result:%s", utils.Format4Output(result, true))
return nil
}
// prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(result.Title)
skuName = &partner.SkuNameInfo{
Name: result.Title,
VendorNameID: utils.Int64ToStr(result.WareID),
Status: result.WareStatus,
VendorCatIDList: []string{utils.Int2Str(result.CategoryID)},
NameID: utils.Str2Int(result.OuterID),
}
return skuName
}
func updateOrCreateCategories(storeCat *dao.SkuStoreCatInfo, isCreate bool) (status int64, err error) {
var createShopCategoryParams []*jdshopapi.CreateShopCategoryParam
result, err := api.JdShopAPI.FindShopCategories()
if err != nil {
return -1, err
}
for _, v := range result {
createShopCategoryParam := &jdshopapi.CreateShopCategoryParam{
HomeShow: "0",
ID: utils.Int64ToStr(v.CID),
Open: "",
OrderNo: utils.Int2Str(v.OrderNo),
ParentID: utils.Int64ToStr(v.ParentCID),
Title: v.Name,
Type: jdshopapi.UpdateCatType,
}
createShopCategoryParams = append(createShopCategoryParams, createShopCategoryParam)
}
createShopCategoryParam2 := &jdshopapi.CreateShopCategoryParam{
HomeShow: "0",
Open: "",
OrderNo: utils.Int2Str(storeCat.Seq),
ParentID: storeCat.ParentVendorCatID,
Title: storeCat.Name,
}
if isCreate {
createShopCategoryParam2.Type = jdshopapi.CreateCatType
createShopCategoryParam2.ID = "1"
createShopCategoryParams = append(createShopCategoryParams, createShopCategoryParam2)
} else {
for _, v := range createShopCategoryParams {
if v.ID == storeCat.VendorCatID {
v.Title = createShopCategoryParam2.Title
v.OrderNo = createShopCategoryParam2.OrderNo
}
}
}
status, err = api.JdShopAPI.CreateShopCategory(createShopCategoryParams)
return status, err
}
func buildCreateWareParam(storeSku *dao.StoreSkuSyncInfo) (createSkuParamWare *jdshopapi.CreateSkuParamWare, createSkuParamSkus []*jdshopapi.CreateSkuParamSkus, err error) {
var (
images []*jdshopapi.CreateSkuParamImages
vendorCatID int
)
if storeSku.VendorCatID == "0" {
resultCat, _ := api.JdShopAPI.FindShopCategories()
for _, v := range resultCat {
if v.Name == storeSku.CategoryName {
vendorCatID = int(v.CID)
break
}
}
} else {
vendorCatID = utils.Str2Int(storeSku.VendorCatID)
}
name := filterSensitiveWord(storeSku.Name)
createSkuParamWare = &jdshopapi.CreateSkuParamWare{
Title: name,
ShopCategorys: []int{vendorCatID},
CategoryID: int(storeSku.VendorVendorCatID),
BrandID: jdshopapi.JxBrandId,
// TransportID: jdshopapi.TransportID,
WareStatus: 8, //上架待审核
OuterID: utils.Int2Str(storeSku.NameID),
VenderID: jdshopapi.VenderID,
Length: 100,
Width: 100,
Height: 100,
Weight: 0.5,
JdPrice: jxutils.IntPrice2Standard(storeSku.UnitPrice),
// MarketPrice: jxutils.IntPrice2Standard(storeSku.UnitPrice),
// PromiseID: jdshopapi.JdsPromiseID,
}
if storeSku.VendorVendorCatID != jdshopapi.JdsOtherMeatCatID {
createSkuParamWare.PromiseID = jdshopapi.JdsPromiseID
}
//上传京东图片
//规则,有两张就传两张,没有就重复传一张
pic1, err := uploadImg(storeSku.Img, name, "1")
img1 := &jdshopapi.CreateSkuParamImages{
ColorID: "0000000000",
ImgIndex: 1,
ImgURL: pic1,
}
img2 := &jdshopapi.CreateSkuParamImages{
ColorID: "0000000000",
ImgIndex: 2,
}
if storeSku.Img2 == "" {
img2.ImgURL = pic1
} else {
pic2, err2 := uploadImg(storeSku.Img, name, "2")
err = err2
img2.ImgURL = pic2
}
img3 := &jdshopapi.CreateSkuParamImages{
ColorID: "0000000000",
ImgIndex: 3,
ImgURL: pic1,
}
images = append(images, img1)
images = append(images, img2)
images = append(images, img3)
createSkuParamWare.Images = images
//商品详情拼接
var desc string
if storeSku.DescImg != "" {
pic3, err2 := uploadImg(storeSku.DescImg, name, "desc")
err = err2
desc = `<p><img src="` + jdshopapi.JdsImgURL + pic3 + `" style="width: auto; height: auto; max-width: 100%;"><br></p><p><br></p>`
} else {
desc = `<p><br></p><p><br></p>`
}
createSkuParamWare.MobileDesc = desc
createSkuParamWare.Introduction = desc
//设置商品属性值
var (
attrIDs = make(map[string]int) //贮存方式,净含量,保质期IDs
zctjValueID int64 //贮存条件冷藏0-4的id
gcjkValueID int64 //国产进口的id
lbValueID int64 //类别的ID
bcztValueID int64 //保存状态ID
attrsProp []*jdshopapi.CreateSkuParamAttrs
)
attrs, err := api.JdShopAPI.FindAttrs(int(storeSku.VendorVendorCatID))
for _, v := range attrs {
if v.Name == "保质期" {
attrIDs[v.Name] = v.ID
} else if v.Name == "贮存条件" {
attrIDs[v.Name] = v.ID
} else if v.Name == "净含量" {
attrIDs[v.Name] = v.ID
} else if v.Name == "规格" {
attrIDs[v.Name] = v.ID
} else if v.Name == "国产/进口" {
attrIDs[v.Name] = v.ID
} else if v.Name == "类别" {
attrIDs[v.Name] = v.ID
} else if v.Name == "保存状态" {
attrIDs[v.Name] = v.ID
}
}
values, _, err := api.JdShopAPI.FindValuesByAttrId(attrIDs["贮存条件"])
for _, v := range values {
if v.Name == "冷藏 0-4℃" {
zctjValueID = v.ID
}
}
if attrIDs["国产/进口"] != 0 {
values2, _, err2 := api.JdShopAPI.FindValuesByAttrId(attrIDs["国产/进口"])
err = err2
for _, v := range values2 {
if v.Name == "国产" {
gcjkValueID = v.ID
}
}
attrgcjk := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(attrIDs["国产/进口"]),
AttrValues: []string{utils.Int64ToStr(gcjkValueID)},
}
attrsProp = append(attrsProp, attrgcjk)
}
if attrIDs["保存状态"] != 0 {
values2, _, err2 := api.JdShopAPI.FindValuesByAttrId(attrIDs["保存状态"])
err = err2
for _, v := range values2 {
if v.Name == "冷藏" || v.Name == "活鲜" {
bcztValueID = v.ID
}
}
attrbczt := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(attrIDs["保存状态"]),
AttrValues: []string{utils.Int64ToStr(bcztValueID)},
}
attrsProp = append(attrsProp, attrbczt)
}
attrZctj := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(attrIDs["贮存条件"]),
AttrValues: []string{utils.Int64ToStr(zctjValueID)},
}
attrJhl := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(attrIDs["净含量"]),
AttrValues: []string{"0.5"},
}
attrBzq := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(attrIDs["保质期"]),
AttrValues: []string{"5"},
}
attrsProp = append(attrsProp, attrZctj)
attrsProp = append(attrsProp, attrJhl)
attrsProp = append(attrsProp, attrBzq)
createSkuParamWare.MultiCateProps = attrsProp
var features = []*jdshopapi.CreateSkuParamFeatures{
&jdshopapi.CreateSkuParamFeatures{
Key: "is7ToReturn", //不支持7天无理由退货
Value: "0",
},
&jdshopapi.CreateSkuParamFeatures{
Key: "tssp", //支持自提
Value: "",
},
// &jdshopapi.CreateSkuParamFeatures{
// Key: "fdms", //分单?
// Value: "1",
// },
}
createSkuParamWare.Features = features
//组合sku
var vendorPrice int64 = 0
for _, v := range storeSku.StoreSkuSyncInfoJds {
var (
ggValueID int64 //规格的属性id
attrsPropSku []*jdshopapi.CreateSkuParamAttrs
multiPropSku []*jdshopapi.CreateSkuParamAttrs
)
valuesSku, maxNo, _ := api.JdShopAPI.FindValuesByAttrId(attrIDs["规格"])
specQuality := utils.Float64ToStr(float64(v.SpecQuality)) + v.SpecUnit
for _, v := range valuesSku {
if v.Name == specQuality {
ggValueID = v.ID
}
}
if ggValueID == 0 { //说明没有建这个规格,要建上
catID, _ := api.JdShopAPI.SaveVenderAttrValue(specQuality, attrIDs["规格"], int(storeSku.VendorVendorCatID), maxNo+1)
ggValueID = catID
}
attrSku := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(attrIDs["规格"]),
AttrValues: []string{utils.Int64ToStr(ggValueID)},
}
attrsPropSku = append(attrsPropSku, attrSku)
sku := &jdshopapi.CreateSkuParamSkus{
JdPrice: jxutils.IntPrice2Standard(v.VendorPrice),
// StockNum: 9999,
Type: "com.jd.pop.ware.ic.api.domain.sku",
Type2: "com.jd.pop.ware.ic.api.domain.Sku",
OuterID: utils.Int2Str(v.SkuID),
}
sku.SaleAttrs = attrsPropSku
if attrIDs["类别"] != 0 {
values2, _, err2 := api.JdShopAPI.FindValuesByAttrId(attrIDs["类别"])
err = err2
lbValueID = values2[len(values2)-1].ID
attrlb := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(attrIDs["类别"]),
AttrValues: []string{utils.Int64ToStr(lbValueID)},
}
multiPropSku = append(multiPropSku, attrlb)
}
sku.MultiCateProps = multiPropSku
createSkuParamSkus = append(createSkuParamSkus, sku)
if v.VendorPrice > vendorPrice {
vendorPrice = v.VendorPrice
}
if v.Status == model.SkuStatusNormal {
sku.StockNum = 9999
} else {
sku.StockNum = 0
}
}
//市场价固定500
createSkuParamWare.MarketPrice = 500
return createSkuParamWare, createSkuParamSkus, err
}
//京东商城上传图片,若平台上已经有了这个图就直接拿来用了
func uploadImg(img, name, index string) (imgURL string, err error) {
result, err := api.JdShopAPI.QueryPicture(name + index)
if len(result) > 0 {
imgURL = result[0].PictureURL
} else {
data, _, err := jxutils.DownloadFileByURL(img)
if err != nil {
return imgURL, err
}
uploadResult, err := api.JdShopAPI.UploadPicture(data, 0, name+index)
if err != nil {
return imgURL, err
}
imgURL = uploadResult.PictureURL
}
return imgURL, err
}
func uploadImg2(img, name, index string) (imgURL string, err error) {
data, _, err := jxutils.DownloadFileByURL(img)
if err != nil {
return imgURL, err
}
uploadResult, err := api.JdShopAPI.UploadPicture(data, 0, name+index)
if err != nil {
return imgURL, err
}
imgURL = uploadResult.PictureURL
return imgURL, err
}
func filterSensitiveWord(name string) (result string) {
for _, v := range jdshopapi.SensitiveWordMap {
if strings.Contains(name, v) {
return strings.ReplaceAll(name, v, "")
}
}
return name
}
func buildUpdateSkusParam(storeSku *dao.StoreSkuSyncInfo, v *dao.StoreSkuSyncInfo, isCreate bool) (updateSkusParam *jdshopapi.UpdateSkusParam, err error) {
updateSkusParam = &jdshopapi.UpdateSkusParam{
WareID: storeSku.JdsWareID,
}
attrIDs := make(map[string]int)
attrs, err := api.JdShopAPI.FindAttrs(int(storeSku.VendorVendorCatID))
for _, v := range attrs {
if v.Name == "规格" {
attrIDs[v.Name] = v.ID
} else if v.Name == "类别" {
attrIDs[v.Name] = v.ID
}
}
var (
ggValueID int64 //规格的属性id
attrsPropSku []*jdshopapi.CreateSkuParamAttrs
skus []*jdshopapi.UpdateSkusParamSkus
multiPropSku []*jdshopapi.CreateSkuParamAttrs
)
valuesSku, maxNo, _ := api.JdShopAPI.FindValuesByAttrId(attrIDs["规格"])
specQuality := utils.Float64ToStr(float64(v.SpecQuality)) + v.SpecUnit
for _, v := range valuesSku {
if v.Name == specQuality {
ggValueID = v.ID
}
}
if ggValueID == 0 { //说明没有建这个规格,要建上
catID, _ := api.JdShopAPI.SaveVenderAttrValue(specQuality, attrIDs["规格"], int(storeSku.VendorVendorCatID), maxNo+1)
ggValueID = catID
}
attrSku := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(attrIDs["规格"]),
AttrValues: []string{utils.Int64ToStr(ggValueID)},
}
attrsPropSku = append(attrsPropSku, attrSku)
sku := &jdshopapi.UpdateSkusParamSkus{
WareID: storeSku.JdsWareID,
JdPrice: jxutils.IntPrice2Standard(v.VendorPrice),
Type: "com.jd.pop.ware.ic.api.domain.sku",
Type2: "com.jd.pop.ware.ic.api.domain.Sku",
OuterID: utils.Int2Str(v.SkuID),
}
sku.SaleAttrs = attrsPropSku
if v.Status == model.SkuStatusNormal {
sku.StockNum = "9999"
} else {
sku.StockNum = "0"
}
if !isCreate {
result, err2 := api.JdShopAPI.FindSkuById(utils.Str2Int64(v.VendorSkuID))
err = err2
if specQuality != result.SaleAttrs[0].AttrValueAlias[0] {
api.JdShopAPI.DeleteSku(utils.Str2Int64(v.VendorSkuID))
}
}
if attrIDs["类别"] != 0 {
values2, _, err2 := api.JdShopAPI.FindValuesByAttrId(attrIDs["类别"])
err = err2
lbValueID := values2[len(values2)-1].ID
attrlb := &jdshopapi.CreateSkuParamAttrs{
AttrID: utils.Int2Str(attrIDs["类别"]),
AttrValues: []string{utils.Int64ToStr(lbValueID)},
}
multiPropSku = append(multiPropSku, attrlb)
}
sku.MultiCateProps = multiPropSku
skus = append(skus, sku)
updateSkusParam.Skus = skus
return updateSkusParam, err
}