+ RefundOrder, PartRefundOrder
This commit is contained in:
@@ -883,22 +883,6 @@ func (c *OrderManager) GetAfsOrders(ctx *jxcontext.Context, keyword, afsOrderID,
|
||||
return pagedInfo, err
|
||||
}
|
||||
|
||||
func (c *OrderManager) GetAfsOrderSkuInfo(ctx *jxcontext.Context, afsOrderID string, vendorID int) (skus []*model.OrderFinancialSkuExt, err error) {
|
||||
sql := `
|
||||
SELECT t1.*, t3.img image
|
||||
FROM order_sku_financial t1
|
||||
JOIN sku t2 ON t2.id = IF(t1.jx_sku_id <> 0, t1.jx_sku_id, t1.sku_id)
|
||||
JOIN sku_name t3 ON t3.id = t2.name_id
|
||||
WHERE t1.is_afs_order = 1 AND t1.afs_order_id = ? AND t1.vendor_id = ?
|
||||
`
|
||||
sqlParams := []interface{}{
|
||||
afsOrderID,
|
||||
vendorID,
|
||||
}
|
||||
err = dao.GetRows(dao.GetDB(), &skus, sql, sqlParams...)
|
||||
return skus, err
|
||||
}
|
||||
|
||||
func (c *OrderManager) getAfsOrderSkuInfo4ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateStr string) (skuMap map[string]map[int]*model.OrderSkuFinancial, err error) {
|
||||
fromDate, err2 := utils.TryStr2Time(fromDateStr)
|
||||
if err = err2; err != nil {
|
||||
|
||||
@@ -229,3 +229,17 @@ func (c *BaseScheduler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, afsOr
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
|
||||
if c.IsReallyCallPlatformAPI {
|
||||
err = partner.GetPurchasePlatformFromVendorID(order.VendorID).PartRefundOrder(ctx, order, refundSkuList, reason)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (c *BaseScheduler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||
if c.IsReallyCallPlatformAPI {
|
||||
err = partner.GetPurchasePlatformFromVendorID(order.VendorID).RefundOrder(ctx, order, reason)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -161,3 +161,30 @@ func GetStoresOrderSaleInfo(db *DaoDB, storeIDList []int, fromTime time.Time, to
|
||||
err = GetRows(db, &saleInfoList, sql, sqlParams...)
|
||||
return saleInfoList, err
|
||||
}
|
||||
|
||||
func GetAfsOrderSkuInfo(db *DaoDB, vendorOrderID, afsOrderID string, vendorID int) (skus []*model.OrderFinancialSkuExt, err error) {
|
||||
if vendorOrderID == "" && afsOrderID == "" {
|
||||
return nil, fmt.Errorf("必须指定订单或售后单ID")
|
||||
}
|
||||
sql := `
|
||||
SELECT t1.*, t3.img image
|
||||
FROM order_sku_financial t1
|
||||
LEFT JOIN sku t2 ON t2.id = IF(t1.jx_sku_id <> 0, t1.jx_sku_id, t1.sku_id)
|
||||
LEFT JOIN sku_name t3 ON t3.id = t2.name_id
|
||||
WHERE t1.is_afs_order = 1 AND t1.vendor_id = ?`
|
||||
sqlParams := []interface{}{
|
||||
vendorID,
|
||||
}
|
||||
|
||||
if vendorOrderID != "" {
|
||||
sql += " AND t1.vendor_order_id = ?"
|
||||
sqlParams = append(sqlParams, vendorOrderID)
|
||||
}
|
||||
if afsOrderID != "" {
|
||||
sql += " AND t1.afs_order_id = ?"
|
||||
sqlParams = append(sqlParams, afsOrderID)
|
||||
}
|
||||
|
||||
err = GetRows(db, &skus, sql, sqlParams...)
|
||||
return skus, err
|
||||
}
|
||||
|
||||
25
business/model/dao/dao_order_test.go
Normal file
25
business/model/dao/dao_order_test.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package dao
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-callback/globals"
|
||||
)
|
||||
|
||||
func TestGetAfsOrderSkuInfo(t *testing.T) {
|
||||
afsSkus, err := GetAfsOrderSkuInfo(GetDB(), "", "", 0)
|
||||
if err == nil {
|
||||
t.Fatal("应该要报错")
|
||||
}
|
||||
afsSkus, err = GetAfsOrderSkuInfo(GetDB(), "", "23148482", 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
globals.SugarLogger.Debug(utils.Format4Output(afsSkus, false))
|
||||
afsSkus, err = GetAfsOrderSkuInfo(GetDB(), "916829559000841", "", 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
globals.SugarLogger.Debug(utils.Format4Output(afsSkus, false))
|
||||
}
|
||||
@@ -83,7 +83,7 @@ type OrderSku struct {
|
||||
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
|
||||
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||
StoreSubID int `orm:"column(store_sub_id)" json:"storeSubID"`
|
||||
StoreSubName string `orm:"size(64)" json:"storeSubName"`
|
||||
StoreSubName string `orm:"size(64)" json:"storeSubName"` // 当前这个字段被用作vendorActType
|
||||
Count int `json:"count"`
|
||||
VendorSkuID string `orm:"column(vendor_sku_id);size(48)" json:"vendorSkuID"`
|
||||
SkuID int `orm:"column(sku_id)" json:"skuID"` // 外部系统里记录的 jxskuid
|
||||
|
||||
@@ -208,10 +208,10 @@ type IPurchasePlatformHandler interface {
|
||||
AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error)
|
||||
|
||||
// 售后
|
||||
// // 发起全款退款
|
||||
// RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error)
|
||||
// // 发起部分退款
|
||||
// PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error)
|
||||
// 发起全款退款
|
||||
RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error)
|
||||
// 发起部分退款
|
||||
PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error)
|
||||
// 审核售后单申请
|
||||
AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error)
|
||||
// // 确认收到退货
|
||||
|
||||
@@ -187,3 +187,13 @@ func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, ord
|
||||
err = fmt.Errorf("内部错误,饿百平台不支持确认收到退货操作")
|
||||
return err
|
||||
}
|
||||
|
||||
// 发起全款退款
|
||||
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||
return fmt.Errorf("饿百不支持全款退款")
|
||||
}
|
||||
|
||||
// 发起部分退款
|
||||
func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
|
||||
return fmt.Errorf("饿百不支持部分退款")
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package elm
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
)
|
||||
@@ -14,3 +16,13 @@ func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *mod
|
||||
func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
// 发起全款退款
|
||||
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||
return fmt.Errorf("饿了么不支持全款退款")
|
||||
}
|
||||
|
||||
// 发起部分退款
|
||||
func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
|
||||
return fmt.Errorf("饿了么不支持部分退款")
|
||||
}
|
||||
|
||||
@@ -191,3 +191,31 @@ func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, ord
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func orderSkus2AfsSkus(refundSkuList []*model.OrderSku) (list []*jdapi.VenderAfsSkuDTO) {
|
||||
for _, v := range refundSkuList {
|
||||
actType := int(utils.Str2Int64WithDefault(v.StoreSubName, 0))
|
||||
if !(actType == jdapi.PromotionTypeOverflowGiveGift || actType == jdapi.PromotionTypeBuyGiveGift) {
|
||||
actType = 1
|
||||
}
|
||||
list = append(list, &jdapi.VenderAfsSkuDTO{
|
||||
SkuID: utils.Str2Int64(v.VendorSkuID),
|
||||
SkuCount: v.Count,
|
||||
PromotionType: actType,
|
||||
})
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
// 发起全款退款
|
||||
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||
return c.PartRefundOrder(ctx, order, order.Skus, reason)
|
||||
}
|
||||
|
||||
// 发起部分退款
|
||||
func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
|
||||
if globals.EnableJdStoreWrite {
|
||||
_, err = api.JdAPI.AfsSubmit(order.VendorOrderID, ctx.GetUserName(), utils.Int2Str(jdapi.AfsReasonTypeAgreedByMerchant), reason, "", order.ConsigneeName, order.ConsigneeMobile, order.ConsigneeAddress, orderSkus2AfsSkus(refundSkuList))
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -156,3 +156,13 @@ func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, ord
|
||||
err = fmt.Errorf("内部错误,美团外卖平台不支持确认收到退货操作")
|
||||
return err
|
||||
}
|
||||
|
||||
// 发起全款退款
|
||||
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||
return c.CancelOrder(ctx, order, reason)
|
||||
}
|
||||
|
||||
// 发起部分退款
|
||||
func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
|
||||
return c.AdjustOrder(ctx, order, refundSkuList, reason)
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package wsc
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||
"git.rosy.net.cn/jx-callback/business/model"
|
||||
)
|
||||
@@ -14,3 +16,13 @@ func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *mod
|
||||
func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
// 发起全款退款
|
||||
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||
return fmt.Errorf("微商城不支持全款退款")
|
||||
}
|
||||
|
||||
// 发起部分退款
|
||||
func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
|
||||
return fmt.Errorf("微商城不支持部分退款")
|
||||
}
|
||||
|
||||
@@ -342,16 +342,17 @@ func (c *OrderController) GetAfsOrders() {
|
||||
}
|
||||
|
||||
// @Title 得到售后单SKU信息
|
||||
// @Description 得到售后单SKU信息
|
||||
// @Description 得到售后单SKU信息(订单与售后单必填一项)
|
||||
// @Param token header string true "认证token"
|
||||
// @Param afsOrderID query string true "售后单ID"
|
||||
// @Param vendorID query int true "售后单所属的厂商ID"
|
||||
// @Param vendorOrderID query string faslse "订单ID"
|
||||
// @Param afsOrderID query string faslse "售后单ID"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /GetAfsOrderSkuInfo [get]
|
||||
func (c *OrderController) GetAfsOrderSkuInfo() {
|
||||
c.callGetAfsOrderSkuInfo(func(params *tOrderGetAfsOrderSkuInfoParams) (retVal interface{}, errCode string, err error) {
|
||||
retVal, err = orderman.FixedOrderManager.GetAfsOrderSkuInfo(params.Ctx, params.AfsOrderID, params.VendorID)
|
||||
retVal, err = dao.GetAfsOrderSkuInfo(dao.GetDB(), params.VendorOrderID, params.AfsOrderID, params.VendorID)
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
@@ -535,24 +536,7 @@ func (c *OrderController) AdjustOrder() {
|
||||
var order *model.GoodsOrder
|
||||
order, err = partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID)
|
||||
if err == nil {
|
||||
orderSkuMap := skuList2Map(order.Skus)
|
||||
removeSkuMap := skuList2Map(skuList)
|
||||
for _, sku := range removeSkuMap {
|
||||
skuID := jxutils.GetSkuIDFromOrderSku(sku)
|
||||
if orderSkuMap[skuID] == nil {
|
||||
err = fmt.Errorf("找不到SKU:%d", skuID)
|
||||
} else if sku.Count > orderSkuMap[skuID].Count {
|
||||
err = fmt.Errorf("SKU:%d调整数量:%d大于实际数量:%d", skuID, sku.Count, orderSkuMap[skuID].Count)
|
||||
}
|
||||
if err != nil {
|
||||
break
|
||||
} else {
|
||||
count := sku.Count
|
||||
*sku = *orderSkuMap[skuID]
|
||||
sku.Count = count
|
||||
}
|
||||
}
|
||||
if err == nil {
|
||||
if err = fillSkuList(skuList, order.Skus); err == nil {
|
||||
err = defsch.FixedScheduler.AdjustOrder(params.Ctx, order, skuList, params.Reason)
|
||||
}
|
||||
}
|
||||
@@ -730,3 +714,89 @@ func (c *OrderController) AmendMissingOrders() {
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
// @Title 商家主动发起部分退款售后
|
||||
// @Description 商家主动发起部分退款售后
|
||||
// @Param token header string true "认证token"
|
||||
// @Param vendorOrderID formData string true "订单ID"
|
||||
// @Param vendorID formData int true "订单所属厂商ID"
|
||||
// @Param refundSkuList formData string true "要去除的商品信息,只有skuID与Count字段有效"
|
||||
// @Param reason formData string true "原因"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /PartRefundOrder [put]
|
||||
func (c *OrderController) PartRefundOrder() {
|
||||
c.callPartRefundOrder(func(params *tOrderPartRefundOrderParams) (retVal interface{}, errCode string, err error) {
|
||||
var skuList []*model.OrderSku
|
||||
err = jxutils.Strings2Objs(params.RefundSkuList, &skuList)
|
||||
if err == nil {
|
||||
var order *model.GoodsOrder
|
||||
order, err = partner.CurOrderManager.LoadOrder(params.VendorOrderID, params.VendorID)
|
||||
if err == nil {
|
||||
if err = fillSkuList(skuList, order.Skus); err == nil {
|
||||
err = defsch.FixedScheduler.PartRefundOrder(params.Ctx, order, skuList, params.Reason)
|
||||
}
|
||||
}
|
||||
}
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
func fillSkuList(skuList, orderSkuList []*model.OrderSku) (err error) {
|
||||
orderSkuMap := skuList2Map(orderSkuList)
|
||||
removeSkuMap := skuList2Map(skuList)
|
||||
for _, sku := range removeSkuMap {
|
||||
skuID := jxutils.GetSkuIDFromOrderSku(sku)
|
||||
if orderSkuMap[skuID] == nil {
|
||||
err = fmt.Errorf("找不到SKU:%d", skuID)
|
||||
} else if sku.Count > orderSkuMap[skuID].Count {
|
||||
err = fmt.Errorf("SKU:%d调整数量:%d大于实际数量:%d", skuID, sku.Count, orderSkuMap[skuID].Count)
|
||||
}
|
||||
if err != nil {
|
||||
break
|
||||
} else {
|
||||
count := sku.Count
|
||||
*sku = *orderSkuMap[skuID]
|
||||
sku.Count = count
|
||||
}
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// @Title 商家主动发起全额退款售后
|
||||
// @Description 商家主动发起全额退款售后
|
||||
// @Param token header string true "认证token"
|
||||
// @Param vendorOrderID formData string true "订单ID"
|
||||
// @Param vendorID formData int true "订单所属厂商ID"
|
||||
// @Param reason formData string false "退款原因"
|
||||
// @Success 200 {object} controllers.CallResult
|
||||
// @Failure 200 {object} controllers.CallResult
|
||||
// @router /RefundOrder [put]
|
||||
func (c *OrderController) RefundOrder() {
|
||||
c.callRefundOrder(func(params *tOrderRefundOrderParams) (retVal interface{}, errCode string, err error) {
|
||||
order, err := orderman.FixedOrderManager.LoadOrder(params.VendorOrderID, params.VendorID)
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
afsSkuList, err := dao.GetAfsOrderSkuInfo(dao.GetDB(), params.VendorOrderID, "", params.VendorID)
|
||||
if err != nil {
|
||||
return nil, "", err
|
||||
}
|
||||
order = jxutils.RemoveSkuFromOrder(order, afsSkus2OrderSkus(afsSkuList))
|
||||
err = defsch.FixedScheduler.RefundOrder(params.Ctx, order, params.Reason)
|
||||
return retVal, "", err
|
||||
})
|
||||
}
|
||||
|
||||
func afsSkus2OrderSkus(afsSkuList []*model.OrderFinancialSkuExt) (skuList []*model.OrderSku) {
|
||||
for _, v := range afsSkuList {
|
||||
if v.IsAfsOrder == 1 {
|
||||
skuList = append(skuList, &model.OrderSku{
|
||||
SkuID: v.SkuID,
|
||||
VendorSkuID: v.VendorSkuID,
|
||||
Count: v.Count,
|
||||
})
|
||||
}
|
||||
}
|
||||
return skuList
|
||||
}
|
||||
|
||||
@@ -898,6 +898,15 @@ func init() {
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"],
|
||||
beego.ControllerComments{
|
||||
Method: "PartRefundOrder",
|
||||
Router: `/PartRefundOrder`,
|
||||
AllowHTTPMethods: []string{"put"},
|
||||
MethodParams: param.Make(),
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"],
|
||||
beego.ControllerComments{
|
||||
Method: "PrintOrder",
|
||||
@@ -934,6 +943,15 @@ func init() {
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"],
|
||||
beego.ControllerComments{
|
||||
Method: "RefundOrder",
|
||||
Router: `/RefundOrder`,
|
||||
AllowHTTPMethods: []string{"put"},
|
||||
MethodParams: param.Make(),
|
||||
Filters: nil,
|
||||
Params: nil})
|
||||
|
||||
beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"],
|
||||
beego.ControllerComments{
|
||||
Method: "SelfDelivered",
|
||||
|
||||
Reference in New Issue
Block a user