diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index f7d01fead..4b515594c 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -27,7 +27,7 @@ const ( ) func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *model.GoodsOrder, courierVendorIDs, excludeCourierVendorIDs []int, maxDeliveryFee int64, createOnlyOne bool) (bills []*model.Waybill, err error) { - storeCourierList, err := dao.GetStoreCourierList2(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, model.StoreStatusOpened, []int{model.StoreAuditStatusOnline, model.StoreAuditStatusUpdated}) + storeCourierList, err := dao.GetStoreCourierList2(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, courierVendorIDs, model.StoreStatusOpened, []int{model.StoreAuditStatusOnline, model.StoreAuditStatusUpdated}) if err != nil { return nil, err } diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 9b91f3977..1b695b5a3 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -944,6 +944,7 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf //1表示为门店发单,需要验证门店账户余额情况 _, err2 := s.CheckStoreBalance(jxcontext.AdminCtx, order, waybillVendorIDs) + // 检查是否有有效运单 if err == nil && err2 == nil { // 1.检查门店三方配送配置,达达>蜂鸟>美团>顺丰>uu // excludeVendorIDs 包括上面已经发送的平台id diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index 5a427fe26..6ad9d0144 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -42,8 +42,8 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven if err = err2; err == nil { phone = storeDetail.Tel1 } - err = s.SelfDeliverDelivering(order, phone) // 取消平台自配送 - //s.CancelAll3rdWaybills(ctx, vendorOrderID, vendorID, true) // 取消三方平台配送以及调度 + err = s.SelfDeliverDelivering(order, phone) // 取消平台自配送 + s.CancelAll3rdWaybills(ctx, vendorOrderID, vendorID, true) // 取消三方平台配送以及调度 } } else { if order.Status < model.OrderStatusDelivering { @@ -159,6 +159,14 @@ func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Contex if !forceCreate { err = s.canOrderCreateWaybillNormally(order, nil) } + // 检查订单是否在配送状态 + waybills, err := dao.GetWaybills(dao.GetDB(), order.VendorOrderID, nil) + for _, v := range waybills { + if v.Status >= model.OrderStatusDelivering { + err = fmt.Errorf("订单已经在配送中,无法创建运单,有疑问请联系管理员") + break + } + } if err == nil { if forceCreate { maxDeliveryFee = math.MaxInt64 diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 9773c534b..c9bdbb425 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -177,6 +177,8 @@ func getVendorPriceFromStoreSkuBind(bind *model.StoreSkuBind, vendorID int) (ven vendorPrice = bind.JxPrice case model.VendorIDDD: vendorPrice = bind.DdPrice + case model.VendorIDTaoVegetable: + vendorPrice = bind.TaoPrice } return vendorPrice } diff --git a/business/jxstore/cms/sku.go b/business/jxstore/cms/sku.go index 06373688a..df4cc10c5 100644 --- a/business/jxstore/cms/sku.go +++ b/business/jxstore/cms/sku.go @@ -451,6 +451,7 @@ func DeleteCategoryMap(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int) (n return dao.DeleteEntityLogically(db, catMap, map[string]interface{}{ model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, model.FieldMtwmSyncStatus: model.SyncFlagDeletedMask, + model.FieldTaoSyncStatus: model.SyncFlagDeletedMask, }, ctx.GetUserName(), map[string]interface{}{ model.FieldCategoryID: categoryID, model.FieldDeletedAt: utils.DefaultTimeValue, @@ -1188,10 +1189,10 @@ func getCategoryByImg(img ...string) string { } // 根据平台返回的分类id,获取本地绑定的映射分类id -func getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCategoryID, mtwmCategoryID string, jxCategoryId int) (string, string, string, int) { +func getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID string, jxCategoryId int) (string, string, string, string, int) { cats, err := dao.GetCategoriesByName(dao.GetDB(), "", jdCategoryId) if len(cats) == 0 || err != nil { - return jdsCategoryID, ebaiCategoryID, mtwmCategoryID, 0 + return jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID, 0 } else { if jdsCategoryID == "" && cats[0].JdsCategoryID != 0 { jdsCategoryID = utils.Int64ToStr(cats[0].JdsCategoryID) @@ -1202,11 +1203,14 @@ func getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCa if mtwmCategoryID == "" && cats[0].MtwmCategoryID != 0 { mtwmCategoryID = utils.Int64ToStr(cats[0].MtwmCategoryID) } + if taoCategoryID == "" && cats[0].TaoCategoryID != 0 { + taoCategoryID = utils.Int64ToStr(cats[0].TaoCategoryID) + } if jxCategoryId == 0 || jxCategoryId == 291 { jxCategoryId = cats[0].ID } } - return jdsCategoryID, ebaiCategoryID, mtwmCategoryID, jxCategoryId + return jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID, jxCategoryId } func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, nameID int, payload map[string]interface{}, skuNameExt *model.SkuNameExt, isDelete bool) (flag bool) { @@ -1242,6 +1246,7 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n jdsCategoryID := "" ebaiCategoryID := "" mtwmCategoryID := "" + taoCategoryID := "" ddCategoryID := "" jxCategoryID := 0 if skuNameExt != nil { @@ -1252,7 +1257,7 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n } if jdCategoryId != "" && jdCategoryId != "0" { - jdsCategoryID, ebaiCategoryID, mtwmCategoryID, jxCategoryID = getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, skuNameExt.JdsCategoryID, skuNameExt.EbaiCategoryID, skuNameExt.MtwmCategoryID, skuNameExt.CategoryID) + jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID, jxCategoryID = getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, skuNameExt.JdsCategoryID, skuNameExt.EbaiCategoryID, skuNameExt.MtwmCategoryID, skuNameExt.TaoCategoryID, skuNameExt.CategoryID) } else { jdsCategoryID = skuNameExt.JdsCategoryID ebaiCategoryID = skuNameExt.EbaiCategoryID @@ -1323,7 +1328,7 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n } if jdCategoryId != "" { - jdsCategoryID, ebaiCategoryID, mtwmCategoryID, jxCategoryID = getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCategoryID, mtwmCategoryID, jxCategoryID) + jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID, jxCategoryID = getJDCategoryLoadingLocalCategoryReflex(jdCategoryId, jdsCategoryID, ebaiCategoryID, mtwmCategoryID, taoCategoryID, jxCategoryID) } if payload["ddCategoryID"] != nil { @@ -1645,6 +1650,7 @@ func refreshStoreSkuPrice(ctx *jxcontext.Context, db *dao.DaoDB, skuID int) (err storeSku.ID = v.BindID storeSku.JdSyncStatus = v.JdSyncStatus | model.SyncFlagPriceMask storeSku.MtwmSyncStatus = v.MtwmSyncStatus | model.SyncFlagPriceMask + storeSku.TaoSyncStatus = v.TaoSyncStatus | model.SyncFlagPriceMask storeSku.EbaiSyncStatus = v.EbaiSyncStatus | model.SyncFlagPriceMask storeSku.Price = jxutils.CaculateSkuPrice(int(v.UnitPrice), v.SpecQuality, v.SpecUnit, v.Unit) storeSku.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), int(storeSku.Price)) @@ -1659,7 +1665,7 @@ func refreshStoreSkuPrice(ctx *jxcontext.Context, db *dao.DaoDB, skuID int) (err } } }() - dao.UpdateEntity(db, storeSku, "Price", "JdSyncStatus", "MtwmSyncStatus", "EbaiSyncStatus", "JxPrice", "LastOperator") + dao.UpdateEntity(db, storeSku, "Price", "JdSyncStatus", "MtwmSyncStatus", "TaoSyncStatus", "EbaiSyncStatus", "JxPrice", "LastOperator") dao.Commit(db, txDB) return retVal, err }, list) @@ -1730,6 +1736,7 @@ func DeleteStoreSku(ctx *jxcontext.Context, db *dao.DaoDB, nameID, skuID int) (n _, err = dao.DeleteEntityLogically(db, storeSkuBind, map[string]interface{}{ model.FieldJdSyncStatus: model.SyncFlagDeletedMask, model.FieldMtwmSyncStatus: model.SyncFlagDeletedMask, + model.FieldTaoSyncStatus: model.SyncFlagDeletedMask, model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, model.FieldJdsSyncStatus: model.SyncFlagDeletedMask, }, ctx.GetUserName(), map[string]interface{}{ diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index e90f52abf..89ad59406 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -719,7 +719,7 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, upcs []strin sql += " AND t4.status >= ? AND t4.status <= ?" sqlParams = append(sqlParams, fromStatus, toStatus) } - if params["jdSyncStatus"] != nil || params["ebaiSyncStatus"] != nil || params["mtwmSyncStatus"] != nil { + if params["jdSyncStatus"] != nil || params["ebaiSyncStatus"] != nil || params["mtwmSyncStatus"] != nil || params["taoSyncStatus"] != nil { realVendorMap, err2 := getValidStoreVendorMap(db, storeIDs) if err = err2; err != nil { return "", nil, err @@ -741,6 +741,10 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, upcs []strin sql += " OR (t4.mtwm_sync_status & ? <> 0 AND NOT (t4.mtwm_sync_status & ? <> 0 AND (t4.status <> ? OR t2.status <> ?)) )" sqlParams = append(sqlParams, params["mtwmSyncStatus"], model.SyncFlagNewMask, model.SkuStatusNormal, model.SkuStatusNormal) } + if params["taoSyncStatus"] != nil && realVendorMap[model.VendorIDTaoVegetable] == 1 { + sql += " OR (t4.tao_sync_status & ? <> 0 AND NOT (t4.tao_sync_status & ? <> 0 AND (t4.status <> ? OR t2.status <> ?)) )" + sqlParams = append(sqlParams, params["taoSyncStatus"], model.SyncFlagNewMask, model.SkuStatusNormal, model.SkuStatusNormal) + } sql += ")" } } @@ -981,7 +985,7 @@ func getGetStoresSkusBaseSQL2(db *dao.DaoDB, storeIDs, skuIDs []int, upcs []stri sql += " AND t4.status >= ? AND t4.status <= ?" sqlParams = append(sqlParams, fromStatus, toStatus) } - if params["jdSyncStatus"] != nil || params["ebaiSyncStatus"] != nil || params["mtwmSyncStatus"] != nil { + if params["jdSyncStatus"] != nil || params["ebaiSyncStatus"] != nil || params["mtwmSyncStatus"] != nil || params["taoSyncStatus"] != nil { realVendorMap, err2 := getValidStoreVendorMap(db, storeIDs) if err = err2; err != nil { return "", nil, err @@ -1003,6 +1007,10 @@ func getGetStoresSkusBaseSQL2(db *dao.DaoDB, storeIDs, skuIDs []int, upcs []stri sql += " OR (t4.dd_sync_status & ? <> 0 AND NOT (t4.dd_sync_status & ? <> 0 AND (t4.status <> ? OR t2.status <> ?)) )" sqlParams = append(sqlParams, params["ddSyncStatus"], model.SyncFlagNewMask, model.SkuStatusNormal, model.SkuStatusNormal) } + if params["taoSyncStatus"] != nil && realVendorMap[model.VendorIDTaoVegetable] == 1 { + sql += " OR (t4.tao_sync_status & ? <> 0 AND NOT (t4.tao_sync_status & ? <> 0 AND (t4.status <> ? OR t2.status <> ?)) )" + sqlParams = append(sqlParams, params["taoSyncStatus"], model.SyncFlagNewMask, model.SkuStatusNormal, model.SkuStatusNormal) + } sql += ")" } } @@ -2066,6 +2074,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs skuBind.ID = deletedSku.ID // vendorSkuID的赋值意义不大 skuBind.MtwmID = deletedSku.MtwmID + skuBind.TaoID = deletedSku.TaoID skuBind.EbaiID = deletedSku.EbaiID skuBind.JdsID = deletedSku.JdsID skuBind.JdsWareID = deletedSku.JdsWareID @@ -2125,6 +2134,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs model.FieldJdSyncStatus: model.SyncFlagDeletedMask, model.FieldEbaiSyncStatus: model.SyncFlagDeletedMask, model.FieldMtwmSyncStatus: model.SyncFlagDeletedMask, + model.FieldTaoSyncStatus: model.SyncFlagDeletedMask, model.FieldYbSyncStatus: model.SyncFlagDeletedMask, model.FieldJdsSyncStatus: model.SyncFlagDeletedMask, model.FieldDdSyncStatus: model.SyncFlagDeletedMask, @@ -2262,6 +2272,7 @@ func updateStoresSkusWithoutSync(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs updateFieldMap[model.FieldJdSyncStatus] = 1 updateFieldMap[model.FieldEbaiSyncStatus] = 1 updateFieldMap[model.FieldMtwmSyncStatus] = 1 + updateFieldMap[model.FieldTaoSyncStatus] = 1 updateFieldMap[model.FieldDdSyncStatus] = 1 updateFieldMap[model.FieldUpdatedAt] = 1 updateFieldMap[model.FieldLastOperator] = 1 @@ -2424,6 +2435,7 @@ func updateStoreSkusSaleWithoutSync(ctx *jxcontext.Context, storeID int, skuBind model.FieldJdSyncStatus: skuBind.JdSyncStatus | model.SyncFlagSaleMask, model.FieldEbaiSyncStatus: skuBind.EbaiSyncStatus | model.SyncFlagSaleMask, model.FieldMtwmSyncStatus: skuBind.MtwmSyncStatus | model.SyncFlagSaleMask, + model.FieldTaoSyncStatus: skuBind.TaoSyncStatus | model.SyncFlagSaleMask, model.FieldDdSyncStatus: skuBind.DdSyncStatus | model.SyncFlagSaleMask, } if utils.IsTimeZero(autoSaleTime) || skuBind.Status == model.SkuStatusNormal { @@ -3195,6 +3207,7 @@ func setStoreSkuBindStatus(skuBind *model.StoreSkuBind, status int8) { skuBind.JdSyncStatus |= status skuBind.EbaiSyncStatus |= status skuBind.MtwmSyncStatus |= status + skuBind.TaoSyncStatus |= status skuBind.YbSyncStatus |= status skuBind.JdsSyncStatus |= status skuBind.DdSyncStatus |= status @@ -5495,6 +5508,7 @@ func buildStoreSkuBindInfosAndFocus(ctx *jxcontext.Context, db *dao.DaoDB, store JxPrice: jxPrice, YbSyncStatus: 0, MtwmSyncStatus: model.SyncFlagNewMask, + TaoSyncStatus: model.SyncFlagNewMask, JdSyncStatus: model.SyncFlagNewMask, EbaiSyncStatus: model.SyncFlagNewMask, } diff --git a/business/jxstore/cms/store_sku_check.go b/business/jxstore/cms/store_sku_check.go index 022aac0e1..c51b1a196 100644 --- a/business/jxstore/cms/store_sku_check.go +++ b/business/jxstore/cms/store_sku_check.go @@ -397,6 +397,8 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin status = jxSkuInfo.Skus[0].EbaiSyncStatus } else if vendorID == model.VendorIDJD { status = jxSkuInfo.Skus[0].JdSyncStatus + } else if vendorID == model.VendorIDTaoVegetable { + status = jxSkuInfo.Skus[0].TaoSyncStatus } syncStatus := utils.Int2Str(int(status)) toBeCreate := GetBoolName(model.IsSyncStatusNeedCreate(status)) diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 6c730e524..18e1d23db 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -69,6 +69,9 @@ func CreateStoreCategoryByStoreSku(ctx *jxcontext.Context, vendorID, storeID int } func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID, storeID int, vendorStoreID string, nameIDs, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { + if storeID != 668594 && vendorID == model.VendorIDTaoVegetable { + return "", nil + } handler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) num := 0 db := dao.GetDB() @@ -551,9 +554,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag } } else { if sku.MergedStatus == model.SkuStatusNormal { - if vendorID == model.VendorIDDD { - createList = append(createList, sku) - } else if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop { + if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDDD || vendorID != model.VendorIDJDShop { globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d,但没有平台分类ID", storeID, sku.SkuID) } else if dao.IsVendorThingIDEmpty(utils.Int64ToStr(sku.VendorVendorCatID)) && vendorID == model.VendorIDJDShop { globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d,但没有映射的平台ID", storeID, sku.SkuID) diff --git a/business/model/api_config.go b/business/model/api_config.go index ce9ba80c5..836f1c4b2 100644 --- a/business/model/api_config.go +++ b/business/model/api_config.go @@ -95,22 +95,22 @@ type VendorInfo struct { var ( VendorNames = map[int]string{ - VendorIDJD: "Jd", - VendorIDMTWM: "Mtwm", - VendorIDDD: "Dd", // 抖店 - VendorIDELM: "Elm", - VendorIDEBAI: "Ebai", - VendorIDWSC: "Wsc", - VendorIDYB: "Yb", - VendorIDJX: "Jx", - VendorIDJDShop: "Jds", + VendorIDJD: "Jd", + VendorIDMTWM: "Mtwm", + VendorIDDD: "Dd", // 抖店 + VendorIDELM: "Elm", + VendorIDEBAI: "Ebai", + VendorIDWSC: "Wsc", + VendorIDYB: "Yb", + VendorIDJX: "Jx", + VendorIDJDShop: "Jds", + VendorIDTaoVegetable: "Tao", VendorIDDada: "Dada", VendorIDMTPS: "Mtps", VendorIDFengNiao: "Fn", VendorIDSFPS: "Sfps", - //VendorIDDYPS: "DYPS", - VendorIDUUPT: "UUPT", + VendorIDUUPT: "UUPT", VendorIDFeiE: "Feie", VendorIDXiaoWM: "XiaoWM", @@ -132,14 +132,15 @@ var ( } VendorChineseNames = map[int]string{ - VendorIDJD: "京东到家", - VendorIDMTWM: "美团外卖", - VendorIDELM: "饿了么", - VendorIDEBAI: "饿百新零售", - VendorIDYB: "银豹", - VendorIDJDShop: "京东商城", - VendorIDWSC: "微盟微商城", - VendorIDJX: "京西商城", + VendorIDJD: "京东到家", + VendorIDMTWM: "美团外卖", + VendorIDELM: "饿了么", + VendorIDEBAI: "饿百新零售", + VendorIDYB: "银豹", + VendorIDJDShop: "京东商城", + VendorIDWSC: "微盟微商城", + VendorIDJX: "京西商城", + VendorIDTaoVegetable: "淘先达", VendorIDDada: "达达众包", VendorIDMTPS: "美团配送", diff --git a/business/model/const.go b/business/model/const.go index 29c29b26b..96609bfad 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -26,12 +26,13 @@ var ( } ShopChineseNames = map[int]string{ - VendorIDJD: globals.StoreName, - VendorIDMTWM: globals.StoreNameMtwm, - VendorIDELM: globals.StoreNameEbai, - VendorIDEBAI: globals.StoreNameEbai, - VendorIDJX: fmt.Sprintf("%s商城", globals.StoreName), - VendorIDWSC: "微盟微商城", + VendorIDJD: globals.StoreName, + VendorIDMTWM: globals.StoreNameMtwm, + VendorIDTaoVegetable: globals.StoreNameTao, + VendorIDELM: globals.StoreNameEbai, + VendorIDEBAI: globals.StoreNameEbai, + VendorIDJX: fmt.Sprintf("%s商城", globals.StoreName), + VendorIDWSC: "微盟微商城", } OrderStatusName = map[int]string{ @@ -149,11 +150,12 @@ var ( } MultiStoresVendorMap = map[int]int{ - VendorIDJD: 1, - VendorIDMTWM: 0, - VendorIDELM: 0, - VendorIDEBAI: 0, - VendorIDDD: 0, + VendorIDJD: 1, + VendorIDMTWM: 0, + VendorIDELM: 0, + VendorIDEBAI: 0, + VendorIDDD: 0, + VendorIDTaoVegetable: 0, } ZXCityCodeMap = map[int]string{ @@ -288,6 +290,8 @@ const ( OrderStatusEndEnd = 120 AfsOrderStatusWait4Approve = 155 // 待审核售后单 + AfsOrderStatusCancelAfs = 156 // 用户取消售后 + AfsOrderStatusOnSaleAfs = 157 // 用户售中取消 AfsOrderStatusNew = 160 // 已审核或不需要审核售后单 AfsOrderStatusWait4ReceiveGoods = 165 // 退款退货的,需要商家确认收到货 AfsOrderStatusReceivedGoods = 167 // 已确认收到货 diff --git a/business/model/dao/store.go b/business/model/dao/store.go index 9fa3a02b5..d52d68171 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -510,6 +510,7 @@ func AddStoreCategoryMap(db *DaoDB, storeID, categoryID int, vendorID int, vendo StoreID: storeID, CategoryID: categoryID, MtwmSyncStatus: model.SyncFlagNewMask, + TaoSyncStatus: model.SyncFlagNewMask, EbaiSyncStatus: model.SyncFlagNewMask, DdSyncStatus: model.SyncFlagNewMask, YbSyncStatus: model.SyncFlagNewMask, @@ -533,6 +534,9 @@ func AddStoreCategoryMap(db *DaoDB, storeID, categoryID int, vendorID int, vendo } else if vendorID == model.VendorIDDD { storeCat.DdID = vendorCategoryID storeCat.DdSyncStatus = status + } else if vendorID == model.VendorIDTaoVegetable { + storeCat.TaoID = vendorCategoryID + storeCat.TaoSyncStatus = status } else { panic("unsupported vendor") } diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index fd40306fe..ae73b4e7c 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -298,6 +298,7 @@ type StoreSkuExt struct { JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` EbaiSyncStatus int8 `orm:"default(2)" json:"ebaiSyncStatus"` MtwmSyncStatus int8 `orm:"default(2)" json:"mtwmSyncStatus"` + TaoSyncStatus int8 `orm:"default(2)" json:"taoSyncStatus"` DdSyncStatus int8 `orm:"default(2)" json:"ddSyncStatus"` YbSyncStatus int8 `orm:"default(2)" json:"ybSyncStatus"` JdsSyncStatus int8 `orm:"default(2)" json:"jdsSyncStatus"` //京东商城 @@ -372,6 +373,7 @@ type StoreSkuAndName struct { StoreSkuSyncInfo JdSyncStatus int8 `orm:"default(2)"` MtwmSyncStatus int8 `orm:"default(2)"` + TaoSyncStatus int8 `orm:"default(2)"` EbaiSyncStatus int8 `orm:"default(2)"` } @@ -670,9 +672,6 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo } else { fmtParams = append(fmtParams, "''") } - // if globals.IsStoreSkuAct { - // sql += " OR act.sync_status <> 0" - // } sql += ")" } else { sql += " AND t1.deleted_at = ?" @@ -682,11 +681,6 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo sql += " AND t1.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) } - // 多门店平台没有成功创建的商品,不直接过滤,让上层同步时报错 - // if !isSingleStorePF { - // sql += " AND t2.%s_id <> 0" - // fmtParams = append(fmtParams, fieldPrefix) - // } sql = fmt.Sprintf(sql, fmtParams...) sql += " ORDER BY t1.price" if err = GetRows(db, &skus, sql, sqlParams...); err != nil { @@ -1433,6 +1427,9 @@ func SetStoreSkuBindVendorPrice(storeSkuBind *model.StoreSkuBind, vendorID int, case model.VendorIDDD: storeSkuBind.DdPrice = vendorPrice storeSkuBind.DdLockTime = pLockTime + case model.VendorIDTaoVegetable: + storeSkuBind.TaoPrice = vendorPrice + storeSkuBind.TaoLockTime = pLockTime } } @@ -1448,6 +1445,8 @@ func GetStoreSkuBindVendorPrice(storeSkuBind *model.StoreSkuBind, vendorID int) vendorPrice = storeSkuBind.JxPrice case model.VendorIDDD: vendorPrice = storeSkuBind.DdPrice + case model.VendorIDTaoVegetable: + vendorPrice = storeSkuBind.TaoPrice } return vendorPrice } @@ -1460,6 +1459,9 @@ func SetStoreSkuBindSyncStatus(storeSkuBind *model.StoreSkuBind, vendorID int, s storeSkuBind.MtwmSyncStatus = syncStatus case model.VendorIDEBAI: storeSkuBind.EbaiSyncStatus = syncStatus + case model.VendorIDTaoVegetable: + storeSkuBind.TaoSyncStatus = syncStatus + } } @@ -1471,6 +1473,8 @@ func GetStoreSkuBindSyncStatus(storeSkuBind *model.StoreSkuBind, vendorID int) ( syncStatus = storeSkuBind.MtwmSyncStatus case model.VendorIDEBAI: syncStatus = storeSkuBind.EbaiSyncStatus + case model.VendorIDTaoVegetable: + syncStatus = storeSkuBind.TaoSyncStatus } return syncStatus } @@ -1481,6 +1485,8 @@ func SetStoreCatMapSyncStatus(storeCatMap *model.StoreSkuCategoryMap, vendorID i storeCatMap.MtwmSyncStatus = syncStatus case model.VendorIDEBAI: storeCatMap.EbaiSyncStatus = syncStatus + case model.VendorIDTaoVegetable: + storeCatMap.TaoSyncStatus = syncStatus } } diff --git a/business/model/model.go b/business/model/model.go index 9ef7718b4..69bc36e88 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -17,6 +17,7 @@ const ( // FieldElmSyncStatus = "ElmSyncStatus" FieldEbaiSyncStatus = "EbaiSyncStatus" FieldMtwmSyncStatus = "MtwmSyncStatus" + FieldTaoSyncStatus = "TaoSyncStatus" FieldDdSyncStatus = "DdSyncStatus" // FieldWscSyncStatus = "WscSyncStatus" FieldYbSyncStatus = "YbSyncStatus" diff --git a/business/model/sku.go b/business/model/sku.go index 6cf2ff637..bbf169a34 100644 --- a/business/model/sku.go +++ b/business/model/sku.go @@ -132,12 +132,11 @@ type SkuCategory struct { EbaiCategoryID int64 `orm:"column(ebai_category_id)" json:"ebaiCategoryID"` // 这个是指对应的饿百商品类别 MtwmCategoryID int64 `orm:"column(mtwm_category_id)" json:"mtwmCategoryID"` // 这个是指对应的美团外卖商品类别 DdCategoryID int64 `orm:"column(dd_category_id)" json:"ddCategoryID"` // 这个是指对应的抖音外卖商品类别 + TaoCategoryID int64 `orm:"column(tao_category_id)" json:"taoCategoryID"` // 这个是指对应的抖音外卖商品类别 YbCategoryID int64 `orm:"column(yb_category_id)" json:"ybCategoryID"` // 这个是指对应的银豹商品类别 JdsCategoryID int64 `orm:"column(jds_category_id)" json:"jdsCategoryID"` // 这个是指对应的京东商城类别 GoMeiCategoryID int64 `orm:"column(go_mei_category_id)" json:"goMeiCategoryID"` // 这个是指对应的国美商城类别 - // ElmCategoryID int64 `orm:"column(elm_category_id)" json:"elmCategoryID"` // 这个是指对应的饿了么商品类别 - // WscCategoryID int64 `orm:"column(wsc_category_id)" json:"wscCategoryID"` // 这个是指对应的美团外卖商品类别 Status int8 `orm:"default(1)" json:"status"` //分类状态,0表示禁用,1表示启用 Img string `orm:"size(512)" json:"img"` //分类图片 @@ -146,8 +145,6 @@ type SkuCategory struct { IsExdSpec int `json:"isExdSpec"` //是否是饿鲜达特有新建的分类 IsExdSync int `json:"isExdSync"` //饿鲜达分类是否同步到平台 - // JdID int64 `orm:"column(jd_id);index" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID - // JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` IsSync int `json:"isSync"` //是否同步到平台 } @@ -210,27 +207,21 @@ func (*SkuName) TableIndex() [][]string { type Sku struct { ModelIDCULD - - CategoryID int `orm:"column(category_id)" json:"categoryID"` // 特殊类别,一般用于秒杀,特价之类的特殊类别 - NameID int `orm:"column(name_id)" json:"nameID"` // todo 这个索引应该要求唯一 - SkuIndex int `json:"-"` - Comment string `orm:"size(255)" json:"comment"` - SpecQuality float32 `json:"specQuality"` - SpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量 - Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality - Status int `json:"status"` - Seq int `json:"seq"` - - ExdSkuID string `orm:"column(exd_sku_id)" json:"exdSkuID"` //饿鲜达商品ID - ExdCategoryThirdID int `orm:"column(exd_category_third_id)" json:"exdCategoryThirdID"` - EclpID string `orm:"column(eclp_id)" json:"eclpID"` //eclp物料商品ID - MinOrderCount int `json:"minOrderCount"` //最少起购份数,美团用 - LadderBoxNum int `json:"ladderBoxNum"` //包装费x件 ,美团用 - LadderBoxPrice int `json:"ladderBoxPrice"` //包装费y元 ,美团用 - // JdID int64 `orm:"column(jd_id);null;index" json:"jdID"` - // JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"` - - // LinkID int `orm:"column(link_id);null;index" json:"linkID"` + CategoryID int `orm:"column(category_id)" json:"categoryID"` // 特殊类别,一般用于秒杀,特价之类的特殊类别 + NameID int `orm:"column(name_id)" json:"nameID"` // todo 这个索引应该要求唯一 + SkuIndex int `json:"-"` + Comment string `orm:"size(255)" json:"comment"` + SpecQuality float32 `json:"specQuality"` + SpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量 + Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality + Status int `json:"status"` + Seq int `json:"seq"` + ExdSkuID string `orm:"column(exd_sku_id)" json:"exdSkuID"` //饿鲜达商品ID + ExdCategoryThirdID int `orm:"column(exd_category_third_id)" json:"exdCategoryThirdID"` + EclpID string `orm:"column(eclp_id)" json:"eclpID"` //eclp物料商品ID + MinOrderCount int `json:"minOrderCount"` //最少起购份数,美团用 + LadderBoxNum int `json:"ladderBoxNum"` //包装费x件 ,美团用 + LadderBoxPrice int `json:"ladderBoxPrice"` //包装费y元 ,美团用 } type SkuAndName struct { @@ -291,6 +282,7 @@ type SkuNameExt struct { JdsCategoryID string `json:"jdsCategoryID"` EbaiCategoryID string `json:"ebaiCategoryID"` MtwmCategoryID string `json:"mtwmCategoryID"` + TaoCategoryID string `json:"TaoCategoryID"` DdCategoryID string `json:"ddCategoryID"` } diff --git a/business/model/store_sku.go b/business/model/store_sku.go index 16768b358..1d93c81f4 100644 --- a/business/model/store_sku.go +++ b/business/model/store_sku.go @@ -55,21 +55,19 @@ type StoreSkuCategoryMap struct { StoreID int `orm:"column(store_id)"` CategoryID int `orm:"column(category_id)"` - // ElmID int64 `orm:"column(elm_id);index"` EbaiID int64 `orm:"column(ebai_id);index"` MtwmID string `orm:"column(mtwm_id);index;size(16)"` + TaoID string `orm:"column(tao_id);index;size(16)"` DdID string `orm:"column(dd_id);index;size(16)"` - // WscID int64 `orm:"column(wsc_id);index"` + YbID int64 `orm:"column(yb_id);index"` + JdsID int64 `orm:"column(jds_id);index"` - // ElmSyncStatus int8 `orm:"default(2)"` EbaiSyncStatus int8 `orm:"default(2)"` MtwmSyncStatus int8 `orm:"default(2)"` + TaoSyncStatus int8 `orm:"default(2)"` DdSyncStatus int8 `orm:"default(2)"` - // WscSyncStatus int8 `orm:"default(2)"` - YbID int64 `orm:"column(yb_id);index"` - YbSyncStatus int8 `orm:"default(2)"` - JdsID int64 `orm:"column(jds_id);index"` - JdsSyncStatus int8 `orm:"default(2)"` + YbSyncStatus int8 `orm:"default(2)"` + JdsSyncStatus int8 `orm:"default(2)"` } func (*StoreSkuCategoryMap) TableUnique() [][]string { @@ -113,31 +111,28 @@ type StoreSkuBind struct { Status int // ElmID int64 `orm:"column(elm_id);index"` - MtwmID int64 `orm:"column(mtwm_id);index"` - EbaiID int64 `orm:"column(ebai_id);index"` - YbID int64 `orm:"column(yb_id);index"` - JdsID int64 `orm:"column(jds_id);index"` - JdsWareID int64 `orm:"column(jds_ware_id)"` - // GmID string `orm:"column(gm_id)"` - // WscID int64 `orm:"column(wsc_id);index"` // 表示微盟skuId - // WscID2 int64 `orm:"column(wsc_id2);index"` // 表示微盟goodsId + MtwmID int64 `orm:"column(mtwm_id);index"` + TaoID int64 `orm:"column(tao_id);index"` + EbaiID int64 `orm:"column(ebai_id);index"` + YbID int64 `orm:"column(yb_id);index"` + JdsID int64 `orm:"column(jds_id);index"` + JdsWareID int64 `orm:"column(jds_ware_id)"` DdID int64 `orm:"column(dd_id);index"` // 子品主商品id VendorSonSkuID string `orm:"column(vendor_son_sku_id)"` // 子商品skuid VendorSkuAttrId string `orm:"column(vendor_sku_attr_id)"` // 抖音需要,主品skuid VendorMainId string `orm:"column(vendor_Main_id)"` // 抖音需要,商品主id - // ElmSyncStatus int8 `orm:"default(2)"` JdSyncStatus int8 `orm:"default(2)"` MtwmSyncStatus int8 `orm:"default(2)"` + TaoSyncStatus int8 `orm:"default(2)"` DdSyncStatus int8 `orm:"default(2)"` EbaiSyncStatus int8 `orm:"default(2)"` YbSyncStatus int8 `orm:"default(2)"` JdsSyncStatus int8 `orm:"default(2)"` //京东商城 - //GmSyncStatus int8 `orm:"default(2)"` //京东商城 - // WscSyncStatus int8 `orm:"default(2)"` JdPrice int `json:"jdPrice"` MtwmPrice int `json:"mtwmPrice"` + TaoPrice int `json:"taoPrice"` EbaiPrice int `json:"ebaiPrice"` JxPrice int `json:"jxPrice"` DdPrice int `json:"ddPrice"` @@ -148,6 +143,7 @@ type StoreSkuBind struct { JdLockTime *time.Time `orm:"null" json:"jdLockTime"` JdsLockTime *time.Time `orm:"null" json:"jdsLockTime"` MtwmLockTime *time.Time `orm:"null" json:"mtwmLockTime"` + TaoLockTime *time.Time `orm:"null" json:"taoLockTime"` EbaiLockTime *time.Time `orm:"null" json:"ebaiLockTime"` JxLockTime *time.Time `orm:"null" json:"jxLockTime"` YbLockTime *time.Time `orm:"null" json:"ybLockTime"` diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index 884dbc3d3..7f6fb8972 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -110,58 +110,68 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap default: order.Status = model.WaybillStatusUnknown } + err := dadaapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), utils.Int2Str(order.Status)) - defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 - if order.OrderVendorID == model.VendorIDDD { - result := &mtpsapi.RiderInfo{ - OrderId: order.VendorOrderID, - ThirdCarrierOrderId: order.VendorOrderID, - CourierName: order.CourierName, - CourierPhone: order.CourierMobile, - LogisticsProviderCode: "10002", - LogisticsStatus: order.Status, - OpCode: "", - } - switch msg.OrderStatus { - case dadaapi.OrderStatusWaitingForAccept: // 待接单,召唤骑手 - result.LogisticsStatus = model.WaybillStatusNew - result.LogisticsContext = model.RiderWaitRider - case dadaapi.OrderStatusAccepted: // 待取货 - result.LogisticsStatus = model.WaybillStatusCourierAssigned // 分配骑手 - result.LogisticsContext = model.RiderWaitGetGoods - case dadaapi.OrderStatusDelivering: // 配送中 - result.LogisticsStatus = model.WaybillStatusDelivering - result.LogisticsContext = model.RiderGetOrderDelivering - case dadaapi.OrderStatusFinished: // 完成 - result.LogisticsStatus = model.WaybillStatusDelivered - result.LogisticsContext = model.RiderGetOrderDelivered - case dadaapi.OrderStatusCanceled: // 取消 - result.LogisticsStatus = model.WaybillStatusCanceled - result.LogisticsContext = model.RiderGetOrderCanceled - case 8: // 指派单,不处理 - result.LogisticsStatus = 0 - result.LogisticsContext = model.RiderGetOrderDeliverOther - case 9: // 配送异常返回值 - result.LogisticsStatus = model.WaybillStatusDeliverFailed - result.LogisticsContext = model.RiderGetOrderDeliverFailed - case 10: // 妥投异常之物品返回完成 - 不处理 - result.LogisticsStatus = 0 - result.LogisticsContext = model.RiderGetOrderDeliverOther - case dadaapi.OrderStatusReturningInOrder: // 骑手到店 - result.LogisticsStatus = model.WaybillStatusCourierArrived - result.LogisticsContext = model.RiderToStore - case dadaapi.OrderStatusAddOrderFailed: // 创建达达运单失败 - 不处理 - result.LogisticsStatus = model.WaybillStatusFailed - result.LogisticsContext = model.RiderGetOrderDeliverOther - default: - result.LogisticsStatus = 0 - result.LogisticsContext = model.RiderGetOrderDeliverOther - } - delivery.PullTiktokRiderInfo(result) + + switch order.OrderVendorID { + case model.VendorIDDD: + tiktokStatusPush(order, msg.OrderStatus) + case model.VendorIDMTWM, model.VendorIDTaoVegetable: + delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 } + return err } +// 抖音订单状态回传 +func tiktokStatusPush(order *model.Waybill, status int) { + result := &mtpsapi.RiderInfo{ + OrderId: order.VendorOrderID, + ThirdCarrierOrderId: order.VendorOrderID, + CourierName: order.CourierName, + CourierPhone: order.CourierMobile, + LogisticsProviderCode: "10002", + LogisticsStatus: order.Status, + OpCode: "", + } + switch status { + case dadaapi.OrderStatusWaitingForAccept: // 待接单,召唤骑手 + result.LogisticsStatus = model.WaybillStatusNew + result.LogisticsContext = model.RiderWaitRider + case dadaapi.OrderStatusAccepted: // 待取货 + result.LogisticsStatus = model.WaybillStatusCourierAssigned // 分配骑手 + result.LogisticsContext = model.RiderWaitGetGoods + case dadaapi.OrderStatusDelivering: // 配送中 + result.LogisticsStatus = model.WaybillStatusDelivering + result.LogisticsContext = model.RiderGetOrderDelivering + case dadaapi.OrderStatusFinished: // 完成 + result.LogisticsStatus = model.WaybillStatusDelivered + result.LogisticsContext = model.RiderGetOrderDelivered + case dadaapi.OrderStatusCanceled: // 取消 + result.LogisticsStatus = model.WaybillStatusCanceled + result.LogisticsContext = model.RiderGetOrderCanceled + case 8: // 指派单,不处理 + result.LogisticsStatus = 0 + result.LogisticsContext = model.RiderGetOrderDeliverOther + case 9: // 配送异常返回值 + result.LogisticsStatus = model.WaybillStatusDeliverFailed + result.LogisticsContext = model.RiderGetOrderDeliverFailed + case 10: // 妥投异常之物品返回完成 - 不处理 + result.LogisticsStatus = 0 + result.LogisticsContext = model.RiderGetOrderDeliverOther + case dadaapi.OrderStatusReturningInOrder: // 骑手到店 + result.LogisticsStatus = model.WaybillStatusCourierArrived + result.LogisticsContext = model.RiderToStore + case dadaapi.OrderStatusAddOrderFailed: // 创建达达运单失败 - 不处理 + result.LogisticsStatus = model.WaybillStatusFailed + result.LogisticsContext = model.RiderGetOrderDeliverOther + default: + result.LogisticsStatus = 0 + result.LogisticsContext = model.RiderGetOrderDeliverOther + } + delivery.PullTiktokRiderInfo(result) +} + func (c *DeliveryHandler) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal *model.Waybill, goods *model.GoodsOrder) { retVal = &model.Waybill{ VendorWaybillID: msg.ClientID, @@ -604,32 +614,32 @@ func (c *DeliveryHandler) GetDeliverLiquidatedDamages(orderId string, deliverId // 直接返回的 原因是,一个订单在达达发布多次运单时,QueryOrderInfo获取到的运单始终是最后一个运单的配送价格!所以直接返回算了! return localPrice, nil - // 平台状态兑换金额 - var vendorPrice int64 = 0 - // 未接单不扣款 - if dadaOrder.AcceptTime == "" { - vendorPrice = 0 - } - - // 有了接单时间,订单变成了待取货 - if dadaOrder.AcceptTime != "" && dadaOrder.FetchTime == "" { - nowTime := time.Now().Unix() - fetchTime := utils.Str2Time(dadaOrder.AcceptTime).Unix() - timeDiffer := nowTime - fetchTime - if timeDiffer > 15*60 || timeDiffer < 60 { - vendorPrice = 0 - } - vendorPrice = 200 - } - - // fetchTime 已经有时间了,代表已经取货.次数取消扣除此订单全部金额 - // 达达存在多个订单的运单违约金额统计在一起的情况 - if dadaOrder.FetchTime != "" { - vendorPrice = utils.Float64TwoInt64(dadaOrder.DeliveryFee * float64(100)) - } - - if localPrice > vendorPrice { - return localPrice, nil - } - return vendorPrice, nil + //// 平台状态兑换金额 + //var vendorPrice int64 = 0 + //// 未接单不扣款 + //if dadaOrder.AcceptTime == "" { + // vendorPrice = 0 + //} + // + //// 有了接单时间,订单变成了待取货 + //if dadaOrder.AcceptTime != "" && dadaOrder.FetchTime == "" { + // nowTime := time.Now().Unix() + // fetchTime := utils.Str2Time(dadaOrder.AcceptTime).Unix() + // timeDiffer := nowTime - fetchTime + // if timeDiffer > 15*60 || timeDiffer < 60 { + // vendorPrice = 0 + // } + // vendorPrice = 200 + //} + // + //// fetchTime 已经有时间了,代表已经取货.次数取消扣除此订单全部金额 + //// 达达存在多个订单的运单违约金额统计在一起的情况 + //if dadaOrder.FetchTime != "" { + // vendorPrice = utils.Float64TwoInt64(dadaOrder.DeliveryFee * float64(100)) + //} + // + //if localPrice > vendorPrice { + // return localPrice, nil + //} + //return vendorPrice, nil } diff --git a/business/partner/delivery/fn/waybill.go b/business/partner/delivery/fn/waybill.go index 56a76c93c..905d929ae 100644 --- a/business/partner/delivery/fn/waybill.go +++ b/business/partner/delivery/fn/waybill.go @@ -69,7 +69,6 @@ func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, } parameter.PartnerOrderCode = bill.VendorOrderID if err = api.FnAPI.CancelOrder(parameter); err != nil { - globals.SugarLogger.Debugf("============err := %v ", err) if strings.Contains(err.Error(), "运单暂未生成") { err = nil } @@ -280,49 +279,55 @@ func OnWaybillMsg(msg *fnpsapi.OrderStatusNottify, resultParam *fnpsapi.ShortSta return fnpsapi.Err2CallbackResponse(err, "") } - if order.OrderVendorID == model.VendorIDDD { - result := &mtpsapi.RiderInfo{ - OrderId: order.VendorOrderID, - ThirdCarrierOrderId: order.VendorOrderID, - CourierName: order.CourierName, - CourierPhone: order.CourierMobile, - LogisticsProviderCode: "10002", - LogisticsStatus: order.Status, - OpCode: "", - } - switch orderStatus { - case fnpsapi.OrderStatusAcceptCreate, fnpsapi.OrderStatusAccept: // 待接单,召唤骑手 - result.LogisticsStatus = model.WaybillStatusNew - result.LogisticsContext = model.RiderWaitRider - case fnpsapi.OrderStatusAssigned: //20分配骑手 待取货 - result.LogisticsStatus = model.WaybillStatusCourierAssigned // 分配骑手 - result.LogisticsContext = model.RiderWaitGetGoods - case fnpsapi.OrderStatusDelivering: // 2 配送中 // 配送中 - result.LogisticsStatus = model.WaybillStatusDelivering - result.LogisticsContext = model.RiderGetOrderDelivering - case fnpsapi.OrderStatusDelivered: // 3 已经送达 // 完成 - result.LogisticsStatus = model.WaybillStatusDelivered - result.LogisticsContext = model.RiderGetOrderDelivered - case fnpsapi.OrderStatusAcceptCacle: // 取消 - result.LogisticsStatus = model.WaybillStatusCanceled - result.LogisticsContext = model.RiderGetOrderCanceled - case fnpsapi.OrderStatusException: // 5 异常: // 配送异常返回值 - result.LogisticsStatus = model.WaybillStatusDeliverFailed - result.LogisticsContext = model.RiderGetOrderDeliverFailed - case fnpsapi.OrderStatusArrived: // 80 到店 // 骑手到店 - result.LogisticsStatus = model.WaybillStatusCourierArrived - result.LogisticsContext = model.RiderToStore - default: - result.LogisticsStatus = 0 - result.LogisticsContext = model.RiderGetOrderDeliverOther - } - delivery.PullTiktokRiderInfo(result) + switch order.OrderVendorID { + case model.VendorIDDD: + tiktokStatusPush(order, orderStatus) + case model.VendorIDMTWM, model.VendorIDTaoVegetable: + delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 } - - defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 return fnpsapi.Err2CallbackResponse(nil, "") } +// 抖音订单状态回传 +func tiktokStatusPush(order *model.Waybill, orderStatus int64) { + result := &mtpsapi.RiderInfo{ + OrderId: order.VendorOrderID, + ThirdCarrierOrderId: order.VendorOrderID, + CourierName: order.CourierName, + CourierPhone: order.CourierMobile, + LogisticsProviderCode: "10002", + LogisticsStatus: order.Status, + OpCode: "", + } + switch orderStatus { + case fnpsapi.OrderStatusAcceptCreate, fnpsapi.OrderStatusAccept: // 待接单,召唤骑手 + result.LogisticsStatus = model.WaybillStatusNew + result.LogisticsContext = model.RiderWaitRider + case fnpsapi.OrderStatusAssigned: //20分配骑手 待取货 + result.LogisticsStatus = model.WaybillStatusCourierAssigned // 分配骑手 + result.LogisticsContext = model.RiderWaitGetGoods + case fnpsapi.OrderStatusDelivering: // 2 配送中 // 配送中 + result.LogisticsStatus = model.WaybillStatusDelivering + result.LogisticsContext = model.RiderGetOrderDelivering + case fnpsapi.OrderStatusDelivered: // 3 已经送达 // 完成 + result.LogisticsStatus = model.WaybillStatusDelivered + result.LogisticsContext = model.RiderGetOrderDelivered + case fnpsapi.OrderStatusAcceptCacle: // 取消 + result.LogisticsStatus = model.WaybillStatusCanceled + result.LogisticsContext = model.RiderGetOrderCanceled + case fnpsapi.OrderStatusException: // 5 异常: // 配送异常返回值 + result.LogisticsStatus = model.WaybillStatusDeliverFailed + result.LogisticsContext = model.RiderGetOrderDeliverFailed + case fnpsapi.OrderStatusArrived: // 80 到店 // 骑手到店 + result.LogisticsStatus = model.WaybillStatusCourierArrived + result.LogisticsContext = model.RiderToStore + default: + result.LogisticsStatus = 0 + result.LogisticsContext = model.RiderGetOrderDeliverOther + } + delivery.PullTiktokRiderInfo(result) +} + // 异常报备 func OnWaybillExceptFn(msg *fnpsapi.AbnormalReportNotify) (retVal *fnpsapi.CallbackResponse) { return CurDeliveryHandler.OnWaybillExcept(msg) diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index d9f1dd99c..118460241 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -96,19 +96,13 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m } } - order2, _ := partner.CurOrderManager.LoadOrder(order.VendorOrderID, order.OrderVendorID) - //查不到订单可能就是果园的订单 - if order2 == nil { - c.pushToGy(msg) - return mtpsapi.SuccessResponse - } - store, _ := dao.GetStoreDetail(dao.GetDB(), goodsOrder.JxStoreID, goodsOrder.VendorID, goodsOrder.VendorOrgCode) switch msg.Status { case mtpsapi.OrderStatusWaitingForSchedule: data, err := api.MtpsAPI.QueryOrderStatus(msg.DeliveryID, msg.MtPeisongID) if err != nil { - return mtpsapi.Err2CallbackResponse(err, fmt.Sprintf("%s", "获取订单状态错误")) + globals.SugarLogger.Debugf("获取运单信息错误,可能是果园运单:%s,%v", utils.Format4Output(msg, false), err) + break } order.DesiredFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["delivery_fee"]) * 100) order.ActualFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["pay_amount"]) * 100) @@ -117,7 +111,8 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m case mtpsapi.OrderStatusAccepted: // 已接单 data, err := api.MtpsAPI.QueryOrderStatus(msg.DeliveryID, msg.MtPeisongID) if err != nil { - return mtpsapi.Err2CallbackResponse(err, fmt.Sprintf("%s", "获取订单状态错误")) + globals.SugarLogger.Debugf("获取运单信息错误,可能是果园运单:%s,%v", utils.Format4Output(msg, false), err) + break } order.DesiredFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["delivery_fee"]) * 100) order.ActualFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["pay_amount"]) * 100) @@ -134,17 +129,21 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m return mtpsapi.SuccessResponse } - //if msg.Status == mtpsapi.OrderStatusPickedUp { - // order.Status = model.WaybillStatusCourierArrived - // mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) - // delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 - // msg.Status = mtpsapi.OrderStatusPickedUp - //} + order2, _ := partner.CurOrderManager.LoadOrder(order.VendorOrderID, order.OrderVendorID) + //查不到订单可能就是果园的订单 + if order2 == nil && beego.BConfig.RunMode != "jxgy" { + c.pushToGy(msg) + return mtpsapi.SuccessResponse + } + // 加入调度器 err := mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) - defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 - if order.OrderVendorID == model.VendorIDDD { + + switch order.OrderVendorID { + case model.VendorIDDD: pushMTPSToTiktok(msg.Status, order) + case model.VendorIDMTWM, model.VendorIDTaoVegetable: + delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 } return err diff --git a/business/partner/delivery/rider.go b/business/partner/delivery/rider.go index 4681b9dae..d63181194 100644 --- a/business/partner/delivery/rider.go +++ b/business/partner/delivery/rider.go @@ -3,7 +3,9 @@ package delivery import ( "crypto/rand" "fmt" + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable" "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/globals/api" "math/big" "time" @@ -19,6 +21,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" + utilsTao "git.rosy.net.cn/jx-callback/business/partner/purchase/tao_vegetable" "git.rosy.net.cn/jx-callback/globals" ) @@ -88,9 +91,6 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { //3.当同一个订单已经上传了一次配送信息,如再次同步会更新配送信息,以最新的一次为准。 //4.如订单已完成、已取消等状态发货将失败。 for _, v := range orders { - //if v.Status >= model.OrderStatusFinished || v.Status < model.OrderStatusDelivering { - // continue - //} if orderId == "" && v.VendorID == model.VendorIDDD { // 抖音门店订单除了三方配送回调时推送,不在主动推送配送消息 continue } @@ -134,6 +134,7 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { riderInfo.LogisticsStatus = v.Status } + taoDeliveryStatus := "" switch riderInfo.LogisticsStatus { case 5: // 呼叫骑手 riderInfo.LogisticsStatus = 0 @@ -147,12 +148,15 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { case 20: //配送中 riderInfo.LogisticsStatus = 20 riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERPICKUP + taoDeliveryStatus = tao_vegetable.OrderStatusDelivery // 配送中 case 110: // 完成 riderInfo.LogisticsStatus = 40 riderInfo.OpCode = tiktok_api.TiktokLogisticsDELIVERED + taoDeliveryStatus = tao_vegetable.OrderStatusDeliveryOver // 完成 case 105: // 完成 riderInfo.LogisticsStatus = 40 riderInfo.OpCode = tiktok_api.TiktokLogisticsDELIVERED + taoDeliveryStatus = tao_vegetable.OrderStatusDeliveryOver // 完成 case 115: // 取消 riderInfo.CourierName = "" riderInfo.CourierPhone = "" @@ -161,24 +165,28 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { case 22, 0, 120: // 异常配送 riderInfo.LogisticsStatus = 22 riderInfo.OpCode = tiktok_api.TiktokLogisticsINDDELIVERYEXCEPTION + taoDeliveryStatus = tao_vegetable.OrderStatusUserRejection // 完成 default: continue } - if riderInfo.Longitude == "" { - riderInfo.Longitude = utils.Float64ToStr(utils.Int2Float64(v.ConsigneeLng) / 1000000) - } - if riderInfo.Latitude == "" { - riderInfo.Latitude = utils.Float64ToStr(utils.Int2Float64(v.ConsigneeLat) / 1000000) - } - + storeDetail, err := dao.GetStoreDetail(dao.GetDB(), v.JxStoreID, 0, "") if riderInfo.CourierPhone == "" { - storeDetail, err := dao.GetStoreDetail(dao.GetDB(), v.JxStoreID, 0, "") if err == nil { riderInfo.CourierPhone = storeDetail.Tel1 } riderInfo.CourierName = "老板" } + + if riderInfo.Longitude == "" && riderInfo.LogisticsStatus != 105 { + riderInfo.Longitude = utils.Float64ToStr(utils.Int2Float64(storeDetail.Lng) / 1000000) + riderInfo.Latitude = utils.Float64ToStr(utils.Int2Float64(storeDetail.Lat) / 1000000) + } + if riderInfo.Longitude == "" && riderInfo.LogisticsStatus == 105 { + riderInfo.Longitude = utils.Float64ToStr(utils.Int2Float64(v.ConsigneeLng) / 1000000) + riderInfo.Latitude = utils.Float64ToStr(utils.Int2Float64(v.ConsigneeLat) / 1000000) + } + if riderInfo.CourierPhone == "" { riderInfo.CourierName = "石锋" riderInfo.CourierPhone = "18048531223" @@ -186,6 +194,7 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { if riderInfo.ThirdCarrierOrderId == "" { riderInfo.ThirdCarrierOrderId = riderInfo.OrderId + "_fake" } + // 目前只推送美团骑手信息 switch v.VendorID { case model.VendorIDMTWM: // 美团订单 @@ -212,6 +221,20 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { continue case model.VendorIDJX: // 京西平台 continue + case model.VendorIDTaoVegetable: // 淘鲜达 + // 定时任务刷新骑手坐标 + if orderId == "" { + if handler := partner.GetPurchaseOrderHandlerFromVendorID(v.VendorID); handler != nil { + if err := handler.GetOrderRider(v.VendorOrgCode, v.VendorStoreID, utils.Struct2Map(riderInfo, "", true)); err != nil { + globals.SugarLogger.Errorf("Error pushing meituan rider information :%s--%s--%v", v.VendorOrderID, utils.Format4Output(riderInfo, false), err) + } + } + } else { // 订单状态改变 [配送中/用户签收/用户拒收] + param := utilsTao.OrderStatusChangeDelivery(&v.GoodsOrder, taoDeliveryStatus) + if err := api.TaoVegetableApi.DeliveryFinish(param); err != nil { + globals.SugarLogger.Debugf("淘先达运单状态推送错误运单状态[%s],错误:%s", taoDeliveryStatus, err.Error()) + } + } default: globals.SugarLogger.Errorf("Order source error, non system order: %s", v.VendorOrderID) continue diff --git a/business/partner/delivery/sfps/waybill.go b/business/partner/delivery/sfps/waybill.go index cd97e8d4d..edb017a8f 100644 --- a/business/partner/delivery/sfps/waybill.go +++ b/business/partner/delivery/sfps/waybill.go @@ -382,54 +382,58 @@ func OnWaybillMsg(urlIndex string, msg interface{}) (resp *sfps2.CallbackRespons globals.SugarLogger.Warnf("onWaybillMsg unknown msg:%v", msg) } - globals.SugarLogger.Debugf("SFPS OnWaybillMsg order=%s", utils.Format4Output(order, false)) if err := partner.CurOrderManager.OnWaybillStatusChanged(order); err != nil { return sfps2.Err2CallbackResponse(err) } - if order.OrderVendorID == model.VendorIDDD { - result := &mtpsapi.RiderInfo{ - OrderId: order.VendorOrderID, - ThirdCarrierOrderId: order.VendorOrderID, - CourierName: order.CourierName, - CourierPhone: order.CourierMobile, - LogisticsProviderCode: "10002", - LogisticsStatus: order.Status, - OpCode: "", - } - switch orderStatus { - case sfps2.OrderStatusNewOrder: - result.LogisticsStatus = model.WaybillStatusNew - result.LogisticsContext = model.RiderWaitRider - case sfps2.OrderStatusTakeOrder: - result.LogisticsStatus = model.WaybillStatusCourierAssigned // 分配骑手 - result.LogisticsContext = model.RiderWaitGetGoods - case sfps2.OrderStatusRiderArriving: - result.LogisticsStatus = model.WaybillStatusDelivering - result.LogisticsContext = model.RiderGetOrderDelivering - case sfps2.OrderStatusFinished: - result.LogisticsStatus = model.WaybillStatusDelivered - result.LogisticsContext = model.RiderGetOrderDelivered - case sfps2.OrderStatusOrderCancel, sfps2.OrderStatusRiderCancel: - result.LogisticsStatus = model.WaybillStatusCanceled - result.LogisticsContext = model.RiderGetOrderCanceled - case sfps2.OrderStatusError: - result.LogisticsStatus = model.WaybillStatusDeliverFailed - result.LogisticsContext = model.RiderGetOrderDeliverFailed - case sfps2.OrderStatusArrivedStore: - result.LogisticsStatus = model.WaybillStatusCourierArrived - result.LogisticsContext = model.RiderToStore - default: - result.LogisticsStatus = 0 - result.LogisticsContext = model.RiderGetOrderDeliverOther - } - delivery.PullTiktokRiderInfo(result) + switch order.OrderVendorID { + case model.VendorIDDD: + tiktokStatusPush(order, orderStatus) + case model.VendorIDTaoVegetable, model.VendorIDMTWM: + delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 } - - defer delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 return sfps2.Err2CallbackResponse(nil) } +func tiktokStatusPush(order *model.Waybill, orderStatus int64) { + result := &mtpsapi.RiderInfo{ + OrderId: order.VendorOrderID, + ThirdCarrierOrderId: order.VendorOrderID, + CourierName: order.CourierName, + CourierPhone: order.CourierMobile, + LogisticsProviderCode: "10002", + LogisticsStatus: order.Status, + OpCode: "", + } + switch orderStatus { + case sfps2.OrderStatusNewOrder: + result.LogisticsStatus = model.WaybillStatusNew + result.LogisticsContext = model.RiderWaitRider + case sfps2.OrderStatusTakeOrder: + result.LogisticsStatus = model.WaybillStatusCourierAssigned // 分配骑手 + result.LogisticsContext = model.RiderWaitGetGoods + case sfps2.OrderStatusRiderArriving: + result.LogisticsStatus = model.WaybillStatusDelivering + result.LogisticsContext = model.RiderGetOrderDelivering + case sfps2.OrderStatusFinished: + result.LogisticsStatus = model.WaybillStatusDelivered + result.LogisticsContext = model.RiderGetOrderDelivered + case sfps2.OrderStatusOrderCancel, sfps2.OrderStatusRiderCancel: + result.LogisticsStatus = model.WaybillStatusCanceled + result.LogisticsContext = model.RiderGetOrderCanceled + case sfps2.OrderStatusError: + result.LogisticsStatus = model.WaybillStatusDeliverFailed + result.LogisticsContext = model.RiderGetOrderDeliverFailed + case sfps2.OrderStatusArrivedStore: + result.LogisticsStatus = model.WaybillStatusCourierArrived + result.LogisticsContext = model.RiderToStore + default: + result.LogisticsStatus = 0 + result.LogisticsContext = model.RiderGetOrderDeliverOther + } + delivery.PullTiktokRiderInfo(result) +} + // OnWaybillExceptSF 异常报备 func OnWaybillExceptSF(msg *sfps2.RiderException) (retVal *sfps2.CallbackResponse) { jxutils.CallMsgHandler(func() { diff --git a/business/partner/delivery/uupt/waybill.go b/business/partner/delivery/uupt/waybill.go index ab8604855..bd8e25156 100644 --- a/business/partner/delivery/uupt/waybill.go +++ b/business/partner/delivery/uupt/waybill.go @@ -381,48 +381,54 @@ func OnWaybillMsg(req *uuptapi.WaybillCallbackParam) (resp *uuptapi.CallbackResp return uuptapi.Err2CallbackResponse(err) } //推送抖音 - if param.OrderVendorID == model.VendorIDDD { - result := &mtpsapi.RiderInfo{ - OrderId: param.VendorOrderID, - ThirdCarrierOrderId: param.VendorOrderID, - CourierName: param.CourierName, - CourierPhone: param.CourierMobile, - LogisticsProviderCode: "10002", - LogisticsStatus: param.Status, - OpCode: "", - } - switch req.State { - case uuptapi.StateConfirmSuccess: //下单成功 - result.LogisticsStatus = model.WaybillStatusNew - result.LogisticsContext = model.RiderWaitRider - case uuptapi.StateRMGrabsOrder: //骑手已接单 - result.LogisticsStatus = model.WaybillStatusCourierAssigned // 分配骑手 - result.LogisticsContext = model.RiderWaitGetGoods - case uuptapi.StateArrivedStore: //骑手到店 - result.LogisticsStatus = model.WaybillStatusCourierArrived - result.LogisticsContext = model.RiderToStore - case uuptapi.StatePickUp: //已取件 - result.LogisticsStatus = model.WaybillStatusUuPickUp - result.LogisticsContext = model.RiderPickUp - case uuptapi.StateArrivedDestination: //到达取件人地址处 - result.LogisticsStatus = model.WaybillStatusUuArrivedDestination - result.LogisticsContext = model.RiderArrivedDestination - case uuptapi.StateReceiverGetGoods: //取件人收货 - result.LogisticsStatus = model.WaybillStatusDelivered - result.LogisticsContext = model.RiderGetOrderDelivered - case uuptapi.StateOrderCancel: //运单取消 - result.LogisticsStatus = model.WaybillStatusCanceled - result.LogisticsContext = model.RiderGetOrderCanceled - default: - result.LogisticsStatus = 0 - result.LogisticsContext = model.RiderGetOrderDeliverOther - } - delivery.PullTiktokRiderInfo(result) + switch param.OrderVendorID { + case model.VendorIDDD: + tiktokStatusPush(param, req.State) + case model.VendorIDMTWM, model.VendorIDTaoVegetable: + delivery.GetOrderRiderInfoToPlatform(param.VendorOrderID, param.Status) // 骑手位置更新 } - defer delivery.GetOrderRiderInfoToPlatform(param.VendorOrderID, param.Status) // 骑手位置更新 return uuptapi.Err2CallbackResponse(nil) } +func tiktokStatusPush(param *model.Waybill, orderStatus string) { + result := &mtpsapi.RiderInfo{ + OrderId: param.VendorOrderID, + ThirdCarrierOrderId: param.VendorOrderID, + CourierName: param.CourierName, + CourierPhone: param.CourierMobile, + LogisticsProviderCode: "10002", + LogisticsStatus: param.Status, + OpCode: "", + } + switch orderStatus { + case uuptapi.StateConfirmSuccess: //下单成功 + result.LogisticsStatus = model.WaybillStatusNew + result.LogisticsContext = model.RiderWaitRider + case uuptapi.StateRMGrabsOrder: //骑手已接单 + result.LogisticsStatus = model.WaybillStatusCourierAssigned // 分配骑手 + result.LogisticsContext = model.RiderWaitGetGoods + case uuptapi.StateArrivedStore: //骑手到店 + result.LogisticsStatus = model.WaybillStatusCourierArrived + result.LogisticsContext = model.RiderToStore + case uuptapi.StatePickUp: //已取件 + result.LogisticsStatus = model.WaybillStatusUuPickUp + result.LogisticsContext = model.RiderPickUp + case uuptapi.StateArrivedDestination: //到达取件人地址处 + result.LogisticsStatus = model.WaybillStatusUuArrivedDestination + result.LogisticsContext = model.RiderArrivedDestination + case uuptapi.StateReceiverGetGoods: //取件人收货 + result.LogisticsStatus = model.WaybillStatusDelivered + result.LogisticsContext = model.RiderGetOrderDelivered + case uuptapi.StateOrderCancel: //运单取消 + result.LogisticsStatus = model.WaybillStatusCanceled + result.LogisticsContext = model.RiderGetOrderCanceled + default: + result.LogisticsStatus = 0 + result.LogisticsContext = model.RiderGetOrderDeliverOther + } + delivery.PullTiktokRiderInfo(result) +} + //辅助函数 func getReallyStoreID(storeID, jxStoreID int) int { if storeID == 0 && jxStoreID == 0 { diff --git a/business/partner/purchase/ebai/callback.go b/business/partner/purchase/ebai/callback.go index f846a9471..e3840a276 100644 --- a/business/partner/purchase/ebai/callback.go +++ b/business/partner/purchase/ebai/callback.go @@ -53,3 +53,13 @@ func GetOrderIDFromMap(orderMap map[string]interface{}) string { } return "" } + +func GetAfsIDFromMap(orderMap map[string]interface{}) string { + if orderID := orderMap["refund_order_id"]; orderID != nil { + if tryOrderID, ok := orderID.(string); ok { + return tryOrderID + } + return utils.Int64ToStr(utils.MustInterface2Int64(orderID)) + } + return "" +} diff --git a/business/partner/purchase/ebai/financial.go b/business/partner/purchase/ebai/financial.go index 3058f8f44..40cfe6773 100644 --- a/business/partner/purchase/ebai/financial.go +++ b/business/partner/purchase/ebai/financial.go @@ -115,7 +115,7 @@ func (p *PurchaseHandler) OrderFinancialDetail2Refund(orderFinancial *model.Orde func (p *PurchaseHandler) AfsOrderDetail2Financial(orderData map[string]interface{}) (afsOrder *model.AfsOrder) { afsOrder = &model.AfsOrder{ VendorID: model.VendorIDEBAI, - AfsOrderID: GetOrderIDFromMap(orderData), + AfsOrderID: GetAfsIDFromMap(orderData), VendorOrderID: GetOrderIDFromMap(orderData), } order, err := partner.CurOrderManager.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID) diff --git a/business/partner/purchase/jx/localjx/tonglianpay.go b/business/partner/purchase/jx/localjx/tonglianpay.go index ba1896650..4a200f759 100644 --- a/business/partner/purchase/jx/localjx/tonglianpay.go +++ b/business/partner/purchase/jx/localjx/tonglianpay.go @@ -72,8 +72,6 @@ func pay4OrderByTL(ctx *jxcontext.Context, order *model.GoodsOrder, payType int, err = api.TLpayAPI.CreateH5UnitorderOrder(param2) } else { result, err := api.TLpayAPI.CreateUnitorderOrder(param) - globals.SugarLogger.Debugf("===============result: %s", utils.Format4Output(result, false)) - globals.SugarLogger.Debugf("===============result: %s", utils.Format4Output(err, false)) if err == nil { var result2 tonglianpayapi.PayInfo json.Unmarshal([]byte(result.PayInfo), &result2) diff --git a/business/partner/purchase/mtwm/order.go b/business/partner/purchase/mtwm/order.go index 1843fdae7..860fc48cb 100644 --- a/business/partner/purchase/mtwm/order.go +++ b/business/partner/purchase/mtwm/order.go @@ -93,12 +93,8 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s return order, result, err } -func (p *PurchaseHandler) getOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { - return getAPI(vendorOrgCode, 0, vendorStoreID).OrderStatusAndPsInfo(param) -} - func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { - return p.getOrderRider(vendorOrgCode, vendorStoreID, param) + return getAPI(vendorOrgCode, 0, vendorStoreID).OrderStatusAndPsInfo(param) } func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID, vendorStoreID string) (order *model.GoodsOrder, err error) { @@ -570,6 +566,7 @@ func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userNam return err } +// SelfDeliverDelivered 自配送订单送达 func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) { if globals.EnableMtwmStoreWrite { err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderArrived(utils.Str2Int64(order.VendorOrderID)) diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index b2ea34890..d61cc1c01 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -744,6 +744,7 @@ func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode strin return cancelOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(model.SyncFlagDeletedMask, vendorStoreID, storeSkuList)) } +// UpdateStoreSkusSpecTag 更新限购 func (p *PurchaseHandler) UpdateStoreSkusSpecTag(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) { var foodDataList = []map[string]interface{}{} for _, v := range storeSkuList { diff --git a/business/partner/purchase/tao_vegetable/act.go b/business/partner/purchase/tao_vegetable/act.go index 1db6de94c..db7b0a74d 100644 --- a/business/partner/purchase/tao_vegetable/act.go +++ b/business/partner/purchase/tao_vegetable/act.go @@ -1,4 +1,4 @@ -package mtwm +package tao_vegetable import ( "git.rosy.net.cn/baseapi/platformapi/mtwmapi" diff --git a/business/partner/purchase/tao_vegetable/callback.go b/business/partner/purchase/tao_vegetable/callback.go index ff1c42e4b..9d8c09894 100644 --- a/business/partner/purchase/tao_vegetable/callback.go +++ b/business/partner/purchase/tao_vegetable/callback.go @@ -1,73 +1,29 @@ -package mtwm +package tao_vegetable import ( "git.rosy.net.cn/baseapi/platformapi/mtwmapi" + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable" "git.rosy.net.cn/jx-callback/business/jxutils" - "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" - "git.rosy.net.cn/jx-callback/business/jxutils/netprinter" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "net/http" "strings" ) -// 美团回调接口 -func OnCallbackMsg(msg *mtwmapi.CallbackMsg, msgType string) (response *mtwmapi.CallbackResponse) { - // 获取平台门店id - //_, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), GetVendorStoreIDFromMsg(msg), model.VendorIDMTWM, GetVendorAppIdFromMsg(msg)) - //if err != nil && strings.Contains(err.Error(), "no row found") { - // forwardOrderToGy(msg, msgType) - // return mtwmapi.SuccessResponse - //} +// OnCallbackMsg 淘宝回调接口 +func OnCallbackMsg(orderStatus, orderId string, msg interface{}) (response *tao_vegetable.CallBackResult) { if CurPurchaseHandler != nil { - if msg.Cmd == mtwmapi.MsgTypeStoreStatusChanged || msg.Cmd == mtwmapi.MsgTypeStoreAuditStatusChanged { - response = CurPurchaseHandler.onStoreStatusChanged(msg) - } else if msg.Cmd == mtwmapi.MsgTypePrivateNumberDowngrade { - response = CurPurchaseHandler.onNumberDowngrade(msg) - } else if msg.Cmd == mtwmapi.MsgTypeStoreBind { - // 门店授权发生变化 17,失去授权 - vendorStoreID := msg.FormData.Get("app_poi_code") - storeDetail, _ := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, model.VendorIDMTWM, "") - _, err := netprinter.PrintStoreStatus(jxcontext.AdminCtx, storeDetail, model.VendorIDMTWM, -9) - response = mtwmapi.Err2CallbackResponse(err, "") - } else { - if orderID := GetOrderIDFromMsg(msg); orderID != "" { - jxutils.CallMsgHandler(func() { - switch msg.Cmd { - case mtwmapi.MsgTypeWaybillStatus: - response = CurPurchaseHandler.onWaybillMsg(msg) - default: - response = CurPurchaseHandler.onOrderMsg(msg) - } - }, jxutils.ComposeUniversalOrderID(orderID, model.VendorIDMTWM)) - } - /*if msg.Cmd == mtwmapi.MsgTypeOrderRefund || msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { - utils.CallFuncAsync(func() { - OnFinancialMsg(msg) - }) - } */ - } + jxutils.CallMsgHandler(func() { + response = CurPurchaseHandler.onOrderMsg(orderStatus, orderId, msg) + }, jxutils.ComposeUniversalOrderID(orderId, model.VendorIDTaoVegetable)) } return response } -func GetOrderIDFromMsg(msg *mtwmapi.CallbackMsg) string { - return msg.FormData.Get(mtwmapi.KeyOrderID) -} - -func GetVendorStoreIDFromMsg(msg *mtwmapi.CallbackMsg) string { - return msg.FormData.Get(mtwmapi.KeyAppPoiCode) -} - -func GetVendorAppIdFromMsg(msg *mtwmapi.CallbackMsg) string { - return msg.FormData.Get(mtwmapi.KeyAppID) -} - -func forwardOrderToGy(msg *mtwmapi.CallbackMsg, msgType string) { +func forwardOrderToGy(msg *mtwmapi.CallbackMsg, orderStatus string) { cl := http.Client{} - callbackUrl := GetMsgCallBackUrl(msgType, msg.AppID) - request, err := http.NewRequest(http.MethodPost, "http://callback-jxgy.jxc4.com/mtwm/"+callbackUrl, strings.NewReader(msg.FormData.Encode())) + callbackUrl := GetMsgCallBackUrl(orderStatus, msg.AppID) + request, err := http.NewRequest(http.MethodPost, "http://callback-jxgy.jxc4.com/taoBaoVegetable/"+callbackUrl, strings.NewReader(msg.FormData.Encode())) if err != nil { return } @@ -78,40 +34,14 @@ func forwardOrderToGy(msg *mtwmapi.CallbackMsg, msgType string) { func GetMsgCallBackUrl(msgType, appId string) string { interfaceUrl := "" switch msgType { - case mtwmapi.MsgTypeWaybillStatus: - interfaceUrl = "/waybillStatus" - case mtwmapi.MsgTypeNewOrder: - interfaceUrl = "/newOrder" - case mtwmapi.MsgTypeOrderAccepted: - interfaceUrl = "/orderAccepted" - case mtwmapi.MsgTypeOrderFinished: - interfaceUrl = "/orderFinished" - case mtwmapi.MsgTypeOrderFinancial: - interfaceUrl = "/orderFinancial" - case mtwmapi.MsgTypeOrderCanceled: - interfaceUrl = "/orderCanceled" - case mtwmapi.MsgTypeUserUrgeOrder: - interfaceUrl = "/userUrgeOrder" - case mtwmapi.MsgTypePrivateNumberDowngrade: - interfaceUrl = "/numberDowngrade" - case mtwmapi.MsgTypeOrderModified: - interfaceUrl = "/orderModified" - case mtwmapi.MsgTypeOrderRefund: - interfaceUrl = "/orderRefund" - case mtwmapi.MsgTypeOrderPartialRefund: - interfaceUrl = "/orderPartialRefund" - case mtwmapi.MsgTypeOrderFinishedPickup: - interfaceUrl = "/orderFinishedPickup" - case mtwmapi.MsgTypeStoreStatusChanged: - interfaceUrl = "/storeStatusChanged" - case mtwmapi.MsgTypeStoreAuditStatusChanged: - interfaceUrl = "/storeAuditStatusChanged" - case mtwmapi.MsgTypeSkuDelete: - interfaceUrl = "/skuDelete" - case mtwmapi.MsgTypeStoreBind: - interfaceUrl = "/storeBind" + case tao_vegetable.OrderStatusApplyAfs: + interfaceUrl = "/applyCancelOrder " + case tao_vegetable.OrderStatusCancelAfs: + interfaceUrl = "/userCancelRefund" + case tao_vegetable.OrderStatusOnSaleCancel: + interfaceUrl = "/cancelOnSaleRefundOrder" default: - globals.SugarLogger.Errorf("美团超市[app_id :=%s ,callbackUrl := %s ]回调推送到果园错误,回调地址不正确", appId, msgType) + globals.SugarLogger.Errorf("淘宝[app_id :=%s ,callbackUrl := %s ]回调推送到果园错误,回调地址不正确", appId, msgType) } return interfaceUrl } diff --git a/business/partner/purchase/tao_vegetable/financial.go b/business/partner/purchase/tao_vegetable/financial.go index 918911506..54773b8de 100644 --- a/business/partner/purchase/tao_vegetable/financial.go +++ b/business/partner/purchase/tao_vegetable/financial.go @@ -1,9 +1,11 @@ -package mtwm +package tao_vegetable import ( + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable" "net/url" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" + domain591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/domain" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" @@ -131,17 +133,16 @@ func (p *PurchaseHandler) AfsOrderDetail2Financial(orderData url.Values) (afsOrd } // 存储美团正向订单结账信息 -func (p *PurchaseHandler) OnOrderDetail(result map[string]interface{}, operation string) (err error) { +func (p *PurchaseHandler) OnOrderDetail(result *domain591.AlibabaAelophyOrderGetOrderResponse, operation string) (err error) { err = partner.CurOrderManager.SaveOrderFinancialInfo(p.OrderDetail2Financial(result), operation) return err } -func (p *PurchaseHandler) OrderDetail2Financial(result map[string]interface{}) (orderFinancial *model.OrderFinancial) { +func (p *PurchaseHandler) OrderDetail2Financial(result *domain591.AlibabaAelophyOrderGetOrderResponse) (orderFinancial *model.OrderFinancial) { orderFinancial = &model.OrderFinancial{ - VendorID: model.VendorIDMTWM, - VendorOrderID: utils.Int64ToStr(utils.MustInterface2Int64(result["order_id"])), + VendorID: model.VendorIDTaoVegetable, + VendorOrderID: utils.Int64ToStr(*result.BizOrderId), } - // orderFinancial.DeliveryConfirmTime = utils.Str2TimeWithDefault(utils.Interface2String(result["order_completed_time"]), utils.DefaultTimeValue) order, err := partner.CurOrderManager.LoadOrder(orderFinancial.VendorOrderID, orderFinancial.VendorID) jxStoreID := 0 if err == nil { @@ -154,92 +155,58 @@ func (p *PurchaseHandler) OrderDetail2Financial(result map[string]interface{}) ( } else { err = nil } - if result["package_bag_money"] != nil { - orderFinancial.BoxMoney = utils.MustInterface2Int64(result["package_bag_money"]) - } - detail := result["detail"] - if detail != nil { - var data []map[string]interface{} - utils.UnmarshalUseNumber([]byte(utils.Interface2String(detail)), &data) - for _, x := range data { - orderSkuFinancial := &model.OrderSkuFinancial{ + + // 订单 + for _, x := range *result.SubOrderResponseList { + orderSkuFinancial := &model.OrderSkuFinancial{ + VendorID: orderFinancial.VendorID, + VendorOrderID: orderFinancial.VendorOrderID, + VendorStoreID: *result.StoreId, + StoreID: 0, + JxStoreID: jxStoreID, + VendorSkuID: utils.Int64ToStr(utils.MustInterface2Int64(x.SkuCode)), + SkuID: utils.Str2Int(*x.SkuCode), + Name: utils.Interface2String(x.SkuName), + SalePrice: *x.Price, + Count: utils.Str2Int(*x.BuySaleQuantity), + SkuBoxMoney: 0, + IsAfsOrder: 0, + } + orderFinancial.Skus = append(orderFinancial.Skus, orderSkuFinancial) + orderFinancial.SalePriceMoney += orderSkuFinancial.SalePrice * int64(orderSkuFinancial.Count) + orderFinancial.SkuBoxMoney += orderSkuFinancial.SkuBoxMoney + + // 活动 + for _, v := range *x.Activitys { + activity := &model.OrderDiscountFinancial{ VendorID: orderFinancial.VendorID, VendorOrderID: orderFinancial.VendorOrderID, - // OrderFinancialID: orderFinancial.VendorOrderID, - // ConfirmTime: utils.Str2TimeWithDefault(utils.Interface2String(result["ctime"]), utils.DefaultTimeValue), - VendorStoreID: result["app_poi_code"].(string), - StoreID: 0, - JxStoreID: jxStoreID, - VendorSkuID: utils.Interface2String(x["sku_id"]), - SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(x["sku_id"]), 0)), - Name: utils.Interface2String(x["food_name"]), - SalePrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["price"])), - Count: int(utils.MustInterface2Int64(x["quantity"])), - SkuBoxMoney: jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["box_price"])) * jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["box_num"])), - IsAfsOrder: 0, } - orderFinancial.Skus = append(orderFinancial.Skus, orderSkuFinancial) - orderFinancial.SalePriceMoney += orderSkuFinancial.SalePrice * int64(orderSkuFinancial.Count) - orderFinancial.SkuBoxMoney += orderSkuFinancial.SkuBoxMoney - } - } else { - globals.SugarLogger.Warnf("mtwm OrderDetail2Financial, orderID:%s have no detail", orderFinancial.VendorOrderID) - } - extras := result["extras"] - if extras != nil { - var data []map[string]interface{} - utils.UnmarshalUseNumber([]byte(utils.Interface2String(extras)), &data) - for _, x := range data { - if x["rider_fee"] == nil { - activity := &model.OrderDiscountFinancial{ - VendorID: orderFinancial.VendorID, - VendorOrderID: orderFinancial.VendorOrderID, - // ActivityName: utils.Interface2String(x["remark"]), - // ActivityMoney: jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["reduce_fee"])), - // VendorActivityID: utils.Int64ToStr(utils.MustInterface2Int64(x["act_detail_id"])), - } - if x["act_detail_id"] != nil { // 容错处理 - activity.VendorActivityID = utils.Int64ToStr(utils.MustInterface2Int64(x["act_detail_id"])) - orderFinancial.Discounts = append(orderFinancial.Discounts, activity) - } - // 通过活动Id去取,京西活动补贴 - // orderFinancial.JxSubsidyMoney += + if v.ChannelActivityId != nil { + activity.VendorActivityID = *v.ChannelActivityId + activity.Type = tao_vegetable.ActivityTypeChannel } + if v.BizActivityId != nil { + activity.VendorActivityID = *v.BizActivityId + activity.Type = tao_vegetable.ActivityTypeBiz + } + if v.MerchantActivityId != nil { + activity.VendorActivityID = *v.MerchantActivityId + activity.Type = tao_vegetable.ActivityTypeMerchant + } + orderFinancial.Discounts = append(orderFinancial.Discounts, activity) } } - poiReceiveDetail := result["poi_receive_detail"] - if poiReceiveDetail != nil { - var data map[string]interface{} - utils.UnmarshalUseNumber([]byte(utils.Interface2String(poiReceiveDetail)), &data) - orderFinancial.ReceivableFreight = utils.MustInterface2Int64(data["logisticsFee"]) - orderFinancial.FreightMoney = utils.MustInterface2Int64(data["logisticsFee"]) - orderFinancial.ActualPayMoney = utils.MustInterface2Int64(data["onlinePayment"]) - orderFinancial.PmMoney = utils.MustInterface2Int64(data["foodShareFeeChargeByPoi"]) - orderFinancial.ShopMoney = utils.MustInterface2Int64(data["wmPoiReceiveCent"]) - for _, x := range data["actOrderChargeByMt"].([]interface{}) { - orderFinancial.TotalDiscountMoney += utils.MustInterface2Int64(x.(map[string]interface{})["moneyCent"]) - orderFinancial.PmSubsidyMoney += utils.MustInterface2Int64(x.(map[string]interface{})["moneyCent"]) - } - for _, x := range data["actOrderChargeByPoi"].([]interface{}) { - orderFinancial.TotalDiscountMoney += utils.MustInterface2Int64(x.(map[string]interface{})["moneyCent"]) - } - } else { - globals.SugarLogger.Warnf("mtwm OrderDetail2Financial, orderID:%s have no poi_receive_detail", orderFinancial.VendorOrderID) - } - if utils.MustInterface2Int64(result["is_third_shipping"]) == SelfDeliveryCarrierNo { // is_third_shipping int 是否是第三方配送平台配送,0表否,1表是) - orderFinancial.SelfDeliveryDiscountMoney = orderFinancial.ReceivableFreight - orderFinancial.DistanceFreightMoney = 0 - // 通过本地数据库去取是否转美团/达达,并计算运费 - // wayBill, err := partner.CurOrderManager.LoadWaybill(orderFinancial.VendorOrderID, orderFinancial.VendorID) - // if err == nil { - // orderFinancial.JxFreightMoney = wayBill.DesiredFee - // } - } - // // 美团订单单独处理部分,美团正向订单接口推送时总结算金额没有计算公益捐款一分钱,是否在这里直接提前扣除? - // // 3/18之后的订单一直都不显示公益捐款金额,而且结算现在结算到了3/18之后的订单,没有的已经不计算了,先注释 - // // 2019-04-03 10.52 询问赵mf, 此计划是必须参加的,而且是长期的,每单固定扣除一分钱 - orderFinancial.DonationMoney = PublicWelfareDonation - // 不应该对第三方结账金额做更改,就算有异常,也要保留异常,知道问题出在哪里 - // orderFinancial.ShopMoney -= PublicWelfareDonation + + orderFinancial.ReceivableFreight = *result.PostFee + orderFinancial.FreightMoney = 0 + orderFinancial.ActualPayMoney = *result.PayFee + orderFinancial.PmMoney = 0 // 平台费 + orderFinancial.ShopMoney = 0 // 应结金额 + orderFinancial.TotalDiscountMoney = *result.DiscountFee // 订单优惠总金额 + orderFinancial.PmSubsidyMoney = *result.PostDiscountPlatformFee // 平台活动补贴(订单主体活动补贴+订单单条sku补贴)1+ + orderFinancial.SelfDeliveryDiscountMoney = *result.SkuDiscountPlatformFee // 平台承担运费补贴(商家自送)+ + orderFinancial.DistanceFreightMoney = 0 + return orderFinancial } diff --git a/business/partner/purchase/tao_vegetable/order.go b/business/partner/purchase/tao_vegetable/order.go index 1843fdae7..466f4e6fb 100644 --- a/business/partner/purchase/tao_vegetable/order.go +++ b/business/partner/purchase/tao_vegetable/order.go @@ -1,15 +1,16 @@ -package mtwm +package tao_vegetable import ( "errors" "fmt" - "math" - "net/url" - "regexp" - "strings" - "time" - "git.rosy.net.cn/baseapi/platformapi/mtwmapi" + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable" + domain3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/domain" + request3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/request" + domain591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/domain" + request591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/request" + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/util" + "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/ascription_place" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" @@ -18,31 +19,9 @@ import ( "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" -) - -const ( - FakeMsgType = "fakeMsgType" - - fakeFinishedPickup = "fake_finished_pickup" - fakeUserApplyCancel = "fake_user_apply_cancel" - fakeMerchantAgreeApplyCancel = "fake_merchant_agree_apply_cancel" - fakeRefuseUserApplyCancel = "fake_refuse_user_apply_cancel" - fakeUserUndoApplyCancel = "fake_user_undo_apply_cancel" - fakeOrderAdjustFinished = "fake_order_adjust_finished" - - keyVendorOrgCode = "vendorOrgCode" -) - -const ( - SelfDeliveryCarrierNo = 1 // 美团配送方式:0-美团专送,1-商家自送 -) - -const ( -// pickupOrderDelay = 260 * time.Second -// pickupOrderDelay = 1 * time.Second - -// callDeliveryDelay = 10 * time.Minute -// callDeliveryDelayGap = 30 + "regexp" + "strings" + "time" ) var ( @@ -51,29 +30,14 @@ var ( var ( VendorStatus2StatusMap = map[string]int{ - mtwmapi.OrderStatusUserCommitted: model.OrderStatusUnknown, - mtwmapi.OrderStatusNew: model.OrderStatusNew, - // mtwmapi.OrderStatusReceived: model.OrderStatusAccepted, - // mtwmapi.OrderStatusAccepted: model.OrderStatusFinishedPickup, - mtwmapi.OrderStatusAccepted: model.OrderStatusAccepted, - - mtwmapi.OrderStatusDelivering: model.OrderStatusDelivering, - mtwmapi.OrderStatusDelivered: model.OrderStatusUnknown, // 以mtwmapi.OrderStatusFinished为结束状态,这个当成一个中间状态(且很少看到这个状态) - mtwmapi.OrderStatusFinished: model.OrderStatusFinished, - mtwmapi.OrderStatusCanceled: model.OrderStatusCanceled, - - fakeFinishedPickup: model.OrderStatusFinishedPickup, - fakeOrderAdjustFinished: model.OrderStatusAdjust, - fakeRefuseUserApplyCancel: model.OrderStatusVendorRejectCancel, - fakeUserApplyCancel: model.OrderStatusApplyCancel, - fakeUserUndoApplyCancel: model.OrderStatusUndoApplyCancel, - fakeMerchantAgreeApplyCancel: model.OrderStatusCanceled, - } - - skuActTypeMap = map[int]int{ - mtwmapi.ExtrasPromotionTypeTeJiaCai: 1, - mtwmapi.ExtrasPromotionTypeZheKouCai: 1, - mtwmapi.ExtrasPromotionTypeSecondHalfPrice: 1, + tao_vegetable.OrderStatusNew: model.OrderStatusNew, // 商户接单 + tao_vegetable.OrderStatusPickedUp: model.OrderStatusFinishedPickup, // 拣货完成 + tao_vegetable.OrderStatusCallRider: model.OrderStatusFinishedPickup, // 打包出库(呼叫骑手,骑手到店,骑手取货) + tao_vegetable.OrderStatusDelivery: model.OrderStatusDelivering, // 配送中 + tao_vegetable.OrderStatusDeliveryOver: model.OrderStatusFinished, // 配送结束 + tao_vegetable.OrderStatusUserRejection: model.OrderStatusDeliverFailed, // 用户拒收 + tao_vegetable.OrderStatusMerchantCancel: model.OrderStatusCanceled, // 商户取消订单 + tao_vegetable.OrderStatusSuccess: model.OrderStatusFinished, // 订单完成 } ) @@ -84,241 +48,231 @@ func (p *PurchaseHandler) getStatusFromVendorStatus(vendorStatus string) int { return model.OrderStatusUnknown } -func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID string) (order *model.GoodsOrder, orderMap map[string]interface{}, err error) { - result, err := getAPI(vendorOrgCode, 0, vendorStoreID).OrderGetOrderDetail(utils.Str2Int64(vendorOrderID), true) - if err == nil { - result[keyVendorOrgCode] = vendorOrgCode - order = p.Map2Order(result) +// getOrder 获取订单详情 +func (p *PurchaseHandler) getOrder(vendorOrgCode string, vendorOrderID int64, vendorStoreID string) (order *model.GoodsOrder, orderMap *domain591.AlibabaAelophyOrderGetOrderResponse, err error) { + requestParam := &request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{ + StoreId: utils.String2Pointer(vendorStoreID), + BizOrderId: utils.Int64ToPointer(vendorOrderID), + }} + orderDetail, err := getAPI(vendorOrgCode, 0, vendorStoreID).QueryOrderDetail(requestParam) + if err != nil { + return nil, nil, err } - return order, result, err -} - -func (p *PurchaseHandler) getOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { - return getAPI(vendorOrgCode, 0, vendorStoreID).OrderStatusAndPsInfo(param) -} - -func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { - return p.getOrderRider(vendorOrgCode, vendorStoreID, param) -} - -func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID, vendorStoreID string) (order *model.GoodsOrder, err error) { - order, _, err = p.getOrder(vendorOrgCode, vendorOrderID, vendorStoreID) - return order, err -} - -func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) { - if order, _ := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDMTWM); order != nil { - status, err = getAPI(vendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderViewStatus(utils.Str2Int64(vendorOrderID)) - } - if err == nil { - status = p.getStatusFromVendorStatus(utils.Int2Str(status)) - } - return status, err -} - -func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) { - result := orderData - vendorOrderID := utils.Int64ToStr(utils.MustInterface2Int64(result["order_id"])) - // 因为美团外卖不能自动设置商家门店号,且只能通过商家门店号来访问门店, - // 为了在后台设置简单一致,把app_poi_code直接当成平台门店号使用(即在后台设置时,平台门店号与商家门店号一样) - // 订单中wm_poi_id实际来平台门店号,app_poi_code为商家门店号,这样一来,这两个就相同了 - - //_修改为, - caution := strings.ReplaceAll(utils.Interface2String(result["caution"]), "_", ",") - + orderMap = orderDetail order = &model.GoodsOrder{ - VendorOrderID: vendorOrderID, - // VendorOrderID2: utils.Int64ToStr(utils.MustInterface2Int64(result["wm_order_id_view"])), - VendorID: model.VendorIDMTWM, - VendorStoreID: result["app_poi_code"].(string), - StoreID: 0, - // VendorStoreID: utils.Int64ToStr(utils.MustInterface2Int64(result["wm_poi_id"])), - // StoreID: int(utils.Str2Int64WithDefault(utils.Interface2String(result["app_poi_code"]), 0)), - StoreName: result["wm_poi_name"].(string), - ConsigneeName: result["recipient_name"].(string), - ConsigneeMobile: jxutils.FormalizeMobile(result["recipient_phone"].(string)), - ConsigneeAddress: result["recipient_address"].(string), + VendorOrderID: utils.Int64ToStr(vendorOrderID), + VendorID: model.VendorIDTaoVegetable, + VendorStoreID: vendorStoreID, + StoreID: utils.Str2Int(*orderDetail.StoreId), + JxStoreID: utils.Str2Int(*orderDetail.StoreId), CoordinateType: model.CoordinateTypeMars, - //BuyerComment: utils.TrimBlankChar(utils.Interface2String(result["caution"])), - BuyerComment: utils.TrimBlankChar(caution), - ExpectedDeliveredTime: getTimeFromTimestamp(utils.Interface2Int64WithDefault(result["delivery_time"], 0)), - PickDeadline: utils.DefaultTimeValue, - VendorStatus: utils.Int64ToStr(utils.MustInterface2Int64(result["status"])), - OrderSeq: int(utils.MustInterface2Int64(result["day_seq"])), - StatusTime: getTimeFromTimestamp(utils.MustInterface2Int64(result["ctime"])), - OrderCreatedAt: getTimeFromTimestamp(utils.MustInterface2Int64(result["ctime"])), - // OrderFinishedAt: getTimeFromTimestamp(utils.MustInterface2Int64(result["order_completed_time"])), - OriginalData: string(utils.MustMarshal(result)), - ActualPayPrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(result["total"])), - BaseFreightMoney: jxutils.StandardPrice2Int(utils.Interface2Float64WithDefault(result["shipping_fee"], 0)), - - InvoiceTitle: utils.Interface2String(result["invoice_title"]), - InvoiceTaxerID: utils.Interface2String(result["taxpayer_id"]), - InvoiceEmail: jxutils.GetOneEmailFromStr(utils.Interface2String(result["caution"])), - - VendorOrgCode: utils.Interface2String(result[keyVendorOrgCode]), + BuyerComment: *orderDetail.ReceiveInfo.ReceiverMemo, + PickDeadline: utils.DefaultTimeValue, + VendorStatus: *orderDetail.OrderStatus, // PAID = 订单支付完成 PACKAGED = 订单打包出库 SHIPPING = 订单配送揽收 SUCCESS = 交易完成 CLOSE = 订单取消 + StatusTime: time.Now(), + OrderCreatedAt: utils.Str2TimeWithDefault(orderDetail.PayTime.String(), time.Now()), + OriginalData: string(utils.MustMarshal(orderDetail)), + ActualPayPrice: *orderDetail.PayFee, + BaseFreightMoney: *orderDetail.PostFee, + InvoiceTitle: "", + InvoiceTaxerID: "", + InvoiceEmail: "", + VendorOrgCode: vendorOrgCode, + UserID: *orderDetail.OpenUid, } - if result["order_completed_time"] != nil { - order.OrderFinishedAt = getTimeFromTimestamp(utils.MustInterface2Int64(result["order_completed_time"])) + + if *orderDetail.OrderStatus == tao_vegetable.OrderStatusDeliveryOver { + order.OrderFinishedAt = time.Now() } else { order.OrderFinishedAt = utils.DefaultTimeValue } - pickType := int(utils.Interface2Int64WithDefault(result["pick_type"], 0)) - if pickType == mtwmapi.OrderPickTypeSelf { - order.DeliveryType = model.OrderDeliveryTypeSelfTake - } else { - logisticsCode := utils.Interface2String(result["logistics_code"]) - if logisticsCode == mtwmapi.PeiSongTypeSelf || logisticsCode == mtwmapi.PeiSongTypeMTZSPT { - order.DeliveryType = model.OrderDeliveryTypeStoreSelf - } else { - order.DeliveryType = model.OrderDeliveryTypePlatform - } - } - openUID := utils.Interface2Int64WithDefault(result["openUid"], 0) - if openUID > 0 { - order.VendorUserID = utils.Int64ToStr(openUID) - } - // 不设置最晚拣货时间,以缺省值为准 - // if utils.IsTimeZero(order.PickDeadline) && !utils.IsTimeZero(order.StatusTime) { - // order.PickDeadline = order.StatusTime.Add(pickupOrderDelay) // 美团外卖要求在5分钟内拣货,不然订单会被取消 - // } - order.Status = p.getStatusFromVendorStatus(order.VendorStatus) - if utils.IsTimeZero(order.ExpectedDeliveredTime) { - order.BusinessType = model.BusinessTypeImmediate - } else { - order.BusinessType = model.BusinessTypeDingshida - } - originalLng := utils.MustInterface2Float64(result["longitude"]) - originalLat := utils.MustInterface2Float64(result["latitude"]) - order.ConsigneeLng = jxutils.StandardCoordinate2Int(originalLng) - order.ConsigneeLat = jxutils.StandardCoordinate2Int(originalLat) + order.Status = p.getStatusFromVendorStatus(*orderDetail.OrderStatus) + originalList := strings.Split(*orderDetail.ReceiveInfo.ReceiverPoi, ",") + order.ConsigneeLng = jxutils.StandardCoordinate2Int(utils.Str2Float64(originalList[0])) + order.ConsigneeLat = jxutils.StandardCoordinate2Int(utils.Str2Float64(originalList[1])) + order.DiscountMoney = *orderDetail.DiscountFee - var detail []map[string]interface{} - if err := utils.UnmarshalUseNumber([]byte(result["detail"].(string)), &detail); err != nil { - panic(fmt.Sprintf("mtwm Map2Order vendorID:%s failed with error:%v", vendorOrderID, err)) - } - - // 添加需要赠送的东西 - if result["extras"] != nil { - var extraList []*mtwmapi.OrderExtraInfo - if err := utils.UnmarshalUseNumber([]byte(result["extras"].(string)), &extraList); err != nil { - panic(fmt.Sprintf("mtwm Map2Order vendorID:%s failed with error:%v", vendorOrderID, err)) - } - for _, extra := range extraList { - order.DiscountMoney += jxutils.StandardPrice2Int(extra.ReduceFee) - if extra.Type == mtwmapi.ExtrasPromotionTypeTaoCanZeng || extra.Type == mtwmapi.ExtrasPromotionTypeManZeng { - sku := &model.OrderSku{ - VendorOrderID: order.VendorOrderID, - VendorID: model.VendorIDMTWM, - Count: 1, - SkuID: 0, - VendorSkuID: "", - SkuName: extra.Remark, - Weight: 0, - SalePrice: 0, - StoreSubName: utils.Int2Str(extra.Type), - } - order.Skus = append(order.Skus, sku) - } - } - } - - if poiReceiveDetailStr := utils.Interface2String(result["poi_receive_detail"]); poiReceiveDetailStr != "" { - var poiReceiveDetail *mtwmapi.PoiReceiveDetailInfo - utils.UnmarshalUseNumber([]byte(poiReceiveDetailStr), &poiReceiveDetail) - if poiReceiveDetail != nil { - order.TotalShopMoney = poiReceiveDetail.WmPoiReceiveCent - for _, v := range poiReceiveDetail.ActOrderChargeByMt { - order.PmSubsidyMoney += v.MoneyCent - } - } - } - - var skuBenefitDetailMap map[string]*mtwmapi.SkuBenefitDetailInfo - if skuBenefitDetai := utils.Interface2String(result["sku_benefit_detail"]); skuBenefitDetai != "" { - skuBenefitDetailMap = make(map[string]*mtwmapi.SkuBenefitDetailInfo) - var skuBenefitDetailList []*mtwmapi.SkuBenefitDetailInfo - utils.UnmarshalUseNumber([]byte(skuBenefitDetai), &skuBenefitDetailList) - for _, v := range skuBenefitDetailList { - skuBenefitDetailMap[v.SkuID] = v - } - } - ignoreSkuMap := make(map[int]int) + var salePrice int64 = 0 + order.PmSubsidyMoney = *orderDetail.SkuDiscountPlatformFee // 平台承担优惠 + // 添加需要赠送的东西(暂时没有赠品套餐直接商品) multiSkuMap := make(map[int]int) - for _, product := range detail { - skuName := product["food_name"].(string) - skuID := utils.Interface2String(product["sku_id"]) - sku := &model.OrderSku{ - VendorOrderID: order.VendorOrderID, - VendorID: model.VendorIDMTWM, - Count: int(utils.MustInterface2Float64(product["quantity"])), - SkuID: int(utils.Str2Int64WithDefault(skuID, 0)), - VendorSkuID: skuID, - SkuName: skuName, - Weight: getSkuWeight(product), - VendorPrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(product["price"])), - SalePrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(product["price"])), - } - if product["upc"] != nil && product["upc"].(string) != "" { - sku.Upc = product["upc"].(string) - } - _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(sku.SkuName) - nameWeight := jxutils.FormatSkuWeight(specQuality, specUnit) - if nameWeight == 0 { - skuName += " " + product["spec"].(string) - } - if sku.VendorSkuID == "" { - if !strings.Contains(product["app_food_code"].(string), "mtcode") { - sku.VendorSkuID = product["app_food_code"].(string) - } else { - sku.VendorSkuID = utils.Int64ToStr(utils.Interface2Int64WithDefault(product["mt_sku_id"], 0)) + if len(*orderDetail.SubOrderResponseList) > 0 { + for _, extra := range *orderDetail.SubOrderResponseList { + sku := &model.OrderSku{ + VendorOrderID: order.VendorOrderID, + VendorID: model.VendorIDTaoVegetable, + StoreSubID: 0, + StoreSubName: "", + Count: utils.Str2Int(*extra.BuySaleQuantity), + VendorSkuID: *extra.SkuCode, + SkuID: utils.Str2Int(*extra.SkuCode), + JxSkuID: utils.Str2Int(*extra.SkuCode), + SkuName: *extra.SkuName, + ShopPrice: *extra.Price, + VendorPrice: *extra.OriginalFee / utils.Str2Int64(*extra.BuySaleQuantity), + SalePrice: *extra.OriginalFee, + EarningPrice: 0, + Weight: int(*extra.Weight), + SkuType: 0, + PromotionType: 0, + OrderCreatedAt: order.OrderCreatedAt, + IsVendorAct: 0, + Upc: *extra.Barcode, } - } - if sku.Weight == 0 { - sku.Weight = 222 // 如果名字里找不到缺省给半斤左右的一个特别值 - } - if skuBenefitDetailMap != nil && skuBenefitDetailMap[sku.VendorSkuID] != nil && ignoreSkuMap[sku.SkuID] == 0 /* && sku.Count == 1 */ { - for _, v := range skuBenefitDetailMap[sku.VendorSkuID].WmAppOrderActDetails { - if /*skuActTypeMap[v.Type] == 1 && */ strings.Index(v.Remark, skuName) >= 0 && sku.Count == v.Count { - if sku.SalePrice-jxutils.StandardPrice2Int(v.MtCharge+v.PoiCharge) < 0 { - continue - } else { - ignoreSkuMap[sku.SkuID] = 1 - sku.SalePrice -= jxutils.StandardPrice2Int(v.MtCharge + v.PoiCharge) - } - sku.StoreSubName = utils.Int2Str(v.Type) + + activityId := make([]int64, 0) + activityName := make([]string, 0) + for _, v := range *extra.Activitys { + // 渠道活动 + if v.ChannelActivityId != nil { + activityId = append(activityId, utils.Str2Int64WithDefault(*v.ChannelActivityId, 999)) + activityName = append(activityName, *v.ChannelActivityId+":"+*v.ActivityName) + } + // 业务活动 + if v.BizActivityId != nil { + activityId = append(activityId, utils.Str2Int64WithDefault(*v.BizActivityId, 999)) + activityName = append(activityName, *v.BizActivityId+":"+*v.ActivityName) + } + // 商家erp活动 + if v.MerchantActivityId != nil { + activityId = append(activityId, utils.Str2Int64WithDefault(*v.MerchantActivityId, 999)) + activityName = append(activityName, *v.MerchantActivityId+":"+*v.ActivityName) } } + if len(activityId) > 0 { + sku.StoreSubID = int(activityId[0]) + sku.StoreSubName = strings.Join(activityName, ",") + } + if sku.Weight == 0 { + sku.Weight = 222 // 如果名字里找不到缺省给半斤左右的一个特别值 + } + multiSkuMap[sku.SkuID]++ + order.Skus = append(order.Skus, sku) + salePrice += sku.SalePrice } - if sku.SalePrice < 0 { - sku.SalePrice = jxutils.StandardPrice2Int(utils.MustInterface2Float64(product["price"])) - } - order.Skus = append(order.Skus, sku) - multiSkuMap[sku.SkuID]++ } + // 淘宝默认自配送 + if *orderDetail.DeliveryType == tao_vegetable.OrderDeliveryTypeTime { + order.DeliveryType = model.OrderDeliveryTypeStoreSelf + } else if *orderDetail.DeliveryType == tao_vegetable.OrderDeliveryTypeSelf { + order.DeliveryType = model.OrderDeliveryTypeSelfTake + } + + // 期望送达时间两小时内为立即达 + earliestTime := utils.Str2Time(strings.Split(*orderDetail.ReceiveInfo.ExpectArriveTime, "~")[0]).Unix() + if earliestTime-time.Now().Unix() > 2*60*60 { + order.BusinessType = model.BusinessTypeImmediate + order.ExpectedDeliveredTime = getTimeFromTimestamp(earliestTime + 30*60) // 预计最晚送达时间 + } else { // 定时达 + order.BusinessType = model.BusinessTypeDingshida + order.ExpectedDeliveredTime = getTimeFromTimestamp(earliestTime + 30*60) // 预计最晚送达时间 + } + + // 用户信息 + order.ConsigneeName = *orderDetail.ReceiveInfo.ReceiverName + order.ConsigneeMobile = *orderDetail.ReceiveInfo.ReceiverPhone + order.ConsigneeAddress = *orderDetail.ReceiveInfo.ReceiverAddress for _, v := range order.Skus { if multiSkuMap[v.SkuID] > 1 && v.SalePrice == v.VendorPrice { v.IsVendorAct = model.YES } } + // 抖音订单手机号和收货地址是否同城 + order.PhoneAscription = "" + ascription, err := ascription_place.Find(order.ConsigneeMobile) + if err != nil { + order.PhoneAscription = model.PhoneAscriptionAddressNo + "-" + err.Error() + } else { + if strings.Contains(order.ConsigneeAddress, ascription.Province) && strings.Contains(order.ConsigneeAddress, ascription.City) { + order.PhoneAscription = model.PhoneAscriptionAddressYes + "-" + ascription.Province + ascription.City + } else { + order.PhoneAscription = model.PhoneAscriptionAddressNo + "-" + "归属信息不匹配:" + ascription.Province + ascription.City + } + } - // 包装袋金额设置 + // 本地获取订单记录 + orderSeq, _ := dao.GetVendorOrderNumber(dao.GetDB(), model.VendorIDTaoVegetable, order.VendorStoreID) + order.OrderSeq = orderSeq + 1 + + // 包装袋金额 store, _ := dao.GetStoreDetail(dao.GetDB(), order.JxStoreID, order.VendorID, order.VendorOrgCode) - order.PackagePrice = store.PackageSetting - jxutils.RefreshOrderSkuRelated(order) + order.PackagePrice = int(*orderDetail.PackageFee) + store.PackageSetting + order.StoreName = store.Name // 真实门店名称 + + return order, orderMap, err +} + +type RiderInfo struct { + OrderId string `json:"order_id"` // 发单平台订单id(美团,京西,京,京东) + ThirdCarrierOrderId string `json:"third_carrier_order_id"` // 京西平台id(运单id) + CourierName string `json:"courier_name"` // 骑手名称 + CourierPhone string `json:"courier_phone"` // 骑手电话 + LogisticsProviderCode string `json:"logistics_provider_code"` // 配送平台code 10001-顺丰, 10002-达达, 10003-闪送, 10004-蜂鸟, 10005 UU跑腿,10006 快跑者, 10007 极客快送,10008-点我达,10009 同达, 10010-生活半径,10011 邻趣,10012 趣送, 10013 快服务 10014 菜鸟新配盟 10015 商家自建配送 10016 风先生,10017-其他,10018-抖音配送(小时达),10032-美团跑腿 + LogisticsStatus int `json:"logistics_status"` // 配送状态(美团用) + LogisticsContext string `json:"logistics_context"` // 配送状态描述 + Latitude string `json:"latitude"` // 骑手当前的纬度,美团使用的是高德坐标系。 + Longitude string `json:"longitude"` // 骑手当前的经度,美团使用的是高德坐标系。 + OpCode string `json:"opcode"` // 抖音状态(抖音才需要) +} + +// GetOrderRider 自配送商家同步发货状态和配送信息(推荐) +func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { + req := &request591.AlibabaAelophyOrderLogisticsTraceCallbackRequest{ + LogisticsTraceCallbackRequest: &domain591.AlibabaAelophyOrderLogisticsTraceCallbackLogisticsTraceCallbackRequest{ + StoreId: utils.String2Pointer(vendorStoreID), + BizOrderId: utils.Int64ToPointer(utils.Str2Int64(param["order_id"].(string))), + Longitude: utils.String2Pointer(param["longitude"].(string)), + Latitude: utils.String2Pointer(param["latitude"].(string)), + UpdateTime: (*util.LocalTime)(utils.Time2Pointer(time.Now())), + }, + } + return getAPI(vendorOrgCode, 0, vendorStoreID).DeliveryTrajectory(req) +} + +func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID, vendorStoreID string) (order *model.GoodsOrder, err error) { + order, _, err = p.getOrder(vendorOrgCode, utils.Str2Int64(vendorOrderID), vendorStoreID) + return order, err +} + +func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) { + order, _ := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDTaoVegetable) + if order == nil { + return 0, err + } + + requestParam := &request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{ + StoreId: utils.String2Pointer(order.VendorStoreID), + BizOrderId: utils.Int64ToPointer(utils.Str2Int64(vendorOrderID)), + }} + orderDetail, err := getAPI(vendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").QueryOrderDetail(requestParam) + if err != nil { + return 0, err + } + + status = p.getStatusFromVendorStatus(*orderDetail.OrderStatus) + return status, err +} + +func (c *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) { + order, _, _ = c.getOrder(orderData["VendorOrgCode"].(string), utils.Str2Int64(orderData["vendorOrderID"].(string)), "") return order } -func getRefundSkuDetailList(msg *mtwmapi.CallbackMsg, order *model.GoodsOrder) (skuList []*mtwmapi.RefundSkuDetail, err error) { - if false { - skuList = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").GetRefundSkuDetailFromMsg(msg) - } else { - refundOrderDetailList, err2 := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").GetOrderRefundDetail(utils.Str2Int64(GetOrderIDFromMsg(msg)), mtwmapi.RefundTypePart) - if err = err2; err == nil { - for _, v := range refundOrderDetailList { - skuList = append(skuList, v.WmAppRetailForOrderPartRefundList...) - } +// getRefundSkuDetailList 获取商家部分退款的订单列表 +func getRefundSkuDetailList(order *model.GoodsOrder) (skuList []*domain591.AlibabaAelophyOrderGetSubOrderResponse, err error) { + requestParam := &request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{ + StoreId: utils.String2Pointer(order.VendorStoreID), + BizOrderId: utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)), + }} + orderDetail, err := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").QueryOrderDetail(requestParam) + if err != nil { + return nil, err + } + + for _, v := range *orderDetail.SubOrderResponseList { + if *v.OrderStatus == tao_vegetable.OrderStatusRefundClose { + skuList = append(skuList, &v) } } return skuList, err @@ -338,195 +292,195 @@ func getSkuWeight(product map[string]interface{}) (weight int) { return weight } -func (c *PurchaseHandler) onOrderMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) { +func (c *PurchaseHandler) onOrderMsg(orderStatus, orderId string, orderCallback interface{}) (response *tao_vegetable.CallBackResult) { var err error - if c.isAfsMsg(msg) { - response = c.OnAfsOrderMsg(msg) - return response - } else { - status := c.callbackMsg2Status(msg) - if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 { - return nil - } - if msg.Cmd == mtwmapi.MsgTypeNewOrder { - order, orderMap, err2 := c.getOrder(msg.AppID, GetOrderIDFromMsg(msg), GetVendorStoreIDFromMsg(msg)) - if err = err2; err == nil { - err = partner.CurOrderManager.OnOrderNew(order, c.callbackMsg2Status(msg)) - if err == nil { - utils.CallFuncAsync(func() { - if msg.Cmd == mtwmapi.MsgTypeNewOrder { - c.OnOrderDetail(orderMap, partner.CreatedPeration) - } else { - c.OnOrderDetail(orderMap, partner.UpdatedPeration) - } - }) - } - } - } else { - if status != nil { - var order *model.GoodsOrder - if order, err = partner.CurOrderManager.LoadOrder(GetOrderIDFromMsg(msg), model.VendorIDMTWM); err == nil { - // if order, err = c.GetOrder(msg.AppID, GetOrderIDFromMsg(msg)); err == nil { - if status.Status == model.OrderStatusAdjust { - skuList, err2 := getRefundSkuDetailList(msg, order) - if err = err2; err == nil { - var removedSkuList []*model.OrderSku - for _, mtwmSku := range skuList { - order.ActualPayPrice -= jxutils.StandardPrice2Int(mtwmSku.RefundPrice) * int64(mtwmSku.Count) - removedSkuList = append(removedSkuList, &model.OrderSku{ - SkuID: int(utils.Str2Int64WithDefault(mtwmSku.SkuID, 0)), - Count: mtwmSku.Count, - }) - } - order = jxutils.RemoveSkuFromOrder(order, removedSkuList) - jxutils.RefreshOrderSkuRelated(order) - err = partner.CurOrderManager.OnOrderAdjust(order, status) - } - } else { - if status.Status == model.OrderStatusDelivering { - // 美团订单即使时在配送状态时,如果之前没有调用过拣货完成,也会对门店指标生成影响,这里强制再调用拣货完成,且忽略错误 - utils.CallFuncAsync(func() { - if globals.EnableMtwmStoreWrite { - err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").PreparationMealComplete(utils.Str2Int64(status.VendorOrderID)) - } - }) - } - err = partner.CurOrderManager.OnOrderStatusChanged(msg.AppID, status) - if err == nil && msg.Cmd == mtwmapi.MsgTypeOrderFinished { - utils.CallFuncAsync(func() { - orderMap, err := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderGetOrderDetail(utils.Str2Int64(GetOrderIDFromMsg(msg)), true) - if err == nil && utils.MustInterface2Int64(orderMap["is_third_shipping"]) == SelfDeliveryCarrierNo { - c.OnOrderDetail(orderMap, partner.UpdatedPeration) - } - }) - } + // 售后单 + if c.isAfsMsg(orderStatus, orderId) { + response = c.OnAfsOrderMsg(orderId, orderStatus, orderCallback) + return response + } + + // 正常订单 + msg := orderCallback.(*tao_vegetable.CallbackOrder) + if orderStatus == tao_vegetable.OrderStatusOnSaleCancel { + onSale := orderCallback.(*tao_vegetable.OnSaleCancel) + msg.PublicModel = onSale.PublicModel + msg.MerchantCode = onSale.MerchantCode + msg.StoreId = onSale.StoreId + msg.BizOrderId = onSale.BizOrderId + msg.OrderStatus = tao_vegetable.OrderStatusOnSaleCancel + } + status := c.callbackOrderMsg2Status(msg) + if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 { + return nil + } + // 校验重复消息 + if partner.CurOrderManager.GetStatusDuplicatedCount(status) > 0 { + return tao_vegetable.CallBackResultInfo(nil) + } + + // 商户接单/支付完成代表新订单 + if msg.OrderStatus == tao_vegetable.OrderStatusNew || msg.OrderStatus == tao_vegetable.OrderStatusPayFinsh { + order, orderMap, err2 := c.getOrder(msg.MerchantCode, msg.BizOrderId, msg.StoreId) + if err = err2; err == nil { + err = partner.CurOrderManager.OnOrderNew(order, status) + if err == nil { + utils.CallFuncAsync(func() { + if msg.OrderStatus == mtwmapi.MsgTypeNewOrder { + c.OnOrderDetail(orderMap, partner.CreatedPeration) + } else { + c.OnOrderDetail(orderMap, partner.UpdatedPeration) } - } + }) } } + } else { + order, err := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(msg.BizOrderId), model.VendorIDTaoVegetable) + if err != nil { + return tao_vegetable.CallBackResultInfo(err) + } + if status.Status == model.OrderStatusAdjust { + //skuList, err2 := getRefundSkuDetailList(msg, order) + //if err = err2; err == nil { + // var removedSkuList []*model.OrderSku + // for _, mtwmSku := range skuList { + // order.ActualPayPrice -= jxutils.StandardPrice2Int(mtwmSku.RefundPrice) * int64(mtwmSku.Count) + // removedSkuList = append(removedSkuList, &model.OrderSku{ + // SkuID: int(utils.Str2Int64WithDefault(mtwmSku.SkuID, 0)), + // Count: mtwmSku.Count, + // }) + // } + // order = jxutils.RemoveSkuFromOrder(order, removedSkuList) + // jxutils.RefreshOrderSkuRelated(order) + // err = partner.CurOrderManager.OnOrderAdjust(order, status) + //} + } else { + // 发货完成 + if msg.OrderStatus == tao_vegetable.OrderStatusCallRider { // || msgId == tiktokShop.CallbackPartGoodsMsgTagId 部分发货 + utils.CallFuncAsync(func() { + orderMap, _ := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").QueryOrderDetail(&request591.AlibabaAelophyOrderGetRequest{ + OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{ + StoreId: utils.String2Pointer(msg.StoreId), + BizOrderId: utils.Int64ToPointer(msg.BizOrderId), + }, + }) + c.OnOrderDetail(orderMap, partner.UpdatedPeration) + }) + } + if err := partner.CurOrderManager.OnOrderStatusChanged(order.VendorOrgCode, status); err != nil { + return tao_vegetable.CallBackResultInfo(err) + } + + } } - return mtwmapi.Err2CallbackResponse(err, "") + return tao_vegetable.CallBackResultInfo(err) } -func (c *PurchaseHandler) callbackMsg2Status(msg *mtwmapi.CallbackMsg) (orderStatus *model.OrderStatus) { - orderID := GetOrderIDFromMsg(msg) - vendorStatus := msg.Cmd - remark := "" - statusTime := utils.Str2Int64(msg.FormData.Get("timestamp")) - switch msg.Cmd { - case mtwmapi.MsgTypeUserUrgeOrder, mtwmapi.MsgTypeOrderModified, mtwmapi.MsgTypeOrderFinancial: - vendorStatus = msg.Cmd - case mtwmapi.MsgTypeOrderCanceled: - vendorStatus = mtwmapi.OrderStatusCanceled - remark = msg.FormData.Get("reason") - case FakeMsgType, mtwmapi.MsgTypeNewOrder, mtwmapi.MsgTypeOrderAccepted, mtwmapi.MsgTypeOrderFinished: - vendorStatus = msg.FormData.Get("status") - statusTime = utils.Str2Int64(msg.FormData.Get("utime")) - case mtwmapi.MsgTypeOrderRefund, mtwmapi.MsgTypeOrderPartialRefund: // 订单退款,部分退款 - notifyType := msg.FormData.Get("notify_type") - vendorStatus = msg.Cmd + "-" + notifyType - if true { // 已经提前判断了,到这里的都是售中 - remark = msg.FormData.Get("reason") - if msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { // 部分退款 - if notifyType == mtwmapi.NotifyTypePartyApply { - if globals.EnableMtwmStoreWrite { - //if order, _ := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDMTWM); order != nil { - // getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderRefundAgree(utils.Str2Int64(orderID), "自动确认退款") - //} - // goods, err := dao.GetSimpleOrder(dao.GetDB(), orderID) - // if err == nil { - // if goods.Status < model.OrderStatusDelivering { - // } else { - // api.MtwmAPI.OrderRefundReject(utils.Str2Int64(orderID), "商品配送中,请联系门店。") // todo 京东与饿百都没有售前用户提出订单调整的,自动拒绝调整单 - // } - // } - } - } else if notifyType == mtwmapi.NotifyTypeSuccess { - vendorStatus = fakeOrderAdjustFinished - } - } else if msg.Cmd == mtwmapi.MsgTypeOrderRefund { - if notifyType == mtwmapi.NotifyTypeApply { - vendorStatus = fakeUserApplyCancel - } else if notifyType == mtwmapi.NotifyTypeCancelRefund || notifyType == mtwmapi.NotifyTypeCancelRefundComplaint { - vendorStatus = fakeUserUndoApplyCancel - } else if notifyType == mtwmapi.NotifyTypeReject { - vendorStatus = fakeRefuseUserApplyCancel - } else if notifyType == mtwmapi.NotifyTypeSuccess { - vendorStatus = fakeMerchantAgreeApplyCancel // todo 可能导致订单取消消息重复 - } - } - } - default: - globals.SugarLogger.Errorf("mtwm unkonw msg:%s", utils.Format4Output(msg, false)) +func (c *PurchaseHandler) callbackOrderMsg2Status(msg *tao_vegetable.CallbackOrder) (orderStatus *model.OrderStatus) { + orderId := utils.Int64ToStr(msg.BizOrderId) + orderStatus = &model.OrderStatus{ + VendorOrderID: orderId, + VendorID: model.VendorIDTaoVegetable, + OrderType: model.OrderTypeOrder, + RefVendorOrderID: orderId, + RefVendorID: model.VendorIDTaoVegetable, + VendorStatus: msg.OrderStatus, + StatusTime: utils.Str2TimeWithDefault(msg.Timestamp, time.Now()), } - if vendorStatus != "" { - orderStatus = &model.OrderStatus{ - VendorOrderID: orderID, - VendorID: model.VendorIDMTWM, - OrderType: model.OrderTypeOrder, - RefVendorOrderID: orderID, - RefVendorID: model.VendorIDMTWM, - VendorStatus: vendorStatus, - Status: c.getStatusFromVendorStatus(vendorStatus), - StatusTime: getTimeFromTimestamp(statusTime), - Remark: remark, - } + + switch msg.OrderStatus { + case tao_vegetable.OrderStatusNew: // 商户接单 + orderStatus.Status = model.OrderStatusNew + orderStatus.Remark = "新订单" + case tao_vegetable.OrderStatusPickedUp: // 拣货完成 + orderStatus.Status = model.OrderStatusFinishedPickup + orderStatus.Remark = "拣货完成" + case tao_vegetable.OrderStatusCallRider: // 打包出库(呼叫骑手,骑手到店,骑手取货) + orderStatus.Status = model.OrderStatusFinishedPickup + orderStatus.Remark = "打包出库(呼叫骑手,骑手到店,骑手取货)" + case tao_vegetable.OrderStatusDelivery: // 配送中 + orderStatus.Status = model.OrderStatusDelivering + orderStatus.Remark = "配送中" + case tao_vegetable.OrderStatusDeliveryOver: // 配送结束 + orderStatus.Status = model.OrderStatusFinished + orderStatus.Remark = "送达" + case tao_vegetable.OrderStatusUserRejection: // 用户拒收 + orderStatus.Status = model.OrderStatusDeliverFailed + orderStatus.Remark = "用户拒收" + case tao_vegetable.OrderStatusMerchantCancel: // 商户取消订单 + orderStatus.Status = model.OrderStatusCanceled + orderStatus.Remark = "商户取消" + case tao_vegetable.OrderStatusOnSaleCancel: + orderStatus.Status = model.OrderStatusCanceled + orderStatus.Remark = "用户售中取消" } return orderStatus } func (c *PurchaseHandler) postFakeMsg(vendorOrderID, cmd, vendorStatus string) { - msg := &mtwmapi.CallbackMsg{ - Cmd: cmd, - FormData: make(url.Values), + msg := &tao_vegetable.CallbackOrder{ + PublicModel: tao_vegetable.PublicModel{ + Method: "", + AppKey: "", + Session: "", + Timestamp: utils.Time2Str(time.Now()), + V: "", + SignMethod: "", + Sign: "", + Format: "", + Simplify: false, + CustomerId: false, + }, + MerchantCode: "", + StoreId: "", + BizOrderId: utils.Str2Int64(vendorOrderID), + OrderStatus: vendorStatus, } - timeStr := utils.Int64ToStr(time.Now().Unix()) - msg.FormData.Set(mtwmapi.KeyOrderID, vendorOrderID) - msg.FormData.Set("status", vendorStatus) - msg.FormData.Set("timestamp", timeStr) - msg.FormData.Set("utime", timeStr) utils.CallFuncAsync(func() { - c.onOrderMsg(msg) + c.onOrderMsg(vendorStatus, vendorOrderID, msg) }) } +// AcceptOrRefuseOrder 自动接单 func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) { if isAcceptIt { - if globals.EnableMtwmStoreWrite { - // err = api.MtwmAPI.OrderReceived(utils.Str2Int64(order.VendorOrderID)) - err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderConfirm(utils.Str2Int64(order.VendorOrderID)) - if err != nil { - if utils.IsErrMatch(err, utils.Int2Str(mtwmapi.ErrCodeOpFailed), []string{ - "订单已经确认过了", - }) { - err = nil - } else { - globals.SugarLogger.Warnf("mtwm AcceptOrRefuseOrder orderID:%s failed with err:%v", order.VendorOrderID, err) - } - } + param := &request591.AlibabaAelophyOrderWorkCallbackRequest{} + param.WorkCallbackRequest = &domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackRequest{ + StoreId: utils.String2Pointer(order.VendorStoreID), + BizOrderId: utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)), + Status: utils.String2Pointer(tao_vegetable.OrderStatusNew), + StatusRemark: nil, + DelivererName: nil, + DelivererPhone: nil, + WorkCallbackSubOrderInfoList: nil, + DelivererCompany: nil, + LogisticsNo: nil, + } + err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), order.VendorStoreID).DeliveryFinish(param) + if err != nil { + globals.SugarLogger.Warnf("tao AcceptOrRefuseOrder orderID:%s failed with err:%v", order.VendorOrderID, err) } - // if err == nil { - // c.postFakeMsg(order.VendorOrderID, FakeMsgType, mtwmapi.OrderStatusReceived) - // } } else { - if globals.EnableMtwmStoreWrite { - err = c.CancelOrder(jxcontext.AdminCtx, order, "bu") - } + err = c.CancelOrder(jxcontext.AdminCtx, order, "bu") } return err } +// PickupGoods 拣货 func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) { if !isSelfDelivery { - if globals.EnableMtwmStoreWrite { - // err = api.MtwmAPI.OrderConfirm(utils.Str2Int64(order.VendorOrderID)) - err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").PreparationMealComplete(utils.Str2Int64(order.VendorOrderID)) + param, err := orderStatusChangeNotice(order, tao_vegetable.OrderStatusPickedUp) + if err != nil { + return err + } + if err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").DeliveryFinish(param); err != nil { + globals.SugarLogger.Debugf("PickupGoods 拣货失败可能是BizSubOrderId 没填写 : %s", err.Error()) + return err } } - if err == nil { - c.postFakeMsg(order.VendorOrderID, FakeMsgType, fakeFinishedPickup) - } + + c.postFakeMsg(order.VendorOrderID, tao_vegetable.OrderStatusPickedUp, tao_vegetable.OrderStatusPickedUp) return err } @@ -542,96 +496,178 @@ func (p *PurchaseHandler) ConfirmReceiveGoods(ctx *jxcontext.Context, order *mod return err } -// 美团预定单不能转商家自送 +// CanSwitch2SelfDeliver 判断订单能不能转自送,淘宝为纯自送门店 func (c *PurchaseHandler) CanSwitch2SelfDeliver(order *model.GoodsOrder) (isCan bool, err error) { - return order.BusinessType != model.BusinessTypeDingshida, nil + return true, nil } +// Swtich2SelfDeliver 转自送接口通知淘先达发货 func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) { - if globals.EnableMtwmStoreWrite { - err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderLogisticsChange2Self(utils.Str2Int64(order.VendorOrderID)) + param, err := orderStatusChangeNotice(order, tao_vegetable.OrderStatusCallRider) + if err != nil { + return err + } + + if err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").DeliveryFinish(param); err != nil { + globals.SugarLogger.Debugf("Swtich2SelfDeliver 出库失败可能是BizSubOrderId 没填写 : %s", err.Error()) + return err } return err } +// Swtich2SelfDelivered 订单送达 func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) { - if globals.EnableMtwmStoreWrite { - // 您好,之前的答复已经更正为,调用变更配送状态的接口,会校验门店的配送类型。美团配送的门店即便转自配后因门店配送类型是美团配送所以无法调用接口变更配送状态。可提醒顾客点击确认收货。谢谢 - // 非自配送门店订单调用OrderArrived好像会报错:{"data":"ng","error":{"code":1038,"msg":"只允许商家配送调用该接口"}} - // err = api.MtwmAPI.OrderArrived(utils.Str2Int64(order.VendorOrderID)) - } return err } +// SelfDeliverDelivering 自配送订单配送中 func (c *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) { - if globals.EnableMtwmStoreWrite { - err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderDelivering(utils.Str2Int64(order.VendorOrderID)) + param, err := OrderStatusChangeDelivery(order, tao_vegetable.OrderStatusDelivery) + if err != nil { + return err } - return err + + return getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").DeliveryFinish(param) } +// SelfDeliverDelivered 自配送订单送达 func (c *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) { - if globals.EnableMtwmStoreWrite { - err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderArrived(utils.Str2Int64(order.VendorOrderID)) + param, err := OrderStatusChangeDelivery(order, tao_vegetable.OrderStatusDeliveryOver) + if err != nil { + return err } + err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").DeliveryFinish(param) return err } -func getTimeFromTimestamp(timeStamp int64) time.Time { - if timeStamp < 1538103149 { // 立即达订单给的是1(而不是空,0),1538103149不是特殊值,只是一个任意之前的时间,这样写可以处理 - return utils.DefaultTimeValue - } - return utils.Timestamp2Time(timeStamp) -} - func (c *PurchaseHandler) GetOrderRealMobile(ctx *jxcontext.Context, order *model.GoodsOrder) (mobile string, err error) { - err = errors.New("美团外卖还未实现GetOrderRealMobile") + err = errors.New("淘菜菜外卖还未实现GetOrderRealMobile") return mobile, err } func (c *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model.GoodsOrder, isAgree bool, reason string) (err error) { - if globals.EnableMtwmStoreWrite { - if isAgree { - err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderRefundAgree(utils.Str2Int64(order.VendorOrderID), reason) - } else { - err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderRefundReject(utils.Str2Int64(order.VendorOrderID), reason) + if isAgree { + param := &request3156.AlibabaTclsAelophyRefundAgreeRequest{ + StoreId: utils.String2Pointer(order.VendorStoreID), + OutOrderId: utils.String2Pointer(order.VendorOrderID), + OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)), + } + param.AuditMemo = utils.String2Pointer(fmt.Sprintf("商户同意退款")) + if reason != "" { + param.AuditMemo = utils.String2Pointer(*param.AuditMemo + fmt.Sprintf(",%s", reason)) + } + err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").AgreeUserCancel(param) + } else { + afsOrder, err := partner.CurOrderManager.LoadAfsOrder(order.VendorOrderID, order.VendorID) + if err != nil { + return err + } + param := &request3156.AlibabaTclsAelophyRefundDisagreeRequest{ + RefundId: utils.String2Pointer(afsOrder.AfsOrderID), + RejectReason: utils.String2Pointer(reason), + OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)), + } + err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").DisAgreeUserCancel(param) + if err != nil { + afsOrder.Status = model.AfsOrderStatusFailed + afsOrder.VendorStatus = "老板拒绝" + afsOrder.ReasonDesc += reason + "," + dao.UpdateEntity(dao.GetDB(), afsOrder, "Status", "ReasonDesc", "VendorStatus") } } return err } +// CancelOrder 商户取消订单(取消订单全部商品) func (c *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) { - if globals.EnableMtwmStoreWrite { - if err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderCancel(utils.Str2Int64(order.VendorOrderID), reason, mtwmapi.CancelReasonOther); err == nil { - // 调用开放平台接口取消订单,不推送取消订单消息和退款消息。 - c.postFakeMsg(order.VendorOrderID, mtwmapi.MsgTypeOrderCanceled, mtwmapi.OrderStatusCanceled) + api := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "") + orderSkuList, err := getOrderCancelList(api, order) + if err != nil { + return err + } + outSubOrderIds := make([]string, 0, len(*orderSkuList.OutSubOrders)) + for _, v := range *orderSkuList.OutSubOrders { + if *v.CanReverse { + outSubOrderIds = append(outSubOrderIds, *v.OutSubOrderId) } } + + param := &request3156.AlibabaTclsAelophyRefundCsapplyRequest{ + RefundCsApplyDTO: &domain3156.AlibabaTclsAelophyRefundCsapplyRefundCsApplyDto{ + ReasonId: utils.Int64ToPointer(1111), + OutOrderId: utils.String2Pointer(order.VendorOrderID), + StoreId: utils.String2Pointer(order.VendorStoreID), + RequestId: utils.String2Pointer(fmt.Sprintf("%s%d", order.VendorStoreID, time.Now().UnixNano())), + OutSubOrderIds: &outSubOrderIds, + Memo: utils.String2Pointer(reason), + }, + } + + if err = api.PartialRefund(param); err == nil { + c.postFakeMsg(order.VendorOrderID, tao_vegetable.OrderStatusMerchantCancel, tao_vegetable.OrderStatusMerchantCancel) + } + + // 发送取消状态,商户取消 + err = api.DeliveryFinish(&request591.AlibabaAelophyOrderWorkCallbackRequest{ + WorkCallbackRequest: &domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackRequest{ + StoreId: utils.String2Pointer(order.VendorStoreID), + BizOrderId: utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)), + Status: utils.String2Pointer(tao_vegetable.OrderStatusMerchantCancel), + }, + }) + return err } +// AdjustOrder 商户发起部分退款(取消订单部分商品) func (c *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error) { + api := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "") // 美团外卖必须要确认订单后才能调整单 if order.Status < model.OrderStatusFinishedPickup { - err = c.PickupGoods(order, false, ctx.GetUserName()) - } - if err == nil { - var skuList []*mtwmapi.RefundSku - for _, sku := range removedSkuList { - skuID := utils.Int2Str(jxutils.GetSkuIDFromOrderSku(sku)) - skuList = append(skuList, &mtwmapi.RefundSku{ - AppFoodCode: skuID, - SkuID: skuID, - Count: sku.Count, - }) - } - if globals.EnableMtwmStoreWrite { - err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderApplyPartRefund(utils.Str2Int64(order.VendorOrderID), reason, skuList) + if err = c.PickupGoods(order, false, ctx.GetUserName()); err != nil { + return err } } - return err + + // 获取订单的子订单id + requestParam := &request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{ + StoreId: utils.String2Pointer(order.VendorStoreID), + BizOrderId: utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)), + }} + orderDetail, err := api.QueryOrderDetail(requestParam) + if err != nil { + return err + } + + skuMap := make(map[string]string, 0) + for _, v := range *orderDetail.SubOrderResponseList { + skuMap[*v.SkuCode] = *v.OutSubOrderId + } + + // 获取需要退货商品的子订单id + refundSkuOrderID := make([]string, 0, len(removedSkuList)) + for _, v := range removedSkuList { + if orderId, ok := skuMap[v.VendorSkuID]; ok { + refundSkuOrderID = append(refundSkuOrderID, orderId) + } + } + + // 商家申请退货 + param := &request3156.AlibabaTclsAelophyRefundCsapplyRequest{ + RefundCsApplyDTO: &domain3156.AlibabaTclsAelophyRefundCsapplyRefundCsApplyDto{ + ReasonId: utils.Int64ToPointer(1111), + OutOrderId: utils.String2Pointer(order.VendorOrderID), + StoreId: utils.String2Pointer(order.VendorStoreID), + RequestId: utils.String2Pointer(fmt.Sprintf("%s%d", order.VendorStoreID, time.Now().UnixNano())), + OutSubOrderIds: &refundSkuOrderID, + Memo: utils.String2Pointer(reason), + }, + } + + return api.PartialRefund(param) } +// ListOrders 获取门店订单列表(补全遗漏订单) func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, vendorOrgCode string, parentTask tasksch.ITask, queryDate time.Time, vendorStoreID string) (vendorOrderIDs []string, err error) { if utils.IsTimeZero(queryDate) { return nil, fmt.Errorf("queryDate必须指定") @@ -639,6 +675,7 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, vendorOrgCode strin queryDate = utils.Time2Date(queryDate) var vendorStoreIDs []string + var api = getAPI(vendorOrgCode, 0, vendorStoreID) if vendorStoreID == "" { vendorStoreIDs, err = c.GetAllStoresVendorID(ctx, vendorOrgCode) if err != nil { @@ -647,34 +684,13 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, vendorOrgCode strin } else { vendorStoreIDs = []string{vendorStoreID} } - task := tasksch.NewParallelTask("mtwm ListOrders", nil, ctx, + task := tasksch.NewParallelTask("tao ListOrders", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { vendorStoreID := batchItemList[0].(string) var orderIDs []string - seqStart := 1 - i := 0 - for { - batchSize := int(math.Min(math.Pow(2, float64(i*3)), float64(mtwmapi.MaxGap4GetOrderIdByDaySeq))) - seqEnd := seqStart + batchSize - 1 - var tmpOrderIDs []int64 - if seqStart == seqEnd { - if vendorOderID, err2 := getAPI(vendorOrgCode, 0, vendorStoreID).GetOrderIdByDaySeqSingle(vendorStoreID, queryDate, seqStart); err2 == nil { - tmpOrderIDs = []int64{vendorOderID} - } - } else { - tmpOrderIDs, err = getAPI(vendorOrgCode, 0, vendorStoreID).GetOrderIdByDaySeq(vendorStoreID, queryDate, seqStart, seqEnd) - } - if len(tmpOrderIDs) > 0 { - for _, v := range tmpOrderIDs { - orderIDs = append(orderIDs, utils.Int64ToStr(v)) - } - } - if err != nil || len(tmpOrderIDs) < batchSize { - err = nil - break - } - seqStart = seqEnd + 1 - i++ + // 获取当前门店当天的订单 + if vendorOderID, err2 := api.GetTransactionOrderListByTime(vendorStoreID, queryDate); err2 == nil { + orderIDs = vendorOderID } retVal = orderIDs return retVal, nil @@ -690,136 +706,13 @@ func (c *PurchaseHandler) ListOrders(ctx *jxcontext.Context, vendorOrgCode strin return vendorOrderIDs, err } -// func (c *PurchaseHandler) UpdateWaybillTip(ctx *jxcontext.Context, order *model.GoodsOrder, tipFee int64) (err error) { -// if globals.EnableMtwmStoreWrite { -// err = api.MtwmAPI.OrderUpdateTip(utils.Str2Int64(order.VendorOrderID), jxutils.IntPrice2Standard(tipFee)) -// } -// return err -// } - -func (p *PurchaseHandler) GetOrderConsigneeNumber(ctx *jxcontext.Context, storeID int, vendorStoreID string) (numberList []*partner.OrderPhoneNumberInfo, err error) { - offset := 0 - for { - store, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, "") - result, err2 := getAPI(store.VendorOrgCode, storeID, "").OrderBatchPullPhoneNumber(vendorStoreID, offset, mtwmapi.MaxBatchPullPhoneNumberLimit) - if err = err2; err == nil { - for _, v := range result { - v2 := &partner.OrderPhoneNumberInfo{ - VendorOrderID: utils.Int64ToStr(v.OrderID), - PhoneNumber: v.RealPhoneNumber, - } - if v2.PhoneNumber == "" { - v2.PhoneNumber = v.RealOrderPhoneNumber - } - numberList = append(numberList, v2) - } - if len(result) <= mtwmapi.MaxBatchPullPhoneNumberLimit { - break - } - offset += mtwmapi.MaxBatchPullPhoneNumberLimit - } else { - break - } - } - return numberList, err -} - -func (p *PurchaseHandler) GetOrderCourierNumber(ctx *jxcontext.Context, storeID int, vendorStoreID string) (numberList []*partner.OrderPhoneNumberInfo, err error) { - offset := 0 - for { - store, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, "") - result, err2 := getAPI(store.VendorOrgCode, 0, "").OrderGetRiderInfoPhoneNumber(vendorStoreID, offset, mtwmapi.MaxBatchPullPhoneNumberLimit) - if err = err2; err == nil { - for _, v := range result { - numberList = append(numberList, &partner.OrderPhoneNumberInfo{ - VendorOrderID: utils.Int64ToStr(v.OrderID), - PhoneNumber: v.RiderRealPhoneNumber, - }) - } - if len(result) <= mtwmapi.MaxBatchPullPhoneNumberLimit { - break - } - offset += mtwmapi.MaxBatchPullPhoneNumberLimit - } else { - break - } - } - return numberList, err -} - -func (p *PurchaseHandler) onNumberDowngrade(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) { - userNumberMap := make(map[string]*partner.OrderPhoneNumberInfo) - courierNumberMap := make(map[string]*partner.OrderPhoneNumberInfo) - orderMap := make(map[string]int) - ctx := jxcontext.AdminCtx - task := tasksch.NewParallelTask("美团外卖平台处理隐私号降级通知", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - step := batchItemList[0].(int) - switch step { - case 0: - userNumberList, err2 := p.GetOrderConsigneeNumber(ctx, 0, "") - if err = err2; err == nil { - for _, v := range userNumberList { - userNumberMap[v.VendorOrderID] = v - orderMap[v.VendorOrderID] = 1 - } - } - case 1: - courierNumberList, err2 := p.GetOrderCourierNumber(ctx, 0, "") - if err = err2; err == nil { - for _, v := range courierNumberList { - courierNumberMap[v.VendorOrderID] = v - orderMap[v.VendorOrderID] = 1 - } - } - case 2: - orderList := jxutils.StringMap2List(orderMap) - if len(orderList) > 0 { - updateTask := tasksch.NewParallelTask("美团外卖平台处理隐私号降级通知/处理订单", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - vendorOrderID := batchItemList[0].(string) - db := dao.GetDB() - if userNumberMap[vendorOrderID] != nil { - _, err = dao.UpdateEntityByKV(db, &model.GoodsOrder{}, map[string]interface{}{ - "ConsigneeMobile": userNumberMap[vendorOrderID].PhoneNumber, - "ConsigneeMobile2": userNumberMap[vendorOrderID].PhoneNumber, - }, map[string]interface{}{ - model.FieldVendorOrderID: vendorOrderID, - model.FieldVendorID: model.VendorIDMTWM, - }) - } - if courierNumberMap[vendorOrderID] != nil { - _, err = dao.UpdateEntityByKV(db, &model.Waybill{}, map[string]interface{}{ - "CourierMobile": courierNumberMap[vendorOrderID].PhoneNumber, - }, map[string]interface{}{ - "VendorWaybillID": vendorOrderID, - "WaybillVendorID": model.VendorIDMTWM, - }) - } - return retVal, err - }, orderList) - tasksch.HandleTask(updateTask, task, true).Run() - _, err = updateTask.GetResult(0) - } - } - return retVal, err - }, []int{0, 1, 2}) - tasksch.HandleTask(task, nil, true).Run() - return response -} - +// GetWaybillTip 自配送暂无小费 func (c *PurchaseHandler) GetWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2 string) (tipFee int64, err error) { - orderInfo, err := getAPI(vendorOrgCode, 0, vendorStoreID).GetDistributeOrderDetail(vendorOrderID, vendorStoreID) - if err == nil { - tipFee = jxutils.StandardPrice2Int(orderInfo.TipAmount) - } return tipFee, err } +// UpdateWaybillTip 暂无小费 func (c *PurchaseHandler) UpdateWaybillTip(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID, vendorOrderID, vendorWaybillID, vendorWaybillID2, cityCode string, tipFee int64) (err error) { - if globals.EnableMtwmStoreWrite { - err = getAPI(vendorOrgCode, 0, vendorStoreID).OrderModityTips(vendorOrderID, vendorStoreID, jxutils.IntPrice2Standard(tipFee)) - } return err } @@ -837,16 +730,12 @@ func (c *PurchaseHandler) ComplaintRider(vendorOrderId string, resonID int, reso // GetCancelDeliveryReason 转自配送时取消非专送混合送门店取消理由 func (c *PurchaseHandler) GetCancelDeliveryReason(order *model.GoodsOrder) (string, error) { - reason, err := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").GetCancelDeliveryReason(utils.Str2Int64(order.VendorOrderID), order.VendorStoreID) - if err != nil { - return "", err - } - return reason, nil + return "", nil } // 取消美团外卖理由转使用三方配送 func (c *PurchaseHandler) CancelLogisticsByWmOrderId(order *model.GoodsOrder, reasonCode, detailContent, appPoiCode, orderId string) error { - return getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").CancelLogisticsByWmOrderId(reasonCode, detailContent, appPoiCode, orderId) + return nil } // 获取订单配送状态 @@ -854,19 +743,58 @@ func (c *PurchaseHandler) OrderLogisticsStatus(orderId int64) (int64, error) { return 0, nil } -// GetOrderSettleAccounts 获取订单结算信息 +// GetOrderSettleAccounts 获取订单结算信息(t+1)当前订单获取不到结算 func (c *PurchaseHandler) GetOrderSettleAccounts(order *model.GoodsOrder) (int64, error) { - oderDetail, err := getAPI(order.VendorOrgCode, 0, order.VendorStoreID).OrderGetOrderDetail(utils.Str2Int64(order.VendorOrderID), true) - if err != nil { - return 0, err - } - - if poiReceiveDetailStr := utils.Interface2String(oderDetail["poi_receive_detail"]); poiReceiveDetailStr != "" { - var poiReceiveDetail *mtwmapi.PoiReceiveDetailInfo - utils.UnmarshalUseNumber([]byte(poiReceiveDetailStr), &poiReceiveDetail) - if poiReceiveDetail != nil { - return poiReceiveDetail.WmPoiReceiveCent, nil - } - } return 0, nil } + +// GetOrderTotalShopMoney 获取门店结算信息 +func GetOrderTotalShopMoney(appOrgCode string, vendorStoreID string, start, end time.Time) (map[string]string, error) { + if appOrgCode == "" || vendorStoreID == "" { + return nil, errors.New("appKey 不能为空且平台门店ID不能为空") + } + if start.IsZero() || end.IsZero() { + return nil, errors.New("开始时间和结束时间不能为空") + } + + settlement := make(map[string]string, 0) + + api := getAPI(appOrgCode, 0, vendorStoreID) + startBillDate := util.LocalTime(start) + endBillDate := util.LocalTime(end) + pageSize := 200 + pageIndex := 1 + + param := &request591.AlibabaWdkBillListRequest{ + TxdBillListGetRequest: &domain591.AlibabaWdkBillListTxdBillListGetRequest{ + EndBillDate: &endBillDate, + StartBillDate: &startBillDate, + ShopCode: utils.String2Pointer(vendorStoreID), + PageSize: utils.Int64ToPointer(int64(pageSize)), + PageIndex: utils.Int64ToPointer(int64(pageIndex)), + }, + } + + var totalIndex int64 = 0 + result, _ := api.QueryBillList(param) + for _, v := range *result.TxdBillDetailBOS { + settlement[*v.BizOrderId] = *v.ReceivableAmount + } + + if *result.Total > int64(pageSize) { + totalIndex = *result.Total / int64(pageSize) + if *result.Total%int64(pageSize) != model.NO { + totalIndex += 1 + } + + for i := 2; i <= int(totalIndex); i++ { + param.TxdBillListGetRequest.PageIndex = utils.Int64ToPointer(int64(i)) + result2, _ := api.QueryBillList(param) + for _, v := range *result2.TxdBillDetailBOS { + settlement[*v.BizOrderId] = *v.ReceivableAmount + } + } + } + + return settlement, nil +} diff --git a/business/partner/purchase/tao_vegetable/order_afs.go b/business/partner/purchase/tao_vegetable/order_afs.go index e7ff38001..5c7bec82b 100644 --- a/business/partner/purchase/tao_vegetable/order_afs.go +++ b/business/partner/purchase/tao_vegetable/order_afs.go @@ -1,13 +1,12 @@ -package mtwm +package tao_vegetable import ( "errors" "fmt" - "git.rosy.net.cn/jx-callback/globals/api" - "net/url" - "strings" - - "git.rosy.net.cn/baseapi/platformapi/mtwmapi" + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable" + request3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/request" + domain591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/domain" + request591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/request" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" @@ -15,57 +14,39 @@ import ( "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/api" ) var ( - // AfsVendorStatus2StatusMap = map[int]int{ - // mtwmapi.ResTypePending: model.AfsOrderStatusWait4Approve, - // mtwmapi.ResTypeMerchantRefused: model.AfsOrderStatusFailed, - // mtwmapi.ResTypeMerchantAgreed: model.AfsOrderStatusFinished, - // mtwmapi.ResTypeCSRefused: model.AfsOrderStatusFailed, - // mtwmapi.ResTypeCSAgreed: model.AfsOrderStatusFinished, - // mtwmapi.ResTypeTimeoutAutoAgreed: model.AfsOrderStatusFinished, - // mtwmapi.ResTypeAutoAgreed: model.AfsOrderStatusFinished, - // mtwmapi.ResTypeUserCancelApply: model.AfsOrderStatusFailed, - // mtwmapi.ResTypeUserCancelComplain: model.AfsOrderStatusFailed, - // } AfsVendorStatus2StatusMap = map[string]int{ - mtwmapi.NotifyTypeApply: model.AfsOrderStatusWait4Approve, - mtwmapi.NotifyTypePartyApply: model.AfsOrderStatusWait4Approve, - mtwmapi.NotifyTypeSuccess: model.AfsOrderStatusFinished, - mtwmapi.NotifyTypeReject: model.AfsOrderStatusFailed, - mtwmapi.NotifyTypeCancelRefund: model.AfsOrderStatusFailed, - mtwmapi.NotifyTypeCancelRefundComplaint: model.AfsOrderStatusFailed, + tao_vegetable.OrderStatusApplyAfs: model.AfsOrderStatusWait4Approve, + tao_vegetable.OrderStatusCancelAfs: model.AfsOrderStatusCancelAfs, + tao_vegetable.OrderStatusRefundSuccess: model.AfsOrderStatusFinished, } ) -func (c *PurchaseHandler) isAfsMsg(msg *mtwmapi.CallbackMsg) bool { - if msg.Cmd == mtwmapi.MsgTypeOrderRefund || msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { - // refundData := msg.Data.(*mtwmapi.CallbackRefundInfo) - orderID := utils.Str2Int64(GetOrderIDFromMsg(msg)) - order, _ := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(orderID), model.VendorIDMTWM) +func (c *PurchaseHandler) isAfsMsg(orderStatus string, orderId string) bool { + if orderStatus == tao_vegetable.OrderStatusApplyAfs || orderStatus == tao_vegetable.OrderStatusCancelAfs || orderStatus == tao_vegetable.OrderStatusRefundSuccess { + order, _ := partner.CurOrderManager.LoadOrder(orderId, model.VendorIDTaoVegetable) if order != nil { - //status, err := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), order.VendorStoreID).OrderViewStatus(orderID) - //if err == nil { - //return utils.Int2Str(status) == mtwmapi.OrderStatusFinished - return true //TODO 有的美团订单售前退款,也当做售后处理试试 - //} + return true } } return false } -func (c *PurchaseHandler) OnAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwmapi.CallbackResponse) { +func (c *PurchaseHandler) OnAfsOrderMsg(orderId, status string, msg interface{}) (retVal *tao_vegetable.CallBackResult) { jxutils.CallMsgHandlerAsync(func() { - retVal = c.onAfsOrderMsg(msg) - }, jxutils.ComposeUniversalOrderID(GetOrderIDFromMsg(msg), model.VendorIDMTWM)) + retVal = c.onAfsOrderMsg(status, msg) + }, jxutils.ComposeUniversalOrderID(orderId, model.VendorIDTaoVegetable)) return retVal } -// todo 对于退款与部分退款,order.go与这个文件中对于状态的处理不一致 -func (c *PurchaseHandler) onAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwmapi.CallbackResponse) { +// todo 淘宝暂无部分退款,只有整单退款 +func (c *PurchaseHandler) onAfsOrderMsg(status string, msg interface{}) (retVal *tao_vegetable.CallBackResult) { var err error - orderStatus := c.callbackAfsMsg2Status(msg) + var db = dao.GetDB() + orderStatus := c.callbackAfsMsg2Status(status, msg) needCallNew := orderStatus.Status == model.AfsOrderStatusWait4Approve || orderStatus.Status == model.AfsOrderStatusNew if !needCallNew { _, err := partner.CurOrderManager.LoadAfsOrder(orderStatus.VendorOrderID, orderStatus.VendorID) @@ -73,73 +54,80 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwma if dao.IsNoRowsError(err) { needCallNew = true } else { - return mtwmapi.Err2CallbackResponse(err, "") + return tao_vegetable.CallBackResultInfo(err) } } } if needCallNew { + refundData := msg.(*tao_vegetable.UserApplyRefundCallBack) var afsOrder *model.AfsOrder - refundData := msg.Data.(*mtwmapi.CallbackRefundInfo) - if msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { - afsOrder = &model.AfsOrder{ - VendorID: model.VendorIDMTWM, - AfsOrderID: orderStatus.VendorOrderID, - VendorOrderID: orderStatus.RefVendorOrderID, - VendorStoreID: "", - StoreID: 0, - AfsCreatedAt: utils.Timestamp2Time(refundData.Timestamp), - VendorAppealType: "", - AppealType: model.AfsAppealTypeRefund, - VendorReasonType: "", - ReasonType: model.AfsReasonNotOthers, - ReasonDesc: utils.LimitUTF8StringLen(refundData.Reason, 1024), - ReasonImgList: utils.LimitUTF8StringLen(strings.Join(refundData.PictureList, ","), 1024), - RefundType: model.AfsTypePartRefund, + afsOrder = &model.AfsOrder{ + VendorID: model.VendorIDTaoVegetable, + AfsOrderID: orderStatus.VendorOrderID, + VendorOrderID: orderStatus.RefVendorOrderID, + VendorStoreID: refundData.StoreId, + StoreID: 0, + AfsCreatedAt: orderStatus.StatusTime, - VendorOrgCode: msg.AppID, - // FreightUserMoney: afsInfo.OrderFreightMoney, - // AfsFreightMoney: afsInfo.AfsFreight, - // BoxMoney: afsInfo.PackagingMoney, - // TongchengFreightMoney: afsInfo.TongchengFreightMoney, - // SkuBoxMoney: afsInfo.MealBoxMoney, - } - for _, sku := range refundData.FoodList { - orderSku := &model.OrderSkuFinancial{ - // VendorID: model.VendorIDMTWM, - AfsOrderID: afsOrder.AfsOrderID, - // VendorOrderID: afsOrder.VendorOrderID, - // VendorStoreID: afsOrder.VendorStoreID, - // StoreID: afsOrder.StoreID, - IsAfsOrder: 1, + VendorAppealType: status, // 原始售后方式 + AppealType: model.AfsAppealTypeUserCancel, // 淘宝这个接口下发的只有用户取消 + VendorReasonType: refundData.RefundReason, + ReasonType: 0, + ReasonDesc: refundData.RefundReason, + ReasonImgList: utils.LimitUTF8StringLen(refundData.RefundPictures, 1024), + RefundType: model.AfsTypeFullRefund, + VendorOrgCode: refundData.MerchantCode, + } - Count: sku.Count, - // ConfirmTime: afsOrder.AfsCreateAt, - VendorSkuID: sku.SkuID, - SkuID: int(utils.Str2Int64WithDefault(sku.SkuID, 0)), - Name: sku.FoodName, - UserMoney: jxutils.StandardPrice2Int(sku.RefundPrice)*int64(sku.Count) + jxutils.StandardPrice2Int(sku.BoxPrice)*int64(sku.BoxNum), - } - if orderSku.VendorSkuID == "" || orderSku.VendorSkuID == "0" { - orderSku.VendorSkuID = sku.AppFoodCode - } + refundIds := make([]int64, 0, 0) + bizOrderIds := make([]int64, len(refundData.SubRefundOrders)) + for _, v := range refundData.SubRefundOrders { + bizOrderIds = append(bizOrderIds, utils.Str2Int64(v.OutSubOrderId)) + } + refundIds = append(refundIds, utils.Str2Int64(refundData.BizRefundId)) - afsOrder.SkuUserMoney += orderSku.UserMoney - afsOrder.Skus = append(afsOrder.Skus, orderSku) - } - //afsOrder.PmSubsidyMoney += afsOrder.RefundMoney - afsOrder.SkuUserMoney - } else { - if afsOrder = c.createAfsOrder(msg.FormData); afsOrder != nil { - // if orderFinancial, err2 := partner.CurOrderManager.LoadOrderFinancial(orderStatus.RefVendorOrderID, model.VendorIDMTWM); err2 == nil { - // afsOrder = c.OrderFinancialDetail2Refund(orderFinancial, msg.FormData) - afsOrder.AfsOrderID = orderStatus.VendorOrderID - afsOrder.RefundType = model.AfsTypeFullRefund - afsOrder.AppealType = model.AfsAppealTypeRefund - afsOrder.VendorReasonType = "" - afsOrder.ReasonType = model.AfsReasonNotOthers - afsOrder.ReasonDesc = utils.LimitUTF8StringLen(refundData.Reason, 1024) - afsOrder.ReasonImgList = utils.LimitUTF8StringLen(strings.Join(refundData.PictureList, ","), 1024) + taoAfsOrderDetail, err := getAPI(refundData.MerchantCode, 0, "").QueryAfsOrderDetail(&request591.AlibabaWdkOrderRefundGetRequest{ + BizOrderIds: &bizOrderIds, + RefundIds: &refundIds, + OrderFrom: nil, + ShopId: nil, + StoreId: &refundData.StoreId, + }) + if err != nil { + return tao_vegetable.CallBackResultInfo(err) + } + + taoAfsOrder := *taoAfsOrderDetail.Orders + + afsOrder.FreightUserMoney = *taoAfsOrder[0].RefundPostFee + afsOrder.AfsFreightMoney = *taoAfsOrder[0].RefundPostFee // 暂时未发现退货取件费用 + afsOrder.BoxMoney = 0 // 餐盒费 + afsOrder.TongchengFreightMoney = 0 // 同城配送费 + afsOrder.SkuBoxMoney = 0 // 商品包装费 + afsOrder.VendorStatus = orderStatus.VendorStatus // 退货状态 + + // 订单商品详细信息 + skuList, err := getAPI(refundData.MerchantCode, 0, "").QueryOrderDetail(&request591.AlibabaAelophyOrderGetRequest{OrderGetRequest: &domain591.AlibabaAelophyOrderGetOrderGetRequest{ + StoreId: utils.String2Pointer(refundData.StoreId), + BizOrderId: utils.Int64ToPointer(utils.Str2Int64(refundData.OutOrderId)), + }}) + if err != nil { + return tao_vegetable.CallBackResultInfo(err) + } + for _, sku := range *skuList.SubOrderResponseList { + orderSku := &model.OrderSkuFinancial{ + Count: utils.Str2Int(*sku.BuySaleQuantity), + VendorSkuID: *sku.SkuCode, + SkuID: utils.Str2Int(*sku.SkuCode), + Name: *sku.SkuName, + UserMoney: *sku.OriginalFee - *sku.DiscountFee, + PmSkuSubsidyMoney: *sku.DiscountPlatformFee, // 平台补贴商品 } + + afsOrder.PmSkuSubsidyMoney += orderSku.PmSkuSubsidyMoney + afsOrder.SkuUserMoney += orderSku.UserMoney + afsOrder.Skus = append(afsOrder.Skus, orderSku) } if afsOrder != nil { //直接就来一个新的售后单,并且还是售后完成的 @@ -149,70 +137,132 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwma err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) } } else { + // 用户取消售后 + if status == tao_vegetable.OrderStatusCancelAfs { + // 删除售后单 + afsOrder, err := dao.GetAfsOrders(db, model.VendorIDTaoVegetable, orderStatus.RefVendorOrderID, orderStatus.VendorOrderID) + if err != nil || afsOrder == nil { + globals.SugarLogger.Debugf("用户取消售后单,获取之前生成的售后单失败") + return tao_vegetable.CallBackResultInfo(err) + } + + if err = utils.CallFuncLogError(func() error { + _, err = dao.DeleteEntity(db, afsOrder[0], "VendorOrderID", "VendorID") + return err + }, "SaveAfsOrder delete AfsOrder, afsOrderID:%s", afsOrder[0].AfsOrderID); err != nil { + return tao_vegetable.CallBackResultInfo(err) + } + + // 删除售后商品 + if err = utils.CallFuncLogError(func() error { + _, err = dao.DeleteEntity(db, &model.OrderSkuFinancial{ + VendorOrderID: afsOrder[0].VendorOrderID, + VendorID: afsOrder[0].VendorID, + IsAfsOrder: 1, + }, "VendorOrderID", "VendorID", "IsAfsOrder") + return err + }, "SaveAfsOrder delete OrderSkuFinancial, afsOrderID:%s", afsOrder[0].AfsOrderID); err != nil { + return tao_vegetable.CallBackResultInfo(err) + } + // 订单更改为待配送 + goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, model.VendorIDTaoVegetable) + goodsOrder.Status = model.OrderStatusFinishedPickup + goodsOrder.VendorStatus = status + dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus") + } + if err := partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus); err == nil { - // 订单回调全额退款接口时,将订单状态修改为取消 - refundData := msg.Data.(*mtwmapi.CallbackRefundInfo) - if refundData.NotifyType == "agree" && msg.Cmd == mtwmapi.MsgTypeOrderRefund { - order, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, model.VendorIDMTWM) - order.Status = model.OrderStatusCanceled - dao.UpdateEntity(dao.GetDB(), order, "Status") + if err == nil && status == tao_vegetable.OrderStatusRefundSuccess { + goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, orderStatus.VendorID) + goodsOrder.Status = model.OrderStatusCanceled + goodsOrder.VendorStatus = orderStatus.VendorStatus + dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus") } } } - return mtwmapi.Err2CallbackResponse(err, "") + return tao_vegetable.CallBackResultInfo(err) } -func (p *PurchaseHandler) createAfsOrder(orderData url.Values) (afsOrder *model.AfsOrder) { - afsOrder, err := partner.CurOrderManager.CreateAfsOrderFromOrder(orderData.Get("order_id"), model.VendorIDMTWM) - if err == nil { - afsOrder.AfsOrderID = orderData.Get("refund_id") - afsOrder.AfsCreatedAt = utils.Timestamp2Time(utils.Str2Int64(orderData.Get("timestamp"))) - if afsOrder.AfsOrderID == "" { - afsOrder.AfsOrderID = afsOrder.VendorOrderID - } - } else { - afsOrder = nil - } - return afsOrder -} - -func (c *PurchaseHandler) callbackAfsMsg2Status(msg *mtwmapi.CallbackMsg) (orderStatus *model.OrderStatus) { - refundData := msg.Data.(*mtwmapi.CallbackRefundInfo) +func (c *PurchaseHandler) callbackAfsMsg2Status(status string, msg interface{}) (orderStatus *model.OrderStatus) { orderStatus = &model.OrderStatus{ - VendorID: model.VendorIDMTWM, - OrderType: model.OrderTypeAfsOrder, - RefVendorOrderID: utils.Int64ToStr(refundData.OrderID), - RefVendorID: model.VendorIDMTWM, - VendorStatus: fmt.Sprintf("%s:%d", refundData.NotifyType, refundData.ResType), - Status: c.GetAfsStatusFromVendorStatus(refundData.ResType, refundData.NotifyType), - StatusTime: utils.Timestamp2Time(refundData.Timestamp), - Remark: refundData.Reason, + VendorID: model.VendorIDTaoVegetable, + OrderType: model.OrderTypeAfsOrder, + RefVendorID: model.VendorIDTaoVegetable, } - if refundData.RefundID > 0 { - orderStatus.VendorOrderID = utils.Int64ToStr(refundData.RefundID) - } else { + + switch status { + case tao_vegetable.OrderStatusApplyAfs: + refundData := msg.(*tao_vegetable.UserApplyRefundCallBack) + orderStatus.RefVendorOrderID = refundData.OutOrderId + orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusApplyAfs, "用户申请取消") + orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusApplyAfs) + orderStatus.StatusTime = utils.Str2Time(refundData.Timestamp) + orderStatus.Remark = refundData.Remarks + orderStatus.VendorOrderID = refundData.BizRefundId + case tao_vegetable.OrderStatusCancelAfs: + refundData := msg.(*tao_vegetable.UserCancelRefundApply) + orderStatus.RefVendorOrderID = refundData.OutOrderId + orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusCancelAfs, "用户取消售后申请") + orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusCancelAfs) + orderStatus.StatusTime = utils.Str2Time(refundData.Timestamp) + orderStatus.VendorOrderID = refundData.BizRefundId + //case tao_vegetable.OrderStatusOnSaleCancel: + // refundData := msg.(*tao_vegetable.OnSaleCancel) + // orderStatus.RefVendorOrderID = utils.Int64ToStr(refundData.BizOrderId) + // orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusOnSaleCancel, "用户售中取消") + // orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusOnSaleCancel) + // orderStatus.StatusTime = utils.Str2Time(refundData.Timestamp) + // orderStatus.VendorOrderID = refundData.IdempotentId + case tao_vegetable.OrderStatusRefundSuccess: + refundData := msg.(*tao_vegetable.RefundOrderFinish) + orderStatus.RefVendorOrderID = refundData.OutMainRefundId + orderStatus.VendorStatus = fmt.Sprintf("%s:%s", tao_vegetable.OrderStatusRefundSuccess, "用户售后退款成功") + orderStatus.Status = c.GetAfsStatusFromVendorStatus(tao_vegetable.OrderStatusRefundSuccess) + orderStatus.StatusTime = utils.Str2Time(refundData.Timestamp) + orderStatus.VendorOrderID = refundData.BizSubRefundId + } + + if orderStatus.VendorOrderID == "" { orderStatus.VendorOrderID = orderStatus.RefVendorOrderID } return orderStatus } -func (c *PurchaseHandler) GetAfsStatusFromVendorStatus(resType int, notifyType string) int { +func (c *PurchaseHandler) GetAfsStatusFromVendorStatus(notifyType string) int { status := AfsVendorStatus2StatusMap[notifyType] - if status == model.AfsOrderStatusWait4Approve && resType != mtwmapi.ResTypePending { - status = model.AfsOrderStatusNew - } + //if status == model.AfsOrderStatusWait4Approve || status == model.AfsOrderStatusOnSaleAfs { + // status = model.AfsOrderStatusNew + //} return status } // 审核售后单申请 func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) { - if globals.EnableMtwmStoreWrite { - if approveType == partner.AfsApproveTypeRefused { - err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).OrderRefundReject(utils.Str2Int64(order.VendorOrderID), reason) - } else if approveType == partner.AfsApproveTypeRefusedToRefundMoney { - return errors.New("此平台暂时不支持") - } else { - err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).OrderRefundAgree(utils.Str2Int64(order.VendorOrderID), reason) + if approveType == partner.AfsApproveTypeRefused { + param := &request3156.AlibabaTclsAelophyRefundAgreeRequest{ + StoreId: utils.String2Pointer(order.VendorStoreID), + OutOrderId: utils.String2Pointer(order.VendorOrderID), + OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)), + } + param.AuditMemo = utils.String2Pointer(fmt.Sprintf("商户同意退款")) + if reason != "" { + param.AuditMemo = utils.String2Pointer(*param.AuditMemo + fmt.Sprintf(",%s", reason)) + } + err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).AgreeUserCancel(param) + } else if approveType == partner.AfsApproveTypeRefusedToRefundMoney { + return errors.New("此平台暂时不支持") + } else { + param := &request3156.AlibabaTclsAelophyRefundDisagreeRequest{ + RefundId: utils.String2Pointer(order.AfsOrderID), + RejectReason: utils.String2Pointer(reason), + OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)), + } + err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).DisAgreeUserCancel(param) + if err != nil { + order.Status = model.AfsOrderStatusFailed + order.VendorStatus = "老板拒绝" + order.ReasonDesc += reason + "," + dao.UpdateEntity(dao.GetDB(), order, "Status", "ReasonDesc", "VendorStatus") } } return err diff --git a/business/partner/purchase/tao_vegetable/order_comment.go b/business/partner/purchase/tao_vegetable/order_comment.go index d585b479a..2f65b9a15 100644 --- a/business/partner/purchase/tao_vegetable/order_comment.go +++ b/business/partner/purchase/tao_vegetable/order_comment.go @@ -1,4 +1,4 @@ -package mtwm +package tao_vegetable import ( "strings" diff --git a/business/partner/purchase/tao_vegetable/order_test.go b/business/partner/purchase/tao_vegetable/order_test.go index 54585dc91..e2cbacc9d 100644 --- a/business/partner/purchase/tao_vegetable/order_test.go +++ b/business/partner/purchase/tao_vegetable/order_test.go @@ -1,4 +1,4 @@ -package mtwm +package tao_vegetable import ( "testing" diff --git a/business/partner/purchase/tao_vegetable/order_utils.go b/business/partner/purchase/tao_vegetable/order_utils.go new file mode 100644 index 000000000..94a8ce631 --- /dev/null +++ b/business/partner/purchase/tao_vegetable/order_utils.go @@ -0,0 +1,199 @@ +package tao_vegetable + +import ( + "fmt" + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable" + domain3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/domain" + request3156 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability3156/request" + domain591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/domain" + request591 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability591/request" + "git.rosy.net.cn/baseapi/utils" + "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" + "time" +) + +// orderStatusChangeNotice 拣货和通知发货状态变化接口 +func orderStatusChangeNotice(order *model.GoodsOrder, orderStatus string) (*request591.AlibabaAelophyOrderWorkCallbackRequest, error) { + param := &request591.AlibabaAelophyOrderWorkCallbackRequest{} + param.WorkCallbackRequest = &domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackRequest{ + StoreId: utils.String2Pointer(order.VendorStoreID), + BizOrderId: utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)), + Status: utils.String2Pointer(orderStatus), + } + + workCallbackSubOrderInfoList := make([]domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackSubOrderInfo, 0, 0) + skuList, err := dao.GetSimpleOrderSkus(dao.GetDB(), order.VendorOrderID, nil) + if err != nil { + return nil, err + } + if len(skuList) == model.NO { + return nil, fmt.Errorf("订单商品列表为零,请管理员检查") + } + for _, v := range skuList { + workCallbackSubOrderInfo := domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackSubOrderInfo{ + BizSubOrderId: nil, + SkuCode: utils.String2Pointer(v.VendorSkuID), + PickSaleQuantity: utils.String2Pointer(utils.Int2Str(v.Count)), + PickStockQuantity: utils.String2Pointer(fmt.Sprintf("%.2f", float64(v.Weight)/float64(1000)*float64(v.Count))), + } + workCallbackSubOrderInfoList = append(workCallbackSubOrderInfoList, workCallbackSubOrderInfo) + } + + // 出库 + param.WorkCallbackRequest.WorkCallbackSubOrderInfoList = &workCallbackSubOrderInfoList + + return param, nil +} + +// OrderStatusChangeDelivery 订单开始配送和送达通知接口 +func OrderStatusChangeDelivery(order *model.GoodsOrder, orderStatus string) *request591.AlibabaAelophyOrderWorkCallbackRequest { + param := &request591.AlibabaAelophyOrderWorkCallbackRequest{} + param.WorkCallbackRequest = &domain591.AlibabaAelophyOrderWorkCallbackWorkCallbackRequest{ + StoreId: utils.String2Pointer(order.VendorStoreID), + BizOrderId: utils.Int64ToPointer(utils.Str2Int64(order.VendorOrderID)), + Status: utils.String2Pointer(orderStatus), + } + bill, _ := partner.CurOrderManager.LoadWaybill(order.VendorWaybillID, order.WaybillVendorID) + param.WorkCallbackRequest.DelivererName = utils.String2Pointer(bill.CourierName) + param.WorkCallbackRequest.DelivererPhone = utils.String2Pointer(bill.CourierMobile) + if param.WorkCallbackRequest.DelivererName == nil || param.WorkCallbackRequest.DelivererPhone == nil { + param.WorkCallbackRequest.DelivererName = utils.String2Pointer("暂无") + param.WorkCallbackRequest.DelivererPhone = utils.String2Pointer("暂无") + } + + return param +} + +// getOrderCancelList 获取订单可取消的订单列表 +func getOrderCancelList(api *tao_vegetable.API, order *model.GoodsOrder) (*domain3156.AlibabaTclsAelophyRefundCsapplyrenderRefundCsApplyRenderResponseDto, error) { + param := &request3156.AlibabaTclsAelophyRefundCsapplyrenderRequest{ + RefundCsApplyRenderDTO: &domain3156.AlibabaTclsAelophyRefundCsapplyrenderRefundCsApplyRenderDto{ + OutOrderId: utils.String2Pointer(order.VendorOrderID), + StoreId: utils.String2Pointer(order.VendorStoreID), + OutSubOrderIds: nil, + OrderFrom: utils.Int64ToPointer(utils.Str2Int64(tao_vegetable.TaoVegetableChannelCode)), + }, + } + return api.PartialRefundReason(param) +} + +func getTimeFromTimestamp(timeStamp int64) time.Time { + if timeStamp < 1538103149 { // 立即达订单给的是1(而不是空,0),1538103149不是特殊值,只是一个任意之前的时间,这样写可以处理 + return utils.DefaultTimeValue + } + return utils.Timestamp2Time(timeStamp) +} + +// +//func (p *PurchaseHandler) GetOrderConsigneeNumber(ctx *jxcontext.Context, storeID int, vendorStoreID string) (numberList []*partner.OrderPhoneNumberInfo, err error) { +// offset := 0 +// for { +// store, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, "") +// result, err2 := getAPI(store.VendorOrgCode, storeID, "").OrderBatchPullPhoneNumber(vendorStoreID, offset, mtwmapi.MaxBatchPullPhoneNumberLimit) +// if err = err2; err == nil { +// for _, v := range result { +// v2 := &partner.OrderPhoneNumberInfo{ +// VendorOrderID: utils.Int64ToStr(v.OrderID), +// PhoneNumber: v.RealPhoneNumber, +// } +// if v2.PhoneNumber == "" { +// v2.PhoneNumber = v.RealOrderPhoneNumber +// } +// numberList = append(numberList, v2) +// } +// if len(result) <= mtwmapi.MaxBatchPullPhoneNumberLimit { +// break +// } +// offset += mtwmapi.MaxBatchPullPhoneNumberLimit +// } else { +// break +// } +// } +// return numberList, err +//} +// +//func (p *PurchaseHandler) GetOrderCourierNumber(ctx *jxcontext.Context, storeID int, vendorStoreID string) (numberList []*partner.OrderPhoneNumberInfo, err error) { +// offset := 0 +// for { +// store, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, "") +// result, err2 := getAPI(store.VendorOrgCode, 0, "").OrderGetRiderInfoPhoneNumber(vendorStoreID, offset, mtwmapi.MaxBatchPullPhoneNumberLimit) +// if err = err2; err == nil { +// for _, v := range result { +// numberList = append(numberList, &partner.OrderPhoneNumberInfo{ +// VendorOrderID: utils.Int64ToStr(v.OrderID), +// PhoneNumber: v.RiderRealPhoneNumber, +// }) +// } +// if len(result) <= mtwmapi.MaxBatchPullPhoneNumberLimit { +// break +// } +// offset += mtwmapi.MaxBatchPullPhoneNumberLimit +// } else { +// break +// } +// } +// return numberList, err +//} +// +//func (p *PurchaseHandler) onNumberDowngrade(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) { +// userNumberMap := make(map[string]*partner.OrderPhoneNumberInfo) +// courierNumberMap := make(map[string]*partner.OrderPhoneNumberInfo) +// orderMap := make(map[string]int) +// ctx := jxcontext.AdminCtx +// task := tasksch.NewParallelTask("美团外卖平台处理隐私号降级通知", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, +// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { +// step := batchItemList[0].(int) +// switch step { +// case 0: +// userNumberList, err2 := p.GetOrderConsigneeNumber(ctx, 0, "") +// if err = err2; err == nil { +// for _, v := range userNumberList { +// userNumberMap[v.VendorOrderID] = v +// orderMap[v.VendorOrderID] = 1 +// } +// } +// case 1: +// courierNumberList, err2 := p.GetOrderCourierNumber(ctx, 0, "") +// if err = err2; err == nil { +// for _, v := range courierNumberList { +// courierNumberMap[v.VendorOrderID] = v +// orderMap[v.VendorOrderID] = 1 +// } +// } +// case 2: +// orderList := jxutils.StringMap2List(orderMap) +// if len(orderList) > 0 { +// updateTask := tasksch.NewParallelTask("美团外卖平台处理隐私号降级通知/处理订单", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx, +// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { +// vendorOrderID := batchItemList[0].(string) +// db := dao.GetDB() +// if userNumberMap[vendorOrderID] != nil { +// _, err = dao.UpdateEntityByKV(db, &model.GoodsOrder{}, map[string]interface{}{ +// "ConsigneeMobile": userNumberMap[vendorOrderID].PhoneNumber, +// "ConsigneeMobile2": userNumberMap[vendorOrderID].PhoneNumber, +// }, map[string]interface{}{ +// model.FieldVendorOrderID: vendorOrderID, +// model.FieldVendorID: model.VendorIDMTWM, +// }) +// } +// if courierNumberMap[vendorOrderID] != nil { +// _, err = dao.UpdateEntityByKV(db, &model.Waybill{}, map[string]interface{}{ +// "CourierMobile": courierNumberMap[vendorOrderID].PhoneNumber, +// }, map[string]interface{}{ +// "VendorWaybillID": vendorOrderID, +// "WaybillVendorID": model.VendorIDMTWM, +// }) +// } +// return retVal, err +// }, orderList) +// tasksch.HandleTask(updateTask, task, true).Run() +// _, err = updateTask.GetResult(0) +// } +// } +// return retVal, err +// }, []int{0, 1, 2}) +// tasksch.HandleTask(task, nil, true).Run() +// return response +//} diff --git a/business/partner/purchase/tao_vegetable/store.go b/business/partner/purchase/tao_vegetable/store.go index 37c813909..c3f426b9e 100644 --- a/business/partner/purchase/tao_vegetable/store.go +++ b/business/partner/purchase/tao_vegetable/store.go @@ -1,4 +1,4 @@ -package mtwm +package tao_vegetable import ( "encoding/json" diff --git a/business/partner/purchase/tao_vegetable/store_sku2.go b/business/partner/purchase/tao_vegetable/store_sku2.go index 307e82c58..4fbadf82c 100644 --- a/business/partner/purchase/tao_vegetable/store_sku2.go +++ b/business/partner/purchase/tao_vegetable/store_sku2.go @@ -1,8 +1,16 @@ -package mtwm +package tao_vegetable import ( - "encoding/json" + "fmt" "git.rosy.net.cn/baseapi/platformapi/mtwmapi" + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable" + request1475 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability1475/request" + domain585 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability585/domain" + request585 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability585/request" + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability587/domain" + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability587/request" + domain589 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability589/domain" + request589 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability589/request" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" @@ -12,8 +20,11 @@ import ( "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner/putils" "git.rosy.net.cn/jx-callback/globals" + "io/ioutil" + "net/http" "regexp" "strings" + "time" ) const ( @@ -55,22 +66,28 @@ func getStoreVendorOrgCode(storeID int) (vendorOrgCode string) { // 门店分类 func (p *PurchaseHandler) GetStoreAllCategories(ctx *jxcontext.Context, storeID int, vendorStoreID string) (cats []*partner.BareCategoryInfo, err error) { - remoteCats, err := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatList(vendorStoreID) + remoteCats, err := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).GetStoreAllCategory() if err == nil { cats = convertVendorCatList(remoteCats) } return cats, err } -func convertVendorCatList(remoteCats []*mtwmapi.RetailCategoryInfo) (cats []*partner.BareCategoryInfo) { +func convertVendorCatList(remoteCats []*tao_vegetable.CategoryInfo) (cats []*partner.BareCategoryInfo) { for _, rCat := range remoteCats { cat := &partner.BareCategoryInfo{ VendorCatID: rCat.Code, Name: rCat.Name, - Level: rCat.Level, - Seq: rCat.Sequence, - Children: convertVendorCatList(rCat.Children), + Seq: rCat.Status, + Children: convertVendorCatList(rCat.ChildCategorys), } + + if len(rCat.ChildCategorys) == 0 { + cat.Level = 1 + } else { + cat.Level = 2 + } + if cat.VendorCatID == "" { cat.VendorCatID = rCat.Name } @@ -80,172 +97,77 @@ func convertVendorCatList(remoteCats []*mtwmapi.RetailCategoryInfo) (cats []*par } func (p *PurchaseHandler) IsErrCategoryExist(err error) (isExist bool) { - return mtwmapi.IsErrCategoryExist(err) + return tao_vegetable.IsErrCategoryExist(err) } func (p *PurchaseHandler) IsErrCategoryNotExist(err error) (isNotExist bool) { - return mtwmapi.IsErrCategoryNotExist(err) -} - -func catCode2Str(catCode int) (catCodeStr string) { - if catCode > 0 { - catCodeStr = utils.Int2Str(catCode) - } - return catCodeStr -} - -func tryCatName2Code(originName string) (catCodeStr string) { - if intValue := utils.Str2Int64WithDefault(originName, 0); intValue > 0 { - catCodeStr = utils.Int64ToStr(intValue) - if catCodeStr != originName { - catCodeStr = "" - } - } - return catCodeStr + return tao_vegetable.IsErrCategoryNotExist(err) } func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) { - level := 1 - if storeCat.ParentCatName != "" { - level = 2 - } - originName := "" - catName := storeCat.Name - catCode := storeCat.ID - - subCatName := "" - subCatCode := 0 - if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 { - // 修改一级分类 - originName = storeCat.VendorCatID - } - if level == 2 { // 二级分类 - // 创建二级分类 - originName = storeCat.ParentVendorCatID - catName = storeCat.ParentCatName - catCode = storeCat.ParentID - subCatName = storeCat.Name - subCatCode = storeCat.ID - if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 { - // 修改二级分类 - originName = storeCat.VendorCatID - catName = storeCat.Name - catCode = storeCat.ID - subCatName = "" - subCatCode = 0 - } - } - if catName == "" { - panic("catName is empty") - } - catName = utils.FilterEmoji(catName) - subCatName = utils.FilterEmoji(subCatName) - if globals.EnableMtwmStoreWrite { - param4Update := &mtwmapi.Param4UpdateCat{ - CategoryCodeOrigin: tryCatName2Code(originName), - CategoryNameOrigin: originName, - CategoryCode: catCode2Str(catCode), - SecondaryCategoryCode: catCode2Str(subCatCode), - SecondaryCategoryName: subCatName, - Sequence: storeCat.Seq, - } - api := getAPI(storeCat.VendorOrgCode, storeID, vendorStoreID) - err = api.RetailCatUpdate(vendorStoreID, catName, param4Update) - if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 && p.IsErrCategoryNotExist(err) && originName != "" { // 修改分类名,但分类不存在 + api := getAPI(storeCat.VendorOrgCode, storeID, vendorStoreID) + // 修改分类 + if model.IsSyncStatusUpdate(storeCat.CatSyncStatus) { + err := api.UpdateStoreCategoryInfo(&request.AlibabaWdkSkuCategoryUpdateRequest{Param: &domain.AlibabaWdkSkuCategoryUpdateCategoryDo{ + Code: utils.String2Pointer(utils.Int2Str(storeCat.StoreCatID)), + Name: &storeCat.StoreCatName, + }}) + if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 && p.IsErrCategoryNotExist(err) && storeCat.StoreCatName != "" { // 修改分类名,但分类不存在 storeCat.CatSyncStatus |= model.SyncFlagNewMask - err = p.CreateStoreCategory(ctx, storeID, vendorStoreID, storeCat) - } - - // 门店内存在重复的分类:【柑桔柚类】 【底料】,请先删除重复分类后再操作。 - if err != nil && strings.Contains(err.Error(), "门店内存在重复的分类:") { - for _, v := range deleteRepeatCat(err.Error()) { - if len(v) > 0 { - if err2 := api.RetailCatDelete(vendorStoreID, "", v, model.YES); err != nil { - globals.SugarLogger.Errorf("RetailCatDelete delete err : [%v]", err2) - } - } + skuCode, err := api.AddStoreCategoryInfo(&request.AlibabaWdkSkuCategoryAddRequest{Param: &domain.AlibabaWdkSkuCategoryAddCategoryDo{ + Code: utils.String2Pointer(utils.Int2Str(storeCat.StoreCatID)), + Name: &storeCat.StoreCatName, + ParentCode: utils.String2Pointer(utils.Int2Str(storeCat.ParentID)), + Leaf: utils.Bool2Point(false), + }}) + if err != nil { + return err } + storeCat.VendorCatID = skuCode } } - - if err == nil { - // storeCat.VendorCatID = utils.FilterEmoji(storeCat.Name) - storeCat.VendorCatID = utils.Int2Str(storeCat.ID) + // 创建分类 + if model.IsSyncStatusNeedCreate(storeCat.CatSyncStatus) { + skuCode, err := api.AddStoreCategoryInfo(&request.AlibabaWdkSkuCategoryAddRequest{Param: &domain.AlibabaWdkSkuCategoryAddCategoryDo{ + Code: utils.String2Pointer(utils.Int2Str(storeCat.StoreCatID)), + Name: &storeCat.StoreCatName, + ParentCode: utils.String2Pointer(utils.Int2Str(storeCat.ParentID)), + Leaf: utils.Bool2Point(false), + }}) + if err != nil { + return err + } + storeCat.VendorCatID = skuCode } return err } -// deleteRepeatCat 门店内存在重复的分类:【柑桔柚类】 【底料】 【火锅】,请先删除重复分类后再操作。 -func deleteRepeatCat(param string) []string { - firstIndex := strings.Index(param, "【") - lastIndex := strings.LastIndex(param, "】") - newParam := param[firstIndex:lastIndex] - deleteCat := make([]string, 0, 0) - for _, v := range strings.Split(newParam, "【") { - if strings.TrimSpace(v) == "" { - continue - } else if strings.Contains(v, "【") { - for _, v2 := range strings.Split(v, "【") { - if strings.TrimSpace(v) == "" { - continue - } - if strings.TrimSpace(v2) != "" { - deleteCat = append(deleteCat, v2) - } - } - } else if strings.Contains(v, "】") { - for _, v3 := range strings.Split(v, "】") { - if strings.TrimSpace(v3) == "" { - continue - } - if strings.TrimSpace(v3) != "" { - deleteCat = append(deleteCat, v3) - } - } - } else { - deleteCat = append(deleteCat, v) - } - } - return deleteCat -} - func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) { return p.CreateStoreCategory(ctx, storeID, vendorStoreID, storeCat) } func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) { - if false { - if globals.EnableMtwmStoreWrite { - err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatDelete(vendorStoreID, tryCatName2Code(vendorCatID), vendorCatID, model.NO) - } - } else { - var catCodes []string - if catCode := tryCatName2Code(vendorCatID); catCode != "" { - catCodes = []string{catCode} - } - if globals.EnableMtwmStoreWrite { - if level == 1 { - err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, catCodes, []string{vendorCatID}, nil, nil, nil) - } else { - err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, nil, nil, catCodes, []string{vendorCatID}, nil) + api := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID) + // 只能删除叶子结点 + // 看看这个level是不是代表子节点,感觉不是 + category, err := api.GetStoreCategoryInfo(vendorCatID) + if err != nil { + return err + } + + // 删除的是父节点,删除父节点下的所有子节点在删除父节点 + if len(category.ChildCategorys) != 0 { + for _, v := range category.ChildCategorys { + err2 := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).DeleteStoreCategoryInfo(&request.AlibabaWdkSkuCategoryDeleteRequest{Param: &domain.AlibabaWdkSkuCategoryDeleteCategoryDo{Code: &v.Code}}) + if err2 != nil && strings.Contains(err2.Error(), "类目已有子类目,不能被删除") { + p.DeleteStoreCategory(ctx, storeID, vendorStoreID, v.Code, 0) } } } - return err + + return getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).DeleteStoreCategoryInfo(&request.AlibabaWdkSkuCategoryDeleteRequest{Param: &domain.AlibabaWdkSkuCategoryDeleteCategoryDo{Code: &vendorCatID}}) } -//批量更新商品进货价 -func BatchSetRestockingPrice(ctx *jxcontext.Context, storeID int, vendorStoreID string, param []*mtwmapi.SpuData) error { - if err := getAPI(getStoreVendorOrgCode(storeID), storeID, "").BatchSetRestockingPrice(ctx.GetTrackInfo(), vendorStoreID, param); err != nil { - return err - } - return nil -} - -// 门店商品 - -// 多门店平台不需要实现这个接口 - func (p *PurchaseHandler) IsErrSkuExist(err error) (isExist bool) { return false } @@ -254,317 +176,365 @@ func (p *PurchaseHandler) IsErrSkuNotExist(err error) (isNotExist bool) { return mtwmapi.IsErrSkuNotExist(err) } -// func duplicateStoreSkuList(storeSkuList []*dao.StoreSkuSyncInfo, index int) (newStoreSkuList []*dao.StoreSkuSyncInfo) { -// newStoreSkuList = make([]*dao.StoreSkuSyncInfo, len(storeSkuList)) -// for k, v := range storeSkuList { -// tmp := *v -// tmp.SkuName = fmt.Sprintf("%s.%d", tmp.SkuName, index) -// tmp.SkuID = index*1000000 + tmp.SkuID -// newStoreSkuList[k] = &tmp -// } -// return newStoreSkuList -// } - func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { failedList, err = p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, false) - // if err == nil && vendorStoreID == specialStoreID { - // for i := 0; i < 2; i++ { - // p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, duplicateStoreSkuList(storeSkuList, i+1), true) - // } - // } return failedList, err } func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { failedList, err = p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, true) - // if err == nil && vendorStoreID == specialStoreID { - // for i := 0; i < 2; i++ { - // p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, duplicateStoreSkuList(storeSkuList, i+1), true) - // } - // } return failedList, err } // 对于多门店平台来说,storeSkuList中只有SkuID与VendorSkuID有意义 func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo, isCreate bool) (failedList []*partner.StoreSkuInfoWithErr, err error) { var syncType string - foodDataList := make([]map[string]interface{}, len(storeSkuList)) if isCreate { syncType = "创建商品" } else { syncType = "更新商品" } - for i, storeSku := range storeSkuList { - isNeedUpdatePrice := isCreate //storeSku.SkuSyncStatus&(model.SyncFlagPriceMask|model.SyncFlagNewMask) != 0 - foodData := make(map[string]interface{}) - foodDataList[i] = foodData - foodData[mtwmapi.KeyAppFoodCode] = utils.Int2Str(storeSku.SkuID) - skus := []map[string]interface{}{ - map[string]interface{}{ - "sku_id": foodData[mtwmapi.KeyAppFoodCode], + + api := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID) + if isCreate { + failedList, err = createTaoVegetable(api, storeSkuList, vendorStoreID, storeID, syncType) + globals.SugarLogger.Debugf("创建淘先达商品异常:%s", err.Error()) + } else { + failedList, err = UpdateTaoVegetable(api, storeSkuList, vendorStoreID, storeID, syncType) + globals.SugarLogger.Debugf("更新淘先达商品异常:%s", err.Error()) + } + + return failedList, err +} + +// UpdateTaoVegetable 修改淘先达商品 +func UpdateTaoVegetable(api *tao_vegetable.API, storeSkuList []*dao.StoreSkuSyncInfo, vendorStoreID string, storeID int, syncType string) (failedList []*partner.StoreSkuInfoWithErr, err error) { + param := &request585.AlibabaWdkSkuUpdateRequest{} + updateSkuList := make([]domain585.AlibabaWdkSkuUpdateSkuDo, 0, 0) + totalCount := len(storeSkuList) + for index, v := range storeSkuList { + updateSku := domain585.AlibabaWdkSkuUpdateSkuDo{ + OuCode: utils.String2Pointer(vendorStoreID), + SkuCode: utils.String2Pointer(utils.Int2Str(v.SkuID)), + SkuName: utils.String2Pointer(v.SkuName), + MemberPrice: utils.String2Pointer("45"), + SkuPrice: utils.String2Pointer("45"), + CategoryCode: utils.String2Pointer(utils.Int2Str(v.CategoryID)), + BackCatCode: utils.String2Pointer(v.SkuVendorCatID), + } + if v.MinOrderCount <= model.YES { + updateSku.PurchaseQuantity = utils.Int64ToPointer(model.YES) // 起购单位 + } else { + updateSku.PurchaseQuantity = utils.Int64ToPointer(int64(v.MinOrderCount)) // 起购单位 + } + updateSku.SkuPicUrls = uploadImg(api, []string{v.ImgOrigin, v.Img, v.Img2, v.Img3, v.Img4, v.Img5, v.DescImg}) + updateSkuList = append(updateSkuList, updateSku) + if (index+model.YES)%tao_vegetable.MAXHandleCount == model.NO || index+model.YES == totalCount { + param.ParamList = &updateSkuList + result, err := api.UpdateStoreSku(param) + if err != nil { + globals.SugarLogger.Debugf("UpdateStoreSku Tao Vegetable err : %s", err.Error()) + } + // 记录失败的同步数据 + createFailedList, _ := SelectStoreSkuListByFoodList(storeSkuList, *result, storeID, model.VendorChineseNames[model.VendorIDTaoVegetable], syncType) + failedList = append(failedList, createFailedList...) + // 记录同步成功的数据 + param.ParamList = nil + updateSkuList = make([]domain585.AlibabaWdkSkuUpdateSkuDo, 0, 0) + } + } + + return failedList, err +} + +// createTaoVegetable 创建淘鲜达商品 +func createTaoVegetable(api *tao_vegetable.API, storeSkuList []*dao.StoreSkuSyncInfo, vendorStoreID string, storeID int, syncType string) (failedList []*partner.StoreSkuInfoWithErr, err error) { + createPram := &request585.AlibabaWdkSkuAddRequest{} + param := make([]domain585.AlibabaWdkSkuAddSkuDo, 0, 0) + totalCount := len(storeSkuList) + vendorSkuIdMap := make(map[string]string, 0) + + for index, storeSku := range storeSkuList { + sku := domain585.AlibabaWdkSkuAddSkuDo{ + Barcodes: utils.String2Pointer(utils.Int2Str(storeSku.SkuID)), + BrandName: utils.String2Pointer(tao_vegetable.CreateSkuBrandName), + OuCode: utils.String2Pointer(vendorStoreID), + InventoryUnit: utils.String2Pointer(storeSku.Unit), + ProducerPlace: utils.String2Pointer(tao_vegetable.CreateSkuProducerPlace), + SkuCode: utils.String2Pointer(utils.Int2Str(storeSku.SkuID)), + SkuName: utils.String2Pointer(storeSku.SkuName), + StorageType: utils.Int64ToPointer(tao_vegetable.CreateSkuStorageType), + SuggestedPrice: utils.String2Pointer(utils.Float64ToStr(utils.Int64ToFloat64(storeSku.UnitPrice) / utils.Int64ToFloat64(100))), + Weight: utils.String2Pointer(utils.Float32ToStr(storeSku.SpecQuality)), + ShelfLife: utils.Int64ToPointer(tao_vegetable.CreateShelfLife), + NetContent: utils.String2Pointer(utils.Float32ToStr(storeSku.SpecQuality)), + SaleUnit: utils.String2Pointer(storeSku.SpecUnit), + LifeStatus: utils.String2Pointer(tao_vegetable.CreateSkuLeafStatus), + SaleSpec: utils.String2Pointer(fmt.Sprintf("%f*1%s", storeSku.SpecQuality, storeSku.Unit)), + StepQuantity: utils.Int64ToPointer(model.YES), // 每次购买至少增加一个购买单位 + SubTitle: utils.String2Pointer("同城包邮"), + SubTitle1: utils.String2Pointer("一小时速达"), + OnlineSaleFlag: utils.Int64ToPointer(tao_vegetable.CreateOnlineSaleFlag), // 门店控制是否可见 + DeliveryUnit: utils.String2Pointer(storeSku.Unit), + DeliverySpec: utils.String2Pointer(utils.Int2Str(model.YES)), + MemberPrice: utils.String2Pointer(utils.Float64ToStr(float64(storeSku.UnitPrice) / float64(100))), + Storage: utils.String2Pointer(tao_vegetable.CreateStorage), + PickFloatRate: utils.String2Pointer(utils.Int2Str(model.NO)), // ? 0 + ForbidReceiveDays: utils.Int64ToPointer(tao_vegetable.CreateShelfLife), // ? 7 + ForbidSalesDays: utils.Int64ToPointer(model.NO), // ? 0 + OverloadRate: utils.String2Pointer(utils.Int2Str(model.NO)), // ? 0 + WarnDays: utils.Int64ToPointer(model.NO), // ? 0 + FixedFlag: utils.Int64ToPointer(model.NO), // ? 0 + PurchaseSpec: utils.String2Pointer(utils.Int2Str(model.YES)), // ? 1 + PurchaseUnit: utils.String2Pointer(storeSku.Unit), // ? 同上 + LabelStyleType: utils.String2Pointer(tao_vegetable.CreateLabelStyleType), // 库存单位 + ItemTypeNew: utils.Int64ToPointer(tao_vegetable.CreateItemTypeNewVegetable), + SkuPrice: utils.String2Pointer(utils.Float64ToStr(float64(storeSku.UnitPrice) / float64(100))), // 优先使用skuPrice 靠后SalePrice + Period: utils.Int64ToPointer(tao_vegetable.CreateShelfLife), // 优先使用period 靠后shelf_life + MerchantCatCode: utils.String2Pointer(utils.Int2Str(storeSku.NameCategoryID)), // 优先使用 靠后 category_code + FragileFlag: utils.Int64ToPointer(model.YES), + DeliveryStorage: utils.String2Pointer(tao_vegetable.CreateItemDeliveryStorage), + TemporaryFlag: utils.Int64ToPointer(model.NO), + IsOnline: utils.Int64ToPointer(tao_vegetable.CreateIsOnline), + } + sku.SkuPicUrls = uploadImg(api, []string{storeSku.ImgOrigin, storeSku.Img, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5, storeSku.DescImg}) + if storeSku.MinOrderCount <= model.YES { + sku.PurchaseQuantity = utils.Int64ToPointer(model.YES) // 起购单位 + } else { + sku.PurchaseQuantity = utils.Int64ToPointer(int64(storeSku.MinOrderCount)) // 起购单位 + } + sku.WeightFlag = utils.Int64ToPointer(tao_vegetable.CreateSkuWeightFlagNo) + sku.AvgWeight = utils.String2Pointer("1") // (重量) + if storeSku.Upc == "" { + //sku.WeightFlag = utils.Int64ToPointer(tao_vegetable.CreateSkuWeightFlagYes) + if storeSku.SpecUnit == "g" || storeSku.SpecUnit == "ml" || storeSku.SpecUnit == "G" || storeSku.SpecUnit == "ML" { + sku.PreMinusWeight = utils.String2Pointer(utils.Float64ToStr(float64(storeSku.SpecQuality) / float64(1000))) // 一个售卖单位按多少库存单位扣款(钱) + //sku.AvgWeight = utils.String2Pointer(utils.Float64ToStr(float64(storeSku.SpecQuality) / float64(1000))) // (重量) + } + if storeSku.SpecUnit == "kg" || storeSku.SpecUnit == "l" || storeSku.SpecUnit == "KG" || storeSku.SpecUnit == "L" { + sku.PreMinusWeight = utils.String2Pointer(utils.Float64ToStr(float64(storeSku.SpecQuality))) // 每个购买单位重量,预扣重量 + //sku.AvgWeight = utils.String2Pointer(utils.Float64ToStr(float64(storeSku.SpecQuality) / float64(1000))) // (重量) + } + } else { + //sku.WeightFlag = utils.Int64ToPointer(tao_vegetable.CreateSkuWeightFlagNo) + sku.PreMinusWeight = utils.String2Pointer("1") // 每个购买单位重量,预扣重量 + } + sku.SkuSuppliers = &[]domain585.AlibabaWdkSkuAddSkuSupplierDo{ + domain585.AlibabaWdkSkuAddSkuSupplierDo{ + ReturnFlag: utils.Int64ToPointer(model.NO), + Minimum: utils.String2Pointer(utils.Int2Str(model.YES)), }, } - foodData["skus"] = skus - foodData["name"] = utils.LimitUTF8StringLen(storeSku.SkuName, mtwmapi.MaxSkuNameCharCount) - foodData["description"] = storeSku.Comment - if isNeedUpdatePrice { - foodData["price"] = jxutils.IntPrice2Standard(storeSku.VendorPrice) - } - if storeSku.MinOrderCount != 0 { - foodData["min_order_count"] = storeSku.MinOrderCount - } else { - foodData["min_order_count"] = 1 - } - foodData["unit"] = storeSku.Unit - attr := SwitchAttr(storeSku.VendorVendorCatID) - if attr != "" { - foodData["common_attr_value"] = attr - } - catCode := tryCatName2Code(storeSku.VendorCatID) - if catCode != "" { - foodData["category_code"] = catCode - } else { - foodData["category_name"] = storeSku.VendorCatID - } - foodData["is_sold_out"] = skuStatusJX2Mtwm(storeSku.MergedStatus) - if true { // vendorStoreID == specialStoreID { - img2 := storeSku.Img2 - img3 := storeSku.Img3 - img4 := storeSku.Img4 - img5 := storeSku.Img5 - if img2 == "" { - img2 = storeSku.Img - } - if img3 == "" { - img3 = storeSku.Img - } - if img4 == "" { - img4 = storeSku.Img - } - if img5 == "" { - img5 = storeSku.Img - } - if storeSku.ImgMix != "" && ((storeSku.BrandID == storeSku.ExBrandID && storeSku.ExBrandID != 0) || storeSku.ExBrandID == 0) { - foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.ImgMix, img2, img3, img4, img5), ",") - } else { - foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.Img, img2, img3, img4, img5), ",") - } - } else { - foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.Img, storeSku.Img2), ",") - } - if storeSku.DescImg != "" { - foodData["picture_contents"] = storeSku.DescImg - } - foodData["sequence"] = storeSku.GetSeq() - if storeSku.VendorVendorCatID != 0 { - foodData["tag_id"] = utils.Int64ToStr(storeSku.VendorVendorCatID) - } else { - // foodData["tag_id"] = utils.Int64ToStr(defVendorCatID) - } - skus[0]["spec"] = jxutils.ComposeSkuSpec(storeSku.SpecQuality, storeSku.SpecUnit) - if isNeedUpdatePrice { - skus[0]["price"] = foodData["price"] - } - skus[0]["stock"] = stockCount2Mtwm(model.MaxStoreSkuStockQty) - if storeSku.Upc != "" { - skus[0]["upc"] = storeSku.Upc - } - skus[0]["ladder_box_num"] = storeSku.LadderBoxNum - boxPirce := 0 - if storeSku.MtLadderBoxPrice != 0 { - boxPirce = storeSku.MtLadderBoxPrice - } else { - boxPirce = storeSku.LadderBoxPrice - } - skus[0]["ladder_box_price"] = jxutils.IntPrice2Standard(int64(boxPirce)) - if foodData["tag_id"] != nil { - skus[0]["weight"] = storeSku.Weight // weight字段仅限服饰鞋帽、美妆、日用品、母婴、生鲜果蔬、生活超市下的便利店/超市门店品类的商家使用 - } - - } - if globals.EnableMtwmStoreWrite { - if len(foodDataList) == 1 { - foodDataList[0]["skus"] = string(utils.MustMarshal(foodDataList[0]["skus"])) - if err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailInitData(ctx.GetTrackInfo(), vendorStoreID, utils.Int2Str(storeSkuList[0].SkuID), foodDataList[0]); err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDMTWM], syncType) - } - } else if len(foodDataList) > 0 { - failedFoodList, err2 := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailBatchInitData(ctx.GetTrackInfo(), vendorStoreID, foodDataList) - if err = err2; err == nil { - if err = putils.GenPartialFailedErr(failedFoodList, len(failedFoodList)); err != nil { - failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], syncType) - // successList = putils.UnselectStoreSkuSyncListByVendorSkuIDs(storeSkuList, getAppFoodCodeList(failedFoodList)) - } - } else if err2 != nil && len(failedFoodList) == 0 { - if errExt, ok := err2.(*utils.ErrorWithCode); ok { - err = utils.UnmarshalUseNumber([]byte(errExt.ErrMsg()), &failedFoodList) - failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], syncType) - } - } - } - } - for _, storeSku := range storeSkuList { - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - } - if len(failedList) > 0 { - err = nil - } - return failedList, err -} - -func getAppFoodCodeList(l []*mtwmapi.AppFoodResult) (vendorSkuIDs []string) { - if len(l) > 0 { - vendorSkuIDs = make([]string, len(l)) - for k, v := range l { - vendorSkuIDs[k] = v.AppFoodCode - } - } - return vendorSkuIDs -} - -func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { - if globals.EnableMtwmStoreWrite { - if len(storeSkuList) == 1 { - err = getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID).RetailDelete(ctx.GetTrackInfo(), vendorStoreID, storeSkuList[0].VendorSkuID) - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDMTWM], "删除商品") - } else { - // todo 部分失败 - err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, nil, nil, nil, nil, partner.BareStoreSkuInfoList(storeSkuList).GetVendorSkuIDList()) - if err != nil { - if errExt, ok := err.(*utils.ErrorWithCode); ok { - myMap := make(map[string][]*mtwmapi.AppFoodResult) - json.Unmarshal([]byte(errExt.ErrMsg()), &myMap) - failedList = SelectStoreSkuListByFoodList(storeSkuList, myMap["retail_error_list"], storeID, model.VendorChineseNames[model.VendorIDMTWM], "批量删除商品") - } - } - } - } - if len(failedList) > 0 { - err = nil - } - return failedList, err -} - -func SwitchAttr(vendorCatID int64) (attrs string) { - switch vendorCatID { - case 200002727: - return mtwmapi.MtwmSkuAttr200002727 - case 200001555: - return mtwmapi.MtwmSkuAttr200001555 - case 200002728: - return mtwmapi.MtwmSkuAttr200002728 - case 200001519, 200000592: - return mtwmapi.MtwmSkuAttr200000592 - case 200002704, 200002731: - return mtwmapi.MtwmSkuAttr200002731 - case 200002716: - return mtwmapi.MtwmSkuAttr200002716 - case 200002667, 200002713, 200002670: - return mtwmapi.MtwmSkuAttr200002670 - case 200002680: - return mtwmapi.MtwmSkuAttr200002680 - default: - return "" - } - return attrs -} - -func stockCount2Mtwm(stock int) (mtwmStock string) { - return utils.Int2Str(stock) -} - -func storeSku2Mtwm(storeSkuList []*partner.StoreSkuInfo, updateType int) (skuList []*mtwmapi.BareStoreFoodInfo) { - for _, storeSku := range storeSkuList { - skuInfo := &mtwmapi.BareStoreFoodInfo{ - AppFoodCode: storeSku.VendorSkuID, - Skus: []*mtwmapi.BareStoreSkuInfo{ - &mtwmapi.BareStoreSkuInfo{ - SkuID: storeSku.VendorSkuID, + sku.ChannelProps = &[]domain585.AlibabaWdkSkuAddChannelProp{ + domain585.AlibabaWdkSkuAddChannelProp{ + ChannelType: utils.String2Pointer(tao_vegetable.CreateChannelType), + Props: &[]domain585.AlibabaWdkSkuAddPropField{ + domain585.AlibabaWdkSkuAddPropField{ + Value: utils.String2Pointer(utils.Int2Str(model.YES)), + Key: utils.String2Pointer(tao_vegetable.CreateChannelTypeKey), + }, }, }, } - if updateType == updateTypeStock { - skuInfo.Skus[0].Stock = stockCount2Mtwm(storeSku.Stock) - } else if updateType == updateTypePrice { - skuInfo.Skus[0].Price = jxutils.IntPrice2StandardString(storeSku.VendorPrice) - } else { - skuInfo.Skus = nil + + param = append(param, sku) + if (index+model.YES)%tao_vegetable.MAXHandleCount == model.NO || index+model.YES == totalCount { + createPram.ParamList = ¶m + result, err := api.AddStoreSku(createPram) + if err != nil { + globals.SugarLogger.Debugf("创建淘先达商品异常:%s", err.Error()) + //failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDTaoVegetable], syncType) + } + // 记录失败的同步数据 + createFailedList, successMap := SelectStoreSkuListByFoodList(storeSkuList, *result, storeID, model.VendorChineseNames[model.VendorIDTaoVegetable], syncType) + failedList = append(failedList, createFailedList...) + // 记录同步成功的数据 + for k, v := range successMap { + vendorSkuIdMap[k] = v + } + createPram.ParamList = nil + param = make([]domain585.AlibabaWdkSkuAddSkuDo, 0, 0) } - skuList = append(skuList, skuInfo) } - return skuList + + return failedList, nil } -func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, status int) (failedList []*partner.StoreSkuInfoWithErr, err error) { - skuList := storeSku2Mtwm(storeSkuList, updateTypeStatus) - mtwmStatus := skuStatusJX2Mtwm(status) - if globals.EnableMtwmStoreWrite { - failedFoodList, err2 := getAPI(vendorOrgCode, storeID, vendorStoreID).RetailSellStatus(ctx.GetTrackInfo(), vendorStoreID, skuList, mtwmStatus) - if err = err2; err == nil { - if len(failedFoodList) > 0 { - failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品状态") - // successList = putils.UnselectStoreSkuListByVendorSkuIDs(storeSkuList, getAppFoodCodeList(failedFoodList)) - } - } else if err2 != nil && len(failedFoodList) == 0 { - if errExt, ok := err2.(*utils.ErrorWithCode); ok { - err = utils.UnmarshalUseNumber([]byte(errExt.ErrMsg()), &failedFoodList) - failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品状态") - } +func uploadImg(api *tao_vegetable.API, imgs []string) *string { + result := make([]string, 0, 0) + for _, v := range imgs { + if v == "" { + continue + } + + inputTitle := strings.LastIndex(v, "/") + title := strings.LastIndex(v, ".") + resp, err := http.Get(v) + if err != nil { + continue + } + body, _ := ioutil.ReadAll(resp.Body) + if newImg, _ := api.UploadImg(&request1475.AlibabaWdkPictureUploadRequest{ + PictureCategoryId: utils.Int64ToPointer(0), + Img: &body, + ImgInputTitle: utils.String2Pointer(v[inputTitle:]), + Title: utils.String2Pointer(v[inputTitle:title]), + }); newImg != "" { + result = append(result, newImg) } } - if len(failedList) > 0 { - err = nil + + return utils.String2Pointer(strings.Join(result, ",")) +} + +// DeleteStoreSkus 暂无删除API,使用下架接口 +func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { + param := &request585.AlibabaWdkSkuUpdateRequest{} + updateSkuList := make([]domain585.AlibabaWdkSkuUpdateSkuDo, 0, 0) + api := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID) + for index, v := range storeSkuList { + updateSku := domain585.AlibabaWdkSkuUpdateSkuDo{ + OuCode: utils.String2Pointer(vendorStoreID), + SkuCode: utils.String2Pointer(utils.Int2Str(v.SkuID)), + OnlineSaleFlag: utils.Int64ToPointer(tao_vegetable.CreateOfflineSaleFlag), + } + updateSkuList = append(updateSkuList, updateSku) + + if (index+model.YES)%tao_vegetable.MAXHandleCount == model.NO || (index+1) == len(storeSkuList) { + param.ParamList = &updateSkuList + result, err := api.UpdateStoreSku(param) + if err != nil { + globals.SugarLogger.Debugf("UpdateStoreSku Tao Vegetable err : %s", err.Error()) + } + // 记录失败的同步数据 + createFailedList, _ := SelectStoreSkuListByFoodList(storeSkuList, *result, storeID, model.VendorChineseNames[model.VendorIDTaoVegetable], "删除商品(暂无接口,下架处理)") + failedList = append(failedList, createFailedList...) + param.ParamList = nil + updateSkuList = make([]domain585.AlibabaWdkSkuUpdateSkuDo, 0, 0) + } + } + return failedList, err + //param := &request.AlibabaAxChannelSkuStatusUpdateRequest{ChannelSkuUpdateStatusReq: &domain.AlibabaAxChannelSkuStatusUpdateChannelSkuUpdateStatusReq{ + // StoreId: utils.String2Pointer(vendorStoreID), + // ChannelCode: utils.String2Pointer(tao_vegetable.TaoVegetableChannelCode), + // OnlineSaleFlag: utils.Int64ToPointer(tao_vegetable.CreateIsOnline), + //}} + //var updateOffShelf = make([]tao_vegetable.VegetableResultList, 0, len(storeSkuList)) + //for _, v := range storeSkuList { + // param.ChannelSkuUpdateStatusReq.SkuCode = utils.String2Pointer(utils.Int2Str(v.SkuID)) + // // StoreSkuUpdateOffShelf 这个接口暂时有问题使用更新接口上下架 + // if err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).StoreSkuUpdateOffShelf(param); err != nil { + // updateOffShelf = append(updateOffShelf, tao_vegetable.VegetableResultList{ + // ProductID: v.VendorSkuID, + // SkuID: utils.Int2Str(v.SkuID), + // ErrMsg: err.Error(), + // }) + // } + //} + //failedList, _ = SelectStoreSkuListByFoodList(storeSkuList, updateOffShelf, storeID, model.VendorChineseNames[model.VendorIDTaoVegetable], "批量删除商品(暂时下架,无删除接口)") + //if len(failedList) > 0 { + // err = nil + //} + //return failedList, err +} + +// UpdateStoreSkusStatus 批量更新商品上下架状态 +func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, status int) (failedList []*partner.StoreSkuInfoWithErr, err error) { + param := &request585.AlibabaWdkSkuUpdateRequest{} + updateSkuList := make([]domain585.AlibabaWdkSkuUpdateSkuDo, 0, 0) + api := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID) + onlineStatus := skuStatusJX2Tao(status) + for index, v := range storeSkuList { + updateSku := domain585.AlibabaWdkSkuUpdateSkuDo{ + OuCode: utils.String2Pointer(vendorStoreID), + SkuCode: utils.String2Pointer(utils.Int2Str(v.SkuID)), + OnlineSaleFlag: utils.Int64ToPointer(onlineStatus), + } + updateSkuList = append(updateSkuList, updateSku) + + if (index+model.YES)%tao_vegetable.MAXHandleCount == model.NO || (index+1) == len(storeSkuList) { + param.ParamList = &updateSkuList + result, err := api.UpdateStoreSku(param) + if err != nil { + globals.SugarLogger.Debugf("UpdateStoreSku Tao Vegetable err : %s", err.Error()) + } + // 记录失败的同步数据 + createFailedList, _ := SelectStoreSkuListByFoodList(storeSkuList, *result, storeID, model.VendorChineseNames[model.VendorIDTaoVegetable], "批量更新商品上下架") + failedList = append(failedList, createFailedList...) + param.ParamList = nil + updateSkuList = make([]domain585.AlibabaWdkSkuUpdateSkuDo, 0, 0) + } } return failedList, err } func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { - priceList := storeSku2Mtwm(storeSkuList, updateTypePrice) - if globals.EnableMtwmStoreWrite { - failedFoodList, err2 := getAPI(vendorOrgCode, storeID, vendorStoreID).RetailSkuPrice(ctx.GetTrackInfo(), vendorStoreID, priceList) - if err = err2; err == nil { - if len(failedFoodList) > 0 { - failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品价格") - } - } else if err2 != nil && len(failedFoodList) == 0 { - if errExt, ok := err2.(*utils.ErrorWithCode); ok { - err = utils.UnmarshalUseNumber([]byte(errExt.ErrMsg()), &failedFoodList) - failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品价格") - } + param := &request585.AlibabaWdkSkuUpdateRequest{} + updateSkuList := make([]domain585.AlibabaWdkSkuUpdateSkuDo, 0, 0) + api := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID) + for index, v := range storeSkuList { + updateSku := domain585.AlibabaWdkSkuUpdateSkuDo{ + OuCode: utils.String2Pointer(vendorStoreID), + SkuCode: utils.String2Pointer(utils.Int2Str(v.SkuID)), + SkuPrice: utils.String2Pointer(fmt.Sprintf("%.2f", (float64(1000)/float64(v.SpecQuality))*(float64(v.JxUnitPrice)/float64(100)))), + CleanSkuMemberPrice: utils.Int64ToPointer(model.YES), + SuggestedPrice: utils.String2Pointer(fmt.Sprintf("%.2f", (float64(1000)/float64(v.SpecQuality))*(float64(v.JxUnitPrice)/float64(100)))), + } + updateSkuList = append(updateSkuList, updateSku) + + if (index+model.YES)%tao_vegetable.MAXHandleCount == model.NO || (index+1) == len(storeSkuList) { + param.ParamList = &updateSkuList + result, err := api.UpdateStoreSku(param) + if err != nil { + globals.SugarLogger.Debugf("UpdateStoreSku Tao Vegetable err : %s", err.Error()) + } + // 记录失败的同步数据 + createFailedList, _ := SelectStoreSkuListByFoodList(storeSkuList, *result, storeID, model.VendorChineseNames[model.VendorIDTaoVegetable], "修改商品价格") + failedList = append(failedList, createFailedList...) + param.ParamList = nil + updateSkuList = make([]domain585.AlibabaWdkSkuUpdateSkuDo, 0, 0) } - } - if len(failedList) > 0 { - err = nil } return failedList, err } func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { - stockList := storeSku2Mtwm(storeSkuList, updateTypeStock) - if globals.EnableMtwmStoreWrite { - failedFoodList, err2 := getAPI(vendorOrgCode, storeID, vendorStoreID).RetailSkuStock(ctx.GetTrackInfo(), vendorStoreID, stockList) - if err = err2; err == nil { - if len(failedFoodList) > 0 { - failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品库存") - } - //if err = putils.GenPartialFailedErr(failedFoodList, len(failedFoodList)); err != nil { - // successList = putils.UnselectStoreSkuListByVendorSkuIDs(storeSkuList, getAppFoodCodeList(failedFoodList)) - // } - } else if err2 != nil && len(failedFoodList) == 0 { - if errExt, ok := err2.(*utils.ErrorWithCode); ok { - err = utils.UnmarshalUseNumber([]byte(errExt.ErrMsg()), &failedFoodList) - failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品库存") + api := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID) + + param := request589.AlibabaWdkStockPublishRequest{} + batchStockPublishDto := &domain589.AlibabaWdkStockPublishBatchStockPublishDto{ + UpdateType: utils.Int64ToPointer(tao_vegetable.UpdateTypeStoke), + BillNo: utils.String2Pointer(utils.Int64ToStr(time.Now().UnixNano())), + BillType: utils.Int64ToPointer(tao_vegetable.UpdateTypeStokeBillType), + PublishSource: utils.String2Pointer(vendorStoreID), + ShopCode: utils.String2Pointer(vendorStoreID), + Operator: utils.String2Pointer(ctx.GetUserName()), + StockPublishDtos: nil, + } + stockPublishDtos := make([]domain589.AlibabaWdkStockPublishStockPublishDto, 0, 0) + for index, v := range storeSkuList { + stockPublishDtos = append(stockPublishDtos, domain589.AlibabaWdkStockPublishStockPublishDto{ + SkuCode: utils.String2Pointer(utils.Int2Str(v.SkuID)), + Quantity: utils.String2Pointer(utils.Int2Str(v.Stock)), + OrderNo: utils.String2Pointer(fmt.Sprintf("%s_%d_%d", vendorStoreID, time.Now().UnixNano(), 84671)), + OrderType: utils.String2Pointer("10006800"), // 这个不太确定 + }) + if (index+model.YES)%tao_vegetable.MAXHandleCount == model.NO || (index+1) == len(storeSkuList) { + batchStockPublishDto.StockPublishDtos = &stockPublishDtos + param.BatchStockPublishDto = batchStockPublishDto + if err = api.StoreSkuStock(¶m); err != nil { + failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDTaoVegetable], "更新库存错误")...) } + stockPublishDtos = make([]domain589.AlibabaWdkStockPublishStockPublishDto, 0, 0) + param.BatchStockPublishDto = nil } } - if len(failedList) > 0 { - err = nil - } + return failedList, err } -func mtwmSkuStatus2Jx(mtwmSkuStatus int) (jxSkuStatus int) { - if mtwmSkuStatus == mtwmapi.SellStatusOnline { +func taoSkuStatus2Jx(taoSkuStatus int) (jxSkuStatus int) { + if taoSkuStatus == tao_vegetable.CreateIsOnline { jxSkuStatus = model.SkuStatusNormal } else { jxSkuStatus = model.SkuStatusDontSale @@ -572,97 +542,109 @@ func mtwmSkuStatus2Jx(mtwmSkuStatus int) (jxSkuStatus int) { return jxSkuStatus } +// GetStoreSkusFullInfo 获取淘先达平台商品,由于参数商品id必填作为参数,storeSkuList不能为空,且skuCode最大长度为20 func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) { - if len(storeSkuList) == 1 { - skuInfo, err := getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID).RetailGet(vendorStoreID, utils.Int2Str(storeSkuList[0].SkuID)) + if len(storeSkuList) == model.NO { + return nil, fmt.Errorf("淘鲜达获取门店商品需要参数商品id") + } + var storeSkuMap map[string]*partner.StoreSkuInfo + api := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID) + + if storeSkuList != nil { + storeSkuMap = putils.StoreSkuList2MapByVendorSkuID(storeSkuList) + } + + skuCodeList := make([]string, 0, len(storeSkuList)) + for _, v := range storeSkuList { + skuCodeList = append(skuCodeList, utils.Int2Str(v.SkuID)) + } + + forCount := len(storeSkuList) / tao_vegetable.MAXHandleCount + maxIndex := len(storeSkuList) % tao_vegetable.MAXHandleCount + if maxIndex != model.NO { + forCount += model.YES + } + + for i := 1; i <= forCount; i++ { + // todo 待优化获取速度 + data := &request585.AlibabaWdkSkuQueryRequest{ + Param: &domain585.AlibabaWdkSkuQuerySkuQueryDo{ + OuCode: &vendorStoreID, + }, + } + if forCount == i { + data.Param.SetSkuCodes(skuCodeList[(i-1)*tao_vegetable.MAXHandleCount : len(skuCodeList)]) + } else { + data.Param.SetSkuCodes(skuCodeList[(i-1)*tao_vegetable.MAXHandleCount : i*tao_vegetable.MAXHandleCount]) + } + + result, err := api.QueryStoreSKu(data) if err != nil { return nil, err } - if skuName := vendorSku2Jx(skuInfo); skuName != nil { - skuNameList = append(skuNameList, skuName) - } - } else { - var storeSkuMap map[string]*partner.StoreSkuInfo - if storeSkuList != nil { - storeSkuMap = putils.StoreSkuList2MapByVendorSkuID(storeSkuList) - } - mtapi := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID) - for { - // todo 待优化获取速度 - result, err := mtapi.RetailList(vendorStoreID, len(skuNameList), mtwmapi.GeneralMaxLimit) - if err != nil { - return nil, err - } - if storeSkuMap == nil { - skuNameList = append(skuNameList, vendorSkuList2Jx(result)...) - } else { - for _, v := range result { - if storeSkuMap[v.AppFoodCode] != nil { - if skuName := vendorSku2Jx(v); skuName != nil { - skuNameList = append(skuNameList, skuName) - } + if storeSkuMap == nil { + skuNameList = append(skuNameList, vendorSkuList2Jx(result)...) + } else { + for _, v := range *result { + if storeSkuMap[*v.Model.SkuCode] != nil { + if skuName := vendorSku2Jx(v.Model); skuName != nil { + skuNameList = append(skuNameList, skuName) } } } - if len(result) < mtwmapi.GeneralMaxLimit { - break - } } } return skuNameList, err } -func vendorSku2Jx(appFood *mtwmapi.AppFood) (skuName *partner.SkuNameInfo) { - if len(appFood.SkuList) == 0 { +// vendorSku2Jx 淘鲜达商品解析到京西 +func vendorSku2Jx(appFood *domain585.AlibabaWdkSkuQuerySkuDo) (skuName *partner.SkuNameInfo) { + if &appFood == nil { return nil } - prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(appFood.Name) - vendorSku := appFood.SkuList[0] - weight := int(utils.Str2Int64WithDefault(vendorSku.Weight, 0)) + + prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(*appFood.SkuName) + weight := int(utils.Str2Int64WithDefault(*appFood.Weight, 0)) if weight <= 0 { weight = jxutils.FormatSkuWeight(specQuality, specUnit) } - skuID := int(utils.Str2Int64WithDefault(vendorSku.SkuID, 0)) + skuID := int(utils.Str2Int64WithDefault(*appFood.SkuCode, 0)) skuName = &partner.SkuNameInfo{ - NameID: int(utils.Str2Int64WithDefault(appFood.AppFoodCode, 0)), - VendorNameID: appFood.AppFoodCode, - UPC: appFood.SkuList[0].Upc, + NameID: int(utils.Str2Int64WithDefault(*appFood.SkuCode, 0)), + VendorNameID: *appFood.ProducerName, + UPC: *appFood.Barcodes, Prefix: prefix, Name: name, Unit: unit, - Status: mtwmSkuStatus2Jx(appFood.IsSoldOut), //此处为之前一个bug 如果吧状态放到切片内层 对于内层函数中映射无法关联 永远获取到的初始值为0 + Status: taoSkuStatus2Jx(int(*appFood.OnlineSaleFlag)), SkuList: []*partner.SkuInfo{ &partner.SkuInfo{ StoreSkuInfo: partner.StoreSkuInfo{ - VendorSkuID: vendorSku.SkuID, + VendorSkuID: utils.Int2Str(skuID), SkuID: skuID, - IsSpecialty: appFood.IsSpecialty, - Stock: int(utils.Str2Int64WithDefault(vendorSku.Stock, partner.UnlimitedStoreSkuStock)), - VendorPrice: jxutils.StandardPrice2Int(utils.Str2Float64WithDefault(vendorSku.Price, 0)), - Status: mtwmSkuStatus2Jx(appFood.IsSoldOut), + IsSpecialty: 0, // 是否为力荐商品(淘宝没返回) + Stock: partner.UnlimitedStoreSkuStock, // 淘宝没返回 + VendorPrice: jxutils.StandardPrice2Int(utils.Str2Float64WithDefault(*appFood.SalePrice, 0) * (utils.Str2Float64WithDefault(*appFood.Weight, 0) / float64(1000))), + Status: taoSkuStatus2Jx(int(*appFood.OnlineSaleFlag)), }, - SkuName: appFood.Name, + SkuName: *appFood.SkuName, Comment: comment, SpecQuality: float64(specQuality), SpecUnit: specUnit, Weight: weight, }, }, - PictureList: appFood.PictureList, + PictureList: utils.Interface2StringList(*appFood.SkuPicUrls), } - if appFood.CategoryName != "" { - // todo, 因为当前我们用的是分类名操作这种方式,所以要返回分类名(而不是分类code) - skuName.VendorCatIDList = []string{appFood.CategoryName} - if appFood.SecondaryCategoryName != "" { - skuName.VendorCatIDList = append(skuName.VendorCatIDList, appFood.SecondaryCategoryName) - } + if appFood.CategoryCode != nil { + skuName.VendorCatIDList = []string{} } return skuName } -func vendorSkuList2Jx(appFoodList []*mtwmapi.AppFood) (skuNameList []*partner.SkuNameInfo) { - for _, appFood := range appFoodList { - if skuName := vendorSku2Jx(appFood); skuName != nil { +func vendorSkuList2Jx(appFoodList *[]domain585.AlibabaWdkSkuQueryApiResult) (skuNameList []*partner.SkuNameInfo) { + for _, appFood := range *appFoodList { + if skuName := vendorSku2Jx(appFood.Model); skuName != nil { skuNameList = append(skuNameList, skuName) } } @@ -673,12 +655,16 @@ func (p *PurchaseHandler) GetSensitiveWordRegexp() *regexp.Regexp { return sensitiveWordRegexp } -//美团api返回 -func SelectStoreSkuListByFoodList(storeSkuList interface{}, foodList []*mtwmapi.AppFoodResult, storeID int, vendorName, syncType string) (selectedStoreSkuList []*partner.StoreSkuInfoWithErr) { +// SelectStoreSkuListByFoodList 淘宝批量返回 +func SelectStoreSkuListByFoodList(storeSkuList interface{}, foodList []tao_vegetable.VegetableResultList, storeID int, vendorName, syncType string) (selectedStoreSkuList []*partner.StoreSkuInfoWithErr, successMap map[string]string) { foodMap := make(map[string]string) if len(foodList) > 0 { for _, v := range foodList { - foodMap[v.AppFoodCode] = v.ErrorMsg + if v.ProductID == "" { + foodMap[v.SkuID] = v.ErrMsg + } else { + successMap[v.SkuID] = v.ProductID + } } if storeSkuLists, ok := storeSkuList.([]*partner.StoreSkuInfo); ok { for _, v := range storeSkuLists { @@ -717,7 +703,7 @@ func SelectStoreSkuListByFoodList(storeSkuList interface{}, foodList []*mtwmapi. } } } - return selectedStoreSkuList + return selectedStoreSkuList, successMap } func (p *PurchaseHandler) CreateStoreSkusAct(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { @@ -737,25 +723,41 @@ func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode strin return cancelOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(model.SyncFlagDeletedMask, vendorStoreID, storeSkuList)) } +// UpdateStoreSkusSpecTag 更新限购 func (p *PurchaseHandler) UpdateStoreSkusSpecTag(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) { - var foodDataList = []map[string]interface{}{} - for _, v := range storeSkuList { - var foodData = make(map[string]interface{}) - if v.IsSpecialty == -1 { - v.IsSpecialty = 0 + var errList = make([]string, 0, 0) + param := &request585.AlibabaWdkSkuUpdateRequest{} + updateSkuList := make([]domain585.AlibabaWdkSkuUpdateSkuDo, 0, 0) + api := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID) + for index, v := range storeSkuList { + updateSku := domain585.AlibabaWdkSkuUpdateSkuDo{ + OuCode: utils.String2Pointer(vendorStoreID), + SkuCode: utils.String2Pointer(utils.Int2Str(v.SkuID)), } - foodData["is_specialty"] = v.IsSpecialty - foodData["app_food_code"] = v.SkuID - foodDataList = append(foodDataList, foodData) - } - if globals.EnableMtwmStoreWrite { - if len(foodDataList) == 1 { - err = getAPI(vendorOrgCode, storeID, vendorStoreID).RetailInitData(ctx.GetTrackInfo(), vendorStoreID, utils.Int2Str(storeSkuList[0].SkuID), foodDataList[0]) - } else if len(foodDataList) > 0 { - _, err = getAPI(vendorOrgCode, storeID, vendorStoreID).RetailBatchInitData(ctx.GetTrackInfo(), vendorStoreID, foodDataList) + if v.IsSpecialty <= model.YES { + updateSku.PurchaseQuantity = utils.Int64ToPointer(model.YES) + } else { + updateSku.PurchaseQuantity = utils.Int64ToPointer(int64(v.IsSpecialty)) + } + updateSkuList = append(updateSkuList, updateSku) + + if (index+model.YES)%tao_vegetable.MAXHandleCount == model.NO || (index+1) == len(storeSkuList) { + param.ParamList = &updateSkuList + result, err := api.UpdateStoreSku(param) + if err != nil { + globals.SugarLogger.Debugf("UpdateStoreSku Tao Vegetable err : %s", err.Error()) + } + // 记录失败的同步数据 + for _, v := range *result { + if v.ErrMsg != "" { + errList = append(errList, v.ErrMsg) + } + } + param.ParamList = nil + updateSkuList = make([]domain585.AlibabaWdkSkuUpdateSkuDo, 0, 0) } } - return err + return fmt.Errorf("%s", strings.Join(errList, ",")) } func (p *PurchaseHandler) GetSkuCategoryIdByName(vendorOrgCode, skuName string) (vendorCategoryId string, err error) { diff --git a/business/partner/purchase/tao_vegetable/store_sku2_test.go b/business/partner/purchase/tao_vegetable/store_sku2_test.go index ceac4aa69..c28089693 100644 --- a/business/partner/purchase/tao_vegetable/store_sku2_test.go +++ b/business/partner/purchase/tao_vegetable/store_sku2_test.go @@ -1,4 +1,4 @@ -package mtwm +package tao_vegetable import ( "testing" diff --git a/business/partner/purchase/tao_vegetable/store_sku_test.go b/business/partner/purchase/tao_vegetable/store_sku_test.go deleted file mode 100644 index c702627c6..000000000 --- a/business/partner/purchase/tao_vegetable/store_sku_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package mtwm - -import ( - "testing" - - "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" - // _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" -) - -// func TestSyncStoreCategory(t *testing.T) { -// hint, err := CurPurchaseHandler.SyncStoreCategory(jxcontext.AdminCtx, nil, testShopID, false) -// if err != nil { -// t.Fatal(err) -// } -// t.Log(hint) -// } - -// func TestSyncLocalStoreCategory(t *testing.T) { -// hint, err := CurPurchaseHandler.SyncLocalStoreCategory(jxcontext.AdminCtx, nil, testShopID, true, nil) -// if err != nil { -// t.Fatal(err) -// } -// t.Log(hint) -// } - -// func TestSyncStoreSkus(t *testing.T) { -// hint, err := CurPurchaseHandler.SyncStoreSkus(jxcontext.AdminCtx, nil, testShopID, nil, false, true) -// if err != nil { -// t.Fatal(err) -// } -// t.Log(hint) -// } - -func TestDeleteRemoteSkus(t *testing.T) { - err := CurPurchaseHandler.DeleteStoreAllSkus(jxcontext.AdminCtx, nil, testShopID, testShopVendorID, true) - if err != nil { - t.Fatal(err) - } -} - -func TestDeleteRemoteCategories(t *testing.T) { - err := CurPurchaseHandler.DeleteStoreAllCategories(jxcontext.AdminCtx, nil, testShopID, testShopVendorID, true) - if err != nil { - t.Fatal(err) - } -} diff --git a/business/partner/purchase/tao_vegetable/store_test.go b/business/partner/purchase/tao_vegetable/store_test.go deleted file mode 100644 index 5ae7129fa..000000000 --- a/business/partner/purchase/tao_vegetable/store_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package mtwm - -import ( - "testing" - - "git.rosy.net.cn/baseapi/platformapi/mtwmapi" - "git.rosy.net.cn/baseapi/utils" - // _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" -) - -//func TestReadStore(t *testing.T) { -// store, err := CurPurchaseHandler.ReadStore(jxcontext.AdminCtx, "", "4351018") -// if err != nil { -// t.Fatal(err) -// } -// t.Log(utils.Format4Output(store, false)) -//} - -func TestUpdateStore(t *testing.T) { - err := CurPurchaseHandler.UpdateStore(nil, 100002, "test") - if err != nil { - t.Fatal(err) - } -} - -func TestConstrainOpTimeList(t *testing.T) { - timeList := constrainOpTimeList([]int16{830, 1800}, []int16{ - 0, - 200, - 930, - 1700, - }) - t.Log(utils.Format4Output(timeList, false)) - if timeList[0] != 930 || timeList[1] != 1700 { - t.Fatal("constrainOpTimeList failed") - } -} - -func TestGetOpTimeListFromErr(t *testing.T) { - err := utils.NewErrorIntCode("当前配送营业时间为:07:00~24:00", mtwmapi.ErrCodeOpFailed) - list := getOpTimeListFromErr(err) - t.Log(list) -} diff --git a/business/partner/purchase/tao_vegetable/tao.go b/business/partner/purchase/tao_vegetable/tao.go index a537ebf64..b1970e1c5 100644 --- a/business/partner/purchase/tao_vegetable/tao.go +++ b/business/partner/purchase/tao_vegetable/tao.go @@ -1,4 +1,4 @@ -package mtwm +package tao_vegetable import ( "fmt" @@ -6,8 +6,6 @@ import ( "strings" "sync" - "git.rosy.net.cn/jx-callback/business/model/dao" - "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -32,7 +30,7 @@ type PurchaseHandler struct { } func init() { - if api.MtwmAPI != nil || api.Mtwm2API != nil { + if api.TaoVegetableApi != nil { CurPurchaseHandler = New() partner.RegisterPurchasePlatform(CurPurchaseHandler) } @@ -148,11 +146,11 @@ func bizStatusJX2Mtwm(status int) (openLevel, online int) { return mtwmapi.PoiOpenLevelNormal, mtwmapi.PoiStatusOnline } -func skuStatusJX2Mtwm(status int) int { +func skuStatusJX2Tao(status int) int64 { if status == model.SkuStatusNormal { - return mtwmapi.SellStatusOnline + return tao_vegetable.CreateOnlineSaleFlag } - return mtwmapi.SellStatusOffline + return tao_vegetable.CreateOfflineSaleFlag } func (p *PurchaseHandler) UploadImg(ctx *jxcontext.Context, vendorOrgCode, imgURL string, imgData []byte, imgName string, imgType int) (imgHint string, err error) { @@ -215,23 +213,15 @@ func getAPI(appOrgCode string, storeID int, vendorStoreID string) (apiObj *tao_v if appOrgCode == "" { globals.SugarLogger.Debugf("getAPI appOrgCode is empty") } - apiObj = partner.CurAPIManager.GetAPI(model.VendorIDTaoVegetable, appOrgCode).(*tao_vegetable.API) - var storeDetail *dao.StoreDetail - if storeID != model.NO { - storeDetail, _ = dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDTaoVegetable, appOrgCode) - } else if vendorStoreID != "" { - storeDetail, _ = dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, model.VendorIDTaoVegetable, appOrgCode) - } - if storeDetail != nil { - apiObj.SetToken(storeDetail.MtwmToken) - } + //apiObj = partner.CurAPIManager.GetAPI(model.VendorIDTaoVegetable, appOrgCode).(*tao_vegetable.API) + //var storeDetail *dao.StoreDetail + //if storeID != model.NO { + // storeDetail, _ = dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDTaoVegetable, appOrgCode) + //} else if vendorStoreID != "" { + // storeDetail, _ = dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, model.VendorIDTaoVegetable, appOrgCode) + //} + //if storeDetail != nil { + // apiObj.SetToken(storeDetail.MtwmToken) + //} return apiObj } - -// -//func getAPIWithoutToken(appOrgCode string) (apiObj *mtwmapi.API) { -// if appOrgCode == "" { -// globals.SugarLogger.Warnf("getAPI appOrgCode is empty") -// } -// return partner.CurAPIManager.GetAPI(model.VendorIDTaoVegetable, appOrgCode).(*mtwmapi.API) -//} diff --git a/business/partner/purchase/tao_vegetable/tao_test.go b/business/partner/purchase/tao_vegetable/tao_test.go deleted file mode 100644 index 63e957774..000000000 --- a/business/partner/purchase/tao_vegetable/tao_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package mtwm - -import ( - "fmt" - "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/model/dao" - "net/url" - "testing" - "time" - - "git.rosy.net.cn/baseapi/platformapi/mtwmapi" - "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/partner" -) - -func TestOnFinancialMsg(t *testing.T) { - msg := &mtwmapi.CallbackMsg{ - Cmd: "orderRefund", - FormData: url.Values{}, - } - msg.FormData.Set("timestamp", utils.Int64ToStr(time.Now().Unix())) - msg.FormData.Set("order_id", "33762863167364867") - msg.FormData.Set("notify_type", "agree") - msg.FormData.Set("money", "23.56") - food := []map[string]interface{}{ - map[string]interface{}{ - "app_food_code": "123", - "food_name": "商品1", - "sku_id": "123", - "refund_price": 3.14, - "count": 2, - "box_num": 1, - "box_price": 1, - }, - map[string]interface{}{ - "app_food_code": "124", - "food_name": "商品2", - "sku_id": "124", - "refund_price": 3.15, - "count": 2, - "box_num": 1, - "box_price": 1, - }, - } - msg.FormData.Set("food", string(utils.MustMarshal(food))) - res := CurPurchaseHandler.onAfsOrderMsg(msg) - fmt.Println(res) -} - -func TestOnOrderDetail(t *testing.T) { - result := map[string]interface{}{ - "app_order_code": "", "app_poi_code": "2828472", "avg_send_time": 2410, "backup_recipient_phone": "[\"13164714130_7645\"]", "caution": " 【如遇缺货】: 缺货时电话与我沟通 收餐人隐私号 13049813276_5307,手机号 139****5027", "city_id": 440300, "ctime": 1555036346, "day_seq": 1, "delivery_time": 0, "detail": "[{\"app_food_code\":\"27262\",\"box_num\":0,\"box_price\":0,\"cart_id\":0,\"food_discount\":1,\"food_name\":\"红管鱿鱼约250g/份\",\"food_property\":\"\",\"price\":23.54,\"quantity\":1,\"sku_id\":\"27262\",\"spec\":\"250g\",\"unit\":\"份\"},{\"app_food_code\":\"24987\",\"box_num\":0,\"box_price\":0,\"cart_id\":0,\"food_discount\":1,\"food_name\":\"带皮猪梅花肉约250g/份\",\"food_property\":\"\",\"price\":15.84,\"quantity\":1,\"sku_id\":\"24987\",\"spec\":\"250g\",\"unit\":\"份\"},{\"app_food_code\":\"27179\",\"box_num\":0,\"box_price\":0,\"cart_id\":0,\"food_discount\":1,\"food_name\":\"[畅销]龙骨约250g/份\",\"food_property\":\"\",\"price\":18.59,\"quantity\":1,\"sku_id\":\"27179\",\"spec\":\"250g\",\"unit\":\"份\"}]", "dinners_number": 0, "expect_deliver_time": 0, "extras": "[{\"act_detail_id\":664795195,\"mt_charge\":0,\"poi_charge\":5,\"reduce_fee\":5,\"remark\":\"满46.0元减5.0元\",\"type\":2},{\"act_detail_id\":665051798,\"mt_charge\":0,\"poi_charge\":4,\"reduce_fee\":4,\"remark\":\"减配送费4.0元\",\"type\":25},{\"act_detail_id\":274839715,\"mt_charge\":0.5,\"poi_charge\":0,\"reduce_fee\":0.5,\"remark\":\"用户使用了支付红包减0.5元\",\"type\":9},{\"mt_charge\":0,\"poi_charge\":0,\"reduce_fee\":0,\"remark\":\"送30元商家代金券\",\"type\":100},{}]", "has_invoiced": 0, "invoice_title": "", "is_favorites": false, "is_poi_first_order": true, "is_pre": 0, "is_third_shipping": 0, "latitude": 22.530194, "logistics_code": "1001", "longitude": 114.08372, "order_id": 28284722536001020, "order_send_time": 1555036356, "original_price": 63.97, "package_bag_money": 0, "pay_type": 2, "pick_type": 0, "poi_receive_detail": "{\"actOrderChargeByMt\":[{\"comment\":\"活动款\",\"feeTypeDesc\":\"活动款\",\"feeTypeId\":10019,\"moneyCent\":50}],\"actOrderChargeByPoi\":[{\"comment\":\"满46.0元减5.0元\",\"feeTypeDesc\":\"活动款\",\"feeTypeId\":10019,\"moneyCent\":500},{\"comment\":\"减配送费4.0元\",\"feeTypeDesc\":\"活动款\",\"feeTypeId\":10019,\"moneyCent\":400}],\"foodShareFeeChargeByPoi\":490,\"logisticsFee\":600,\"onlinePayment\":5447,\"wmPoiReceiveCent\":4406}", "recipient_address": "汇港名苑 (南2区1005)@#广东省深圳市福田区滨河大道滨河大道3119号汇港名苑", "recipient_name": "颜(女士)", "recipient_phone": "13049813276_5307", "remark": "", "result": "ok", "shipper_phone": "", "shipping_fee": 6, "shipping_type": 0, "source_id": 3, "status": 2, "taxpayer_id": "", "total": 54.47, "utime": 1555036346, "wm_order_id_view": 28284722536001020, "wm_poi_address": "深圳市福田区南园街道南华社区滨河路2037号下小庙南区70栋101号滨河街市场", "wm_poi_id": 2828472, "wm_poi_name": "京西菜市(华强南店)", "wm_poi_phone": "13724313878", - } - err := new(PurchaseHandler).OnOrderDetail(result, partner.CreatedPeration) - fmt.Println(err) -} - -func TestName(t *testing.T) { - store, err := dao.GetStoreDetailByVendorStoreID(dao.GetDB(), "1", model.VendorIDMTWM, "1") - fmt.Println(store) - fmt.Println(err) - -} diff --git a/business/partner/purchase/tao_vegetable/waybill.go b/business/partner/purchase/tao_vegetable/waybill.go index 01be0cf0e..f98ad8fd9 100644 --- a/business/partner/purchase/tao_vegetable/waybill.go +++ b/business/partner/purchase/tao_vegetable/waybill.go @@ -1,10 +1,8 @@ -package mtwm +package tao_vegetable import ( "git.rosy.net.cn/baseapi/platformapi/mtwmapi" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/partner" ) var ( @@ -27,37 +25,33 @@ func (p *PurchaseHandler) GetWaybillStatusFromVendorStatus(vendorStatus string) } func (c *PurchaseHandler) onWaybillMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) { - waybill := c.callbackMsg2Waybill(msg) - err := partner.CurOrderManager.OnWaybillStatusChanged(waybill) - if err == nil && waybill.Status == model.WaybillStatusDelivering { - c.postFakeMsg(waybill.VendorOrderID, FakeMsgType, mtwmapi.OrderStatusDelivering) - } - return mtwmapi.Err2CallbackResponse(err, "") + //waybill := c.callbackMsg2Waybill(msg) + //err := partner.CurOrderManager.OnWaybillStatusChanged(waybill) + //if err == nil && waybill.Status == model.WaybillStatusDelivering { + // c.postFakeMsg(waybill.VendorOrderID, FakeMsgType, mtwmapi.OrderStatusDelivering) + //} + //return mtwmapi.Err2CallbackResponse(err, "") + return nil } func (c *PurchaseHandler) callbackMsg2Waybill(msg *mtwmapi.CallbackMsg) (retVal *model.Waybill) { - orderID := GetOrderIDFromMsg(msg) - vendorStatus := msg.FormData.Get("logistics_status") - retVal = &model.Waybill{ - VendorOrderID: orderID, - OrderVendorID: model.VendorIDMTWM, - VendorWaybillID: orderID, - WaybillVendorID: model.VendorIDMTWM, - CourierName: msg.FormData.Get("dispatcher_name"), - CourierMobile: msg.FormData.Get("dispatcher_mobile"), - VendorStatus: vendorStatus, - Status: c.GetWaybillStatusFromVendorStatus(vendorStatus), - StatusTime: getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("time"))), - Remark: "", - VendorOrgCode: msg.AppID, - } - if retVal.StatusTime == utils.DefaultTimeValue { - retVal.StatusTime = getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("timestamp"))) - } - - //if vendorStatus == "4" || vendorStatus == "8" { // 4:美团推送已经(确认骑手)订单 8:美团推送(骑手完成)订单 - // retVal.DesiredFee = utils.Float64TwoInt64(utils.Str2Float64WithDefault(msg.FormData.Get("shipping_fee"), 0)) // 订单优惠前的总费用 - // partner.CurOrderManager + //orderID := GetOrderIDFromMsg(msg) + //vendorStatus := msg.FormData.Get("logistics_status") + //retVal = &model.Waybill{ + // VendorOrderID: orderID, + // OrderVendorID: model.VendorIDMTWM, + // VendorWaybillID: orderID, + // WaybillVendorID: model.VendorIDMTWM, + // CourierName: msg.FormData.Get("dispatcher_name"), + // CourierMobile: msg.FormData.Get("dispatcher_mobile"), + // VendorStatus: vendorStatus, + // Status: c.GetWaybillStatusFromVendorStatus(vendorStatus), + // StatusTime: getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("time"))), + // Remark: "", + // VendorOrgCode: msg.AppID, + //} + //if retVal.StatusTime == utils.DefaultTimeValue { + // retVal.StatusTime = getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("timestamp"))) //} return retVal diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go index a5045bfb9..67d7542ff 100644 --- a/business/partner/purchase/tiktok_store/order.go +++ b/business/partner/purchase/tiktok_store/order.go @@ -119,6 +119,7 @@ func (p *PurchaseHandler) getOrder(vendorOrgCode, vendorOrderID, vendorStoreID s if result.UserIdInfo != nil { order.VendorUserID = result.UserIdInfo.IdCardNo } + originalLng := utils.MustInterface2Float64(result.UserCoordinate.UserCoordinateLongitude) originalLat := utils.MustInterface2Float64(result.UserCoordinate.UserCoordinateLatitude) order.ConsigneeLng = jxutils.StandardCoordinate2Int(originalLng) @@ -545,24 +546,6 @@ func (c *PurchaseHandler) postFakeMsg(vendorOrderID, cmd, VendorStatus, appOrgCo // AcceptOrRefuseOrder 接单或者拒单(isAcceptIt:接单/拒单) 抖店暂无拒单 func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) { - //if isAcceptIt { - // if globals.EnableMtwmStoreWrite { - // err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").OrderConfirm(utils.Str2Int64(order.VendorOrderID)) - // if err != nil { - // if utils.IsErrMatch(err, utils.Int2Str(mtwmapi.ErrCodeOpFailed), []string{ - // "订单已经确认过了", - // }) { - // err = nil - // } else { - // globals.SugarLogger.Warnf("mtwm AcceptOrRefuseOrder orderID:%s failed with err:%v", order.VendorOrderID, err) - // } - // } - // } - //} else { - // if globals.EnableMtwmStoreWrite { - // err = c.CancelOrder(jxcontext.AdminCtx, order, "bu") - // } - //} return err } diff --git a/business/partner/purchase/tiktok_store/order_afs_utils.go b/business/partner/purchase/tiktok_store/order_afs_utils.go index 2039479e4..e7f6396c1 100644 --- a/business/partner/purchase/tiktok_store/order_afs_utils.go +++ b/business/partner/purchase/tiktok_store/order_afs_utils.go @@ -90,11 +90,11 @@ func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal * VendorOrgCode: utils.Int2Str(vendorOrgCode), } afsOrder.FreightUserMoney = tiktokAfsOrderDetail.Data.ProcessInfo.AfterSaleInfo.RefundPostAmount - afsOrder.AfsFreightMoney = 0 // 暂时未发现退货取件费用 - afsOrder.BoxMoney = 0 // 餐盒费 - afsOrder.TongchengFreightMoney = 0 // 同城配送费 - afsOrder.SkuBoxMoney = 0 // 商品包装费 - afsOrder.VendorStatus = orderStatus.VendorStatus // 退货状态 + afsOrder.AfsFreightMoney = tiktokAfsOrderDetail.Data.ProcessInfo.AfterSaleInfo.RefundPostAmount // 暂时未发现退货取件费用 + afsOrder.BoxMoney = 0 // 餐盒费 + afsOrder.TongchengFreightMoney = 0 // 同城配送费 + afsOrder.SkuBoxMoney = 0 // 商品包装费 + afsOrder.VendorStatus = orderStatus.VendorStatus // 退货状态 for _, sku := range tiktokAfsOrderDetail.Data.OrderInfo.SkuOrderInfos { orderSku := &model.OrderSkuFinancial{ Count: int(sku.AfterSaleItemCount), diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index 2076c608b..60a99e824 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -296,6 +296,7 @@ func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode strin // return cancelOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(model.SyncFlagDeletedMask, vendorStoreID, storeSkuList)) } +// UpdateStoreSkusSpecTag 更新限购 func (p *PurchaseHandler) UpdateStoreSkusSpecTag(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) { //var foodDataList []map[string]interface{} //for _, v := range storeSkuList { diff --git a/conf/app.conf b/conf/app.conf index fde73f8a2..045b50cc1 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -156,6 +156,7 @@ storeNameMtwm = "京西菜市" storeNameEbai = "饿鲜达" storeNameEbai2 = "好菜鲜生" storeNameTiktok = "抖音小时购" +storeNameTao = "淘鲜达" smsSignName = "京西菜市" smsMobileVerifyTemplate = "SMS_175583158" diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 36c3d0008..527c19931 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -46,6 +46,7 @@ type StoreSkuController struct { // @Param jdSyncStatus query int false "京东同步标识" // @Param ebaiSyncStatus query int false "饿百同步标识" // @Param mtwmSyncStatus query int false "美团外卖同步标识" +// @Param taoSyncStatus query int false "淘先达同步标识" // @Param lockTime query string false "价格锁定时间" // @Success 200 {object} controllers.CallResult // @Failure 200 {object} controllers.CallResult @@ -88,6 +89,7 @@ func (c *StoreSkuController) GetStoreSkus() { // @Param jdSyncStatus query int false "京东同步标识" // @Param ebaiSyncStatus query int false "饿百同步标识" // @Param mtwmSyncStatus query int false "美团外卖同步标识" +// @Param taoSyncStatus query int false "陶先达同步标识" // @Param lockTime query string false "价格锁定时间" // @Param isHighPrice query bool false "是否查过高价格商品,0是忽略,1是高价,-1是低价" // @Param priceType query int false "是否查过高价格商品,0是忽略,1是高价,-1是低价" diff --git a/controllers/taobao_vegetable.go b/controllers/taobao_vegetable.go index a8d6f0acd..5020c2a9f 100644 --- a/controllers/taobao_vegetable.go +++ b/controllers/taobao_vegetable.go @@ -1,7 +1,12 @@ package controllers import ( + "git.rosy.net.cn/baseapi/platformapi/tao_vegetable" + "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxstore/common" + "git.rosy.net.cn/jx-callback/business/model" + taoVegetable "git.rosy.net.cn/jx-callback/business/partner/purchase/tao_vegetable" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/server/web" @@ -13,14 +18,14 @@ type TaoBaoVegetableController struct { web.Controller } -// GetCode 淘菜菜获取商户授权code +// GetCode 淘菜菜获取商户授权code,这个code和token是门店层次的 func (c *TaoBaoVegetableController) GetCode() { codeData := "" if c.Ctx.Input.Method() == http.MethodPost { body, err := ioutil.ReadAll(c.Ctx.Request.Body) if err != nil { globals.SugarLogger.Debugf("商户收取code获取:%s,%s", string(body), err.Error()) - c.Data["json"] = MsgFail() + c.Data["json"] = tao_vegetable.CallBackResultInfo(err) c.ServeJSON() return } @@ -33,11 +38,114 @@ func (c *TaoBaoVegetableController) GetCode() { tokenInfo, err := api.TaoVegetableApi.GetStoreToken(codeData, "") if err != nil { globals.SugarLogger.Debugf("获取门店token错误:%s", err.Error()) - c.Data["json"] = MsgFail() + c.Data["json"] = tao_vegetable.CallBackResultInfo(err) c.ServeJSON() return } globals.SugarLogger.Debugf("token:%s", utils.Format4Output(tokenInfo, false)) - // 创建storeMap门店信息 - // 刷新token + + // 创建或者更新账号token + param := &model.VendorOrgCode{ + VendorID: model.VendorIDTaoVegetable, + VendorOrgCode: api.TaoVegetableApi.GetVendorOrgCode(), + Comment: tokenInfo.UserNick, + VendorType: "platform", + IsJxCat: 1, + IsOpen: 1, + EmpowerURL: "http://oauth.hemaos.com/authorize?\nresponse_type=code&sp=hema&op=topApp&client_id=" + api.TaoVegetableApi.GetVendorOrgCode(), + StoreBrandName: "自动更新(京西菜市)", + Token: utils.Format4Output(tokenInfo, false), + AppKey: api.TaoVegetableApi.GetVendorOrgCode(), + AppSecret: api.TaoVegetableApi.GetAppSecret(), + } + if err := common.AddVendorOrgCode(nil, param); err != nil { + c.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackFailCode, Msg: tiktok_api.CallbackFail} + c.ServeJSON() + return + } + + c.Data["json"] = tao_vegetable.CallBackResultInfo(nil) + c.ServeJSON() + return +} + +// OrderStatus 订单状态变化 [post] +func (c *TaoBaoVegetableController) OrderStatus() { + order, err := api.TaoVegetableApi.ReaderOrderInfo(c.Ctx.Request) + globals.SugarLogger.Debugf("OrderStatus := %s", utils.Format4Output(order, false)) + if err != nil { + globals.SugarLogger.Debugf("订单状态变化:%s", err.Error()) + c.Data["json"] = tao_vegetable.CallBackResultInfo(err) + c.ServeJSON() + return + } + + callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusChange, utils.Int64ToStr(order.BizOrderId), order) + c.Data["json"] = callbackResponse + c.ServeJSON() + return +} + +// ApplyCancelOrder 用户发起售后申请 +func (c *TaoBaoVegetableController) ApplyCancelOrder() { + afsOrder, err := api.TaoVegetableApi.UserApplyRefund(c.Ctx.Request) + globals.SugarLogger.Debugf("ApplyCancelOrder := %s", utils.Format4Output(afsOrder, false)) + if err != nil { + globals.SugarLogger.Debugf("用户发起售后:%s", err.Error()) + c.Data["json"] = tao_vegetable.CallBackResultInfo(err) + c.ServeJSON() + return + } + callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusApplyAfs, afsOrder.OutOrderId, afsOrder) + c.Data["json"] = callbackResponse + c.ServeJSON() + return +} + +// UserCancelRefund 用户取消售后 +func (c *TaoBaoVegetableController) UserCancelRefund() { + afsOrder, err := api.TaoVegetableApi.UserCancelRefundApply(c.Ctx.Request) + globals.SugarLogger.Debugf("UserCancelRefund := %s", utils.Format4Output(afsOrder, false)) + if err != nil { + globals.SugarLogger.Debugf("用户取消售后:%s", err.Error()) + c.Data["json"] = tao_vegetable.CallBackResultInfo(err) + c.ServeJSON() + return + } + callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusCancelAfs, afsOrder.OutOrderId, afsOrder) + c.Data["json"] = callbackResponse + c.ServeJSON() + return +} + +// CancelOnSaleRefundOrder 用户售中取消(走订单取消流程) +func (c *TaoBaoVegetableController) CancelOnSaleRefundOrder() { + afsOrder, err := api.TaoVegetableApi.OnSaleRefundOrder(c.Ctx.Request) + globals.SugarLogger.Debugf("CancelOnSaleRefundOrder := %s", utils.Format4Output(afsOrder, false)) + if err != nil { + globals.SugarLogger.Debugf("用户售中取消:%s", err.Error()) + c.Data["json"] = tao_vegetable.CallBackResultInfo(err) + c.ServeJSON() + return + } + callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusOnSaleCancel, utils.Int64ToStr(afsOrder.BizOrderId), afsOrder) + c.Data["json"] = callbackResponse + c.ServeJSON() + return +} + +// RefundOrderSuccess 用户售后成功通知,只有退款成功了才会通知(商户拒绝退款,不会通知) +func (c *TaoBaoVegetableController) RefundOrderSuccess() { + refundSuccess, err := api.TaoVegetableApi.RefundOrderFinish(c.Ctx.Request) + globals.SugarLogger.Debugf("RefundOrderSuccess := %s", utils.Format4Output(refundSuccess, false)) + if err != nil { + globals.SugarLogger.Debugf("用户售后成功消息通知:%s", err.Error()) + c.Data["json"] = tao_vegetable.CallBackResultInfo(err) + c.ServeJSON() + return + } + callbackResponse := taoVegetable.OnCallbackMsg(tao_vegetable.OrderStatusRefundSuccess, refundSuccess.OutSubOrderId, refundSuccess) + c.Data["json"] = callbackResponse + c.ServeJSON() + return } diff --git a/globals/api/api.go b/globals/api/api.go index db27ab9fc..1c3f208ef 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -131,7 +131,7 @@ var ( LogisticsApi *ali_logistics_query.API // 阿里云提供获取物流订单的配送信息 KuaiShouApi *kuaishou_mini.API // 快手平台 UniAppApi *uinapp.API // uinapp 消息通知 - TaoVegetableApi tao_vegetable.API // 淘菜菜 + TaoVegetableApi *tao_vegetable.API // 淘菜菜 ) func init() { diff --git a/globals/api/apimanager/apimanager.go b/globals/api/apimanager/apimanager.go index 0b7b64ed9..71af03647 100644 --- a/globals/api/apimanager/apimanager.go +++ b/globals/api/apimanager/apimanager.go @@ -93,6 +93,11 @@ func (a *APIManager) GetAppOrgCodeList(vendorID int) (appOrgCodeList []string) { for _, v := range vendorOrgCodes { appOrgCodeList = append(appOrgCodeList, v.VendorOrgCode) } + case model.VendorIDTaoVegetable: + vendorOrgCodes, _ := dao.GetVendorOrgCode(dao.GetDB(), model.VendorIDTaoVegetable, "", model.VendorOrgTypePlatform) + for _, v := range vendorOrgCodes { + appOrgCodeList = append(appOrgCodeList, v.VendorOrgCode) + } case model.VendorIDMTWM: appOrgCodeList = []string{api.MtwmAPI.GetAppID(), api.Mtwm2API.GetAppID()} case model.VendorIDEBAI: diff --git a/globals/globals.go b/globals/globals.go index d8bdf7dc0..245f73d76 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -47,6 +47,7 @@ var ( StoreNameTiktok string StoreNameEbai string StoreNameEbai2 string + StoreNameTao string SMSSignName string SMSMobileVerifyTemplate string @@ -137,6 +138,7 @@ func Init() { StoreName = web.AppConfig.DefaultString("storeName", "") StoreNameMtwm = web.AppConfig.DefaultString("storeNameMtwm", "") StoreNameTiktok = web.AppConfig.DefaultString("storeNameTiktok", "") + StoreNameTao = web.AppConfig.DefaultString("storeNameTao", "") StoreNameEbai = web.AppConfig.DefaultString("storeNameEbai", "") StoreNameEbai2 = web.AppConfig.DefaultString("storeNameEbai2", "")