- jd afs api

This commit is contained in:
gazebo
2019-05-06 15:51:19 +08:00
parent 2e0b9206b8
commit 3668b8cf89
4 changed files with 234 additions and 6 deletions

View File

@@ -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
}

View File

@@ -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))
}

44
utils/java_date.go Normal file
View File

@@ -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)
}

38
utils/java_date_test.go Normal file
View File

@@ -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))
}