package fnpsapi import ( "encoding/json" "errors" "git.rosy.net.cn/baseapi/utils" "time" ) const ( OrderCancelReson1 = 1 // 1:物流原因:订单长时间未分配骑手, OrderCancelReson2 = 2 // 2:物流原因:分配骑手后,骑手长时间未取件 , OrderCancelReson3 = 3 // 3:物流原因:骑手告知不配送,让取消订单, OrderCancelReson4 = 4 // 4:商品缺货/无法出货/已售完, OrderCancelReson5 = 5 // 5:商户联系不上门店/门店关门了, OrderCancelReson6 = 6 // 6:商户发错单, OrderCancelReson7 = 7 // 7:商户/顾客自身定位错误, OrderCancelReson8 = 8 // 8:商户改其他第三方配送, OrderCancelReson9 = 9 // 9:顾客下错单/临时不想要了, OrderCancelReson10 = 10 // 10:顾客自取/不在家/要求另改时间配送)(0类型已下线) OrderStatusAccept = 1 //系统已接单 OrderStatusAssigned = 20 //已分配骑手 OrderStatusArrived = 80 //已到店 OrderStatusDelivering = 2 //配送中 OrderStatusDelivered = 3 //已送达 OrderStatusException = 5 //异常 ) // 蜂鸟预下单 func (a *API) PreCreateByShopFn(basicParams *PreCreateOrder) (deliveryFee, baseDeliveryFee int64, err error) { preOrder := a.MakeFnRequestHead() bytes, err := json.Marshal(basicParams) if err != nil { return 0, 0, err } preOrder["business_data"] = string(bytes) result, err := a.AccessAPI(ApiURL, "preCreateOrder", RequestPost, preOrder) if err != nil { return 0, 0, err } preOrderResult := PreCreateOrderResp{} if err := json.Unmarshal([]byte(result["business_data"].(string)), &preOrderResult); err != nil { return 0, 0, err } // 返回所有可选的商品列表,每项包含当前使用该商品下单时对应的价格等信息,(其中不可用的商品会返回不可用原因) 可挑选其中一个可用的商品进行正式下单。 for _, v := range preOrderResult.GoodsInfos { if v.IsValid != 1 { continue } deliveryFee = v.ActualDeliveryAmountCent baseDeliveryFee = v.TotalDeliveryAmountCent } // 异常检测 if deliveryFee == 0 && baseDeliveryFee == 0 { err = errors.New("门店数据异常") } return deliveryFee, baseDeliveryFee, nil } // 蜂鸟正式下单 func (a *API) CreateOrder(createOrderParam *CreateOrderReqParam) (err error) { orderHead := a.MakeFnRequestHead() bytes, err := json.Marshal(createOrderParam) if err != nil { return err } orderHead["business_data"] = string(bytes) _, err = a.AccessAPI(ApiURL, "createOrder", RequestPost, orderHead) return err } // addTip 加小费接口 func (a *API) AddTip(req *AddTipRes) (err error) { if req.PartnerOrderCode == "" && req.OrderId == "" { return errors.New("内部订单号或者外部订单号比填写一个") } orderHead := a.MakeFnRequestHead() addTipString, err := json.Marshal(req) if err != nil { return err } orderHead["businessData"] = string(addTipString) if _, err = a.AccessAPI(ApiURL, "addTip", RequestPost, orderHead); err != nil { return err } return nil } // getCancelReasonList 获取可用取消原因列表(暂油前端写死) func (a *API) GetCancelReasonList(req *GetOrderDetailReq) (result *GetCancelReasonListRes, err error) { if req.PartnerOrderCode == "" && req.OrderId == "" { return nil, errors.New("内部订单号或者外部订单号比填写一个") } a.timestamp = time.Now().Unix() * 1000 orderHead := a.MakeFnRequestHead() business, err := json.Marshal(req) if err != nil { return nil, err } orderHead["businessData"] = string(business) data, err := a.AccessAPI(ApiURL, "getCancelReasonList", RequestPost, orderHead) if err != nil { return nil, err } cancel := make(map[string]*GetCancelReasonListRes, 0) if k, ok := data["business_data"]; ok { if err := json.Unmarshal([]byte(utils.Interface2String(k)), cancel); err != nil { return nil, err } } return cancel["cancel_reason_list"], nil } // preCancelOrder 预取消订单接口,获取取消订单需要扣除的金额 func (a *API) PreCancelOrder(req *PreCancelOrderReq) (actualCancelCostCent int64, err error) { if req.PartnerOrderCode == "" && req.OrderId == "" { return 0, errors.New("内部订单号或者外部订单号比填写一个") } orderHead := a.MakeFnRequestHead() business, err := json.Marshal(req) if err != nil { return 0, err } orderHead["businessData"] = string(business) data, err := a.AccessAPI(ApiURL, "preCancelOrder", RequestPost, orderHead) if err != nil { return 0, err } if k, ok := data["businessData"]; ok { respParam := struct { ActualCancelCostCent int64 `json:"actual_cancel_cost_cent"` }{} if err := json.Unmarshal([]byte(utils.Interface2String(k)), respParam); err != nil { return 0, err } return respParam.ActualCancelCostCent, nil } return } // cancelOrder 取消订单 func (a *API) CancelOrder(req *CancelOrderReq) (err error) { if req.PartnerOrderCode == "" && req.OrderId == "" { return errors.New("内部订单号或者外部订单号比填写一个") } if req.OrderCancelCode == 0 && req.OrderCancelOtherReason == "" { return errors.New("请补充退单原因") } orderHead := a.MakeFnRequestHead() business, err := json.Marshal(req) if err != nil { return err } orderHead["business_data"] = string(business) if _, err := a.AccessAPI(ApiURL, "cancelOrder", RequestPost, orderHead); err != nil { return err } return } // 查询订单详情接口 func (a *API) QueryOrderDaile(req *GetOrderDetailReq) (result *GetOrderDetailRes, err error) { if req.PartnerOrderCode == "" && req.OrderId == "" { return nil, errors.New("内部订单号或者外部订单号比填写一个") } orderHead := a.MakeFnRequestHead() bytes, err := json.Marshal(req) if err != nil { return nil, err } orderHead["business_data"] = string(bytes) data, err := a.AccessAPI(ApiURL, "getOrderDetail", RequestPost, orderHead) if err != nil { return nil, err } if err := json.Unmarshal([]byte(data["business_data"].(string)), &result); err != nil { return nil, err } return } // 查询骑手信息 func (a *API) GetKnightInfo(req *GetOrderDetailReq) (result *GetKnightInfoRes, err error) { if req.PartnerOrderCode == "" && req.OrderId == "" { return nil, errors.New("内部订单号或者外部订单号比填写一个") } orderHead := a.MakeFnRequestHead() bytes, err := json.Marshal(req) if err != nil { return nil, err } orderHead["business_data"] = string(bytes) data, err := a.AccessAPI(ApiURL, "getKnightInfo", RequestPost, orderHead) if err != nil { return nil, err } if err := json.Unmarshal([]byte(utils.Interface2String(data["business_data"])), &result); err != nil { return nil, err } return } // 余额查询 func (a *API) GetAmount() (outAmount map[string]interface{}, err error) { orderHead := a.MakeFnRequestHead() result, err := a.AccessAPI(ApiURL, "getAmount", RequestPost, orderHead) if err != nil { return nil, err } return result, err } // complaintOrder 投诉订单 func (a *API) ComplaintOrder(req *ComplaintOrderReq) (err error) { if req.PartnerOrderCode == "" && req.OrderId == "" { return errors.New("内部订单号或者外部订单号比填写一个") } orderHead := a.MakeFnRequestHead() bytes, err := json.Marshal(req) if err != nil { return err } orderHead["businessData"] = string(bytes) _, err = a.AccessAPI(ApiURL, "cancelOrder", RequestPost, orderHead) return err } // claimOrder 索赔订单 func (a *API) ClaimOrder(req *ClaimOrderRes) (err error) { if req.PartnerOrderCode == "" && req.OrderId == "" { return errors.New("内部订单号或者外部订单号比填写一个") } orderHead := a.MakeFnRequestHead() bytes, err := json.Marshal(req) if err != nil { return err } orderHead["business_data"] = string(bytes) _, err = a.AccessAPI(ApiURL, "claimOrder", RequestPost, orderHead) if err != nil { return err } return nil }