diff --git a/business/controller/controller.go b/business/controller/controller.go index fcf3f6c9d..5b5229c4f 100644 --- a/business/controller/controller.go +++ b/business/controller/controller.go @@ -12,33 +12,10 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils/routinepool" + _ "git.rosy.net.cn/jx-callback/business/scheduler/defsch" // 导入缺省定单调度器 "git.rosy.net.cn/jx-callback/globals" ) -const ( - VenderIDUnknown = -1 - VendorIDPurchaseBegin = 0 - VendorIDJD = 0 - VendorIDMTWM = 1 - VendorIDELM = 2 - VendorIDPurchaseEnd = 2 - - VendorIDDeliveryBegin = 101 - VendorIDDada = 101 - VendorIDMTPS = 102 - VendorIDDeliveryEnd = 102 -) - -const ( - OrderTypeOrder = 1 - OrderTypeWaybill = 2 -) - -const ( - CoordinateTypeMars = 0 // 火星坐标 - CoordinateTypeReal = 1 // 真实坐标 -) - const ( DefaultOrderCacheTimeout = 24 * time.Hour ) @@ -82,12 +59,12 @@ func SplitUniversalOrderID(universalOrderID string) (orderID string, vendorID in // 3022716176275221584 elm order orderIDLen := len(universalOrderID) if orderIDLen == len("800402581000221") { - vendorID = VendorIDJD + vendorID = model.VendorIDJD } else if orderIDLen == len("3022716176275221584") { - vendorID = VendorIDELM + vendorID = model.VendorIDELM } else { globals.SugarLogger.Errorf("unkown order type:%v", universalOrderID) - vendorID = VenderIDUnknown + vendorID = model.VenderIDUnknown } orderID = universalOrderID } diff --git a/business/controller/dada/waybill.go b/business/controller/dada/waybill.go index 310d586fa..dca136f1e 100644 --- a/business/controller/dada/waybill.go +++ b/business/controller/dada/waybill.go @@ -5,13 +5,14 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/controller" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/scheduler" ) type WaybillController struct { } func init() { - controller.OrderManager.RegisterDeliveryPlatform(controller.VendorIDDada, new(WaybillController)) + scheduler.CurrentScheduler.RegisterDeliveryPlatform(model.VendorIDDada, new(WaybillController)) } func (c *WaybillController) OnWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaapi.CallbackResponse) { @@ -25,19 +26,19 @@ func (c *WaybillController) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dada order := c.callbackMsg2Waybill(msg) switch msg.OrderStatus { case dadaapi.OrderStatusWaitingForAccept: - order.Status = controller.WaybillStatusNew + order.Status = model.WaybillStatusNew case dadaapi.OrderStatusAccepted: - order.Status = controller.WaybillStatusAccepted + order.Status = model.WaybillStatusAccepted case dadaapi.OrderStatusDeliverying: - order.Status = controller.WaybillStatusDelivering + order.Status = model.WaybillStatusDelivering case dadaapi.OrderStatusFinished: - order.Status = controller.WaybillStatusDelivered + order.Status = model.WaybillStatusDelivered case dadaapi.OrderStatusCanceled: - order.Status = controller.WaybillStatusCanceled + order.Status = model.WaybillStatusCanceled case dadaapi.OrderStatusExpired, dadaapi.OrderStatusAddOrderFailed: - order.Status = controller.WaybillStatusFailed + order.Status = model.WaybillStatusFailed default: - order.Status = controller.WaybillStatusUnknown + order.Status = model.WaybillStatusUnknown } return dadaapi.Err2CallbackResponse(controller.WaybillManager.OnWaybillStatusChanged(order), utils.Int2Str(order.Status)) } @@ -45,7 +46,7 @@ func (c *WaybillController) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dada func (c *WaybillController) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal *model.Waybill) { retVal = &model.Waybill{ VendorWaybillID: msg.ClientID, - WaybillVendorID: controller.VendorIDDada, + WaybillVendorID: model.VendorIDDada, CourierName: msg.DmName, CourierMobile: msg.DmMobile, VendorStatus: utils.Int2Str(msg.OrderStatus), @@ -54,3 +55,12 @@ func (c *WaybillController) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVa retVal.VendorOrderID, retVal.OrderVendorID = controller.SplitUniversalOrderID(msg.OrderID) return retVal } + +// +func (c *WaybillController) CreateWaybill(bill *model.Waybill) (err error) { + return nil +} + +func (c *WaybillController) CancelWaybill(bill *model.Waybill) (err error) { + return nil +} diff --git a/business/controller/elm/order.go b/business/controller/elm/order.go index d14679c86..d2cf37f95 100644 --- a/business/controller/elm/order.go +++ b/business/controller/elm/order.go @@ -12,13 +12,14 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/controller" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/scheduler" ) type OrderController struct { } func init() { - controller.OrderManager.RegisterPurchasePlatform(controller.VendorIDJD, new(OrderController)) + scheduler.CurrentScheduler.RegisterPurchasePlatform(model.VendorIDJD, new(OrderController)) } func (c *OrderController) OnOrderStatusMsg(msg *elmapi.CallbackOrderStatusMsg) (retVal *elmapi.CallbackResponse) { @@ -45,8 +46,8 @@ func (c *OrderController) OnOrderCancelRefundMsg(msg *elmapi.CallbackOrderCancel func (c *OrderController) orderStatusMsg2Status(msg *elmapi.CallbackOrderStatusMsg) *model.OrderStatus { orderStatus := &model.OrderStatus{ VendorOrderID: msg.OrderID, - VendorID: controller.VendorIDELM, - OrderType: controller.OrderTypeOrder, + VendorID: model.VendorIDELM, + OrderType: model.OrderTypeOrder, VendorStatus: c.stateAndType2Str(msg.State, msg.MsgType), StatusTime: utils.Timestamp2Time(msg.UpdateTime), } @@ -56,8 +57,8 @@ func (c *OrderController) orderStatusMsg2Status(msg *elmapi.CallbackOrderStatusM func (c *OrderController) cancelRefundMsg2Status(msg *elmapi.CallbackOrderCancelRefundMsg) *model.OrderStatus { orderStatus := &model.OrderStatus{ VendorOrderID: msg.OrderID, - VendorID: controller.VendorIDELM, - OrderType: controller.OrderTypeOrder, + VendorID: model.VendorIDELM, + OrderType: model.OrderTypeOrder, VendorStatus: utils.Int2Str(msg.MsgType), StatusTime: utils.Timestamp2Time(msg.UpdateTime), } @@ -68,11 +69,11 @@ func (c *OrderController) onOrderStatusMsg(msg *elmapi.CallbackOrderStatusMsg) ( status := c.orderStatusMsg2Status(msg) switch msg.MsgType { case elmapi.MsgTypeOrderAccepted: - status.Status = controller.OrderStatusAccepted + status.Status = model.OrderStatusAccepted case elmapi.MsgTypeOrderCanceled, elmapi.MsgTypeOrderInvalid, elmapi.MsgTypeOrderForceInvalid: - status.Status = controller.OrderStatusCanceled + status.Status = model.OrderStatusCanceled case elmapi.MsgTypeOrderFinished: - status.Status = controller.OrderStatusFinished + status.Status = model.OrderStatusFinished default: globals.SugarLogger.Warnf("elm msg:%d not handled", msg.MsgType) return elmapi.SuccessResponse @@ -84,11 +85,11 @@ func (c *OrderController) onOrderCancelRefundMsg(msg *elmapi.CallbackOrderCancel status := c.cancelRefundMsg2Status(msg) switch msg.MsgType { case elmapi.MsgTypeUserApplyCancel: - status.Status = controller.OrderStatusApplyCancel + status.Status = model.OrderStatusApplyCancel case elmapi.MsgTypeUserApplyRefund: - status.Status = controller.OrderStatusApplyRefund + status.Status = model.OrderStatusApplyRefund default: - status.Status = controller.OrderStatusUnknown + status.Status = model.OrderStatusUnknown } return elmapi.Err2CallbackResponse(controller.OrderManager.OnOrderStatusChanged(status), status.VendorStatus) } @@ -105,7 +106,7 @@ func (c *OrderController) getOrderInfo(msg *elmapi.CallbackOrderStatusMsg) (orde // globals.SugarLogger.Debug(result) order = &model.GoodsOrder{ VendorOrderID: msg.OrderID, - VendorID: controller.VendorIDELM, + VendorID: model.VendorIDELM, VendorStoreID: utils.Int64ToStr(utils.MustInterface2Int64(result["shopId"])), StoreID: int(utils.Str2Int64WithDefault(utils.Interface2String(result["openId"]), 0)), StoreName: result["shopName"].(string), @@ -118,7 +119,7 @@ func (c *OrderController) getOrderInfo(msg *elmapi.CallbackOrderStatusMsg) (orde } deliveryGeo := strings.Split(utils.Interface2String(result["deliveryGeo"]), ",") if len(deliveryGeo) == 2 { - order.CoordinateType = controller.CoordinateTypeMars + order.CoordinateType = model.CoordinateTypeMars order.ConsigneeLng = controller.StandardCoordinate2Int(utils.Str2Float64(deliveryGeo[0])) order.ConsigneeLat = controller.StandardCoordinate2Int(utils.Str2Float64(deliveryGeo[1])) } @@ -130,7 +131,7 @@ func (c *OrderController) getOrderInfo(msg *elmapi.CallbackOrderStatusMsg) (orde product := product2.(map[string]interface{}) sku := &model.OrderSku{ VendorOrderID: msg.OrderID, - VendorID: controller.VendorIDELM, + VendorID: model.VendorIDELM, Count: int(utils.MustInterface2Int64(product["quantity"])), SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(product["extendCode"]), 0)), VendorSkuID: utils.Int64ToStr(utils.MustInterface2Int64(product["skuId"])), @@ -159,6 +160,7 @@ func (c *OrderController) onOrderNew(msg map[string]interface{}) (response *elma } order, orderSkus, err := c.getOrderInfo(fakeOrderMsg) if err == nil { + order.Status = model.OrderStatusNew err = controller.OrderManager.OnOrderNew(order, orderSkus) } return elmapi.Err2CallbackResponse(err, "elm onOrderNew") @@ -167,24 +169,33 @@ func (c *OrderController) onOrderNew(msg map[string]interface{}) (response *elma func (c *OrderController) onOrderUserUrgeOrder(msg *elmapi.CallbackOrderUrgeMsg) *elmapi.CallbackResponse { status := &model.OrderStatus{ VendorOrderID: msg.OrderID, - VendorID: controller.VendorIDELM, - OrderType: controller.OrderTypeOrder, - Status: controller.OrderStatusApplyUrgeOrder, + VendorID: model.VendorIDELM, + OrderType: model.OrderTypeOrder, + Status: model.OrderStatusApplyUrgeOrder, VendorStatus: utils.Int2Str(msg.MsgType), StatusTime: utils.Timestamp2Time(msg.UpdateTime), } return elmapi.Err2CallbackResponse(controller.OrderManager.OnOrderStatusChanged(status), status.VendorStatus) } -// PurchasePlatformHandler -func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) { - if isAcceptIt { - api.ElmAPI.ConfirmOrder(order.VendorOrderID) - } else { - api.ElmAPI.CancelOrder(order.VendorOrderID, elmapi.CancelOrderTypeOthers, "") - } -} - func (c *OrderController) stateAndType2Str(state string, msgType int) string { return fmt.Sprintf("%s-%d", state, msgType) } + +// PurchasePlatformHandler +func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { + if isAcceptIt { + err = api.ElmAPI.ConfirmOrder(order.VendorOrderID) + } else { + err = api.ElmAPI.CancelOrder(order.VendorOrderID, elmapi.CancelOrderTypeOthers, "") + } + return err +} + +func (c *OrderController) ForcePickUp(order *model.GoodsOrder) (err error) { + return nil +} + +func (c *OrderController) SwtichSelfDeliver(order *model.GoodsOrder) (err error) { + return nil +} diff --git a/business/controller/elm/waybill.go b/business/controller/elm/waybill.go index f8af05bf1..80c0bbadd 100644 --- a/business/controller/elm/waybill.go +++ b/business/controller/elm/waybill.go @@ -12,10 +12,6 @@ import ( type WaybillController struct { } -func init() { - controller.WaybillManager.RegisterDeliveryProvider(controller.VendorIDELM, new(WaybillController)) -} - func (c *WaybillController) OnWaybillStatusMsg(msg *elmapi.CallbackWaybillStatusMsg) (retVal *elmapi.CallbackResponse) { controller.CallMsgHandler(func() { retVal = c.onWaybillStatusMsg(msg) @@ -26,25 +22,25 @@ func (c *WaybillController) OnWaybillStatusMsg(msg *elmapi.CallbackWaybillStatus func (c *WaybillController) onWaybillStatusMsg(msg *elmapi.CallbackWaybillStatusMsg) (retVal *elmapi.CallbackResponse) { order := c.callbackMsg2Waybill(msg) if msg.MsgType == elmapi.MsgTypeWaybillWait4DeliveryVendor { - order.Status = controller.WaybillStatusNew + order.Status = model.WaybillStatusNew } else if msg.MsgType == elmapi.MsgTypeWaybillPickingUp { - order.Status = controller.WaybillStatusAccepted + order.Status = model.WaybillStatusAccepted } else if msg.MsgType == elmapi.MsgTypeWaybillCourierArrived { - order.Status = controller.WaybillStatusCourierArrived + order.Status = model.WaybillStatusCourierArrived } else if msg.MsgType == elmapi.MsgTypeWaybillDelivering { - order.Status = controller.WaybillStatusDelivering + order.Status = model.WaybillStatusDelivering } else if msg.MsgType == elmapi.MsgTypeWaybillDelivered { - order.Status = controller.WaybillStatusDelivered + order.Status = model.WaybillStatusDelivered } else if msg.MsgType >= elmapi.MsgTypeWaybillCanceledByMerchant && msg.MsgType <= elmapi.MsgTypeWaybillCanceledBySystem { - order.Status = controller.WaybillStatusCanceled + order.Status = model.WaybillStatusCanceled } else if msg.MsgType >= elmapi.MsgTypeWaybillFailedCallLate && msg.MsgType <= elmapi.MsgTypeRejectedSystemError && msg.MsgType != elmapi.MsgTypeDeiverBySelf { - order.Status = controller.WaybillStatusFailed + order.Status = model.WaybillStatusFailed } else { // MsgTypeWait4Courier // MsgTypeDeiverBySelf - order.Status = controller.WaybillStatusUnknown + order.Status = model.WaybillStatusUnknown } return elmapi.Err2CallbackResponse(controller.WaybillManager.OnWaybillStatusChanged(order), order.VendorStatus) } @@ -52,9 +48,9 @@ func (c *WaybillController) onWaybillStatusMsg(msg *elmapi.CallbackWaybillStatus func (c *WaybillController) callbackMsg2Waybill(msg *elmapi.CallbackWaybillStatusMsg) (retVal *model.Waybill) { retVal = &model.Waybill{ VendorOrderID: msg.OrderID, - OrderVendorID: controller.VendorIDELM, + OrderVendorID: model.VendorIDELM, VendorWaybillID: msg.OrderID, - WaybillVendorID: controller.VendorIDELM, + WaybillVendorID: model.VendorIDELM, CourierName: msg.Name, CourierMobile: msg.Phone, VendorStatus: c.composeState(msg.State, msg.SubState, elmapi.MsgTypeWaybillWait4DeliveryVendor), diff --git a/business/controller/jd/order.go b/business/controller/jd/order.go index 032fe0ef7..e8c363847 100644 --- a/business/controller/jd/order.go +++ b/business/controller/jd/order.go @@ -5,7 +5,7 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/controller" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/business/scheduler" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -13,7 +13,7 @@ type OrderController struct { } func init() { - controller.OrderManager.RegisterPurchasePlatform(controller.VendorIDELM, new(OrderController)) + scheduler.CurrentScheduler.RegisterPurchasePlatform(model.VendorIDELM, new(OrderController)) } func (c *OrderController) OnOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { @@ -24,25 +24,27 @@ func (c *OrderController) OnOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi } func (c *OrderController) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { - if jdapi.OrderStatusNew == msg.StatusID || jdapi.OrderStatusAdjust == msg.StatusID { + if jdapi.OrderStatusNew == msg.StatusID { retVal = c.onOrderNew(msg) + } else if jdapi.OrderStatusAdjust == msg.StatusID { + retVal = c.onOrderAdjust(msg) } else { status := c.callbackMsg2Status(msg) switch msg.StatusID { case jdapi.OrderStatusWaitOutStore: - status.Status = controller.OrderStatusAccepted + status.Status = model.OrderStatusAccepted case jdapi.OrderStatusFinishedPickup: - status.Status = controller.OrderStatusFinishedPickup + status.Status = model.OrderStatusFinishedPickup case jdapi.OrderStatusDelivering: - status.Status = controller.OrderStatusDelivering + status.Status = model.OrderStatusDelivering case jdapi.OrderStatusDelivered: - status.Status = controller.OrderStatusDelivered + status.Status = model.OrderStatusDelivered case jdapi.OrderStatusCanceled: - status.Status = controller.OrderStatusCanceled + status.Status = model.OrderStatusCanceled case jdapi.OrderStatusUserApplyCancel: - status.Status = controller.OrderStatusApplyCancel + status.Status = model.OrderStatusApplyCancel default: - status.Status = controller.OrderStatusUnknown + status.Status = model.OrderStatusUnknown } retVal = jdapi.Err2CallbackResponse(controller.OrderManager.OnOrderStatusChanged(status), status.VendorStatus) } @@ -55,7 +57,7 @@ func (c *OrderController) getOrderInfo(msg *jdapi.CallbackOrderMsg) (order *mode if err == nil { order = &model.GoodsOrder{ VendorOrderID: msg.BillID, - VendorID: controller.VendorIDJD, + VendorID: model.VendorIDJD, VendorStoreID: result["produceStationNo"].(string), StoreID: int(utils.Str2Int64WithDefault(utils.Interface2String(result["produceStationNoIsv"]), 0)), StoreName: result["produceStationName"].(string), @@ -64,7 +66,7 @@ func (c *OrderController) getOrderInfo(msg *jdapi.CallbackOrderMsg) (order *mode ConsigneeAddress: result["buyerFullAddress"].(string), ConsigneeLat: controller.StandardCoordinate2Int(utils.MustInterface2Float64(result["buyerLat"])), ConsigneeLng: controller.StandardCoordinate2Int(utils.MustInterface2Float64(result["buyerLng"])), - CoordinateType: controller.CoordinateTypeMars, + CoordinateType: model.CoordinateTypeMars, VendorStatus: msg.StatusID, OrderCreatedAt: utils.Str2Time(result["orderStartTime"].(string)), OriginalData: string(utils.MustMarshal(result)), @@ -75,7 +77,7 @@ func (c *OrderController) getOrderInfo(msg *jdapi.CallbackOrderMsg) (order *mode product := product2.(map[string]interface{}) sku := &model.OrderSku{ VendorOrderID: msg.BillID, - VendorID: controller.VendorIDJD, + VendorID: model.VendorIDJD, Count: int(utils.MustInterface2Int64(product["skuCount"])), SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(product["skuIdIsv"]), 0)), VendorSkuID: utils.Int64ToStr(utils.MustInterface2Int64(product["skuId"])), @@ -98,9 +100,8 @@ func (c *OrderController) getOrderInfo(msg *jdapi.CallbackOrderMsg) (order *mode func (c *OrderController) onOrderNew(msg *jdapi.CallbackOrderMsg) (response *jdapi.CallbackResponse) { order, orderSkus, err := c.getOrderInfo(msg) if err == nil { + order.Status = model.OrderStatusNew err = controller.OrderManager.OnOrderNew(order, orderSkus) - } else { - globals.SugarLogger.Debugf("get order error:%v", err) } return jdapi.Err2CallbackResponse(err, "jd onOrderNew") } @@ -108,23 +109,33 @@ func (c *OrderController) onOrderNew(msg *jdapi.CallbackOrderMsg) (response *jda func (c *OrderController) onOrderAdjust(msg *jdapi.CallbackOrderMsg) *jdapi.CallbackResponse { order, orderSkus, err := c.getOrderInfo(msg) if err == nil { + order.Status = model.OrderStatusAdjust err = controller.OrderManager.OnOrderAdjust(order, orderSkus) } return jdapi.Err2CallbackResponse(err, "jd onOrderAdjust") } -// PurchasePlatformHandler -func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) { - api.JdAPI.OrderAcceptOperate(order.VendorOrderID, isAcceptIt) -} - func (c *OrderController) callbackMsg2Status(msg *jdapi.CallbackOrderMsg) *model.OrderStatus { orderStatus := &model.OrderStatus{ VendorOrderID: msg.BillID, - VendorID: controller.VendorIDJD, - OrderType: controller.OrderTypeOrder, + VendorID: model.VendorIDJD, + OrderType: model.OrderTypeOrder, VendorStatus: msg.StatusID, StatusTime: utils.Str2Time(msg.Timestamp), } return orderStatus } + +// PurchasePlatformHandler +func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { + _, err = api.JdAPI.OrderAcceptOperate(order.VendorOrderID, isAcceptIt) + return err +} + +func (c *OrderController) ForcePickUp(order *model.GoodsOrder) (err error) { + return nil +} + +func (c *OrderController) SwtichSelfDeliver(order *model.GoodsOrder) (err error) { + return nil +} diff --git a/business/controller/jd/waybill.go b/business/controller/jd/waybill.go index 3dd31a709..f1d70f1a9 100644 --- a/business/controller/jd/waybill.go +++ b/business/controller/jd/waybill.go @@ -10,10 +10,6 @@ import ( type WaybillController struct { } -func init() { - controller.WaybillManager.RegisterDeliveryProvider(controller.VendorIDJD, new(WaybillController)) -} - func (c *WaybillController) OnWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *jdapi.CallbackResponse) { controller.CallMsgHandler(func() { retVal = c.onWaybillMsg(msg) @@ -25,21 +21,21 @@ func (c *WaybillController) onWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) ( order := c.callbackMsg2Waybill(msg) switch msg.DeliveryStatus { case jdapi.DeliveryStatusWait4Grap: - order.Status = controller.WaybillStatusNew + order.Status = model.WaybillStatusNew case jdapi.DeliveryStatusAccepted: - order.Status = controller.WaybillStatusAccepted + order.Status = model.WaybillStatusAccepted case jdapi.DeliveryStatusCourierCanceled: - order.Status = controller.WaybillStatusCanceled + order.Status = model.WaybillStatusCanceled case jdapi.DeliveryStatusCourierArrived: - order.Status = controller.WaybillStatusCourierArrived + order.Status = model.WaybillStatusCourierArrived case jdapi.DeliveryStatusGotGoods: - order.Status = controller.WaybillStatusDelivering + order.Status = model.WaybillStatusDelivering case jdapi.DeliveryStatusFinished: - order.Status = controller.WaybillStatusDelivered + order.Status = model.WaybillStatusDelivered case jdapi.DeliveryStatusFailedDelivery: - order.Status = controller.WaybillStatusFailed + order.Status = model.WaybillStatusFailed default: - order.Status = controller.WaybillStatusUnknown + order.Status = model.WaybillStatusUnknown } return jdapi.Err2CallbackResponse(controller.WaybillManager.OnWaybillStatusChanged(order), order.VendorStatus) } @@ -47,9 +43,9 @@ func (c *WaybillController) onWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) ( func (c *WaybillController) callbackMsg2Waybill(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *model.Waybill) { retVal = &model.Waybill{ VendorOrderID: msg.OrderID, - OrderVendorID: controller.VendorIDJD, + OrderVendorID: model.VendorIDJD, VendorWaybillID: msg.OrderID, - WaybillVendorID: controller.VendorIDJD, + WaybillVendorID: model.VendorIDJD, CourierName: msg.DeliveryManName, CourierMobile: msg.DeliveryManPhone, VendorStatus: msg.DeliveryStatus, diff --git a/business/controller/mtps/waybill.go b/business/controller/mtps/waybill.go index 523293293..efbd40d46 100644 --- a/business/controller/mtps/waybill.go +++ b/business/controller/mtps/waybill.go @@ -5,6 +5,7 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/controller" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/scheduler" "git.rosy.net.cn/jx-callback/globals" ) @@ -12,7 +13,7 @@ type WaybillController struct { } func init() { - controller.OrderManager.RegisterDeliveryPlatform(controller.VendorIDMTPS, new(WaybillController)) + scheduler.CurrentScheduler.RegisterDeliveryPlatform(model.VendorIDMTPS, new(WaybillController)) } func (c *WaybillController) OnWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *mtpsapi.CallbackResponse) { @@ -27,10 +28,10 @@ func (c *WaybillController) OnWaybillExcept(msg *mtpsapi.CallbackOrderExceptionM order := &model.Waybill{ VendorWaybillID: msg.MtPeisongID, VendorWaybillID2: utils.Int64ToStr(msg.DeliveryID), - WaybillVendorID: controller.VendorIDMTPS, + WaybillVendorID: model.VendorIDMTPS, CourierName: msg.CourierName, CourierMobile: msg.CourierPhone, - Status: controller.WaybillStatusFailed, + Status: model.WaybillStatusFailed, VendorStatus: utils.Int2Str(msg.ExceptionCode), WaybillCreatedAt: utils.Timestamp2Time(msg.Timestamp), } @@ -44,15 +45,15 @@ func (c *WaybillController) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal order := c.callbackMsg2Waybill(msg) switch msg.Status { case mtpsapi.OrderStatusWaitingForSchedule: - order.Status = controller.WaybillStatusNew + order.Status = model.WaybillStatusNew case mtpsapi.OrderStatusAccepted: - order.Status = controller.WaybillStatusAccepted + order.Status = model.WaybillStatusAccepted case mtpsapi.OrderStatusPickedUp: - order.Status = controller.WaybillStatusDelivering + order.Status = model.WaybillStatusDelivering case mtpsapi.OrderStatusDeliverred: - order.Status = controller.WaybillStatusDelivered + order.Status = model.WaybillStatusDelivered case mtpsapi.OrderStatusCanceled: - order.Status = controller.WaybillStatusCanceled + order.Status = model.WaybillStatusCanceled default: globals.SugarLogger.Warnf("unknown msg:%v", msg) return mtpsapi.SuccessResponse @@ -64,7 +65,7 @@ func (c *WaybillController) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) ( retVal = &model.Waybill{ VendorWaybillID: msg.MtPeisongID, VendorWaybillID2: utils.Int64ToStr(msg.DeliveryID), - WaybillVendorID: controller.VendorIDMTPS, + WaybillVendorID: model.VendorIDMTPS, CourierName: msg.CourierName, CourierMobile: msg.CourierPhone, VendorStatus: utils.Int2Str(msg.Status), @@ -73,3 +74,12 @@ func (c *WaybillController) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) ( retVal.VendorOrderID, retVal.OrderVendorID = controller.SplitUniversalOrderID(msg.OrderID) return retVal } + +// +func (c *WaybillController) CreateWaybill(bill *model.Waybill) (err error) { + return nil +} + +func (c *WaybillController) CancelWaybill(bill *model.Waybill) (err error) { + return nil +} diff --git a/business/controller/order.go b/business/controller/order.go index c9f2b6b17..4ea04473b 100644 --- a/business/controller/order.go +++ b/business/controller/order.go @@ -1,8 +1,6 @@ package controller import ( - "fmt" - "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" @@ -11,83 +9,25 @@ import ( "github.com/astaxie/beego/orm" ) -const ( - OrderStatusApplyUrgeOrder = -15 - OrderStatusApplyRefund = -10 - OrderStatusApplyCancel = -5 - - OrderStatusUnknown = 0 - - OrderStatusNew = 5 // 新定单 - OrderStatusAdjust = 8 // 定单调整 - OrderStatusAccepted = 10 // 已经接单,也即待出库,待拣货 - OrderStatusFinishedPickup = 15 // 拣货完成 - OrderStatusDelivering = 20 // 开始配送,配送员已取货,从这里开始就是运单消息了 - - OrderStatusEndBegin = 100 // 以上的状态就是结束状态 - OrderStatusDelivered = 105 // 妥投 - OrderStatusFinished = 110 // 定单已完成 - OrderStatusCanceled = 115 // 定单已取消 - OrderStatusFailed = 120 // 定单已失败 -) - -const ( - LockStatusUnlocked = 0 - LockStatusLocked = 1 -) - -type PurchasePlatformHandler interface { - AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) -} - -type DeliveryPlatformHandler interface { - DeliveryProvider -} - +// 所有公共接口调用前,要求在order里或status中设置合适的Status type OrderController struct { - orderMap SyncMapWithTimeout - purchasePlatformHandlers map[int]PurchasePlatformHandler - deliveryPlatformHandlers map[int]DeliveryPlatformHandler + orderMap SyncMapWithTimeout } func NewOrderManager() *OrderController { - return &OrderController{ - purchasePlatformHandlers: make(map[int]PurchasePlatformHandler), - deliveryPlatformHandlers: make(map[int]DeliveryPlatformHandler), - } -} - -func (c *OrderController) RegisterPurchasePlatform(vendorID int, handler PurchasePlatformHandler) { - if !(vendorID >= VendorIDPurchaseBegin && vendorID <= VendorIDPurchaseEnd) { - panic(fmt.Sprintf("purchase vendor:%d is illegal", vendorID)) - } - if _, ok := c.purchasePlatformHandlers[vendorID]; ok { - panic(fmt.Sprintf("purchase vendor:%d, already exists", vendorID)) - } - c.purchasePlatformHandlers[vendorID] = handler -} - -func (c *OrderController) RegisterDeliveryPlatform(vendorID int, handler DeliveryPlatformHandler) { - if !(vendorID >= VendorIDDeliveryBegin && vendorID <= VendorIDDeliveryEnd) { - panic(fmt.Sprintf("delivery vendor:%d is illegal", vendorID)) - } - if _, ok := c.deliveryPlatformHandlers[vendorID]; ok { - panic(fmt.Sprintf("delivery vendor:%d, already exists", vendorID)) - } - c.deliveryPlatformHandlers[vendorID] = handler + return &OrderController{} } func (c *OrderController) OnOrderNew(order *model.GoodsOrder, orderSkus []*model.OrderSku) (err error) { db := orm.NewOrm() - order.Status = OrderStatusNew isDuplicated, err := addOrderOrWaybillStatus(c.order2Status(order), db) if !isDuplicated { c.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, order.ConsigneeMobile, order.StoreID, db, func(isAccept bool) { // c.purchasePlatformHandlers[order.VendorID].AcceptOrRefuseOrder(order, isAccept) if isAccept { - order.Status = OrderStatusAccepted + order.Status = model.OrderStatusAccepted } else { - order.Status = OrderStatusFailed + order.Status = model.OrderStatusFailed } }) if err = c.updateOrderOtherInfo(order, db); err == nil { @@ -131,7 +71,6 @@ func (c *OrderController) OnOrderNew(order *model.GoodsOrder, orderSkus []*model func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder, orderSkus []*model.OrderSku) (err error) { db := orm.NewOrm() - order.Status = OrderStatusAdjust isDuplicated, err := addOrderOrWaybillStatus(c.order2Status(order), db) if err == nil && !isDuplicated { err = utils.CallFuncLogError(func() error { @@ -207,7 +146,7 @@ func (c *OrderController) addOrderStatus(orderStatus *model.OrderStatus, db orm. db = orm.NewOrm() } isDuplicated, err = addOrderOrWaybillStatus(orderStatus, db) - if !isDuplicated && orderStatus.Status > OrderStatusUnknown { + if !isDuplicated && orderStatus.Status > model.OrderStatusUnknown { order := &model.GoodsOrder{ VendorOrderID: orderStatus.VendorOrderID, VendorID: orderStatus.VendorID, @@ -217,7 +156,7 @@ func (c *OrderController) addOrderStatus(orderStatus *model.OrderStatus, db orm. order.VendorStatus = orderStatus.VendorStatus utils.CallFuncLogError(func() error { columns := []string{"Status", "VendorStatus"} - if orderStatus.Status >= OrderStatusEndBegin { + if orderStatus.Status >= model.OrderStatusEndBegin { order.OrderFinishedAt = orderStatus.StatusTime columns = append(columns, "OrderFinishedAt") } @@ -248,7 +187,7 @@ func (c *OrderController) order2Status(order *model.GoodsOrder) (retVal *model.O retVal = &model.OrderStatus{ VendorOrderID: order.VendorOrderID, VendorID: order.VendorID, - OrderType: OrderTypeOrder, + OrderType: model.OrderTypeOrder, Status: order.Status, VendorStatus: order.VendorStatus, StatusTime: order.OrderCreatedAt, @@ -270,7 +209,7 @@ func (c *OrderController) updateOrderByWaybill(bill *model.Waybill, db orm.Ormer VendorID: bill.OrderVendorID, } if err = db.Read(order, "VendorOrderID", "VendorID"); err == nil { - if order.Status < OrderStatusEndBegin { + if order.Status < model.OrderStatusEndBegin { order.WaybillStatus = bill.Status order.WaybillVendorStatus = bill.VendorStatus db.Update(order, "WaybillStatus", "WaybillVendorStatus") diff --git a/business/controller/waybill.go b/business/controller/waybill.go index eeab584ee..1691e10fc 100644 --- a/business/controller/waybill.go +++ b/business/controller/waybill.go @@ -1,59 +1,25 @@ package controller import ( - "fmt" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) -const ( - WaybillStatusUnknown = 0 - - WaybillStatusNew = 5 - WaybillStatusAcceptCanceled = 8 - WaybillStatusAccepted = 10 - WaybillStatusCourierArrived = 15 // 此状态是可选的,明确写出来是因为还是较重要的状态,但业务逻辑不应依赖此状态 - WaybillStatusDelivering = 20 - - WaybillStatusDelivered = 105 - WaybillStatusCanceled = 115 - WaybillStatusFailed = 120 -) - -type DeliveryProvider interface { -} - +// 所有公共接口调用前,要求在order里或status中设置合适的Status type WaybillController struct { - WaybillMap SyncMapWithTimeout - deliveryProviders map[int]DeliveryProvider + WaybillMap SyncMapWithTimeout } func NewWaybillManager() *WaybillController { - return &WaybillController{ - deliveryProviders: make(map[int]DeliveryProvider), - } -} - -func (w *WaybillController) RegisterDeliveryProvider(vendorID int, handler DeliveryProvider) { - if !(vendorID >= VendorIDDeliveryBegin && vendorID <= VendorIDDeliveryEnd || - vendorID >= VendorIDPurchaseBegin && vendorID <= VendorIDPurchaseEnd) { - panic(fmt.Sprintf("delivery provider vendor:%d is illegal", vendorID)) - } - if _, ok := w.deliveryProviders[vendorID]; ok { - panic(fmt.Sprintf("delivery provider vendor:%d, already exists", vendorID)) - } - w.deliveryProviders[vendorID] = handler + return &WaybillController{} } func (w *WaybillController) onWaybillNew(bill *model.Waybill) (err error) { db := orm.NewOrm() - bill.Status = WaybillStatusNew isDuplicated, err := addOrderOrWaybillStatus(w.waybill2Status(bill), db) if !isDuplicated { - bill.Status = WaybillStatusNew bill.WaybillFinishedAt = DefaultTimeValue bill.ID = 0 created, _, err2 := db.ReadOrCreate(bill, "VendorWaybillID", "WaybillVendorID") @@ -73,9 +39,9 @@ func (w *WaybillController) onWaybillNew(bill *model.Waybill) (err error) { } func (w *WaybillController) OnWaybillStatusChanged(bill *model.Waybill) (err error) { - if bill.Status == WaybillStatusNew { + if bill.Status == model.WaybillStatusNew { err = w.onWaybillNew(bill) - } else if bill.Status == WaybillStatusAccepted { + } else if bill.Status == model.WaybillStatusAccepted { err = w.onWaybillAccepted(bill) } else { db := orm.NewOrm() @@ -89,7 +55,6 @@ func (w *WaybillController) OnWaybillStatusChanged(bill *model.Waybill) (err err func (w *WaybillController) onWaybillAccepted(bill *model.Waybill) (err error) { db := orm.NewOrm() - bill.Status = WaybillStatusAccepted isDuplicated, err := w.addWaybillStatus(bill, db) if !isDuplicated { if err = w.updateWaybillPKID(bill, db); err == nil { @@ -111,13 +76,13 @@ func (w *WaybillController) addWaybillStatus(bill *model.Waybill, db orm.Ormer) } waybillStatus := w.waybill2Status(bill) isDuplicated, err = addOrderOrWaybillStatus(waybillStatus, db) - if !isDuplicated && waybillStatus.Status > WaybillStatusUnknown { + if !isDuplicated && waybillStatus.Status > model.WaybillStatusUnknown { if err = w.updateWaybillPKID(bill, db); err == nil { bill.Status = waybillStatus.Status bill.VendorStatus = waybillStatus.VendorStatus utils.CallFuncLogError(func() error { columns := []string{"Status", "VendorStatus"} - if waybillStatus.Status >= OrderStatusEndBegin { + if waybillStatus.Status >= model.OrderStatusEndBegin { bill.WaybillFinishedAt = waybillStatus.StatusTime columns = append(columns, "WaybillFinishedAt") } @@ -133,7 +98,7 @@ func (w *WaybillController) waybill2Status(bill *model.Waybill) (retVal *model.O retVal = &model.OrderStatus{ VendorOrderID: bill.VendorWaybillID, VendorID: bill.WaybillVendorID, - OrderType: OrderTypeWaybill, + OrderType: model.OrderTypeWaybill, Status: bill.Status, VendorStatus: bill.VendorStatus, StatusTime: bill.WaybillCreatedAt, diff --git a/business/model/const.go b/business/model/const.go new file mode 100644 index 000000000..a38965e4f --- /dev/null +++ b/business/model/const.go @@ -0,0 +1,64 @@ +package model + +const ( + VenderIDUnknown = -1 + VendorIDPurchaseBegin = 0 + VendorIDJD = 0 + VendorIDMTWM = 1 + VendorIDELM = 2 + VendorIDPurchaseEnd = 2 + + VendorIDDeliveryBegin = 101 + VendorIDDada = 101 + VendorIDMTPS = 102 + VendorIDDeliveryEnd = 102 +) + +const ( + OrderTypeOrder = 1 + OrderTypeWaybill = 2 +) + +const ( + CoordinateTypeMars = 0 // 火星坐标 + CoordinateTypeReal = 1 // 真实坐标 +) + +const ( + OrderStatusApplyUrgeOrder = -15 + OrderStatusApplyRefund = -10 + OrderStatusApplyCancel = -5 + + OrderStatusUnknown = 0 + + OrderStatusNew = 5 // 新定单 + OrderStatusAdjust = 8 // 定单调整 + OrderStatusAccepted = 10 // 已经接单,也即待出库,待拣货 + OrderStatusFinishedPickup = 15 // 拣货完成 + OrderStatusDelivering = 20 // 开始配送,配送员已取货,从这里开始就是运单消息了 + + OrderStatusEndBegin = 100 // 以上的状态就是结束状态 + OrderStatusDelivered = 105 // 妥投 + OrderStatusFinished = 110 // 定单已完成 + OrderStatusCanceled = 115 // 定单已取消 + OrderStatusFailed = 120 // 定单已失败 +) + +const ( + LockStatusUnlocked = 0 + LockStatusLocked = 1 +) + +const ( + WaybillStatusUnknown = 0 + + WaybillStatusNew = 5 + WaybillStatusAcceptCanceled = 8 + WaybillStatusAccepted = 10 + WaybillStatusCourierArrived = 15 // 此状态是可选的,明确写出来是因为还是较重要的状态,但业务逻辑不应依赖此状态 + WaybillStatusDelivering = 20 + + WaybillStatusDelivered = 105 + WaybillStatusCanceled = 115 + WaybillStatusFailed = 120 +) diff --git a/business/scheduler/defsch/defsch.go b/business/scheduler/defsch/defsch.go new file mode 100644 index 000000000..11b5d6541 --- /dev/null +++ b/business/scheduler/defsch/defsch.go @@ -0,0 +1,34 @@ +package defsch + +import ( + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/scheduler" +) + +type DefScheduler struct { + scheduler.BaseScheduler +} + +func init() { + sch := &DefScheduler{} + sch.Init() + scheduler.CurrentScheduler = sch +} + +// 以下是定单 +func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder) (err error) { + return nil +} + +func (s *DefScheduler) OnOrderAccepted(order *model.GoodsOrder) (err error) { + return nil +} + +func (s *DefScheduler) OnOrderStatusChanged(status *model.OrderStatus) (err error) { + return nil +} + +// 以下是运单 +func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill) (err error) { + return nil +} diff --git a/business/scheduler/scheduler.go b/business/scheduler/scheduler.go new file mode 100644 index 000000000..58aff3a22 --- /dev/null +++ b/business/scheduler/scheduler.go @@ -0,0 +1,85 @@ +package scheduler + +import ( + "fmt" + "time" + + "git.rosy.net.cn/jx-callback/business/model" +) + +var ( + CurrentScheduler Scheduler +) + +type AutoStatusChangeConfig struct { + NextStatus int + Timeout time.Duration +} + +type StatusConfig struct { + AutoStatusChange map[int][]*AutoStatusChangeConfig +} + +type PurchasePlatformHandler interface { + AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) + ForcePickUp(order *model.GoodsOrder) (err error) + SwtichSelfDeliver(order *model.GoodsOrder) (err error) +} + +type DeliveryPlatformHandler interface { + CreateWaybill(bill *model.Waybill) (err error) + CancelWaybill(bill *model.Waybill) (err error) +} + +type OrderManager interface { + MasterWaybillStatusChanged(*model.Waybill) (err error) +} + +type Scheduler interface { + RegisterOrderManager(handler OrderManager) + RegisterPurchasePlatform(vendorID int, handler PurchasePlatformHandler) + RegisterDeliveryPlatform(vendorID int, handler DeliveryPlatformHandler) + + // 以下是定单 + OnOrderNew(order *model.GoodsOrder) (err error) + OnOrderAccepted(order *model.GoodsOrder) (err error) + OnOrderStatusChanged(status *model.OrderStatus) (err error) + + // 以下是运单 + OnWaybillStatusChanged(bill *model.Waybill) (err error) +} + +type BaseScheduler struct { + orderManager OrderManager + purchasePlatformHandlers map[int]PurchasePlatformHandler + deliveryPlatformHandlers map[int]DeliveryPlatformHandler +} + +func (c *BaseScheduler) Init() { + c.purchasePlatformHandlers = make(map[int]PurchasePlatformHandler) + c.deliveryPlatformHandlers = make(map[int]DeliveryPlatformHandler) +} + +func (c *BaseScheduler) RegisterOrderManager(handler OrderManager) { + c.orderManager = handler +} + +func (c *BaseScheduler) RegisterPurchasePlatform(vendorID int, handler PurchasePlatformHandler) { + if !(vendorID >= model.VendorIDPurchaseBegin && vendorID <= model.VendorIDPurchaseEnd) { + panic(fmt.Sprintf("purchase vendor:%d is illegal", vendorID)) + } + if _, ok := c.purchasePlatformHandlers[vendorID]; ok { + panic(fmt.Sprintf("purchase vendor:%d, already exists", vendorID)) + } + c.purchasePlatformHandlers[vendorID] = handler +} + +func (c *BaseScheduler) RegisterDeliveryPlatform(vendorID int, handler DeliveryPlatformHandler) { + if !(vendorID >= model.VendorIDDeliveryBegin && vendorID <= model.VendorIDDeliveryEnd) { + panic(fmt.Sprintf("delivery vendor:%d is illegal", vendorID)) + } + if _, ok := c.deliveryPlatformHandlers[vendorID]; ok { + panic(fmt.Sprintf("delivery vendor:%d, already exists", vendorID)) + } + c.deliveryPlatformHandlers[vendorID] = handler +} diff --git a/globals/globals.go b/globals/globals.go index 7e59aa324..13788b19e 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -39,10 +39,12 @@ func initDB() { // set default database orm.RegisterDataBase("default", "mysql", beego.AppConfig.String("dbConnectStr"), 30) models.RegisterModels() - orm.RegisterModel(new(model.GoodsOrder)) - orm.RegisterModel(new(model.OrderSku)) - orm.RegisterModel(new(model.Waybill)) - orm.RegisterModel(new(model.OrderStatus)) + if CallNew { + orm.RegisterModel(new(model.GoodsOrder)) + orm.RegisterModel(new(model.OrderSku)) + orm.RegisterModel(new(model.Waybill)) + orm.RegisterModel(new(model.OrderStatus)) + } // create table orm.RunSyncdb("default", false, true) }