using NewLife.Serialization; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using WIDESEA.Common; using WIDESEA.Core.Utilities; using WIDESEA.Entity.DomainModels; using WIDESEA.Services.Repositories; using WIDESEA_Common.LogEnum; using WIDESEA_Entity.CustomModels.RGVModel; using WIDESEA_Services.Services.APIInvoke.RGV; using static WIDESEA_Entity.CustomModels.RGVModel.RgvDeviceStatusModel; namespace WIDESEA.Services.Services { public partial class CommonFunction { private readonly static object _locker = new object(); public static List locationCaches = new List(); public class LocationCache { public string LocationCode { get; set; } public DateTime DateTime { get; set; } } /// /// 给入库请求分配货位 /// /// public static Dt_locationinfo GetEmptyLocationAction(int? Gznumber = 0) { lock (_locker) { List 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 lockLocations = locationCaches.Select(x => x.LocationCode).ToList(); List locationId = new List(); //出库任务 List currentTask = Dt_taskinfoRepository.Instance.Find(r => r.task_type.Contains("Out")); if (null != currentTask && currentTask.Count > 0) locationId = currentTask.Select(r => r.task_fromlocationid).ToList(); //入库任务 Dt_locationinfo locationinfo = null; List listLayer = new List() { 1, 2, 3, 4, 5, 6, 7, 8 }; // 当传进来的是1 处理入库区的逻辑 当传进来的是2处理出库区的逻辑 if (Gznumber == 1) { List inbound = Dt_taskinfoRepository.Instance.Find(x => x.task_beginstation == "20101" ); foreach (var item in inbound) { string[] location = item.task_tolocationid.Split('-'); //获取当前有任务的层 int layer = int.Parse(location[0]); LogRecord.WriteLog((int)LogEnum.InBound, $"分配任务时,有入库任务需要删除的层:{layer},当前层货位编号:{item.ToJson()},当前现有任务{inbound.ToJson()}"); listLayer.Remove(layer); } List 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 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); } } } else if (Gznumber == 2) { List outbound = Dt_taskinfoRepository.Instance.Find(x => x.task_beginstation == "90101"); foreach (var item in outbound) { string[] location = item.task_tolocationid.Split('-'); //获取当前有任务的层 int layer = int.Parse(location[0]); LogRecord.WriteLog((int)LogEnum.InBound, $"分配任务时,有入库任务需要删除的层:{layer},当前层货位编号:{item.ToJson()},当前现有任务{outbound.ToJson()}"); listLayer.Remove(layer); } } else { throw new Exception("获取库位类型不匹配"); } List rgvLayer = new List(); WebResponseContent resultcontent = RGVAPIInvokeGetRgvInfo.GetRgvInfo(); if (resultcontent.Status) { RgvDeviceStatusModel rgvData = (RgvDeviceStatusModel)resultcontent.Data; //0离线 1正常 2故障 for (int i = 0; i < rgvData.data.Count(); i++) { Info _info = rgvData.data[i]; if (_info.status == 1 && listLayer.Contains(_info.layer)) { rgvLayer.Add(_info.layer); } } } List 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 = 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 = 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 = 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 = 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 = LocationList.Where(x => listLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer).ThenBy(x => x.location_column).FirstOrDefault(); } else 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 = 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("暂无货位可分配"); } } } }