diff --git a/business/jxcallback/orderman/financial.go b/business/jxcallback/orderman/financial.go index bfb79be22..f00091462 100644 --- a/business/jxcallback/orderman/financial.go +++ b/business/jxcallback/orderman/financial.go @@ -255,79 +255,3 @@ func (c *OrderManager) UpdataOrderFinancialInfo(orderFinancial *model.OrderFinan // orderFinancial 和 OrderSkuFinancial 数据计算完毕,准备进行更新 return err } - -// 正向订单设置小费后更新信息,需要再去订单查询列表接口查询小费金额,然后传递过来,感觉这样一个个写非常麻烦(以下demo是以京东为例) -// 为什么不直接用OrderDetail2Financial再处理一遍,通过传递一个type=新建/更新,在SaveOrderFinancialInfo进行相应的数据库操作 - -// func UpdataOrderFinancialInfoByTips(orderFinancial *model.OrderFinancial, orderData map[string]interface{}) (err error) { -// db := dao.GetDB() -// dao.Begin(db) -// defer dao.Rollback(db) -// order1, err2 := api.JdAPI.OrderShoudSettlementService(orderFinancial.VendorOrderID) // 考虑放到上层实现然后传递过来 -// orderFinancial.FreightTipsMoney = utils.MustInterface2Int64(orderData["tips"]) -// pmMoney := orderFinancial.PmMoney -// JxPmMoney := orderFinancial.JxPmMoney -// orderFinancial.PmMoney = 0 -// // 京东/京西平台费可能会变化 -// if err = err2; err == nil { -// orderFinancial.ShopMoney = utils.Interface2Int64WithDefault(order1["settlementAmount"], 0) -// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["goodsCommission"], 0) -// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["freightCommission"], 0) -// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["packageCommission"], 0) -// orderFinancial.PmMoney += utils.Interface2Int64WithDefault(order1["guaranteedCommission"], 0) -// orderFinancial.JxPmMoney = (orderFinancial.ShopMoney+orderFinancial.PmMoney)*TotalRate/1000 - orderFinancial.PmMoney // 京西平台费 = 总金额*20%-第三方平台费 -// if orderFinancial.JxPmMoney < 0 { // 如果算出京西平台费为负数,则置0 -// orderFinancial.JxPmMoney = 0 -// } -// // 计算在此次变动中,第三方平台结算费用的变化值 -// decMoney := orderFinancial.FreightTipsMoney + orderFinancial.PmMoney - pmMoney -// orderFinancial.ShopMoneyByCal -= decMoney -// decMoney2 := decMoney -// // 计算在此次变动中,京西结算费用的变化值 -// jxDecMoney := decMoney + orderFinancial.JxPmMoney - JxPmMoney -// orderFinancial.JxShopMoney -= jxDecMoney -// jxDecMoney2 := jxDecMoney - -// for _, sku := range orderFinancial.Skus[1:] { -// // 重新计算单条sku平台应该结算的金额 -// skuDecMoney := utils.Float64TwoInt64(float64(decMoney*sku.SalePrice*int64(sku.Count)+sku.MealBoxMoney) / float64(orderFinancial.SalePriceMoney+orderFinancial.MealBoxMoney)) -// sku.PmDeductionsMoney += skuDecMoney -// sku.ShopMoneyByCal -= skuDecMoney -// decMoney2 -= skuDecMoney - -// // 重新计算单条sku京西应该结算的金额 -// skuJxDecMoney := utils.Float64TwoInt64(float64(jxDecMoney*sku.SalePrice*int64(sku.Count)+sku.MealBoxMoney) / float64(orderFinancial.SalePriceMoney+orderFinancial.MealBoxMoney)) -// sku.JxDeductionsMoney += skuJxDecMoney -// sku.JxShopMoney -= skuJxDecMoney -// jxDecMoney2 -= skuJxDecMoney -// if err = dao.UpdateEntity(db, sku); err != nil { -// return err -// } -// } -// if len(orderFinancial.Skus) > 0 { -// sku := orderFinancial.Skus[0] - -// sku.PmDeductionsMoney += decMoney2 -// sku.ShopMoneyByCal -= decMoney2 - -// sku.JxDeductionsMoney += jxDecMoney2 -// sku.JxShopMoney -= jxDecMoney2 -// if err = dao.UpdateEntity(db, sku); err != nil { -// return err -// } -// } -// // orderFinancial 和 OrderSkuFinancial 数据计算完毕,准备进行更新 -// // 更新 -// // 更新 - -// } else { -// globals.SugarLogger.Warnf("jd OrderDetail2Financial, orderID:%s is not found from api.JdAPI.OrderShoudSettlementService", orderFinancial.VendorOrderID) -// } -// return err -// } - -// 正向订单转自配送后更新信息 -// func SaveOrderFinancialInfoBySelf(orderFinancial *model.OrderFinancial) (err error) { -// // 此时考虑之前有没有设置小费,如果设置了小费,要扣掉 -// return err -// } diff --git a/business/jxstore/initdata/initdata.go b/business/jxstore/initdata/initdata.go index 448a5b61a..70d0b2ba9 100644 --- a/business/jxstore/initdata/initdata.go +++ b/business/jxstore/initdata/initdata.go @@ -1,13 +1,9 @@ package initdata import ( - "bytes" - "context" "fmt" - "strings" "git.rosy.net.cn/baseapi/platformapi/autonavi" - "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/datares" @@ -16,10 +12,7 @@ import ( "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/purchase/jd" - "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "github.com/qiniu/api.v7/storage" ) func TruncateTable(db *dao.DaoDB, tableName string) (err error) { @@ -142,107 +135,6 @@ func InitPlace(ctx *jxcontext.Context) (err error) { return err } -func RefreshSkuNameImg(ctx *jxcontext.Context, parentTask tasksch.ITask, isForce, isAsync, isContinueWhenError bool) (hint string, err error) { - db := dao.GetDB() - var skuNameList []*model.SkuName - if err = dao.GetRows(db, &skuNameList, ` - SELECT t1.id, t1.img, MAX(t2.jd_id) jd_id - FROM sku_name t1 - JOIN sku t2 ON t2.name_id = t1.id AND t2.deleted_at = ? - WHERE t1.deleted_at = ? - GROUP BY 1,2 - ORDER BY t1.id - `, utils.DefaultTimeValue, utils.DefaultTimeValue); err != nil { - return "", err - } - - task := tasksch.NewParallelTask("RefreshSkuNameImg", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - skuName := batchItemList[0].(*model.SkuName) - if !jxutils.IsEmptyID(skuName.JdID) { - if skuName.Img == "" || isForce { - var imgList []*jdapi.SkuPageImg - if imgList, err = api.JdAPI.GetSkuPageImageInfo(skuName.JdID); err == nil { - if len(imgList) > 0 { - skuName.Img = imgList[0].Big - _, err = dao.UpdateEntity(db, skuName, "Img") - } - } - } - } - return nil, err - }, skuNameList) - tasksch.HandleTask(task, parentTask, true).Run() - if !isAsync { - _, err = task.GetResult(0) - } else { - hint = task.ID - } - return hint, err -} - -// func RefreshImgMd5(ctx *jxcontext.Context, parentTask tasksch.ITask, isForce, isAsync, isContinueWhenError bool) (hint string, err error) { -// db := dao.GetDB() -// var skuNameList []*model.SkuName -// if err = dao.GetRows(db, &skuNameList, ` -// SELECT * -// FROM sku_name -// WHERE deleted_at = ? AND img <> '' -// ORDER BY id -// `, utils.DefaultTimeValue); err != nil { -// return "", err -// } - -// task := tasksch.NewParallelTask("InitSkuName calculate md5", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, -// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { -// skuName := batchItemList[0].(*model.SkuName) -// if skuName.ImgHashCode == "" || isForce { -// response, err := http.Get(skuName.Img) -// if err == nil { -// defer response.Body.Close() -// if response.StatusCode == http.StatusOK { -// data, err2 := ioutil.ReadAll(response.Body) -// if err = err2; err == nil { -// skuName.ImgHashCode = fmt.Sprintf("%X", md5.Sum(data)) -// db := dao.GetDB() -// _, err = dao.UpdateEntity(db, skuName, "ImgHashCode") -// } -// } else { -// err = platformapi.ErrHTTPCodeIsNot200 -// } -// } -// } -// return nil, err -// }, skuNameList) -// tasksch.HandleTask(task, parentTask, true).Run() -// if !isAsync { -// _, err = task.GetResult(0) -// } else { -// hint = task.ID -// } -// return hint, err -// } - -func InitSkuName(ctx *jxcontext.Context, isForce, isAsync, isContinueWhenError bool) (hint string, err error) { - rootTask := tasksch.NewSeqTask("InitSkuName", ctx, - func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { - switch step { - case 0: - _, err = RefreshSkuNameImg(ctx, task, isForce, false, isContinueWhenError) - case 1: - // _, err = RefreshImgMd5(ctx, task, isForce, false, isContinueWhenError) - } - return nil, err - }, 2) - tasksch.ManageTask(rootTask).Run() - if !isAsync { - _, err = rootTask.GetResult(0) - } else { - hint = rootTask.ID - } - return hint, err -} - func InitVendorCategory(ctx *jxcontext.Context, vendorID int, isAsync bool) (hint string, err error) { if handler := partner.GetPurchasePlatformFromVendorID(vendorID); handler != nil { var cats []*model.SkuVendorCategory @@ -386,213 +278,3 @@ func UploadImg4Vendors(ctx *jxcontext.Context, isAsync, isContinueWhenError bool func getSkuNameKey(prefix, name, comment, specUnit, unit string, specQuality float32) string { return fmt.Sprintf("%s-%s-%f-%s-%s", prefix, name, specQuality, specUnit, unit) } - -func BuildSkuFromEbaiStore(ctx *jxcontext.Context, baiduShopID int64, isAsync, isContinueWhenError bool) (hint string, err error) { - ebaiCatIDKey := "ebaiCatID" - catList, err := api.EbaiAPI.PageGetCustomCatList(baiduShopID) - if err != nil { - return hint, err - } - catMap := make(map[string]map[string]interface{}) - - allSkuInfo := make(map[string]map[string]map[string]map[string]interface{}) - for _, cat := range catList { - catName := utils.Interface2String(cat["cat_name"]) - if catName == "限时特惠" || catName == "应季热销" { - catName = "应季水果" - } - skuNameMap := allSkuInfo[catName] - if skuNameMap == nil { - skuNameMap = make(map[string]map[string]map[string]interface{}) - allSkuInfo[catName] = skuNameMap - } - if catMap[catName] == nil { - catMap[catName] = cat - } - skuList, err2 := api.EbaiAPI.PageGetCustomSkuList(baiduShopID, utils.Str2Int64(utils.Interface2String(cat["cat_id"]))) - if err = err2; err != nil { - return hint, err - } - for _, sku := range skuList { - _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string)) - if specQuality > 0 { - if catMap[catName][ebaiCatIDKey] == nil { - catMap[catName][ebaiCatIDKey] = utils.Interface2String(sku["cat3_id"]) - } - skuNameKey := sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string) - if skuNameMap[skuNameKey] == nil { - skuNameMap[skuNameKey] = make(map[string]map[string]interface{}) - } - skuNameMap[skuNameKey][fmt.Sprintf("%f.%s", specQuality, specUnit)] = sku - } - } - } - allSkuInfo2 := make(map[*model.SkuCategory][]*model.SkuNameExt) - catSeq := 0 - for catName, catSkuNameMap := range allSkuInfo { - if len(catSkuNameMap) > 0 { - skuCat := &model.SkuCategory{ - Name: catName, - ParentID: 0, - Level: 1, - Type: model.SkuCategoryNormal, - Seq: catSeq, - EbaiCategoryID: utils.Str2Int64(utils.Interface2String(catMap[catName][ebaiCatIDKey])), - } - catSeq++ - for _, skuList := range catSkuNameMap { - var skuNameExt *model.SkuNameExt - for _, sku := range skuList { - prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string)) - if skuNameExt == nil { - skuNameExt = &model.SkuNameExt{ - SkuName: model.SkuName{ - Prefix: prefix, - Name: name, - // CategoryID: - IsGlobal: 1, - Unit: unit, - SpecQuality: specQuality, - SpecUnit: specUnit, - Price: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), - Img: sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string), - Status: model.SkuStatusNormal, - IsSpu: 0, - }, - } - if len(skuList) > 1 { - skuNameExt.Unit = "份" - skuNameExt.SpecQuality = 500 - skuNameExt.SpecUnit = "g" - } - if skuNameExt.Unit == "份" { - tmpSpecQuality := specQuality - if specUnit == "kg" || specUnit == "l" { - tmpSpecQuality *= 1000 - } - skuNameExt.Price = int(float32(skuNameExt.Price) * 500 / tmpSpecQuality) - } - } - mySku := &model.Sku{ - // CategoryID: - // NameID: - Comment: comment, - SpecQuality: specQuality, - SpecUnit: specUnit, - Weight: int(utils.Str2Int64(utils.Interface2String(sku["weight"]))), - Status: model.SkuStatusNormal, - - LinkID: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), // 临时传递价格用 - } - if sku["enabled"].(string) == "0" { - mySku.Status = model.SkuStatusDontSale - } - skuNameExt.Skus = append(skuNameExt.Skus, mySku) - } - allSkuInfo2[skuCat] = append(allSkuInfo2[skuCat], skuNameExt) - } - } - } - - startOutSkuID := 1000 - var skuCatList []*model.SkuCategory - for cat := range allSkuInfo2 { - skuCatList = append(skuCatList, cat) - } - putPolicy := storage.PutPolicy{ - Scope: globals.QiniuBucket, - // Expires: 10 * 60, - } - cfg := &storage.Config{} - upToken := putPolicy.UploadToken(api.QiniuAPI) - rootTask := tasksch.NewSeqTask("BuildSkuFromEbaiStore", ctx, - func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { - var catID string - cat := skuCatList[step] - skuNameExtList := allSkuInfo2[cat] - catID, err = addShopCategory(0, cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName()) - if err == nil { - shopCategories := []int64{utils.Str2Int64(catID)} - for _, skuNameExt := range skuNameExtList { - var imgContent []byte - skuNameExt.CategoryID = cat.ID - skuNameExt.Img = strings.Replace(skuNameExt.Img, "https://", "http://", 1) - if imgContent, _, err = jxutils.DownloadFileByURL(skuNameExt.Img); err != nil { - globals.SugarLogger.Infof("download pic %s failed with error:%v", skuNameExt.Img, err) - if !isContinueWhenError { - return nil, err - } - err = nil - continue - } - formUploader := storage.NewFormUploader(cfg) - ret := storage.PutRet{} - key := jxutils.GenPicFileName(".jpeg") - for i := 0; i < 3; i++ { - if err = formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(imgContent), int64(len(imgContent)), &storage.PutExtra{}); err == nil { - break - } - } - if err != nil { - globals.SugarLogger.Infof("upload pic %s failed with error:%v", skuNameExt.Img, err) - if !isContinueWhenError { - return nil, err - } - err = nil - continue - } - qiniuImgURL := jxutils.ComposeQiniuResURL(key) + "?imageMogr2/thumbnail/x800/gravity/Center/crop/800x800" - for _, sku := range skuNameExt.Skus { - jdCatID := 22410 // 其他国产水果 - if cat.Name == "进口水果" { - jdCatID = 20342 // 其他进口水果 - } - price := sku.LinkID - sku.LinkID = 0 - skuName := jxutils.ComposeSkuName(skuNameExt.Prefix, skuNameExt.Name, sku.Comment, skuNameExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount) - fixedStatus := 1 - if sku.Status != model.SkuStatusNormal { - fixedStatus = 2 - } - var vendorSkuID string - vendorSkuID, err = addSku(utils.Int2Str(startOutSkuID), jdCatID, shopCategories, jd.DefBrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{qiniuImgURL}, fixedStatus, true, nil) - if err == nil { - globals.SugarLogger.Debugf("vendorSkuID=%s", vendorSkuID) - } else { - globals.SugarLogger.Infof("create %s failed with error:%v", skuName, err) - if !isContinueWhenError { - return nil, err - } - err = nil - } - // fmt.Printf("%s,[%s]%s-%f-%s, %s, %s\n", cat.Name, skuNameExt.Prefix, skuNameExt.Name, skuNameExt.SpecQuality, skuNameExt.SpecUnit, qiniuImgURL, skuName) - startOutSkuID++ - // rootTask.Cancel() - // return nil, nil - } - } - } else { - return nil, err - } - return nil, err - }, len(skuCatList)) - tasksch.ManageTask(rootTask).Run() - if !isAsync { - _, err = rootTask.GetResult(0) - } else { - hint = rootTask.ID - } - return hint, err -} - -func addShopCategory(pid int64, shopCategoryName string, shopCategoryLevel, sort int, userName string) (catId string, err error) { - // globals.SugarLogger.Debug(pid, shopCategoryName, shopCategoryLevel, sort, userName) - // return "123", err - return api.JdAPI.AddShopCategory(pid, shopCategoryName, shopCategoryLevel, sort, userName) -} - -func addSku(outSkuId string, cagtegoryId int, shopCategories []int64, brandId int, skuName string, skuPrice int, weight float32, images []string, fixedStatus int, isSale bool, addParams map[string]interface{}) (skuId string, err error) { - // globals.SugarLogger.Debug(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams) - // return "456", err - return api.JdAPI.AddSku(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams) -} diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index 299d4cb99..34ce3f737 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -2,6 +2,7 @@ package tempop import ( "bytes" + "context" "fmt" "image" "image/jpeg" @@ -15,6 +16,7 @@ import ( "git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin" "git.rosy.net.cn/jx-callback/business/partner/delivery" "github.com/360EntSecGroup-Skylar/excelize" + "github.com/qiniu/api.v7/storage" "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" @@ -29,6 +31,7 @@ import ( "git.rosy.net.cn/jx-callback/business/model/legacymodel" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jd" "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" @@ -600,78 +603,6 @@ type GoodsOrderOriginalEx struct { OrderStatus int } -// func CreateOrderFromOriginal(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (hint string, err error) { -// sqlBatchCount := 5000 -// rootTask := tasksch.NewSeqTask("CreateOrderFromOriginal", ctx, -// func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { -// sql := ` -// SELECT t1.*, t3.order_status -// FROM goods_order_original t1 -// LEFT JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id -// LEFT JOIN jxorder t3 ON t3.order_id = t1.vendor_order_id -// WHERE t2.id IS NULL -// LIMIT ?; -// ` -// db := dao.GetDB() -// var orderList []*GoodsOrderOriginalEx -// if err = dao.GetRows(db, &orderList, sql, sqlBatchCount); err != nil { -// return nil, err -// } -// if len(orderList) > 0 { -// task := tasksch.NewParallelTask("CreateOrderFromOriginal", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(1), ctx, -// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { -// orderOriginal := batchItemList[0].(*GoodsOrderOriginalEx) -// globals.SugarLogger.Debugf("CreateOrderFromOriginal processing orderID:%s", orderOriginal.VendorOrderID) -// if handler := partner.GetPurchasePlatformFromVendorID(orderOriginal.VendorID); handler != nil { -// var detail map[string]interface{} -// if err = utils.UnmarshalUseNumber([]byte(strings.Replace(strings.Replace(orderOriginal.OriginalData, "\n", "", -1), "\r", "", -1)), &detail); err != nil { -// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s, error:%v", orderOriginal.VendorOrderID, err) -// return nil, err -// } -// order := handler.Map2Order(detail) -// if order.Status < model.OrderStatusEndBegin { -// if orderOriginal.OrderStatus == 3 { -// order.Status = model.OrderStatusFinished -// } else if orderOriginal.OrderStatus == 7 { -// order.Status = model.OrderStatusCanceled -// } else { -// order2, err2 := handler.GetOrder(order.VendorOrderID) -// if err = err2; err == nil { -// order.Status = order2.Status -// } else { -// err = nil // ignore get status error -// } -// } -// } -// if err == nil { -// if _, err = orderman.FixedOrderManager.SaveOrder(order, false, dao.GetDB()); err != nil { -// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s, error:%v", orderOriginal.VendorOrderID, err) -// } -// } else { -// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s, error:%v", orderOriginal.VendorOrderID, err) -// } -// } else { -// globals.SugarLogger.Debugf("CreateOrderFromOriginal abnormal orderID:%s", orderOriginal.VendorOrderID) -// } -// return nil, err -// }, orderList) -// // rootTask.AddChild(task).Run() -// task.Run() -// _, err = task.GetResult(0) -// } else { -// rootTask.Cancel() -// } -// return nil, err -// }, math.MaxInt32) -// tasksch.ManageTask(rootTask).Run() -// if !isAsync { -// _, err = rootTask.GetResult(0) -// } else { -// hint = rootTask.ID -// } -// return hint, err -// } - func TransformJdSpu2Sku(ctx *jxcontext.Context, skuNameIDs []int, count int, isAsync, isContinueWhenError bool) (hint string, err error) { sql := ` SELECT t1.* @@ -1359,3 +1290,213 @@ func JdStoreInfo1125() (hint string, err error) { } return hint, err } + +func BuildSkuFromEbaiStore(ctx *jxcontext.Context, baiduShopID int64, isAsync, isContinueWhenError bool) (hint string, err error) { + ebaiCatIDKey := "ebaiCatID" + catList, err := api.EbaiAPI.PageGetCustomCatList(baiduShopID) + if err != nil { + return hint, err + } + catMap := make(map[string]map[string]interface{}) + + allSkuInfo := make(map[string]map[string]map[string]map[string]interface{}) + for _, cat := range catList { + catName := utils.Interface2String(cat["cat_name"]) + if catName == "限时特惠" || catName == "应季热销" { + catName = "应季水果" + } + skuNameMap := allSkuInfo[catName] + if skuNameMap == nil { + skuNameMap = make(map[string]map[string]map[string]interface{}) + allSkuInfo[catName] = skuNameMap + } + if catMap[catName] == nil { + catMap[catName] = cat + } + skuList, err2 := api.EbaiAPI.PageGetCustomSkuList(baiduShopID, utils.Str2Int64(utils.Interface2String(cat["cat_id"]))) + if err = err2; err != nil { + return hint, err + } + for _, sku := range skuList { + _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string)) + if specQuality > 0 { + if catMap[catName][ebaiCatIDKey] == nil { + catMap[catName][ebaiCatIDKey] = utils.Interface2String(sku["cat3_id"]) + } + skuNameKey := sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string) + if skuNameMap[skuNameKey] == nil { + skuNameMap[skuNameKey] = make(map[string]map[string]interface{}) + } + skuNameMap[skuNameKey][fmt.Sprintf("%f.%s", specQuality, specUnit)] = sku + } + } + } + allSkuInfo2 := make(map[*model.SkuCategory][]*model.SkuNameExt) + catSeq := 0 + for catName, catSkuNameMap := range allSkuInfo { + if len(catSkuNameMap) > 0 { + skuCat := &model.SkuCategory{ + Name: catName, + ParentID: 0, + Level: 1, + Type: model.SkuCategoryNormal, + Seq: catSeq, + EbaiCategoryID: utils.Str2Int64(utils.Interface2String(catMap[catName][ebaiCatIDKey])), + } + catSeq++ + for _, skuList := range catSkuNameMap { + var skuNameExt *model.SkuNameExt + for _, sku := range skuList { + prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(sku["upc_name"].(string)) + if skuNameExt == nil { + skuNameExt = &model.SkuNameExt{ + SkuName: model.SkuName{ + Prefix: prefix, + Name: name, + // CategoryID: + IsGlobal: 1, + Unit: unit, + SpecQuality: specQuality, + SpecUnit: specUnit, + Price: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), + Img: sku["photos"].([]interface{})[0].(map[string]interface{})["url"].(string), + Status: model.SkuStatusNormal, + IsSpu: 0, + }, + } + if len(skuList) > 1 { + skuNameExt.Unit = "份" + skuNameExt.SpecQuality = 500 + skuNameExt.SpecUnit = "g" + } + if skuNameExt.Unit == "份" { + tmpSpecQuality := specQuality + if specUnit == "kg" || specUnit == "l" { + tmpSpecQuality *= 1000 + } + skuNameExt.Price = int(float32(skuNameExt.Price) * 500 / tmpSpecQuality) + } + } + mySku := &model.Sku{ + // CategoryID: + // NameID: + Comment: comment, + SpecQuality: specQuality, + SpecUnit: specUnit, + Weight: int(utils.Str2Int64(utils.Interface2String(sku["weight"]))), + Status: model.SkuStatusNormal, + + LinkID: int(jxutils.StandardPrice2Int(utils.MustInterface2Float64(sku["sale_price"]))), // 临时传递价格用 + } + if sku["enabled"].(string) == "0" { + mySku.Status = model.SkuStatusDontSale + } + skuNameExt.Skus = append(skuNameExt.Skus, mySku) + } + allSkuInfo2[skuCat] = append(allSkuInfo2[skuCat], skuNameExt) + } + } + } + + startOutSkuID := 1000 + var skuCatList []*model.SkuCategory + for cat := range allSkuInfo2 { + skuCatList = append(skuCatList, cat) + } + putPolicy := storage.PutPolicy{ + Scope: globals.QiniuBucket, + // Expires: 10 * 60, + } + cfg := &storage.Config{} + upToken := putPolicy.UploadToken(api.QiniuAPI) + rootTask := tasksch.NewSeqTask("BuildSkuFromEbaiStore", ctx, + func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + var catID string + cat := skuCatList[step] + skuNameExtList := allSkuInfo2[cat] + catID, err = addShopCategory(0, cat.Name, int(cat.Level), cat.Seq, ctx.GetUserName()) + if err == nil { + shopCategories := []int64{utils.Str2Int64(catID)} + for _, skuNameExt := range skuNameExtList { + var imgContent []byte + skuNameExt.CategoryID = cat.ID + skuNameExt.Img = strings.Replace(skuNameExt.Img, "https://", "http://", 1) + if imgContent, _, err = jxutils.DownloadFileByURL(skuNameExt.Img); err != nil { + globals.SugarLogger.Infof("download pic %s failed with error:%v", skuNameExt.Img, err) + if !isContinueWhenError { + return nil, err + } + err = nil + continue + } + formUploader := storage.NewFormUploader(cfg) + ret := storage.PutRet{} + key := jxutils.GenPicFileName(".jpeg") + for i := 0; i < 3; i++ { + if err = formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(imgContent), int64(len(imgContent)), &storage.PutExtra{}); err == nil { + break + } + } + if err != nil { + globals.SugarLogger.Infof("upload pic %s failed with error:%v", skuNameExt.Img, err) + if !isContinueWhenError { + return nil, err + } + err = nil + continue + } + qiniuImgURL := jxutils.ComposeQiniuResURL(key) + "?imageMogr2/thumbnail/x800/gravity/Center/crop/800x800" + for _, sku := range skuNameExt.Skus { + jdCatID := 22410 // 其他国产水果 + if cat.Name == "进口水果" { + jdCatID = 20342 // 其他进口水果 + } + price := sku.LinkID + sku.LinkID = 0 + skuName := jxutils.ComposeSkuName(skuNameExt.Prefix, skuNameExt.Name, sku.Comment, skuNameExt.Unit, sku.SpecQuality, sku.SpecUnit, jdapi.MaxSkuNameCharCount) + fixedStatus := 1 + if sku.Status != model.SkuStatusNormal { + fixedStatus = 2 + } + var vendorSkuID string + vendorSkuID, err = addSku(utils.Int2Str(startOutSkuID), jdCatID, shopCategories, jd.DefBrandID, skuName, price, jxutils.IntWeight2Float(sku.Weight), []string{qiniuImgURL}, fixedStatus, true, nil) + if err == nil { + globals.SugarLogger.Debugf("vendorSkuID=%s", vendorSkuID) + } else { + globals.SugarLogger.Infof("create %s failed with error:%v", skuName, err) + if !isContinueWhenError { + return nil, err + } + err = nil + } + // fmt.Printf("%s,[%s]%s-%f-%s, %s, %s\n", cat.Name, skuNameExt.Prefix, skuNameExt.Name, skuNameExt.SpecQuality, skuNameExt.SpecUnit, qiniuImgURL, skuName) + startOutSkuID++ + // rootTask.Cancel() + // return nil, nil + } + } + } else { + return nil, err + } + return nil, err + }, len(skuCatList)) + tasksch.ManageTask(rootTask).Run() + if !isAsync { + _, err = rootTask.GetResult(0) + } else { + hint = rootTask.ID + } + return hint, err +} + +func addShopCategory(pid int64, shopCategoryName string, shopCategoryLevel, sort int, userName string) (catId string, err error) { + // globals.SugarLogger.Debug(pid, shopCategoryName, shopCategoryLevel, sort, userName) + // return "123", err + return api.JdAPI.AddShopCategory(pid, shopCategoryName, shopCategoryLevel, sort, userName) +} + +func addSku(outSkuId string, cagtegoryId int, shopCategories []int64, brandId int, skuName string, skuPrice int, weight float32, images []string, fixedStatus int, isSale bool, addParams map[string]interface{}) (skuId string, err error) { + // globals.SugarLogger.Debug(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams) + // return "456", err + return api.JdAPI.AddSku(outSkuId, cagtegoryId, shopCategories, brandId, skuName, skuPrice, weight, images, fixedStatus, isSale, addParams) +} diff --git a/controllers/init_data.go b/controllers/init_data.go index 91a6b0b39..b14810151 100644 --- a/controllers/init_data.go +++ b/controllers/init_data.go @@ -22,22 +22,6 @@ func (c *InitDataController) InitPlace() { }) } -// @Title 初始化skuname(当前主要是计算md5) -// @Description 初始化skuname(当前主要是计算md5) -// @Param token header string true "认证token" -// @Param isForce formData bool false "是否强刷,即即使本地已经有了hashCode也重新计算,缺省为false" -// @Param isAsync formData bool false "是否异步操作" -// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" -// @Success 200 {object} controllers.CallResult -// @Failure 200 {object} controllers.CallResult -// @router /InitSkuName [post] -func (c *InitDataController) InitSkuName() { - c.callInitSkuName(func(params *tInitdataInitSkuNameParams) (retVal interface{}, errCode string, err error) { - retVal, err = initdata.InitSkuName(params.Ctx, params.IsForce, params.IsAsync, params.IsContinueWhenError) - return retVal, "", err - }) -} - // @Title 初始化vendor category // @Description 初始化vendor category // @Param token header string true "认证token" @@ -67,19 +51,3 @@ func (c *InitDataController) UploadImage4Vendors() { return retVal, "", err }) } - -// @Title 从饿百店建商品 -// @Description 从饿百店建商品 -// @Param token header string true "认证token" -// @Param baiduShopID formData int true "skuNameID" -// @Param isAsync formData bool false "是否异步操作" -// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" -// @Success 200 {object} controllers.CallResult -// @Failure 200 {object} controllers.CallResult -// @router /BuildSkuFromEbaiStore [post] -func (c *InitDataController) BuildSkuFromEbaiStore() { - c.callBuildSkuFromEbaiStore(func(params *tInitdataBuildSkuFromEbaiStoreParams) (retVal interface{}, errCode string, err error) { - retVal, err = initdata.BuildSkuFromEbaiStore(params.Ctx, int64(params.BaiduShopID), params.IsAsync, params.IsContinueWhenError) - return retVal, "", err - }) -} diff --git a/controllers/temp_op.go b/controllers/temp_op.go index c9524bd6c..b2ab93b95 100644 --- a/controllers/temp_op.go +++ b/controllers/temp_op.go @@ -352,3 +352,19 @@ func (c *TempOpController) FixMtwmCategory() { return retVal, "", err }) } + +// @Title 从饿百店建商品 +// @Description 从饿百店建商品 +// @Param token header string true "认证token" +// @Param baiduShopID formData int true "skuNameID" +// @Param isAsync formData bool false "是否异步操作" +// @Param isContinueWhenError formData bool false "单个同步失败是否继续,缺省false" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /BuildSkuFromEbaiStore [post] +func (c *TempOpController) BuildSkuFromEbaiStore() { + c.callBuildSkuFromEbaiStore(func(params *tTempopBuildSkuFromEbaiStoreParams) (retVal interface{}, errCode string, err error) { + retVal, err = tempop.BuildSkuFromEbaiStore(params.Ctx, int64(params.BaiduShopID), params.IsAsync, params.IsContinueWhenError) + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index efb874ecf..1abd060ff 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -484,15 +484,6 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"], - beego.ControllerComments{ - Method: "BuildSkuFromEbaiStore", - Router: `/BuildSkuFromEbaiStore`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Filters: nil, - Params: nil}) - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"], beego.ControllerComments{ Method: "Change2JDSPU4Store", @@ -529,15 +520,6 @@ func init() { Filters: nil, Params: nil}) - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"], - beego.ControllerComments{ - Method: "InitSkuName", - Router: `/InitSkuName`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Filters: nil, - Params: nil}) - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:InitDataController"], beego.ControllerComments{ Method: "InitVendorCategory", @@ -1818,6 +1800,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"], + beego.ControllerComments{ + Method: "BuildSkuFromEbaiStore", + Router: `/BuildSkuFromEbaiStore`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:TempOpController"], beego.ControllerComments{ Method: "CheckSkuDiffBetweenJxAndVendor",