Files
sy_hx_pbl_backend/DOAN.Service/PBL/BigScreenService.cs
2025-04-01 16:46:50 +08:00

200 lines
7.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<Storagelocation>, IBigScreenService
{
/// <summary>
/// 查询料架灯 亮和灭 情况 (功能迁移至SearchBigScreenInfomation新增最低安全库存等功能)
/// </summary>
/// <returns></returns>
public List<BIgScreenDtoLightPickupDto> SearchShelfLightInfomation()
{
var result = new List<BIgScreenDtoLightPickupDto>();
// 1 查询所有料架
var RackCodeArray = Context
.Queryable<Storagelocation>()
.GroupBy(it => it.RackCode)
.Select(it => it.RackCode)
.ToArray();
var DataSoure = Context.Queryable<Storagelocation>().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();
}
/// <summary>
/// (功能迁移至SearchBigScreenInfomation新增最低安全库存等功能)
/// </summary>
/// <returns></returns>
public List<BigSreeenDtoFeedingMaterial> SearchfeedingMaterialInfomation()
{
var result = new List<BigSreeenDtoFeedingMaterial>();
// 1 查询所有料架
var RackCodeArray = Context
.Queryable<Storagelocation>()
.GroupBy(it => it.RackCode)
.Select(it => it.RackCode)
.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;
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();
}
/// <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,
// 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<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;
}
}
}