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 { /// /// 给入库请求分配货位 /// /// public static Dt_locationinfo GetEmptyLocationAction(int? Gznumber = 0) { 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 { List 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); } } } 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); } } } 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); } } } 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) .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) .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) .ThenBy(x => x.location_column).FirstOrDefault(); if (null != locationinfo) 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(); 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(); } 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(); if (null != locationinfo) 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(); if (null != locationinfo) return locationinfo; } throw new Exception("暂无货位可分配"); } } }