package dada import ( "errors" "fmt" "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" "git.rosy.net.cn/jx-callback/globals/api" "github.com/astaxie/beego/orm" ) var ( ErrCanNotFindDadaCityCode = errors.New("不能找到美团配送站点配置") ) type WaybillController struct { } func init() { scheduler.CurrentScheduler.RegisterDeliveryPlatform(model.VendorIDDada, new(WaybillController)) } func (c *WaybillController) 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) { 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 = c.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.VendorOrderID, reasonID, reasonMsg) return err } func (c *WaybillController) getDataCityCodeFromOrder(order *model.GoodsOrder) (retVal string, err error) { var sql string if order.VendorID == model.VendorIDJD { sql = ` SELECT t2.tel_code FROM jxstoremap t0 JOIN jxstore t1 ON t0.jxstoreid = t1.storeid JOIN city t2 ON t1.area = t2.citycode WHERE t0.jdstoreid = ? ` } else if order.VendorID == model.VendorIDELM { sql = ` SELECT t2.tel_code FROM jx_to_elm_store_map t0 JOIN jxstore t1 ON t0.jx_store_id = t1.storeid JOIN city t2 ON t1.area = t2.citycode WHERE t0.elm_store_id = ? ` } else { panic(fmt.Sprintf("wrong vendorid:%d", order.VendorID)) } db := orm.NewOrm() var lists []orm.ParamsList num, err := db.Raw(sql, utils.Str2Int64(order.VendorStoreID)).ValuesList(&lists) if err == nil && num == 1 { retVal = lists[0][0].(string) } else { globals.SugarLogger.Errorf("GetDataCityCodeFromOrder can not find store info for vendorID:%d, store:%s, num:%d, error:%v", order.VendorID, order.VendorStoreID, num, err) if err == nil { err = ErrCanNotFindDadaCityCode } } return retVal, err }