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)); } }