From 3668b8cf89712151cc1edd5e9eec20e05f8d17a2 Mon Sep 17 00:00:00 2001 From: gazebo Date: Mon, 6 May 2019 15:51:19 +0800 Subject: [PATCH] - jd afs api --- platformapi/jdapi/order.go | 150 ++++++++++++++++++++++++++++++-- platformapi/jdapi/order_test.go | 8 ++ utils/java_date.go | 44 ++++++++++ utils/java_date_test.go | 38 ++++++++ 4 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 utils/java_date.go create mode 100644 utils/java_date_test.go diff --git a/platformapi/jdapi/order.go b/platformapi/jdapi/order.go index 3b69aa6a..2681a47f 100644 --- a/platformapi/jdapi/order.go +++ b/platformapi/jdapi/order.go @@ -71,6 +71,84 @@ const ( QueryOrderRetryCount = 1 // 因为京东到家当前不存在的订单也返回-4,暂时不重试 ) +const ( + AfsApproveTypeRefund = 1 // 退款 + AfsApproveTypeReturnGoods = 2 // 退货 + AfsApproveTypeRefused = 3 // 驳回 +) + +const ( + AfsServiceStateWaiting4Audit = 10 // 待审核 + AfsServiceStateWaiting4GetGoods = 20 // 待取件 + AfsServiceStateRefundProcessing = 30 // 退款处理中 + AfsServiceStateWaiting4MerchantReceiveGoods = 31 // 待商家收货审核 + AfsServiceStateRefundSuccess = 32 // 退款成功 + AfsServiceStateRefundFailed = 33 // 退款失败 + AfsServiceStateAuditRefused = 40 // 审核不通过-驳回 + AfsServiceStateUserCanceled = 50 // 客户取消 + AfsServiceStateMerchantFailedReceiveGoods = 60 // 商家收货审核不通过 + AfsServiceStateSolved = 70 // 已解决 + AfsServiceStateDirectCompensate = 91 // 直赔 + AfsServiceStateDirectCompensateSuccess = 92 // 直赔成功 + AfsServiceStateDirectCompensateFailed = 93 // 直赔失败 + AfsServiceStateWaiting4Compensate = 90 // 待赔付 + AfsServiceStateWaiting4ReturnGoods = 110 // 待退货 + AfsServiceStateGetGoodsSuccess = 111 // 取货成功 + AfsServiceStateGetGoodsWaiting4Refund = 112 // 退货成功-待退款 + AfsServiceStateReturnGoodsFailed = 113 // 退货失败 + AfsServiceStateReturnGoodsSuccess = 114 // 退货成功 +) + +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") ) @@ -79,12 +157,6 @@ var ( orderOperationResultParser = genNoPageResultParser("code", "msg", "detail", "0") ) -type OAOSAdjustDTO struct { - SkuID int64 `json:"skuId,omitempty"` - OutSkuID string `json:"outSkuId,omitempty"` - SkuCount int `json:"skuCount"` -} - // 订单列表查询接口 // 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) { @@ -239,6 +311,14 @@ func (a *API) GetAfsService(orderId string) (map[string]interface{}, error) { 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) { @@ -252,6 +332,8 @@ func (a *API) OrderCancelOperate(orderId string, isAgreed bool, operator, remark 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, @@ -297,3 +379,59 @@ func (a *API) ConfirmReceiveGoods(orderId string) (err error) { _, 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 +} diff --git a/platformapi/jdapi/order_test.go b/platformapi/jdapi/order_test.go index afc20ad4..8d5f7bf0 100644 --- a/platformapi/jdapi/order_test.go +++ b/platformapi/jdapi/order_test.go @@ -193,3 +193,11 @@ func TestDeliveryEndOrder(t *testing.T) { } sugarLogger.Debug(result) } + +func TestGetAfsService(t *testing.T) { + result, err := api.GetAfsService2("22520782") + if err != nil { + t.Fatal(err.Error()) + } + sugarLogger.Debug(utils.Format4Output(result, false)) +} diff --git a/utils/java_date.go b/utils/java_date.go new file mode 100644 index 00000000..518d964e --- /dev/null +++ b/utils/java_date.go @@ -0,0 +1,44 @@ +package utils + +import ( + "time" +) + +type JavaDate struct { + Day time.Weekday `json:"day"` // day of the week + + Hours int `json:"hours"` + Minutes int `json:"minutes"` + Seconds int `json:"seconds"` + Time int64 `json:"time"` + TimezoneOffset int `json:"timezoneOffset"` + + Date int `json:"date"` + Month time.Month `json:"month"` + Year int `json:"year"` +} + +func NewJavaDate() *JavaDate { + return NewJavaDateFromTime(time.Now()) +} + +func NewJavaDateFromTime(tm time.Time) (jd *JavaDate) { + jd = &JavaDate{ + Time: tm.UnixNano() / 1000000, + Day: tm.Weekday(), + Hours: tm.Hour(), + Minutes: tm.Minute(), + Seconds: tm.Second(), + } + jd.Year, jd.Month, jd.Date = tm.Date() + jd.Year -= 1900 + jd.Month-- + _, jd.TimezoneOffset = tm.Zone() + jd.TimezoneOffset /= 60 + jd.TimezoneOffset = -jd.TimezoneOffset + return jd +} + +func (j *JavaDate) GoTime() time.Time { + return Timestamp2Time(j.Time / 1000) +} diff --git a/utils/java_date_test.go b/utils/java_date_test.go new file mode 100644 index 00000000..11773b03 --- /dev/null +++ b/utils/java_date_test.go @@ -0,0 +1,38 @@ +package utils + +import ( + "testing" +) + +func TestJavaDate(t *testing.T) { + var ( + date interface{} + jd *JavaDate + ) + err := UnmarshalUseNumber([]byte(` + { + "date":6, + "day":1, + "hours":9, + "minutes":45, + "month":4, + "seconds":46, + "time":1557107146000, + "timezoneOffset":-480, + "year":119 + } + `), &date) + if err != nil { + t.Fatal(err) + } + err = Map2StructByJson(date, &jd, false) + if err != nil { + t.Fatal(err) + } + t.Log(jd.GoTime()) + t.Log(Format4Output(jd, false)) + + jd = NewJavaDateFromTime(jd.GoTime()) + t.Log(jd.GoTime()) + t.Log(Format4Output(jd, false)) +}