package jx import ( "fmt" "strings" "time" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals/api" "git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" ) // 审核售后单申请 func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) { var status int if approveType == partner.AfsApproveTypeRefused { status = model.AfsOrderStatusFailed } else { status = model.AfsOrderStatusFinished } orderStatus := &model.OrderStatus{ VendorOrderID: order.AfsOrderID, // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中 VendorID: order.VendorID, OrderType: model.OrderTypeAfsOrder, RefVendorOrderID: order.VendorOrderID, RefVendorID: order.VendorID, VendorStatus: utils.Int2Str(status), Status: status, StatusTime: time.Now(), Remark: reason, } if status == model.AfsOrderStatusFinished { orderPays, err := dao.GetOrderPayList(dao.GetDB(), order.VendorOrderID, order.VendorID) if err == nil { _, err = localjx.RefundOrderByTL(ctx, orderPays[0], order.VendorOrderID, int(order.SkuUserMoney), reason) if err != nil { return err } else { partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus) } } } else { partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus) } return err } // 确认收到退货 func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) { err = fmt.Errorf("京西商城当前不支持ConfirmReceivedReturnGoods") return err } // 发起全款退款 func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) { err = c.PartRefundOrder(ctx, order, order.Skus, reason) return err } // 发起部分退款 func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) { globals.SugarLogger.Debugf("PartRefundOrder jx, orderID :%v", order.VendorOrderID) var ( skuMap = make(map[int]*model.OrderSku) appID = "" salePrice int64 db = dao.GetDB() ) if time.Now().Sub(order.OrderCreatedAt) > 24*time.Hour { return fmt.Errorf("已超过售后申请时间,如有疑问请联系门店!") } referer := ctx.GetRequest().Referer() index := strings.Index(referer, "//") if index > 0 { list := strings.Split(referer[index+2:], "/") if len(list) >= 2 { appID = list[1] } } for _, sku := range order.Skus { skuMap[sku.SkuID] = sku } orderStatus := buildOrderStatus(ctx, order, reason, isJxShop(appID)) afsOrder := &model.AfsOrder{ VendorID: order.VendorID, AfsOrderID: orderStatus.VendorOrderID, VendorOrderID: orderStatus.RefVendorOrderID, VendorStoreID: order.VendorStoreID, StoreID: order.StoreID, AfsCreatedAt: time.Now(), VendorAppealType: "", AppealType: model.AfsAppealTypeRefund, VendorReasonType: utils.Int2Str(model.AfsReasonNotOthers), ReasonType: model.AfsReasonNotOthers, ReasonDesc: utils.LimitUTF8StringLen(reason, 1024), ReasonImgList: "", RefundType: model.AfsTypePartRefund, VendorOrgCode: "", } for _, sku := range refundSkuList { orderSku := &model.OrderSkuFinancial{ Count: sku.Count, VendorSkuID: utils.Int2Str(sku.SkuID), SkuID: sku.SkuID, } if skuMap[sku.SkuID] != nil { orderSku.Name = skuMap[sku.SkuID].SkuName orderSku.UserMoney = skuMap[sku.SkuID].SalePrice * int64(sku.Count) salePrice += skuMap[sku.SkuID].SalePrice * int64(sku.Count) } afsOrder.SkuUserMoney += orderSku.UserMoney afsOrder.Skus = append(afsOrder.Skus, orderSku) } if !isJxShop(appID) { orderPays, err := dao.GetOrderPayList(db, order.VendorOrderID, order.VendorID) if err == nil { _, err = localjx.RefundOrderByTL(ctx, orderPays[0], order.VendorOrderID, int(salePrice), reason) if err != nil { return err } else { if afsOrder != nil { err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) } } } } else { err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus) } return err } func buildOrderStatus(ctx *jxcontext.Context, order *model.GoodsOrder, reason string, isJxShop bool) (orderStatus *model.OrderStatus) { orderStatus = &model.OrderStatus{ VendorOrderID: utils.Int64ToStr(jxutils.GenAfsOrderNo()), // 是售后单ID,不是订单ID,订单ID在RefVendorOrderID中 VendorID: order.VendorID, OrderType: model.OrderTypeAfsOrder, RefVendorOrderID: order.VendorOrderID, RefVendorID: order.VendorID, VendorStatus: utils.Int2Str(model.AfsOrderStatusWait4Approve), // Status: model.AfsOrderStatusWait4Approve, StatusTime: time.Now(), Remark: reason, } if isJxShop { orderStatus.Status = model.AfsOrderStatusWait4Approve } else { orderStatus.Status = model.AfsOrderStatusFinished } return orderStatus } func isJxShop(appID string) bool { if appID == api.WeixinMiniAppID2 { return true } return false }