diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 668b3c652..aa3dd2062 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -1617,3 +1617,9 @@ func UpdateWaybillDesiredFee(ctx *jxcontext.Context, vendorOrderID string, desir } return err } + +func AcceptOrRefuseOrder(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isAccept bool) (err error) { + order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) + handler := partner.GetPurchaseOrderHandlerFromVendorID(vendorID) + return handler.AcceptOrRefuseOrder(order, isAccept, ctx.GetUserName()) +} diff --git a/business/jxcallback/scheduler/basesch/basesch.go b/business/jxcallback/scheduler/basesch/basesch.go index 1f623cd4f..e0077e04e 100644 --- a/business/jxcallback/scheduler/basesch/basesch.go +++ b/business/jxcallback/scheduler/basesch/basesch.go @@ -20,7 +20,7 @@ type BaseScheduler struct { func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) { globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) - if /*order.LockStatus == model.OrderStatusUnknown && */ order.Status == model.OrderStatusNew { + if /*order.LockStatus == model.OrderStatusUnknown && */ order.Status == model.OrderStatusNew || order.Status == model.OrderStatusWaitAccepted { if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogErrorWithInfo(func() error { return partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt, userName) diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 8fada97a0..327f66eca 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -226,57 +226,61 @@ func init() { FixedScheduler = sch sch.IsReallyCallPlatformAPI = globals.ReallyCallPlatformAPI scheduler.CurrentScheduler = sch + statusAccept := func(time time.Duration) *StatusActionConfig { + return &StatusActionConfig{ // 自动接单 + StatusActionParams: partner.StatusActionParams{ + TimerType: partner.TimerTypeBaseStatusTime, + Timeout: time, + }, + TimeoutAction: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) { + order := savedOrderInfo.order + storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID) + if err == nil { + savedOrderInfo.storeDetail = storeDetail + } + mobile := order.ConsigneeMobile + if order.ConsigneeMobile2 != "" { + mobile = order.ConsigneeMobile2 + } + _ = sch.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, mobile, jxutils.GetSaleStoreIDFromOrder(order), nil, func(isAcceptIt bool) error { + if err = sch.AcceptOrRefuseOrder(order, isAcceptIt, ""); err != nil && err != scheduler.ErrOrderStatusAlreadySatisfyCurOperation { + partner.CurOrderManager.OnOrderMsg(order, "自动接单失败", err.Error()) + // 为了解决京东新消息与接单消息乱序的问题 + if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 { + if order2, err2 := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrgCode, order.VendorOrderID); err2 == nil { + if order2.Status > order.Status { + order.Status = order2.Status + jxutils.CallMsgHandlerAsync(func() { + sch.OnOrderStatusChanged(order, model.Order2Status(order2), false) + }, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID)) + err = nil + } + } else { + err = err2 + } + } + } + if isAcceptIt { + if err == nil { + sch.notifyNewOrder(order) + msghub.OnNewOrder(order) + } + } else { + partner.CurOrderManager.OnOrderMsg(order, "黑名单拒单", "") + } + return err + }) + return nil + }, + ShouldSetTimer: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) bool { + return savedOrderInfo.order.LockStatus == model.LockStatusUnlocked && (savedOrderInfo.order.Status == model.OrderStatusNew || savedOrderInfo.order.Status == model.OrderStatusWaitAccepted) + }, + } + } sch.defWorkflowConfig = []map[int]*StatusActionConfig{ map[int]*StatusActionConfig{ - model.OrderStatusNew: &StatusActionConfig{ // 自动接单 - StatusActionParams: partner.StatusActionParams{ - TimerType: partner.TimerTypeBaseStatusTime, - Timeout: 10 * time.Millisecond, - }, - TimeoutAction: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) { - order := savedOrderInfo.order - storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID) - if err == nil { - savedOrderInfo.storeDetail = storeDetail - } - mobile := order.ConsigneeMobile - if order.ConsigneeMobile2 != "" { - mobile = order.ConsigneeMobile2 - } - _ = sch.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, mobile, jxutils.GetSaleStoreIDFromOrder(order), nil, func(isAcceptIt bool) error { - if err = sch.AcceptOrRefuseOrder(order, isAcceptIt, ""); err != nil && err != scheduler.ErrOrderStatusAlreadySatisfyCurOperation { - partner.CurOrderManager.OnOrderMsg(order, "自动接单失败", err.Error()) - // 为了解决京东新消息与接单消息乱序的问题 - if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 { - if order2, err2 := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrgCode, order.VendorOrderID); err2 == nil { - if order2.Status > order.Status { - order.Status = order2.Status - jxutils.CallMsgHandlerAsync(func() { - sch.OnOrderStatusChanged(order, model.Order2Status(order2), false) - }, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID)) - err = nil - } - } else { - err = err2 - } - } - } - if isAcceptIt { - if err == nil { - sch.notifyNewOrder(order) - msghub.OnNewOrder(order) - } - } else { - partner.CurOrderManager.OnOrderMsg(order, "黑名单拒单", "") - } - return err - }) - return nil - }, - ShouldSetTimer: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) bool { - return savedOrderInfo.order.LockStatus == model.LockStatusUnlocked && savedOrderInfo.order.Status == model.OrderStatusNew - }, - }, + model.OrderStatusWaitAccepted: statusAccept(4 * time.Minute), //饿百假的自动接单 + model.OrderStatusNew: statusAccept(10 * time.Millisecond), model.OrderStatusAccepted: &StatusActionConfig{ // 自动拣货 StatusActionParams: partner.StatusActionParams{ TimerType: partner.TimerTypeBaseStatusTime, @@ -371,6 +375,9 @@ func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder, isPending bool) (err globals.SugarLogger.Debugf("OnOrderNew orderID:%s", order.VendorOrderID) savedOrderInfo := s.loadSavedOrderFromMap(model.Order2Status(order), false) savedOrderInfo.SetOrder(order) + if order.Status == model.OrderStatusWaitAccepted { + s.resetTimer(savedOrderInfo, nil, isPending) + } if order.Status >= model.OrderStatusNew { s.resetTimer(savedOrderInfo, nil, isPending) if !isPending && order.Status >= model.OrderStatusAccepted { // 有订单消息错序,先收到接单消息,再收到新订单消息,导致接单TIMER不动作,这里补一下 diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index b27914cb2..aeb6478bc 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -96,7 +96,6 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo catInfo.Name = catInfo.StoreCatName catInfo.Seq = catInfo.StoreCatSeq } - } if model.IsSyncStatusDelete(catInfo.CatSyncStatus) { // 删除 if model.IsSyncStatusDelete(catInfo.CatSyncStatus) && !dao.IsVendorThingIDEmpty(catInfo.VendorCatID) { diff --git a/business/jxstore/tempop/tempop.go b/business/jxstore/tempop/tempop.go index 43a7cbea5..d3fec4dc1 100644 --- a/business/jxstore/tempop/tempop.go +++ b/business/jxstore/tempop/tempop.go @@ -1585,7 +1585,7 @@ func UploadJdsImage(ctx *jxcontext.Context) (err error) { // fmt.Println("deleteList2", deleteList) var skuNames []model.SkuName sql := ` - SELECT * FROM sku_name WHERE img = 'https://image.jxc4.com/noGoodsImg.jpg' + SELECT * FROM sku_name WHERE img = 'https://image.jxc4.com/noGoodsImg.jpg' AND deleted_at = '1970-01-01 00:00:00' ` dao.GetRows(dao.GetDB(), &skuNames, sql, nil) for _, v := range skuNames { diff --git a/business/model/const.go b/business/model/const.go index b0654c31f..8db090d7f 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -53,6 +53,7 @@ var ( OrderStatusWait4Pay: "待付款", OrderStatusNew: "新订单", + OrderStatusWaitAccepted: "待接单", OrderStatusAccepted: "待拣货", OrderStatusFinishedPickup: "待配送", OrderStatusApplyFailedGetGoods: "取货失败待审核", @@ -247,6 +248,7 @@ const ( OrderStatusUnknown = 0 OrderStatusWait4Pay = 2 // 原值-60 下单待支付 + OrderStatusWaitAccepted = 3 // 待接单,目前饿百用 OrderStatusNew = 5 // 新订单,实际是已经支付 OrderStatusAccepted = 10 // 已经接单,也即待出库,待拣货 OrderStatusFinishedPickup = 15 // 拣货完成 diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 48f17b452..e6d380909 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -42,10 +42,11 @@ type SkuStoreCatInfo struct { ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"` ParentCatSyncStatus int8 - StoreCatID int `orm:"column(store_category_id)"` - StoreCatName string - StoreCatSeq int - IsSysCat int + StoreCatID int `orm:"column(store_category_id)"` + StoreCatName string + StoreCatSeq int + StoreParentCatName string + IsSysCat int } type StoreSkuSyncInfo struct { @@ -368,7 +369,8 @@ func GetStoreCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level in sql := ` SELECT t4.*, ts.store_category_name store_cat_name, ts.store_category_seq store_cat_seq, ts.id store_category_id, t5.id map_id, t5.%s_id vendor_cat_id, t5.%s_sync_status cat_sync_status, - tsp.store_category_name parent_cat_name, + t4p.name parent_cat_name, + tsp.store_category_name store_parent_cat_name, t5p.id parent_map_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status, t1.is_sys_cat FROM store_sku_category_map t5 diff --git a/business/partner/purchase/ebai/order.go b/business/partner/purchase/ebai/order.go index f2e62024d..ea00102c0 100644 --- a/business/partner/purchase/ebai/order.go +++ b/business/partner/purchase/ebai/order.go @@ -38,8 +38,8 @@ const ( var ( VendorStatus2StatusMap = map[string]int{ - ebaiapi.CmdOrderCreate: model.OrderStatusNew, - ebaiapi.OrderStatusNew: model.OrderStatusNew, + ebaiapi.CmdOrderCreate: model.OrderStatusWaitAccepted, + ebaiapi.OrderStatusNew: model.OrderStatusWaitAccepted, fakeAcceptOrder: model.OrderStatusAccepted, ebaiapi.OrderStatusAccepted: model.OrderStatusFinishedPickup, ebaiapi.OrderStatusCourierAccepted: model.OrderStatusDelivering, diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 63b872ad7..2398e74e8 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -1134,3 +1134,19 @@ func (c *OrderController) UpdateWaybillDesiredFee() { return retVal, "", err }) } + +// @Title 接单或拒单 +// @Description 接单或拒单 +// @Param token header string true "认证token" +// @Param vendorOrderID formData string true "订单ID" +// @Param vendorID formData int true "订单平台ID" +// @Param isAccept formData bool true "接单或者拒单" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /AcceptOrRefuseOrder [post] +func (c *OrderController) AcceptOrRefuseOrder() { + c.callAcceptOrRefuseOrder(func(params *tOrderAcceptOrRefuseOrderParams) (retVal interface{}, errCode string, err error) { + err = orderman.AcceptOrRefuseOrder(params.Ctx, params.VendorOrderID, params.VendorID, params.IsAccept) + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index dcd9d53c5..5ca375620 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -882,6 +882,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + beego.ControllerComments{ + Method: "AcceptOrRefuseOrder", + Router: `/AcceptOrRefuseOrder`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ Method: "AddUpdateOrdersSupplement",