using AutoMapper;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_Core.Utilities;
using WIDESEA_DTO.Basic;
using WIDESEA_IBasicRepository;
using WIDESEA_IRecordService;
using WIDESEA_IBasicService;
using WIDESEA_Model.Models;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.WareHouseEnum;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
namespace WIDESEA_BasicService
{
public partial class LocationInfoService
{
///
/// 分配货位
///
public Dt_LocationInfo? AssignLocation(string roadwayNo, int palletType, int warehouseId, string beRelocationCode = "", int heightType = 0)
{
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == warehouseId);
if (warehouse == null)
{
throw new Exception($"未找到仓库信息");
}
Dt_PalletTypeInfo? palletTypeInfo = _basicRepository.PalletTypeInfoRepository.QueryFirst(x => x.PalletType == palletType && x.WarehouseId == warehouseId);
if (palletTypeInfo == null)
{
if (warehouse.WarehouseCode == WarehouseEnum.LLDYL.ToString())
{
throw new Exception($"请配置托盘类型信息");
}
}
return warehouse.WarehouseCode switch
{
"LLDCP" or "LLDFL" => AssignLocation(roadwayNo),
"LLDYL" => AssignLocationYL(roadwayNo, palletTypeInfo),
_ => throw new Exception($"未找到仓库货位分配方法")
};
}
private readonly static object _locker = new object();
private readonly static object _AssignLocationYL = new object();
private static List locationCaches = new List();
///
/// 分配货位
///
///
///
public Dt_LocationInfo? AssignLocation(string roadwayNo)
{
lock (_locker)
{
List removeItems = locationCaches.Where(x => (DateTime.Now - x.DateTime).TotalMinutes > 5).ToList();//查询添加静态变量超过5分钟的货位
int count = removeItems.Count;
for (int i = 0; i < count; i++)
{
locationCaches.Remove(removeItems[i]);//移除查询添加静态变量超过5分钟的货位
}
List lockLocations = locationCaches.Select(x => x.LocationCode).ToList();
Dictionary orderBy = new Dictionary()
{
{ nameof(Dt_LocationInfo.Column),OrderByType.Desc },
{ nameof(Dt_LocationInfo.Layer),OrderByType.Asc },
{ nameof(Dt_LocationInfo.Depth),OrderByType.Desc },
{ nameof(Dt_LocationInfo.Row),OrderByType.Asc }
};
return BaseDal.QueryFirst(x => x.RoadwayNo == roadwayNo && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocations.Contains(x.LocationCode), orderBy);//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
}
}
///
/// 原料分配货位
///
///
public Dt_LocationInfo? AssignLocationYL(string roadwayNo, Dt_PalletTypeInfo palletTypeInfo)
{
lock (_AssignLocationYL)
{
List removeItems = locationCaches.Where(x => (DateTime.Now - x.DateTime).TotalMinutes > 5).ToList();//查询添加静态变量超过5分钟的货位
int count = removeItems.Count;
for (int i = 0; i < count; i++)
{
locationCaches.Remove(removeItems[i]);//移除查询添加静态变量超过5分钟的货位
}
List lockLocations = locationCaches.Select(x => x.LocationCode).ToList();
List locationInfos = BaseDal.QueryData(x => x.RoadwayNo == roadwayNo);//查询巷道所有货位信息
Dictionary orderBy = new Dictionary()
{
{ nameof(Dt_LocationInfo.Column),OrderByType.Desc },
{ nameof(Dt_LocationInfo.Layer),OrderByType.Asc },
{ nameof(Dt_LocationInfo.Depth),OrderByType.Desc },
{ nameof(Dt_LocationInfo.Row),OrderByType.Asc }
};
if (roadwayNo.Contains("YLDual"))
{
if (palletTypeInfo.LocaitonCount==1)
{
return BaseDal.QueryFirst(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.RoadwayNo == roadwayNo && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocations.Contains(x.LocationCode), orderBy);//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
}
else
{
//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
List locationInfosMedium = BaseDal.QueryData(x => x.LocationType == LocationTypeEnum.MediumPallet.ObjToInt() && x.RoadwayNo == roadwayNo && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocations.Contains(x.LocationCode), orderBy);
Dt_LocationInfo locationInfo = new Dt_LocationInfo();
foreach (var item in locationInfosMedium)
{
//获取更改库位
Dt_LocationInfo? nearLocation1;
Dt_LocationInfo? nearLocation2;
nearLocation1 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.Row == item.Row && x.Layer == item.Layer && x.Depth == item.Depth && x.Column == item.Column - 1);
nearLocation2 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.Row == item.Row && x.Layer == item.Layer && x.Depth == item.Depth && x.Column == item.Column + 1);
if (nearLocation1!=null && nearLocation2!=null)
{
locationInfo = item;
break;
}
}
return locationInfo;
}
}
else
{
return BaseDal.QueryFirst(x => x.RoadwayNo == roadwayNo && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocations.Contains(x.LocationCode), orderBy);//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
}
}
}
///
/// 修改货位状态及类型
///
/// 货位编号
/// 托盘类型
/// 货位状态
public void UpdateLocationStatus(string locationCode, int palletType, LocationStatusEnum locationStatus, int warehousId)
{
Dt_LocationInfo location = Repository.QueryFirst(x => x.LocationCode == locationCode);
if (location == null)
{
throw new Exception($"未找到货位信息,{locationCode}");
}
UpdateLocationStatus(location, palletType, locationStatus, warehousId);
}
///
/// 修改货位状态及类型
///
/// 货位对象
/// 托盘类型
/// 货位状态
//public void UpdateLocationStatus2(Dt_LocationInfo location, int palletType, LocationStatusEnum locationStatus, int warehousId)
//{
// List locationInfos = Repository.QueryData(x => x.RoadwayNo == location.RoadwayNo);
// List locations = GetGroupLocations(locationInfos, location);
// if (locationInfos.Max(x => x.Depth) < 3)
// {
// for (int i = 0; i < locations.Count; i++)
// {
// if (locations[i].LocationType != palletType.ObjToInt())
// {
// locations[i].LocationType = palletType.ObjToInt();
// }
// if (locations[i].LocationCode == location.LocationCode)
// {
// locations[i].LocationStatus = locationStatus.ObjToInt();
// }
// else
// {
// if (locationStatus == LocationStatusEnum.Lock)
// {
// if (locations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
// {
// locations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
// }
// else if (locations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
// {
// locations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
// }
// }
// else if (locationStatus == LocationStatusEnum.Free || locationStatus == LocationStatusEnum.InStock)
// {
// if (locations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
// {
// locations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
// }
// else if (locations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
// {
// locations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
// }
// }
// }
// }
// Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
// if(location.RoadwayNo == "SC01_BC")
// {
// nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
// }
// if (nearLocation != null)
// {
// List nearLocations = GetGroupLocations(locationInfos, nearLocation);
// for (int i = 0; i < nearLocations.Count; i++)
// {
// if (nearLocations[i].LocationType != palletType.ObjToInt())
// {
// nearLocations[i].LocationType = palletType.ObjToInt();
// }
// if (palletType.ObjToInt() >= PalletTypeEnum.LargePallet.ObjToInt())
// {
// if (nearLocations[i].LocationCode == nearLocation.LocationCode)
// {
// nearLocations[i].LocationStatus = locationStatus.ObjToInt();
// }
// else
// {
// if (locationStatus == LocationStatusEnum.Lock)
// {
// if (nearLocations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
// {
// nearLocations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
// }
// else if (nearLocations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
// {
// nearLocations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
// }
// }
// else if (locationStatus == LocationStatusEnum.InStock)
// {
// if (nearLocations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
// {
// nearLocations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
// }
// else if (nearLocations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
// {
// nearLocations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
// }
// }
// }
// }
// }
// locations.AddRange(nearLocations);
// }
// }
// else
// {
// for (int i = 0; i < locations.Count; i++)
// {
// if (locations[i].LocationCode == location.LocationCode)
// {
// locations[i].LocationStatus = locationStatus.ObjToInt();
// }
// else
// {
// if (locationStatus == LocationStatusEnum.Lock)
// {
// if (locations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
// {
// locations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
// }
// else if (locations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
// {
// locations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
// }
// }
// else if (locationStatus == LocationStatusEnum.Free || locationStatus == LocationStatusEnum.InStock)
// {
// if (locations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
// {
// locations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
// }
// else if (locations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
// {
// locations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
// }
// }
// }
// if (locations[i].LocationType != palletType.ObjToInt())
// {
// locations[i].LocationType = palletType.ObjToInt();
// }
// }
// }
// if (locations.Where(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt()).Count() == locations.Count && locationStatus == LocationStatusEnum.Free)
// {
// locations.ForEach(x =>
// {
// x.LocationType = 0;
// });
// }
// Repository.UpdateData(locations);
//}
public void UpdateLocationStatus(Dt_LocationInfo location, int palletType, LocationStatusEnum locationStatus, int warehouseId)
{
List locationInfos = Repository.QueryData(x => x.RoadwayNo == location.RoadwayNo);
List palletTypeInfos = _basicRepository.PalletTypeInfoRepository.QueryData(x => x.WarehouseId == warehouseId);
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == warehouseId);
Dt_PalletTypeInfo? palletTypeInfo = _basicRepository.PalletTypeInfoRepository.QueryFirst(x => x.PalletType == palletType && x.WarehouseId == warehouseId);
if (palletTypeInfo == null)
{
if (warehouse.WarehouseCode == WarehouseEnum.LLDYL.ToString())
{
throw new Exception($"请配置托盘类型信息");
}
}
List locations = GetGroupLocations(locationInfos, location);
if (locationInfos.Max(x => x.Depth) < 3)
{
for (int i = 0; i < locations.Count; i++)
{
if (locations[i].LocationType != palletType)
{
locations[i].LocationType = palletType;
}
if (locations[i].LocationCode == location.LocationCode)
{
locations[i].LocationStatus = locationStatus.ObjToInt();
}
else
{
if (locationStatus == LocationStatusEnum.Lock)
{
if (locations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
{
locations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
}
else if (locations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
{
locations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
}
}
else if (locationStatus == LocationStatusEnum.Free || locationStatus == LocationStatusEnum.InStock)
{
if (locations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
{
locations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
}
else if (locations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
{
locations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
}
}
}
}
if (palletTypeInfos.FirstOrDefault(x => x.LocaitonCount == 2) != null)
{
//获取更改库位
Dt_LocationInfo? nearLocation1;
Dt_LocationInfo? nearLocation2;
nearLocation1 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column - 1);
nearLocation2 = locationInfos.FirstOrDefault(x => x.LocationType == LocationTypeEnum.SmallPallet.ObjToInt() && x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1);
if (nearLocation1 != null && nearLocation2 != null)
{
//双辅料
List nearLocations = new List()
{
nearLocation1,
nearLocation2
};
for (int i = 0; i < nearLocations.Count; i++)
{
if (locationStatus == LocationStatusEnum.Lock)
{
if (nearLocations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
{
nearLocations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
}
}
else if (locationStatus == LocationStatusEnum.Free)
{
if (nearLocations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
{
nearLocations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
}
}
}
locations.AddRange(nearLocations);
}
}
}
else
{
for (int i = 0; i < locations.Count; i++)
{
if (locations[i].LocationCode == location.LocationCode)
{
locations[i].LocationStatus = locationStatus.ObjToInt();
}
else
{
if (locationStatus == LocationStatusEnum.Lock)
{
if (locations[i].LocationStatus == LocationStatusEnum.InStock.ObjToInt())
{
locations[i].LocationStatus = LocationStatusEnum.InStockLock.ObjToInt();
}
else if (locations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt())
{
locations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt();
}
}
else if (locationStatus == LocationStatusEnum.Free || locationStatus == LocationStatusEnum.InStock)
{
if (locations[i].LocationStatus == LocationStatusEnum.InStockLock.ObjToInt())
{
locations[i].LocationStatus = LocationStatusEnum.InStock.ObjToInt();
}
else if (locations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt())
{
locations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt();
}
}
}
if (locations[i].LocationType != palletType.ObjToInt())
{
locations[i].LocationType = palletType.ObjToInt();
}
}
}
Repository.UpdateData(locations);
}
///
/// 获取不同深度的同组货位信息
///
///
///
///
public List GetGroupLocations(List locationInfos, Dt_LocationInfo location)
{
List groupLocations = new List() { location };
int maxDepth = locationInfos.Max(x => x.Depth);
int row = location.Row;
for (int j = location.Depth + 1; j <= maxDepth; j++)
{
row += 1;
Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer && x.Row == row);
if (locationInfo != null)
{
groupLocations.Add(locationInfo);
}
}
for (int j = location.Depth - 1; j >= 1; j--)
{
row -= 1;
Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer && x.Row == row);
if (locationInfo != null)
{
groupLocations.Add(locationInfo);
}
}
return groupLocations;
}
///
/// 获取不同深度的同组货位信息
///
///
///
public List GetGroupLocations(Dt_LocationInfo location)
{
List locationInfos = Repository.QueryData(x => x.RoadwayNo == location.RoadwayNo && x.WarehouseId == location.WarehouseId);
List groupLocations = new List() { location };
int maxDepth = locationInfos.Max(x => x.Depth);
int row = location.Row;
for (int j = location.Depth + 1; j <= maxDepth; j++)
{
Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer && (x.Row == row + 1 || x.Row == row - 1));
if (locationInfo != null)
{
groupLocations.Add(locationInfo);
}
}
for (int j = location.Depth - 1; j >= 1; j--)
{
Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.Depth == j && x.Column == location.Column && x.Layer == location.Layer && (x.Row == row + 1 || x.Row == row - 1));
if (locationInfo != null)
{
groupLocations.Add(locationInfo);
}
}
return groupLocations;
}
}
}