From 8f0f149d607a7246fa25e81340602ce5e47398fe Mon Sep 17 00:00:00 2001 From: pulg <plg@Haninfo> Date: 星期四, 10 七月 2025 18:14:38 +0800 Subject: [PATCH] 1 --- HH.WCS.QingXiNongfu/process/DeviceProcess.cs | 350 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 336 insertions(+), 14 deletions(-) diff --git a/HH.WCS.QingXiNongfu/process/DeviceProcess.cs b/HH.WCS.QingXiNongfu/process/DeviceProcess.cs index 3efb1c9..402373f 100644 --- a/HH.WCS.QingXiNongfu/process/DeviceProcess.cs +++ b/HH.WCS.QingXiNongfu/process/DeviceProcess.cs @@ -1757,7 +1757,7 @@ } } - else if (data == "1121")//B鍙e伐浣滀俊鍙�+ else if (data == "1121")//AB鍙e伐浣滀俊鍙� { if (BottlePEMInfoFullTwo(plc, plc.location[0])) { @@ -1998,11 +1998,11 @@ } } 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) @@ -2010,6 +2010,8 @@ var chi = new SqlHelper<object>().GetInstance(); var newDb = chi.CopyNew(); Location endBit = null; + Location staBit = null; + bool SentTask = false; if (location == "") { throw new Exception("璐т綅涓虹┖"); @@ -2019,25 +2021,162 @@ { throw new Exception("娌℃湁銆愭墽琛屼腑銆戠殑宸ュ崟"); } - if (workOrder.SQL_UsingNow == "Y")//鍗充骇鍗崇敤 + //鍏堟煡璇㈣揣浣嶆湁娌℃湁璐� 婊$殑涓嬫弧 绌虹殑鍒欎笂绌�+ // = 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 != "鏃�) { - //鏌ヨ 鍗婃垚鍝佸尯鍩熻〃 BcpQyOrder - + return false; } - else//闈炲嵆浜у嵆鐢�+ var bcpList = WCSHelper.BcpQyOrderList(plc.deviceName); + if (bcpList.Count() == 0) { - + throw new Exception("鏈垝鍒嗗搴旂殑鍖哄煙 鏌ョ湅杩欎釜浜х嚎鏄惁鍦ㄥ崐鎴愬搧鍖哄煙琛ㄨ繘琛岄厤缃�骞跺惎鐢�); } - if (endBit != null) + if (hojs.N_CURRENT_NUM == 0)//涓婃墭鐩�鍚﹀垯涓嬫墭鐩� { - var _ctrl = LocationHelper.GetLocCntrRel(location); - 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); + //涓婃墭鐩�绌烘 + 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; + //瑙﹀彂鑷姩瑙g粦 + //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(); + ////鏌ヨ绗竴鎺掓槸鍚︽弧 骞朵笖绗簩鎺掑叆婊′笁涓悗瑙g粦绗竴鎺�+ ////1.鏌ヨ绗竴鎺掓槸鍚︽湁绌鸿揣浣�鏈�鍒欒烦杩�+ } + } + } + if (SentTask) + { + return SentTask; + } + } return true; } - } catch (Exception ex) { @@ -2046,6 +2185,189 @@ } } + /// <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; + } + } + //鐡跺澂婊″叆搴� static bool BottlePEMInfoFull(Settings.deviceInfo plc, string location) -- Gitblit v1.9.1