From 38046bbe247129476ea34489b1ceaf68099a5398 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 11:21:54 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=E5=B0=BD=E9=87=8F=E5=87=8F=E5=B0=91?= =?UTF-8?q?=E5=AF=B9=E4=BA=8Eapi.JdAPI=E7=9A=84=E7=9B=B4=E6=8E=A5=E4=BE=9D?= =?UTF-8?q?=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxcallback/orderman/financial.go | 76 ------ business/jxstore/initdata/initdata.go | 318 ---------------------- business/jxstore/tempop/tempop.go | 285 ++++++++++++++----- controllers/init_data.go | 32 --- controllers/temp_op.go | 16 ++ routers/commentsRouter_controllers.go | 27 +- 6 files changed, 238 insertions(+), 516 deletions(-) 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", From c98299cdcb15058dc10f41a3c132edbf655bc74b Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 11:48:16 +0800 Subject: [PATCH 02/17] debug --- business/partner/purchase/jx/localjx/wxpay.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/business/partner/purchase/jx/localjx/wxpay.go b/business/partner/purchase/jx/localjx/wxpay.go index 3fa7d4c79..62d71fad7 100644 --- a/business/partner/purchase/jx/localjx/wxpay.go +++ b/business/partner/purchase/jx/localjx/wxpay.go @@ -57,6 +57,7 @@ func pay4OrderByWX(ctx *jxcontext.Context, order *model.GoodsOrder, vendorPayTyp } func OnWxPayCallback(msg *wxpay.CallbackMsg) (err error) { + globals.SugarLogger.Debugf("OnWxPayCallback msg:%s", utils.Format4Output(msg, true)) switch msg.MsgType { case wxpay.MsgTypePay: err = onWxpayFinished(msg.Data.(*wxpay.PayResultMsg)) @@ -88,6 +89,8 @@ func onWxpayFinished(msg *wxpay.PayResultMsg) (err error) { if msg.ResultCode == wxpay.ResponseCodeSuccess { err = OnPayFinished(orderPay) } + } else { + globals.SugarLogger.Debugf("onWxpayFinished msg:%s, err:%v", utils.Format4Output(msg, true), err) } return err } From dabbfc1dd642f1e735b09daddf52be04372a55b3 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 11:57:27 +0800 Subject: [PATCH 03/17] up --- controllers/wxpay_callback.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/controllers/wxpay_callback.go b/controllers/wxpay_callback.go index dc7c2d049..67c30eb01 100644 --- a/controllers/wxpay_callback.go +++ b/controllers/wxpay_callback.go @@ -5,7 +5,9 @@ import ( "net/http" "git.rosy.net.cn/baseapi/platformapi/wxpay" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx" + "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego" ) @@ -17,6 +19,7 @@ type WXPayController struct { func (c *WXPayController) Msg() { if c.Ctx.Input.Method() == http.MethodPost { msg, callbackResponse := api.WxpayAPI.GetCallbackMsg(c.Ctx.Request) + globals.SugarLogger.Debugf("wxpay callback msg:%s, callbackResponse:%s", utils.Format4Output(msg, true), utils.Format4Output(callbackResponse, true)) var err error if callbackResponse == nil { if msg.MsgType != wxpay.MsgTypeUnkown { From 596afbd8c585355ec9bcebd718fa735d6722bc5d Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 12:08:51 +0800 Subject: [PATCH 04/17] fk --- controllers/wxpay_callback.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/controllers/wxpay_callback.go b/controllers/wxpay_callback.go index 67c30eb01..5fe56ca86 100644 --- a/controllers/wxpay_callback.go +++ b/controllers/wxpay_callback.go @@ -19,12 +19,15 @@ type WXPayController struct { func (c *WXPayController) Msg() { if c.Ctx.Input.Method() == http.MethodPost { msg, callbackResponse := api.WxpayAPI.GetCallbackMsg(c.Ctx.Request) - globals.SugarLogger.Debugf("wxpay callback msg:%s, callbackResponse:%s", utils.Format4Output(msg, true), utils.Format4Output(callbackResponse, true)) + globals.SugarLogger.Debugf("wxpay callback msg:%s, callbackResponse:%s, %t", utils.Format4Output(msg, true), utils.Format4Output(callbackResponse, true), callbackResponse == nil) var err error if callbackResponse == nil { + globals.SugarLogger.Debugf("wxpay callback1 msg:%s", utils.Format4Output(msg, true)) if msg.MsgType != wxpay.MsgTypeUnkown { + globals.SugarLogger.Debugf("wxpay callback2 msg:%s", utils.Format4Output(msg, true)) err = fmt.Errorf("未知的微信支付回调类型:%d", msg.MsgType) } else { + globals.SugarLogger.Debugf("wxpay callback3 msg:%s", utils.Format4Output(msg, true)) err = localjx.OnWxPayCallback(msg) } } From ea3cd1b8335945fa22eb8538cbab3015ba7b504a Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 12:12:03 +0800 Subject: [PATCH 05/17] fk --- controllers/wxpay_callback.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/controllers/wxpay_callback.go b/controllers/wxpay_callback.go index 5fe56ca86..2d6d89e7d 100644 --- a/controllers/wxpay_callback.go +++ b/controllers/wxpay_callback.go @@ -5,9 +5,7 @@ import ( "net/http" "git.rosy.net.cn/baseapi/platformapi/wxpay" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx" - "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego" ) @@ -19,15 +17,12 @@ type WXPayController struct { func (c *WXPayController) Msg() { if c.Ctx.Input.Method() == http.MethodPost { msg, callbackResponse := api.WxpayAPI.GetCallbackMsg(c.Ctx.Request) - globals.SugarLogger.Debugf("wxpay callback msg:%s, callbackResponse:%s, %t", utils.Format4Output(msg, true), utils.Format4Output(callbackResponse, true), callbackResponse == nil) + // globals.SugarLogger.Debugf("wxpay callback msg:%s, callbackResponse:%s, %t", utils.Format4Output(msg, true), utils.Format4Output(callbackResponse, true), callbackResponse == nil) var err error if callbackResponse == nil { - globals.SugarLogger.Debugf("wxpay callback1 msg:%s", utils.Format4Output(msg, true)) - if msg.MsgType != wxpay.MsgTypeUnkown { - globals.SugarLogger.Debugf("wxpay callback2 msg:%s", utils.Format4Output(msg, true)) + if msg.MsgType == wxpay.MsgTypeUnkown { err = fmt.Errorf("未知的微信支付回调类型:%d", msg.MsgType) } else { - globals.SugarLogger.Debugf("wxpay callback3 msg:%s", utils.Format4Output(msg, true)) err = localjx.OnWxPayCallback(msg) } } From 84dac23be8180196be2de1ae23a5289771c4859b Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 15:07:50 +0800 Subject: [PATCH 06/17] =?UTF-8?q?=E4=BA=AC=E4=B8=9C=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=A0=B9=E6=8D=AEtoken=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E4=B8=8D=E5=90=8C=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/partner/partner_api.go | 1 + business/partner/purchase/jd/jd.go | 16 ++++++ controllers/jd_callback.go | 78 +++++++++++++++++----------- globals/api/apimanager/apimanager.go | 12 +++++ 4 files changed, 78 insertions(+), 29 deletions(-) diff --git a/business/partner/partner_api.go b/business/partner/partner_api.go index 386527933..3e1b15a17 100644 --- a/business/partner/partner_api.go +++ b/business/partner/partner_api.go @@ -2,6 +2,7 @@ package partner type IAPIManager interface { GetAPI(vendorID int, appOrgCode string) interface{} + GetAPIList(vendorID int) []interface{} GetAppOrgCodeList(vendorID int) (appOrgCodeList []string) } diff --git a/business/partner/purchase/jd/jd.go b/business/partner/purchase/jd/jd.go index f80525291..66b30d0f8 100644 --- a/business/partner/purchase/jd/jd.go +++ b/business/partner/purchase/jd/jd.go @@ -26,6 +26,22 @@ func getAPI(appOrgCode string) (apiObj *jdapi.API) { return partner.CurAPIManager.GetAPI(model.VendorIDJD, appOrgCode).(*jdapi.API) } +func GetAPIByToken(token string) (apiObj *jdapi.API) { + if token == "" { + apiObj = getAPI("") + } else { + apiList := partner.CurAPIManager.GetAPIList(model.VendorIDJD) + for _, v := range apiList { + jdAPI := v.(*jdapi.API) + if jdAPI.GetToken() == token { + apiObj = jdAPI + break + } + } + } + return apiObj +} + func (c *PurchaseHandler) GetVendorID() int { return model.VendorIDJD } diff --git a/controllers/jd_callback.go b/controllers/jd_callback.go index 3aa5f753b..60c39a6c4 100644 --- a/controllers/jd_callback.go +++ b/controllers/jd_callback.go @@ -2,14 +2,15 @@ package controllers import ( "bytes" + "fmt" "io/ioutil" "net/http" + "net/url" "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/utils" "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/astaxie/beego" "github.com/astaxie/beego/context" ) @@ -19,20 +20,27 @@ type DjswController struct { beego.Controller } +func (c *DjswController) handleMsg(isNeedDecode bool, handler func(*jdapi.API, url.Values, string) *jdapi.CallbackResponse) (callbackResponse *jdapi.CallbackResponse) { + values, token, msgURL, callbackResponse := jdapi.GetCallbackMsg(getUsefulRequest(c.Ctx), isNeedDecode) + if callbackResponse == nil { + if jdAPI := jd.GetAPIByToken(token); jdAPI != nil { + callbackResponse = handler(jdAPI, values, msgURL) + } else { + callbackResponse = jdapi.Err2CallbackResponse(fmt.Errorf("没有匹配的token,非法请求"), "") + } + } + return callbackResponse +} + func (c *DjswController) orderStatus(isCancelOrder bool) { if c.Ctx.Input.Method() == http.MethodPost { - var obj *jdapi.CallbackOrderMsg - var callbackResponse *jdapi.CallbackResponse - - if isCancelOrder { - obj, callbackResponse = api.JdAPI.GetOrderApplyCancelCallbackMsg(getUsefulRequest(c.Ctx)) - } else { - obj, callbackResponse = api.JdAPI.GetOrderCallbackMsg(getUsefulRequest(c.Ctx)) - } - globals.SugarLogger.Debug(utils.Format4Output(obj, true)) - if callbackResponse == nil { - callbackResponse = jd.OnOrderMsg(obj) - } + callbackResponse := c.handleMsg(isCancelOrder, func(a *jdapi.API, values url.Values, msgURL string) (callbackResponse *jdapi.CallbackResponse) { + obj, callbackResponse := a.GetOrderCallbackMsg(values, msgURL) + if callbackResponse == nil { + callbackResponse = jd.OnOrderMsg(obj) + } + return callbackResponse + }) c.Data["json"] = c.transferResponse("orderStatus", callbackResponse) c.ServeJSON() } else { @@ -82,10 +90,13 @@ func (c *DjswController) ApplyCancelOrder() { func (c *DjswController) PushDeliveryStatus() { if c.Ctx.Input.Method() == http.MethodPost { - obj, callbackResponse := api.JdAPI.GetOrderDeliveryCallbackMsg(getUsefulRequest(c.Ctx)) - if callbackResponse == nil { - callbackResponse = jd.OnWaybillMsg(obj) - } + callbackResponse := c.handleMsg(true, func(a *jdapi.API, values url.Values, msgURL string) (callbackResponse *jdapi.CallbackResponse) { + obj, callbackResponse := a.GetOrderDeliveryCallbackMsg(values, msgURL) + if callbackResponse == nil { + callbackResponse = jd.OnWaybillMsg(obj) + } + return callbackResponse + }) c.Data["json"] = c.transferResponse("PushDeliveryStatus", callbackResponse) c.ServeJSON() } else { @@ -109,10 +120,13 @@ func (c *DjswController) Token() { func (c *DjswController) StockIsHave() { // globals.SugarLogger.Info(string(c.Ctx.Input.RequestBody)) if c.Ctx.Input.Method() == http.MethodPost { - _, callbackResponse := api.JdAPI.GetStoreStockCallbackMsg(getUsefulRequest(c.Ctx)) - if callbackResponse == nil { - // globals.SugarLogger.Debugf("StockIsHave, obj:%s", utils.Format4Output(obj, false)) - } + callbackResponse := c.handleMsg(true, func(a *jdapi.API, values url.Values, msgURL string) (callbackResponse *jdapi.CallbackResponse) { + _, callbackResponse = a.GetStoreStockCallbackMsg(values, msgURL) + if callbackResponse == nil { + // globals.SugarLogger.Debugf("StockIsHave, obj:%s", utils.Format4Output(obj, false)) + } + return callbackResponse + }) c.Data["json"] = c.transferResponse("StockIsHave", callbackResponse) c.ServeJSON() } else { @@ -122,10 +136,13 @@ func (c *DjswController) StockIsHave() { func (c *DjswController) SinglePromoteCreate() { if c.Ctx.Input.Method() == http.MethodPost { - obj, callbackResponse := api.JdAPI.GetOrderCallbackMsg(getUsefulRequest(c.Ctx)) - if callbackResponse == nil { - callbackResponse = jd.OnActMsg(obj) - } + callbackResponse := c.handleMsg(false, func(a *jdapi.API, values url.Values, msgURL string) (callbackResponse *jdapi.CallbackResponse) { + obj, callbackResponse := a.GetOrderCallbackMsg(values, msgURL) + if callbackResponse == nil { + callbackResponse = jd.OnActMsg(obj) + } + return callbackResponse + }) c.Data["json"] = c.transferResponse("SinglePromoteCreate", callbackResponse) c.ServeJSON() } else { @@ -135,10 +152,13 @@ func (c *DjswController) SinglePromoteCreate() { func (c *DjswController) StoreCrud() { if c.Ctx.Input.Method() == http.MethodPost { - obj, callbackResponse := api.JdAPI.GetOrderCallbackMsg(getUsefulRequest(c.Ctx)) - if callbackResponse == nil { - callbackResponse = jd.OnStoreMsg(obj) - } + callbackResponse := c.handleMsg(false, func(a *jdapi.API, values url.Values, msgURL string) (callbackResponse *jdapi.CallbackResponse) { + obj, callbackResponse := a.GetOrderCallbackMsg(values, msgURL) + if callbackResponse == nil { + callbackResponse = jd.OnStoreMsg(obj) + } + return callbackResponse + }) c.Data["json"] = c.transferResponse("StoreCrud", callbackResponse) c.ServeJSON() } else { diff --git a/globals/api/apimanager/apimanager.go b/globals/api/apimanager/apimanager.go index 6e62c34b6..88d2c7ca6 100644 --- a/globals/api/apimanager/apimanager.go +++ b/globals/api/apimanager/apimanager.go @@ -38,6 +38,18 @@ func (a *APIManager) GetAPI(vendorID int, appOrgCode string) (pfAPI interface{}) return pfAPI } +func (a *APIManager) GetAPIList(vendorID int) (pfAPIList []interface{}) { + switch vendorID { + case model.VendorIDJD: + pfAPIList = []interface{}{api.JdAPI} + case model.VendorIDMTWM: + pfAPIList = []interface{}{api.MtwmAPI} + case model.VendorIDEBAI: + pfAPIList = []interface{}{api.EbaiAPI} + } + return pfAPIList +} + func (a *APIManager) GetAppOrgCodeList(vendorID int) (appOrgCodeList []string) { switch vendorID { case model.VendorIDJD: From 902c770515a544b3ff79762a76d4b23ebdc53a6b Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 15:34:14 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=E8=B0=83=E6=95=B4GetOrders=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E6=8E=92=E5=BA=8F=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/model/dao/dao_order.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index b8965c0ba..02982381a 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -899,7 +899,7 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat ORDER BY IF(t1.status < ?, IF(t1.vendor_id = ?, 0, 1), 0), t1.order_created_at DESC` sqlParams = append(sqlParams, model.OrderStatusEndBegin, model.VendorIDJX) } else { - if isIncludeSku { + if isIncludeSku && userID == "" { sql += ` ORDER BY t1.id` } else { From c75769495a94eed00606eaf7c87988f746baa79f Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 15:54:33 +0800 Subject: [PATCH 08/17] remove some comment --- business/partner/partner.go | 4 -- business/partner/purchase/jd/store.go | 46 ---------------------- business/partner/purchase/jd/store_sku2.go | 14 ------- 3 files changed, 64 deletions(-) diff --git a/business/partner/partner.go b/business/partner/partner.go index 7327885f9..8af7d7564 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -146,10 +146,6 @@ type IPurchasePlatformHandler interface { GetStoreStatus(ctx *jxcontext.Context, storeID int, vendorStoreID string) (storeStatus int, err error) UpdateStoreCustomID(ctx *jxcontext.Context, vendorStoreID string, storeID int64) (err error) - // SyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) - // // !!!注意,此操作会先清除门店已有的商品,一般用于初始化,小心使用 - // FullSyncStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, isAsync, isContinueWhenError bool) (hint string, err error) - RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) UploadImg(ctx *jxcontext.Context, imgURL string, imgData []byte, imgName string, imgType int) (imgHint string, err error) diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index 039fd747e..43c54fa2c 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -207,24 +207,6 @@ func (p *PurchaseHandler) UpdateStore(db *dao.DaoDB, storeID int, userName strin return err } -/////////////////////// -func (p *PurchaseHandler) GetAllStoresFromRemote() ([]*model.Store, error) { - ids, err := p.GetAllStoresVendorID(jxcontext.AdminCtx) - if err == nil { - retVal := make([]*model.Store, len(ids)) - for index, id := range ids { - store, err2 := p.ReadStore(jxcontext.AdminCtx, id) - if err2 == nil { - retVal[index] = &store.Store - } else { - return nil, err2 - } - } - return retVal, nil - } - return nil, err -} - func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) { globals.SugarLogger.Debugf("jd RefreshAllStoresID") const stepCount = 3 @@ -274,34 +256,6 @@ func (p *PurchaseHandler) RefreshAllStoresID(ctx *jxcontext.Context, parentTask return rootTask.ID, err } -// func JdRange2JxRange(jdRanges string) (jxRanges string) { -// coords := strings.Split(jdRanges, ";") -// intCoords := []string{} -// for _, coord := range coords { -// items := strings.Split(coord, ",") -// if len(items) == 2 { -// lng := jxutils.StandardCoordinate2Int(utils.Str2Float64(items[0])) -// lat := jxutils.StandardCoordinate2Int(utils.Str2Float64(items[1])) -// intCoords = append(intCoords, fmt.Sprintf("%d,%d", lng, lat)) -// } -// } -// return strings.Join(intCoords, ";") -// } - -// func JxRange2JdRange(jxRanges string) (jdRanges string) { -// coords := strings.Split(jxRanges, ";") -// intCoords := []string{} -// for _, coord := range coords { -// items := strings.Split(coord, ",") -// if len(items) == 2 { -// lng := jxutils.IntCoordinate2Standard(int(utils.Str2Int64(items[0]))) -// lat := jxutils.IntCoordinate2Standard(int(utils.Str2Int64(items[1]))) -// intCoords = append(intCoords, fmt.Sprintf("%f,%f", lng, lat)) -// } -// } -// return strings.Join(intCoords, ";") -// } - func JdDeliveryType2Jx(deliveryType int) int8 { if deliveryType == jdapi.CarrierNoSelfDelivery { return scheduler.StoreDeliveryTypeByStore diff --git a/business/partner/purchase/jd/store_sku2.go b/business/partner/purchase/jd/store_sku2.go index f6b5a46d8..304e9af7b 100644 --- a/business/partner/purchase/jd/store_sku2.go +++ b/business/partner/purchase/jd/store_sku2.go @@ -211,17 +211,3 @@ func (p *PurchaseHandler) SyncStoreProducts(ctx *jxcontext.Context, parentTask t } return hint, err } - -// func (p *PurchaseHandler) ReorderStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, vendorCatID string, storeSkuList []*partner.StoreSkuInfo) (err error) { -// storeSkuCount := len(storeSkuList) -// if storeSkuCount > 0 { -// if storeSkuCount > jdapi.MaxAddByStoreAndSkusCount { -// storeSkuList = storeSkuList[:jdapi.MaxAddByStoreAndSkusCount] -// } -// vendorSkuIDs := partner.BareStoreSkuInfoList(storeSkuList).GetVendorSkuIDIntList() -// if globals.EnableJdStoreWrite { -// err = getAPI("").AddByStoreAndSkus(utils.Str2Int64(vendorStoreID), vendorSkuIDs) -// } -// } -// return err -// } From 86f37ba367378b44de32541777229c6016438e94 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 16:36:20 +0800 Subject: [PATCH 09/17] up --- business/partner/purchase/jx/phpjx/order.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/partner/purchase/jx/phpjx/order.go b/business/partner/purchase/jx/phpjx/order.go index 0b513e4b4..dda421a47 100644 --- a/business/partner/purchase/jx/phpjx/order.go +++ b/business/partner/purchase/jx/phpjx/order.go @@ -64,7 +64,7 @@ func callbackMsg2Status(msg *CallbackMsg) *model.OrderStatus { func onOrderNew(msg *CallbackMsg, subMsgType int, order *Data4Neworder) (retVal, errCode string, err error) { globals.SugarLogger.Debugf("onOrderNew orderID:%s", msg.ThingID) order.StoreID = int(utils.Str2Int64WithDefault(order.VendorStoreID, 0)) - order.DeliveryType = model.OrderDeliveryTypeStoreSelf + // order.DeliveryType = model.OrderDeliveryTypeStoreSelf order.GoodsOrder.Skus = order.Skus order.VendorID = model.VendorIDJX order.Flag = model.OrderFlagMaskTempJX From b25b7ebe41de0da16b190e08dc5fe7a0bde34e05 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 16:38:20 +0800 Subject: [PATCH 10/17] fk --- business/partner/purchase/jx/phpjx/order.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/business/partner/purchase/jx/phpjx/order.go b/business/partner/purchase/jx/phpjx/order.go index dda421a47..fa079d957 100644 --- a/business/partner/purchase/jx/phpjx/order.go +++ b/business/partner/purchase/jx/phpjx/order.go @@ -64,7 +64,9 @@ func callbackMsg2Status(msg *CallbackMsg) *model.OrderStatus { func onOrderNew(msg *CallbackMsg, subMsgType int, order *Data4Neworder) (retVal, errCode string, err error) { globals.SugarLogger.Debugf("onOrderNew orderID:%s", msg.ThingID) order.StoreID = int(utils.Str2Int64WithDefault(order.VendorStoreID, 0)) - // order.DeliveryType = model.OrderDeliveryTypeStoreSelf + if order.DeliveryType == "" { + order.DeliveryType = model.OrderDeliveryTypeStoreSelf + } order.GoodsOrder.Skus = order.Skus order.VendorID = model.VendorIDJX order.Flag = model.OrderFlagMaskTempJX From 457bd4b0a2531eab007b6ab67f97d19d470c6fd0 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 17:52:51 +0800 Subject: [PATCH 11/17] =?UTF-8?q?GetStoreOrderAfterTime=E6=8E=92=E9=99=A4?= =?UTF-8?q?=E5=86=85=E9=83=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/model/dao/dao_order.go | 2 ++ business/msghub/msghub.go | 16 ++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 02982381a..afc941ad4 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -179,6 +179,7 @@ func GetStoreOrderAfterTime(db *DaoDB, storeID int, orderTime time.Time, lastOrd FROM goods_order t1 LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id WHERE IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) = ? AND t1.order_created_at >= ? AND t1.id > ? AND t1.status < ? + AND (t1.flag & ?) = 0 ORDER BY t1.order_created_at DESC, t1.id DESC; ` sqlParams := []interface{}{ @@ -186,6 +187,7 @@ func GetStoreOrderAfterTime(db *DaoDB, storeID int, orderTime time.Time, lastOrd orderTime, lastOrderSeqID, model.OrderStatusEndBegin, + model.OrderFlagMaskFake, } return orderList, GetRows(db, &orderList, sql, sqlParams...) } diff --git a/business/msghub/msghub.go b/business/msghub/msghub.go index 5a14d84a4..6823daaf9 100644 --- a/business/msghub/msghub.go +++ b/business/msghub/msghub.go @@ -107,23 +107,26 @@ func unregisterChan(storeID int, chan2Listen chan<- *ServerMsg) { <-chan2Close } -func getPendingOrderList(storeID int, lastOrderTime time.Time, lastOrderSeqID int64) (orderList []*model.GoodsOrderExt, err error) { +func getPendingOrderList(storeID int, lastOrderTime time.Time, lastOrderSeqID int64) (vendorOrderIDs []string, err error) { if utils.IsTimeZero(lastOrderTime) || time.Now().Sub(lastOrderTime) > maxGetOrderTimeDuration { lastOrderTime = time.Now().Add(-maxGetOrderTimeDuration) } - orderList, err = dao.GetStoreOrderAfterTime(dao.GetDB(), storeID, lastOrderTime, lastOrderSeqID) - return orderList, err + orderList, err := dao.GetStoreOrderAfterTime(dao.GetDB(), storeID, lastOrderTime, lastOrderSeqID) + for _, v := range orderList { + vendorOrderIDs = append(vendorOrderIDs, v.VendorOrderID) + } + return vendorOrderIDs, err } func GetMsg(ctx *jxcontext.Context, storeID int, lastOrderTime time.Time, lastOrderSeqID int64, msgTypeList []string, waitingSecond int) (msg *ServerMsg, err error) { - orderList, err := getPendingOrderList(storeID, lastOrderTime, lastOrderSeqID) + vendorOrderIDs, err := getPendingOrderList(storeID, lastOrderTime, lastOrderSeqID) if err == nil { msg = &ServerMsg{ Type: ServerMsgNewOrder, StoreID: storeID, MsgData: 0, } - if len(orderList) == 0 { + if len(vendorOrderIDs) == 0 { chan2Listen := make(chan *ServerMsg, 1) registerChan(storeID, chan2Listen) pollingDuration := defPollingDuration @@ -149,7 +152,8 @@ func GetMsg(ctx *jxcontext.Context, storeID int, lastOrderTime time.Time, lastOr } close(chan2Listen) } else { - msg.MsgData = len(orderList) + globals.SugarLogger.Debugf("GetMsg vendorOrderIDs:%s", utils.Format4Output(vendorOrderIDs, true)) + msg.MsgData = len(vendorOrderIDs) } } return msg, err From 55fdde9be29512dba11e350fac94fa3802d7760a Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 3 Dec 2019 18:27:53 +0800 Subject: [PATCH 12/17] =?UTF-8?q?LoopMultiStoresVendors=E5=BC=95=E5=85=A5O?= =?UTF-8?q?rgCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sync.go | 36 +++++++++++++++++++++------- business/partner/partner_api.go | 1 - business/partner/purchase/jd/jd.go | 4 ++-- globals/api/apimanager/apimanager.go | 12 ---------- 4 files changed, 30 insertions(+), 23 deletions(-) diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 543c09ca6..14498bcfa 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -38,6 +38,11 @@ type SingleStoreHandlerWrapper struct { partner.ISingleStoreHandler } +type tMultiStoreVendorInfo struct { + VendorID int + OrgCode string +} + var ( CurVendorSync VendorSync ) @@ -96,6 +101,20 @@ func (v *VendorSync) GetSingleStoreHandler(vendorID int) partner.ISingleStoreHan return nil } +func getMultiStoreVendorInfoList() (list []*tMultiStoreVendorInfo) { + vendorIDs := partner.GetMultiStoreVendorIDs() + for _, vendorID := range vendorIDs { + orgCodeList := partner.CurAPIManager.GetAppOrgCodeList(vendorID) + for _, v := range orgCodeList { + list = append(list, &tMultiStoreVendorInfo{ + VendorID: vendorID, + OrgCode: v, + }) + } + } + return list +} + func (v *VendorSync) syncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, db *dao.DaoDB, cats []*model.SkuCategory, userName string) (err error) { multiStoresHandler := v.GetMultiStoreHandler(vendorID) syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[vendorID]) @@ -132,7 +151,7 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor globals.SugarLogger.Debug("SyncCategory") hint, err = v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步分类信息:%d", categoryID), isAsync, false, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { - vendorID := batchItemList[0].(int) + vendorInfo := batchItemList[0].(*tMultiStoreVendorInfo) var cats []*model.SkuCategory cond := make(map[string]interface{}) if categoryID > 0 { @@ -142,7 +161,7 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor } err := dao.GetEntitiesByKV(db, &cats, cond, true) if err == nil { - err = v.syncCategories(ctx, t, vendorID, db, cats, userName) + err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName) } if err != nil || categoryID > 0 { return nil, err @@ -150,7 +169,7 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor cond[model.FieldLevel] = 2 err = dao.GetEntitiesByKV(db, &cats, cond, true) if err == nil { - err = v.syncCategories(ctx, t, vendorID, db, cats, userName) + err = v.syncCategories(ctx, t, vendorInfo.VendorID, db, cats, userName) } return nil, err }) @@ -159,7 +178,8 @@ func (v *VendorSync) SyncCategory(ctx *jxcontext.Context, db *dao.DaoDB, categor func (v *VendorSync) SyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) { hint, err = v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("分类重排序:%d", categoryID), isAsync, false, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { - multiStoresHandler := v.GetMultiStoreHandler(batchItemList[0].(int)) + vendorInfo := batchItemList[0].(*tMultiStoreVendorInfo) + multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID) err2 := multiStoresHandler.ReorderCategories(db, categoryID, userName) if err2 == nil { cat := &model.SkuCategory{} @@ -236,8 +256,8 @@ func (v *VendorSync) SyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []i return v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("同步商品信息, nameIDs:%v, skuIDs:%v", nameIDs, skuIDs), isAsync, isManagedIt, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { var resultList []interface{} - vendorID := batchItemList[0].(int) - multiStoresHandler := v.GetMultiStoreHandler(vendorID) + vendorInfo := batchItemList[0].(*tMultiStoreVendorInfo) + multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID) syncStatusFieldName := dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]) dbField := dao.ConvertDBFieldPrefix(model.VendorNames[multiStoresHandler.GetVendorID()]) skuMap := make(map[int]bool) @@ -266,7 +286,7 @@ func (v *VendorSync) SyncSkus(ctx *jxcontext.Context, db *dao.DaoDB, nameIDs []i err := dao.GetRows(db, &skuNameList, sql, sqlParams...) if err == nil && len(skuNameList) > 0 { // todo 同一skuName下的sku顺序处理的原因是京东SPU特殊类型必须要序列化同步才能正常处理, db可能会有多线程问题 - task := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[vendorID]), tasksch.NewParallelConfig().SetParallelCount(10).SetIsContinueWhenError(isContinueWhenError), ctx, + task := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[vendorInfo.VendorID]), tasksch.NewParallelConfig().SetParallelCount(10).SetIsContinueWhenError(isContinueWhenError), ctx, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { var resultList []interface{} skuName := batchItemList[0].(*model.SkuName) @@ -562,7 +582,7 @@ func (v *VendorSync) LoopStoresMap(ctx *jxcontext.Context, db *dao.DaoDB, taskNa } func (v *VendorSync) LoopMultiStoresVendors(ctx *jxcontext.Context, db *dao.DaoDB, taskName string, isAsync bool, isManageIt bool, handler tasksch.WorkFunc) (hint string, err error) { - task := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, handler, partner.GetMultiStoreVendorIDs()) + task := tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, handler, getMultiStoreVendorInfoList()) tasksch.HandleTask(task, nil, isManageIt).Run() if !isAsync { result, err2 := task.GetResult(0) diff --git a/business/partner/partner_api.go b/business/partner/partner_api.go index 3e1b15a17..386527933 100644 --- a/business/partner/partner_api.go +++ b/business/partner/partner_api.go @@ -2,7 +2,6 @@ package partner type IAPIManager interface { GetAPI(vendorID int, appOrgCode string) interface{} - GetAPIList(vendorID int) []interface{} GetAppOrgCodeList(vendorID int) (appOrgCodeList []string) } diff --git a/business/partner/purchase/jd/jd.go b/business/partner/purchase/jd/jd.go index 66b30d0f8..7e5e7740d 100644 --- a/business/partner/purchase/jd/jd.go +++ b/business/partner/purchase/jd/jd.go @@ -30,9 +30,9 @@ func GetAPIByToken(token string) (apiObj *jdapi.API) { if token == "" { apiObj = getAPI("") } else { - apiList := partner.CurAPIManager.GetAPIList(model.VendorIDJD) + apiList := partner.CurAPIManager.GetAppOrgCodeList(model.VendorIDJD) for _, v := range apiList { - jdAPI := v.(*jdapi.API) + jdAPI := partner.CurAPIManager.GetAPI(model.VendorIDJD, v).(*jdapi.API) if jdAPI.GetToken() == token { apiObj = jdAPI break diff --git a/globals/api/apimanager/apimanager.go b/globals/api/apimanager/apimanager.go index 88d2c7ca6..6e62c34b6 100644 --- a/globals/api/apimanager/apimanager.go +++ b/globals/api/apimanager/apimanager.go @@ -38,18 +38,6 @@ func (a *APIManager) GetAPI(vendorID int, appOrgCode string) (pfAPI interface{}) return pfAPI } -func (a *APIManager) GetAPIList(vendorID int) (pfAPIList []interface{}) { - switch vendorID { - case model.VendorIDJD: - pfAPIList = []interface{}{api.JdAPI} - case model.VendorIDMTWM: - pfAPIList = []interface{}{api.MtwmAPI} - case model.VendorIDEBAI: - pfAPIList = []interface{}{api.EbaiAPI} - } - return pfAPIList -} - func (a *APIManager) GetAppOrgCodeList(vendorID int) (appOrgCodeList []string) { switch vendorID { case model.VendorIDJD: From 3fe9fd548383946a55b4003c3a375b60db4ab88c Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 4 Dec 2019 09:24:10 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dcms.DeleteStoreSku?= =?UTF-8?q?=E4=B8=AD=E6=BC=8F=E8=AE=BE=E7=BD=AE=E7=BE=8E=E5=9B=A2=E5=A4=96?= =?UTF-8?q?=E5=8D=96=E5=88=A0=E9=99=A4=E6=A0=87=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sku.go | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 3528323e4..80d721982 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -624,7 +624,7 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s dao.WrapAddIDCULDEntity(sku, userName) sku.NameID = skuNameExt.ID sku.JdSyncStatus = model.SyncFlagNewMask - sku.JdID = 0 //beginJDID + sku.JdID = 0 if err = dao.CreateEntity(db, sku); err != nil { dao.Rollback(db) return nil, err @@ -779,15 +779,6 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf } func SetStoreSkuSyncStatus2(db *dao.DaoDB, storeIDs []int, vendorIDs, skuIDs []int, syncStatus int) (num int64, err error) { - // dao.Begin(db) - // defer func() { - // if r := recover(); r != nil || err != nil { - // dao.Rollback(db) - // if r != nil { - // panic(r) - // } - // } - // }() for _, vendorID := range vendorIDs { num2, err2 := dao.SetStoreSkuSyncStatus(db, vendorID, storeIDs, skuIDs, syncStatus) if err = err2; err != nil { @@ -795,7 +786,6 @@ func SetStoreSkuSyncStatus2(db *dao.DaoDB, storeIDs []int, vendorIDs, skuIDs []i } num += num2 } - // dao.Commit(db) return num, nil } @@ -848,8 +838,8 @@ func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string) dao.WrapAddIDCULDEntity(sku, userName) sku.JdSyncStatus = model.SyncFlagNewMask - sku.NameID = nameID sku.JdID = 0 + sku.NameID = nameID if err = dao.CreateEntity(db, sku); err == nil { result, err2 := GetSkuNames(ctx, "", false, utils.Params2Map("skuID", sku.ID), 0, 0) if err = err2; err == nil { @@ -997,6 +987,7 @@ func DeleteStoreSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuID int) (n storeSkuBind := &model.StoreSkuBind{} _, err = dao.DeleteEntityLogically(db, storeSkuBind, map[string]interface{}{ model.FieldJdSyncStatus: model.SyncFlagDeletedMask, + model.FieldMtwmSyncStatus: model.SyncFlagDeletedMask, model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, }, ctx.GetUserName(), map[string]interface{}{ model.FieldSkuID: v.ID, From f69173bd2eef384bc94177c084fb5185559332fe Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 4 Dec 2019 10:01:05 +0800 Subject: [PATCH 14/17] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E6=B3=A8=E9=87=8A"!!!?= =?UTF-8?q?=20=E6=AD=A4=E5=87=BD=E6=95=B0=E4=B8=8D=E8=A6=81=E5=B0=86store?= =?UTF-8?q?=5Fsku=5Fbind=E4=B8=AD=E7=9A=84vendor=5Fprice=E5=8F=96=E5=87=BA?= =?UTF-8?q?=E6=9D=A5=E6=94=BE=E5=88=B0StoreSkuSyncInfo.VendorPrice?= =?UTF-8?q?=E4=B8=AD=EF=BC=8C=E5=9B=A0=E4=B8=BA=E4=B9=8B=E5=90=8E=E4=BC=9A?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E8=BF=99=E4=B8=AAVendorPrice=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E9=87=8D=E7=AE=97"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/model/dao/store_sku.go | 1 - 1 file changed, 1 deletion(-) diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 2f92b29f7..d1778ca30 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -206,7 +206,6 @@ func GetDirtyStoreCategories(db *DaoDB, vendorID, storeID int, level int) (cats } // 以store_sku_bind为基础来做同步,正常情况下使用 -// !!! 此函数不要将store_sku_bind中的vendor_price取出来放到StoreSkuSyncInfo.VendorPrice中,因为之后会依赖这个VendorPrice进行重算 // 单多门店模式厂商通用 func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty bool) (skus []*StoreSkuSyncInfo, err error) { if vendorID < 0 { From 2635fb035abce581eee6fb49f506b4c5c51bc680 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 4 Dec 2019 10:57:31 +0800 Subject: [PATCH 15/17] +ThingMap +OnxxThing --- business/jxstore/cms/sku.go | 146 +++++++++++++++++++++-------------- business/jxstore/cms/sync.go | 12 +++ business/model/sku.go | 18 ----- business/model/sync_map.go | 26 +++++++ globals/beegodb/beegodb.go | 2 +- 5 files changed, 128 insertions(+), 76 deletions(-) create mode 100644 business/model/sync_map.go diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 80d721982..eefa3a8d1 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -97,10 +97,25 @@ func AddCategory(ctx *jxcontext.Context, cat *model.SkuCategory, userName string } cat.Seq = maxSeq.MaxSeq + 1 } - if err = dao.CreateEntity(nil, cat); err == nil { - outCat = cat - _, err = CurVendorSync.SyncCategory(ctx, nil, cat.ID, false, userName) + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + if err = dao.CreateEntity(db, cat); err != nil { + dao.Rollback(db) + return nil, err } + if err = OnCreateThing(db, int64(cat.ID), model.ThingTypeCategory); err != nil { + dao.Rollback(db) + return nil, err + } + dao.Commit(db) + outCat = cat + + _, err = CurVendorSync.SyncCategory(ctx, nil, cat.ID, false, userName) return outCat, err } @@ -119,64 +134,71 @@ func UpdateCategory(ctx *jxcontext.Context, categoryID int, payload map[string]i syncStatus = model.SyncFlagModifiedMask valid[model.FieldJdSyncStatus] = int8(syncStatus) | cat.JdSyncStatus } - if num, err = dao.UpdateEntityLogically(db, cat, valid, userName, nil); err == nil { - SetStoreCategorySyncStatus2(db, nil, []int{categoryID}, model.SyncFlagModifiedMask) - var skuIDs []int - if valid["jdCategoryID"] != nil || valid["ebaiCategoryID"] != nil || valid["mtwmCategoryID"] != nil || - valid["jdPricePercentage"] != nil || valid["ebaiPricePercentage"] != nil || valid["mtwmPricePercentage"] != nil { - if skuList, err2 := dao.GetSkuByCats(db, []int{categoryID}); err2 == nil && len(skuList) > 0 { - for _, sku := range skuList { - skuIDs = append(skuIDs, sku.ID) - } - if valid["jdCategoryID"] != nil { - dao.SetSkuSyncStatus(db, model.VendorIDJD, skuIDs, model.SyncFlagModifiedMask) - } - // todo 如下逻辑,在不同平台同时改pricePercentage与平台分类映射时,会不必要的打上多余的标记 - var vendorIDs []int - syncStatus := model.SyncFlagModifiedMask - if valid["jdPricePercentage"] != nil { - vendorIDs = append(vendorIDs, model.VendorIDJD) - syncStatus |= model.SyncFlagPriceMask - } + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + if num, err = dao.UpdateEntityLogically(db, cat, valid, userName, nil); err != nil { + dao.Rollback(db) + return 0, err + } + if err = OnUpdateThing(db, int64(categoryID), model.ThingTypeCategory); err != nil { + dao.Rollback(db) + return 0, err + } + dao.Commit(db) - if valid["ebaiPricePercentage"] != nil { - vendorIDs = append(vendorIDs, model.VendorIDEBAI) - syncStatus |= model.SyncFlagPriceMask - } else if valid["ebaiCategoryID"] != nil { - vendorIDs = append(vendorIDs, model.VendorIDEBAI) - } + SetStoreCategorySyncStatus2(db, nil, []int{categoryID}, model.SyncFlagModifiedMask) + var skuIDs []int + if valid["jdCategoryID"] != nil || valid["ebaiCategoryID"] != nil || valid["mtwmCategoryID"] != nil || + valid["jdPricePercentage"] != nil || valid["ebaiPricePercentage"] != nil || valid["mtwmPricePercentage"] != nil { + if skuList, err2 := dao.GetSkuByCats(db, []int{categoryID}); err2 == nil && len(skuList) > 0 { + for _, sku := range skuList { + skuIDs = append(skuIDs, sku.ID) + } + if valid["jdCategoryID"] != nil { + dao.SetSkuSyncStatus(db, model.VendorIDJD, skuIDs, model.SyncFlagModifiedMask) + } - if valid["mtwmPricePercentage"] != nil { - vendorIDs = append(vendorIDs, model.VendorIDMTWM) - syncStatus |= model.SyncFlagPriceMask - } else if valid["mtwmCategoryID"] != nil { - vendorIDs = append(vendorIDs, model.VendorIDMTWM) - } - if len(vendorIDs) > 0 { - SetStoreSkuSyncStatus2(db, nil, vendorIDs, skuIDs, syncStatus) - } + // todo 如下逻辑,在不同平台同时改pricePercentage与平台分类映射时,会不必要的打上多余的标记 + var vendorIDs []int + syncStatus := model.SyncFlagModifiedMask + if valid["jdPricePercentage"] != nil { + vendorIDs = append(vendorIDs, model.VendorIDJD) + syncStatus |= model.SyncFlagPriceMask + } + + if valid["ebaiPricePercentage"] != nil { + vendorIDs = append(vendorIDs, model.VendorIDEBAI) + syncStatus |= model.SyncFlagPriceMask + } else if valid["ebaiCategoryID"] != nil { + vendorIDs = append(vendorIDs, model.VendorIDEBAI) + } + + if valid["mtwmPricePercentage"] != nil { + vendorIDs = append(vendorIDs, model.VendorIDMTWM) + syncStatus |= model.SyncFlagPriceMask + } else if valid["mtwmCategoryID"] != nil { + vendorIDs = append(vendorIDs, model.VendorIDMTWM) + } + if len(vendorIDs) > 0 { + SetStoreSkuSyncStatus2(db, nil, vendorIDs, skuIDs, syncStatus) } } - _, err = CurVendorSync.SyncCategory(ctx, db, categoryID, false, userName) - if len(skuIDs) > 0 { - CurVendorSync.SyncSkus(ctx, db, nil, skuIDs, true, true, userName) - } + } + _, err = CurVendorSync.SyncCategory(ctx, db, categoryID, false, userName) + if len(skuIDs) > 0 { + CurVendorSync.SyncSkus(ctx, db, nil, skuIDs, true, true, userName) } } return num, err } func SetStoreCategorySyncStatus2(db *dao.DaoDB, storeIDs []int, catIDs []int, syncStatus int) (num int64, err error) { - // dao.Begin(db) - // defer func() { - // if r := recover(); r != nil || err != nil { - // dao.Rollback(db) - // if r != nil { - // panic(r) - // } - // } - // }() for _, vendorID := range partner.GetSingleStoreVendorIDs() { num2, err2 := dao.SetStoreCategorySyncStatus(db, vendorID, storeIDs, catIDs, syncStatus) if err = err2; err != nil { @@ -184,7 +206,6 @@ func SetStoreCategorySyncStatus2(db *dao.DaoDB, storeIDs []int, catIDs []int, sy } num += num2 } - // dao.Commit(db) return num, nil } @@ -252,14 +273,25 @@ func DeleteCategory(ctx *jxcontext.Context, categoryID int, userName string) (nu } dao.Begin(db) defer func() { - dao.Rollback(db) - }() - if _, err = DeleteCategoryMap(ctx, db, categoryID); err == nil { - if num, err = dao.DeleteEntityLogically(db, cat, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask), userName, nil); err == nil && num == 1 { - dao.Commit(db) - _, err = CurVendorSync.SyncCategory(ctx, db, cat.ID, false, userName) + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) } + }() + if _, err = DeleteCategoryMap(ctx, db, categoryID); err != nil { + dao.Rollback(db) + return 0, err } + if num, err = dao.DeleteEntityLogically(db, cat, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask), userName, nil); err != nil { + dao.Rollback(db) + return 0, err + } + if err = OnDeleteThing(db, int64(categoryID), model.ThingTypeCategory); err != nil { + dao.Rollback(db) + return 0, err + } + dao.Commit(db) + _, err = CurVendorSync.SyncCategory(ctx, db, cat.ID, false, userName) } return num, err } diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 14498bcfa..9999de846 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -715,3 +715,15 @@ func GetTimeMixByInt(begin1, end1, begin2, end2 int16) (beginAt, endAt int16) { } return beginAt, endAt } + +func OnCreateThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) { + return err +} + +func OnUpdateThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) { + return err +} + +func OnDeleteThing(db *dao.DaoDB, thingID int64, thingType int8) (err error) { + return err +} diff --git a/business/model/sku.go b/business/model/sku.go index 70a727723..8015321be 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -157,24 +157,6 @@ func (*SkuCategory) TableIndex() [][]string { } } -type SkuCategoryMap struct { - ModelIDCULD - - CatID int `orm:"column(cat_id)" json:"catID"` - VendorID int `orm:"column(vendor_id)" json:"vendorID"` - VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 - - VendorCatID string `orm:"size(32);column(vendor_cat_id)" json:"vendorCatID"` - SyncStatus int8 `orm:"default(2)"` -} - -func (*SkuCategoryMap) TableUnique() [][]string { - return [][]string{ - []string{"CatID", "VendorID", "VendorOrgCode", "DeletedAt"}, - []string{"VendorCatID", "VendorID", "VendorOrgCode", "DeletedAt"}, - } -} - type SkuName struct { ModelIDCULD diff --git a/business/model/sync_map.go b/business/model/sync_map.go new file mode 100644 index 000000000..58c26f851 --- /dev/null +++ b/business/model/sync_map.go @@ -0,0 +1,26 @@ +package model + +const ( + ThingTypeCategory = 1 + ThingTypSkuName = 2 + ThingTypeSku = 3 +) + +type ThingMap struct { + ModelIDCULD + + ThingID int64 `orm:"column(thing_id)" json:"thingID"` + ThingType int8 `json:"thingType"` + VendorID int `orm:"column(vendor_id)" json:"vendorID"` + VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空 + + VendorThingID string `orm:"size(32);column(vendor_thing_id)" json:"vendorThingID"` + SyncStatus int8 `orm:"default(2)"` +} + +func (*ThingMap) TableUnique() [][]string { + return [][]string{ + []string{"ThingID", "ThingType", "VendorID", "VendorOrgCode", "DeletedAt"}, + []string{"VendorThingID", "ThingType", "VendorID", "VendorOrgCode", "DeletedAt"}, + } +} diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 8b200cec3..28b108a3b 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -32,7 +32,7 @@ func Init() { orm.RegisterModel(&model.Store{}, &model.StoreSub{}, &model.StoreMap{}, &model.StoreCourierMap{}) orm.RegisterModel(&model.SkuVendorCategory{}, &model.StoreSkuCategoryMap{}, &model.SkuName{}, &model.Sku{}, &model.SkuNamePlaceBind{}, &model.StoreSkuBind{}) orm.RegisterModel(&model.SkuCategory{}) - // orm.RegisterModel(&model.SkuCategoryMap{}) + // orm.RegisterModel(&model.ThingMap{}) orm.RegisterModel(&model.AuthBind{}, &model.User{}) From a255acb4f156453e6d3f0f9e869d93100ca886a5 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 4 Dec 2019 11:05:33 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8DReorderCategories?= =?UTF-8?q?=E4=B8=AD=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sku.go | 60 +++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index eefa3a8d1..88500ab3c 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -211,37 +211,47 @@ func SetStoreCategorySyncStatus2(db *dao.DaoDB, storeIDs []int, catIDs []int, sy func ReorderCategories(ctx *jxcontext.Context, parentID int, categoryIDs []int, userName string) (err error) { var cats []*model.SkuCategory - parentCat := &model.SkuCategory{} - parentCat.ID = parentID db := dao.GetDB() - if parentID != 0 { - err = dao.GetEntity(db, parentCat) - } else { - parentCat = nil - } - if err == nil { - if err = dao.GetEntitiesByKV(db, &cats, utils.Params2Map(model.FieldParentID, parentID), false); err == nil { - catsLen := len(cats) - if catsLen != len(categoryIDs) { - return ErrInputCatsDoesntMatch + if err = dao.GetEntitiesByKV(db, &cats, utils.Params2Map(model.FieldParentID, parentID), false); err == nil { + catsLen := len(cats) + if catsLen != len(categoryIDs) { + return ErrInputCatsDoesntMatch + } + catsMap := make(map[int]*model.SkuCategory, catsLen) + for _, cat := range cats { + catsMap[cat.ID] = cat + } + + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) } - catsMap := make(map[int]*model.SkuCategory, catsLen) - for _, cat := range cats { - catsMap[cat.ID] = cat + }() + for k, v := range categoryIDs { + if catsMap[v] == nil { + dao.Rollback(db) + return fmt.Errorf("分类:%d不在%d分类下", v, parentID) } - for k, v := range categoryIDs { - catsMap[v].Seq = k - catsMap[v].LastOperator = ctx.GetUserName() - if _, err = dao.UpdateEntity(db, catsMap[v]); err != nil { - break - } + catsMap[v].Seq = k + catsMap[v].LastOperator = ctx.GetUserName() + if _, err = dao.UpdateEntity(db, catsMap[v]); err != nil { + dao.Rollback(db) + return err } - SetStoreCategorySyncStatus2(db, nil, categoryIDs, model.SyncFlagModifiedMask) - if err == nil { - _, err = CurVendorSync.SyncReorderCategories(ctx, db, parentID, false, userName) - CurVendorSync.SyncStoresCategory(ctx, db, nil, nil, false, true, true) + if err = OnUpdateThing(db, int64(catsMap[v].ID), model.ThingTypeCategory); err != nil { + dao.Rollback(db) + return err } } + dao.Commit(db) + + SetStoreCategorySyncStatus2(db, nil, categoryIDs, model.SyncFlagModifiedMask) + if err == nil { + _, err = CurVendorSync.SyncReorderCategories(ctx, db, parentID, false, userName) + CurVendorSync.SyncStoresCategory(ctx, db, nil, nil, false, true, true) + } } return err } From e6004bea32f6b3861d50950ffa7f8fd0b72c30fe Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 4 Dec 2019 12:11:57 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=E9=87=8D=E6=9E=84sku,skuname,category?= =?UTF-8?q?=E7=9A=84CUD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/sku.go | 333 ++++++++++++++++++++++++------------ business/model/sync_map.go | 2 +- 2 files changed, 225 insertions(+), 110 deletions(-) diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 88500ab3c..f4a4b0e8a 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -8,6 +8,7 @@ import ( "time" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/baseapi/utils/errlist" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/datares" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" @@ -292,11 +293,11 @@ func DeleteCategory(ctx *jxcontext.Context, categoryID int, userName string) (nu dao.Rollback(db) return 0, err } - if num, err = dao.DeleteEntityLogically(db, cat, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask), userName, nil); err != nil { + if err = OnDeleteThing(db, int64(categoryID), model.ThingTypeCategory); err != nil { dao.Rollback(db) return 0, err } - if err = OnDeleteThing(db, int64(categoryID), model.ThingTypeCategory); err != nil { + if num, err = dao.DeleteEntityLogically(db, cat, utils.Params2Map(model.FieldJdSyncStatus, model.SyncFlagDeletedMask), userName, nil); err != nil { dao.Rollback(db) return 0, err } @@ -662,6 +663,10 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s dao.Rollback(db) return nil, err } + if err = OnCreateThing(db, int64(skuNameExt.SkuName.ID), model.ThingTypeSkuName); err != nil { + dao.Rollback(db) + return nil, err + } for _, sku := range skuNameExt.Skus { dao.WrapAddIDCULDEntity(sku, userName) sku.NameID = skuNameExt.ID @@ -770,52 +775,72 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf } }() valid[model.FieldJdSyncStatus] = model.SyncFlagModifiedMask | skuName.JdSyncStatus - if num, err = dao.UpdateEntityLogically(db, skuName, valid, userName, nil); err == nil { - if utils.Interface2Int64WithDefault(payload["isGlobal"], 0) == 0 && payload["places"] != nil { - if places, ok := payload["places"].([]interface{}); ok { - if _, err = dao.DeleteSkuNamePlace(db, nameID, nil); err == nil { - for _, placeCode := range places { - placeBind := &model.SkuNamePlaceBind{} - placeBind.PlaceCode = int(utils.Interface2Int64WithDefault(placeCode, 0)) - if placeBind.PlaceCode > 0 { - dao.WrapAddIDCULEntity(placeBind, userName) - placeBind.NameID = nameID - err = dao.CreateEntity(db, placeBind) - } else { - dao.Rollback(db) - return 0, errors.New("地点代码非法") - } - } - } - } - } - if err == nil { - skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil) - if err = err2; err == nil { - for _, v := range skuList { - sku := &v.Sku - sku.JdSyncStatus |= model.SyncFlagModifiedMask - sku.LastOperator = userName - sku.UpdatedAt = time.Now() - dao.UpdateEntity(db, sku) - } - } - if err == nil { - skuIDs, err2 := dao.GetSkuIDByNames(db, []int{nameID}) - if err = err2; err == nil && len(skuIDs) > 0 { - _, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), skuIDs, model.SyncFlagModifiedMask) - } - } - } - if err == nil { - dao.Commit(db) - _, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName) - } else { - dao.Rollback(db) - } - } else { + if num, err = dao.UpdateEntityLogically(db, skuName, valid, userName, nil); err != nil { dao.Rollback(db) + return 0, err } + if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil { + dao.Rollback(db) + return 0, err + } + if utils.Interface2Int64WithDefault(payload["isGlobal"], 0) == 0 && payload["places"] != nil { + if places, ok := payload["places"].([]interface{}); ok { + if _, err = dao.DeleteSkuNamePlace(db, nameID, nil); err != nil { + dao.Rollback(db) + return 0, err + } + for _, placeCode := range places { + placeBind := &model.SkuNamePlaceBind{} + placeBind.PlaceCode = int(utils.Interface2Int64WithDefault(placeCode, 0)) + if placeBind.PlaceCode > 0 { + dao.WrapAddIDCULEntity(placeBind, userName) + placeBind.NameID = nameID + err = dao.CreateEntity(db, placeBind) + } else { + dao.Rollback(db) + return 0, errors.New("地点代码非法") + } + } + } + } + + skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil) + if err = err2; err == nil { + for _, v := range skuList { + sku := &v.Sku + sku.JdSyncStatus |= model.SyncFlagModifiedMask + sku.LastOperator = userName + sku.UpdatedAt = time.Now() + if _, err = dao.UpdateEntity(db, sku); err != nil { + dao.Rollback(db) + return 0, err + } + + if err = OnUpdateThing(db, int64(v.ID), model.ThingTypeSku); err != nil { + dao.Rollback(db) + return 0, err + } + } + } + + skuIDs, err2 := dao.GetSkuIDByNames(db, []int{nameID}) + if err = err2; err != nil { + dao.Rollback(db) + return 0, err + } + if len(skuIDs) > 0 { + if _, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), skuIDs, model.SyncFlagModifiedMask); err != nil { + dao.Rollback(db) + return 0, err + } + } + dao.Commit(db) + + errList := errlist.New() + errList.AddErr(err) + _, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName) + errList.AddErr(err) + err = errList.GetErrListAsOne() } return num, err } @@ -835,33 +860,57 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int db := dao.GetDB() dao.Begin(db) defer func() { - dao.Rollback(db) + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } }() + if _, err := dao.DeleteSkuNamePlace(db, nameID, nil); err != nil { + dao.Rollback(db) return 0, err } if _, err = DeleteStoreSku(ctx, db, nameID, 0); err != nil { + dao.Rollback(db) return 0, err } - numSku, err := dao.DeleteEntityLogically(db, &model.Sku{}, map[string]interface{}{ - model.FieldJdSyncStatus: model.SyncFlagDeletedMask, - model.FieldStatus: model.SkuStatusDeleted, - }, userName, map[string]interface{}{ - model.FieldNameID: nameID, - }) - if err != nil { + + skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil) + if err = err2; err == nil { + for _, v := range skuList { + sku := &v.Sku + if _, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{ + model.FieldJdSyncStatus: model.SyncFlagDeletedMask, + model.FieldStatus: model.SkuStatusDeleted, + }, userName, nil); err != nil { + dao.Rollback(db) + return 0, err + } + + if err = OnDeleteThing(db, int64(v.ID), model.ThingTypeSku); err != nil { + dao.Rollback(db) + return 0, err + } + } + } + + if err = OnDeleteThing(db, int64(nameID), model.ThingTypeSkuName); err != nil { + dao.Rollback(db) return 0, err } + skuName := &model.SkuName{} skuName.ID = nameID if num, err = dao.DeleteEntityLogically(db, skuName, map[string]interface{}{ model.FieldJdSyncStatus: model.SyncFlagDeletedMask, model.FieldStatus: model.SkuStatusDeleted, }, userName, nil); err != nil { + dao.Rollback(db) return 0, err } dao.Commit(db) - if numSku > 0 { + + if len(skuList) > 0 { _, err = CurVendorSync.SyncSku(ctx, db, skuName.ID, -1, false, false, userName) } return num, err @@ -882,15 +931,31 @@ func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string) sku.JdSyncStatus = model.SyncFlagNewMask sku.JdID = 0 sku.NameID = nameID - if err = dao.CreateEntity(db, sku); err == nil { - result, err2 := GetSkuNames(ctx, "", false, utils.Params2Map("skuID", sku.ID), 0, 0) - if err = err2; err == nil { - if result.TotalCount == 1 { - outSkuNameExt = result.SkuNames[0] - _, err = CurVendorSync.SyncSku(ctx, db, outSkuNameExt.SkuName.ID, sku.ID, false, false, userName) - } else { - err = ErrEntityNotExist - } + + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + if err = dao.CreateEntity(db, sku); err != nil { + dao.Rollback(db) + return nil, err + } + if err = OnCreateThing(db, int64(sku.ID), model.ThingTypeSku); err != nil { + dao.Rollback(db) + return nil, err + } + dao.Commit(db) + + result, err2 := GetSkuNames(ctx, "", false, utils.Params2Map("skuID", sku.ID), 0, 0) + if err = err2; err == nil { + if result.TotalCount == 1 { + outSkuNameExt = result.SkuNames[0] + _, err = CurVendorSync.SyncSku(ctx, db, outSkuNameExt.SkuName.ID, sku.ID, false, false, userName) + } else { + err = ErrEntityNotExist } } return outSkuNameExt, err @@ -919,31 +984,43 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{} maskValue |= model.SyncFlagSpecMask } valid[model.FieldJdSyncStatus] = maskValue | sku.JdSyncStatus - if num, err = dao.UpdateEntityLogically(db, sku, valid, userName, nil); err == nil { - if num == 1 { - if num, err = dao.ExecuteSQL(db, ` - UPDATE sku_name t1 - JOIN sku t2 ON t1.id = t2.name_id - SET t1.spec_quality = t2.spec_quality, - t1.spec_unit = t2.spec_unit - WHERE t1.deleted_at = ? AND t2.id = ? AND t1.unit <> ? - `, utils.DefaultTimeValue, skuID, model.SpecialUnit); err == nil { - if _, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), []int{skuID}, model.SyncFlagModifiedMask); err == nil { - if maskValue&model.SyncFlagSpecMask != 0 { - err = refreshStoreSkuPrice(ctx, db, skuID) - } - } - } - } else { + if num, err = dao.UpdateEntityLogically(db, sku, valid, userName, nil); err != nil || num == 0 { + dao.Rollback(db) + if err == nil { err = ErrEntityNotExist } + return 0, err } - if err == nil { - dao.Commit(db) - _, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName) - } else { + if num, err = dao.ExecuteSQL(db, ` + UPDATE sku_name t1 + JOIN sku t2 ON t1.id = t2.name_id + SET t1.spec_quality = t2.spec_quality, + t1.spec_unit = t2.spec_unit + WHERE t1.deleted_at = ? AND t2.id = ? AND t1.unit <> ? + `, utils.DefaultTimeValue, skuID, model.SpecialUnit); err != nil || num == 0 { dao.Rollback(db) + if err == nil { + err = ErrEntityNotExist + } + return 0, err } + if err = OnUpdateThing(db, int64(skuID), model.ThingTypeSku); err != nil { + dao.Rollback(db) + return 0, err + } + dao.Commit(db) + + if _, err = SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), []int{skuID}, model.SyncFlagModifiedMask); err == nil { + if maskValue&model.SyncFlagSpecMask != 0 { + err = refreshStoreSkuPrice(ctx, db, skuID) + } + } + + errList := errlist.New() + errList.AddErr(err) + _, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName) + errList.AddErr(err) + err = errList.GetErrListAsOne() } return num, err } @@ -982,23 +1059,33 @@ func DeleteSku(ctx *jxcontext.Context, skuID int, userName string) (num int64, e db := dao.GetDB() dao.Begin(db) defer func() { - dao.Rollback(db) + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } }() - if _, err = DeleteStoreSku(ctx, db, 0, skuID); err == nil { - sku := &model.Sku{} - sku.ID = skuID - if num, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{ - model.FieldStatus: model.SkuStatusDeleted, - model.FieldJdSyncStatus: model.SyncFlagDeletedMask, - }, userName, nil); err == nil { - dao.Commit(db) - if num == 1 { - _, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName) - } else { - err = ErrEntityNotExist - } - } + if _, err = DeleteStoreSku(ctx, db, 0, skuID); err != nil { + dao.Rollback(db) + return 0, err + } + if err = OnDeleteThing(db, int64(skuID), model.ThingTypeSku); err != nil { + dao.Rollback(db) + return 0, err + } + sku := &model.Sku{} + sku.ID = skuID + if num, err = dao.DeleteEntityLogically(db, sku, map[string]interface{}{ + model.FieldStatus: model.SkuStatusDeleted, + model.FieldJdSyncStatus: model.SyncFlagDeletedMask, + }, userName, nil); err != nil { + dao.Rollback(db) + return 0, err + } + dao.Commit(db) + + if num == 1 { + _, err = CurVendorSync.SyncSku(ctx, db, -1, sku.ID, false, false, userName) } return num, err } @@ -1050,9 +1137,25 @@ func AddSkuNamePlace(ctx *jxcontext.Context, nameID, placeCode int, userName str PlaceCode: placeCode, } dao.WrapAddIDCULEntity(placeBind, userName) - if err = dao.CreateEntity(db, placeBind); err == nil { - _, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName) + + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + if err = dao.CreateEntity(db, placeBind); err != nil { + dao.Rollback(db) + return nil, err } + if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil { + dao.Rollback(db) + return nil, err + } + dao.Commit(db) + + _, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName) return placeBind, err } @@ -1061,13 +1164,28 @@ func DeleteSkuNamePlace(ctx *jxcontext.Context, nameID, placeCode int, userName placeBind := &model.SkuNamePlaceBind{} placeBind.NameID = nameID placeBind.PlaceCode = placeCode - if num, err = dao.DeleteEntity(db, placeBind, model.FieldNameID, model.FieldPlaceCode); err == nil { - if num == 1 { - _, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName) - } else { + + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + if num, err = dao.DeleteEntity(db, placeBind, model.FieldNameID, model.FieldPlaceCode); err != nil || num == 0 { + dao.Rollback(db) + if err == nil { err = ErrEntityNotExist } + return 0, err } + if err = OnUpdateThing(db, int64(nameID), model.ThingTypeSkuName); err != nil { + dao.Rollback(db) + return 0, err + } + dao.Commit(db) + + _, err = CurVendorSync.SyncSku(ctx, db, nameID, -1, false, false, userName) return num, err } @@ -1100,9 +1218,7 @@ func SortCategorySkus(ctx *jxcontext.Context, catID int, skuIDList []int) (err e defer func() { if r := recover(); r != nil { dao.Rollback(db) - if r != nil { - panic(r) - } + panic(r) } }() nameIDList := []int{} @@ -1129,6 +1245,5 @@ func SortCategorySkus(ctx *jxcontext.Context, catID int, skuIDList []int) (err e dao.Rollback(db) } } - return err } diff --git a/business/model/sync_map.go b/business/model/sync_map.go index 58c26f851..2577356df 100644 --- a/business/model/sync_map.go +++ b/business/model/sync_map.go @@ -2,7 +2,7 @@ package model const ( ThingTypeCategory = 1 - ThingTypSkuName = 2 + ThingTypeSkuName = 2 ThingTypeSku = 3 )