using Admin.NET.Core.Service; using Admin.NET.Application.Entity; using Microsoft.AspNetCore.Http; using System.Data; using System.Web; using System.Text; using DocumentFormat.OpenXml.Office.CustomUI; using Microsoft.CodeAnalysis.Operations; using Admin.NET.Application.Service.WmsTask.WmsRbLineTask.Dto; using Admin.NET.Application.Service.WmsCommonnQuery.Dto; using System.Collections.Generic; using Admin.NET.Application.CommonHelper; namespace Admin.NET.Application; /// /// 通用查询服务 /// [ApiDescriptionSettings(ApplicationConst.WmsCommonnQueryGroupName, Order = 100)] [AllowAnonymous] public class WmsCommonnQueryService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _wmsRbLineTaskRep; private readonly SqlSugarRepository _wmsStockQuanRep; private readonly SqlSugarRepository _mesPackageGatherRep; private readonly SqlSugarRepository _sysConfigRep; private readonly SqlSugarRepository _mesBatchOrderUpiRep; private readonly SqlSugarRepository _mesOrderGatherRep; private readonly SqlSugarRepository _mesPackage_UnLine_RecordRep; private readonly SqlSugarRepository _mesPackage_LineQueueRep; private readonly SqlSugarRepository _wmsRecordUpiReplenishRep; private readonly SqlSugarRepository _wmsRecordUpiProcessRep; public WmsCommonnQueryService(SqlSugarRepository wmsRbLineTaskRep, SqlSugarRepository wmsStockQuanRep , SqlSugarRepository mesPackageGatherRep , SqlSugarRepository sysConfigRep , SqlSugarRepository mesBatchOrderUpiRep , SqlSugarRepository mesOrderGatherRep , SqlSugarRepository mesPackage_UnLine_RecordRep , SqlSugarRepository mesPackage_LineQueueRep , SqlSugarRepository wmsRecordUpiReplenishRep , SqlSugarRepository wmsRecordUpiProcessRep ) { _wmsRecordUpiReplenishRep = wmsRecordUpiReplenishRep; _sysConfigRep = sysConfigRep; _mesPackageGatherRep = mesPackageGatherRep; _wmsRbLineTaskRep = wmsRbLineTaskRep; _wmsStockQuanRep = wmsStockQuanRep; _mesBatchOrderUpiRep = mesBatchOrderUpiRep; _mesOrderGatherRep = mesOrderGatherRep; _mesPackage_UnLine_RecordRep = mesPackage_UnLine_RecordRep; _mesPackage_LineQueueRep = mesPackage_LineQueueRep; _wmsRecordUpiProcessRep = wmsRecordUpiProcessRep; } /// /// 查询不齐套单据 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "QueryNoKittingList")] [Description("WmsCommonnQuery/QueryNoKittingList")] public async Task> QueryNoKittingList([FromQuery] KittingListInput input) { var list = await _mesOrderGatherRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.Info5), u => u.Info5.Contains(input.Info5.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Info5), u => u.Info5.Contains(input.Info5.Trim())) .Where(x => ((DateTime)x.CreateTime).ToString("yyyyMMdd") == DateTime.Now.ToString("yyyyMMdd")) .Where(x => x.IsKitting == false) .OrderBy(g => g.Id) .ToListAsync(); // 确保获取结果为 List return list; // 结果 } /// /// 查询 计划生产订单记录 (大屏使用) /// /// [HttpGet] [ApiDescriptionSettings(Name = "QueryPlanOrderList")] [Description("WmsCommonnQuery/QueryPlanOrderList")] public async Task> QueryPlanOrderList() { var list = await _mesPackage_LineQueueRep.AsQueryable() .OrderBy(g => g.Id) .ToListAsync(); // 确保获取结果为 List List resultList = new List(); foreach (var item in list) { if (resultList.Select(x => x.Info5).ToList().Contains(item.Info5)) { } else { var mesOrderGather = await _mesOrderGatherRep.GetFirstAsync(x => x.Info5 == item.Info5); if (mesOrderGather != null) { resultList.Add(mesOrderGather); } } } return resultList; // 结果 } /// /// 查询 历史生产订单记录 (大屏使用) /// /// [HttpGet] [ApiDescriptionSettings(Name = "QueryHistoryOrderList")] [Description("WmsCommonnQuery/QueryHistoryOrderList")] public async Task> QueryHistoryOrderList() { //获取上班时间。 var sysConfig_wms_unline_time = await _sysConfigRep.GetFirstAsync(x => x.Code == CommonConst.wms_unline_time); if (sysConfig_wms_unline_time == null || sysConfig_wms_unline_time.Value == "无") { return null; } var unLineTime = Convert.ToDateTime(sysConfig_wms_unline_time.Value); var list = await _mesOrderGatherRep.AsQueryable() .Where(x => x.UnlineTime >= unLineTime) .Where(x => x.IsUnline == true) .OrderByDescending(g => g.Id) .ToListAsync(); // 确保获取结果为 List return list; // 结果 } /// /// 查询 当前生产订单记录 (大屏使用) /// /// [HttpGet] [ApiDescriptionSettings(Name = "QueryCurrentOrder")] [Description("WmsCommonnQuery/QueryCurrentOrder")] public async Task QueryCurrentOrder() { //获取上班时间。 var sysConfig_wms_wms_unline_oper = await _sysConfigRep.GetFirstAsync(x => x.Code == CommonConst.WmsBZ30_QiTao); if (sysConfig_wms_wms_unline_oper == null || sysConfig_wms_wms_unline_oper.Value == "无") { return null; } var arr = sysConfig_wms_wms_unline_oper.Value.Split('|'); var packagecode = arr[0]; var packObj = await _mesPackageGatherRep.AsQueryable().FirstAsync(x => x.PackageCode == packagecode); if (packObj == null) { throw Oops.Oh($"没有找到包{packagecode}的汇总数据"); } var list = await _mesOrderGatherRep.AsQueryable() .Where(x => x.Info5 == packObj.Info5) .FirstAsync(); // 确保获取结果为 List return list; // 结果 } /// /// 大屏 - 登录人 登录时间 LS070700117B0005GS /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "ScreenLogin")] [Description("WmsCommonnQuery/ScreenLogin")] [AllowAnonymous] public async Task ScreenLogin([FromQuery] Mes_Package_LineQueueInput input) { // 基本查询 var list = await _sysConfigRep.AsQueryable() .Where(x => x.Code == "wms_bz30_qitao" || x.Code == "wms_unline_oper" || x.Code == "wms_unline_time") .ToListAsync(); // 检查list是否为空 if (list == null || !list.Any()) { // 返回默认值或者抛出异常 return new ScreenLoginUserOutput { LoginUser = null, TimeLogin = null, }; } //获取上班时间。 DateTime unLineTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00")); var sysConfig_wms_unline_time = await _sysConfigRep.GetFirstAsync(x => x.Code == CommonConst.wms_unline_time); if (sysConfig_wms_unline_time == null || sysConfig_wms_unline_time.Value == "无") { } else { unLineTime = Convert.ToDateTime(sysConfig_wms_unline_time.Value); } var recordList = await _mesPackage_UnLine_RecordRep.AsQueryable() .Where(x => x.CreateTime >= unLineTime) .ToListAsync(); // 确保获取结果为 List //汇总数据 TimeSpan ts = DateTime.Now - unLineTime; // 返回结果 return new ScreenLoginUserOutput { LoginUser = list.FirstOrDefault(x => x.Code == "wms_unline_oper")?.Value, TimeLogin = list.FirstOrDefault(x => x.Code == "wms_unline_time")?.Value, AllOrderNum = recordList.GroupBy(x => x.Info5).Count(), AllPackageArea = recordList.Sum(x => Convert.ToDecimal((x.Info13))), PackageNum = recordList.GroupBy(x => x.PackageCode).Count(), WorkTime = ts.TotalHours }; } /// /// 不分页查询缓存岛齐包管理 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "packList")] [Description("WmsCommonnQuery/packList")] public async Task> PackList([FromQuery] PackListInput input) { // 获取符合条件的记录,并提取所需信息 var list = await _wmsStockQuanRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.PackageCode), u => u.PackageCode.Contains(input.PackageCode.Trim())) .Select(x => new { x.PackageCode }) .ToListAsync(); // 创建一个列表以存储 WmsPackListOutput var resultList = new List(); // 分组并计算每组信息 var groupedResult = list.GroupBy(x => x.PackageCode); foreach (var g in groupedResult) { // 在这里计算每组的总数 var count = g.Count(); var mesTotalCount = await _mesBatchOrderUpiRep.AsQueryable().CountAsync(m => m.PackageCode == g.Key); resultList.Add(new WmsPackListOutput { PackageCode = g.Key, Count = count, MesTotalCount = mesTotalCount, IsPack = count >= mesTotalCount, // 检查是否打包 LackCount = mesTotalCount - count }); } // 过滤、排序并返回最终结果 var finalResult = resultList .WhereIF(input.IsPack.HasValue, u => u.IsPack == input.IsPack) .OrderBy(g => g.PackageCode) .ToList(); return finalResult; } /// /// 不分页查询齐套管理 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "KittingList")] [Description("WmsCommonnQuery/KittingList")] public async Task> KittingList([FromQuery] KittingListInput input) { var list = await _wmsStockQuanRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.DetailName), u => u.PlaceCode.Contains(input.DetailName.Trim())) .Select(x => new WmsKittingListOutput { OrderId = x.OrderId }) .ToListAsync(); // 确保获取结果为 List // 分组并返回分组信息 var groupedResult = list .GroupBy(x => x.OrderId) // 按 PackageCode 分组 .Select(g => new WmsKittingListOutput { OrderId = g.Key, // 获取分组的键 Count = g.Count(), // 统计每组的数量 IsKitting = 1 == 1 ? true : false // 如果 Count 为 5 则 IsKitting 为 1,否则为 0 }) .WhereIF(input.IsKitting.HasValue, u => u.IsKitting == input.IsKitting) .OrderBy(g => g.OrderId) // 根据 PackageCode 排序 .ToList(); // 转换为 List return groupedResult; // 返回分组结果 } /// /// 人工补板动作 /// /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "ShortageList")] [Description("WmsCommonnQuery/ShortageList")] public async Task ShortageList(KittingListInput input) { var listRes = await GetShortageListCore(input); var resJson = new WmsShortageListOutput(); if (!string.IsNullOrWhiteSpace(input.UPI)) { resJson = listRes.FirstOrDefault(u => u.UPI == input.UPI); //var filteredResult = listRes.FirstOrDefault(u => u.UPI == input.UPI); } var _cretaorName = App.User.FindFirst(ClaimConst.RealName)?.Value; if (resJson != null) { //执行人工补板动作 var client = await WCFServiceHelper.GetWCFService_SAPCC_Client(_sysConfigRep); var res = await client.WriteStation_AllowInAsync(); if (res.result == false) { throw Oops.Oh("补板工位允许进板请求失败:" + res.resMsg); } //*/ //记录补板记录和板件履历 var singleUpi = await _mesBatchOrderUpiRep.AsQueryable().Where(x => x.UPI == input.UPI).FirstAsync(); if (singleUpi == null) { throw Oops.Oh($"没有找到部件条码{input.UPI}的数据"); } WmsRecordUpiProcess wmsRecordUpi = new WmsRecordUpiProcess(); wmsRecordUpi = singleUpi.Adapt(); wmsRecordUpi.Id = Yitter.IdGenerator.YitIdHelper.NextId(); wmsRecordUpi.CreateTime = DateTime.Now; wmsRecordUpi.CreateUserName = _cretaorName; wmsRecordUpi.Location = ""; wmsRecordUpi.OperRemark = "人工补板"; await _wmsRecordUpiProcessRep.InsertAsync(wmsRecordUpi); WmsRecordUpiReplenish wmsRecordUpiNg = new WmsRecordUpiReplenish(); wmsRecordUpiNg = singleUpi.Adapt(); wmsRecordUpiNg.Id = Yitter.IdGenerator.YitIdHelper.NextId(); wmsRecordUpiNg.CreateTime = DateTime.Now; wmsRecordUpiNg.CreateUserName = _cretaorName; wmsRecordUpiNg.OperRemark = "人工补板"; await _wmsRecordUpiReplenishRep.InsertAsync(wmsRecordUpiNg); } else { throw Oops.Oh($"板件'{input.UPI}'不在缺包清单中"); } return resJson; } /// /// 分页查询批次缺料清单 不齐包 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "ShortagePage")] [Description("WmsCommonnQuery/ShortagePage")] public async Task> ShortagePage(KittingListInput input) { var listRes = await GetShortageListCore(input); if (listRes?.Count > 0) { listRes = listRes.WhereIF(!string.IsNullOrWhiteSpace(input.Info5), u => u.Info5 == input.Info5).ToList(); listRes = listRes.WhereIF(!string.IsNullOrWhiteSpace(input.DetailName), u => u.DetailName == input.DetailName).ToList(); } // 进行分页处理 var totalCount = listRes.Count; // 获取总数 var pagedList = listRes //.OrderBy(x => x.Id) // 根据需要进行排序 .Skip((input.Page - 1) * input.PageSize) .Take(input.PageSize) .ToList(); // 构造并返回分页结果 return new SqlSugarPagedList { Page = input.Page, PageSize = input.PageSize, Total = totalCount, TotalPages = (int)Math.Ceiling((double)totalCount / input.PageSize), Items = pagedList, HasPrevPage = input.Page > 1, HasNextPage = input.Page < ((int)Math.Ceiling((double)totalCount / input.PageSize)) }; } /// /// 分页查询缺料清单 不齐包 -按照生产单号分组 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "ShortagePageGroupByInfo5")] [Description("WmsCommonnQuery/ShortagePageGroupByInfo5")] public async Task> ShortagePageGroupByInfo5(KittingListInput input) { var listRes = await GetShortageListCore(input); // 按照字段 Info5 分组 var groupedList = listRes .GroupBy(x => x.Info5) // 根据 Info5 字段进行分组 .Select(g => new WmsShortageListOutput // 假设您将分组后的结果转换为 WmsShortageListOutput { Info5 = g.Key, ShortageCount = g.Count(), }) .ToList(); // 进行分页处理 var totalCount = groupedList.Count; // 获取总数 var pagedList = groupedList //.OrderBy(x => x.Id) // 根据需要进行排序 .Skip((input.Page - 1) * input.PageSize) .Take(input.PageSize) .ToList(); // 构造并返回分页结果 return new SqlSugarPagedList { Page = input.Page, PageSize = input.PageSize, Total = totalCount, TotalPages = (int)Math.Ceiling((double)totalCount / input.PageSize), Items = pagedList, HasPrevPage = input.Page > 1, HasNextPage = input.Page < ((int)Math.Ceiling((double)totalCount / input.PageSize)) }; } /// /// 缺包数据 /// /// /// private async Task> GetShortageListCore(KittingListInput input) { var listRes = new List(); // 缓存岛数据 var queryHcdList = _wmsStockQuanRep.AsQueryable().WhereIF(!string.IsNullOrWhiteSpace(input.PackageCode), u => u.PackageCode == input.PackageCode); var listDao = await queryHcdList.ToListAsync(); var packageCodes = listDao.Select(x => x.PackageCode).ToList(); // 获取 mes 所有相关记录 var allRecords = await _mesBatchOrderUpiRep.AsQueryable() .Where(m => packageCodes.Contains(m.PackageCode)) .ToListAsync(); // 遍历记录,对比 listDao var listDaoUbi = listDao.Select(u => u.Upi).ToHashSet(); // 将 UPI 转换为 HashSet,提高查找效率 foreach (var item in allRecords) { if (!listDaoUbi.Contains(item.UPI)) // 使用 HashSet 进行查找 { listRes.Add(new WmsShortageListOutput { UPI = item.UPI, PackageCode = item.PackageCode, DetailName = item.DetailName, OrderId = item.OrderId, PlanNo = item.PlanNo, Info5 = item.Info5, Info4 = item.Info4, Info10 = item.Info10, Info11 = item.Info11, Info12 = item.Info12, Info13 = item.Info13, //Info14 = item.Info14, Info15 = item.Info15, Info16 = item.Info16, Info18 = item.Info18, Length = item.Length, Width = item.Width, Thk = item.Thk }); } } return listRes; } /// /// 分页查询批次缺料清单 不齐包 -暂时不用 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "ShortagePage2")] [Description("WmsCommonnQuery/ShortagePage2")] public async Task> ShortagePage2(KittingListInput input) { // 获取基础数据 var list = await _wmsStockQuanRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.DetailName), u => u.PlaceCode.Contains(input.DetailName.Trim())) .Select(x => new WmsShortageListOutput { OrderId = x.OrderId, PlanNo = x.PlanNo, PackageCode = x.PackageCode }) .ToListAsync(); // 确保获取结果为 List // 分组并返回分组信息 var groupedResult = list .GroupBy(x => x.OrderId) // 按 OrderId 分组 .Select(g => new WmsShortageListOutput { OrderId = g.Key, // 获取分组的键 PlanNo = g.FirstOrDefault().PlanNo, // 获取组内的第一个 PlanNo PackageCode = g.FirstOrDefault().PackageCode, // 获取组内的第一个 PackageCode HasCount = g.Count(), // 统计每组的数量 TotalCount = 0, // 初始化 TotalCount ShortageCount = 0 // 初始化 ShortageCount }) .OrderBy(g => g.OrderId) // 根据 OrderId 排序 .ToList(); // 转换为 List // 循环 groupedResult 给每一条加上总数量 TotalCount foreach (var item in groupedResult) { item.TotalCount = await _mesBatchOrderUpiRep.AsQueryable().CountAsync(m => m.PackageCode == item.PackageCode); // 根据 PackageCode 统计总条数 item.ShortageCount = item.TotalCount - item.HasCount > 0 ? item.TotalCount - item.HasCount : 0; } // 分页处理 var pagedResult = groupedResult.AsQueryable() // 将分组结果转换为可查询的集合 .OrderBy(g => g.OrderId) // 进行排序 .Skip((input.Page - 1) * input.PageSize) // 跳过前面的页数 .Take(input.PageSize) // 取出当前页的数据 .ToList(); // 转换为 List var totalCount = groupedResult.Count; // 获取总数 var totalPages = (int)Math.Ceiling((double)totalCount / input.PageSize); // 计算总页数 // 构造并返回分页结果 return new SqlSugarPagedList { Page = input.Page, PageSize = input.PageSize, Total = totalCount, TotalPages = totalPages, Items = pagedResult, HasPrevPage = input.Page > 1, HasNextPage = input.Page < totalPages }; } /// /// 不分页查询批次缺料清单 不齐包-暂时不用 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "ShortageList2")] [Description("WmsCommonnQuery/ShortageList2")] public async Task> ShortageList2([FromQuery] KittingListInput input) { var list = await _wmsStockQuanRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.DetailName), u => u.PlaceCode.Contains(input.DetailName.Trim())) .Select(x => new WmsShortageListOutput { OrderId = x.OrderId, PlanNo = x.PlanNo, PackageCode = x.PackageCode }) .ToListAsync(); // 确保获取结果为 List // 分组并返回分组信息 var groupedResult = list .GroupBy(x => x.OrderId) // 按 OrderId 分组 .Select(g => new WmsShortageListOutput { OrderId = g.Key, // 获取分组的键 PlanNo = g.FirstOrDefault().PlanNo, // 获取组内的第一个 PlanNo PackageCode = g.FirstOrDefault().PackageCode, // 获取组内的第一个 PackageCode HasCount = g.Count(), // 统计每组的数量 TotalCount = 0, // 初始化 TotalCount ShortageCount = 0 // 初始化 ShortageCount }) .OrderBy(g => g.OrderId) // 根据 OrderId 排序 .ToList(); // 转换为 List // 循环 groupedResult 给每一条加上总数量 CountTotal foreach (var item in groupedResult) { item.TotalCount = await _mesBatchOrderUpiRep.AsQueryable().CountAsync(m => m.PackageCode == item.PackageCode); // 根据 PackageCode 统计总条数 item.ShortageCount = item.TotalCount - item.HasCount > 0 ? item.TotalCount - item.HasCount : 0; } return groupedResult; // 返回分组结果 } /// /// 查询包数据 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "QueryPackage")] [Description("WmsCommonnQuery/QueryPackage")] public async Task QueryPackage(QueryPackageInput input) { if (input == null || input.PackageCode == null) { throw Oops.Oh("参数不能为空"); } var package = await _mesPackageGatherRep.AsQueryable().Where(x => x.PackageCode == input.PackageCode).FirstAsync(); if (package == null) { throw Oops.Oh($"没有找到包号{input.PackageCode}的汇总数据"); } return package; } }