pulg
2025-06-23 00cb3bb602369c042efd4af3ea360bbaa1df6721
HH.WCS.QingXiNongfu/core/Monitor.cs
@@ -8,7 +8,6 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web.UI.WebControls.WebParts;
namespace HH.WCS.QingXigongchang.core
{
@@ -96,7 +95,7 @@
                        {
                            if (item.SQL_State != "完成")
                            {
                                ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(), LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault(), "", 0, string.IsNullOrEmpty(item.FROM_NO));
                                ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(), LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault(), "", 0, string.IsNullOrEmpty(item.FROM_NO), item.SQL_WorkNo);
                                WCSHelper.Do(db =>
                                {
                                    LogHelper.Info("移库工单数量完成" + item.SQL_WorkNo);
@@ -119,7 +118,7 @@
                        {
                            LogHelper.Info($"{item.Turn_Type}工单{item.SQL_WorkNo} 手动完成,处理解锁,");
                            ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(), LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault(), "", 0, string.IsNullOrEmpty(item.FROM_NO));
                            ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(), LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault(), "", 0, string.IsNullOrEmpty(item.FROM_NO), item.SQL_WorkNo);
                            WCSHelper.Do(db =>
                            {
                                if (item.Turn_Type == "自动移库")
@@ -179,7 +178,7 @@
                            {
                                //LocationHelper.SetRowLock(new RowLock { S_AREA_CODE = item.start_row, N_ROW = srow }, 0);
                                //LocationHelper.SetRowLock(new RowLock { S_AREA_CODE = item.end_row, N_ROW = erow }, 0);
                                ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(), LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault(), "", 0, string.IsNullOrEmpty(item.FROM_NO));
                                ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(), LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault(), "", 0, string.IsNullOrEmpty(item.FROM_NO), item.SQL_WorkNo);
                                LogHelper.Info($"{item.Turn_Type}工单,完成" + item.SQL_WorkNo + "起排无货 或 终排已满 无法移库");
                                item.SQL_State = "完成";
@@ -303,7 +302,7 @@
                        {
                            //LocationHelper.SetRowLock(new RowLock { S_AREA_CODE = item.start_row, N_ROW = srow }, 0);
                            //LocationHelper.SetRowLock(new RowLock { S_AREA_CODE = item.end_row, N_ROW = erow }, 0);
                            ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(), LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault(), "", 0, string.IsNullOrEmpty(item.FROM_NO));
                            ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(), LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault(), "", 0, string.IsNullOrEmpty(item.FROM_NO), item.SQL_WorkNo);
                            LogHelper.Info($"{item.Turn_Type}工单,完成" + item.SQL_WorkNo + "起点已经没有货了,移库完成");
                            item.SQL_State = "完成";
                            item.Note = "起点已经没有货了,移库完成";
@@ -322,7 +321,7 @@
                        {
                            //LocationHelper.SetRowLock(new RowLock { S_AREA_CODE = item.start_row, N_ROW = srow }, 0);
                            //LocationHelper.SetRowLock(new RowLock { S_AREA_CODE = item.end_row, N_ROW = erow }, 0);
                            ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(), LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault(), "", 0, string.IsNullOrEmpty(item.FROM_NO));
                            ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == item.start_area && x.N_ROW == srow).FirstOrDefault(), LocationHelper.GetLocList(x => x.S_AREA_CODE == item.end_area && x.N_ROW == erow).FirstOrDefault(), "", 0, string.IsNullOrEmpty(item.FROM_NO), item.SQL_WorkNo);
                            LogHelper.Info($"{item.Turn_Type}工单,完成" + item.SQL_WorkNo + "终点满了,移库完成");
                            item.SQL_State = "完成";
                            item.Note = "终点满了,移库完成";
