Admin
9 小时以前 c99808261b1b1460d22a7f7db5955a65080c3b4b
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA.Services/Common/GetEmptyLocationAction.cs
@@ -17,12 +17,36 @@
{
    public partial class CommonFunction
    {
        private readonly static object _locker = new object();
        public static List<LocationCache> locationCaches = new List<LocationCache>();
        public class LocationCache
        {
            public string LocationCode { get; set; }
            public DateTime DateTime { get; set; }
        }
        /// <summary>
        /// ç»™å…¥åº“请求分配货位
        /// </summary>
        /// <returns></returns>
        public static Dt_locationinfo GetEmptyLocationAction(int? Gznumber = 0)
        {
            lock (_locker)
            {
                List<LocationCache> removeItems = locationCaches.Where(x => (DateTime.Now - x.DateTime).TotalMinutes > 5).ToList();//查询添加静态变量超过10分钟的货位
                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<string> locationId = new List<string>();
            //出库任务
            List<Dt_taskinfo> currentTask = Dt_taskinfoRepository.Instance.Find(r => r.task_type.Contains("Out"));
@@ -73,9 +97,7 @@
            }
            else if (Gznumber == 2)
            {
                List<Dt_taskinfo> outbound = Dt_taskinfoRepository.Instance.Find(x =>
                x.task_beginstation == "90101"
                );
                    List<Dt_taskinfo> outbound = Dt_taskinfoRepository.Instance.Find(x => x.task_beginstation == "90101");
                foreach (var item in outbound)
                {
                    string[] location = item.task_tolocationid.Split('-');
@@ -87,46 +109,8 @@
            }
            else
            {
                List<Dt_taskinfo> inboundTask = Dt_taskinfoRepository.Instance.Find(r => r.task_type.Contains("Inbound"));
                if (null != inboundTask && inboundTask.Count > 0)
                {
                    foreach (var item in inboundTask)
                    {
                        //如果取货完成,可以分配
                        if (string.IsNullOrEmpty(item.task_bak_2) || !"2".Equals(item.task_bak_2))
                        {
                            string[] location = item.task_tolocationid.Split('-');
                            //获取当前有任务的层
                            int layer = int.Parse(location[0]);
                            LogRecord.WriteLog((int)LogEnum.InBound, $"分配任务时,有入库任务需要删除的层:{layer},当前层货位编号:{item.ToJson()},当前现有任务{inboundTask.ToJson()}");
                            listLayer.Remove(layer);
                    throw new Exception("获取库位类型不匹配");
                        }
                    }
                }
                List<Dt_taskinfo> outboundTask = Dt_taskinfoRepository.Instance.Find(r => ((r.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString())
       && (r.task_state == TaskState.TaskState_RGV_Received.ToString() || r.task_state == TaskState.TaskState_RGV_Finished.ToString()))
   || r.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString());
                if (null != outboundTask && outboundTask.Count > 0)
                {
                    List<string> fromStation = outboundTask.Where(r => r.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString()).Select(r => r.task_fromlocationid).ToList();
                    fromStation.AddRange(outboundTask.Where(r => r.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString()).Select(r => r.task_tolocationid).ToList());
                    foreach (var item in fromStation)
                    {
                        string[] location = item.Split('-');
                        //获取当前有任务的层
                        int layer = int.Parse(location[0]);
                        LogRecord.WriteLog((int)LogEnum.InBound, $"分配任务时,有入库任务需要删除的层:{layer},当前层货位编号:{item.ToJson()},当前现有任务{outboundTask.ToJson()}");
                        listLayer.Remove(layer);
                    }
                }
            }
            List<int> rgvLayer = new List<int>();
            WebResponseContent resultcontent = RGVAPIInvokeGetRgvInfo.GetRgvInfo();
@@ -145,59 +129,67 @@
            }
                List<Dt_locationinfo> LocationList = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
                && !x.location_islocked && !lockLocations.Contains(x.location_id));
            if (locationId.Count > 0)
            {
                //优先分配穿梭车的层
                if (rgvLayer.Count > 0)
                {
                    locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
                    && !x.location_islocked && rgvLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer)
                        locationinfo = LocationList.Where(x => rgvLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer)
                     .ThenBy(x => x.location_column).FirstOrDefault();
                    if (null != locationinfo)
                        return locationinfo;
                    else
                        locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
                    && !x.location_islocked && listLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer)
                            locationinfo = LocationList.Where(x => listLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer)
                    .ThenBy(x => x.location_column).FirstOrDefault();
                }
                else
                    locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
                     && !x.location_islocked && listLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer)
                        locationinfo = LocationList.Where(x => listLayer.Contains(x.location_layer) && !locationId.Contains(x.location_id)).OrderBy(x => x.location_layer)
                     .ThenBy(x => x.location_column).FirstOrDefault();
                if (null != locationinfo)
                    {
                        locationCaches.Add(new LocationCache { DateTime = DateTime.Now, LocationCode = locationinfo.location_id });
                    return locationinfo;
                    }
            }
            else
            {
                if (rgvLayer.Count > 0)
                {
                    locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
                 && !x.location_islocked && rgvLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
                        locationinfo = LocationList.Where(x => rgvLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
                    if (null != locationinfo)
                        return locationinfo;
                    else
                        locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
                        && !x.location_islocked && listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
                            locationinfo = LocationList.Where(x => listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
                }
                else
                    locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
              && !x.location_islocked && listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
                        locationinfo = LocationList.Where(x => listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
                if (null != locationinfo)
                    {
                        locationCaches.Add(new LocationCache { DateTime = DateTime.Now, LocationCode = locationinfo.location_id });
                    return locationinfo;
                    }
            }
            if (locationinfo == null)
            {
                locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString()
              && !x.location_islocked && listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
                    locationinfo = LocationList.Where(x => listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault();
                if (null != locationinfo)
                    {
                        locationCaches.Add(new LocationCache { DateTime = DateTime.Now, LocationCode = locationinfo.location_id });
                    return locationinfo;
            }
                }
            throw new Exception("暂无货位可分配");
        }
    }
}
}