| | |
| | | using System.Threading; |
| | | using System.Threading.Tasks; |
| | | using Topshelf; |
| | | using static System.Net.Mime.MediaTypeNames; |
| | | using Monitor = HH.WCS.QingXigongchang.core.Monitor; |
| | | |
| | | namespace HH.WCS.QingXigongchang |
| | |
| | | //原材料 自动中转 - 展示流程。 前期测试用的 |
| | | //GetTask(Monitor.AutoRun), |
| | | GetTask(Monitor.YwlTKPEBQ_Auto),//标签无菌水线出入库。 |
| | | //原材料的 新中转流程。 |
| | | GetTask(Monitor.YWL_ZX_Turn), |
| | | //原材料的 新中转流程。 |
| | | GetTask(Monitor.YWL_ZX_Turn),//--移库 |
| | | GetTask(Monitor.BottTask),// 纸箱自动中转 |
| | | GetTask(Monitor.AutoRunABD), |
| | | GetTask(Monitor.AutoRun13TSJ), |
| | |
| | | |
| | | {"address":"10.140.3.187","deviceName":"瓶盖5L翻斗机","deviceNo":["","187"],"location":["SXFDJ-1"],"deviceType":10,"areaPriy":["PGMKCK"],"enable":1}, |
| | | |
| | | {"address":"10.140.3.170","deviceName":"T2提升机","deviceNo":[""],"taskPri":50,"location":["YWLT2TSJ"],"areaPriy":["YWLT2TSJCD"],"deviceType":13,"enable":1}, |
| | | {"address":"10.140.9.167","deviceName":"T1提升机","deviceNo":[""],"taskPri":50,"location":["YWLT1TSJ"],"areaPriy":["YWLT1TSJCD"],"deviceType":13,"enable":1}, |
| | | {"address":"10.140.9.167","deviceName":"T2提升机","deviceNo":[""],"taskPri":50,"location":["YWLT2TSJ"],"areaPriy":["YWLT2TSJCD"],"deviceType":13,"enable":1}, |
| | | {"address":"10.140.9.168","deviceName":"T1提升机","deviceNo":[""],"taskPri":50,"location":["YWLT1TSJ"],"areaPriy":["YWLT1TSJCD"],"deviceType":13,"enable":1}, |
| | | |
| | | ]]]> |
| | | |
| | |
| | | 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 (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}"); |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | |
| | | //就查看有没有空的排了。 |
| | | //if (endBit != null) /// 寻找未满排, 直接返回结果。 |
| | | return endBit; |
| | | //LogHelper.Info(" _tempList over!"); |
| | | |
| | | //这里开始 寻找空排 |
| | | Empty: |
| | |
| | | } |
| | | if (endBit == null && _tempList.Any()) |
| | | { |
| | | LogHelper.Info(" ar_RplaceRow over!"); |
| | | var ar_RplaceRows = LocationHelper.GetLocList(x => x.S_AREA_CODE != area1 && x.S_AREA_CODE.Contains(are) && x.S_LOCK_STATE != "报废");//.Select(x => x.N_ROW).Distinct(); |
| | | //var ar_RplaceRow1 = ar_RplaceRows.FindAll(x => x.S_LOCK_STATE != "无").Select(x => x.N_ROW).Distinct(); |
| | | IEnumerable<int> ar_RplaceRow1 = ar_RplaceRows.FindAll(x => "入库锁;出库锁".Contains(x.S_LOCK_STATE?.Trim())).Select(x => x.N_ROW).Distinct(); |
| | | LogHelper.Info(" 有锁排 - " + JsonConvert.SerializeObject(ar_RplaceRow1)); //LogHelper.Info(" 有锁排 - " + JsonConvert.SerializeObject(ar_RplaceRow1)); |
| | | var ar_RplaceRow2 = ar_RplaceRows.FindAll(x => x.N_CURRENT_NUM > 0).Select(x => x.N_ROW).Distinct(); |
| | | LogHelper.Info(" 有货排: - " + JsonConvert.SerializeObject(ar_RplaceRow2)); |
| | | var ar_RplaceRow_rowlock = LocationHelper.GetRowLock(x => x.S_AREA_CODE.Contains(are))?.Select(x => x.N_ROW); |
| | | LogHelper.Info(" ar_RplaceRow over!" + JsonConvert.SerializeObject(_tempList.Select(x => x.N_ROW).Distinct())); |
| | | //var ar_RplaceRows = LocationHelper.GetLocList(x => x.S_AREA_CODE != area1 && x.S_AREA_CODE.Contains(are) && x.S_LOCK_STATE != "报废");//.Select(x => x.N_ROW).Distinct(); |
| | | // //var ar_RplaceRow1 = ar_RplaceRows.FindAll(x => x.S_LOCK_STATE != "无").Select(x => x.N_ROW).Distinct(); |
| | | //IEnumerable<int> ar_RplaceRow1 = ar_RplaceRows.FindAll(x => "入库锁;出库锁".Contains(x.S_LOCK_STATE?.Trim())).Select(x => x.N_ROW).Distinct(); |
| | | //LogHelper.Info(" 有锁排 - " + JsonConvert.SerializeObject(ar_RplaceRow1)); //LogHelper.Info(" 有锁排 - " + JsonConvert.SerializeObject(ar_RplaceRow1)); |
| | | //var ar_RplaceRow2 = ar_RplaceRows.FindAll(x => x.N_CURRENT_NUM > 0).Select(x => x.N_ROW).Distinct(); |
| | | //LogHelper.Info(" 有货排: - " + JsonConvert.SerializeObject(ar_RplaceRow2)); |
| | | //var ar_RplaceRow_rowlock = LocationHelper.GetRowLock(x => x.S_AREA_CODE.Contains(are))?.Select(x => x.N_ROW); |
| | | |
| | | var ar_RplaceRow = ar_RplaceRow1.Concat(ar_RplaceRow2).Concat(ar_RplaceRow_rowlock).Distinct(); |
| | | //var ar_RplaceRow = ar_RplaceRow1.Concat(ar_RplaceRow2).Concat(ar_RplaceRow_rowlock).Distinct(); |
| | | |
| | | if (ar_RplaceRow.Any()) |
| | | { |
| | | LogHelper.Info("排除非空排 - " + JsonConvert.SerializeObject(ar_RplaceRow)); |
| | | _tempList.RemoveAll(x => ar_RplaceRow.Contains(x.N_ROW)); |
| | | } |
| | | if (_tempList.Any())//三个库区的交集空排 |
| | | { |
| | | endBit = _tempList.OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); |
| | | } |
| | | //if (ar_RplaceRow.Any()) |
| | | //{ |
| | | // LogHelper.Info("排除非空排 - " + JsonConvert.SerializeObject(ar_RplaceRow)); |
| | | // _tempList.RemoveAll(x => ar_RplaceRow.Contains(x.N_ROW)); |
| | | //} |
| | | //if (_tempList.Any())//三个库区的交集空排 |
| | | //{ |
| | | // endBit = _tempList.OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); |
| | | //} |
| | | endBit = _tempList.OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault(); |
| | | } |
| | | |
| | | #endregion |
| | |
| | | |
| | | {"address":"10.140.3.187","deviceName":"瓶盖5L翻斗机","deviceNo":["","187"],"location":["SXFDJ-1"],"deviceType":10,"areaPriy":["PGMKCK"],"enable":1}, |
| | | |
| | | {"address":"10.140.3.170","deviceName":"T2提升机","deviceNo":[""],"taskPri":50,"location":["YWLT2TSJ"],"areaPriy":["YWLT2TSJCD"],"deviceType":13,"enable":1}, |
| | | {"address":"10.140.9.167","deviceName":"T1提升机","deviceNo":[""],"taskPri":50,"location":["YWLT1TSJ"],"areaPriy":["YWLT1TSJCD"],"deviceType":13,"enable":1}, |
| | | {"address":"10.140.9.167","deviceName":"T2提升机","deviceNo":[""],"taskPri":50,"location":["YWLT2TSJ"],"areaPriy":["YWLT2TSJCD"],"deviceType":13,"enable":1}, |
| | | {"address":"10.140.9.168","deviceName":"T1提升机","deviceNo":[""],"taskPri":50,"location":["YWLT1TSJ"],"areaPriy":["YWLT1TSJCD"],"deviceType":13,"enable":1}, |
| | | |
| | | ]]]> |
| | | |
| | |
| | | public string SQL_WorkNo { get; set; } |
| | | public string S_START_AREA { get; set; } |
| | | public int N_START_ROW { get; set; } |
| | | public int N_END_ROW { get; set; } |
| | | public string S_ZZ_AREA { get; set; } |
| | | public string S_END_AREA { get; set; } |
| | | public string S_ZX_STATE { get; set; } |