1
pulg
8 天以前 8f0f149d607a7246fa25e81340602ce5e47398fe
HH.WCS.QingXiNongfu/process/DeviceProcess.cs
@@ -1,28 +1,14 @@
using HH.WCS.QingXigongchang.core;
using HH.WCS.QingXigongchang.device;
using HH.WCS.QingXigongchang.device;
using HH.WCS.QingXigongchang.dispatch;
using HH.WCS.QingXigongchang.util;
using HH.WCS.QingXigongchang.wms;
using Microsoft.SqlServer.Server;
using Newtonsoft.Json;
using NLog.Time;
using SqlSugar;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics.Eventing.Reader;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Web.Http.Results;
using System.Web.Security;
using System.Web.UI.WebControls;
using static HH.WCS.QingXigongchang.dispatch.NDC;
using static HH.WCS.QingXigongchang.util.Settings;
namespace HH.WCS.QingXigongchang.process
@@ -158,7 +144,6 @@
            }
        }
        private static void Analysis13(string data, deviceInfo plc)
        {
            //用于  出库时 是否可以直达 提升机。  00 后面还需增加退料工单处理。 
@@ -327,7 +312,7 @@
                    si = "0";
                }
                else if (data.Contains("11"))// && (ods.Find(x => x.SQL_PLineNo.Contains("纸箱")) != null || plc.deviceName.Contains("T1"))
                if (data.Contains("11"))// && (ods.Find(x => x.SQL_PLineNo.Contains("纸箱")) != null || plc.deviceName.Contains("T1"))
                {
                    //if (!ods.Any())
                    //    return;
@@ -335,16 +320,28 @@
                    if (_cl.N_CURRENT_NUM > 0 || _clrel.Any())
                    {
                        LogHelper.Info($" time:{_clrel0?.T_CREATE} = s_type:{_clrel0.S_TYPE}");
                        //if (DateTime.Now.Subtract(_clrel0.T_CREATE).TotalSeconds < 10 || !string.IsNullOrEmpty(_clrel0.S_TYPE))
                        //    goto ballll;
                        //plg 2025年6月23日  去除10秒时间限制
                        if (_clrel.Any())
                            if (DateTime.Now.Subtract(_clrel0.T_CREATE).TotalSeconds < 10 || !string.IsNullOrEmpty(_clrel0.S_TYPE))
                                goto ballll;
                        LocationHelper.DoAction(db =>
                        {
                            db.Deleteable(_clrel).ExecuteCommand();
                            _cl.N_CURRENT_NUM = 0;
                            return db.Updateable(_cl).UpdateColumns(x => new { x.N_CURRENT_NUM }).ExecuteCommand() > 0;
                        });
                            if (od?.SQL_PLineNo == "T1提升机")
                            {
                                if (!string.IsNullOrEmpty(_clrel0.S_TYPE))
                                    goto ballll;
                            }
                            else
                            {
                                if (DateTime.Now.Subtract(_clrel0.T_CREATE).TotalSeconds < 3 || !string.IsNullOrEmpty(_clrel0.S_TYPE))
                                    goto ballll;
                            }
                        }
                        LocationHelper.DoAction(db =>
                            {
                                db.Deleteable(_clrel).ExecuteCommand();
                                _cl.N_CURRENT_NUM = 0;
                                return db.Updateable(_cl).UpdateColumns(x => new { x.N_CURRENT_NUM }).ExecuteCommand() > 0;
                            });
                    }
                    if (!plc.deviceName.Contains("T1"))
                        goto ballll;
@@ -379,8 +376,10 @@
                        if (sBit != null)
                        {
                            var sign = Settings.GetTimeStamp();
                            var res = TaskProcess.CreateTransport(sign, sBit.S_LOC_CODE, _cl.S_LOC_CODE, "原物料搬运-纸箱", new List<string> { _clrel.FirstOrDefault().S_CNTR_CODE }, sBit.N_CURRENT_NUM, 1, 1, 50);///, EdnRarea == "YWLYLTKQ" ? _clrel0.S_TYPE : "");
                            var res = TaskProcess.CreateTransport(sign, sBit.S_LOC_CODE, _cl.S_LOC_CODE, "原物料搬运-纸箱", new List<string> { _clrel.FirstOrDefault().S_CNTR_CODE }, sBit.N_CURRENT_NUM, 1, 1, 60);///, EdnRarea == "YWLYLTKQ" ? _clrel0.S_TYPE : "");
                            LogHelper.Info($"原物料搬运 上提升机。 {sign} 任务 ,创建{res} ");
                            //var res = TaskProcess.CreateTransport(sign, sBit.S_LOC_CODE, _cl.S_LOC_CODE, "原物料搬运-纸箱", new List<string> { _clrel.FirstOrDefault().S_CNTR_CODE }, sBit.N_CURRENT_NUM, 1, 1, 50);///, EdnRarea == "YWLYLTKQ" ? _clrel0.S_TYPE : "");
                            //LogHelper.Info($"原物料搬运 上提升机。 {sign} 任务 ,创建{res} ");
                        }
                    }
                }
