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, _, _ := jxutils.DownloadFileByURL(img + model.SkuNameImgToPng); err == nil { downloadURL, _ := jxutils.UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix())) imageURL, _ = uploadImg(downloadURL, name, "tou") } } else { imageURL, _ = uploadImg(img, name, "tou") } } api.JdShopAPI.TransparentImageAdd(createSkuResult.WareID, imageURL) } 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, ShopCategorys: []int{utils.Str2Int(v.VendorCatID)}, } var desc string if v.DescImg != "" { pic3, err2 := uploadImg2(v.DescImg, name, "desc") err = err2 desc = `



` } else { desc = `



` } 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 { if v.JdsStockSwitch == model.NO { stock = 0 } 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("京东商城店内分类创建失败!") } if err != nil { return err } 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 storeCat.VendorCatID == "" { return fmt.Errorf("京东商城店内分类创建可能失败了!storeID: %v", storeID) } // 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 } if storeSku.VendorVendorCatID == jdshopapi.JdsBeefCatID { createSkuParamWare.MultiCategoryID = jdshopapi.JdsBeefLastCatID } //上传京东图片 //规则,有两张就传两张,没有就重复传一张 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 = `



` } else { desc = `



` } 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 rmsjValueID 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 } 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) } if attrIDs["热卖时间"] != 0 { values2, _, err2 := api.JdShopAPI.FindValuesByAttrId(attrIDs["热卖时间"]) err = err2 for _, v := range values2 { if v.Name == "12月" { rmsjValueID = v.ID } } attrrmsj := &jdshopapi.CreateSkuParamAttrs{ AttrID: utils.Int2Str(attrIDs["热卖时间"]), AttrValues: []string{utils.Int64ToStr(rmsjValueID)}, } attrsProp = append(attrsProp, attrrmsj) } if storeSku.VendorVendorCatID == jdshopapi.JdsBeefCatID { var exValueID int64 values2, _, err2 := api.JdShopAPI.FindValuesByAttrId(150390) err = err2 for _, v := range values2 { if v.Name == "其它" { exValueID = v.ID } } attrex := &jdshopapi.CreateSkuParamAttrs{ AttrID: utils.Int2Str(150390), AttrValues: []string{utils.Int64ToStr(exValueID)}, } attrsProp = append(attrsProp, attrex) } 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 }