heshaofeng
5 天以前 a2f948006c6c7e918ba4f2e66d477cc2d5017a75
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_BasicService/LocationInfoService.cs
@@ -36,11 +36,13 @@
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IRepository<Dt_StockInfo> _stockInfoRepository;
        public IRepository<Dt_LocationInfo> Repository => BaseDal;
        public readonly IRepository<Dt_LocationType> _locationTypeRepository;
        public LocationInfoService(IRepository<Dt_LocationInfo> BaseDal, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_StockInfo> stockInfoRepository) : base(BaseDal)
        public LocationInfoService(IRepository<Dt_LocationInfo> BaseDal, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_LocationType> locationTypeRepository) : base(BaseDal)
        {
            _unitOfWorkManage = unitOfWorkManage;
            _stockInfoRepository = stockInfoRepository;
            _locationTypeRepository = locationTypeRepository;
        }
        /// <summary>
@@ -97,14 +99,91 @@
            return LocationDisableStatus(new int[] { key });
        }
        /// <summary>
        /// æ‰¹é‡ä¿®æ”¹è´§ä½çŠ¶æ€
        /// </summary>
        /// <param name="locationInfos"></param>
        /// <param name="locationStatus"></param>
        public void UpdateLocationStatus(List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus)
        {
            locationInfos.ForEach(x =>
            {
                x.LocationStatus = locationStatus.ObjToInt();
            });
            UpdateData(locationInfos);
        }
        private readonly static object _locker = new object();
        static List<LocationCache> locationCaches = new List<LocationCache>();
        private int locationCacheTime = 10;
        private int locationCacheTime = 20;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="roadwayNo"></param>
        /// <returns></returns>
        public Dt_LocationInfo? AssignLocation(int locationType)
        {
            if (locationType <= 0)
            {
                throw new ArgumentOutOfRangeException("仓库区域错误!");
            }
            lock (_locker)
            {
                List<LocationCache> removeItems = locationCaches.Where(x => (DateTime.Now - x.DateTime).TotalMinutes > locationCacheTime).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();
                //Dictionary<string, SqlSugar.OrderByType> orderBy = new Dictionary<string, OrderByType>()
                //{
                //    { nameof(Dt_LocationInfo.RoadwayNo),OrderByType.Asc },
                //    { nameof(Dt_LocationInfo.Layer),OrderByType.Asc },
                //    { nameof(Dt_LocationInfo.Column),OrderByType.Asc },
                //    { nameof(Dt_LocationInfo.Depth),OrderByType.Desc },
                //    { nameof(Dt_LocationInfo.Row),OrderByType.Asc }
                //};
                Dictionary<string, SqlSugar.OrderByType> orderBy = new Dictionary<string, OrderByType>()
                {
                    //{ nameof(Dt_LocationInfo.RoadwayNo),OrderByType.Asc },
                    { nameof(Dt_LocationInfo.Layer),OrderByType.Asc },
                    { nameof(Dt_LocationInfo.Row),OrderByType.Asc },
                    { nameof(Dt_LocationInfo.Column),OrderByType.Asc },
                    { nameof(Dt_LocationInfo.Depth),OrderByType.Desc },
                };
                var first = BaseDal.QueryFirst(x => x.LocationType == locationType && x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode), orderBy);//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
                if (first != null)
                {
                    locationCaches.Add(new LocationCache { LocationCode = first?.LocationCode, DateTime = DateTime.Now });
                    using (var sugarClient = new SqlSugarClient(new ConnectionConfig
                    {
                        ConnectionString = DBContext.ConnectionString,
                        DbType = DBContext.DbType,
                        IsAutoCloseConnection = true,
                        InitKeyType = InitKeyType.Attribute
                    }))
                    {
                        sugarClient.Updateable<Dt_LocationInfo>().SetColumns(x => new Dt_LocationInfo
                        {
                            LocationStatus = (int)LocationStatusEnum.InStockLock,
                        }).Where(x => x.Id == first.Id).ExecuteCommand();
                    }
                }
                return first;
            }
        }
        public Dt_LocationInfo? AssignLocation()
        {
            lock (_locker)
@@ -128,14 +207,44 @@
                    { nameof(Dt_LocationInfo.Row),OrderByType.Asc }
                };
                var first= BaseDal.QueryFirst(x =>   x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode), orderBy);//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
                locationCaches.Add(new LocationCache { LocationCode = first.LocationCode, DateTime = DateTime.Now });
                var first = BaseDal.QueryFirst(x => x.LocationStatus == LocationStatusEnum.Free.ObjToInt() && x.EnableStatus != EnableStatusEnum.Disable.ObjToInt() && !lockLocationCodes.Contains(x.LocationCode), orderBy);//查询空货位信息并排除5分钟内分配的货位,根据层、列、深度、行排序
                if (first != null)
                {
                    locationCaches.Add(new LocationCache { LocationCode = first.LocationCode, DateTime = DateTime.Now });
                    Db.Updateable<Dt_LocationInfo>().SetColumns(x => new Dt_LocationInfo
                    {
                        LocationStatus = (int)LocationStatusEnum.InStockLock,
                    }).Where(x => x.Id == first.Id).ExecuteCommand();
                }
                return first;
            }
        }
        /// <summary>
        /// èŽ·å–å¯å‡ºåº“è´§ä½ç¼–å·
        /// </summary>
        /// <param name="warehouseId"></param>
        /// <returns></returns>
        public List<string> GetCanOutLocationCodes()
        {
            return Repository.QueryData(x => x.LocationCode, x => x.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && (x.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || x.EnableStatus == EnableStatusEnum.Normal.ObjToInt())).Distinct().ToList();
        }
        /// <summary>
        /// æ ¹æ®è´§ä½ç¼–号集合获取货位信息
        /// </summary>
        /// <param name="locationCodes"></param>
        /// <returns></returns>
        public List<Dt_LocationInfo> GetLocationInfos(List<string> locationCodes)
        {
            return Repository.QueryData(x => locationCodes.Contains(x.LocationCode));
        }
        public List<LocationTypeDto> GetLocationTypes()
        {
            return _locationTypeRepository.Db.Queryable<Dt_LocationType>().Select(x =>
                new LocationTypeDto { LocationType = x.LocationType, LocationTypeDesc = x.LocationTypeDesc }).ToList();
        }
        /// <summary>
        /// åˆå§‹åŒ–货位
