private void Assign(StackOutItem si, InventoryOutType inventoryOutType, List <ProductInventoryItem> inventoryItems, List <ProductInventoryItem> addingItems) { List <ProductInventoryItem> items = new List <ProductInventoryItem>(); if (si.OrderItem != null) //如果出货单项有相关的订单项,那么出货时只扣除与此订单项相关的库存项和未分配给任何订单的库存项 { items.AddRange(inventoryItems.Where(item => item.ProductID == si.ProductID && item.DeliveryItem == null && item.OrderItem == si.OrderItem)); } if (inventoryOutType == InventoryOutType.FIFO) //根据产品的出货方式将未指定订单项的库存排序 { items.AddRange(from item in inventoryItems where item.ProductID == si.ProductID && item.DeliveryItem == null && item.OrderItem == null orderby item.AddDate ascending select item); } else { items.AddRange(from item in inventoryItems where item.ProductID == si.ProductID && item.DeliveryItem == null && item.OrderItem == null orderby item.AddDate descending select item); } if (items.Sum(item => item.Count) < si.Count) { throw new Exception(string.Format("产品 {0} 库存不足,出货失败!", si.ProductID)); } decimal count = si.Count; foreach (ProductInventoryItem item in items) { if (count > 0) { if (item.Count > count) //对于部分出货的情况,一条库存记录拆成两条,其中一条表示出货的,另一条表示未出货部分,即要保证DelvieryItem不为空的都是未出货的,为空的都是已经出货的 { ProductInventoryItem pii = item.Clone(); pii.ID = Guid.NewGuid(); pii.OrderItem = si.OrderItem; pii.OrderID = si.OrderID; pii.DeliveryItem = si.ID; pii.DeliverySheet = si.SheetNo; pii.Count = count; addingItems.Add(pii); item.Count -= count; count = 0; } else { item.OrderItem = si.OrderItem; item.OrderID = si.OrderID; item.DeliveryItem = si.ID; item.DeliverySheet = si.SheetNo; count -= item.Count; } } } }
private void InventoryOut(StackOutSheet sheet, InventoryOutType inventoryOutType, IUnitWork unitWork) { List <string> pids = sheet.Items.Select(it => it.ProductID).ToList(); ProductInventoryItemSearchCondition con = new ProductInventoryItemSearchCondition(); con.Products = pids; con.WareHouseID = sheet.WareHouseID; con.UnShipped = true; List <ProductInventoryItem> inventoryItems = ProviderFactory.Create <IProvider <ProductInventoryItem, Guid> >(RepoUri).GetItems(con).QueryObjects; if (inventoryItems == null || inventoryItems.Count == 0) { throw new Exception("没有找到相关的库存项"); } List <ProductInventoryItem> clones = new List <ProductInventoryItem>(); inventoryItems.ForEach(it => clones.Add(it.Clone())); //备分所有的项的克隆 List <ProductInventoryItem> addingItems = new List <ProductInventoryItem>(); //要于保存将要增加的项 ////减少库存 foreach (StackOutItem si in sheet.Items) { Product p = ProviderFactory.Create <IProvider <Product, string> >(RepoUri).GetByID(si.ProductID).QueryObject; if (p != null && p.IsService != null && p.IsService.Value) { continue; //如果是产品是服务的话就不用再从库存中扣除了 } Assign(si, inventoryOutType, inventoryItems, addingItems); } foreach (ProductInventoryItem item in inventoryItems) { ProductInventoryItem clone = clones.Single(it => it.ID == item.ID); ProviderFactory.Create <IProvider <ProductInventoryItem, Guid> >(RepoUri).Update(item, clone, unitWork); } foreach (ProductInventoryItem item in addingItems) { ProviderFactory.Create <IProvider <ProductInventoryItem, Guid> >(RepoUri).Insert(item, unitWork); } }