1
pulg
2025-07-01 9db9cd04a1a9971220438ccb856a6896b4a399ac
HH.WCS.QingXiNongfu/core/Monitor.cs
@@ -1026,6 +1026,8 @@
        static List<string> ABlist = new List<string> { "YWLAQWJ", "YWLBQWJ" };
        static List<string> CDlist = new List<string> { "YWLCQSX", "YWLDQWJ" };
        static bool InworkLock = false;
        //Dictionary<string, List<RowLock>> RGRowList = new Dictionary<string, List<RowLock>>();
        public static List<RowLock> RGRow = new List<RowLock>();
        /// <summary>
        /// 原材料 检测各流转位置。  写入托盘货位s_type 中 下一个目的地。就开始中转。
        /// 原物料纸箱,入库堆叠区转运 YWLRGDD--人工堆叠区
@@ -1043,6 +1045,7 @@
            {
                try
                {
                    var lolist = LocationHelper.GetAreaNormalLocList(area);// LocationHelper.GetList<Location>(x => x.S_AREA_CODE == area && x.S_LOCK_STATE != "报废");
                    var lgrow = lolist.GroupBy(x => x.N_ROW).OrderBy(x => x.Key);
                    Dictionary<string, List<Location>> dsll = new Dictionary<string, List<Location>>();
@@ -1063,6 +1066,8 @@
                            if (!cntritems.Any())
                                continue;
                            var cir1 = cntritems.First();
                            //只筛选纸箱物料的库区数据。
                            if (!string.IsNullOrEmpty(cir1.S_ITEM_NAME) && cir1.S_ITEM_NAME.Contains("纸箱-"))
                                if (dsll.TryGetValue(cir1.S_ITEM_CODE, out List<Location> ll))
@@ -1123,12 +1128,33 @@
                                        if (ABlist.Contains(EdnRarea))
                                        {
                                            var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁" || x.S_LOCK_STATE == "出库锁"));
                                            if (ls.Any())
                                            //var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁"));
                                            if (ls.Count() > 1)
                                            {
                                                LogHelper.Info($"{EdnRarea}任务数1管制2");
                                                continue;
                                            }
                                        }
                                        if (CDlist.Contains(EdnRarea))
                                        {
                                            var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && x.S_LOCK_STATE == "入库锁");
                                            //var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁"));
                                            if (ls.Count() > 2)
                                            {
                                                LogHelper.Info($"{EdnRarea}任务数1管制3");
                                                continue;
                                            }
                                        }
                                        //else if (CDlist.Contains(EdnRarea))
                                        //{
                                        //    var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁")).ToList();
                                        //    if (ls.Count() > 2)
                                        //    {
                                        //        LogHelper.Info($"CD区入库任务管制最大数3 {EdnRarea}");
                                        //        continue;
                                        //    }
                                        //}
                                        var cntritems = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE);
                                        if (!cntritems.Any())
                                            continue;
