Admin
14 小时以前 c99808261b1b1460d22a7f7db5955a65080c3b4b
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA.Services/Common/GetEmptyLocationAction.cs
@@ -1,4 +1,6 @@
using System;
using NewLife.Serialization;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -6,6 +8,7 @@
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;
@@ -14,142 +17,179 @@
{
    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()
        public static Dt_locationinfo GetEmptyLocationAction(int? Gznumber = 0)
        {
            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<Dt_taskinfo> inboundTask = Dt_taskinfoRepository.Instance.Find(r => r.task_type.Contains("Inbound"));
            List<int> listLayer = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
            //// æ›´æ”¹èŽ·å–è´§ä½çš„ä¿¡æ¯ è¿™é‡Œè¦å†™ä¸€ä¸ªå¾ªçޝ
            //List<Dt_taskinfo> outboundTask_temp = Dt_taskinfoRepository.Instance.Find(x => x.task_tolocationid == "10301" || x.task_endstation == "10301");
            //if (outboundTask_temp != null)
            //{
            //    string temp_layer = "";
            //    foreach (var item in outboundTask_temp)
            //    {
            //    }
            //}
            if (null != inboundTask && inboundTask.Count > 0)
            lock (_locker)
            {
                foreach (var item in inboundTask)
                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++)
                {
                    //如果取货完成,可以分配
                    if (string.IsNullOrEmpty(item.task_bak_2) || !"2".Equals(item.task_bak_2))
                    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);
                    }
                }
            }
            //          List<Dt_taskinfo> outboundTask = Dt_taskinfoRepository.Instance.Find(r => ((r.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString())
            //    && (r.task_state.Equals(TaskState.TaskState_RGV_Received.ToString()) || r.task_state.Equals(TaskState.TaskState_RGV_Finished.ToString())))
            //|| r.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString());
            List<Dt_taskinfo> outboundTask = Dt_taskinfoRepository.Instance.Find(r =>(r.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString() || r.task_type == TaskType.TaskType_Box_Pallet_Measure_Back.ToString())
            && (r.task_state != TaskState.TaskState_Create.ToString()));
            if (outboundTask.Count < 3)
            {
                int crtacount = 3 - outboundTask.Count;
                List<Dt_taskinfo> outboundcCrteateTask = Dt_taskinfoRepository.Instance.Find(r => r.task_type == TaskType.TaskType_Box_Pallet_Measure_Out.ToString()
            && r.task_state == TaskState.TaskState_Create.ToString()).OrderBy(r=>r.task_createtime).Take(crtacount).ToList();
                outboundTask.AddRange(outboundcCrteateTask);
            }
            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)
                else
                {
                    string[] location = item.Split('-');
                    //获取当前有任务的层
                    int layer = int.Parse(location[0]);
                    listLayer.Remove(layer);
                    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++)
                List<int> rgvLayer = new List<int>();
                WebResponseContent resultcontent = RGVAPIInvokeGetRgvInfo.GetRgvInfo();
                if (resultcontent.Status)
                {
                    Info _info = rgvData.data[i];
                    if (_info.status == 1 && listLayer.Contains(_info.layer))
                    RgvDeviceStatusModel rgvData = (RgvDeviceStatusModel)resultcontent.Data;
                    //0离线 1正常 2故障
                    for (int i = 0; i < rgvData.data.Count(); i++)
                    {
                        rgvLayer.Add(_info.layer);
                        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)
                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)
                {
                    locationinfo = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString() &&
                    !locationId.Contains(x.location_id) && !x.location_islocked && rgvLayer.Contains(x.location_layer)).OrderBy(x => x.location_layer)
                     .ThenBy(x => x.location_column).FirstOrDefault();
                    if (null != locationinfo)
                        return locationinfo;
                    //优先分配穿梭车的层
                    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 = Dt_locationinfoRepository.Instance.Find(x => x.location_state == LocationState.LocationState_Empty.ToString() &&
                   !locationId.Contains(x.location_id) && !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() &&
                    !locationId.Contains(x.location_id) && !x.location_islocked && listLayer.Contains(x.location_layer)).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();
                        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
                        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 (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)
                        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();
                    return locationinfo;
                    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("暂无货位可分配");
            }
            throw new Exception("暂无货位可分配");
        }
    }
}