package ebaiapi import ( "time" "git.rosy.net.cn/baseapi/utils" ) const ( CancelTypeNotInServiceArea = "1" CancelTypeShopClosed = "2" CancelTypeSoldOut = "3" CancelTypePriceChanged = "4" CancelTypeClientCanceled = "5" CancelTypeDuplicatedOrder = "6" CancelTypeTooBusy = "7" CancelTypeCanNotContactClient = "8" CancelTypeFakeOrder = "9" CancelTypePushOrderFailed = "53" CancelTypeCustom = "-1" ) const ( OrderStatusNew = "1" OrderStatusAccepted = "5" // 订单确认 OrderStatusCourierAccepted = "7" // 骑士已接单开始取餐(此时可通过订单详情接口获取骑士手机号) OrderStatusCourierPickedup = "8" // 骑士已取餐正在配送 OrderStatusFinished = "9" // 订单完成 OrderStatusCanceled = "10" // 订单取消 OrderStatusRefund = "15" // 订单退款,这个是售后之后的事件,不应该当成正常订单事件处理 ) const ( WaybillStatusNew = "2" // 生成运单 WaybillStatusRequestDelivery = "3" // 请求配送 WaybillStatusWait4Courier = "4" // 等待分配骑士 WaybillStatusCourierAccepted = "7" // 骑士接单 WaybillStatusCourierPickedup = "8" // 骑士取餐 // 饿百在发送运单取消事件后,如果订单没有及时(具体时间未知)转出自送,则订单会被取消,且不会发送订单取消事件 // https://open-be.ele.me/dev/answer/reedit?list_id=23667&question=my WaybillStatusDeliveryCancled = "15" // 配送取消 WaybillStatusFinished = "16" // 配送完成 WaybillStatusExceptional = "17" // 配送异常 WaybillStatusSelfDelivery = "18" // 自行配送 WaybillStatusDontDeliver = "19" // 不再配送 WaybillStatusDeliveryRejected = "20" // 配送拒单 WaybillStatusCourierArrived = "21" // 骑士到店 ) const ( // 订单下行 - order.partrefund.push-部分退款订单信息推送 OrderPartRefuncTypeMerchant = 1 // 表示商户发起的部分退款 OrderPartRefuncTypeCustomer = 2 // 表示用户发起的部分退款 OrderPartRefuncTypeCS = 3 // 表示客服直接发起的部分退款 OrderPartRefundApply = 10 // 表示商家/用户发起部分退款申请 OrderPartRefundSuccess = 20 // 表示部分退款成功 OrderPartRefundUserApplyArbitration = 30 // 用户申请仲裁,客服介入 OrderPartRefundFailed = 40 // 表示部分退款失败 OrderPartRefundMerchantRefused = 50 // 表示商家拒绝用户发起的部分退款申请 // 订单下行 - order.user.cancel-用户申请订单取消/退款 OrderUserCancelApply = 10 // 发起申请 OrderUserCancelCSIntervene = 20 // 客服介入 OrderUserCancelCSRefused = 30 // 客服拒绝 OrderUserCancelCSAgreed = 40 // 客服同意 OrderUserCancelMerchantRefused = 50 // 商户拒绝 OrderUserCancelMerchantAgreed = 60 // 商家同意 OrderUserCancelInvalid = 70 // 申请失效 OrderUserCancelTypeBeforeSale = 1 // 表示订单完成前用户全单取消申请流程 OrderUserCancelTypeAfterSale = 2 // 表示订单完成后用户全单退款申请流程 ) const ( OrderFromBaidu = "1" OrderFromElm = "2" OrderSkuDiscountTypeZhe = "g_zhe" OrderSkuDiscountTypeReduce = "g_reduce" OrderSkuDiscountTypeTe = "g_te" OrderSkuDiscountTypeZeng = "zeng" ) const ( UserApplyCancelWaitMinute = 15 // 用户申请取消订单后待处理的最大等待时间(分钟),超时自动同意 ) const ( ListOrderPageSize = 100 // order.list的每页条数 ) type ExpressInfo struct { OrderID string `json:"order_id"` ExpressID string `json:"express_id"` ExpressCompany string `json:"express_company"` } type PrivateMobileInfo struct { ShortNumber string `json:"short_number"` ExpireDate *time.Time `json:"expire_date"` } type RefundSku struct { SkuID string `json:"sku_id,omitempty"` Upc string `json:"upc,omitempty"` CustomeSkuID string `json:"custom_sku_id,omitempty"` Number string `json:"number"` } type ProductSubsidyInfo struct { AgentRate int `json:"agent_rate"` BaiduRate int `json:"baidu_rate"` Discount int `json:"discount"` DiscountDetail []*struct { ActivityID string `json:"activity_id"` BaiduRate int `json:"baidu_rate"` ShopRate int `json:"shop_rate"` Type string `json:"type"` } `json:"discount_detail"` LogisticsRate int `json:"logistics_rate"` ShopRate int `json:"shop_rate"` UserRate int `json:"user_rate"` } type OrderProductInfo struct { BaiduProductID string `json:"baidu_product_id"` SkuID string `json:"sku_id"` // 部分退款信息中是这个而不是BaiduProductID CustomSkuID string `json:"custom_sku_id"` PackageAmount int `json:"package_amount"` PackageFee int `json:"package_fee"` PackagePrice int `json:"package_price"` PrescriptionID string `json:"prescription_id"` ProductAmount int `json:"product_amount"` Number int `json:"number"` // 部分退款信息中是这个而不是ProductAmount ProductAttr []interface{} `json:"product_attr"` ProductCustomIndex string `json:"product_custom_index"` ProductFeatures []interface{} `json:"product_features"` ProductFee int `json:"product_fee"` ProductName string `json:"product_name"` ProductPrice int `json:"product_price"` ProductSubsidy *ProductSubsidyInfo `json:"product_subsidy"` ProductType int `json:"product_type"` SupplyType int `json:"supply_type"` TotalFee int `json:"total_fee"` TotalWeight int `json:"total_weight"` Upc string `json:"upc"` WeightType int `json:"weight_type"` } type OrderDiscountInfo struct { ActivityID string `json:"activity_id"` AgentRate int `json:"agent_rate"` BaiduRate int `json:"baidu_rate"` Desc string `json:"desc"` Fee int `json:"fee"` LogisticsRate int `json:"logistics_rate"` Products []*struct { ActivityID string `json:"activity_id"` ActivityProductNum int `json:"activity_product_num"` BaiduProductID int64 `json:"baidu_product_id"` NowPrice int `json:"now_price"` OrigPrice int `json:"orig_price"` SavePrice int `json:"save_price"` } `json:"products,omitempty"` RuleID string `json:"rule_id"` ShopRate int `json:"shop_rate"` Type string `json:"type"` } type OrderDetailInfo struct { Discount []*OrderDiscountInfo `json:"discount"` Order *struct { AtshopTime int `json:"atshop_time"` CancelTime string `json:"cancel_time"` ColdBoxFee string `json:"cold_box_fee"` Commission int `json:"commission"` ConfirmTime string `json:"confirm_time"` CreateTime string `json:"create_time"` DeliveryParty int `json:"delivery_party"` // 此字段会在配送变化后变化 DeliveryPhone string `json:"delivery_phone"` DeliveryTime int `json:"delivery_time"` DiscountFee int `json:"discount_fee"` DownFlag int `json:"down_flag"` ElemeOrderID string `json:"eleme_order_id"` ExpectTimeMode int `json:"expect_time_mode"` Ext struct { TaoxiFlag int `json:"taoxi_flag"` } `json:"ext"` FinishedTime string `json:"finished_time"` InvoiceTitle string `json:"invoice_title"` IsColdBoxOrder int `json:"is_cold_box_order"` IsPrivate int `json:"is_private"` LatestSendTime int `json:"latest_send_time"` MealNum string `json:"meal_num"` NeedInvoice int `json:"need_invoice"` OrderFlag int `json:"order_flag"` OrderFrom string `json:"order_from"` OrderID string `json:"order_id"` OrderIndex string `json:"order_index"` PackageFee int `json:"package_fee"` PayStatus int `json:"pay_status"` PayType int `json:"pay_type"` PickupTime int `json:"pickup_time"` Remark string `json:"remark"` // ResponsibleParty string `json:"responsible_party"` SendFee int `json:"send_fee"` SendImmediately int `json:"send_immediately"` SendTime int `json:"send_time"` ShopFee int `json:"shop_fee"` Status int `json:"status"` TaxerID string `json:"taxer_id"` TotalFee int `json:"total_fee"` UserFee int `json:"user_fee"` } `json:"order"` Products [][]*OrderProductInfo `json:"products"` Shop *struct { BaiduShopID string `json:"baidu_shop_id"` ID string `json:"id"` Name string `json:"name"` } `json:"shop"` Source string `json:"source"` User *struct { Address string `json:"address"` // City string `json:"city"` Coord *struct { Latitude string `json:"latitude"` Longitude string `json:"longitude"` } `json:"coord"` CoordAmap *struct { Latitude string `json:"latitude"` Longitude string `json:"longitude"` } `json:"coord_amap"` // District string `json:"district"` Gender string `json:"gender"` Name string `json:"name"` Phone string `json:"phone"` PrivacyPhone string `json:"privacy_phone"` // Province string `json:"province"` UserID string `json:"user_id"` } `json:"user"` } type RefundOrderDetailInfo struct { CustomSkuID string `json:"custom_sku_id"` Name string `json:"name"` Number int `json:"number"` ProductFeatures []interface{} `json:"product_features"` ProductFee int `json:"product_fee"` ProductPrice int `json:"product_price"` ProductSubsidy *ProductSubsidyInfo `json:"product_subsidy"` SkuID string `json:"sku_id"` TotalWeight int `json:"total_weight"` Upc string `json:"upc"` } type RefundDetailInfo struct { ApplyTime string `json:"apply_time"` CustomSkuID string `json:"custom_sku_id"` Desc string `json:"desc"` Name string `json:"name"` Number int `json:"number"` RefundID string `json:"refund_id"` ShopEleRefund int `json:"shop_ele_refund"` SkuID string `json:"sku_id"` Status int `json:"status"` TotalRefund int `json:"total_refund"` Type int `json:"type"` Upc string `json:"upc"` } type PartRefundInfo struct { Commission int `json:"commission"` Fee int `json:"fee"` OrderDetail []*RefundOrderDetailInfo `json:"order_detail"` OrderID string `json:"order_id"` PackageFee int `json:"package_fee"` RefundDetail []*RefundDetailInfo `json:"refund_detail"` RefundPrice int `json:"refund_price"` SendFee int `json:"send_fee"` ShopFee int `json:"shop_fee"` TotalPrice int `json:"total_price"` Type int `json:"type"` UserFee int `json:"user_fee"` } type ListOrderItemInfo struct { BaiduShopID int64 `json:"baidu_shop_id"` CreateTime int64 `json:"create_time"` OrderFrom int `json:"order_from"` OrderID string `json:"order_id"` OrderStatus int `json:"order_status"` PayStatus int `json:"pay_status"` PayType int `json:"pay_type"` ShopID string `json:"shop_id"` Status int `json:"status"` UserPhone string `json:"user_phone"` } type ListOrderInfo struct { Total int `json:"total"` Page int `json:"Page"` Pages int `json:"pages"` List []*ListOrderItemInfo `json:"list"` } // 提供给合作方确认订单所用。 注:1、10分钟内未确认的订单系统自动取消。2、确认失败的订单请不要做餐。 2016年7月4号起,将由百度外卖负责完成订单。届时,对接方无需调用完成订单接口,继续调用可能导致订单结算有问题。 func (a *API) OrderConfirm(orderID string) (err error) { _, err = a.AccessAPI("order.confirm", map[string]interface{}{ "order_id": orderID, }) return err } // 仅择时达和新零售标品服务包的订单,商家可调用此接口将订单置为已拣货完成状态。订单超过预计拣货完成时间未调用此接口,系统会自动更新为已拣货完成状态。 // https://open-be.ele.me/dev/api/doc/v3/#api-Order_Up-order_pickcomplete func (a *API) OrderPickComplete(orderID string) (err error) { _, err = a.AccessAPI("order.pickcomplete", map[string]interface{}{ "order_id": orderID, }) return err } // 提供给合作方取消订单所用。 注:1、百度物流配送且已经确认的订单无法取消。 func (a *API) OrderCancel(orderID, cancelType, cancelReason string) (err error) { _, err = a.AccessAPI("order.cancel", map[string]interface{}{ "order_id": orderID, "type": cancelType, "reason": cancelReason, }) return err } // 蜂鸟众包订单呼叫骑士配送,仅限蜂鸟众包商户调用 func (a *API) OrderCallDelivery(orderID string) (err error) { _, err = a.AccessAPI("order.callDelivery", map[string]interface{}{ "order_id": orderID, }) return err } // 蜂鸟众包订单取消呼叫骑士配送,仅限蜂鸟众包商户调用。 func (a *API) OrderCancelDelivery(orderID string) (err error) { _, err = a.AccessAPI("order.cancelDelivery", map[string]interface{}{ "order_id": orderID, }) return err } // 饿了么自配送订单回传订单已送出状态 // 此接口目前只支持饿了么侧订单调用 func (a *API) OrderSendOut(orderID, phone string) (err error) { _, err = a.AccessAPI("order.sendout", map[string]interface{}{ "order_id": orderID, "phone": phone, }) return err } // 饿了么自配送订单回传订单送达状态,调用成功后订单状态变为已完成。需先调用订单送出接口,且接单5分钟后可调用 func (a *API) OrderComplete(orderID, phone string) (err error) { _, err = a.AccessAPI("order.complete", map[string]interface{}{ "order_id": orderID, // "phone": phone, }) return err } // 提供给合作方在配送异常或物流拒单后选择自行配送 func (a *API) OrderSwitchselfdelivery(orderID string) (err error) { _, err = a.AccessAPI("order.switchselfdelivery", map[string]interface{}{ "order_id": orderID, }) return err } // 查看订单详情 func (a *API) OrderGet(orderID string) (orderMap map[string]interface{}, err error) { result, err := a.AccessAPI("order.get", map[string]interface{}{ "order_id": orderID, }) if err == nil { return result.Data.(map[string]interface{}), nil } return nil, err } func (a *API) OrderGet2(orderID string) (order *OrderDetailInfo, err error) { result, err := a.AccessAPI("order.get", map[string]interface{}{ "order_id": orderID, }) if err == nil { err = utils.Map2StructByJson(result.Data, &order, true) } return order, err } func (a *API) OrderStatusGet(orderID string) (status int, err error) { result, err := a.AccessAPI("order.status.get", map[string]interface{}{ "order_id": orderID, }) if err == nil { status = int(utils.ForceInterface2Int64(result.Data.(map[string]interface{})["status"])) } return status, err } // 设置订单快递单号 func (a *API) OrderExpressCreate(shopID string, expressList []*ExpressInfo) (status int, err error) { result, err := a.AccessAPI("order.express.create", map[string]interface{}{ KeyShopID: shopID, "express_list": expressList, }) if err == nil { return int(utils.MustInterface2Int64(result.Data.(map[string]interface{})["status"])), nil } return 0, err } func (a *API) OrderPrivateInfo(orderID string) (mobileInfo *PrivateMobileInfo, err error) { result, err := a.AccessAPI("order.privateinfo", map[string]interface{}{ "order_id": orderID, }) if err == nil { mapData := result.Data.(map[string]interface{}) mobileInfo = &PrivateMobileInfo{ ShortNumber: mapData["short_number"].(string), } expireDate := utils.Interface2String(mapData["expire_date"]) if expireDate != "" { tmpTime := utils.Str2Time(expireDate) mobileInfo.ExpireDate = &tmpTime } return mobileInfo, nil } return nil, err } func (a *API) OrderDeliveryGet(orderID string) (deliveryInfo map[string]interface{}, err error) { result, err := a.AccessAPI("order.delivery.get", map[string]interface{}{ "order_id": orderID, }) if err == nil { return result.Data.(map[string]interface{}), nil } return nil, err } func (a *API) OrderIdConvert(orderID string, isElemeOrder bool) (convertedOrderID string, err error) { key := "order_id" resultKey := "eleme_order_id" if isElemeOrder { key = "eleme_order_id" resultKey = "order_id" } result, err := a.AccessAPI("order.id.convert", map[string]interface{}{ key: orderID, }) if err == nil { return utils.Interface2String(result.Data.(map[string]interface{})[resultKey]), nil } return "", err } // 查看订单列表 // https://open-be.ele.me/dev/api/doc/v3/#api-Order_Up-order_list // page从1开始 func (a *API) OrderList(shopID string, baiduShopID int64, startTime, endTime int64, status int, page int) (listOrderInfo *ListOrderInfo, err error) { params := a.genShopIDParams(shopID, baiduShopID, 0) if startTime > 0 { params["start_time"] = startTime } if endTime > 0 { params["end_time"] = endTime } if status > 0 { params["status"] = status } if page > 0 { params["page"] = page } result, err := a.AccessAPI("order.list", params) if err == nil { err = utils.Map2StructByJson(result.Data, &listOrderInfo, true) } return listOrderInfo, err } func (a *API) OrderListAll(shopID string, baiduShopID int64, startTime, endTime int64, status int) (listOrder []*ListOrderItemInfo, err error) { page := 1 for { result, err := a.OrderList(shopID, baiduShopID, startTime, endTime, status, page) if err != nil { return nil, err } listOrder = append(listOrder, result.List...) if result.Page >= result.Pages { break } page++ } return listOrder, nil } // 查看部分退款订单详情 func (a *API) OrderPartRefundGet(orderID string) (orderMap map[string]interface{}, err error) { result, err := a.AccessAPI("order.partrefund.get", map[string]interface{}{ "order_id": orderID, }) if err == nil { return result.Data.(map[string]interface{}), nil } return nil, err } // func (a *API) OrderPartRefundGet2(orderID string) (partRefundInfo *CBPartRefundInfo, err error) { // result, err := a.OrderPartRefundGet(orderID) // if err == nil { // err = utils.Map2StructByJson(result, &partRefundInfo, true) // } // return partRefundInfo, err // } func (a *API) SmartOrderIdConvert(orderID string) (convertedOrderID string, err error) { return a.OrderIdConvert(orderID, isOrderIDEleme(orderID)) } func isOrderIDEleme(orderID string) bool { return len(orderID) == len("3026328756122155111") } func (a *API) OrderAgreeRefund(orderID string) (err error) { _, err = a.AccessAPI("order.agreerefund", map[string]interface{}{ "order_id": orderID, }) return err } func (a *API) OrderDisagreeRefund(orderID, refuseReason string) (err error) { _, err = a.AccessAPI("order.disagreerefund", map[string]interface{}{ "order_id": orderID, "refuse_reason": refuseReason, }) return err } func (a *API) OrderPartRefund(orderID string, removeSkuList []*RefundSku) (err error) { _, err = a.AccessAPI("order.partrefund", map[string]interface{}{ "order_id": orderID, "products": removeSkuList, }) return err } func (a *API) OrderCheckout(orderID, pickUpCode string) (err error) { _, err = a.AccessAPI("order.checkout", map[string]interface{}{ "order_id": orderID, "pick_up_code": pickUpCode, }) return err } func (a *API) OrderQueryAcceptancecode(orderID string) (err error) { _, err = a.AccessAPI("order.query.acceptancecode", map[string]interface{}{ "order_id": orderID, }) return err }