From 79bd42ea73ef6911bdb4e45692ff1d0d7079ff09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Tue, 18 Apr 2023 13:50:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ebai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jxcallback/auto_delivery/auto_delivery.go | 2 +- business/jxcallback/orderman/orderman_ext.go | 9 ++ .../jxcallback/scheduler/defsch/defsch_ext.go | 10 +- business/jxstore/act/act.go | 2 +- business/jxstore/cms/system_store_sku.go | 108 ++++++++++++++++++ business/model/dao/dao_order.go | 36 +++++- business/partner/delivery/rider.go | 104 ++++++++++------- business/partner/purchase/ebai/ebai.go | 2 +- 8 files changed, 219 insertions(+), 54 deletions(-) create mode 100644 business/jxstore/cms/system_store_sku.go diff --git a/business/jxcallback/auto_delivery/auto_delivery.go b/business/jxcallback/auto_delivery/auto_delivery.go index a01da9ba7..e0f2ffe05 100644 --- a/business/jxcallback/auto_delivery/auto_delivery.go +++ b/business/jxcallback/auto_delivery/auto_delivery.go @@ -75,7 +75,7 @@ func Init() { riderListInfo = list } -// AutoSettingFakeDelivery 抖音自动设置骑手, 推送假订单 +// AutoSettingFakeDelivery 抖音自动设置骑手(饿百), 推送假订单 func AutoSettingFakeDelivery() { db := dao.GetDB() diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index c3fb530e3..cb5a9aa2f 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -1075,12 +1075,21 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID } for _, v := range saleInfoMap { if v.Status == model.OrderStatusFinished { + // 计算平台计算 settle, _ := dao.GetPlatformSettlement(db, storeIDList, fromTime, toTime) for _, s := range settle { if v.VendorID == s.VendorID { v.PlatformSettlement = s.TotalShopMoney } } + + // 计算三方配送 + fee, _ := dao.GetPlatformDesiredFee(db, storeIDList, fromTime, toTime) + for _, f := range fee { + if v.VendorID == f.VendorID { + v.ActualFee = f.ActualFee + } + } } saleInfoList = append(saleInfoList, v) } diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index d09b25037..2a1f50f7e 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -94,7 +94,7 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven VendorWaybillID2: "", WaybillVendorID: model.VendorJXFakeWL, VendorOrderID: order.VendorOrderID, - OrderVendorID: model.VendorIDDD, + OrderVendorID: order.VendorID, CourierName: courierName, CourierMobile: courierMobile, Status: model.OrderStatusNew, @@ -108,7 +108,7 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven WaybillFinishedAt: utils.DefaultTimeValue, StatusTime: timeNow.Add(randTime), // 下一状态时间 OriginalData: "", - Remark: "自定义物流单", + Remark: "自定义物流单(抖音/饿了么)", VendorOrgCode: order.VendorOrgCode, } err = dao.CreateEntity(dao.GetDB(), bill) @@ -130,9 +130,9 @@ func (s *DefScheduler) canOrderCreateWaybillNormally(order *model.GoodsOrder, sa func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (err error) { //TODO 刷单用,之后不刷单了删除 - if order.VendorID == model.VendorIDDD { - return nil - } + //if order.VendorID == model.VendorIDDD { + // return nil + //} if model.IsOrderDeliveryByPlatform(order) { if order.Status < model.OrderStatusFinishedPickup { diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index b1ac311df..97cc988bc 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -2045,7 +2045,7 @@ func RrefreshMtwmVendorAct(ctx *jxcontext.Context) (err error) { if ac.Status == 1 && ac.SkuId != "" { activationActivitySkuIdList = append(activationActivitySkuIdList, &partner.StoreSkuInfo{ SkuID: utils.Str2Int(ac.SkuId), - IsSpecialty: 1, + IsSpecialty: 0, }) } // 已经失效的爆款活动 diff --git a/business/jxstore/cms/system_store_sku.go b/business/jxstore/cms/system_store_sku.go new file mode 100644 index 000000000..15d137397 --- /dev/null +++ b/business/jxstore/cms/system_store_sku.go @@ -0,0 +1,108 @@ +package cms + +import ( + "fmt" + "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/model" + "git.rosy.net.cn/jx-callback/business/model/dao" + "git.rosy.net.cn/jx-callback/business/partner" + "time" +) + +// CopyOnStoreSkuToOther 将一个美团门店分类和商品复制到另一个门店 +func CopyOnStoreSkuToOther(ctx *jxcontext.Context, fromStoreId, toStoreId int, isAsync bool) (hint string, err error) { + var ( + db = dao.GetDB() + ) + + // 门店api加载 + fromStore, err := dao.GetStoreDetail(db, fromStoreId, model.VendorIDMTWM, "") + if err != nil { + return "", err + } + toStore, err := dao.GetStoreDetail(db, fromStoreId, model.VendorIDMTWM, "") + if err != nil { + return "", err + } + fromApi := partner.CurAPIManager.GetAPI(model.VendorIDMTWM, fromStore.VendorOrgCode).(*mtwmapi.API) + toApi := partner.CurAPIManager.GetAPI(model.VendorIDMTWM, toStore.VendorOrgCode).(*mtwmapi.API) + + taskName := fmt.Sprintf("将平台门店[%d],分类和商品复制到[%d]", fromStoreId, toStoreId) + config := tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(false) + work := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + step := batchItemList[0].(int) + switch step { + case 1: + // 1.加载门店商品,删除商品.当分类下没有商品时.删除分类 + errs := LoadingStoreSkuList(ctx, toApi, toStore.VendorStoreID) + if errs != nil && len(errs) > 0 { + return nil, errs[0] + } + case 2: + // 同步分类 + fromCategoryList, err := fromApi.RetailCatList(fromStore.VendorStoreID) + if err != nil { + return nil, err + } + for _, v := range fromCategoryList { + if err := toApi.RetailCatUpdate(toStore.VendorStoreID, v.Name, &mtwmapi.Param4UpdateCat{ + CategoryCode: v.Code, + Sequence: v.Sequence, + }); err != nil { + return nil, err + } + if v.Children != nil && len(v.Children) != 0 { + //for _, c := range v.Children { + // if err := toApi.RetailCatUpdate(toStore.VendorStoreID, v.Name, &mtwmapi.Param4UpdateCat{ + // CategoryCode: v.Code, + // Sequence: v.Sequence, + // }); err != nil { + // return nil, err + // } + //} + } + } + + case 3: + // 同步商品 + + } + return + } + task := tasksch.NewParallelTask(taskName, config, ctx, work, []int{1, 2, 3}) + tasksch.HandleTask(task, nil, true).Run() + if !isAsync { + _, err = task.GetResult(0) + hint = "1" + } else { + hint = task.ID + } + return hint, err +} + +func LoadingStoreSkuList(ctx *jxcontext.Context, api *mtwmapi.API, poiCode string) (err []error) { + foodList, err1 := api.RetailListAll(poiCode) + if err1 != nil { + return append(err, err1) + } + + i := 0 + for _, v := range foodList { + err1 := api.RetailDelete(ctx.GetTrackInfo(), poiCode, v.AppFoodCode) + if err1 != nil { + err = append(err, err1) + } + if i%40 == 0 { + time.Sleep(200 * time.Millisecond) + } + i++ + } + + return +} + +func LoadStoreCategoryList() { + +} diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index cce0e0aa5..e056158e1 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -38,7 +38,8 @@ type StoresOrderSaleInfo struct { RealEarningPrice int64 `json:"realEarningPrice"` - PlatformSettlement int64 `json:"platformSettlement"` // 真实订单的平台结算 + PlatformSettlement int64 `json:"platformSettlement"` // 真实订单的平台结算(无扣点) + ActualFee int64 `json:"actualFee"` // 真三方运单配送费 } type OrderSkuWithActualPayPrice struct { @@ -418,6 +419,7 @@ type TotalShopMoney struct { VendorID int `orm:"column(vendor_id)" json:"vendorID"` } +// GetPlatformSettlement 统计平台的结算信息 func GetPlatformSettlement(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time) ([]*TotalShopMoney, error) { sql := ` SELECT SUM(t2.total_shop_money) total_shop_money,t2.vendor_id FROM goods_order t2 WHERE t2.order_finished_at >= ? AND t2.order_finished_at <= ? @@ -438,6 +440,34 @@ func GetPlatformSettlement(db *DaoDB, storeIDs []int, finishedAtBegin, finishedA return total, err } +type DeliveryFee struct { + ActualFee int64 `json:"actualFee"` + VendorID int `orm:"column(vendor_id)" json:"vendorID"` +} + +// GetPlatformDesiredFee 统计平台的订单的配送费信息 +func GetPlatformDesiredFee(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time) (fee []*DeliveryFee, err error) { + sql := ` + SELECT sum(b.actual_fee) actual_fee,b.order_vendor_id vendor_id FROM goods_order t2 + RIGHT JOIN waybill b ON t2.vendor_order_id = b.vendor_order_id AND b.status IN (?,?) AND b.vendor_order_id <> b.vendor_waybill_id + WHERE t2.order_finished_at >= ? AND t2.order_finished_at <= ? +` + sqlParams := []interface{}{ + model.WaybillStatusDelivered, + 110, + finishedAtBegin, + finishedAtEnd, + } + if len(storeIDs) > 0 { + sql += " AND IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) IN (" + GenQuestionMarks(len(storeIDs)) + ")" + sqlParams = append(sqlParams, storeIDs) + } + + sql += ` GROUP BY b.order_vendor_id ` + err = GetRows(db, &fee, sql, sqlParams...) + return +} + func GetStoreOrderSkuList4Afs(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAtEnd time.Time, isFinish bool) (skuList []*OrderSkuWithActualPayPrice, err error) { sql := ` SELECT t1.*, @@ -1866,8 +1896,8 @@ func GetOrderStoreIDs(db *DaoDB, beginAt, endAt time.Time, vendorID int) (storeI // GetOrderListByStoreList 根据门店id获取正在刷单的门店商品 func GetOrderListByStoreList(db *DaoDB, storeId []int64) (order []*model.GoodsOrder, err error) { - sql := `SELECT * FROM goods_order g WHERE g.order_created_at >= ? AND g.order_created_at <= ? AND g.jx_store_id IN (` + GenQuestionMarks(len(storeId)) + `)` + `AND g.vendor_id = ? AND g.status < ?` - sqlParam := []interface{}{time.Now().AddDate(0, 0, -5), time.Now().AddDate(0, 0, 1), storeId, model.VendorIDDD, model.OrderStatusDelivering} + sql := `SELECT * FROM goods_order g WHERE g.order_created_at >= ? AND g.order_created_at <= ? AND g.jx_store_id IN (` + GenQuestionMarks(len(storeId)) + `)` + `AND g.vendor_id IN (` + GenQuestionMarks(2) + `)` + `AND g.status < ?` + sqlParam := []interface{}{time.Now().AddDate(0, 0, -5), time.Now().AddDate(0, 0, 1), storeId, []int{model.VendorIDDD, model.VendorIDEBAI}, model.OrderStatusDelivering} if err := GetRows(db, &order, sql, sqlParam...); err != nil { return nil, err diff --git a/business/partner/delivery/rider.go b/business/partner/delivery/rider.go index 5550a8559..5d240c759 100644 --- a/business/partner/delivery/rider.go +++ b/business/partner/delivery/rider.go @@ -220,6 +220,52 @@ func UpdateOrder2Complete() { return } +func makeRiderInfo(fakeWayBill *model.Waybill, riderInfo *mtpsapi.RiderInfo) { + switch fakeWayBill.Status { + case 5: // 呼叫骑手 + riderInfo.LogisticsContext = "呼叫骑手,新建运单" + riderInfo.LogisticsStatus = 0 + riderInfo.CourierName = "" + riderInfo.CourierPhone = "" + riderInfo.OpCode = tiktok_api.TiktokLogisticsStatusCALLRIDER + + // 下一状态以及推送时间 + fakeWayBill.Status = model.WaybillStatusCourierAssigned + fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierAssigned) + case 12: // 骑手接单 + riderInfo.LogisticsContext = model.RiderWaitGetGoods + riderInfo.LogisticsStatus = 12 + riderInfo.OpCode = tiktok_api.TiktokLogisticsORDERRECEIVED + // 下一状态以及推送时间 + fakeWayBill.Status = model.WaybillStatusCourierArrived + fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierArrived) + case 15: // 到店 + riderInfo.LogisticsContext = model.RiderToStore + riderInfo.LogisticsStatus = 15 + riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERARRIVED + // 下一状态以及推送时间 + fakeWayBill.Status = model.WaybillStatusDelivering + fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivering) + case 20: //配送中 + riderInfo.LogisticsContext = model.RiderGetOrderDelivering + riderInfo.LogisticsStatus = 20 + riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERPICKUP + // 下一状态以及推送时间 + fakeWayBill.Status = model.WaybillStatusDelivered + fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivered) + case 105: // 完成 + riderInfo.LogisticsContext = model.RiderGetOrderDelivered + riderInfo.LogisticsStatus = 40 + riderInfo.OpCode = tiktok_api.TiktokLogisticsDELIVERED + // 下一状态以及推送时间 + fakeWayBill.Status = model.WaybillStatusFailed + fakeWayBill.VendorStatus = utils.Int64ToStr(model.WaybillStatusFailed) + default: + return + } + return +} + // UpdateFakeWayBillToTiktok 轮询更新假订单到抖音 func UpdateFakeWayBillToTiktok() { scheduleTimer, _ := rand.Int(rand.Reader, big.NewInt(1000)) @@ -252,48 +298,7 @@ func UpdateFakeWayBillToTiktok() { LogisticsStatus: fakeWayBill[i].Status, } - switch fakeWayBill[i].Status { - case 5: // 呼叫骑手 - riderInfo.LogisticsContext = "呼叫骑手,新建运单" - riderInfo.LogisticsStatus = 0 - riderInfo.CourierName = "" - riderInfo.CourierPhone = "" - riderInfo.OpCode = tiktok_api.TiktokLogisticsStatusCALLRIDER - - // 下一状态以及推送时间 - fakeWayBill[i].Status = model.WaybillStatusCourierAssigned - fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierAssigned) - case 12: // 骑手接单 - riderInfo.LogisticsContext = model.RiderWaitGetGoods - riderInfo.LogisticsStatus = 12 - riderInfo.OpCode = tiktok_api.TiktokLogisticsORDERRECEIVED - // 下一状态以及推送时间 - fakeWayBill[i].Status = model.WaybillStatusCourierArrived - fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusCourierArrived) - case 15: // 到店 - riderInfo.LogisticsContext = model.RiderToStore - riderInfo.LogisticsStatus = 15 - riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERARRIVED - // 下一状态以及推送时间 - fakeWayBill[i].Status = model.WaybillStatusDelivering - fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivering) - case 20: //配送中 - riderInfo.LogisticsContext = model.RiderGetOrderDelivering - riderInfo.LogisticsStatus = 20 - riderInfo.OpCode = tiktok_api.TiktokLogisticsRIDERPICKUP - // 下一状态以及推送时间 - fakeWayBill[i].Status = model.WaybillStatusDelivered - fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusDelivered) - case 105: // 完成 - riderInfo.LogisticsContext = model.RiderGetOrderDelivered - riderInfo.LogisticsStatus = 40 - riderInfo.OpCode = tiktok_api.TiktokLogisticsDELIVERED - // 下一状态以及推送时间 - fakeWayBill[i].Status = model.WaybillStatusFailed - fakeWayBill[i].VendorStatus = utils.Int64ToStr(model.WaybillStatusFailed) - default: - continue - } + makeRiderInfo(fakeWayBill[i], riderInfo) if riderInfo.LogisticsContext != model.RiderGetOrderDeliverFailed && riderInfo.LogisticsContext != model.RiderGetOrderDeliverOther && riderInfo.LogisticsContext != model.RiderWaitRider { riderInfo.LogisticsContext = fmt.Sprintf(riderInfo.LogisticsContext, riderInfo.CourierName, riderInfo.CourierPhone) @@ -301,7 +306,8 @@ func UpdateFakeWayBillToTiktok() { // 推送骑手信息 paramsMap := utils.Struct2Map(riderInfo, "", true) - if handler := partner.GetPurchaseOrderHandlerFromVendorID(model.VendorIDDD); handler != nil { + handler := partner.GetPurchaseOrderHandlerFromVendorID(fakeWayBill[i].OrderVendorID) + if handler != nil { if err := handler.GetOrderRider(fakeWayBill[i].VendorOrgCode, "", paramsMap); err != nil { globals.SugarLogger.Errorf("Fake Pull Rider Info Err :%s--%s--%v", riderInfo.OrderId, riderInfo.ThirdCarrierOrderId, err) continue @@ -326,6 +332,18 @@ func UpdateFakeWayBillToTiktok() { if err != nil { globals.SugarLogger.Debugf("UPDATA goods_order Err :%s", err.Error()) } + // 饿百订单推送订单送达 + if fakeWayBill[i].OrderVendorID == model.VendorIDEBAI { + order, err := partner.CurOrderManager.LoadOrder(fakeWayBill[i].VendorOrderID, fakeWayBill[i].OrderVendorID) + if err != nil { + globals.SugarLogger.Errorf("Loading order by wayBill vendorOrderID err := %v", err) + continue + } + if err := handler.Swtich2SelfDelivered(order, "JingXiAdmin"); err != nil { + globals.SugarLogger.Errorf("Swtich2SelfDelivered err := %v", err) + } + } + } } diff --git a/business/partner/purchase/ebai/ebai.go b/business/partner/purchase/ebai/ebai.go index da8d97498..de7853796 100644 --- a/business/partner/purchase/ebai/ebai.go +++ b/business/partner/purchase/ebai/ebai.go @@ -158,5 +158,5 @@ func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCat } func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { - return nil + return api.EbaiAPI.OrderselfDeliveryStateSync(param["order_id"].(string), param["courier_phone"].(string)) }