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<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"));
|
if (null != currentTask && currentTask.Count > 0)
|
locationId = currentTask.Select(r => r.task_fromlocationid).ToList();
|
|
//入库任务
|
Dt_locationinfo locationinfo = null;
|
|
|
|
List<int> listLayer = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
|
|
// 当传进来的是1 处理入库区的逻辑 当传进来的是2处理出库区的逻辑
|
if (Gznumber == 1)
|
{
|
List<Dt_taskinfo> 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<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);
|
}
|
}
|
|
}
|
else if (Gznumber == 2)
|
{
|
List<Dt_taskinfo> 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<int> rgvLayer = new List<int>();
|
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<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 = 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("暂无货位可分配");
|
}
|
}
|
}
|
}
|