| | |
| | | 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 |
| | | { |
| | | |
| | | /// <summary> |
| | | /// åé
è´§ä½ |
| | | /// </summary> |
| | | 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); |
| | |
| | | Dt_PalletTypeInfo? palletTypeInfo = _basicRepository.PalletTypeInfoRepository.QueryFirst(x => x.PalletType == palletType && x.WarehouseId == warehouseId); |
| | | if (palletTypeInfo == null) |
| | | { |
| | | if (warehouse.WarehouseCode == WarehouseEnum.HA153.ToString() && warehouse.WarehouseCode == WarehouseEnum.HA71.ToString() && warehouse.WarehouseCode == WarehouseEnum.HA60.ToString()) |
| | | if (warehouse.WarehouseCode == WarehouseEnum.LLDYL.ToString()) |
| | | { |
| | | palletTypeInfo = new Dt_PalletTypeInfo() |
| | | { |
| | | LocaitonCount = 1, |
| | | PalletType = 0, |
| | | IsOdd = false, |
| | | }; |
| | | } |
| | | else |
| | | throw new Exception($"请é
ç½®æçç±»åä¿¡æ¯"); |
| | | } |
| | | } |
| | | |
| | | return warehouse.WarehouseCode switch |
| | | { |
| | | "HA57" => AssignLocation_BC(roadwayNo, palletType, palletTypeInfo, beRelocationCode, heightType), |
| | | "HA58" => AssignLocation_PP(roadwayNo, palletType, palletTypeInfo, beRelocationCode), |
| | | "HA152" => AssignLocation_GM(roadwayNo, palletType, palletTypeInfo, beRelocationCode), |
| | | "HA64" => AssignLocation_CSJ(roadwayNo, palletType, palletTypeInfo, beRelocationCode), |
| | | "HA154" => AssignLocation_ZH(roadwayNo, palletType, palletTypeInfo, beRelocationCode), |
| | | "HA153" => AssignLocation(roadwayNo), |
| | | "HA71" or "HA72" or "HA73" => AssignLocation(roadwayNo), |
| | | "HA60" => AssignLocation(roadwayNo), |
| | | "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<LocationCache> locationCaches = new List<LocationCache>(); |
| | | /// <summary> |
| | | /// |
| | | /// åé
è´§ä½ |
| | | /// </summary> |
| | | /// <param name="roadwayNo"></param> |
| | | /// <returns></returns> |
| | |
| | | |
| | | List<string> lockLocations = locationCaches.Select(x => x.LocationCode).ToList(); |
| | | |
| | | List<Dt_LocationInfo> locationInfos = BaseDal.QueryData(x => x.RoadwayNo == roadwayNo);//æ¥è¯¢å··éææè´§ä½ä¿¡æ¯ |
| | | |
| | | Dictionary<string, OrderByType> orderBy = new Dictionary<string, OrderByType>() |
| | | { |
| | | { nameof(Dt_LocationInfo.Column),OrderByType.Desc }, |
| | | { nameof(Dt_LocationInfo.Layer),OrderByType.Asc }, |
| | | { nameof(Dt_LocationInfo.Column),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åéå
åé
çè´§ä½,æ ¹æ®å±ãåãæ·±åº¦ãè¡æåº |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// åæåé
è´§ä½ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public Dt_LocationInfo? AssignLocationYL(string roadwayNo, Dt_PalletTypeInfo palletTypeInfo) |
| | | { |
| | | lock (_AssignLocationYL) |
| | | { |
| | | List<LocationCache> 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<string> lockLocations = locationCaches.Select(x => x.LocationCode).ToList(); |
| | | |
| | | List<Dt_LocationInfo> locationInfos = BaseDal.QueryData(x => x.RoadwayNo == roadwayNo);//æ¥è¯¢å··éææè´§ä½ä¿¡æ¯ |
| | | |
| | | Dictionary<string, OrderByType> orderBy = new Dictionary<string, OrderByType>() |
| | | { |
| | | { 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<Dt_LocationInfo> 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åéå
åé
çè´§ä½,æ ¹æ®å±ãåãæ·±åº¦ãè¡æåº |
| | | } |
| | | |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// ä¿®æ¹è´§ä½ç¶æåç±»å |
| | | /// </summary> |
| | |
| | | // Repository.UpdateData(locations); |
| | | //} |
| | | |
| | | public void UpdateLocationStatus(Dt_LocationInfo location, int palletType, LocationStatusEnum locationStatus, int warehousId) |
| | | public void UpdateLocationStatus(Dt_LocationInfo location, int palletType, LocationStatusEnum locationStatus, int warehouseId) |
| | | { |
| | | List<Dt_LocationInfo> locationInfos = Repository.QueryData(x => x.RoadwayNo == location.RoadwayNo); |
| | | |
| | | List<Dt_PalletTypeInfo> palletTypeInfos = _basicRepository.PalletTypeInfoRepository.QueryData(x => x.WarehouseId == warehousId); |
| | | Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == warehousId); |
| | | Dt_PalletTypeInfo? palletTypeInfo = palletTypeInfos.FirstOrDefault(x => x.PalletType == palletType && x.WarehouseId == warehousId); |
| | | if (palletTypeInfo == null || warehouse.WarehouseCode == WarehouseEnum.HA60.ToString()) |
| | | List<Dt_PalletTypeInfo> 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.HA153.ToString() || warehouse.WarehouseCode == WarehouseEnum.HA71.ToString() || warehouse.WarehouseCode == WarehouseEnum.HA60.ToString()) |
| | | if (warehouse.WarehouseCode == WarehouseEnum.LLDYL.ToString()) |
| | | { |
| | | palletTypeInfo = new Dt_PalletTypeInfo() |
| | | { |
| | | LocaitonCount = 1, |
| | | PalletType = 0, |
| | | IsOdd = false, |
| | | }; |
| | | } |
| | | else |
| | | throw new Exception($"请é
ç½®æçç±»åä¿¡æ¯"); |
| | | } |
| | | } |
| | | List<Dt_LocationInfo> locations = GetGroupLocations(locationInfos, location); |
| | | if (locationInfos.Max(x => x.Depth) < 3) |
| | |
| | | |
| | | if (palletTypeInfos.FirstOrDefault(x => x.LocaitonCount == 2) != null) |
| | | { |
| | | Dt_LocationInfo? nearLocation; |
| | | if (palletTypeInfo.IsOdd) |
| | | { |
| | | nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column + 1); |
| | | } |
| | | else |
| | | { |
| | | nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column - 1); |
| | | } |
| | | //è·åæ´æ¹åºä½ |
| | | Dt_LocationInfo? nearLocation1; |
| | | Dt_LocationInfo? nearLocation2; |
| | | |
| | | if (nearLocation!=null && location.RoadwayNo.Contains("BC")) |
| | | { |
| | | if (nearLocation?.LocationType == LocationTypeEnum.SmallPallet.ObjToInt()) |
| | | { |
| | | nearLocation = null; |
| | | } |
| | | } |
| | | if (location.RoadwayNo == "SC01_BC" && palletType != PalletTypeEnum.SmallPallet.ObjToInt()) |
| | | { |
| | | nearLocation = locationInfos.FirstOrDefault(x => x.Row == location.Row && x.Layer == location.Layer && x.Depth == location.Depth && x.Column == location.Column - 1); |
| | | if (nearLocation?.LocationType == LocationTypeEnum.SmallPallet.ObjToInt()) |
| | | { |
| | | nearLocation = null; |
| | | } |
| | | } |
| | | 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 (nearLocation != null) |
| | | |
| | | if (nearLocation1 != null && nearLocation2 != null) |
| | | { |
| | | List<Dt_LocationInfo> nearLocations = GetGroupLocations(locationInfos, nearLocation); |
| | | //åè¾
æ |
| | | List<Dt_LocationInfo> nearLocations = new List<Dt_LocationInfo>() |
| | | { |
| | | nearLocation1, |
| | | nearLocation2 |
| | | }; |
| | | for (int i = 0; i < nearLocations.Count; i++) |
| | | { |
| | | List<int> palletTypes = palletTypeInfos.Select(x => x.PalletType).ToList(); |
| | | palletTypes.Add(0); |
| | | if (palletTypes.Contains(nearLocations[i].LocationType)) |
| | | if (locationStatus == LocationStatusEnum.Lock) |
| | | { |
| | | if (nearLocations[i].LocationType != palletType) |
| | | if (nearLocations[i].LocationStatus == LocationStatusEnum.Free.ObjToInt()) |
| | | { |
| | | nearLocations[i].LocationType = palletType; |
| | | nearLocations[i].LocationStatus = LocationStatusEnum.FreeLock.ObjToInt(); |
| | | } |
| | | |
| | | if (locationStatus == LocationStatusEnum.Lock) |
| | | } |
| | | else if (locationStatus == LocationStatusEnum.Free) |
| | | { |
| | | if (nearLocations[i].LocationStatus == LocationStatusEnum.FreeLock.ObjToInt()) |
| | | { |
| | | 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.Free || 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(); |
| | | } |
| | | nearLocations[i].LocationStatus = LocationStatusEnum.Free.ObjToInt(); |
| | | } |
| | | } |
| | | } |
| | | locations.AddRange(nearLocations); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | else |
| | | { |