using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEAWCS_Common;
|
using WIDESEAWCS_Common.LocationEnum;
|
using WIDESEAWCS_Common.TaskEnum;
|
using WIDESEAWCS_Core.BaseRepository;
|
using WIDESEAWCS_Core.BaseServices;
|
using WIDESEAWCS_Core.Helper;
|
using WIDESEAWCS_IBasicInfoService;
|
using WIDESEAWCS_Model.Models;
|
|
namespace WIDESEAWCS_BasicInfoService
|
{
|
public class RGVLocationInfoService : ServiceBase<Dt_RGVLocationInfo, IRepository<Dt_RGVLocationInfo>>, IRGVLocationInfoService
|
{
|
public RGVLocationInfoService(IRepository<Dt_RGVLocationInfo> BaseDal) : base(BaseDal)
|
{
|
}
|
private Dictionary<string, OrderByType> _emptyAssignOrderBy = new Dictionary<string, OrderByType>()
|
{
|
{ nameof(Dt_RGVLocationInfo.Row), OrderByType.Asc },
|
{ nameof(Dt_RGVLocationInfo.Depth), OrderByType.Desc },
|
{ nameof(Dt_RGVLocationInfo.Layer), OrderByType.Asc },
|
//{ nameof(Dt_RGVLocationInfo.Column), OrderByType.Asc },
|
};
|
private Dictionary<string, OrderByType> _DepthAscOrderBy = new Dictionary<string, OrderByType>()
|
{
|
{ nameof(Dt_RGVLocationInfo.Depth), OrderByType.Asc },
|
};
|
public IRepository<Dt_RGVLocationInfo> Repository => BaseDal;
|
|
public List<Dt_RGVLocationInfo> GetFreeLocationInfos()
|
{
|
return BaseDal.QueryData(x => x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt(), _emptyAssignOrderBy);
|
}
|
|
public (List<Dt_Task>, List<Dt_RGVLocationInfo>) GetMoveFreeLocationInfo(List<Dt_RGVLocationInfo> locationInfos)
|
{
|
Dt_RGVLocationInfo? rGVLocationInfo = null;
|
List<Dt_Task> tasks = new List<Dt_Task>();
|
List<Dt_RGVLocationInfo> upFreeLocationInfos = new List<Dt_RGVLocationInfo>();
|
List<Dt_RGVLocationInfo> FreeLocationInfos = GetFreeLocationInfos();//获取所有空货位
|
try
|
{
|
List<string> LocationCodes = new List<string>();
|
foreach (var locationInfo in locationInfos)
|
{
|
FreeLocationInfos = FreeLocationInfos.Where(x => !LocationCodes.Contains(x.LocationCode)).ToList();
|
var rGVLocationInfos = FreeLocationInfos.Where(x => x.WarehouseId == locationInfo.WarehouseId).ToList();//查找同区域可用空货位
|
rGVLocationInfo = GetFreeLocationInfo(rGVLocationInfos);
|
if (rGVLocationInfo == null)
|
{
|
rGVLocationInfos = FreeLocationInfos.Where(x => x.WarehouseId != locationInfo.WarehouseId).ToList();//查找不同区域可用空货位
|
rGVLocationInfo = GetFreeLocationInfo(rGVLocationInfos);
|
}
|
if (rGVLocationInfo == null) break;
|
Dt_Task dt_Task = new()
|
{
|
Grade = 1,
|
PalletCode = locationInfo.PalletCode,
|
Roadway = locationInfo.RoadwayNo,
|
TaskState = TaskStatusEnum.RGV_NewMoveTask.ObjToInt(),
|
TaskType = TaskTypeEnum.CPMoveInventory.ObjToInt(),
|
SourceAddress = locationInfo.LocationCode,
|
CurrentAddress = locationInfo.LocationCode,
|
NextAddress = rGVLocationInfo.LocationCode,
|
TargetAddress = rGVLocationInfo.LocationCode,
|
Creater = "WCS",
|
};
|
tasks.Add(dt_Task);
|
upFreeLocationInfos.Add(rGVLocationInfo);
|
LocationCodes.Add(rGVLocationInfo.LocationCode);
|
}
|
}
|
catch (Exception ex)
|
{
|
|
}
|
return (tasks, upFreeLocationInfos);
|
}
|
/// <summary>
|
/// 获取可用空货位
|
/// </summary>
|
/// <param name="rGVLocationInfos"></param>
|
/// <returns></returns>
|
public Dt_RGVLocationInfo? GetFreeLocationInfo(List<Dt_RGVLocationInfo> rGVLocationInfos)
|
{
|
Dt_RGVLocationInfo? rGVLocationInfo = null;
|
#region 判断巷道是否有货
|
foreach (var items in rGVLocationInfos.GroupBy(x => x.RoadwayNo))//根据巷道号分组
|
{
|
foreach (var item in items)
|
{
|
List<Dt_RGVLocationInfo> dt_RGVLocationInfos = BaseDal.QueryData(x => x.RoadwayNo == items.Key);//查找当前巷道号货位
|
if (item.LocationType == 1)
|
{
|
rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.Depth < item.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).FirstOrDefault();//判断浅深度货位是否有货
|
if (rGVLocationInfo != null) break;
|
return item;
|
}
|
else
|
{
|
rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.Depth < item.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).OrderByDescending(x => x.Depth).FirstOrDefault();//判断浅深度货位是否有货
|
if (rGVLocationInfo != null)
|
{
|
rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.Depth > rGVLocationInfo.Depth && x.LocationStatus == LocationStatusEnum.Free.ObjToInt()).OrderBy(x => x.Depth).FirstOrDefault();
|
if (rGVLocationInfo != null)
|
{
|
if (dt_RGVLocationInfos.Where(x => x.Depth > rGVLocationInfo.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).Any()) rGVLocationInfo = null;
|
else return rGVLocationInfo;
|
}
|
}
|
else return item;
|
}
|
}
|
}
|
#endregion
|
return rGVLocationInfo;
|
}
|
/// <summary>
|
/// 查找入库可用货位
|
/// </summary>
|
/// <param name="AreaCode"></param>
|
/// <returns></returns>
|
public Dt_RGVLocationInfo? GetInFreeLocationInfo(int AreaCode)
|
{
|
Dt_RGVLocationInfo? rGVLocationInfo = null;
|
Dt_RGVLocationInfo? FreerGVLocationInfo = null;
|
List<Dt_RGVLocationInfo> rGVLocationInfos = BaseDal.QueryData(x => x.WarehouseId == AreaCode && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt(), _emptyAssignOrderBy);//查找所有空货位
|
if (rGVLocationInfos == null || rGVLocationInfos.Count < 1) return rGVLocationInfo;
|
return GetFreeLocationInfo(rGVLocationInfos);
|
#region 判断巷道是否有货
|
//foreach (var items in rGVLocationInfos.GroupBy(x => x.RoadwayNo))//根据巷道号分组
|
//{
|
// foreach (var item in items)
|
// {
|
// List<Dt_RGVLocationInfo> dt_RGVLocationInfos = BaseDal.QueryData(x => x.RoadwayNo == items.Key);//查找当前巷道号货位
|
// if (item.LocationType == 1)
|
// {
|
// rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.Depth < item.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).FirstOrDefault();//判断浅深度货位是否有货
|
// if (rGVLocationInfo != null) break;
|
// return item;
|
// }
|
// else
|
// {
|
// rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.Depth < item.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).OrderByDescending(x => x.Depth).FirstOrDefault();//判断浅深度货位是否有货
|
// if (rGVLocationInfo != null)
|
// {
|
// rGVLocationInfo = dt_RGVLocationInfos.Where(x => x.Depth > rGVLocationInfo.Depth && x.LocationStatus == LocationStatusEnum.Free.ObjToInt()).OrderBy(x => x.Depth).FirstOrDefault();
|
// if (rGVLocationInfo != null)
|
// {
|
// if (dt_RGVLocationInfos.Where(x => x.Depth > rGVLocationInfo.Depth && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt()).Any()) rGVLocationInfo = null;
|
// else return rGVLocationInfo;
|
// }
|
// }
|
// else return item;
|
// }
|
// }
|
//}
|
#endregion
|
//return FreerGVLocationInfo;
|
}
|
}
|
}
|