From 73821c40a17e754243b24b088c335482a50a47c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Mon, 11 Mar 2024 10:09:48 +0800 Subject: [PATCH] 1 --- .../jxcallback/scheduler/defsch/defsch.go | 33 +---- business/jxstore/cms/sync.go | 115 +++++++++++++++--- business/jxstore/misc/misc.go | 2 +- business/partner/delivery/dada/waybill.go | 2 +- business/partner/delivery/fn/waybill.go | 2 +- business/partner/delivery/mtps/waybill.go | 2 +- business/partner/delivery/rider.go | 21 ++-- business/partner/delivery/sfps/waybill.go | 2 +- business/partner/delivery/uupt/waybill.go | 2 +- business/partner/im/im.go | 8 +- business/partner/purchase/ebai/callback.go | 17 ++- business/partner/purchase/ebai/ebai.go | 32 +++-- business/partner/purchase/ebai/financial.go | 41 ++++--- business/partner/purchase/ebai/order.go | 111 +++++++++++++---- business/partner/purchase/ebai/order_afs.go | 4 +- controllers/jx_order.go | 3 + 16 files changed, 276 insertions(+), 121 deletions(-) diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 2136a8ff6..1af6cc67f 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -966,7 +966,7 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf canDeliveryVendor := make(map[int64]int, 0) canDeliveryKey := make([]int64, 0, 0) for k, v := range feeList { - if excludeVendorIDsMap[k] != model.YES && v.DeliveryFee != model.NO { + if excludeVendorIDsMap[k] != model.YES && v.DeliveryFee > model.NO && v.DeliveryFee <= 5000 { // 限制配送价格 canDeliveryVendor[v.DeliveryFee] = k canDeliveryKey = append(canDeliveryKey, v.DeliveryFee) } @@ -996,37 +996,6 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf excludeVendorIDs = []int{model.VendorIDDada, model.VendorIDMTPS, model.VendorIDUUPT, model.VendorIDSFPS} vendorID = model.VendorIDFengNiao } - //storeCourierList, err := dao.GetStoreCourierList2(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, model.StoreStatusOpened, []int{model.StoreAuditStatusOnline, model.StoreAuditStatusUpdated}) - //for _, v := range storeCourierList { - // if excludeVendorIDsMap[v.VendorID] == model.YES { - // continue - // } - // if v.VendorID == model.VendorIDDada { - // excludeVendorIDs = []int{model.VendorIDFengNiao, model.VendorIDMTPS, model.VendorIDUUPT, model.VendorIDSFPS} - // vendorID = v.VendorID - // break - // } - // if v.VendorID == model.VendorIDFengNiao { - // excludeVendorIDs = []int{model.VendorIDDada, model.VendorIDMTPS, model.VendorIDUUPT, model.VendorIDSFPS} - // vendorID = v.VendorID - // break - // } - // if v.VendorID == model.VendorIDMTPS { - // excludeVendorIDs = []int{model.VendorIDDada, model.VendorIDFengNiao, model.VendorIDUUPT, model.VendorIDSFPS} - // vendorID = v.VendorID - // break - // } - // if v.VendorID == model.VendorIDUUPT { - // excludeVendorIDs = []int{model.VendorIDDada, model.VendorIDMTPS, model.VendorIDFengNiao, model.VendorIDSFPS} - // vendorID = v.VendorID - // break - // } - // if v.VendorID == model.VendorIDSFPS { - // excludeVendorIDs = []int{model.VendorIDDada, model.VendorIDMTPS, model.VendorIDUUPT, model.VendorIDFengNiao} - // vendorID = v.VendorID - // break - // } - //} if vendorID != model.NO { if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, excludeVendorIDs, false, maxDeliveryFee); err == nil { diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 4b080d6d7..92acf200a 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -215,20 +215,107 @@ func (v *VendorSync) SyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB return SyncReorderCategories(ctx, categoryID, isAsync) } -// func (v *VendorSync) oldSyncReorderCategories(ctx *jxcontext.Context, db *dao.DaoDB, categoryID int, isAsync bool, userName string) (hint string, err error) { -// hint, err = v.LoopMultiStoresVendors(ctx, db, fmt.Sprintf("分类重排序:%d", categoryID), isAsync, false, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) { -// vendorInfo := batchItemList[0].(*MultiStoreVendorInfo) -// multiStoresHandler := v.GetMultiStoreHandler(vendorInfo.VendorID) -// err2 := multiStoresHandler.ReorderCategories(db, categoryID, userName) -// if err2 == nil { -// cat := &model.SkuCategory{} -// _, err2 = dao.UpdateEntityByKV(db, cat, utils.Params2Map(dao.GetSyncStatusStructField(model.VendorNames[multiStoresHandler.GetVendorID()]), 0), utils.Params2Map(model.FieldParentID, categoryID)) -// return nil, err2 -// } -// return nil, err2 -// }) -// return "", err -// } +// SyncStore2Time 此方法只适用于定时任务同步门店 +func (v *VendorSync) SyncStore2Time(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs, storeIDs []int, mustDirty, isAsync bool) (hint string, err error) { + userName := ctx.GetUserName() + isManageIt := len(storeIDs) == 0 || len(storeIDs) > 5 + _, hint, err = v.LoopStoresMap2(ctx, nil, db, fmt.Sprintf("同步门店信息:%v", storeIDs), isAsync, isManageIt, vendorIDs, storeIDs, mustDirty, func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (resultList interface{}, err error) { + loopMapInfo := batchItemList[0].(*LoopStoreMapInfo) + var failedList []*partner.StoreSkuInfoWithErr + handler := v.GetStoreHandler(loopMapInfo.VendorID) + if handler != nil { + if len(loopMapInfo.StoreMapList) > 1 { + loopStoreTask := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[loopMapInfo.VendorID]), tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + var resultList []interface{} + var vendorStoreID string + storeMap := batchItemList[0].(*model.StoreMap) + db2 := db + if len(loopMapInfo.StoreMapList) > 1 { + db2 = dao.GetDB() + } + if storeMap.Status == model.StoreStatusDisabled { + resultList = append(resultList, 1) + } else if model.IsSyncStatusNew(storeMap.SyncStatus) { + storeDetail, _ := dao.GetStoreDetail(db, storeMap.StoreID, storeMap.VendorID, storeMap.VendorOrgCode) + if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName, nil, storeDetail); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店") + } + } else if model.IsSyncStatusDelete(storeMap.SyncStatus) { + if err = handler.DeleteStore(db2, storeMap.StoreID, userName); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "删除门店") + } + } else { + if err = handler.UpdateStore(db2, storeMap.StoreID, userName); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "更新门店") + } + } + if err == nil { + if model.IsSyncStatusNew(storeMap.SyncStatus) { + storeMap.VendorStoreID = vendorStoreID + storeMap.SyncStatus = 0 + _, err = dao.UpdateEntity(db, storeMap, "VendorStoreID", model.FieldSyncStatus) + } else { + storeMap.SyncStatus = 0 + _, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus) + } + } + return resultList, err + }, loopMapInfo.StoreMapList) + t.AddChild(loopStoreTask).Run() + resultList, err = loopStoreTask.GetResult(0) + } else { + var resultList []interface{} + db2 := db + var vendorStoreID string + storeMap := loopMapInfo.StoreMapList[0] + if model.IsSyncStatusNew(storeMap.SyncStatus) { + storeDetail, _ := dao.GetStoreDetail(db, storeMap.StoreID, storeMap.VendorID, storeMap.VendorOrgCode) + if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName, nil, storeDetail); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店") + } + } else if model.IsSyncStatusDelete(storeMap.SyncStatus) { + if err = handler.DeleteStore(db2, storeMap.StoreID, userName); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "删除门店") + } + } else { + if err = handler.UpdateStore(db, storeMap.StoreID, userName); err == nil { + resultList = append(resultList, 1) + } else { + failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "更新门店") + } + } + if err == nil { + resultList = []interface{}{1} + if model.IsSyncStatusNew(storeMap.SyncStatus) { + storeMap.VendorStoreID = vendorStoreID + storeMap.SyncStatus = 0 + _, err = dao.UpdateEntity(db, storeMap, "VendorStoreID", model.FieldSyncStatus) + } else { + storeMap.SyncStatus = 0 + _, err = dao.UpdateEntity(db, storeMap, model.FieldSyncStatus) + } + } + } + err = partner.AddVendorInfo2Err(err, loopMapInfo.VendorID) + } + if len(failedList) > 0 { + t.AddFailedList(failedList) + } + return resultList, err + }, true) + return hint, makeSyncError(err) +} func (v *VendorSync) SyncStore2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs, storeIDs []int, mustDirty, isAsync bool) (hint string, err error) { userName := ctx.GetUserName() diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 5237aa155..5ae77c979 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -424,7 +424,7 @@ func Init() { }, dailyWorkTimeList) ScheduleTimerFunc("doDailyWork3", func() { dao.SetStoresMapSyncStatus(dao.GetDB(), nil, nil, model.SyncFlagStoreStatus) - cms.CurVendorSync.SyncStore2(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDMTWM, model.VendorIDJD, model.VendorIDEBAI, model.VendorIDDD}, nil, true, true) + cms.CurVendorSync.SyncStore2Time(jxcontext.AdminCtx, dao.GetDB(), []int{model.VendorIDMTWM, model.VendorIDJD, model.VendorIDEBAI, model.VendorIDDD}, nil, true, true) // 刷新门店平台商品 syncStoreSku() diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index 6607664f6..a9b788891 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -119,7 +119,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap case model.VendorIDDD: Lng, Lat, _ := partner.GetRidderPositionGetter(order.WaybillVendorID).GetRidderPosition(nil, order.VendorOrderID, order.VendorOrderID, order.VendorWaybillID, order.VendorWaybillID2) tiktokStatusPush(order, msg.OrderStatus, utils.Float64ToStr(Lng), utils.Float64ToStr(Lat), goodsOrder.VendorOrgCode) - case model.VendorIDMTWM, model.VendorIDTaoVegetable: + case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI: delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 if goodsOrder.VendorID == model.VendorIDTaoVegetable && msg.OrderStatus == dadaapi.OrderStatusAccepted { tao_vegetable.PushDelivererChangeInfo(goodsOrder, order, tao.TaoDeliveryTypeDD) diff --git a/business/partner/delivery/fn/waybill.go b/business/partner/delivery/fn/waybill.go index caf8e6994..674861e22 100644 --- a/business/partner/delivery/fn/waybill.go +++ b/business/partner/delivery/fn/waybill.go @@ -323,7 +323,7 @@ func OnWaybillMsg(msg *fnpsapi.OrderStatusNottify, resultParam *fnpsapi.ShortSta case model.VendorIDDD: Lng, Lat, _ := partner.GetRidderPositionGetter(order.WaybillVendorID).GetRidderPosition(nil, order.VendorOrderID, order.VendorOrderID, order.VendorWaybillID, order.VendorWaybillID2) tiktokStatusPush(order, orderStatus, utils.Float64ToStr(Lng), utils.Float64ToStr(Lat), good.VendorOrgCode) - case model.VendorIDMTWM, model.VendorIDTaoVegetable: + case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI: delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 if good.VendorID == model.VendorIDTaoVegetable && cc.OrderStatus == fnpsapi.OrderStatusAssigned { tao_vegetable.PushDelivererChangeInfo(good, order, tao.TaoDeliveryTypeFN) diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index 60e6b9b1d..aac400d75 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -143,7 +143,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m case model.VendorIDDD: Lng, Lat, _ := partner.GetRidderPositionGetter(order.WaybillVendorID).GetRidderPosition(nil, order.VendorOrderID, order.VendorOrderID, order.VendorWaybillID, order.VendorWaybillID2) pushMTPSToTiktok(msg.Status, order, utils.Float64ToStr(Lng), utils.Float64ToStr(Lat), goodsOrder.VendorOrgCode) - case model.VendorIDMTWM, model.VendorIDTaoVegetable: + case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI: delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 if goodsOrder.VendorID == model.VendorIDTaoVegetable && msg.Status == mtpsapi.OrderStatusAccepted { tao_vegetable.PushDelivererChangeInfo(goodsOrder, order, tao.TaoDeliveryTypeMT) diff --git a/business/partner/delivery/rider.go b/business/partner/delivery/rider.go index 41c3a22d0..7cc8f8bbf 100644 --- a/business/partner/delivery/rider.go +++ b/business/partner/delivery/rider.go @@ -19,6 +19,7 @@ import ( "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" + "git.rosy.net.cn/jx-callback/business/partner/purchase/ebai" "git.rosy.net.cn/jx-callback/business/partner/purchase/mtwm" "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" @@ -97,12 +98,6 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { //3.当同一个订单已经上传了一次配送信息,如再次同步会更新配送信息,以最新的一次为准。 //4.如订单已完成、已取消等状态发货将失败。 for _, v := range orders { - //if orderId == "" { // 订单id为空是,是定时轮询操作,不做此状态 - // waybillList, _ := dao.GetWaybills(db, v.VendorOrderID, nil) - // if len(waybillList) > 0 && waybillList[0].Status > model.WaybillStatusEndBegin { - // continue - // } - //} if v.Status >= model.OrderStatusEndBegin { continue } @@ -176,7 +171,7 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { default: continue } - // 有时候运单状态改变之后但是上面的订单状态还没来得及改变,这里覆盖一下 + // 有时候运单状态改变之后但是上面的订单状态还没来得及改变,这里覆盖一下(riderInfo.LogisticsStatus 美团状态为准) if wayBillStatus != model.NO { switch wayBillStatus { case 5: // 呼叫骑手 @@ -238,7 +233,17 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { case model.VendorIDELM: // 饿了么 continue case model.VendorIDEBAI: // 饿百发单 - continue + 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.Debugf("Error pushing ebai rider information :%s--%s--%v", v.VendorOrderID, utils.Format4Output(riderInfo, false), err) + } + } + } else { + if err := ebai.OrderStatussync(utils.Struct2Map(riderInfo, "", true)); err != nil { + globals.SugarLogger.Debugf("Error pushing ebai OrderStatussync information :%s--%s--%v", v.VendorOrderID, utils.Format4Output(riderInfo, false), err) + } + } case model.VendorIDJD: // 京东发单 continue case model.VendorIDGD: // 美团发单 diff --git a/business/partner/delivery/sfps/waybill.go b/business/partner/delivery/sfps/waybill.go index fca99fac5..9dd520588 100644 --- a/business/partner/delivery/sfps/waybill.go +++ b/business/partner/delivery/sfps/waybill.go @@ -460,7 +460,7 @@ func OnWaybillMsg(urlIndex string, msg interface{}) (resp *sfps2.CallbackRespons case model.VendorIDDD: Lng, Lat, _ := partner.GetRidderPositionGetter(order.WaybillVendorID).GetRidderPosition(nil, order.VendorOrderID, order.VendorOrderID, order.VendorWaybillID, order.VendorWaybillID2) tiktokStatusPush(order, orderStatus, utils.Float64ToStr(Lng), utils.Float64ToStr(Lat), goodsOrder.VendorOrgCode) - case model.VendorIDTaoVegetable, model.VendorIDMTWM: + case model.VendorIDTaoVegetable, model.VendorIDMTWM, model.VendorIDEBAI: delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 if goodsOrder.VendorID == model.VendorIDTaoVegetable && orderStatus == sfps2.OrderStatusTakeOrder { tao_vegetable.PushDelivererChangeInfo(goodsOrder, order, tao.TaoDeliveryTypeSF) diff --git a/business/partner/delivery/uupt/waybill.go b/business/partner/delivery/uupt/waybill.go index ebf5b6a85..620eef6ec 100644 --- a/business/partner/delivery/uupt/waybill.go +++ b/business/partner/delivery/uupt/waybill.go @@ -440,7 +440,7 @@ func OnWaybillMsg(req *uuptapi.WaybillCallbackParam) (resp *uuptapi.CallbackResp case model.VendorIDDD: Lng, Lat, _ := partner.GetRidderPositionGetter(param.WaybillVendorID).GetRidderPosition(nil, param.VendorOrderID, param.VendorOrderID, param.VendorWaybillID, param.VendorWaybillID2) tiktokStatusPush(param, req.State, utils.Float64ToStr(Lng), utils.Float64ToStr(Lat), good.VendorOrgCode) - case model.VendorIDMTWM, model.VendorIDTaoVegetable: + case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI: delivery.GetOrderRiderInfoToPlatform(param.VendorOrderID, param.Status) // 骑手位置更新 if good.VendorID == model.VendorIDTaoVegetable && req.State == uuptapi.StateRMGrabsOrder { tao_vegetable.PushDelivererChangeInfo(good, param, tao.TaoDeliveryTypeOther) diff --git a/business/partner/im/im.go b/business/partner/im/im.go index 494329827..195fcaa1a 100644 --- a/business/partner/im/im.go +++ b/business/partner/im/im.go @@ -564,6 +564,10 @@ func CheckAndReply(req *JXMsg, elmAppID string) (err error) { temp := mt //获取自定义回复模板 if template := GetCustomTemplate(utils.Int2Str(mt.AppID), mt.AppPoiCode); len(template.Template) > 0 { + // 关闭自动回复 + if template.Template == "3ASOkN9WiU3AUae2tYGChA==" { + return nil + } temp.MsgContent = template.Template } else { temp.MsgContent, err = GetDefaultTemplate(utils.Int2Str(mt.AppID), mt.AppPoiCode, VendorIDMT) @@ -930,7 +934,7 @@ func GetCustomTemplate(appID, vendorStoreID string) (storeTemplate StoreTemplate // AddCustomReply 增加门店自定义回复模板 func AddCustomReply(appID, vendorStoreID, replyTemplate string) (storeTemplate string, err error) { - if len(appID) == 0 || len(vendorStoreID) == 0 || len(replyTemplate) == 0 { + if len(appID) == 0 || len(vendorStoreID) == 0 { return "", errors.New("参数错误请检查!") } @@ -942,7 +946,7 @@ func AddCustomReply(appID, vendorStoreID, replyTemplate string) (storeTemplate s data, _ := json.Marshal(template) err = rdb.Del(key) - if err == nil { + if err == nil && replyTemplate != "" { err = rdb.RPush(key, data) //err = rdb.Set(key, replyTemplate, 0) } diff --git a/business/partner/purchase/ebai/callback.go b/business/partner/purchase/ebai/callback.go index 075131ff1..2b1fa423f 100644 --- a/business/partner/purchase/ebai/callback.go +++ b/business/partner/purchase/ebai/callback.go @@ -55,11 +55,18 @@ func GetOrderIDFromMap(orderMap map[string]interface{}) string { } 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)) + //if orderID := orderMap["refund_order_id"]; orderID != nil { + // if tryOrderID, ok := orderID.(string); ok { + // return tryOrderID + // } + // return utils.Int64ToStr(utils.MustInterface2Int64(orderID)) + //} + //return "" + + ReverseOderList := orderMap["reverse_order_list"].([]interface{}) + if len(ReverseOderList) != 0 { + afsInfo := ReverseOderList[len(ReverseOderList)-1].(map[string]interface{}) + return afsInfo["refund_order_id"].(string) } return "" } diff --git a/business/partner/purchase/ebai/ebai.go b/business/partner/purchase/ebai/ebai.go index 9f8f955ee..a0371f0d4 100644 --- a/business/partner/purchase/ebai/ebai.go +++ b/business/partner/purchase/ebai/ebai.go @@ -2,6 +2,7 @@ package ebai import ( "sync" + "time" "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/baseapi/utils" @@ -158,20 +159,35 @@ func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCat } func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { + riderInfo := &ebaiapi.OrderSelfDeliveryLocationSync{ + OrderId: param["order_id"].(string), + Location: &ebaiapi.RiderLocation{ + UTC: utils.Int64ToStr(time.Now().Unix()), + Altitude: "0", + Latitude: param["latitude"].(string), + Longitude: param["longitude"].(string), + }, + } + return api.EbaiAPI.SelfDeliveryLocationSync(riderInfo) +} + +func OrderStatussync(param map[string]interface{}) error { selfStatus := 0 switch param["logistics_status"].(int) { - case 0: - selfStatus = 2 // 2:配送待分配 - case 12: - selfStatus = 3 // 骑士接单 + case 0, 5: + selfStatus = ebaiapi.OrderDeliveryStatusWaitRider // 2:配送待分配 + case 10: + selfStatus = ebaiapi.OrderDeliveryStatusReceived // 骑士接单 case 15: - selfStatus = 8 // 骑士到店 + selfStatus = ebaiapi.OrderDeliveryStatusToStore // 骑士到店 case 20: - selfStatus = 20 // 骑手送出 + selfStatus = ebaiapi.OrderDeliveryStatusSend // 骑手送出 case 40: - selfStatus = 30 // 配送完成 + selfStatus = ebaiapi.OrderDeliveryStatusSendOver // 配送完成 + case 100: + selfStatus = ebaiapi.OrderDeliveryStatusCancel // 取消 default: - selfStatus = 7 // 配送异常 + selfStatus = ebaiapi.OrderDeliveryStatusAbnormal // 配送异常 } param2 := &ebaiapi.PushRiderInfo{ DistributorId: 201, diff --git a/business/partner/purchase/ebai/financial.go b/business/partner/purchase/ebai/financial.go index 8607b74eb..189d1bea6 100644 --- a/business/partner/purchase/ebai/financial.go +++ b/business/partner/purchase/ebai/financial.go @@ -132,31 +132,34 @@ func (p *PurchaseHandler) AfsOrderDetail2Financial(orderData map[string]interfac // 或者换个思路,不考虑变更之前的正向订单,在佣金上入手,退款金额减去佣金减少的部分 orderFinancial, err := partner.CurOrderManager.LoadOrderFinancial(afsOrder.VendorOrderID, model.VendorIDEBAI) if err == nil { - afsOrder.PmRefundMoney = orderFinancial.PmMoney - utils.MustInterface2Int64(orderData["commission"]) + afsOrder.PmRefundMoney = orderFinancial.PmMoney - utils.MustInterface2Int64(orderData["commission_amount"]) } else { // 此处应该报错 err = nil } - if orderData["refund_detail"] != nil { - refundDetail := orderData["refund_detail"].([]interface{}) - for _, refundInfo := range refundDetail { + if orderData["reverse_order_list"] != nil { + refundDetail := orderData["reverse_order_list"].([]interface{}) + refundSkuList := refundDetail[len(refundDetail)-1].(map[string]interface{})["sub_reverse_order_list"].([]interface{}) + for _, refundInfo := range refundSkuList { xMap := refundInfo.(map[string]interface{}) - orderSkuFinancial := &model.OrderSkuFinancial{ - VendorID: model.VendorIDEBAI, - AfsOrderID: afsOrder.AfsOrderID, - VendorOrderID: afsOrder.VendorOrderID, - VendorSubOrderID: afsOrder.VendorOrderID2, - // ConfirmTime: getTimeFromInterface(xMap["apply_time"]), - VendorSkuID: utils.Interface2String(xMap["sku_id"]), - SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(xMap["custom_sku_id"]), 0)), - Name: utils.Interface2String(xMap["name"]), - UserMoney: utils.MustInterface2Int64(xMap["total_refund"]), - PmSubsidyMoney: utils.MustInterface2Int64(xMap["shop_ele_refund"]), - IsAfsOrder: 1, + if xMap["virtual_type"] == ebaiapi.OrderVirtualType { + orderSkuFinancial := &model.OrderSkuFinancial{ + VendorID: model.VendorIDEBAI, + AfsOrderID: afsOrder.AfsOrderID, + VendorOrderID: afsOrder.VendorOrderID, + VendorSubOrderID: afsOrder.VendorOrderID2, + // ConfirmTime: getTimeFromInterface(xMap["apply_time"]), + VendorSkuID: utils.Int64ToStr(utils.MustInterface2Int64(xMap["platform_sku_id"])), + SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(xMap["custom_sku_id"]), 0)), + Name: utils.Interface2String(xMap["sku_name"]), + UserMoney: utils.MustInterface2Int64(xMap["refund_user_amount"]), + IsAfsOrder: 1, + } + orderSkuFinancial.PmSubsidyMoney = utils.Interface2Int64WithDefault(xMap["discount_detail"].(map[string]interface{})["platform_discount_amount"], 0) + utils.Interface2Int64WithDefault(xMap["discount_detail"].(map[string]interface{})["agent_discount_amount"], 0) + utils.Interface2Int64WithDefault(xMap["discount_detail"].(map[string]interface{})["user_discount_amount"], 0) + afsOrder.Skus = append(afsOrder.Skus, orderSkuFinancial) + afsOrder.SkuUserMoney += orderSkuFinancial.UserMoney + afsOrder.PmSubsidyMoney += orderSkuFinancial.PmSubsidyMoney } - afsOrder.Skus = append(afsOrder.Skus, orderSkuFinancial) - afsOrder.SkuUserMoney += orderSkuFinancial.UserMoney - afsOrder.PmSubsidyMoney += orderSkuFinancial.PmSubsidyMoney } if len(refundDetail) > 0 { afsOrder.AfsCreatedAt = getTimeFromInterface(refundDetail[0].(map[string]interface{})["apply_time"]) diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index bc1b70068..6b1c0699c 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -131,12 +131,12 @@ func (p *PurchaseHandler) GetOrder4PartRefund(vendorOrderID string) (order *mode if err1 == nil { order = p.Map2Order(result1) if err2 == nil { - order.Skus = p.partRefund2OrderDetailSkuList(utils.Interface2String(result2["order_id"]), result2["order_detail"]) + order.Skus = p.partRefund2OrderDetailSkuList(utils.Interface2String(result2["order_id"]), result2["reverse_order_list"]) giftSkus, discountMoney := getZengSkus(vendorOrderID, result1) order.DiscountMoney = discountMoney order.Skus = append(order.Skus, giftSkus...) - order.ActualPayPrice = utils.MustInterface2Int64(result2["user_fee"]) - order.TotalShopMoney = utils.MustInterface2Int64(result2["shop_fee"]) + order.ActualPayPrice = utils.MustInterface2Int64(result2["remain_user_total_amount"]) + order.TotalShopMoney = utils.MustInterface2Int64(result2["merchant_income"]) jxutils.RefreshOrderSkuRelated(order) } else if err2Ext, ok := err2.(*utils.ErrorWithCode); !ok || err2Ext.IntCode() != ebaiapi.ErrOrderIsNotPartRefund { err = err2 @@ -170,27 +170,31 @@ func getZengSkus(orderID string, orderMan map[string]interface{}) (skus []*model } func (p *PurchaseHandler) partRefund2OrderDetailSkuList(orderID string, orderDetail2 interface{}) (skuList []*model.OrderSku) { - orderDetail := orderDetail2.([]interface{}) - for _, product2 := range orderDetail { + refundDetail := orderDetail2.([]interface{}) + refundSkuList := refundDetail[len(refundDetail)-1].(map[string]interface{})["sub_reverse_order_list"].([]interface{}) + for _, product2 := range refundSkuList { product := product2.(map[string]interface{}) - skuName := product["name"].(string) - _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(skuName) - number := int(utils.MustInterface2Int64(product["number"])) - sku := &model.OrderSku{ - VendorOrderID: orderID, - VendorID: model.VendorIDEBAI, - Count: number, - SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(product[ebaiapi.KeyCustomSkuID]), 0)), - VendorSkuID: utils.Interface2String(product[ebaiapi.KeySkuID]), - SkuName: skuName, - // Weight: int(utils.Interface2Int64WithDefault(product["total_weight"], 0)) / number, // 退单这里的total_weight有BUG,这里的total_weight还是没有退单时的值 - VendorPrice: utils.MustInterface2Int64(product["product_price"]), + if product["virtual_type"] == ebaiapi.OrderVirtualType { + skuName := product["sku_name"].(string) + _, _, _, specUnit, _, specQuality := jxutils.SplitSkuName(skuName) + number := int(utils.MustInterface2Int64(product["apply_quantity"])) + sku := &model.OrderSku{ + VendorOrderID: orderID, + VendorID: model.VendorIDEBAI, + Count: number, + SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(product[ebaiapi.KeyCustomSkuID]), 0)), + VendorSkuID: utils.Interface2String(product["platform_sku_id"]), + SkuName: skuName, + Weight: int(utils.Interface2Int64WithDefault(product["refund_weight"], 0)) / number, // 退单这里的total_weight有BUG,这里的total_weight还是没有退单时的值 + VendorPrice: utils.MustInterface2Int64(product["refund_user_amount"]), + } + //sku.SalePrice, _, sku.StoreSubName = getSkuSalePrice(product) + sku.SalePrice = utils.Interface2Int64WithDefault(product["discount_detail"].(map[string]interface{})["total_price"], 0) + if sku.Weight == 0 { + sku.Weight = jxutils.FormatSkuWeight(specQuality, specUnit) // 订单信息里没有重量,只有名字里尝试找 + } + skuList = append(skuList, sku) } - sku.SalePrice, _, sku.StoreSubName = getSkuSalePrice(product) - if sku.Weight == 0 { - sku.Weight = jxutils.FormatSkuWeight(specQuality, specUnit) // 订单信息里没有重量,只有名字里尝试找 - } - skuList = append(skuList, sku) } return skuList } @@ -440,7 +444,30 @@ func (p *PurchaseHandler) trySyncCancelStatus(vendorOrderID string) (err error) func (p *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) { // todo 饿百转商家自送后,没有确认送达的概念,空操作 if globals.EnableEbaiStoreWrite && order.WaybillVendorID > 100 { - err = api.EbaiAPI.OrderComplete(order.VendorOrderID, userName) + param2 := &ebaiapi.PushRiderInfo{ + DistributorId: 201, + OrderId: order.VendorOrderID, + State: 21, + SelfStatus: ebaiapi.OrderDeliveryStatusSendOver, + SelfStatusDesc: "自配送送达", + DistributorInfoDTO: ebaiapi.DistributorInfoDTO{ + DistributorTypeId: "99999", + DistributorName: "商家自行配送", + }, + } + bills, _ := dao.GetWaybills(dao.GetDB(), order.VendorOrderID, nil) + for _, v := range bills { + if v.Status == model.WaybillStatusDelivered || v.Status == model.WaybillStatusFailed { + param2.Knight = ebaiapi.Knight{ + Id: utils.Str2Int64(order.VendorOrderID), + Name: v.CourierName, + Phone: v.CourierMobile, + } + break + } + } + + err = api.EbaiAPI.OrderselfDeliveryStateSync2(param2) } return err } @@ -448,7 +475,18 @@ func (p *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName // 完全自送的门店表示开始配送 func (p *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) { if globals.EnableEbaiStoreWrite { - err = api.EbaiAPI.OrderselfDeliveryStateSync(order.VendorOrderID, userName) + param2 := &ebaiapi.PushRiderInfo{ + DistributorId: 201, + OrderId: order.VendorOrderID, + State: 21, + SelfStatus: 1, + SelfStatusDesc: "生成自配送运单", + DistributorInfoDTO: ebaiapi.DistributorInfoDTO{ + DistributorTypeId: "99999", + DistributorName: "商家自行配送", + }, + } + err = api.EbaiAPI.OrderselfDeliveryStateSync2(param2) } if err == nil { // 饿百不会发送配送中,模拟发送 @@ -460,7 +498,30 @@ func (p *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userNam // 完全自送的门店表示配送完成 func (p *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) { if globals.EnableEbaiStoreWrite { - err = api.EbaiAPI.OrderComplete(order.VendorOrderID, userName) + param2 := &ebaiapi.PushRiderInfo{ + DistributorId: 201, + OrderId: order.VendorOrderID, + State: 21, + SelfStatus: ebaiapi.OrderDeliveryStatusSendOver, + SelfStatusDesc: "自配送送达", + DistributorInfoDTO: ebaiapi.DistributorInfoDTO{ + DistributorTypeId: "99999", + DistributorName: "商家自行配送", + }, + } + bills, _ := dao.GetWaybills(dao.GetDB(), order.VendorOrderID, nil) + for _, v := range bills { + if v.Status == model.WaybillStatusDelivered || v.Status == model.WaybillStatusFailed { + param2.Knight = ebaiapi.Knight{ + Id: utils.Str2Int64(order.VendorOrderID), + Name: v.CourierName, + Phone: v.CourierMobile, + } + break + } + } + + err = api.EbaiAPI.OrderselfDeliveryStateSync2(param2) } return err } diff --git a/business/partner/purchase/ebai/order_afs.go b/business/partner/purchase/ebai/order_afs.go index a161a453a..a79ad7df2 100644 --- a/business/partner/purchase/ebai/order_afs.go +++ b/business/partner/purchase/ebai/order_afs.go @@ -169,9 +169,9 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaia var db = dao.GetDB() if utils.Str2Int(orderStatus.VendorStatus) == ebaiapi.OrderPartRefundSuccess { orderData, err2 := api.EbaiAPI.OrderPartRefundGet(orderStatus.RefVendorOrderID) - if err2 == nil && utils.MustInterface2Int64(orderData["shop_fee"]) != model.NO { + if err2 == nil && utils.MustInterface2Int64(orderData["merchant_income"]) != model.NO { goodsOrder, _ := partner.CurOrderManager.LoadOrder(orderStatus.RefVendorOrderID, model.VendorIDEBAI) - goodsOrder.TotalShopMoney = utils.MustInterface2Int64(orderData["shop_fee"]) + goodsOrder.TotalShopMoney = utils.MustInterface2Int64(orderData["merchant_income"]) // 门店结算小于等于50为扣点 afsSkuList, _ := dao.GetOrderRefundSkuList(db, []string{goodsOrder.VendorOrderID}) for _, v := range goodsOrder.Skus { diff --git a/controllers/jx_order.go b/controllers/jx_order.go index dee93abde..7e2d307b7 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -131,6 +131,9 @@ func (c *OrderController) CreateWaybillOnProviders() { c.callCreateWaybillOnProviders(func(params *tOrderCreateWaybillOnProvidersParams) (retVal interface{}, errCode string, err error) { var courierVendorIDs []int if err = jxutils.Strings2Objs(params.CourierVendorIDs, &courierVendorIDs); err == nil { + if params.MaxAddFee >= 5000 { + return nil, "", errors.New("部分运单金额大于50元,请核对") + } retVal, errCode, err = defsch.FixedScheduler.CreateWaybillOnProvidersEx(params.Ctx, params.VendorOrderID, params.VendorID, courierVendorIDs, params.ForceCreate, int64(params.MaxAddFee)) } return retVal, errCode, err