diff --git a/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs b/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs index eeddbe78..f5fbd887 100644 --- a/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs +++ b/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs @@ -58,6 +58,16 @@ namespace ZR.Model.MES.wms.Dto public DateTime? UpdatedTime { get; set; } } + + public class WmOneTimeInventoryTableDto + { + public int Total { get; set; } + public int StocktakingTotal { get; set; } + public int QuantitySum { get; set; } + public int RealQuantitySum { get; set; } + public List Result { get; set; } + } + // 一次合格(产成品)导出 [SugarTable("wm_one_time_record", "一次合格表")] public class WmOneTimeInventoryExportDto diff --git a/ZR.Model/MES/wms/Dto/WmPolishInventoryDto.cs b/ZR.Model/MES/wms/Dto/WmPolishInventoryDto.cs index 81b1f6f4..a0fa6fdf 100644 --- a/ZR.Model/MES/wms/Dto/WmPolishInventoryDto.cs +++ b/ZR.Model/MES/wms/Dto/WmPolishInventoryDto.cs @@ -61,6 +61,16 @@ namespace ZR.Model.MES.wms.Dto public DateTime? UpdatedTime { get; set; } } + + public class WmPolishInventoryTableDto + { + public int Total { get; set; } + public int StocktakingTotal { get; set; } + public int QuantitySum { get; set; } + public int RealQuantitySum { get; set; } + public List Result { get; set; } + } + [SugarTable("wm_polish_inventory", "抛光表")] public class WmPolishInventoryExportDto { @@ -69,11 +79,12 @@ namespace ZR.Model.MES.wms.Dto public string 颜色 { get; set; } public string 规格 { get; set; } public string 描述 { get; set; } + [SugarColumn(ColumnName = "quantity")] public int 盘点数 { get; set; } = 0; public int 现有库存 { get; set; } = 0; + [SugarColumn(ColumnName = "CREATED_TIME")] public DateTime? 盘点时间 { get; set; } } - } diff --git a/ZR.Service/mes/qc/CommonFQCService.cs b/ZR.Service/mes/qc/CommonFQCService.cs index d792f1e9..90ddbe1c 100644 --- a/ZR.Service/mes/qc/CommonFQCService.cs +++ b/ZR.Service/mes/qc/CommonFQCService.cs @@ -1314,7 +1314,10 @@ namespace ZR.Service.mes.qc var predicateParkingSensor = Expressionable .Create() .And(it => ParkingSensorPartNumberList.Contains(it.FinishedPartNumber)) - .AndIF(!string.IsNullOrEmpty(query.Partnumber), it => it.FinishedPartNumber == query.Partnumber) + .AndIF( + !string.IsNullOrEmpty(query.Partnumber), + it => it.FinishedPartNumber == query.Partnumber + ) .And(it => it.StartTime >= boardData.OneTimeStockTime) .ToExpression(); // 倒车雷达 @@ -1408,6 +1411,12 @@ namespace ZR.Service.mes.qc { foreach (var partNumber in partNumbers) { + startTime = + Context + .Queryable() + .Where(it => it.Partnumber == partNumber) + .Select(it => it.UpdatedTime) + .First() ?? startTime; // 盘点数 int polishWarehouseTotal = Context @@ -1475,6 +1484,12 @@ namespace ZR.Service.mes.qc { foreach (var partNumber in partNumbers) { + startTime = + Context + .Queryable() + .Where(it => it.Partnumber == partNumber) + .Select(it => it.UpdatedTime) + .First() ?? startTime; // 基本值 int oneTimeWarehouseTotal = Context @@ -1497,27 +1512,28 @@ namespace ZR.Service.mes.qc .Where(ParkingSensorPartNumberCheck.ToExpression()) .Select(it => it.Partnumber) .ToList(); -/* var predicateParkingSensor = Expressionable - .Create() - .And(it => ParkingSensorPartNumberList.Contains(it.FinishedPartNumber)) - .And(it => it.FinishedPartNumber == partNumber) - .And(it => it.StartTime >= startTime.ToLocalTime()) - .ToExpression(); - int productParkingSensorbQualifiedTotal = - Context - .Queryable() - .Where(predicateParkingSensor) - .Sum(it => it.QualifiedNumber) ?? 0; - productParkingSensorbQualifiedTotal = productParkingSensorbQualifiedTotal / 3;*/ + /* var predicateParkingSensor = Expressionable + .Create() + .And(it => ParkingSensorPartNumberList.Contains(it.FinishedPartNumber)) + .And(it => it.FinishedPartNumber == partNumber) + .And(it => it.StartTime >= startTime.ToLocalTime()) + .ToExpression(); + int productParkingSensorbQualifiedTotal = + Context + .Queryable() + .Where(predicateParkingSensor) + .Sum(it => it.QualifiedNumber) ?? 0; + productParkingSensorbQualifiedTotal = productParkingSensorbQualifiedTotal / 3;*/ // 产线合格 int productQualifiedTotal = Context .Queryable() - .Where(it => !ParkingSensorPartNumberList.Contains(it.FinishedPartNumber)) + .Where(it => + !ParkingSensorPartNumberList.Contains(it.FinishedPartNumber) + ) .Where(it => it.FinishedPartNumber == partNumber) .Where(it => it.StartTime >= startTime) - .Sum(it => it.QualifiedNumber) - ?? 0; + .Sum(it => it.QualifiedNumber) ?? 0; productQualifiedTotal = productQualifiedTotal / 3; // 抛光合格 int polishQualifiedTotal = diff --git a/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs b/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs index a1ead4d9..4cba4d90 100644 --- a/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs +++ b/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs @@ -9,7 +9,7 @@ namespace ZR.Service.mes.wms.IService /// public interface IWmOneTimeInventoryService : IBaseService { - PagedInfo GetList(WmOneTimeInventoryQueryDto parm); + WmOneTimeInventoryTableDto GetList(WmOneTimeInventoryQueryDto parm); /// /// 一次合格导出 diff --git a/ZR.Service/mes/wms/IService/IWmPolishInventoryService.cs b/ZR.Service/mes/wms/IService/IWmPolishInventoryService.cs index b1b741b5..a339ab7a 100644 --- a/ZR.Service/mes/wms/IService/IWmPolishInventoryService.cs +++ b/ZR.Service/mes/wms/IService/IWmPolishInventoryService.cs @@ -10,7 +10,7 @@ namespace ZR.Service.mes.wms.IService /// public interface IWmPolishInventoryService : IBaseService { - PagedInfo GetList(WmPolishInventoryQueryDto parm); + WmPolishInventoryTableDto GetList(WmPolishInventoryQueryDto parm); /// /// 获取导出数据 diff --git a/ZR.Service/mes/wms/WmOneTimeInventoryService.cs b/ZR.Service/mes/wms/WmOneTimeInventoryService.cs index 6143c5db..422209a1 100644 --- a/ZR.Service/mes/wms/WmOneTimeInventoryService.cs +++ b/ZR.Service/mes/wms/WmOneTimeInventoryService.cs @@ -28,9 +28,85 @@ namespace ZR.Service.mes.wms /// /// /// - public PagedInfo GetList(WmOneTimeInventoryQueryDto parm) + public WmOneTimeInventoryTableDto GetList(WmOneTimeInventoryQueryDto parm) { - List partnumberByDescription = new(); + var list = Context + .Queryable() + .LeftJoin((m, p) => m.Partnumber == p.Partnumber) + .Distinct() + .WhereIF( + !string.IsNullOrEmpty(parm.Description), + (m, p) => m.Description.Contains(parm.Description) + ) + .WhereIF( + !string.IsNullOrEmpty(parm.Partnumber), + (m, p) => m.Partnumber.Contains(parm.Partnumber) + ) + .Where((m, p) => m.Status == 1) + .Where((m, p) => m.Type == 1) + .WhereIF(parm.Status > -1, (m, p) => p.Status == parm.Status) + .WhereIF(parm.Type > 0, (m, p) => p.Type == parm.Type) + .OrderBy((m, p) => m.Description) + .Select( + (m, p) => + new WmOneTimeInventoryDto + { + RealQuantity = 0, + Color = m.Color, + Specification = m.Specification, + Description = m.Description, + Id = p.Id, + BlankNum = p.BlankNum, + Partnumber = p.Partnumber, + Quantity = p.Quantity, + MaxNum = p.MaxNum, + MinNum = p.MinNum, + WarnNum = p.WarnNum, + Type = p.Type, + Status = p.Status, + Remark = p.Remark, + CreatedBy = p.CreatedBy, + CreatedTime = p.CreatedTime, + UpdatedBy = p.UpdatedBy, + UpdatedTime = p.UpdatedTime, + } + ) + .ToList(); + foreach (WmOneTimeInventoryDto item in list) + { + // 获取实际库存 + List partnumbers = new() + { + item.Partnumber + }; + Dictionary dict = GetBatchOneTimeRealPartNum(partnumbers); + item.RealQuantity = dict.TryGetValue(item.Partnumber, out int value) ? value : 0; + } + + list = list.Where(it => it.RealQuantity != 0 || it.Quantity != 0) + .Where(it => !string.IsNullOrEmpty(it.Partnumber)) + .DistinctBy(it => it.Partnumber) + .ToList(); + + int total = list.Count; + // 仓库总盘点零件数 + int StocktakingTotal = + Context.Queryable().Sum(it => it.Quantity) ?? 0; + // 仓库当前查询盘点零件数 + int QuantitySum = list.Sum(it => it.Quantity) ?? 0; + // 仓库当前查询实际零件数 + int RealQuantitySum = list.Sum(it => it.RealQuantity); + WmOneTimeInventoryTableDto response = new() + { + Total = total, + StocktakingTotal = StocktakingTotal, + QuantitySum = QuantitySum, + RealQuantitySum = RealQuantitySum, + Result = list.Skip((parm.PageNum - 1) * parm.PageSize).Take(parm.PageSize).ToList(), + }; + return response; + + /*List partnumberByDescription = new(); if (parm != null && !string.IsNullOrEmpty(parm.Description)) { partnumberByDescription = Context @@ -84,7 +160,7 @@ namespace ZR.Service.mes.wms item.RealQuantity = dict.TryGetValue(item.Partnumber, out int value) ? value : 0; } } - return response; + return response;*/ } /// @@ -498,12 +574,13 @@ namespace ZR.Service.mes.wms try { // 盘点时间 - DateTime? checkTime = Context - .Queryable() - .Where(it => it.Status == 1) - .Select(it => it.CreatedTime) - .First() ?? new DateTime(2024, 10, 19, 0, 0, 0); - // DateTime + DateTime? checkTime = + Context + .Queryable() + .Where(it => it.Status == 1) + .Select(it => it.CreatedTime) + .First() ?? new DateTime(2024, 10, 19, 0, 0, 0); + // DateTime CommonFQCService commonFQCService = new(); // 获取报表数据 // 一次合格计算后库存 = 盘点库存 + 产线合格 + 抛光合格 - gp12投入 - 后道直接出库 @@ -522,44 +599,49 @@ namespace ZR.Service.mes.wms /// public (string, object, object) ImportExcel(List importList) { - List wmOneTimeInventorylist = importList.Select(it => new WmOneTimeInventory - { - Id = SnowFlakeSingle.Instance.NextId().ToString(), - Type = 1, - Status = 1, - MaxNum = 0, - MinNum = 0, - WarnNum = 0, - CreatedBy = "页面导入", - Remark = "EXCEL 盘点导入", - CreatedTime = it.盘点时间 ?? DateTime.Now.ToLocalTime(), - Partnumber = it.零件号, - Quantity = it.盘点数 - }).ToList(); - var x = Context.Storageable(wmOneTimeInventorylist) + List wmOneTimeInventorylist = importList + .Select(it => new WmOneTimeInventory + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + Type = 1, + Status = 1, + MaxNum = 0, + MinNum = 0, + WarnNum = 0, + CreatedBy = "页面导入", + Remark = "EXCEL 盘点导入", + CreatedTime = it.盘点时间 ?? DateTime.Now.ToLocalTime(), + Partnumber = it.零件号, + Quantity = it.盘点数 + }) + .ToList(); + var x = Context + .Storageable(wmOneTimeInventorylist) .SplitError(x => x.Item.Partnumber.IsEmpty(), "零件号不能为空") .SplitError(x => x.Item.Quantity.IsEmpty(), "盘点数不能为空") .SplitUpdate(it => it.Any()) // 数据库存在更新 .SplitDelete(it => it.Item.Quantity == 0) //盘点数为0的不导入 .SplitInsert(it => true) // 其余插入 - .WhereColumns(it => it.Partnumber)//如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2}) + .WhereColumns(it => it.Partnumber) //如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2}) .ToStorage(); // 清空全部 - var result = x.AsInsertable.ExecuteCommand();//不存在则插入; - var result2 = x.AsUpdateable.IgnoreColumns(it => new { it.Id }).ExecuteCommand();//存在则修改; + var result = x.AsInsertable.ExecuteCommand(); //不存在则插入; + var result2 = x.AsUpdateable.IgnoreColumns(it => new { it.Id }).ExecuteCommand(); //存在则修改; var result3 = x.AsDeleteable.ExecuteCommand(); //盘点数为0的删除; - string msg = string.Format(" 插入{0} 更新{1} 错误数据{2} 不计算数据{3} 删除数据{4} 总共{5}", - x.InsertList.Count, - x.UpdateList.Count, - x.ErrorList.Count, - x.IgnoreList.Count, - x.DeleteList.Count, - x.TotalList.Count); - //输出统计 + string msg = string.Format( + " 插入{0} 更新{1} 错误数据{2} 不计算数据{3} 删除数据{4} 总共{5}", + x.InsertList.Count, + x.UpdateList.Count, + x.ErrorList.Count, + x.IgnoreList.Count, + x.DeleteList.Count, + x.TotalList.Count + ); + //输出统计 Console.WriteLine(msg); - //输出错误信息 + //输出错误信息 foreach (var item in x.ErrorList) { Console.WriteLine("零件异常:" + item.Item.Partnumber + " : " + item.StorageMessage); diff --git a/ZR.Service/mes/wms/WmPolishInventoryService.cs b/ZR.Service/mes/wms/WmPolishInventoryService.cs index 99232d9d..70e1a75c 100644 --- a/ZR.Service/mes/wms/WmPolishInventoryService.cs +++ b/ZR.Service/mes/wms/WmPolishInventoryService.cs @@ -1,4 +1,5 @@ using System; +using System.Drawing; using System.Linq; using System.Threading.Tasks; using Aliyun.OSS; @@ -7,6 +8,7 @@ using Infrastructure.Attribute; using Infrastructure.Extensions; using JinianNet.JNTemplate; using Microsoft.AspNetCore.DataProtection.KeyManagement; +using Microsoft.AspNetCore.Http.HttpResults; using Newtonsoft.Json.Linq; using SqlSugar; using ZR.Common; @@ -38,16 +40,93 @@ namespace ZR.Service.mes.wms /// /// /// - public PagedInfo GetList(WmPolishInventoryQueryDto parm) + public WmPolishInventoryTableDto GetList(WmPolishInventoryQueryDto parm) { - List partnumberByDescription = new(); + var list = Context + .Queryable() + .LeftJoin((m, p) => m.Partnumber == p.Partnumber) + .Distinct() + //.GroupBy((m, p) => p.Partnumber) + .WhereIF( + !string.IsNullOrEmpty(parm.Description), + (m, p) => m.Description.Contains(parm.Description) + ) + .WhereIF( + !string.IsNullOrEmpty(parm.Partnumber), + (m, p) => m.Partnumber.Contains(parm.Partnumber) + ) + .Where((m, p) => m.Status == 1) + .Where((m, p) => m.Type == 1) + .WhereIF(parm.Status > -1, (m, p) => p.Status == parm.Status) + .WhereIF(parm.Type > 0, (m, p) => p.Type == parm.Type) + .OrderBy((m, p) => m.Description) + .Select( + (m, p) => + new WmPolishInventoryDto + { + RealQuantity = 0, + Color = m.Color, + Specification = m.Specification, + Description = m.Description, + Id = p.Id, + BlankNum = p.BlankNum, + Partnumber = p.Partnumber, + Quantity = p.Quantity, + MaxNum = p.MaxNum, + MinNum = p.MinNum, + WarnNum = p.WarnNum, + Type = p.Type, + Status = p.Status, + Remark = p.Remark, + CreatedBy = p.CreatedBy, + CreatedTime = p.CreatedTime, + UpdatedBy = p.UpdatedBy, + UpdatedTime = p.UpdatedTime, + } + ) + .ToList(); + foreach (WmPolishInventoryDto item in list) + { + // 获取实际库存 + List partnumbers = new() + { + item.Partnumber + }; + Dictionary dict = GetBatchPolishRealPartNum(partnumbers); + item.RealQuantity = dict.TryGetValue(item.Partnumber, out int value) ? value : 0; + } + + list = list.Where(it => it.RealQuantity != 0 || it.Quantity != 0) + .Where(it => !string.IsNullOrEmpty(it.Partnumber)) + .DistinctBy(it => it.Partnumber) + .ToList(); + + int total = list.Count; + // 仓库总盘点零件数 + int StocktakingTotal = + Context.Queryable().Sum(it => it.Quantity) ?? 0; + // 仓库当前查询盘点零件数 + int QuantitySum = list.Sum(it => it.Quantity) ?? 0; + // 仓库当前查询实际零件数 + int RealQuantitySum = list.Sum(it => it.RealQuantity); + WmPolishInventoryTableDto response = new() + { + Total = total, + StocktakingTotal = StocktakingTotal, + QuantitySum = QuantitySum, + RealQuantitySum = RealQuantitySum, + Result = list.Skip((parm.PageNum - 1)* parm.PageSize).Take(parm.PageSize).ToList(), + }; + return response; + + //TODO 历史查询 + /*List partnumberByDescription = new(); if (parm != null && !string.IsNullOrEmpty(parm.Description)) { partnumberByDescription = Context .Queryable() .Where(it => it.Description.Contains(parm.Description)) .Select(it => it.Partnumber) - .ToList(); } var predicate = Expressionable @@ -89,14 +168,13 @@ namespace ZR.Service.mes.wms ? material.Description : material.ProductName; // 获取实际库存 - List partnumbers = new List(); partnumbers.Add(item.Partnumber); Dictionary dict = GetBatchPolishRealPartNum(partnumbers); item.RealQuantity = dict.TryGetValue(item.Partnumber, out int value)? value : 0; } } - return response; + return response;*/ } /// @@ -576,11 +654,12 @@ namespace ZR.Service.mes.wms try { // 盘点时间 - DateTime? checkTime = Context - .Queryable() - .Where(it => it.Status == 1) - .Select(it => it.CreatedTime) - .First() ?? new DateTime(2024, 10, 19, 0, 0, 0); + DateTime? checkTime = + Context + .Queryable() + .Where(it => it.Status == 1) + .Select(it => it.CreatedTime) + .First() ?? new DateTime(2024, 10, 19, 0, 0, 0); CommonFQCService commonFQCService = new(); // 获取报表数据 // 抛光计算后库存 = 盘点库存 + 产线抛光 + 后道反抛 + GP12反抛 - 抛光投入 @@ -599,43 +678,49 @@ namespace ZR.Service.mes.wms /// public (string, object, object) ImportExcel(List importList) { - List wmPolishInventorylist = importList.Select(it => new WmPolishInventory { - Id = SnowFlakeSingle.Instance.NextId().ToString(), - Type = 1, - Status = 1, - MaxNum = 0, - MinNum = 0, - WarnNum = 0, - CreatedBy = "页面导入", - Remark = "EXCEL 盘点导入", - CreatedTime = it.盘点时间 ?? DateTime.Now.ToLocalTime(), - Partnumber = it.零件号, - Quantity = it.盘点数 - }).ToList(); - var x = Context.Storageable(wmPolishInventorylist) + List wmPolishInventorylist = importList + .Select(it => new WmPolishInventory + { + Id = SnowFlakeSingle.Instance.NextId().ToString(), + Type = 1, + Status = 1, + MaxNum = 0, + MinNum = 0, + WarnNum = 0, + CreatedBy = "页面导入", + Remark = "EXCEL 盘点导入", + CreatedTime = it.盘点时间 ?? DateTime.Now.ToLocalTime(), + Partnumber = it.零件号, + Quantity = it.盘点数 + }) + .ToList(); + var x = Context + .Storageable(wmPolishInventorylist) .SplitError(x => x.Item.Partnumber.IsEmpty(), "零件号不能为空") .SplitError(x => x.Item.Quantity.IsEmpty(), "盘点数不能为空") .SplitUpdate(it => it.Any()) // 数据库存在更新 .SplitDelete(it => it.Item.Quantity == 0) //盘点数为0的不导入 .SplitInsert(it => true) // 其余插入 - .WhereColumns(it => it.Partnumber)//如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2}) + .WhereColumns(it => it.Partnumber) //如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2}) .ToStorage(); // 清空全部 - var result = x.AsInsertable.ExecuteCommand();//不存在则插入; - var result2 = x.AsUpdateable.IgnoreColumns(it => new { it.Id }).ExecuteCommand();//存在则修改; + var result = x.AsInsertable.ExecuteCommand(); //不存在则插入; + var result2 = x.AsUpdateable.IgnoreColumns(it => new { it.Id }).ExecuteCommand(); //存在则修改; var result3 = x.AsDeleteable.ExecuteCommand(); //盘点数为0的删除; - string msg = string.Format(" 插入{0} 更新{1} 错误数据{2} 不计算数据{3} 删除数据{4} 总共{5}", - x.InsertList.Count, - x.UpdateList.Count, - x.ErrorList.Count, - x.IgnoreList.Count, - x.DeleteList.Count, - x.TotalList.Count); - //输出统计 + string msg = string.Format( + " 插入{0} 更新{1} 错误数据{2} 不计算数据{3} 删除数据{4} 总共{5}", + x.InsertList.Count, + x.UpdateList.Count, + x.ErrorList.Count, + x.IgnoreList.Count, + x.DeleteList.Count, + x.TotalList.Count + ); + //输出统计 Console.WriteLine(msg); - //输出错误信息 + //输出错误信息 foreach (var item in x.ErrorList) { Console.WriteLine("零件异常:" + item.Item.Partnumber + " : " + item.StorageMessage);