390 lines
14 KiB
Go
390 lines
14 KiB
Go
package jdapi
|
||
|
||
import (
|
||
"errors"
|
||
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
)
|
||
|
||
const (
|
||
DeliveryStatusWait4Grap = "10"
|
||
DeliveryStatusAccepted = "20"
|
||
DeliveryStatusCourierCanceled = "21"
|
||
DeliveryStatusCourierArrived = "23"
|
||
DeliveryStatusFailedGetGoods = "25"
|
||
DeliveryStatusFailedGetGoodsRejected = "26"
|
||
DeliveryStatusFailedGetGoodsWaiting = "27"
|
||
DeliveryStatusGotGoods = "30"
|
||
DeliveryStatusFailedDelivery = "35"
|
||
DeliveryStatusFinished = "40"
|
||
)
|
||
|
||
const (
|
||
PromotionTypeNormal = 1
|
||
PromotionTypeSeckill = 2
|
||
PromotionTypeDirectDown = 3
|
||
PromotionTypeLimitedTime = 4
|
||
PromotionTypeAddMoneyBuy = 1202
|
||
PromotionTypeOverflowGiveGift = 1203
|
||
PromotionTypeBuyGiveGift = 6
|
||
)
|
||
|
||
const (
|
||
FreightDiscountTypeByShop = 8 // 8:商家满免运费
|
||
FreightDiscountTypeByVip = 7 // 7:VIP免运费
|
||
FreightDiscountTypeByActivity = 12 // 12:首单地推满免运费
|
||
FreightDiscountTypeByCoupons = 15 // 15:运费券
|
||
SelfDeliveryCarrierNo = "2938" // 京东配送方式=商家自送
|
||
)
|
||
|
||
const (
|
||
UserApplyCancelWaitMinute = 15 // 用户申请取消订单后待处理的最大等待时间(分钟),超时自动同意
|
||
)
|
||
|
||
const (
|
||
QueryOrderRetryCount = 1 // 因为京东到家当前不存在的订单也返回-4,暂时不重试
|
||
)
|
||
|
||
const (
|
||
AfsApproveTypeRefund = 1 // 退款
|
||
AfsApproveTypeReturnGoods = 2 // 退货
|
||
AfsApproveTypeRefused = 3 // 驳回
|
||
)
|
||
|
||
type AfsSkuDiscount struct {
|
||
DetailDiscountType int `json:"detailDiscountType"`
|
||
DiscountType int `json:"discountType"`
|
||
PlatPayMoney int64 `json:"platPayMoney"`
|
||
VenderPayMoney int64 `json:"venderPayMoney"`
|
||
}
|
||
|
||
type AfsServiceDetail struct {
|
||
SkuIDIsv string `json:"skuIdIsv"`
|
||
WareName string `json:"wareName"`
|
||
WareNum int `json:"wareNum"`
|
||
AfsSkuDiscountList []*AfsSkuDiscount `json:"afsSkuDiscountList"`
|
||
}
|
||
|
||
type AfsServiceResponse struct {
|
||
AfsServiceID int64 `json:"afsServiceId"`
|
||
AfsServiceOrder string `json:"afsServiceOrder"`
|
||
AfsServiceState int `json:"afsServiceState"`
|
||
CreateTime *utils.JavaDate `json:"createTime"`
|
||
CustomerMobilePhone string `json:"customerMobilePhone"`
|
||
CustomerName string `json:"customerName"`
|
||
OrderID string `json:"orderId"`
|
||
OrderSource int `json:"orderSource"`
|
||
OrderStatus int `json:"orderStatus"`
|
||
OrderType int `json:"orderType"`
|
||
PickwareAddress string `json:"pickwareAddress"`
|
||
|
||
QuestionDesc string `json:"questionDesc"`
|
||
QuestionPic string `json:"questionPic"`
|
||
QuestionTypeCid int `json:"questionTypeCid"`
|
||
StationID string `json:"stationId"`
|
||
StationName string `json:"stationName"`
|
||
StationNumOutSystem string `json:"stationNumOutSystem"`
|
||
VenderID string `json:"venderId"`
|
||
|
||
AfsDetailList []*AfsServiceDetail `json:"afsDetailList"`
|
||
}
|
||
|
||
type OAOSAdjustDTO struct {
|
||
SkuID int64 `json:"skuId,omitempty"`
|
||
OutSkuID string `json:"outSkuId,omitempty"`
|
||
SkuCount int `json:"skuCount"`
|
||
}
|
||
|
||
type VenderAfsSkuDTO struct {
|
||
SkuID int64 `json:"skuId"`
|
||
SkuCount int `json:"skuCount"`
|
||
PromotionType int `json:"promotionType"`
|
||
}
|
||
|
||
var (
|
||
ErrCanNotFindOrder = errors.New("can not find order")
|
||
)
|
||
|
||
var (
|
||
orderOperationResultParser = genNoPageResultParser("code", "msg", "detail", "0")
|
||
)
|
||
|
||
// 订单列表查询接口
|
||
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=169&apiid=ba3027848c3c4fda9674966e2a466482
|
||
func (a *API) OrderQuery(jdParams map[string]interface{}) (retVal []interface{}, totalCount int, err error) {
|
||
// 最多试三次
|
||
for i := 0; i < QueryOrderRetryCount; i++ {
|
||
retVal, totalCount, err = a.AccessAPIHavePage("order/es/query", jdParams, nil, nil, nil)
|
||
if err != nil {
|
||
if err2, ok := err.(*utils.ErrorWithCode); ok {
|
||
if err2.IntCode() == -4 {
|
||
continue
|
||
}
|
||
}
|
||
}
|
||
break
|
||
}
|
||
return retVal, totalCount, err
|
||
}
|
||
|
||
// orderFreightMoney 基础运费
|
||
// tips 商家承担小费
|
||
// merchantPaymentDistanceFreightMoney 取件服务费(开票)(正向单展示远距离运费;售后单则展示达达售后运费)
|
||
// orderBaseFreightMoney ?
|
||
func (a *API) QuerySingleOrder(orderId string) (map[string]interface{}, error) {
|
||
jdParams := make(map[string]interface{})
|
||
jdParams["orderId"] = orderId
|
||
result, _, err := a.OrderQuery(jdParams)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if len(result) == 0 {
|
||
return nil, ErrCanNotFindOrder
|
||
}
|
||
return result[0].(map[string]interface{}), nil
|
||
}
|
||
|
||
func (a *API) LegacyQuerySingleOrder(orderId string) (map[string]interface{}, error) {
|
||
jdParams := make(map[string]interface{})
|
||
jdParams["orderId"] = orderId
|
||
|
||
result, err := a.AccessAPI("order/es/query", jdParams)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
dataStr, _ := result["data"].(string)
|
||
var data map[string]interface{}
|
||
utils.UnmarshalUseNumber([]byte(dataStr), &data)
|
||
result["data"] = data
|
||
|
||
var dataResult map[string]interface{}
|
||
utils.UnmarshalUseNumber([]byte(data["result"].(string)), &dataResult)
|
||
data["result"] = dataResult
|
||
|
||
return result, nil
|
||
}
|
||
|
||
// 商家确认接单接口
|
||
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=169&apiid=c1a15129d1374e9da7fa35487f878604
|
||
func (a *API) OrderAcceptOperate(orderId string, isAgreed bool, userName string) error {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": orderId,
|
||
"isAgreed": utils.Bool2String(isAgreed),
|
||
"operator": utils.GetAPIOperator(userName),
|
||
}
|
||
_, err := a.AccessAPINoPage("ocs/orderAcceptOperate", jdParams, nil, nil, orderOperationResultParser)
|
||
return err
|
||
}
|
||
|
||
// 拣货完成且众包配送接口
|
||
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=169&apiid=ed93745b86c6487eaaea5f55a84785ac
|
||
func (a *API) OrderJDZBDelivery(orderId string, userName string) (detail string, err error) {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": orderId,
|
||
"operator": utils.GetAPIOperator(userName),
|
||
}
|
||
result, err := a.AccessAPINoPage("bm/open/api/order/OrderJDZBDelivery", jdParams, nil, nil, orderOperationResultParser)
|
||
if err == nil {
|
||
return utils.Interface2String(result), nil
|
||
}
|
||
return "", err
|
||
}
|
||
|
||
// 订单达达配送转商家自送接口
|
||
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=169&apiid=e7b4950164754eecac7ea87278c2b071
|
||
func (a *API) ModifySellerDelivery(orderId string, userName string) (detail string, err error) {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": orderId,
|
||
"updatePin": utils.GetAPIOperator(userName),
|
||
}
|
||
result, err := a.AccessAPINoPage("order/modifySellerDelivery", jdParams, nil, nil, orderOperationResultParser)
|
||
if err == nil {
|
||
return utils.Interface2String(result), nil
|
||
}
|
||
return "", err
|
||
}
|
||
|
||
// 拣货完成且商家自送接口(这个接口是商家本身配置为自送模式下才能调用的接口,如果启用了达达配送,是不能调用的)
|
||
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=169&apiid=0e08e71a45dc48b6a337e06a852ac33a
|
||
func (a *API) OrderSerllerDelivery(orderId string, userName string) (detail string, err error) {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": orderId,
|
||
"operator": utils.GetAPIOperator(userName),
|
||
}
|
||
result, err := a.AccessAPINoPage("bm/open/api/order/OrderSerllerDelivery", jdParams, nil, nil, orderOperationResultParser)
|
||
if err == nil {
|
||
return utils.Interface2String(result), nil
|
||
}
|
||
return "", err
|
||
}
|
||
|
||
// 商家自送,订单妥投接口
|
||
// https://opendj.jd.com/staticnew/widgets/resources.html?groupid=169&apiid=ecc80f06d35141979f4841f345001f74
|
||
func (a *API) DeliveryEndOrder(orderId string, userName string) (result map[string]interface{}, err error) {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": orderId,
|
||
"operPin": utils.GetAPIOperator(userName),
|
||
"operTime": utils.GetCurTimeStr(),
|
||
}
|
||
tmpResult, err := a.AccessAPINoPage("ocs/deliveryEndOrder", jdParams, nil, nil, nil)
|
||
if err == nil {
|
||
return tmpResult.(map[string]interface{}), nil
|
||
}
|
||
return nil, err
|
||
}
|
||
|
||
// 常规订单应结金额接口
|
||
// https://openo2o.jddj.com/staticnew/widgets/resources.html?groupid=169&apiid=17f0b596df554fe2b66fa7742a025d92
|
||
func (a *API) OrderShoudSettlementService(orderId string) (map[string]interface{}, error) {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": orderId,
|
||
}
|
||
result, err := a.AccessAPINoPage("bill/orderShoudSettlementService", jdParams, nil, nil, genNoPageResultParser("code", "detail", "result", "0"))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if result == nil {
|
||
return nil, utils.NewErrorIntCode("查询订单信息异常", -4)
|
||
}
|
||
return result.(map[string]interface{}), nil
|
||
}
|
||
|
||
// 查询售后单详情接口
|
||
// https://openo2o.jddj.com/staticnew/widgets/resources.html?groupid=170&apiid=6805ed690b7b4776b058067312c57d98
|
||
func (a *API) GetAfsService(orderId string) (map[string]interface{}, error) {
|
||
jdParams := map[string]interface{}{
|
||
"afsServiceOrder": orderId,
|
||
}
|
||
result, err := a.AccessAPINoPage("afs/getAfsService", jdParams, nil, nil, genNoPageResultParser("code", "msg", "result", "0"))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return result.(map[string]interface{}), nil
|
||
}
|
||
|
||
func (a *API) GetAfsService2(afsOrderID string) (afsOrderInfo *AfsServiceResponse, err error) {
|
||
result, err := a.GetAfsService(afsOrderID)
|
||
if err == nil {
|
||
err = utils.Map2StructByJson(result, &afsOrderInfo, false)
|
||
}
|
||
return afsOrderInfo, nil
|
||
}
|
||
|
||
// 商家审核用户取消申请接口
|
||
// https://openo2o.jddj.com/staticnew/widgets/resources.html?groupid=169&apiid=906b430307764a3ca3698c05c72f33d0
|
||
func (a *API) OrderCancelOperate(orderId string, isAgreed bool, operator, remark string) (err error) {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": orderId,
|
||
"isAgreed": isAgreed,
|
||
"operator": operator,
|
||
"remark": remark,
|
||
}
|
||
_, err = a.AccessAPINoPage("ocs/orderCancelOperate", jdParams, nil, nil, nullResultParser)
|
||
return err
|
||
}
|
||
|
||
// 订单调整接口
|
||
// https://openo2o.jddj.com/staticnew/widgets/resources.html?groupid=169&apiid=a7378109fd7243eea9efbb6231a7401c
|
||
func (a *API) AdjustOrder(orderId, operPin, remark string, oaosAdjustDTOList []*OAOSAdjustDTO) (err error) {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": orderId,
|
||
"operPin": operPin,
|
||
"remark": remark,
|
||
"oaosAdjustDTOList": oaosAdjustDTOList,
|
||
}
|
||
_, err = a.AccessAPINoPage("orderAdjust/adjustOrder", jdParams, nil, nil, genNoPageResultParser("code", "detail", "", "0"))
|
||
return err
|
||
}
|
||
|
||
// 商家审核配送员取货失败接口
|
||
// https://openo2o.jddj.com/staticnew/widgets/resources.html?groupid=169&apiid=d10c63a2ea734b818b23f0bc1c8efe6f
|
||
func (a *API) ReceiveFailedAudit(orderId string, isAgreed bool, operator, remark string) (err error) {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": orderId,
|
||
"isAgreed": isAgreed,
|
||
"operator": operator,
|
||
"remark": remark,
|
||
}
|
||
_, err = a.AccessAPINoPage("order/receiveFailedAudit", jdParams, nil, nil, nullResultParser)
|
||
return err
|
||
}
|
||
|
||
// 催配送员抢单接口
|
||
// https://openo2o.jddj.com/staticnew/widgets/resources.html?groupid=169&apiid=96383a8274bd463a95dfc8b8d74220d1
|
||
func (a *API) UrgeDispatching(orderId, updatePin string) (err error) {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": orderId,
|
||
"updatePin": updatePin,
|
||
}
|
||
_, err = a.AccessAPINoPage("bm/urgeDispatching", jdParams, nil, nil, nullResultParser)
|
||
return err
|
||
}
|
||
|
||
// 商家确认收到拒收退回(或取消)的商品接口
|
||
// https://openo2o.jddj.com/staticnew/widgets/resources.html?groupid=169&apiid=21a55807c096410c9cac9b71e110fa43
|
||
func (a *API) ConfirmReceiveGoods(orderId string) (err error) {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": orderId,
|
||
"operateTime": utils.GetCurTimeStr(),
|
||
}
|
||
_, err = a.AccessAPINoPage("order/confirmReceiveGoods", jdParams, nil, nil, nullResultParser)
|
||
return err
|
||
}
|
||
|
||
// 申请售后单审核接口
|
||
// https://openo2o.jddj.com/staticnew/widgets/resources.html?groupid=170&apiid=1690f6efc0144d59823b236e0d8506a1
|
||
func (a *API) AfsOpenApprove(afsOrderID string, afsApproveType int, rejectReason string, optPin string) (err error) {
|
||
jdParams := map[string]interface{}{
|
||
"serviceOrder": afsOrderID,
|
||
"approveType": afsApproveType,
|
||
"optPin": optPin,
|
||
}
|
||
if rejectReason != "" {
|
||
jdParams["rejectReason"] = rejectReason
|
||
}
|
||
_, err = a.AccessAPINoPage("afs/afsOpenApprove", jdParams, nil, nil, nullResultParser)
|
||
return err
|
||
}
|
||
|
||
// 售后单确认收货接口
|
||
// https://openo2o.jddj.com/staticnew/widgets/resources.html?groupid=170&apiid=4826086e81934405980ae26f80d956e0
|
||
func (a *API) ConfirmReceipt(afsOrderID, pin string) (err error) {
|
||
jdParams := map[string]interface{}{
|
||
"serviceOrder": afsOrderID,
|
||
"pin": pin,
|
||
}
|
||
_, err = a.AccessAPINoPage("afs/confirmReceipt", jdParams, nil, nil, nullResultParser)
|
||
return err
|
||
}
|
||
|
||
// 商家自主发起售后接口
|
||
// https://openo2o.jddj.com/staticnew/widgets/resources.html?groupid=170&apiid=b8d1ddacb03846a8a2e78c79723c752f
|
||
func (a *API) AfsSubmit(OrderID, pin, questionTypeCode, questionDesc, questionPic, customerName, customerMobilePhone, address string, skuList []*VenderAfsSkuDTO) (afsOrderID string, err error) {
|
||
jdParams := map[string]interface{}{
|
||
"orderId": OrderID,
|
||
"pin": pin,
|
||
"questionTypeCode": questionTypeCode,
|
||
}
|
||
if questionDesc != "" {
|
||
jdParams["questionDesc"] = questionDesc
|
||
}
|
||
if questionPic != "" {
|
||
jdParams["questionPic"] = questionPic
|
||
}
|
||
if customerName != "" {
|
||
jdParams["customerName"] = customerName
|
||
}
|
||
if customerMobilePhone != "" {
|
||
jdParams["customerMobilePhone"] = customerMobilePhone
|
||
}
|
||
if address != "" {
|
||
jdParams["address"] = address
|
||
}
|
||
result, err := a.AccessAPINoPage("afs/submit", jdParams, nil, nil, genNoPageResultParser("code", "msg", "result", "0"))
|
||
if err == nil {
|
||
afsOrderID = utils.Interface2String(result.(map[string]interface{})["serviceOrder"])
|
||
}
|
||
return afsOrderID, err
|
||
}
|