Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }