package dada 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/jxutils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/scheduler" "git.rosy.net.cn/jx-callback/globals/api" ) type WaybillController struct { } func init() { scheduler.CurrentScheduler.RegisterDeliveryPlatform(model.VendorIDDada, new(WaybillController)) } func (c *WaybillController) OnWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaapi.CallbackResponse) { controller.CallMsgHandler(func() { retVal = c.onWaybillMsg(msg) }, msg.OrderID) return retVal } func (c *WaybillController) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaapi.CallbackResponse) { order := c.callbackMsg2Waybill(msg) switch msg.OrderStatus { case dadaapi.OrderStatusWaitingForAccept: order.Status = model.WaybillStatusNew case dadaapi.OrderStatusAccepted: if result, err := api.DadaAPI.QueryOrderInfo(msg.OrderID); err == nil { order.DesiredFee = jxutils.StandardPrice2Int(utils.Interface2FloatWithDefault(result["deliveryFee"], 0.0)) } order.Status = model.WaybillStatusAccepted case dadaapi.OrderStatusDelivering: order.Status = model.WaybillStatusDelivering case dadaapi.OrderStatusFinished: order.Status = model.WaybillStatusDelivered case dadaapi.OrderStatusCanceled: order.Status = model.WaybillStatusCanceled case dadaapi.OrderStatusExpired, dadaapi.OrderStatusAddOrderFailed: order.Status = model.WaybillStatusFailed default: order.Status = model.WaybillStatusUnknown } return dadaapi.Err2CallbackResponse(controller.WaybillManager.OnWaybillStatusChanged(order), utils.Int2Str(order.Status)) } func (c *WaybillController) callbackMsg2Waybill(msg *dadaapi.CallbackMsg) (retVal *model.Waybill) { retVal = &model.Waybill{ VendorWaybillID: msg.ClientID, WaybillVendorID: model.VendorIDDada, CourierName: msg.DmName, CourierMobile: msg.DmMobile, VendorStatus: utils.Int2Str(msg.OrderStatus), StatusTime: utils.Timestamp2Time(int64(msg.UpdateTime)), } retVal.VendorOrderID, retVal.OrderVendorID = jxutils.SplitUniversalOrderID(msg.OrderID) return retVal } // DeliveryPlatformHandler func (c *WaybillController) CreateWaybill(order *model.GoodsOrder) (err error) { billParams := &dadaapi.OperateOrderRequiredParams{ ShopNo: utils.Int2Str(order.StoreID), // 当前达达的门店号与京西是一样的 OriginID: jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID), CargoPrice: jxutils.IntPrice2Standard(order.SalePrice), IsPrepay: 0, ReceiverName: order.ConsigneeName, ReceiverAddress: order.ConsigneeAddress, ReceiverPhone: order.ConsigneeMobile, } if billParams.CityCode, err = controller.GetDataCityCodeFromOrder(order); err == nil { billParams.ReceiverLng, billParams.ReceiverLat, _ = jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType) addParams := map[string]interface{}{ "info": order.BuyerComment, "origin_mark": model.VendorNames[order.VendorID], "origin_mark_no": utils.Int2Str(order.VendorID), } _, err = api.DadaAPI.AddOrder(billParams, addParams) } return err } func (c *WaybillController) CancelWaybill(bill *model.Waybill) (err error) { reasonID := dadaapi.ReasonIDOther reasonMsg := "other reason" if bill.Status < model.WaybillStatusAccepted { reasonID = dadaapi.ReasonIDNobodyAccept reasonMsg = "ReasonIDNobodyAccept" } else if bill.Status < model.WaybillStatusCourierArrived { reasonID = dadaapi.ReasonIDNobodyPickup reasonMsg = "ReasonIDNobodyPickup" } _, err = api.DadaAPI.CancelOrder(bill.VendorWaybillID, reasonID, reasonMsg) return err }