public ServiceResult Refund(OrderRefundModel model)
        {
            var result = new ServiceResult();

            if (!ModelState.IsValid)
            {
                result.Code = ReasonCode.MISSING_REQUIRED_FIELDS;
                foreach (string error in ModelState.Values.SelectMany(v => v.Errors.Select(b => b.ErrorMessage)))
                {
                    result.Message += error + Environment.NewLine;
                }

                return(result);
            }

            var component = new OrderComponent();

            var accountId = this.GetMerchantAccountId();

            component.Refund(accountId, model.OrderNo, model.PINToken);


            return(result);
        }
        /// <summary>
        /// 获取申请售后的信息
        /// </summary>
        /// <param name="id">订单ID</param>
        /// <param name="itemId">子订单ID</param>
        /// <returns></returns>
        public object GetOrderRefundModel(long id, long?itemId = null, long?refundId = null)
        {
            CheckUserLogin();
            try
            {
                dynamic d         = new System.Dynamic.ExpandoObject();
                var     ordser    = ServiceProvider.Instance <IOrderService> .Create;
                var     refundser = ServiceProvider.Instance <IRefundService> .Create;

                var order = ordser.GetOrder(id, CurrentUser.Id);
                if (order == null)
                {
                    throw new Himall.Core.HimallException("该订单已删除或不属于该用户");
                }
                if ((int)order.OrderStatus < 2)
                {
                    throw new Himall.Core.HimallException("错误的售后申请,订单状态有误");
                }
                if (itemId == null && order.OrderStatus != OrderInfo.OrderOperateStatus.WaitDelivery && order.OrderStatus != OrderInfo.OrderOperateStatus.WaitSelfPickUp)
                {
                    throw new Himall.Core.HimallException("错误的订单退款申请,订单状态有误");
                }
                //计算可退金额 预留
                ordser.CalculateOrderItemRefund(id);

                OrderRefundModel refundModel = new OrderRefundModel();
                OrderItemInfo    item        = new OrderItemInfo();
                refundModel.MaxRGDNumber    = 0;
                refundModel.MaxRefundAmount = order.OrderEnabledRefundAmount;
                if (itemId == null)
                {
                    item = order.OrderItemInfo.FirstOrDefault();
                }
                else
                {
                    item = order.OrderItemInfo.Where(a => a.Id == itemId).FirstOrDefault();
                    refundModel.MaxRGDNumber    = item.Quantity - item.ReturnQuantity;
                    refundModel.MaxRefundAmount = (decimal)(item.EnabledRefundAmount - item.RefundPrice);
                }

                bool isCanApply = false;

                if (order.OrderStatus == OrderInfo.OrderOperateStatus.WaitDelivery)
                {
                    isCanApply = refundser.CanApplyRefund(id, item.Id);
                }
                else
                {
                    isCanApply = refundser.CanApplyRefund(id, item.Id, false);
                }

                if (!refundId.HasValue)
                {
                    if (!isCanApply)
                    {
                        throw new Himall.Core.HimallException("您已申请过售后,不可重复申请");
                    }
                    d.ContactPerson    = CurrentUser.RealName;
                    d.ContactCellPhone = CurrentUser.CellPhone;
                    d.OrderItemId      = itemId;
                    d.RefundType       = 0;
                    d.IsRefundOrder    = false;
                    if (!itemId.HasValue)
                    {
                        d.IsRefundOrder = true;
                        d.RefundType    = 1;
                    }
                    var reasonlist = refundser.GetRefundReasons();
                    d.Id               = order.Id;
                    d.MaxRGDNumber     = refundModel.MaxRGDNumber;
                    d.MaxRefundAmount  = refundModel.MaxRefundAmount;
                    d.OrderStatus      = order.OrderStatus.ToDescription();
                    d.OrderStatusValue = (int)order.OrderStatus;
                    d.BackOut          = false;
                    d.RefundReasons    = reasonlist;
                    if (order.CanBackOut())
                    {
                        d.BackOut = true;
                    }
                }
                else
                {
                    var refunddata = refundser.GetOrderRefund(refundId.Value, CurrentUser.Id);
                    if (refunddata == null)
                    {
                        throw new Himall.Core.HimallException("错误的售后数据");
                    }
                    if (refunddata.SellerAuditStatus != OrderRefundInfo.OrderRefundAuditStatus.UnAudit)
                    {
                        throw new Himall.Core.HimallException("错误的售后状态,不可激活");
                    }
                    d.ContactPerson    = refunddata.ContactPerson;
                    d.ContactCellPhone = refunddata.ContactCellPhone;
                    d.OrderItemId      = refunddata.OrderItemId;
                    d.IsRefundOrder    = (refunddata.RefundMode == OrderRefundInfo.OrderRefundMode.OrderRefund);
                    d.RefundType       = (refunddata.RefundMode == OrderRefundInfo.OrderRefundMode.OrderRefund ? 1 : 0);
                    var reasonlist = refundser.GetRefundReasons();
                    d.RefundReasons    = reasonlist; //理由List
                    d.Id               = id;
                    d.MaxRGDNumber     = refundModel.MaxRGDNumber;
                    d.MaxRefundAmount  = refundModel.MaxRefundAmount;
                    d.OrderStatus      = order.OrderStatus.ToDescription();
                    d.OrderStatusValue = (int)order.OrderStatus;
                    d.BackOut          = false;
                    if (order.CanBackOut())
                    {
                        d.BackOut = true;
                    }
                }

                if (!d.IsRefundOrder && item.EnabledRefundAmount.HasValue)
                {
                    d.RefundGoodsPrice = item.EnabledRefundAmount.Value / item.Quantity;
                }
                return(Json(new { Success = true, RefundMode = d }));
            }
            catch (HimallException himallex)
            {
                return(Json(new { Success = false, Msg = himallex.Message }));
            }
            catch (Exception ex)
            {
                return(Json(new { Success = false, Msg = "系统异常:" + ex.Message }));
            }
        }
        /// <summary>
        /// 获取申请售后的信息
        /// </summary>
        /// <param name="id">订单ID</param>
        /// <param name="itemId">子订单ID</param>
        /// <returns></returns>
        public object GetOrderRefundModel(long id, long?itemId = null, long?refundId = null)
        {
            CheckUserLogin();
            try
            {
                dynamic d         = new System.Dynamic.ExpandoObject();
                var     ordser    = ServiceProvider.Instance <IOrderService> .Create;
                var     refundser = ServiceProvider.Instance <IRefundService> .Create;

                var order = ordser.GetOrder(id, CurrentUser.Id);
                if (order == null)
                {
                    throw new Himall.Core.HimallException("该订单已删除或不属于该用户");
                }
                if (order.OrderType != OrderInfo.OrderTypes.Virtual && (int)order.OrderStatus < 2)
                {
                    throw new Himall.Core.HimallException("错误的售后申请,订单状态有误");
                }
                if (order.OrderType != OrderInfo.OrderTypes.Virtual && itemId == null && order.OrderStatus != Entities.OrderInfo.OrderOperateStatus.WaitDelivery && order.OrderStatus != Entities.OrderInfo.OrderOperateStatus.WaitSelfPickUp)
                {
                    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)
                            {
                                return(new { success = false, msg = "该商品不支持退款" });
                            }
                            if (virtualProductInfo.SupportRefundType == 1 && DateTime.Now > virtualProductInfo.EndDate.Value)
                            {
                                return(new { success = false, msg = "该商品不支持过期退款" });
                            }
                            var orderVerificationCodes = OrderApplication.GetOrderVerificationCodeInfosByOrderIds(new List <long>()
                            {
                                order.Id
                            });
                            long num = orderVerificationCodes.Where(a => a.Status == OrderInfo.VerificationCodeStatus.WaitVerification).Count();
                            if (num == 0)
                            {
                                return(new { success = false, msg = "该商品没有可退的核销码" });
                            }
                            int validityType = 0; string startDate = string.Empty, endDate = string.Empty;
                            validityType = virtualProductInfo.ValidityType ? 1 : 0;
                            if (validityType == 1)
                            {
                                startDate = virtualProductInfo.StartDate.Value.ToString("yyyy-MM-dd");
                                endDate   = virtualProductInfo.EndDate.Value.ToString("yyyy-MM-dd");
                            }
                            d.ValidityType = validityType;
                            d.StartDate    = startDate;
                            d.EndDate      = endDate;
                        }
                    }
                }


                //计算可退金额 预留
                ordser.CalculateOrderItemRefund(id);
                var orderitems = OrderApplication.GetOrderItems(order.Id);
                OrderRefundModel refundModel = new OrderRefundModel();
                var item = new OrderItemInfo();
                refundModel.MaxRGDNumber    = 0;
                refundModel.MaxRefundAmount = order.OrderEnabledRefundAmount;
                if (itemId == null)
                {
                    item = orderitems.FirstOrDefault();
                }
                else
                {
                    item = orderitems.Where(a => a.Id == itemId).FirstOrDefault();
                    refundModel.MaxRGDNumber    = item.Quantity - item.ReturnQuantity;
                    refundModel.MaxRefundAmount = (decimal)(item.EnabledRefundAmount - item.RefundPrice);
                }
                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;
                        refundModel.MaxRefundAmount = item.EnabledRefundAmount.Value - Math.Round(count * price, 2, MidpointRounding.AwayFromZero);
                    }
                }
                bool isCanApply = false;
                if (refundModel.MaxRefundAmount <= 0)
                {
                    return(new { success = false, msg = "此为优惠券全额抵扣订单不支持退款" });
                }
                if (order.OrderStatus == OrderInfo.OrderOperateStatus.WaitDelivery)
                {
                    isCanApply = refundser.CanApplyRefund(id, item.Id);
                }
                else
                {
                    isCanApply = refundser.CanApplyRefund(id, item.Id, false);
                }

                if (!refundId.HasValue)
                {
                    if (!isCanApply)
                    {
                        throw new Himall.Core.HimallException("您已申请过售后,不可重复申请");
                    }
                    d.ContactPerson    = string.IsNullOrEmpty(order.ShipTo) ? CurrentUser.RealName : order.ShipTo;
                    d.ContactCellPhone = string.IsNullOrEmpty(order.CellPhone) ? CurrentUser.CellPhone : order.CellPhone;
                    d.OrderItemId      = itemId;
                    d.RefundType       = 0;
                    d.IsRefundOrder    = false;
                    if (!itemId.HasValue)
                    {
                        d.IsRefundOrder = true;
                        d.RefundType    = 1;
                    }
                    var reasonlist = refundser.GetRefundReasons();
                    d.Id               = order.Id;
                    d.MaxRGDNumber     = refundModel.MaxRGDNumber;
                    d.MaxRefundAmount  = refundModel.MaxRefundAmount;
                    d.OrderStatus      = order.OrderStatus.ToDescription();
                    d.OrderStatusValue = (int)order.OrderStatus;
                    d.BackOut          = false;
                    d.RefundReasons    = reasonlist;
                    if (order.CanBackOut())
                    {
                        d.BackOut = true;
                    }
                }
                else
                {
                    var refunddata = refundser.GetOrderRefund(refundId.Value, CurrentUser.Id);
                    if (refunddata == null)
                    {
                        throw new Himall.Core.HimallException("错误的售后数据");
                    }
                    if (order.OrderType != OrderInfo.OrderTypes.Virtual && refunddata.SellerAuditStatus != Entities.OrderRefundInfo.OrderRefundAuditStatus.UnAudit)
                    {
                        throw new Himall.Core.HimallException("错误的售后状态,不可激活");
                    }
                    d.ContactPerson    = refunddata.ContactPerson;
                    d.ContactCellPhone = refunddata.ContactCellPhone;
                    d.OrderItemId      = refunddata.OrderItemId;
                    d.IsRefundOrder    = (refunddata.RefundMode == Entities.OrderRefundInfo.OrderRefundMode.OrderRefund);
                    d.RefundType       = (refunddata.RefundMode == Entities.OrderRefundInfo.OrderRefundMode.OrderRefund ? 1 : 0);
                    var reasonlist = refundser.GetRefundReasons();
                    d.RefundReasons    = reasonlist; //理由List
                    d.Id               = id;
                    d.MaxRGDNumber     = refundModel.MaxRGDNumber;
                    d.MaxRefundAmount  = refundModel.MaxRefundAmount;
                    d.OrderStatus      = order.OrderStatus.ToDescription();
                    d.OrderStatusValue = (int)order.OrderStatus;
                    d.BackOut          = false;
                    d.ReasonDetail     = refunddata.ReasonDetail;
                    d.CertPic1         = Himall.Core.HimallIO.GetRomoteImagePath(refunddata.CertPic1);
                    d.CertPic2         = Himall.Core.HimallIO.GetRomoteImagePath(refunddata.CertPic2);
                    d.CertPic3         = Himall.Core.HimallIO.GetRomoteImagePath(refunddata.CertPic3);
                    if (order.CanBackOut())
                    {
                        d.BackOut = true;
                    }
                }

                if (!d.IsRefundOrder && item.EnabledRefundAmount.HasValue)
                {
                    d.RefundGoodsPrice = item.EnabledRefundAmount.Value / item.Quantity;
                }
                d.DeliveryType = order.DeliveryType;
                if (order.DeliveryType == CommonModel.DeliveryType.SelfTake)
                {
                    var shopBranch = ShopBranchApplication.GetShopBranchById(order.ShopBranchId);
                    d.ReturnGoodsAddress  = RegionApplication.GetFullName(shopBranch.AddressId);
                    d.ReturnGoodsAddress += " " + shopBranch.AddressDetail;
                    d.ReturnGoodsAddress += " " + shopBranch.ContactPhone;
                }

                d.IsVirtual = order.OrderType == OrderInfo.OrderTypes.Virtual ? 1 : 0;
                if (order.OrderType == OrderInfo.OrderTypes.Virtual)
                {
                    var codes = OrderApplication.GetOrderVerificationCodeInfosByOrderIds(new List <long>()
                    {
                        order.Id
                    }).Where(a => a.Status == OrderInfo.VerificationCodeStatus.WaitVerification).ToList();
                    d.OrderVerificationCode = codes.Select(a => a.VerificationCode).Select(p => p = Regex.Replace(p, @"(\d{4})", "$1 "));
                }

                return(new { success = true, RefundMode = d });
            }
            catch (HimallException himallex)
            {
                return(ErrorResult(himallex.Message));
            }
            catch (Exception ex)
            {
                return(ErrorResult("系统异常:" + ex.Message));
            }
        }