Files
baseapi/platformapi/fnpsapi/order.go
2022-03-30 14:30:46 +08:00

276 lines
8.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package fnpsapi
import (
"encoding/json"
"errors"
"fmt"
"git.rosy.net.cn/baseapi/utils"
"time"
)
const (
OrderCancelReson0 = 0 // 0:其它(必填原因)必须填写原因
OrderCancelReson1 = 1 // 1:物流原因:订单长时间未分配骑手
OrderCancelReson4 = 4 // 4:商品缺货/无法出货/已售完,
OrderCancelReson6 = 6 // 6:商户发错单,
OrderCancelReson7 = 7 // 7:商户/顾客自身定位错误,
OrderCancelReson8 = 8 // 8:商户改其他第三方配送,
OrderCancelReson9 = 9 // 9:顾客下错单/临时不想要了,
OrderCancelReson10 = 10 // 10:顾客自取/不在家/要求另改时间配送0类型已下线
OrderCancelReson32 = 32 // 32:订单信息填写错误
OrderCancelReson36 = 36 // 36:重复下单了
OrderCancelReson2 = 2 // 2:物流原因:分配骑手后,骑手长时间未取件(类型已下线)
OrderCancelReson3 = 3 // 3:物流原因:骑手告知不配送,让取消订单(类型已下线)
OrderCancelReson5 = 5 // 5:商户联系不上门店/门店关门了(类型已下线)
OrderStatusAcceptCreate = 0 //订单生成
OrderStatusAcceptCacle = 4 //订单取消
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
}
// 返回所有可选的商品列表,每项包含当前使用该商品下单时对应的价格等信息,(其中不可用的商品会返回不可用原因) 可挑选其中一个可用的商品进行正式下单。
var deliveryFeeFn int64
var baseDeliveryFeeFn int64
for _, v := range preOrderResult.GoodsInfos {
if v.IsValid != 1 {
continue
}
deliveryFeeFn = v.ActualDeliveryAmountCent
baseDeliveryFeeFn = v.TotalDeliveryAmountCent
}
// 异常检测
if deliveryFeeFn == 0 && baseDeliveryFeeFn == 0 {
return 0, 0, errors.New("门店数据异常")
}
fmt.Println("preCreateOrder 预下单获取运费==================:=", deliveryFeeFn, baseDeliveryFeeFn)
return deliveryFeeFn, baseDeliveryFeeFn, 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
}
}
fmt.Println("getCancelReasonList 获取取消理由==================:=", cancel["cancel_reason_list"])
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
}
// 查询订单详情接口 todo
func (a *API) QueryOrder(partnerOrderCode string) (result *GetOrderDetailRes, err error) {
orderHead := a.MakeFnRequestHead()
orderHead["business_data"] = partnerOrderCode
data, err := a.AccessAPI(ApiURL, "getOrderDetail", RequestPost, orderHead)
if err != nil {
return nil, err
}
fnResult := &GetOrderDetailRes{}
if err := json.Unmarshal([]byte(data["business_data"].(string)), &fnResult); err != nil {
return nil, err
}
fmt.Println("getOrderDetail 订单详情==================:=", fnResult)
return fnResult, nil
}
// 查询骑手信息
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
}
fnResult := &GetKnightInfoRes{}
if err := json.Unmarshal([]byte(utils.Interface2String(data["business_data"])), &fnResult); err != nil {
return nil, err
}
fmt.Println("getKnightInfo 骑手信息==================:=", fnResult)
return fnResult, nil
}
// 余额查询
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
}
//order_cancel_reason_code 订单取消原因代码(1:用户取消,2:商家取消)
// order_cancel_code 订单取消编码(
// 1:物流原因:订单长时间未分配骑手,
// 2:物流原因:分配骑手后,骑手长时间未取件 ,
// 3:物流原因:骑手告知不配送,让取消订单,
// 4:商品缺货/无法出货/已售完, 5:商户联系不上门店/门店关门了, 6:商户发错单,
// 7:商户/顾客自身定位错误, 8:商户改其他第三方配送, 9:顾客下错单/临时不想要了,
// 10:顾客自取/不在家/要求另改时间配送0类型已下线
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
}
func (a *API) ComplaintRider(partnerOrderCode string, orderComplaintCode int) (err error) {
orderHead := a.MakeFnRequestHead()
bytes, err := json.Marshal(map[string]interface{}{
"partner_order_code": partnerOrderCode,
"order_complaint_code": orderComplaintCode,
})
if err != nil {
return err
}
orderHead["businessData"] = string(bytes)
_, err = a.AccessAPI(ApiURL, "cancelOrder", RequestPost, orderHead)
return err
}