@@ -1734,18 +1733,51 @@
               状态2   送空完成之后为状态2
               状态3   满托取走,送空之前为状态3,开机默认状态也为状态3
           */
            //3F 00 12 22 0D 0A--无任务信号
            //3F 00 11 22 0D 0A--A口工作信号
            //3F 00 12 21 0D 0A--B口信号
            //3F 00 11 21 0D 0A--A、B口工作信号
            //A口复位信号 - 3F 00 10 0D 0A
            //B口复位信号 - 3F 00 20 0D 0A
            if (data.Length == 4)
            {
                if (data.Substring(1, 1) == "1")
                if (data == "1122")//A口工作信号
                {
                    if (BottlePEMInfoFull(plc, plc.location[0]))
                    if (BottlePEMInfoFullTwo(plc, plc.location[0]))
                    {
                        //设备没有托盘,或者已经有任务,不处理满托信号,返回已经取货完成
                        //3F 00 11 0d 0a
                        //PlcHelper.SendHex(plc.address, "3F00110d0a");
                    }
                }
                else if (data == "1221")//B口工作信号
                {
                    if (BottlePEMInfoFullTwo(plc, plc.location[1]))
                    {
                    }
                }
                else if (data == "1121")//AB口工作信号
                {
                    if (BottlePEMInfoFullTwo(plc, plc.location[0]))
                    {
                    }
                    if (BottlePEMInfoFullTwo(plc, plc.location[1]))
                    {
                    }
                }
                //if (data.Substring(1, 1) == "1")
                //{
                //    if (BottlePEMInfoFull(plc, plc.location[0]))
                //    {
                //        //设备没有托盘,或者已经有任务,不处理满托信号,返回已经取货完成
                //        //3F 00 11 0d 0a
                //        //PlcHelper.SendHex(plc.address, "3F00110d0a");
                //    }
                //}
                //else if (data.Substring(1, 1) == "3")
                //{
                //    if (BottleCapInfoEmpty(plc, plc.location[0]))
@@ -1754,13 +1786,13 @@
                //    }
                //}
                if (data.Substring(3, 1) == "1")
                {
                    if (BottlePEMInfoFull(plc, plc.location[1]))
                    {
                        //PlcHelper.SendHex(plc.address, "3F00210d0a");
                    }
                }
                //if (data.Substring(3, 1) == "1")
                //{
                //    if (BottlePEMInfoFull(plc, plc.location[1]))
                //    {
                //        //PlcHelper.SendHex(plc.address, "3F00210d0a");
                //    }
                //}
                //else if (data.Substring(3, 1) == "3")
                //{
                //    if (BottleCapInfoEmpty(plc, plc.location[1]))
@@ -1963,6 +1995,376 @@
                        }
                    }
                }
            }
        }
        private static object locko = new object();
        private static object lockoIn = new object();
        private static object lockoOut = new object();
        static bool BottlePEMInfoFullTwo(Settings.deviceInfo plc, string location)
        {
            try
            {
                lock (locko)
                {
                    var chi = new SqlHelper<object>().GetInstance();
                    var newDb = chi.CopyNew();
                    Location endBit = null;
                    Location staBit = null;
                    bool SentTask = false;
                    if (location == "")
                    {
                        throw new Exception("货位为空");
                    }
                    var workOrder = WCSHelper.GetWorkOrder(plc.deviceName);
                    if (workOrder == null)
                    {
                        throw new Exception("没有【执行中】的工单");
                    }
                    //先查询货位有没有货  满的下满 空的则上空
                    //  = newDb.Queryable<Location>().FindAll(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0);
                    var hojs = newDb.Queryable<Location>().Where(e => e.S_LOC_CODE == location).First();
                    if (hojs != null && hojs.S_LOCK_STATE != "无")
                    {
                        return false;
                    }
                    var bcpList = WCSHelper.BcpQyOrderList(plc.deviceName);
                    if (bcpList.Count() == 0)
                    {
                        throw new Exception("未划分对应的区域 查看这个产线是否在半成品区域表进行配置 并启用");
                    }
                    if (hojs.N_CURRENT_NUM == 0)//上托盘 否则下托盘
                    {
                        //上托盘 空框
                        var jcjykk = bcpList.FindAll(e => e.S_CNTR_TYPE == "空托").OrderByDescending(g => g.N_PRI).ToList();
                        var AreaList = jcjykk.Select(e => e.S_AREA_CODE).Distinct().ToList();
                        foreach (var Area in AreaList)
                        {
                            var Row = jcjykk.FindAll(f => f.S_AREA_CODE == Area).Select(e => e.N_ROW).Distinct().ToList();
                            //过算法 计算起点
                            var staList = GetOutWork(Area, Row);
                            if (staList.Any())
                            {
                                foreach (var item in jcjykk)
                                {
                                    Location sta = null;
                                    var staLisL = staList.FindAll(e => e.S_AREA_CODE == item.S_AREA_CODE && e.N_ROW == item.N_ROW).ToList();
                                    if (staLisL.Any())
                                    {
                                        sta = staLisL.OrderByDescending(e => e.N_COL).First();
                                    }
                                    if (sta != null)
                                    {
                                        staBit = sta;
                                        break;
                                    }
                                }
                            }
                        }
                        if (staBit != null)
                        {
                            var _ctrl = LocationHelper.GetLocCntrRel(staBit.S_LOC_CODE);
                            int StaLayer = staBit.N_CURRENT_NUM;
                            var carryCntrs = new List<string> { _ctrl.FirstOrDefault().S_CNTR_CODE };//DateTime.Now.ToString("yyMMddHHmmss") };
                            var bb = TaskProcess.CreateTransport(workOrder.SQL_WorkNo, staBit.S_LOC_CODE, location, "注塑空拖-出库", carryCntrs, StaLayer, 1, carryCntrs.Count, plc.taskPri);
                            if (bb)
                            {
                                SentTask = true;
                            }
                        }
                        if (SentTask)
                        {
                            return SentTask;
                        }
                    }
                    else
                    {
                        var time = LocationHelper.GetT_FULL_TIME(location);
                        LogHelper.Info(location + ":托盘放置时间:(" + time + ") 货位托盘数量(" + hojs.N_CURRENT_NUM + ")");
                        if (DateTime.Now.Subtract(time ?? DateTime.Now).TotalMinutes < 1)
                        {
                            for (var i = 0; i < plc.location.Length; i++)
                            {
                                if (location == plc.location[i])
                                {
                                    PlcHelper.SendHex(plc.address, "3F00" + (i + 1) + "0" + "0d0a");
                                    break;
                                }
                            }
                            return false;
                        }
                        LocCntrRel _clrel = LocationHelper.GetLocCntrRel(hojs.S_LOC_CODE).FirstOrDefault();
                        //上托盘 满框
                        var jcjykk = bcpList.FindAll(e => e.S_CNTR_TYPE == "满托").OrderByDescending(g => g.N_PRI).ToList();
                        var AreaList = jcjykk.Select(e => e.S_AREA_CODE).Distinct().ToList();
                        //过算法 计算起点
                        foreach (var Area in AreaList)
                        {
                            var Row = jcjykk.Select(e => e.N_ROW).Distinct().ToList();
                            var EndList = GetInWork(Area, Row, true, workOrder.SQL_ItemCode);
                            if (EndList.Any())
                            {
                                foreach (var item in jcjykk)
                                {
                                    Location End = null;
                                    var EndListT = EndList.FindAll(e => e.S_AREA_CODE == item.S_AREA_CODE && e.N_ROW == item.N_ROW).ToList();
                                    if (EndListT.Count() > 0)
                                    {
                                        End = EndListT.OrderBy(e => e.N_COL).First();
                                    }
                                    if (End != null)
                                    {
                                        endBit = End;
                                        break;
                                    }
                                }
                            }
                        }
                        if (endBit != null)
                        {
                            var _ctrl = LocationHelper.GetLocCntrRel(location);
                            List<CntrItemRel> RItem = new List<CntrItemRel>();
                            foreach (var item in _ctrl)
                            {
                                var r = new CntrItemRel
                                {
                                    S_CNTR_CODE = item.S_CNTR_CODE,
                                    S_ITEM_CODE = workOrder.SQL_ItemCode,
                                    S_ITEM_NAME = workOrder.SQL_ItemName,
                                    F_QTY = workOrder.SQL_UsingNowTotal,
                                    S_ORDER_NO = workOrder.SQL_WorkNo,
                                    S_BATCH_NO = workOrder.SQL_BatchNo
                                };
                                RItem.Add(r);
                                var cntrrel = ContainerHelper.GetCntrItemRel(item.S_CNTR_CODE).FirstOrDefault();
                                if (cntrrel != null)
                                {
                                    newDb.Deleteable<CntrItemRel>().Where(it => it.S_ID.Trim() == cntrrel.S_ID.Trim()).ExecuteCommand();
                                }
                            }
                            var ggf = newDb.Insertable(RItem).ExecuteCommand();
                            if (ggf > 0)
                            {
                                int endLayer = endBit.N_CURRENT_NUM + 1;
                                var carryCntrs = new List<string> { _ctrl.FirstOrDefault().S_CNTR_CODE };//DateTime.Now.ToString("yyMMddHHmmss") };
                                var bb = TaskProcess.CreateTransport(workOrder.SQL_WorkNo, location, endBit.S_LOC_CODE, "注塑满托-入库", carryCntrs, 1, endLayer, carryCntrs.Count, plc.taskPri);
                                if (bb)
                                {
                                    SentTask = true;
                                    //触发自动解绑
                                    //var zdjb = jcjykk.FindAll(e => e.SQL_UsingNow == "Y").OrderByDescending(g => g.N_PRI).ToList();
                                    //foreach (var item in zdjb)
                                    //{
                                    //}
                                    //var Jb = newDb.Queryable<Location>().Where(e => e.S_AREA_CODE == Area && Row.Contains(e.N_ROW)).ToList();
                                    ////查询第一排是否满 并且第二排入满三个后解绑第一排
                                    ////1.查询第一排是否有空货位 有 则跳过
                                }
                            }
                        }
                        if (SentTask)
                        {
                            return SentTask;
                        }
                    }
                    return true;
                }
            }
            catch (Exception ex)
            {
                LogHelper.Info(plc.deviceName + $" 报错: {ex.Message}");
                return false;
            }
        }
        /// <summary>
        /// 瓶坯算法--出库
        /// </summary>
        /// <param name="AreaCode"></param>
        /// <param name="Row"></param>
        /// <param name="ItemCode"></param>
        /// <returns></returns>
        public static List<Location> GetOutWork(string AreaCode, List<int> Row, bool InOutLock = true, string ItemCode = "")
        {
            var lstCanOutL = new List<Location>();
            try
            {
                var chi = new SqlHelper<object>().GetInstance();
                var newDb = chi.CopyNew();
                var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
                if (string.IsNullOrEmpty(ItemCode))//算空托
                {
                    ca.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && string.IsNullOrEmpty(t.S_ITEM_CODE) && o.S_AREA_CODE == AreaCode);
                    ca.AndIF(Row.Count() > 0, (o, p, t) => Row.Contains(o.N_ROW));
                    lstCanOutL = newDb.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).LeftJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).ToList();
                }
                else//算满托
                {
                    ca.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == ItemCode && o.S_AREA_CODE == AreaCode);
                    ca.AndIF(Row.Count() > 0, (o, p, t) => Row.Contains(o.N_ROW));
                    lstCanOutL = newDb.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).ToList();
                }
                //地堆专门算法过滤
                if (lstCanOutL.Count() > 0)
                {
                    var Inloca = Expressionable.Create<Location>();
                    Inloca.And(it => it.S_AREA_CODE == AreaCode);
                    Inloca.AndIF(Row.Count() > 0, o => Row.Contains(o.N_ROW));
                    var locationInLock = newDb.Queryable<Location>().Where(Inloca.ToExpression()).ToList();
                    //空间锁 排除一整排
                    var KjLick = locationInLock.FindAll(e => e.S_LOCK_STATE == "空间锁").ToList();
                    if (KjLick.Count() > 0)
                    {
                        foreach (var item in KjLick)
                        {
                            lstCanOutL.RemoveAll(e => e.S_AREA_CODE == item.S_AREA_CODE && e.N_ROW == item.N_ROW);
                        }
                    }
                    if (InOutLock)
                    {
                        var CkLick = locationInLock.FindAll(e => e.S_LOCK_STATE == "出库锁").ToList();
                        if (CkLick.Count() > 0)
                        {
                            foreach (var item in CkLick)
                            {
                                lstCanOutL.RemoveAll(e => e.S_AREA_CODE == item.S_AREA_CODE && e.N_ROW == item.N_ROW);
                            }
                        }
                        var OutLick = locationInLock.FindAll(e => e.S_LOCK_STATE == "入库锁").ToList();
                        if (OutLick.Count() > 0)
                        {
                            foreach (var item in OutLick)
                            {
                                lstCanOutL.RemoveAll(e => e.S_AREA_CODE == item.S_AREA_CODE && e.N_ROW == item.N_ROW);
                            }
                        }
                    }
                }
                return lstCanOutL;
            }
            catch (Exception ex)
            {
                LogHelper.Info("瓶坯算法" + $" 报错: {ex.Message}");
                return lstCanOutL;
            }
        }
        /// <summary>
        /// 瓶坯算法--入库
        /// </summary>
        /// <param name="AreaCode"></param>
        /// <param name="Row"></param>
        /// <param name="ItemCode"></param>
        /// <returns></returns>
        public static List<Location> GetInWork(string AreaCode, List<int> Row, bool InOutLock = true, string ItemCode = "")
        {
            var lstCanOutL = new List<Location>();
            try
            {
                lock (lockoIn)
                {
                    var chi = new SqlHelper<object>().GetInstance();
                    var newDb = chi.CopyNew();
                    var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
                    ca.And((o, p, t) => o.N_CURRENT_NUM == 0 && o.S_LOCK_STATE == "无" && string.IsNullOrEmpty(p.S_CNTR_CODE) && string.IsNullOrEmpty(t.S_ITEM_CODE) && o.S_AREA_CODE == AreaCode);
                    ca.AndIF(Row.Count() > 0, (o, p, t) => Row.Contains(o.N_ROW));
                    lstCanOutL = newDb.Queryable<Location>().LeftJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).LeftJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).ToList();
                    var Inloca = Expressionable.Create<Location>();
                    Inloca.And(it => it.S_AREA_CODE == AreaCode);
                    Inloca.AndIF(Row.Count() > 0, o => Row.Contains(o.N_ROW));
                    var locationInLock = newDb.Queryable<Location>().Where(Inloca.ToExpression()).ToList();
                    //地堆专门算法过滤
                    if (lstCanOutL.Count() > 0)
                    {
                        //空间锁 排除一整排
                        var KjLick = locationInLock.FindAll(e => e.S_LOCK_STATE == "空间锁").ToList();
                        if (KjLick.Count() > 0)
                        {
                            foreach (var item in KjLick)
                            {
                                lstCanOutL.RemoveAll(e => e.S_AREA_CODE == item.S_AREA_CODE && e.N_ROW == item.N_ROW);
                            }
                        }
                        //获取指定库区 指定排 满的货位 然后排除 比最大列还小的空货位
                        var Mhw = locationInLock.FindAll(e => e.N_CURRENT_NUM > 0).ToList();
                        if (Mhw.Count() > 0)
                        {
                            var RowLis = Mhw.GroupBy(e => e.N_ROW).Select(f => f.First()).ToList();
                            foreach (var item in RowLis)
                            {
                                var MaxCol = Mhw.FindAll(e => e.N_ROW == item.N_ROW).OrderByDescending(c => c.N_COL).FirstOrDefault();
                                if (MaxCol != null)
                                {
                                    lstCanOutL.RemoveAll(e => e.S_AREA_CODE == item.S_AREA_CODE && e.N_ROW == item.N_ROW && e.N_COL < MaxCol.N_COL);
                                }
                            }
                            //排除别的物料所在的排
                            if (!string.IsNullOrEmpty(ItemCode))
                            {
                                var fzRow = Mhw.Select(e => e.N_ROW).Distinct().ToList();
                                foreach (var item in fzRow)
                                {
                                    var mtlo = Mhw.FindAll(e => e.N_ROW == item).FirstOrDefault();
                                    if (mtlo != null)
                                    {
                                        var _clrel = LocationHelper.GetLocCntrRel(mtlo.S_LOC_CODE).FirstOrDefault();
                                        if (_clrel != null)
                                        {
                                            var cntritems = ContainerHelper.GetCntrItemRel(_clrel.S_CNTR_CODE).FirstOrDefault();
                                            if (cntritems != null)
                                            {
                                                if (cntritems.S_ITEM_CODE != ItemCode)
                                                {
                                                    lstCanOutL.RemoveAll(e => e.S_AREA_CODE == mtlo.S_AREA_CODE && e.N_ROW == mtlo.N_ROW);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        if (InOutLock)
                        {
                            var CkLick = locationInLock.FindAll(e => e.S_LOCK_STATE == "出库锁").ToList();
                            if (KjLick.Count() > 0)
                            {
                                foreach (var item in KjLick)
                                {
                                    lstCanOutL.RemoveAll(e => e.S_AREA_CODE == item.S_AREA_CODE && e.N_ROW == item.N_ROW);
                                }
                            }
                            var OutLick = locationInLock.FindAll(e => e.S_LOCK_STATE == "入库锁").ToList();
                            if (KjLick.Count() > 0)
                            {
                                foreach (var item in KjLick)
                                {
                                    lstCanOutL.RemoveAll(e => e.S_AREA_CODE == item.S_AREA_CODE && e.N_ROW == item.N_ROW);
                                }
                            }
                        }
                    }
                    return lstCanOutL;
                }
            }
            catch (Exception ex)
            {
                LogHelper.Info("瓶坯算法" + $" 报错: {ex.Message}");
                return lstCanOutL;
            }
        }
@@ -2721,7 +3123,6 @@
            //就查看有没有空的排了。 
            //if (endBit != null) ///  寻找未满排, 直接返回结果。 
            return endBit;
        //LogHelper.Info(" _tempList over!");
        //这里开始 寻找空排
        Empty:
@@ -3492,26 +3893,27 @@
                                        }
                                    if (endBit == null && _tempList.Any())
                                    {
                                        LogHelper.Info(" ar_RplaceRow over!");
                                        var ar_RplaceRows = LocationHelper.GetLocList(x => x.S_AREA_CODE != area1 && x.S_AREA_CODE.Contains(are) && x.S_LOCK_STATE != "报废");//.Select(x => x.N_ROW).Distinct();
                                                                                                                                                                            //var ar_RplaceRow1 = ar_RplaceRows.FindAll(x => x.S_LOCK_STATE != "无").Select(x => x.N_ROW).Distinct();
                                        IEnumerable<int> ar_RplaceRow1 = ar_RplaceRows.FindAll(x => "入库锁;出库锁".Contains(x.S_LOCK_STATE?.Trim())).Select(x => x.N_ROW).Distinct();
                                        LogHelper.Info(" 有锁排 - " + JsonConvert.SerializeObject(ar_RplaceRow1));                                                                                        //LogHelper.Info(" 有锁排 - " + JsonConvert.SerializeObject(ar_RplaceRow1));
                                        var ar_RplaceRow2 = ar_RplaceRows.FindAll(x => x.N_CURRENT_NUM > 0).Select(x => x.N_ROW).Distinct();
                                        LogHelper.Info(" 有货排: - " + JsonConvert.SerializeObject(ar_RplaceRow2));
                                        var ar_RplaceRow_rowlock = LocationHelper.GetRowLock(x => x.S_AREA_CODE.Contains(are))?.Select(x => x.N_ROW);
                                        LogHelper.Info(" ar_RplaceRow over!" + JsonConvert.SerializeObject(_tempList.Select(x => x.N_ROW).Distinct()));
                                        //var ar_RplaceRows = LocationHelper.GetLocList(x => x.S_AREA_CODE != area1 && x.S_AREA_CODE.Contains(are) && x.S_LOCK_STATE != "报废");//.Select(x => x.N_ROW).Distinct();
                                        //                                                                                                                                    //var ar_RplaceRow1 = ar_RplaceRows.FindAll(x => x.S_LOCK_STATE != "无").Select(x => x.N_ROW).Distinct();
                                        //IEnumerable<int> ar_RplaceRow1 = ar_RplaceRows.FindAll(x => "入库锁;出库锁".Contains(x.S_LOCK_STATE?.Trim())).Select(x => x.N_ROW).Distinct();
                                        //LogHelper.Info(" 有锁排 - " + JsonConvert.SerializeObject(ar_RplaceRow1));                                                                                        //LogHelper.Info(" 有锁排 - " + JsonConvert.SerializeObject(ar_RplaceRow1));
                                        //var ar_RplaceRow2 = ar_RplaceRows.FindAll(x => x.N_CURRENT_NUM > 0).Select(x => x.N_ROW).Distinct();
                                        //LogHelper.Info(" 有货排: - " + JsonConvert.SerializeObject(ar_RplaceRow2));
                                        //var ar_RplaceRow_rowlock = LocationHelper.GetRowLock(x => x.S_AREA_CODE.Contains(are))?.Select(x => x.N_ROW);
                                        var ar_RplaceRow = ar_RplaceRow1.Concat(ar_RplaceRow2).Concat(ar_RplaceRow_rowlock).Distinct();
                                        //var ar_RplaceRow = ar_RplaceRow1.Concat(ar_RplaceRow2).Concat(ar_RplaceRow_rowlock).Distinct();
                                        if (ar_RplaceRow.Any())
                                        {
                                            LogHelper.Info("排除非空排 - " + JsonConvert.SerializeObject(ar_RplaceRow));
                                            _tempList.RemoveAll(x => ar_RplaceRow.Contains(x.N_ROW));
                                        }
                                        if (_tempList.Any())//三个库区的交集空排
                                        {
                                            endBit = _tempList.OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault();
                                        }
                                        //if (ar_RplaceRow.Any())
                                        //{
                                        //    LogHelper.Info("排除非空排 - " + JsonConvert.SerializeObject(ar_RplaceRow));
                                        //    _tempList.RemoveAll(x => ar_RplaceRow.Contains(x.N_ROW));
                                        //}
                                        //if (_tempList.Any())//三个库区的交集空排
                                        //{
                                        //    endBit = _tempList.OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault();
                                        //}
                                        endBit = _tempList.OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault();
                                    }
                                    #endregion