Exemplo n.º 1
0
        /// <summary>
        /// 封装退换货单实体
        /// </summary>
        /// <param name="exchange">客户提交退换货信息</param>
        /// <param name="rmaType">RMA类型</param>
        /// <returns>换货单实体</returns>
        /// <remarks>2013-09-12 周唐炬 创建</remarks>
        private CBRcReturn GetExchangesModel(ExchangeOrders exchange, RmaStatus.RMA类型 rmaType)
        {
            //换货单实体
            var model = new CBRcReturn()
            {
                RMAItems            = new List <RcReturnItem>(),
                CustomerSysNo       = exchange.CustomerSysNo,
                OrderSysNo          = exchange.OrderSysNo,
                RMARemark           = exchange.RmaReason,
                PickupTypeSysNo     = exchange.PickupTypeSysNo,
                WarehouseSysNo      = exchange.WarehouseSysNo,
                PickUpAddressSysNo  = exchange.PickUpAddressSysNo,
                ReceiveAddressSysNo = exchange.ReceiveAddressSysNo,
                Status           = (int)WarehouseStatus.退换货单状态.待审核,
                Source           = (int)RmaStatus.退换货申请单来源.会员,
                RmaType          = rmaType.GetHashCode(),
                HandleDepartment = (int)RmaStatus.退换货处理部门.客服中心
            };

            model.CreateBy   = model.LastUpdateBy = User.SystemUser;
            model.CreateDate = model.LastUpdateDate = DateTime.Now;
            //出库单编号
            var stockOutSysNo = 0;

            if (exchange.ProductReturns != null && exchange.ProductReturns.Any())
            {
                #region 退换货商品明细

                foreach (var item in exchange.ProductReturns)
                {
                    var whStockOutItem = WhWarehouseBo.Instance.GetWhStockOutItem(item.StockOutItemSysNo);
                    if (whStockOutItem == null)
                    {
                        throw new HytException("商品出库信息有误,请联系客服!");
                    }
                    stockOutSysNo = whStockOutItem.StockOutSysNo;
                    model.RMAItems.Add(new RcReturnItem
                    {
                        StockOutItemSysNo = item.StockOutItemSysNo,
                        ProductSysNo      = item.ProductSysNo,
                        ProductName       = whStockOutItem.ProductName,
                        OriginPrice       = whStockOutItem.OriginalPrice,
                        RmaQuantity       = item.RmaQuantity,
                        RmaReason         = exchange.RmaReason
                    });
                    #region 重新计算明细退款金额

                    if (rmaType != RmaStatus.RMA类型.售后退货)
                    {
                        continue;
                    }
                    var     rmaItem    = RmaBo.Instance.CalculateRmaAmountByStockOutItem(model.OrderSysNo, model.RMAItems.ToDictionary(x => x.StockOutItemSysNo, x => x.RmaQuantity));
                    decimal fundAmount = 0;
                    foreach (var returnItem in model.RMAItems)
                    {
                        //如果是自定义价格就不重新赋值
                        if (rmaItem != null && rmaItem.StockOutItemAmount != null && returnItem.ReturnPriceType != (int)RmaStatus.商品退款价格类型.自定义价格)
                        {
                            var soi = rmaItem.StockOutItemAmount.FirstOrDefault(x => x.Key == returnItem.StockOutItemSysNo);
                            returnItem.RefundProductAmount = soi.Value;
                        }
                        fundAmount += returnItem.RefundProductAmount;
                    }
                    var rmaItemList = RmaBo.Instance.CalculateRefundRmaAmount(model.OrderSysNo, fundAmount, false);
                    if (rmaItem == null || rmaItemList == null)
                    {
                        continue;
                    }
                    model.OrginPoint            = rmaItem.OrginPoint;
                    model.OrginAmount           = rmaItem.OrginAmount;
                    model.OrginCoin             = rmaItem.OrginCoin;
                    model.CouponAmount          = rmaItem.CouponAmount;
                    model.DeductedInvoiceAmount = model.DeductedInvoiceAmount;
                    model.RefundProductAmount   = rmaItemList.RefundProductAmount;
                    model.RedeemAmount          = rmaItemList.RedeemAmount;
                    model.RefundCoin            = rmaItemList.RefundCoin;
                    model.RefundPoint           = rmaItemList.RefundPoint;
                    //实退总金额(实退商品金额-发票扣款金额-现金补偿金额-实退惠源币)
                    model.RefundTotalAmount = fundAmount - rmaItemList.RedeemAmount - model.DeductedInvoiceAmount - rmaItemList.RefundCoin;

                    #endregion
                }

                #endregion
                //默认退换货仓库
                if (model.WarehouseSysNo == 0)
                {
                    model.WarehouseSysNo = WhWarehouseBo.Instance.Get(stockOutSysNo).WarehouseSysNo;
                }
            }
            else
            {
                throw new HytException("换货商品明细数量应该大于0!");
            }
            return(model);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 创建退换货事务
        /// </summary>
        /// <param name="model">退换货信息</param>
        /// <param name="exchange">客户提交退换货信息</param>
        /// <returns>返回结果</returns>
        /// <remarks>2013-09-12 周唐炬 创建</remarks>
        private static Result CreateReceiptTransaction(CBRcReturn model, ExchangeOrders exchange)
        {
            var result = new Result()
            {
                StatusCode = -1, Status = false
            };
            var syUser = SyUserBo.Instance.GetSyUser(User.SystemUser);

            #region 地址
            //取件地址
            SoReceiveAddress pickAddress = null;
            if (exchange.PickupTypeSysNo == PickupType.百城当日取件)
            {
                var address = BLL.Web.CrCustomerBo.Instance.GetCustomerReceiveAddressBySysno(exchange.PickUpAddressSysNo);
                if (address != null)
                {
                    pickAddress = new SoReceiveAddress
                    {
                        AreaSysNo         = address.AreaSysNo,
                        EmailAddress      = address.EmailAddress,
                        FaxNumber         = address.FaxNumber,
                        Gender            = address.Gender,
                        MobilePhoneNumber = address.MobilePhoneNumber,
                        Name          = address.Name,
                        PhoneNumber   = address.PhoneNumber,
                        StreetAddress = address.StreetAddress,
                        ZipCode       = address.ZipCode
                    };
                }
            }
            //收货地址
            SoReceiveAddress receiveAddress = null;
            if (exchange.ReceiveAddressSysNo == -10)
            {
                var soOrder = SoOrderBo.Instance.GetEntity(exchange.OrderSysNo);
                if (soOrder != null)
                {
                    exchange.ReceiveAddressSysNo = soOrder.ReceiveAddressSysNo;
                    receiveAddress = SoOrderBo.Instance.GetOrderReceiveAddress(exchange.ReceiveAddressSysNo);
                }
            }
            if (exchange.ReceiveAddressSysNo > 0)
            {
                var address =
                    BLL.Web.CrCustomerBo.Instance.GetCustomerReceiveAddressBySysno(exchange.ReceiveAddressSysNo);
                if (address != null)
                {
                    receiveAddress = new SoReceiveAddress
                    {
                        AreaSysNo         = address.AreaSysNo,
                        EmailAddress      = address.EmailAddress,
                        FaxNumber         = address.FaxNumber,
                        Gender            = address.Gender,
                        MobilePhoneNumber = address.MobilePhoneNumber,
                        Name          = address.Name,
                        PhoneNumber   = address.PhoneNumber,
                        StreetAddress = address.StreetAddress,
                        ZipCode       = address.ZipCode
                    };
                }
            }
            #endregion

            var options = new TransactionOptions {
                IsolationLevel = IsolationLevel.ReadCommitted, Timeout = TransactionManager.DefaultTimeout
            };
            using (var scope = new TransactionScope(TransactionScopeOption.Required, options))
            {
                var id = RmaBo.Instance.InsertRMA(model, pickAddress, receiveAddress, syUser);
                if (id > 0)
                {
                    result.Status     = true;
                    result.StatusCode = 1;
                    result.Message    = "退换货申请成功!";
                }
                else
                {
                    result.Message = "系统错误,请稍后重试!";
                }
                scope.Complete();
            }
            return(result);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 商城退货单导入商城
        /// </summary>
        /// <param name="mallRma">退货单实体</param>
        /// <returns>处理结果</returns>
        /// <remarks>2013-8-29 陶辉 创建</remarks>
        /// <remarks>2013-09-10 朱家宏 实现</remarks>
        /// <remarks>2013-10-21 黄志勇 修改退换货子表实退商品金额</remarks>
        public Result ImportMallRma(UpGradeRma mallRma)
        {
            //直接申请退换单,根据原订单匹配成功的商品明细进行退货
            var result = new Result();

            try
            {
                //升舱订单数据
                var dsOrder      = BLL.MallSeller.DsOrderBo.Instance.GetDsOrderByMallOrderId(mallRma.MallOrderId);
                var dsOrderItems = BLL.MallSeller.DsOrderBo.Instance.GetDsOrderItems(dsOrder.SysNo);


                //HYT订单主表数据
                var soOrder =
                    DataAccess.Order.ISoOrderDao.Instance.GetByTransactionSysNo(dsOrder.OrderTransactionSysNo);

                if (soOrder.Status != (int)Model.WorkflowStatus.OrderStatus.销售单状态.已完成)
                {
                    result.Message    = "未完成的订单不允许做此操作。";
                    result.Status     = false;
                    result.StatusCode = -1;
                    return(result);
                }

                //订单明细数据
                var soOrderItems = BLL.Order.SoOrderBo.Instance.GetOrderItemsByOrderId(soOrder.SysNo);

                if (soOrderItems == null)
                {
                    throw new ArgumentNullException();
                }

                //退换货明细
                var rcReturnItems = new List <RcReturnItem>();
                foreach (var item in mallRma.RmaItems)
                {
                    var         outitem     = Hyt.BLL.Warehouse.WhWarehouseBo.Instance.GetWhStockOutItem(item.StockOutItemSysNo);
                    SoOrderItem soOrderItem = null;
                    if (outitem != null)
                    {
                        soOrderItem = soOrderItems.FirstOrDefault(m => m.SysNo == outitem.OrderItemSysNo);
                    }
                    if (soOrderItem != null)
                    {
                        var rcReturnItem = new RcReturnItem
                        {
                            OriginPrice         = soOrderItem.OriginalPrice,
                            ProductName         = soOrderItem.ProductName,
                            ProductSysNo        = int.Parse(item.HytProductCode),
                            ReturnPriceType     = (int)Model.WorkflowStatus.RmaStatus.商品退款价格类型.自定义价格,
                            ReturnType          = (int)Model.WorkflowStatus.RmaStatus.商品退换货类型.新品,
                            RmaQuantity         = item.MallQuantity,
                            RmaReason           = "",
                            StockOutItemSysNo   = item.StockOutItemSysNo,
                            RefundProductAmount = Math.Round(outitem.RealSalesAmount * ((decimal)item.MallQuantity / (decimal)outitem.ProductQuantity), 2)
                        };
                        rcReturnItems.Add(rcReturnItem);
                    }
                }

                var refundProductAmount = rcReturnItems.Sum(o => o.RefundProductAmount); //退款金额合计

                var rcReturn = new CBRcReturn
                {
                    CreateBy            = soOrder.CustomerSysNo,
                    CreateDate          = DateTime.Now,
                    CustomerSysNo       = soOrder.CustomerSysNo,
                    HandleDepartment    = (int)Model.WorkflowStatus.RmaStatus.退换货处理部门.客服中心,
                    InvoiceSysNo        = soOrder.InvoiceSysNo,
                    LastUpdateBy        = soOrder.OrderCreatorSysNo,
                    LastUpdateDate      = DateTime.Now,
                    OrderSysNo          = soOrder.SysNo,
                    ReceiveAddressSysNo = soOrder.ReceiveAddressSysNo,
                    RMARemark           = "",
                    RmaType             = (int)Model.WorkflowStatus.RmaStatus.RMA类型.售后退货,
                    Source                = (int)Model.WorkflowStatus.RmaStatus.退换货申请单来源.分销商,
                    Status                = (int)Model.WorkflowStatus.RmaStatus.退换货状态.待审核,
                    WarehouseSysNo        = soOrder.DefaultWarehouseSysNo,
                    RMAItems              = rcReturnItems,
                    DeductedInvoiceAmount = 0,
                    InternalRemark        = mallRma.BuyerRmaReason,//退款说明
                    IsPickUpInvoice       = 0,
                    OrginAmount           = refundProductAmount,
                    OrginPoint            = (int)refundProductAmount,
                    RefundPoint           = (int)refundProductAmount,
                    PickUpAddressSysNo    = 0,
                    PickUpTime            = "",
                    PickupTypeSysNo       = 0,
                    RedeemAmount          = 0,
                    RefundAccount         = "",
                    RefundAccountName     = "",
                    RefundBank            = "",
                    RefundBy              = 0,
                    ShipTypeSysNo         = 0,
                    RefundDate            = DateTime.Now,
                    RefundProductAmount   = refundProductAmount,
                    RefundTotalAmount     = refundProductAmount,
                    RefundType            = (int)Hyt.Model.WorkflowStatus.RmaStatus.退换货退款方式.分销商预存
                };

                //当前操作用户
                var htyUserSysNo = IDsOrderDao.Instance.GetDealer(mallRma.DealerSysNo).UserSysNo;
                var syUser       = BLL.Sys.SyUserBo.Instance.GetSyUser(htyUserSysNo);
                var pickaddress  = BLL.Order.SoOrderBo.Instance.GetOrderReceiveAddress(soOrder.ReceiveAddressSysNo);//收货地址变成取件地址
                pickaddress.SysNo = 0;
                using (var tran = new TransactionScope())
                {
                    //创建rma单
                    var rmaSysNo = BLL.RMA.RmaBo.Instance.InsertRMA(rcReturn, pickaddress, null, syUser);
                    var htyRma   = BLL.RMA.RmaBo.Instance.GetRcReturnEntity(rmaSysNo);
                    //分销商退换货单
                    var dsReturn = new DsReturn
                    {
                        ApplicationTime        = mallRma.ApplyTime,
                        BuyerNick              = mallRma.MallBuyerName,
                        RmaRemark              = mallRma.BuyerRmaReason,
                        DealerMallSysNo        = mallRma.DealerMallSysNo,
                        MallOrderId            = mallRma.MallOrderId,
                        MallReturnAmount       = mallRma.MallRefundFee,
                        MallReturnId           = mallRma.MallRmaId,
                        BuyerRemark            = mallRma.MallRmaMessage,
                        RmaType                = (int)Model.WorkflowStatus.RmaStatus.RMA类型.售后退货,
                        RcReturnSysNo          = rmaSysNo,
                        ReturnTransactionSysNo = htyRma.TransactionSysNo
                    };



                    var dsReturnItems = new List <DsReturnItem>();
                    foreach (var rmaItem in mallRma.RmaItems)
                    {
                        var         myid        = BLL.MallSeller.DsOrderBo.Instance.GetDsOrderItemAssociationByOutStockItemNo(rmaItem.StockOutItemSysNo).Select(m => m.DsOrderItemSysNo).FirstOrDefault();
                        DsOrderItem dsOrderItem = dsOrderItems.FirstOrDefault(m => m.SysNo == myid);
                        if (dsOrderItem == null)
                        {
                            dsOrderItem = new DsOrderItem();
                        }
                        dsReturnItems.Add(new DsReturnItem
                        {
                            Amount = rmaItem.HytRmaAmount,
                            MallProductAttribute = dsOrderItem.MallProductAttribute,
                            MallProductId        = dsOrderItem.MallProductId,
                            MallProductName      = dsOrderItem.MallProductName,
                            Quantity             = rmaItem.MallQuantity
                        });
                    }

                    //创建『分销商退换货单』
                    BLL.MallSeller.DsReturnBo.Instance.Create(dsReturn, dsReturnItems);

                    if (!string.IsNullOrEmpty(mallRma.ImgPaths))
                    {
                        string[] paths = mallRma.ImgPaths.Split(',');
                        foreach (string str in paths)
                        {
                            BLL.RMA.RmaBo.Instance.InsertRMAImg(new RcReturnImage()
                            {
                                ImageUrl    = str,
                                ReturnSysNo = rmaSysNo
                            });
                        }
                    }

                    result.Message    = "操作成功。";
                    result.Status     = true;
                    result.StatusCode = rmaSysNo;

                    tran.Complete();
                }
            }
            catch
            {
                result.Message    = "操作失败。";
                result.Status     = false;
                result.StatusCode = -1;
            }

            return(result);
        }