Example #1
0
        private void UpdateSaleDetailOfBackNum(OPC_SaleDetail saleDetail, int backCount, YintaiHZhouContext db)
        {
            OPC_SaleDetail sd = db.OPC_SaleDetails.FirstOrDefault(x => x.Id == saleDetail.Id);

            if (sd == null)
            {
                throw new RmaException("不存在的销售单明细");
            }
            sd.BackNumber = (sd.BackNumber.HasValue ? sd.BackNumber.Value : 0) + backCount;
            db.SaveChanges();
        }
 public SectionSaleDetailInfo(int sectionId, OPC_SaleDetail saleDetail)
 {
     _sectionId  = sectionId;
     _saleDetail = saleDetail;
 }
Example #3
0
        private void CreateSaleRmaSub(int userId, RMARequest rma, string saleSource)
        {
            if (string.Empty == rma.Remark)
            {
                throw new RmaException(string.Format("没有退货备注,订单明细号:{0}", rma.OrderNo));
            }

            List <OPC_SaleDetail> saleDetails =
                _saleDetailRepository.GetByOrderNo(rma.OrderNo, 1, 1000).Result.Where(t => !t.BackNumber.HasValue || t.BackNumber.Value < t.SaleCount).OrderByDescending(t => t.SaleCount).ToList();
            List <OPC_Sale> sales =
                _saleRepository.GetByOrderNo(rma.OrderNo, -1).OrderByDescending(t => t.SalesCount).ToList();
            IList <OrderItem> orderItems =
                _orderItemRepository.GetByIDs(rma.ReturnProducts.Select(t => t.Key));

            using (var db = new YintaiHZhouContext())
                using (var ts = new TransactionScope())
                {
                    IList <RmaConfig> rmaInfos = new List <RmaConfig>();
                    foreach (var kv in rma.ReturnProducts)
                    {
                        var orderItemId = kv.Key;
                        var rmaCount    = kv.Value;
                        var item        = db.Set <OrderItem>().FirstOrDefault(x => x.Id == orderItemId);
                        if (item == null)
                        {
                            throw new RmaException(string.Format("无效的商品明细记录({0})或商品ID({1})", kv.Key, kv.Value));
                        }

                        var items = from i in db.Set <RMAItem>()
                                    from r in db.Set <RMA>()
                                    from o in db.Set <Order>()
                                    where
                                    i.RMANo == r.RMANo &&
                                    r.OrderNo == o.OrderNo &&
                                    i.ProductId == item.ProductId &&
                                    o.OrderNo == rma.OrderNo &&
                                    !InvalidRmaStatus.Contains(r.Status)

                                    select i;

                        int countOfItems = items.Any() ? items.Sum(i => i.Quantity) : 0;

                        if (item.Quantity - countOfItems < rmaCount)
                        {
                            throw new RmaException("退货数量大于可退货数量");
                        }

                        OrderItem oItem = orderItems.FirstOrDefault(t => t.Id == kv.Key);

                        List <OPC_SaleDetail> details =
                            saleDetails.Where(t => t.OrderItemId == kv.Key).OrderByDescending(t => t.SaleCount).ToList();
                        int            returnCount = kv.Value;
                        OPC_SaleDetail detail      = details.FirstOrDefault();
                        if (detail == null)
                        {
                            //没有销售明细
                            throw new RmaException(string.Format("没有销售明细不存在,订单明细号:{0}", kv.Key));
                        }

                        while (detail != null && returnCount > CalculateRmaCount(detail))
                        {
                            RmaConfig opcRma = rmaInfos.FirstOrDefault(t => t.SaleOrderNo == detail.SaleOrderNo);
                            if (opcRma == null)
                            {
                                opcRma = new RmaConfig(userId)
                                {
                                    SaleRmaSource = saleSource,
                                    RmaNo         = CreateRmaNo(),
                                    SaleOrderNo   = detail.SaleOrderNo,
                                    RefundAmount  = rma.RealRMASumMoney,
                                    StoreFee      = rma.StoreFee,
                                    CustomFee     = rma.CustomFee
                                };
                                rma.RealRMASumMoney = 0;
                                rma.StoreFee        = 0;
                                rma.CustomFee       = 0;

                                opcRma.OpcSale = sales.FirstOrDefault(t => t.SaleOrderNo == opcRma.SaleOrderNo);
                                opcRma.StoreID = _sectionRepository.GetByID(opcRma.OpcSale.SectionId.Value).StoreId.Value;
                                rmaInfos.Add(opcRma);
                            }

                            int countCanRMA = CalculateRmaCount(detail);

                            var opcRmaDetail = new SubRmaConfig
                            {
                                OpcSaleDetail = detail,
                                OrderItem     = oItem,
                                OrderDetailId = kv.Key,
                                ReturnCount   = countCanRMA
                            };
                            opcRma.Details.Add(opcRmaDetail);
                            rmaInfos.Add(opcRma);

                            //更新退货数量
                            UpdateSaleDetailOfBackNum(detail, countCanRMA, db);

                            returnCount = returnCount - countCanRMA;
                            details.Remove(detail);
                            detail = details.FirstOrDefault();
                        }

                        if (returnCount > 0)
                        {
                            RmaConfig config = rmaInfos.FirstOrDefault(t => t.SaleOrderNo == detail.SaleOrderNo);
                            if (config == null)
                            {
                                config = new RmaConfig(userId)
                                {
                                    SaleRmaSource = saleSource,
                                    Reason        = rma.Remark,
                                    SaleOrderNo   = detail.SaleOrderNo,
                                    RefundAmount  = rma.RealRMASumMoney,
                                    StoreFee      = rma.StoreFee,
                                    CustomFee     = rma.CustomFee
                                };

                                config.OpcSale = sales.FirstOrDefault(t => t.SaleOrderNo == config.SaleOrderNo);
                                config.StoreID = _sectionRepository.GetByID(config.OpcSale.SectionId.Value).StoreId.Value;
                                config.RmaNo   = CreateRmaNo();
                                rmaInfos.Add(config);
                            }
                            var subConfig = new SubRmaConfig
                            {
                                OpcSaleDetail = detail,
                                OrderItem     = oItem,
                                OrderDetailId = kv.Key,
                                ReturnCount   = returnCount
                            };
                            config.Details.Add(subConfig);
                            //更新退货数量
                            UpdateSaleDetailOfBackNum(detail, returnCount, db);
                        }
                    }
                    Save(rmaInfos);
                    ts.Complete();
                }
        }
Example #4
0
 /// <summary>
 /// 计算销售单明细可以退货的数量
 /// </summary>
 /// <param name="detail"></param>
 /// <returns></returns>
 private int CalculateRmaCount(OPC_SaleDetail detail)
 {
     return(detail.SaleCount - (detail.BackNumber.HasValue ? detail.BackNumber.Value : 0));
 }