|
|
|
|
package order
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"git.oa00.com/go/jdsdk/address"
|
|
|
|
|
"git.oa00.com/go/jdsdk/config"
|
|
|
|
|
"git.oa00.com/go/jdsdk/request"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type AfterSale struct {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
afterSaleIsCan = "jingdong.ctp.afs.operate.apply.getIsCanApplyInfo"
|
|
|
|
|
afterSaleReason = "jingdong.ctp.afs.operate.apply.getApplyReason"
|
|
|
|
|
afterSaleApply = "jingdong.ctp.afs.operate.apply.createAfsApply"
|
|
|
|
|
afterSaleLogisticsAddress = "jingdong.ctp.afs.logistics.getLogisticsAddress"
|
|
|
|
|
afterSaleDelivery = "jingdong.ctp.afs.logistics.postBackLogisticsBillParam"
|
|
|
|
|
afterSaleInfo = "jingdong.ctp.afs.servicenbill.getAfsServiceDetail"
|
|
|
|
|
afterSaleCancel = "jingdong.ctp.afs.servicenbill.cancelAfsService"
|
|
|
|
|
|
|
|
|
|
AfterServiceCanApplyFalse = 0 // 不可申请
|
|
|
|
|
AfterServiceCanApplyTrue = 1 // 可申请
|
|
|
|
|
|
|
|
|
|
AfterServiceAfsDetailTypeMaster = 10 // 主品
|
|
|
|
|
AfterServiceAfsDetailTypeSlave = 20 // 赠品
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type canApplyInfoParam struct {
|
|
|
|
|
Pin string `json:"pin"` // 下单账号
|
|
|
|
|
SkuId uint64 `json:"skuId"` // skuId
|
|
|
|
|
OrderId uint64 `json:"orderId"` // 订单号
|
|
|
|
|
//AfsDetailType uint `json:"afsDetailType"` // 商品类型 10=主品 20=赠品
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type resIsCanInfo struct {
|
|
|
|
|
CanApply uint `json:"canApply"` // 是否可申请售后 0=不可申请 1=可申请
|
|
|
|
|
SkuId uint64 `json:"skuId"` // skuId
|
|
|
|
|
AppliedNum uint `json:"appliedNum"` // 已申请售后商品数量
|
|
|
|
|
CannotApplyTip string `json:"cannotApplyTip"` // 不可申请原因
|
|
|
|
|
OrderId uint64 `json:"orderId"` // 订单号
|
|
|
|
|
AfsSupportedTypes []AfterSaleTypeItem `json:"afsSupportedTypes"` // 可售后类型列表
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type AfterSaleTypeItem struct {
|
|
|
|
|
AfsTypeName string `json:"afsTypeName"` // 售后名称
|
|
|
|
|
AfsType uint `json:"afsType"` // 售后类型
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsCan @Title 是否能售后
|
|
|
|
|
func (a *AfterSale) IsCan(skuId, orderId uint64) (result resIsCanInfo, err error) {
|
|
|
|
|
err = request.ExecCtlProtocol(afterSaleIsCan, canApplyInfoParam{
|
|
|
|
|
Pin: config.SdkConfig.Pin,
|
|
|
|
|
SkuId: skuId,
|
|
|
|
|
OrderId: orderId,
|
|
|
|
|
}, &result)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type applyReasonParam struct {
|
|
|
|
|
Pin string `json:"pin"` // 账号
|
|
|
|
|
SkuId uint64 `json:"skuId"` // skuId
|
|
|
|
|
AfsType uint `json:"afsType"` // 售后类型 10=退货 20=换货
|
|
|
|
|
OrderId uint64 `json:"orderId"` // 订单号
|
|
|
|
|
//AfsDetailType uint `json:"afsDetailType"` // 商品类型 10=主品 20=赠品
|
|
|
|
|
}
|
|
|
|
|
type reasonItem struct {
|
|
|
|
|
ApplyReasonName string `json:"applyReasonName"` // 售后原因
|
|
|
|
|
ApplyReasonId uint `json:"applyReasonId"` // 售后Id
|
|
|
|
|
NeedUploadPic bool `json:"needUploadPic"` // 是否必须传图
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Reason @Title 售后原因
|
|
|
|
|
func (a *AfterSale) Reason(skuId, orderId uint64, AfsType uint) (result []reasonItem, err error) {
|
|
|
|
|
err = request.ExecCtlProtocol(afterSaleReason, applyReasonParam{
|
|
|
|
|
Pin: config.SdkConfig.Pin,
|
|
|
|
|
SkuId: skuId,
|
|
|
|
|
OrderId: orderId,
|
|
|
|
|
AfsType: AfsType,
|
|
|
|
|
}, &result)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type afsApplyParam struct {
|
|
|
|
|
Pin string `json:"pin"` // 下单账号
|
|
|
|
|
PickWareType uint `json:"pickWareType"` // 取件方式 40=客户发货 固定
|
|
|
|
|
PickWareAddress address.Address `json:"pickWareAddress"` // 取件地址
|
|
|
|
|
ApplyParam
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ApplyParam struct {
|
|
|
|
|
ApplyReasonName string `json:"applyReasonName"` // 售后原因
|
|
|
|
|
ApplyReasonId uint `json:"applyReasonId"` // 售后原因id
|
|
|
|
|
ChannelAfsApplyId string `json:"channelAfsApplyId"` // 渠道售后申请单号
|
|
|
|
|
AfsType uint `json:"afsType"` // 期望售后类型 10=退货 20=换货
|
|
|
|
|
QuestionPic string `json:"questionPic"` // 问题图片 逗号分隔
|
|
|
|
|
OrderId uint `json:"orderId"` // 订单号
|
|
|
|
|
SkuQuantity AfterSaleSkuItem `json:"skuQuantity"` // 申请商品信息
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type AfterSaleSkuItem struct {
|
|
|
|
|
SkuId uint64 `json:"skuId"` // skuId
|
|
|
|
|
SkuName string `json:"skuName"` // skuName
|
|
|
|
|
Quantity uint `json:"quantity"` // 数量
|
|
|
|
|
AfsDetailType uint `json:"afsDetailType"` // 商品类型 10=主品 20=赠品
|
|
|
|
|
}
|
|
|
|
|
type resApply struct {
|
|
|
|
|
ChannelAfsApplyId string `json:"channelAfsApplyId"` // 渠道申请单号
|
|
|
|
|
AfsApplyId uint64 `json:"afsApplyId"` // 京东申请单号
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Apply @Title 售后申请
|
|
|
|
|
func (a *AfterSale) Apply(data ApplyParam) (result resApply, err error) {
|
|
|
|
|
err = request.ExecCtlProtocol(afterSaleApply, afsApplyParam{
|
|
|
|
|
Pin: config.SdkConfig.Pin,
|
|
|
|
|
PickWareType: 40,
|
|
|
|
|
ApplyParam: data,
|
|
|
|
|
}, &result)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type logisticsAddressParam struct {
|
|
|
|
|
AfsServiceId uint64 `json:"afsServiceId"` // 售后id
|
|
|
|
|
Pin string `json:"pin"` // 下单账号
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type resLogisticsAddress struct {
|
|
|
|
|
ContactsMobile string `json:"contactsMobile"` // 回寄手机号
|
|
|
|
|
ContactsZipCode string `json:"contactsZipCode"` // 回寄邮编
|
|
|
|
|
Address string `json:"address"` // 回寄详细地址
|
|
|
|
|
ContactsName string `json:"contactsName"` // 回寄联系人
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// LogisticsAddress @Title 回寄地址
|
|
|
|
|
func (a *AfterSale) LogisticsAddress(afsServiceId uint64) (result resLogisticsAddress, err error) {
|
|
|
|
|
err = request.ExecCtlProtocol(afterSaleLogisticsAddress, logisticsAddressParam{
|
|
|
|
|
AfsServiceId: afsServiceId,
|
|
|
|
|
Pin: config.SdkConfig.Pin,
|
|
|
|
|
}, &result)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type logisticsBillParam struct {
|
|
|
|
|
Pin string `json:"pin"` // 下单账号
|
|
|
|
|
AfsServiceId uint64 `json:"afsServiceId"` // 售后id
|
|
|
|
|
LogisticsCompany string `json:"logisticsCompany"` // 物流公司
|
|
|
|
|
WaybillCode string `json:"waybillCode"` // 运单号
|
|
|
|
|
SendGoodsDate string `json:"sendGoodsDate"` // 运单发货日期 Y-m-d
|
|
|
|
|
}
|
|
|
|
|
type resDelivery struct {
|
|
|
|
|
Message string `json:"message"` // 回传结果描述
|
|
|
|
|
PostBackResult bool `json:"postBackResult"` // 回传结果
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Delivery @Title 回传客户发货信息
|
|
|
|
|
func (a *AfterSale) Delivery(afsServiceId uint64, logisticsCompany, waybillCode, sendGoodsDate string) (result resDelivery, err error) {
|
|
|
|
|
err = request.ExecCtlProtocol(afterSaleDelivery, logisticsBillParam{
|
|
|
|
|
Pin: config.SdkConfig.Pin,
|
|
|
|
|
AfsServiceId: afsServiceId,
|
|
|
|
|
LogisticsCompany: logisticsCompany,
|
|
|
|
|
WaybillCode: waybillCode,
|
|
|
|
|
SendGoodsDate: sendGoodsDate,
|
|
|
|
|
}, &result)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type afsServiceDetailParam struct {
|
|
|
|
|
AfsServiceId uint64 `json:"afsServiceId"` // 售后id
|
|
|
|
|
Pin string `json:"pin"` // 下单账号
|
|
|
|
|
}
|
|
|
|
|
type AfterSaleInfo struct {
|
|
|
|
|
ProcessResult uint `json:"processResult"` // 处理结果
|
|
|
|
|
CustomerName string `json:"customerName"` // 客户名称
|
|
|
|
|
ApplyReasonId uint `json:"applyReasonId"` // 售后原因id
|
|
|
|
|
ApplyReasonName string `json:"applyReasonName"` // 售后原因
|
|
|
|
|
ApproveResult uint `json:"approveResult"` // 审核结果
|
|
|
|
|
AfsApplyTime int64 `json:"afsApplyTime"` // 发起售后申请时间 Y-m-d H:i:s
|
|
|
|
|
ApproveResultName string `json:"approveResultName"` // 审核结果
|
|
|
|
|
ProcessResultName string `json:"processResultName"` // 处理结果
|
|
|
|
|
AfsType uint `json:"afsType"` // 售后服务类型id退货(10),换货(20)
|
|
|
|
|
ReturnWareType uint `json:"returnWareType"` // 售后返件类型 1:客户发货
|
|
|
|
|
CustomerMobile string `json:"customerMobile"` // 售后联系人联系方式
|
|
|
|
|
QuestionPic string `json:"questionPic"` // 售后描述图片
|
|
|
|
|
ApproveNotes string `json:"approveNotes"` // 售后服务单审核意见
|
|
|
|
|
ApprovedDate int64 `json:"approvedDate"` // 售后服务单审核时间 Y-m-d H:i:s
|
|
|
|
|
CustomerEmail string `json:"customerEmail"` // 售后联系人邮箱
|
|
|
|
|
ProcessedDate string `json:"processedDate"` // 售后服务单处理时间 Y-m-d H:i:s
|
|
|
|
|
AfsApplyId uint64 `json:"afsApplyId"` // 售后申请单号
|
|
|
|
|
AfsTypeName string `json:"afsTypeName"` // 用户期望的售后服务类型 1:退货 2:换货
|
|
|
|
|
AfsServiceState uint `json:"afsServiceState"` // 服务单状态
|
|
|
|
|
AfsServiceId uint64 `json:"afsServiceId"` // 京东售后服务单号
|
|
|
|
|
NewOrderId uint64 `json:"newOrderId"` // 售后换新订单号
|
|
|
|
|
AfsServiceStep uint `json:"afsServiceStep"` // 处理环节
|
|
|
|
|
AfsServiceStateName string `json:"afsServiceStateName"` // 售后处理状态
|
|
|
|
|
ProcessNotes string `json:"processNotes"` // 售后处理意见
|
|
|
|
|
AfsServiceStepName string `json:"afsServiceStepName"` // 售后当前处理环节
|
|
|
|
|
OrderId string `json:"orderId"` // 订单号
|
|
|
|
|
SkuQuantity skuItem `json:"skuQuantity"` // sku信息
|
|
|
|
|
DesenCustomerMobile string `json:"desen_customerMobile"` // 售后联系人联系方式
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type skuItem struct {
|
|
|
|
|
SkuId string `json:"skuId"` // skuId
|
|
|
|
|
SkuName string `json:"skuName"` // skuName
|
|
|
|
|
Quantity uint `json:"quantity"` // 数量
|
|
|
|
|
ValidNumFlag uint `json:"validNumFlag"` // 赠品申请标识 1代表申请了,0代表没申请或释放了,后续可以继续申请
|
|
|
|
|
SkuType uint `json:"skuType"` // 标识商品属性 1单品、2买赠:赠品套装中的主商品、3买赠:赠品套装中的赠品
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Info @Title 售后详情
|
|
|
|
|
func (a *AfterSale) Info(afsServiceId uint64) (result AfterSaleInfo, err error) {
|
|
|
|
|
err = request.ExecCtlProtocol(afterSaleInfo, afsServiceDetailParam{
|
|
|
|
|
AfsServiceId: afsServiceId,
|
|
|
|
|
Pin: config.SdkConfig.Pin,
|
|
|
|
|
}, &result)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type cancelAfsServiceParam struct {
|
|
|
|
|
AfsServiceId uint64 `json:"afsServiceId"` // 售后id
|
|
|
|
|
Pin string `json:"pin"` // 下单账号
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type resCancel struct {
|
|
|
|
|
CancelState uint `json:"cancelState"` // 1=不可取消 2=取消成功 3=取消失败
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Cancel @Title 取消售后服务单
|
|
|
|
|
func (a *AfterSale) Cancel(afsServiceId uint64) (result resCancel, err error) {
|
|
|
|
|
err = request.ExecCtlProtocol(afterSaleCancel, cancelAfsServiceParam{
|
|
|
|
|
AfsServiceId: afsServiceId,
|
|
|
|
|
Pin: config.SdkConfig.Pin,
|
|
|
|
|
}, &result)
|
|
|
|
|
return
|
|
|
|
|
}
|