2024-11-01 17:00:01 +08:00
|
|
|
|
using DOAN.Model.PBL;
|
2024-11-04 10:15:34 +08:00
|
|
|
|
using DOAN.Model.PBL.Dto;
|
2024-11-01 17:00:01 +08:00
|
|
|
|
using DOAN.Service.PBL.IService;
|
2024-11-04 10:15:34 +08:00
|
|
|
|
using Infrastructure.Attribute;
|
2024-11-01 17:00:01 +08:00
|
|
|
|
|
2024-11-04 10:15:34 +08:00
|
|
|
|
namespace DOAN.Service.PBL;
|
|
|
|
|
|
|
|
|
|
|
|
[AppService(ServiceType = typeof(IBigScreenService), ServiceLifetime = LifeTime.Transient)]
|
|
|
|
|
|
public class BigScreenService : BaseService<Storagelocation>, IBigScreenService
|
2024-11-01 17:00:01 +08:00
|
|
|
|
{
|
2024-11-04 10:15:34 +08:00
|
|
|
|
/// <summary>
|
2025-02-06 09:09:53 +08:00
|
|
|
|
/// 查询料架灯 亮和灭 情况 (功能迁移至SearchBigScreenInfomation,新增最低安全库存等功能)
|
2024-11-04 10:15:34 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public List<BIgScreenDtoLightPickupDto> SearchShelfLightInfomation()
|
2024-11-01 17:00:01 +08:00
|
|
|
|
{
|
2024-11-04 10:15:34 +08:00
|
|
|
|
var result = new List<BIgScreenDtoLightPickupDto>();
|
|
|
|
|
|
|
|
|
|
|
|
// 1 查询所有料架
|
2025-02-06 09:09:53 +08:00
|
|
|
|
var RackCodeArray = Context
|
|
|
|
|
|
.Queryable<Storagelocation>()
|
|
|
|
|
|
.GroupBy(it => it.RackCode)
|
|
|
|
|
|
.Select(it => it.RackCode)
|
2024-11-04 10:15:34 +08:00
|
|
|
|
.ToArray();
|
2024-11-01 17:00:01 +08:00
|
|
|
|
|
2024-11-04 10:15:34 +08:00
|
|
|
|
var DataSoure = Context.Queryable<Storagelocation>().ToList();
|
|
|
|
|
|
//2 查询每个料架层
|
|
|
|
|
|
for (var i = 0; i < RackCodeArray.Length; i++)
|
2024-11-01 17:00:01 +08:00
|
|
|
|
{
|
2024-11-04 10:15:34 +08:00
|
|
|
|
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)
|
2024-11-01 17:00:01 +08:00
|
|
|
|
{
|
2024-11-04 10:15:34 +08:00
|
|
|
|
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;
|
2025-02-06 09:09:53 +08:00
|
|
|
|
LayerObject.PackageNum = LayerSheelfList[j].PackageNum ?? 0;
|
|
|
|
|
|
LayerObject.IsLight = LayerSheelfList[j].IsLight == 1 ? true : false;
|
2024-11-04 10:15:34 +08:00
|
|
|
|
LayerObjectfArray[j] = LayerObject;
|
|
|
|
|
|
}
|
2024-11-01 17:00:01 +08:00
|
|
|
|
|
2024-11-04 10:15:34 +08:00
|
|
|
|
for (var j = 0; j < LayerSheelfList.Count; j++)
|
2024-11-01 17:00:01 +08:00
|
|
|
|
{
|
2024-11-04 10:15:34 +08:00
|
|
|
|
RackCodeObject.isLight = false;
|
|
|
|
|
|
if (LayerSheelfList[j].IsLight == 1)
|
2024-11-01 17:00:01 +08:00
|
|
|
|
{
|
2024-11-04 10:15:34 +08:00
|
|
|
|
RackCodeObject.isLight = true;
|
|
|
|
|
|
break;
|
2024-11-01 17:00:01 +08:00
|
|
|
|
}
|
2024-11-04 10:15:34 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
RackCodeObject.LayerObjectArray = LayerObjectfArray;
|
|
|
|
|
|
result.Add(RackCodeObject);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result.OrderBy(it => it.RackCode).ToList();
|
|
|
|
|
|
}
|
2025-02-06 09:09:53 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// (功能迁移至SearchBigScreenInfomation,新增最低安全库存等功能)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
2024-11-04 10:15:34 +08:00
|
|
|
|
public List<BigSreeenDtoFeedingMaterial> SearchfeedingMaterialInfomation()
|
|
|
|
|
|
{
|
|
|
|
|
|
var result = new List<BigSreeenDtoFeedingMaterial>();
|
|
|
|
|
|
|
|
|
|
|
|
// 1 查询所有料架
|
2025-02-06 09:09:53 +08:00
|
|
|
|
var RackCodeArray = Context
|
|
|
|
|
|
.Queryable<Storagelocation>()
|
|
|
|
|
|
.GroupBy(it => it.RackCode)
|
|
|
|
|
|
.Select(it => it.RackCode)
|
2024-11-04 10:15:34 +08:00
|
|
|
|
.ToArray();
|
|
|
|
|
|
|
|
|
|
|
|
var DataSoure = Context.Queryable<Storagelocation>().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;
|
2025-02-06 09:09:53 +08:00
|
|
|
|
LayerObject.isFeedingMaterial =
|
|
|
|
|
|
LayerSheelfList[j].PackageNum <= 2 ? true : false;
|
2024-11-04 10:15:34 +08:00
|
|
|
|
LayerObjectfArray[j] = LayerObject;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (var j = 0; j < LayerSheelfList.Count; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
RackCodeObject.isFeedingMaterial = false;
|
|
|
|
|
|
if (LayerSheelfList[j].PackageNum <= 2)
|
2024-11-01 17:00:01 +08:00
|
|
|
|
{
|
2024-11-04 10:15:34 +08:00
|
|
|
|
RackCodeObject.isFeedingMaterial = true;
|
|
|
|
|
|
break;
|
2024-11-01 17:00:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-04 10:15:34 +08:00
|
|
|
|
RackCodeObject.LayerObjectArray = LayerObjectfArray;
|
|
|
|
|
|
result.Add(RackCodeObject);
|
2024-11-01 17:00:01 +08:00
|
|
|
|
}
|
2024-11-04 10:15:34 +08:00
|
|
|
|
|
|
|
|
|
|
return result.OrderBy(it => it.RackCode).ToList();
|
2024-11-01 17:00:01 +08:00
|
|
|
|
}
|
2025-02-06 09:09:53 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 看板综合信息查询
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
public List<BigScreenDto> SearchBigScreenInformation()
|
|
|
|
|
|
{
|
|
|
|
|
|
// 一次性获取所有数据并按RackCode分组
|
|
|
|
|
|
var rackGroups = Context.Queryable<Storagelocation>()
|
|
|
|
|
|
.ToList()
|
|
|
|
|
|
.GroupBy(sl => sl.RackCode)
|
|
|
|
|
|
.OrderBy(g => g.Key);
|
|
|
|
|
|
|
|
|
|
|
|
var result = new List<BigScreenDto>();
|
|
|
|
|
|
|
|
|
|
|
|
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,
|
2025-03-28 09:33:30 +08:00
|
|
|
|
// IsFeedingMaterial = (layer.PackageNum ?? 0) < (layer.AlarmNum ?? 2) && layer.IsLackAlarm == 1
|
|
|
|
|
|
IsFeedingMaterial = CalculateIsOneLayerNumFeedingMaterial(layer)
|
2025-02-06 09:09:53 +08:00
|
|
|
|
}).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),
|
2025-03-28 09:33:30 +08:00
|
|
|
|
// IsFeedingMaterial = layers.Any(l => (l.PackageNum ?? 0) < (l.AlarmNum ?? 2) && l.IsLackAlarm == 1),
|
|
|
|
|
|
IsFeedingMaterial = CalculateIsAllFeedingMaterial(layers),
|
2025-02-06 09:09:53 +08:00
|
|
|
|
LayerObjectArray = layerObjects
|
|
|
|
|
|
};
|
|
|
|
|
|
result.Add(rackDto);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
2025-03-28 09:33:30 +08:00
|
|
|
|
// 将复杂逻辑封装到方法中
|
|
|
|
|
|
private bool CalculateIsAllFeedingMaterial(List<Storagelocation> 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<Storagelocation>()
|
|
|
|
|
|
.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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-02-06 09:09:53 +08:00
|
|
|
|
}
|