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<ListItem> itemList = new List<ListItem>();
|
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;
|
}
|
|
/// <summary>
|
/// 显示请求结果
|
/// </summary>
|
/// <param name="content"></param>
|
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<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
//借用单库存增加
|
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}条");
|
}
|
|
/// <summary>
|
/// 生成批次号
|
/// </summary>
|
/// <param name="prefix"></param>
|
/// <returns></returns>
|
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<string> GetString()
|
{
|
List<String> list = new List<string>();
|
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> ware_Sorting_Details = new List<ware_sorting_details>();
|
|
//借用单库存增加
|
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<string> str = new List<string>();
|
List<long> str1 = new List<long>();
|
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<ware_purchase_order_details> orders = new List<ware_purchase_order_details>();
|
|
//借用单库存增加
|
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<FunRetEntity> errList = new List<FunRetEntity>();
|
int addCount = 0, updateCount = 0;
|
|
//批量更新容器的栅格数(生产库用)
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "LocationCode", "库位编号" },
|
{ "GridNumber", "栅格数" }
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<MyLocation> myLocationList = ExcelHelper.ExcelToEntityListForCreateTable<MyLocation>(cellheader, filePath, out tableDesc, out tableName, out errorMsg);
|
if (!string.IsNullOrEmpty(errorMsg.ToString()))
|
{
|
MessageBox.Show("错误:" + errorMsg.ToString());
|
return;
|
}
|
|
var noFoundLocation = "";
|
var noFoundLocationCount = 0;
|
List<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
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<FunRetEntity> errList = new List<FunRetEntity>();
|
int addCount = 0, updateCount = 0;
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "Code", "编号" },
|
{ "Category", "大类" }
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<MyMaterialCategory> myLocationList = ExcelHelper.ExcelToEntityListForCreateTable<MyMaterialCategory>(cellheader, filePath, out tableDesc, out tableName, out errorMsg);
|
if (!string.IsNullOrEmpty(errorMsg.ToString()))
|
{
|
MessageBox.Show("错误:" + errorMsg.ToString());
|
return;
|
}
|
|
|
List<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
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<FunRetEntity> errList = new List<FunRetEntity>();
|
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<FunRetEntity> errList = new List<FunRetEntity>();
|
int addCount = 0, updateCount = 0;
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "LocationCode", "库位号" },
|
{ "MaterialCode", "物料号" },
|
{ "Quantity", "实际数量" },
|
{ "MaterialName", "物料描述" }
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<MyStore> myLocationList = ExcelHelper.ExcelToEntityListForCreateTable<MyStore>(cellheader, filePath, out tableDesc, out tableName, out errorMsg);
|
if (!string.IsNullOrEmpty(errorMsg.ToString()))
|
{
|
MessageBox.Show("错误:" + errorMsg.ToString());
|
return;
|
}
|
|
|
List<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
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<FunRetEntity> errList = new List<FunRetEntity>();
|
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<FunRetEntity> errList = new List<FunRetEntity>();
|
int addCount = 0, updateCount = 0;
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
//{ "LocationCode", "库位号" },
|
{ "MaterialCode", "物料编号" },
|
//{ "Quantity", "实际数量" },
|
//{ "MaterialName", "物料描述" }
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<MyStore2> myLocationList = ExcelHelper.ExcelToEntityListForCreateTable<MyStore2>(cellheader, filePath, out tableDesc, out tableName, out errorMsg);
|
if (!string.IsNullOrEmpty(errorMsg.ToString()))
|
{
|
MessageBox.Show("错误:" + errorMsg.ToString());
|
return;
|
}
|
|
|
List<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
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<FunRetEntity> errList = new List<FunRetEntity>();
|
int addCount = 0, updateCount = 0, deleteCount = 0;
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "MaterialCode", "物料编号" },
|
{ "MaterialName", "物料名称" },
|
{ "Quantity", "库存数量" },
|
{ "LocationCode", "库位编号" },
|
{ "Area", "库区" },
|
{ "Days", "库龄(天)" },
|
{ "SupplierNo", "供应商编号" },
|
{ "SupplierName", "供应商名称" },
|
|
{ "IsDel", "是否删除" },
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<MyStoreForUpdateStore> myLocationList = ExcelHelper.ExcelToEntityListForCreateTable<MyStoreForUpdateStore>(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<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
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<ware_container_vs_material> removeList = new List<ware_container_vs_material>();
|
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();
|
}
|
|
/// <summary>
|
/// //根据SAP库存去更新库存。
|
/// </summary>
|
private void _button17_Click()
|
{
|
|
|
//根据盘点Excel更新库存
|
var preStr = "[生产库]根据SAP库存导入库存!======";
|
|
List<FunRetEntity> errList = new List<FunRetEntity>();
|
int addCount = 0, updateCount = 0, deleteCount = 0;
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "MaterialCode", "物料编号" },
|
{ "MaterialName", "物料名称" },
|
{ "SapLocation", "SAP位置" },
|
{ "BatchNo", "批次号" },
|
{ "Str_Quantity", "库存数量" },
|
{ "LocationCode", "库位编号" }
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<MyStoreForUpdateStoreBySAP> myLocationList = ExcelHelper.ExcelToEntityListForCreateTable<MyStoreForUpdateStoreBySAP>(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<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
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<ware_container_vs_material> 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<FunRetEntity> errList = new List<FunRetEntity>();
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
//见文件【采购单导入模板.xls】
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "OrderNo", "采购单号" },
|
{ "Material", "物料编号" },
|
{ "MaterialDescription", "物料名称" },
|
{ "LineNumber", "行号" },
|
{ "Qty", "数量" },
|
{ "Suplier", "供应商代码" },
|
{ "Unit", "单位" },
|
{ "BatchNo", "批次号" },
|
{ "SapLocation", "SAP位置" },
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<InitPO> ysLocationList = ExcelHelper.ExcelToEntityListForCreateTable<InitPO>(cellheader, filePath, out tableDesc, out tableName, out errorMsg);
|
if (!string.IsNullOrEmpty(errorMsg.ToString()))
|
{
|
MessageBox.Show("错误:" + errorMsg.ToString());
|
return;
|
}
|
ShowResult("开始处理");
|
//校验数据
|
int aa_rowNum = 0;
|
List<InitPO> new_myLocationList = new List<InitPO>();
|
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<ware_purchase_order_details> new_orderDetails = new List<ware_purchase_order_details>();
|
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<ware_purchase_order_details> new_orderDetails = new List<ware_purchase_order_details>();
|
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<ware_purchase_order_details> 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<FunRetEntity> errList = new List<FunRetEntity>();
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "Material", "物料编号" },
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<AnalysisMaterial> ysLocationList = ExcelHelper.ExcelToEntityListForCreateTable<AnalysisMaterial>(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<AnalysisMaterial> new_sap_LocationList = new List<AnalysisMaterial>();
|
foreach (var item in group)
|
{
|
new_sap_LocationList.Add(new AnalysisMaterial()
|
{
|
Material = item.Key.Material
|
});
|
}
|
|
|
|
|
List<AnalysisNoFinishedPOResult> results = new List<AnalysisNoFinishedPOResult>();
|
|
|
List<ware_material> wms_NoFinishedList = new List<ware_material>();//查找视图
|
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<long> existList = new List<long>();
|
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();
|
}
|
|
/// <summary>
|
/// 更新收货状态
|
/// </summary>
|
/// <param name="item"></param>
|
/// <param name="ysLocationList"></param>
|
/// <param name="goodQty"></param>
|
private void UpdateStatus(MyDbContext dbContext2, AnalysisNoFinishedPO item, List<AnalysisNoFinishedPO> 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();//保存
|
|
}
|
|
/// <summary>
|
/// 其余物料,全部更新收货状态为全部收货完成
|
/// </summary>
|
/// <param name="item"></param>
|
/// <param name="ysLocationList"></param>
|
/// <param name="goodQty"></param>
|
private void UpdateStatusFor收货完成(MyDbContext dbContext2, string orderNo, List<AnalysisNoFinishedPO> 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<FunRetEntity> errList = new List<FunRetEntity>();
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "Type", "类型" },
|
{ "OrderNo", "单号" },
|
{ "LineNumber", "行号" },
|
{ "Material", "物料编号" },
|
// { "Suplier", "供应商" },
|
{ "MaterialDescription", "物料名称" },
|
{ "Qty", "需求数" },
|
{ "HasReciveQty", "已收数" }
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<AnalysisNoFinishedPO> ysLocationList = ExcelHelper.ExcelToEntityListForCreateTable<AnalysisNoFinishedPO>(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<AnalysisNoFinishedPO> new_myLocationList = new List<AnalysisNoFinishedPO>();
|
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<AnalysisNoFinishedPOResult> results = new List<AnalysisNoFinishedPOResult>();
|
|
//首先查询到WMS的未结束的PO单列表
|
List<V_QueryPurchaseOrderDetails> wms_NoFinishedList = new List<V_QueryPurchaseOrderDetails>();//查找视图
|
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<long> existList = new List<long>();
|
|
foreach (var toGroup in to_Groups)
|
{
|
//测试
|
/*
|
if (toGroup.Key.OrderNo == "3610006742")
|
{
|
var bb = "";
|
}
|
else
|
{
|
continue;
|
}
|
//*/
|
|
List<AnalysisNoFinishedPO> 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<FunRetEntity> errList = new List<FunRetEntity>();
|
int addCount = 0, updateCount = 0, deleteCount = 0;
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "MaterialCode", "物料编号" }
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<DJ_MyStoreForUpdateStoreBySAP> myLocationList = ExcelHelper.ExcelToEntityListForCreateTable<DJ_MyStoreForUpdateStoreBySAP>(cellheader, filePath, out tableDesc, out tableName, out errorMsg);
|
if (!string.IsNullOrEmpty(errorMsg.ToString()))
|
{
|
MessageBox.Show("错误:" + errorMsg.ToString());
|
return;
|
}
|
|
//MessageBox.Show("错误:" + errorMsg.ToString());
|
//return;
|
|
List<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
ware_container_vs_material aa = null;
|
|
int rowNum = 0;
|
|
using (MyDbContext dbContext = new MyDbContext())
|
{
|
|
List<ware_container_vs_material> dbList = null;
|
dbList = dbContext.ware_container_vs_material.Where(x => x.IsDeleted == false
|
&& x.WareContainerCode == WareLocationEnum.QMLOT.ToString()
|
).ToList();
|
|
List<string> pcMaterialCodeList = myLocationList.Select(x => x.MaterialCode).ToList();
|
List<ware_container_vs_material> update_dbList = new List<ware_container_vs_material>();
|
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<FunRetEntity> errList = new List<FunRetEntity>();
|
int addCount = 0, updateCount = 0, deleteCount = 0;
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "MaterialCode", "物料编号" },
|
{ "Result", "结果" }
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<CheckStatusFromSAP> myLocationList = ExcelHelper.ExcelToEntityListForCreateTable<CheckStatusFromSAP>(cellheader, filePath, out tableDesc, out tableName, out errorMsg);
|
if (!string.IsNullOrEmpty(errorMsg.ToString()))
|
{
|
MessageBox.Show("错误:" + errorMsg.ToString());
|
return;
|
}
|
|
//MessageBox.Show("错误:" + errorMsg.ToString());
|
//return;
|
|
List<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
ware_container_vs_material aa = null;
|
|
int rowNum = 0;
|
|
List<string> pcMaterialCodeList = myLocationList.Select(x => x.MaterialCode).ToList();
|
|
List<AnalysisNoFinishedPOResult> results = new List<AnalysisNoFinishedPOResult>();
|
|
using (MyDbContext dbContext = new MyDbContext())
|
{
|
|
List<ware_material> 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<FunRetEntity> errList = new List<FunRetEntity>();
|
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<string, string> cellheader = new Dictionary<string, string> {
|
{ "MaterialCode", "物料编号" },
|
{ "Quantity", "需求数" }, //注意:数量是负数呢!!!
|
{ "SubOrderNo", "工单号" },
|
{ "SapLocation", "SAP位置" }
|
|
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<MyKittingFH> myLocationList = ExcelHelper.ExcelToEntityListForCreateTable<MyKittingFH>(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<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
ware_container_vs_material aa = null;
|
|
var _OrderNo = "虚拟Kitting";
|
|
int _lineNumber = 0;
|
|
List<Int64> updateDbIds = new List<long>();
|
|
//查询总库存
|
|
var db_wareContainerVsMaterialList = new List<ware_container_vs_material>();
|
//发货记录
|
List<ware_delivery_record> wareDeliveryRecords = new List<ware_delivery_record>();
|
|
var details = new List<ware_orders_details>();
|
|
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<long> removeInstIds = new List<long>();
|
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<ware_common_sap_delivery_info> wareCommonSapDeliveryInfos = new List<ware_common_sap_delivery_info>();
|
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();
|
}
|
/// <summary>
|
/// //根据SAP库存去更新库存。
|
/// </summary>
|
private void _button23_Click()
|
{
|
|
|
//根据盘点Excel更新库存
|
var preStr = "[生产库]根据SAP库存导入库存!======";
|
|
List<FunRetEntity> errList = new List<FunRetEntity>();
|
int addCount = 0, updateCount = 0, deleteCount = 0;
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "MaterialCode", "物料编号" },
|
{ "MaterialName", "物料名称" },
|
{ "SapLocation", "SAP位置" },
|
{ "BatchNo", "批次号" },
|
{ "Str_Quantity", "库存数量" },
|
{ "LocationCode", "库位编号" }
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<MyStoreForUpdateStoreBySAP2> myLocationList = ExcelHelper.ExcelToEntityListForCreateTable<MyStoreForUpdateStoreBySAP2>(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<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
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<ware_container_vs_material> 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();
|
}
|
|
/// <summary>
|
/// 根据SAP库存去删除库存
|
/// </summary>
|
private void _button24_Click()
|
{
|
|
|
//根据盘点Excel更新库存
|
var preStr = "[生产库]根据SAP库存导入库存!======";
|
|
List<FunRetEntity> errList = new List<FunRetEntity>();
|
int addCount = 0, updateCount = 0, deleteCount = 0;
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "MaterialCode", "物料编号" },
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<MyStoreForUpdateStoreBySAP2> myLocationList = ExcelHelper.ExcelToEntityListForCreateTable<MyStoreForUpdateStoreBySAP2>(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<ware_container_vs_material> addList = new List<ware_container_vs_material>();
|
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<ware_container_vs_material> 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<FunRetEntity> errList = new List<FunRetEntity>();
|
|
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<FunRetEntity> errList = new List<FunRetEntity>();
|
|
|
string filePath = this.tb_FilePath.Text;
|
if (filePath == string.Empty)
|
{
|
MessageBox.Show("请选择Excel!");
|
return;
|
}
|
//见文件【采购单导入模板.xls】
|
Dictionary<string, string> cellheader = new Dictionary<string, string> {
|
{ "OrderNo", "单号" },
|
{ "Month", "月份" },
|
};
|
|
// 1.2解析文件,存放到一个List集合里
|
StringBuilder errorMsg = new StringBuilder(); // 错误信息
|
string tableDesc = "", tableName = "";
|
List<ImportKittingMonth> ysLocationList = ExcelHelper.ExcelToEntityListForCreateTable<ImportKittingMonth>(cellheader, filePath, out tableDesc, out tableName, out errorMsg);
|
if (!string.IsNullOrEmpty(errorMsg.ToString()))
|
{
|
MessageBox.Show("错误:" + errorMsg.ToString());
|
return;
|
}
|
ShowResult("开始处理");
|
//校验数据
|
int aa_rowNum = 0;
|
List<ImportKittingMonth> new_myLocationList = new List<ImportKittingMonth>();
|
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<FunRetEntity> errList = new List<FunRetEntity>();
|
|
|
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}条。。。。。。。。。。。。。");
|
}
|
}
|
}
|
}
|