@@ -1167,17 +1193,19 @@
                                            if (CDlist.Contains(EdnRarea))
                                            {
                                                isCd = true;
                                                inlockLis = LocationHelper.GetList<RowLock>(x => x.S_AREA_CODE == EdnRarea && x.S_LOCK_SRC == cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME && x.S_LOCK_STATE == "入库锁").ToList();
                                                if (inlockLis.Count() > 0)
                                                {
                                                    inlock = inlockLis.FirstOrDefault();
                                                }
                                                //inlockLis = LocationHelper.GetList<RowLock>(x => x.S_AREA_CODE == EdnRarea && x.S_LOCK_SRC == cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME && x.S_LOCK_STATE == "入库锁").ToList();
                                                //if (inlockLis.Count() > 0)
                                                //{
                                                //    inlock = inlockLis.FirstOrDefault();
                                                //}
                                                inlock = RGRow.FirstOrDefault();
                                                if (inlock != null)
                                                {
                                                    //当入库的任务能放满一排并且还有余的时候 开第二排
                                                    //先判断起点有多少相同的 能入的物料
                                                    if (_cl.S_AREA_CODE == "YWLRGDD")//判断起点是否是人工堆叠区
                                                    {
                                                        inlockLis = RGRow.FindAll(e => e.S_AREA_CODE == EdnRarea && e.S_LOCK_SRC == cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME).ToList();
                                                        //然后判断人工堆叠区需要入库多少托同品种物料 startMum
                                                        //货位 托盘 物料表联查
                                                        LogHelper.Info($"查起点有多少同品种的物料 开始");
@@ -1187,6 +1215,7 @@
                                                        LogHelper.Info($"起点要入CD的有多少托盘数量为{lstCanOutL.Count()}");
                                                        //判断终点排能入多少  少于入库托盘数则多开一排 EndMum 
                                                        var EndMum = dbll.Queryable<Location>().Where(l => l.S_AREA_CODE == EdnRarea && l.N_CURRENT_NUM == 0 && l.S_LOCK_STATE == "无" && inlockLis.Select(e => e.N_ROW).ToList().Contains(l.N_ROW)).ToList();
                                                        LogHelper.Info($"终点CD排有多少空托能入{lstCanOutL.Count()}");
                                                        if (lstCanOutL.Count <= EndMum.Count())
                                                        {
                                                            arloclist = arloclist.FindAll(x => inlockLis.Select(e => e.N_ROW).ToList().Contains(x.N_ROW)).ToList();
@@ -1202,6 +1231,26 @@
                                                    {
                                                        arloclist = arloclist.FindAll(x => x.N_ROW == inlock.N_ROW).ToList();
                                                    }
                                                }
                                                else
                                                {
                                                    if (_cl.S_AREA_CODE == "YWLRGDD")
                                                    {
                                                        //查询是否有已经入了的排
                                                        var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
                                                        ca.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == cir1.S_ITEM_CODE && t.S_ITEM_NAME == cir1.S_ITEM_NAME && t.S_CJ_NAME == cir1.S_CJ_NAME && o.S_AREA_CODE == EdnRarea);
                                                        var lstCanOutL = dbll.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();
                                                        LogHelper.Info($"终点有相同的物料的货位有{lstCanOutL.Count()}");
                                                        if (lstCanOutL.Count() > 0)
                                                        {
                                                            var EndMum = dbll.Queryable<Location>().Where(l => l.S_AREA_CODE == EdnRarea && l.N_CURRENT_NUM == 0 && l.S_LOCK_STATE == "无" && lstCanOutL.Select(e => e.N_ROW).ToList().Contains(l.N_ROW)).ToList();
                                                            if (EndMum.Count() > 0)
                                                            {
                                                                arloclist = arloclist.FindAll(x => lstCanOutL.Select(e => e.N_ROW).ToList().Contains(x.N_ROW)).ToList();
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                            foreach (var rss in arloclist.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(x => x.Key))
@@ -1267,12 +1316,24 @@
                                                var sign = Settings.GetTimeStamp();
                                                var res = TaskProcess.CreateTransport(sign, _cl.S_LOC_CODE, endbit.S_LOC_CODE, "原物料搬运-纸箱", _clrel.Select(x => x.S_CNTR_CODE).ToList(), 1, endbit.N_CURRENT_NUM + 1, 1, 50, Last);///, EdnRarea == "YWLYLTKQ" ? _clrel0.S_TYPE : "");
                                                LogHelper.Info($"{r.Key}原物料搬运 {sign} 任务 ,创建{res} ");
                                                if (res && inlock == null && isCd)
                                                if (CDlist.Contains(endbit.S_AREA_CODE) && res)
                                                {
                                                    var rrrr = new RowLock { S_LOCK_SRC = cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁", S_AREA_CODE = endbit.S_AREA_CODE, N_ROW = endbit.N_ROW };
                                                    LogHelper.Info($"原物料入库 添加排锁信息{JsonConvert.SerializeObject(rrrr)} ");
                                                    WCSHelper.Do(db => db.Insertable(rrrr).ExecuteCommand());
                                                    LogHelper.Info($"添加内存排锁");
                                                    var ggf = inlockLis.Find(e => e.S_LOCK_SRC == cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME && e.S_AREA_CODE == endbit.S_AREA_CODE && e.N_ROW == endbit.N_ROW);
                                                    LogHelper.Info($"添加内存排锁 是否查询到数据:{JsonConvert.SerializeObject(ggf)}");
                                                    if (ggf == null)
                                                    {
                                                        var rrrr = new RowLock { S_LOCK_SRC = cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁", S_AREA_CODE = endbit.S_AREA_CODE, N_ROW = endbit.N_ROW };
                                                        inlockLis.Add(rrrr);
                                                        LogHelper.Info($"添加内存排锁 添加数据到内存排锁中:{JsonConvert.SerializeObject(inlockLis)}");
                                                    }
                                                }
                                                //if (res && inlock == null && isCd)
                                                //{
                                                //    var rrrr = new RowLock { S_LOCK_SRC = cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁", S_AREA_CODE = endbit.S_AREA_CODE, N_ROW = endbit.N_ROW };
                                                //    LogHelper.Info($"原物料入库 添加排锁信息{JsonConvert.SerializeObject(rrrr)} ");
                                                //    WCSHelper.Do(db => db.Insertable(rrrr).ExecuteCommand());
                                                //}
                                                if (EdnRarea == "YWLWJJB") InworkLock = false;
                                                break;
                                            }
@@ -1367,12 +1428,20 @@
                                           S_NOTE = cir.S_ITEM_CODE.Trim() + "&" + cir.S_ITEM_NAME.Trim(),
                                           S_ITEM_CODE = cir.S_ITEM_CODE,
                                           S_ITEM_NAME = cir.S_ITEM_NAME,
                                           S_BATCH_NO = cir.S_BATCH_NO,
                                           S_CJ_NAME = cir.S_CJ_NAME,
                                           S_CNTR_CODE = cir.S_CNTR_CODE
                                       })
                                       .ToList();
            /// 人工堆叠区纸箱 和 标签 是按标识+物料筛选进行入库转运。 
            /// 物料名称包含对应种类进行入库。
            foreach (var item in locsFirstA)
            {
                if (!string.IsNullOrEmpty(item.S_BATCH_NO))
                {
                    item.S_NOTE = item.S_NOTE + "&" + item.S_BATCH_NO;
                }
            }
            var locsFirst = locsFirstA.FindAll(x => x.S_NOTE.Contains("标签-") && x.S_TYPE == WJ_BQ.RK_BBHJQ);
            var SlocsFirst = locsFirstA.FindAll(x => x.S_NOTE.Contains("标签-") && x.S_TYPE == SX_BQ.RK_BBHJQ);
            var TKlocsFirst = locsFirstA.FindAll(x => x.S_NOTE.Contains("提扣-"));
@@ -1389,6 +1458,7 @@
            {
                try
                {
                    // var yuworders = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == "无菌标签出库" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => x.TagOverTime).ToList();
                    var yuworders = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == "无菌标签出库" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => x.TagOverTime).ToList();
                    if (!yuworders.Any())
                    {
@@ -1422,12 +1492,12 @@
                    var tklist = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == pline && x.WorkType == 1 && x.SQL_State == "执行中");
                    if (!Syuworders.Any())
                    {
                        //水线标签入库
                        YwlBQ_CreInwork(SlocsFirst, SX_BQ.RK_BQDDQ, SX_BQ.RK_BBHJQ);
                    }
                    if (tklist.Count() > 0)
                    {
                        var tk = tklist.FirstOrDefault();
                        var loc = LocationHelper.GetLoc(plc.location[0]);
                        if (loc.N_CURRENT_NUM > 0 && loc.S_LOCK_STATE == "无")
                        {
@@ -1440,6 +1510,8 @@
                                    LogHelper.CErrorLog($"{tk.SQL_WorkNo}-{tk.SQL_PLineNo} 退库工单开启,绑定的 零整 标记");
                                }
                                Location Endbit = null;
                                //  var hjs = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == SX_BQ.RK_BBHJQ).FindAll(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0);
                                //  var hjs = db.Queryable<Location>().Where(l => l.S_AREA_CODE == SX_BQ.RK_BBHJQ && l.S_LOCK_STATE.Trim() == "无").ToList();
                                var hjs = LocationHelper.GetAreaNormalLocList(SX_BQ.RK_BBHJQ, true, false);
                                Endbit = hjs.FindAll(x => x.N_LAYER == (s_type == .5 ? 1 : (s_type == .75 ? 2 : 3))).OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault();
                                if (Endbit != null)
@@ -1479,10 +1551,10 @@
                {
                    //return;
                    ///起点数据。  终点库区 堆叠层数。
                    YwlPETK_CreInwork(PElocsFirst, "YWLTKMKQ", "提扣叉运", 3);//提扣入库--PE膜
                    YwlPETK_CreInwork(TKlocsFirst, "YWLTKMKQ", "收缩膜叉运", 1); // PE入库 --提扣
                    //YwlPETKtkOrder("YWLZSXBKQ", "YWLTKMKQ", "收缩膜叉运");
                    //YwlPETKOutOrder("YWLTKMKQ", "YWLZSXBKQ", "收缩膜叉运");// PE中出库
                    YwlPETK_CreInwork(PElocsFirst, "YWLTKMKQ", "收缩膜叉运", 2);//PE膜
                    YwlPETK_CreInwork(TKlocsFirst, "YWLTKMKQ", "提扣叉运", 1); //提扣
                                                                           //YwlPETKtkOrder("YWLZSXBKQ", "YWLTKMKQ", "收缩膜叉运");
                                                                           //YwlPETKOutOrder("YWLTKMKQ", "YWLZSXBKQ", "收缩膜叉运");// PE中出库
                    var tklist = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == "T2提升机-收缩膜" && x.WorkType == 1 && x.SQL_State == "执行中");
                    if (tklist.Count() > 0)
@@ -1514,6 +1586,7 @@
                                string v = "YWLTKMKQ";
                                var rklist = LocationHelper.GetRowLock(v);
                                int hof = (s_type == .5 ? 1 : (s_type == .75 ? 2 : 3));
                                var inlock = rklist.Find(x => x.S_LOCK_SRC == (cir.S_ITEM_CODE.Trim() + "&" + cir.S_ITEM_NAME.Trim() + hof) && x.S_LOCK_STATE.Contains("入库锁"));
                                Location EndBit = null;
                                var NormalList = LocationHelper.GetAreaNormalLocList(v);
@@ -1849,16 +1922,16 @@
                            {
                                var s_type = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE).FirstOrDefault()?.N_BQ_TRAY_TYPE ?? 0;
                                Location Endbit = null;
                                if (area == area/* WJ_BQ.RK_BQJBQ*/)
                                //if (area == area/* WJ_BQ.RK_BQJBQ*/)
                                //{
                                var hjs = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BBHJQ, true, false);
                                Endbit = hjs.FindAll(x => x.N_CURRENT_NUM == 0 && x.N_LAYER == (s_type == .5 ? 1 : (s_type == .75 ? 2 : 3))).OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault();
                                if (Endbit != null)
                                {
                                    var hjs = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BBHJQ, true, false);
                                    Endbit = hjs.FindAll(x => x.N_CURRENT_NUM == 0 && x.N_LAYER == (s_type == .5 ? 1 : (s_type == .75 ? 2 : 3))).OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault();
                                    if (Endbit != null)
                                    {
                                        var re = TaskProcess.CreateTransport("", lastfull.S_LOC_CODE.Trim(), Endbit.S_LOC_CODE, "标签叉运-线边标签退库", CNTR.Select(x => x.S_CNTR_CODE).ToList(), 1, 1, 1, 62);
                                        LogHelper.CSucessLog($"from {lastfull.S_LOC_CODE} to {Endbit.S_LOC_CODE} 标签叉运-接驳标签退库 ,创建{re}");
                                    }
                                    var re = TaskProcess.CreateTransport("", lastfull.S_LOC_CODE.Trim(), Endbit.S_LOC_CODE, "标签叉运-线边标签退库", CNTR.Select(x => x.S_CNTR_CODE).ToList(), 1, 1, 1, 62);
                                    LogHelper.CSucessLog($"from {lastfull.S_LOC_CODE} to {Endbit.S_LOC_CODE} 标签叉运-接驳标签退库 ,创建{re}");
                                }
                                // }
                                //else
                                //{
@@ -2065,7 +2138,6 @@
            }
        }
        /// <summary>
        /// 入库退库。 知道 零头满托。正常匹配。
        /// </summary>
@@ -2079,9 +2151,11 @@
            foreach (var ptR in klocsFirst.GroupBy(x => x.N_ROW).OrderBy(x => x.Key))
            {
                Location EndBit = null;
                var rsfull = ptR.OrderBy(X => X.N_COL).ToList().FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault();
                var ptrlist = ptR.OrderBy(X => X.N_COL).ToList();
                var rsfull = ptrlist.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault();
                if (rsfull != null)
                {
                    var cntrlist = ptrlist.FindAll(x => x.S_LOC_CODE == rsfull.S_LOC_CODE).Select(x => x.S_CNTR_CODE);
                    var rklist = LocationHelper.GetRowLock(v);
                    var inlock = rklist.Find(x => x.S_AREA_CODE == v && x.S_LOCK_SRC == (rsfull.S_NOTE + rsfull.HalfOrFull) && x.S_LOCK_STATE.Contains("入库锁"));
                    var NormalList = LocationHelper.GetAreaNormalLocList(v);
@@ -2093,7 +2167,7 @@
                        {
                            var srloclist = rs.OrderBy(x => x.N_COL).ToList();
                            var lastfull = srloclist.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault();
                            EndBit = srloclist.Find(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM < Math.Min(x.N_CAPACITY, v1) && x.S_LOCK_STATE != "报废" && x.N_COL >= (lastfull?.N_COL ?? 0));
                            EndBit = srloclist.Find(x => x.S_LOCK_STATE == "无" && (x.N_CURRENT_NUM + cntrlist.Count()) <= Math.Min(x.N_CAPACITY, v1) && x.S_LOCK_STATE != "报废" && x.N_COL >= (lastfull?.N_COL ?? 0));
                            if (EndBit != null)
                                break;
                        }
@@ -2109,7 +2183,7 @@
                    }
                    if (EndBit != null)
                    {
                        var res = TaskProcess.CreateTransport("", rsfull.S_LOC_CODE.Trim(), EndBit.S_LOC_CODE, v2 + "-入库", new List<string> { rsfull.S_CNTR_CODE }, rsfull.N_CURRENT_NUM, EndBit.N_CURRENT_NUM + 1, 1, 62);
                        var res = TaskProcess.CreateTransport("", rsfull.S_LOC_CODE.Trim(), EndBit.S_LOC_CODE, v2 + "-入库", cntrlist.ToList(), rsfull.N_CURRENT_NUM + 1 - cntrlist.Count(), EndBit.N_CURRENT_NUM + 1, 1, 62);
                        LogHelper.CSucessLog($"from {rsfull.S_LOC_CODE} to {EndBit.S_LOC_CODE} {(v2 + "-入库")} ,创建{res} ");
                        if (res && inlock == null)
@@ -2140,6 +2214,7 @@
                }
            }
        }
        private static void YwlBQ_CreSXOutOrder(Settings.deviceInfo plc, List<YWLWorkOrder> yuworders)
        {
@@ -3670,22 +3745,28 @@
                            //查询可用货位有多少
                            List<string> Ky = new List<string>() { "无", "出库锁", "入库锁" };
                            var loclistK = loclist.FindAll(x => Ky.Contains(x.S_LOCK_STATE)).Count();
                            var count = loclist.FindAll(x => x.N_CURRENT_NUM > 0 && x.S_LOCK_STATE == "无").Sum(x => x.N_CURRENT_NUM);
                            var count = loclist.FindAll(x => x.N_CURRENT_NUM > 0 && x.S_LOCK_STATE == "无").Count();
                            LogHelper.Info("AutoRun13TSJ" + $"od.S_ROW 出库余量判断是否需要转运。-{count}< 总共能用的货位数{loclistK} -7");
                            if (count <= loclistK - 7)
                            {
                                LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}对应工单的{od.S_ROW} 物料数量不足。触发转运。");
                                // 先看是否有到该库区的转运任务。 
                                var zxs = LocationHelper.GetList<YWLZXtake>(X => X.S_ZX_STATE == "执行" && X.S_END_AREA == od.S_ROW);
                                //1.查看物料是否匹配。
                                var itemTRUN = zxs.Any(x => x.S_ITEM_CODE == od.SQL_ItemCode && x.S_ITEM_NAME == od.SQL_ItemName && x.S_CJ_NAME == od.S_CJ_NAME);
                                if (itemTRUN)
                                {  //有到该库区的 物料转运任务了。 不需要继续了 。
                                var zxs = LocationHelper.GetList<YWLZXtake>(X => X.S_ZX_STATE == "执行" && X.S_END_AREA == od.S_ROW).ToList();
                                //查询是否有重复的工单在执行
                                var ggf = zxs.Find(x => x.S_ITEM_CODE == od.SQL_ItemCode && x.S_ITEM_NAME == od.SQL_ItemName);
                                if (ggf != null)
                                {
                                    LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}已经存在转运了无需触发转运。");
                                    return;
                                    continue;
                                }
                                //1.查看物料是否匹配。
                                //var itemTRUN = zxs.Any(x => x.S_ITEM_CODE == od.SQL_ItemCode && x.S_ITEM_NAME == od.SQL_ItemName && x.S_CJ_NAME == od.S_CJ_NAME);
                                //if (itemTRUN)
                                //{  //有到该库区的 物料转运任务了。 不需要继续了 。
                                //    LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}已经存在转运了无需触发转运。");
                                //    return;
                                //}
                                //人工转运没指定物料,我会自动写回转运单 物料数据。
                                //找CD 区 哪里有这个物料。 
@@ -3696,17 +3777,21 @@
                                    //ca.And((o, p, t) => o.S_AREA_CODE == area && o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == od.SQL_ItemCode && t.S_ITEM_NAME == od.SQL_ItemName && t.S_CJ_NAME == od.S_CJ_NAME);
                                    var 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((o, p, t) => o.S_AREA_CODE == area && o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == od.SQL_ItemCode && t.S_ITEM_NAME == od.SQL_ItemName && t.S_CJ_NAME == od.S_CJ_NAME).ToList();
                                    List<string> CRk = new List<string>() { "出库锁", "入库锁" };
                                    var EndMum = newDb.Queryable<Location>().Where(l => l.S_AREA_CODE == area && CRk.Contains(l.S_LOCK_STATE)).ToList();
                                    var RowLock = EndMum.GroupBy(e => e.N_ROW).Select(f => f.First()).ToList();
                                    foreach (var item in RowLock)
                                    if (!lstCanOutL.Any())
                                    {
                                        lstCanOutL.RemoveAll(e => e.N_ROW == item.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((o, p, t) => o.S_AREA_CODE == area && o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == od.SQL_ItemCode && t.S_ITEM_NAME == od.SQL_ItemName).ToList();
                                    }
                                    //List<string> CRk = new List<string>() { "出库锁", "入库锁" };
                                    //var EndMum = newDb.Queryable<Location>().Where(l => l.S_AREA_CODE == area && CRk.Contains(l.S_LOCK_STATE)).ToList();
                                    //var RowLock = EndMum.GroupBy(e => e.N_ROW).Select(f => f.First()).ToList();
                                    //foreach (var item in RowLock)
                                    //{
                                    //    lstCanOutL.RemoveAll(e => e.N_ROW == item.N_ROW);
                                    //}
                                    if (lstCanOutL.Count() > 0)
                                    {
                                        var LstCan = newDb.Queryable<LocCntrRel>().Where(a => lstCanOutL.Select(e => e.S_LOC_CODE).ToList().Contains(a.S_LOC_CODE)).ToList();
                                        var loc = lstCanOutL.Find(e => e.S_LOC_CODE == LstCan.OrderBy(c => c.T_CREATE).FirstOrDefault().S_LOC_CODE);
                                        //var LstCan = newDb.Queryable<LocCntrRel>().Where(a => lstCanOutL.Select(e => e.S_LOC_CODE).ToList().Contains(a.S_LOC_CODE)).ToList();
                                        var loc = lstCanOutL.OrderBy(e => e.T_FULL_TIME).FirstOrDefault();
                                        TrunStart.area = area;
                                        TrunStart.Row = loc.N_ROW;
                                    }
@@ -3726,21 +3811,21 @@
                                }
                                LogHelper.Info($"ZdzyABArea{od.SQL_WorkNo}触发转运。转运来源是{JsonConvert.SerializeObject(TrunStart)}");
                                if (TrunStart?.area != null)
                                    WCSHelper.Do(db =>
                                {
                                    var ggft = new YWLZXtake()
                                    {
                                        db.Insertable(new YWLZXtake
                                        {
                                            S_START_AREA = TrunStart.area,
                                            N_START_ROW = TrunStart.Row,
                                            S_END_AREA = od.S_ROW,
                                            S_ZX_STATE = "执行",
                                            S_ITEM_CODE = od.SQL_ItemCode,
                                            S_ITEM_NAME = od.SQL_ItemName,
                                            S_CJ_NAME = od.S_CJ_NAME,
                                            S_ZZ_AREA = (od.S_ROW == "YWLAQWJ" ? "YWLWJJB" : od.S_ROW)
                                        }).ExecuteCommand();
                                    });
                                        SQL_WorkNo = "CKD" + DateTime.Now.Ticks.ToString(),
                                        S_START_AREA = TrunStart.area,
                                        N_START_ROW = TrunStart.Row,
                                        S_END_AREA = od.S_ROW,
                                        S_ZX_STATE = "执行",
                                        S_ITEM_CODE = od.SQL_ItemCode,
                                        S_ITEM_NAME = od.SQL_ItemName,
                                        S_CJ_NAME = od.S_CJ_NAME,
                                        S_ZZ_AREA = (od.S_ROW == "YWLAQWJ" ? "YWLWJJB" : od.S_ROW)
                                    };
                                    var gf = newDb.Insertable(ggft).ExecuteCommand();
                                }
                            }
                        }
                    }
