| | |
| | | var orders = WCSHelper.GetWorkOrder2(); |
| | | var thisOrder = orders.Find(x => x.SQL_WorkNo == WorkNo); |
| | | LogHelper.Info("移库解锁 --当前工单 sid:" + thisOrder?.S_ID); |
| | | if (thisOrder != null) |
| | | { |
| | | var other = orders.Find(x => x.SQL_WorkNo != WorkNo && x.start_area == thisOrder.start_area && x.start_row == thisOrder.start_row); |
| | | LogHelper.Info($"移库解锁 --其他工单 x.start_area == {thisOrder.start_area} start_row == {thisOrder.start_row} SID:" + other?.S_ID); |
| | | if (other != null) |
| | | j解锁起点库区排 = false; |
| | | } |
| | | var allarea_rows = orders.FindAll(x => x.S_ID != thisOrder.S_ID && x.start_area == thisOrder.start_area && x.start_row == thisOrder.start_row); |
| | | LogHelper.Info("移库解锁 --当前工单 的同库区排 其他工单:" + JsonConvert.SerializeObject(allarea_rows)); |
| | | if (allarea_rows.Any()) |
| | | j解锁起点库区排 = false; |
| | | //if (thisOrder != null) |
| | | //{ |
| | | // var other = orders.Find(x => x.SQL_WorkNo != WorkNo && x.start_area == thisOrder.start_area && x.start_row == thisOrder.start_row); |
| | | // LogHelper.Info($"移库解锁 --其他工单 x.start_area == {thisOrder.start_area} start_row == {thisOrder.start_row} SID:" + other?.S_ID); |
| | | // if (other != null) |
| | | // j解锁起点库区排 = false; |
| | | //} |
| | | } |
| | | //if (sign == 1) |
| | | //{ |
| | |
| | | continue; |
| | | } |
| | | } |
| | | if (CDlist.Contains(EdnRarea)) |
| | | { |
| | | var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && x.S_LOCK_STATE == "入库锁"); |
| | | //var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁")); |
| | | if (ls.Count() > 2) |
| | | { |
| | | LogHelper.Info($"{EdnRarea}任务数1管制3"); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | //else if (CDlist.Contains(EdnRarea)) |
| | | //{ |
| | | // var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁")).ToList(); |
| | |
| | | ca.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == cir1.S_ITEM_CODE && t.S_ITEM_NAME == cir1.S_ITEM_NAME && t.S_CJ_NAME == cir1.S_CJ_NAME && o.S_AREA_CODE == EdnRarea); |
| | | var lstCanOutL = dbll.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).ToList(); |
| | | LogHelper.Info($"终点有相同的物料的货位有{lstCanOutL.Count()}"); |
| | | |
| | | var ca1 = Expressionable.Create<Location, LocCntrRel, CntrItemRel>(); |
| | | ca1.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == cir1.S_ITEM_CODE && t.S_ITEM_NAME == cir1.S_ITEM_NAME && t.S_CJ_NAME == cir1.S_CJ_NAME && o.S_AREA_CODE == "YWLRGDD" && p.S_TYPE == EdnRarea); |
| | | var lstCanOutLSta = dbll.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca1.ToExpression()).ToList(); |
| | | if (lstCanOutL.Count() > 0) |
| | | { |
| | | var EndMum = dbll.Queryable<Location>().Where(l => l.S_AREA_CODE == EdnRarea && l.N_CURRENT_NUM == 0 && l.S_LOCK_STATE == "无" && lstCanOutL.Select(e => e.N_ROW).ToList().Contains(l.N_ROW)).ToList(); |
| | | if (EndMum.Count() > 0) |
| | | { |
| | | arloclist = arloclist.FindAll(x => lstCanOutL.Select(e => e.N_ROW).ToList().Contains(x.N_ROW)).ToList(); |
| | | if (lstCanOutL.Count() <= EndMum.Count()) |
| | | { |
| | | arloclist = arloclist.FindAll(x => lstCanOutL.Select(e => e.N_ROW).ToList().Contains(x.N_ROW)).ToList(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | try |
| | | { |
| | | // var yuworders = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == "无菌标签出库" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => x.TagOverTime).ToList(); |
| | | var yuworders = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == "无菌标签出库" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => x.TagOverTime).ToList(); |
| | | var yuworders = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == "无菌标签出库" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => x.OutNum > 0).OrderBy(x => x.TagOverTime).ToList(); |
| | | if (!yuworders.Any()) |
| | | { |
| | | YwlBQ_CreInwork(locsFirst, WJ_BQ.RK_BQDDQ, WJ_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 == "无") |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 入库退库。 知道 零头满托。正常匹配。 |
| | | /// </summary> |
| | |
| | | private static void YwlPETK_CreInwork(List<locCntItem> klocsFirst, string v, string v2, int v1 = 3) |
| | | { |
| | | bool ord = v2.Contains("提扣"); |
| | | var chi = new SqlHelper<object>().GetInstance(); |
| | | var newDb = chi.CopyNew(); |
| | | var yx = klocsFirst.GroupBy(x => x.N_ROW).OrderBy(x => x.Key).ToList(); |
| | | foreach (var ptR in klocsFirst.GroupBy(x => x.N_ROW).OrderBy(x => x.Key).ToList()) |
| | | foreach (var ptR in klocsFirst.GroupBy(x => x.N_ROW).OrderBy(x => x.Key)) |
| | | { |
| | | Location EndBit = null; |
| | | var rsfull = ptR.OrderBy(X => X.N_COL).ToList().FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault();//起点 |
| | | var ptrlist = ptR.OrderBy(X => X.N_COL).ToList(); |
| | | var rsfull = ptrlist.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); |
| | | if (rsfull != null) |
| | | { |
| | | var cntrlist = ptrlist.FindAll(x => x.S_LOC_CODE == rsfull.S_LOC_CODE).Select(x => x.S_CNTR_CODE); |
| | | var rklist = LocationHelper.GetRowLock(v); |
| | | var inlock = rklist.Find(x => x.S_AREA_CODE == v && x.S_LOCK_SRC == (rsfull.S_NOTE + rsfull.HalfOrFull) && x.S_LOCK_STATE.Contains("入库锁")); |
| | | var NormalList = LocationHelper.GetAreaNormalLocList(v); |
| | |
| | | { |
| | | var srloclist = rs.OrderBy(x => x.N_COL).ToList(); |
| | | var lastfull = srloclist.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault(); |
| | | EndBit = srloclist.Find(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM < Math.Min(x.N_CAPACITY, v1) && x.S_LOCK_STATE != "报废" && x.N_COL >= (lastfull?.N_COL ?? 0)); |
| | | EndBit = srloclist.Find(x => x.S_LOCK_STATE == "无" && (x.N_CURRENT_NUM + cntrlist.Count()) <= Math.Min(x.N_CAPACITY, v1) && x.S_LOCK_STATE != "报废" && x.N_COL >= (lastfull?.N_COL ?? 0)); |
| | | if (EndBit != null) |
| | | break; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var hasNum = NormalList.FindAll(x => x.N_CURRENT_NUM > 0).Select(x => x.N_ROW).Distinct().ToList(); |
| | | 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(); |
| | | } |
| | | else |
| | | { |
| | | if (hasNum.Any()) |
| | | { |
| | | //有相同物料 相同标签的继续入 |
| | | List<Location> lstCanOutL = new List<Location>(); |
| | | if (!string.IsNullOrEmpty(rsfull.S_BATCH_NO)) |
| | | { |
| | | lstCanOutL = newDb.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where((o, p, t) => o.S_AREA_CODE == v && o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && hasNum.Contains(o.N_ROW) && t.S_ITEM_CODE == rsfull.S_ITEM_CODE && t.S_ITEM_NAME == rsfull.S_ITEM_NAME && t.S_BATCH_NO == rsfull.S_BATCH_NO).ToList(); |
| | | |
| | | } |
| | | else |
| | | { |
| | | lstCanOutL = newDb.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where((o, p, t) => o.S_AREA_CODE == v && o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && hasNum.Contains(o.N_ROW) && t.S_ITEM_CODE == rsfull.S_ITEM_CODE && t.S_ITEM_NAME == rsfull.S_ITEM_NAME && string.IsNullOrEmpty(t.S_BATCH_NO)).ToList(); |
| | | } |
| | | if (lstCanOutL.Any()) |
| | | { |
| | | var loclist1 = NormalList.FindAll(x => lstCanOutL.Select(f => f.N_ROW).Distinct().ToList().Contains(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; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if (EndBit != null) |
| | | { |
| | | var res = TaskProcess.CreateTransport("", rsfull.S_LOC_CODE.Trim(), EndBit.S_LOC_CODE, v2 + "-入库", new List<string> { rsfull.S_CNTR_CODE }, rsfull.N_CURRENT_NUM, EndBit.N_CURRENT_NUM + 1, 1, 62); |
| | | var res = TaskProcess.CreateTransport("", rsfull.S_LOC_CODE.Trim(), EndBit.S_LOC_CODE, v2 + "-入库", cntrlist.ToList(), rsfull.N_CURRENT_NUM + 1 - cntrlist.Count(), EndBit.N_CURRENT_NUM + 1, 1, 62); |
| | | LogHelper.CSucessLog($"from {rsfull.S_LOC_CODE} to {EndBit.S_LOC_CODE} {(v2 + "-入库")} ,创建{res} "); |
| | | |
| | | //if (res && inlock == null) |
| | | //{ |
| | | // 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<object>().GetInstance(); |
| | | // db.Insertable(r).ExecuteCommand(); |
| | | // //else |
| | | // //{ |
| | | // // if (inlock.N_ROW != EndBit.N_ROW) |
| | | // // { |
| | | // // db.Deleteable(inlock).ExecuteCommand(); |
| | | // // var row = db.Queryable<RowLock>().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(); |
| | | // // } |
| | | // //} |
| | | //} |
| | | 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<object>().GetInstance(); |
| | | db.Insertable(r).ExecuteCommand(); |
| | | //else |
| | | //{ |
| | | // if (inlock.N_ROW != EndBit.N_ROW) |
| | | // { |
| | | // db.Deleteable(inlock).ExecuteCommand(); |
| | | // var row = db.Queryable<RowLock>().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<YWLWorkOrder> yuworders) |
| | | { |
| | |
| | | if (order != null) |
| | | { |
| | | var Porder = WCSHelper.GetWorkOrder(order.SQL_LinkLineNO); |
| | | if (Porder == null) |
| | | { |
| | | LogHelper.CErrorLog("SX标签出库:" + (order.SQL_LinkLineNO) + "没有【执行中】的工单"); |
| | | yuworders.Remove(order); |
| | | goto retuse; |
| | | } |
| | | //if (Porder == null) |
| | | //{ |
| | | // LogHelper.CErrorLog("SX标签出库:" + (order.SQL_LinkLineNO) + "没有【执行中】的工单"); |
| | | // yuworders.Remove(order); |
| | | // goto retuse; |
| | | //} |
| | | var oto = new List<string>(); |
| | | //if (!string.IsNullOrEmpty(order.TagOver)) |
| | | // oto = order.TagOver.Split(',').ToList(); |
| | |
| | | if (order != null) |
| | | { |
| | | var Porder = WCSHelper.GetWorkOrder(order.SQL_LinkLineNO); |
| | | if (Porder == null) |
| | | { |
| | | LogHelper.CErrorLog("无菌标签出库:" + (order.SQL_LinkLineNO) + "没有【执行中】的工单"); |
| | | yuworders.Remove(order); |
| | | goto retuse; |
| | | } |
| | | //if (Porder == null) |
| | | //{ |
| | | // LogHelper.CErrorLog("无菌标签出库:" + (order.SQL_LinkLineNO) + "没有【执行中】的工单"); |
| | | // yuworders.Remove(order); |
| | | // goto retuse; |
| | | //} |
| | | |
| | | var oto = new List<string>(); |
| | | //if (!string.IsNullOrEmpty(order.TagOver)) |
| | |
| | | /// </summary> |
| | | internal static void YWL_ZX_Turn() |
| | | { |
| | | var dbcd = new SqlHelper<object>().GetInstance(); |
| | | |
| | | foreach (var ODs in LocationHelper.GetList<YWLZXtake>(X => X.S_ZX_STATE == "执行").GroupBy(x => x.S_START_AREA)) |
| | | { |
| | | var locS = LocationHelper.GetAreaNormalLocList(ODs.Key); |
| | |
| | | } |
| | | else |
| | | { |
| | | if (od.N_END_ROW > 0) |
| | | { |
| | | var EndRow = dbcd.Queryable<Location>().Where(l => l.S_AREA_CODE == od.S_END_AREA && l.N_ROW == od.N_END_ROW && l.N_CURRENT_NUM == 0).ToList(); |
| | | if (EndRow.Count() == 0) |
| | | { |
| | | //置为完成。 |
| | | od.S_ZX_STATE = "完成"; |
| | | WCSHelper.Do(db => db.Updateable(od).UpdateColumns(x => new { x.S_ZX_STATE }).ExecuteCommand()); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var EndRow = dbcd.Queryable<Location>().Where(l => l.S_AREA_CODE == od.S_END_AREA && l.N_CURRENT_NUM == 0).ToList(); |
| | | if (EndRow.Count() == 0) |
| | | { |
| | | //置为完成。 |
| | | od.S_ZX_STATE = "完成"; |
| | | WCSHelper.Do(db => db.Updateable(od).UpdateColumns(x => new { x.S_ZX_STATE }).ExecuteCommand()); |
| | | } |
| | | } |
| | | var lastful = rows.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); |
| | | if (lastful != null) |
| | | { |
| | |
| | | string nextarea = !string.IsNullOrEmpty(od.S_ZZ_AREA) ? od.S_ZZ_AREA : od.S_END_AREA; |
| | | var zzlocs = LocationHelper.GetAreaNormalLocList(nextarea); |
| | | Location Endbit = null; |
| | | foreach (var zzrs in zzlocs.GroupBy(x => x.N_ROW).OrderBy(x => x.Key)) |
| | | if (od.N_END_ROW == 0 && zzlocs.Any()) |
| | | { |
| | | var zzrloclist = zzrs.ToList(); |
| | | var _cl2 = zzrloclist.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault(); |
| | | if (_cl2 != null) |
| | | foreach (var zzrs in zzlocs.GroupBy(x => x.N_ROW).OrderBy(x => x.Key)) |
| | | { |
| | | 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) |
| | | 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 && cntrrel.S_CJ_NAME == cir1.S_CJ_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($"入中转区{nextarea}使用{Endbit.S_LOC_CODE}"); |
| | | break; |
| | | } |
| | | } |
| | | else |
| | | Endbit = zzrloclist.Find(x => x.N_COL > (_cl2?.N_COL ?? 0)); |
| | | if (Endbit != null) |
| | | } |
| | | else |
| | | { |
| | | if (zzlocs.Any() && od.N_END_ROW > 0)//用于库内 比如A库某排移到A库的另一排 |
| | | { |
| | | LogHelper.Info($"入中转区{nextarea}使用{Endbit.S_LOC_CODE}"); |
| | | break; |
| | | zzlocs = zzlocs.FindAll(e => e.N_ROW == od.N_END_ROW); |
| | | // |
| | | var EndMt = dbcd.Queryable<Location>().Where(l => l.S_AREA_CODE == od.S_END_AREA && l.N_ROW == od.N_END_ROW && l.N_CURRENT_NUM > 0).ToList(); |
| | | if (EndMt.Any()) |
| | | { |
| | | var ggh = EndMt.OrderByDescending(e => e.N_COL).FirstOrDefault(); |
| | | zzlocs = zzlocs.FindAll(e => e.N_COL > ggh.N_COL).ToList(); |
| | | } |
| | | if (zzlocs.Any()) |
| | | { |
| | | Endbit = zzlocs.OrderBy(e => e.N_COL).FirstOrDefault(); |
| | | } |
| | | |
| | | } |
| | | } |
| | | LogHelper.Info($"YWL_ZX_Turn from{od.S_START_AREA} mid:{od.S_ZZ_AREA} to{od.S_END_AREA} 找到移库终点》{Endbit?.S_LOC_CODE}"); |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |