string result = ""; string saleNum = "";//销售单号 #region 数据有效性验证 if (stockQuantity.Count == 0) { result = "数据为空"; logtxt.txtWrite("类名:sapWcf,函数名: takeStock:盘点库存SAP传过来的数据为空", 0); return result; } if (stockQuantity[0].SaleCode == null) { logtxt.txtWrite("类名:sapWcf,函数名: takeStock:盘点库存SAP传过来的采购单号为空", 0); result = "采购单号不能为空"; return result; } logtxt.txtWrite("类名:sapWcf,函数名: takeStock:收到盘点库存数据"+stockQuantity.Count+"条数据", 0); saleNum = stockQuantity[0].SaleCode;//销售单号 #endregion try { using (dbModel mod = new dbModel())//productCode { DateTime todayTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));//今天凌晨时间 //写入前先清空数据,因为之前的盘点数据已没有意义 List isHaveOld = mod.TakeStock.Where(x => x.CreateDate < todayTime).ToList(); if (isHaveOld.Count>0) { string sql = "truncate table TakeStock "; mod.Database.ExecuteSqlCommand(sql); } //此采购单的库存数据 List stockInfo = mod.vvBase_ProductPosition.ToList(); //SAP传过来的 销售单下数据 List sapInfo = stockQuantity; //和SAP物料相同的 物料索引号集合 记录后 在源数据里删除后记录到盘点表里,--库存里有的sap里没有的 List stockQty = new List(); //和库存里物料相同的 物料索引号集合 记录后 在源数据里删除后记录到盘点表里,--sap里有的库存里没有的 List sapQty = new List(); #region 写入匹配到的物料 for (int i = 0; i < stockInfo.Count; i++) { for (int j = 0; j < sapInfo.Count; j++) { //当库存里和sap里的同一采购单下物料一样时,记录到盘点表里, 展示库存数量 和sap数量 PositionType //tracking = trackingFrom.ToString().Split('/')[0]; //tracking = tracking.Remove(0, 1); string sapTrankingNumber = stockInfo[i].ExtendField04; if (stockInfo[i].SaleCode == sapInfo[j].SaleCode && stockInfo[i].ExtendField08 == sapInfo[j].SaleItem && stockInfo[i].ProductCode == sapInfo[j].materialCode) { stockQty.Add(i); sapQty.Add(j); TakeStock check = new TakeStock(); check.ProcureCode = sapInfo[j].SaleCode;//采购单号 check.ProcureItem = sapInfo[j].SaleItem;//采购项号 check.MateralCode = sapInfo[j].materialCode;//物料编号 check.MateralName = sapInfo[j].materialName;//物料名称 check.Unit = sapInfo[j].stockUnit;//SAP单位 check.SapQuantity = sapInfo[j].stockQuantity;//SAP数量 check.Ex1 = stockInfo[i].SmallUnit;//库存单位 check.StockQuantity = stockInfo[i].ProductStorage;//库存数量 check.Ex2 = sapInfo[j].isStock == 1 ? "常规货位" : "暂存区";//库存单位 check.CreateDate = DateTime.Now;//创建时间 mod.TakeStock.Add(check); } } } #endregion #region 先移除库存里和sap里匹配到已写入的数据 if (stockQty.Count > 0) { for (int k = 0; k < stockQty.Count; k++) { stockInfo.Remove(stockInfo[stockQty[k]]); } } #endregion #region 判断库存里有的,sap里没有的物料,如果有就写入到盘点表里 // if (stockInfo.Count > 0) { foreach (var stock in stockInfo) { TakeStock check = new TakeStock(); check.ProcureCode = stock.PoCode;//采购单号 check.ProcureItem = stock.ExtendField09;//采购项号 check.MateralCode = stock.ProductCode;//物料编号 check.MateralName = stock.ProductName;//物料名称 check.Unit = "";//SAP单位 check.SapQuantity = 0;//SAP数量 check.Ex1 = stock.ExtendField05;//库存单位 check.StockQuantity = stock.ProductStorage;//库存数量 check.CreateDate = DateTime.Now;//创建时间 mod.TakeStock.Add(check); } } #endregion #region 写入SAP有的库存没有的数据总和 //先移除库存里和sap里匹配到已写入的数据 if (sapQty.Count > 0) { for (int m = 0; m < sapQty.Count; m++) { sapInfo.Remove(sapInfo[sapQty[m]]); } } //判断有没有库存里有的,sap里没有的物料,如果有就写入到盘点表里 if (sapInfo.Count > 0) { foreach (var sapStock in sapInfo) { TakeStock check = new TakeStock(); check.ProcureCode = sapStock.SaleCode;//销售单号 check.ProcureItem = sapStock.SaleItem;//销售项 check.MateralCode = sapStock.materialCode;//物料编号 check.MateralName = sapStock.materialName;//物料名称 check.Unit = sapStock.stockUnit;//SAP单位 check.SapQuantity = sapStock.stockQuantity;//SAP数量 check.Ex1 = "";//库存单位 check.StockQuantity = 0;//库存数量 check.CreateDate = DateTime.Now;//创建时间 mod.TakeStock.Add(check); } } #endregion int resultNum = mod.SaveChanges(); if (resultNum < 1) { result = "保存失败"; } } } catch (Exception ex) { result += "\r\n" + ex.Message; } return result;