From d40186e930ea39a6a93b4599e255061fea4d4484 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 17 Aug 2018 13:59:15 +0800 Subject: [PATCH 01/16] - refactor file structure. --- .../orderman}/order.go | 32 ++++------- .../orderman}/order_legacy.go | 8 +-- .../orderman/orderman.go} | 27 +++++---- .../orderman}/waybill.go | 20 ++----- .../scheduler/defsch/defsch.go | 10 ++-- .../{ => jxcallback}/scheduler/scheduler.go | 55 +++---------------- .../delivery}/dada/waybill.go | 8 +-- .../delivery}/dada/waybill_test.go | 4 +- .../delivery}/mtps/waybill.go | 12 ++-- .../delivery}/mtps/waybill_test.go | 4 +- business/partner/partner.go | 52 ++++++++++++++++++ .../purchase}/elm/elm.go | 0 .../purchase}/elm/order.go | 18 +++--- .../purchase}/elm/order_legacy.go | 9 +-- .../purchase}/elm/order_test.go | 1 + .../purchase}/elm/waybill.go | 4 +- .../purchase}/jd/order.go | 14 ++--- .../purchase}/jd/order_legacy.go | 0 .../purchase}/jd/order_test.go | 8 +-- .../purchase}/jd/waybill.go | 4 +- controllers/dada_order.go | 2 +- controllers/elm_order.go | 2 +- controllers/jd_order.go | 2 +- controllers/mtps_order.go | 2 +- main.go | 5 +- 25 files changed, 153 insertions(+), 150 deletions(-) rename business/{controller => jxcallback/orderman}/order.go (91%) rename business/{controller => jxcallback/orderman}/order_legacy.go (96%) rename business/{controller/controller.go => jxcallback/orderman/orderman.go} (86%) rename business/{controller => jxcallback/orderman}/waybill.go (83%) rename business/{ => jxcallback}/scheduler/defsch/defsch.go (99%) rename business/{ => jxcallback}/scheduler/scheduler.go (83%) rename business/{controller => partner/delivery}/dada/waybill.go (95%) rename business/{controller => partner/delivery}/dada/waybill_test.go (86%) rename business/{controller => partner/delivery}/mtps/waybill.go (96%) rename business/{controller => partner/delivery}/mtps/waybill_test.go (87%) create mode 100644 business/partner/partner.go rename business/{controller => partner/purchase}/elm/elm.go (100%) rename business/{controller => partner/purchase}/elm/order.go (96%) rename business/{controller => partner/purchase}/elm/order_legacy.go (99%) rename business/{controller => partner/purchase}/elm/order_test.go (92%) rename business/{controller => partner/purchase}/elm/waybill.go (94%) rename business/{controller => partner/purchase}/jd/order.go (96%) rename business/{controller => partner/purchase}/jd/order_legacy.go (100%) rename business/{controller => partner/purchase}/jd/order_test.go (79%) rename business/{controller => partner/purchase}/jd/waybill.go (93%) diff --git a/business/controller/order.go b/business/jxcallback/orderman/order.go similarity index 91% rename from business/controller/order.go rename to business/jxcallback/orderman/order.go index 16cc181f0..81006a034 100644 --- a/business/controller/order.go +++ b/business/jxcallback/orderman/order.go @@ -1,4 +1,4 @@ -package controller +package orderman import ( "fmt" @@ -6,22 +6,14 @@ import ( "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/scheduler" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) -// 所有公共接口调用前,要求在order里或status中设置合适的Status -type OrderController struct { -} - -func NewOrderManager() *OrderController { - return &OrderController{} -} - -func (c *OrderController) LoadPendingOrders() []*model.GoodsOrder { +func (c *OrderManager) LoadPendingOrders() []*model.GoodsOrder { db := orm.NewOrm() var orders []*model.GoodsOrder tillTime := time.Now().Add(-pendingOrderGapMax) @@ -46,7 +38,7 @@ func (c *OrderController) LoadPendingOrders() []*model.GoodsOrder { // msgVendorStatus的意思是事件本身的类型,类似有时收到NewOrder事件去取,订单状态不一定就是New的 // OnOrderAdjust也类似,而OrderStatus要记录的是消息,所以添加这个 -func (c *OrderController) OnOrderNew(order *model.GoodsOrder, msgVendorStatus string) (err error) { +func (c *OrderManager) OnOrderNew(order *model.GoodsOrder, msgVendorStatus string) (err error) { // todo transaction db := orm.NewOrm() if order.Status == model.OrderStatusUnknown { @@ -65,7 +57,7 @@ func (c *OrderController) OnOrderNew(order *model.GoodsOrder, msgVendorStatus st } // todo 调整单的处理可能还需要再细化一点,当前只是简单的删除重建 -func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder, msgVendorStatus string) (err error) { +func (c *OrderManager) OnOrderAdjust(order *model.GoodsOrder, msgVendorStatus string) (err error) { // todo transaction db := orm.NewOrm() if order.Status == model.OrderStatusUnknown { @@ -99,7 +91,7 @@ func (c *OrderController) OnOrderAdjust(order *model.GoodsOrder, msgVendorStatus return err } -func (c *OrderController) OnOrderStatusChanged(orderStatus *model.OrderStatus) (err error) { +func (c *OrderManager) OnOrderStatusChanged(orderStatus *model.OrderStatus) (err error) { isDuplicated, err := c.addOrderStatus(orderStatus, nil) if err == nil && !isDuplicated { err = scheduler.CurrentScheduler.OnOrderStatusChanged(orderStatus, false) @@ -111,7 +103,7 @@ func (c *OrderController) OnOrderStatusChanged(orderStatus *model.OrderStatus) ( } // private -func (c *OrderController) saveOrder(order *model.GoodsOrder, isAdjust bool, db orm.Ormer) (isDuplicated bool, err error) { +func (c *OrderManager) saveOrder(order *model.GoodsOrder, isAdjust bool, db orm.Ormer) (isDuplicated bool, err error) { // 忽略查找JX信息错误 c.updateOrderOtherInfo(order, db) order.ID = 0 @@ -170,7 +162,7 @@ func (c *OrderController) saveOrder(order *model.GoodsOrder, isAdjust bool, db o return isDuplicated, err } -func (c *OrderController) updateOrderSkuOtherInfo(order *model.GoodsOrder, db orm.Ormer) (err error) { +func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db orm.Ormer) (err error) { jxStoreID := jxutils.GetJxStoreIDFromOrder(order) if jxStoreID == 0 { globals.SugarLogger.Infof("updateOrderSkuOtherInfo [运营]订单在京西与平台都找不到京西门店信息orderID:%s, VendorStoreID:%s", order.VendorOrderID, order.VendorStoreID) @@ -245,7 +237,7 @@ func (c *OrderController) updateOrderSkuOtherInfo(order *model.GoodsOrder, db or return err } -func (c *OrderController) updateOrderOtherInfo(order *model.GoodsOrder, db orm.Ormer) (err error) { +func (c *OrderManager) updateOrderOtherInfo(order *model.GoodsOrder, db orm.Ormer) (err error) { var sql string if order.VendorID == model.VendorIDJD { sql = ` @@ -274,7 +266,7 @@ func (c *OrderController) updateOrderOtherInfo(order *model.GoodsOrder, db orm.O return err } -func (c *OrderController) addOrderStatus(orderStatus *model.OrderStatus, db orm.Ormer) (isDuplicated bool, err error) { +func (c *OrderManager) addOrderStatus(orderStatus *model.OrderStatus, db orm.Ormer) (isDuplicated bool, err error) { if db == nil { db = orm.NewOrm() } @@ -329,7 +321,7 @@ func (c *OrderController) addOrderStatus(orderStatus *model.OrderStatus, db orm. return isDuplicated, err } -func (c *OrderController) LoadOrder(vendorOrderID string, vendorID int) (order *model.GoodsOrder, err error) { +func (c *OrderManager) LoadOrder(vendorOrderID string, vendorID int) (order *model.GoodsOrder, err error) { db := orm.NewOrm() order = &model.GoodsOrder{ VendorOrderID: vendorOrderID, @@ -348,7 +340,7 @@ func (c *OrderController) LoadOrder(vendorOrderID string, vendorID int) (order * } //Waybill -func (c *OrderController) UpdateWaybillVendorID(bill *model.Waybill, revertStatus bool) (err error) { +func (c *OrderManager) UpdateWaybillVendorID(bill *model.Waybill, revertStatus bool) (err error) { globals.SugarLogger.Debugf("UpdateWaybillVendorID bill:%v", bill) db := orm.NewOrm() params := orm.Params{ diff --git a/business/controller/order_legacy.go b/business/jxcallback/orderman/order_legacy.go similarity index 96% rename from business/controller/order_legacy.go rename to business/jxcallback/orderman/order_legacy.go index a6e61b179..b77f707c5 100644 --- a/business/controller/order_legacy.go +++ b/business/jxcallback/orderman/order_legacy.go @@ -1,4 +1,4 @@ -package controller +package orderman import ( "strings" @@ -124,7 +124,7 @@ func legacyMapWaybillStatus(status int) (retVal int8) { return retVal } -func (c *OrderController) legacyWriteJxOrder(order *model.GoodsOrder, db orm.Ormer, isDelFirst bool) (err error) { +func (c *OrderManager) legacyWriteJxOrder(order *model.GoodsOrder, db orm.Ormer, isDelFirst bool) (err error) { var result map[string]interface{} businessTags := "" if order.VendorID == model.VendorIDJD && utils.UnmarshalUseNumber([]byte(order.OriginalData), &result) == nil { @@ -223,7 +223,7 @@ func (c *OrderController) legacyWriteJxOrder(order *model.GoodsOrder, db orm.Orm return err } -func (c *OrderController) legacyJxOrderStatusChanged(status *model.OrderStatus, db orm.Ormer) (err error) { +func (c *OrderManager) legacyJxOrderStatusChanged(status *model.OrderStatus, db orm.Ormer) (err error) { orderStatus := legacyMapOrderStatus(status.Status) if orderStatus != JX_STATUS_UNKNOWN { if status.VendorID == model.VendorIDELM { @@ -268,7 +268,7 @@ func (c *OrderController) legacyJxOrderStatusChanged(status *model.OrderStatus, return err } -func (c *WaybillController) legacyWaybillStatusChanged(bill *model.Waybill, db orm.Ormer) (err error) { +func (c *OrderManager) legacyWaybillStatusChanged(bill *model.Waybill, db orm.Ormer) (err error) { deliveryStatus := legacyMapWaybillStatus(bill.Status) if deliveryStatus != JX_STATUS_UNKNOWN { if db == nil { diff --git a/business/controller/controller.go b/business/jxcallback/orderman/orderman.go similarity index 86% rename from business/controller/controller.go rename to business/jxcallback/orderman/orderman.go index 6edca7dc6..83e84325c 100644 --- a/business/controller/controller.go +++ b/business/jxcallback/orderman/orderman.go @@ -1,14 +1,15 @@ -package controller +package orderman import ( "sort" "time" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" + _ "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler/defsch" // 导入缺省订单调度器 "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/scheduler" - _ "git.rosy.net.cn/jx-callback/business/scheduler/defsch" // 导入缺省订单调度器 + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) @@ -20,10 +21,17 @@ const ( ) var ( - OrderManager *OrderController - WaybillManager *WaybillController + CurOrderManager *OrderManager ) +// 所有公共接口调用前,要求在order里或status中设置合适的Status +type OrderManager struct { +} + +func NewOrderManager() *OrderManager { + return &OrderManager{} +} + type StatusTimer interface { GetStatusTime() time.Time } @@ -45,9 +53,8 @@ func (s StatusTimerSlice) Swap(i, j int) { } func init() { - OrderManager = NewOrderManager() - WaybillManager = NewWaybillManager() - scheduler.CurrentScheduler.RegisterOrderManager(OrderManager) + CurOrderManager = NewOrderManager() + partner.Init(CurOrderManager) } func addOrderOrWaybillStatus(status *model.OrderStatus, db orm.Ormer) (isDuplicated bool, err error) { @@ -79,12 +86,12 @@ func addOrderOrWaybillStatus(status *model.OrderStatus, db orm.Ormer) (isDuplica // todo 最好还是改成全事件回放算了 func LoadPendingOrders() { - orders := OrderManager.LoadPendingOrders() + orders := CurOrderManager.LoadPendingOrders() globals.SugarLogger.Infof("LoadPendingOrders orders count:%d", len(orders)) ordersCount := len(orders) if ordersCount > 0 { - bills := WaybillManager.LoadPendingWaybills() + bills := CurOrderManager.LoadPendingWaybills() globals.SugarLogger.Infof("LoadPendingOrders waybills count:%d", len(bills)) var sortOrders StatusTimerSlice for _, order := range orders { diff --git a/business/controller/waybill.go b/business/jxcallback/orderman/waybill.go similarity index 83% rename from business/controller/waybill.go rename to business/jxcallback/orderman/waybill.go index d16e2f171..618757907 100644 --- a/business/controller/waybill.go +++ b/business/jxcallback/orderman/waybill.go @@ -1,24 +1,16 @@ -package controller +package orderman import ( "time" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/scheduler" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) -// 所有公共接口调用前,要求在order里或status中设置合适的Status -type WaybillController struct { -} - -func NewWaybillManager() *WaybillController { - return &WaybillController{} -} - -func (w *WaybillController) LoadPendingWaybills() []*model.Waybill { +func (w *OrderManager) LoadPendingWaybills() []*model.Waybill { db := orm.NewOrm() var bills []*model.Waybill tillTime := time.Now().Add(-pendingOrderGapMax) @@ -39,7 +31,7 @@ func (w *WaybillController) LoadPendingWaybills() []*model.Waybill { return bills } -func (w *WaybillController) onWaybillNew(bill2 *model.Waybill, db orm.Ormer) (isDuplicated bool, err error) { +func (w *OrderManager) onWaybillNew(bill2 *model.Waybill, db orm.Ormer) (isDuplicated bool, err error) { globals.SugarLogger.Debugf("onWaybillNew bill:%v", bill2) isDuplicated, err = addOrderOrWaybillStatus(model.Waybill2Status(bill2), db) if err == nil && !isDuplicated { @@ -71,7 +63,7 @@ func (w *WaybillController) onWaybillNew(bill2 *model.Waybill, db orm.Ormer) (is return isDuplicated, err } -func (w *WaybillController) OnWaybillStatusChanged(bill *model.Waybill) (err error) { +func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) { var isDuplicated bool db := orm.NewOrm() if bill.Status == model.WaybillStatusNew { @@ -96,7 +88,7 @@ func (w *WaybillController) OnWaybillStatusChanged(bill *model.Waybill) (err err return err } -func (w *WaybillController) addWaybillStatus(bill *model.Waybill, db orm.Ormer, addParams orm.Params) (isDuplicated bool, err error) { +func (w *OrderManager) addWaybillStatus(bill *model.Waybill, db orm.Ormer, addParams orm.Params) (isDuplicated bool, err error) { waybillStatus := model.Waybill2Status(bill) isDuplicated, err = addOrderOrWaybillStatus(waybillStatus, db) if err == nil && !isDuplicated && waybillStatus.Status > model.WaybillStatusUnknown { // todo 这里应该和addOrderStatus一样的改法,状态不能回绕 diff --git a/business/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go similarity index 99% rename from business/scheduler/defsch/defsch.go rename to business/jxcallback/scheduler/defsch/defsch.go index 5c3d8cec4..3127f8978 100644 --- a/business/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -2,16 +2,16 @@ package defsch import ( "fmt" + "math/rand" "time" - "math/rand" - "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg" "git.rosy.net.cn/jx-callback/business/legacymodel" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/scheduler" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/orm" ) @@ -503,7 +503,7 @@ func (s *DefScheduler) loadSavedOrderFromMap(status *model.OrderStatus, isAutoLo } else { globals.SugarLogger.Infof("loadSavedOrderFromMap order is incomplete, orderID:%s, load it", status.RefVendorOrderID) } - if order, err := s.CurOrderManager.LoadOrder(status.RefVendorOrderID, status.RefVendorID); err == nil { + if order, err := partner.CurOrderManager.LoadOrder(status.RefVendorOrderID, status.RefVendorID); err == nil { realSavedInfo.SetOrder(order) } else { realSavedInfo.SetOrder(&model.GoodsOrder{ @@ -661,7 +661,7 @@ func (s *DefScheduler) updateOrderByBill(order *model.GoodsOrder, bill *model.Wa if bill.WaybillVendorID == model.VendorIDUnknown { bill.VendorWaybillID = "" } - s.CurOrderManager.UpdateWaybillVendorID(bill, revertStatus) + partner.CurOrderManager.UpdateWaybillVendorID(bill, revertStatus) order.WaybillVendorID = bill.WaybillVendorID order.VendorWaybillID = bill.VendorWaybillID if revertStatus { diff --git a/business/scheduler/scheduler.go b/business/jxcallback/scheduler/scheduler.go similarity index 83% rename from business/scheduler/scheduler.go rename to business/jxcallback/scheduler/scheduler.go index 21796d725..d3778cec0 100644 --- a/business/scheduler/scheduler.go +++ b/business/jxcallback/scheduler/scheduler.go @@ -7,6 +7,7 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" ) @@ -42,47 +43,14 @@ var ( ErrOrderIsNotSolid = errors.New("订单是临时订单,不完整,不能用于创建运单") ) -type PurchasePlatformHandler interface { - GetStatusFromVendorStatus(vendorStatus string) int - GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error) - GetStatusActionTimeout(statusType, status int) time.Duration - - AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) - PickupGoods(order *model.GoodsOrder) (err error) - - // 将订单从购物平台配送转为自送 - Swtich2SelfDeliver(order *model.GoodsOrder) (err error) - - // 将订单从购物平台配送转为自送后又送达 - Swtich2SelfDelivered(order *model.GoodsOrder) (err error) - - // 完全自送的门店表示开始配送 - SelfDeliverDelievering(order *model.GoodsOrder) (err error) - - // 完全自送的门店表示配送完成 - SelfDeliverDelievered(order *model.GoodsOrder) (err error) -} - -type DeliveryPlatformHandler interface { - CreateWaybill(order *model.GoodsOrder) (err error) - CancelWaybill(bill *model.Waybill) (err error) -} - type DeliveryPlatformHandlerInfo struct { - Handler DeliveryPlatformHandler + Handler partner.IDeliveryPlatformHandler Use4CreateWaybill bool } -type OrderManager interface { - LoadOrder(vendorOrderID string, vendorID int) (order *model.GoodsOrder, err error) - // OnOrderStatusChanged(status *model.OrderStatus) (err error) // 此消息是否使用还不确定 - UpdateWaybillVendorID(bill *model.Waybill, revertStatus bool) (err error) -} - type Scheduler interface { - RegisterOrderManager(handler OrderManager) - RegisterPurchasePlatform(vendorID int, handler PurchasePlatformHandler) - RegisterDeliveryPlatform(vendorID int, handler DeliveryPlatformHandler, isUse4CreateWaybill bool) + RegisterPurchasePlatform(vendorID int, handler partner.IPurchasePlatformHandler) + RegisterDeliveryPlatform(vendorID int, handler partner.IDeliveryPlatformHandler, isUse4CreateWaybill bool) // 以下是订单 OnOrderNew(order *model.GoodsOrder, isPending bool) (err error) @@ -93,22 +61,17 @@ type Scheduler interface { } type BaseScheduler struct { - CurOrderManager OrderManager - PurchasePlatformHandlers map[int]PurchasePlatformHandler + PurchasePlatformHandlers map[int]partner.IPurchasePlatformHandler DeliveryPlatformHandlers map[int]*DeliveryPlatformHandlerInfo IsReallyCallPlatformAPI bool } func (c *BaseScheduler) Init() { - c.PurchasePlatformHandlers = make(map[int]PurchasePlatformHandler) + c.PurchasePlatformHandlers = make(map[int]partner.IPurchasePlatformHandler) c.DeliveryPlatformHandlers = make(map[int]*DeliveryPlatformHandlerInfo) } -func (c *BaseScheduler) RegisterOrderManager(handler OrderManager) { - c.CurOrderManager = handler -} - -func (c *BaseScheduler) RegisterPurchasePlatform(vendorID int, handler PurchasePlatformHandler) { +func (c *BaseScheduler) RegisterPurchasePlatform(vendorID int, handler partner.IPurchasePlatformHandler) { if !(vendorID >= model.VendorIDPurchaseBegin && vendorID <= model.VendorIDPurchaseEnd) { panic(fmt.Sprintf("purchase vendor:%d is illegal", vendorID)) } @@ -118,7 +81,7 @@ func (c *BaseScheduler) RegisterPurchasePlatform(vendorID int, handler PurchaseP c.PurchasePlatformHandlers[vendorID] = handler } -func (c *BaseScheduler) RegisterDeliveryPlatform(vendorID int, handler DeliveryPlatformHandler, isUse4CreateWaybill bool) { +func (c *BaseScheduler) RegisterDeliveryPlatform(vendorID int, handler partner.IDeliveryPlatformHandler, isUse4CreateWaybill bool) { if !(vendorID >= model.VendorIDDeliveryBegin && vendorID <= model.VendorIDDeliveryEnd) { panic(fmt.Sprintf("delivery vendor:%d is illegal", vendorID)) } @@ -131,7 +94,7 @@ func (c *BaseScheduler) RegisterDeliveryPlatform(vendorID int, handler DeliveryP } } -func (c *BaseScheduler) GetPurchasePlatformFromVendorID(vendorID int) PurchasePlatformHandler { +func (c *BaseScheduler) GetPurchasePlatformFromVendorID(vendorID int) partner.IPurchasePlatformHandler { return c.PurchasePlatformHandlers[vendorID] } diff --git a/business/controller/dada/waybill.go b/business/partner/delivery/dada/waybill.go similarity index 95% rename from business/controller/dada/waybill.go rename to business/partner/delivery/dada/waybill.go index abeaebb9e..83b3a443e 100644 --- a/business/controller/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -6,10 +6,10 @@ import ( "git.rosy.net.cn/baseapi/platformapi/dadaapi" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/controller" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/scheduler" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/orm" @@ -58,7 +58,7 @@ func (c *WaybillController) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dada default: order.Status = model.WaybillStatusUnknown } - return dadaapi.Err2CallbackResponse(controller.WaybillManager.OnWaybillStatusChanged(order), utils.Int2Str(order.Status)) + return dadaapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), utils.Int2Str(order.Status)) } func (c *WaybillController) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal *model.Waybill) { @@ -81,7 +81,7 @@ func (c *WaybillController) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVa return retVal } -// DeliveryPlatformHandler +// IDeliveryPlatformHandler func (c *WaybillController) CreateWaybill(order *model.GoodsOrder) (err error) { billParams := &dadaapi.OperateOrderRequiredParams{ ShopNo: utils.Int2Str(order.StoreID), // 当前达达的门店号与京西是一样的 diff --git a/business/controller/dada/waybill_test.go b/business/partner/delivery/dada/waybill_test.go similarity index 86% rename from business/controller/dada/waybill_test.go rename to business/partner/delivery/dada/waybill_test.go index 6d68f1f93..5e1825226 100644 --- a/business/controller/dada/waybill_test.go +++ b/business/partner/delivery/dada/waybill_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - "git.rosy.net.cn/jx-callback/business/controller" + "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" @@ -23,7 +23,7 @@ func init() { func TestCreateWaybill(t *testing.T) { orderID := "817540316000041" - if order, err := controller.OrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { + if order, err := orderman.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { // globals.SugarLogger.Debug(order) c := new(WaybillController) if err = c.CreateWaybill(order); err == nil { diff --git a/business/controller/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go similarity index 96% rename from business/controller/mtps/waybill.go rename to business/partner/delivery/mtps/waybill.go index 1ff11f829..e645bf64f 100644 --- a/business/controller/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -8,11 +8,11 @@ import ( "git.rosy.net.cn/baseapi/platformapi/mtpsapi" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/controller" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/legacymodel" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/scheduler" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego" @@ -57,7 +57,7 @@ func (c *WaybillController) OnWaybillExcept(msg *mtpsapi.CallbackOrderExceptionM StatusTime: utils.Timestamp2Time(msg.Timestamp), } order.VendorOrderID, order.OrderVendorID = jxutils.SplitUniversalOrderID(msg.OrderID) - retVal = mtpsapi.Err2CallbackResponse(controller.WaybillManager.OnWaybillStatusChanged(order), "mtps OnWaybillExcept") + retVal = mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), "mtps OnWaybillExcept") }, msg.OrderID) return retVal } @@ -80,7 +80,7 @@ func (c *WaybillController) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal globals.SugarLogger.Warnf("onWaybillMsg unknown msg:%v", msg) return mtpsapi.SuccessResponse } - return mtpsapi.Err2CallbackResponse(controller.WaybillManager.OnWaybillStatusChanged(order), order.VendorStatus) + return mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) } func (c *WaybillController) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (retVal *model.Waybill) { @@ -154,7 +154,7 @@ func (c *WaybillController) calculateOrderDeliveryFee(order *model.GoodsOrder, b } func (c *WaybillController) calculateBillDeliveryFee(bill *model.Waybill) (deliveryFee, addFee int64) { - order, err := controller.OrderManager.LoadOrder(bill.VendorOrderID, bill.OrderVendorID) + order, err := partner.CurOrderManager.LoadOrder(bill.VendorOrderID, bill.OrderVendorID) if err != nil { return 0, 0 } @@ -162,7 +162,7 @@ func (c *WaybillController) calculateBillDeliveryFee(bill *model.Waybill) (deliv return deliveryFee, addFee } -// DeliveryPlatformHandler +// IDeliveryPlatformHandler func (c *WaybillController) CreateWaybill(order *model.GoodsOrder) (err error) { db := orm.NewOrm() _, addFee, err := c.calculateOrderDeliveryFee(order, time.Now(), db) diff --git a/business/controller/mtps/waybill_test.go b/business/partner/delivery/mtps/waybill_test.go similarity index 87% rename from business/controller/mtps/waybill_test.go rename to business/partner/delivery/mtps/waybill_test.go index a5f6cdc52..2d7363d1e 100644 --- a/business/controller/mtps/waybill_test.go +++ b/business/partner/delivery/mtps/waybill_test.go @@ -3,7 +3,7 @@ package mtps import ( "testing" - "git.rosy.net.cn/jx-callback/business/controller" + "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" @@ -22,7 +22,7 @@ func init() { func TestCreateWaybill(t *testing.T) { orerID := "817109342000022" - order, _ := controller.OrderManager.LoadOrder(orerID, model.VendorIDJD) + order, _ := orderman.CurOrderManager.LoadOrder(orerID, model.VendorIDJD) // globals.SugarLogger.Debug(order) c := new(WaybillController) if err := c.CreateWaybill(order); err != nil { diff --git a/business/partner/partner.go b/business/partner/partner.go new file mode 100644 index 000000000..b16a873a4 --- /dev/null +++ b/business/partner/partner.go @@ -0,0 +1,52 @@ +package partner + +import ( + "time" + + "git.rosy.net.cn/jx-callback/business/model" +) + +var ( + CurOrderManager IOrderManager +) + +type IOrderManager interface { + OnOrderNew(order *model.GoodsOrder, msgVendorStatus string) (err error) + OnOrderAdjust(order *model.GoodsOrder, msgVendorStatus string) (err error) + OnOrderStatusChanged(orderStatus *model.OrderStatus) (err error) + + OnWaybillStatusChanged(bill *model.Waybill) (err error) + + LoadOrder(vendorOrderID string, vendorID int) (order *model.GoodsOrder, err error) + UpdateWaybillVendorID(bill *model.Waybill, revertStatus bool) (err error) +} + +type IPurchasePlatformHandler interface { + GetStatusFromVendorStatus(vendorStatus string) int + GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error) + GetStatusActionTimeout(statusType, status int) time.Duration + + AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) + PickupGoods(order *model.GoodsOrder) (err error) + + // 将订单从购物平台配送转为自送 + Swtich2SelfDeliver(order *model.GoodsOrder) (err error) + + // 将订单从购物平台配送转为自送后又送达 + Swtich2SelfDelivered(order *model.GoodsOrder) (err error) + + // 完全自送的门店表示开始配送 + SelfDeliverDelievering(order *model.GoodsOrder) (err error) + + // 完全自送的门店表示配送完成 + SelfDeliverDelievered(order *model.GoodsOrder) (err error) +} + +type IDeliveryPlatformHandler interface { + CreateWaybill(order *model.GoodsOrder) (err error) + CancelWaybill(bill *model.Waybill) (err error) +} + +func Init(curOrderManager IOrderManager) { + CurOrderManager = curOrderManager +} diff --git a/business/controller/elm/elm.go b/business/partner/purchase/elm/elm.go similarity index 100% rename from business/controller/elm/elm.go rename to business/partner/purchase/elm/elm.go diff --git a/business/controller/elm/order.go b/business/partner/purchase/elm/order.go similarity index 96% rename from business/controller/elm/order.go rename to business/partner/purchase/elm/order.go index cd6da03ea..739eb292e 100644 --- a/business/controller/elm/order.go +++ b/business/partner/purchase/elm/order.go @@ -11,10 +11,10 @@ import ( "git.rosy.net.cn/baseapi/platformapi/elmapi" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/controller" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/scheduler" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/legacy/freshfood" ) @@ -102,13 +102,13 @@ func (c *OrderController) onOrderStatusMsg(msg *elmapi.CallbackOrderStatusMsg) ( globals.SugarLogger.Warnf("onOrderStatusMsg elm msg:%v not handled", msg) return elmapi.SuccessResponse } - err := controller.OrderManager.OnOrderStatusChanged(status) + err := partner.CurOrderManager.OnOrderStatusChanged(status) // 直接跳到拣货完成 if msg.MsgType == elmapi.MsgTypeOrderAccepted { status.Status = model.OrderStatusFinishedPickup status.VendorStatus = fakePickedUp - err = controller.OrderManager.OnOrderStatusChanged(status) + err = partner.CurOrderManager.OnOrderStatusChanged(status) } // if globals.HandleLegacyJxOrder && err == nil { // c.legacyElmOrderStatusChanged(status) @@ -126,7 +126,7 @@ func (c *OrderController) onOrderCancelRefundMsg(msg *elmapi.CallbackOrderCancel default: status.Status = model.OrderStatusUnknown } - return elmapi.Err2CallbackResponse(controller.OrderManager.OnOrderStatusChanged(status), status.VendorStatus) + return elmapi.Err2CallbackResponse(partner.CurOrderManager.OnOrderStatusChanged(status), status.VendorStatus) } func (c *OrderController) GetOrder(orderID string) (order *model.GoodsOrder, err error) { @@ -191,8 +191,8 @@ func (c *OrderController) GetOrder(orderID string) (order *model.GoodsOrder, err order.Weight += sku.Weight * sku.Count } } + setOrederDetailFee(result, order) } - setOrederDetailFee(result, order) return order, err } @@ -222,7 +222,7 @@ func (c *OrderController) onOrderNew(msg map[string]interface{}) (response *elma order, err := c.GetOrder(msg["orderId"].(string)) if err == nil { order.VendorStatus = c.stateAndType2Str(order.VendorStatus, elmapi.MsgTypeOrderValid) - err = controller.OrderManager.OnOrderNew(order, c.stateAndType2Str(msg["status"].(string), elmapi.MsgTypeOrderValid)) + err = partner.CurOrderManager.OnOrderNew(order, c.stateAndType2Str(msg["status"].(string), elmapi.MsgTypeOrderValid)) // if globals.HandleLegacyJxOrder && err == nil { // c.legacyWriteElmOrder(order) // } @@ -244,7 +244,7 @@ func (c *OrderController) onOrderUserUrgeOrder(msg *elmapi.CallbackOrderUrgeMsg) if globals.ReallyCallPlatformAPI { freshfood.FreshFoodAPI.ELMClientUrgeOrder(msg.OrderID) } - return elmapi.Err2CallbackResponse(controller.OrderManager.OnOrderStatusChanged(status), status.VendorStatus) + return elmapi.Err2CallbackResponse(partner.CurOrderManager.OnOrderStatusChanged(status), status.VendorStatus) } func (c *OrderController) stateAndType2Str(state string, msgType int) string { @@ -263,7 +263,7 @@ func (c *OrderController) spliltCompositeState(compositeState string) (state str return compositeState, 0 } -// PurchasePlatformHandler +// IPurchasePlatformHandler func (c *OrderController) GetStatusFromVendorStatus(vendorStatus string) int { state, _ := c.spliltCompositeState(vendorStatus) if status, ok := VendorStatus2StatusMap[state]; ok { diff --git a/business/controller/elm/order_legacy.go b/business/partner/purchase/elm/order_legacy.go similarity index 99% rename from business/controller/elm/order_legacy.go rename to business/partner/purchase/elm/order_legacy.go index 18640703c..99bf60096 100644 --- a/business/controller/elm/order_legacy.go +++ b/business/partner/purchase/elm/order_legacy.go @@ -1,14 +1,11 @@ package elm import ( - "github.com/astaxie/beego/orm" - - "git.rosy.net.cn/jx-callback/business/legacymodel" - - "git.rosy.net.cn/jx-callback/globals" - "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/legacymodel" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/globals" + "github.com/astaxie/beego/orm" ) // 为了兼容之前的表,造出原来需要的数据 diff --git a/business/controller/elm/order_test.go b/business/partner/purchase/elm/order_test.go similarity index 92% rename from business/controller/elm/order_test.go rename to business/partner/purchase/elm/order_test.go index 2968fa458..189c85aaa 100644 --- a/business/controller/elm/order_test.go +++ b/business/partner/purchase/elm/order_test.go @@ -3,6 +3,7 @@ package elm import ( "testing" + _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/db" diff --git a/business/controller/elm/waybill.go b/business/partner/purchase/elm/waybill.go similarity index 94% rename from business/controller/elm/waybill.go rename to business/partner/purchase/elm/waybill.go index 3ea36014e..9ee85e9a2 100644 --- a/business/controller/elm/waybill.go +++ b/business/partner/purchase/elm/waybill.go @@ -5,9 +5,9 @@ import ( "git.rosy.net.cn/baseapi/platformapi/elmapi" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/controller" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -48,7 +48,7 @@ func (c *WaybillController) onWaybillStatusMsg(msg *elmapi.CallbackWaybillStatus // MsgTypeDeiverBySelf order.Status = model.WaybillStatusUnknown } - return elmapi.Err2CallbackResponse(controller.WaybillManager.OnWaybillStatusChanged(order), order.VendorStatus) + return elmapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) } func (c *WaybillController) callbackMsg2Waybill(msg *elmapi.CallbackWaybillStatusMsg) (retVal *model.Waybill) { diff --git a/business/controller/jd/order.go b/business/partner/purchase/jd/order.go similarity index 96% rename from business/controller/jd/order.go rename to business/partner/purchase/jd/order.go index 64a9d371d..bedd36d27 100644 --- a/business/controller/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -6,10 +6,10 @@ import ( "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/controller" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/scheduler" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/legacy/freshfood" @@ -59,7 +59,7 @@ func (c *OrderController) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi freshfood.FreshFoodAPI.JDOrderComment(msg) } } - err := controller.OrderManager.OnOrderStatusChanged(status) + err := partner.CurOrderManager.OnOrderStatusChanged(status) // if globals.HandleLegacyJxOrder && err == nil { // c.legacyJdOrderStatusChanged(status) // } @@ -136,8 +136,8 @@ func (c *OrderController) GetOrder(orderID string) (order *model.GoodsOrder, err order.SalePrice += sku.SalePrice * int64(sku.Count) order.Weight += sku.Weight * sku.Count } + setOrederDetailFee(result, order) } - setOrederDetailFee(result, order) return order, err } @@ -151,7 +151,7 @@ func setOrederDetailFee(result map[string]interface{}, order *model.GoodsOrder) func (c *OrderController) onOrderNew(msg *jdapi.CallbackOrderMsg) (response *jdapi.CallbackResponse) { order, err := c.GetOrder(msg.BillID) if err == nil { - err = controller.OrderManager.OnOrderNew(order, msg.StatusID) + err = partner.CurOrderManager.OnOrderNew(order, msg.StatusID) // if err == nil { // c.legacyWriteJdOrder(order, false) // } @@ -162,7 +162,7 @@ func (c *OrderController) onOrderNew(msg *jdapi.CallbackOrderMsg) (response *jda func (c *OrderController) onOrderAdjust(msg *jdapi.CallbackOrderMsg) *jdapi.CallbackResponse { order, err := c.GetOrder(msg.BillID) if err == nil { - err = controller.OrderManager.OnOrderAdjust(order, msg.StatusID) + err = partner.CurOrderManager.OnOrderAdjust(order, msg.StatusID) // if globals.HandleLegacyJxOrder && err == nil { // c.legacyWriteJdOrder(order, true) // } @@ -185,7 +185,7 @@ func (c *OrderController) callbackMsg2Status(msg *jdapi.CallbackOrderMsg) *model return orderStatus } -// PurchasePlatformHandler +// IPurchasePlatformHandler func (c *OrderController) GetStatusFromVendorStatus(vendorStatus string) int { if status, ok := VendorStatus2StatusMap[vendorStatus]; ok { return status diff --git a/business/controller/jd/order_legacy.go b/business/partner/purchase/jd/order_legacy.go similarity index 100% rename from business/controller/jd/order_legacy.go rename to business/partner/purchase/jd/order_legacy.go diff --git a/business/controller/jd/order_test.go b/business/partner/purchase/jd/order_test.go similarity index 79% rename from business/controller/jd/order_test.go rename to business/partner/purchase/jd/order_test.go index 92d1a9664..fbff2ed90 100644 --- a/business/controller/jd/order_test.go +++ b/business/partner/purchase/jd/order_test.go @@ -3,7 +3,7 @@ package jd import ( "testing" - "git.rosy.net.cn/jx-callback/business/controller" + "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" @@ -22,7 +22,7 @@ func init() { func TestSwitch2SelfDeliver(t *testing.T) { orderID := "817540316000041" - if order, err := controller.OrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { + if order, err := orderman.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { // globals.SugarLogger.Debug(order) c := new(OrderController) if err = c.Swtich2SelfDeliver(order); err == nil { @@ -34,9 +34,9 @@ func TestSwitch2SelfDeliver(t *testing.T) { } } -func Test_GetOrder(t *testing.T) { +func TestGetOrder(t *testing.T) { _, err := new(OrderController).GetOrder("815536199000222") if err != nil { - panic(err.Error()) + t.Fatal(err.Error()) } } diff --git a/business/controller/jd/waybill.go b/business/partner/purchase/jd/waybill.go similarity index 93% rename from business/controller/jd/waybill.go rename to business/partner/purchase/jd/waybill.go index 0aacb59bd..5f7483206 100644 --- a/business/controller/jd/waybill.go +++ b/business/partner/purchase/jd/waybill.go @@ -3,9 +3,9 @@ package jd import ( "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/controller" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -46,7 +46,7 @@ func (c *WaybillController) onWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) ( default: order.Status = model.WaybillStatusUnknown } - return jdapi.Err2CallbackResponse(controller.WaybillManager.OnWaybillStatusChanged(order), order.VendorStatus) + return jdapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) } func (c *WaybillController) callbackMsg2Waybill(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *model.Waybill) { diff --git a/controllers/dada_order.go b/controllers/dada_order.go index 0984b6e78..efce331f1 100644 --- a/controllers/dada_order.go +++ b/controllers/dada_order.go @@ -2,7 +2,7 @@ package controllers import ( "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/controller/dada" + "git.rosy.net.cn/jx-callback/business/partner/delivery/dada" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/legacy/dada/controller" diff --git a/controllers/elm_order.go b/controllers/elm_order.go index e33df6d00..aec3e3bf5 100644 --- a/controllers/elm_order.go +++ b/controllers/elm_order.go @@ -3,7 +3,7 @@ package controllers import ( "git.rosy.net.cn/baseapi/platformapi/elmapi" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/controller/elm" + "git.rosy.net.cn/jx-callback/business/partner/purchase/elm" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/legacy/elm/controller" diff --git a/controllers/jd_order.go b/controllers/jd_order.go index 99955466c..6089f3aa3 100644 --- a/controllers/jd_order.go +++ b/controllers/jd_order.go @@ -3,7 +3,7 @@ package controllers import ( "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/controller/jd" + "git.rosy.net.cn/jx-callback/business/partner/purchase/jd" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/legacy/jd/controller" diff --git a/controllers/mtps_order.go b/controllers/mtps_order.go index b8ce08002..9862fe8b4 100644 --- a/controllers/mtps_order.go +++ b/controllers/mtps_order.go @@ -2,7 +2,7 @@ package controllers import ( "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/controller/mtps" + "git.rosy.net.cn/jx-callback/business/partner/delivery/mtps" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/legacy/mtps/controller" diff --git a/main.go b/main.go index e4ddc5521..0ac6af621 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,7 @@ import ( "fmt" "os" - bzcon "git.rosy.net.cn/jx-callback/business/controller" + "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/db" @@ -86,9 +86,8 @@ func main() { if globals.CallLegacyMsgHandler { controller.InitOrder() } + orderman.LoadPendingOrders() } - bzcon.LoadPendingOrders() - if beego.BConfig.RunMode == "dev" { beego.BConfig.WebConfig.DirectoryIndex = true beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger" From c5db19045d119452bee425d3afcda490f0aa91f8 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 17 Aug 2018 16:42:16 +0800 Subject: [PATCH 02/16] - continue refactoring... --- .../jxcallback/scheduler/defsch/defsch.go | 2 +- business/jxstore/cms/cms.go | 72 +++++++++++ .../{model => legacymodel}/jxstorefeature.go | 2 +- business/model/model.go | 56 +++------ business/model/order.go | 47 ++++++++ business/model/place.go | 24 ++++ business/model/product.go | 114 ++++++++++++++++++ business/model/store.go | 59 +++++++++ business/partner/delivery/dada/waybill.go | 25 ++-- .../partner/delivery/dada/waybill_test.go | 6 +- business/partner/delivery/mtps/waybill.go | 37 ++++-- .../partner/delivery/mtps/waybill_test.go | 8 +- business/partner/purchase/elm/elm.go | 29 +++-- business/partner/purchase/elm/order.go | 48 +++----- business/partner/purchase/elm/order_legacy.go | 4 +- business/partner/purchase/elm/order_test.go | 6 +- business/partner/purchase/elm/waybill.go | 11 +- business/partner/purchase/jd/jd.go | 60 +++++++++ business/partner/purchase/jd/order.go | 35 ++---- business/partner/purchase/jd/order_legacy.go | 4 +- business/partner/purchase/jd/order_test.go | 8 +- business/partner/purchase/jd/store.go | 67 ++++++++++ business/partner/purchase/jd/waybill.go | 9 +- conf/app.conf | 9 +- controllers/dada_order.go | 5 +- controllers/elm_order.go | 5 +- controllers/jd_order.go | 10 +- controllers/mtps_order.go | 10 +- globals/api/api.go | 1 - globals/{db/db.go => beegodb/beegodb.go} | 5 +- globals/globals.go | 1 + globals/gormdb/gormdb.go | 41 +++++++ main.go | 14 ++- 33 files changed, 656 insertions(+), 178 deletions(-) create mode 100644 business/jxstore/cms/cms.go rename business/{model => legacymodel}/jxstorefeature.go (98%) create mode 100644 business/model/place.go create mode 100644 business/model/product.go create mode 100644 business/model/store.go create mode 100644 business/partner/purchase/jd/jd.go create mode 100644 business/partner/purchase/jd/store.go rename globals/{db/db.go => beegodb/beegodb.go} (89%) create mode 100644 globals/gormdb/gormdb.go diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 3127f8978..cd7da0f2d 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -87,7 +87,7 @@ func (s *WatchOrderInfo) SetOrder(order *model.GoodsOrder) (retVal *model.GoodsO } func (s *WatchOrderInfo) updateOrderStoreFeature(order *model.GoodsOrder) (err error) { - storefeature := &model.Jxstorefeature{ + storefeature := &legacymodel.Jxstorefeature{ Id: jxutils.GetJxStoreIDFromOrder(order), } if storefeature.Id > 0 { diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go new file mode 100644 index 000000000..ebaef5b20 --- /dev/null +++ b/business/jxstore/cms/cms.go @@ -0,0 +1,72 @@ +package cms + +import ( + "reflect" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/globals/gormdb" + "github.com/qor/admin" + "github.com/qor/qor" + "github.com/qor/qor/resource" +) + +var ( + curAdmin *admin.Admin +) + +func Init() { + gormdb.Init() + curAdmin = admin.New(&admin.AdminConfig{ + DB: gormdb.GetDB(), + SiteName: "京西管理系统v0.0.1", + }) + storeRes := curAdmin.AddResource(&model.Store{}) + lngMeta := storeRes.GetMeta("Lng") + lngMeta.Type = "float" + lngMeta.SetSetter(func(record interface{}, metaValue *resource.MetaValue, context *qor.Context) { + store := record.(*model.Store) + store.Lng = int(utils.Str2Float64((metaValue.Value.([]string))[0]) * 1000000) + globals.SugarLogger.Debugf("metaValue:%v", reflect.TypeOf(metaValue.Value)) + }) + lngMeta.SetValuer(func(record interface{}, context *qor.Context) (result interface{}) { + store := record.(*model.Store) + result = float64(store.Lng) / 1000000 + return result + }) + curAdmin.AddResource(&model.StoreSub{}) + + curAdmin.AddResource(&model.Sku{}) + curAdmin.AddResource(&model.SkuName{}) +} + +func GetAdmin() *admin.Admin { + return curAdmin +} + +// func SaveMapSlice2DB(db *gorm.DB, data []map[string]interface{}, tableName string, keyMaps map[string]string) { +// if len(data) == 0 { +// return +// } + +// sql := "INSERT INTO " + tableName + "(" +// for k := range data[0] { +// realK, ok := keyMaps[k] +// if !ok { +// realK = k +// } +// sql += realK + "," +// } +// sql = sql[:len(sql)-1] + ") " + +// for _, dataRow := range data { +// for k, v := range dataRow { +// realK, ok := keyMaps[k] +// if !ok { +// realK = k +// } +// sql += "(" +// } +// } +// } diff --git a/business/model/jxstorefeature.go b/business/legacymodel/jxstorefeature.go similarity index 98% rename from business/model/jxstorefeature.go rename to business/legacymodel/jxstorefeature.go index d1b0cb1bd..219fbc806 100644 --- a/business/model/jxstorefeature.go +++ b/business/legacymodel/jxstorefeature.go @@ -1,4 +1,4 @@ -package model +package legacymodel type Jxstorefeature struct { Id int `orm:"column(storeid);pk"` diff --git a/business/model/model.go b/business/model/model.go index c79569df4..f88b88a21 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -2,49 +2,23 @@ package model import "time" -func Order2Status(order *GoodsOrder) (retVal *OrderStatus) { - retVal = &OrderStatus{ - VendorOrderID: order.VendorOrderID, - VendorID: order.VendorID, - OrderType: OrderTypeOrder, - RefVendorOrderID: order.VendorOrderID, - RefVendorID: order.VendorID, - Status: order.Status, - VendorStatus: order.VendorStatus, - StatusTime: order.StatusTime, - LockStatus: order.LockStatus, - } - return retVal +type ModelO struct { + ID uint `gorm:"primary_key"` + CreatedAt time.Time + UpdatedAt time.Time + DeletedAt *time.Time `sql:"index"` + LastOperator string `gorm:"type:varchar(32)"` // 最后操作员 } -func Waybill2Status(bill *Waybill) (retVal *OrderStatus) { - retVal = &OrderStatus{ - VendorOrderID: bill.VendorWaybillID, - VendorID: bill.WaybillVendorID, - OrderType: OrderTypeWaybill, - RefVendorOrderID: bill.VendorOrderID, - RefVendorID: bill.OrderVendorID, - Status: bill.Status, - VendorStatus: bill.VendorStatus, - StatusTime: bill.StatusTime, - Remark: bill.Remark, - } - return retVal +type ModelIDCU struct { + ID uint `gorm:"primary_key"` + CreatedAt time.Time + UpdatedAt time.Time } -// 判断订单是否是临时的,不是真实收到了new order消息后的订单 -func IsOrderSolid(order *GoodsOrder) bool { - return !(order.ConsigneeName == "" && order.ID == 0) -} - -func (o *GoodsOrder) GetStatusTime() time.Time { - return o.StatusTime -} - -func (o *Waybill) GetStatusTime() time.Time { - return o.StatusTime -} - -func (o *OrderStatus) GetStatusTime() time.Time { - return o.StatusTime +type ModelIDCUO struct { + ID uint `gorm:"primary_key"` + CreatedAt time.Time + UpdatedAt time.Time + LastOperator string `gorm:"type:varchar(32)"` // 最后操作员 } diff --git a/business/model/order.go b/business/model/order.go index af90dce21..3f38164a7 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -144,3 +144,50 @@ func (v *OrderStatus) TableIndex() [][]string { []string{"VendorOrderID", "Status", "VendorStatus"}, } } + +func Order2Status(order *GoodsOrder) (retVal *OrderStatus) { + retVal = &OrderStatus{ + VendorOrderID: order.VendorOrderID, + VendorID: order.VendorID, + OrderType: OrderTypeOrder, + RefVendorOrderID: order.VendorOrderID, + RefVendorID: order.VendorID, + Status: order.Status, + VendorStatus: order.VendorStatus, + StatusTime: order.StatusTime, + LockStatus: order.LockStatus, + } + return retVal +} + +func Waybill2Status(bill *Waybill) (retVal *OrderStatus) { + retVal = &OrderStatus{ + VendorOrderID: bill.VendorWaybillID, + VendorID: bill.WaybillVendorID, + OrderType: OrderTypeWaybill, + RefVendorOrderID: bill.VendorOrderID, + RefVendorID: bill.OrderVendorID, + Status: bill.Status, + VendorStatus: bill.VendorStatus, + StatusTime: bill.StatusTime, + Remark: bill.Remark, + } + return retVal +} + +// 判断订单是否是临时的,不是真实收到了new order消息后的订单 +func IsOrderSolid(order *GoodsOrder) bool { + return !(order.ConsigneeName == "" && order.ID == 0) +} + +func (o *GoodsOrder) GetStatusTime() time.Time { + return o.StatusTime +} + +func (o *Waybill) GetStatusTime() time.Time { + return o.StatusTime +} + +func (o *OrderStatus) GetStatusTime() time.Time { + return o.StatusTime +} diff --git a/business/model/place.go b/business/model/place.go new file mode 100644 index 000000000..84fdffeae --- /dev/null +++ b/business/model/place.go @@ -0,0 +1,24 @@ +package model + +import "time" + +// https://github.com/videni/pcr +const ( + CityLevelProvince = 1 + CityLevelCity = 2 + CityLevelDistrict = 3 +) + +type Place struct { + ID uint + Code int `gorm:"unique_index"` // 国家标准代码 + Name string `gorm:"type:varchar(16);index"` // 如果是直辖市,省的概念不加“市”来区别 + ParentCode int // 上级代码 + PostCode string `gorm:"type:varchar(8);index"` + Level int8 // 城市级别,参见相关常量定义 + TelCode string `gorm:"type:varchar(8);index"` + JdCode int `gorm:"index"` // 对应的京东代码 + Enabled int8 // 是否启用 + MtpsPrice int // 分为单位 + UpdatedAt time.Time +} diff --git a/business/model/product.go b/business/model/product.go new file mode 100644 index 000000000..02db27f5d --- /dev/null +++ b/business/model/product.go @@ -0,0 +1,114 @@ +package model + +const ( + SkuCategoryNormal = 0 + SkuCategorySpecial = 1 +) + +const ( + SpecUnitG = 0 + SpecUnitKG = 1 + SpecUnitL = 2 + SpecUnitML = 3 +) + +var ( + SpecUnitNames = []string{ + "g", + "kg", + "L", + "ml", + } +) + +var ( + UnitNames = []string{ + "份", + "袋", + "瓶", + "只", + "组", + "个", + "盒", + "把", + "半只", + "包", + "条", + "根", + "箱", + "听", + "套", + "罐", + "件", + "块", + "片", + "支", + "杯", + } +) + +type SkuCategory struct { + ModelIDCUO + Name string `gorm:"type:varchar(255);unique_index"` + ParentID int + Level int8 + Type int8 // 类别类型 + Seq int + + JdID string `gorm:"type:varchar(48)"` + ElmID string `gorm:"type:varchar(48)"` + MtID string `gorm:"type:varchar(48)"` + DidiID string `gorm:"type:varchar(48)"` +} + +type StoreSkuCategoryMap struct { + ModelIDCUO + StoreID int + SkuCategoryID int + + ElmID string `gorm:"type:varchar(48)"` +} + +type SkuName struct { + ModelIDCUO + Prefix string `gorm:"type:varchar(255)"` + Name string `gorm:"type:varchar(255)"` + Comment string `gorm:"type:varchar(255)"` + + CategoryID int // 标准类别 + Status int + + IsGlobal int8 `gorm:"default:1"` // 是否是全部(全国)可见,如果否的话,可见性由SkuPlace决定 + Unit string `gorm:"type:varchar(8)"` + Price int // 单位为分,标准价,不为份的就为实际标准价,为份的为每市斤价,实际还要乘质量。todo 为份的确定必须有质量 + Img string `gorm:"type:varchar(255)"` + ElmImgHashCode string `gorm:"type:varchar(64)"` +} + +type Sku struct { + ModelIDCUO + CategoryID int // 特殊类别,一般用于秒杀,特价之类的特殊类别 + NameID int `gorm:"index:unique_index_name_Id_quality"` // todo 这个索引应该要求唯一 + SpecQuality float32 `gorm:"index:unique_index_name_Id_quality"` + SpecUnit string `gorm:"type:varchar(8)"` + + Weight int // 单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality + + JdID string `gorm:"type:varchar(48)"` +} + +type SkuNamePlaceBind struct { + ModelIDCUO + SkuNameID int `gorm:"unique_index:unique_sku_name_id_sku_place_id"` + PlaceID int `gorm:"unique_index:unique_sku_name_id_sku_place_id"` +} + +type StoreSkuBind struct { + ModelIDCUO + StoreID int `gorm:"unique_index:unique_store_id_sku_id"` + SkuID int `gorm:"unique_index:unique_store_id_sku_id"` + SubStoreID int + Price int // 单位为分,不用int64的原因是这里不需要累加 + Status int + ElmID string `gorm:"type:varchar(48)"` +} diff --git a/business/model/store.go b/business/model/store.go new file mode 100644 index 000000000..e5f9c7352 --- /dev/null +++ b/business/model/store.go @@ -0,0 +1,59 @@ +package model + +const ( + StoreStatusDisabled = -1 + StoreStatusClosed = 0 + StoreStatusOpened = 1 +) + +const ( + MainSubStoreName = "本店" + MainSubStoreAddress = "本店" +) + +type Store struct { + ModelIDCUO + Name string `gorm:"type:varchar(255);unique_index"` + CityCode int + DistrictCode int + Address string `gorm:"type:varchar(255)"` + OpenTime1 int // 930就表示9点半,用两个的原因是为了支持中午休息,1与2的时间段不能交叉,为0表示没有 + CloseTime1 int // 格式同上 + OpenTime2 int // 格式同上 + CloseTime2 int // 格式同上 + Lng int // 乘了10的6次方 + Lat int // 乘了10的6次方 + Status int +} + +type StoreSub struct { + ModelIDCUO + StoreID int `gorm:"unique_index:unique_index1"` + Index int `gorm:"unique_index:unique_index1"` // 子店序号,为0表示主店 + Name string `gorm:"type:varchar(255)"` + Address string `gorm:"type:varchar(255)"` + Status int + Mobile1 string `gorm:"type:varchar(32)"` + Mobile2 string `gorm:"type:varchar(32)"` + Mobile3 string `gorm:"type:varchar(32)"` +} + +type StoreMap struct { + ModelIDCUO + StoreID int `gorm:"unique_index:storemap1"` + VendorID int `gorm:"unique_index:storemap1"` + VendorStoreID string `gorm:"type:varchar(48);unique_index"` + Status int + + AutoPickup int8 // 是否自动拣货 + DeliveryType int8 // 配送类型 + DeliveryCompetition int8 // 是否支持配送竞争 +} + +type StoreCourierMap struct { + ModelIDCUO + StoreID int `gorm:"unique_index:storemap1"` + VendorID int `gorm:"unique_index:storemap1"` + VendorStoreID string `gorm:"type:varchar(48);unique_index"` + Status int +} diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index 83b3a443e..6a9346c8c 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -23,21 +23,30 @@ var ( ErrCanNotFindDadaCityCode = errors.New("不能找到美团配送站点配置") ) -type WaybillController struct { +var ( + curDeliveryHandler *DeliveryHandler +) + +type DeliveryHandler struct { } func init() { - scheduler.CurrentScheduler.RegisterDeliveryPlatform(model.VendorIDDada, new(WaybillController), true) + curDeliveryHandler = new(DeliveryHandler) + scheduler.CurrentScheduler.RegisterDeliveryPlatform(model.VendorIDDada, curDeliveryHandler, true) } -func (c *WaybillController) OnWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaapi.CallbackResponse) { +func OnWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaapi.CallbackResponse) { + return curDeliveryHandler.OnWaybillMsg(msg) +} + +func (c *DeliveryHandler) OnWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaapi.CallbackResponse) { jxutils.CallMsgHandler(func() { retVal = c.onWaybillMsg(msg) }, msg.OrderID) return retVal } -func (c *WaybillController) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaapi.CallbackResponse) { +func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaapi.CallbackResponse) { order := c.callbackMsg2Waybill(msg) switch msg.OrderStatus { case dadaapi.OrderStatusWaitingForAccept: @@ -61,7 +70,7 @@ func (c *WaybillController) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dada return dadaapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), utils.Int2Str(order.Status)) } -func (c *WaybillController) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal *model.Waybill) { +func (c *DeliveryHandler) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal *model.Waybill) { retVal = &model.Waybill{ VendorWaybillID: msg.ClientID, WaybillVendorID: model.VendorIDDada, @@ -82,7 +91,7 @@ func (c *WaybillController) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVa } // IDeliveryPlatformHandler -func (c *WaybillController) CreateWaybill(order *model.GoodsOrder) (err error) { +func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder) (err error) { billParams := &dadaapi.OperateOrderRequiredParams{ ShopNo: utils.Int2Str(order.StoreID), // 当前达达的门店号与京西是一样的 OriginID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), @@ -126,7 +135,7 @@ func (c *WaybillController) CreateWaybill(order *model.GoodsOrder) (err error) { return err } -func (c *WaybillController) CancelWaybill(bill *model.Waybill) (err error) { +func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill) (err error) { reasonID := dadaapi.ReasonIDOther reasonMsg := "send not in time" if bill.Status < model.WaybillStatusAccepted { @@ -140,7 +149,7 @@ func (c *WaybillController) CancelWaybill(bill *model.Waybill) (err error) { return err } -func (c *WaybillController) getDataCityCodeFromOrder(order *model.GoodsOrder, db orm.Ormer) (retVal string, err error) { +func (c *DeliveryHandler) getDataCityCodeFromOrder(order *model.GoodsOrder, db orm.Ormer) (retVal string, err error) { var sql string if order.VendorID == model.VendorIDJD { sql = ` diff --git a/business/partner/delivery/dada/waybill_test.go b/business/partner/delivery/dada/waybill_test.go index 5e1825226..cc91e8d80 100644 --- a/business/partner/delivery/dada/waybill_test.go +++ b/business/partner/delivery/dada/waybill_test.go @@ -8,7 +8,7 @@ import ( "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "git.rosy.net.cn/jx-callback/globals/db" + "git.rosy.net.cn/jx-callback/globals/beegodb" "github.com/astaxie/beego" ) @@ -17,7 +17,7 @@ func init() { beego.BConfig.RunMode = "dev" // InitBeegoBeforeTest会将runmode设置为test globals.Init() - db.Init() + beegodb.Init() api.Init() } @@ -25,7 +25,7 @@ func TestCreateWaybill(t *testing.T) { orderID := "817540316000041" if order, err := orderman.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { // globals.SugarLogger.Debug(order) - c := new(WaybillController) + c := new(DeliveryHandler) if err = c.CreateWaybill(order); err == nil { time.Sleep(1 * time.Second) bill := &model.Waybill{ diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index e645bf64f..24d18b20d 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -30,21 +30,34 @@ var ( ErrStoreNoCoordinate = errors.New("找不到门店的坐标信息") ) -type WaybillController struct { +var ( + curDeliveryHandler *DeliveryHandler +) + +type DeliveryHandler struct { } func init() { - scheduler.CurrentScheduler.RegisterDeliveryPlatform(model.VendorIDMTPS, new(WaybillController), true) + curDeliveryHandler = new(DeliveryHandler) + scheduler.CurrentScheduler.RegisterDeliveryPlatform(model.VendorIDMTPS, curDeliveryHandler, true) } -func (c *WaybillController) OnWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *mtpsapi.CallbackResponse) { +func OnWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *mtpsapi.CallbackResponse) { + return curDeliveryHandler.OnWaybillMsg(msg) +} + +func OnWaybillExcept(msg *mtpsapi.CallbackOrderExceptionMsg) (retVal *mtpsapi.CallbackResponse) { + return curDeliveryHandler.OnWaybillExcept(msg) +} + +func (c *DeliveryHandler) OnWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *mtpsapi.CallbackResponse) { jxutils.CallMsgHandler(func() { retVal = c.onWaybillMsg(msg) }, msg.OrderID) return retVal } -func (c *WaybillController) OnWaybillExcept(msg *mtpsapi.CallbackOrderExceptionMsg) (retVal *mtpsapi.CallbackResponse) { +func (c *DeliveryHandler) OnWaybillExcept(msg *mtpsapi.CallbackOrderExceptionMsg) (retVal *mtpsapi.CallbackResponse) { jxutils.CallMsgHandler(func() { order := &model.Waybill{ VendorWaybillID: msg.MtPeisongID, @@ -62,7 +75,7 @@ func (c *WaybillController) OnWaybillExcept(msg *mtpsapi.CallbackOrderExceptionM return retVal } -func (c *WaybillController) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *mtpsapi.CallbackResponse) { +func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *mtpsapi.CallbackResponse) { order := c.callbackMsg2Waybill(msg) switch msg.Status { case mtpsapi.OrderStatusWaitingForSchedule: @@ -83,7 +96,7 @@ func (c *WaybillController) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal return mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) } -func (c *WaybillController) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (retVal *model.Waybill) { +func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (retVal *model.Waybill) { retVal = &model.Waybill{ VendorWaybillID: msg.MtPeisongID, VendorWaybillID2: utils.Int64ToStr(msg.DeliveryID), @@ -98,7 +111,7 @@ func (c *WaybillController) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) ( return retVal } -func (c *WaybillController) calculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db orm.Ormer) (deliveryFee, addFee int64, err error) { +func (c *DeliveryHandler) calculateOrderDeliveryFee(order *model.GoodsOrder, billTime time.Time, db orm.Ormer) (deliveryFee, addFee int64, err error) { var lists []orm.ParamsList if db == nil { db = orm.NewOrm() @@ -153,7 +166,7 @@ func (c *WaybillController) calculateOrderDeliveryFee(order *model.GoodsOrder, b return deliveryFee + addFee, addFee, nil } -func (c *WaybillController) calculateBillDeliveryFee(bill *model.Waybill) (deliveryFee, addFee int64) { +func (c *DeliveryHandler) calculateBillDeliveryFee(bill *model.Waybill) (deliveryFee, addFee int64) { order, err := partner.CurOrderManager.LoadOrder(bill.VendorOrderID, bill.OrderVendorID) if err != nil { return 0, 0 @@ -163,7 +176,7 @@ func (c *WaybillController) calculateBillDeliveryFee(bill *model.Waybill) (deliv } // IDeliveryPlatformHandler -func (c *WaybillController) CreateWaybill(order *model.GoodsOrder) (err error) { +func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder) (err error) { db := orm.NewOrm() _, addFee, err := c.calculateOrderDeliveryFee(order, time.Now(), db) if err == nil { @@ -236,7 +249,7 @@ func (c *WaybillController) CreateWaybill(order *model.GoodsOrder) (err error) { return err } -func (c *WaybillController) CancelWaybill(bill *model.Waybill) (err error) { +func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill) (err error) { reasonID := mtpsapi.CancelReasonRidderSendNotIntime reasonMsg := "CancelReasonRidderSendNotIntime" if bill.Status < model.WaybillStatusAccepted { @@ -250,13 +263,13 @@ func (c *WaybillController) CancelWaybill(bill *model.Waybill) (err error) { return nil } -func (c *WaybillController) getDeliveryID(order *model.GoodsOrder, db orm.Ormer) (retVal int64, err error) { +func (c *DeliveryHandler) getDeliveryID(order *model.GoodsOrder, db orm.Ormer) (retVal int64, err error) { // jxorder表当前已经有50多万条记录了,加100万避免冲突 // 508505 return order.ID + 1000000, nil } -func (c *WaybillController) getMTPSShopID(order *model.GoodsOrder, db orm.Ormer) (retVal string, err error) { +func (c *DeliveryHandler) getMTPSShopID(order *model.GoodsOrder, db orm.Ormer) (retVal string, err error) { sql := "SELECT zs_store_id FROM jx_to_zs_store_map WHERE jx_store_id = ?" var lists []orm.ParamsList JxStoreID := jxutils.GetJxStoreIDFromOrder(order) diff --git a/business/partner/delivery/mtps/waybill_test.go b/business/partner/delivery/mtps/waybill_test.go index 2d7363d1e..ac78c2f73 100644 --- a/business/partner/delivery/mtps/waybill_test.go +++ b/business/partner/delivery/mtps/waybill_test.go @@ -7,7 +7,7 @@ import ( "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "git.rosy.net.cn/jx-callback/globals/db" + "git.rosy.net.cn/jx-callback/globals/beegodb" "github.com/astaxie/beego" ) @@ -16,7 +16,7 @@ func init() { beego.BConfig.RunMode = "dev" // InitBeegoBeforeTest会将runmode设置为test globals.Init() - db.Init() + beegodb.Init() api.Init() } @@ -24,7 +24,7 @@ func TestCreateWaybill(t *testing.T) { orerID := "817109342000022" order, _ := orderman.CurOrderManager.LoadOrder(orerID, model.VendorIDJD) // globals.SugarLogger.Debug(order) - c := new(WaybillController) + c := new(DeliveryHandler) if err := c.CreateWaybill(order); err != nil { t.Fatal(err.Error()) } @@ -35,7 +35,7 @@ func TestCancelWaybill(t *testing.T) { VendorWaybillID: "1532332342088966", VendorWaybillID2: "55", } - c := new(WaybillController) + c := new(DeliveryHandler) if err := c.CancelWaybill(bill); err != nil { t.Fatal(err.Error()) } diff --git a/business/partner/purchase/elm/elm.go b/business/partner/purchase/elm/elm.go index 79b1f20ab..a28638554 100644 --- a/business/partner/purchase/elm/elm.go +++ b/business/partner/purchase/elm/elm.go @@ -3,14 +3,29 @@ package elm import ( "git.rosy.net.cn/baseapi/platformapi/elmapi" "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" ) -type Controller struct { +var ( + curPurchaseHandler *PurchaseHandler +) + +type PurchaseHandler struct { + scheduler.BasePurchasePlatform } -func (c *Controller) OnCallbackMsg(msg *elmapi.CallbackMsg) (retVal *elmapi.CallbackResponse) { +func init() { + curPurchaseHandler = new(PurchaseHandler) + scheduler.CurrentScheduler.RegisterPurchasePlatform(model.VendorIDELM, curPurchaseHandler) +} + +func OnCallbackMsg(msg *elmapi.CallbackMsg) (retVal *elmapi.CallbackResponse) { + return curPurchaseHandler.OnCallbackMsg(msg) +} + +func (c *PurchaseHandler) OnCallbackMsg(msg *elmapi.CallbackMsg) (retVal *elmapi.CallbackResponse) { if msg.Type == elmapi.MsgTypeOrderValid { innerMsg := make(map[string]interface{}) err := utils.UnmarshalUseNumber([]byte(msg.Message), &innerMsg) @@ -18,7 +33,7 @@ func (c *Controller) OnCallbackMsg(msg *elmapi.CallbackMsg) (retVal *elmapi.Call retVal = elmapi.Err2CallbackResponse(err, "") } else { innerMsg["msgType"] = msg.Type - retVal = new(OrderController).OnOrderNewMsg(innerMsg) + retVal = c.OnOrderNewMsg(innerMsg) } } else if msg.Type > elmapi.MsgTypeOrderValid && msg.Type < elmapi.MsgTypeUserApplyCancel { var innerMsg elmapi.CallbackOrderStatusMsg @@ -27,7 +42,7 @@ func (c *Controller) OnCallbackMsg(msg *elmapi.CallbackMsg) (retVal *elmapi.Call retVal = elmapi.Err2CallbackResponse(err, "") } else { innerMsg.MsgType = msg.Type - retVal = new(OrderController).OnOrderStatusMsg(&innerMsg) + retVal = c.OnOrderStatusMsg(&innerMsg) } } else if msg.Type >= elmapi.MsgTypeUserApplyCancel && msg.Type < elmapi.MsgTypeUserUrgeOrder { var innerMsg elmapi.CallbackOrderCancelRefundMsg @@ -36,7 +51,7 @@ func (c *Controller) OnCallbackMsg(msg *elmapi.CallbackMsg) (retVal *elmapi.Call retVal = elmapi.Err2CallbackResponse(err, "") } else { innerMsg.MsgType = msg.Type - retVal = new(OrderController).OnOrderCancelRefundMsg(&innerMsg) + retVal = c.OnOrderCancelRefundMsg(&innerMsg) } } else if msg.Type == elmapi.MsgTypeUserUrgeOrder { var innerMsg elmapi.CallbackOrderUrgeMsg @@ -46,7 +61,7 @@ func (c *Controller) OnCallbackMsg(msg *elmapi.CallbackMsg) (retVal *elmapi.Call } else { innerMsg.MsgType = msg.Type jxutils.CallMsgHandler(func() { - retVal = new(OrderController).onOrderUserUrgeOrder(&innerMsg) + retVal = c.onOrderUserUrgeOrder(&innerMsg) }, jxutils.ComposeUniversalOrderID(innerMsg.OrderID, model.VendorIDELM)) } } else if msg.Type >= elmapi.MsgTypeWaybillWait4DeliveryVendor && msg.Type <= elmapi.MsgTypeRejectedSystemError { @@ -56,7 +71,7 @@ func (c *Controller) OnCallbackMsg(msg *elmapi.CallbackMsg) (retVal *elmapi.Call retVal = elmapi.Err2CallbackResponse(err, "") } else { innerMsg.MsgType = msg.Type - retVal = new(WaybillController).OnWaybillStatusMsg(&innerMsg) + retVal = c.OnWaybillStatusMsg(&innerMsg) } } else { retVal = elmapi.SuccessResponse diff --git a/business/partner/purchase/elm/order.go b/business/partner/purchase/elm/order.go index 739eb292e..9817b8255 100644 --- a/business/partner/purchase/elm/order.go +++ b/business/partner/purchase/elm/order.go @@ -34,36 +34,28 @@ var ( } ) -type OrderController struct { - scheduler.BasePurchasePlatform -} - -func init() { - scheduler.CurrentScheduler.RegisterPurchasePlatform(model.VendorIDELM, new(OrderController)) -} - -func (c *OrderController) OnOrderStatusMsg(msg *elmapi.CallbackOrderStatusMsg) (retVal *elmapi.CallbackResponse) { +func (c *PurchaseHandler) OnOrderStatusMsg(msg *elmapi.CallbackOrderStatusMsg) (retVal *elmapi.CallbackResponse) { jxutils.CallMsgHandler(func() { retVal = c.onOrderStatusMsg(msg) }, jxutils.ComposeUniversalOrderID(msg.OrderID, model.VendorIDELM)) return retVal } -func (c *OrderController) OnOrderNewMsg(msg map[string]interface{}) (retVal *elmapi.CallbackResponse) { +func (c *PurchaseHandler) OnOrderNewMsg(msg map[string]interface{}) (retVal *elmapi.CallbackResponse) { jxutils.CallMsgHandler(func() { retVal = c.onOrderNew(msg) }, jxutils.ComposeUniversalOrderID(msg["orderId"].(string), model.VendorIDELM)) return retVal } -func (c *OrderController) OnOrderCancelRefundMsg(msg *elmapi.CallbackOrderCancelRefundMsg) (retVal *elmapi.CallbackResponse) { +func (c *PurchaseHandler) OnOrderCancelRefundMsg(msg *elmapi.CallbackOrderCancelRefundMsg) (retVal *elmapi.CallbackResponse) { jxutils.CallMsgHandler(func() { retVal = c.onOrderCancelRefundMsg(msg) }, jxutils.ComposeUniversalOrderID(msg.OrderID, model.VendorIDELM)) return retVal } -func (c *OrderController) orderStatusMsg2Status(msg *elmapi.CallbackOrderStatusMsg) *model.OrderStatus { +func (c *PurchaseHandler) orderStatusMsg2Status(msg *elmapi.CallbackOrderStatusMsg) *model.OrderStatus { orderStatus := &model.OrderStatus{ VendorOrderID: msg.OrderID, VendorID: model.VendorIDELM, @@ -76,7 +68,7 @@ func (c *OrderController) orderStatusMsg2Status(msg *elmapi.CallbackOrderStatusM return orderStatus } -func (c *OrderController) cancelRefundMsg2Status(msg *elmapi.CallbackOrderCancelRefundMsg) *model.OrderStatus { +func (c *PurchaseHandler) cancelRefundMsg2Status(msg *elmapi.CallbackOrderCancelRefundMsg) *model.OrderStatus { orderStatus := &model.OrderStatus{ VendorOrderID: msg.OrderID, VendorID: model.VendorIDELM, @@ -89,7 +81,7 @@ func (c *OrderController) cancelRefundMsg2Status(msg *elmapi.CallbackOrderCancel return orderStatus } -func (c *OrderController) onOrderStatusMsg(msg *elmapi.CallbackOrderStatusMsg) (retVal *elmapi.CallbackResponse) { +func (c *PurchaseHandler) onOrderStatusMsg(msg *elmapi.CallbackOrderStatusMsg) (retVal *elmapi.CallbackResponse) { status := c.orderStatusMsg2Status(msg) switch msg.MsgType { case elmapi.MsgTypeOrderAccepted: @@ -116,7 +108,7 @@ func (c *OrderController) onOrderStatusMsg(msg *elmapi.CallbackOrderStatusMsg) ( return elmapi.Err2CallbackResponse(err, status.VendorStatus) } -func (c *OrderController) onOrderCancelRefundMsg(msg *elmapi.CallbackOrderCancelRefundMsg) (retVal *elmapi.CallbackResponse) { +func (c *PurchaseHandler) onOrderCancelRefundMsg(msg *elmapi.CallbackOrderCancelRefundMsg) (retVal *elmapi.CallbackResponse) { status := c.cancelRefundMsg2Status(msg) switch msg.MsgType { case elmapi.MsgTypeUserApplyCancel: @@ -129,7 +121,7 @@ func (c *OrderController) onOrderCancelRefundMsg(msg *elmapi.CallbackOrderCancel return elmapi.Err2CallbackResponse(partner.CurOrderManager.OnOrderStatusChanged(status), status.VendorStatus) } -func (c *OrderController) GetOrder(orderID string) (order *model.GoodsOrder, err error) { +func (c *PurchaseHandler) GetOrder(orderID string) (order *model.GoodsOrder, err error) { result, err := api.ElmAPI.GetOrder(orderID) if err == nil { phoneList := result["phoneList"].([]interface{}) @@ -217,7 +209,7 @@ func setOrederDetailFee(result map[string]interface{}, order *model.GoodsOrder) } // -func (c *OrderController) onOrderNew(msg map[string]interface{}) (response *elmapi.CallbackResponse) { +func (c *PurchaseHandler) onOrderNew(msg map[string]interface{}) (response *elmapi.CallbackResponse) { // todo 这里应该可以直接用msg里的内容,而不用再次去查 order, err := c.GetOrder(msg["orderId"].(string)) if err == nil { @@ -230,7 +222,7 @@ func (c *OrderController) onOrderNew(msg map[string]interface{}) (response *elma return elmapi.Err2CallbackResponse(err, "elm onOrderNew") } -func (c *OrderController) onOrderUserUrgeOrder(msg *elmapi.CallbackOrderUrgeMsg) *elmapi.CallbackResponse { +func (c *PurchaseHandler) onOrderUserUrgeOrder(msg *elmapi.CallbackOrderUrgeMsg) *elmapi.CallbackResponse { status := &model.OrderStatus{ VendorOrderID: msg.OrderID, VendorID: model.VendorIDELM, @@ -247,11 +239,11 @@ func (c *OrderController) onOrderUserUrgeOrder(msg *elmapi.CallbackOrderUrgeMsg) return elmapi.Err2CallbackResponse(partner.CurOrderManager.OnOrderStatusChanged(status), status.VendorStatus) } -func (c *OrderController) stateAndType2Str(state string, msgType int) string { +func (c *PurchaseHandler) stateAndType2Str(state string, msgType int) string { return fmt.Sprintf("%s-%d", state, msgType) } -func (c *OrderController) spliltCompositeState(compositeState string) (state string, msgType int) { +func (c *PurchaseHandler) spliltCompositeState(compositeState string) (state string, msgType int) { index := strings.Index(compositeState, "-") if index >= 0 { msgType = int(utils.Str2Int64(compositeState[index+1:])) @@ -264,7 +256,7 @@ func (c *OrderController) spliltCompositeState(compositeState string) (state str } // IPurchasePlatformHandler -func (c *OrderController) GetStatusFromVendorStatus(vendorStatus string) int { +func (c *PurchaseHandler) GetStatusFromVendorStatus(vendorStatus string) int { state, _ := c.spliltCompositeState(vendorStatus) if status, ok := VendorStatus2StatusMap[state]; ok { return status @@ -272,7 +264,7 @@ func (c *OrderController) GetStatusFromVendorStatus(vendorStatus string) int { return model.OrderStatusUnknown } -func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { +func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { if isAcceptIt { err = api.ElmAPI.ConfirmOrder(order.VendorOrderID) } else { @@ -283,29 +275,29 @@ func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI // 饿了么没有拣货这个状态,直接返回成功 // 真实流程中也不会调用这个方法,因为接收订单后状态会直接转移到已拣货 -func (c *OrderController) PickupGoods(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder) (err error) { return nil } -func (c *OrderController) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { err = api.ElmAPI.DeliveryBySelfLite(order.VendorOrderID) return err } // 饿了么转商家自送后,没有确认送达的概念,空操作 -func (c *OrderController) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { return nil } -func (c *OrderController) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { return api.ElmAPI.StartDeliveryBySelf(order.VendorOrderID, order.ConsigneeMobile) } -func (c *OrderController) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { return api.ElmAPI.CompleteDeliveryBySelf(order.VendorOrderID, order.ConsigneeMobile) } -func (c *OrderController) GetStatusActionTimeout(statusType, status int) time.Duration { +func (c *PurchaseHandler) GetStatusActionTimeout(statusType, status int) time.Duration { if statusType == scheduler.TimerStatusTypeOrder && status == model.OrderStatusNew { return acceptOrderDelay // 饿了么开了专送店的订单没有拣货状态,接单后就为拣货完成,所以要延迟接单,否则门店来不及备货 } diff --git a/business/partner/purchase/elm/order_legacy.go b/business/partner/purchase/elm/order_legacy.go index 99bf60096..91976d239 100644 --- a/business/partner/purchase/elm/order_legacy.go +++ b/business/partner/purchase/elm/order_legacy.go @@ -9,7 +9,7 @@ import ( ) // 为了兼容之前的表,造出原来需要的数据 -func (c *OrderController) legacyWriteElmOrder(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) legacyWriteElmOrder(order *model.GoodsOrder) (err error) { db := orm.NewOrm() _, msgType := c.spliltCompositeState(order.VendorStatus) legacyOrder := &legacymodel.Elemeorder2{ @@ -26,7 +26,7 @@ func (c *OrderController) legacyWriteElmOrder(order *model.GoodsOrder) (err erro return err } -func (c *OrderController) legacyElmOrderStatusChanged(status *model.OrderStatus) (err error) { +func (c *PurchaseHandler) legacyElmOrderStatusChanged(status *model.OrderStatus) (err error) { db := orm.NewOrm() legacyOrder := &legacymodel.Elemeorder2{ Orderid: status.VendorOrderID, diff --git a/business/partner/purchase/elm/order_test.go b/business/partner/purchase/elm/order_test.go index 189c85aaa..cb9f43625 100644 --- a/business/partner/purchase/elm/order_test.go +++ b/business/partner/purchase/elm/order_test.go @@ -6,7 +6,7 @@ import ( _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "git.rosy.net.cn/jx-callback/globals/db" + "git.rosy.net.cn/jx-callback/globals/beegodb" "github.com/astaxie/beego" ) @@ -17,13 +17,13 @@ func init() { beego.BConfig.RunMode = "dev" // InitBeegoBeforeTest会将runmode设置为test globals.Init() - db.Init() + beegodb.Init() api.Init() } func TestGetOrder(t *testing.T) { orderID := "3025427524410871880" - order, err := new(OrderController).GetOrder(orderID) + order, err := new(PurchaseHandler).GetOrder(orderID) if err != nil { panic(err.Error()) } diff --git a/business/partner/purchase/elm/waybill.go b/business/partner/purchase/elm/waybill.go index 9ee85e9a2..7d4dd4213 100644 --- a/business/partner/purchase/elm/waybill.go +++ b/business/partner/purchase/elm/waybill.go @@ -11,17 +11,14 @@ import ( "git.rosy.net.cn/jx-callback/globals/api" ) -type WaybillController struct { -} - -func (c *WaybillController) OnWaybillStatusMsg(msg *elmapi.CallbackWaybillStatusMsg) (retVal *elmapi.CallbackResponse) { +func (c *PurchaseHandler) OnWaybillStatusMsg(msg *elmapi.CallbackWaybillStatusMsg) (retVal *elmapi.CallbackResponse) { jxutils.CallMsgHandler(func() { retVal = c.onWaybillStatusMsg(msg) }, jxutils.ComposeUniversalOrderID(msg.OrderID, model.VendorIDELM)) return retVal } -func (c *WaybillController) onWaybillStatusMsg(msg *elmapi.CallbackWaybillStatusMsg) (retVal *elmapi.CallbackResponse) { +func (c *PurchaseHandler) onWaybillStatusMsg(msg *elmapi.CallbackWaybillStatusMsg) (retVal *elmapi.CallbackResponse) { order := c.callbackMsg2Waybill(msg) if msg.MsgType == elmapi.MsgTypeWaybillWait4Courier { //MsgTypeWaybillWait4Courier事件与JD的新运单事件的时间机制更相似 order.Status = model.WaybillStatusNew @@ -51,7 +48,7 @@ func (c *WaybillController) onWaybillStatusMsg(msg *elmapi.CallbackWaybillStatus return elmapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) } -func (c *WaybillController) callbackMsg2Waybill(msg *elmapi.CallbackWaybillStatusMsg) (retVal *model.Waybill) { +func (c *PurchaseHandler) callbackMsg2Waybill(msg *elmapi.CallbackWaybillStatusMsg) (retVal *model.Waybill) { retVal = &model.Waybill{ VendorOrderID: msg.OrderID, OrderVendorID: model.VendorIDELM, @@ -65,6 +62,6 @@ func (c *WaybillController) callbackMsg2Waybill(msg *elmapi.CallbackWaybillStatu return retVal } -func (c *WaybillController) composeState(state, subState string, msgType int) string { +func (c *PurchaseHandler) composeState(state, subState string, msgType int) string { return fmt.Sprintf("%s-%d", state, msgType) } diff --git a/business/partner/purchase/jd/jd.go b/business/partner/purchase/jd/jd.go new file mode 100644 index 000000000..011d6cf22 --- /dev/null +++ b/business/partner/purchase/jd/jd.go @@ -0,0 +1,60 @@ +package jd + +import ( + "git.rosy.net.cn/baseapi/platformapi/jdapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" + "git.rosy.net.cn/jx-callback/business/model" +) + +var ( + curPurchaseHandler *PurchaseHandler +) + +type PurchaseHandler struct { + scheduler.BasePurchasePlatform +} + +func init() { + curPurchaseHandler = new(PurchaseHandler) + scheduler.CurrentScheduler.RegisterPurchasePlatform(model.VendorIDJD, curPurchaseHandler) +} + +func OnOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { + return curPurchaseHandler.OnOrderMsg(msg) +} + +func OnWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *jdapi.CallbackResponse) { + return curPurchaseHandler.OnWaybillMsg(msg) +} + +func JdOperationTime2JxOperationTime(value1 interface{}) int { + value := int(utils.Interface2Int64WithDefault(value1, 0)) + return (value/2)*100 + (value%2)*30 +} + +func JxOperationTime2JdOperationTime(value int) int { + return (value/100)*2 + (value % 30) +} + +func JdStoreStatus2JxStatus(yn, closeStatus interface{}) int { + yn2 := utils.Interface2Int64WithDefault(yn, 0) + closeStatus2 := utils.Interface2Int64WithDefault(closeStatus, 0) + if yn2 == 1 { + return model.StoreStatusDisabled + } else if closeStatus2 == 1 { + return model.StoreStatusClosed + } + return model.StoreStatusOpened +} + +func JxStoreStatus2JdStatus(status int) (yn, closeStatus int) { + switch status { + case model.StoreStatusDisabled: + return 1, 0 + case model.StoreStatusClosed: + return 0, 1 + default: + return 0, 0 + } +} diff --git a/business/partner/purchase/jd/order.go b/business/partner/purchase/jd/order.go index bedd36d27..b1e239ae8 100644 --- a/business/partner/purchase/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -6,7 +6,6 @@ import ( "git.rosy.net.cn/baseapi/platformapi/autonavi" "git.rosy.net.cn/baseapi/platformapi/jdapi" "git.rosy.net.cn/baseapi/utils" - "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" @@ -32,22 +31,14 @@ var ( } ) -type OrderController struct { - scheduler.BasePurchasePlatform -} - -func init() { - scheduler.CurrentScheduler.RegisterPurchasePlatform(model.VendorIDJD, new(OrderController)) -} - -func (c *OrderController) OnOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { +func (c *PurchaseHandler) OnOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { jxutils.CallMsgHandler(func() { retVal = c.onOrderMsg(msg) }, jxutils.ComposeUniversalOrderID(msg.BillID, model.VendorIDJD)) return retVal } -func (c *OrderController) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { +func (c *PurchaseHandler) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { if jdapi.OrderStatusNew == msg.StatusID { retVal = c.onOrderNew(msg) } else if jdapi.OrderStatusAdjust == msg.StatusID { @@ -68,7 +59,7 @@ func (c *OrderController) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi return retVal } -func (c *OrderController) GetOrder(orderID string) (order *model.GoodsOrder, err error) { +func (c *PurchaseHandler) GetOrder(orderID string) (order *model.GoodsOrder, err error) { result, err := api.JdAPI.QuerySingleOrder(orderID) // globals.SugarLogger.Info(result) if err == nil { @@ -148,7 +139,7 @@ func setOrederDetailFee(result map[string]interface{}, order *model.GoodsOrder) } // -func (c *OrderController) onOrderNew(msg *jdapi.CallbackOrderMsg) (response *jdapi.CallbackResponse) { +func (c *PurchaseHandler) onOrderNew(msg *jdapi.CallbackOrderMsg) (response *jdapi.CallbackResponse) { order, err := c.GetOrder(msg.BillID) if err == nil { err = partner.CurOrderManager.OnOrderNew(order, msg.StatusID) @@ -159,7 +150,7 @@ func (c *OrderController) onOrderNew(msg *jdapi.CallbackOrderMsg) (response *jda return jdapi.Err2CallbackResponse(err, "jd onOrderNew") } -func (c *OrderController) onOrderAdjust(msg *jdapi.CallbackOrderMsg) *jdapi.CallbackResponse { +func (c *PurchaseHandler) onOrderAdjust(msg *jdapi.CallbackOrderMsg) *jdapi.CallbackResponse { order, err := c.GetOrder(msg.BillID) if err == nil { err = partner.CurOrderManager.OnOrderAdjust(order, msg.StatusID) @@ -170,7 +161,7 @@ func (c *OrderController) onOrderAdjust(msg *jdapi.CallbackOrderMsg) *jdapi.Call return jdapi.Err2CallbackResponse(err, "jd onOrderAdjust") } -func (c *OrderController) callbackMsg2Status(msg *jdapi.CallbackOrderMsg) *model.OrderStatus { +func (c *PurchaseHandler) callbackMsg2Status(msg *jdapi.CallbackOrderMsg) *model.OrderStatus { orderStatus := &model.OrderStatus{ VendorOrderID: msg.BillID, VendorID: model.VendorIDJD, @@ -186,24 +177,24 @@ func (c *OrderController) callbackMsg2Status(msg *jdapi.CallbackOrderMsg) *model } // IPurchasePlatformHandler -func (c *OrderController) GetStatusFromVendorStatus(vendorStatus string) int { +func (c *PurchaseHandler) GetStatusFromVendorStatus(vendorStatus string) int { if status, ok := VendorStatus2StatusMap[vendorStatus]; ok { return status } return model.OrderStatusUnknown } -func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { +func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { _, err = api.JdAPI.OrderAcceptOperate(order.VendorOrderID, isAcceptIt) return err } -func (c *OrderController) PickupGoods(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder) (err error) { _, err = api.JdAPI.OrderJDZBDelivery(order.VendorOrderID) return err } -func (c *OrderController) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { _, err = api.JdAPI.ModifySellerDelivery(order.VendorOrderID) if err != nil { if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 { @@ -221,17 +212,17 @@ func (c *OrderController) Swtich2SelfDeliver(order *model.GoodsOrder) (err error return err } -func (c *OrderController) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { _, err = api.JdAPI.DeliveryEndOrder(order.VendorOrderID) return err } -func (c *OrderController) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { _, err = api.JdAPI.OrderSerllerDelivery(order.VendorOrderID) return err } // 京东送达接口都是一样的 -func (c *OrderController) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { return c.Swtich2SelfDelivered(order) } diff --git a/business/partner/purchase/jd/order_legacy.go b/business/partner/purchase/jd/order_legacy.go index 587b2f1fe..d3a20cf28 100644 --- a/business/partner/purchase/jd/order_legacy.go +++ b/business/partner/purchase/jd/order_legacy.go @@ -9,7 +9,7 @@ import ( ) // 为了兼容之前的表,造出原来需要的数据 -func (c *OrderController) legacyWriteJdOrder(order *model.GoodsOrder, delOldFirst bool) (err error) { +func (c *PurchaseHandler) legacyWriteJdOrder(order *model.GoodsOrder, delOldFirst bool) (err error) { db := orm.NewOrm() if delOldFirst { db.Raw("DELETE FROM jdorder2 WHERE jdorderid = ?", utils.Str2Int64(order.VendorOrderID)).Exec() @@ -29,7 +29,7 @@ func (c *OrderController) legacyWriteJdOrder(order *model.GoodsOrder, delOldFirs return err } -func (c *OrderController) legacyJdOrderStatusChanged(status *model.OrderStatus) (err error) { +func (c *PurchaseHandler) legacyJdOrderStatusChanged(status *model.OrderStatus) (err error) { db := orm.NewOrm() legacyOrder := &legacymodel.Jdorder2{ Jdorderid: utils.Str2Int64(status.VendorOrderID), diff --git a/business/partner/purchase/jd/order_test.go b/business/partner/purchase/jd/order_test.go index fbff2ed90..1e1f7188a 100644 --- a/business/partner/purchase/jd/order_test.go +++ b/business/partner/purchase/jd/order_test.go @@ -7,7 +7,7 @@ import ( "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "git.rosy.net.cn/jx-callback/globals/db" + "git.rosy.net.cn/jx-callback/globals/beegodb" "github.com/astaxie/beego" ) @@ -16,7 +16,7 @@ func init() { beego.BConfig.RunMode = "dev" // InitBeegoBeforeTest会将runmode设置为test globals.Init() - db.Init() + beegodb.Init() api.Init() } @@ -24,7 +24,7 @@ func TestSwitch2SelfDeliver(t *testing.T) { orderID := "817540316000041" if order, err := orderman.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { // globals.SugarLogger.Debug(order) - c := new(OrderController) + c := new(PurchaseHandler) if err = c.Swtich2SelfDeliver(order); err == nil { } else { t.Fatal(err.Error()) @@ -35,7 +35,7 @@ func TestSwitch2SelfDeliver(t *testing.T) { } func TestGetOrder(t *testing.T) { - _, err := new(OrderController).GetOrder("815536199000222") + _, err := new(PurchaseHandler).GetOrder("815536199000222") if err != nil { t.Fatal(err.Error()) } diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go new file mode 100644 index 000000000..e570d5e38 --- /dev/null +++ b/business/partner/purchase/jd/store.go @@ -0,0 +1,67 @@ +package jd + +import ( + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/globals/api" +) + +func (p *PurchaseHandler) GetAllStoreIDsFromRemote() ([]string, error) { + result, err := api.JdAPI.GetStationsByVenderId() + return result, err +} + +func (p *PurchaseHandler) GetAllStoresFromRemote() ([]*model.Store, error) { + ids, err := p.GetAllStoreIDsFromRemote() + if err == nil { + retVal := make([]*model.Store, len(ids)) + for index, id := range ids { + store, err2 := p.GetStoreFromRemote(id) + if err2 == nil { + retVal[index] = store + } else { + return nil, err2 + } + } + return retVal, nil + } + return nil, err +} + +func (p *PurchaseHandler) GetStoreFromRemote(vendorStoreID string) (*model.Store, error) { + result, err := api.JdAPI.GetStoreInfoByStationNo(vendorStoreID) + if err == nil { + retVal := &model.Store{ + Name: utils.Interface2String(result["stationName"]), + Address: utils.Interface2String(result["stationAddress"]), + OpenTime1: JdOperationTime2JxOperationTime(result["serviceTimeStart1"]), + CloseTime1: JdOperationTime2JxOperationTime(result["serviceTimeEnd1"]), + OpenTime2: JdOperationTime2JxOperationTime(result["serviceTimeStart2"]), + CloseTime2: JdOperationTime2JxOperationTime(result["serviceTimeEnd2"]), + Status: JdStoreStatus2JxStatus(result["yn"], result["closeStatus"]), + } + retVal.ID = uint(utils.Str2Int64WithDefault(utils.Interface2String(result["outSystemId"]), 0)) + return retVal, nil + } + return nil, err +} + +func (p *PurchaseHandler) SaveStore2Remote(vendorStoreID string, store *model.Store) error { + params := map[string]interface{}{ + "outSystemId": utils.Int2Str(int(store.ID)), + "stationName": store.Name, + "stationAddress": store.Address, + "serviceTimeStart1": JxOperationTime2JdOperationTime(store.OpenTime1), + "serviceTimeEnd1": JxOperationTime2JdOperationTime(store.CloseTime1), + "serviceTimeStart2": JxOperationTime2JdOperationTime(store.OpenTime2), + "serviceTimeEnd2": JxOperationTime2JdOperationTime(store.CloseTime2), + } + params["yn"], params["closeStatus"] = JxStoreStatus2JdStatus(store.Status) + _, err := api.JdAPI.UpdateStoreInfo4Open(vendorStoreID, "", params) + return err +} + +func (p *PurchaseHandler) EnableAutoAcceptOrder(vendorStoreID string, isEnabled bool) error { + _, err := api.JdAPI.UpdateStoreConfig4Open(vendorStoreID, isEnabled) + return err +} diff --git a/business/partner/purchase/jd/waybill.go b/business/partner/purchase/jd/waybill.go index 5f7483206..b2237bd6f 100644 --- a/business/partner/purchase/jd/waybill.go +++ b/business/partner/purchase/jd/waybill.go @@ -9,17 +9,14 @@ import ( "git.rosy.net.cn/jx-callback/globals/api" ) -type WaybillController struct { -} - -func (c *WaybillController) OnWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *jdapi.CallbackResponse) { +func (c *PurchaseHandler) OnWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *jdapi.CallbackResponse) { jxutils.CallMsgHandler(func() { retVal = c.onWaybillMsg(msg) }, jxutils.ComposeUniversalOrderID(msg.OrderID, model.VendorIDJD)) return retVal } -func (c *WaybillController) onWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *jdapi.CallbackResponse) { +func (c *PurchaseHandler) onWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *jdapi.CallbackResponse) { order := c.callbackMsg2Waybill(msg) switch msg.DeliveryStatus { case jdapi.DeliveryStatusWait4Grap: @@ -49,7 +46,7 @@ func (c *WaybillController) onWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) ( return jdapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus) } -func (c *WaybillController) callbackMsg2Waybill(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *model.Waybill) { +func (c *PurchaseHandler) callbackMsg2Waybill(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *model.Waybill) { retVal = &model.Waybill{ VendorOrderID: msg.OrderID, OrderVendorID: model.VendorIDJD, diff --git a/conf/app.conf b/conf/app.conf index b13505cdc..8c7164d32 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -17,6 +17,7 @@ autonaviKey = "4427170f870af2110becb8852d36ab08" callLegacyMsgHandler = false callNewMsgHandler = true generateLegacyJxOrder = false +enableStore = true [dev] freshFoodServerURL = "http://portal.beta.jxc4.com" @@ -40,7 +41,7 @@ dadaSourceID = "73753" weixinAppID = "wxbf235770edaabc5c" weixinSecret = "ba32b269a068a5b72486a0beafd171e8" -dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8&loc=Local" +dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8&loc=Local&parseTime=true" [prod] freshFoodServerURL = "http://portal.int.jxc4.com" @@ -64,7 +65,9 @@ dadaSourceID = "6660" weixinAppID = "wx2bb99eb5d2c9b82c" weixinSecret = "6bbbed1443cc062c20a015a64c07a531" -dbConnectStr = "root:WebServer@1@tcp(db1.int.jxc4.com:3306)/jxd_dev_0?charset=utf8&loc=Local" +dbConnectStr = "root:WebServer@1@tcp(db1.int.jxc4.com:3306)/jxd_dev_0?charset=utf8&loc=Local&parseTime=true" + +enableStore = false [test] freshFoodServerURL = "http://portal.alpha.int.jxc4.com" @@ -88,4 +91,4 @@ dadaSourceID = "6660" weixinAppID = "wx2bb99eb5d2c9b82c" weixinSecret = "6bbbed1443cc062c20a015a64c07a531" -dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8&loc=Local" +dbConnectStr = "root:WebServer@1@tcp(127.0.0.1:3306)/jxd_dev_0?charset=utf8&loc=Local&parseTime=true" diff --git a/controllers/dada_order.go b/controllers/dada_order.go index efce331f1..5979c7034 100644 --- a/controllers/dada_order.go +++ b/controllers/dada_order.go @@ -31,13 +31,12 @@ func (c *DadaOrderController) OrderStatusChanged() { callbackResponse = cc.OrderStatusChanged(obj) } if globals.CallNewMsgHandler { - cc2 := &dada.WaybillController{} if globals.CallLegacyMsgHandler { utils.CallFuncAsync(func() { - cc2.OnWaybillMsg(obj) + dada.OnWaybillMsg(obj) }) } else { - callbackResponse = cc2.OnWaybillMsg(obj) + callbackResponse = dada.OnWaybillMsg(obj) } } } diff --git a/controllers/elm_order.go b/controllers/elm_order.go index aec3e3bf5..f69e21d02 100644 --- a/controllers/elm_order.go +++ b/controllers/elm_order.go @@ -33,13 +33,12 @@ func (c *ELMOrderController) MsgPost() { callbackResponse = cc.OrderMessage(obj) } if globals.CallNewMsgHandler { - cc2 := &elm.Controller{} if globals.CallLegacyMsgHandler { utils.CallFuncAsync(func() { - cc2.OnCallbackMsg(obj) + elm.OnCallbackMsg(obj) }) } else { - callbackResponse = cc2.OnCallbackMsg(obj) + callbackResponse = elm.OnCallbackMsg(obj) } } } diff --git a/controllers/jd_order.go b/controllers/jd_order.go index 6089f3aa3..d89df81fc 100644 --- a/controllers/jd_order.go +++ b/controllers/jd_order.go @@ -42,13 +42,12 @@ func (c *JDOrderController) orderStatus(isCancelOrder bool) { callbackResponse = cc.OrderStatus(obj) } if globals.CallNewMsgHandler { - cc2 := &jd.OrderController{} if globals.CallLegacyMsgHandler { utils.CallFuncAsync(func() { - cc2.OnOrderMsg(obj) + jd.OnOrderMsg(obj) }) } else { - callbackResponse = cc2.OnOrderMsg(obj) + callbackResponse = jd.OnOrderMsg(obj) } } } @@ -160,13 +159,12 @@ func (c *JDOrderController) PushDeliveryStatus() { callbackResponse = cc.OrderDeliveryStatus(obj) } if globals.CallNewMsgHandler { - cc2 := &jd.WaybillController{} if globals.CallLegacyMsgHandler { utils.CallFuncAsync(func() { - cc2.OnWaybillMsg(obj) + jd.OnWaybillMsg(obj) }) } else { - callbackResponse = cc2.OnWaybillMsg(obj) + callbackResponse = jd.OnWaybillMsg(obj) } } } diff --git a/controllers/mtps_order.go b/controllers/mtps_order.go index 9862fe8b4..3c7228cb9 100644 --- a/controllers/mtps_order.go +++ b/controllers/mtps_order.go @@ -32,13 +32,12 @@ func (c *MTPSOrderController) Status() { callbackResponse = cc.OrderStatusChanged(obj) } if globals.CallNewMsgHandler { - cc2 := &mtps.WaybillController{} if globals.CallLegacyMsgHandler { utils.CallFuncAsync(func() { - cc2.OnWaybillMsg(obj) + mtps.OnWaybillMsg(obj) }) } else { - callbackResponse = cc2.OnWaybillMsg(obj) + callbackResponse = mtps.OnWaybillMsg(obj) } } } @@ -59,13 +58,12 @@ func (c *MTPSOrderController) Except() { callbackResponse = cc.OrderException(obj) } if globals.CallNewMsgHandler { - cc2 := &mtps.WaybillController{} if globals.CallLegacyMsgHandler { utils.CallFuncAsync(func() { - cc2.OnWaybillExcept(obj) + mtps.OnWaybillExcept(obj) }) } else { - callbackResponse = cc2.OnWaybillExcept(obj) + callbackResponse = mtps.OnWaybillExcept(obj) } } } diff --git a/globals/api/api.go b/globals/api/api.go index 4ae374e7e..d858f8bd0 100644 --- a/globals/api/api.go +++ b/globals/api/api.go @@ -8,7 +8,6 @@ import ( "git.rosy.net.cn/baseapi/platformapi/mtpsapi" "git.rosy.net.cn/baseapi/platformapi/weixinapi" "git.rosy.net.cn/baseapi/utils" - _ "git.rosy.net.cn/jx-callback/globals/db" "github.com/astaxie/beego" "github.com/astaxie/beego/orm" diff --git a/globals/db/db.go b/globals/beegodb/beegodb.go similarity index 89% rename from globals/db/db.go rename to globals/beegodb/beegodb.go index 4033ddac2..8ce86442f 100644 --- a/globals/db/db.go +++ b/globals/beegodb/beegodb.go @@ -1,4 +1,4 @@ -package db +package beegodb import ( "git.rosy.net.cn/jx-callback/business/legacymodel" @@ -7,7 +7,6 @@ import ( "git.rosy.net.cn/jx-callback/legacy/models" "github.com/astaxie/beego" "github.com/astaxie/beego/orm" - _ "github.com/go-sql-driver/mysql" // import your used driver ) func Init() { @@ -24,7 +23,7 @@ func Init() { orm.RegisterModel(new(model.Waybill)) orm.RegisterModel(new(model.OrderStatus)) - orm.RegisterModel(new(model.Jxstorefeature)) + orm.RegisterModel(new(legacymodel.Jxstorefeature)) orm.RegisterModel(new(legacymodel.TempLog)) orm.RegisterModel(new(legacymodel.Jxorder2)) diff --git a/globals/globals.go b/globals/globals.go index 4f9789676..ac95802a5 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -4,6 +4,7 @@ import ( "git.rosy.net.cn/baseapi" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" + _ "github.com/go-sql-driver/mysql" // import your used driver "go.uber.org/zap" ) diff --git a/globals/gormdb/gormdb.go b/globals/gormdb/gormdb.go new file mode 100644 index 000000000..eb5075b86 --- /dev/null +++ b/globals/gormdb/gormdb.go @@ -0,0 +1,41 @@ +package gormdb + +import ( + "fmt" + + "git.rosy.net.cn/jx-callback/business/model" + "github.com/astaxie/beego" + "github.com/jinzhu/gorm" +) + +var ( + dbStr string +) + +func Init() { + dbStr = beego.AppConfig.String("dbConnectStr") + AutoMigrate() + // globals.SugarLogger.Debug("fuck") +} + +func GetDB() *gorm.DB { + db, err := gorm.Open("mysql", dbStr) + if err == nil { + return db + } + panic(fmt.Sprintf("AutoMigrate failed with error:%v", err)) +} + +func AutoMigrate() { + db := GetDB() + db.SingularTable(true) + + // db.DropTableIfExists(&model.Place{}) + // db.DropTableIfExists(&model.Store{}, &model.StoreSub{}, &model.StoreMap{}) + // db.DropTableIfExists(&model.SkuCategory{}, &model.StoreSkuCategoryMap{}, &model.SkuName{}, &model.Sku{}, &model.SkuNamePlaceBind{}, &model.StoreSkuBind{}) + + db.AutoMigrate(&model.Place{}) + db.AutoMigrate(&model.Store{}, &model.StoreSub{}, &model.StoreMap{}) + db.AutoMigrate(&model.StoreSkuCategoryMap{}, &model.SkuName{}, &model.Sku{}, &model.SkuNamePlaceBind{}, &model.StoreSkuBind{}) + db.Set("gorm:table_options", "CHARSET=utf8mb4").AutoMigrate(&model.SkuCategory{}) +} diff --git a/main.go b/main.go index 0ac6af621..e5082342b 100644 --- a/main.go +++ b/main.go @@ -3,12 +3,14 @@ package main import ( "flag" "fmt" + "net/http" "os" "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" + "git.rosy.net.cn/jx-callback/business/jxstore/cms" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "git.rosy.net.cn/jx-callback/globals/db" + "git.rosy.net.cn/jx-callback/globals/beegodb" "git.rosy.net.cn/jx-callback/legacy/jd/controller" "git.rosy.net.cn/jx-callback/legacy/tasks" _ "git.rosy.net.cn/jx-callback/routers" @@ -26,7 +28,7 @@ var ( func Init() { // globals.Init() - db.Init() + beegodb.Init() api.Init() } @@ -88,6 +90,14 @@ func main() { } orderman.LoadPendingOrders() } + if beego.AppConfig.DefaultBool("enableStore", false) { + cms.Init() + mux := http.NewServeMux() + curAdmin := cms.GetAdmin() + curAdmin.MountTo("/admin", mux) + beego.Handler("/admin/*", mux) + } + if beego.BConfig.RunMode == "dev" { beego.BConfig.WebConfig.DirectoryIndex = true beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger" From eeeab319fa9344c3520219827d1b23f5fe2aa262 Mon Sep 17 00:00:00 2001 From: gazebo Date: Mon, 20 Aug 2018 10:58:45 +0800 Subject: [PATCH 03/16] - rough sku. --- business/model/model.go | 6 +++--- business/model/place.go | 2 +- business/model/product.go | 18 ++++++++++++++---- business/partner/purchase/jd/sku.go | 13 +++++++++++++ business/partner/purchase/jd/store.go | 2 +- 5 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 business/partner/purchase/jd/sku.go diff --git a/business/model/model.go b/business/model/model.go index f88b88a21..801d5a656 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -3,7 +3,7 @@ package model import "time" type ModelO struct { - ID uint `gorm:"primary_key"` + ID int `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time `sql:"index"` @@ -11,13 +11,13 @@ type ModelO struct { } type ModelIDCU struct { - ID uint `gorm:"primary_key"` + ID int `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time } type ModelIDCUO struct { - ID uint `gorm:"primary_key"` + ID int `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time LastOperator string `gorm:"type:varchar(32)"` // 最后操作员 diff --git a/business/model/place.go b/business/model/place.go index 84fdffeae..f5ef018e3 100644 --- a/business/model/place.go +++ b/business/model/place.go @@ -10,7 +10,7 @@ const ( ) type Place struct { - ID uint + ID int Code int `gorm:"unique_index"` // 国家标准代码 Name string `gorm:"type:varchar(16);index"` // 如果是直辖市,省的概念不加“市”来区别 ParentCode int // 上级代码 diff --git a/business/model/product.go b/business/model/product.go index 02db27f5d..bba0d315c 100644 --- a/business/model/product.go +++ b/business/model/product.go @@ -47,6 +47,15 @@ var ( } ) +// 这个指的是京东自已的商品分类,与商家自己的商品分类是两回事 +type SkuJdCategory struct { + ModelIDCUO + Name string `gorm:"type:varchar(255);unique_index"` + Status int + Level int + ParentID int64 +} + type SkuCategory struct { ModelIDCUO Name string `gorm:"type:varchar(255);unique_index"` @@ -55,10 +64,11 @@ type SkuCategory struct { Type int8 // 类别类型 Seq int - JdID string `gorm:"type:varchar(48)"` - ElmID string `gorm:"type:varchar(48)"` - MtID string `gorm:"type:varchar(48)"` - DidiID string `gorm:"type:varchar(48)"` + JdID int64 `gorm:"index"` // 这个是指商家自己的商品类别在京东平台上的ID + JdCategoryID int64 // 这个是指对应的京东商品类别 + ElmID string `gorm:"type:varchar(48);index"` + MtID string `gorm:"type:varchar(48);index"` + DidiID string `gorm:"type:varchar(48);index"` } type StoreSkuCategoryMap struct { diff --git a/business/partner/purchase/jd/sku.go b/business/partner/purchase/jd/sku.go new file mode 100644 index 000000000..bcaaa7726 --- /dev/null +++ b/business/partner/purchase/jd/sku.go @@ -0,0 +1,13 @@ +package jd + +import ( + "git.rosy.net.cn/jx-callback/business/model" +) + +func (p *PurchaseHandler) AddSku(sku *model.Sku) error { + // params := map[string]interface{}{ + // "outSkuId": utils.Int2Str(int(sku.ID)), + // "categoryId": + // } + return nil +} diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index e570d5e38..05a9fd753 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -40,7 +40,7 @@ func (p *PurchaseHandler) GetStoreFromRemote(vendorStoreID string) (*model.Store CloseTime2: JdOperationTime2JxOperationTime(result["serviceTimeEnd2"]), Status: JdStoreStatus2JxStatus(result["yn"], result["closeStatus"]), } - retVal.ID = uint(utils.Str2Int64WithDefault(utils.Interface2String(result["outSystemId"]), 0)) + retVal.ID = int(utils.Str2Int64WithDefault(utils.Interface2String(result["outSystemId"]), 0)) return retVal, nil } return nil, err From b69bac1182bf41c02bc7fa23828786be0d7f6a19 Mon Sep 17 00:00:00 2001 From: gazebo Date: Mon, 20 Aug 2018 15:08:36 +0800 Subject: [PATCH 04/16] - use auto router for callback msg. - first normal demo api FinishedPickup added. --- business/model/model.go | 5 + conf/app.conf | 2 - controllers/dada_order.go | 45 ++---- controllers/elm_order.go | 56 ++----- controllers/jd_order.go | 169 +++++--------------- controllers/jx_order.go | 28 ++++ controllers/mtps_order.go | 78 +++------ controllers/object.go | 92 ----------- controllers/user.go | 119 -------------- globals/beegodb/beegodb.go | 27 ++-- globals/globals.go | 21 +-- main.go | 4 - models/object.go | 53 ------ models/user.go | 86 ---------- routers/commentsRouter_controllers.go | 222 +------------------------- routers/router.go | 36 ++--- 16 files changed, 154 insertions(+), 889 deletions(-) create mode 100644 controllers/jx_order.go delete mode 100644 controllers/object.go delete mode 100644 controllers/user.go delete mode 100644 models/object.go delete mode 100644 models/user.go diff --git a/business/model/model.go b/business/model/model.go index 801d5a656..766f710b0 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -22,3 +22,8 @@ type ModelIDCUO struct { UpdatedAt time.Time LastOperator string `gorm:"type:varchar(32)"` // 最后操作员 } + +type CallResult struct { + Code int `json:"code"` + Result string `json:"result"` +} diff --git a/conf/app.conf b/conf/app.conf index 8c7164d32..74e402168 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -14,8 +14,6 @@ dadaAppSecret = "2c717ad914767d6e2beb3f743db9e477" autonaviKey = "4427170f870af2110becb8852d36ab08" -callLegacyMsgHandler = false -callNewMsgHandler = true generateLegacyJxOrder = false enableStore = true diff --git a/controllers/dada_order.go b/controllers/dada_order.go index 5979c7034..bf9a258e6 100644 --- a/controllers/dada_order.go +++ b/controllers/dada_order.go @@ -1,49 +1,32 @@ package controllers import ( + "net/http" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/partner/delivery/dada" - "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "git.rosy.net.cn/jx-callback/legacy/dada/controller" "github.com/astaxie/beego" ) // Operations about ELMOrder -type DadaOrderController struct { +type DadaDeliveryController struct { beego.Controller } -func (c *DadaOrderController) URLMapping() { - c.Mapping("OrderStatusChanged", c.OrderStatusChanged) -} - -// @Title all msg -// @Description create object -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /msg [post] -func (c *DadaOrderController) OrderStatusChanged() { - obj, callbackResponse := api.DadaAPI.GetOrderCallbackMsg(c.Ctx.Input.RequestBody) - if callbackResponse == nil { - if globals.CallLegacyMsgHandler { - cc := &controller.OrderController{} - callbackResponse = cc.OrderStatusChanged(obj) +func (c *DadaDeliveryController) Msg() { + if c.Ctx.Input.Method() == http.MethodPost { + obj, callbackResponse := api.DadaAPI.GetOrderCallbackMsg(c.Ctx.Input.RequestBody) + if callbackResponse == nil { + callbackResponse = dada.OnWaybillMsg(obj) } - if globals.CallNewMsgHandler { - if globals.CallLegacyMsgHandler { - utils.CallFuncAsync(func() { - dada.OnWaybillMsg(obj) - }) - } else { - callbackResponse = dada.OnWaybillMsg(obj) - } + if callbackResponse != nil && callbackResponse.Code != 200 { + c.CustomAbort(callbackResponse.Code, string(utils.MustMarshal(callbackResponse))) + } else { + c.Data["json"] = callbackResponse + c.ServeJSON() } - } - if callbackResponse != nil && callbackResponse.Code != 200 { - c.CustomAbort(callbackResponse.Code, string(utils.MustMarshal(callbackResponse))) } else { - c.Data["json"] = callbackResponse - c.ServeJSON() + c.Abort("404") } } diff --git a/controllers/elm_order.go b/controllers/elm_order.go index f69e21d02..bc8bdc8b1 100644 --- a/controllers/elm_order.go +++ b/controllers/elm_order.go @@ -1,56 +1,32 @@ package controllers import ( + "net/http" + "git.rosy.net.cn/baseapi/platformapi/elmapi" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/partner/purchase/elm" - "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "git.rosy.net.cn/jx-callback/legacy/elm/controller" "github.com/astaxie/beego" ) // Operations about ELMOrder -type ELMOrderController struct { +type ElemeController struct { beego.Controller } -func (c *ELMOrderController) URLMapping() { - c.Mapping("MsgPost", c.MsgPost) - c.Mapping("MsgGet", c.MsgGet) -} - -// @Title all msg -// @Description create object -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /msg [post] -func (c *ELMOrderController) MsgPost() { - obj, callbackResponse := api.ElmAPI.GetCallbackMsg(c.Ctx.Input.RequestBody) - if callbackResponse == nil { - if globals.CallLegacyMsgHandler { - cc := &controller.OrderController{} - callbackResponse = cc.OrderMessage(obj) - } - if globals.CallNewMsgHandler { - if globals.CallLegacyMsgHandler { - utils.CallFuncAsync(func() { - elm.OnCallbackMsg(obj) - }) - } else { - callbackResponse = elm.OnCallbackMsg(obj) - } +// https://open.shop.ele.me/openapi/documents/httppushmethod +func (c *ElemeController) Msg() { + if c.Ctx.Input.Method() == http.MethodPost { + obj, callbackResponse := api.ElmAPI.GetCallbackMsg(c.Ctx.Input.RequestBody) + if callbackResponse == nil { + callbackResponse = elm.OnCallbackMsg(obj) } + c.Data["json"] = callbackResponse + c.ServeJSON() + } else if c.Ctx.Input.Method() == http.MethodGet { // 应用需要支持推送地址的GET访问,当GET请求访问时,请直接返回{“message”:“ok”},用于推送地址的可用性测试。 + c.Data["json"] = elmapi.SuccessResponse + c.ServeJSON() + } else { + c.Abort("404") } - c.Data["json"] = callbackResponse - c.ServeJSON() -} - -// @Title all msg test -// @Description create object -// @Success 200 {string} models.Object.Id -// @router /msg [get] -func (c *ELMOrderController) MsgGet() { - c.Data["json"] = elmapi.SuccessResponse - c.ServeJSON() } diff --git a/controllers/jd_order.go b/controllers/jd_order.go index d89df81fc..70dbeb560 100644 --- a/controllers/jd_order.go +++ b/controllers/jd_order.go @@ -1,183 +1,88 @@ package controllers import ( + "net/http" + "git.rosy.net.cn/baseapi/platformapi/jdapi" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/partner/purchase/jd" - "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "git.rosy.net.cn/jx-callback/legacy/jd/controller" "github.com/astaxie/beego" ) // Operations about JDOrder -type JDOrderController struct { +type DjswController struct { beego.Controller } -func (c *JDOrderController) URLMapping() { - c.Mapping("NewOrder", c.NewOrder) - c.Mapping("OrderAdjust", c.OrderAdjust) - c.Mapping("OrderWaitOutStore", c.OrderWaitOutStore) - c.Mapping("PickFinishOrder", c.PickFinishOrder) - c.Mapping("DeliveryOrder", c.DeliveryOrder) - c.Mapping("LockOrder", c.LockOrder) - c.Mapping("UserCancelOrder", c.UserCancelOrder) - c.Mapping("ApplyCancelOrder", c.ApplyCancelOrder) - c.Mapping("PushDeliveryStatus", c.PushDeliveryStatus) -} +func (c *DjswController) orderStatus(isCancelOrder bool) { + if c.Ctx.Input.Method() == http.MethodPost { + var obj *jdapi.CallbackOrderMsg + var callbackResponse *jdapi.CallbackResponse -func (c *JDOrderController) orderStatus(isCancelOrder bool) { - var obj *jdapi.CallbackOrderMsg - var callbackResponse *jdapi.CallbackResponse - - if isCancelOrder { - obj, callbackResponse = api.JdAPI.GetOrderApplyCancelCallbackMsg(c.Ctx.Input.RequestBody) + if isCancelOrder { + obj, callbackResponse = api.JdAPI.GetOrderApplyCancelCallbackMsg(c.Ctx.Input.RequestBody) + } else { + obj, callbackResponse = api.JdAPI.GetOrderCallbackMsg(c.Ctx.Input.RequestBody) + } + if callbackResponse == nil { + callbackResponse = jd.OnOrderMsg(obj) + } + c.Data["json"] = callbackResponse + c.ServeJSON() } else { - obj, callbackResponse = api.JdAPI.GetOrderCallbackMsg(c.Ctx.Input.RequestBody) + c.Abort("404") } - if callbackResponse == nil { - if globals.CallLegacyMsgHandler { - cc := controller.OrderController{} - callbackResponse = cc.OrderStatus(obj) - } - if globals.CallNewMsgHandler { - if globals.CallLegacyMsgHandler { - utils.CallFuncAsync(func() { - jd.OnOrderMsg(obj) - }) - } else { - callbackResponse = jd.OnOrderMsg(obj) - } - } - } - c.Data["json"] = callbackResponse - c.ServeJSON() } -// @Title newOrder -// @Description create object -// @Param jd_param_json formData string true "应用级别输入参数" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /newOrder [post] -func (c *JDOrderController) NewOrder() { +func (c *DjswController) NewOrder() { c.orderStatus(false) } -// @Title AdjustOrder -// @Description create object -// @Param jd_param_json formData string true "应用级别输入参数" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /orderAdjust [post] -func (c *JDOrderController) OrderAdjust() { +func (c *DjswController) OrderAdjust() { c.orderStatus(false) } -// @Title orderWaitOutStore -// @Description create object -// @Param jd_param_json formData string true "应用级别输入参数" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /orderWaitOutStore [post] -func (c *JDOrderController) OrderWaitOutStore() { +func (c *DjswController) OrderWaitOutStore() { c.orderStatus(false) } -// @Title pickFinishOrder -// @Description create object -// @Param jd_param_json formData string true "应用级别输入参数" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /pickFinishOrder [post] -func (c *JDOrderController) PickFinishOrder() { +func (c *DjswController) PickFinishOrder() { c.orderStatus(false) } -// @Title deliveryOrder -// @Description create object -// @Param jd_param_json formData string true "应用级别输入参数" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /deliveryOrder [post] -func (c *JDOrderController) DeliveryOrder() { +func (c *DjswController) DeliveryOrder() { c.orderStatus(false) } -// @Title finishOrder -// @Description create object -// @Param jd_param_json formData string true "应用级别输入参数" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /finishOrder [post] -func (c *JDOrderController) FinishOrder() { +func (c *DjswController) FinishOrder() { c.orderStatus(false) } -// @Title lockOrder -// @Description create object -// @Param jd_param_json formData string true "应用级别输入参数" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /lockOrder [post] -func (c *JDOrderController) LockOrder() { +func (c *DjswController) LockOrder() { c.orderStatus(false) } -// @Title userCancelOrder -// @Description create object -// @Param jd_param_json formData string true "应用级别输入参数" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /userCancelOrder [post] -func (c *JDOrderController) UserCancelOrder() { +func (c *DjswController) UserCancelOrder() { c.orderStatus(false) } -// @Title applyCancelOrder -// @Description create object -// @Param jd_param_json formData string true "应用级别输入参数" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /applyCancelOrder [post] -func (c *JDOrderController) ApplyCancelOrder() { +func (c *DjswController) ApplyCancelOrder() { c.orderStatus(true) } -// @Title pushDeliveryStatus -// @Description create object -// @Param jd_param_json formData string true "应用级别输入参数" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /pushDeliveryStatus [post] -func (c *JDOrderController) PushDeliveryStatus() { - obj, callbackResponse := api.JdAPI.GetOrderDeliveryCallbackMsg(c.Ctx.Input.RequestBody) - if callbackResponse == nil { - if globals.CallLegacyMsgHandler { - cc := controller.OrderController{} - callbackResponse = cc.OrderDeliveryStatus(obj) - } - if globals.CallNewMsgHandler { - if globals.CallLegacyMsgHandler { - utils.CallFuncAsync(func() { - jd.OnWaybillMsg(obj) - }) - } else { - callbackResponse = jd.OnWaybillMsg(obj) - } +func (c *DjswController) PushDeliveryStatus() { + if c.Ctx.Input.Method() == http.MethodPost { + obj, callbackResponse := api.JdAPI.GetOrderDeliveryCallbackMsg(c.Ctx.Input.RequestBody) + if callbackResponse == nil { + callbackResponse = jd.OnWaybillMsg(obj) } + c.Data["json"] = callbackResponse + c.ServeJSON() + } else { + c.Abort("404") } - c.Data["json"] = callbackResponse - c.ServeJSON() } -// @Title pushDeliveryStatus -// @Description create object -// @Param jd_param_json formData string true "应用级别输入参数" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /orderCommentPush [post] -func (c *JDOrderController) OrderComment() { +func (c *DjswController) OrderCommentPush() { c.orderStatus(false) } diff --git a/controllers/jx_order.go b/controllers/jx_order.go new file mode 100644 index 000000000..6dcf0931c --- /dev/null +++ b/controllers/jx_order.go @@ -0,0 +1,28 @@ +package controllers + +import ( + "git.rosy.net.cn/jx-callback/business/model" + "github.com/astaxie/beego" +) + +type OrderController struct { + beego.Controller +} + +func (c *OrderController) URLMapping() { + c.Mapping("FinishedPickup", c.FinishedPickup) +} + +// @Title 完成拣货 +// @Description 完成拣货,如果是购物平台负责配送,则自动召唤相应配送 +// @Param orderid path string true "订单ID" +// @Success 200 {object} business.model.CallResult +// @Failure 200 {object} business.model.CallResult +// @router /finishedpickup/:orderid [post] +func (c *OrderController) FinishedPickup() { + c.Data["json"] = &model.CallResult{ + Code: 0, + Result: c.Ctx.Input.Param(":orderid"), + } + c.ServeJSON() +} diff --git a/controllers/mtps_order.go b/controllers/mtps_order.go index 3c7228cb9..9b583a1d2 100644 --- a/controllers/mtps_order.go +++ b/controllers/mtps_order.go @@ -1,72 +1,40 @@ package controllers import ( - "git.rosy.net.cn/baseapi/utils" + "net/http" + "git.rosy.net.cn/jx-callback/business/partner/delivery/mtps" - "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" - "git.rosy.net.cn/jx-callback/legacy/mtps/controller" "github.com/astaxie/beego" ) // Operations about ELMOrder -type MTPSOrderController struct { +type MtpsController struct { beego.Controller } -func (c *MTPSOrderController) URLMapping() { - c.Mapping("Status", c.Status) - c.Mapping("Except", c.Except) +func (c *MtpsController) Status() { + if c.Ctx.Input.Method() == http.MethodPost { + obj, callbackResponse := api.MtpsAPI.GetOrderCallbackMsg(c.Ctx.Request) + if callbackResponse == nil { + callbackResponse = mtps.OnWaybillMsg(obj) + } + c.Data["json"] = callbackResponse + c.ServeJSON() + } else { + c.Abort("404") + } } -// @Title all msg -// @Description create object -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /status [post] -func (c *MTPSOrderController) Status() { - obj, callbackResponse := api.MtpsAPI.GetOrderCallbackMsg(c.Ctx.Request) - if callbackResponse == nil { - if globals.CallLegacyMsgHandler { - cc := &controller.OrderController{} - callbackResponse = cc.OrderStatusChanged(obj) - } - if globals.CallNewMsgHandler { - if globals.CallLegacyMsgHandler { - utils.CallFuncAsync(func() { - mtps.OnWaybillMsg(obj) - }) - } else { - callbackResponse = mtps.OnWaybillMsg(obj) - } +func (c *MtpsController) Except() { + if c.Ctx.Input.Method() == http.MethodPost { + obj, callbackResponse := api.MtpsAPI.GetOrderExceptionCallbackMsg(c.Ctx.Request) + if callbackResponse == nil { + callbackResponse = mtps.OnWaybillExcept(obj) } + c.Data["json"] = callbackResponse + c.ServeJSON() + } else { + c.Abort("404") } - c.Data["json"] = callbackResponse - c.ServeJSON() -} - -// @Title all msg test -// @Description create object -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router /except [Post] -func (c *MTPSOrderController) Except() { - obj, callbackResponse := api.MtpsAPI.GetOrderExceptionCallbackMsg(c.Ctx.Request) - if callbackResponse == nil { - if globals.CallLegacyMsgHandler { - cc := &controller.OrderController{} - callbackResponse = cc.OrderException(obj) - } - if globals.CallNewMsgHandler { - if globals.CallLegacyMsgHandler { - utils.CallFuncAsync(func() { - mtps.OnWaybillExcept(obj) - }) - } else { - callbackResponse = mtps.OnWaybillExcept(obj) - } - } - } - c.Data["json"] = callbackResponse - c.ServeJSON() } diff --git a/controllers/object.go b/controllers/object.go deleted file mode 100644 index 014ea0f5c..000000000 --- a/controllers/object.go +++ /dev/null @@ -1,92 +0,0 @@ -package controllers - -import ( - "encoding/json" - - "git.rosy.net.cn/jx-callback/models" - - "github.com/astaxie/beego" -) - -// Operations about object -type ObjectController struct { - beego.Controller -} - -// @Title Create -// @Description create object -// @Param body body models.Object true "The object content" -// @Success 200 {string} models.Object.Id -// @Failure 403 body is empty -// @router / [post] -func (o *ObjectController) Post() { - var ob models.Object - json.Unmarshal(o.Ctx.Input.RequestBody, &ob) - objectid := models.AddOne(ob) - o.Data["json"] = map[string]string{"ObjectId": objectid} - o.ServeJSON() -} - -// @Title Get -// @Description find object by objectid -// @Param objectId path string true "the objectid you want to get" -// @Success 200 {object} models.Object -// @Failure 403 :objectId is empty -// @router /:objectId [get] -func (o *ObjectController) Get() { - objectId := o.Ctx.Input.Param(":objectId") - if objectId != "" { - ob, err := models.GetOne(objectId) - if err != nil { - o.Data["json"] = err.Error() - } else { - o.Data["json"] = ob - } - } - o.ServeJSON() -} - -// @Title GetAll -// @Description get all objects -// @Success 200 {object} models.Object -// @Failure 403 :objectId is empty -// @router / [get] -func (o *ObjectController) GetAll() { - obs := models.GetAll() - o.Data["json"] = obs - o.ServeJSON() -} - -// @Title Update -// @Description update the object -// @Param objectId path string true "The objectid you want to update" -// @Param body body models.Object true "The body" -// @Success 200 {object} models.Object -// @Failure 403 :objectId is empty -// @router /:objectId [put] -func (o *ObjectController) Put() { - objectId := o.Ctx.Input.Param(":objectId") - var ob models.Object - json.Unmarshal(o.Ctx.Input.RequestBody, &ob) - - err := models.Update(objectId, ob.Score) - if err != nil { - o.Data["json"] = err.Error() - } else { - o.Data["json"] = "update success!" - } - o.ServeJSON() -} - -// @Title Delete -// @Description delete the object -// @Param objectId path string true "The objectId you want to delete" -// @Success 200 {string} delete success! -// @Failure 403 objectId is empty -// @router /:objectId [delete] -func (o *ObjectController) Delete() { - objectId := o.Ctx.Input.Param(":objectId") - models.Delete(objectId) - o.Data["json"] = "delete success!" - o.ServeJSON() -} diff --git a/controllers/user.go b/controllers/user.go deleted file mode 100644 index b9d178c6e..000000000 --- a/controllers/user.go +++ /dev/null @@ -1,119 +0,0 @@ -package controllers - -import ( - "encoding/json" - - "git.rosy.net.cn/jx-callback/models" - - "github.com/astaxie/beego" -) - -// Operations about Users -type UserController struct { - beego.Controller -} - -// @Title CreateUser -// @Description create users -// @Param body body models.User true "body for user content" -// @Success 200 {int} models.User.Id -// @Failure 403 body is empty -// @router / [post] -func (u *UserController) Post() { - var user models.User - json.Unmarshal(u.Ctx.Input.RequestBody, &user) - uid := models.AddUser(user) - u.Data["json"] = map[string]string{"uid": uid} - u.ServeJSON() -} - -// @Title GetAll -// @Description get all Users -// @Success 200 {object} models.User -// @router / [get] -func (u *UserController) GetAll() { - users := models.GetAllUsers() - u.Data["json"] = users - u.ServeJSON() -} - -// @Title Get -// @Description get user by uid -// @Param uid path string true "The key for staticblock" -// @Success 200 {object} models.User -// @Failure 403 :uid is empty -// @router /:uid [get] -func (u *UserController) Get() { - uid := u.GetString(":uid") - if uid != "" { - user, err := models.GetUser(uid) - if err != nil { - u.Data["json"] = err.Error() - } else { - u.Data["json"] = user - } - } - u.ServeJSON() -} - -// @Title Update -// @Description update the user -// @Param uid path string true "The uid you want to update" -// @Param body body models.User true "body for user content" -// @Success 200 {object} models.User -// @Failure 403 :uid is not int -// @router /:uid [put] -func (u *UserController) Put() { - uid := u.GetString(":uid") - if uid != "" { - var user models.User - json.Unmarshal(u.Ctx.Input.RequestBody, &user) - uu, err := models.UpdateUser(uid, &user) - if err != nil { - u.Data["json"] = err.Error() - } else { - u.Data["json"] = uu - } - } - u.ServeJSON() -} - -// @Title Delete -// @Description delete the user -// @Param uid path string true "The uid you want to delete" -// @Success 200 {string} delete success! -// @Failure 403 uid is empty -// @router /:uid [delete] -func (u *UserController) Delete() { - uid := u.GetString(":uid") - models.DeleteUser(uid) - u.Data["json"] = "delete success!" - u.ServeJSON() -} - -// @Title Login -// @Description Logs user into the system -// @Param username query string true "The username for login" -// @Param password query string true "The password for login" -// @Success 200 {string} login success -// @Failure 403 user not exist -// @router /login [get] -func (u *UserController) Login() { - username := u.GetString("username") - password := u.GetString("password") - if models.Login(username, password) { - u.Data["json"] = "login success" - } else { - u.Data["json"] = "user not exist" - } - u.ServeJSON() -} - -// @Title logout -// @Description Logs out current logged in user session -// @Success 200 {string} logout success -// @router /logout [get] -func (u *UserController) Logout() { - u.Data["json"] = "logout success" - u.ServeJSON() -} diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 8ce86442f..61cd61797 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -3,8 +3,6 @@ package beegodb import ( "git.rosy.net.cn/jx-callback/business/legacymodel" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/globals" - "git.rosy.net.cn/jx-callback/legacy/models" "github.com/astaxie/beego" "github.com/astaxie/beego/orm" ) @@ -12,25 +10,20 @@ import ( func Init() { // set default database orm.RegisterDataBase("default", "mysql", beego.AppConfig.String("dbConnectStr"), 30) - if globals.CallLegacyMsgHandler { - models.RegisterModels() - } orm.RegisterModel(new(legacymodel.Config)) orm.RegisterModel(new(legacymodel.BlackClient)) - if globals.CallNewMsgHandler { - orm.RegisterModel(new(model.GoodsOrder)) - orm.RegisterModel(new(model.OrderSku)) - orm.RegisterModel(new(model.Waybill)) - orm.RegisterModel(new(model.OrderStatus)) - orm.RegisterModel(new(legacymodel.Jxstorefeature)) + orm.RegisterModel(new(model.GoodsOrder)) + orm.RegisterModel(new(model.OrderSku)) + orm.RegisterModel(new(model.Waybill)) + orm.RegisterModel(new(model.OrderStatus)) + + orm.RegisterModel(new(legacymodel.Jxstorefeature)) + + orm.RegisterModel(new(legacymodel.TempLog)) + orm.RegisterModel(new(legacymodel.Jxorder2)) + orm.RegisterModel(new(legacymodel.Jxordersku2)) - orm.RegisterModel(new(legacymodel.TempLog)) - orm.RegisterModel(new(legacymodel.Jxorder2)) - orm.RegisterModel(new(legacymodel.Jxordersku2)) - // orm.RegisterModel(new(legacymodel.Elemeorder2)) - // orm.RegisterModel(new(legacymodel.Jdorder2)) - } // create table orm.RunSyncdb("default", false, true) } diff --git a/globals/globals.go b/globals/globals.go index ac95802a5..570cd3c33 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -13,8 +13,6 @@ const ( ) var ( - CallLegacyMsgHandler bool - CallNewMsgHandler bool GenerateLegacyJxOrder bool ReallyCallPlatformAPI bool @@ -40,20 +38,11 @@ func init() { } func Init() { - CallLegacyMsgHandler = beego.AppConfig.DefaultBool("callLegacyMsgHandler", true) - CallNewMsgHandler = beego.AppConfig.DefaultBool("callNewMsgHandler", false) + ReallyCallPlatformAPI = true GenerateLegacyJxOrder = beego.AppConfig.DefaultBool("generateLegacyJxOrder", false) - ReallyCallPlatformAPI = !CallLegacyMsgHandler - if ReallyCallPlatformAPI { - JxorderTableName = "jxorder" - JxorderskuTableName = "jxordersku" - ElemeorderTableName = "elemeorder" - JdorderTableName = "jdorder" - } else { - JxorderTableName = "jxorder2" - JxorderskuTableName = "jxordersku2" - ElemeorderTableName = "elemeorder2" - JdorderTableName = "jdorder2" - } + JxorderTableName = "jxorder" + JxorderskuTableName = "jxordersku" + ElemeorderTableName = "elemeorder" + JdorderTableName = "jdorder" } diff --git a/main.go b/main.go index e5082342b..51a70d28a 100644 --- a/main.go +++ b/main.go @@ -11,7 +11,6 @@ import ( "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/beegodb" - "git.rosy.net.cn/jx-callback/legacy/jd/controller" "git.rosy.net.cn/jx-callback/legacy/tasks" _ "git.rosy.net.cn/jx-callback/routers" "github.com/astaxie/beego" @@ -85,9 +84,6 @@ func main() { globals.SugarLogger.Errorf("RefreshElmToken failed with error:%s", err) return } - if globals.CallLegacyMsgHandler { - controller.InitOrder() - } orderman.LoadPendingOrders() } if beego.AppConfig.DefaultBool("enableStore", false) { diff --git a/models/object.go b/models/object.go deleted file mode 100644 index 3ffb60850..000000000 --- a/models/object.go +++ /dev/null @@ -1,53 +0,0 @@ -package models - -import ( - "errors" - "strconv" - "time" -) - -var ( - Objects map[string]*Object -) - -type Object struct { - ObjectId string - Score int64 - PlayerName string -} - -func init() { - Objects = make(map[string]*Object) - Objects["hjkhsbnmn123"] = &Object{"hjkhsbnmn123", 100, "astaxie"} - Objects["mjjkxsxsaa23"] = &Object{"mjjkxsxsaa23", 101, "someone"} -} - -func AddOne(object Object) (ObjectId string) { - object.ObjectId = "astaxie" + strconv.FormatInt(time.Now().UnixNano(), 10) - Objects[object.ObjectId] = &object - return object.ObjectId -} - -func GetOne(ObjectId string) (object *Object, err error) { - if v, ok := Objects[ObjectId]; ok { - return v, nil - } - return nil, errors.New("ObjectId Not Exist") -} - -func GetAll() map[string]*Object { - return Objects -} - -func Update(ObjectId string, Score int64) (err error) { - if v, ok := Objects[ObjectId]; ok { - v.Score = Score - return nil - } - return errors.New("ObjectId Not Exist") -} - -func Delete(ObjectId string) { - delete(Objects, ObjectId) -} - diff --git a/models/user.go b/models/user.go deleted file mode 100644 index d4bebb207..000000000 --- a/models/user.go +++ /dev/null @@ -1,86 +0,0 @@ -package models - -import ( - "errors" - "strconv" - "time" -) - -var ( - UserList map[string]*User -) - -func init() { - UserList = make(map[string]*User) - u := User{"user_11111", "astaxie", "11111", Profile{"male", 20, "Singapore", "astaxie@gmail.com"}} - UserList["user_11111"] = &u -} - -type User struct { - Id string - Username string - Password string - Profile Profile -} - -type Profile struct { - Gender string - Age int - Address string - Email string -} - -func AddUser(u User) string { - u.Id = "user_" + strconv.FormatInt(time.Now().UnixNano(), 10) - UserList[u.Id] = &u - return u.Id -} - -func GetUser(uid string) (u *User, err error) { - if u, ok := UserList[uid]; ok { - return u, nil - } - return nil, errors.New("User not exists") -} - -func GetAllUsers() map[string]*User { - return UserList -} - -func UpdateUser(uid string, uu *User) (a *User, err error) { - if u, ok := UserList[uid]; ok { - if uu.Username != "" { - u.Username = uu.Username - } - if uu.Password != "" { - u.Password = uu.Password - } - if uu.Profile.Age != 0 { - u.Profile.Age = uu.Profile.Age - } - if uu.Profile.Address != "" { - u.Profile.Address = uu.Profile.Address - } - if uu.Profile.Gender != "" { - u.Profile.Gender = uu.Profile.Gender - } - if uu.Profile.Email != "" { - u.Profile.Email = uu.Profile.Email - } - return u, nil - } - return nil, errors.New("User Not Exist") -} - -func Login(username, password string) bool { - for _, u := range UserList { - if u.Username == username && u.Password == password { - return true - } - } - return false -} - -func DeleteUser(uid string) { - delete(UserList, uid) -} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 5e2004625..7dbce193f 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -7,228 +7,12 @@ import ( func init() { - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:DadaOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:DadaOrderController"], + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ - Method: "OrderStatusChanged", - Router: `/msg`, + Method: "FinishedPickup", + Router: `/finishedpickup/:orderid`, AllowHTTPMethods: []string{"post"}, MethodParams: param.Make(), Params: nil}) - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ELMOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ELMOrderController"], - beego.ControllerComments{ - Method: "MsgPost", - Router: `/msg`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ELMOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ELMOrderController"], - beego.ControllerComments{ - Method: "MsgGet", - Router: `/msg`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"], - beego.ControllerComments{ - Method: "ApplyCancelOrder", - Router: `/applyCancelOrder`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"], - beego.ControllerComments{ - Method: "DeliveryOrder", - Router: `/deliveryOrder`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"], - beego.ControllerComments{ - Method: "FinishOrder", - Router: `/finishOrder`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"], - beego.ControllerComments{ - Method: "LockOrder", - Router: `/lockOrder`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"], - beego.ControllerComments{ - Method: "NewOrder", - Router: `/newOrder`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"], - beego.ControllerComments{ - Method: "OrderAdjust", - Router: `/orderAdjust`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"], - beego.ControllerComments{ - Method: "OrderComment", - Router: `/orderCommentPush`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"], - beego.ControllerComments{ - Method: "OrderWaitOutStore", - Router: `/orderWaitOutStore`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"], - beego.ControllerComments{ - Method: "PickFinishOrder", - Router: `/pickFinishOrder`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"], - beego.ControllerComments{ - Method: "PushDeliveryStatus", - Router: `/pushDeliveryStatus`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:JDOrderController"], - beego.ControllerComments{ - Method: "UserCancelOrder", - Router: `/userCancelOrder`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:MTPSOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:MTPSOrderController"], - beego.ControllerComments{ - Method: "Except", - Router: `/except`, - AllowHTTPMethods: []string{"Post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:MTPSOrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:MTPSOrderController"], - beego.ControllerComments{ - Method: "Status", - Router: `/status`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ObjectController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ObjectController"], - beego.ControllerComments{ - Method: "Post", - Router: `/`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ObjectController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ObjectController"], - beego.ControllerComments{ - Method: "GetAll", - Router: `/`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ObjectController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ObjectController"], - beego.ControllerComments{ - Method: "Get", - Router: `/:objectId`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ObjectController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ObjectController"], - beego.ControllerComments{ - Method: "Put", - Router: `/:objectId`, - AllowHTTPMethods: []string{"put"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ObjectController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ObjectController"], - beego.ControllerComments{ - Method: "Delete", - Router: `/:objectId`, - AllowHTTPMethods: []string{"delete"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"], - beego.ControllerComments{ - Method: "Post", - Router: `/`, - AllowHTTPMethods: []string{"post"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"], - beego.ControllerComments{ - Method: "GetAll", - Router: `/`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"], - beego.ControllerComments{ - Method: "Get", - Router: `/:uid`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"], - beego.ControllerComments{ - Method: "Put", - Router: `/:uid`, - AllowHTTPMethods: []string{"put"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"], - beego.ControllerComments{ - Method: "Delete", - Router: `/:uid`, - AllowHTTPMethods: []string{"delete"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"], - beego.ControllerComments{ - Method: "Login", - Router: `/login`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Params: nil}) - - beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:UserController"], - beego.ControllerComments{ - Method: "Logout", - Router: `/logout`, - AllowHTTPMethods: []string{"get"}, - MethodParams: param.Make(), - Params: nil}) - } diff --git a/routers/router.go b/routers/router.go index 23c0ec4f1..ec0c4455b 100644 --- a/routers/router.go +++ b/routers/router.go @@ -15,31 +15,21 @@ import ( ) func init() { - nsJd := beego.NewNamespace("/djsw", - beego.NSInclude( - &controllers.JDOrderController{}, + ns := beego.NewNamespace("/v2", + beego.NSNamespace("/order", + beego.NSInclude( + &controllers.OrderController{}, + ), ), ) - nsElm := beego.NewNamespace("/eleme", - beego.NSInclude( - &controllers.ELMOrderController{}, - ), - ) - nsMtps := beego.NewNamespace("/mtps", - beego.NSInclude( - &controllers.MTPSOrderController{}, - ), - ) - nsDada := beego.NewNamespace("/dadadelivery", - beego.NSInclude( - &controllers.DadaOrderController{}, - ), - ) - beego.AddNamespace(nsJd, nsElm, nsMtps, nsDada) - beego.Get("/", func(ctx *beecontext.Context) { - ctx.WriteString("pong\n") - }) - beego.Head("/", func(ctx *beecontext.Context) { + beego.AddNamespace(ns) + + beego.AutoRouter(&controllers.DjswController{}) + beego.AutoRouter(&controllers.MtpsController{}) + beego.AutoRouter(&controllers.ElemeController{}) + beego.AutoRouter(&controllers.DadaDeliveryController{}) + + beego.Any("/", func(ctx *beecontext.Context) { ctx.WriteString("pong\n") }) } From b74a5e43794b4c2c289a198173c2a70955421aaa Mon Sep 17 00:00:00 2001 From: gazebo Date: Mon, 20 Aug 2018 15:30:59 +0800 Subject: [PATCH 05/16] - update courier_name and courier_mobile on event >= model.WaybillStatusAccepted and < model.WaybillStatusEndBegin. --- business/jxcallback/orderman/waybill.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/business/jxcallback/orderman/waybill.go b/business/jxcallback/orderman/waybill.go index 618757907..3269df500 100644 --- a/business/jxcallback/orderman/waybill.go +++ b/business/jxcallback/orderman/waybill.go @@ -69,13 +69,15 @@ func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) { if bill.Status == model.WaybillStatusNew { isDuplicated, err = w.onWaybillNew(bill, db) } else { - var addParams orm.Params - if bill.Status == model.WaybillStatusAccepted { - addParams = orm.Params{ - "courier_name": bill.CourierName, - "courier_mobile": bill.CourierMobile, - "desired_fee": bill.DesiredFee, + addParams := orm.Params{} + if bill.Status >= model.WaybillStatusAccepted && bill.Status < model.WaybillStatusEndBegin { + if bill.Status == model.WaybillStatusAccepted { + addParams["desired_fee"] = bill.DesiredFee } + addParams["courier_name"] = bill.CourierName + addParams["courier_mobile"] = bill.CourierMobile + } else if bill.Status >= model.WaybillStatusEndBegin { + addParams["waybill_finished_at"] = bill.StatusTime } isDuplicated, err = w.addWaybillStatus(bill, db, addParams) } @@ -97,9 +99,6 @@ func (w *OrderManager) addWaybillStatus(bill *model.Waybill, db orm.Ormer, addPa "vendor_status": bill.VendorStatus, "status_time": bill.StatusTime, }, addParams) - if bill.Status >= model.WaybillStatusEndBegin { - params["waybill_finished_at"] = bill.StatusTime - } utils.CallFuncLogError(func() error { _, err = db.QueryTable("waybill").Filter("vendor_waybill_id", bill.VendorWaybillID).Filter("waybill_vendor_id", bill.WaybillVendorID).Update(params) return err From c29bcea27c7a5adf7faea5f5323bba8d5071f7dd Mon Sep 17 00:00:00 2001 From: gazebo Date: Mon, 20 Aug 2018 18:07:02 +0800 Subject: [PATCH 06/16] - refactor. --- business/jxcallback/orderman/order.go | 9 + business/jxcallback/orderman/orderman.go | 14 +- .../jxcallback/scheduler/basesch/basesch.go | 203 ++++++++++++++++++ .../jxcallback/scheduler/defsch/defsch.go | 3 +- business/jxcallback/scheduler/scheduler.go | 170 +-------------- .../partner/delivery/dada/waybill_test.go | 5 +- .../partner/delivery/mtps/waybill_test.go | 5 +- business/partner/partner.go | 1 + business/partner/purchase/elm/order_test.go | 6 +- business/partner/purchase/jd/order_test.go | 5 +- 10 files changed, 236 insertions(+), 185 deletions(-) create mode 100644 business/jxcallback/scheduler/basesch/basesch.go diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 81006a034..cb3cfd036 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -339,6 +339,15 @@ func (c *OrderManager) LoadOrder(vendorOrderID string, vendorID int) (order *mod return order, err } +func (c *OrderManager) UpdateOrderStatusDirectly(order *model.GoodsOrder) (err error) { + db := orm.NewOrm() + utils.CallFuncLogError(func() error { + _, err = db.Update(db, "Status") + return err + }, "UpdateOrderStatusDirectly orderID:%s failed with error:%v", order.VendorOrderID, err) + return err +} + //Waybill func (c *OrderManager) UpdateWaybillVendorID(bill *model.Waybill, revertStatus bool) (err error) { globals.SugarLogger.Debugf("UpdateWaybillVendorID bill:%v", bill) diff --git a/business/jxcallback/orderman/orderman.go b/business/jxcallback/orderman/orderman.go index 83e84325c..9f09f2185 100644 --- a/business/jxcallback/orderman/orderman.go +++ b/business/jxcallback/orderman/orderman.go @@ -21,7 +21,7 @@ const ( ) var ( - CurOrderManager *OrderManager + curOrderManager *OrderManager ) // 所有公共接口调用前,要求在order里或status中设置合适的Status @@ -32,11 +32,11 @@ func NewOrderManager() *OrderManager { return &OrderManager{} } -type StatusTimer interface { +type IStatusTimer interface { GetStatusTime() time.Time } -type StatusTimerSlice []StatusTimer +type StatusTimerSlice []IStatusTimer func (s StatusTimerSlice) Len() int { return len(s) @@ -53,8 +53,8 @@ func (s StatusTimerSlice) Swap(i, j int) { } func init() { - CurOrderManager = NewOrderManager() - partner.Init(CurOrderManager) + curOrderManager = NewOrderManager() + partner.Init(curOrderManager) } func addOrderOrWaybillStatus(status *model.OrderStatus, db orm.Ormer) (isDuplicated bool, err error) { @@ -86,12 +86,12 @@ func addOrderOrWaybillStatus(status *model.OrderStatus, db orm.Ormer) (isDuplica // todo 最好还是改成全事件回放算了 func LoadPendingOrders() { - orders := CurOrderManager.LoadPendingOrders() + orders := curOrderManager.LoadPendingOrders() globals.SugarLogger.Infof("LoadPendingOrders orders count:%d", len(orders)) ordersCount := len(orders) if ordersCount > 0 { - bills := CurOrderManager.LoadPendingWaybills() + bills := curOrderManager.LoadPendingWaybills() globals.SugarLogger.Infof("LoadPendingOrders waybills count:%d", len(bills)) var sortOrders StatusTimerSlice for _, order := range orders { diff --git a/business/jxcallback/scheduler/basesch/basesch.go b/business/jxcallback/scheduler/basesch/basesch.go new file mode 100644 index 000000000..aa4f54087 --- /dev/null +++ b/business/jxcallback/scheduler/basesch/basesch.go @@ -0,0 +1,203 @@ +package basesch + +import ( + "fmt" + + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" + "git.rosy.net.cn/jx-callback/globals" +) + +type BaseScheduler struct { + PurchasePlatformHandlers map[int]partner.IPurchasePlatformHandler + DeliveryPlatformHandlers map[int]*scheduler.DeliveryPlatformHandlerInfo + IsReallyCallPlatformAPI bool +} + +func (c *BaseScheduler) Init() { + c.PurchasePlatformHandlers = make(map[int]partner.IPurchasePlatformHandler) + c.DeliveryPlatformHandlers = make(map[int]*scheduler.DeliveryPlatformHandlerInfo) +} + +func (c *BaseScheduler) RegisterPurchasePlatform(vendorID int, handler partner.IPurchasePlatformHandler) { + 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 partner.IDeliveryPlatformHandler, isUse4CreateWaybill bool) { + 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] = &scheduler.DeliveryPlatformHandlerInfo{ + Handler: handler, + Use4CreateWaybill: isUse4CreateWaybill, + } +} + +func (c *BaseScheduler) GetPurchasePlatformFromVendorID(vendorID int) partner.IPurchasePlatformHandler { + return c.PurchasePlatformHandlers[vendorID] +} + +func (c *BaseScheduler) GetDeliveryPlatformFromVendorID(vendorID int) *scheduler.DeliveryPlatformHandlerInfo { + return c.DeliveryPlatformHandlers[vendorID] +} + +func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { + globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) + if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusNew { + if c.IsReallyCallPlatformAPI { + err = utils.CallFuncLogErrorWithInfo(func() error { + return c.GetPurchasePlatformFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt) + }, "AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) + } + } else { + globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, status:%d is not suitable, isAcceptIt:%t", order.VendorOrderID, order.Status, isAcceptIt) + } + return err +} + +func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) { + globals.SugarLogger.Infof("PickupGoods orderID:%s", order.VendorOrderID) + if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusAccepted { + if c.IsReallyCallPlatformAPI { + err = utils.CallFuncLogErrorWithInfo(func() error { + return c.GetPurchasePlatformFromVendorID(order.VendorID).PickupGoods(order) + }, "PickupGoods orderID:%s", order.VendorOrderID) + } + } else { + globals.SugarLogger.Infof("PickupGoods orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + } + return err +} + +func (c *BaseScheduler) PickupGoodsExternal(vendorOrderID string, vendorID int) (err error) { + order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) + if err == nil { + err = c.PickupGoods(order) + if err == nil { + order.Status = model.OrderStatusFinishedPickup + err = utils.CallFuncLogErrorWithInfo(func() error { + return partner.CurOrderManager.UpdateOrderStatusDirectly(order) + }, "PickupGoodsExternal orderID:%s", order.VendorOrderID) + } + } + return err +} + +func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { + globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s", order.VendorOrderID) + if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup { + if c.IsReallyCallPlatformAPI { + err = utils.CallFuncLogErrorWithInfo(func() error { + return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDeliver(order) + }, "Swtich2SelfDeliver orderID:%s", order.VendorOrderID) + if err == nil { // 因为有些平台转自送后,不会再发送订单在配送中消息过来,所以成功后就强制设置状态为配送中 + order.Status = model.OrderStatusDelivering + } + } + } else { + globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + } + return err +} + +func (c *BaseScheduler) Swtich2SelfDeliverExternal(vendorOrderID string, vendorID int) (err error) { + order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) + if err == nil { + err = c.Swtich2SelfDeliver(order) + if err == nil { + order.Status = model.OrderStatusDelivering + err = utils.CallFuncLogErrorWithInfo(func() error { + return partner.CurOrderManager.UpdateOrderStatusDirectly(order) + }, "Swtich2SelfDeliverExternal orderID:%s", order.VendorOrderID) + } + } + return err +} + +func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { + globals.SugarLogger.Infof("Swtich2SelfDelivered orderID:%s", order.VendorOrderID) + if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering { + if c.IsReallyCallPlatformAPI { + err = utils.CallFuncLogError(func() error { + return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDelivered(order) + }, "Swtich2SelfDelivered orderID:%s", order.VendorOrderID) + } + } else { + globals.SugarLogger.Infof("Swtich2SelfDelivered orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + } + return err +} + +func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { + globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s", order.VendorOrderID) + if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup { + if c.IsReallyCallPlatformAPI { + err = utils.CallFuncLogError(func() error { + return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievering(order) + }, "SelfDeliverDelievering orderID:%s", order.VendorOrderID) + if err == nil { // 因为有些平台设置配送中后,不会发送订单在配送中消息过来,所以成功后就强制设置状态为配送中 + order.Status = model.OrderStatusDelivering + } + } + } else if order.Status == model.OrderStatusDelivering { + globals.SugarLogger.Debugf("SelfDeliverDelievering orderID:%s, status:%d already ok", order.VendorOrderID, order.Status) + } else { + globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + } + return err +} + +func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { + globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s", order.VendorOrderID) + if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering { + if c.IsReallyCallPlatformAPI { + err = utils.CallFuncLogError(func() error { + return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievered(order) + }, "SelfDeliverDelievered orderID:%s", order.VendorOrderID) + } + } else { + globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) + } + return err +} + +func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder) (err error) { + globals.SugarLogger.Infof("CreateWaybill orderID:%s, vendorID:%d", order.VendorOrderID, platformVendorID) + if !model.IsOrderSolid(order) { // 如果订单是不完整的 + globals.SugarLogger.Warnf("CreateWaybill orderID:%s, vendorID:%d is not solid!!!", order.VendorOrderID, platformVendorID) + return scheduler.ErrOrderIsNotSolid + } + if c.IsReallyCallPlatformAPI { + handlerInfo := c.GetDeliveryPlatformFromVendorID(platformVendorID) + if handlerInfo.Use4CreateWaybill { + if err = handlerInfo.Handler.CreateWaybill(order); err != nil { + globals.SugarLogger.Infof("CreateWaybill failed orderID:%s vendorID:%d with error:%v", order.VendorOrderID, platformVendorID, err) + } + } + } + return err +} + +func (c *BaseScheduler) CancelWaybill(bill *model.Waybill) (err error) { + globals.SugarLogger.Infof("CancelWaybill bill:%v", bill) + if c.IsReallyCallPlatformAPI && bill.OrderVendorID != bill.WaybillVendorID { + if handlerInfo := c.GetDeliveryPlatformFromVendorID(bill.WaybillVendorID); handlerInfo != nil { + err = utils.CallFuncLogError(func() error { + return handlerInfo.Handler.CancelWaybill(bill) + }, "CancelWaybill bill:%v", bill) + globals.SugarLogger.Debugf("CancelWaybill bill:%v canceled by myself", bill) + } + } + return err +} diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index cd7da0f2d..cbb74621e 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -7,6 +7,7 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler/basesch" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg" "git.rosy.net.cn/jx-callback/business/legacymodel" @@ -58,7 +59,7 @@ type StatusActionConfig struct { // 重要:此调度器要求同一定单的处理逻辑必须是序列化了的,不然会有并发问题 type DefScheduler struct { - scheduler.BaseScheduler + basesch.BaseScheduler defWorkflowConfig []map[int]*StatusActionConfig orderMap jxutils.SyncMapWithTimeout } diff --git a/business/jxcallback/scheduler/scheduler.go b/business/jxcallback/scheduler/scheduler.go index d3778cec0..479d89eb8 100644 --- a/business/jxcallback/scheduler/scheduler.go +++ b/business/jxcallback/scheduler/scheduler.go @@ -2,13 +2,10 @@ package scheduler import ( "errors" - "fmt" "time" - "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" - "git.rosy.net.cn/jx-callback/globals" ) const ( @@ -32,7 +29,7 @@ const ( ) var ( - CurrentScheduler Scheduler + CurrentScheduler IScheduler ) var ( @@ -48,7 +45,7 @@ type DeliveryPlatformHandlerInfo struct { Use4CreateWaybill bool } -type Scheduler interface { +type IScheduler interface { RegisterPurchasePlatform(vendorID int, handler partner.IPurchasePlatformHandler) RegisterDeliveryPlatform(vendorID int, handler partner.IDeliveryPlatformHandler, isUse4CreateWaybill bool) @@ -60,169 +57,6 @@ type Scheduler interface { OnWaybillStatusChanged(bill *model.Waybill, isPending bool) (err error) } -type BaseScheduler struct { - PurchasePlatformHandlers map[int]partner.IPurchasePlatformHandler - DeliveryPlatformHandlers map[int]*DeliveryPlatformHandlerInfo - IsReallyCallPlatformAPI bool -} - -func (c *BaseScheduler) Init() { - c.PurchasePlatformHandlers = make(map[int]partner.IPurchasePlatformHandler) - c.DeliveryPlatformHandlers = make(map[int]*DeliveryPlatformHandlerInfo) -} - -func (c *BaseScheduler) RegisterPurchasePlatform(vendorID int, handler partner.IPurchasePlatformHandler) { - 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 partner.IDeliveryPlatformHandler, isUse4CreateWaybill bool) { - 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] = &DeliveryPlatformHandlerInfo{ - Handler: handler, - Use4CreateWaybill: isUse4CreateWaybill, - } -} - -func (c *BaseScheduler) GetPurchasePlatformFromVendorID(vendorID int) partner.IPurchasePlatformHandler { - return c.PurchasePlatformHandlers[vendorID] -} - -func (c *BaseScheduler) GetDeliveryPlatformFromVendorID(vendorID int) *DeliveryPlatformHandlerInfo { - return c.DeliveryPlatformHandlers[vendorID] -} - -func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { - globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) - if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusNew { - if c.IsReallyCallPlatformAPI { - err = utils.CallFuncLogErrorWithInfo(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt) - }, "AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) - } - } else { - globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, status:%d is not suitable, isAcceptIt:%t", order.VendorOrderID, order.Status, isAcceptIt) - } - return err -} -func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) { - globals.SugarLogger.Infof("PickupGoods orderID:%s", order.VendorOrderID) - if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusAccepted { - if c.IsReallyCallPlatformAPI { - err = utils.CallFuncLogErrorWithInfo(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).PickupGoods(order) - }, "PickupGoods orderID:%s", order.VendorOrderID) - } - } else { - globals.SugarLogger.Infof("PickupGoods orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) - } - return err -} - -func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { - globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s", order.VendorOrderID) - if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup { - if c.IsReallyCallPlatformAPI { - err = utils.CallFuncLogErrorWithInfo(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDeliver(order) - }, "Swtich2SelfDeliver orderID:%s", order.VendorOrderID) - if err == nil { // 因为有些平台转自送后,不会再发送订单在配送中消息过来,所以成功后就强制设置状态为配送中 - order.Status = model.OrderStatusDelivering - } - } - } else { - globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) - } - return err -} - -func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { - globals.SugarLogger.Infof("Swtich2SelfDelivered orderID:%s", order.VendorOrderID) - if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering { - if c.IsReallyCallPlatformAPI { - err = utils.CallFuncLogError(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDelivered(order) - }, "Swtich2SelfDelivered orderID:%s", order.VendorOrderID) - } - } else { - globals.SugarLogger.Infof("Swtich2SelfDelivered orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) - } - return err -} - -func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { - globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s", order.VendorOrderID) - if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup { - if c.IsReallyCallPlatformAPI { - err = utils.CallFuncLogError(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievering(order) - }, "SelfDeliverDelievering orderID:%s", order.VendorOrderID) - if err == nil { // 因为有些平台设置配送中后,不会发送订单在配送中消息过来,所以成功后就强制设置状态为配送中 - order.Status = model.OrderStatusDelivering - } - } - } else if order.Status == model.OrderStatusDelivering { - globals.SugarLogger.Debugf("SelfDeliverDelievering orderID:%s, status:%d already ok", order.VendorOrderID, order.Status) - } else { - globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) - } - return err -} - -func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { - globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s", order.VendorOrderID) - if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering { - if c.IsReallyCallPlatformAPI { - err = utils.CallFuncLogError(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievered(order) - }, "SelfDeliverDelievered orderID:%s", order.VendorOrderID) - } - } else { - globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) - } - return err -} - -func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder) (err error) { - globals.SugarLogger.Infof("CreateWaybill orderID:%s, vendorID:%d", order.VendorOrderID, platformVendorID) - if !model.IsOrderSolid(order) { // 如果订单是不完整的 - globals.SugarLogger.Warnf("CreateWaybill orderID:%s, vendorID:%d is not solid!!!", order.VendorOrderID, platformVendorID) - return ErrOrderIsNotSolid - } - if c.IsReallyCallPlatformAPI { - handlerInfo := c.GetDeliveryPlatformFromVendorID(platformVendorID) - if handlerInfo.Use4CreateWaybill { - if err = handlerInfo.Handler.CreateWaybill(order); err != nil { - globals.SugarLogger.Infof("CreateWaybill failed orderID:%s vendorID:%d with error:%v", order.VendorOrderID, platformVendorID, err) - } - } - } - return err -} - -func (c *BaseScheduler) CancelWaybill(bill *model.Waybill) (err error) { - globals.SugarLogger.Infof("CancelWaybill bill:%v", bill) - if c.IsReallyCallPlatformAPI && bill.OrderVendorID != bill.WaybillVendorID { - if handlerInfo := c.GetDeliveryPlatformFromVendorID(bill.WaybillVendorID); handlerInfo != nil { - err = utils.CallFuncLogError(func() error { - return handlerInfo.Handler.CancelWaybill(bill) - }, "CancelWaybill bill:%v", bill) - globals.SugarLogger.Debugf("CancelWaybill bill:%v canceled by myself", bill) - } - } - return err -} - type BasePurchasePlatform struct { } diff --git a/business/partner/delivery/dada/waybill_test.go b/business/partner/delivery/dada/waybill_test.go index cc91e8d80..317027c9b 100644 --- a/business/partner/delivery/dada/waybill_test.go +++ b/business/partner/delivery/dada/waybill_test.go @@ -4,8 +4,9 @@ import ( "testing" "time" - "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" + _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/beegodb" @@ -23,7 +24,7 @@ func init() { func TestCreateWaybill(t *testing.T) { orderID := "817540316000041" - if order, err := orderman.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { + if order, err := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { // globals.SugarLogger.Debug(order) c := new(DeliveryHandler) if err = c.CreateWaybill(order); err == nil { diff --git a/business/partner/delivery/mtps/waybill_test.go b/business/partner/delivery/mtps/waybill_test.go index ac78c2f73..28a473a9e 100644 --- a/business/partner/delivery/mtps/waybill_test.go +++ b/business/partner/delivery/mtps/waybill_test.go @@ -3,8 +3,9 @@ package mtps import ( "testing" - "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" + _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/beegodb" @@ -22,7 +23,7 @@ func init() { func TestCreateWaybill(t *testing.T) { orerID := "817109342000022" - order, _ := orderman.CurOrderManager.LoadOrder(orerID, model.VendorIDJD) + order, _ := partner.CurOrderManager.LoadOrder(orerID, model.VendorIDJD) // globals.SugarLogger.Debug(order) c := new(DeliveryHandler) if err := c.CreateWaybill(order); err != nil { diff --git a/business/partner/partner.go b/business/partner/partner.go index b16a873a4..44e880a64 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -19,6 +19,7 @@ type IOrderManager interface { LoadOrder(vendorOrderID string, vendorID int) (order *model.GoodsOrder, err error) UpdateWaybillVendorID(bill *model.Waybill, revertStatus bool) (err error) + UpdateOrderStatusDirectly(order *model.GoodsOrder) (err error) } type IPurchasePlatformHandler interface { diff --git a/business/partner/purchase/elm/order_test.go b/business/partner/purchase/elm/order_test.go index cb9f43625..6e1c729d3 100644 --- a/business/partner/purchase/elm/order_test.go +++ b/business/partner/purchase/elm/order_test.go @@ -13,7 +13,7 @@ import ( func init() { //E:/goprojects/src/git.rosy.net.cn/jx-callback/conf/app.conf ///Users/xujianhua/go/src/git.rosy.net.cn/jx-callback/conf/app.conf - beego.InitBeegoBeforeTest("Users/xujianhua/go/src/git.rosy.net.cn/jx-callback/conf/app.conf") + beego.InitBeegoBeforeTest("/Users/xujianhua/go/src/git.rosy.net.cn/jx-callback/conf/app.conf") beego.BConfig.RunMode = "dev" // InitBeegoBeforeTest会将runmode设置为test globals.Init() @@ -25,9 +25,9 @@ func TestGetOrder(t *testing.T) { orderID := "3025427524410871880" order, err := new(PurchaseHandler).GetOrder(orderID) if err != nil { - panic(err.Error()) + t.Fatal(err.Error()) } if order.VendorOrderID != orderID { - panic(err.Error()) + t.Fatal(err.Error()) } } diff --git a/business/partner/purchase/jd/order_test.go b/business/partner/purchase/jd/order_test.go index 1e1f7188a..05890349e 100644 --- a/business/partner/purchase/jd/order_test.go +++ b/business/partner/purchase/jd/order_test.go @@ -3,8 +3,9 @@ package jd import ( "testing" - "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" + _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/globals/beegodb" @@ -22,7 +23,7 @@ func init() { func TestSwitch2SelfDeliver(t *testing.T) { orderID := "817540316000041" - if order, err := orderman.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { + if order, err := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { // globals.SugarLogger.Debug(order) c := new(PurchaseHandler) if err = c.Swtich2SelfDeliver(order); err == nil { From 643bcac0f8bcca403d99a445ba2b9b557b94b83f Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 21 Aug 2018 17:18:08 +0800 Subject: [PATCH 07/16] - order manager added. --- business/jxcallback/orderman/order.go | 2 +- business/jxcallback/orderman/orderman.go | 10 +- business/jxcallback/orderman/orderman_ext.go | 53 ++++++ .../jxcallback/scheduler/basesch/basesch.go | 52 +++--- .../scheduler/basesch/basesch_ext.go | 43 +++++ .../jxcallback/scheduler/defsch/defsch.go | 30 +++- business/jxcallback/scheduler/scheduler.go | 1 + business/jxutils/jxutils.go | 12 ++ business/model/api.go | 19 +++ business/model/model.go | 5 - business/model/order.go | 158 +++++++++--------- business/partner/delivery/dada/waybill.go | 21 ++- .../partner/delivery/dada/waybill_test.go | 3 +- business/partner/delivery/mtps/waybill.go | 40 ++--- .../partner/delivery/mtps/waybill_test.go | 3 +- business/partner/partner.go | 2 +- controllers/jx_order.go | 140 ++++++++++++++-- routers/commentsRouter_controllers.go | 34 +++- 18 files changed, 463 insertions(+), 165 deletions(-) create mode 100644 business/jxcallback/orderman/orderman_ext.go create mode 100644 business/jxcallback/scheduler/basesch/basesch_ext.go create mode 100644 business/model/api.go diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index cb3cfd036..0f5e51f1a 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -342,7 +342,7 @@ func (c *OrderManager) LoadOrder(vendorOrderID string, vendorID int) (order *mod func (c *OrderManager) UpdateOrderStatusDirectly(order *model.GoodsOrder) (err error) { db := orm.NewOrm() utils.CallFuncLogError(func() error { - _, err = db.Update(db, "Status") + _, err = db.Update(order, "Status") return err }, "UpdateOrderStatusDirectly orderID:%s failed with error:%v", order.VendorOrderID, err) return err diff --git a/business/jxcallback/orderman/orderman.go b/business/jxcallback/orderman/orderman.go index 9f09f2185..e07ed3879 100644 --- a/business/jxcallback/orderman/orderman.go +++ b/business/jxcallback/orderman/orderman.go @@ -21,7 +21,7 @@ const ( ) var ( - curOrderManager *OrderManager + FixedOrderManager *OrderManager ) // 所有公共接口调用前,要求在order里或status中设置合适的Status @@ -53,8 +53,8 @@ func (s StatusTimerSlice) Swap(i, j int) { } func init() { - curOrderManager = NewOrderManager() - partner.Init(curOrderManager) + FixedOrderManager = NewOrderManager() + partner.Init(FixedOrderManager) } func addOrderOrWaybillStatus(status *model.OrderStatus, db orm.Ormer) (isDuplicated bool, err error) { @@ -86,12 +86,12 @@ func addOrderOrWaybillStatus(status *model.OrderStatus, db orm.Ormer) (isDuplica // todo 最好还是改成全事件回放算了 func LoadPendingOrders() { - orders := curOrderManager.LoadPendingOrders() + orders := FixedOrderManager.LoadPendingOrders() globals.SugarLogger.Infof("LoadPendingOrders orders count:%d", len(orders)) ordersCount := len(orders) if ordersCount > 0 { - bills := curOrderManager.LoadPendingWaybills() + bills := FixedOrderManager.LoadPendingWaybills() globals.SugarLogger.Infof("LoadPendingOrders waybills count:%d", len(bills)) var sortOrders StatusTimerSlice for _, order := range orders { diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go new file mode 100644 index 000000000..da54c684b --- /dev/null +++ b/business/jxcallback/orderman/orderman_ext.go @@ -0,0 +1,53 @@ +package orderman + +import ( + "time" + + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/globals" + + "github.com/astaxie/beego/orm" +) + +const ( + maxLastHours = 2 * 24 // 最多只能查询两天内的订单数据 +) + +func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStatus, toStatus int) (orders []*model.GoodsOrderExt, err error) { + if lastHours > maxLastHours { + lastHours = maxLastHours + } + if toStatus == 0 { + toStatus = fromStatus + } + + db := orm.NewOrm() + _, err = db.Raw(` + SELECT t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile + FROM goods_order t1 + LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id + WHERE IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) = ? + AND t1.order_created_at >= ? + AND t1.Status >= ? AND t1.Status <= ? + `, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour), fromStatus, toStatus).QueryRows(&orders) + if err == nil { + return orders, nil + } + globals.SugarLogger.Infof("GetStoreOrderInfo storeID:%s failed with error:%v", storeID, err) + return nil, err +} + +func (c *OrderManager) GetOrderSkuInfo(vendorOrderID string, vendorID int) (skus []*model.OrderSkuExt, err error) { + db := orm.NewOrm() + _, err = db.Raw(` + SELECT t1.*, t2.img image + FROM order_sku t1 + LEFT JOIN jx_sku_name t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id + WHERE vendor_order_id = ? AND vendor_id = ? + `, vendorOrderID, vendorID).QueryRows(&skus) + if err == nil { + return skus, nil + } + globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s failed with error:%v", vendorOrderID, err) + return nil, err +} diff --git a/business/jxcallback/scheduler/basesch/basesch.go b/business/jxcallback/scheduler/basesch/basesch.go index aa4f54087..828f72aff 100644 --- a/business/jxcallback/scheduler/basesch/basesch.go +++ b/business/jxcallback/scheduler/basesch/basesch.go @@ -1,6 +1,7 @@ package basesch import ( + "errors" "fmt" "git.rosy.net.cn/baseapi/utils" @@ -16,6 +17,14 @@ type BaseScheduler struct { IsReallyCallPlatformAPI bool } +var ( + FixedBaseScheduler *BaseScheduler +) + +var ( + ErrOrderStatusIsNotSuitable = errors.New("订单状态不适合当前操作") +) + func (c *BaseScheduler) Init() { c.PurchasePlatformHandlers = make(map[int]partner.IPurchasePlatformHandler) c.DeliveryPlatformHandlers = make(map[int]*scheduler.DeliveryPlatformHandlerInfo) @@ -75,25 +84,12 @@ func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) { }, "PickupGoods orderID:%s", order.VendorOrderID) } } else { + err = ErrOrderStatusIsNotSuitable globals.SugarLogger.Infof("PickupGoods orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) } return err } -func (c *BaseScheduler) PickupGoodsExternal(vendorOrderID string, vendorID int) (err error) { - order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) - if err == nil { - err = c.PickupGoods(order) - if err == nil { - order.Status = model.OrderStatusFinishedPickup - err = utils.CallFuncLogErrorWithInfo(func() error { - return partner.CurOrderManager.UpdateOrderStatusDirectly(order) - }, "PickupGoodsExternal orderID:%s", order.VendorOrderID) - } - } - return err -} - func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s", order.VendorOrderID) if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup { @@ -106,25 +102,12 @@ func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) } } } else { + err = ErrOrderStatusIsNotSuitable globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) } return err } -func (c *BaseScheduler) Swtich2SelfDeliverExternal(vendorOrderID string, vendorID int) (err error) { - order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) - if err == nil { - err = c.Swtich2SelfDeliver(order) - if err == nil { - order.Status = model.OrderStatusDelivering - err = utils.CallFuncLogErrorWithInfo(func() error { - return partner.CurOrderManager.UpdateOrderStatusDirectly(order) - }, "Swtich2SelfDeliverExternal orderID:%s", order.VendorOrderID) - } - } - return err -} - func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { globals.SugarLogger.Infof("Swtich2SelfDelivered orderID:%s", order.VendorOrderID) if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering { @@ -172,21 +155,24 @@ func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder) (err erro return err } -func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder) (err error) { +func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) { globals.SugarLogger.Infof("CreateWaybill orderID:%s, vendorID:%d", order.VendorOrderID, platformVendorID) if !model.IsOrderSolid(order) { // 如果订单是不完整的 globals.SugarLogger.Warnf("CreateWaybill orderID:%s, vendorID:%d is not solid!!!", order.VendorOrderID, platformVendorID) - return scheduler.ErrOrderIsNotSolid + return nil, scheduler.ErrOrderIsNotSolid } if c.IsReallyCallPlatformAPI { handlerInfo := c.GetDeliveryPlatformFromVendorID(platformVendorID) - if handlerInfo.Use4CreateWaybill { - if err = handlerInfo.Handler.CreateWaybill(order); err != nil { + if handlerInfo != nil && handlerInfo.Use4CreateWaybill { + bill, err = handlerInfo.Handler.CreateWaybill(order, policy) + if err != nil { globals.SugarLogger.Infof("CreateWaybill failed orderID:%s vendorID:%d with error:%v", order.VendorOrderID, platformVendorID, err) } + } else { + err = scheduler.ErrDeliverProviderWrong } } - return err + return bill, err } func (c *BaseScheduler) CancelWaybill(bill *model.Waybill) (err error) { diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go new file mode 100644 index 000000000..a5f81d218 --- /dev/null +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -0,0 +1,43 @@ +package basesch + +import ( + "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/partner" +) + +func (c *BaseScheduler) CreateWaybillOnProviders(vendorOrderID string, vendorID int) (bills []*model.Waybill, err error) { + order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) + if err == nil { + bill, err2 := c.CreateWaybill(model.VendorIDMTPS, order, nil) + if err = err2; err == nil { + return []*model.Waybill{ + bill, + }, nil + } + } + return nil, err +} + +func (c *BaseScheduler) Swtich2SelfDeliverAndUpdateStatus(vendorOrderID string, vendorID int) (err error) { + order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) + if err == nil { + err = c.Swtich2SelfDeliver(order) + if err == nil { + order.Status = model.OrderStatusDelivering + err = partner.CurOrderManager.UpdateOrderStatusDirectly(order) + } + } + return err +} + +func (c *BaseScheduler) PickupGoodsAndUpdateStatus(vendorOrderID string, vendorID int) (err error) { + order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) + if err == nil { + err = c.PickupGoods(order) + if err == nil { + order.Status = model.OrderStatusFinishedPickup + err = partner.CurOrderManager.UpdateOrderStatusDirectly(order) + } + } + return err +} diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index cbb74621e..9d670e485 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -1,6 +1,7 @@ package defsch import ( + "errors" "fmt" "math/rand" "time" @@ -34,6 +35,14 @@ const ( orderMapStoreMaxTime = 4 * 24 * time.Hour // cache最长存储时间 ) +const ( + maxAddFee = 200 // 最大增加费用,单位为分,超过不发三方配送了 +) + +var ( + ErrAddFeeExceeded = errors.New("配送超过基准价太多") +) + type WatchOrderInfo struct { autoPickupTimeoutMinute int // 0表示禁用,1表示用缺省值time2AutoPickupMin,其它表示分钟数 storeDeliveryType int @@ -133,6 +142,7 @@ func init() { sch := &DefScheduler{} sch.IsReallyCallPlatformAPI = globals.ReallyCallPlatformAPI sch.Init() + basesch.FixedBaseScheduler = &sch.BaseScheduler scheduler.CurrentScheduler = sch sch.defWorkflowConfig = []map[int]*StatusActionConfig{ map[int]*StatusActionConfig{ @@ -405,8 +415,24 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf if savedOrderInfo.retryCount <= maxWaybillRetryCount { successCount := 0 for _, vendorID := range savedOrderInfo.supported3rdCarriers { - if s.DeliveryPlatformHandlers[vendorID] != nil && s.DeliveryPlatformHandlers[vendorID].Use4CreateWaybill && savedOrderInfo.waybills[vendorID] == nil && (excludeBill == nil || vendorID != excludeBill.WaybillVendorID) { - if err = s.CreateWaybill(vendorID, order); err == nil { + handlerInfo := s.GetDeliveryPlatformFromVendorID(vendorID) + if handlerInfo != nil && handlerInfo.Use4CreateWaybill && savedOrderInfo.waybills[vendorID] == nil && (excludeBill == nil || vendorID != excludeBill.WaybillVendorID) { + if _, err = s.CreateWaybill(vendorID, order, func(deliveryFee, addFee int64) error { + if addFee > maxAddFee { + db := orm.NewOrm() + globals.SugarLogger.Infof("CreateWaybill orderID:%s addFee exceeded too much, it's %d", order.VendorOrderID, addFee) + + tmpLog := &legacymodel.TempLog{ + VendorOrderID: order.VendorOrderID, + RefVendorOrderID: order.VendorOrderID, + IntValue1: addFee, + Msg: fmt.Sprintf("CreateWaybill orderID:%s addFee exceeded too much, it's %d", order.VendorOrderID, addFee), + } + db.Insert(tmpLog) + return ErrAddFeeExceeded + } + return nil + }); err == nil { successCount++ } } diff --git a/business/jxcallback/scheduler/scheduler.go b/business/jxcallback/scheduler/scheduler.go index 479d89eb8..b76c402e0 100644 --- a/business/jxcallback/scheduler/scheduler.go +++ b/business/jxcallback/scheduler/scheduler.go @@ -38,6 +38,7 @@ var ( ErrCanNotFindOrder = errors.New("不能找到订单(一般是由于事件错序)") ErrCanNotFindWaybill = errors.New("不能找到运单(一般是由于事件错序)") ErrOrderIsNotSolid = errors.New("订单是临时订单,不完整,不能用于创建运单") + ErrDeliverProviderWrong = errors.New("快递商不存在或不能用于创建运单") ) type DeliveryPlatformHandlerInfo struct { diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 8f30abbea..d44325383 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -179,3 +179,15 @@ func MapValue2Scope(value, fromMin, fromMax, toMin, toMax int64) int64 { } return int64(math.Round(float64(value-fromMin)/float64(fromMax-fromMin)*float64(toMax-toMin) + float64(toMin))) } + +func Errs2Str(sep string, errs ...error) (retVal string) { + if sep == "" { + sep = "\n" + } + for _, err := range errs { + if err != nil { + retVal += err.Error() + sep + } + } + return retVal +} diff --git a/business/model/api.go b/business/model/api.go new file mode 100644 index 000000000..098b3c72f --- /dev/null +++ b/business/model/api.go @@ -0,0 +1,19 @@ +package model + +type CallResult struct { + Code string `json:"code"` + Desc string `json:"desc"` + Data string `json:"data"` +} + +type GoodsOrderExt struct { + GoodsOrder + WaybillStatus int `json:"waybillStatus"` + CourierName string `orm:"size(32)" json:"courierName"` + CourierMobile string `orm:"size(32)" json:"courierMobile"` +} + +type OrderSkuExt struct { + OrderSku + Image string `json:"image"` +} diff --git a/business/model/model.go b/business/model/model.go index 766f710b0..801d5a656 100644 --- a/business/model/model.go +++ b/business/model/model.go @@ -22,8 +22,3 @@ type ModelIDCUO struct { UpdatedAt time.Time LastOperator string `gorm:"type:varchar(32)"` // 最后操作员 } - -type CallResult struct { - Code int `json:"code"` - Result string `json:"result"` -} diff --git a/business/model/order.go b/business/model/order.go index 3f38164a7..0b0d9c703 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -8,49 +8,49 @@ type ModelTimeInfo struct { } type GoodsOrder struct { - ID int64 `orm:"column(id)"` - VendorOrderID string `orm:"column(vendor_order_id);size(48)"` - VendorID int `orm:"column(vendor_id)"` - VendorStoreID string `orm:"column(vendor_store_id);size(48)"` - StoreID int `orm:"column(store_id)"` // 外部系统里记录的 jxstoreid - JxStoreID int `orm:"column(jx_store_id)"` // 根据VendorStoreID在本地系统里查询出来的 jxstoreid - StoreName string `orm:"size(64)"` - ShopPrice int64 // 单位为分 门店标价 - SalePrice int64 // 单位为分 售卖价 - ActualPayPrice int64 // 单位为分 顾客实际支付 - Weight int // 单位为克 - ConsigneeName string `orm:"size(32)"` - ConsigneeMobile string `orm:"size(32)"` - ConsigneeAddress string `orm:"size(255)"` - CoordinateType int - ConsigneeLng int // 坐标 * (10的六次方) - ConsigneeLat int // 坐标 * (10的六次方) - SkuCount int // 商品类别数量,即有多少种商品(注意在某些情况下,相同SKU的商品由于售价不同,也会当成不同商品在这个值里) - GoodsCount int // 商品个数 - Status int // 参见OrderStatus*相关的常量定义 - VendorStatus string `orm:"size(255)"` - LockStatus int - OrderSeq int // 门店订单序号 - BuyerComment string `orm:"size(255)"` - BusinessType int - ExpectedDeliveredTime time.Time `orm:"type(datetime)"` // 预期送达时间 - CancelApplyReason string `orm:"size(255)"` // ""表示没有申请,不为null表示用户正在取消申请 - VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)"` - WaybillVendorID int `orm:"column(waybill_vendor_id)"` // 表示当前承运商,-1表示还没有安排 + ID int64 `orm:"column(id)" json:"_"` + VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` + VendorID int `orm:"column(vendor_id)" json:"vendorID"` + VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"` + StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid + JxStoreID int `orm:"column(jx_store_id)" json:"jxStoreID"` // 根据VendorStoreID在本地系统里查询出来的 jxstoreid + StoreName string `orm:"size(64)" json:"_"` + ShopPrice int64 `json:"shopPrice"` // 单位为分 门店标价 + SalePrice int64 `json:"salePrice"` // 单位为分 售卖价 + ActualPayPrice int64 `json:"actualPayPrice"` // 单位为分 顾客实际支付 + Weight int `json:"weight"` // 单位为克 + ConsigneeName string `orm:"size(32)" json:"consigneeName"` + ConsigneeMobile string `orm:"size(32)" json:"consigneeMobile"` + ConsigneeAddress string `orm:"size(255)" json:"consigneeAddress"` + CoordinateType int `json:"_"` + ConsigneeLng int `json:"_"` // 坐标 * (10的六次方) + ConsigneeLat int `json:"_"` // 坐标 * (10的六次方) + SkuCount int `json:"skuCount"` // 商品类别数量,即有多少种商品(注意在某些情况下,相同SKU的商品由于售价不同,也会当成不同商品在这个值里) + GoodsCount int `json:"goodsCount"` // 商品个数 + Status int `json:"status"` // 参见OrderStatus*相关的常量定义 + VendorStatus string `orm:"size(255)" json:"_"` + LockStatus int `json:"lockStatus"` + OrderSeq int `json:"orderSeq"` // 门店订单序号 + BuyerComment string `orm:"size(255)" json:"buyerComment"` + BusinessType int `json:"businessType"` + ExpectedDeliveredTime time.Time `orm:"type(datetime)" json:"expectedDeliveredTime"` // 预期送达时间 + CancelApplyReason string `orm:"size(255)" json:"_"` // ""表示没有申请,不为null表示用户正在取消申请 + VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"` + WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商,-1表示还没有安排 DuplicatedCount int // 重复新订单消息数,这个一般不是由于消息重发造成的(消息重发由OrderStatus过滤),一般是业务逻辑造成的 - OrderCreatedAt time.Time `orm:"type(datetime);index"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间) - OrderFinishedAt time.Time `orm:"type(datetime)"` - StatusTime time.Time `orm:"type(datetime)"` // last status time - ModelTimeInfo - OriginalData string `orm:"type(text)"` - Skus []*OrderSku `orm:"-"` - SkuPmFee int64 //门店商品促销总支出 - OrderPmFee int64 //门店订单促销支出 - SkuPmSubsidy int64 //平台商品促销总补贴 - OrderPmSubsidy int64 //平台订单促销补贴 - BoxFee int64 //餐盒费 - PlatformFeeRate int16 //平台费 - BillStoreFreightFee int64 //需要回调,门店所承担的运费 + OrderCreatedAt time.Time `orm:"type(datetime);index" json:"orderCreatedAt"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间) + OrderFinishedAt time.Time `orm:"type(datetime)" json:"OrderFinishedAt"` + StatusTime time.Time `orm:"type(datetime)" json:"_"` // last status time + ModelTimeInfo `json:"_"` + OriginalData string `orm:"type(text)" json:"_"` + Skus []*OrderSku `orm:"-" json:"_"` + SkuPmFee int64 `json:"_"` //门店商品促销总支出 + OrderPmFee int64 `json:"_"` //门店订单促销支出 + SkuPmSubsidy int64 `json:"_"` //平台商品促销总补贴 + OrderPmSubsidy int64 `json:"_"` //平台订单促销补贴 + BoxFee int64 `json:"_"` //餐盒费 + PlatformFeeRate int16 `json:"_"` //平台费 + BillStoreFreightFee int64 `json:"_"` //需要回调,门店所承担的运费 } func (o *GoodsOrder) TableUnique() [][]string { @@ -60,24 +60,24 @@ func (o *GoodsOrder) TableUnique() [][]string { } type OrderSku struct { - ID int64 `orm:"column(id)"` - VendorOrderID string `orm:"column(vendor_order_id);size(48)"` - VendorID int `orm:"column(vendor_id)"` - StoreSubID int `orm:"column(store_sub_id)"` - StoreSubName string `orm:"size(64)"` - Count int - VendorSkuID string `orm:"column(vendor_sku_id);size(48)"` - SkuID int `orm:"column(sku_id)"` // 外部系统里记录的 jxskuid - JxSkuID int `orm:"column(jx_sku_id)"` // 根据VendorSkuID在本地系统里查询出来的 jxskuid - SkuName string `orm:"size(255)"` - ShopPrice int64 // 门店标价 - SalePrice int64 // 售卖价 - Weight int // 单位为克 - SkuType int // 当前如果为gift就为1,否则缺省为0 - PromotionType int // todo 当前是用于记录京东的PromotionType(生成jxorder用),没有做转换 - OrderCreatedAt time.Time `orm:"type(datetime);index"` // 分区考虑 - SkuPmSubsidy int64 //平台商品活动补贴 - SkuPmFee int64 //门店商品促销支出 + ID int64 `orm:"column(id)" json:"_"` + VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` + VendorID int `orm:"column(vendor_id)" json:"vendorID"` + StoreSubID int `orm:"column(store_sub_id)" json:"storeSubID"` + StoreSubName string `orm:"size(64)" json:"storeSubName"` + Count int `json:"count"` + VendorSkuID string `orm:"column(vendor_sku_id);size(48)" json:"_"` + SkuID int `orm:"column(sku_id)" json:"skuID"` // 外部系统里记录的 jxskuid + JxSkuID int `orm:"column(jx_sku_id)" json:"jxSkuID"` // 根据VendorSkuID在本地系统里查询出来的 jxskuid + SkuName string `orm:"size(255)" json:"skuName"` + ShopPrice int64 `json:"shopPrice"` // 门店标价 + SalePrice int64 `json:"salePrice"` // 售卖价 + Weight int `json:"_"` // 单位为克 + SkuType int `json:"_"` // 当前如果为gift就为1,否则缺省为0 + PromotionType int `json:"_"` // todo 当前是用于记录京东的PromotionType(生成jxorder用),没有做转换 + OrderCreatedAt time.Time `orm:"type(datetime);index" json:"_"` // 分区考虑 + SkuPmSubsidy int64 `json:"_"` //平台商品活动补贴 + SkuPmFee int64 `json:"_"` //门店商品促销支出 } // 同样商品在一个订单中可能重复出现(比如搞活动时,相同商品价格不一样,第一个有优惠) @@ -89,25 +89,25 @@ func (o *OrderSku) TableIndex() [][]string { } type Waybill struct { - ID int64 `orm:"column(id)"` - VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)"` - VendorWaybillID2 string `orm:"column(vendor_waybill_id2);size(48)"` // 某些平台有多个ID,比如美团配送,当前美团配送的 delivery_id存这里 - WaybillVendorID int `orm:"column(waybill_vendor_id)"` - VendorOrderID string `orm:"column(vendor_order_id);size(48)"` - OrderVendorID int `orm:"column(order_vendor_id)"` - CourierName string `orm:"size(32)"` - CourierMobile string `orm:"size(32)"` - Status int // 参见WaybillStatus*相关的常量定义 - VendorStatus string `orm:"size(255)"` - ActualFee int64 // 实际要支付给快递公司的实际费用 - DesiredFee int64 // 根据合同计算出来的预期费用 - DuplicatedCount int // 重复新订单消息数,这个一般不是由于消息重发造成的(消息重发由OrderStatus过滤),一般是业务逻辑造成的 - WaybillCreatedAt time.Time `orm:"type(datetime);index"` - WaybillFinishedAt time.Time `orm:"type(datetime)"` - StatusTime time.Time `orm:"type(datetime)"` // last status time - ModelTimeInfo - OriginalData string `orm:"type(text)"` - Remark string `orm:"-"` // 用于传递remark + ID int64 `orm:"column(id)" json:"-"` + VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"` + VendorWaybillID2 string `orm:"column(vendor_waybill_id2);size(48)" json:"vendorWaybillID2"` // 某些平台有多个ID,比如美团配送,当前美团配送的 delivery_id存这里 + WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` + VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` + OrderVendorID int `orm:"column(order_vendor_id)" json:"orderVendorID"` + CourierName string `orm:"size(32)" json:"-"` + CourierMobile string `orm:"size(32)" json:"-"` + Status int `json:"-"` // 参见WaybillStatus*相关的常量定义 + VendorStatus string `orm:"size(255)" json:"-"` + ActualFee int64 `json:"actual_fee"` // 实际要支付给快递公司的费用 + DesiredFee int64 `json:"desired_fee"` // 运单总费用 + DuplicatedCount int `json:"-"` // 重复新订单消息数,这个一般不是由于消息重发造成的(消息重发由OrderStatus过滤),一般是业务逻辑造成的 + WaybillCreatedAt time.Time `orm:"type(datetime);index" json:"_"` + WaybillFinishedAt time.Time `orm:"type(datetime)" json:"-"` + StatusTime time.Time `orm:"type(datetime)" json:"-"` // last status time + ModelTimeInfo `json:"-"` + OriginalData string `orm:"type(text)" json:"-"` + Remark string `orm:"-" json:"-"` // 用于传递remark } func (w *Waybill) TableUnique() [][]string { diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index 6a9346c8c..5e8b3192d 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -91,7 +91,7 @@ func (c *DeliveryHandler) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal } // IDeliveryPlatformHandler -func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder) (err error) { +func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) { billParams := &dadaapi.OperateOrderRequiredParams{ ShopNo: utils.Int2Str(order.StoreID), // 当前达达的门店号与京西是一样的 OriginID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), @@ -111,6 +111,9 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder) (err error) { "info": order.BuyerComment, // "origin_mark": model.VendorNames[order.VendorID], "origin_mark_no": fmt.Sprintf("%d", order.OrderSeq), + "cargo_type": 13, + "cargo_weight": float64(order.Weight) / 1000.0, + "cargo_num": order.GoodsCount, } // 达达要求第二次创建运单,调用函数不同。所以查找两天内有无相同订单号的运单 @@ -122,17 +125,27 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder) (err error) { AND vendor_order_id = ? AND waybill_vendor_id = ? `, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), model.VendorIDDada).ValuesList(&lists) + var result *dadaapi.CreateOrderResponse if err2 == nil && num > 0 { globals.SugarLogger.Debugf("CreateWaybill orderID:%s num=%d use ReaddOrder", order.VendorOrderID, num) - _, err = api.DadaAPI.ReaddOrder(billParams, addParams) + result, err = api.DadaAPI.ReaddOrder(billParams, addParams) } else { if err2 != nil { globals.SugarLogger.Warnf("CreateWaybill orderID:%s error:%v", order.VendorOrderID, err2) } - _, err = api.DadaAPI.AddOrder(billParams, addParams) + result, err = api.DadaAPI.AddOrder(billParams, addParams) + } + if err == nil && result != nil { + bill = &model.Waybill{ + VendorOrderID: order.VendorOrderID, + OrderVendorID: order.VendorID, + WaybillVendorID: model.VendorIDDada, + DesiredFee: jxutils.StandardPrice2Int(result.DeliverFee), + ActualFee: jxutils.StandardPrice2Int(result.Fee), + } } } - return err + return bill, err } func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill) (err error) { diff --git a/business/partner/delivery/dada/waybill_test.go b/business/partner/delivery/dada/waybill_test.go index 317027c9b..2bd0031aa 100644 --- a/business/partner/delivery/dada/waybill_test.go +++ b/business/partner/delivery/dada/waybill_test.go @@ -27,7 +27,8 @@ func TestCreateWaybill(t *testing.T) { if order, err := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDJD); err == nil { // globals.SugarLogger.Debug(order) c := new(DeliveryHandler) - if err = c.CreateWaybill(order); err == nil { + _, err = c.CreateWaybill(order, nil) + if err == nil { time.Sleep(1 * time.Second) bill := &model.Waybill{ VendorOrderID: orderID, diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index 24d18b20d..4f1fdb4d3 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -19,13 +19,8 @@ import ( "github.com/astaxie/beego/orm" ) -const ( - maxAddFee = 200 // 最大增加费用,单位为分,超过不发美团了 -) - var ( ErrCanNotFindMTPSStore = errors.New("不能找到美团配送站点配置") - ErrAddFeeExceeded = errors.New("美团配送超过基准价太多") ErrStoreNoPriceInfo = errors.New("找不到门店的美团配送价格信息") ErrStoreNoCoordinate = errors.New("找不到门店的坐标信息") ) @@ -176,11 +171,14 @@ func (c *DeliveryHandler) calculateBillDeliveryFee(bill *model.Waybill) (deliver } // IDeliveryPlatformHandler -func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder) (err error) { +func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) { db := orm.NewOrm() - _, addFee, err := c.calculateOrderDeliveryFee(order, time.Now(), db) + deliveryFee, addFee, err := c.calculateOrderDeliveryFee(order, time.Now(), db) if err == nil { - if addFee <= maxAddFee { + if policy != nil { + err = policy(deliveryFee, addFee) + } + if err == nil { // 忽略坐标转换错误,即使是转换出错,也只能当成转换成功来处理,底层会有错误日志输出 lngFloat, latFloat, _ := jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) billParams := &mtpsapi.CreateOrderByShopParam{ @@ -219,8 +217,8 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder) (err error) { } } addParams := utils.Params2Map("note", order.BuyerComment, "goods_detail", string(utils.MustMarshal(goods)), "poi_seq", fmt.Sprintf("#%d", order.OrderSeq)) - _, err = api.MtpsAPI.CreateOrderByShop(billParams, addParams) - if err != nil { + result, err2 := api.MtpsAPI.CreateOrderByShop(billParams, addParams) + if err = err2; err != nil { globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, addParams:%v, error:%v", order.VendorOrderID, billParams, addParams, err) tmpLog := &legacymodel.TempLog{ @@ -230,23 +228,21 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder) (err error) { Msg: fmt.Sprintf("CreateWaybill failed, orderID:%s, billParams:%v, addParams:%v, error:%v", order.VendorOrderID, billParams, addParams, err), } db.Insert(tmpLog) + } else { + bill = &model.Waybill{ + VendorOrderID: order.VendorOrderID, + OrderVendorID: order.VendorID, + VendorWaybillID: result.MtPeisongID, + VendorWaybillID2: utils.Int64ToStr(result.DeliveryID), + WaybillVendorID: model.VendorIDMTPS, + DesiredFee: deliveryFee, + } } } } - } else { - err = ErrAddFeeExceeded - globals.SugarLogger.Infof("CreateWaybill orderID:%s addFee exceeded too much, it's %d", order.VendorOrderID, addFee) - - tmpLog := &legacymodel.TempLog{ - VendorOrderID: order.VendorOrderID, - RefVendorOrderID: order.VendorOrderID, - IntValue1: addFee, - Msg: fmt.Sprintf("CreateWaybill orderID:%s addFee exceeded too much, it's %d", order.VendorOrderID, addFee), - } - db.Insert(tmpLog) } } - return err + return bill, err } func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill) (err error) { diff --git a/business/partner/delivery/mtps/waybill_test.go b/business/partner/delivery/mtps/waybill_test.go index 28a473a9e..64a12d88d 100644 --- a/business/partner/delivery/mtps/waybill_test.go +++ b/business/partner/delivery/mtps/waybill_test.go @@ -26,7 +26,8 @@ func TestCreateWaybill(t *testing.T) { order, _ := partner.CurOrderManager.LoadOrder(orerID, model.VendorIDJD) // globals.SugarLogger.Debug(order) c := new(DeliveryHandler) - if err := c.CreateWaybill(order); err != nil { + _, err := c.CreateWaybill(order, nil) + if err != nil { t.Fatal(err.Error()) } } diff --git a/business/partner/partner.go b/business/partner/partner.go index 44e880a64..55e2c7f25 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -44,7 +44,7 @@ type IPurchasePlatformHandler interface { } type IDeliveryPlatformHandler interface { - CreateWaybill(order *model.GoodsOrder) (err error) + CreateWaybill(order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) CancelWaybill(bill *model.Waybill) (err error) } diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 6dcf0931c..cf9ae74e5 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -1,6 +1,10 @@ package controllers import ( + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" + "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler/basesch" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" "github.com/astaxie/beego" ) @@ -11,18 +15,134 @@ type OrderController struct { func (c *OrderController) URLMapping() { c.Mapping("FinishedPickup", c.FinishedPickup) + c.Mapping("GetStoreOrderInfo", c.GetStoreOrderInfo) + c.Mapping("GetOrderSkuInfo", c.GetOrderSkuInfo) + c.Mapping("CreateWaybillOnProviders", c.CreateWaybillOnProviders) + c.Mapping("Swtich2SelfDeliver", c.Swtich2SelfDeliver) } -// @Title 完成拣货 -// @Description 完成拣货,如果是购物平台负责配送,则自动召唤相应配送 -// @Param orderid path string true "订单ID" -// @Success 200 {object} business.model.CallResult -// @Failure 200 {object} business.model.CallResult -// @router /finishedpickup/:orderid [post] -func (c *OrderController) FinishedPickup() { - c.Data["json"] = &model.CallResult{ - Code: 0, - Result: c.Ctx.Input.Param(":orderid"), +func (c *OrderController) orderOperate(handler func(vendorOrderID string, vendorID int) (interface{}, error)) { + var ( + vendorOrderID string + vendorID int + err error + ) + vendorOrderID = c.GetString("vendorOrderID") + vendorID, err1 := c.GetInt("vendorID", 0) + if vendorOrderID != "" && err1 == nil { + result, err2 := handler(vendorOrderID, vendorID) + if err = err2; err == nil { + retObj := &model.CallResult{ + Code: "0", + } + if result != nil { + retObj.Data = string(utils.MustMarshal(result)) + } + c.Data["json"] = retObj + } + } + errMsg := jxutils.Errs2Str("", err1, err) + if vendorOrderID == "" { + errMsg += "vendorOrderID is empty\n" + } + if errMsg != "" { + c.Data["json"] = &model.CallResult{ + Code: "-1", + Data: errMsg, + } } c.ServeJSON() } + +// @Title 完成拣货 +// @Description 完成拣货 +// @Param vendorOrderID formData string true "订单ID" +// @Param vendorID formData int true "订单所属的厂商ID" +// @Success 200 {object} business.model.CallResult +// @Failure 200 {object} business.model.CallResult +// @router /FinishedPickup [post] +func (c *OrderController) FinishedPickup() { + c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { + return nil, basesch.FixedBaseScheduler.PickupGoodsAndUpdateStatus(vendorOrderID, vendorID) + }) +} + +// @Title 转自送 +// @Description 转自送 +// @Param vendorOrderID formData string true "订单ID" +// @Param vendorID formData int true "订单所属的厂商ID" +// @Success 200 {object} business.model.CallResult +// @Failure 200 {object} business.model.CallResult +// @router /Swtich2SelfDeliver [post] +func (c *OrderController) Swtich2SelfDeliver() { + c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { + return nil, basesch.FixedBaseScheduler.Swtich2SelfDeliverAndUpdateStatus(vendorOrderID, vendorID) + }) +} + +// @Title 创建三方运单 +// @Description 创建三方运单 +// @Param vendorOrderID formData string true "订单ID" +// @Param vendorID formData int true "订单所属的厂商ID" +// @Success 200 {object} business.model.CallResult +// @Failure 200 {object} business.model.CallResult +// @router /CreateWaybillOnProviders [post] +func (c *OrderController) CreateWaybillOnProviders() { + c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { + return basesch.FixedBaseScheduler.CreateWaybillOnProviders(vendorOrderID, vendorID) + }) +} + +// @Title 得到门店订单信息 +// @Description 得到门店订单信息 +// @Param storeID query string true "京西门店ID" +// @Param lastHours query int false "最近多少小时的信息" +// @Param fromStatus query int true "起始状态" +// @Param toStatus query int false "起始状态" +// @Success 200 {object} business.model.CallResult +// @Failure 200 {object} business.model.CallResult +// @router /GetStoreOrderInfo [get] +func (c *OrderController) GetStoreOrderInfo() { + var ( + storeID string + lastHours, fromStatus, toStatus int + err error + ) + storeID = c.GetString("storeID") + lastHours, err1 := c.GetInt("lastHours", 0) + fromStatus, err2 := c.GetInt("fromStatus", 0) + toStatus, err3 := c.GetInt("toStatus", 0) + if storeID != "" && err1 == nil && err2 == nil && err3 == nil { + result, err2 := orderman.FixedOrderManager.GetStoreOrderInfo(storeID, lastHours, fromStatus, toStatus) + if err = err2; err == nil { + c.Data["json"] = &model.CallResult{ + Code: "0", + Data: string(utils.MustMarshal(result)), + } + } + } + errMsg := jxutils.Errs2Str("", err1, err2, err3, err) + if storeID == "" { + errMsg += "storeID is empty\n" + } + if errMsg != "" { + c.Data["json"] = &model.CallResult{ + Code: "-1", + Desc: errMsg, + } + } + c.ServeJSON() +} + +// @Title 得到订单SKU信息 +// @Description 得到订单SKU信息 +// @Param vendorOrderID query string true "订单ID" +// @Param vendorID query int true "订单所属的厂商ID" +// @Success 200 {object} business.model.CallResult +// @Failure 200 {object} business.model.CallResult +// @router /GetOrderSkuInfo [get] +func (c *OrderController) GetOrderSkuInfo() { + c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { + return orderman.FixedOrderManager.GetOrderSkuInfo(vendorOrderID, vendorID) + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 7dbce193f..c4fd13600 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -7,10 +7,42 @@ import ( func init() { + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + beego.ControllerComments{ + Method: "CreateWaybillOnProviders", + Router: `/CreateWaybillOnProviders`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + 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: "FinishedPickup", - Router: `/finishedpickup/:orderid`, + Router: `/FinishedPickup`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + 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: "GetOrderSkuInfo", + Router: `/GetOrderSkuInfo`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + 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: "GetStoreOrderInfo", + Router: `/GetStoreOrderInfo`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + 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: "Swtich2SelfDeliver", + Router: `/Swtich2SelfDeliver`, AllowHTTPMethods: []string{"post"}, MethodParams: param.Make(), Params: nil}) From c1db4606667eaba9fe2f2a51f150aacf2db8bfc0 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 21 Aug 2018 17:36:20 +0800 Subject: [PATCH 08/16] - fixed wrong image in GetOrderSkuInfo. --- business/jxcallback/orderman/orderman_ext.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index da54c684b..a9eb6ff0c 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -40,9 +40,10 @@ func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStat func (c *OrderManager) GetOrderSkuInfo(vendorOrderID string, vendorID int) (skus []*model.OrderSkuExt, err error) { db := orm.NewOrm() _, err = db.Raw(` - SELECT t1.*, t2.img image + SELECT t1.*, t3.img image FROM order_sku t1 - LEFT JOIN jx_sku_name t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id + LEFT JOIN jx_sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id + LEFT JOIN jx_sku_name t3 ON t2.nameid = t3.id WHERE vendor_order_id = ? AND vendor_id = ? `, vendorOrderID, vendorID).QueryRows(&skus) if err == nil { From d18e53e9f4ca3649d959c7b2381020a03bc0ac0d Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 21 Aug 2018 18:16:59 +0800 Subject: [PATCH 09/16] - handle num == 0 in GetOrderSkuInfo. --- business/jxcallback/orderman/orderman_ext.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index a9eb6ff0c..16f16dd2c 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -1,6 +1,7 @@ package orderman import ( + "errors" "time" "git.rosy.net.cn/jx-callback/business/model" @@ -13,6 +14,10 @@ const ( maxLastHours = 2 * 24 // 最多只能查询两天内的订单数据 ) +var ( + ErrCanNotFindOrder = errors.New("找不到相应订单") +) + func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStatus, toStatus int) (orders []*model.GoodsOrderExt, err error) { if lastHours > maxLastHours { lastHours = maxLastHours @@ -39,16 +44,21 @@ func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStat func (c *OrderManager) GetOrderSkuInfo(vendorOrderID string, vendorID int) (skus []*model.OrderSkuExt, err error) { db := orm.NewOrm() - _, err = db.Raw(` + num, err := db.Raw(` SELECT t1.*, t3.img image FROM order_sku t1 LEFT JOIN jx_sku t2 ON IF(t1.jx_sku_id != 0, t1.jx_sku_id, t1.sku_id) = t2.id LEFT JOIN jx_sku_name t3 ON t2.nameid = t3.id WHERE vendor_order_id = ? AND vendor_id = ? `, vendorOrderID, vendorID).QueryRows(&skus) - if err == nil { + if err == nil && num > 0 { return skus, nil } - globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s failed with error:%v", vendorOrderID, err) + if err == nil { + err = ErrCanNotFindOrder + globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s vendorID:%d can not find order, num:%d", vendorOrderID, vendorID, num) + } else { + globals.SugarLogger.Infof("GetOrderSkuInfo orderID:%s vendorID:%d failed with error:%v", vendorOrderID, vendorID, err) + } return nil, err } From d44950d6db46dd4a66c088beb9c5066c34887c68 Mon Sep 17 00:00:00 2001 From: gazebo Date: Tue, 21 Aug 2018 20:56:49 +0800 Subject: [PATCH 10/16] - consider status wrong as normal for in defsch. --- business/jxcallback/scheduler/defsch/defsch.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 9d670e485..65abd71fb 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -478,7 +478,7 @@ func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInf order := savedOrderInfo.order globals.SugarLogger.Debugf("swtich2SelfDeliverWithRetry orderID:%s", order.VendorOrderID) if order.WaybillVendorID != order.VendorID { - if err := s.Swtich2SelfDeliver(order); err != nil { + if err := s.Swtich2SelfDeliver(order); err != nil && err != scheduler.ErrStatusIsNotOKForOperation { globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry failed, bill:%v, err:%v", bill, err) if retryCount > 0 { time.AfterFunc(duration, func() { From 0b9189cb87825c1da5873ec760849fee4c29ae47 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 22 Aug 2018 09:41:02 +0800 Subject: [PATCH 11/16] - paging added for GetStoreOrderInfo. - GetStoreOrderCountInfo added. --- business/jxcallback/orderman/orderman_ext.go | 32 +++++++++++- .../jxcallback/scheduler/basesch/basesch.go | 8 ++- .../jxcallback/scheduler/defsch/defsch.go | 2 +- business/model/api.go | 5 ++ controllers/jx_order.go | 52 +++++++++++++++++-- 5 files changed, 89 insertions(+), 10 deletions(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 16f16dd2c..adec252c6 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -12,19 +12,26 @@ import ( const ( maxLastHours = 2 * 24 // 最多只能查询两天内的订单数据 + defPageSize = 50 ) var ( ErrCanNotFindOrder = errors.New("找不到相应订单") ) -func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStatus, toStatus int) (orders []*model.GoodsOrderExt, err error) { +func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStatus, toStatus, offset, pageSize int) (orders []*model.GoodsOrderExt, err error) { if lastHours > maxLastHours { lastHours = maxLastHours } if toStatus == 0 { toStatus = fromStatus } + if offset < 0 { + offset = 0 + } + if pageSize == 0 { + pageSize = defPageSize + } db := orm.NewOrm() _, err = db.Raw(` @@ -34,7 +41,8 @@ func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStat WHERE IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) = ? AND t1.order_created_at >= ? AND t1.Status >= ? AND t1.Status <= ? - `, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour), fromStatus, toStatus).QueryRows(&orders) + LIMIT ? OFFSET ? + `, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour), fromStatus, toStatus, pageSize, offset).QueryRows(&orders) if err == nil { return orders, nil } @@ -42,6 +50,26 @@ func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStat return nil, err } +func (c *OrderManager) GetStoreOrderCountInfo(storeID string, lastHours int) (countInfo *model.GoodsOrderCountInfo, err error) { + if lastHours > maxLastHours { + lastHours = maxLastHours + } + + db := orm.NewOrm() + _, err = db.Raw(` + SELECT t1.status, COUNT(*) count + FROM goods_order t1 + WHERE IF(t1.jx_store_id != 0, t1.jx_store_id, t1.store_id) = ? + AND t1.order_created_at >= ? + GROUP BY 1 + `, storeID, time.Now().Add(-time.Duration(lastHours)*time.Hour)).QueryRows(&countInfo) + if err == nil { + return countInfo, nil + } + globals.SugarLogger.Infof("GetStoreOrderCountInfo storeID:%s failed with error:%v", storeID, err) + return nil, err +} + func (c *OrderManager) GetOrderSkuInfo(vendorOrderID string, vendorID int) (skus []*model.OrderSkuExt, err error) { db := orm.NewOrm() num, err := db.Raw(` diff --git a/business/jxcallback/scheduler/basesch/basesch.go b/business/jxcallback/scheduler/basesch/basesch.go index 828f72aff..269ffb09f 100644 --- a/business/jxcallback/scheduler/basesch/basesch.go +++ b/business/jxcallback/scheduler/basesch/basesch.go @@ -84,7 +84,9 @@ func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) { }, "PickupGoods orderID:%s", order.VendorOrderID) } } else { - err = ErrOrderStatusIsNotSuitable + if order.LockStatus != model.OrderStatusUnknown || order.Status < model.OrderStatusAccepted { + err = ErrOrderStatusIsNotSuitable + } globals.SugarLogger.Infof("PickupGoods orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) } return err @@ -102,7 +104,9 @@ func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) } } } else { - err = ErrOrderStatusIsNotSuitable + if order.LockStatus != model.OrderStatusUnknown || order.Status < model.OrderStatusFinishedPickup { + err = ErrOrderStatusIsNotSuitable + } globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s, status:%d is not suitable", order.VendorOrderID, order.Status) } return err diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 65abd71fb..9d670e485 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -478,7 +478,7 @@ func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInf order := savedOrderInfo.order globals.SugarLogger.Debugf("swtich2SelfDeliverWithRetry orderID:%s", order.VendorOrderID) if order.WaybillVendorID != order.VendorID { - if err := s.Swtich2SelfDeliver(order); err != nil && err != scheduler.ErrStatusIsNotOKForOperation { + if err := s.Swtich2SelfDeliver(order); err != nil { globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry failed, bill:%v, err:%v", bill, err) if retryCount > 0 { time.AfterFunc(duration, func() { diff --git a/business/model/api.go b/business/model/api.go index 098b3c72f..7d703af50 100644 --- a/business/model/api.go +++ b/business/model/api.go @@ -17,3 +17,8 @@ type OrderSkuExt struct { OrderSku Image string `json:"image"` } + +type GoodsOrderCountInfo struct { + Status int `json:"status"` + Count int `json:"count"` +} diff --git a/controllers/jx_order.go b/controllers/jx_order.go index cf9ae74e5..4a4034ef4 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -97,23 +97,65 @@ func (c *OrderController) CreateWaybillOnProviders() { // @Description 得到门店订单信息 // @Param storeID query string true "京西门店ID" // @Param lastHours query int false "最近多少小时的信息" +// @Success 200 {object} business.model.CallResult +// @Failure 200 {object} business.model.CallResult +// @router /GetStoreOrderCountInfo [get] +func (c *OrderController) GetStoreOrderCountInfo() { + var ( + storeID string + lastHours int + err error + ) + storeID = c.GetString("storeID") + lastHours, err1 := c.GetInt("lastHours", 0) + if storeID != "" && err1 == nil { + result, err2 := orderman.FixedOrderManager.GetStoreOrderCountInfo(storeID, lastHours) + if err = err2; err == nil { + c.Data["json"] = &model.CallResult{ + Code: "0", + Data: string(utils.MustMarshal(result)), + } + } + } + errMsg := jxutils.Errs2Str("", err1, err) + if storeID == "" { + errMsg += "storeID is empty\n" + } + if errMsg != "" { + c.Data["json"] = &model.CallResult{ + Code: "-1", + Desc: errMsg, + } + } + c.ServeJSON() +} + +// @Title 得到门店订单状态信息 +// @Description 得到门店订单状态信息 +// @Param storeID query string true "京西门店ID" +// @Param lastHours query int false "最近多少小时的信息" // @Param fromStatus query int true "起始状态" // @Param toStatus query int false "起始状态" +// @Param offset query int false "起始状态" +// @Param pageSize query int false "起始状态" // @Success 200 {object} business.model.CallResult // @Failure 200 {object} business.model.CallResult // @router /GetStoreOrderInfo [get] func (c *OrderController) GetStoreOrderInfo() { var ( - storeID string - lastHours, fromStatus, toStatus int - err error + storeID string + lastHours, fromStatus, toStatus, offset, pageSize int + err error ) storeID = c.GetString("storeID") lastHours, err1 := c.GetInt("lastHours", 0) fromStatus, err2 := c.GetInt("fromStatus", 0) toStatus, err3 := c.GetInt("toStatus", 0) - if storeID != "" && err1 == nil && err2 == nil && err3 == nil { - result, err2 := orderman.FixedOrderManager.GetStoreOrderInfo(storeID, lastHours, fromStatus, toStatus) + offset, err4 := c.GetInt("offset", 0) + pageSize, err5 := c.GetInt("pageSize", 0) + + if storeID != "" && err1 == nil && err2 == nil && err3 == nil && err4 == nil && err5 == nil { + result, err2 := orderman.FixedOrderManager.GetStoreOrderInfo(storeID, lastHours, fromStatus, toStatus, offset, pageSize) if err = err2; err == nil { c.Data["json"] = &model.CallResult{ Code: "0", From 5bcba913089b88fd4afd129d91f885b49b66f563 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 22 Aug 2018 10:57:18 +0800 Subject: [PATCH 12/16] - auto gen router info. --- routers/commentsRouter_controllers.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index c4fd13600..1a30ac29c 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -31,6 +31,14 @@ func init() { MethodParams: param.Make(), 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: "GetStoreOrderCountInfo", + Router: `/GetStoreOrderCountInfo`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + 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: "GetStoreOrderInfo", From 72f468b580669ae953d861349e4e69d00d628fad Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 22 Aug 2018 12:01:56 +0800 Subject: [PATCH 13/16] - fixed panic bug in GetStoreOrderCountInfo. --- business/jxcallback/orderman/orderman_ext.go | 2 +- business/model/order.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index adec252c6..8039709f4 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -50,7 +50,7 @@ func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStat return nil, err } -func (c *OrderManager) GetStoreOrderCountInfo(storeID string, lastHours int) (countInfo *model.GoodsOrderCountInfo, err error) { +func (c *OrderManager) GetStoreOrderCountInfo(storeID string, lastHours int) (countInfo []*model.GoodsOrderCountInfo, err error) { if lastHours > maxLastHours { lastHours = maxLastHours } diff --git a/business/model/order.go b/business/model/order.go index 0b0d9c703..096d192e6 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -39,7 +39,7 @@ type GoodsOrder struct { WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商,-1表示还没有安排 DuplicatedCount int // 重复新订单消息数,这个一般不是由于消息重发造成的(消息重发由OrderStatus过滤),一般是业务逻辑造成的 OrderCreatedAt time.Time `orm:"type(datetime);index" json:"orderCreatedAt"` // 这里记录的是订单生效时间,即用户支付完成(货到付款即为下单时间) - OrderFinishedAt time.Time `orm:"type(datetime)" json:"OrderFinishedAt"` + OrderFinishedAt time.Time `orm:"type(datetime)" json:"orderFinishedAt"` StatusTime time.Time `orm:"type(datetime)" json:"_"` // last status time ModelTimeInfo `json:"_"` OriginalData string `orm:"type(text)" json:"_"` From 5afe95d422ab2d2e933d12f8aa99483a38fc17b5 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 22 Aug 2018 14:14:10 +0800 Subject: [PATCH 14/16] - fix some annotation. --- business/jxcallback/orderman/orderman_ext.go | 7 ++++++- controllers/jx_order.go | 12 ++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/business/jxcallback/orderman/orderman_ext.go b/business/jxcallback/orderman/orderman_ext.go index 8039709f4..6889dbe76 100644 --- a/business/jxcallback/orderman/orderman_ext.go +++ b/business/jxcallback/orderman/orderman_ext.go @@ -11,7 +11,8 @@ import ( ) const ( - maxLastHours = 2 * 24 // 最多只能查询两天内的订单数据 + maxLastHours = 7 * 24 // 最多只能查询7天内的订单数据 + defLastHours = 2 * 24 // 缺省是两天内的订单 defPageSize = 50 ) @@ -22,6 +23,8 @@ var ( func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStatus, toStatus, offset, pageSize int) (orders []*model.GoodsOrderExt, err error) { if lastHours > maxLastHours { lastHours = maxLastHours + } else if lastHours == 0 { + lastHours = defLastHours } if toStatus == 0 { toStatus = fromStatus @@ -53,6 +56,8 @@ func (c *OrderManager) GetStoreOrderInfo(storeID string, lastHours int, fromStat func (c *OrderManager) GetStoreOrderCountInfo(storeID string, lastHours int) (countInfo []*model.GoodsOrderCountInfo, err error) { if lastHours > maxLastHours { lastHours = maxLastHours + } else if lastHours == 0 { + lastHours = defLastHours } db := orm.NewOrm() diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 4a4034ef4..7ecb59530 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -96,7 +96,7 @@ func (c *OrderController) CreateWaybillOnProviders() { // @Title 得到门店订单信息 // @Description 得到门店订单信息 // @Param storeID query string true "京西门店ID" -// @Param lastHours query int false "最近多少小时的信息" +// @Param lastHours query int false "最近多少小时的信息(缺省为两天)" // @Success 200 {object} business.model.CallResult // @Failure 200 {object} business.model.CallResult // @router /GetStoreOrderCountInfo [get] @@ -133,11 +133,11 @@ func (c *OrderController) GetStoreOrderCountInfo() { // @Title 得到门店订单状态信息 // @Description 得到门店订单状态信息 // @Param storeID query string true "京西门店ID" -// @Param lastHours query int false "最近多少小时的信息" -// @Param fromStatus query int true "起始状态" -// @Param toStatus query int false "起始状态" -// @Param offset query int false "起始状态" -// @Param pageSize query int false "起始状态" +// @Param lastHours query int false "最近多少小时的信息(缺省为两天)" +// @Param fromStatus query int true "起始状态(包括)" +// @Param toStatus query int false "结束状态(包括)" +// @Param offset query int false "订单列表起始序号(以0开始,缺省为0)" +// @Param pageSize query int false "订单列表页大小(缺省为50)" // @Success 200 {object} business.model.CallResult // @Failure 200 {object} business.model.CallResult // @router /GetStoreOrderInfo [get] From 79ed0a7929fdb682eca15a4b77fd1ec258ac7546 Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 22 Aug 2018 16:06:47 +0800 Subject: [PATCH 15/16] - cancel waybill reason added. - api operator added. - token added. --- .../jxcallback/scheduler/basesch/basesch.go | 30 ++++++------- .../scheduler/basesch/basesch_ext.go | 8 ++-- .../jxcallback/scheduler/defsch/defsch.go | 34 +++++++-------- business/partner/delivery/dada/waybill.go | 19 ++++---- business/partner/delivery/mtps/waybill.go | 19 ++++---- business/partner/partner.go | 26 ++++++++--- business/partner/purchase/elm/order.go | 12 +++--- business/partner/purchase/jd/order.go | 24 +++++------ controllers/jx_order.go | 43 +++++++++++++------ 9 files changed, 122 insertions(+), 93 deletions(-) diff --git a/business/jxcallback/scheduler/basesch/basesch.go b/business/jxcallback/scheduler/basesch/basesch.go index 269ffb09f..fe7271167 100644 --- a/business/jxcallback/scheduler/basesch/basesch.go +++ b/business/jxcallback/scheduler/basesch/basesch.go @@ -61,12 +61,12 @@ func (c *BaseScheduler) GetDeliveryPlatformFromVendorID(vendorID int) *scheduler return c.DeliveryPlatformHandlers[vendorID] } -func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { +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 c.IsReallyCallPlatformAPI { err = utils.CallFuncLogErrorWithInfo(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt) + return c.GetPurchasePlatformFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt, userName) }, "AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) } } else { @@ -75,12 +75,12 @@ func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt return err } -func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) { +func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder, userName string) (err error) { globals.SugarLogger.Infof("PickupGoods orderID:%s", order.VendorOrderID) if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusAccepted { if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogErrorWithInfo(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).PickupGoods(order) + return c.GetPurchasePlatformFromVendorID(order.VendorID).PickupGoods(order, userName) }, "PickupGoods orderID:%s", order.VendorOrderID) } } else { @@ -92,12 +92,12 @@ func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder) (err error) { return err } -func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { +func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) { globals.SugarLogger.Infof("Swtich2SelfDeliver orderID:%s", order.VendorOrderID) if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup { if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogErrorWithInfo(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDeliver(order) + return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDeliver(order, userName) }, "Swtich2SelfDeliver orderID:%s", order.VendorOrderID) if err == nil { // 因为有些平台转自送后,不会再发送订单在配送中消息过来,所以成功后就强制设置状态为配送中 order.Status = model.OrderStatusDelivering @@ -112,12 +112,12 @@ func (c *BaseScheduler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) return err } -func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { +func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) { globals.SugarLogger.Infof("Swtich2SelfDelivered orderID:%s", order.VendorOrderID) if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering { if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDelivered(order) + return c.GetPurchasePlatformFromVendorID(order.VendorID).Swtich2SelfDelivered(order, userName) }, "Swtich2SelfDelivered orderID:%s", order.VendorOrderID) } } else { @@ -126,12 +126,12 @@ func (c *BaseScheduler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error return err } -func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { +func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder, userName string) (err error) { globals.SugarLogger.Infof("SelfDeliverDelievering orderID:%s", order.VendorOrderID) if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusFinishedPickup { if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievering(order) + return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievering(order, userName) }, "SelfDeliverDelievering orderID:%s", order.VendorOrderID) if err == nil { // 因为有些平台设置配送中后,不会发送订单在配送中消息过来,所以成功后就强制设置状态为配送中 order.Status = model.OrderStatusDelivering @@ -145,12 +145,12 @@ func (c *BaseScheduler) SelfDeliverDelievering(order *model.GoodsOrder) (err err return err } -func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { +func (c *BaseScheduler) SelfDeliverDelievered(order *model.GoodsOrder, userName string) (err error) { globals.SugarLogger.Infof("SelfDeliverDelievered orderID:%s", order.VendorOrderID) if order.LockStatus == model.OrderStatusUnknown && order.Status == model.OrderStatusDelivering { if c.IsReallyCallPlatformAPI { err = utils.CallFuncLogError(func() error { - return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievered(order) + return c.GetPurchasePlatformFromVendorID(order.VendorID).SelfDeliverDelievered(order, userName) }, "SelfDeliverDelievered orderID:%s", order.VendorOrderID) } } else { @@ -179,12 +179,12 @@ func (c *BaseScheduler) CreateWaybill(platformVendorID int, order *model.GoodsOr return bill, err } -func (c *BaseScheduler) CancelWaybill(bill *model.Waybill) (err error) { - globals.SugarLogger.Infof("CancelWaybill bill:%v", bill) +func (c *BaseScheduler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) { + globals.SugarLogger.Infof("CancelWaybill bill:%v, cancelReasonID:%d cancelReason:%s", bill, cancelReasonID, cancelReason) if c.IsReallyCallPlatformAPI && bill.OrderVendorID != bill.WaybillVendorID { if handlerInfo := c.GetDeliveryPlatformFromVendorID(bill.WaybillVendorID); handlerInfo != nil { err = utils.CallFuncLogError(func() error { - return handlerInfo.Handler.CancelWaybill(bill) + return handlerInfo.Handler.CancelWaybill(bill, cancelReasonID, cancelReason) }, "CancelWaybill bill:%v", bill) globals.SugarLogger.Debugf("CancelWaybill bill:%v canceled by myself", bill) } diff --git a/business/jxcallback/scheduler/basesch/basesch_ext.go b/business/jxcallback/scheduler/basesch/basesch_ext.go index a5f81d218..ccc7371c0 100644 --- a/business/jxcallback/scheduler/basesch/basesch_ext.go +++ b/business/jxcallback/scheduler/basesch/basesch_ext.go @@ -18,10 +18,10 @@ func (c *BaseScheduler) CreateWaybillOnProviders(vendorOrderID string, vendorID return nil, err } -func (c *BaseScheduler) Swtich2SelfDeliverAndUpdateStatus(vendorOrderID string, vendorID int) (err error) { +func (c *BaseScheduler) Swtich2SelfDeliverAndUpdateStatus(vendorOrderID string, vendorID int, userName string) (err error) { order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) if err == nil { - err = c.Swtich2SelfDeliver(order) + err = c.Swtich2SelfDeliver(order, userName) if err == nil { order.Status = model.OrderStatusDelivering err = partner.CurOrderManager.UpdateOrderStatusDirectly(order) @@ -30,10 +30,10 @@ func (c *BaseScheduler) Swtich2SelfDeliverAndUpdateStatus(vendorOrderID string, return err } -func (c *BaseScheduler) PickupGoodsAndUpdateStatus(vendorOrderID string, vendorID int) (err error) { +func (c *BaseScheduler) PickupGoodsAndUpdateStatus(vendorOrderID string, vendorID int, userName string) (err error) { order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID) if err == nil { - err = c.PickupGoods(order) + err = c.PickupGoods(order, userName) if err == nil { order.Status = model.OrderStatusFinishedPickup err = partner.CurOrderManager.UpdateOrderStatusDirectly(order) diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 9d670e485..5ec3e05a6 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -152,7 +152,7 @@ func init() { TimeoutAction: func(savedOrderInfo *WatchOrderInfo) (err error) { order := savedOrderInfo.order _ = sch.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, order.ConsigneeMobile, jxutils.GetJxStoreIDFromOrder(order), nil, func(isAcceptIt bool) error { - if err = sch.AcceptOrRefuseOrder(order, isAcceptIt); err != nil { + if err = sch.AcceptOrRefuseOrder(order, isAcceptIt, ""); err != nil { // 为了解决京东新消息与接单消息乱序的问题 if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 { if order2, err2 := sch.GetPurchasePlatformFromVendorID(order.VendorID).GetOrder(order.VendorOrderID); err2 == nil && order2.Status > order.Status { @@ -238,7 +238,7 @@ func (s *DefScheduler) OnOrderStatusChanged(status *model.OrderStatus, isPending globals.SugarLogger.Infof("OnOrderStatusChanged [运营2]订单orderID:%s可能被手动点击送达,会对程序状态产生不利影响,请通知门店不要这样操作!", status.VendorOrderID) } } - s.cancelOtherWaybills(savedOrderInfo, curWaybill) + s.cancelOtherWaybills(savedOrderInfo, curWaybill, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrOrderAlreadyFinished) s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status)) } } else if status.LockStatus != model.OrderStatusUnknown { @@ -266,11 +266,11 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo s.addWaybill2Map(savedOrderInfo, bill) if !isPending { if order.Status > model.OrderStatusEndBegin { - s.CancelWaybill(bill) + s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) } else if order.WaybillVendorID != model.VendorIDUnknown { globals.SugarLogger.Debugf("OnWaybillStatusChanged multiple waybill created, bill:%v", bill) if !s.isBillCandidate(order, bill) && bill.WaybillVendorID != order.VendorID { - s.CancelWaybill(bill) + s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) } else if bill.WaybillVendorID == order.VendorID && order.WaybillVendorID != order.VendorID { globals.SugarLogger.Warnf("OnWaybillStatusChanged bill:%v purchase platform bill came later than others, strange!!!", bill) } @@ -293,10 +293,10 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo globals.SugarLogger.Infof("OnWaybillStatusChanged orderID:%s purchase platform waybill arrvied later, may case problem", order.VendorOrderID) } s.updateOrderByBill(order, bill, false) - s.cancelOtherWaybills(savedOrderInfo, bill) + s.cancelOtherWaybills(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) if bill.WaybillVendorID != bill.OrderVendorID { if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore { - s.SelfDeliverDelievering(savedOrderInfo.order) + s.SelfDeliverDelievering(savedOrderInfo.order, "") } else { s.swtich2SelfDeliverWithRetry(savedOrderInfo, bill, 2, 10*time.Second) } @@ -306,7 +306,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo } } else if !s.isBillCandidate(order, bill) && bill.WaybillVendorID != order.VendorID { // 发生这种情况的原因就是两个接单事件几乎同时到达(来不及取消),也算正常 - s.CancelWaybill(bill) + s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) globals.SugarLogger.Infof("OnWaybillStatusChanged Accepted orderID:%s got multiple bill:%v", order.VendorOrderID, bill) } } @@ -320,14 +320,14 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo s.createWaybillOn3rdProviders(savedOrderInfo, bill) } } else if order.WaybillVendorID != model.VendorIDUnknown { - s.CancelWaybill(bill) + s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) globals.SugarLogger.Warnf("OnWaybillStatusChanged AcceptCanceled orderID:%s got multiple bill:%v, order details:%v", order.VendorOrderID, bill, order) } case model.WaybillStatusCourierArrived: // do nothing s.resetTimer(savedOrderInfo, bill, isPending) if s.isBillCandidate(order, bill) { } else { - // s.CancelWaybill(bill) + // s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) globals.SugarLogger.Infof("OnWaybillStatusChanged CourierArrived order(%d, %s) bill(%d, %s), bill:%v shouldn't get here", order.WaybillVendorID, order.VendorWaybillID, bill.WaybillVendorID, bill.VendorWaybillID, bill) } case model.WaybillStatusFailed: // todo WaybillStatusFailed理解成订单整个失败了,不需要再尝试创建运单了,注意这里应该加个zabbix日志的报警 @@ -362,7 +362,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo if s.isBillCandidate(order, bill) { // do nothing } else { - // s.CancelWaybill(bill) + // s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) globals.SugarLogger.Infof("OnWaybillStatusChanged Delivering order(%d, %s) bill(%d, %s), bill:%v shouldn't get here", order.WaybillVendorID, order.VendorWaybillID, bill.WaybillVendorID, bill.VendorWaybillID, bill) } case model.WaybillStatusDelivered: @@ -370,9 +370,9 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo s.removeWaybillFromMap(savedOrderInfo, bill) if order.VendorID != bill.WaybillVendorID && !isPending { if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore { - s.SelfDeliverDelievered(order) + s.SelfDeliverDelievered(order, "") } else { - s.Swtich2SelfDelivered(order) + s.Swtich2SelfDelivered(order, "") } } if !s.isBillCandidate(order, bill) { @@ -464,11 +464,11 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf return err } -func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill) (err error) { +func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill, cancelReasonID int, cancelReason string) (err error) { globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep) for _, v := range savedOrderInfo.waybills { if (v.OrderVendorID != v.WaybillVendorID) && (bill2Keep == nil || !(v.WaybillVendorID == bill2Keep.WaybillVendorID && v.VendorWaybillID == bill2Keep.VendorWaybillID)) { - s.CancelWaybill(v) + s.CancelWaybill(v, cancelReasonID, cancelReason) } } return nil @@ -478,7 +478,7 @@ func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInf order := savedOrderInfo.order globals.SugarLogger.Debugf("swtich2SelfDeliverWithRetry orderID:%s", order.VendorOrderID) if order.WaybillVendorID != order.VendorID { - if err := s.Swtich2SelfDeliver(order); err != nil { + if err := s.Swtich2SelfDeliver(order, ""); err != nil { globals.SugarLogger.Infof("swtich2SelfDeliverWithRetry failed, bill:%v, err:%v", bill, err) if retryCount > 0 { time.AfterFunc(duration, func() { @@ -497,7 +497,7 @@ func (s *DefScheduler) swtich2SelfDeliverWithRetry(savedOrderInfo *WatchOrderInf db := orm.NewOrm() db.Insert(tmpLog) - if s.CancelWaybill(bill) == nil { + if s.CancelWaybill(bill, partner.CancelWaybillReasonSwitch2SelfFailed, partner.CancelWaybillReasonStrSwitch2SelfFailed) == nil { // 转自送失败的取消,要将订单中的运单状态更新 if s.isBillCandidate(order, bill) { bill.WaybillVendorID = model.VendorIDUnknown @@ -697,7 +697,7 @@ func (s *DefScheduler) updateOrderByBill(order *model.GoodsOrder, bill *model.Wa } func (s *DefScheduler) autoPickupGood(order *model.GoodsOrder) (err error) { - return s.PickupGoods(order) + return s.PickupGoods(order, "") } func (s *DefScheduler) isBillCandidate(order *model.GoodsOrder, bill *model.Waybill) bool { diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index 5e8b3192d..0c42a25e6 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -148,17 +148,16 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(del return bill, err } -func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill) (err error) { - reasonID := dadaapi.ReasonIDOther - reasonMsg := "send not in time" - if bill.Status < model.WaybillStatusAccepted { - reasonID = dadaapi.ReasonIDNobodyAccept - reasonMsg = "ReasonIDNobodyAccept" - } else if bill.Status < model.WaybillStatusCourierArrived { - reasonID = dadaapi.ReasonIDNobodyPickup - reasonMsg = "ReasonIDNobodyPickup" +func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) { + switch cancelReasonID { + case partner.CancelWaybillReasonNotAcceptIntime: + cancelReasonID = dadaapi.ReasonIDNobodyAccept + case partner.CancelWaybillReasonSwitch2SelfFailed: + cancelReasonID = dadaapi.ReasonIDClientDontWantItAnymore + default: + cancelReasonID = dadaapi.ReasonIDOther } - _, err = api.DadaAPI.CancelOrder(bill.VendorOrderID, reasonID, reasonMsg) + _, err = api.DadaAPI.CancelOrder(bill.VendorOrderID, cancelReasonID, cancelReason) return err } diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index 4f1fdb4d3..2be20852d 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -245,17 +245,16 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, policy func(del return bill, err } -func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill) (err error) { - reasonID := mtpsapi.CancelReasonRidderSendNotIntime - reasonMsg := "CancelReasonRidderSendNotIntime" - if bill.Status < model.WaybillStatusAccepted { - reasonID = mtpsapi.CancelReasonMerchantOther - reasonMsg = "nobody accept order" - } else if bill.Status < model.WaybillStatusCourierArrived { - reasonID = mtpsapi.CancelReasonRideerGetGoodNotIntime - reasonMsg = "CancelReasonRideerGetGoodNotIntime" +func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) { + switch cancelReasonID { + case partner.CancelWaybillReasonNotAcceptIntime: + cancelReasonID = mtpsapi.CancelReasonRideerMtpsOther + case partner.CancelWaybillReasonSwitch2SelfFailed: + cancelReasonID = mtpsapi.CancelReasonMerchantOther + default: + cancelReasonID = mtpsapi.CancelReasonRideerOther } - _, err = api.MtpsAPI.CancelOrder(utils.Str2Int64(bill.VendorWaybillID2), bill.VendorWaybillID, reasonID, reasonMsg) + _, err = api.MtpsAPI.CancelOrder(utils.Str2Int64(bill.VendorWaybillID2), bill.VendorWaybillID, cancelReasonID, cancelReason) return nil } diff --git a/business/partner/partner.go b/business/partner/partner.go index 55e2c7f25..b7448ae1e 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -6,6 +6,18 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) +const ( + CancelWaybillReasonNotAcceptIntime = 1 + CancelWaybillReasonSwitch2SelfFailed = 2 + CancelWaybillReasonOther = 10 +) + +var ( + CancelWaybillReasonStrNotAcceptIntime = "没有及时抢单" + CancelWaybillReasonStrSwitch2SelfFailed = "转自送失败" + CancelWaybillReasonStrOrderAlreadyFinished = "订单已经结束" +) + var ( CurOrderManager IOrderManager ) @@ -27,25 +39,25 @@ type IPurchasePlatformHandler interface { GetOrder(vendorOrderID string) (order *model.GoodsOrder, err error) GetStatusActionTimeout(statusType, status int) time.Duration - AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) - PickupGoods(order *model.GoodsOrder) (err error) + AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) + PickupGoods(order *model.GoodsOrder, userName string) (err error) // 将订单从购物平台配送转为自送 - Swtich2SelfDeliver(order *model.GoodsOrder) (err error) + Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) // 将订单从购物平台配送转为自送后又送达 - Swtich2SelfDelivered(order *model.GoodsOrder) (err error) + Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) // 完全自送的门店表示开始配送 - SelfDeliverDelievering(order *model.GoodsOrder) (err error) + SelfDeliverDelievering(order *model.GoodsOrder, userName string) (err error) // 完全自送的门店表示配送完成 - SelfDeliverDelievered(order *model.GoodsOrder) (err error) + SelfDeliverDelievered(order *model.GoodsOrder, userName string) (err error) } type IDeliveryPlatformHandler interface { CreateWaybill(order *model.GoodsOrder, policy func(deliveryFee, addFee int64) error) (bill *model.Waybill, err error) - CancelWaybill(bill *model.Waybill) (err error) + CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) } func Init(curOrderManager IOrderManager) { diff --git a/business/partner/purchase/elm/order.go b/business/partner/purchase/elm/order.go index 9817b8255..807a19512 100644 --- a/business/partner/purchase/elm/order.go +++ b/business/partner/purchase/elm/order.go @@ -264,7 +264,7 @@ func (c *PurchaseHandler) GetStatusFromVendorStatus(vendorStatus string) int { return model.OrderStatusUnknown } -func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { +func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) { if isAcceptIt { err = api.ElmAPI.ConfirmOrder(order.VendorOrderID) } else { @@ -275,25 +275,25 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI // 饿了么没有拣货这个状态,直接返回成功 // 真实流程中也不会调用这个方法,因为接收订单后状态会直接转移到已拣货 -func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, userName string) (err error) { return nil } -func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) { err = api.ElmAPI.DeliveryBySelfLite(order.VendorOrderID) return err } // 饿了么转商家自送后,没有确认送达的概念,空操作 -func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) { return nil } -func (c *PurchaseHandler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) SelfDeliverDelievering(order *model.GoodsOrder, userName string) (err error) { return api.ElmAPI.StartDeliveryBySelf(order.VendorOrderID, order.ConsigneeMobile) } -func (c *PurchaseHandler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { +func (c *PurchaseHandler) SelfDeliverDelievered(order *model.GoodsOrder, userName string) (err error) { return api.ElmAPI.CompleteDeliveryBySelf(order.VendorOrderID, order.ConsigneeMobile) } diff --git a/business/partner/purchase/jd/order.go b/business/partner/purchase/jd/order.go index b1e239ae8..466950661 100644 --- a/business/partner/purchase/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -184,18 +184,18 @@ func (c *PurchaseHandler) GetStatusFromVendorStatus(vendorStatus string) int { return model.OrderStatusUnknown } -func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) (err error) { - _, err = api.JdAPI.OrderAcceptOperate(order.VendorOrderID, isAcceptIt) +func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) { + _, err = api.JdAPI.OrderAcceptOperate(order.VendorOrderID, isAcceptIt, userName) return err } -func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder) (err error) { - _, err = api.JdAPI.OrderJDZBDelivery(order.VendorOrderID) +func (c *PurchaseHandler) PickupGoods(order *model.GoodsOrder, userName string) (err error) { + _, err = api.JdAPI.OrderJDZBDelivery(order.VendorOrderID, userName) return err } -func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error) { - _, err = api.JdAPI.ModifySellerDelivery(order.VendorOrderID) +func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) { + _, err = api.JdAPI.ModifySellerDelivery(order.VendorOrderID, userName) if err != nil { if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 { globals.SugarLogger.Infof("Swtich2SelfDeliver failed with error:%v try get current status", err) @@ -212,17 +212,17 @@ func (c *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder) (err error return err } -func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder) (err error) { - _, err = api.JdAPI.DeliveryEndOrder(order.VendorOrderID) +func (c *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) { + _, err = api.JdAPI.DeliveryEndOrder(order.VendorOrderID, userName) return err } -func (c *PurchaseHandler) SelfDeliverDelievering(order *model.GoodsOrder) (err error) { - _, err = api.JdAPI.OrderSerllerDelivery(order.VendorOrderID) +func (c *PurchaseHandler) SelfDeliverDelievering(order *model.GoodsOrder, userName string) (err error) { + _, err = api.JdAPI.OrderSerllerDelivery(order.VendorOrderID, userName) return err } // 京东送达接口都是一样的 -func (c *PurchaseHandler) SelfDeliverDelievered(order *model.GoodsOrder) (err error) { - return c.Swtich2SelfDelivered(order) +func (c *PurchaseHandler) SelfDeliverDelievered(order *model.GoodsOrder, userName string) (err error) { + return c.Swtich2SelfDelivered(order, userName) } diff --git a/controllers/jx_order.go b/controllers/jx_order.go index 7ecb59530..a7c63aaec 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -13,6 +13,14 @@ type OrderController struct { beego.Controller } +func GetUserNameFromToken(token string) string { + userName := token + if len(userName) > 10 { + userName = userName[:10] + } + return userName +} + func (c *OrderController) URLMapping() { c.Mapping("FinishedPickup", c.FinishedPickup) c.Mapping("GetStoreOrderInfo", c.GetStoreOrderInfo) @@ -21,16 +29,17 @@ func (c *OrderController) URLMapping() { c.Mapping("Swtich2SelfDeliver", c.Swtich2SelfDeliver) } -func (c *OrderController) orderOperate(handler func(vendorOrderID string, vendorID int) (interface{}, error)) { +func (c *OrderController) orderOperate(handler func(vendorOrderID string, vendorID int, userName string) (interface{}, error)) { var ( - vendorOrderID string - vendorID int - err error + vendorOrderID, token string + vendorID int + err error ) + token = c.Ctx.Input.Header("token") vendorOrderID = c.GetString("vendorOrderID") vendorID, err1 := c.GetInt("vendorID", 0) - if vendorOrderID != "" && err1 == nil { - result, err2 := handler(vendorOrderID, vendorID) + if vendorOrderID != "" && token != "" && err1 == nil { + result, err2 := handler(vendorOrderID, vendorID, GetUserNameFromToken(token)) if err = err2; err == nil { retObj := &model.CallResult{ Code: "0", @@ -45,6 +54,9 @@ func (c *OrderController) orderOperate(handler func(vendorOrderID string, vendor if vendorOrderID == "" { errMsg += "vendorOrderID is empty\n" } + if token == "" { + errMsg += "token is empty\n" + } if errMsg != "" { c.Data["json"] = &model.CallResult{ Code: "-1", @@ -56,45 +68,49 @@ func (c *OrderController) orderOperate(handler func(vendorOrderID string, vendor // @Title 完成拣货 // @Description 完成拣货 +// @Param token header string true "认证toke" // @Param vendorOrderID formData string true "订单ID" // @Param vendorID formData int true "订单所属的厂商ID" // @Success 200 {object} business.model.CallResult // @Failure 200 {object} business.model.CallResult // @router /FinishedPickup [post] func (c *OrderController) FinishedPickup() { - c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { - return nil, basesch.FixedBaseScheduler.PickupGoodsAndUpdateStatus(vendorOrderID, vendorID) + c.orderOperate(func(vendorOrderID string, vendorID int, userName string) (interface{}, error) { + return nil, basesch.FixedBaseScheduler.PickupGoodsAndUpdateStatus(vendorOrderID, vendorID, userName) }) } // @Title 转自送 // @Description 转自送 +// @Param token header string true "认证toke" // @Param vendorOrderID formData string true "订单ID" // @Param vendorID formData int true "订单所属的厂商ID" // @Success 200 {object} business.model.CallResult // @Failure 200 {object} business.model.CallResult // @router /Swtich2SelfDeliver [post] func (c *OrderController) Swtich2SelfDeliver() { - c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { - return nil, basesch.FixedBaseScheduler.Swtich2SelfDeliverAndUpdateStatus(vendorOrderID, vendorID) + c.orderOperate(func(vendorOrderID string, vendorID int, userName string) (interface{}, error) { + return nil, basesch.FixedBaseScheduler.Swtich2SelfDeliverAndUpdateStatus(vendorOrderID, vendorID, userName) }) } // @Title 创建三方运单 // @Description 创建三方运单 +// @Param token header string true "认证toke" // @Param vendorOrderID formData string true "订单ID" // @Param vendorID formData int true "订单所属的厂商ID" // @Success 200 {object} business.model.CallResult // @Failure 200 {object} business.model.CallResult // @router /CreateWaybillOnProviders [post] func (c *OrderController) CreateWaybillOnProviders() { - c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { + c.orderOperate(func(vendorOrderID string, vendorID int, userName string) (interface{}, error) { return basesch.FixedBaseScheduler.CreateWaybillOnProviders(vendorOrderID, vendorID) }) } // @Title 得到门店订单信息 // @Description 得到门店订单信息 +// @Param token header string true "认证toke" // @Param storeID query string true "京西门店ID" // @Param lastHours query int false "最近多少小时的信息(缺省为两天)" // @Success 200 {object} business.model.CallResult @@ -132,6 +148,7 @@ func (c *OrderController) GetStoreOrderCountInfo() { // @Title 得到门店订单状态信息 // @Description 得到门店订单状态信息 +// @Param token header string true "认证toke" // @Param storeID query string true "京西门店ID" // @Param lastHours query int false "最近多少小时的信息(缺省为两天)" // @Param fromStatus query int true "起始状态(包括)" @@ -178,13 +195,15 @@ func (c *OrderController) GetStoreOrderInfo() { // @Title 得到订单SKU信息 // @Description 得到订单SKU信息 +// @Param token header string true "认证toke" // @Param vendorOrderID query string true "订单ID" // @Param vendorID query int true "订单所属的厂商ID" // @Success 200 {object} business.model.CallResult // @Failure 200 {object} business.model.CallResult // @router /GetOrderSkuInfo [get] func (c *OrderController) GetOrderSkuInfo() { - c.orderOperate(func(vendorOrderID string, vendorID int) (interface{}, error) { + c.orderOperate(func(vendorOrderID string, vendorID int, userName string) (interface{}, error) { + // globals.SugarLogger.Debugf("userName:%s", userName) return orderman.FixedOrderManager.GetOrderSkuInfo(vendorOrderID, vendorID) }) } From 4ccb8ef402f668296879ece28fff7686e09e11cd Mon Sep 17 00:00:00 2001 From: gazebo Date: Wed, 22 Aug 2018 16:28:47 +0800 Subject: [PATCH 16/16] - fixed bug (error msg should set on Desc, not Data). --- controllers/jx_order.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/jx_order.go b/controllers/jx_order.go index a7c63aaec..274ca5224 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -60,7 +60,7 @@ func (c *OrderController) orderOperate(handler func(vendorOrderID string, vendor if errMsg != "" { c.Data["json"] = &model.CallResult{ Code: "-1", - Data: errMsg, + Desc: errMsg, } } c.ServeJSON()