|  |  | 
 |  |  | using WIDESEA_IRecordService; | 
 |  |  | using WIDESEA_IBasicService; | 
 |  |  | using WIDESEA_Model.Models; | 
 |  |  | using WIDESEA_Common.CommonEnum; | 
 |  |  | using WIDESEA_Common.LocationEnum; | 
 |  |  |  | 
 |  |  | namespace WIDESEA_BasicService | 
 |  |  | { | 
 |  |  |     public partial class LocationInfoService : ServiceBase<Dt_LocationInfo, ILocationInfoRepository>, ILocationInfoService | 
 |  |  |     public class LocationInfoService_Old | 
 |  |  |     { | 
 |  |  |         private readonly IRecordService _recordService; | 
 |  |  |         public LocationInfoService(ILocationInfoRepository BaseDal, IBasicRepository basicRepository, IRecordService recordService) : base(BaseDal) | 
 |  |  |         private readonly ILocationInfoRepository Repository; | 
 |  |  |  | 
 |  |  |         public LocationInfoService_Old(ILocationInfoRepository repository) | 
 |  |  |         { | 
 |  |  |             _basicRepository = basicRepository; | 
 |  |  |             _recordService = recordService; | 
 |  |  |             Repository = repository; | 
 |  |  |         } | 
 |  |  |         private Dictionary<string, OrderByType> _emptyAssignOrderBy = new Dictionary<string, OrderByType>() | 
 |  |  |  | 
 |  |  |         double weightValue = 0.5; | 
 |  |  |  | 
 |  |  |         private readonly static object _locker = new object(); | 
 |  |  |         static List<LocationCache> locationCaches = new List<LocationCache>(); | 
 |  |  |  | 
 |  |  |         /// <summary> | 
 |  |  |         /// è´§ä½åé
é»è¾ | 
 |  |  |         /// </summary> | 
 |  |  |         /// <param name="roadwayNo">å··éå·</param> | 
 |  |  |         /// <param name="palletType">æçç±»å</param> | 
 |  |  |         /// <returns></returns> | 
 |  |  |         public Dt_LocationInfo? AssignLocation(string roadwayNo, PalletTypeEnum palletType) | 
 |  |  |         { | 
 |  |  |             { nameof(Dt_LocationInfo.Depth), OrderByType.Desc }, | 
 |  |  |             { nameof(Dt_LocationInfo.Layer), OrderByType.Asc }, | 
 |  |  |             { nameof(Dt_LocationInfo.Column), OrderByType.Asc }, | 
 |  |  |             { nameof(Dt_LocationInfo.Row), OrderByType.Asc }, | 
 |  |  |         }; | 
 |  |  |             lock (_locker) | 
 |  |  |             { | 
 |  |  |                 List<LocationCache> removeItems = locationCaches.Where(x => (DateTime.Now - x.DateTime).TotalMinutes > 5).ToList(); | 
 |  |  |                 int count = removeItems.Count; | 
 |  |  |                 for (int i = 0; i < count; i++) | 
 |  |  |                 { | 
 |  |  |                     locationCaches.Remove(removeItems[i]); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 List<string> lockLocationCodes = locationCaches.Select(x => x.LocationCode).ToList(); | 
 |  |  |  | 
 |  |  |                 List<Dt_LocationInfo> locationInfos = Repository.QueryData(x => x.RoadwayNo == roadwayNo); | 
 |  |  |  | 
 |  |  |                 //å·²å®ä¹è´§ä½ç±»åçè´§ä½ | 
 |  |  |                 List<Dt_LocationInfo> definedTypeLocations = locationInfos.Where(x => x.LocationType == palletType.ObjToInt()).ToList(); | 
 |  |  |  | 
 |  |  |                 //æªå®ä¹ç±»åçç©ºè´§ä½ | 
 |  |  |                 List<Dt_LocationInfo> undefinedTypeEmptyLocations = locationInfos.Where(x => (x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() || x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.LocationType == LocationTypeEnum.Undefined.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode)).OrderByDescending(x => x.Depth).ThenBy(x => x.Layer).ThenBy(x => x.Row).ThenBy(x => x.Column).ToList(); | 
 |  |  |  | 
 |  |  |                 if (locationInfos.Count * weightValue >= definedTypeLocations.Count && undefinedTypeEmptyLocations.Count > 0)//妿已å®ä¹ç±»åè´§ä½æªè¶
è¿æ¯ä¾ï¼ä¸ææªå®ä¹ç±»åçè´§ä½ | 
 |  |  |                 { | 
 |  |  |                     if (palletType == PalletTypeEnum.LargePallet) | 
 |  |  |                     { | 
 |  |  |                         undefinedTypeEmptyLocations = undefinedTypeEmptyLocations.Where(x => x.Column % 2 == 1).ToList(); | 
 |  |  |                     } | 
 |  |  |                     for (int i = 0; i < undefinedTypeEmptyLocations.Count; i++) | 
 |  |  |                     { | 
 |  |  |                         Dt_LocationInfo undefinedTypeEmptyLocation = undefinedTypeEmptyLocations[i]; | 
 |  |  |                         Dt_LocationInfo? locationInfo = GetUsableLocation(locationInfos, undefinedTypeEmptyLocation, palletType); | 
 |  |  |                         if (locationInfo != null) | 
 |  |  |                         { | 
 |  |  |                             //UpdateLocationStatus(locationInfo.LocationCode, palletType, LocationStatusEnum.Lock);  | 
 |  |  |                             locationCaches.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now }); | 
 |  |  |                             return locationInfo; | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 else | 
 |  |  |                 { | 
 |  |  |                     List<Dt_LocationInfo> definedTypeEmptyLocations = locationInfos.Where(x => (x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() || x.EnableStatus == EnableStatusEnum.OnlyIn.ObjToInt()) && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.LocationType == palletType.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode)).OrderByDescending(x => x.Depth).ThenBy(x => x.Layer).ThenBy(x => x.Row).ThenBy(x => x.Column).ToList(); | 
 |  |  |  | 
 |  |  |                     for (int i = 0; i < definedTypeEmptyLocations.Count; i++) | 
 |  |  |                     { | 
 |  |  |                         Dt_LocationInfo definedTypeEmptyLocation = definedTypeEmptyLocations[i]; | 
 |  |  |                         Dt_LocationInfo? locationInfo = GetUsableLocation(locationInfos, definedTypeEmptyLocation, palletType); | 
 |  |  |                         if (locationInfo != null) | 
 |  |  |                         { | 
 |  |  |                             //UpdateLocationStatus(locationInfo.LocationCode, palletType, LocationStatusEnum.Lock); | 
 |  |  |                             locationCaches.Add(new LocationCache { LocationCode = locationInfo.LocationCode, DateTime = DateTime.Now }); | 
 |  |  |                             return locationInfo; | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 return null; | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public Dt_LocationInfo? GetUsableLocation(List<Dt_LocationInfo> locationInfos, Dt_LocationInfo undefinedTypeEmptyLocation, PalletTypeEnum palletType) | 
 |  |  |         { | 
 |  |  |             switch (palletType) | 
 |  |  |             { | 
 |  |  |                 case PalletTypeEnum.LargePallet: | 
 |  |  |                     { | 
 |  |  |                         Dt_LocationInfo? nearLocation = locationInfos.FirstOrDefault(x => x.Row == undefinedTypeEmptyLocation.Row && x.Layer == undefinedTypeEmptyLocation.Layer && x.Depth == undefinedTypeEmptyLocation.Depth && x.Column == undefinedTypeEmptyLocation.Column + 1); | 
 |  |  |                         if (nearLocation != null && nearLocation.LocationStatus == LocationStatusEnum.Free.ObjToInt() && DepthLocationIsEmpty(locationInfos, undefinedTypeEmptyLocation) != null) | 
 |  |  |                         { | 
 |  |  |                             Dt_LocationInfo? locationInfo = DepthLocationIsEmpty(locationInfos, undefinedTypeEmptyLocation); | 
 |  |  |                             if (locationInfo != null) | 
 |  |  |                             { | 
 |  |  |                                 return locationInfo; | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                     break; | 
 |  |  |                 case PalletTypeEnum.SmallPallet: | 
 |  |  |                     { | 
 |  |  |                         Dt_LocationInfo? locationInfo = DepthLocationIsEmpty(locationInfos, undefinedTypeEmptyLocation); | 
 |  |  |                         if (locationInfo != null) | 
 |  |  |                         { | 
 |  |  |                             return locationInfo; | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                     break; | 
 |  |  |             } | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         private Dt_LocationInfo? DepthLocationIsEmpty(List<Dt_LocationInfo> locationInfos, Dt_LocationInfo undefinedTypeEmptyLocation) | 
 |  |  |         { | 
 |  |  |             int maxDepth = locationInfos.Max(x => x.Depth); | 
 |  |  |             if (undefinedTypeEmptyLocation.Depth == 1 && maxDepth == 1) | 
 |  |  |             { | 
 |  |  |                 return undefinedTypeEmptyLocation; | 
 |  |  |             } | 
 |  |  |             else | 
 |  |  |             { | 
 |  |  |                 List<Dt_LocationInfo> locations = GetGroupLocations(locationInfos, undefinedTypeEmptyLocation); | 
 |  |  |  | 
 |  |  |                 List<Dt_LocationInfo> moreDepth = locations.Where(x => x.Depth > undefinedTypeEmptyLocation.Depth).ToList(); | 
 |  |  |                 bool moreDepthFlag = moreDepth.FirstOrDefault(x => x.LocationStatus != LocationStatusEnum.InStock.ObjToInt()) == null;//æ¥è¯¢å¤§äºå½åè´§ä½æ·±åº¦çéåéæ¯å¦æç¶æä¸ä¸ºæè´§çè´§ä½ï¼å¦ææ¯trueï¼åè¡¨ç¤ºæ·±è´§ä½ææªè¢«ä½¿ç¨çæ
åµ | 
 |  |  |  | 
 |  |  |                 List<Dt_LocationInfo> littleDepth = locations.Where(x => x.Depth <= undefinedTypeEmptyLocation.Depth).ToList(); | 
 |  |  |                 bool littleDepthFlag = littleDepth.FirstOrDefault(x => x.LocationStatus != LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.OnlyIn.ObjToInt() && x.EnableStatus != EnableStatusEnum.Normal.ObjToInt()) == null; //æ¥è¯¢å°äºå½åè´§ä½æ·±åº¦çéåéæ¯å¦æç¶æä¸ä¸ºç©ºï¼ä¸ç¦ç¨ç¶æä¸ä¸ºç¦ç¨ä»¥ååªå
¥çè´§ä½ï¼å¦ææ¯trueï¼å表示æµ
è´§ä½è¢«ä½¿ç¨æè
被ç¦ç¨çæ
åµ | 
 |  |  |  | 
 |  |  |                 if (moreDepthFlag && littleDepthFlag) | 
 |  |  |                 { | 
 |  |  |                     return undefinedTypeEmptyLocation; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /// <summary> | 
 |  |  |         /// ä¿®æ¹è´§ä½ç¶æåç±»å | 
 |  |  |         /// </summary> | 
 |  |  |         /// <param name="locationCode">è´§ä½ç¼å·</param> | 
 |  |  |         /// <param name="palletType">æçç±»å</param> | 
 |  |  |         /// <param name="locationStatus">è´§ä½ç¶æ</param> | 
 |  |  |         public void UpdateLocationStatus(string locationCode, PalletTypeEnum palletType, LocationStatusEnum locationStatus) | 
 |  |  |         { | 
 |  |  |             Dt_LocationInfo location = Repository.QueryFirst(x => x.LocationCode == locationCode); | 
 |  |  |             List<Dt_LocationInfo> locationInfos = Repository.QueryData(x => x.RoadwayNo == location.RoadwayNo); | 
 |  |  |  | 
 |  |  |             List<Dt_LocationInfo> locations = GetGroupLocations(locationInfos, location); | 
 |  |  |             if (locationInfos.Max(x => x.Depth) < 3) | 
 |  |  |             { | 
 |  |  |                 for (int i = 0; i < locations.Count; i++) | 
 |  |  |                 { | 
 |  |  |                     locations[i].LocationStatus = locationStatus.ObjToInt(); | 
 |  |  |                     locations[i].LocationType = palletType.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 (nearLocation != null) | 
 |  |  |                 { | 
 |  |  |                     List<Dt_LocationInfo> nearLocations = GetGroupLocations(locationInfos, nearLocation); | 
 |  |  |                     for (int i = 0; i < nearLocations.Count; i++) | 
 |  |  |                     { | 
 |  |  |                         nearLocations[i].LocationType = palletType.ObjToInt(); | 
 |  |  |                         if (palletType == PalletTypeEnum.LargePallet) | 
 |  |  |                         { | 
 |  |  |                             nearLocations[i].LocationStatus = locationStatus.ObjToInt(); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                     locations.AddRange(nearLocations); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             else | 
 |  |  |             { | 
 |  |  |                 for (int i = 0; i < locations.Count; i++) | 
 |  |  |                 { | 
 |  |  |                     locations[i].LocationStatus = locationStatus.ObjToInt(); | 
 |  |  |                     locations[i].LocationType = palletType.ObjToInt(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             Repository.UpdateData(locations); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /// <summary> | 
 |  |  |         /// ä¿®æ¹è´§ä½ç¶æåç±»å | 
 |  |  |         /// </summary> | 
 |  |  |         /// <param name="location">è´§ä½å¯¹è±¡</param> | 
 |  |  |         /// <param name="palletType">æçç±»å</param> | 
 |  |  |         /// <param name="locationStatus">è´§ä½ç¶æ</param> | 
 |  |  |         public void UpdateLocationStatus(Dt_LocationInfo location, PalletTypeEnum palletType, LocationStatusEnum locationStatus) | 
 |  |  |         { | 
 |  |  |             List<Dt_LocationInfo> locationInfos = Repository.QueryData(x => x.RoadwayNo == location.RoadwayNo); | 
 |  |  |  | 
 |  |  |             List<Dt_LocationInfo> locations = GetGroupLocations(locationInfos, location); | 
 |  |  |             if (locationInfos.Max(x => x.Depth) < 3) | 
 |  |  |             { | 
 |  |  |                 for (int i = 0; i < locations.Count; i++) | 
 |  |  |                 { | 
 |  |  |                     locations[i].LocationStatus = locationStatus.ObjToInt(); | 
 |  |  |                     locations[i].LocationType = palletType.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 (nearLocation != null) | 
 |  |  |                 { | 
 |  |  |                     List<Dt_LocationInfo> nearLocations = GetGroupLocations(locationInfos, nearLocation); | 
 |  |  |                     for (int i = 0; i < nearLocations.Count; i++) | 
 |  |  |                     { | 
 |  |  |                         nearLocations[i].LocationType = palletType.ObjToInt(); | 
 |  |  |                         if (palletType == PalletTypeEnum.LargePallet) | 
 |  |  |                         { | 
 |  |  |                             nearLocations[i].LocationStatus = locationStatus.ObjToInt(); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                     locations.AddRange(nearLocations); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             else | 
 |  |  |             { | 
 |  |  |                 for (int i = 0; i < locations.Count; i++) | 
 |  |  |                 { | 
 |  |  |                     locations[i].LocationStatus = locationStatus.ObjToInt(); | 
 |  |  |                     locations[i].LocationType = palletType.ObjToInt(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             Repository.UpdateData(locations); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         private List<Dt_LocationInfo> GetGroupLocations(List<Dt_LocationInfo> locationInfos, Dt_LocationInfo location) | 
 |  |  |         { | 
 |  |  |             List<Dt_LocationInfo> groupLocations = new List<Dt_LocationInfo>() { location }; | 
 |  |  |             int maxDepth = locationInfos.Max(x => x.Depth); | 
 |  |  |             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); | 
 |  |  |                 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); | 
 |  |  |                 if (locationInfo != null) | 
 |  |  |                 { | 
 |  |  |                     groupLocations.Add(locationInfo); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             return groupLocations; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public class LocationCache | 
 |  |  |     { | 
 |  |  |         public string LocationCode { get; set; } | 
 |  |  |  | 
 |  |  |         public DateTime DateTime { get; set; } | 
 |  |  |     } | 
 |  |  | } |