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; } } 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; } } }