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>, IRGVLocationInfoService { public RGVLocationInfoService(IRepository BaseDal) : base(BaseDal) { } private Dictionary _emptyAssignOrderBy = new Dictionary() { { 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 _DepthAscOrderBy = new Dictionary() { { nameof(Dt_RGVLocationInfo.Depth), OrderByType.Asc }, }; public IRepository Repository => BaseDal; public List GetFreeLocationInfos() { return BaseDal.QueryData(x => x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.LocationStatus == LocationStatusEnum.Free.ObjToInt(), _emptyAssignOrderBy); } public (List, List) GetMoveFreeLocationInfo(List locationInfos) { Dt_RGVLocationInfo? rGVLocationInfo = null; List tasks = new List(); List upFreeLocationInfos = new List(); List FreeLocationInfos = GetFreeLocationInfos();//获取所有空货位 try { List LocationCodes = new List(); 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); } /// /// 获取可用空货位 /// /// /// public Dt_RGVLocationInfo? GetFreeLocationInfo(List rGVLocationInfos) { Dt_RGVLocationInfo? rGVLocationInfo = null; #region 判断巷道是否有货 foreach (var items in rGVLocationInfos.GroupBy(x => x.RoadwayNo))//根据巷道号分组 { foreach (var item in items) { List 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; } /// /// 查找入库可用货位 /// /// /// public Dt_RGVLocationInfo? GetInFreeLocationInfo(int AreaCode) { Dt_RGVLocationInfo? rGVLocationInfo = null; Dt_RGVLocationInfo? FreerGVLocationInfo = null; List 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_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; } } }