package jdapi import ( "errors" "strings" "git.rosy.net.cn/baseapi/utils" ) const ( AfsPicPrefix = "http://img10.360buyimg.com/o2o" ) 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 // 驳回 ) const ( AfsReasonTypeGoodsQuality = 201 // 商品质量问题/做工粗糙/有瑕疵 AfsReasonTypeWrongGoods = 202 // 发错货 AfsReasonTypeMissingGoods = 203 // 部分商品未收到 AfsReasonTypeNoGoods = 501 // 全部商品未收到 AfsReasonTypeDamagedGoods = 208 // 外表损伤(压坏,磕坏等) AfsReasonTypeGoodsQuantity = 207 // 缺斤少两 AfsReasonTypeAgreedByMerchant = 209 // 与商家协商一致 AfsReasonTypeGoodsSizeNoSame = 302 // 大小尺寸与商品描述不符 AfsReasonTypeGoodsColorNoSame = 303 // 颜色/款式/图案与描述不符 AfsReasonWrongPurchase = 402 // 误购 AfsReasonNotReceivedIntime = 502 // 未在时效内送达 ) const ( AfsDealTypeRefund = "10" // 仅退款 AfsDealTypeDirectCompensate = "30" // 直赔 AfsDealTypeReturnGoodsRefund = "40" // 退货退款 ) 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"` WareID int64 `json:"wareId"` WareName string `json:"wareName"` WareNum int `json:"wareNum"` AfsMoney int64 `json:"afsMoney"` PlatPayMoney int64 `json:"platPayMoney"` AfsSkuDiscountList []*AfsSkuDiscount `json:"afsSkuDiscountList"` } type AfsServiceResponse struct { AfsServiceID int64 `json:"afsServiceId"` AfsServiceOrder string `json:"afsServiceOrder"` AfsServiceState int `json:"afsServiceState"` CreateTime *utils.JavaDate `json:"createTime"` UpdateTime *utils.JavaDate `json:"updateTime"` 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"` OrderFreightMoney int64 `json:"orderFreightMoney"` AfsFreight int64 `json:"afsFreight"` PackagingMoney int64 `json:"packagingMoney"` TongchengFreightMoney int64 `json:"tongchengFreightMoney"` MealBoxMoney int64 `json:"mealBoxMoney"` QuestionDesc string `json:"questionDesc"` QuestionPic string `json:"questionPic"` QuestionTypeCid int `json:"questionTypeCid"` ApplyDeal string `json:"applyDeal"` DeliveryState string `json:"deliveryState"` DeliveryMan string `json:"deliveryMan"` DeliveryMobile string `json:"deliveryMobile"` 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 } func ProcessQuestionPic(questionPic string) (outQuestionPic string) { if questionPic != "" { picList := strings.Split(questionPic, ",") picList2 := make([]string, len(picList)) for index, pic := range picList { picList2[index] = AfsPicPrefix + "/" + pic } outQuestionPic = strings.Join(picList2, ",") } return outQuestionPic }