@@ -173,7 +282,7 @@
                                    LocationCode = $"HAI-{row.ToString().PadLeft(3, '0')}-{col.ToString().PadLeft(3, '0')}-{layer.ToString().PadLeft(2, '0')} ",
                                    LocationName = $"{row.ToString()}行{col.ToString()}列{layer.ToString()}层 ",
                                    RoadwayNo = roadwayNo,
                                    Row = row,
                                    Column = col,
@@ -200,7 +309,7 @@
                                    LocationCode = $"HAI-{r1.ToString().PadLeft(3, '0')}-{col.ToString().PadLeft(3, '0')}-{layer.ToString().PadLeft(2, '0')} ",
                                    LocationName = $"{r1.ToString()}行{col.ToString()}列{layer.ToString()}层 ",
                                    RoadwayNo = roadwayNo,
                                    Row = r1,
                                    Column = col,
@@ -219,7 +328,7 @@
                                    LocationName = $"{r2.ToString()}行{col.ToString()}列{layer.ToString()}层 ",
                                    RoadwayNo = roadwayNo,
                                    Row = r2,
                                    Column = col,
@@ -275,14 +384,14 @@
                                EnableStatus = EnableStatusEnum.Normal.ObjToInt(),
                                Layer = k + 1,
                                LocationStatus = LocationStatusEnum.Free.ObjToInt(),
                                LocationType = LocationTypeEnum.Undefined.ObjToInt(),
                                LocationType = LocationTypeEnum.Normal.ObjToInt(),
                                RoadwayNo = $"{initializationLocationDTO.Roadway.ToString()}",
                                Row = i + 1,
                                Depth = depth,
                            };
   locationInfo.LocationCode = $"HAI-{locationInfo.Row.ToString().PadLeft(3, '0')}-{locationInfo.Column.ToString().PadLeft(3, '0')}-{locationInfo.Layer.ToString().PadLeft(2, '0')} ";
    locationInfo.LocationName = $"HAI{locationInfo.RoadwayNo}巷道{locationInfo.Row.ToString().PadLeft(3, '0')}行{locationInfo.Column.ToString().PadLeft(3, '0')}列{locationInfo.Layer.ToString().PadLeft(3, '0')}层 ";
                            locationInfo.LocationCode = $"HAI-{locationInfo.Row.ToString().PadLeft(3, '0')}-{locationInfo.Column.ToString().PadLeft(3, '0')}-{locationInfo.Layer.ToString().PadLeft(2, '0')}";
                            locationInfo.LocationName = $"HAI{locationInfo.RoadwayNo}巷道{locationInfo.Row.ToString().PadLeft(3, '0')}行{locationInfo.Column.ToString().PadLeft(3, '0')}列{locationInfo.Layer.ToString().PadLeft(3, '0')}层";
                            //locationInfo.LocationCode = $"{locationInfo.RoadwayNo}-{locationInfo.Row.ToString().PadLeft(3, '0')}-{locationInfo.Column.ToString().PadLeft(3, '0')}-{locationInfo.Layer.ToString().PadLeft(3, '0')}-{locationInfo.Depth.ToString().PadLeft(2, '0')}";
@@ -292,7 +401,7 @@
                        }
                    }
                }
             //   BaseDal.AddData(locationInfos);
                //   BaseDal.AddData(locationInfos);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)