using DOAN.Model.PBL; using DOAN.Model.PBL.Dto; using DOAN.Service.PBL.IService; using Infrastructure.Attribute; namespace DOAN.Service.PBL; [AppService(ServiceType = typeof(IBigScreenService), ServiceLifetime = LifeTime.Transient)] public class BigScreenService : BaseService, IBigScreenService { /// /// 查询料架灯 亮和灭 情况 (功能迁移至SearchBigScreenInfomation,新增最低安全库存等功能) /// /// public List SearchShelfLightInfomation() { var result = new List(); // 1 查询所有料架 var RackCodeArray = Context .Queryable() .GroupBy(it => it.RackCode) .Select(it => it.RackCode) .ToArray(); var DataSoure = Context.Queryable().ToList(); //2 查询每个料架层 for (var i = 0; i < RackCodeArray.Length; i++) { var RackCodeObject = new BIgScreenDtoLightPickupDto(); RackCodeObject.RackCode = RackCodeArray[i]; var LayerSheelfList = DataSoure.Where(it => it.RackCode == RackCodeArray[i]).ToList(); var LayerObjectfArray = new LayerObject[LayerSheelfList.Count]; if (LayerSheelfList != null && LayerSheelfList.Count > 0) { for (var j = 0; j < LayerSheelfList.Count; j++) { var LayerObject = new LayerObject(); LayerObject.LayerNum = LayerSheelfList[j].LayerNum; LayerObject.Partnumber = LayerSheelfList[j].Partnumber; LayerObject.MaxCapacity = LayerSheelfList[j].MaxCapacity; LayerObject.PackageNum = LayerSheelfList[j].PackageNum ?? 0; LayerObject.IsLight = LayerSheelfList[j].IsLight == 1 ? true : false; LayerObjectfArray[j] = LayerObject; } for (var j = 0; j < LayerSheelfList.Count; j++) { RackCodeObject.isLight = false; if (LayerSheelfList[j].IsLight == 1) { RackCodeObject.isLight = true; break; } } } RackCodeObject.LayerObjectArray = LayerObjectfArray; result.Add(RackCodeObject); } return result.OrderBy(it => it.RackCode).ToList(); } /// /// (功能迁移至SearchBigScreenInfomation,新增最低安全库存等功能) /// /// public List SearchfeedingMaterialInfomation() { var result = new List(); // 1 查询所有料架 var RackCodeArray = Context .Queryable() .GroupBy(it => it.RackCode) .Select(it => it.RackCode) .ToArray(); var DataSoure = Context.Queryable().ToList(); //2 查询每个料架层 for (var i = 0; i < RackCodeArray.Length; i++) { var RackCodeObject = new BigSreeenDtoFeedingMaterial(); RackCodeObject.RackCode = RackCodeArray[i]; var LayerSheelfList = DataSoure.Where(it => it.RackCode == RackCodeArray[i]).ToList(); var LayerObjectfArray = new LayerFeedingMaterialObject[LayerSheelfList.Count]; if (LayerSheelfList != null && LayerSheelfList.Count > 0) { for (var j = 0; j < LayerSheelfList.Count; j++) { var LayerObject = new LayerFeedingMaterialObject(); LayerObject.LayerNum = LayerSheelfList[j].LayerNum; LayerObject.Partnumber = LayerSheelfList[j].Partnumber; LayerObject.MaxCapacity = LayerSheelfList[j].MaxCapacity; LayerObject.PackageNum = LayerSheelfList[j].PackageNum; LayerObject.isFeedingMaterial = LayerSheelfList[j].PackageNum <= 2 ? true : false; LayerObjectfArray[j] = LayerObject; } for (var j = 0; j < LayerSheelfList.Count; j++) { RackCodeObject.isFeedingMaterial = false; if (LayerSheelfList[j].PackageNum <= 2) { RackCodeObject.isFeedingMaterial = true; break; } } } RackCodeObject.LayerObjectArray = LayerObjectfArray; result.Add(RackCodeObject); } return result.OrderBy(it => it.RackCode).ToList(); } /// /// 看板综合信息查询 /// /// public List SearchBigScreenInformation() { // 一次性获取所有数据并按RackCode分组 var rackGroups = Context.Queryable() .ToList() .GroupBy(sl => sl.RackCode) .OrderBy(g => g.Key); var result = new List(); foreach (var group in rackGroups) { var layers = group.ToList(); var layerObjects = layers.Select(layer => new LayerObject { LayerNum = layer.LayerNum, Partnumber = layer.Partnumber, MaxCapacity = layer.MaxCapacity, AlarmNum = layer.AlarmNum ?? 2, // 确认默认值 PackageNum = layer.PackageNum ?? 0, IsLight = layer.IsLight == 1, // IsFeedingMaterial = (layer.PackageNum ?? 0) < (layer.AlarmNum ?? 2) && layer.IsLackAlarm == 1 IsFeedingMaterial = CalculateIsOneLayerNumFeedingMaterial(layer) }).OrderBy(it => it.LayerNum).ToArray(); var rackDto = new BigScreenDto { Title = group.Key, RackCode = group.Key, IsLight = layers.Any(l => l.IsLight == 1), IsInUse = layers.Any(l => l.IsLackAlarm == 1), // IsFeedingMaterial = layers.Any(l => (l.PackageNum ?? 0) < (l.AlarmNum ?? 2) && l.IsLackAlarm == 1), IsFeedingMaterial = CalculateIsAllFeedingMaterial(layers), LayerObjectArray = layerObjects }; result.Add(rackDto); } return result; } // 将复杂逻辑封装到方法中 private bool CalculateIsAllFeedingMaterial(List layers) { int OneTotalPackageNum = layers.Where(it => it.LayerNum == 1).Sum(it => it.PackageNum ?? 0); int SecondTotalPackageNum = layers.Where(it => it.LayerNum == 2).Sum(it => it.PackageNum ?? 0); int alarmNum = 2; if (layers.Any(ls => ls.Remark == "合并料架")) { alarmNum = 3; } else { alarmNum = layers[0].AlarmNum ?? 0; } return OneTotalPackageNum < alarmNum || SecondTotalPackageNum < alarmNum; } private bool CalculateIsOneLayerNumFeedingMaterial(Storagelocation layer) { if (layer.Remark == "合并料架") { int totalPackageNum = Context.Queryable() .Where(it => it.LayerNum == layer.LayerNum) .Where(it => it.RackCode == layer.RackCode) .Sum(it => it.PackageNum ?? 0); return totalPackageNum < 3; } else { return (layer.PackageNum ?? 0) < (layer.AlarmNum ?? 2) && layer.IsLackAlarm == 1; } } }