/// <summary> /// 计算本次退款的可退金额 /// </summary> /// <param name="order">订单</param> /// <param name="orderDetail">退商品时可用,如果是退订单可不传参</param> /// <param name="refundCount">退商品时可用,退款商品的数量</param> /// <param name="needRefundMoney">需要退款的金额</param> /// <returns></returns> private static JWRefundMsg CanRefundMoney(OrderInfo order, OrderDetailInfo orderDetail = null, int refundCount = 0, decimal needRefundMoney = 0) { var refundMsg = new JWRefundMsg { CanRefund = false }; //订单可退金额 decimal orderRefundMoney = 0; //如果订单状态为待审核或配货中,则可退运费(因为商品还未发货) if (order.OrderStatus == (int)OrderStatus.WaitCheck || order.OrderStatus == (int)OrderStatus.Shipping) { orderRefundMoney = order.ProductMoney + order.ShippingMoney + order.OtherMoney - order.PointMoney - order.CouponMoney - order.FavorableMoney; } //如果订单已发货(是否退还运费视设置而定) if (order.OrderStatus == (int)OrderStatus.HasShipping) { orderRefundMoney = order.ProductMoney + order.OtherMoney - order.PointMoney - order.CouponMoney - order.FavorableMoney; if (RefundShippingMoneyWhenHasShipping) { orderRefundMoney += order.ShippingMoney; } } //已退款或正在处理中的服务单金额 var orderRefundList = OrderRefundBLL.ReadListValid(order.Id); decimal hasRefundMoney = orderRefundList.Sum(k => k.RefundBalance + k.RefundMoney); //这里的计算结果就是订单可退的金额 decimal canRefundMoney = orderRefundMoney - hasRefundMoney; refundMsg.CanRefundMoney = canRefundMoney; //如果是退单个商品,考虑到订单总价格可能被改变,商品可退金额不能超过订单可退金额 if (orderDetail != null && orderDetail.Id > 0) { if (refundCount < 1) { refundMsg.ErrorCode = JWRefundErrorCode.REFUND_COUNT_MUST_GT0_ERROR; return(refundMsg); } refundMsg.CanRefundMoney = orderDetail.ProductPrice * refundCount; if (refundMsg.CanRefundMoney > canRefundMoney) { refundMsg.CanRefundMoney = canRefundMoney; } } //是否超过最大可退金额,并且保证还有金额可以退款 if (refundMsg.CanRefundMoney <= 0 || needRefundMoney > refundMsg.CanRefundMoney) { refundMsg.ErrorCode = JWRefundErrorCode.CAN_REFUND_MONEY_ERROR; return(refundMsg); } refundMsg.CanRefund = true; return(refundMsg); }
/// <summary> /// 退款到账户余额及各支付渠道 /// </summary> /// <param name="orderRefund"></param> public static void RefundToAnyPay(OrderRefundInfo orderRefund) { if (orderRefund.Status != (int)OrderRefundStatus.Returning) { return; } if (RefundOnline) { if (PayPlugins.ReadPayPlugins(orderRefund.RefundPayKey).IsOnline == 1 && (OrderBLL.Read(orderRefund.OrderId).AliPayTradeNo.Trim() != string.Empty || OrderBLL.Read(orderRefund.OrderId).WxPayTradeNo.Trim() != string.Empty))//只有在线付款才走线上流程,并且存在支付交易号(支付宝微信任意一个) { //退款到各支付渠道 //如需退余额,将在第三方支付退款成功后操作 //这样做的好处在于保障了余额能够被准确退还。不会出现退了余额,但支付宝或微信因为人为或意外的原因没退成功的情况。 if (orderRefund.RefundMoney > 0) { //HttpContext.Current.Response.Redirect(string.Format("/Plugins/Pay/{0}/Refund.aspx?order_refund_id={1}", orderRefund.RefundPayKey, orderRefund.Id)); HttpContext.Current.Response.Redirect(string.Format("/Plugins/Pay/{0}/Refund.aspx?order_refund_id={1}&returnurl={2}", orderRefund.RefundPayKey, orderRefund.Id, RefundRedirectUrl)); } else { //只需退款到余额 //在这里写自己的逻辑 if (orderRefund.RefundBalance > 0) { //HttpContext.Current.Response.Redirect(string.Format("/Admin/OrderRefundToBalance.aspx?order_refund_id={0}", orderRefund.Id)); HttpContext.Current.Response.Redirect(string.Format("/Admin/OrderRefundToBalance.aspx?order_refund_id={0}&returnurl={1}", orderRefund.Id, RefundRedirectUrl)); } } } else//线下退款则直接更改状态,所以线下退款只能管理员自己审核。 { orderRefund.Remark = "退款完成"; orderRefund.Status = (int)OrderRefundStatus.HasReturn; orderRefund.TmRefund = DateTime.Now; OrderRefundBLL.Update(orderRefund); OrderRefundActionBLL.Add(new OrderRefundActionInfo { OrderRefundId = orderRefund.Id, Status = 1, Tm = DateTime.Now, UserType = 2, UserId = Cookies.Admin.GetAdminID(false), UserName = Cookies.Admin.GetAdminName(false), Remark = orderRefund.Remark }); #region 发送订单退款成功通知 int isSendNotice = ShopConfig.ReadConfigInfo().RefundOrder; int isSendEmail = ShopConfig.ReadConfigInfo().RefundOrderEmail; int isSendMessage = ShopConfig.ReadConfigInfo().RefundOrderMsg; string key = "RefundOrder"; OrderInfo order = OrderBLL.Read(orderRefund.OrderId); if (isSendNotice == (int)BoolType.True && key != string.Empty) { if (isSendEmail == (int)BoolType.True) {//发邮件 try { EmailContentInfo emailContent = EmailContentHelper.ReadSystemEmailContent(key); EmailSendRecordInfo emailSendRecord = new EmailSendRecordInfo(); emailSendRecord.Title = emailContent.EmailTitle; emailSendRecord.Content = emailContent.EmailContent.Replace("$UserName$", order.UserName).Replace("$OrderNumber$", order.OrderNumber).Replace("$PayName$", order.PayName).Replace("$ShippingName$", ShippingBLL.Read(order.ShippingId).Name).Replace("$ShippingNumber$", order.ShippingNumber).Replace("$ShippingDate$", order.ShippingDate.ToString("yyyy-MM-dd")); emailSendRecord.IsSystem = (int)BoolType.True; emailSendRecord.EmailList = order.Email; emailSendRecord.IsStatisticsOpendEmail = (int)BoolType.False; emailSendRecord.SendStatus = (int)SendStatus.No; emailSendRecord.AddDate = RequestHelper.DateNow; emailSendRecord.SendDate = RequestHelper.DateNow; emailSendRecord.ID = EmailSendRecordBLL.AddEmailSendRecord(emailSendRecord); EmailSendRecordBLL.SendEmail(emailSendRecord); //result = "通知邮件已发送。"; } catch { //result = "未发送通知邮件。"; } } if (isSendMessage == (int)BoolType.True) {//发短信 //result += "未发送通知短信。"; } } #endregion if (string.IsNullOrEmpty(RefundRedirectUrl)) { HttpContext.Current.Response.Redirect(string.Format("/Admin/OrderRefundAdd.aspx?id={0}", orderRefund.Id)); } else { HttpContext.Current.Response.Redirect(RefundRedirectUrl); } } } else { //处理订单、商品的退款状态,线下退款 //在这里写自己的逻辑 HttpContext.Current.Response.Redirect(string.Format("/Admin/OrderRefundToBalance.aspx?order_refund_id={0}&returnurl={1}", orderRefund.Id, RefundRedirectUrl)); } }
/// <summary> /// 对最终需要提交的退款服务单,做进一步的验证 /// </summary> /// <param name="orderRefund"></param> /// <param name="needRefundMoney">本次服务单需退款的金额</param> /// <returns></returns> public static JWRefundMsg VerifySubmitOrderRefund(OrderRefundInfo orderRefund, decimal needRefundMoney) { var refundMsg = new JWRefundMsg { CanRefund = false }; //退款金额必须大于0 if (needRefundMoney <= 0) { refundMsg.ErrorCode = JWRefundErrorCode.REFUND_MONEY_MUST_GT0_ERROR; return(refundMsg); } var order = OrderBLL.Read(orderRefund.OrderId); OrderDetailInfo orderDetail = null; if (orderRefund.OrderDetailId > 0) { orderDetail = OrderDetailBLL.Read(orderRefund.OrderDetailId); } //验证该退款单能否被退款 refundMsg = CanRefund(order, orderDetail, orderRefund.RefundCount, needRefundMoney); if (!refundMsg.CanRefund) { return(refundMsg); } orderRefund.OrderNumber = order.OrderNumber; orderRefund.RefundPayKey = order.PayKey; orderRefund.RefundPayName = order.PayName; orderRefund.OrderDetailId = orderDetail == null ? 0 : orderDetail.Id; orderRefund.OwnerId = order.UserId; /*-----退款金额分配(余额与第三方支付金额) start----------------------------------------------------*/ //已退余额金额 var orderRefundList = OrderRefundBLL.ReadListValid(orderRefund.OrderId); decimal hasRefundBalance = orderRefundList.Sum(k => k.RefundBalance); //退商品 if (orderRefund.OrderDetailId > 0) { //如果需要退款的金额不大于剩余未退的余额金额,则全部退到余额账户 if (needRefundMoney <= (order.Balance - hasRefundBalance)) { orderRefund.RefundBalance = needRefundMoney; orderRefund.RefundMoney = 0; } else { orderRefund.RefundBalance = (order.Balance - hasRefundBalance); orderRefund.RefundMoney = needRefundMoney - (order.Balance - hasRefundBalance); } } //退订单 else { orderRefund.RefundBalance = (order.Balance - hasRefundBalance); orderRefund.RefundMoney = needRefundMoney - (order.Balance - hasRefundBalance); } /*-----退款金额分配(余额与第三方支付金额) end------------------------------------------------------*/ refundMsg.CanRefund = true; return(refundMsg); }