// GET: Web/OrderRefund
        /// <summary>
        /// 退款申请
        /// </summary>
        /// <param name="id"></param>
        /// <param name="itemId"></param>
        /// <returns></returns>
        public ActionResult RefundApply(long orderid, long?itemId, long?refundid)
        {
            Himall.Web.Areas.Web.Models.RefundApplyModel model = new Himall.Web.Areas.Web.Models.RefundApplyModel();
            model.RefundMode  = null;
            model.OrderItemId = null;
            var    ordser   = ServiceHelper.Create <IOrderService>();
            var    order    = ordser.GetOrder(orderid, CurrentUser.Id);
            string errormsg = "";
            string jumpurl  = "/" + ViewBag.AreaName + "/Member/Center";
            bool   isok     = true;

            if (isok)
            {
                if (order == null)
                {
                    isok     = false;
                    errormsg = "该预约单已删除或不属于该用户";
                    return(Redirect(jumpurl));

                    throw new Himall.Core.HimallException("该预约单已删除或不属于该用户");
                }
            }

            if (isok)
            {
                if ((int)order.OrderStatus < 2)
                {
                    isok     = false;
                    errormsg = "错误的售后申请,预约单状态有误";
                    return(Redirect(jumpurl));

                    throw new Himall.Core.HimallException("错误的售后申请,预约单状态有误");
                }
            }

            if (isok)
            {
                if (itemId == null && order.OrderStatus != OrderInfo.OrderOperateStatus.WaitDelivery && order.OrderStatus != OrderInfo.OrderOperateStatus.WaitSelfPickUp)
                {
                    isok     = false;
                    errormsg = "错误的预约单退款申请,预约单状态有误";
                    return(Redirect(jumpurl));

                    throw new Himall.Core.HimallException("错误的预约单退款申请,预约单状态有误");
                }
            }

            if (isok)
            {
                //售后时间限制
                if (_iOrderService.IsRefundTimeOut(orderid))
                {
                    isok     = false;
                    errormsg = "预约单已超过售后期";
                    return(Redirect(jumpurl));

                    throw new Himall.Core.HimallException("预约单已超过售后期");
                }
            }

            if (isok)
            {
                //计算可退金额 预留
                ordser.CalculateOrderItemRefund(orderid);

                OrderItemInfo item = new OrderItemInfo();
                model.MaxRefundGoodsNumber = 0;
                model.MaxRefundAmount      = order.OrderEnabledRefundAmount;
                if (itemId == null)
                {
                    model.OrderItems = order.OrderItemInfo.ToList();
                }
                else
                {
                    item = order.OrderItemInfo.Where(a => a.Id == itemId).FirstOrDefault();
                    model.OrderItems.Add(item);
                    model.MaxRefundGoodsNumber = item.Quantity - item.ReturnQuantity;
                    model.MaxRefundAmount      = item.EnabledRefundAmount - item.RefundPrice;
                }
                if (!model.MaxRefundAmount.HasValue)
                {
                    model.MaxRefundAmount = 0;
                }
                bool            isCanApply = false;
                var             refundser  = _iRefundService;
                OrderRefundInfo refunddata;

                if (order.OrderStatus == OrderInfo.OrderOperateStatus.WaitDelivery)
                {
                    isCanApply = refundser.CanApplyRefund(orderid, item.Id);
                }
                else
                {
                    isCanApply = refundser.CanApplyRefund(orderid, item.Id, false);
                }
                if (!refundid.HasValue)
                {
                    if (!isCanApply)
                    {
                        isok     = false;
                        errormsg = "您已申请过售后,不可重复申请";
                        return(Redirect(jumpurl));

                        throw new Himall.Core.HimallException("您已申请过售后,不可重复申请");
                    }

                    model.ContactPerson    = CurrentUser.RealName;
                    model.ContactCellPhone = CurrentUser.CellPhone;
                    model.OrderItemId      = itemId;
                    if (!model.OrderItemId.HasValue)
                    {
                        model.IsOrderAllRefund = true;
                        model.RefundMode       = OrderRefundInfo.OrderRefundMode.OrderRefund;
                    }
                }
                else
                {
                    refunddata = refundser.GetOrderRefund(refundid.Value, CurrentUser.Id);
                    if (refunddata == null)
                    {
                        isok     = false;
                        errormsg = "错误的售后数据";
                        return(Redirect(jumpurl));

                        throw new Himall.Core.HimallException("错误的售后数据");
                    }
                    if (isok)
                    {
                        if (refunddata.SellerAuditStatus != OrderRefundInfo.OrderRefundAuditStatus.UnAudit)
                        {
                            isok     = false;
                            errormsg = "错误的售后状态,不可激活";
                            return(Redirect(jumpurl));

                            throw new Himall.Core.HimallException("错误的售后状态,不可激活");
                        }
                    }
                    if (isok)
                    {
                        model.ContactPerson     = refunddata.ContactPerson;
                        model.ContactCellPhone  = refunddata.ContactCellPhone;
                        model.OrderItemId       = refunddata.OrderItemId;
                        model.IsOrderAllRefund  = (refunddata.RefundMode == OrderRefundInfo.OrderRefundMode.OrderRefund);
                        model.RefundMode        = refunddata.RefundMode;
                        model.RefundReasonValue = refunddata.Reason;
                        model.RefundWayValue    = refunddata.RefundPayType;
                        model.CertPic1          = refunddata.CertPic1;
                        model.CertPic2          = refunddata.CertPic2;
                        model.CertPic3          = refunddata.CertPic3;
                    }
                }
                if (!model.IsOrderAllRefund && item.EnabledRefundAmount.HasValue)
                {
                    model.RefundGoodsPrice = item.EnabledRefundAmount.Value / item.Quantity;
                }

                if (isok)
                {
                    model.OrderInfo = order;
                    model.OrderId   = orderid;
                    model.RefundId  = refundid;

                    var reasons = refundser.GetRefundReasons();
                    foreach (var _ir in reasons)
                    {
                        _ir.AfterSalesText = _ir.AfterSalesText.Trim();
                    }
                    List <SelectListItem> reasel = new List <SelectListItem>();
                    SelectListItem        _tmpsel;
                    _tmpsel = new SelectListItem {
                        Text = "选择售后原因", Value = ""
                    };
                    reasel.Add(_tmpsel);
                    foreach (var _i in reasons)
                    {
                        _tmpsel = new SelectListItem {
                            Text = _i.AfterSalesText, Value = _i.AfterSalesText
                        };
                        if (!string.IsNullOrWhiteSpace(model.RefundReasonValue))
                        {
                            if (_i.AfterSalesText == model.RefundReasonValue)
                            {
                                _tmpsel.Selected = true;
                            }
                        }
                        reasel.Add(_tmpsel);
                    }
                    model.RefundReasons = reasel;

                    List <SelectListItem> list = new List <SelectListItem> {
                        new SelectListItem {
                            Text  = OrderRefundInfo.OrderRefundPayType.BackCapital.ToDescription(),
                            Value = ((int)OrderRefundInfo.OrderRefundPayType.BackCapital).ToString()
                        }
                    };
                    if (order.CanBackOut())
                    {
                        _tmpsel = new SelectListItem
                        {
                            Text  = OrderRefundInfo.OrderRefundPayType.BackOut.ToDescription(),
                            Value = ((int)OrderRefundInfo.OrderRefundPayType.BackOut).ToString()
                        };
                        //if (model.RefundWayValue.HasValue)
                        //{
                        //    if (_tmpsel.Value == model.RefundWayValue.ToString())
                        //    {
                        //        _tmpsel.Selected = true;
                        //    }
                        //}
                        _tmpsel.Selected = true;  //若预约单支付方式为支付宝、微信支付则退款方式默认选中“退款原路返回”
                        list.Add(_tmpsel);
                        model.BackOut = 1;
                    }
                    model.RefundWay = list;
                }
            }
            ViewBag.errormsg = errormsg;
            return(View(model));
        }
        // GET: Web/OrderRefund
        /// <summary>
        /// 退款申请
        /// </summary>
        /// <param name="id"></param>
        /// <param name="itemId"></param>
        /// <returns></returns>
        public ActionResult RefundApply(long orderid, long?itemId, long?refundid)
        {
            Himall.Web.Areas.Web.Models.RefundApplyModel model = new Himall.Web.Areas.Web.Models.RefundApplyModel();
            model.RefundMode  = null;
            model.OrderItemId = null;
            var                ordser       = ServiceApplication.Create <IOrderService>();
            var                order        = ordser.GetOrder(orderid, CurrentUser.Id);
            string             errormsg     = "";
            string             jumpurl      = "/" + ViewBag.AreaName + "/Member/Center";
            bool               isok         = true;
            VirtualProductInfo vProductInfo = null;

            if (isok)
            {
                if (order == null)
                {
                    isok     = false;
                    errormsg = "该订单已删除或不属于该用户";
                    return(Redirect(jumpurl));

                    throw new Himall.Core.HimallException("该订单已删除或不属于该用户");
                }
            }

            if (isok)
            {
                if (order.OrderType != OrderInfo.OrderTypes.Virtual && (int)order.OrderStatus < 2)
                {
                    isok     = false;
                    errormsg = "错误的售后申请,订单状态有误";
                    return(Redirect(jumpurl));

                    throw new Himall.Core.HimallException("错误的售后申请,订单状态有误");
                }
                if (order.OrderType == OrderInfo.OrderTypes.Virtual)
                {
                    //如果为虚拟商品,则要判断该商品是否允许退款,且该订单中是否至少有一个待核销的核销码
                    var orderItemInfo = OrderApplication.GetOrderItemsByOrderId(order.Id).FirstOrDefault();
                    if (orderItemInfo != null)
                    {
                        itemId = orderItemInfo.Id;
                        var virtualProductInfo = ProductManagerApplication.GetVirtualProductInfoByProductId(orderItemInfo.ProductId);
                        if (virtualProductInfo != null)
                        {
                            if (virtualProductInfo.SupportRefundType == 3)
                            {
                                isok     = false;
                                errormsg = "该商品不支持退款";
                                return(Redirect(jumpurl));

                                throw new Himall.Core.HimallException("该商品不支持退款");
                            }
                            if (virtualProductInfo.SupportRefundType == 1 && DateTime.Now > virtualProductInfo.EndDate.Value)
                            {
                                throw new Himall.Core.HimallException("该商品不支持过期退款");
                            }
                            var orderVerificationCodes = OrderApplication.GetOrderVerificationCodeInfosByOrderIds(new List <long>()
                            {
                                order.Id
                            });
                            long num = orderVerificationCodes.Where(a => a.Status == OrderInfo.VerificationCodeStatus.WaitVerification).Count();
                            if (num == 0)
                            {
                                isok     = false;
                                errormsg = "该商品没有可退的核销码";
                                return(Redirect(jumpurl));

                                throw new Himall.Core.HimallException("该商品没有可退的核销码");
                            }
                            vProductInfo = virtualProductInfo;
                        }
                    }
                }
            }

            if (isok)
            {
                if (order.OrderType != OrderInfo.OrderTypes.Virtual)
                {
                    if (itemId == null && order.OrderStatus != Entities.OrderInfo.OrderOperateStatus.WaitDelivery && order.OrderStatus != Entities.OrderInfo.OrderOperateStatus.WaitSelfPickUp)
                    {
                        isok     = false;
                        errormsg = "错误的订单退款申请,订单状态有误";
                        return(Redirect(jumpurl));

                        throw new Himall.Core.HimallException("错误的订单退款申请,订单状态有误");
                    }
                }
            }

            if (isok)
            {
                if (order.OrderType != OrderInfo.OrderTypes.Virtual)
                {
                    //售后时间限制
                    if (_iOrderService.IsRefundTimeOut(orderid))
                    {
                        isok     = false;
                        errormsg = "订单已超过售后期";
                        return(Redirect(jumpurl));

                        throw new Himall.Core.HimallException("订单已超过售后期");
                    }
                }
            }

            if (isok)
            {
                //计算可退金额 预留
                ordser.CalculateOrderItemRefund(orderid);

                var item = new OrderItemInfo();
                model.MaxRefundGoodsNumber = 0;
                model.MaxRefundAmount      = order.OrderEnabledRefundAmount;
                if (itemId == null)
                {
                    model.OrderItems = _iOrderService.GetOrderItemsByOrderId(order.Id);
                }
                else
                {
                    item = _iOrderService.GetOrderItem(itemId.Value);
                    model.OrderItems.Add(item);
                    model.MaxRefundGoodsNumber = item.Quantity - item.ReturnQuantity;
                    model.MaxRefundAmount      = item.EnabledRefundAmount - item.RefundPrice;
                }
                if (!model.MaxRefundAmount.HasValue)
                {
                    model.MaxRefundAmount = 0;
                }
                if (order.OrderType == OrderInfo.OrderTypes.Virtual)
                {
                    var count = OrderApplication.GetOrderVerificationCodeInfosByOrderIds(new List <long>()
                    {
                        order.Id
                    }).Where(a => a.Status != OrderInfo.VerificationCodeStatus.WaitVerification).ToList().Count;
                    if (item.EnabledRefundAmount.HasValue)
                    {
                        decimal price = item.EnabledRefundAmount.Value / item.Quantity;
                        model.MaxRefundAmount = item.EnabledRefundAmount.Value - Math.Round(count * price, 2, MidpointRounding.AwayFromZero);
                    }
                }
                bool isCanApply = false;
                var  refundser  = _iRefundService;
                Entities.OrderRefundInfo refunddata;

                if (order.OrderStatus == Entities.OrderInfo.OrderOperateStatus.WaitDelivery)
                {
                    isCanApply = refundser.CanApplyRefund(orderid, item.Id);
                }
                else
                {
                    isCanApply = refundser.CanApplyRefund(orderid, item.Id, false);
                }
                if (!refundid.HasValue)
                {
                    if (!isCanApply)
                    {
                        isok     = false;
                        errormsg = "您已申请过售后,不可重复申请";
                        return(Redirect(jumpurl));

                        throw new Himall.Core.HimallException("您已申请过售后,不可重复申请");
                    }

                    //model.ContactPerson = CurrentUser.RealName;
                    //model.ContactCellPhone = CurrentUser.CellPhone;
                    // model.ContactCellPhone = order.CellPhone;

                    model.ContactPerson    = string.IsNullOrEmpty(order.ShipTo) ? CurrentUser.RealName : order.ShipTo;
                    model.ContactCellPhone = string.IsNullOrEmpty(order.CellPhone) ? CurrentUser.CellPhone : order.CellPhone;

                    model.OrderItemId = itemId;
                    if (!model.OrderItemId.HasValue)
                    {
                        model.IsOrderAllRefund = true;
                        model.RefundMode       = Entities.OrderRefundInfo.OrderRefundMode.OrderRefund;
                    }
                }
                else
                {
                    refunddata = refundser.GetOrderRefund(refundid.Value, CurrentUser.Id);
                    if (refunddata == null)
                    {
                        isok     = false;
                        errormsg = "错误的售后数据";
                        return(Redirect(jumpurl));

                        throw new Himall.Core.HimallException("错误的售后数据");
                    }
                    if (isok)
                    {
                        if (order.OrderType != OrderInfo.OrderTypes.Virtual)
                        {
                            if (refunddata.SellerAuditStatus != Entities.OrderRefundInfo.OrderRefundAuditStatus.UnAudit)
                            {
                                isok     = false;
                                errormsg = "错误的售后状态,不可激活";
                                return(Redirect(jumpurl));

                                throw new Himall.Core.HimallException("错误的售后状态,不可激活");
                            }
                        }
                    }
                    if (isok)
                    {
                        model.ContactPerson     = refunddata.ContactPerson;
                        model.ContactCellPhone  = refunddata.ContactCellPhone;
                        model.OrderItemId       = refunddata.OrderItemId;
                        model.IsOrderAllRefund  = (refunddata.RefundMode == Entities.OrderRefundInfo.OrderRefundMode.OrderRefund);
                        model.RefundMode        = refunddata.RefundMode;
                        model.RefundReasonValue = refunddata.Reason;
                        model.RefundWayValue    = refunddata.RefundPayType;
                        model.CertPic1          = refunddata.CertPic1;
                        model.CertPic2          = refunddata.CertPic2;
                        model.CertPic3          = refunddata.CertPic3;
                    }
                }
                if (!model.IsOrderAllRefund && item.EnabledRefundAmount.HasValue)
                {
                    model.RefundGoodsPrice = item.EnabledRefundAmount.Value / item.Quantity;
                }

                if (isok)
                {
                    model.OrderInfo = order;
                    model.OrderId   = orderid;
                    model.RefundId  = refundid;

                    var reasons = refundser.GetRefundReasons();
                    foreach (var _ir in reasons)
                    {
                        _ir.AfterSalesText = _ir.AfterSalesText.Trim();
                    }
                    List <SelectListItem> reasel = new List <SelectListItem>();
                    SelectListItem        _tmpsel;
                    _tmpsel = new SelectListItem {
                        Text = "选择售后理由", Value = ""
                    };
                    //reasel.Add(_tmpsel);
                    foreach (var _i in reasons)
                    {
                        _tmpsel = new SelectListItem {
                            Text = _i.AfterSalesText, Value = _i.AfterSalesText
                        };
                        if (!string.IsNullOrWhiteSpace(model.RefundReasonValue))
                        {
                            if (_i.AfterSalesText == model.RefundReasonValue)
                            {
                                _tmpsel.Selected = true;
                            }
                        }
                        reasel.Add(_tmpsel);
                    }
                    model.RefundReasons = reasel;

                    List <SelectListItem> list = new List <SelectListItem> {
                        new SelectListItem {
                            Text  = OrderRefundInfo.OrderRefundPayType.BackCapital.ToDescription(),
                            Value = ((int)OrderRefundInfo.OrderRefundPayType.BackCapital).ToString()
                        }
                    };
                    if (order.CanBackOut())
                    {
                        _tmpsel = new SelectListItem
                        {
                            Text  = OrderRefundInfo.OrderRefundPayType.BackOut.ToDescription(),
                            Value = ((int)OrderRefundInfo.OrderRefundPayType.BackOut).ToString()
                        };
                        //if (model.RefundWayValue.HasValue)
                        //{
                        //    if (_tmpsel.Value == model.RefundWayValue.ToString())
                        //    {
                        //        _tmpsel.Selected = true;
                        //    }
                        //}
                        _tmpsel.Selected = true;  //若订单支付方式为支付宝、微信支付则退款方式默认选中“退款原路返回”
                        list.Add(_tmpsel);
                        model.BackOut = 1;
                    }
                    model.RefundWay = list;
                }
                if (order.DeliveryType == DeliveryType.SelfTake)
                {
                    var shopBranch = ShopBranchApplication.GetShopBranchById(order.ShopBranchId);
                    model.ReturnGoodsAddress  = RegionApplication.GetFullName(shopBranch.AddressId);
                    model.ReturnGoodsAddress += " " + shopBranch.AddressDetail;
                    model.ReturnGoodsAddress += " " + shopBranch.ContactPhone;
                }
            }
            ViewBag.errormsg = errormsg;
            #region 虚拟订单退款
            ViewBag.orderVerificationCode = OrderApplication.GetOrderVerificationCodeInfosByOrderIds(new List <long>()
            {
                order.Id
            }).Where(a => a.Status == OrderInfo.VerificationCodeStatus.WaitVerification).ToList();
            #endregion
            ViewBag.IsVirtual          = order.OrderType == OrderInfo.OrderTypes.Virtual ? 1 : 0;
            ViewBag.VirtualProductInfo = vProductInfo;
            return(View(model));
        }