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("暂无货位可分配");
}
}
}