/// <summary> /// 计算本次退款的可退数量 /// </summary> /// <param name="order">订单</param> /// <param name="orderDetail">退商品时可用,如果是退订单可不传参</param> /// <param name="refundCount">退商品时可用,退款商品的数量</param> /// <returns></returns> private static JWRefundMsg CanRefundCount(OrderInfo order, OrderDetailInfo orderDetail = null, int refundCount = 0) { JWRefundMsg refundMsg = new JWRefundMsg { CanRefund = false }; //退商品 if (orderDetail != null && orderDetail.Id > 0) { //退款数量必须大于0 if (refundCount < 1) { refundMsg.ErrorCode = JWRefundErrorCode.REFUND_COUNT_MUST_GT0_ERROR; return(refundMsg); } refundMsg.CanRefundCount = orderDetail.BuyCount - orderDetail.RefundCount; } //退订单 else { var orderDetailList = OrderDetailBLL.ReadList(order.Id); refundMsg.CanRefundCount = orderDetailList.Sum(k => k.BuyCount - k.RefundCount); } //是否超过最大可退数量,并且保证还有商品可以退款 if (refundMsg.CanRefundCount < 1 || refundCount > refundMsg.CanRefundCount) { refundMsg.ErrorCode = JWRefundErrorCode.CAN_REFUND_COUNT_ERROR; return(refundMsg); } refundMsg.CanRefund = true; return(refundMsg); }
/// <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="order">订单</param> /// <param name="orderDetail">退商品时可用,如果是退订单可不传参</param> /// <param name="refundCount">退商品时可用,退款商品的数量</param> /// <param name="needRefundMoney">需要退款的金额</param> /// <returns></returns> public static JWRefundMsg CanRefund(OrderInfo order, OrderDetailInfo orderDetail = null, int refundCount = 0, decimal needRefundMoney = 0) { JWRefundMsg refundMsg = new JWRefundMsg { CanRefund = false }; if (order.Id < 1) { refundMsg.ErrorCode = JWRefundErrorCode.ORDER_INVALID; return(refundMsg); } if (orderDetail != null) { //传递过来的退款商品不为空时,如果Id不大于0,则是无效的 //同时,如果退款商品所在订单的Id和传递过来的订单Id参数不一致,也是无效的 if (orderDetail.Id < 1 || orderDetail.OrderId != order.Id) { refundMsg.ErrorCode = JWRefundErrorCode.ORDER_DETAIL_INVALID; return(refundMsg); } } //只有订单状态为待审核、待发货和已发货的可以退款 if (order.OrderStatus != (int)OrderStatus.WaitCheck && order.OrderStatus != (int)OrderStatus.Shipping && order.OrderStatus != (int)OrderStatus.HasShipping) { refundMsg.ErrorCode = JWRefundErrorCode.ORDER_STATUS_INVALID; return(refundMsg); } //计算本次退款的可退数量 refundMsg = CanRefundCount(order, orderDetail, refundCount); if (!refundMsg.CanRefund) { return(refundMsg); } int canRefundCount = refundMsg.CanRefundCount; //计算本次退款的可退金额 refundMsg = CanRefundMoney(order, orderDetail, refundCount, needRefundMoney); if (!refundMsg.CanRefund) { return(refundMsg); } refundMsg.CanRefundCount = canRefundCount; return(refundMsg); }
/// <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); }