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/cms/sync.go b/business/jxstore/cms/sync.go index 9e73f490d..569f77b57 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -57,6 +57,11 @@ type SingleStoreHandlerWrapper struct { partner.ISingleStoreHandler } +type tMultiStoreVendorInfo struct { + VendorID int + OrgCode string +} + var ( CurVendorSync VendorSync ) @@ -123,6 +128,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]) @@ -159,7 +178,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 { @@ -169,7 +188,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 @@ -177,7 +196,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 }) @@ -186,7 +205,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{} @@ -263,8 +283,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) @@ -293,7 +313,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) @@ -592,7 +612,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/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/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index b8965c0ba..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...) } @@ -899,7 +901,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 { 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 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/jd.go b/business/partner/purchase/jd/jd.go index f80525291..7e5e7740d 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.GetAppOrgCodeList(model.VendorIDJD) + for _, v := range apiList { + jdAPI := partner.CurAPIManager.GetAPI(model.VendorIDJD, v).(*jdapi.API) + if jdAPI.GetToken() == token { + apiObj = jdAPI + break + } + } + } + return apiObj +} + func (c *PurchaseHandler) GetVendorID() int { return model.VendorIDJD } 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 5148313b3..2c092b000 100644 --- a/business/partner/purchase/jd/store_sku2.go +++ b/business/partner/purchase/jd/store_sku2.go @@ -215,17 +215,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 -// } 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 } diff --git a/business/partner/purchase/jx/phpjx/order.go b/business/partner/purchase/jx/phpjx/order.go index 0b513e4b4..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 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/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/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/controllers/wxpay_callback.go b/controllers/wxpay_callback.go index dc7c2d049..2d6d89e7d 100644 --- a/controllers/wxpay_callback.go +++ b/controllers/wxpay_callback.go @@ -17,9 +17,10 @@ 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) var err error if callbackResponse == nil { - if msg.MsgType != wxpay.MsgTypeUnkown { + if msg.MsgType == wxpay.MsgTypeUnkown { err = fmt.Errorf("未知的微信支付回调类型:%d", msg.MsgType) } else { err = localjx.OnWxPayCallback(msg) 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",