package jd // 这里函数取得的信息,除了与自身实体相关的ID(比如PARENT ID),都已经转换成了本地ID了 // type tSkuInfoExt struct { // model.SkuName // JdCatID int64 `orm:"column(jd_cat_id)"` // 商家类别 // JdCategoryID int `orm:"column(jd_category_id)"` // 到家类别 // SkuCatID int64 `orm:"column(sku_cat_id)"` // 商家特殊类别 // Comment string `orm:"size(255)" json:"comment"` // } // var ( // skuAddParamsKeyMap = map[string]int{ // jdapi.KeyUpcCode: 1, // } // ) // func (p *PurchaseHandler) CreateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) (err error) { // var jdPid int64 // if cat.ParentID != 0 { // pCat := &model.SkuCategory{} // pCat.ID = cat.ParentID // if err = dao.GetEntity(db, pCat); err == nil { // jdPid = pCat.JdID // } else { // return err // } // } // if globals.EnableJdStoreWrite { // result, err2 := getAPI("").AddShopCategory(jdPid, cat.Name, int(cat.Level), cat.Seq, userName) // if err = err2; err == nil { // if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 { // cat.JdID = jdID // } // } // } else { // cat.JdID = jxutils.GenFakeID() // } // return err // } // func (p *PurchaseHandler) UpdateCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error { // if globals.EnableJdStoreWrite { // return getAPI("").UpdateShopCategory(cat.JdID, cat.Name) // } // return nil // } // func (p *PurchaseHandler) DeleteCategory(db *dao.DaoDB, cat *model.SkuCategory, userName string) error { // if globals.EnableJdStoreWrite { // return getAPI("").DelShopCategory(cat.JdID) // } // return nil // } // func (p *PurchaseHandler) ReorderCategories(db *dao.DaoDB, parentCatID int, userName string) (err error) { // var parentJDID int64 // if parentCatID != 0 { // cat := &model.SkuCategory{} // cat.ID = parentCatID // if err = dao.GetEntity(db, cat); err != nil { // return err // } // parentJDID = cat.JdID // } // var cats []*model.SkuCategory // if err = dao.GetRows(db, &cats, ` // SELECT * // FROM sku_category // WHERE parent_id = ? AND deleted_at = ? // ORDER BY seq`, parentCatID, utils.DefaultTimeValue); err == nil { // jdCatIDs := make([]int64, len(cats)) // for k, v := range cats { // jdCatIDs[k] = v.JdID // } // if globals.EnableJdStoreWrite { // err = getAPI("").ChangeShopCategoryOrder(parentJDID, jdCatIDs) // } // } // return err // } // func (p *PurchaseHandler) cuSku(db *dao.DaoDB, sku *model.Sku, handler func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (string, error)) (err error) { // var skuInfoExt tSkuInfoExt // err = dao.GetRow(nil, &skuInfoExt, ` // SELECT // t2.*, IF(t2.jd_category_id > 0, t2.jd_category_id, t3.jd_category_id) jd_category_id, // t3.jd_id jd_cat_id, // t4.jd_id sku_cat_id // FROM sku t1 // JOIN sku_name t2 ON t1.name_id = t2.id // JOIN sku_category t3 ON t2.category_id = t3.id // LEFT JOIN sku_category t4 ON t1.category_id = t4.id // WHERE t1.id = ? // `, sku.ID) // if err == nil { // shopCategories := []int64{skuInfoExt.JdCatID} // // SPU只支持SPU的商家分类,不支持单独SKU的,去除SKU的分类 // // if skuInfoExt.SkuCatID != 0 { // // shopCategories = append(shopCategories, skuInfoExt.SkuCatID) // // } // if skuInfoExt.JdCategoryID == 0 { // skuInfoExt.JdCategoryID = getDefJdCategoryID() // } // if skuInfoExt.BrandID == 0 { // skuInfoExt.BrandID = DefBrandID // } // addParams := map[string]interface{}{} // if skuInfoExt.IsGlobal == 0 { //如果不是全国可售,要查可售区域 // sellPlaces, err2 := dao.GetSellCities(db, skuInfoExt.ID, model.VendorIDJD) // if err = err2; err == nil && len(sellPlaces) > 0 { // sellCites := make([]int, len(sellPlaces)) // for k, v := range sellPlaces { // sellCites[k] = v.JdCode // } // addParams["sellCities"] = sellCites // } // } // if addParams["sellCities"] == nil { // addParams["sellCities"] = []int{0} // } // if skuInfoExt.DescImg != "" { // addParams[jdapi.KeyProductDesc] = fmt.Sprintf(`一张图片`, skuInfoExt.DescImg) // addParams[jdapi.KeyIfViewDesc] = 0 // } else { // addParams[jdapi.KeyIfViewDesc] = 1 // } // if err == nil { // skuName := jxutils.ComposeSkuName(skuInfoExt.Prefix, skuInfoExt.Name, sku.Comment, skuInfoExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount) // skuPrice := jxutils.CaculateSkuPrice(skuInfoExt.Price, sku.SpecQuality, sku.SpecUnit, skuInfoExt.Unit) // if skuInfoExt.Upc != "" { // addParams[jdapi.KeyUpcCode] = skuInfoExt.Upc // } // result, err2 := handler(&skuInfoExt, skuPrice, skuName, shopCategories, addParams) // if err = err2; err == nil { // if jdID := utils.Str2Int64WithDefault(result, 0); jdID != 0 { // sku.JdID = jdID // } // } // } // } // return err // } // func (p *PurchaseHandler) CreateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { // return p.cuSku(db, sku, func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) { // if skuExt.IsSpu == 0 { // if globals.EnableJdStoreWrite { // vendorSkuID, err = getAPI("").AddSku(utils.Int2Str(sku.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), jxutils.BatchString2Slice(skuExt.Img, skuExt.Img2), jxStatus2jdStatus(sku.Status), true, addParams) // if err != nil { // if jdSkuID := jdapi.GetJdSkuIDFromError(err); jdSkuID > 0 { // vendorSkuID = utils.Int64ToStr(jdSkuID) // err = nil // } // } // } else { // vendorSkuID = utils.Int64ToStr(jxutils.GenFakeID()) // } // } else { // vendorSkuID, err = p.syncSkuNameAsSpu(db, sku, skuExt, price, skuName, shopCategories, addParams) // } // return vendorSkuID, err // }) // } // // func (p *PurchaseHandler) ReadSku(ctx *jxcontext.Context, vendorOrgCode, vendorSkuID string) (skuNameExt *model.SkuNameExt, err error) { // // jdSkuID := utils.Str2Int64(vendorSkuID) // // a := getAPI(vendorOrgCode) // // skuList, _, err := a.QuerySkuInfos(&jdapi.QuerySkuParam{ // // SkuID: jdSkuID, // // }) // // if err == nil { // // if len(skuList) >= 1 { // // skuNameExt = &model.SkuNameExt{} // // if imgList, err2 := a.QueryListBySkuIds(&jdapi.QueryListBySkuIdsParam{ // // SkuIDs: []int64{jdSkuID}, // // }); err2 == nil && len(imgList) > 0 { // // skuNameExt.Img = imgList[0].SourceImgURL // // } // // sku := skuList[0] // // prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku.SkuName) // // if name == "" { // // name = sku.SkuName // // unit = "份" // // specUnit = "g" // // } // // skuNameExt.Prefix = prefix // // skuNameExt.Name = name // // skuNameExt.Unit = unit // // skuNameExt.Price = sku.SkuPrice // // skuNameExt.Skus = []*model.SkuWithVendor{ // // &model.SkuWithVendor{ // // Sku: &model.Sku{ // // SpecQuality: specQuality, // // SpecUnit: specUnit, // // Weight: jxutils.FloatWeight2Int(float32(sku.Weight)), // // JdID: sku.SkuID, // // Status: jdStatus2jxStatus(sku.FixedStatus), // // Comment: comment, // // }, // // }, // // } // // skuNameExt.Skus[0].ID = int(utils.Str2Int64(sku.OutSkuID)) // // db := dao.GetDB() // // shopCategories := sku.ShopCategories // // if len(shopCategories) > 0 { // // skuCat := &model.SkuCategory{} // // skuCat.JdID = shopCategories[0] // // if dao.GetEntity(db, skuCat, "JdID") == nil { // // skuNameExt.CategoryID = skuCat.ID // // } // // } // // sellCities := sku.SellCities // // for _, v := range sellCities { // // if v == 0 { // // skuNameExt.IsGlobal = 1 // // } // // } // // if len(sellCities) == 0 || skuNameExt.IsGlobal == 1 { // // skuNameExt.IsGlobal = 1 // // } else { // // var places []*model.Place // // if err = dao.GetRows(db, &places, "SELECT * FROM place WHERE jd_code IN ("+dao.GenQuestionMarks(len(sellCities))+") AND level = 2", sellCities); err == nil { // // skuNameExt.Places = make([]int, len(places)) // // for k, v := range places { // // skuNameExt.Places[k] = v.Code // // } // // } // // } // // } else { // // err = partner.ErrCanNotFindItem // // } // // } // // return skuNameExt, err // // } // func (p *PurchaseHandler) UpdateSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { // return p.cuSku(db, sku, func(skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) { // params := utils.MergeMaps(addParams) // params[jdapi.KeyCategoryId] = skuExt.JdCategoryID // params[jdapi.KeyShopCategories] = shopCategories // params[jdapi.KeyBrandId] = skuExt.BrandID // params[jdapi.KeySkuName] = skuName // params[jdapi.KeyWeight] = jxutils.IntWeight2Float(sku.Weight) // params[jdapi.KeyImages] = jxutils.BatchString2Slice(skuExt.Img, skuExt.Img2) // params[jdapi.KeyFixedStatus] = jxStatus2jdStatus(sku.Status) // if skuExt.IsSpu == 0 { // if globals.EnableJdStoreWrite { // vendorSkuID, err = getAPI("").UpdateSku(utils.Int2Str(sku.ID), params) // } // } else { // vendorSkuID, err = p.syncSkuNameAsSpu(db, sku, skuExt, price, skuName, shopCategories, addParams) // } // return vendorSkuID, err // }) // } // func (p *PurchaseHandler) DeleteSku(db *dao.DaoDB, sku *model.Sku, userName string) (err error) { // params := map[string]interface{}{ // jdapi.KeyFixedStatus: jdapi.SkuFixedStatusDeleted, // } // sql := ` // SELECT t2.* // FROM sku t1 // JOIN sku_name t2 ON t1.name_id = t2.id // WHERE t1.id = ? // ` // var skuExt tSkuInfoExt // err = dao.GetRow(db, &skuExt, sql, sku.ID) // if err == nil { // if skuExt.IsSpu == 0 { // if globals.EnableJdStoreWrite { // _, err = getAPI("").UpdateSku(utils.Int2Str(sku.ID), params) // } // } else { // _, err = p.syncSkuNameAsSpu(db, sku, &skuExt, 0, "", nil, nil) // } // } // return err // } // // func (p *PurchaseHandler) RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) { // // globals.SugarLogger.Debugf("jd RefreshAllSkusID") // // db := dao.GetDB() // // var skuPairs []*jdapi.SkuIDPair // // const stepCount = 2 // // rootTask := tasksch.NewSeqTask("jd RefreshAllSkusID", ctx, // // func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { // // switch step { // // case 0: // // err = dao.GetRows(db, &skuPairs, ` // // SELECT t1.id out_sku_id, t1.jd_id sku_id // // FROM sku t1 // // WHERE t1.deleted_at = ? // // `, utils.DefaultTimeValue) // // default: // // taskName := "RefreshAllSkusID update id" // // if step != stepCount-1 { // // taskName = "RefreshAllSkusID update uuid" // // } // // task1 := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true).SetBatchSize(jdapi.MaxBatchSize4BatchUpdateOutSkuId), ctx, // // func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { // // skuPairs := make([]*jdapi.SkuIDPair, len(batchItemList)) // // for k, v := range batchItemList { // // pair := v.(*jdapi.SkuIDPair) // // skuPairs[k] = &jdapi.SkuIDPair{ // // SkuId: pair.SkuId, // // OutSkuId: pair.OutSkuId, // // } // // if step != stepCount-1 { // // skuPairs[k].OutSkuId = utils.GetUUID() // // } // // } // // globals.SugarLogger.Debug(utils.Format4Output(skuPairs, false)) // // if globals.EnableJdStoreWrite { // // _, err = getAPI("").BatchUpdateOutSkuId(skuPairs) // // } // // return nil, err // // }, skuPairs) // // rootTask.AddChild(task1).Run() // // _, err = task1.GetResult(0) // // } // // return nil, err // // }, stepCount) // // tasksch.HandleTask(rootTask, parentTask, false).Run() // // if !isAsync { // // _, err = rootTask.GetResult(0) // // } // // return rootTask.ID, err // // } // func splitAddParams(addParams map[string]interface{}) (spuAddParams, skuAddParams map[string]interface{}) { // if addParams != nil { // spuAddParams = make(map[string]interface{}) // skuAddParams = make(map[string]interface{}) // for key := range addParams { // if skuAddParamsKeyMap[key] == 1 { // skuAddParams[key] = addParams[key] // } else { // spuAddParams[key] = addParams[key] // } // } // } // return spuAddParams, skuAddParams // } // // 这个处理JD SPU,补丁形式 // func (p *PurchaseHandler) syncSkuNameAsSpu(db *dao.DaoDB, sku *model.Sku, skuExt *tSkuInfoExt, price int, skuName string, shopCategories []int64, addParams map[string]interface{}) (vendorSkuID string, err error) { // // SPU的SKU NAME不需要规格信息 // skuName = jxutils.ComposeSkuName(skuExt.Prefix, skuExt.Name, sku.Comment, "", 0, "", 0) // skuNameJdID := skuExt.JdID // globals.SugarLogger.Debugf("syncSkuNameAsSpu1 sku.id=%d, bareSkuName:%s, skuName:%s, skuNameJdID:%d", sku.ID, skuExt.Name, skuName, skuNameJdID) // spuAddParams, skuAddParams := splitAddParams(addParams) // if !jxutils.IsEmptyID(skuNameJdID) && sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 删除SKU // if globals.EnableJdStoreWrite { // err = getAPI("").UpdateSkuBaseInfo(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted)) // } // } // if err == nil { // updateFields := []string{} // if skuExt.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // sql := ` // SELECT COUNT(*) ct // FROM sku t1 // WHERE t1.name_id = ? AND (t1.status <> ? OR t1.jd_sync_status <> 0) // ` // var count struct { // Ct int // } // if err = dao.GetRow(db, &count, sql, sku.NameID, model.SkuStatusDeleted); err != nil { // return "", err // } // if count.Ct <= 1 && sku.JdSyncStatus&model.SyncFlagDeletedMask != 0 { // 1就是最后删的那个 // updateFields = append(updateFields, model.FieldJdSyncStatus) // if globals.EnableJdStoreWrite { // if err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusOffline)); err == nil { // err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), utils.Params2Map(jdapi.KeyFixedStatus, jdapi.SkuFixedStatusDeleted)) // } // } // } // } else if skuExt.JdSyncStatus&model.SyncFlagNewMask != 0 && jxutils.IsEmptyID(skuNameJdID) { // if globals.EnableJdStoreWrite { // spuName := jxutils.ComposeSpuName(skuExt.Prefix, skuExt.Name, 0) // skus := []map[string]interface{}{ // map[string]interface{}{ // jdapi.KeyOutSkuId: utils.Int2Str(sku.ID), // jdapi.KeySkuName: skuName, // jdapi.KeyFixedStatus: jxStatus2jdStatus(sku.Status), // jdapi.KeySkuPrice: price, // jdapi.KeyWeight: jxutils.IntWeight2Float(sku.Weight), // jdapi.KeyIsSale: true, // jdapi.FakeKeySpecAttr: composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit), // }, // } // skus[0] = utils.MergeMaps(skus[0], skuAddParams) // updateFields = append(updateFields, model.FieldJdSyncStatus) // if globals.EnableJdStoreWrite { // vendorSpuID, skuPairs, err2 := getAPI("").AddSpu(utils.Int2Str(skuExt.ID), skuExt.JdCategoryID, shopCategories, skuExt.BrandID, spuName, []string{skuExt.Img}, jxStatus2jdStatus(skuExt.Status), spuAddParams, skus) // if err = err2; err == nil { // skuExt.JdID = vendorSpuID // // skuNameJdID = skuExt.JdID // 这个是故意去掉的,这样之后的首次SKU修改操作就会被忽略,下一条语句也就可以不用了 // // sku.JdSyncStatus &= ^model.SyncFlagNewMask // vendorSkuID = utils.Int64ToStr(skuPairs[0].SkuId) // updateFields = append(updateFields, model.FieldJdID) // } // } // } // } else if skuExt.JdSyncStatus&model.SyncFlagModifiedMask != 0 { // params := utils.MergeMaps(map[string]interface{}{ // jdapi.KeySpuName: jxutils.ComposeSpuName(skuExt.Prefix, skuExt.Name, 0), // jdapi.KeyShopCategories: shopCategories, // jdapi.KeyCategoryId: skuExt.JdCategoryID, // jdapi.KeyBrandId: skuExt.BrandID, // jdapi.KeyImages: []string{skuExt.Img}, // jdapi.KeyFixedStatus: jxStatus2jdStatus(skuExt.Status), // }, spuAddParams) // updateFields = append(updateFields, model.FieldJdSyncStatus) // if globals.EnableJdStoreWrite { // err = getAPI("").UpdateSpu(utils.Int2Str(skuExt.ID), params) // } // } // if err == nil { // if skuExt.JdSyncStatus != 0 && len(updateFields) > 0 { // skuExt.JdSyncStatus = 0 // _, err = dao.UpdateEntity(db, &skuExt.SkuName, updateFields...) // globals.SugarLogger.Debugf("syncSkuNameAsSpu4 sku.id=%d, skuName:%s, skuName:%s", sku.ID, skuExt.Name, utils.Format4Output(&skuExt.SkuName, false)) // } // } // } // if err == nil && !jxutils.IsEmptyID(skuNameJdID) { // if sku.JdSyncStatus&model.SyncFlagNewMask != 0 { // 非首次新增SKU // if globals.EnableJdStoreWrite { // vendorSkuID2, err2 := getAPI("").AppendSku(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{skuExt.Img}, jxStatus2jdStatus(sku.Status), true, composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit), skuAddParams) // if err = err2; err == nil { // vendorSkuID = utils.Int64ToStr(vendorSkuID2) // } // } // } else if sku.JdSyncStatus&model.SyncFlagModifiedMask != 0 { // params := make(map[string]interface{}) // params[jdapi.KeySkuName] = skuName // params[jdapi.KeyImages] = []string{skuExt.Img} // params[jdapi.KeyFixedStatus] = jxStatus2jdStatus(sku.Status) // params[jdapi.KeyWeight] = jxutils.IntWeight2Float(sku.Weight) // params[jdapi.KeySkuPrice] = price // if globals.EnableJdStoreWrite { // err = getAPI("").UpdateSkuBaseInfo(utils.Int2Str(skuExt.ID), utils.Int2Str(sku.ID), utils.MergeMaps(params, skuAddParams)) // if sku.JdSyncStatus&model.SyncFlagSpecMask != 0 { // skuIndex := sku.SkuIndex // if skuIndex > 0 { // saleAttrValue := composeSkuSpec(sku.SpecQuality, sku.SpecUnit, skuExt.Unit) // globals.SugarLogger.Debugf("syncSkuNameAsSpu outSuperId:%d, saleAttrId:%d, saleAttrValueId:%d, saleAttrValueName:%s", skuExt.ID, jdapi.SaleAttrIDBase, jdapi.SaleAttrValueIDBase+skuIndex-1, saleAttrValue) // err = getAPI("").UpdateSpuSaleAttr(utils.Int2Str(skuExt.ID), utils.Int2Str(jdapi.SaleAttrIDBase), "", utils.Int2Str(jdapi.SaleAttrValueIDBase+skuIndex-1), saleAttrValue) // } // } // } // } // if err == nil { // sku.JdSyncStatus = 0 // } // } // return vendorSkuID, err // } // func composeSkuSpec(specQuality float32, specUnit, unit string) string { // prefix := "" // if unit == model.SpecialUnit { // prefix = "约" // } // value := prefix + jxutils.ComposeSkuSpec(specQuality, specUnit) // suffix := "/" + unit // if utf8.RuneCountInString(value) <= 8-utf8.RuneCountInString(suffix) { // value += suffix // } // return value // }