using HH.WCS.QingXigongchang.process; using HH.WCS.QingXigongchang.util; using HH.WCS.QingXigongchang.wms; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace HH.WCS.QingXigongchang.core { /// /// 定时轮询任务 /// internal class Monitor { static List RunOrder = new List(); static bool debugClear = false; public static void BottleCapAuto2() { if (debugClear) { try { var cntrs = ContainerHelper.GetCntrItemRel(); foreach (var item in cntrs.GroupBy(x => x.S_CNTR_CODE)) { var list = item.ToList(); if (list.Count > 1) { list.Remove(list.First()); LocationHelper.DoAction(db => { db.Deleteable(list).ExecuteCommand(); return true; }); } } } catch (Exception ex) { LogHelper.Info("debugClear" + ex.Message); } } ///"成品转运" -- 手动移库工单 var workOrders = WCSHelper.GetWorkOrder2(); if (workOrders.Any()) { foreach (var item in workOrders) { var srow = Convert.ToInt32(item.start_row); var erow = Convert.ToInt32(item.end_row); LogHelper.Info($"{item.Turn_Type}工单," + JsonConvert.SerializeObject(item)); if (item.start_area == item.end_area) { if (srow == erow) { WCSHelper.Do(db => { LogHelper.Info("手动移库工单,完成" + item.SQL_WorkNo + "同库区同排 无法移库"); item.SQL_State = "完成"; item.Note = "同库区同排 无法移库"; db.Updateable(item).UpdateColumns(it => new { it.SQL_State, it.Note }).ExecuteCommand(); }); continue; } } if (item.TrayCount > 0) { var b = LocationHelper.DoAction(db => { var task = new SqlHelper().GetInstance().Queryable().Where(x => x.S_SRC_NO == item.S_ID).OrderBy(x => x.T_CREATE, SqlSugar.OrderByType.Desc).First(); ; if (task != null && task.S_B_STATE != "完成" && task.S_B_STATE != "取消") return false; return true; }); if (!b) continue; if (item.AlQty >= item.TrayCount) { 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)); WCSHelper.Do(db => { LogHelper.Info("移库工单数量完成" + item.SQL_WorkNo); item.SQL_State = "完成"; item.Note = "数量完成"; db.Updateable(item).UpdateColumns(it => new { it.SQL_State, it.Note }).ExecuteCommand(); }); } continue; } } if (item.SQL_State == "完成") { if (item.Note == "执行中。。。") { 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)); WCSHelper.Do(db => { if (item.Turn_Type == "自动移库") { var workOrder = WCSHelper.GetWorkOrder(x => item.LineNo == x.SQL_PLineNo).FirstOrDefault(); if (workOrder != null) { workOrder.TurnState = "移库被手动完成,终止移库"; db.Updateable(workOrder).UpdateColumns(it => new { it.TurnState }).ExecuteCommand(); } } item.Note = "手动完成,解锁"; db.Updateable(item).UpdateColumns(it => new { it.Note }).ExecuteCommand(); }); } continue; } bool sss = false; if (!string.IsNullOrEmpty(item.size)) { sss = !(item.start_area.Contains("_") && item.end_area.Contains("_")); if (item.end_area == "YKBH" || item.end_area.StartsWith("BHQ-")) sss = !item.start_area.Contains("_"); if (sss) { string _fix = Settings.areaSuffix(item.size.Trim()); if (!item.start_area.Contains("_")) { item.start_area += _fix; } if (!item.end_area.Contains("_") && item.end_area != "YKBH" && !item.end_area.StartsWith("BHQ-")) { item.end_area += _fix; } LogHelper.Info($"{item.Turn_Type}工单," + item.SQL_WorkNo + _fix); } } var startRloclist = LocationHelper.GetLocList(x => x.S_AREA_CODE.Contains(item.start_area) && x.N_ROW == srow && x.S_LOCK_STATE != "报废"); var endRloclist = LocationHelper.GetLocList(x => x.S_AREA_CODE.Contains(item.end_area) && x.N_ROW == erow && x.S_LOCK_STATE != "报废"); var sameTray = true; if (sss) { //1 起点有货末尾位 var sloc = startRloclist.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); var eloc = endRloclist.FindAll(x => x.N_CURRENT_NUM == 0 || x.N_CURRENT_NUM < x.N_CAPACITY).LastOrDefault(); if (sloc == null || eloc == null) { WCSHelper.Do(db => { //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)); LogHelper.Info($"{item.Turn_Type}工单,完成" + item.SQL_WorkNo + "起排无货 或 终排已满 无法移库"); item.SQL_State = "完成"; item.Note = "起排无货 或 终排已满 无法移库"; db.Updateable(item).UpdateColumns(it => new { it.SQL_State, it.Note }).ExecuteCommand(); }); continue; } var slocrel = LocationHelper.GetLocCntrRel(sloc.S_LOC_CODE); var elocrel = LocationHelper.GetLocCntrRel(eloc.S_LOC_CODE); if (slocrel.Count() > 0)//&& elocrel.Count > 0) { if (elocrel.Count == 0 || slocrel[0].S_TYPE == elocrel[0].S_TYPE) { //if (slocrel[0].S_TYPE.Trim() != item.size.Trim()) //{ // #region 起始点排托盘,与工单不符 // WCSHelper.Do(db => // { // item.SQL_State = "完成"; // item.Note = "起始点排托盘,与工单不符 无法移库"; // db.Updateable(item).UpdateColumns(it => new // { // it.SQL_State, // item.Note // }).ExecuteCommand(); // }); // continue; // #endregion //} //else LogHelper.Info($"{item.Turn_Type}工单,匹配数据" + item.SQL_WorkNo + $" {sloc.S_AREA_CODE} {eloc.S_AREA_CODE}"); #region 工单匹配 - 继续执行 WCSHelper.Do(db => { item.start_area = sloc.S_AREA_CODE; item.end_area = eloc.S_AREA_CODE; db.Updateable(item).UpdateColumns(it => new { it.start_area, it.end_area }).ExecuteCommand(); }); goto LabelTurn_GO; #endregion } else { #region 起始点排托盘不符 WCSHelper.Do(db => { LogHelper.Info($"{item.Turn_Type}工单,完成" + item.SQL_WorkNo + "起始点排托盘不符 无法移库"); item.SQL_State = "完成"; item.Note = "起始点排托盘不符 无法移库"; db.Updateable(item).UpdateColumns(it => new { it.SQL_State, it.Note }).ExecuteCommand(); }); continue; #endregion } } else { #region 没托盘 无法比对 异常继续 WCSHelper.Do(db => { LogHelper.Info($"{item.Turn_Type}工单,完成" + item.SQL_WorkNo + (sloc == null ? "起点" : "终点") + "排无货 无法移库"); item.SQL_State = "完成"; item.Note = (sloc == null ? "起点" : "终点") + "排无货 无法移库"; db.Updateable(item).UpdateColumns(it => new { it.SQL_State, it.Note }).ExecuteCommand(); }); continue; #endregion } } LabelTurn_GO: if (sss) { startRloclist = startRloclist.FindAll(x => x.S_AREA_CODE == item.start_area); endRloclist = endRloclist.FindAll(x => x.S_AREA_CODE == item.end_area); } #region 查看起/终点货位有没有锁定货位 -- 起点有满 终点有不满/空位 var slock = startRloclist.Find(x => x.S_LOCK_STATE != "无" && x.S_LOCK_STATE != "空间锁"); if (slock != null) { LogHelper.Info($"工单{item.SQL_WorkNo} 起点库区排有锁定位 状态:{slock.S_LOCK_STATE},继续下一次....."); continue; } var elock = endRloclist.Find(x => x.S_LOCK_STATE != "无" && x.S_LOCK_STATE != "空间锁"); if (elock != null) { LogHelper.Info($"工单{item.SQL_WorkNo} 终点库区排有锁定位 状态:{elock.S_LOCK_STATE},继续下一次....."); continue; } //var sfn = startRloclist.FindAll(x => x.N_CURRENT_NUM > 0); //起点排末尾货位 var ssloc = startRloclist.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); if (ssloc == null) { WCSHelper.Do(db => { //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)); LogHelper.Info($"{item.Turn_Type}工单,完成" + item.SQL_WorkNo + "起点已经没有货了,移库完成"); item.SQL_State = "完成"; item.Note = "起点已经没有货了,移库完成"; db.Updateable(item).UpdateColumns(it => new { it.SQL_State, it.Note }).ExecuteCommand(); }); continue; } if (endRloclist.FindAll(x => x.N_CURRENT_NUM < x.N_CAPACITY).Count == 0) { WCSHelper.Do(db => { //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)); LogHelper.Info($"{item.Turn_Type}工单,完成" + item.SQL_WorkNo + "终点满了,移库完成"); item.SQL_State = "完成"; item.Note = "终点满了,移库完成"; db.Updateable(item).UpdateColumns(it => new { it.SQL_State, it.Note }).ExecuteCommand(); }); continue; } #endregion CntrItemRel citem = null; var loc = startRloclist.Find(x => x.N_CURRENT_NUM > 0); if (loc != null) { var lc = LocationHelper.GetLocCntrRel(loc.S_LOC_CODE); if (lc.Any()) { var _clcntitem = ContainerHelper.GetCntrItemRel(lc.FirstOrDefault().S_CNTR_CODE.Trim()); if (_clcntitem.Any()) { citem = _clcntitem.FirstOrDefault(); } } } if (citem == null) { LogHelper.Info($" 起点区域{item.start_area}-{item.start_row}>{loc?.S_LOC_CODE}没找到货位-托盘- 物料 !"); continue; } var itemINFO = ContainerHelper.GetItem(x => x.S_ITEM_CODE == citem.S_ITEM_CODE && x.S_ITEM_NAME == citem.S_ITEM_NAME); int MaxLayer = itemINFO?.MaxLayer ?? 0; //终点排最里面空位 Location Endbit = null; //int EndLayer = 1; Endbit = endRloclist.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); var ee = Endbit; if (ee != null && item.end_area.StartsWith("BHQ-")) { var _clrel = LocationHelper.GetLocCntrRel(ee.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info(ee.S_LOC_CODE + " 终点排的最后货位 没有货位托盘信息!"); continue; } var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()); if (!_clcntitem.Any()) { LogHelper.Info(ee.S_LOC_CODE + $" 终点排的最后货位 的托盘{_clrel0.S_CNTR_CODE} 没有物料记录"); continue; } if (_clcntitem.FirstOrDefault().B_TYPE == item.size && (_clcntitem.FirstOrDefault().S_ITEM_NAME == (itemINFO.S_ITEM_NAME) && _clcntitem.FirstOrDefault().S_ITEM_CODE == (itemINFO.S_ITEM_CODE))) { //if (Endbit.N_CURRENT_NUM / 2 >= MaxLayer) if (Endbit.N_CURRENT_NUM >= MaxLayer) Endbit.N_CURRENT_NUM = Endbit.N_CAPACITY; } else //Endbit.N_CURRENT_NUM = MaxLayer > 0 && MaxLayer * 2 < Endbit.N_CAPACITY ? MaxLayer * 2 : Endbit.N_CAPACITY; Endbit.N_CURRENT_NUM = Endbit.N_CAPACITY; } //Location emp = null; if (Endbit == null || Endbit.N_CURRENT_NUM >= Endbit.N_CAPACITY) { if (Endbit != null) Endbit = endRloclist.FindAll(x => x.N_CURRENT_NUM == 0 && x.N_COL > Endbit.N_COL).OrderBy(x => x.N_COL).FirstOrDefault(); else Endbit = endRloclist.FindAll(x => x.N_CURRENT_NUM == 0).OrderBy(x => x.N_COL).FirstOrDefault(); } if (string.IsNullOrEmpty(item.Note)) { ROW_LOCK(ssloc, Endbit, item.Turn_Type, 1, string.IsNullOrEmpty(item.FROM_NO)); WCSHelper.Do(db => { item.Note = "执行中。。。"; db.Updateable(item).UpdateColumns(it => new { it.Note }).ExecuteCommand(); }); } var carryCntrs = LocationHelper.GetLocCntrRel(ssloc.S_LOC_CODE).OrderByDescending(x => x.T_CREATE).Select(x => x.S_CNTR_CODE).Take(1).ToList(); var bb = TaskProcess.CreateTransport(item.S_ID, ssloc.S_LOC_CODE, Endbit.S_LOC_CODE, "备货", carryCntrs, ssloc.N_CURRENT_NUM, Endbit.N_CURRENT_NUM + 1, carryCntrs.Count, item.priority); //var bb = TaskProcess.CreateTransport(item.S_ID, ssloc.S_LOC_CODE, Endbit.S_LOC_CODE, "备货", carryCntrs, ssloc.N_CURRENT_NUM / 2, Endbit.N_CURRENT_NUM / 2 + 1, carryCntrs.Count, item.priority); LogHelper.Info($"{item.SQL_WorkNo} 备货 {ssloc.S_LOC_CODE}=>{Endbit.S_LOC_CODE}" + bb); } } } static void ROW_LOCK(Location startBit, Location EndBit, string msg, int sign, bool up = true) { LogHelper.Info("dooooooooooooooooooooooooooooooooooooooooooooo" + msg + "---" + sign); LogHelper.Info(JsonConvert.SerializeObject(startBit)); LogHelper.Info(JsonConvert.SerializeObject(EndBit)); //if (sign == 1) //{ // if (LocationHelper.GetRowLock(x => x.S_AREA_CODE == startBit.S_AREA_CODE && x.N_ROW == startBit.N_ROW).Count > 0) // { // return; // } //} 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; if (true)//up) switch (sign) { case 0: { var req = JsonConvert.SerializeObject(new { areaNum = new List { startBit.S_Fule_LOC, EndBit.S_Fule_LOC }, repoNo = Settings.repoNo, areaLock = "2" }); var feedback = new HttpHelper().WebPost($"{Settings.FuleServerUrl}/wms/v1/agv/areaRowLockState", req); LogHelper.Info("areaRowLockState 解锁" + req + ";rrr:" + JsonConvert.SerializeObject(feedback)); } break; case 1: { var req = JsonConvert.SerializeObject(new { areaNum = new List { startBit.S_Fule_LOC, EndBit.S_Fule_LOC }, repoNo = Settings.repoNo, areaLock = "1" }); var feedback = new HttpHelper().WebPost($"{Settings.FuleServerUrl}/wms/v1/agv/areaRowLockState", req); LogHelper.Info("areaRowLockState 锁定" + req + ";rrr:" + JsonConvert.SerializeObject(feedback)); } break; default: LogHelper.Info("Row_LOCK 移库设置锁排 失败。 sign" + sign + ",未知!"); break; } } /// /// 某工单的 起点列表, 和终点列表 /// 为了实时性 ,还是实时筛选吧 /// //class D //{ // public List StartLocs = new List(); // public List EndedLocs = new List(); //} //节流。 public static int AutoTurn = 0; //static Dictionary SandELoclist = new Dictionary(); public static void BottleCapAuto3() { if (AutoTurn > 0) return; AutoTurn++; //收集产线号 var plcnamelist = Settings.GetDeviceInfoList().FindAll(x => x.deviceType == 9).Select(x => x.deviceName).ToList(); //产线对应的 完成工单。 var workOrders = WCSHelper.GetWorkOrder(x => plcnamelist.Contains(x.SQL_PLineNo.Trim()) && x.SQL_State == "完成" && ((x.TurnArea != "不存入" && string.IsNullOrEmpty(x.TurnState)) || x.TurnState == "AutoTurn")); var turnOrders = WCSHelper.GetWorkOrder2(x => workOrders.Select(n => n.SQL_PLineNo).Contains(x.LineNo) && x.SQL_State == "执行中" && x.Turn_Type == "自动移库"); //var temp = new Dictionary(); //foreach (var item in SandELoclist) //{ // if (!workOrders.Exists(x => x.SQL_WorkNo == item.Key)) // temp.Add(item.Key, item.Value); //} //SandELoclist = temp; var db = new SqlHelper().GetInstance(); foreach (var order in workOrders) { //if(order.TurnState) //if(turnOrders.Find(x=>x.LineNo==order.SQL_PLineNo)) //D B = null; //if (SandELoclist.TryGetValue(order.SQL_WorkNo, out B)) //{ // LogHelper.Info($"工单号{order.SQL_WorkNo} 已存在缓存数据中。 开始筛选匹配移库"); //} //if ("NoB_Type,NoTurnArea".Contains(order.TurnState)) //{ // //LogHelper.Info($"{order.SQL_WorkNo} -{order.SQL_PLineNo} - {order.TurnState}查找下一个!"); // continue; //} var isFuLe = order.FromFuLe?.Trim() == "Y"; #region 前期判断 if (string.IsNullOrEmpty(order.B_Type)) { order.TurnState = "NoB_Type"; db.Updateable(order).UpdateColumns(it => new { it.TurnState }).ExecuteCommand(); LogHelper.Info($"{order.SQL_WorkNo} -{order.SQL_PLineNo} - {order.B_Type} 版型空, 自动转运失败,查找下一个!"); continue; } string usffix = Settings.areaSuffix(order.B_Type); string endArea = order.TurnArea; if (string.IsNullOrEmpty(order.TurnArea)) { order.TurnState = "NoTurnArea"; db.Updateable(order).UpdateColumns(it => new { it.TurnState }).ExecuteCommand(); LogHelper.Info($"{order.SQL_WorkNo} -{order.SQL_PLineNo} - {order.TurnArea} TurnArea区域空, 自动转运失败,查找下一个!"); continue; } if (turnOrders.Find(x => x.LineNo == order.SQL_PLineNo) != null) { continue; } //if(B!= null) //{ // goto LabelS_E; //} #endregion bool HasTurnTask = false; string Batch = order.SQL_BatchNo.Trim(); //满框下线,如果没有批次,我会写一个上去, 所以不会空, var itemName = order.SQL_ItemName.Trim(); var tempLoclist = LocationHelper.GetLocList(x => x.S_AREA_CODE == (endArea + usffix) && x.S_LOCK_STATE != "报废"); var EndLoclist = new List(); foreach (var _e in tempLoclist.GroupBy(x => x.N_ROW)) { var _elocs = _e.ToList(); var _p = _elocs.Find(x => x.N_CURRENT_NUM > 0); if (_p == null) continue;//空排移除 var _p2 = LocationHelper.GetLocCntrRel(_p.S_LOC_CODE); if (_p2.Count == 0) continue; if (isFuLe) { if (_p2.FirstOrDefault().S_CNTR_CODE.StartsWith("TP")) continue; } else { if (!_p2.FirstOrDefault().S_CNTR_CODE.StartsWith("TP")) continue; } var cntrrel = ContainerHelper.GetCntrItemRel(_p2[0].S_CNTR_CODE); var _ci = cntrrel[0]; if (_ci.S_ITEM_CODE == itemName && _ci.S_BATCH_NO == Batch) { if (_elocs.Find(x => x.S_LOCK_STATE != "无") != null) HasTurnTask = true; else EndLoclist.AddRange(_elocs); } } if (HasTurnTask) { LogHelper.Info($"HasTurnTask {HasTurnTask} {order.SQL_WorkNo}工单有在执行中的自动移库任务"); continue; } if (false) { #region throw - 多库区的准备数据 。 不要了 var TempLocist = LocationHelper.GetLocList(x => x.N_CURRENT_NUM > 0 && x.S_AREA_CODE != (endArea + usffix) && x.S_AREA_CODE.StartsWith("QX-0") && x.S_AREA_CODE.EndsWith(usffix) && x.S_LOCK_STATE != "报废"); var Starloclist = new List(); foreach (var _t in TempLocist.GroupBy(x => x.S_AREA_CODE)) { foreach (var _r in _t.GroupBy(x => x.N_ROW)) { var _list = _r.ToList(); var _p = _list.FirstOrDefault(); var _p2 = LocationHelper.GetLocCntrRel(_p.S_LOC_CODE); if (_p2.Count == 0) { LogHelper.Info($"autoTurn {_p.S_AREA_CODE} {_p.S_LOC_CODE} 数量{_p.N_CURRENT_NUM}-没有托盘。End "); continue; } if (isFuLe) { if (_p2.FirstOrDefault().S_CNTR_CODE.StartsWith("TP")) continue; } else { if (!_p2.FirstOrDefault().S_CNTR_CODE.StartsWith("TP")) continue; } var cntrrel = ContainerHelper.GetCntrItemRel(_p2[0].S_CNTR_CODE); var _ci = cntrrel[0]; if (_ci.S_ITEM_CODE == itemName && _ci.S_BATCH_NO == Batch) if (_list.Find(x => x.S_LOCK_STATE != "无") != null) Starloclist.AddRange(_list); } } //B.StartLocs = Starloclist; //B.EndedLocs = EndLoclist; //LabelS_E: Dictionary map = new Dictionary(); var _colInt = 0; //一排多少个托盘。 foreach (var s in Starloclist.GroupBy(x => x.S_AREA_CODE)) { foreach (var sr in s.GroupBy(x => x.N_ROW)) { var srl = sr.FirstOrDefault(); foreach (var er in EndLoclist.GroupBy(x => x.N_ROW)) { var erl = er.FirstOrDefault(); if (_colInt == 0) _colInt = er.Count() * erl.N_CAPACITY; map.Add($"{srl.S_AREA_CODE}&{srl.N_ROW}+{erl.S_AREA_CODE}&{erl.N_ROW}", _colInt - (sr.Count() + er.Sum(x => x.N_CURRENT_NUM))); } } } int index = 0; var taskkey = new List(); ; foreach (var item in map.OrderBy(x => x.Value)) { if (item.Value >= 0) { var str = item.Key.Split('+'); if (taskkey.Contains(str[0]) || taskkey.Contains(str[1])) { continue; } taskkey.Add(item.Key); //createTask // update TurnState } } #endregion } var egpo = EndLoclist.GroupBy(x => x.N_ROW).OrderBy(x => x.ToList().FindAll(y => y.N_CURRENT_NUM > 0).Count); if (egpo.Count() > 1) { int cn = egpo.FirstOrDefault().ToList().Count(); //一排的货位数量 int calln = cn * egpo.FirstOrDefault().ToList().FirstOrDefault().N_CAPACITY; string area = endArea + usffix;// egpo.FirstOrDefault().ToList().FirstOrDefault().S_AREA_CODE; Dictionary map = new Dictionary();//dict.add("from-to",num); for (int i = 0; i < egpo.Count(); i++) { var sl = egpo.Skip(i).FirstOrDefault()?.ToList(); var sk = egpo.Skip(i).FirstOrDefault().Key; for (int j = egpo.Count() - 1; j > i; j--) { var el = egpo.Skip(j).FirstOrDefault()?.ToList(); var ek = egpo.Skip(j).FirstOrDefault().Key; var sn = sl.Sum(x => x.N_CURRENT_NUM); var en = el.Sum(x => x.N_CURRENT_NUM); if (sn == en) { if (sk > ek) { map.Remove($"{sk}-{ek}"); map.Add($"{sk}-{ek}", sn + en - calln); } else { map.Remove($"{ek}-{sk}"); map.Add($"{ek}-{sk}", sn + en - calln); } } else { if (sn < en) { map.Remove($"{sk}-{ek}"); map.Add($"{sk}-{ek}", sn + en - calln); } else { map.Remove($"{ek}-{sk}"); map.Add($"{ek}-{sk}", sn + en - calln); } }// 例如:3-2,33+44-55 从3排送2排, 总量77 3排剩余77- 55 = 22托盘 } } string key = ""; int value = -8888; //map.OrderBy(x => x.Value); foreach (var item in map) { if (item.Value == 0) { key = item.Key; value = item.Value; // 创建转运单 。 break; } if (item.Value < 0) { if (value > 0) { key = item.Key; value = item.Value; } else { if (item.Value > value) { key = item.Key; value = item.Value; } } } else { if (value > 0) { if (value > item.Value) { key = item.Key; value = item.Value; } } } } if (!string.IsNullOrEmpty(key)) { order.TurnState = "AutoTurn"; var tn = new TurnWorkOrder { SQL_WorkNo = (isFuLe ? "FU_" : "") + order.SQL_WorkNo, start_area = area, start_row = key.Split('-')[0], end_area = area, end_row = key.Split('-')[1], size = order.B_Type, SQL_State = "执行中", LineNo = order.SQL_PLineNo, Note = "", Turn_Type = "自动移库", }; db.Insertable(tn).ExecuteCommand(); //ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == tn.start_area && x.N_ROW == Convert.ToInt32(tn.start_row)).FirstOrDefault(), // LocationHelper.GetLocList(x => x.S_AREA_CODE == tn.end_area && x.N_ROW == Convert.ToInt32(tn.end_row)).FirstOrDefault(), "", 1); } else //没有可转 { order.TurnState = "NoTurnData"; } db.Updateable(order).UpdateColumns(it => new { it.TurnState }).ExecuteCommand(); LogHelper.Info($"{order.SQL_WorkNo} -{order.SQL_PLineNo} - {order.TurnArea} {order.TurnState},查找完成,开始下一产线工单!"); continue; } else { order.TurnState = "只有一排或无排,终止移库"; db.Updateable(order).UpdateColumns(it => new { it.TurnState }).ExecuteCommand(); LogHelper.Info($"{order.SQL_WorkNo} -{order.SQL_PLineNo} - {order.TurnArea} 只有一排或无货, 查找下一个!"); continue; } } AutoTurn--; } public static void BottleCapAuto4() { var Rlocks = LocationHelper.GetList(); var Rlock = Rlocks.FindAll(x => x.S_LOCK_STATE == "分拣锁排"); if (Rlock.Any()) { foreach (var item in Rlock) { var locs = LocationHelper.GetLocList(x => x.S_AREA_CODE == item.S_AREA_CODE && x.N_ROW == item.N_ROW && x.N_CURRENT_NUM > 0); if (!locs.Any()) { LocationHelper.SetRowLock(item, 0); } } } Rlock = Rlocks.FindAll(x => x.S_LOCK_STATE.Contains("手动移库")); if (Rlock.Any()) { var turnOrders = WCSHelper.GetWorkOrder2(x => x.SQL_State == "执行中" && x.Turn_Type.Contains("手动移库")); foreach (var item in Rlock) { if (turnOrders.Find(x => x.start_area == item.S_AREA_CODE && int.Parse(x.start_row) == item.N_ROW) != null || turnOrders.Find(x => x.end_area == item.S_AREA_CODE && int.Parse(x.end_row) == item.N_ROW) != null) { } else { //执行中的工单 没有这个排锁。 解除 //ROW_LOCK(LocationHelper.GetLocList(x => x.S_AREA_CODE == item.S_AREA_CODE && x.N_ROW == item.N_ROW).FirstOrDefault(), LocationHelper.GetLocList(x => x.S_AREA_CODE == item.S_AREA_CODE && x.N_ROW == erow).FirstOrDefault(), "", 0); LocationHelper.SetRowLock(item, 0); var req = JsonConvert.SerializeObject(new { areaNum = new List { LocationHelper.GetLocList(x => x.S_AREA_CODE == item.S_AREA_CODE && x.N_ROW == item.N_ROW).FirstOrDefault().S_Fule_LOC }, repoNo = Settings.repoNo, areaLock = "2" }); var feedback = new HttpHelper().WebPost($"{Settings.FuleServerUrl}/wms/v1/agv/areaRowLockState", req); LogHelper.Info("BottleCapAuto4 线程 解锁 非任务和工单的 锁排" + req + ";rrr:" + JsonConvert.SerializeObject(feedback)); } } } Rlock = Rlocks.FindAll(x => x.S_LOCK_STATE.Contains("出库锁")); if (Rlock.Any()) { foreach (var item in Rlock) { var locs = LocationHelper.GetList(x => x.S_AREA_CODE == item.S_AREA_CODE && x.N_ROW == item.N_ROW); if (locs.Find(x => x.N_CURRENT_NUM > 0) == null) WCSHelper.Do(db => db.Deleteable(item).ExecuteCommand()); } } Rlock = Rlocks.FindAll(x => x.S_LOCK_STATE.Contains("入库锁")); if (Rlock.Any()) { foreach (var item in Rlock) { var locs = LocationHelper.GetList(x => x.S_LOCK_STATE != "报废" && x.S_AREA_CODE == item.S_AREA_CODE && x.N_ROW == item.N_ROW); //var lastfull = locs.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); //if (lastfull != null) //{ // if (lastfull.N_CURRENT_NUM == lastfull.N_CAPACITY) // if (locs.Find(x => x.N_COL > lastfull.N_COL) == null) // LocationHelper.SetRowLock(item, 0); //} //如果一排内无货。也无锁。 可能是物料的入库取消了。 取消当前排锁,防止后续不入这个物料了依然占着排。 if (locs.Find(x => x.N_CURRENT_NUM > 0) == null && locs.Find(x => x.S_LOCK_STATE != "无") == null) WCSHelper.Do(db => db.Deleteable(item).ExecuteCommand()); else { var lastloC = locs.OrderByDescending(x => x.N_COL).FirstOrDefault(); if (lastloC.N_CURRENT_NUM == lastloC.N_CAPACITY) WCSHelper.Do(db => db.Deleteable(item).ExecuteCommand()); } } } } /// /// 领料出库。 公用于原材料出库。 /// internal static void BottleCapAuto5() { var db = new SqlHelper().GetInstance(); var alrs = db.Queryable().Where(x => x.WorkFromNo == "Auto" && x.State == "执行").ToList(); foreach (var item in alrs.FindAll(x => x.current < x.AreaNum)) { Location StartBit = null; List cir = null; string Sarea = ""; string Tasktype = ""; int startlay = 0; if (item.DeviceNo.Contains("-2-")) { var vc = item.DeviceNo.Split(new[] { "-2-" }, StringSplitOptions.None); Sarea = vc[0]; item.DeviceNo = vc[1]; Tasktype = vc[2]; if (vc.Length > 3) startlay = int.Parse(vc[3]); } else { Sarea = "ZXMKQ"; Tasktype = "青溪纸箱搬运物料"; } Location Eb = null; bool can = false; foreach (var loc in item.DeviceNo.Split(';')) { var Eb1 = LocationHelper.GetLoc(loc); if (Eb1 == null) continue; if (Eb1.N_CURRENT_NUM > 0 || Eb1.S_LOCK_STATE == "报废" || Eb1.S_LOCK_STATE == "空间锁") continue; if (Eb1.S_LOCK_STATE == "入库锁") { can = true; break; } if (Eb1.S_LOCK_STATE == "无") if (Eb == null) Eb = Eb1; } if (Eb == null || can) { //LogHelper.Info($"{item.DeviceNo} - 没有可用位置"); continue; } if (ABlist.Contains(Sarea)) { var ls = LocationHelper.GetList(x => x.S_AREA_CODE == Sarea && (x.S_LOCK_STATE == "入库锁" || x.S_LOCK_STATE == "出库锁")); if (ls.Any()) { LogHelper.Info($"{Sarea}任务数1管制 1"); continue; } } var loclist = LocationHelper.GetAreaNormalLocList(Sarea); foreach (var rlist in loclist.GroupBy(x => x.N_ROW).OrderBy(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(x => x.Key)) { var srloclist = rlist.ToList(); var lastFull = srloclist.FindAll(x => x.N_CURRENT_NUM > 0).OrderByDescending(x => x.N_COL).FirstOrDefault(); if (lastFull == null) continue; var lcr = LocationHelper.GetLocCntrRel(lastFull.S_LOC_CODE); if (!lcr.Any()) { LogHelper.Info($"{lastFull.S_LOC_CODE} - 位置,没有托盘,这个很异常!!!但我不报错"); continue; } if (string.IsNullOrEmpty(item.ItemCode) || lcr.FirstOrDefault().S_TYPE.Contains(item.ItemCode)) { StartBit = lastFull; cir = startlay < 2 ? new List() { lcr.FirstOrDefault() } : lcr; break; } var cntritems = ContainerHelper.GetCntrItemRel(lcr.FirstOrDefault()?.S_CNTR_CODE); if (!cntritems.Any()) { var cir1 = cntritems.FirstOrDefault(); if (cir1.S_ITEM_CODE == item.ItemCode) { cir = startlay < 2 ? new List() { lcr.FirstOrDefault() } : lcr; StartBit = lastFull; break; } } } if (StartBit != null) { var B = TaskProcess.CreateTransport(item.WorkNo, StartBit.S_LOC_CODE.Trim(), Eb.S_LOC_CODE.Trim(), Tasktype, cir.Select(x => x.S_CNTR_CODE).ToList(), startlay < 2 ? StartBit.N_CURRENT_NUM : 1, 1, 1, 60, cir.First().S_TYPE); } } var eb = LocationHelper.GetLoc("ZXSSX-1"); if (eb.S_LOCK_STATE == "无" && eb.N_CURRENT_NUM > 0) { var lcr = LocationHelper.GetLocCntrRel(eb.S_LOC_CODE); if (!lcr.Any()) { LogHelper.Info($"{eb.S_LOC_CODE} - 输送线位置,没有托盘。无法下空。"); return; } var loclist = LocationHelper.GetAreaNormalLocList("ZXKKQ"); Location endBit = null; foreach (var elllll in loclist.GroupBy(x => x.N_ROW).OrderByDescending(y => y.Count(x => x.N_CURRENT_NUM > 0))) { var rl = elllll.OrderBy(x => x.N_COL).ToList(); var lastFull = rl.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (lastFull == null) endBit = rl.FirstOrDefault(); else endBit = rl.Find(x => x.N_COL > lastFull.N_COL && x.N_CURRENT_NUM > 0); if (endBit != null) break; } if (endBit != null) { var B = TaskProcess.CreateTransport("", eb.S_LOC_CODE.Trim(), endBit.S_LOC_CODE.Trim(), "青溪纸箱空框搬运", new List { lcr.FirstOrDefault().S_CNTR_CODE }, eb.N_CURRENT_NUM, endBit.N_CURRENT_NUM + 1, 1, 60); } } return; } // static List ABlist = new List { "YWLAQWJ", "YWLBQWJ" }; static List CDlist = new List { "YWLCQSX", "YWLDQWJ" }; static bool InworkLock = false; /// /// 原材料 检测各流转位置。 写入托盘货位s_type 中 下一个目的地。就开始中转。 /// 2025.4.8 /// 1.清溪原材料测试与成品拆分 /// 2.进出口单据与CS异常处理 /// internal static void BottTask() { //InworkLock = false; var usingSpace = new List { "入库接驳区", "库内接驳区", "出库接驳区", "提升机退料口" }; //usingSpace = new List { "YWLRGDD", "YWLWJJB", "YWLYLTKQ", "YWLTKKTQ", "YWLKTDDQ", "YWLT1TSJ", "YWLT1TSJCD", "YWLT2TSJ", "YWLT2TSJCD" }; usingSpace = new List { "YWLRGDD", "YWLWJJB", "YWLYLTKQ", "YWLTKKTQ", "YWLT1TSJ", "YWLT2TSJ" }; foreach (var area in usingSpace) { try { var lolist = LocationHelper.GetAreaNormalLocList(area);// LocationHelper.GetList(x => x.S_AREA_CODE == area && x.S_LOCK_STATE != "报废"); var lgrow = lolist.GroupBy(x => x.N_ROW).OrderBy(x => x.Key); Dictionary> dsll = new Dictionary>(); foreach (var rows in lgrow) { var rowlist = rows.ToList(); var _cl = rowlist.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); if (_cl != null) { var _clrel = LocationHelper.GetLocCntrRel(_cl.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info(_cl.S_LOC_CODE + $"货位 的没有托盘 没有物料记录"); break; } var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); var cntritems = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE); 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 ll)) { ll.AddRange(rowlist); } else dsll.Add(cir1.S_ITEM_CODE, rowlist); } } if (dsll.Any()) foreach (var r in dsll) { foreach (var rows in r.Value.GroupBy(x => x.N_ROW).OrderBy(x => x.Key)) { var rowlist = rows.ToList(); //if (rowlist.FindAll((Location x) => x.S_LOCK_STATE.Trim() == "空间锁").Count > 0) { continue; } //if (rowlist.FindAll((Location x) => x.S_LOCK_STATE.Trim() != "无" && x.S_LOCK_STATE.Trim() != "报废").Count > 0) //{ // continue; //} var _cl = rowlist.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); if (_cl != null) { var _clrel = LocationHelper.GetLocCntrRel(_cl.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info(_cl.S_LOC_CODE + $"货位 的没有托盘 没有物料记录"); continue; } var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); //if (string.IsNullOrEmpty(EdnRarea)) if (!string.IsNullOrEmpty(_clrel0.S_TYPE)) { //string EdnRarea = string.Empty; //if (area == "YWLT1TSJ" || area == "YWLT2TSJ") // EdnRarea = "YWLYLTKQ"; //else var ccr = _clrel0.S_TYPE.Split(','); string EdnRarea = ccr.First(); string Last = string.Join(",", ccr.Skip(1)); if (ABlist.Contains(EdnRarea)) { var ls = LocationHelper.GetList(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁" || x.S_LOCK_STATE == "出库锁")); if (ls.Any()) { LogHelper.Info($"{EdnRarea}任务数1管制2"); continue; } } var cntritems = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE); if (!cntritems.Any()) continue; var cir1 = cntritems.First(); var arloclist = LocationHelper.GetAreaNormalLocList(EdnRarea);// LocationHelper.GetList(x => x.S_AREA_CODE == _clrel0.S_TYPE && x.S_LOCK_STATE != "报废"); if (arloclist.Any()) { if (EdnRarea == "YWLWJJB") // InworkLock = true; //else InworkLock = false; //if (od.S_ZZ_AREA == "YWLWJJB") { if (InworkLock) continue; else InworkLock = true; } else InworkLock = false; 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; bool isCd = false; if (CDlist.Contains(EdnRarea)) { isCd = true; inlock = LocationHelper.GetList(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(); if (inlock != null) { 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)) { rowlist = rss.OrderBy(x => x.N_COL).ToList(); //if (rowlist.FindAll((Location x) => x.S_LOCK_STATE.Trim() == "空间锁").Count > 0) { continue; } //if (rowlist.FindAll((Location x) => x.S_LOCK_STATE.Trim() != "无" && x.S_LOCK_STATE.Trim() != "报废").Count > 0) //{ // continue; //} var _cl2 = rowlist.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); endbit = rowlist.Find(x => x.N_COL > (_cl2?.N_COL ?? 0)); if (endbit == null) continue; if (_cl2 != null && (EdnRarea == "YWLYLTKQ" || EdnRarea == "YWLKTDDQ")) //退库区进行堆叠 { Last = ""; var rr_clrel = LocationHelper.GetLocCntrRel(_cl2.S_LOC_CODE); var s_clrel0 = rr_clrel.OrderByDescending(xx => xx.T_CREATE).FirstOrDefault(); if (s_clrel0 != null && string.IsNullOrEmpty(s_clrel0.S_TYPE)) { var cntrrel = ContainerHelper.GetCntrItemRel(rr_clrel.FirstOrDefault()?.S_CNTR_CODE).FirstOrDefault(); if (cntrrel.S_ITEM_CODE == cir1.S_ITEM_CODE && cntrrel.S_ITEM_NAME == cir1.S_ITEM_NAME && cntrrel.S_CJ_NAME == cir1.S_CJ_NAME) { if (_cl2.N_CURRENT_NUM < _cl2.N_CAPACITY) endbit = _cl2; else LogHelper.Info($"{EdnRarea}退库》使用{endbit.S_LOC_CODE}"); } else { endbit = null; continue; } } } else if (_cl2 != null) // 流转,匹配同排,不堆叠 { var rel = LocationHelper.GetLocCntrRel(_cl2.S_LOC_CODE); var cntrrel = ContainerHelper.GetCntrItemRel(rel.FirstOrDefault()?.S_CNTR_CODE).FirstOrDefault(); if (cntrrel == null) continue; if (cntrrel.S_ITEM_CODE == cir1.S_ITEM_CODE && cntrrel.S_ITEM_NAME == cir1.S_ITEM_NAME && cntrrel.S_CJ_NAME == cir1.S_CJ_NAME) { LogHelper.Info($"入库库》使用{endbit.S_LOC_CODE}"); } else { endbit = null; continue; } //} //else //{ // endbit = null; // continue; //} } if (endbit != null) break; } if (endbit != null) { 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) { 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 }; WCSHelper.Do(db => db.Insertable(rrrr).ExecuteCommand()); } if (EdnRarea == "YWLWJJB") InworkLock = false; break; } else if (EdnRarea == "YWLWJJB") InworkLock = false; } } } } } else if (InworkLock) InworkLock = false; } catch (Exception ex) { Console.WriteLine(ex.Message + "," + ex.StackTrace); } } } public class BQ_PRA { public static string Out = "OUT"; public static string B = "BACK"; public static string YWLRGDD = "YWLRGDD"; } class WJ_BQ { /// /// 入库堆叠区 /// public static string RK_BQDDQ = "WJBQDDKQ"; /// /// 仓库货架 /// public static string RK_BBHJQ = "WJBQ"; /// /// wj拆垛 /// public static string RK_BQCDQ = "WJBQDDKQ"; /// /// jiebo /// public static string RK_BQJBQ = "WJBQJBQ"; /// /// xianbian /// public static string RK_XBKQ = "WJXBKQ"; } class SX_BQ { /// /// 入库堆叠区 /// public static string RK_BQDDQ = "SXBQDDKQ"; /// /// 仓库货架 /// public static string RK_BBHJQ = "SXBQHJ"; public static string RK_BQCDQ = "SXBQDDKQ"; } internal static void YwlTKPEBQ_Auto() { LogHelper.CoCo(DateTime.Now + "标签-提扣-PE膜->>>>>>>>>>>> ", ConsoleColor.Cyan); var locsFirst1 = LocationHelper.GetAreaNormalLocList(BQ_PRA.YWLRGDD); var db = new SqlHelper().GetInstance(); var locsFirstA = db.Queryable()//标签绑定必须都是单层。 - 涉及堆叠与货架1层问题。 .InnerJoin((lcr, cir) => lcr.S_CNTR_CODE == cir.S_CNTR_CODE) //.LeftJoin((lcr, cir, item) => cir.S_ITEM_CODE == item.S_ITEM_CODE && cir.S_ITEM_NAME == item.S_ITEM_NAME) .InnerJoin((lcr, cir, lo) => lcr.S_LOC_CODE == lo.S_LOC_CODE) .Where((lcr, cir, lo) =>/* cir.S_ITEM_NAME.Contains("标签")&& */ locsFirst1.Select(x => x.S_LOC_CODE).Contains(lo.S_LOC_CODE) && lo.S_AREA_CODE == BQ_PRA.YWLRGDD) .Select((lcr, cir, lo) => new locCntItem { N_CURRENT_NUM = lo.N_CURRENT_NUM, S_TYPE = lcr.S_TYPE, S_LOC_CODE = lo.S_LOC_CODE, S_AREA_CODE = lo.S_AREA_CODE, N_ROW = lo.N_ROW, N_COL = lo.N_COL, HalfOrFull = (cir.N_BQ_TRAY_TYPE == .5 ? 1 : (cir.N_BQ_TRAY_TYPE == .75 ? 2 : 3)), 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_CJ_NAME = cir.S_CJ_NAME, S_CNTR_CODE = cir.S_CNTR_CODE }) .ToList(); 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("提扣-")); var PElocsFirst = locsFirstA.FindAll(x => x.S_NOTE.Contains("收缩膜-")); //if (mun % 20 == 0) //{ // Console.WriteLine("标签叉运人工绑定区-无菌:" + JsonConvert.SerializeObject(locsFirst)); // Console.WriteLine("标签叉运人工绑定区-水线:" + JsonConvert.SerializeObject(SlocsFirst)); //} var TASKs = new List(); var task1 = Task.Run(() => { try { var yuworders = LocationHelper.GetList(x => x.SQL_PLineNo == "无菌标签出库" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => !string.IsNullOrEmpty(x.TagOver) ? 1 : 2).ThenBy(x => x.TagOverTime).ToList(); if (!yuworders.Any()) { YwlBQ_CreInwork(locsFirst, WJ_BQ.RK_BQDDQ, WJ_BQ.RK_BBHJQ); } else { LogHelper.Info($" 无菌出库 工单开启中"); YwlBQ_CreWJOutOrder(); } YwlBQ_CreWJTK(); } catch (Exception ex) { LogHelper.Error(ex.Message, ex); } }); var plc = Settings.GetDeviceInfoList().Where(a => a.deviceName == "T2提升机").FirstOrDefault(); var task2 = Task.Run(() => { try { string pline = "T2提升机-标签"; var Syuworders = LocationHelper.GetList(x => x.SQL_PLineNo == pline && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => !string.IsNullOrEmpty(x.TagOver) ? 1 : 2).ThenBy(x => x.TagOverTime).ToList(); //yuworders = LocationHelper.GetList(x => x.SQL_PLineNo == plc.deviceName && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => !string.IsNullOrEmpty(x.TagOver) ? 1 : 2).ThenBy(x => x.TagOverTime).ToList(); var tklist = LocationHelper.GetList(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 == "无") { var rr_clrel = LocationHelper.GetLocCntrRel(loc.S_LOC_CODE); if (rr_clrel.FirstOrDefault()?.S_TYPE == BQ_PRA.B && DateTime.Now.Subtract(rr_clrel.FirstOrDefault()?.T_CREATE ?? DateTime.Now).TotalSeconds > 10) { var s_type = ContainerHelper.GetCntrItemRel(rr_clrel.FirstOrDefault().S_CNTR_CODE).FirstOrDefault()?.N_BQ_TRAY_TYPE ?? 0; if (s_type == 0) { LogHelper.CErrorLog($"{tk.SQL_WorkNo}-{tk.SQL_PLineNo} 退库工单开启,绑定的 零整 标记"); } Location Endbit = null; 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) { var re = TaskProcess.CreateTransport("", loc.S_LOC_CODE.Trim(), Endbit.S_LOC_CODE, "标签叉运-SX标签退库", rr_clrel.Select(x => x.S_CNTR_CODE).ToList(), 1, 1, 1, 62); LogHelper.CSucessLog($"from {loc.S_LOC_CODE} to {Endbit.S_LOC_CODE} 标签叉运-SX标签退库 ,创建{re}"); } } } } else if (Syuworders.Any()) { YwlBQ_CreSXOutOrder(plc, Syuworders.FindAll(x => x.OutNum > 0)); } } catch (Exception ex) { LogHelper.Error(ex.Message, ex); } }); var task3 = Task.Run(() => { try { //return; YwlPETKtkOrder("YWLZSXBKQ", "YWLTKMKQ", "提扣叉运");//提扣 中水 退库。 YwlPETKOutOrder("YWLTKMKQ", "YWLZSXBKQ", "提扣叉运", 1);//提扣中水出库 } catch (Exception ex) { LogHelper.Error(ex.Message, ex); } }); var task4 = Task.Run(() => { try { //return; ///起点数据。 终点库区 堆叠层数。 YwlPETK_CreInwork(PElocsFirst, "YWLTKMKQ", "提扣叉运", 3);//提扣入库--PE膜 YwlPETK_CreInwork(TKlocsFirst, "YWLTKMKQ", "收缩膜叉运", 1); // PE入库 --提扣 //YwlPETKtkOrder("YWLZSXBKQ", "YWLTKMKQ", "收缩膜叉运"); //YwlPETKOutOrder("YWLTKMKQ", "YWLZSXBKQ", "收缩膜叉运");// PE中出库 var tklist = LocationHelper.GetList(x => x.SQL_PLineNo == "T2提升机-收缩膜" && x.WorkType == 1 && x.SQL_State == "执行中"); if (tklist.Count() > 0) { LogHelper.Info("-收缩膜 退库!"); var tk = tklist.FirstOrDefault(); var loc = LocationHelper.GetLoc(plc.location[0]); if (loc.N_CURRENT_NUM > 0 && loc.S_LOCK_STATE == "无") { var rr_clrel = LocationHelper.GetLocCntrRel(loc.S_LOC_CODE); if (rr_clrel.FirstOrDefault()?.S_TYPE == BQ_PRA.B && DateTime.Now.Subtract(rr_clrel.FirstOrDefault()?.T_CREATE ?? DateTime.Now).TotalSeconds > 10) { var cir = ContainerHelper.GetCntrItemRel(rr_clrel.FirstOrDefault().S_CNTR_CODE).FirstOrDefault(); if (cir == null) { LogHelper.CErrorLog($"{loc.S_LOC_CODE} 没有托盘物料数据!!"); return; } var s_type = cir?.N_BQ_TRAY_TYPE ?? 0; if (s_type == 0) { LogHelper.CErrorLog($"{tk.SQL_WorkNo}-{tk.SQL_PLineNo} 退库工单开启,绑定的 零整 标记"); } Location Endbit = null; //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) //{ // var re = TaskProcess.CreateTransport("", loc.S_LOC_CODE.Trim(), Endbit.S_LOC_CODE, "收缩膜叉运-T2退库", rr_clrel.Select(x => x.S_CNTR_CODE).ToList(), 1, 1, 1, 62); // LogHelper.CSucessLog($"from {loc.S_LOC_CODE} to {Endbit.S_LOC_CODE} 标签叉运-T2退库 ,创建{re}"); //} 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); //有入库锁排。 能入就入。不能就等。 if (inlock != null) { var loclist1 = NormalList.FindAll(x => inlock.N_ROW == (x.N_ROW)); foreach (var rs in loclist1.GroupBy(x => x.N_ROW).OrderBy(x => x.Key * -1)) { 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, 3) && x.S_LOCK_STATE != "报废" && x.N_COL >= (lastfull?.N_COL ?? 0)); if (EndBit != null) break; } } else { var hasNum = NormalList.FindAll(x => x.N_CURRENT_NUM > 0).Select(x => x.N_ROW).Distinct(); var EptRowlist = NormalList.FindAll(x => !hasNum.Contains(x.N_ROW)); if (EptRowlist.Any()) { EndBit = EptRowlist.GroupBy(x => x.N_ROW).OrderBy(x => x.Key * (-1)).FirstOrDefault().ToList().OrderBy(x => x.N_COL).FirstOrDefault(); } } if (EndBit != null) { var res = TaskProcess.CreateTransport("", loc.S_LOC_CODE.Trim(), EndBit.S_LOC_CODE, "收缩膜叉运-入库", new List { cir.S_CNTR_CODE }, 1, EndBit.N_CURRENT_NUM + 1, 1, 62); LogHelper.CSucessLog($"from {loc.S_LOC_CODE} to {EndBit.S_LOC_CODE} {("收缩膜叉运-入库")} ,创建{res} "); if (res && inlock == null) { var r = new RowLock { S_LOCK_SRC = (cir.S_ITEM_CODE.Trim() + "&" + cir.S_ITEM_NAME.Trim() + hof), T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁", S_AREA_CODE = EndBit.S_AREA_CODE, N_ROW = EndBit.N_ROW }; var row = db.Queryable().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First(); if (row != null) { if (row.S_LOCK_SRC != r.S_LOCK_SRC) { db.Deleteable(row).ExecuteCommand(); db.Insertable(r).ExecuteCommand(); } } else db.Insertable(r).ExecuteCommand(); } } Thread.Sleep(1000); } } } else //YwlPETKOutOrder("YWLTKMKQ", "", "PE叉运");// PE小出库 { LogHelper.Info("-收缩膜 出库!"); var yuworders = LocationHelper.GetList(x => x.SQL_PLineNo == "T2提升机-收缩膜" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => !string.IsNullOrEmpty(x.TagOver) ? 1 : 2).ThenBy(x => x.TagOverTime).ToList(); if (!yuworders.Any()) { LogHelper.Info("-收缩膜 出库!没有出库单。"); return; } var ploc = plc.location[0]; retuse: var order = yuworders.FirstOrDefault(); if (yuworders.Count() > 0) { //var Cjsj = LocationHelper.GetList(x => yuworders.Select(c => c.S_CJ_NAME).ToList().Contains(x.S_CJ_NAME) && yuworders.Select(c => c.SQL_ItemCode).ToList().Contains(x.S_ITEM_CODE)); //if (Cjsj.Count() > 0) //{ // var Cj = Cjsj.OrderBy(e => e.T_CJ_TIME).ToList().FirstOrDefault(); // order = yuworders.Find(e => e.S_CJ_NAME == Cj.S_CJ_NAME && e.SQL_ItemCode == Cj.S_ITEM_CODE); //} } if (order != null) { var Porder = WCSHelper.GetWorkOrder(order.SQL_LinkLineNO); if (Porder == null) { LogHelper.CErrorLog("小水出库:" + (order.SQL_LinkLineNO) + "没有【执行中】的工单"); yuworders.Remove(order); goto retuse; } var oto = new List(); //if (!string.IsNullOrEmpty(order.TagOver)) // oto = order.TagOver.Split(',').ToList(); var oic = order.SQL_ItemCode?.Trim(); var oin = order.SQL_ItemName?.Trim(); if (string.IsNullOrEmpty(oic) || string.IsNullOrEmpty(oin)) { LogHelper.CErrorLog("小水出库:" + (order.SQL_WorkNo) + "没有【指定物料;"); goto retuse; } LogHelper.Info("-收缩膜 出库!" + oic + oin); string v = "YWLTKMKQ"; int ord = -1; locCntItem StartBit = null; Location EndBit = null; CntrItemRel cir = null; var rklist = LocationHelper.GetRowLock(v); var outlock = rklist.Find(x => x.S_AREA_CODE == v && x.S_LOCK_SRC == (oic + "&" + oin) && x.S_LOCK_STATE.Contains("出库锁")); var NormalList = LocationHelper.GetAreaNormalLocList(v); if (outlock != null) { NormalList = NormalList.FindAll(x => outlock.N_ROW == (x.N_ROW)); } var taglist = new List() { oic }; foreach (var item in NormalList.GroupBy(X => X.N_ROW).OrderBy(x => x.Key * ord)) { locCntItem Temp = null; var y = item.OrderBy(x => x.N_COL).ToList(); var lastfull = y.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (lastfull != null) { var CNTR = LocationHelper.GetList(x => x.S_LOC_CODE == lastfull.S_LOC_CODE); if (!CNTR.Any()) continue; var cirs = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE); if (!cirs.Any()) continue; cir = cirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault(); LogHelper.Info($"收缩膜 出库!{item.Key}排 [{cir.S_ITEM_CODE}-{order.SQL_ItemCode}] [{cir.S_ITEM_NAME}-{order.SQL_ItemName}] [{cir.S_CJ_NAME}-{order.S_CJ_NAME}] {(cir.S_ITEM_CODE == order.SQL_ItemCode && cir.S_ITEM_NAME == order.SQL_ItemName && cir.S_CJ_NAME == order.S_CJ_NAME)}"); if (cir.S_ITEM_CODE == order.SQL_ItemCode && cir.S_ITEM_NAME == order.SQL_ItemName && cir.S_CJ_NAME == order.S_CJ_NAME) { //plg 2025年6月13日 09:08:10 Temp = new locCntItem { N_CURRENT_NUM = lastfull.N_CURRENT_NUM, S_CNTR_CODE = cir.S_CNTR_CODE, S_LOC_CODE = lastfull.S_LOC_CODE, HalfOrFull = (cir.N_BQ_TRAY_TYPE == .5 ? 1 : (cir.N_BQ_TRAY_TYPE == .75 ? 2 : 3)), S_NOTE = cir.S_ITEM_CODE.Trim() + "&" + cir.S_ITEM_NAME.Trim(), S_CJ_NAME = cir.S_CJ_NAME }; if (outlock != null) { StartBit = Temp; break; } } if (Temp != null) { if (StartBit == null) StartBit = Temp; else if (StartBit.HalfOrFull > Temp.HalfOrFull) { StartBit = Temp; } if (StartBit.HalfOrFull == 1) break; } } } if (StartBit != null) { var tagLoc = StartBit; // 直接出提升机位 LogHelper.Info(order.SQL_PLineNo + $"-收缩膜出库!终点{ploc}-{DeviceProcess.doorStatus[ploc]?.info}"); if (!string.IsNullOrEmpty(ploc) && plc != null && DeviceProcess.doorStatus[ploc]?.info == "1") { var loc = LocationHelper.GetLoc(ploc); LogHelper.Info(order.SQL_PLineNo + $"-收缩膜出库!终点{loc.N_CURRENT_NUM}-{loc.S_LOCK_STATE}"); if (loc.N_CURRENT_NUM == 0 && loc.S_LOCK_STATE == "无") { var re = TaskProcess.CreateTransport("", tagLoc.S_LOC_CODE.Trim(), loc.S_LOC_CODE, "收缩膜叉运-货架出提升机", new List { tagLoc.S_CNTR_CODE }, StartBit.N_CURRENT_NUM, 1, 1, 62); LogHelper.CSucessLog($"from {tagLoc.S_LOC_CODE} to {loc.S_LOC_CODE} 收缩膜叉运-货架出提升机 ,创建{re} "); if (re) { oto.Add(oic); if (outlock == null) { var r = new RowLock { S_LOCK_SRC = (StartBit.S_NOTE /*+ StartBit.HalfOrFull*/), T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁", S_AREA_CODE = StartBit.S_AREA_CODE, N_ROW = StartBit.N_ROW }; db.Insertable(r).ExecuteCommand(); } } } } } else { LogHelper.Info(order.SQL_PLineNo + "-收缩膜 出库! 没有可用物料"); } var set1 = new HashSet(oto); var set2 = new HashSet(taglist); if (set1.SetEquals(set2)) { //order.OutNum++; order.OutNum--; order.TagOverTime = DateTime.Now; //order.TagOver = string.Empty; db.Updateable(order).UpdateColumns(it => new { /*it.TagOver,*/it.OutNum, it.TagOverTime }).ExecuteCommand(); LogHelper.CSucessLog($"{order.SQL_PLineNo}-{order.SQL_LinkLineNO} 标签完成。重置数据"); } } } } catch (Exception ex) { LogHelper.Error(ex.Message, ex); } }); Task.WaitAll(task1, task2, task3, task4); LogHelper.CoCo(DateTime.Now + "标签-提扣-PE膜- Over=============== ", ConsoleColor.Cyan); } /// /// 提扣,中水 退库 /// /// 线边 /// 仓库 /// 任务类型 /// private static void YwlPETKtkOrder(string v1, string v2, string v3) { var db = new SqlHelper().GetInstance(); var v = db.Queryable(). LeftJoin((l, c) => l.S_LOC_CODE == c.S_LOC_CODE) .Where((l, c) => (l.S_AREA_CODE == v1) && c.S_TYPE == BQ_PRA.B) .ToList(); if (v.Any()) { foreach (var area in v.Select(x => x.S_AREA_CODE).Distinct()) { var rowsss = v.FindAll(x => x.S_AREA_CODE == area).Select(x => x.N_ROW).Distinct(); var locs = LocationHelper.GetAreaNormalLocList(area).FindAll(x => rowsss.Contains(x.N_ROW)); foreach (var item in locs.GroupBy(x => x.N_ROW)) { var y = item.OrderBy(x => x.N_COL).ToList(); var lastfull1 = y.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (lastfull1 != null) { var CNTR = LocationHelper.GetList(x => x.S_LOC_CODE == lastfull1.S_LOC_CODE); if (!CNTR.Any()) continue; var cirs = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE); if (!cirs.Any()) continue; var cir = cirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault(); if (CNTR.FirstOrDefault().S_TYPE == BQ_PRA.B) { var s_type = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE).FirstOrDefault()?.N_BQ_TRAY_TYPE ?? 0; var rklist = LocationHelper.GetRowLock(v2); int hof = (s_type == .5 ? 1 : (s_type == .75 ? 2 : 3)); var inlock = rklist.Find(x => x.S_AREA_CODE == v2 && 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(v2); //有入库锁排。 能入就入。不能就等。 if (inlock != null) { var loclist1 = NormalList.FindAll(x => inlock.N_ROW == (x.N_ROW)); foreach (var rs in loclist1.GroupBy(x => x.N_ROW).OrderBy(x => x.Key * -1)) { 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, 3) && x.S_LOCK_STATE != "报废" && x.N_COL >= (lastfull?.N_COL ?? 0)); if (EndBit != null) break; } } else { var hasNum = NormalList.FindAll(x => x.N_CURRENT_NUM > 0).Select(x => x.N_ROW).Distinct(); var EptRowlist = NormalList.FindAll(x => !hasNum.Contains(x.N_ROW)); if (EptRowlist.Any()) { EndBit = EptRowlist.GroupBy(x => x.N_ROW).OrderBy(x => x.Key * (-1)).FirstOrDefault().ToList().OrderBy(x => x.N_COL).FirstOrDefault(); } } if (EndBit != null) { var res = TaskProcess.CreateTransport("", lastfull1.S_LOC_CODE.Trim(), EndBit.S_LOC_CODE, v3 + "-退库", new List { cir.S_CNTR_CODE }, lastfull1.N_CURRENT_NUM, EndBit.N_CURRENT_NUM + 1, 1, 62); LogHelper.CSucessLog($"from {lastfull1.S_LOC_CODE} to {EndBit.S_LOC_CODE} {v3}-退库 ,创建{res} "); if (res && inlock == null) { var r = new RowLock { S_LOCK_SRC = (cir.S_ITEM_CODE.Trim() + "&" + cir.S_ITEM_NAME.Trim() + hof), T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁", S_AREA_CODE = EndBit.S_AREA_CODE, N_ROW = EndBit.N_ROW }; db.Insertable(r).ExecuteCommand(); //var row = db.Queryable().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First(); //if (row != null) //{ // if (row.S_LOCK_SRC != r.S_LOCK_SRC) // { // db.Deleteable(row).ExecuteCommand(); // db.Insertable(r).ExecuteCommand(); // } //} //else db.Insertable(r).ExecuteCommand(); } } } } } } //执行退库。。。 Console.WriteLine($"{v.FirstOrDefault()?.S_LOC_CODE} 需要退库-- 自动退库-未实现"); } } private static void YwlBQ_CreWJTK() { var db = new SqlHelper().GetInstance(); var v = db.Queryable(). LeftJoin((l, c) => l.S_LOC_CODE == c.S_LOC_CODE) .Where((l, c) => (l.S_AREA_CODE == WJ_BQ.RK_XBKQ || l.S_AREA_CODE == WJ_BQ.RK_BQJBQ) && c.S_TYPE == BQ_PRA.B) .ToList(); if (v.Any()) { foreach (var area in v.Select(x => x.S_AREA_CODE).Distinct()) { var rowsss = v.FindAll(x => x.S_AREA_CODE == area).Select(x => x.N_ROW).Distinct(); var locs = LocationHelper.GetAreaNormalLocList(area).FindAll(x => rowsss.Contains(x.N_ROW)); foreach (var item in locs.GroupBy(x => x.N_ROW)) { var y = item.OrderBy(x => x.N_COL).ToList(); var lastfull = y.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (lastfull != null) { var CNTR = LocationHelper.GetList(x => x.S_LOC_CODE == lastfull.S_LOC_CODE); if (!CNTR.Any()) continue; var cirs = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE); if (!cirs.Any()) continue; var cir = cirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault(); if (CNTR.FirstOrDefault().S_TYPE == BQ_PRA.B) { var s_type = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE).FirstOrDefault()?.N_BQ_TRAY_TYPE ?? 0; Location Endbit = null; if (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 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 { var jbqs = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BQJBQ); foreach (var rowloc in jbqs.GroupBy(x => x.N_ROW)) { var y2 = rowloc.OrderBy(x => x.N_COL).ToList(); var l2 = y2.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (l2 != null && l2.N_CURRENT_NUM > 0) { var c = LocationHelper.GetList(x => x.S_LOC_CODE == l2.S_LOC_CODE); if (c.FirstOrDefault()?.S_TYPE != BQ_PRA.B) { continue; } var xcirs = ContainerHelper.GetCntrItemRel(c.FirstOrDefault().S_CNTR_CODE); if (!xcirs.Any()) continue; var xcir = xcirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault(); if (cir.S_ITEM_CODE != xcir.S_ITEM_CODE || cir.S_ITEM_NAME != xcir.S_ITEM_NAME) continue; } var e = y2.Find(x => x.N_COL > (l2?.N_COL ?? 0) && x.N_CURRENT_NUM == 0); if (e != null) { var re = TaskProcess.CreateTransport("", lastfull.S_LOC_CODE.Trim(), e.S_LOC_CODE, "标签叉运-线边标签退库", new List { CNTR.FirstOrDefault().S_CNTR_CODE }, 1, 1, 1, 62, BQ_PRA.B); LogHelper.Info($"from {lastfull.S_LOC_CODE} to {e.S_LOC_CODE} 标签叉运-线边标签退库 ,创建{re} "); break; } } } } } } } //执行退库。。。 // Console.WriteLine($"{v.FirstOrDefault()?.S_LOC_CODE} 需要退库-- 自动退库-未实现"); } } private static void YwlPETKOutOrder(string v, string v1, string v2, int v3 = 3) { List Orders = new List(); foreach (var pline in new[] { "提扣中水出库" }) { Orders = LocationHelper.GetList(x => x.SQL_PLineNo == pline && 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(); foreach (var od in Orders) { var oic = od.SQL_ItemCode?.Trim(); var oin = od.SQL_ItemName?.Trim(); if (string.IsNullOrEmpty(oic) || string.IsNullOrEmpty(oin)) { LogHelper.CErrorLog("小水出库:" + (od.SQL_WorkNo) + "没有【指定物料;"); continue; } int ord = oin.Contains("提扣") ? 1 : -1; locCntItem StartBit = null; Location EndBit = null; CntrItemRel cir = null; var rklist = LocationHelper.GetRowLock(v); var outlock = rklist.Find(x => x.S_AREA_CODE == v && x.S_LOCK_SRC == (oic + "&" + oin) && x.S_LOCK_STATE.Contains("出库锁")); var NormalList = LocationHelper.GetAreaNormalLocList(v); if (outlock != null) { NormalList = NormalList.FindAll(x => outlock.N_ROW == (x.N_ROW)); } foreach (var item in NormalList.GroupBy(X => X.N_ROW).OrderBy(x => x.Key * ord)) { locCntItem Temp = null; var y = item.OrderBy(x => x.N_COL).ToList(); var lastfull = y.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (lastfull != null) { var CNTR = LocationHelper.GetList(x => x.S_LOC_CODE == lastfull.S_LOC_CODE); if (!CNTR.Any()) continue; var cirs = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE); if (!cirs.Any()) continue; cir = cirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault(); if (cir.S_ITEM_CODE == od.SQL_ItemCode && cir.S_ITEM_NAME == od.SQL_ItemName && cir.S_CJ_NAME == od.S_CJ_NAME) { //plg 2025年6月13日 09:09:25 Temp = new locCntItem { N_CURRENT_NUM = lastfull.N_CURRENT_NUM, S_CNTR_CODE = cir.S_CNTR_CODE, S_LOC_CODE = lastfull.S_LOC_CODE, HalfOrFull = (cir.N_BQ_TRAY_TYPE == .5 ? 1 : (cir.N_BQ_TRAY_TYPE == .75 ? 2 : 3)), S_NOTE = cir.S_ITEM_CODE.Trim() + "&" + cir.S_ITEM_NAME.Trim(), S_CJ_NAME = cir.S_CJ_NAME }; if (outlock != null) { StartBit = Temp; break; } } if (Temp != null) { if (StartBit == null) StartBit = Temp; else if (StartBit.HalfOrFull > Temp.HalfOrFull) { StartBit = Temp; } if (StartBit.HalfOrFull == 1) break; } } } //} if (StartBit != null) { //var rklist = LocationHelper.GetRowLock(v); //var inlock = rklist.Find(x => x.S_LOCK_SRC == (cir.S_ITEM_CODE.Trim() + "&" + cir.S_ITEM_NAME.Trim() + (cir.N_BQ_TRAY_TYPE == .5 ? 1 : (cir.N_BQ_TRAY_TYPE == .75 ? 2 : 3))) && x.S_LOCK_STATE.Contains("出库锁")); var NormalList2 = LocationHelper.GetAreaNormalLocList(v1); //if (inlock != null) //{ // var loclist1 = NormalList.FindAll(x => inlock.N_ROW == (x.N_ROW)); foreach (var rs in NormalList2.GroupBy(x => x.N_ROW).OrderBy(x => x.Key)) { var srloclist = rs.OrderBy(x => x.N_COL).ToList(); var lastfull = srloclist.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (lastfull != null) { var CNTR = LocationHelper.GetList(x => x.S_LOC_CODE == lastfull.S_LOC_CODE); if (!CNTR.Any()) continue; if (CNTR.Find(x => x.S_TYPE == BQ_PRA.B) != null) continue; var cirs = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE); if (!cirs.Any()) continue; var cir2 = cirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault(); if (cir2.S_ITEM_CODE != od.SQL_ItemCode || cir2.S_ITEM_NAME != od.SQL_ItemName || StartBit.HalfOrFull != (cir.N_BQ_TRAY_TYPE == .5 ? 1 : (cir.N_BQ_TRAY_TYPE == .75 ? 2 : 3))) continue; EndBit = srloclist.Find(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM < Math.Min(x.N_CAPACITY, v3) && x.S_LOCK_STATE != "报废" && x.N_COL >= (lastfull?.N_COL ?? 0)); } if (EndBit != null) break; } //} //else if (EndBit == null) { var hasNum = NormalList2.FindAll(x => x.N_CURRENT_NUM > 0).Select(x => x.N_ROW).Distinct(); var EptRowlist = NormalList2.FindAll(x => !hasNum.Contains(x.N_ROW)); if (EptRowlist.Any()) { EndBit = EptRowlist.GroupBy(x => x.N_ROW).OrderBy(x => x.Key).FirstOrDefault().ToList().OrderBy(x => x.N_COL).FirstOrDefault(); } } //foreach (var item in sLocs.GroupBy(X => X.N_ROW).OrderBy(x => x.Key * ord)) //{ // var y = item.OrderBy(x => x.N_COL).ToList(); // var lastfull = y.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); // EndBit = y.Find(x => x.N_COL >= (lastfull?.N_COL ?? 0) && x.N_CURRENT_NUM == 0); // if (lastfull != null) // { // var CNTR = LocationHelper.GetList(x => x.S_LOC_CODE == lastfull.S_LOC_CODE); // if (!CNTR.Any()) continue; // if (CNTR.Find(x => x.S_TYPE == BQ_PRA.B) != null) continue; // var cirs = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE); // if (!cirs.Any()) continue; // var cir2 = cirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault(); // if (cir2.S_ITEM_CODE != od.SQL_ItemCode || cir2.S_ITEM_NAME != od.SQL_ItemName) // continue; // } // if (EndBit != null) // break; //} if (EndBit != null) { var re = TaskProcess.CreateTransport("", StartBit.S_LOC_CODE.Trim(), EndBit.S_LOC_CODE, (oin.Contains("提扣") ? "提扣" : "收缩膜") + "叉运-出库线边", new List { StartBit.S_CNTR_CODE }, StartBit.N_CURRENT_NUM, 1, 1, 62); LogHelper.Info($"from {StartBit.S_LOC_CODE} to {EndBit.S_LOC_CODE} {pline}-出库线边 ,创建{re} "); if (re) { od.TagOverTime = DateTime.Now; od.OutNum--; WCSHelper.Do(db => { db.Updateable(od).UpdateColumns(it => new { it.TagOverTime, it.OutNum }).ExecuteCommand(); //var r = new RowLock { S_LOCK_SRC = (StartBit.S_NOTE + StartBit.HalfOrFull), T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁", S_AREA_CODE = StartBit.S_AREA_CODE, N_ROW = StartBit.N_ROW }; //var row = db.Queryable().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First(); //if (row != null) //{ // if (row.S_LOCK_SRC != r.S_LOCK_SRC) // { // db.Deleteable(row).ExecuteCommand(); // db.Insertable(r).ExecuteCommand(); // } //} //else if (outlock == null) { var r = new RowLock { S_LOCK_SRC = (StartBit.S_NOTE /*+ StartBit.HalfOrFull*/), T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁", S_AREA_CODE = StartBit.S_AREA_CODE, N_ROW = StartBit.N_ROW }; db.Insertable(r).ExecuteCommand(); } }); } break; } } } } } /// /// 入库退库。 知道 零头满托。正常匹配。 /// /// /// /// /// private static void YwlPETK_CreInwork(List klocsFirst, string v, string v2, int v1 = 3) { bool ord = v2.Contains("提扣"); 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(); if (rsfull != null) { 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); //有入库锁排。 能入就入。不能就等。 if (inlock != null) { var loclist1 = NormalList.FindAll(x => inlock.N_ROW == (x.N_ROW)); foreach (var rs in loclist1.GroupBy(x => x.N_ROW).OrderBy(x => x.Key * (ord ? 1 : -1))) { 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)); if (EndBit != null) break; } } else { var hasNum = NormalList.FindAll(x => x.N_CURRENT_NUM > 0).Select(x => x.N_ROW).Distinct(); var EptRowlist = NormalList.FindAll(x => !hasNum.Contains(x.N_ROW)); if (EptRowlist.Any()) { EndBit = EptRowlist.GroupBy(x => x.N_ROW).OrderBy(x => x.Key * (ord ? 1 : -1)).FirstOrDefault().ToList().OrderBy(x => x.N_COL).FirstOrDefault(); } } if (EndBit != null) { var res = TaskProcess.CreateTransport("", rsfull.S_LOC_CODE.Trim(), EndBit.S_LOC_CODE, v2 + "-入库", new List { rsfull.S_CNTR_CODE }, rsfull.N_CURRENT_NUM, 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) { var r = new RowLock { S_LOCK_SRC = rsfull.S_NOTE + rsfull.HalfOrFull, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁", S_AREA_CODE = EndBit.S_AREA_CODE, N_ROW = EndBit.N_ROW }; var db = new SqlHelper().GetInstance(); db.Insertable(r).ExecuteCommand(); //else //{ // if (inlock.N_ROW != EndBit.N_ROW) // { // db.Deleteable(inlock).ExecuteCommand(); // var row = db.Queryable().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First(); // if (row != null) // { // if (row.S_LOCK_SRC != r.S_LOCK_SRC) // { // db.Deleteable(row).ExecuteCommand(); // db.Insertable(r).ExecuteCommand(); // } // } // else db.Insertable(r).ExecuteCommand(); // } //} } } Thread.Sleep(1000); } } } private static void YwlBQ_CreSXOutOrder(Settings.deviceInfo plc, List yuworders) { //LogHelper.Info($"{plc.deviceName}-标签 {yuworders.FirstOrDefault()?.SQL_WorkNo}"); var ploc = plc.location[0]; var db = new SqlHelper().GetInstance(); //拆垛区取消。 if (false) { ///第二段:拆垛区。拆去上提升机。 或者回库。 var v = LocationHelper.GetAreaNormalLocList(SX_BQ.RK_BQCDQ); ///拆垛的出库。 单层的回库 单层不入拆垛区 foreach (var item in v.GroupBy(x => x.N_ROW)) { var y = item.OrderBy(x => x.N_COL).ToList(); var lastfull = y.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (lastfull != null) { var CNTR = LocationHelper.GetList(x => x.S_LOC_CODE == lastfull.S_LOC_CODE); if (lastfull.N_CURRENT_NUM == 2) { if (CNTR.Find(x => x.S_TYPE == BQ_PRA.Out) == null) { LogHelper.CError($" 开启出库流程。 堆叠区是入库堆叠托盘,终止出库。 这里可以执行入库。"); return; } ///TODO - 对应的提升机信号 + 位置状态 + 已经放置时间>10 //拆一个到提升机 -有退库信号 或者 连接工单全关了。就关闭信号直接写0 //水线标签 //var od_ = LocationHelper.GetList(x => x.SQL_PLineNo == "水线标签提升机" && x.WorkType == 6 && x.SQL_State == "执行中").FirstOrDefault(); //var pc = Settings.GetDeviceInfoList().Where(a => a.deviceName == "水线标签提升机").FirstOrDefault(); //var ploc = plc.location[0]; if (!string.IsNullOrEmpty(ploc) && plc != null && DeviceProcess.doorStatus[ploc]?.info == "1") { var loc = LocationHelper.GetLoc(ploc); if (loc.N_CURRENT_NUM == 0 && loc.S_LOCK_STATE == "无") { var re = TaskProcess.CreateTransport("", lastfull.S_LOC_CODE.Trim(), loc.S_LOC_CODE, "标签叉运-拆垛接驳", new List { CNTR.FirstOrDefault().S_CNTR_CODE }, 2, 1, 1, 62); LogHelper.CSucessLog($"from {lastfull.S_LOC_CODE} to {loc.S_LOC_CODE} 标签叉运-拆垛接驳 ,创建{re} "); break; } } } else { //回货架 var hjs = LocationHelper.GetList(x => x.S_AREA_CODE == SX_BQ.RK_BBHJQ).FindAll(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0).OrderBy(x => x.N_LAYER).ThenBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); if (hjs != null) { var re = TaskProcess.CreateTransport("", lastfull.S_LOC_CODE.Trim(), hjs.S_LOC_CODE, "标签叉运-拆垛回", new List { CNTR.FirstOrDefault().S_CNTR_CODE }, 2, 1, 1, 62); LogHelper.CSucessLog($"from {lastfull.S_LOC_CODE} to {hjs.S_LOC_CODE} 标签叉运-拆垛回 ,创建{re} "); break; } } } } } ///第一段:出库 -到拆垛或者 接驳。 //var yuworders = LocationHelper.GetList(x => x.SQL_PLineNo == plc.deviceName && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => !string.IsNullOrEmpty(x.TagOver) ? 1 : 2).ThenBy(x => x.TagOverTime).ToList(); //foreach (var order in yuworders) retuse: var order = yuworders.FirstOrDefault(); if (order != null) { var Porder = WCSHelper.GetWorkOrder(order.SQL_LinkLineNO); if (Porder == null) { LogHelper.CErrorLog("SX标签出库:" + (order.SQL_LinkLineNO) + "没有【执行中】的工单"); yuworders.Remove(order); goto retuse; } var oto = new List(); //if (!string.IsNullOrEmpty(order.TagOver)) // oto = order.TagOver.Split(',').ToList(); var oic = order.SQL_ItemCode; var oin = order.SQL_ItemName; if (string.IsNullOrEmpty(oic) || string.IsNullOrEmpty(oin)) { LogHelper.CErrorLog("SX标签出库:" + (order.SQL_WorkNo) + "没有【指定物料;"); goto retuse; } //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == oic && x.S_ITEM_NAME == oin); //按顺序匹配标签,直到完成所有标签。后 清空标签,并重置标签完成时间= 当前时间。 var hjs = db.Queryable() .LeftJoin((l, lc) => l.S_LOC_CODE == lc.S_LOC_CODE) .LeftJoin((l, lc, ci) => lc.S_CNTR_CODE == ci.S_CNTR_CODE) .Where((l, lc, ci) => l.S_AREA_CODE == SX_BQ.RK_BBHJQ && l.S_LOCK_STATE == "无").Select((l, lc, ci) => new locCntItem { N_CURRENT_NUM = l.N_CURRENT_NUM, S_TYPE = lc.S_TYPE, S_LOC_CODE = l.S_LOC_CODE, S_AREA_CODE = l.S_AREA_CODE, HalfOrFull = (ci.N_BQ_TRAY_TYPE == .5 ? 1 : (ci.N_BQ_TRAY_TYPE == .75 ? 2 : 3)), // 半托为0.5 整托为1 。 转换为整数( *2 )。 半托为>1,整托>2 N_LAYER = l.N_LAYER, S_NOTE = ci.S_ITEM_CODE.Trim() + "&" + ci.S_ITEM_NAME.Trim(), S_ITEM_CODE = ci.S_ITEM_CODE, S_ITEM_NAME = ci.S_ITEM_NAME, S_CNTR_CODE = ci.S_CNTR_CODE }).ToList(); var taglist = new List() { oic }; //if (!string.IsNullOrEmpty(item_.S_BQ_NAME)) // taglist = item_.S_BQ_NAME.Split(',').ToList(); //LogHelper.Info($"{plc.deviceName}-标签{hjs.Count}>> {yuworders.FirstOrDefault()?.SQL_WorkNo} {item_.S_BQ_NAME}"); foreach (var item in taglist) { //if (oto.Contains(item)) // continue; //var Ii = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item); //if (Ii == null) //{ // LogHelper.CError($"{order.SQL_WorkNo} - {order.SQL_PLineNo} - {item} 物料顺序不存在。"); // return; //} var tagLoc = hjs.FindAll(x => x.S_ITEM_CODE == oic/* Ii.S_ITEM_CODE*/ && x.S_ITEM_NAME == oin/*Ii.S_ITEM_NAME x.S_NOTE == (Ii.S_ITEM_CODE + "&" + Ii.S_ITEM_NAME)*/).OrderBy(x => x.HalfOrFull).FirstOrDefault(); //LogHelper.Info($"{plc.deviceName}-标签{tagLoc.S_LOC_CODE}//{DeviceProcess.doorStatus[ploc]?.info}-----{(!string.IsNullOrEmpty(ploc) && plc != null && DeviceProcess.doorStatus[ploc]?.info == "1")}"); if (tagLoc != null) { if (tagLoc.N_LAYER == 1 || tagLoc.N_CURRENT_NUM == 1) { // 直接出提升机位 //var pc = Settings.GetDeviceInfoList().Where(a => a.deviceName == "水线标签提升机").FirstOrDefault(); if (!string.IsNullOrEmpty(ploc) && plc != null && DeviceProcess.doorStatus[ploc]?.info == "1") { var loc = LocationHelper.GetLoc(ploc); if (loc.N_CURRENT_NUM == 0 && loc.S_LOCK_STATE == "无") { var re = TaskProcess.CreateTransport("", tagLoc.S_LOC_CODE.Trim(), loc.S_LOC_CODE, "标签叉运-货架出提升机", new List { tagLoc.S_CNTR_CODE }, 1, 1, 1, 62); LogHelper.CSucessLog($"from {tagLoc.S_LOC_CODE} to {loc.S_LOC_CODE} 标签叉运-货架出提升机 ,创建{re} "); if (re) oto.Add(item); break; } } // 直接出接驳位 //var jbqs = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BQJBQ); //foreach (var rowloc in jbqs.GroupBy(x => x.N_ROW)) //{ //var y2 = rowloc.OrderBy(x => x.N_COL).ToList(); //var l2 = y2.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); //if (l2 != null && l2.N_CURRENT_NUM == 1) //{ // var c = LocationHelper.GetList(x => x.S_LOC_CODE == l2.S_LOC_CODE); // if (c.FirstOrDefault()?.S_TYPE == BQ_PRA.B) // { // continue; // } //} //var e = y2.FindAll(x => x.N_COL > (l2?.N_COL ?? 0) && x.N_CURRENT_NUM == 0).FirstOrDefault(); //if (e != null) //{ // var re = TaskProcess.CreateTransport("", tagLoc.S_LOC_CODE.Trim(), e.S_LOC_CODE, "标签叉运-货架出接驳", new List { tagLoc.S_WH_CODE }, 2, 1, 1, 62); // LogHelper.Info($"from {tagLoc.S_LOC_CODE} to {e.S_LOC_CODE} 标签叉运-货架出接驳 ,创建{re} "); // if (re) // oto.Add(item); // break; //} //} } else { var taglocs = hjs.FindAll(x => x.S_LOC_CODE == tagLoc.S_LOC_CODE); var v = LocationHelper.GetAreaNormalLocList(SX_BQ.RK_BQCDQ); foreach (var cdr in v.GroupBy(x => x.N_ROW)) { var y2 = cdr.OrderBy(x => x.N_COL).ToList(); var l2 = y2.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); var e = y2.FindAll(x => x.N_COL > (l2?.N_COL ?? 0) && x.N_CURRENT_NUM == 0).FirstOrDefault(); if (e != null) { var tgs = taglocs.Select(x => x.S_CNTR_CODE).ToList(); var re = TaskProcess.CreateTransport("", tagLoc.S_LOC_CODE.Trim(), e.S_LOC_CODE, "标签叉运-货架出拆垛", tgs, 1, 1, tgs.Count, 62, BQ_PRA.Out); LogHelper.CSucessLog($"from {tagLoc.S_LOC_CODE} to {e.S_LOC_CODE} 标签叉运-货架出拆垛 ,创建{re} "); if (re) oto.Add(item); break; } } } } else { LogHelper.CError("水线标签出库:" + (order.SQL_LinkLineNO) + $" 货架上没有这个[{item}]标签物料。"); } } var set1 = new HashSet(oto); var set2 = new HashSet(taglist); if (set1.SetEquals(set2)) { order.TagOverTime = DateTime.Now; order.OutNum--; //order.TagOver = string.Empty; db.Updateable(order).UpdateColumns(it => new { /*it.TagOver,*/it.OutNum, it.TagOverTime }).ExecuteCommand(); LogHelper.CSucessLog($"{order.SQL_PLineNo}-{order.SQL_LinkLineNO} 标签完成。重置数据"); } else { //string otgo = string.Join(",", oto); //if (order.TagOver != otgo) //{ // order.TagOver = otgo; // db.Updateable(order).UpdateColumns(it => new { it.TagOver }).ExecuteCommand(); //} } } } /// /// /// /// internal static void YwlBQ_CreInwork(List locsFirst, string RK_BQDDQ, string RK_BBHJQ) { //1 半托直接上货架一层。 var lgrx = locsFirst.GroupBy(X => X.N_ROW).Select(x => { var y11 = x.OrderBy(y => y.N_COL).ToList(); var y1 = y11.FindAll(z => z.N_CURRENT_NUM > 0).LastOrDefault(); return y1; }).ToList(); #region 2025年5月30日15:16:20 最新变更。 入库按零头1 入货架1 零头2入货架2 整托入货架3. var hojs = LocationHelper.GetList(x => x.S_AREA_CODE == RK_BBHJQ).FindAll(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0); foreach (var lastfull in lgrx.OrderBy(x => x.HalfOrFull).ThenBy(x => x.N_ROW)) { var hojsFisrt = hojs.FindAll(x => x.N_LAYER == lastfull.HalfOrFull).OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); if (hojsFisrt != null) { var desc = "标签叉运-" + (lastfull.HalfFull) + "入货架"; var re = TaskProcess.CreateTransport("", lastfull.S_LOC_CODE.Trim(), hojsFisrt.S_LOC_CODE, desc, new List { lastfull.S_CNTR_CODE }, 1, 1, 1, 62); LogHelper.Info($"from {lastfull.S_LOC_CODE} to {hojsFisrt.S_LOC_CODE} 标签叉运-{desc} ,创建{re} "); if (re) { hojs.Remove(hojsFisrt); } } } #endregion return; //1 半托直接上货架一层。 lgrx = locsFirst.GroupBy(X => X.N_ROW).Select(x => { var y11 = x.OrderBy(y => y.N_COL).ToList(); var y1 = y11.FindAll(z => z.N_CURRENT_NUM > 0).LastOrDefault(); return y1; }).ToList(); foreach (var lastfull in lgrx.FindAll(x => x.HalfOrFull == 2).OrderBy(x => x.HalfOrFull).ThenBy(x => x.N_ROW)) { //var y = item.OrderBy(x => x.N_COL).ToList(); //var lastfull = y.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (lastfull != null) { //半托 if (lastfull.HalfOrFull == 1) { var locHJs = LocationHelper.GetList(x => x.S_AREA_CODE == RK_BBHJQ).FindAll(x => x.S_LOCK_STATE == "无" && x.N_LAYER == 1); //如果false 表示半托 在1层没位置了。 if (!from_mid_to(lastfull, null, locHJs)) break; lgrx.Remove(lastfull); locsFirst.Remove(lastfull); ////locsFirst.RemoveAll(x => x.N_ROW == lastfull.N_ROW); //locsFirst.RemoveAll(x => x.N_ROW == lastfull.N_ROW); } else break; } } //。开始 堆叠区空了,就先放一个整托。 半托不入一层堆叠区。 var DDQs = LocationHelper.GetAreaNormalLocList(RK_BQDDQ); var jump = true; if (DDQs.Find(x => x.N_CURRENT_NUM > 0) == null || jump) { if (DDQs.Any() && lgrx.Any()) { var f = DDQs.First(); var lo = lgrx.FindAll(x => x.HalfOrFull == 2).OrderBy(x => x.N_ROW).FirstOrDefault(); if (locsFirst.Count(x => x.S_NOTE == lo.S_NOTE) > 1 && !jump) //可堆叠 { if (f != null && lo != null) { var re = TaskProcess.CreateTransport("", lo.S_LOC_CODE.Trim(), f.S_LOC_CODE, "标签叉运-整托入堆叠", new List { lo.S_CNTR_CODE }, 1, 1, 1, 62); LogHelper.Info($"from {lo.S_LOC_CODE} to {f.S_LOC_CODE} 标签叉运-整托入堆叠 ,创建{re} "); } } else//当前标签就只此一个。直接上架。 - 所以不存在1.【外面没货了,堆叠有1个。】 2【外面有货,堆叠是独立的】 { var locHJs = LocationHelper.GetList(x => x.S_AREA_CODE == RK_BBHJQ).FindAll(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0); var Ebit = locHJs.OrderBy(x => x.N_LAYER).ThenBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); if (Ebit != null && lo != null) { var re = TaskProcess.CreateTransport("", lo.S_LOC_CODE.Trim(), Ebit.S_LOC_CODE, "标签叉运-单1层入库", new List { lo.S_CNTR_CODE }, 1, 1, 1, 62); LogHelper.Info($"from {lo.S_LOC_CODE} to {Ebit.S_LOC_CODE} 标签叉运-单1层入库 ,创建{re} "); } } } } else { ///货架没位置就停止。 var locHJs = LocationHelper.GetList(x => x.S_AREA_CODE == RK_BBHJQ).FindAll(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0); if (!locHJs.Any()) return; var locHJs2 = locHJs.FindAll(x => x.N_CURRENT_NUM == 0 && x.N_LAYER == 2); //101 1.没有2层货架了。 - 1层的堆叠-直接入库 //102 2.有2层货架,有2层直接入库。 //103 3.有2层货架,1层堆叠开始堆2层 //104 4.有2层货架,1层叠不了2层,直接入库优先从1层开始。 //101 if (!locHJs2.Any())//2层mei有货位 { Location startbit = null; List rel = null; foreach (var f in DDQs.FindAll(x => x.N_CURRENT_NUM == 1)) { if (f == null) continue; rel = LocationHelper.GetLocCntrRel(f.S_LOC_CODE); if (rel.Count == 1) { startbit = f; } if (startbit != null) break; } if (startbit == null) return; var locHJs1 = locHJs.FindAll(x => x.N_CURRENT_NUM == 0 && x.N_LAYER == 1); var HJ_loc = locHJs1.OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).First(); if (HJ_loc == null) return; var re = TaskProcess.CreateTransport("", startbit.S_LOC_CODE.Trim(), HJ_loc.S_LOC_CODE, "标签叉运-1层入库", rel.Select(x => x.S_CNTR_CODE).ToList(), 1, 1, 1, 62); LogHelper.Info($"from {startbit.S_LOC_CODE} to {HJ_loc.S_LOC_CODE} 标签叉运-1层入库 ,创建{re} "); } else { //102 //有堆叠2层 Location startbit = null; List rel = null; var ddqs2 = DDQs.FindAll(x => x.N_CURRENT_NUM == 2); if (ddqs2.Any()) { foreach (var f in ddqs2) { if (f == null) continue; rel = LocationHelper.GetLocCntrRel(f.S_LOC_CODE); if (rel.Count == 2) { if (rel.Find(x => x.S_TYPE == BQ_PRA.Out) != null) { LogHelper.CError($" 开启出库流程。 堆叠区是出库堆叠托盘,终止入库。"); return; } startbit = f; } if (startbit != null) break; } if (startbit != null && locHJs2.Any()) { var HJ_loc = locHJs2.OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).First(); var re = TaskProcess.CreateTransport("", startbit.S_LOC_CODE.Trim(), HJ_loc.S_LOC_CODE, "标签叉运-2层入库", rel.Select(x => x.S_CNTR_CODE).ToList(), 1, 1, 1, 62); LogHelper.Info($"from {startbit.S_LOC_CODE} to {HJ_loc.S_LOC_CODE} 标签叉运-2层入库 ,创建{re} "); locHJs2.Remove(HJ_loc); DDQs.Remove(startbit); } } //货架2有位置 。 外侧有位置。 有一层的就堆2层。 if (locHJs2.Any() && DDQs.Any()) { bool canIn = true; //103 //堆叠1层的 开始叠2层。 foreach (var f in DDQs.FindAll(x => x.N_CURRENT_NUM == 1)) { rel = LocationHelper.GetLocCntrRel(f.S_LOC_CODE); if (rel.Count != 1) continue; var r = ContainerHelper.GetCntrItemRel(rel.First().S_CNTR_CODE).FirstOrDefault(); if (r == null) continue; var startbit2 = lgrx.FindAll(x => x.S_ITEM_CODE == r.S_ITEM_CODE && x.S_ITEM_NAME == r.S_ITEM_NAME/* x.S_NOTE.Contains($"{r.S_ITEM_CODE}&{r.S_ITEM_NAME}")*/).OrderBy(x => x.HalfOrFull)/*(优先半托)*/.FirstOrDefault(); if (startbit2 != null) { var re = TaskProcess.CreateTransport("", startbit2.S_LOC_CODE.Trim(), f.S_LOC_CODE, "标签叉运-2层入堆叠", new List { startbit.S_WH_CODE }, 1, 2, 1, 62); LogHelper.Info($"from {startbit.S_LOC_CODE} to {f.S_LOC_CODE} 标签叉运-2层入堆叠 ,创建{re} "); canIn = false; break; } } } ////104 -- 入堆叠空时 判断了,如果单物料直接上货架。所以不需要这个了 ////- 第二次修正:改为 绑定区空了。 这里有啥入啥吧。2层入库上面写了。 这里就不管了。直接入 //if (!lgrx.Any() && false) //{ // var f = DDQs.FindAll(x => x.N_CURRENT_NUM == 1).FirstOrDefault(); // rel = LocationHelper.GetLocCntrRel(f.S_LOC_CODE); // if (rel.Count != 1) return; // var r = ContainerHelper.GetCntrItemRel(rel.First().S_CNTR_CODE).FirstOrDefault(); // if (r == null) return; // if (locsFirst.Find(x => x.S_NOTE.Contains(r.S_ITEM_CODE + "&" + r.S_ITEM_NAME)) != null) return; // var Ebit = LocationHelper.GetList(x => x.S_AREA_CODE == RK_BBHJQ).FindAll(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0).OrderBy(x => x.N_LAYER).ThenBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); // if (f != null && Ebit != null) // { // var re = TaskProcess.CreateTransport("", f.S_LOC_CODE.Trim(), Ebit.S_LOC_CODE, "标签叉运-单1层入库", rel.Select(x => x.S_CNTR_CODE).ToList(), 1, 1, 1, 62); // LogHelper.Info($"from {f.S_LOC_CODE} to {Ebit.S_LOC_CODE} 标签叉运-单1层入库 ,创建{re} "); // } //} } } Console.WriteLine("标签叉运-结束!"); } /// /// 1.无菌出库。 单词1版???? /// /// internal static void YwlBQ_CreWJOutOrder() { LogHelper.Info($" 无菌出库 开始"); //1.检查是否有退库 var db = new SqlHelper().GetInstance(); ///第三段:接驳区 转 线边 var JQBS = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BQJBQ); foreach (var jbr in JQBS.GroupBy(x => x.N_ROW)) { LogHelper.Info($" 无菌出库 接驳有数据"); var y2 = jbr.OrderBy(x => x.N_COL).ToList(); var l2 = y2.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (l2 != null) { var c = LocationHelper.GetList(x => x.S_LOC_CODE == l2.S_LOC_CODE); if (!c.Any() || c.FirstOrDefault()?.S_TYPE == BQ_PRA.B) { //回库。 LogHelper.Info($"循环有无退库==> 有 退库" + l2.S_LOC_CODE); continue; } var cirs = ContainerHelper.GetCntrItemRel(c.FirstOrDefault().S_CNTR_CODE); if (!cirs.Any()) { LogHelper.Info($"循环有无退库==> 没有物料信息 托盘:" + c.FirstOrDefault().S_CNTR_CODE); continue; } var cir = cirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault(); var xbqs = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_XBKQ); foreach (var x1 in xbqs.GroupBy(x => x.N_ROW)) { LogHelper.Info($" 无菌出库 线边有数据"); var x2 = x1.OrderBy(x => x.N_COL).ToList(); var l3 = x2.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (l3 != null) { var xc = LocationHelper.GetList(x => x.S_LOC_CODE == l3.S_LOC_CODE); if (!xc.Any() || xc.FirstOrDefault()?.S_TYPE == BQ_PRA.B) { LogHelper.Info($"循环线边==> 有 退库" + xc.FirstOrDefault()?.S_TYPE); continue; } var xcirs = ContainerHelper.GetCntrItemRel(xc.FirstOrDefault().S_CNTR_CODE); if (!xcirs.Any()) { LogHelper.Info($"循环线边==> 没有物料信息 托盘:" + xc.FirstOrDefault().S_CNTR_CODE); continue; } var xcir = xcirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault(); if (xcir.S_ITEM_CODE != cir.S_ITEM_CODE || xcir.S_ITEM_NAME != cir.S_ITEM_CODE) { LogHelper.Info($"循环线边==> 物料不匹配 托盘:" + xc.FirstOrDefault().S_CNTR_CODE); continue; } } var e = x2.FindAll(x => x.N_COL > (l3?.N_COL ?? 0) && x.N_CURRENT_NUM == 0).FirstOrDefault(); LogHelper.Info($"无菌 生成任务==> 是否有合适的货位信息" + e?.S_LOC_CODE); if (e != null) { var re = TaskProcess.CreateTransport("", l2.S_LOC_CODE.Trim(), e.S_LOC_CODE, "标签叉运-接驳转线边", new List { c.FirstOrDefault().S_CNTR_CODE }, 1, 1, 1, 62, BQ_PRA.Out); LogHelper.Info($"from {l2.S_LOC_CODE} to {e.S_LOC_CODE} 标签叉运-接驳转线边 ,创建{re} "); break; } } } } LogHelper.Info($" 无菌出库 到线边 结束"); ///拆垛区取消。 if (false) { ///第二段:拆垛区。拆去接驳。 或者回库。 var v = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BQCDQ); ///拆垛的出库。 单层的回库 单层不入拆垛区 foreach (var item in v.GroupBy(x => x.N_ROW)) { var y = item.OrderBy(x => x.N_COL).ToList(); var lastfull = y.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (lastfull != null) { var CNTR = LocationHelper.GetList(x => x.S_LOC_CODE == lastfull.S_LOC_CODE); if (lastfull.N_CURRENT_NUM == 2) { if (CNTR.Find(x => x.S_TYPE == BQ_PRA.Out) == null) { LogHelper.CError($" 开启出库流程。 堆叠区是入库堆叠托盘,终止出库。 这里可以执行入库。"); return; } //拆一个到接驳 - 接驳位排,如果是退库的,就换一排。 var jbqs = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BQJBQ); foreach (var rowloc in jbqs.GroupBy(x => x.N_ROW)) { var y2 = rowloc.OrderBy(x => x.N_COL).ToList(); var l2 = y2.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (l2 != null && l2.N_CURRENT_NUM == 1) { var c = LocationHelper.GetList(x => x.S_LOC_CODE == l2.S_LOC_CODE); if (c.FirstOrDefault()?.S_TYPE == BQ_PRA.B) { continue; } } var e = y2.FindAll(x => x.N_COL > (l2?.N_COL ?? 0) && x.N_CURRENT_NUM == 0).FirstOrDefault(); if (e != null) { var re = TaskProcess.CreateTransport("", lastfull.S_LOC_CODE.Trim(), e.S_LOC_CODE, "标签叉运-拆垛接驳", new List { CNTR.FirstOrDefault().S_CNTR_CODE }, 2, 1, 1, 62); LogHelper.Info($"from {lastfull.S_LOC_CODE} to {e.S_LOC_CODE} 标签叉运-拆垛接驳 ,创建{re} "); break; } } } else { //回货架 var hjs = LocationHelper.GetList(x => x.S_AREA_CODE == WJ_BQ.RK_BBHJQ).FindAll(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0).OrderBy(x => x.N_LAYER).ThenBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); if (hjs != null) { var re = TaskProcess.CreateTransport("", lastfull.S_LOC_CODE.Trim(), hjs.S_LOC_CODE, "标签叉运-拆垛回", new List { CNTR.FirstOrDefault().S_CNTR_CODE }, 1, 1, 1, 62); LogHelper.Info($"from {lastfull.S_LOC_CODE} to {hjs.S_LOC_CODE} 标签叉运-拆垛回 ,创建{re} "); break; } } } } } ///第一段:出库 -到拆垛或者 接驳。 var yuworders = LocationHelper.GetList(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 => !string.IsNullOrEmpty(x.TagOver) ? 1 : 2).ThenBy(x => x.TagOverTime).ToList(); //foreach (var order in yuworders) retuse: var order = yuworders.FirstOrDefault(); if (order != null) { var Porder = WCSHelper.GetWorkOrder(order.SQL_LinkLineNO); if (Porder == null) { LogHelper.CErrorLog("无菌标签出库:" + (order.SQL_LinkLineNO) + "没有【执行中】的工单"); yuworders.Remove(order); goto retuse; } var oto = new List(); //if (!string.IsNullOrEmpty(order.TagOver)) // oto = order.TagOver.Split(',').ToList(); var oic = order.SQL_ItemCode; var oin = order.SQL_ItemName; if (string.IsNullOrEmpty(oic) || string.IsNullOrEmpty(oin)) { LogHelper.CErrorLog("无菌标签出库:" + (order.SQL_WorkNo) + "没有【指定物料;"); goto retuse; } //var item_ = ContainerHelper.GetItem(x => x.S_ITEM_CODE == oic && x.S_ITEM_NAME == oin); //按顺序匹配标签,直到完成所有标签。后 清空标签,并重置标签完成时间= 当前时间。 var hjs = db.Queryable() .LeftJoin((l, lc) => l.S_LOC_CODE == lc.S_LOC_CODE) .LeftJoin((l, lc, ci) => lc.S_CNTR_CODE == ci.S_CNTR_CODE) .Where((l, lc, ci) => l.S_AREA_CODE == WJ_BQ.RK_BBHJQ && l.S_LOCK_STATE == "无").Select((l, lc, ci) => new locCntItem { N_CURRENT_NUM = l.N_CURRENT_NUM, S_TYPE = lc.S_TYPE, S_LOC_CODE = l.S_LOC_CODE, S_AREA_CODE = l.S_AREA_CODE, HalfOrFull = (ci.N_BQ_TRAY_TYPE == .5 ? 1 : (ci.N_BQ_TRAY_TYPE == .75 ? 2 : 3)), // 半托为0.5 整托为1 。 转换为整数( *2 )。 半托为>1,整托>2 N_LAYER = l.N_LAYER, S_NOTE = ci.S_ITEM_CODE.Trim() + "&" + ci.S_ITEM_NAME.Trim(), S_ITEM_CODE = ci.S_ITEM_CODE, S_ITEM_NAME = ci.S_ITEM_NAME, S_CNTR_CODE = ci.S_CNTR_CODE }).ToList(); var taglist = new List() { oic }; //if (!string.IsNullOrEmpty(item_.S_BQ_NAME)) // taglist = item_.S_BQ_NAME.Split(',').ToList(); foreach (var item in taglist) { //if (oto.Contains(item)) // continue; //var Ii = ContainerHelper.GetItem(x => x.S_ITEM_CODE == item); //if (Ii == null) //{ // LogHelper.CError($"{order.SQL_WorkNo} - {order.SQL_PLineNo} - {item} 物料顺序不存在。"); // return; //} var tagLoc = hjs.FindAll(x => x.S_ITEM_CODE == oic/* Ii.S_ITEM_CODE*/ && x.S_ITEM_NAME == oin /*Ii.S_ITEM_NAME x.S_NOTE == (Ii.S_ITEM_CODE + "&" + Ii.S_ITEM_NAME)*/).OrderBy(x => x.HalfOrFull).FirstOrDefault(); if (tagLoc != null) { if (tagLoc.N_LAYER == 1 || tagLoc.N_CURRENT_NUM == 1) { // 直接出接驳位 var jbqs = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BQJBQ); foreach (var rowloc in jbqs.GroupBy(x => x.N_ROW)) { var y2 = rowloc.OrderBy(x => x.N_COL).ToList(); var l2 = y2.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (l2 != null && l2.N_CURRENT_NUM == 1) { var c = LocationHelper.GetList(x => x.S_LOC_CODE == l2.S_LOC_CODE); if (!c.Any() || c.FirstOrDefault()?.S_TYPE == BQ_PRA.B) { continue; } var cirs = ContainerHelper.GetCntrItemRel(c.FirstOrDefault().S_CNTR_CODE); if (!cirs.Any()) continue; var cir = cirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault(); if (cir.S_ITEM_CODE != tagLoc.S_ITEM_CODE || cir.S_ITEM_NAME != tagLoc.S_ITEM_NAME) continue; } var e = y2.FindAll(x => x.N_COL > (l2?.N_COL ?? 0) && x.N_CURRENT_NUM == 0).FirstOrDefault(); if (e != null) { var re = TaskProcess.CreateTransport("", tagLoc.S_LOC_CODE.Trim(), e.S_LOC_CODE, "标签叉运-货架出接驳", new List { tagLoc.S_CNTR_CODE }, 1, 1, 1, 62); LogHelper.Info($"from {tagLoc.S_LOC_CODE} to {e.S_LOC_CODE} 标签叉运-货架出接驳 ,创建{re} "); if (re) oto.Add(item); break; } } } else { var taglocs = hjs.FindAll(x => x.S_LOC_CODE == tagLoc.S_LOC_CODE); var v = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BQCDQ); foreach (var cdr in v.GroupBy(x => x.N_ROW)) { var y2 = cdr.OrderBy(x => x.N_COL).ToList(); var l2 = y2.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); var e = y2.FindAll(x => x.N_COL > (l2?.N_COL ?? 0) && x.N_CURRENT_NUM == 0).FirstOrDefault(); if (e != null) { var tgs = taglocs.Select(x => x.S_CNTR_CODE).ToList(); var re = TaskProcess.CreateTransport("", tagLoc.S_LOC_CODE.Trim(), e.S_LOC_CODE, "标签叉运-货架出拆垛", tgs, 1, 1, tgs.Count, 62, BQ_PRA.Out); LogHelper.Info($"from {tagLoc.S_LOC_CODE} to {e.S_LOC_CODE} 标签叉运-货架出拆垛 ,创建{re} "); if (re) oto.Add(item); break; } } } } else { LogHelper.CErrorLog("无菌标签出库:" + (order.SQL_LinkLineNO) + $" 货架上没有这个[{item}]标签物料。"); } } var set1 = new HashSet(oto); var set2 = new HashSet(taglist); if (set1.SetEquals(set2)) { order.OutNum--; order.TagOverTime = DateTime.Now; //order.TagOver = string.Empty; db.Updateable(order).UpdateColumns(it => new {/* it.TagOver,*/it.OutNum, it.TagOverTime }).ExecuteCommand(); LogHelper.CSucess($"{order.SQL_PLineNo}-{order.SQL_LinkLineNO} 标签完成。重置数据"); } else { //string otgo = string.Join(",", oto); //if (order.TagOver != otgo) //{ // order.TagOver = otgo; // db.Updateable(order).UpdateColumns(it => new { it.TagOver }).ExecuteCommand(); //} } } } //入库-堆叠-货架 static bool from_mid_to(locCntItem startLoc, string MidArea, List locHJs) { foreach (var item in locHJs.OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL)) { if (item.N_CURRENT_NUM == 0) { var re = TaskProcess.CreateTransport("", startLoc.S_LOC_CODE.Trim(), item.S_LOC_CODE, "标签叉运-半托1v3", new List { startLoc.S_CNTR_CODE }, 1, 1, 1, 62); LogHelper.Info($"from {startLoc.S_LOC_CODE} to {item.S_LOC_CODE} 标签叉运-半托1v3任务 ,创建{re} "); return true; } } return false; } internal static void BottleCapAuto6() { var botf = false; var te = LocationHelper.GetLocList(x => x.S_AREA_CODE == "PPTKK" && (x.S_LOCK_STATE == "无" || x.S_LOCK_STATE == "出库锁")); var fe = LocationHelper.GetLocList(x => x.S_AREA_CODE == "PPFKK" && (x.S_LOCK_STATE == "无" || x.S_LOCK_STATE == "出库锁")); if (te.Concat(fe).ToList().FindAll(x => x.N_CURRENT_NUM == 0 || x.S_LOCK_STATE == "出库锁").Count < 5) botf = true; if (botf) { var loclist = LocationHelper.GetAreaNormalLocList("KKCKQ"); Location ENDbIT = null; Location STAbIT = null; if (loclist.Any()) { foreach (var item in loclist.GroupBy(x => x.N_ROW).OrderBy(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(x => x.Key)) { var y = item.OrderBy(x => x.N_COL).ToList(); var lastfull = y.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (lastfull != null) { if (lastfull.N_CURRENT_NUM < lastfull.N_CAPACITY) ENDbIT = lastfull; else ENDbIT = y.Find(x => x.N_COL > lastfull.N_COL); } else ENDbIT = y.FirstOrDefault(); if (ENDbIT != null) { break; } } if (ENDbIT != null) { var _l = LocationHelper.GetLocList(x => x.S_AREA_CODE == "PPTKK" && x.S_LOCK_STATE != "报废"); IEnumerable lockcols = (from x in _l.FindAll((Location x) => x.S_LOCK_STATE.Trim() != "无") select x.N_ROW).Distinct(); if (lockcols.Any()) { _l.RemoveAll((Location x) => lockcols.Contains(x.N_ROW)); } STAbIT = _l?.OrderBy(x => x.N_ROW).ThenByDescending(x => x.N_COL).ToList().Find(x => x.N_CURRENT_NUM > 0); if (STAbIT != null) { var location_ = LocationHelper.GetLocCntrRel(STAbIT.S_LOC_CODE); var carryCntrs = new List { location_.FirstOrDefault().S_CNTR_CODE };//DateTime.Now.ToString("yyMMddHHmmss") }; var re = TaskProcess.CreateTransport("", STAbIT.S_LOC_CODE.Trim(), ENDbIT.S_LOC_CODE, "瓶坯空转拆", carryCntrs, location_.Count, ENDbIT.N_CURRENT_NUM + 1, carryCntrs.Count, 62); } } } } } static DateTime last = DateTime.Now; static string laststring = ""; public static async void BB7() { var pl = new List { "注塑机3", "注塑机4" }; //pl.Remove(laststring); var ppp = new List { "PPTMKZZ", "PPFMKZZ" }; if (laststring == pl[0]) ppp.Reverse(); B(true, new List { ppp.FirstOrDefault() }); if (false) foreach (var ar in ppp) { var spn = ar == "PPTMKZZ" ? pl[0] : pl[1]; bool run = false; rrr: var loclist__ = LocationHelper.GetAreaNormalLocList(ar, false); if (loclist__.Any()) { var NormalFull = loclist__.FindAll(x => x.N_CURRENT_NUM > 0 && x.S_LOCK_STATE == "无"); var NormalIN = loclist__.FindAll(x => x.N_CURRENT_NUM == 0 && x.S_LOCK_STATE == "入库锁"); var Normalout = loclist__.FindAll(x => x.N_CURRENT_NUM > 0 && x.S_LOCK_STATE == "出库锁"); if (NormalFull.Count + NormalIN.Count - Normalout.Count < 5) { if (!run) { run = true; await Task.Delay(2000); goto rrr; } Console.WriteLine($"{ar}库区- 数量不足强制中转 - {laststring}!={spn}????"); if (NormalIN.Count > 0) { Console.WriteLine($"{ar}库区- 入库锁数量 {NormalIN.Count} 停止中转"); break; } //if (laststring != spn) B(true, new List { spn }); } } } await Task.Delay(2000); } public static async void B7(bool needBread = false, string ppline = "") { LogHelper.Info("Take 3 4 to zz"); var pl = new List { "注塑机3", "注塑机4" }; if (!string.IsNullOrEmpty(ppline) && pl.Contains(ppline)) { pl = pl.OrderBy(x => x == ppline ? 0 : 1).ToList(); } else { if (!string.IsNullOrEmpty(laststring)) pl = pl.OrderBy(x => x == laststring ? 1 : 0).ToList(); } //laststring = pl.First(); B(needBread, pl); } public static void B(bool needBread, List pl) { foreach (var spn in pl) { var order = WCSHelper.GetWorkOrder(spn); List rs = new List(); List rows = new List(); string desc = ""; if (order == null || order?.SQL_UsingNow == "Y") { order = WCSHelper.GetWorkOrder(a => a.SQL_LinkLineNO == spn && a.SQL_UsingNow == "N" && (a.SQL_State == "执行中")).FirstOrDefault(); if (order == null) { //Console.WriteLine($"{spn}没开或工单即产,且没有对应的翻斗机开非即工单。"); continue; } else { desc = spn + ">" + order?.SQL_ItemCode; } } else { desc = spn + ">" + order?.SQL_ItemCode; if (!string.IsNullOrEmpty(order.S_ROW1)) { rs = order.S_ROW1.Split('=').ToList(); rows = Array.ConvertAll(rs[rs.Count - 1].Trim().Split('-'), Convert.ToInt32).ToList(); } } if (!string.IsNullOrEmpty(desc)) { var areaList = ""; if (spn.Contains("注塑机3")) areaList = "PPTMKZZ"; if (spn.Contains("注塑机4")) areaList = "PPFMKZZ"; if (!string.IsNullOrEmpty(areaList)) { LogHelper.Info($"计算{spn} 对应的{areaList} 中转区任务"); //var loclist__ = LocationHelper.GetAreaNormalLocList(areaList, false); //if (loclist__.Find(x => x.S_LOCK_STATE.Trim() == "入库锁" /*|| x.S_LOCK_STATE.Trim() == "出库锁"*/) != null) //{ // LogHelper.Info($"{areaList} - 中转区有1入库任务不进行中转"); //} //else //if (loclist__.Find(x => x.N_ROW == 3 && x.N_CURRENT_NUM < x.N_CAPACITY && x.S_LOCK_STATE == "无") == null) //{ // LogHelper.Info($"{areaList} - 中转区第三排 没有空余位置了;"); //} //else { Location strBit = null; Location endBit = null; LocCntrRel crl = null; { //var outlocs = LocationHelper.GetAreaNormalLocList("PPMKCK"); //if (rs.Count == 0 || rs[0] != "PPMKCK") //{ // rows = new List(); //} //2025年3月31日10:58:47 改成出入库 锁, 一排满了才解锁 /////出库区,不优先补3排。 防止补满了导致1 2 排持续空置 //foreach (var item in outlocs.GroupBy(x => x.N_ROW).OrderBy(x => rows.Contains(x.Key) ? 1 : 0).ThenBy(x => x.Count(y => y.N_CURRENT_NUM > 0))) //{ // var e = item.OrderByDescending(x => x.N_COL).ToList().Find(x => x.N_CURRENT_NUM > 0); // if (e != null) // { // var rel = LocationHelper.GetLocCntrRel(e.S_LOC_CODE); // if (rel.Any() && (rel.FirstOrDefault().S_TYPE.Contains($"{spn}>{order?.SQL_ItemCode}") || rel.FirstOrDefault().S_TYPE.Contains($"{spn}>{order?.SQL_ItemName}"))) // { // crl = rel.FirstOrDefault(); // strBit = e; // break; // } // } //} } var outlocs = LocationHelper.GetAreaNormalLocList("PPMKCK");//rs[0]); var rowlist = LocationHelper.GetRowLock("PPMKCK"); foreach (var item in outlocs.GroupBy(x => x.N_ROW).OrderBy(x => rows.Contains(x.Key) ? 0 : 1).ThenBy(y => rowlist.Find(x => x.S_LOCK_STATE == "出库锁" && x.N_ROW == y.Key)?.T_CREATE ?? DateTime.Now)) { var tnotnull = rowlist.Find(x => x.S_LOCK_STATE == "入库锁" && x.N_ROW == item.Key); if (tnotnull != null) continue; var e = item.OrderByDescending(x => x.N_COL).ToList().Find(x => x.N_CURRENT_NUM > 0); if (e != null) { var rel = LocationHelper.GetLocCntrRel(e.S_LOC_CODE); if (rel.Any() && (rel.FirstOrDefault().S_TYPE.Contains($"{spn}>{order?.SQL_ItemCode}") || rel.FirstOrDefault().S_TYPE.Contains($"{spn}>{order?.SQL_ItemName}"))) { crl = rel.FirstOrDefault(); strBit = e; break; } } } if (strBit != null) { LogHelper.Info($"{spn} - 去中转区,找到出库区位置{strBit.S_LOC_CODE}-{crl.S_CNTR_CODE}"); var loclist__ = LocationHelper.GetAreaNormalLocList(areaList); rowlist = LocationHelper.GetRowLock(areaList); //foreach (var _rl in loclist__.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0))) var t = DateTime.Now; foreach (var _rl in loclist__.GroupBy(x => x.N_ROW).OrderBy(y => rowlist.Find(x => x.S_LOCK_STATE == "入库锁" && x.N_ROW == y.Key)?.T_CREATE ?? t).ThenBy(x => x.Key)) { var tnotnull = rowlist.Find(x => x.S_LOCK_STATE == "出库锁" && x.N_ROW == _rl.Key); if (tnotnull != null) continue; var rowLsit = _rl.OrderByDescending(x => x.N_COL).ToList(); var e = rowLsit.Find(x => x.N_CURRENT_NUM > 0); if (e == null) { endBit = rowLsit.LastOrDefault(); if (endBit != null) break; } else { var rel = LocationHelper.GetLocCntrRel(e.S_LOC_CODE); if (rel.Any() && (rel.FirstOrDefault().S_TYPE.Contains($"{order?.SQL_PLineNo}>{order?.SQL_ItemCode}") || rel.FirstOrDefault().S_TYPE.Contains($"{order?.SQL_PLineNo}>{order?.SQL_ItemName}"))) { if (e.N_CURRENT_NUM < e.N_CAPACITY) { endBit = e; break; } else { rowLsit.Reverse(); endBit = rowLsit.FindAll(x => x.N_COL > e.N_COL).OrderBy(x => x.N_COL).FirstOrDefault(); if (endBit != null) break; } } } } if (endBit != null) { LogHelper.Info($"{spn} - 去中转区,找到位置{endBit.S_LOC_CODE}"); bool bb = TaskProcess.CreateTransport(order.SQL_WorkNo, strBit.S_LOC_CODE, endBit.S_LOC_CODE, spn + "中转去", new List { crl.S_CNTR_CODE }, strBit.N_CURRENT_NUM, endBit.N_CURRENT_NUM++, 1, 50, crl.S_TYPE); LogHelper.Info($"{spn}未开,翻斗机开。线程,创建去{areaList}中转区的任务{(bb ? "成功" : "失败")}"); if (bb && needBread) { laststring = spn; goto vvvv; } } //, ctrs.FirstOrDefault().S_TYPE } } } } } vvvv: Thread.Sleep(100); } static int mun = 0; /// /// 计数器 清除 控制台 /// /// internal static void A() { mun++; if (mun > 3600) { Console.Clear(); mun = 0; } } internal static void BottleCapAuto7() { var oos = LocationHelper.GetList(x => x.S_Work_State == "执行中"); foreach (var oo in oos.GroupBy(x => x.S_Work_NO)) { foreach (var outOer in oo.OrderBy(x => string.IsNullOrEmpty(x.S_bsID)).ThenBy(s => s.S_ITEM_CODE)) { bool CreTurn = true; int alqty = 0; var bsidnull = true; ///执行标识 - 同时也是 单据计算成功的 标识。 if (!string.IsNullOrEmpty(outOer.S_bsID)) { bsidnull = false; // 当前单据是否有已经下发的移库。 var t = LocationHelper.GetList(a => a.FROM_NO == outOer.S_Work_NO && a.SQL_WorkNo.Contains("-" + outOer.S_bsID)); if (t.Any()) { //查看是否存在已执行,或者 总数量已经完成 if (t.Find(x => x.SQL_State == "执行中") != null) break; if (t.Find(a => a.SQL_State == "完成" && a.Note == "执行中。。。") != null) break; alqty = t.Sum(x => x.AlQty); if (alqty >= outOer.N_Stock) { WCSHelper.Do(db => { outOer.S_Work_State = "完成"; outOer.S_NOTE = "数量完成"; db.Updateable(outOer).UpdateColumns(it => new { it.S_Work_State, it.S_NOTE }).ExecuteCommand(); }); break; } } } if (CreTurn) { var needQty = outOer.N_Stock - alqty; if (needQty % 2 != 0) { LogHelper.Info($"备货单:{outOer.S_Work_NO} 总量{outOer.N_Stock}- 已完成{alqty}为 奇数。无法搬运。"); goto end; } if (needQty == 0) { LogHelper.Info($"备货单:{outOer.S_Work_NO} 总量{outOer.N_Stock}- 已完成{alqty} 为0不需要搬运。"); goto end; } var List = new List(); string start_area = "", start_row = "", end_area = "", end_row = "", size = ""; string LineNo = ""; int TrayCount = 0; bool isFule = false; List allLoclist = new List(); //LocationHelper.GetList(x => x.S_AREA_CODE.StartsWith("QX-")).Where(X => Regex.IsMatch(X.S_AREA_CODE, @"QX-\d+_[A-Z]+")); //LogHelper.Info($"{outOer.S_Work_NO} 寻找库区 {JsonConvert.SerializeObject(allLoclist.Select(x=>x.S_AREA_CODE))}。。。"); if (!string.IsNullOrEmpty(outOer.S_Strart_Area) && !string.IsNullOrEmpty(outOer.S_Strart_Row)) { LogHelper.Info($"备货单{outOer.S_Work_NO}:指定库区:{outOer.S_Strart_Area} 指定排:{outOer.S_Strart_Row} !"); var loclist = LocationHelper.GetList(x => x.N_CURRENT_NUM > 0 && x.S_AREA_CODE == outOer.S_Strart_Area && Convert.ToInt32(outOer.S_Strart_Row) == x.N_ROW); if (loclist.Any()) { var _cl = loclist.FirstOrDefault(); var _clrel = LocationHelper.GetLocCntrRel(_cl.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info($"备货单:{outOer.S_Work_NO} " + _cl.S_LOC_CODE + " 没有货位托盘信息!"); WCSHelper.Do(db => { outOer.S_Work_State = "完成"; outOer.S_NOTE = "货位托盘信息异常"; db.Updateable(outOer).UpdateColumns(it => new { it.S_Work_State, it.S_NOTE }).ExecuteCommand(); }); goto end; } List.Add(new Location { S_AREA_CODE = _cl.S_AREA_CODE, S_WH_CODE = _clrel.FirstOrDefault().S_TYPE, T_CREATE = _cl.T_CREATE, N_ROW = _cl.N_ROW, N_COL = _clrel.FirstOrDefault().S_CNTR_CODE.StartsWith("TP") ? 0 : 1 }); } else { WCSHelper.Do(db => { outOer.S_Work_State = "完成"; outOer.S_NOTE = $"当前库区排空了"; db.Updateable(outOer).UpdateColumns(it => new { it.S_Work_State, it.S_NOTE }).ExecuteCommand(); }); goto end; } } else WCSHelper.Do(db => { //var LCRLIST = db.Queryable().Includes(x => x.CntrItemRel).Where(x => x.S_LOC_CODE.StartsWith("QX-") && (x.CntrItemRel.S_ITEM_CODE == outOer.S_ITEM_CODE || x.CntrItemRel.S_ITEM_CODE == outOer.S_ITEM_NAME)).ToList(); List = db.Queryable() .LeftJoin((lcr, cir) => lcr.S_CNTR_CODE == cir.S_CNTR_CODE) .LeftJoin((lcr, cir, lo) => lcr.S_LOC_CODE == lo.S_LOC_CODE) .Where((lcr, cir) => lcr.S_LOC_CODE.StartsWith("QX-") && (cir.S_ITEM_CODE == outOer.S_ITEM_CODE || cir.S_ITEM_CODE == outOer.S_ITEM_NAME)) .Select((lcr, cir, lo) => new Location { S_AREA_CODE = lo.S_AREA_CODE, S_WH_CODE = lcr.S_TYPE, T_CREATE = lcr.T_CREATE, N_ROW = lo.N_ROW, N_COL = lcr.S_CNTR_CODE.StartsWith("TP") ? 0 : 1 }).ToList(); }); if (!List.Any()) { LogHelper.Info($"备货单:{outOer.S_Work_NO} 库区中没有找到可用物料。"); goto end; } List = List.FindAll(x => { if (!string.IsNullOrEmpty(outOer.S_Strart_Area)) return x.S_AREA_CODE == outOer.S_Strart_Area; if (!string.IsNullOrEmpty(outOer.S_Strart_Row)) return x.N_ROW == Convert.ToInt32(outOer.S_Strart_Row); return true; }).GroupBy(x => new { x.S_AREA_CODE, x.N_ROW }) //.Select(x => x.OrderBy(y => y.T_CREATE).First()) .Select(g => g.Aggregate((min, next) => next.T_CREATE < min.T_CREATE ? next : min)) .ToList(); LogHelper.Info($"备货单:{outOer.S_Work_NO} 找到符合物料 货位 的库区-排 数量{List.Count()}"); if (false) foreach (var areaLl in allLoclist.GroupBy(x => x.S_AREA_CODE)) { foreach (var rowLl in areaLl.GroupBy(x => x.N_ROW)) { var _cl = rowLl.OrderBy(x => x.N_COL).ToList().Find(x => x.N_CURRENT_NUM > 0); if (_cl != null) { LogHelper.Info($"{outOer.S_Work_NO} 识别 货位{_cl?.S_LOC_CODE}。。。"); // 最外侧货位是是同.. 的话 就可以入了。 var _clrel = LocationHelper.GetLocCntrRel(_cl.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info(_cl.S_LOC_CODE + " 没有货位托盘信息!"); continue; } var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel.FirstOrDefault().S_CNTR_CODE.Trim()); if (!_clcntitem.Any()) { LogHelper.Info(_cl.S_LOC_CODE + $"货位 的托盘{_clrel.FirstOrDefault().S_CNTR_CODE} 没有物料记录"); continue; } var _ci = _clcntitem.OrderByDescending(xx => xx.T_CREATE).First(); if (_ci.S_ITEM_CODE?.Trim() == outOer.S_ITEM_CODE?.Trim() || _ci.S_ITEM_CODE?.Trim() == outOer.S_ITEM_NAME?.Trim()) { LogHelper.Info($"{outOer.S_Work_NO} 找到符合物料 货位{_cl.S_LOC_CODE}。。。"); List.Add(new Location { S_AREA_CODE = _cl.S_AREA_CODE, N_CURRENT_NUM = rowLl.Sum(x => x.N_CURRENT_NUM), S_WH_CODE = _clrel.FirstOrDefault().S_TYPE, T_CREATE = _ci.T_CREATE, N_ROW = _cl.N_ROW, N_COL = _clrel.FirstOrDefault().S_CNTR_CODE.StartsWith("TP") ? 0 : 1 }); } } } } //寻找可用起点 foreach (var L in List.OrderBy(x => x.T_CREATE)) { var rowlist = LocationHelper.GetList(x => x.S_AREA_CODE == L.S_AREA_CODE && L.N_ROW == x.N_ROW); if (rowlist.FindAll((Location x) => x.S_LOCK_STATE.Trim() == "空间锁").Count > 0) { continue; } if (rowlist.FindAll((Location x) => x.S_LOCK_STATE.Trim() != "无" && x.S_LOCK_STATE.Trim() != "报废").Count > 0) { LogHelper.Info($"备货单:{outOer.S_Work_NO} 最早入库库区{L.S_AREA_CODE} - 排{L.N_ROW} 任务中或已锁住。"); goto end; } start_area = L.S_AREA_CODE; start_row = L.N_ROW + ""; var rowqty = rowlist.Sum(x => x.N_CURRENT_NUM); if (rowqty * 2 < needQty) { TrayCount = rowqty * 2; } else TrayCount = needQty; size = L.S_WH_CODE; isFule = L.N_COL == 1; break; } var ItemInfo = ContainerHelper.GetItem(outOer.S_ITEM_NAME); int MaxLayer = ItemInfo?.MaxLayer ?? 0; //筛选终点 var t = LocationHelper.GetList(a => a.FROM_NO == outOer.S_Work_NO).OrderBy(s => s.T_CREATE).LastOrDefault(); if (t != null) { var ea = t.end_area; var er = t.end_row; //查看最后移库排 是否 有可用位置。 var rowlist = LocationHelper.GetList(x => x.S_AREA_CODE == ea && x.N_ROW == Convert.ToInt32(er)); if (rowlist.FindAll((Location x) => x.S_LOCK_STATE.Trim() == "空间锁").Count > 0) { continue; } if (rowlist.FindAll((Location x) => x.S_LOCK_STATE.Trim() != "无" && x.S_LOCK_STATE.Trim() != "报废").Count > 0) { LogHelper.Info($"备货单:{outOer.S_Work_NO} 最后移库库区{ea} - 排{er} 任务中或已锁住。"); goto end; } var _cl = rowlist.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); if (_cl != null) { var _clrel = LocationHelper.GetLocCntrRel(_cl.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info($"备货单:{outOer.S_Work_NO} " + _cl.S_LOC_CODE + " 没有货位托盘信息!"); goto eaaa; } var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); LogHelper.Info($"备货单:{outOer.S_Work_NO} -" + _cl.S_LOC_CODE + $" 货位托盘信息{_clrel0.S_CNTR_CODE}! 1起点:isFule" + isFule); var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()); if (!_clcntitem.Any()) { LogHelper.Info(_cl.S_LOC_CODE + $"货位 的托盘{_clrel0.S_CNTR_CODE} 没有物料记录"); goto eaaa; } var ss = _clrel0.S_TYPE == size || size == _clcntitem.First().B_TYPE; var _ci = _clcntitem.OrderByDescending(xx => xx.T_CREATE).First(); LogHelper.Info($"第一段判断{_clrel0.S_TYPE}=={size}||{size}=={_clcntitem.First().B_TYPE} >-{ss}>>>{_ci.S_ITEM_CODE}-{_ci.S_ITEM_NAME}"); //if (_ci.S_ITEM_CODE == outOer.S_ITEM_CODE || _ci.S_ITEM_CODE == outOer.S_ITEM_NAME) int cp = MaxLayer > 0 ? Math.Min(MaxLayer, _cl.N_CAPACITY) : _cl.N_CAPACITY; end_area = _cl.S_AREA_CODE; end_row = _cl.N_ROW + ""; var r = ss ? rowlist.FindAll(x => x.N_COL >= _cl.N_COL) : rowlist.FindAll(x => x.N_COL > _cl.N_COL); var rowqty = r.Sum(x => cp) - r.Sum(x => x.N_CURRENT_NUM); if (rowqty * 2 < TrayCount) TrayCount = rowqty * 2; } else { LogHelper.Info($"备货单:{outOer.S_Work_NO} 最后移库库区{ea} - 排{er} 怎么他妈是空的!!!诡了个异的"); } } eaaa: if (string.IsNullOrEmpty(end_area)) { var endList = LocationHelper.GetAreaNormalLocList(outOer.S_END_AREA); if (!string.IsNullOrEmpty(outOer.S_END_ROW)) endList = endList.FindAll(x => x.N_ROW == Convert.ToInt32(outOer.S_END_ROW)); foreach (var rowGroup in endList.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(x => x.Key)) { var rowlist = rowGroup.OrderBy(x => x.N_COL).ToList(); var _cl = rowlist.FindAll(xx => xx.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); if (_cl == null) { end_area = outOer.S_END_AREA; end_row = rowGroup.Key + ""; var rowqty = rowlist.Sum(x => x.N_CAPACITY) - rowlist.Sum(x => x.N_CURRENT_NUM); if (rowqty * 2 < TrayCount) TrayCount = rowqty * 2; break; } var _clrel = LocationHelper.GetLocCntrRel(_cl.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info($"备货单:{outOer.S_Work_NO} " + _cl.S_LOC_CODE + " 没有货位托盘信息!"); continue; } //板型相同 var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); LogHelper.Info($"备货单:{outOer.S_Work_NO} -" + _cl.S_LOC_CODE + $" 货位托盘信息{_clrel0.S_CNTR_CODE}! 2起点:isFule" + isFule); //if (_clrel0.S_CNTR_CODE.StartsWith("TP") && isFule) //{ // continue; //} //if (!_clrel0.S_CNTR_CODE.StartsWith("TP") && !isFule) //{ // continue; //} LogHelper.Info("识别托盘类型。"); var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()); if (!_clcntitem.Any()) { LogHelper.Info(_cl.S_LOC_CODE + $"货位 的托盘{_clrel0.S_CNTR_CODE} 没有物料记录"); continue; } var ss = _clrel0.S_TYPE == size || size == _clcntitem.First().B_TYPE; //LogHelper.Info($"{_clrel0.S_TYPE}=={size}||{size}=={_clcntitem.First().B_TYPE} >-{ss}"); var _ci = _clcntitem.OrderByDescending(xx => xx.T_CREATE).First(); LogHelper.Info($"第二段判断: {_clrel0.S_TYPE}=={size}||{size}=={_clcntitem.First().B_TYPE} >-{ss}>>>{_ci.S_ITEM_CODE}-{_ci.S_ITEM_NAME}"); { int cp = MaxLayer > 0 ? Math.Min(MaxLayer, _cl.N_CAPACITY) : _cl.N_CAPACITY; end_area = _cl.S_AREA_CODE; end_row = _cl.N_ROW + ""; var r = ss ? rowlist.FindAll(x => x.N_COL >= _cl.N_COL) : rowlist.FindAll(x => x.N_COL > _cl.N_COL); var rowqty = r.Sum(x => cp) - r.Sum(x => x.N_CURRENT_NUM); if (rowqty * 2 < TrayCount) TrayCount = rowqty * 2; } //if (ss) //{ // var _ci = _clcntitem.OrderByDescending(xx => xx.T_CREATE).First(); // if (_ci.S_ITEM_CODE == outOer.S_ITEM_CODE || _ci.S_ITEM_CODE == outOer.S_ITEM_NAME) // { // end_area = _cl.S_AREA_CODE; // end_row = _cl.N_ROW + ""; // int cp = MaxLayer > 0 ? Math.Min(MaxLayer, _cl.N_CAPACITY) : _cl.N_CAPACITY; // var r = rowlist.FindAll(x => x.N_COL >= _cl.N_COL); // var rowqty = r.Sum(x => cp) - r.Sum(x => x.N_CURRENT_NUM); // if (rowqty < TrayCount) // TrayCount = rowqty; // break; // } //} } } if (string.IsNullOrEmpty(start_area) || string.IsNullOrEmpty(start_row) || string.IsNullOrEmpty(end_area) || string.IsNullOrEmpty(end_row) || string.IsNullOrEmpty(size) || TrayCount == 0) { LogHelper.Info($"备货单:{outOer.S_Work_NO}创建前数据 起点库区: {start_area} 起点排:{start_row} 终点库区:{end_area} 终点排:{end_row} 起点版型:{size} 出库数量:{TrayCount} 有参数空,无法出库 "); if (!string.IsNullOrEmpty(outOer.S_END_ROW) && string.IsNullOrEmpty(end_row)) { WCSHelper.Do(db => { outOer.S_Work_State = "完成"; outOer.S_NOTE = $"终点库区排没可用位置了。"; db.Updateable(outOer).UpdateColumns(it => new { it.S_Work_State, it.S_NOTE }).ExecuteCommand(); }); } goto end; } if (bsidnull) outOer.S_bsID = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalMilliseconds + ""; //创建转运工单 var tn = new TurnWorkOrder { FROM_NO = outOer.S_Work_NO, SQL_WorkNo = outOer.S_Work_NO + "-" + outOer.S_bsID, start_area = start_area, start_row = start_row, end_area = end_area, end_row = end_row, size = size, SQL_State = "执行中", LineNo = LineNo, Note = "", Turn_Type = "自动移库", TrayCount = TrayCount, AlQty = 0, }; WCSHelper.Do(db => { db.BeginTran(); db.Insertable(tn).ExecuteCommand(); if (bsidnull) db.Updateable(outOer).UpdateColumns(it => new { it.S_bsID }).ExecuteCommand(); db.CommitTran(); }); break; } end: if (!bsidnull) { break; } Console.WriteLine(""); } } } //起点帮满了 就生成 入库任务 internal static void AutoRun() { Location startBit = null; Location EndBit = null; List _clrel0 = null; var locList = LocationHelper.GetAreaNormalLocList("QXZXQDKQ"); foreach (var item in locList.GroupBy(x => x.N_ROW).OrderBy(x => x.Key)) { var rs = item.ToList().FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); if (rs != null && rs.N_CURRENT_NUM == 2) { var _clrel = LocationHelper.GetLocCntrRel(rs.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info(rs.S_LOC_CODE + " 没有货位托盘信息!"); continue; } _clrel0 = _clrel; //_clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); //var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()); startBit = rs; break; } } if (startBit == null) return; locList = LocationHelper.GetAreaNormalLocList("QXZXZZQ"); foreach (var item in locList.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(x => x.Key)) { var rsl = item.OrderBy(x => x.N_COL).ToList(); var rs = rsl.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); if (rs != null) { var _clrel = LocationHelper.GetLocCntrRel(rs.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info(rs.S_LOC_CODE + " 没有货位托盘信息!"); continue; } var _clrel1 = _clrel.OrderByDescending(xx => xx.T_CREATE).First(); if (!string.IsNullOrEmpty(_clrel0.First().S_TYPE) && _clrel0.First().S_TYPE == _clrel1.S_TYPE) { LogHelper.Info(rs.S_LOC_CODE + $"货位 的托盘{_clrel1.S_CNTR_CODE} 没有物料记录"); continue; } if (rs.N_CURRENT_NUM < rs.N_CAPACITY) { EndBit = rs; } else EndBit = rsl.Find(x => x.N_COL > rs.N_COL); } else { EndBit = rsl.FirstOrDefault(); } if (EndBit != null) break; } if (EndBit != null) { var res = TaskProcess.CreateTransport("", startBit.S_LOC_CODE, EndBit.S_LOC_CODE, "原物料搬运-纸箱", _clrel0.Select(x => x.S_CNTR_CODE).ToList(), 1, EndBit.N_CURRENT_NUM + 1, 1, 50, _clrel0.First().S_TYPE); } } static bool ReadCCK = false; public static Dictionary> dsi = new Dictionary>(); public class Dictitems { public string ItemCode { get; set; } public string ItemName { get; set; } public string S_CJ_NAME { get; set; } /// /// 最高层 /// public int ItemLayer { get; set; } = 0; public string area { get; set; } public string Row { get; set; } } /// /// 原物料纸箱出库 /// public static void AutoRun13TSJ() { var list = new List() { "YWLAQWJ", "YWLBQWJ", "YWLCQSX", "YWLDQWJ" }; //var WorkOrder = new List(); foreach (var PLC in Settings.GetDeviceInfoList().FindAll(X => X.deviceType == 13 && X.enable == 1)) { string pline = PLC.deviceName; if (PLC.deviceName.Contains("T2")) pline = "T2提升机-纸箱"; var orkOrd = LocationHelper.GetList(x => x.SQL_PLineNo == pline && x.WorkType == 6 && x.SQL_State == "执行中"); bool can = false; if (orkOrd.Any()) { string areaaaaa = PLC.areaPriy[0]; var locs = LocationHelper.GetList(x => x.S_AREA_CODE == areaaaaa && x.S_LOCK_STATE != "报废"); if (locs.Find(x => x.S_LOCK_STATE != "无") != null)//柴垛有锁 不判断 continue; if (locs.Find(x => x.N_CURRENT_NUM > 0) != null) //拆垛有货 不判断 continue; can = true; //var source1 = orkOrd.FirstOrDefault(); //foreach (var item in list) //{ // YWLWorkOrder source = new YWLWorkOrder(); // source.SQL_PLineNo = source1.SQL_PLineNo; // source.FuLe_PLine_No = source1.FuLe_PLine_No; // source.SQL_LinkLineNO = source1.SQL_LinkLineNO; // source.SQL_Area = item; // source.SQL_UsingNow = source1.SQL_UsingNow; // source.SQL_State = source1.SQL_State; // source.SQL_WorkNo = source1.SQL_WorkNo; // source.SQL_ItemCode = source1.SQL_ItemCode; // source.SQL_ItemName = source1.SQL_ItemName; // source.SQL_charge = source1.SQL_charge; // source.SQL_Total = source1.SQL_Total; // source.SQL_PLAN_END = source1.SQL_PLAN_END; // source.SQL_Modify_TIme = source1.SQL_Modify_TIme; // source.OutNum = source1.OutNum; // source.WorkType = source1.WorkType; // source.MidArea = source1.MidArea; // source.TagOver = source1.TagOver; // source.TagOverTime = source1.TagOverTime; // source.S_BQ_TRAY_TYPE = source1.S_BQ_TRAY_TYPE; // source.S_CJ_NAME = source1.S_CJ_NAME; // source.S_ROW = item; // WorkOrder.Add(source); //} } orkOrd = orkOrd.FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10); ReadCCK = can; if (orkOrd.Any()) foreach (var od in orkOrd.OrderBy(x => x.TagOverTime).ThenBy(x => x.OutNum)) //foreach (var od in od2.ToList()) { list.Remove(od.S_ROW); var odsr = new List { od.S_ROW }.Concat(list).Distinct().ToList(); ///汇总仓库里最大层是几层。 Dictitems Lart = null; foreach (var area in odsr)//od.S_ROW.Split('$')) { 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)) { if (Lart == null) Lart = d; else { if (Lart.ItemLayer < d.ItemLayer) Lart = d; } } } } LogHelper.Info($"AutoRun13TSJ 筛选物料 库区排数据. {od.SQL_PLineNo} >>{od.OutNum}> {JsonConvert.SerializeObject(Lart)}"); // 需要数量 >= 仓库最大数量。 就开始出库。 if (Lart != null) if (od.OutNum >= Lart?.ItemLayer) { var v = new List() { Lart.area }; Location StartBit = null; List _clrel = new List(); 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)) { 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(rl.S_LOC_CODE + "识别托盘类型。" + JsonConvert.SerializeObject(_clrel0)); var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault(); LogHelper.Info(rl.S_LOC_CODE + "识别托盘上的物料信息。" + JsonConvert.SerializeObject(_clcntitem)); if (_clcntitem != null) { LogHelper.Info("相互是否匹配 _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); if (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName && _clcntitem.S_CJ_NAME == od.S_CJ_NAME) { StartBit = rl; break; } } } if (StartBit != null) break; } if (StartBit == null) continue; Location Endbit = null; var loc = LocationHelper.GetLoc(PLC.location[0]); if (loc?.N_CURRENT_NUM == 0 && StartBit.N_CURRENT_NUM == 1 && DeviceProcess.doorStatus.ContainsKey(PLC.location[0])) { if (DeviceProcess.doorStatus[PLC.location[0]].info == "1") { Endbit = LocationHelper.GetLoc(PLC.location[0]); } } else { Endbit = LocationHelper.GetAreaNormalLocList(PLC.areaPriy[0]).Find(x => x.N_CURRENT_NUM == 0); } if (StartBit != null && Endbit != null) { var crs = _clrel.Select(x => x.S_CNTR_CODE).ToList(); var EndBit = Endbit.S_LOC_CODE; if (od.S_ROW == "YWLCQSX" || od.S_ROW == "YWLDQWJ") { var locs1 = LocationHelper.GetList(x => x.S_AREA_CODE == "YWLWJJB" && x.S_LOCK_STATE != "报废" && x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0).ToList(); if (locs1.Count() > 0) { EndBit = locs1.FirstOrDefault().S_LOC_CODE; } else { continue; } } var b = TaskProcess.CreateTransport(od.SQL_WorkNo, StartBit.S_LOC_CODE, EndBit, "原物料搬运-纸箱", crs, StartBit.N_CURRENT_NUM - crs.Count + 1, 1, crs.Count, PLC.taskPri, "", Endbit.S_LOC_CODE); if (b) { var r = new RowLock { S_LOCK_SRC = od.SQL_ItemCode, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁", S_AREA_CODE = StartBit.S_AREA_CODE, N_ROW = StartBit.N_ROW }; var db = new SqlHelper().GetInstance(); //给终点锁定住 if (od.S_ROW == "YWLCQSX" || od.S_ROW == "YWLDQWJ") { var model = db.Queryable().Where(a => a.S_LOC_CODE == Endbit.S_LOC_CODE).First(); model.S_LOCK_STATE = "入库锁"; var res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0; LogHelper.Info(Endbit.S_LOC_CODE + "LockLoc:锁结果" + res); } //排锁 var row = db.Queryable().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First(); if (row != null) { if (row.S_LOCK_SRC != r.S_LOCK_SRC) { db.Deleteable(row).ExecuteCommand(); db.Insertable(r).ExecuteCommand(); } } else db.Insertable(r).ExecuteCommand(); od.TagOverTime = DateTime.Now; db.Updateable(od).UpdateColumns(it => new { it.TagOverTime }).ExecuteCommand(); break; } } } } } } public static void AutoRunABD() { LogHelper.Info($"AutoRunABD abcd物料汇总 >>{ReadCCK}|| {dsi.Count}"); if (!ReadCCK) { Thread.Sleep(3000); return; } List list = new List(); foreach (var PLC in Settings.GetDeviceInfoList().FindAll(X => X.deviceType == 13 && X.enable == 1)) { string pline = PLC.deviceName; if (PLC.deviceName.Contains("T2")) pline = "T2提升机-纸箱"; var orkOrd = LocationHelper.GetList(x => x.SQL_PLineNo == pline && x.WorkType == 6 && x.SQL_State == "执行中"); if (orkOrd.Any()) { list = new List() { "YWLAQWJ", "YWLBQWJ", "YWLCQSX", "YWLDQWJ" }; //foreach (var ork in orkOrd) //{ // list = list.Concat(ork.S_ROW.Split('$')).ToList(); //} } } foreach (var area in list.Distinct()) { var AreaRowlist = LocationHelper.GetList(x => x.S_AREA_CODE == area && x.N_CURRENT_NUM > 0); 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(); var _clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE); if (!_clrel.Any()) { LogHelper.Info($"{area}>> {rl.S_LOC_CODE}有数量, 没托盘"); continue; } //板型相同 var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).FirstOrDefault(); LogHelper.Info(rl.S_LOC_CODE + "识别托盘类型。"); var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault(); List dictitems = new List(); if (_clcntitem != null) { if (dsi.TryGetValue(area, out dictitems)) { var ill = dictitems.Find(x => x.ItemCode == _clcntitem.S_ITEM_CODE && x.ItemName == _clcntitem.S_ITEM_NAME && _clcntitem.S_CJ_NAME == x.S_CJ_NAME); if (ill != null) { if (rl.N_CURRENT_NUM > ill.ItemLayer) { ill.ItemLayer = rl.N_CURRENT_NUM; ill.area = area; ill.Row = $"{rl.S_LOC_CODE}"; } else continue; } else dictitems.Add(new Dictitems { ItemName = _clcntitem.S_ITEM_NAME, ItemCode = _clcntitem.S_ITEM_CODE, ItemLayer = rl.N_CURRENT_NUM, S_CJ_NAME = _clcntitem.S_CJ_NAME, area = area, Row = $"{rl.S_LOC_CODE}" }); dsi[area] = dictitems; } else { dictitems = new List(); dictitems.Add(new Dictitems { ItemName = _clcntitem.S_ITEM_NAME, ItemCode = _clcntitem.S_ITEM_CODE, ItemLayer = rl.N_CURRENT_NUM, S_CJ_NAME = _clcntitem.S_CJ_NAME, area = area, Row = $"{rl.S_LOC_CODE}" }); dsi.Add(area, dictitems); } } } } LogHelper.Info($"AutoRunABD abcd物料汇总完成 >>{ReadCCK}|| {dsi.Count}"); } public static void chargeCCD() { var ods = LocationHelper.GetList(x => x.WorkType == 2 && x.SQL_State == "执行中"); if (!ods.Any()) return; List list = new List() { "YWLRGDD" }; foreach (var item in ods) { if (!string.IsNullOrEmpty(item.MidArea)) { list.AddRange(item.MidArea.Split('$')); } } foreach (var item in list.Distinct()) { var locs = LocationHelper.GetList(x => x.S_AREA_CODE == item && x.N_CURRENT_NUM > 0 && x.S_LOCK_STATE == "无"); foreach (var loc in locs) { var _clrel = LocationHelper.GetLocCntrRel(loc.S_LOC_CODE); if (!_clrel.Any()) continue; if (!string.IsNullOrEmpty(_clrel.FirstOrDefault().S_TYPE)) continue; var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel.FirstOrDefault().S_CNTR_CODE.Trim()).FirstOrDefault(); if (_clcntitem != null) { var od = ods.Find(x => x.SQL_ItemCode == _clcntitem.S_ITEM_CODE && x.SQL_ItemName == _clcntitem.S_ITEM_NAME); if (od == null) continue; if (loc.S_AREA_CODE == "YWLRGDD") { if (!string.IsNullOrEmpty(od.MidArea)) { foreach (var cr in _clrel) { cr.S_TYPE = od.MidArea + "$" + od.S_ROW; } } else foreach (var cr in _clrel) { cr.S_TYPE = od.S_ROW; } } else { foreach (var cr in _clrel) { cr.S_TYPE = od.S_ROW; } } WCSHelper.Do(db => db.Updateable(_clrel).UpdateColumns(x => new { x.S_TYPE }).ExecuteCommand()); } } } } /// /// 原物料纸箱库对库转运【经过接驳】 /// internal static void YWL_ZX_Turn() { foreach (var ODs in LocationHelper.GetList(X => X.S_ZX_STATE == "执行").GroupBy(x => x.S_START_AREA)) { var locS = LocationHelper.GetAreaNormalLocList(ODs.Key); foreach (var od in ODs) { 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} 数据缺失。无法完成移库。"); continue; } var rows = locS.FindAll(x => x.N_ROW == od.N_START_ROW); if (rows.Any()) { if (rows.FindAll(x => x.N_CURRENT_NUM > 0).Count == 0) { //置为完成。 od.S_ZX_STATE = "完成"; WCSHelper.Do(db => db.Updateable(od).UpdateColumns(x => new { x.S_ZX_STATE }).ExecuteCommand()); } else { var lastful = rows.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); if (lastful != null) { var crs = LocationHelper.GetLocCntrRel(lastful.S_LOC_CODE); var cntritems = ContainerHelper.GetCntrItemRel(crs.FirstOrDefault()?.S_CNTR_CODE); if (!cntritems.Any()) continue; var cir1 = cntritems.First(); if (od.S_ZZ_AREA == "YWLWJJB") { if (InworkLock) continue; else InworkLock = true; } else InworkLock = false; var zzlocs = LocationHelper.GetAreaNormalLocList(od.S_ZZ_AREA); Location Endbit = null; foreach (var zzrs in zzlocs.GroupBy(x => x.N_ROW).OrderBy(x => x.Key)) { var zzrloclist = zzrs.ToList(); var _cl2 = zzrloclist.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); if (_cl2 != null) { var rel = LocationHelper.GetLocCntrRel(_cl2.S_LOC_CODE); var cntrrel = ContainerHelper.GetCntrItemRel(rel.FirstOrDefault()?.S_CNTR_CODE).FirstOrDefault(); if (cntrrel == null) continue; if (cntrrel.S_ITEM_CODE == cir1.S_ITEM_CODE && cntrrel.S_ITEM_NAME == cir1.S_ITEM_NAME) { Endbit = zzrloclist.Find(x => x.N_COL > (_cl2?.N_COL ?? 0)); } } else Endbit = zzrloclist.Find(x => x.N_COL > (_cl2?.N_COL ?? 0)); if (Endbit != null) { LogHelper.Info($"入中转区{od.S_ZZ_AREA}使用{Endbit.S_LOC_CODE}"); break; } } 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, od.S_END_AREA); if (od.S_ZZ_AREA == "YWLWJJB") InworkLock = false; break; } else if (od.S_ZZ_AREA == "YWLWJJB") InworkLock = false; } } } } } } internal static void AutoTK_PE() { Console.WriteLine(DateTime.Now + "所有任务开始!"); Task task1 = Task.Run(() => { Thread.Sleep(2000); }); Task task2 = Task.Run(() => { Thread.Sleep(5000); }); // 同步阻塞:当前线程会在这里等待,直到 task1 和 task2 都完成 Task.WaitAll(task1, task2); Console.WriteLine(DateTime.Now + "所有任务完成!"); } } }