using Admin.NET.Application; using Admin.NET.Core; using Admin.NET.Core.EnterWareHouseModule; using Admin.NET.Core.QualityControl.Enum; using Admin.NET.Core.ReceivingModule.Enum; using Admin.NET.Core.WareHouse.Enum; using Furion.Extras.Admin.NET; using iWareCommon.Utils; using iWareModel; using iWareSql.DataAccess; using iWareSql.MyDbContext; using iWareTestForm; using iWareTestForm.Model; using iWareTestForm.Utility; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NPOI.SS.Formula.Functions; using NPOI.XWPF.UserModel; using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.SqlClient; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices.ComTypes; using System.Runtime.Remoting.Contexts; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; using Yitter.IdGenerator; namespace XiGang_iWareTestForm.iWareTest.DialogForm { public partial class TestBatchForm : Form { delegate void Delegate_SetPostResult2(string content); public TestBatchForm() { InitializeComponent(); } Thread readThread = null; private bool isQueryIsBackflush = false; private void LoadItemType() { List itemList = new List(); itemList.Add(new ListItem() { Text = "发送机", Value = "1" }); itemList.Add(new ListItem() { Text = "托盘", Value = "2" }); foreach (var item in itemList) { this.cmbItemType.Items.Add(item); } cmbItemType.SelectedIndex = 1; } /// /// 显示请求结果 /// /// private void ShowResult(string content) { if (this.tb_Log.InvokeRequired) { Delegate_SetPostResult2 delegate_SetPostResult = new Delegate_SetPostResult2(ShowResult); this.Invoke(delegate_SetPostResult, new object[] { content }); } else { //content += "\r\n"; this.tb_Log.Text = StringHelper.GetLog(content) + this.tb_Log.Text; } } private void button2_Click(object sender, EventArgs e) { //ClearPlace(); } private void TestBatchForm_Load(object sender, EventArgs e) { LoadItemType(); this.tb_SalverCount.Text = "1"; } private void button3_Click(object sender, EventArgs e) { var name = "JYQY"; List addList = new List(); //借用单库存增加 using (MyDbContext dbContext = new MyDbContext()) { var ddd = dbContext.ware_location_vs_container.Where(x => x.WareContainerCode == name).FirstOrDefault(); if (ddd == null) { //默认自己写入 ddd = new ware_location_vs_container() { Id = Yitter.IdGenerator.YitIdHelper.NextId(), WareContainerCode = name, WareContainerName = name, WareLocationCode = name, IsEmptyContainer = false, IsDeleted = false }; dbContext.ware_location_vs_container.Add(ddd); } //获取所有 借用单的明细 var orders = dbContext.ware_orders.Where(x => x.OrderType == "11" && (x.IsDeleted == null || x.IsDeleted == false)).ToList(); var ids = orders.Select(y => y.Id).ToList(); var details = dbContext.ware_orders_details.Where(x => ids.Contains(x.OrdersId) && (x.IsDeleted == null || x.IsDeleted == false)).ToList(); //汇总库存 var barno = CreateBatchNo(""); var groups = details.GroupBy(x => x.WareMaterialCode); ware_container_vs_material aa = null; foreach (var item in groups) { var _list = item.ToList(); decimal? qty = _list.Sum(x => x.Quantity); var materialCode = _list.First().WareMaterialCode; aa = new ware_container_vs_material { Id = Yitter.IdGenerator.YitIdHelper.NextId(), locationVsContainerid = ddd.Id, WareContainerCode = name, WareMaterialCode = materialCode, Quantity = qty, PurchaseNo = "", DeliveryNo = "", CollectNo = "", OCCQuantity = 0, ITEMBATCHNO = "", OrdersNo = "",//入库单号 Status = 0, TenantId = null, CreatedTime = DateTime.Now, //CreatedUserId = CurrentUserInfo.UserId, //CreatedUserName = CurrentUserInfo.Name, IsLocked = false, //LockRemark = "平库入库,新增物料,初始为false", DoLockTime = DateTime.Now, IsDeleted = false, Remarks = "自动插入", StockStatus = 2, BarNo = barno, //MaterialType = item.ma, LocationType = 2, //MaterialRegionId = wareRegion.Id, //MaterialRegionCode = wareRegion.Code, //MaterialRegionName = wareRegion.Name //, // CustomerCode = CustomerCode //, // MachineToolName = MachineToolName //, // MachineToolId = MachineToolId, // RealWareContainerCode = realWareContainerCode //记录真实的托盘号,用于展示组盘区域中的真实托盘号 [Editby shaocx,2023-01-31] }; addList.Add(aa); } dbContext.ware_container_vs_material.AddRange(addList); dbContext.SaveChanges(); } ShowResult($"新增{addList.Count}条"); } /// /// 生成批次号 /// /// /// public string CreateBatchNo(string prefix) { Thread.Sleep(10); int iSeed = 10000; string num = new Random(Guid.NewGuid().GetHashCode()).Next(1, iSeed).ToString(); string BarNo = "WH" + DateTime.Now.ToString("yyyyMMddHHmmss") + num.ToString(); return BarNo; } private List GetString() { List list = new List(); list.Add("2-01-10-02".Trim()); list.Add("1-01-04-01".Trim()); list.Add("1-01-06-04".Trim()); return list; } private void button1_Click(object sender, EventArgs e) { //零件归还管理增加 List ware_Sorting_Details = new List(); //借用单库存增加 using (MyDbContext dbContext = new MyDbContext()) { //获取所有 借用单的明细 var orders = dbContext.ware_orders.Where(x => x.OrderType == "11" && x.OrderNo == "借用" && (x.IsDeleted == null || x.IsDeleted == false)).ToList(); var ids = orders.Select(y => y.Id).ToList(); var details = dbContext.ware_orders_details.Where(x => ids.Contains(x.OrdersId) && (x.IsDeleted == null || x.IsDeleted == false)).ToList(); // 创建分拣订单 var sortingOrder = new ware_sorting { Id = Yitter.IdGenerator.YitIdHelper.NextId(), OrderNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(), OrderType = "1",//借用取货单 Remarks = "分拣单创建", OrderStatus = (int)EnumWarehousStatus.Completed, IsDeleted = false, Status = 0 }; List str = new List(); List str1 = new List(); foreach (var item in details) { ware_Sorting_Details.Add(new ware_sorting_details { Status = 0, Id = Yitter.IdGenerator.YitIdHelper.NextId(), OrdersId = sortingOrder.Id, WareContainerCode = "", WareContainerName = "", WareMaterialCode = item.WareMaterialCode, WareMaterialName = "", Unit = "", CompleteQuantity = item.Quantity, Quantity = item.Quantity, OrderStatus = (int)EnumWarehousStatus.Completed, DeliveryNo = "借用", IsDeleted = false }); } dbContext.ware_sorting.Add(sortingOrder); dbContext.ware_sorting_details.AddRange(ware_Sorting_Details); dbContext.SaveChanges(); } ShowResult($"新增{ware_Sorting_Details.Count}条"); } private void btn_SelectFile_Click(object sender, EventArgs e) { OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.Multiselect = true; fileDialog.Title = "请选择文件"; fileDialog.Filter = "所有文件(*xls*)|*.xls*"; //设置要选择的文件的类型 if (fileDialog.ShowDialog() == DialogResult.OK) { string file = fileDialog.FileName;//返回文件的完整路径 this.tb_FilePath.Text = file; } } private void button4_Click(object sender, EventArgs e) { //采购单明细中没有行号的赋值为有值 //零件归还管理增加 List orders = new List(); //借用单库存增加 using (MyDbContext dbContext = new MyDbContext()) { //获取所有 借用单的明细 orders = dbContext.ware_purchase_order_details.Where(x => (x.EBELP == null || x.EBELP == "")).ToList(); foreach (var item in orders) { item.EBELP = Yitter.IdGenerator.YitIdHelper.NextId().ToString(); } dbContext.SaveChanges(); } ShowResult($"新增{orders.Count}条"); } private void button5_Click(object sender, EventArgs e) { readThread = new Thread(_button5_Click); readThread.IsBackground = true; readThread.Start(); } private void _button5_Click() { List errList = new List(); int addCount = 0, updateCount = 0; //批量更新容器的栅格数(生产库用) string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { { "LocationCode", "库位编号" }, { "GridNumber", "栅格数" } }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List myLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } var noFoundLocation = ""; var noFoundLocationCount = 0; List addList = new List(); ware_container_vs_material aa = null; using (MyDbContext dbContext = new MyDbContext()) { foreach (var item in myLocationList) { SimulatorCommonHelper.GetGridNumber(item); var los = dbContext.ware_location.Where(x => x.Code == item.LocationCode && (x.IsDeleted == null || x.IsDeleted == false)).ToList(); if (los == null || los.Count == 0) { errList.Add(new FunRetEntity() { resData = item.LocationCode, resMsg = $"{item.LocationCode}库位没有找到" }); ShowResult($"{item.LocationCode}库位没有找到"); noFoundLocation += item.LocationCode + " \r\n "; noFoundLocationCount++; //需要初始化库位数据 var _goodSheId = ""; if (item.LocationCode.Contains("A1")) { _goodSheId = "A1"; } else if (item.LocationCode.Contains("A2")) { _goodSheId = "A2"; } else if (item.LocationCode.Contains("A3")) { _goodSheId = "A3"; } var add_location = new ware_location() { Id = Yitter.IdGenerator.YitIdHelper.NextId(), Code = item.LocationCode, Name = item.LocationCode, IsVirtual = 0, IsLocked = 0, GoodSheId = _goodSheId, Lane = _goodSheId, IsDeleted = false, CreatedTime = DateTime.Now, UpdatedTime = DateTime.Now, CreatedUserName = "系统初始", UpdatedUserName = "系统初始", Status = 0, }; dbContext.ware_location.Add(add_location); } else if (los.Count > 1) { //数据不正确 errList.Add(new FunRetEntity() { resData = item.LocationCode, resMsg = $"{item.LocationCode}库位数超过了1条" }); ShowResult($"{item.LocationCode}库位数超过了1条"); } var ddds = dbContext.ware_container.Where(x => x.Code == item.LocationCode && (x.IsDeleted == null || x.IsDeleted == false)).ToList(); if (ddds == null || ddds.Count == 0) { //新增 var add_container = new ware_container() { IsDeleted = false, IsVirtual = 1, Id = Yitter.IdGenerator.YitIdHelper.NextId(), Code = item.LocationCode, Name = item.LocationCode, CreatedTime = DateTime.Now, UpdatedTime = DateTime.Now, CreatedUserName = "系统初始", UpdatedUserName = "系统初始", Status = 0, GridNumber = Convert.ToInt32(item.GridNumber) }; //计算已占用栅格数 add_container.UseNumber = ContainerHandler.ReCalcUseNumber(dbContext, item.LocationCode); dbContext.ware_container.Add(add_container); addCount++; ShowResult($"{item.LocationCode} 新增一条ware_container数据 "); } else if (ddds.Count > 1) { //数据不正确 errList.Add(new FunRetEntity() { resData = item.LocationCode, resMsg = $"{item.LocationCode}容器数超过了1条" }); ShowResult($"{item.LocationCode}容器数超过了1条"); } else {//已存在 var db_container = ddds.FirstOrDefault(); db_container.GridNumber = Convert.ToInt32(item.GridNumber); //计算已占用栅格数 db_container.UseNumber = ContainerHandler.ReCalcUseNumber(dbContext, item.LocationCode); updateCount++; ShowResult($"{item.LocationCode}更新了1条"); } } dbContext.SaveChanges(); } ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); ShowResult($"未找到库位{noFoundLocationCount}条," + noFoundLocation); } private void button6_Click(object sender, EventArgs e) { this.tb_Yitter.Text = Yitter.IdGenerator.YitIdHelper.NextId().ToString(); ShowResult(this.tb_Yitter.Text); } private void button7_Click(object sender, EventArgs e) { //导入物料大类 List errList = new List(); int addCount = 0, updateCount = 0; string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { { "Code", "编号" }, { "Category", "大类" } }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List myLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } List addList = new List(); ware_container_vs_material aa = null; using (MyDbContext dbContext = new MyDbContext()) { foreach (var item in myLocationList) { var los = dbContext.ware_material.Where(x => x.Code == item.Code && (x.IsDeleted == null || x.IsDeleted == false)).ToList(); if (los == null || los.Count == 0) { errList.Add(new FunRetEntity() { resData = item.Code, resMsg = $"{item.Code} 物料没有找到" }); ; ; } else if (los.Count > 1) { //数据不正确 errList.Add(new FunRetEntity() { resData = item.Code, resMsg = $"{item.Code}物料数超过了1条" }); ; ; } else { los.First().Category = item.Category; } } dbContext.SaveChanges(); } ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); } private void button8_Click(object sender, EventArgs e) { //初始化 表ware_location_vs_container List errList = new List(); int addCount = 0, updateCount = 0; using (MyDbContext dbContext = new MyDbContext()) { var los = dbContext.ware_location.Where(x => (x.IsDeleted == null || x.IsDeleted == false)).ToList(); if (los != null) { foreach (var item in los) { var lvs = dbContext.ware_location_vs_container.Where(x => (x.IsDeleted == null || x.IsDeleted == false) && x.WareLocationCode == item.Code).FirstOrDefault(); if (lvs == null) { var add_container = new ware_location_vs_container() { IsDeleted = false, Id = Yitter.IdGenerator.YitIdHelper.NextId(), WareLocationCode = item.Code, WareContainerCode = item.Code, CreatedTime = DateTime.Now, UpdatedTime = DateTime.Now, CreatedUserName = "系统初始", UpdatedUserName = "系统初始", //Status = 0, }; dbContext.ware_location_vs_container.Add(add_container); addCount++; dbContext.SaveChanges(); } } } } ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); } private void button9_Click(object sender, EventArgs e) { //生产库导入库存 var preStr = "[生产库]导入库存!======"; List errList = new List(); int addCount = 0, updateCount = 0; string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { { "LocationCode", "库位号" }, { "MaterialCode", "物料号" }, { "Quantity", "实际数量" }, { "MaterialName", "物料描述" } }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List myLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } List addList = new List(); ware_container_vs_material aa = null; foreach (var item in myLocationList) { if (item.Quantity <= 0) { continue; } if (string.IsNullOrEmpty(item.LocationCode) || string.IsNullOrEmpty(item.MaterialCode)) { continue; } using (MyDbContext dbContext = new MyDbContext()) { //原则是 如果库位上没有该物料,就新增。如果库位上有该物料,就判断数量 //数量少的话,就报错。 //数量多的话,就更新新增数量 var dbList = dbContext.ware_container_vs_material.Where(x => x.IsDeleted == false && x.WareContainerCode == item.LocationCode && x.WareMaterialCode == item.MaterialCode).ToList(); if (dbList == null || dbList.Count == 0) { //新增库存 aa = new ware_container_vs_material { Id = Yitter.IdGenerator.YitIdHelper.NextId(), //locationVsContainerid = ddd.Id, WareContainerCode = item.LocationCode, WareMaterialCode = item.MaterialCode, Quantity = item.Quantity, PurchaseNo = "", DeliveryNo = "", CollectNo = "", OCCQuantity = 0, ITEMBATCHNO = "", OrdersNo = "",//入库单号 Status = 0, TenantId = null, CreatedTime = DateTime.Now, //CreatedUserId = CurrentUserInfo.UserId, //CreatedUserName = CurrentUserInfo.Name, IsLocked = false, //LockRemark = "平库入库,新增物料,初始为false", DoLockTime = DateTime.Now, IsDeleted = false, Remarks = "自动插入", StockStatus = 2, CheckStatus = 1, BarNo = CreateBatchNo(""), //MaterialType = item.ma, LocationType = 2, //MaterialRegionId = wareRegion.Id, //MaterialRegionCode = wareRegion.Code, //MaterialRegionName = wareRegion.Name //, // CustomerCode = CustomerCode //, // MachineToolName = MachineToolName //, // MachineToolId = MachineToolId, // RealWareContainerCode = realWareContainerCode //记录真实的托盘号,用于展示组盘区域中的真实托盘号 [Editby shaocx,2023-01-31] }; dbContext.ware_container_vs_material.Add(aa); Log4NetHelper.WriteInfoLog(LogType.Sys_DeleteLog, preStr + "新增库存:" + JsonConvert.SerializeObject(aa)); addCount++; } else { //存在库存。 //如果是库存相等,就不管 var curStoreQty = dbList.Sum(x => (x.Quantity - x.OCCQuantity)); if (curStoreQty == item.Quantity) { Log4NetHelper.WriteInfoLog(LogType.Sys_DeleteLog, preStr + "数量相同,不处理库存:" + JsonConvert.SerializeObject(item)); continue; } else if (curStoreQty > item.Quantity) { Log4NetHelper.WriteErrorLog(LogType.Sys_DeleteLog, preStr + $"库存{curStoreQty}大于表格数量{item.Quantity},不处理库存:" + JsonConvert.SerializeObject(item), null); continue; } else { Log4NetHelper.WriteErrorLog(LogType.Sys_DeleteLog, preStr + $"库存{curStoreQty}小于表格数量{item.Quantity},不处理库存:" + JsonConvert.SerializeObject(item), null); continue; } } dbContext.SaveChanges(); } } ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); } private void button10_Click(object sender, EventArgs e) { //分析库位是否配置正确 //初始化 表ware_location_vs_container List errList = new List(); int addCount = 0, updateCount = 0; int allCount = 0; using (MyDbContext dbContext = new MyDbContext()) { var los = dbContext.ware_location.Where(x => (x.IsDeleted == null || x.IsDeleted == false) && x.IsVirtual == 0).ToList(); allCount = los.Count; if (los != null) { foreach (var item in los) { var arr = item.Code.Split('-');//这里只是立体库,不考虑平库 【Edity shaocx,2022-12-7】 if (arr.Length != 4) { errList.Add(new FunRetEntity() { resMsg = $"库位分隔不对:" + item.Code }); } //3-4-3-3 //巷道-列-排-层 var lane = arr[0]; var _Column = arr[1]; var _Row = arr[2]; var _Layer = arr[3]; if (item.Name != item.Code) { errList.Add(new FunRetEntity() { resMsg = $"库位{item.Code}名字不对,实际{item.Code},配置的是{item.Name}" }); } if (lane != item.Lane.ToString()) { errList.Add(new FunRetEntity() { resMsg = $"库位{item.Code}巷道不对,实际{lane},配置的是{item.Lane}" }); } if (_Column != item.Column.ToString()) { errList.Add(new FunRetEntity() { resMsg = $"库位{item.Code}列不对,实际{_Column},配置的是{item.Column}" }); } if (_Row != item.Row.ToString()) { errList.Add(new FunRetEntity() { resMsg = $"库位{item.Code}排不对,实际{_Row},配置的是{item.Lane}" }); } if (_Layer != item.Layer.ToString()) { errList.Add(new FunRetEntity() { resMsg = $"库位{item.Code}层不对,实际{_Layer},配置的是{item.Layer}" }); } } } } ShowResult($"总库位{allCount}条"); //ShowResult($"新增{addCount}条"); //ShowResult($"更新{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); } private void button11_Click(object sender, EventArgs e) { readThread = new Thread(_button11_Click); readThread.IsBackground = true; readThread.Start(); } private void _button11_Click() { //根据物料初始化库存 //生产库导入库存 var preStr = "[生产库]根据物料初始化库存!======"; List errList = new List(); int addCount = 0, updateCount = 0; string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { //{ "LocationCode", "库位号" }, { "MaterialCode", "物料编号" }, //{ "Quantity", "实际数量" }, //{ "MaterialName", "物料描述" } }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List myLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } List addList = new List(); ware_container_vs_material aa = null; foreach (var item in myLocationList) { if (string.IsNullOrEmpty(item.MaterialCode)) { continue; } using (MyDbContext dbContext = new MyDbContext()) { var locationCodeList = dbContext.ware_location.Where(x => x.IsDeleted == false && (x.Code.Contains("A1") || x.Code.Contains("A2") || x.Code.Contains("A3")) ).ToList(); var locationCode = locationCodeList.OrderBy(f => Guid.NewGuid()).First().Code; var dbList = dbContext.ware_container_vs_material.Where(x => x.IsDeleted == false && (x.WareContainerCode.Contains("A1") || x.WareContainerCode.Contains("A2") || x.WareContainerCode.Contains("A3")) && x.WareMaterialCode == item.MaterialCode).ToList(); if (dbList == null || dbList.Count == 0) { //新增库存 aa = new ware_container_vs_material { Id = Yitter.IdGenerator.YitIdHelper.NextId(), //locationVsContainerid = ddd.Id, WareContainerCode = locationCode, WareMaterialCode = item.MaterialCode, Quantity = 10000, PurchaseNo = "", DeliveryNo = "", CollectNo = "", OCCQuantity = 0, ITEMBATCHNO = "", OrdersNo = "",//入库单号 Status = 0, TenantId = null, CreatedTime = DateTime.Now, //CreatedUserId = CurrentUserInfo.UserId, //CreatedUserName = CurrentUserInfo.Name, IsLocked = false, //LockRemark = "平库入库,新增物料,初始为false", DoLockTime = DateTime.Now, CheckStatus = 1, Sap_Location = "MSTG", IsDeleted = false, Remarks = "自动插入", StockStatus = 2, BarNo = CreateBatchNo(""), //MaterialType = item.ma, LocationType = 2, //MaterialRegionId = wareRegion.Id, //MaterialRegionCode = wareRegion.Code, //MaterialRegionName = wareRegion.Name //, // CustomerCode = CustomerCode //, // MachineToolName = MachineToolName //, // MachineToolId = MachineToolId, // RealWareContainerCode = realWareContainerCode //记录真实的托盘号,用于展示组盘区域中的真实托盘号 [Editby shaocx,2023-01-31] }; dbContext.ware_container_vs_material.Add(aa); ShowResult($"新增{aa.WareMaterialCode}物料,库位{aa.WareContainerCode}"); Log4NetHelper.WriteInfoLog(LogType.Sys_DeleteLog, preStr + "新增库存:" + JsonConvert.SerializeObject(aa)); addCount++; } else { dbList.First().Quantity += 10000; } dbContext.SaveChanges(); } } ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); } private void button12_Click(object sender, EventArgs e) { //初始化po单的行号 using (MyDbContext dbContext = new MyDbContext()) { var _list = dbContext.ware_purchase_order_details.Where(x => string.IsNullOrEmpty(x.EBELP)).ToList(); for (int i = 0; i < _list.Count; i++) { _list[i].EBELP = BLLHelpler.AutoCompleEBELP((i + 1).ToString()); } dbContext.SaveChanges(); } } private void button13_Click(object sender, EventArgs e) { //初始化DO单的行号 using (MyDbContext dbContext = new MyDbContext()) { var _list = dbContext.ware_orders_details.Where(x => string.IsNullOrEmpty(x.LineNumber)).ToList(); for (int i = 0; i < _list.Count; i++) { _list[i].LineNumber = BLLHelpler.AutoCompleEBELP((i + 1).ToString()); } dbContext.SaveChanges(); } } private void button14_Click(object sender, EventArgs e) { //根据盘点Excel更新库存 var preStr = "[生产库]导入库存!======"; List errList = new List(); int addCount = 0, updateCount = 0, deleteCount = 0; string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { { "MaterialCode", "物料编号" }, { "MaterialName", "物料名称" }, { "Quantity", "库存数量" }, { "LocationCode", "库位编号" }, { "Area", "库区" }, { "Days", "库龄(天)" }, { "SupplierNo", "供应商编号" }, { "SupplierName", "供应商名称" }, { "IsDel", "是否删除" }, }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List myLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } //校验数据 int aa_rowNum = 0; foreach (var item in myLocationList) { aa_rowNum++; if (item.Quantity < 0) { MessageBox.Show($"第{aa_rowNum}行数量不能是负数{item.Quantity}"); return; } if (string.IsNullOrEmpty(item.LocationCode) || string.IsNullOrEmpty(item.MaterialCode)) { MessageBox.Show($"第{aa_rowNum}行库位号或物料号不能为空"); return; } if (item.IsDel == "是") { MessageBox.Show($"第{aa_rowNum}行不支持标记删除的数据,你可以在excel中移除该行"); return; } } var group = myLocationList.GroupBy(x => new { x.LocationCode, x.MaterialCode }); foreach (var g in group) { if (g.ToList().Count > 1) { MessageBox.Show($"存在库位号{g.Key.LocationCode},物料号{g.Key.MaterialCode}多条数据的情况"); return; } } myLocationList = myLocationList.OrderBy(x => x.LocationCode).ThenBy(x => x.MaterialCode).ToList(); List addList = new List(); ware_container_vs_material aa = null; int rowNum = 0; foreach (var item in myLocationList) { rowNum++; if (item.Quantity < 0) { MessageBox.Show($"第{rowNum}行数量不能是负数{item.Quantity}"); return; } if (string.IsNullOrEmpty(item.LocationCode) || string.IsNullOrEmpty(item.MaterialCode)) { continue; } using (MyDbContext dbContext = new MyDbContext()) { //原则是 如果库位上没有该物料,就新增。如果库位上有该物料,就判断数量 //数量少的话,就报错。 //数量多的话,就更新新增数量 var dbList = dbContext.ware_container_vs_material.Where(x => x.IsDeleted == false && x.WareContainerCode == item.LocationCode && x.WareMaterialCode == item.MaterialCode).ToList(); if (dbList == null || dbList.Count == 0) { if (item.IsDel == "是" || item.Quantity == 0) { } else { Thread.Sleep(1000); //新增库存 aa = new ware_container_vs_material { Id = Yitter.IdGenerator.YitIdHelper.NextId(), //locationVsContainerid = ddd.Id, WareContainerCode = item.LocationCode, WareMaterialCode = item.MaterialCode, Quantity = item.Quantity, PurchaseNo = "", DeliveryNo = "", CollectNo = "", OCCQuantity = 0, ITEMBATCHNO = "", OrdersNo = "",//入库单号 Status = 0, TenantId = null, CreatedTime = DateTime.Now, //CreatedUserId = CurrentUserInfo.UserId, //CreatedUserName = CurrentUserInfo.Name, IsLocked = false, //LockRemark = "平库入库,新增物料,初始为false", DoLockTime = DateTime.Now, IsDeleted = false, Remarks = "自动插入", StockStatus = 2, BarNo = CreateBatchNo(""), //MaterialType = item.ma, LocationType = 2, //MaterialRegionId = wareRegion.Id, //MaterialRegionCode = wareRegion.Code, //MaterialRegionName = wareRegion.Name //, // CustomerCode = CustomerCode //, // MachineToolName = MachineToolName //, // MachineToolId = MachineToolId, // RealWareContainerCode = realWareContainerCode //记录真实的托盘号,用于展示组盘区域中的真实托盘号 [Editby shaocx,2023-01-31] }; dbContext.ware_container_vs_material.Add(aa); Log4NetHelper.WriteInfoLog(LogType.Sys_DeleteLog, preStr + "新增库存:" + JsonConvert.SerializeObject(aa)); addCount++; } } else { if (item.IsDel == "是" || item.Quantity == 0) { dbContext.ware_container_vs_material.RemoveRange(dbList); deleteCount += dbList.Count(); } else { //存在库存。 //如果是库存相等,就不管 var curStoreQty = dbList.Sum(x => (x.Quantity - x.OCCQuantity)); if (curStoreQty == item.Quantity) { Log4NetHelper.WriteInfoLog(LogType.Sys_DeleteLog, preStr + "数量相同,不处理库存:" + JsonConvert.SerializeObject(item)); continue; } else if (curStoreQty > item.Quantity) {//数量多(当前库存多,要更新成的库存少) var chaQty = curStoreQty - item.Quantity;//少的差额数量 var mydb = dbList.Where(x => (x.Quantity - x.OCCQuantity) == chaQty).FirstOrDefault(); if (mydb != null) { dbContext.ware_container_vs_material.Remove(mydb); deleteCount++; } else { //随便找一个赋值,然后删除其他的就可以了 int index = 0; foreach (var iDb in dbList) { if (index == 0) { iDb.Quantity = item.Quantity; iDb.OCCQuantity = 0; updateCount++; } else { dbContext.ware_container_vs_material.Remove(iDb); deleteCount++; } index++; } } } else {//数量少 (当前库存少,要更新成的库存多) var chaQty = item.Quantity - curStoreQty;//多出的差额数量 dbList.First().Quantity += chaQty; updateCount++; } } } int i = dbContext.SaveChanges(); } } //处理完后,再将哪些没有列入Excel里的数据删除 var queryLcoations = myLocationList.Select(x => x.LocationCode).ToList(); using (MyDbContext dbContext = new MyDbContext()) { List removeList = new List(); var stores = dbContext.ware_container_vs_material.Where(x => x.IsDeleted == false && queryLcoations.Contains(x.WareContainerCode)).ToList(); var doGrou = myLocationList.GroupBy(x => new { x.LocationCode }); foreach (var gg in doGrou) { var matsers = gg.ToList().Select(x => x.MaterialCode).ToList(); removeList.AddRange(stores.Where(x => x.WareContainerCode == gg.Key.LocationCode && !matsers.Contains(x.WareMaterialCode)).ToList()); } //移除 removeList.ForEach(x => { x.IsDeleted = true; }); dbContext.SaveChanges(); } ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"删除{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); } private void btn_close_Click(object sender, EventArgs e) { this.Close(); } private void button15_Click(object sender, EventArgs e) { var id = this.tb_收货记录ID.Text.Trim(); decimal no_acceptQty = Convert.ToDecimal(this.tb_AcceptQuantity.Text.Trim()); //初始化po单的行号 using (MyDbContext dbContext = new MyDbContext()) { var obj = dbContext.ware_confirm_delivery.Where(x => x.Id.ToString() == id).FirstOrDefault(); if (obj == null) { ShowResult($"没有找到对象"); return; } var materila = dbContext.ware_material.Where(x => x.Code == obj.WarematerialCode).FirstOrDefault(); if (materila == null) { ShowResult($"物料{obj.WarematerialCode}不存在"); return; } if (materila.IsCheck != true) { ShowResult($"物料{obj.WarematerialCode}免检,不需要质检"); return; } //if (!string.IsNullOrEmpty(obj.MatDoc)) //{ // ShowResult($"已经模拟过了"); //} if (no_acceptQty > (decimal)obj.ReceivedQuantity) { ShowResult($"不合格数{no_acceptQty}不能超过总数{(decimal)obj.ReceivedQuantity}"); return; } var _WorkOrderNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString();//质检单号 var _matDoc = obj.MatDoc; if (string.IsNullOrEmpty(obj.MatDoc)) { ShowResult($"错误=》没有SAP返回的凭证号"); return; ////生成凭证号 //var matCode = Yitter.IdGenerator.YitIdHelper.NextId().ToString(); //obj.MatDoc = _matDoc = matCode; //obj.SAPConfirmMessage = "模拟SAP返回成功"; } //判断是否已经有了质检单了 var existObj = dbContext.ware_qc_orders.Where(x => x.MatDoc == obj.MatDoc).FirstOrDefault(); if (existObj != null) { ShowResult($"错误=》已经存在凭证号{obj.MatDoc}的质检单了"); return; } //插入质检表 ware_qc_orders ware_Qc_Orders = new ware_qc_orders() { Id = Yitter.IdGenerator.YitIdHelper.NextId(), CreatedTime = DateTime.Now, UpdatedTime = DateTime.Now, CreatedUserName = "模拟器", UpdatedUserName = "模拟器", AcceptQuantity = (decimal)obj.ReceivedQuantity - no_acceptQty, Quantity = (decimal)obj.ReceivedQuantity, RejectQuantity = no_acceptQty, LineNumber = obj.LineNumber, PurchaseNo = obj.PurchaseNo, SupplierNo = obj.BasicSupplierInfoCode, SupplierName = obj.SupplierName, Remarks = "模拟SAP质检", WorkOrderNo = _WorkOrderNo, WareMaterialCode = obj.WarematerialCode, WareMaterialName = obj.WareMaterialName, MatDoc = _matDoc, }; if (ware_Qc_Orders.AcceptQuantity == 0) { ware_Qc_Orders.QcCodeStatus = (int)QcCodeStatusEnum.不合格; ware_Qc_Orders.QcCode = "R"; } else if (ware_Qc_Orders.RejectQuantity == 0) { ware_Qc_Orders.QcCodeStatus = (int)QcCodeStatusEnum.合格; ware_Qc_Orders.QcCode = "A2"; } else { ware_Qc_Orders.QcCodeStatus = (int)QcCodeStatusEnum.部分合格; ware_Qc_Orders.QcCode = "R1"; } ware_Qc_Orders.QcTime = DateTime.Now; ware_Qc_Orders.OrderStatus = (int)EnumHandleStatus.新建; ware_Qc_Orders.IsHandleAccept = false; ware_Qc_Orders.IsHandleReject = false; dbContext.ware_qc_orders.Add(ware_Qc_Orders); dbContext.SaveChanges(); ShowResult($"新增成功!"); } //*/ } private void button16_Click(object sender, EventArgs e) { readThread = new Thread(_button16_Click); readThread.IsBackground = true; readThread.Start(); } private void button17_Click(object sender, EventArgs e) { //根据SAP库存去更新库存。 readThread = new Thread(_button17_Click); readThread.IsBackground = true; readThread.Start(); } /// /// //根据SAP库存去更新库存。 /// private void _button17_Click() { //根据盘点Excel更新库存 var preStr = "[生产库]根据SAP库存导入库存!======"; List errList = new List(); int addCount = 0, updateCount = 0, deleteCount = 0; string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { { "MaterialCode", "物料编号" }, { "MaterialName", "物料名称" }, { "SapLocation", "SAP位置" }, { "BatchNo", "批次号" }, { "Str_Quantity", "库存数量" }, { "LocationCode", "库位编号" } }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List myLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } //校验数据 int aa_rowNum = 0; foreach (var item in myLocationList) { aa_rowNum++; if (item.Quantity < 0) { MessageBox.Show($"第{aa_rowNum}行数量不能是负数{item.Quantity}"); return; } if (string.IsNullOrEmpty(item.MaterialCode)) { MessageBox.Show($"第{aa_rowNum}行物料号不能为空"); return; } } //不需要过滤 sap位置为空的,直接写入 //myLocationList = myLocationList.Where(x => !string.IsNullOrEmpty(x.SapLocation)).ToList(); List addList = new List(); ware_container_vs_material aa = null; int rowNum = 0; foreach (var item in myLocationList) { rowNum++; if (item.Quantity < 0) { MessageBox.Show($"第{rowNum}行数量不能是负数{item.Quantity}"); return; } if (string.IsNullOrEmpty(item.MaterialCode)) { ShowResult($"不处理,物料码为空"); continue; } using (MyDbContext dbContext = new MyDbContext()) { //原则是 如果库位上没有该物料,就新增。如果库位上有该物料,就判断数量 //数量少的话,就报错。 //数量多的话,就更新新增数量 if (item.MaterialCode == "Z644Z0270940") { var bb = ""; } var los = dbContext.ware_location.Where(x => x.Code == item.LocationCode && (x.IsDeleted == null || x.IsDeleted == false)).ToList(); if (los == null || los.Count == 0) { errList.Add(new FunRetEntity() { resData = item.LocationCode, resMsg = $"{item.LocationCode}库位没有找到" }); ShowResult($"{item.LocationCode}库位没有找到"); //需要初始化库位数据 var _goodSheId = ""; if (item.LocationCode.Contains("A1")) { _goodSheId = "A1"; } else if (item.LocationCode.Contains("A2")) { _goodSheId = "A2"; } else if (item.LocationCode.Contains("A3")) { _goodSheId = "A3"; } var add_location = new ware_location() { Id = Yitter.IdGenerator.YitIdHelper.NextId(), Code = item.LocationCode, Name = item.LocationCode, IsVirtual = 0, IsLocked = 0, GoodSheId = _goodSheId, Lane = _goodSheId, IsDeleted = false, CreatedTime = DateTime.Now, UpdatedTime = DateTime.Now, CreatedUserName = "系统初始", UpdatedUserName = "系统初始", Status = 0, }; dbContext.ware_location.Add(add_location); } else if (los.Count > 1) { //数据不正确 errList.Add(new FunRetEntity() { resData = item.LocationCode, resMsg = $"{item.LocationCode}库位数超过了1条" }); ShowResult($"{item.LocationCode}库位数超过了1条"); } List dbList = null; //dbList = dbContext.ware_container_vs_material.Where(x => x.IsDeleted == false //&& x.WareMaterialCode == item.MaterialCode && x.Sap_Location == item.SapLocation //&& x.WareContainerCode == item.LocationCode //).ToList(); //配置批次号 var _BarNo = ""; if (!string.IsNullOrEmpty(item.BatchNo)) { //dbList = dbList.Where(x => x.BarNo == item.BatchNo).ToList(); _BarNo = item.BatchNo; } else { _BarNo = CreateBatchNo(""); } //配置质检状态 EnumCheckStatus _enumCheckStatus = EnumCheckStatus.检验合格; if (item.LocationCode == "SQE") { _enumCheckStatus = EnumCheckStatus.检验不合格; } else if (item.LocationCode == "QMLOT") { _enumCheckStatus = EnumCheckStatus.未检验; } if (dbList == null || dbList.Count == 0) { // var locationCodeList = dbContext.ware_location.Where(x => x.IsDeleted == false && //(x.Code.Contains("A1") || x.Code.Contains("A2") || x.Code.Contains("A3")) //).ToList(); // var find_locationCode = locationCodeList.OrderBy(f => Guid.NewGuid()).First().Code; // //随机找个库位号 //新增库存 aa = new ware_container_vs_material { //必填项 Id = Yitter.IdGenerator.YitIdHelper.NextId(), CheckStatus = (int)_enumCheckStatus, RecordInsertTime = DateTime.Now, Quantity = item.Quantity, OCCQuantity = 0, StockStatus = 2, WareContainerCode = item.LocationCode, WareMaterialCode = item.MaterialCode, PurchaseNo = "", DeliveryNo = "", CollectNo = "", ITEMBATCHNO = "", OrdersNo = "",//入库单号 Status = 0, TenantId = null, CreatedTime = DateTime.Now, //CreatedUserId = CurrentUserInfo.UserId, //CreatedUserName = CurrentUserInfo.Name, IsLocked = false, //LockRemark = "平库入库,新增物料,初始为false", DoLockTime = DateTime.Now, IsDeleted = false, Remarks = "自动插入", BarNo = _BarNo, //MaterialType = item.ma, LocationType = 2, Sap_Location = item.SapLocation, }; if (string.IsNullOrEmpty(aa.Sap_Location)) { aa.Sap_Location = "空"; } dbContext.ware_container_vs_material.Add(aa); ShowResult($"新增1条,{aa.WareMaterialCode} 库位{aa.WareContainerCode}"); Log4NetHelper.WriteInfoLog(LogType.Sys_DeleteLog, preStr + "新增库存:" + JsonConvert.SerializeObject(aa)); addCount++; } else { var firstObj = dbList.First(); firstObj.Quantity = item.Quantity; firstObj.OCCQuantity = 0; ShowResult($"更新1条,{firstObj.WareMaterialCode} 库位{firstObj.WareContainerCode}"); //删除其他的库存 var removeList = dbList.Where(x => x.Id != firstObj.Id).ToList(); dbContext.ware_container_vs_material.RemoveRange(removeList); ShowResult($"啊啊删除{removeList.Count}条"); updateCount += removeList.Count; } int i = dbContext.SaveChanges(); } } ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"删除{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); //*/ } private void _button16_Click() { var preStr = "[生产库]初始化PO单!======"; List errList = new List(); string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } //见文件【采购单导入模板.xls】 Dictionary cellheader = new Dictionary { { "OrderNo", "采购单号" }, { "Material", "物料编号" }, { "MaterialDescription", "物料名称" }, { "LineNumber", "行号" }, { "Qty", "数量" }, { "Suplier", "供应商代码" }, { "Unit", "单位" }, { "BatchNo", "批次号" }, { "SapLocation", "SAP位置" }, }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List ysLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } ShowResult("开始处理"); //校验数据 int aa_rowNum = 0; List new_myLocationList = new List(); foreach (var item in ysLocationList) { aa_rowNum++; if (item.Qty < 0) { ShowResult($"第{aa_rowNum}行需求数不能是负数{item.Qty}"); continue;//忽略 } if (string.IsNullOrEmpty(item.Material)) { ShowResult($"第{aa_rowNum}行物料号不能为空"); continue;//忽略 } if (string.IsNullOrEmpty(item.LineNumber)) { ShowResult($"第{aa_rowNum}行行号不能为空"); continue;//忽略 } if (string.IsNullOrEmpty(item.OrderNo)) { ShowResult($"第{aa_rowNum}行单号不能为空"); continue;//忽略 } if (string.IsNullOrEmpty(item.SapLocation)) { ShowResult($"第{aa_rowNum}行SAP位置不能为空"); continue;//忽略 } new_myLocationList.Add(item); } var group = new_myLocationList.GroupBy(x => new { x.Material, x.OrderNo, x.LineNumber }); foreach (var g in group) { if (g.ToList().Count > 1) { MessageBox.Show($"存在相同物料号{g.Key.Material} 相同单号{g.Key.OrderNo} 相同行号{g.Key.LineNumber}多条数据的情况"); return; } } using (MyDbContext dbContext = new MyDbContext()) { //分组 var gourps = new_myLocationList.GroupBy(x => new { x.OrderNo }); foreach (var gg in gourps) { var doList = gg.ToList(); //供应商代码 string supplier = Convert.ToString(doList.First().Suplier).Trim();//格式: 108821 武汉安越科技发展有限公司 string supplierName = ""; if (!string.IsNullOrEmpty(supplier)) { try { string[] arr = Regex.Split(supplier, " ", RegexOptions.IgnoreCase); if (arr.Length != 2) { throw new Exception(preStr + @"供应商代码格式不正确,格式为 供应商代码 供应商名称(注意:供应商代码和供应商名称中间有5个空格)"); } supplier = arr[0]; supplierName = arr[1]; } catch (Exception ex) { supplier = ""; supplierName = ""; } //if (!basicSupplierInfoList.Exists(x => x.Code == supplier)) //{ // basicSupplierInfoList.Add(new BasicSupplierInfo() // { // Code = supplier, // Name = supplierName // }); //} } else { throw new Exception(preStr + @" 供应商代码和供应商名称不能为空"); } var order = dbContext.ware_purchase_order.Where(x => x.PurchaseNo == gg.Key.OrderNo).FirstOrDefault(); if (order == null) { var headid = Yitter.IdGenerator.YitIdHelper.NextId(); var newWarePurchaseOrder = new ware_purchase_order { Id = headid, AppointmentDate = DateTime.Now, ArrivalDate = DateTime.Now, BasicExpressInfoCode = "", PurchaseNo = gg.Key.OrderNo, DeliveryType = ((int)SysAllOrderTypeEnum.采购订单).ToString(), // WarehouseCode = Convert.ToString(item[""]).Trim(),//收货仓库代码 IssueTime = null, IssueUserName = "", CreatedUserId = 0, CreatedUserName = "WMS导入", UpdatedUserId = 0, UpdatedUserName = "WMS导入", Status = (int)CommonStatus.ENABLE, IsDeleted = false, Supplier = supplier, Sap_ConfirmStatus = (int)EnumSAPConfirmStatus.待发送, Sap_CancelConfirmStatus = (int)EnumSAPCancelConfirmStatus.未撤销, SupplierName = supplierName, EstimatedDate = DateTime.Now, //SourceBy = (int)SourceBy.导入, SAP_CreatedTime = DateTime.Now, CreatedTime = DateTime.Now, UpdatedTime = DateTime.Now, }; dbContext.ware_purchase_order.Add(newWarePurchaseOrder); //新增 List new_orderDetails = new List(); foreach (var item in doList) { DoAdd_ware_purchase_order_details(ref new_orderDetails, dbContext, item, preStr, headid, supplier); } dbContext.ware_purchase_order_details.AddRange(new_orderDetails); ShowResult($"新增{new_orderDetails.Count}条,单号{gg.Key.OrderNo}"); } else { //寻找编辑 //新增 List new_orderDetails = new List(); foreach (var item in doList) { var objPurOrderDetail = dbContext.ware_purchase_order_details.Where(x => x.Sap_Location == item.SapLocation && x.EBELP == item.LineNumber && x.WareMaterialCode == item.Material ).FirstOrDefault(); if (objPurOrderDetail == null) {//新增 DoAdd_ware_purchase_order_details(ref new_orderDetails, dbContext, item, preStr, order.Id, supplier); } } dbContext.ware_purchase_order_details.AddRange(new_orderDetails); ShowResult($"编辑-新增{new_orderDetails.Count}条,单号{order.PurchaseNo}"); } } //保存 dbContext.SaveChanges(); } ShowResult("处理完毕"); } private void DoAdd_ware_purchase_order_details(ref List new_orderDetails, MyDbContext dbContext, InitPO item, string preStr , long headid, string supplier) { var material = dbContext.ware_material.Where(x => x.Code == item.Material).FirstOrDefault(); if (material == null) { //throw new Exception(preStr + $" 物料{item.Material}不存在"); ShowResult(preStr + $" 物料{item.Material}不存在"); return;//返回不处理 } new_orderDetails.Add(new ware_purchase_order_details { WareMaterialCode = item.Material, DeliveryQuantity = item.Qty,//数量 MAKTX = item.MaterialDescription,//物料描述 GoodsQuantity = 0, Status = (int)CommonStatus.ENABLE, IsDeleted = false, DeliveryNo = "",//送货单号 Unit = item.Unit,//单位 // BarNo = Convert.ToString(item["批次号"]).Trim(), // Remark = Convert.ToString(item["备注"]).Trim(), SignStatus = (int)EnumSignStatus.待收货, CreatedTime = DateTime.Now, CreatedUserId = 0, CreatedUserName = "WMS导入", UpdatedTime = DateTime.Now, UpdatedUserId = 0, UpdatedUserName = "WMS导入", PurchaseOrderId = headid, Id = Yitter.IdGenerator.YitIdHelper.NextId(), BasicSupplierInfoCode = supplier,//供应商代码 //ToBeInvoicedQuantity = 0,//待支付数量 //ToBeDeliveredQuantity = 0,//待交货数量 IsCheck = material.IsCheck, Sap_Location = item.SapLocation, Sap_ConfirmStatus = (int)EnumSAPConfirmStatus.待发送, Sap_CancelConfirmStatus = (int)EnumSAPCancelConfirmStatus.未撤销, MaterialType = (int)SysAllOrderTypeEnum.采购订单, MaterialTypeName = SysAllOrderTypeEnum.采购订单.ToString(), //SequenceNo = sequenceNo, //暂时去掉这个 序号 【Editby shaocx,2023-04-04】 // EstimatedDate = DateTime.Now, EBELP = item.LineNumber, }); } private void button18_Click(object sender, EventArgs e) { //C#如何分割多个空格分隔的字符串 //string pp = "1063792.4 2764405.825 5.464413E-05 -1.780467E-04"; string pp = "108821 武汉安越科技发展有限公司"; string[] mm = Regex.Split(pp, "\\s+", RegexOptions.IgnoreCase); for (int i = 0; i < mm.Length; i++) { ShowResult(mm[i]); } } private void button1_Click_1(object sender, EventArgs e) { this.isQueryIsBackflush = false; //[生产库]分析SAP和WMS物料对比 readThread = new Thread(_button1_Click_1); readThread.IsBackground = true; readThread.Start(); } private void _button1_Click_1() { var preStr = "[生产库]分析SAP和WMS物料对比!======"; List errList = new List(); string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { { "Material", "物料编号" }, }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List ysLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } //校验数据 int aa_rowNum = 0; foreach (var item in ysLocationList) { aa_rowNum++; if (string.IsNullOrEmpty(item.Material)) { MessageBox.Show($"第{aa_rowNum}行物料号不能为空"); return; } } var group = ysLocationList.GroupBy(x => new { x.Material }); //foreach (var g in group) //{ // if (g.ToList().Count > 1) // { // var msg = $"存在相同物料号{g.Key.Material} 多条数据的情况"; // ShowResult(msg); // MessageBox.Show(msg); // return; // } //} //自动过滤重复的数据 List new_sap_LocationList = new List(); foreach (var item in group) { new_sap_LocationList.Add(new AnalysisMaterial() { Material = item.Key.Material }); } List results = new List(); List wms_NoFinishedList = new List();//查找视图 using (MyDbContext dbContext = new MyDbContext()) { var _list = dbContext.ware_material.AsNoTracking().Where(x => x.IsDeleted == false).ToList(); if (this.isQueryIsBackflush) {//查询到冲物料 _list = _list.Where(x => x.IsBackflush == true).ToList(); } wms_NoFinishedList.AddRange(_list); //遍历 List existList = new List(); foreach (var item in new_sap_LocationList) { //首先寻找 SAP存在的和 SAP存在和WMS差异的 var findList = wms_NoFinishedList .Where(x => x.Code == item.Material) .ToList(); if (findList == null || findList.Count == 0) { //SAP有,但是WMS没有 ShowResult($"失败比对1条,SAP有,但是WMS没有,{item.Material}"); results.Add(new AnalysisNoFinishedPOResult() { AnalysisResult = "失败", Remark = "SAP有,但是WMS没有", Material = item.Material, }); } else { existList.AddRange(findList.Select(x => x.Id).ToList()); if (findList.Count > 1) { ShowResult($"失败比对1条,SAP有,但是WMS存在超过1条,{item.Material}"); //SAP有,但是WMS存在超过1条 results.Add(new AnalysisNoFinishedPOResult() { AnalysisResult = "失败", Remark = "SAP有,但是WMS存在超过1条", Remark2 = $"WMS存在{findList.Count}条数据", Material = item.Material, }); ; } else { //ShowResult($"成功比对1条,{item.Material}"); results.Add(new AnalysisNoFinishedPOResult() { AnalysisResult = "成功", Remark = "成功比对1条", Material = item.Material, }); } } } //寻找 SAP无,但是WMS有的东西 var only_wms_List = wms_NoFinishedList.Where(x => !existList.Contains(x.Id)).ToList(); foreach (var item in only_wms_List) { ShowResult($"失败比对1条,SAP没有,但WMS有,{item.Code}"); results.Add(new AnalysisNoFinishedPOResult() { AnalysisResult = "失败", Remark = "SAP没有,但WMS有", Material = item.Code, }); } ShowResult($"全部处理完毕,共匹配{results.Count}条,成功{results.Where(x => x.AnalysisResult == "成功").Count()}条,失败{results.Where(x => x.AnalysisResult == "失败").Count()}条"); //导出Excel文件 string realFilePath = ""; var errMsg = ""; string readFolderPath = ""; autuPrint.printService.CreatExcelForMail.creatEXcel(results, ref realFilePath, ref readFolderPath, ref errMsg); if (!string.IsNullOrEmpty(errMsg)) { ShowResult($"生成文件失败:{errMsg}"); } ShowResult($"生成文件成功,地址:{realFilePath}"); ////成功之后打开文件夹 using (System.Diagnostics.Process.Start(readFolderPath)) { } } } private void button21_Click(object sender, EventArgs e) { //[生产库]初始化收货状态,分析 SAP和WMS未完成的入库单 //要更新数量 readThread = new Thread(_button21_Click); readThread.IsBackground = true; readThread.Start(); } /// /// 更新收货状态 /// /// /// /// private void UpdateStatus(MyDbContext dbContext2, AnalysisNoFinishedPO item, List ysLocationList, decimal goodQty) { //更新状态 var purOrder = dbContext2.ware_purchase_order.Where(x => x.PurchaseNo == item.OrderNo).FirstOrDefault(); var ojbList = dbContext2.ware_purchase_order_details.Where(x => x.WareMaterialCode == item.Material // && (int)(x.EBELP) == aaa //&& x.EBELP == item.LineNumber && x.PurchaseOrderId == purOrder.Id).ToList(); //通过行号过滤 ojbList = ojbList.Where(x => Convert.ToInt32(x.EBELP) == Convert.ToInt32(item.LineNumber)).ToList(); if (ojbList.Count > 1) { var msg = $"单号{item.OrderNo},物料{item.Material}【WMS】存在多条,需要人工自行处理,更新状态"; ShowResult(msg); MessageBox.Show(msg); return; } var aa = ysLocationList.Where(x => x.OrderNo == item.OrderNo && x.Material == item.Material // && Convert.ToInt32(x.LineNumber) == Convert.ToInt32(item.LineNumber) //&& x.LineNumber == item.LineNumber ).ToList(); //通过行号过滤 aa = aa.Where(x => Convert.ToInt32(x.LineNumber) == Convert.ToInt32(item.LineNumber)).ToList(); if (aa.Count > 1) { var msg = $"单号{item.OrderNo},物料{item.Material}【SAP】存在多条,需要人工自行处理,更新状态"; ShowResult(msg); MessageBox.Show(msg); return; } //修改已收货数 ojbList.First().GoodsQuantity = goodQty; PurchaseOrderHelper.SetSignstatusForPurchaseOrder(ojbList.First(), purOrder.PurchaseNo); if (ojbList.First().SignStatus != (int)EnumSignStatus.收货中) { var msg = $"单号{item.OrderNo},物料{item.Material}【SAP】更新状态不是 ‘收货中’,请检查"; ShowResult(msg); MessageBox.Show(msg); return; } ShowResult($"单号{item.OrderNo},物料{item.Material},更新状态成功"); dbContext2.SaveChanges();//保存 } /// /// 其余物料,全部更新收货状态为全部收货完成 /// /// /// /// private void UpdateStatusFor收货完成(MyDbContext dbContext2, string orderNo, List guolvList) { //更新状态 var purOrder = dbContext2.ware_purchase_order.Where(x => x.PurchaseNo == orderNo).FirstOrDefault(); if (purOrder == null) { var msg = $"单号{orderNo},WMS没有找到"; ShowResult(msg); return; } var ojbList = dbContext2.ware_purchase_order_details.Where(x => x.PurchaseOrderId == purOrder.Id && x.IsDeleted == false).ToList(); foreach (var item in ojbList) { var isExist = guolvList.Exists(x => x.Material == item.WareMaterialCode && Convert.ToInt32(x.LineNumber) == Convert.ToInt32(item.EBELP) //&& x.LineNumber == item.EBELP ); if (isExist == false) { item.GoodsQuantity = item.DeliveryQuantity; item.SignStatus = (int)EnumSignStatus.收货完成; var msg = $"单号{orderNo},物料{item.WareMaterialCode}全部更新收货状态为全部收货完成"; ShowResult(msg); } } dbContext2.SaveChanges();//保存 } private void _button21_Click() { //[生产库]分析 SAP和WMS未完成的入库单 //根据盘点Excel更新库存 var preStr = "[生产库]更新 SAP和WMS未完成的入库单!======"; List errList = new List(); string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { { "Type", "类型" }, { "OrderNo", "单号" }, { "LineNumber", "行号" }, { "Material", "物料编号" }, // { "Suplier", "供应商" }, { "MaterialDescription", "物料名称" }, { "Qty", "需求数" }, { "HasReciveQty", "已收数" } }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List ysLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } //加工数据 ysLocationList = ysLocationList.Where(x => !string.IsNullOrEmpty(x.Material) && x.Qty > 0).ToList();//过滤掉 物料号为空的 //校验数据 int aa_rowNum = 0; foreach (var item in ysLocationList) { aa_rowNum++; if (item.Qty < 0) { MessageBox.Show($"第{aa_rowNum}行需求数不能是负数{item.Qty}"); return; } if (item.HasReciveQty < 0) { MessageBox.Show($"第{aa_rowNum}行已收数不能是负数{item.HasReciveQty}"); return; } if (string.IsNullOrEmpty(item.Material)) { MessageBox.Show($"第{aa_rowNum}行物料号不能为空"); return; } if (string.IsNullOrEmpty(item.LineNumber)) { MessageBox.Show($"第{aa_rowNum}行行号不能为空"); return; } //再次加工 //item.LineNumber = "000" + item.LineNumber; if (string.IsNullOrEmpty(item.OrderNo)) { MessageBox.Show($"第{aa_rowNum}行单号不能为空"); return; } if (string.IsNullOrEmpty(item.Type)) { MessageBox.Show($"第{aa_rowNum}行类型{item.Type}不能为空"); return; } if (item.Type != "PO" && item.Type != "STO PO") { MessageBox.Show($"第{aa_rowNum}行类型{item.Type}不符合要求"); return; } } List new_myLocationList = new List(); var group = ysLocationList.GroupBy(x => new { x.Material, x.OrderNo, x.LineNumber }); foreach (var g in group) { if (g.ToList().Count > 1) { MessageBox.Show($"存在相同物料号{g.Key.Material} 相同单号{g.Key.OrderNo} 相同行号{g.Key.LineNumber}多条数据的情况"); return; } } new_myLocationList = ysLocationList; //通过PO单号进行分组 var to_Groups = new_myLocationList.GroupBy(x => new { x.OrderNo }); List results = new List(); //首先查询到WMS的未结束的PO单列表 List wms_NoFinishedList = new List();//查找视图 using (MyDbContext dbContext = new MyDbContext()) { // var queryStatus = EnumSignStatus.收货完成.ToString(); //再寻找 只有PO单数据 var query_i_sysAllOrderTypeEnum = ((int)SysAllOrderTypeEnum.采购订单).ToString(); var query_i_sysAllOrderTypeEnum_333 = ((int)SysAllOrderTypeEnum.STO入库单).ToString(); var _list = dbContext.V_QueryPurchaseOrderDetails.AsNoTracking().Where(x => //x.SignStatus != queryStatus && (x.DeliveryType == query_i_sysAllOrderTypeEnum || x.DeliveryType == query_i_sysAllOrderTypeEnum_333 ) ).ToList(); wms_NoFinishedList.AddRange(_list); //遍历 List existList = new List(); foreach (var toGroup in to_Groups) { //测试 /* if (toGroup.Key.OrderNo == "3610006742") { var bb = ""; } else { continue; } //*/ List myNewList = toGroup.ToList(); foreach (var item in myNewList) { if (item.Material == "7VS030A405-01") { var zz = ""; } //首先寻找 SAP存在的和 SAP存在和WMS差异的 SysAllOrderTypeEnum sysAllOrderTypeEnum = default(SysAllOrderTypeEnum); if (item.Type == "PO") { sysAllOrderTypeEnum = SysAllOrderTypeEnum.采购订单; } else if (item.Type == "STO PO") { sysAllOrderTypeEnum = SysAllOrderTypeEnum.STO入库单; } else { MessageBox.Show($"类型{item.Type}不符合要求"); return; } var query_i_sysAllOrderTypeEnum2 = ((int)sysAllOrderTypeEnum).ToString(); var findList = wms_NoFinishedList .Where(x => x.DeliveryType == query_i_sysAllOrderTypeEnum2 && item.OrderNo == x.PurchaseNo && item.Material == x.WareMaterialCode) .ToList(); //分析行号 findList = findList.Where(x => Convert.ToInt32(item.LineNumber) == Convert.ToInt32(x.Ebelp) //item.LineNumber == x.Ebelp ).ToList(); if (findList == null || findList.Count == 0) { //SAP有,但是WMS没有 ShowResult($"失败比对1条,SAP有,但是WMS没有,{item.OrderNo}-{item.LineNumber}-{item.Material}"); results.Add(new AnalysisNoFinishedPOResult() { AnalysisResult = "失败", Remark = "SAP有,但是WMS没有", OrderNo = item.OrderNo, LineNumber = item.LineNumber, HasReciveQty = item.HasReciveQty, Material = item.Material, MaterialDescription = item.MaterialDescription, Qty = item.Qty, Type = item.Type }); } else if (findList.Count > 1) { existList.AddRange(findList.Select(x => x.Id).ToList()); ShowResult($"失败比对1条,SAP有,但是WMS存在超过1条,{item.OrderNo}-{item.LineNumber}-{item.Material}"); //SAP有,但是WMS存在超过1条 results.Add(new AnalysisNoFinishedPOResult() { AnalysisResult = "失败", Remark = "SAP有,但是WMS存在超过1条", Remark2 = $"WMS存在{findList.Count}条数据", OrderNo = item.OrderNo, LineNumber = item.LineNumber, HasReciveQty = item.HasReciveQty, Material = item.Material, MaterialDescription = item.MaterialDescription, Qty = item.Qty, Type = item.Type }); ; } else { //比较两个数 var find = findList.First(); existList.Add(find.Id); SysAllOrderTypeEnum sysAllOrderTypeEnum1 = (SysAllOrderTypeEnum)Enum.Parse(typeof(SysAllOrderTypeEnum), find.DeliveryType); if (find.DeliveryQuantity != item.Qty) { ShowResult($"失败比对1条,SAP有,WMS有,但需求数不符,{item.OrderNo}-{item.LineNumber}-{item.Material}"); results.Add(new AnalysisNoFinishedPOResult() { AnalysisResult = "失败", Remark = "SAP有,WMS有,但需求数不符", Remark2 = $"SAP需求数{item.Qty},WMS需求数{find.DeliveryQuantity}", OrderNo = item.OrderNo, LineNumber = item.LineNumber, HasReciveQty = item.HasReciveQty, Material = item.Material, MaterialDescription = item.MaterialDescription, Qty = item.Qty, Type = item.Type, WMS_Type = sysAllOrderTypeEnum1.ToString(), WMS_Qty = find.DeliveryQuantity, WMS_HasReciveQty = find.GoodsQuantity, }); } else if (find.GoodsQuantity != item.HasReciveQty) { ShowResult($"失败比对1条,SAP有,WMS有,但已收数不符,{item.OrderNo}-{item.LineNumber}-{item.Material}"); results.Add(new AnalysisNoFinishedPOResult() { AnalysisResult = "失败", Remark = "SAP有,WMS有,但已收数不符", Remark2 = $"SAP已收数{item.HasReciveQty},WMS已收数{find.GoodsQuantity}", OrderNo = item.OrderNo, LineNumber = item.LineNumber, HasReciveQty = item.HasReciveQty, Material = item.Material, MaterialDescription = item.MaterialDescription, Qty = item.Qty, Type = item.Type, WMS_Type = sysAllOrderTypeEnum1.ToString(), WMS_Qty = find.DeliveryQuantity, WMS_HasReciveQty = find.GoodsQuantity, }); //更新已收货数,和收货状态 UpdateStatus(dbContext, item, ysLocationList, item.HasReciveQty); ShowResult($"更新已收货数,和收货状态,{item.OrderNo}-{item.LineNumber}-{item.Material}"); } else { ShowResult($"成功比对1条,{item.OrderNo}-{item.LineNumber}-{item.Material}"); results.Add(new AnalysisNoFinishedPOResult() { AnalysisResult = "成功", Remark = "成功比对1条", OrderNo = item.OrderNo, LineNumber = item.LineNumber, HasReciveQty = item.HasReciveQty, Material = item.Material, MaterialDescription = item.MaterialDescription, Qty = item.Qty, Type = item.Type, WMS_Type = sysAllOrderTypeEnum1.ToString(), WMS_Qty = find.DeliveryQuantity, WMS_HasReciveQty = find.GoodsQuantity, }); } } } //其余未处理的物料,一律认为 全部收货完成 UpdateStatusFor收货完成(dbContext, toGroup.Key.OrderNo, myNewList); } ShowResult($"全部处理完毕,共匹配{results.Count}条,成功{results.Where(x => x.AnalysisResult == "成功").Count()}条,失败{results.Where(x => x.AnalysisResult == "失败").Count()}条"); //输出结果 //导出Excel文件 string realFilePath = ""; var errMsg = ""; string readFolderPath = ""; autuPrint.printService.CreatExcelForPOUpdate.creatEXcel(results, ref realFilePath, ref readFolderPath, ref errMsg); if (!string.IsNullOrEmpty(errMsg)) { ShowResult($"生成文件失败:{errMsg}"); } ShowResult($"生成文件成功,地址:{realFilePath}"); ////成功之后打开文件夹 using (System.Diagnostics.Process.Start(readFolderPath)) { } } } private void button2_Click_1(object sender, EventArgs e) { this.isQueryIsBackflush = true; //[生产库]分析SAP和WMS物料对比 readThread = new Thread(_button1_Click_1); readThread.IsBackground = true; readThread.Start(); } private void button3_Click_1(object sender, EventArgs e) { //[生产库]根据SAP的待检物料,将WMS多余的待检物料转移到收货区域 readThread = new Thread(_button3_Click_1); readThread.IsBackground = true; readThread.Start(); } private void _button3_Click_1() { var preStr = "[生产库]根据SAP的待检物料,将WMS多余的待检物料转移到收货区域!======"; List errList = new List(); int addCount = 0, updateCount = 0, deleteCount = 0; string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { { "MaterialCode", "物料编号" } }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List myLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } //MessageBox.Show("错误:" + errorMsg.ToString()); //return; List addList = new List(); ware_container_vs_material aa = null; int rowNum = 0; using (MyDbContext dbContext = new MyDbContext()) { List dbList = null; dbList = dbContext.ware_container_vs_material.Where(x => x.IsDeleted == false && x.WareContainerCode == WareLocationEnum.QMLOT.ToString() ).ToList(); List pcMaterialCodeList = myLocationList.Select(x => x.MaterialCode).ToList(); List update_dbList = new List(); update_dbList = dbList.Where(x => !pcMaterialCodeList.Contains(x.WareMaterialCode)).ToList(); foreach (var item in update_dbList) { rowNum++; item.WareContainerCode = WareLocationEnum.STAGING.ToString(); item.CheckStatus = (int)EnumCheckStatus.检验合格; dbContext.SaveChanges(); ShowResult($"更新1条,{item.WareMaterialCode} "); updateCount++; } } ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"删除{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); //*/ } private void button19_Click(object sender, EventArgs e) { //[生产库]比对质检,并更新是否质检 readThread = new Thread(_button19_Click); readThread.IsBackground = true; readThread.Start(); } private void _button19_Click() { var preStr = "[生产库]比对质检,并更新是否质检======"; List errList = new List(); int addCount = 0, updateCount = 0, deleteCount = 0; string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { { "MaterialCode", "物料编号" }, { "Result", "结果" } }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List myLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } //MessageBox.Show("错误:" + errorMsg.ToString()); //return; List addList = new List(); ware_container_vs_material aa = null; int rowNum = 0; List pcMaterialCodeList = myLocationList.Select(x => x.MaterialCode).ToList(); List results = new List(); using (MyDbContext dbContext = new MyDbContext()) { List dbList = null; dbList = dbContext.ware_material.Where(x => x.IsDeleted == false && pcMaterialCodeList.Contains(x.Code) ).ToList(); foreach (var item in dbList) { var importObj = myLocationList.Find(x => x.MaterialCode == item.Code); bool isCheck = false; if (importObj.Result == "1") {//需要质检 isCheck = true; } if (item.IsCheck != isCheck) {//校验不通过 ShowResult($"失败比对1条,{item.Code}"); results.Add(new AnalysisNoFinishedPOResult() { AnalysisResult = "失败", Remark = $"失败比对1条,wms值是 {item.IsCheck},sap值是{isCheck}", Material = item.Code, }); //更新数据库 item.IsCheck = isCheck; dbContext.SaveChanges(); } else {//比对通过 ShowResult($"成功比对1条,{item.Code}"); results.Add(new AnalysisNoFinishedPOResult() { AnalysisResult = "成功", Remark = "成功比对1条", Material = item.Code, }); } } } ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"删除{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); //输出结果 //导出Excel文件 string realFilePath = ""; var errMsg = ""; string readFolderPath = ""; autuPrint.printService.CreatExcelForCheckStatsus.creatEXcel(results, ref realFilePath, ref readFolderPath, ref errMsg); if (!string.IsNullOrEmpty(errMsg)) { ShowResult($"生成文件失败:{errMsg}"); } ShowResult($"生成文件成功,地址:{realFilePath}"); ////成功之后打开文件夹 using (System.Diagnostics.Process.Start(readFolderPath)) { } //*/ } private void button20_Click(object sender, EventArgs e) { //[生产库]上线前未发货的Kititng单模拟发货 readThread = new Thread(_button20_Click); readThread.IsBackground = true; readThread.Start(); } private void _button20_Click() { var preStr = "[生产库]上线前未发货的Kititng单模拟发货!======"; List errList = new List(); int addCount = 0, updateCount = 0; string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Stopwatch main = new Stopwatch(); main.Start(); ShowResult("开始执行:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); Dictionary cellheader = new Dictionary { { "MaterialCode", "物料编号" }, { "Quantity", "需求数" }, //注意:数量是负数呢!!! { "SubOrderNo", "工单号" }, { "SapLocation", "SAP位置" } }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List myLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } //校验数据 int aa_rowNum = 0; foreach (var item in myLocationList) { aa_rowNum++; if (item.Quantity >= 0) { MessageBox.Show($"第{aa_rowNum}行需求数不能是正数{item.Quantity}"); return; } //数量变正数 item.Quantity = -item.Quantity; if (string.IsNullOrEmpty(item.MaterialCode)) { MessageBox.Show($"第{aa_rowNum}行物料号不能为空"); return; } if (string.IsNullOrEmpty(item.SapLocation)) { MessageBox.Show($"第{aa_rowNum}行SAP位置不能为空"); return; } if (string.IsNullOrEmpty(item.SubOrderNo)) { MessageBox.Show($"第{aa_rowNum}行工单号不能为空"); return; } } List addList = new List(); ware_container_vs_material aa = null; var _OrderNo = "虚拟Kitting"; int _lineNumber = 0; List updateDbIds = new List(); //查询总库存 var db_wareContainerVsMaterialList = new List(); //发货记录 List wareDeliveryRecords = new List(); var details = new List(); using (MyDbContext dbContext = new MyDbContext()) { //查询总库存 var queryMaterialCodes = myLocationList.Select(x => x.MaterialCode).Distinct().ToList(); var all_db_wareContainerVsMaterialList = dbContext.ware_container_vs_material.Where(x => queryMaterialCodes.Contains(x.WareMaterialCode) && ( x.WareContainerCode != WareLocationEnum.SQE.ToString() && x.WareContainerCode != WareLocationEnum.QMLOT.ToString() && x.WareContainerCode != WareLocationEnum.FJQY.ToString() && x.WareContainerCode != WareLocationEnum.SHIPPING.ToString() ) && x.IsDeleted == false && x.Quantity > x.OCCQuantity) .OrderBy(x => x.CreatedTime).ToList(); //需要过滤掉 正在取货和分拣的 List removeInstIds = new List(); var run_sorting = dbContext.ware_sorting_vs_container.Where(x => x.IsDeleted == false).ToList(); foreach (var item in run_sorting) { var lList = all_db_wareContainerVsMaterialList.Where(x => x.WareContainerCode == item.WareContainerCode && x.WareMaterialCode == item.WareMaterialCode && x.BarNo == item.BatchNo ).Select(x => x.Id).ToList(); removeInstIds.AddRange(lList); } foreach (var item in all_db_wareContainerVsMaterialList) { if (!removeInstIds.Contains(item.Id)) { db_wareContainerVsMaterialList.Add(item); } } var dbMaterialObjList = MyCommonHelper.GetWareMaterialInfoList(dbContext); //1、初始化 Order表 // 创建出库单 var order = new ware_orders { Id = YitIdHelper.NextId(), OrderNo = _OrderNo, OrderType = ((int)SysAllOrderTypeEnum.生产出库单).ToString(), Remarks = "人工写入", OperationRemark = "人工写入", SourceBy = (int)SourceBy.自建, OrderStatus = (int)EnumWarehousStatus.Completed, Client = "", Recipient = "", Equipment = "", OrderCreateWaveStatus = (int)OrderCreateWaveStatusEnum.全部创建波次, SortOrderIssueStatus = (int)SortOrderIssueStatusEnum.全部下发, OrderPickStatus = (int)OrderPickStatusEnum.全部取货, OrderSortStatus = (int)OrderSortStatusEnum.全部分拣, OrderDeliverGoodsStatus = (int)OrderDeliverGoodsStatusEnum.全部发货, }; foreach (var item in myLocationList) { if (string.IsNullOrEmpty(item.MaterialCode)) { continue; } if (item.MaterialCode == "ZHAB007A") { var bb = ""; } //2、创建出库单明细 _lineNumber++; var orderDetail = new ware_orders_details { Id = YitIdHelper.NextId(), OrdersId = order.Id, WareContainerCode = "", WareMaterialCode = item.MaterialCode, WareMaterialName = "", Unit = "", //CompleteQuantity = 0, Quantity = item.Quantity, OrderStatus = (int)EnumWarehousStatus.NewBuild, MaterialType = ((int)SysAllOrderTypeEnum.生产出库单), MaterialTypeName = (SysAllOrderTypeEnum.生产出库单).ToString(), Process = "", Equipment = "", Remarks = "人工写入", OperationRemark = "人工写入", LineNumber = _lineNumber.ToString(), Sap_Location = item.SapLocation, Costcenter = "",//成本中心 【Editby liuwq,2023-05-13】 OrderCreateWaveStatus = (int)OrderCreateWaveStatusEnum.全部创建波次, SortOrderIssueStatus = (int)SortOrderIssueStatusEnum.全部下发, OrderPickStatus = (int)OrderPickStatusEnum.全部取货, OrderSortStatus = (int)OrderSortStatusEnum.全部分拣, OrderDeliverGoodsStatus = (int)OrderDeliverGoodsStatusEnum.全部发货, IsIgnore = false }; details.Add(orderDetail); //3、扣减库存 //扣减 发货区的库存 【Editby shaocx,2023-01-05】 var res = InventoryHelper.RemoveInventory(ref updateDbIds, ref db_wareContainerVsMaterialList, item.Quantity, item.MaterialCode, item.SapLocation); /* //3、创建发货记录表 //构造发货记录,【Editby kejj,2023-04-15】【Editby liuwq,2023-05-12】 //根据物料编号获取物料对象 【Editby shaocx,2023-07-25】 var dbMaterialObj = MyCommonHelper.GetWareMaterialInfo(dbMaterialObjList, item.MaterialCode); List wareCommonSapDeliveryInfos = new List(); WareDeliveryInfo wareDeliveryInfo = MyCommonHelper.GetWareDeliveryRecord(dbContext, ref wareCommonSapDeliveryInfos, dbMaterialObj , res.records, _OrderNo, "", equipment: "", process: "", "", orderDetail); wareDeliveryRecords.AddRange(wareDeliveryInfo.WareDeliveryRecords); //*/ //Log4NetHelper.WriteInfoLog(LogType.Sys_DeleteLog, preStr + "新增库存:" + JsonConvert.SerializeObject(aa)); addCount++; } //更新库存 //改为更新containerVsMaterialList 【Editby shaocx,2023-05-18】 foreach (var updateCVM in db_wareContainerVsMaterialList) { if (updateDbIds.Contains(updateCVM.Id)) { if (updateCVM.IsDeleted == true) { dbContext.ware_container_vs_material.Remove(updateCVM);//删除库存 } else { //await _wareContainerVsMaterial.UpdateAsync(updateCVM);//更新库存 } } } //-- main.ElapsedMilliseconds-- 操作时间(毫秒) //保存数据 dbContext.ware_orders.Add(order); dbContext.ware_orders_details.AddRange(details); dbContext.ware_delivery_record.AddRange(wareDeliveryRecords); //先不要更新库存 dbContext.SaveChanges(); } ShowResult("执行结束:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); ShowResult($"耗时:{main.ElapsedMilliseconds / 1000 / 60}分钟"); ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); } private void button22_Click(object sender, EventArgs e) { //[生产库]去掉供应商编号前面的几个0 readThread = new Thread(_button22_Click); readThread.IsBackground = true; readThread.Start(); } private void _button22_Click() { ShowResult($"开始执行"); using (MyDbContext dbContext = new MyDbContext()) { //注意:生产库使用 Supplier,备件库使用 SupplierCode var _list_pur = dbContext.ware_purchase_order.Where(x => x.IsDeleted == false && !string.IsNullOrEmpty(x.Supplier)).ToList();//生产库 //var _list = dbContext.ware_purchase_order.Where(x => x.IsDeleted==false && !string.IsNullOrEmpty(x.SupplierCode)).ToList();//备件库 for (int i = 0; i < _list_pur.Count; i++) { ShowResult($"PO数据,修改{_list_pur[i].Supplier}"); _list_pur[i].Supplier = !string.IsNullOrEmpty(_list_pur[i].Supplier) ? (Convert.ToInt64(_list_pur[i].Supplier)).ToString() : ""; _list_pur[i].SupplierCode = !string.IsNullOrEmpty(_list_pur[i].SupplierCode) ? (Convert.ToInt64(_list_pur[i].SupplierCode)).ToString() : ""; } var _list_basic_supplier_info = dbContext.basic_supplier_info.Where(x => x.IsDeleted == false && !string.IsNullOrEmpty(x.Code)).ToList(); for (int i = 0; i < _list_basic_supplier_info.Count; i++) { ShowResult($"基础数据,修改{_list_basic_supplier_info[i].Code}"); try { _list_basic_supplier_info[i].Code = (Convert.ToInt64(_list_basic_supplier_info[i].Code)).ToString(); } catch (Exception) { } } var _list_ware_confirm_delivery = dbContext.ware_confirm_delivery.Where(x => x.IsDeleted == false && !string.IsNullOrEmpty(x.BasicSupplierInfoCode)).ToList();//生产库 for (int i = 0; i < _list_ware_confirm_delivery.Count; i++) { ShowResult($"收货记录,修改{_list_ware_confirm_delivery[i].BasicSupplierInfoCode}"); _list_ware_confirm_delivery[i].BasicSupplierInfoCode = (Convert.ToInt64(_list_ware_confirm_delivery[i].BasicSupplierInfoCode)).ToString(); } var _list_ware_material_print_history = dbContext.ware_material_print_history.Where(x => x.IsDeleted == false && !string.IsNullOrEmpty(x.SupplierNo)).ToList();//生产库 for (int i = 0; i < _list_ware_material_print_history.Count; i++) { ShowResult($"打印记录,修改{_list_ware_material_print_history[i].SupplierNo}"); _list_ware_material_print_history[i].SupplierNo = (Convert.ToInt64(_list_ware_material_print_history[i].SupplierNo)).ToString(); } dbContext.SaveChanges(); } ShowResult($"全部执行完毕"); } private void button23_Click(object sender, EventArgs e) { //根据SAP库存去更新库存。 readThread = new Thread(_button23_Click); readThread.IsBackground = true; readThread.Start(); } /// /// //根据SAP库存去更新库存。 /// private void _button23_Click() { //根据盘点Excel更新库存 var preStr = "[生产库]根据SAP库存导入库存!======"; List errList = new List(); int addCount = 0, updateCount = 0, deleteCount = 0; string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { { "MaterialCode", "物料编号" }, { "MaterialName", "物料名称" }, { "SapLocation", "SAP位置" }, { "BatchNo", "批次号" }, { "Str_Quantity", "库存数量" }, { "LocationCode", "库位编号" } }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List myLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } //校验数据 int aa_rowNum = 0; foreach (var item in myLocationList) { aa_rowNum++; if (item.Quantity < 0) { MessageBox.Show($"第{aa_rowNum}行数量不能是负数{item.Quantity}"); return; } if (string.IsNullOrEmpty(item.MaterialCode)) { MessageBox.Show($"第{aa_rowNum}行物料号不能为空"); return; } } //不需要过滤 sap位置为空的,直接写入 //myLocationList = myLocationList.Where(x => !string.IsNullOrEmpty(x.SapLocation)).ToList(); List addList = new List(); ware_container_vs_material aa = null; int rowNum = 0; foreach (var item in myLocationList) { rowNum++; if (item.Quantity < 0) { MessageBox.Show($"第{rowNum}行数量不能是负数{item.Quantity}"); return; } if (string.IsNullOrEmpty(item.MaterialCode)) { ShowResult($"不处理,物料码为空"); continue; } using (MyDbContext dbContext = new MyDbContext()) { //原则是 如果库位上没有该物料,就新增。如果库位上有该物料,就判断数量 //数量少的话,就报错。 //数量多的话,就更新新增数量 if (item.MaterialCode == "Z644Z0270940") { var bb = ""; } var los = dbContext.ware_location.Where(x => x.Code == item.LocationCode && (x.IsDeleted == null || x.IsDeleted == false)).ToList(); if (los == null || los.Count == 0) { errList.Add(new FunRetEntity() { resData = item.LocationCode, resMsg = $"{item.LocationCode}库位没有找到" }); ShowResult($"{item.LocationCode}库位没有找到"); return; ////需要初始化库位数据 //var _goodSheId = ""; //if (item.LocationCode.Contains("A1")) //{ // _goodSheId = "A1"; //} //else if (item.LocationCode.Contains("A2")) //{ // _goodSheId = "A2"; //} //else if (item.LocationCode.Contains("A3")) //{ // _goodSheId = "A3"; //} //var add_location = new ware_location() //{ // Id = Yitter.IdGenerator.YitIdHelper.NextId(), // Code = item.LocationCode, // Name = item.LocationCode, // IsVirtual = 0, // IsLocked = 0, // GoodSheId = _goodSheId, // Lane = _goodSheId, // IsDeleted = false, // CreatedTime = DateTime.Now, // UpdatedTime = DateTime.Now, // CreatedUserName = "系统初始", // UpdatedUserName = "系统初始", // Status = 0, //}; //dbContext.ware_location.Add(add_location); } else if (los.Count > 1) { //数据不正确 errList.Add(new FunRetEntity() { resData = item.LocationCode, resMsg = $"{item.LocationCode}库位数超过了1条" }); ShowResult($"{item.LocationCode}库位数超过了1条"); } List dbList = null; dbList = dbContext.ware_container_vs_material.Where(x => x.IsDeleted == false && x.WareMaterialCode == item.MaterialCode && x.Sap_Location == item.SapLocation ).ToList(); if (!string.IsNullOrEmpty(item.BatchNo)) { dbList = dbList.Where(x => x.BarNo == item.BatchNo).ToList(); } //配置批次号 var _BarNo = ""; if (!string.IsNullOrEmpty(item.BatchNo)) { //dbList = dbList.Where(x => x.BarNo == item.BatchNo).ToList(); _BarNo = item.BatchNo; } else { _BarNo = CreateBatchNo(""); } //配置质检状态 EnumCheckStatus _enumCheckStatus = EnumCheckStatus.检验合格; if (dbList == null || dbList.Count == 0) { var toLocationCode = ""; toLocationCode = item.LocationCode; //if (item.SapLocation != "MSTG") //{ // toLocationCode = item.SapLocation; //} //else //{ // toLocationCode = WareLocationEnum.STAGING.ToString(); //} // var locationCodeList = dbContext.ware_location.Where(x => x.IsDeleted == false && //(x.Code.Contains("A1") || x.Code.Contains("A2") || x.Code.Contains("A3")) //).ToList(); // var find_locationCode = locationCodeList.OrderBy(f => Guid.NewGuid()).First().Code; // //随机找个库位号 //新增库存 aa = new ware_container_vs_material { //必填项 Id = Yitter.IdGenerator.YitIdHelper.NextId(), CheckStatus = (int)_enumCheckStatus, RecordInsertTime = DateTime.Now, Quantity = item.Quantity, OCCQuantity = 0, StockStatus = 2, WareContainerCode = toLocationCode, WareMaterialCode = item.MaterialCode, PurchaseNo = "", DeliveryNo = "", CollectNo = "", ITEMBATCHNO = "", OrdersNo = "",//入库单号 Status = 0, TenantId = null, CreatedTime = DateTime.Now, //CreatedUserId = CurrentUserInfo.UserId, //CreatedUserName = CurrentUserInfo.Name, IsLocked = false, //LockRemark = "平库入库,新增物料,初始为false", DoLockTime = DateTime.Now, IsDeleted = false, Remarks = "自动插入", BarNo = _BarNo, //MaterialType = item.ma, LocationType = 2, Sap_Location = item.SapLocation, }; if (string.IsNullOrEmpty(aa.Sap_Location)) { aa.Sap_Location = "空"; } dbContext.ware_container_vs_material.Add(aa); ShowResult($"新增1条,{aa.WareMaterialCode} 库位{aa.WareContainerCode}"); Log4NetHelper.WriteInfoLog(LogType.Sys_DeleteLog, preStr + "新增库存:" + JsonConvert.SerializeObject(aa)); addCount++; } else { var firstObj = dbList.First(); firstObj.WareContainerCode = item.LocationCode;//更新库位号 firstObj.Quantity = item.Quantity; firstObj.OCCQuantity = 0; ShowResult($"更新1条,{firstObj.WareMaterialCode} 库位{firstObj.WareContainerCode}"); //删除其他的库存 var removeList = dbList.Where(x => x.Id != firstObj.Id).ToList(); dbContext.ware_container_vs_material.RemoveRange(removeList); ShowResult($"啊啊删除{removeList.Count}条"); updateCount += removeList.Count; } int i = dbContext.SaveChanges(); } } ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"删除{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); //*/ } private void button24_Click(object sender, EventArgs e) { //根据SAP库存去删除库存。 readThread = new Thread(_button24_Click); readThread.IsBackground = true; readThread.Start(); } /// /// 根据SAP库存去删除库存 /// private void _button24_Click() { //根据盘点Excel更新库存 var preStr = "[生产库]根据SAP库存导入库存!======"; List errList = new List(); int addCount = 0, updateCount = 0, deleteCount = 0; string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } Dictionary cellheader = new Dictionary { { "MaterialCode", "物料编号" }, }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List myLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } //校验数据 int aa_rowNum = 0; foreach (var item in myLocationList) { aa_rowNum++; if (string.IsNullOrEmpty(item.MaterialCode)) { MessageBox.Show($"第{aa_rowNum}行物料号不能为空"); return; } } //不需要过滤 sap位置为空的,直接写入 //myLocationList = myLocationList.Where(x => !string.IsNullOrEmpty(x.SapLocation)).ToList(); List addList = new List(); ware_container_vs_material aa = null; int rowNum = 0; foreach (var item in myLocationList) { rowNum++; if (string.IsNullOrEmpty(item.MaterialCode)) { ShowResult($"不处理,物料码为空"); continue; } using (MyDbContext dbContext = new MyDbContext()) { //原则是 如果库位上没有该物料,就新增。如果库位上有该物料,就判断数量 //数量少的话,就报错。 //数量多的话,就更新新增数量 if (item.MaterialCode == "Z644Z0270940") { var bb = ""; } List dbList = null; dbList = dbContext.ware_container_vs_material.Where(x => x.IsDeleted == false && x.WareMaterialCode == item.MaterialCode ).ToList(); if (dbList == null || dbList.Count == 0) { } else { foreach (var zz in dbList) { zz.IsDeleted = true; } ShowResult($"更新1条,{dbList.First().WareMaterialCode}"); } int i = dbContext.SaveChanges(); } } ShowResult($"新增{addCount}条"); ShowResult($"更新{updateCount}条"); ShowResult($"删除{updateCount}条"); ShowResult($"错误{errList.Count}条," + JsonConvert.SerializeObject(errList)); //*/ } private void button25_Click(object sender, EventArgs e) { //[生产库]临时删除重复的分拣数据 readThread = new Thread(_button25_Click); readThread.IsBackground = true; readThread.Start(); } private void _button25_Click() { //[生产库]分析 SAP和WMS未完成的入库单 //根据盘点Excel更新库存 var preStr = "[生产库]更新 SAP和WMS未完成的入库单!======"; MessageBox.Show("该功能已禁用"); return; List errList = new List(); using (MyDbContext dbContext = new MyDbContext()) { var dbList = dbContext.ware_sorting_vs_container.Where(x => x.IsDeleted == false && x.Quantity > x.HasPickQuantity).ToList(); ShowResult($"共{dbList.Count()}条明细,"); var gg = dbList.GroupBy(x => new { x.OrderDetailId, x.WareMaterialCode, x.SortingNo, x.Quantity, x.HasPickQuantity, x.WareContainerCode }); ShowResult($"共{gg.Count()}条分组,"); foreach (var g in gg) { var count = g.ToList().Count; if (count > 1) { //需要删除 var _my_list = g.ToList(); int i = 0; foreach (var item in _my_list) { i++; if (i == 1) { //保留 } else { //删除 item.IsDeleted = true; item.UpdatedTime = DateTime.Now; } } } } dbContext.SaveChanges(); ShowResult($"全部处理完毕,"); } } private void button26_Click(object sender, EventArgs e) { readThread = new Thread(_button26_Click); readThread.IsBackground = true; readThread.Start(); } private void _button26_Click() { var preStr = "[生产库][生产库]根据导入信息更新计划月份!======"; List errList = new List(); string filePath = this.tb_FilePath.Text; if (filePath == string.Empty) { MessageBox.Show("请选择Excel!"); return; } //见文件【采购单导入模板.xls】 Dictionary cellheader = new Dictionary { { "OrderNo", "单号" }, { "Month", "月份" }, }; // 1.2解析文件,存放到一个List集合里 StringBuilder errorMsg = new StringBuilder(); // 错误信息 string tableDesc = "", tableName = ""; List ysLocationList = ExcelHelper.ExcelToEntityListForCreateTable(cellheader, filePath, out tableDesc, out tableName, out errorMsg); if (!string.IsNullOrEmpty(errorMsg.ToString())) { MessageBox.Show("错误:" + errorMsg.ToString()); return; } ShowResult("开始处理"); //校验数据 int aa_rowNum = 0; List new_myLocationList = new List(); foreach (var item in ysLocationList) { aa_rowNum++; if (string.IsNullOrEmpty(item.Month)) { ShowResult($"第{aa_rowNum}行月份不能为空"); continue;//忽略 } new_myLocationList.Add(item); } using (MyDbContext dbContext = new MyDbContext()) { foreach (var gg in new_myLocationList) { var order = dbContext.ware_orders.Where(x => x.OrderNo == gg.OrderNo).FirstOrDefault(); if (order == null) { ShowResult($"未发现单据{gg.OrderNo}"); continue; } var orderDetails = dbContext.ware_orders_details.Where(x => x.OrdersId == order.Id).ToList(); int PlannedProductionYear = 0; ///生产配餐单备注计划生产年份 int PlannedProductionMonth = 0; ///生产配餐单备注计划生产月份 #region 获取生产配餐单备注计划生产年月 var plantProductTime = MyCommonHelper.ConvertToDateTimeForDDMMByKittingRemark(gg.Month); PlannedProductionYear = plantProductTime.Year; PlannedProductionMonth = plantProductTime.Month; #endregion order.PlannedProductionYear = PlannedProductionYear; order.PlannedProductionMonth = PlannedProductionMonth; order.PlannedProductionDate = MyCommonHelper.GetPlannedProductionDate(PlannedProductionYear, PlannedProductionMonth); foreach (var detail in orderDetails) { detail.PlannedProductionYear = order.PlannedProductionYear; detail.PlannedProductionMonth = order.PlannedProductionMonth; detail.PlannedProductionDate = order.PlannedProductionDate; } ShowResult($"更新单据{gg.OrderNo}"); } //保存 dbContext.SaveChanges(); } ShowResult("处理完毕"); } private void button27_Click(object sender, EventArgs e) { //[生产库]分析未完成PO单的收货问题 readThread = new Thread(_button27_Click); readThread.IsBackground = true; readThread.Start(); } private void _button27_Click() { var preStr = "[生产库]分析未完成PO单的收货问题!======"; List errList = new List(); var time = Convert.ToDateTime("2023-11-15 23:59:59"); using (MyDbContext dbContext = new MyDbContext()) { //查询所有未结束的PO单集合 var noFinished = dbContext.ware_purchase_order_details.Where(x => x.IsDeleted == false && x.DeliveryQuantity != x.GoodsQuantity && x.CreatedTime >= time ).ToList(); ShowResult($"共{noFinished.Count()}条"); var i = 0; var err = 0; foreach (var gg in noFinished) { //i++; //if (i >= 4) { // break; //} var order = dbContext.ware_purchase_order.Where(x => x.Id == gg.PurchaseOrderId).FirstOrDefault(); //查询该明细的所有收货记录 var num = dbContext.ware_confirm_delivery.Where(x => x.IsDeleted == false && x.WarematerialCode == gg.WareMaterialCode && x.LineNumber == gg.EBELP && x.PurchaseNo == order.PurchaseNo ).Sum(x => x.UncollectedQuantity); if ((num ?? 0) != (gg.GoodsQuantity ?? 0)) { ShowResult($"异常:单据{order.PurchaseNo},物料{gg.WareMaterialCode}行号{gg.EBELP},单据收货{gg.GoodsQuantity},收货记录显示{num},时间{gg.CreatedTime.Value.ToString("yyyy-MM-dd HH:mm:ss")}"); err++; continue; } } ShowResult($"错误共{err}条"); } ShowResult("处理完毕"); } private void button29_Click(object sender, EventArgs e) { MessageBoxButtons messButton = MessageBoxButtons.OKCancel; DialogResult dr = MessageBox.Show("确定要执行吗?", "确认", messButton); if (dr == DialogResult.OK)//如果点击“确定”按钮 { readThread = new Thread(_button29_Click); readThread.IsBackground = true; readThread.Start(); } else//如果点击“取消”按钮 { } } private void _button29_Click() { var ordrNo = this.tb_OrerNo.Text.Trim(); //[备件]初始化下DO单的状态和数量 //1、获取所有的DO单 //2、循环DO单,获取该DO单下的发货记录 //3、更新发货数量 //select Quantity,CompleteQuantity,SortQuantity,HasIssueQuantity,HasCreateWaveQuantity,* from ware_orders_details using (MyDbContext dbContext = new MyDbContext()) { ShowResult($"开始处理。。。。。。。。。。。。。"); //类型1的单据,是当年的组盘订单,这里不做处理! var orders = dbContext.ware_purchase_order.Where(x => 1 == 1 && x.IsDeleted == false) .ToList(); if (!string.IsNullOrEmpty(ordrNo)) { orders = orders.Where(x => x.PurchaseNo == ordrNo).ToList(); } ShowResult($"共查询到单数{orders.Count}条"); foreach (var order in orders) { try { ShowResult($"开始处理订单{order.PurchaseNo}"); var details = dbContext.ware_purchase_order_details.Where(x => x.PurchaseOrderId == order.Id && x.IsDeleted == false).ToList(); ShowResult($"订单{order.PurchaseNo}共{details.Count}条明细"); var all_qty = details.Sum(x => x.DeliveryQuantity); order.DeliveryQuantity = all_qty; order.GoodsQuantity = details.Sum(x => x.GoodsQuantity); order.SignStatus = (int)OrderCommonHelper.UpdateSignStatus((decimal)all_qty, (decimal)details.Sum(x => x.GoodsQuantity)); ShowResult($"完毕处理订单{order.PurchaseNo}"); } catch (Exception ex) { var errMsg = $"处理订单{order.PurchaseNo}异常{ex.Message}"; ShowResult(errMsg); MessageBox.Show(errMsg); } } dbContext.SaveChanges(); ShowResult($"处理全部结束。。。。。。。。。。。。。"); } } private void button30_Click(object sender, EventArgs e) { readThread = new Thread(_button30_Click); readThread.IsBackground = true; readThread.Start(); } private void _button30_Click() { var ordrNo = this.tb_OrerNo.Text.Trim(); //[备件]初始化下DO单的状态和数量 //1、获取所有的DO单 //2、循环DO单,获取该DO单下的发货记录 //3、更新发货数量 //select Quantity,CompleteQuantity,SortQuantity,HasIssueQuantity,HasCreateWaveQuantity,* from ware_orders_details var errCount = 0; using (MyDbContext dbContext = new MyDbContext()) { ShowResult($"开始处理。。。。。。。。。。。。。"); //类型1的单据,是当年的组盘订单,这里不做处理! var orders = dbContext.ware_purchase_order.AsNoTracking().Where(x => x.IsDeleted == false) .ToList(); if (!string.IsNullOrEmpty(ordrNo)) { orders = orders.Where(x => x.PurchaseNo == ordrNo).ToList(); } ShowResult($"共查询到单数{orders.Count}条"); foreach (var order in orders) { try { //ShowResult($"开始处理订单{order.PurchaseNo}"); var details = dbContext.ware_purchase_order_details.AsNoTracking().Where(x => x.IsDeleted == false && x.PurchaseOrderId == order.Id).ToList(); //ShowResult($"订单{order.PurchaseNo}共{details.Count}条明细"); var all_qty = details.Sum(x => x.DeliveryQuantity); var _DeliveryQuantity = all_qty; var _WriteOffQuantity = details.Sum(x => x.WriteOffQuantity); var _GoodsQuantity = details.Sum(x => x.GoodsQuantity); var _SignStatus = (int)OrderCommonHelper.UpdateSignStatus((decimal)all_qty, (decimal)details.Sum(x => x.GoodsQuantity)); if (order.DeliveryQuantity != _DeliveryQuantity) { errCount++; ShowResult($"订单{order.PurchaseNo}总需求数不符,计算数{_DeliveryQuantity},数据库数{order.DeliveryQuantity}"); } if (order.GoodsQuantity != _GoodsQuantity) { errCount++; ShowResult($"订单{order.PurchaseNo}总已收货不符,计算数{_GoodsQuantity},数据库数{order.GoodsQuantity}"); } if (order.SignStatus != _SignStatus) { errCount++; ShowResult($"订单{order.PurchaseNo}收货状态不符,计算数{_SignStatus},数据库数{order.SignStatus}"); } //ShowResult($"完毕处理订单{order.PurchaseNo}"); } catch (Exception ex) { var errMsg = $"处理订单{order.PurchaseNo}异常{ex.Message}"; ShowResult(errMsg); errCount++; //MessageBox.Show(errMsg); } } ShowResult($"处理全部结束,共错误{errCount}条。。。。。。。。。。。。。"); } } private void button28_Click(object sender, EventArgs e) { this.tb_Log.Text = ""; } private void button31_Click(object sender, EventArgs e) { MessageBoxButtons messButton = MessageBoxButtons.OKCancel; DialogResult dr = MessageBox.Show("确定要执行吗?", "确认", messButton); if (dr == DialogResult.OK)//如果点击“确定”按钮 { readThread = new Thread(_button31_Click); readThread.IsBackground = true; readThread.Start(); } else//如果点击“取消”按钮 { } } private void _button31_Click() { var ordrNo = this.tb_OrerNo.Text.Trim(); //[备件]初始化下DO单的状态和数量 //1、获取所有的DO单 //2、循环DO单,获取该DO单下的发货记录 //3、更新发货数量 //select Quantity,CompleteQuantity,SortQuantity,HasIssueQuantity,HasCreateWaveQuantity,* from ware_orders_details using (MyDbContext dbContext = new MyDbContext()) { ShowResult($"开始处理。。。。。。。。。。。。。"); //类型1的单据,是当年的组盘订单,这里不做处理! var orders = dbContext.ware_sorting.Where(x => 1 == 1) .ToList(); if (!string.IsNullOrEmpty(ordrNo)) { orders = orders.Where(x => x.OrderNo == ordrNo).ToList(); } ShowResult($"共查询到单数{orders.Count}条"); foreach (var order in orders) { try { ShowResult($"开始处理订单{order.OrderNo}"); var details = dbContext.ware_sorting_details.Where(x => x.OrdersId == order.Id).ToList(); ShowResult($"订单{order.OrderNo}共{details.Count}条明细"); var all_qty = details.Sum(x => x.Quantity); order.Quantity = all_qty ?? 0; order.DeliveryQuantity = details.Sum(x => x.DeliveryQuantity ?? 0); order.HasPickQuantity = details.Sum(x => x.HasPickQuantity); order.CompleteQuantity = details.Sum(x => x.CompleteQuantity ?? 0); order.HasDeliverQuantity = details.Sum(x => x.HasDeliverQuantity ?? 0); ShowResult($"完毕处理订单{order.OrderNo}"); } catch (Exception ex) { var errMsg = $"处理订单{order.OrderNo}异常{ex.Message}"; ShowResult(errMsg); MessageBox.Show(errMsg); } } dbContext.SaveChanges(); ShowResult($"处理全部结束。。。。。。。。。。。。。"); } } private void button32_Click(object sender, EventArgs e) { readThread = new Thread(_button32_Click); readThread.IsBackground = true; readThread.Start(); } private void _button32_Click() { var ordrNo = this.tb_OrerNo.Text.Trim(); var errCount = 0; using (MyDbContext dbContext = new MyDbContext()) { ShowResult($"开始分析。。。。。。。。。。。。。"); var orders = dbContext.ware_sorting.AsNoTracking().Where(x => 1 == 1) .ToList(); if (!string.IsNullOrEmpty(ordrNo)) { orders = orders.Where(x => x.OrderNo == ordrNo).ToList(); } ShowResult($"共查询到单数{orders.Count}条"); foreach (var order in orders) { try { var details = dbContext.ware_sorting_details.AsNoTracking().Where(x => x.OrdersId == order.Id).ToList(); var all_qty = details.Sum(x => x.Quantity); var _Quantity = all_qty ?? 0; var _DeliveryQuantity = details.Sum(x => x.DeliveryQuantity ?? 0); var _HasPickQuantity = details.Sum(x => x.HasPickQuantity); var _CompleteQuantity = details.Sum(x => x.CompleteQuantity ?? 0); var _HasDeliverQuantity = details.Sum(x => x.HasDeliverQuantity ?? 0); if (order.Quantity != _Quantity) { errCount++; ShowResult($"订单{order.OrderNo} 总需求数 不符,计算数{_Quantity},数据库数{order.Quantity}"); } if (order.DeliveryQuantity != _DeliveryQuantity) { errCount++; ShowResult($"订单{order.OrderNo}总需求数不符,计算数{_DeliveryQuantity},数据库数{order.DeliveryQuantity}"); } if (order.HasPickQuantity != _HasPickQuantity) { errCount++; ShowResult($"订单{order.OrderNo}总 已取货数 不符,计算数{_HasPickQuantity},数据库数{order.HasPickQuantity}"); } if (order.CompleteQuantity != _CompleteQuantity) { errCount++; ShowResult($"订单{order.OrderNo} 已分拣数 不符,计算数{_CompleteQuantity},数据库数{order.CompleteQuantity}"); } if (order.HasDeliverQuantity != _HasDeliverQuantity) { errCount++; ShowResult($"订单{order.OrderNo} 已发货数 不符,计算数{_HasDeliverQuantity},数据库数{order.HasDeliverQuantity}"); } } catch (Exception ex) { var errMsg = $"处理订单{order.OrderNo}异常{ex.Message}"; ShowResult(errMsg); errCount++; //MessageBox.Show(errMsg); } } ShowResult($"处理全部结束,共错误{errCount}条。。。。。。。。。。。。。"); } } } }