@@ -419,11 +418,26 @@
            }
        }
        static void ROW_LOCK(Location startBit, Location EndBit, string msg, int sign, bool up = true)
        static void ROW_LOCK(Location startBit, Location EndBit, string msg, int sign, bool up = true, string WorkNo = "")
        {
            LogHelper.Info("dooooooooooooooooooooooooooooooooooooooooooooo" + msg + "---" + sign);
            LogHelper.Info("移库解锁 doo" + msg + "---" + sign + "--" + WorkNo);
            LogHelper.Info(JsonConvert.SerializeObject(startBit));
            LogHelper.Info(JsonConvert.SerializeObject(EndBit));
            bool j解锁起点库区排 = true;
            if (!string.IsNullOrEmpty(WorkNo) && sign == 0)
            {
                //解锁时,有工单号。  查查除了这个工单号以外的其他 指定出库排执行
                var orders = WCSHelper.GetWorkOrder2();
                var thisOrder = orders.Find(x => x.SQL_WorkNo == WorkNo);
                LogHelper.Info("移库解锁 --当前工单 sid:" + thisOrder?.S_ID);
                if (thisOrder != null)
                {
                    var other = orders.Find(x => x.SQL_WorkNo != WorkNo && x.start_area == thisOrder.start_area && x.start_row == thisOrder.start_row);
                    LogHelper.Info($"移库解锁 --其他工单 x.start_area == {thisOrder.start_area} start_row == {thisOrder.start_row} SID:" + other?.S_ID);
                    if (other != null)
                        j解锁起点库区排 = false;
                }
            }
            //if (sign == 1)
            //{
            //    if (LocationHelper.GetRowLock(x => x.S_AREA_CODE == startBit.S_AREA_CODE && x.N_ROW == startBit.N_ROW).Count > 0)
@@ -431,7 +445,8 @@
            //        return;
            //    }
            //}
            LocationHelper.SetRowLock(new RowLock { S_AREA_CODE = startBit.S_AREA_CODE, N_ROW = startBit.N_ROW, S_LOCK_STATE = msg }, sign);
            if (j解锁起点库区排)
                LocationHelper.SetRowLock(new RowLock { S_AREA_CODE = startBit.S_AREA_CODE, N_ROW = startBit.N_ROW, S_LOCK_STATE = msg }, sign);
            LocationHelper.SetRowLock(new RowLock { S_AREA_CODE = EndBit.S_AREA_CODE, N_ROW = EndBit.N_ROW, S_LOCK_STATE = msg }, sign);
            //if (EndBit == null || EndBit.S_AREA_CODE.StartsWith("BHQ-"))
            //    return;
@@ -440,9 +455,12 @@
                {
                    case 0:
                        {
                            var lst = new List<string> { startBit.S_Fule_LOC, EndBit.S_Fule_LOC };
                            if (!j解锁起点库区排)
                                lst = new List<string> { EndBit.S_Fule_LOC };
                            var req = JsonConvert.SerializeObject(new
                            {
                                areaNum = new List<string> { startBit.S_Fule_LOC, EndBit.S_Fule_LOC },
                                areaNum = lst,
                                repoNo = Settings.repoNo,
                                areaLock = "2"
                            });
@@ -1010,7 +1028,7 @@
        static bool InworkLock = false;
        /// <summary>
        /// 原材料 检测各流转位置。  写入托盘货位s_type 中 下一个目的地。就开始中转。
        /// 原物料纸箱,入库堆叠区转运
        /// 原物料纸箱,入库堆叠区转运 YWLRGDD--人工堆叠区
        /// </summary>
        internal static void BottTask()
        {
@@ -1018,9 +1036,9 @@
            var usingSpace = new List<string> { "入库接驳区", "库内接驳区", "出库接驳区", "提升机退料口" };
            //usingSpace = new List<string> { "YWLRGDD", "YWLWJJB", "YWLYLTKQ", "YWLTKKTQ", "YWLKTDDQ", "YWLT1TSJ", "YWLT1TSJCD", "YWLT2TSJ", "YWLT2TSJCD" };
            usingSpace = new List<string> { "YWLYLTKQ", "YWLTKKTQ", "YWLWJJB", "YWLRGDD", "YWLT1TSJ", "YWLT2TSJ" };
            var dbll = new SqlHelper<object>().GetInstance();
            ///----------------------------退余料中间库区,退空中间库区,
            ///   /*托盘货位表的 S_TYPE。  库区1,库区,*/
            foreach (var area in usingSpace)
            {
                try
@@ -1103,9 +1121,20 @@
                                        var cir1 = cntritems.First();
                                        var arloclist = LocationHelper.GetAreaNormalLocList(EdnRarea);// LocationHelper.GetList<Location>(x => x.S_AREA_CODE == _clrel0.S_TYPE && x.S_LOCK_STATE != "报废");
                                        //有移库工单 排除移库工单上所对应的排
                                        var order = LocationHelper.GetList<YWLZXtake>(X => X.S_ZX_STATE == "执行").ToList();
                                        if (order.Count() > 0)
                                        {
                                            foreach (var item in order)
                                            {
                                                LogHelper.Info($"有移库工单排除对应的库区{item.S_START_AREA} 排{item.N_START_ROW}");
                                                arloclist.RemoveAll(e => e.S_AREA_CODE == item.S_START_AREA && e.N_ROW == item.N_START_ROW);
                                            }
                                        }
                                        if (arloclist.Any())
                                        {
                                            if (EdnRarea == "YWLWJJB")
                                            if (EdnRarea == "YWLWJJB")//纸箱无菌接驳区
                                            //    InworkLock = true;
                                            //else InworkLock = false;
                                            //if (od.S_ZZ_AREA == "YWLWJJB")
@@ -1119,14 +1148,43 @@
                                            Location endbit = null;
                                            //foreach (var rss in arloclist.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(xx => xx.Key))
                                            RowLock inlock = null;
                                            List<RowLock> inlockLis = new List<RowLock>();
                                            bool isCd = false;
                                            if (CDlist.Contains(EdnRarea))
                                            {
                                                isCd = true;
                                                inlock = 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 == "入库锁").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();
                                                inlock = inlockLis.FirstOrDefault();
                                                if (inlock != null)
                                                {
                                                    arloclist = arloclist.FindAll(x => x.N_ROW == inlock.N_ROW).ToList();
                                                    //当入库的任务能放满一排并且还有余的时候 开第二排
                                                    //先判断起点有多少相同的 能入的物料
                                                    if (_cl.S_AREA_CODE == "YWLRGDD")//判断起点是否是人工堆叠区
                                                    {
                                                        //然后判断人工堆叠区需要入库多少托同品种物料 startMum
                                                        //货位 托盘 物料表联查
                                                        LogHelper.Info($"查起点有多少同品种的物料 开始");
                                                        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 == "YWLRGDD" && p.S_TYPE == _clrel0.S_TYPE);
                                                        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()).Includes(e => e.LocCntrRel, p => p.CntrItemRel).ToList();
                                                        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();
                                                        if (lstCanOutL.Count <= EndMum.Count())
                                                        {
                                                            arloclist = arloclist.FindAll(x => inlockLis.Select(e => e.N_ROW).ToList().Contains(x.N_ROW)).ToList();
                                                        }
                                                        else
                                                        {
                                                            arloclist = arloclist.FindAll(x => !inlockLis.Select(e => e.N_ROW).ToList().Contains(x.N_ROW)).ToList();
                                                            inlock = null;
                                                        }
                                                        LogHelper.Info($"查起点有多少同品种的物料 结束");
                                                    }
                                                    else
                                                    {
                                                        arloclist = arloclist.FindAll(x => x.N_ROW == inlock.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))
@@ -3570,7 +3628,6 @@
        /// </summary>
        public static void AutoRun13TSJ()
        {
            Action<YWLWorkOrder> _sAB没物料或者余量不足开始触发跟根据自动转运_名字越长越好 = (od) =>
            {
                LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}对应工单的{od.S_ROW} 物料数量不足。触发转运。");
@@ -4009,10 +4066,10 @@
                var locS = LocationHelper.GetAreaNormalLocList(ODs.Key);
                foreach (var od in ODs)
                {
                    LogHelper.Info($"from{od.S_START_AREA} mid:{od.S_ZZ_AREA} to{od.S_END_AREA} 开始 》》》");
                    if (string.IsNullOrEmpty(od.S_ZZ_AREA) || string.IsNullOrEmpty(od.S_END_AREA))
                    LogHelper.Info($"YWL_ZX_Turn from{od.S_START_AREA} mid:{od.S_ZZ_AREA} to{od.S_END_AREA} 开始 》》》");
                    if (string.IsNullOrEmpty(od.S_ZZ_AREA) && string.IsNullOrEmpty(od.S_END_AREA))
                    {
                        LogHelper.CError($"from{od.S_START_AREA} mid:{od.S_ZZ_AREA} to{od.S_END_AREA} 数据缺失。无法完成移库。");
                        LogHelper.CError($"YWL_ZX_Turn from{od.S_START_AREA} to{od.S_END_AREA} 数据缺失。无法完成移库。");
                        continue;
                    }
                    var rows = locS.FindAll(x => x.N_ROW == od.N_START_ROW);
@@ -4029,13 +4086,23 @@
                            var lastful = rows.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault();
                            if (lastful != null)
                            {
                                LogHelper.Info($"from{od.S_START_AREA} mid:{od.S_ZZ_AREA} to{od.S_END_AREA} 找到移库起点》{lastful.S_LOC_CODE}。");
                                LogHelper.Info($"YWL_ZX_Turn from{od.S_START_AREA}to{od.S_END_AREA} 找到移库起点》{lastful.S_LOC_CODE}。");
                                var crs = LocationHelper.GetLocCntrRel(lastful.S_LOC_CODE);
                                var cntritems = ContainerHelper.GetCntrItemRel(crs.FirstOrDefault()?.S_CNTR_CODE);
                                if (!cntritems.Any())
                                    continue;
                                LogHelper.Info($"from{od.S_START_AREA} mid:{od.S_ZZ_AREA} to{od.S_END_AREA} 找到移库起点》{lastful.S_LOC_CODE}。接驳是否被锁?:{InworkLock}");
                                LogHelper.Info($"YWL_ZX_Turn from{od.S_START_AREA}to{od.S_END_AREA} 找到移库起点》{lastful.S_LOC_CODE}。接驳是否被锁?:{InworkLock}");
                                var cir1 = cntritems.First();
                                if (!string.IsNullOrEmpty(od.S_ITEM_CODE))
                                {
                                    ///给移库单 写上转运的物料数据。
                                    od.S_ITEM_CODE = cir1.S_ITEM_CODE;
                                    od.S_ITEM_NAME = cir1.S_ITEM_NAME;
                                    od.S_CJ_NAME = cir1.S_CJ_NAME;
                                    WCSHelper.Do(db => db.Updateable(od).UpdateColumns(it => new { it.S_ITEM_NAME, it.S_ITEM_CODE, it.S_CJ_NAME }).ExecuteCommand());
                                }
                                if (od.S_ZZ_AREA == "YWLWJJB")
                                {
                                    if (InworkLock)
@@ -4065,24 +4132,16 @@
                                        Endbit = zzrloclist.Find(x => x.N_COL > (_cl2?.N_COL ?? 0));
                                    if (Endbit != null)
                                    {
                                        LogHelper.Info($"入中转区{od.S_ZZ_AREA}使用{Endbit.S_LOC_CODE}");
                                        LogHelper.Info($"入中转区{nextarea}使用{Endbit.S_LOC_CODE}");
                                        break;
                                    }
                                }
                                LogHelper.Info($"from{od.S_START_AREA} mid:{od.S_ZZ_AREA} to{od.S_END_AREA} 找到移库终点》{Endbit?.S_LOC_CODE}");
                                LogHelper.Info($"YWL_ZX_Turn from{od.S_START_AREA} mid:{od.S_ZZ_AREA} to{od.S_END_AREA} 找到移库终点》{Endbit?.S_LOC_CODE}");
                                if (Endbit != null)
                                {
                                    //生成接驳区任务,标记为终点库区。
                                    var b = TaskProcess.CreateTransport(od.S_ID, lastful.S_LOC_CODE, Endbit.S_LOC_CODE, "原物料搬运-纸箱", crs.Select(x => x.S_CNTR_CODE).ToList(), 1, 1, crs.Count, 50, nextarea == od.S_END_AREA ? "" : od.S_END_AREA);
                                    if (od.S_ZZ_AREA == "YWLWJJB") InworkLock = false;
                                    if (!string.IsNullOrEmpty(od.S_ITEM_CODE))
                                    {
                                        ///给移库单 写上转运的物料数据。
                                        od.S_ITEM_CODE = cir1.S_ITEM_CODE;
                                        od.S_ITEM_NAME = cir1.S_ITEM_NAME;
                                        od.S_CJ_NAME = cir1.S_CJ_NAME;
                                        WCSHelper.Do(db => db.Updateable(od).UpdateColumns(it => new { it.S_ITEM_NAME, it.S_ITEM_CODE, it.S_CJ_NAME }).ExecuteCommand());
                                    }
                                    break;
                                }
                                else if (od.S_ZZ_AREA == "YWLWJJB") InworkLock = false;