@@ -3760,6 +3845,7 @@
        /// </summary>
        public static void AutoRun13TSJ()
        {
            //Action<YWLWorkOrder> _sAB没物料或者余量不足开始触发跟根据自动转运_名字越长越好 = (od) =>
            //{
            //    LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}对应工单的{od.S_ROW} 物料数量不足。触发转运。");
@@ -3851,7 +3937,7 @@
                            }
                            if (dsi.TryGetValue(area, out var dictitems1))
                            {
                                foreach (var d in dictitems1.FindAll(x => x.ItemCode == od.SQL_ItemCode && x.ItemName == od.SQL_ItemName && x.S_CJ_NAME == od.S_CJ_NAME))
                                foreach (var d in dictitems1.FindAll(x => x.ItemCode == od.SQL_ItemCode && x.ItemName == od.SQL_ItemName))
                                {
                                    if (Lart == null)
                                        Lart = d;
@@ -3877,29 +3963,77 @@
                                foreach (var area in v) //.Concat(od.S_ROW.Split('$')).Distinct())
                                {
                                    var AreaRowlist = LocationHelper.GetAreaNormalLocList(area);
                                    foreach (var item in AreaRowlist.GroupBy(x => x.N_ROW))
                                    if (ABlist.Contains(area))
                                    {
                                        var rl = item.ToList().FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault();
                                        if (rl == null) continue;
                                        _clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE);
                                        //板型相同
                                        var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First();
                                        LogHelper.Info("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘类型。" + JsonConvert.SerializeObject(_clrel0));
                                        var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault();
                                        LogHelper.Info("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘上的物料信息。" + JsonConvert.SerializeObject(_clcntitem));
                                        if (_clcntitem != null)
                                        //AreaRowlist = LocationHelper.GetAreaNormalLocList(area);YWLBQWJ
                                        //  var AreaRowlist = LocationHelper.GetAreaNormalLocList("YWLAQWJ").Union(LocationHelper.GetAreaNormalLocList("YWLBQWJ")).ToList();
                                        var db = new SqlHelper<object>().GetInstance();
                                        var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
                                        ca.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == od.SQL_ItemCode && t.S_ITEM_NAME == od.SQL_ItemName && (o.S_AREA_CODE == "YWLAQWJ" || o.S_AREA_CODE == "YWLBQWJ"));
                                        var lstCanOutL = db.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)
                                        {
                                            LogHelper.Info("AutoRun13TSJ" + "相互是否匹配 _clcntitem S_ITEM_CODE:" + _clcntitem.S_ITEM_CODE + " od" + od.SQL_ItemCode + " _clcntitem S_ITEM_NAME:" + _clcntitem.S_ITEM_NAME + "od: " + od.SQL_ItemName + " od.S_CJ_NAME:" + od.S_CJ_NAME + "结果:" + (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName && _clcntitem.S_CJ_NAME == od.S_CJ_NAME));
                                            if (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName && _clcntitem.S_CJ_NAME == od.S_CJ_NAME)
                                            var rl = lstCanOutL.OrderBy(e => e.T_FULL_TIME).FirstOrDefault();
                                            _clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE);
                                            //板型相同
                                            var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First();
                                            if (rl != null)
                                            {
                                                StartBit = rl;
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            LogHelper.Info($"AutoRun13TSJ 机台:{pline} 物料编码:{od.SQL_ItemCode}物料名称:{od.SQL_ItemName} AB区缺料");
                                        }
                                        //if (rl == null) continue;
                                        //_clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE);
                                        ////板型相同
                                        //var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First();
                                        //LogHelper.Info("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘类型。" + JsonConvert.SerializeObject(_clrel0));
                                        //var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault();
                                        //LogHelper.Info("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘上的物料信息。" + JsonConvert.SerializeObject(_clcntitem));
                                        //if (_clcntitem != null)
                                        //{
                                        //    LogHelper.Info("AutoRun13TSJ" + "相互是否匹配 _clcntitem S_ITEM_CODE:" + _clcntitem.S_ITEM_CODE + " od" + od.SQL_ItemCode + " _clcntitem S_ITEM_NAME:" + _clcntitem.S_ITEM_NAME + "od: " + od.SQL_ItemName + " od.S_CJ_NAME:" + od.S_CJ_NAME + "结果:" + (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName && _clcntitem.S_CJ_NAME == od.S_CJ_NAME));
                                        //    if (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName)
                                        //    {
                                        //        StartBit = rl;
                                        //        break;
                                        //    }
                                        //}
                                    }
                                    else
                                    {
                                        var AreaRowlist = LocationHelper.GetAreaNormalLocList(area);
                                        foreach (var item in AreaRowlist.GroupBy(x => x.N_ROW))
                                        {
                                            var rl = item.ToList().FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault();
                                            if (rl == null) continue;
                                            _clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE);
                                            //板型相同
                                            var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First();
                                            LogHelper.Info("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘类型。" + JsonConvert.SerializeObject(_clrel0));
                                            var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault();
                                            LogHelper.Info("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘上的物料信息。" + JsonConvert.SerializeObject(_clcntitem));
                                            if (_clcntitem != null)
                                            {
                                                LogHelper.Info("AutoRun13TSJ" + "相互是否匹配 _clcntitem S_ITEM_CODE:" + _clcntitem.S_ITEM_CODE + " od" + od.SQL_ItemCode + " _clcntitem S_ITEM_NAME:" + _clcntitem.S_ITEM_NAME + "od: " + od.SQL_ItemName + " od.S_CJ_NAME:" + od.S_CJ_NAME + "结果:" + (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName && _clcntitem.S_CJ_NAME == od.S_CJ_NAME));
                                                if (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName)
                                                {
                                                    StartBit = rl;
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    if (StartBit != null)
                                    {
                                        break;
                                    }
                                }
                                if (StartBit == null)
                                {
@@ -4065,6 +4199,11 @@
                        if (dsi.TryGetValue(area, out dictitems))
                        {
                            var ill = dictitems.Find(x => x.Row == rl.N_ROW && x.ItemCode == _clcntitem.S_ITEM_CODE && x.ItemName == _clcntitem.S_ITEM_NAME && _clcntitem.S_CJ_NAME == x.S_CJ_NAME);
                            if (ill == null)
                            {
                                ill = dictitems.Find(x => x.Row == rl.N_ROW && x.ItemCode == _clcntitem.S_ITEM_CODE && x.ItemName == _clcntitem.S_ITEM_NAME);
                            }
                            if (ill != null)
                            {
                                if (rl.N_CURRENT_NUM > ill.ItemLayer)
@@ -4106,6 +4245,29 @@
            LogHelper.Info($"AutoRunABD abcd物料汇总完成  >>{ReadCCK}|| {dsi.Count}");
        }
        /// <summary>
        /// 格式化内存排锁
        /// </summary>
        public static void Qchc()
        {
            try
            {
                LogHelper.Info($"内存中的排锁表中的数据" + $"{JsonConvert.SerializeObject(RGRow)}");
                if (RGRow.Count() > 0)
                {
                    var locs = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == "YWLRGDD" && x.S_LOCK_STATE == "出库锁").ToList();
                    if (locs.Count() == 0)
                    {
                        RGRow = new List<RowLock>();
                        LogHelper.Info($"格式化内存中的排锁" + $"{JsonConvert.SerializeObject(RGRow)}");
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Info($"格式化内存中的排锁 失败" + $"{ex.Message}");
            }
        }
        public static void chargeCCD()
        {
            var ods = LocationHelper.GetList<YWLWorkOrder>(x => x.WorkType == 2 && x.SQL_State == "执行中");