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.Globalization;
using System.Linq;
using System.Runtime.ConstrainedExecution;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Security.Policy;
using System.Threading;
using System.Threading.Tasks;
using Topshelf.Runtime.Windows;
using static HH.WCS.QingXigongchang.dispatch.NDC;
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)
LocationHelper.SetRowLock(item, 0);
}
}
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) LocationHelper.SetRowLock(item, 0);
else
{
var lastloC = locs.OrderByDescending(x => x.N_COL).FirstOrDefault();
if (lastloC.N_CURRENT_NUM == lastloC.N_CAPACITY) LocationHelper.SetRowLock(item, 0);
}
}
}
}
///
/// 领料出库。 公用于原材料出库。
///
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 && x.S_LOCK_STATE == "入库锁").FirstOrDefault();
if (inlock != null)
arloclist = arloclist.FindAll(x => x.N_ROW == inlock.N_ROW);
}
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)
{
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)
{
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, 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_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 => 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())
YwlBQ_CreInwork(locsFirst, WJ_BQ.RK_BQDDQ, WJ_BQ.RK_BBHJQ);
else
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 => 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();
//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 tk = LocationHelper.GetList(x => x.SQL_PLineNo == pline && x.WorkType == 1 && x.SQL_State == "执行中").FirstOrDefault();
if (!Syuworders.Any())
YwlBQ_CreInwork(SlocsFirst, SX_BQ.RK_BQDDQ, SX_BQ.RK_BBHJQ);
if (tk != null)
{
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);
}
}
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", "提扣叉运", 1);//提扣入库
YwlPETK_CreInwork(TKlocsFirst, "YWLTKMKQ", "收缩膜叉运"); // PE入库
//YwlPETKtkOrder("YWLZSXBKQ", "YWLTKMKQ", "收缩膜叉运");
//YwlPETKOutOrder("YWLTKMKQ", "YWLZSXBKQ", "收缩膜叉运");// PE中出库
var tk = LocationHelper.GetList(x => x.SQL_PLineNo == "T2提升机-收缩膜" && x.WorkType == 1 && x.SQL_State == "执行中").FirstOrDefault();
if (tk != null)
{
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小出库
{
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()) return;
var ploc = plc.location[0];
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?.Trim();
var oin = order.SQL_ItemName?.Trim();
if (string.IsNullOrEmpty(oic) || string.IsNullOrEmpty(oin))
{
LogHelper.CErrorLog("小水出库:" + (order.SQL_WorkNo) + "没有【指定物料;");
goto retuse;
}
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();
if (cir.S_ITEM_CODE == order.SQL_ItemCode && cir.S_ITEM_NAME == order.SQL_ItemName)
{
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()
};
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;
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 }, 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();
}
}
}
}
}
}
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)
{
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()
};
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()
{
//1.检查是否有退库
var db = new SqlHelper().GetInstance();
///第三段:接驳区 转 线边
var JQBS = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BQJBQ);
foreach (var jbr in JQBS.GroupBy(x => x.N_ROW))
{
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)
{
//回库。
continue;
}
var cirs = ContainerHelper.GetCntrItemRel(c.FirstOrDefault().S_CNTR_CODE);
if (!cirs.Any()) 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))
{
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)
{
continue;
}
var xcirs = ContainerHelper.GetCntrItemRel(xc.FirstOrDefault().S_CNTR_CODE);
if (!xcirs.Any()) 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)
continue;
}
var e = x2.FindAll(x => x.N_COL > (l3?.N_COL ?? 0) && x.N_CURRENT_NUM == 0).FirstOrDefault();
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;
}
}
}
}
///拆垛区取消。
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 => 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 int ItemLayer { get; set; } = 0;
public string area { get; set; }
public string Row { get; set; }
}
public static void AutoRun13TSJ()
{
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 == "执行中");
orkOrd = orkOrd.FindAll(x => DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10);
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;
}
ReadCCK = can;
if (orkOrd.Any())
foreach (var od in orkOrd.OrderByDescending(x => x.OutNum))
{
///汇总仓库里最大层是几层。
Dictitems Lart = null;
foreach (var area in 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))
{
if (Lart == null)
Lart = d;
else
{
if (Lart.ItemLayer < d.ItemLayer)
Lart = d;
}
}
}
}
// 需要数量 >= 仓库最大数量。 就开始出库。
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 + "识别托盘类型。");
var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault();
if (_clcntitem != null)
{
if (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName)
{
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 b = TaskProcess.CreateTransport(od.SQL_WorkNo, StartBit.S_LOC_CODE, Endbit.S_LOC_CODE, "原物料搬运-纸箱", crs, StartBit.N_CURRENT_NUM - crs.Count + 1, 1, crs.Count, PLC.taskPri);
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();
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();
}
break;
}
}
}
}
}
public static void AutoRunABD()
{
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())
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);
//板型相同
var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First();
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);
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,
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,
area = area,
Row = $"{rl.S_LOC_CODE}"
});
dsi.Add(area, dictitems);
}
}
}
}
}
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 + "所有任务完成!");
}
}
}