using HH.WCS.QingXigongchang.process;
|
using HH.WCS.QingXigongchang.util;
|
using HH.WCS.QingXigongchang.wms;
|
using Newtonsoft.Json;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Threading;
|
using System.Threading.Tasks;
|
|
namespace HH.WCS.QingXigongchang.core
|
{
|
/// <summary>
|
/// 定时轮询任务
|
/// </summary>
|
internal class Monitor
|
{
|
static List<WorkOrder> RunOrder = new List<WorkOrder>();
|
|
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<TurnWorkOrder>(item).UpdateColumns(it => new
|
{
|
it.SQL_State,
|
it.Note
|
}).ExecuteCommand();
|
});
|
continue;
|
}
|
}
|
|
if (item.TrayCount > 0)
|
{
|
var b = LocationHelper.DoAction(db =>
|
{
|
var task = new SqlHelper<object>().GetInstance().Queryable<WMSTask>().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), item.SQL_WorkNo);
|
WCSHelper.Do(db =>
|
{
|
LogHelper.Info("移库工单数量完成" + item.SQL_WorkNo);
|
item.SQL_State = "完成";
|
item.Note = "数量完成";
|
db.Updateable<TurnWorkOrder>(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), item.SQL_WorkNo);
|
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>(workOrder).UpdateColumns(it => new
|
{
|
it.TurnState
|
}).ExecuteCommand();
|
}
|
}
|
|
item.Note = "手动完成,解锁";
|
db.Updateable<TurnWorkOrder>(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), item.SQL_WorkNo);
|
|
LogHelper.Info($"{item.Turn_Type}工单,完成" + item.SQL_WorkNo + "起排无货 或 终排已满 无法移库");
|
item.SQL_State = "完成";
|
item.Note = "起排无货 或 终排已满 无法移库";
|
db.Updateable<TurnWorkOrder>(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<TurnWorkOrder>(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<TurnWorkOrder>(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<TurnWorkOrder>(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<TurnWorkOrder>(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), item.SQL_WorkNo);
|
LogHelper.Info($"{item.Turn_Type}工单,完成" + item.SQL_WorkNo + "起点已经没有货了,移库完成");
|
item.SQL_State = "完成";
|
item.Note = "起点已经没有货了,移库完成";
|
db.Updateable<TurnWorkOrder>(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), item.SQL_WorkNo);
|
LogHelper.Info($"{item.Turn_Type}工单,完成" + item.SQL_WorkNo + "终点满了,移库完成");
|
item.SQL_State = "完成";
|
item.Note = "终点满了,移库完成";
|
db.Updateable<TurnWorkOrder>(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<TurnWorkOrder>(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, string WorkNo = "")
|
{
|
LogHelper.Info("移库解锁 doo" + msg + "---" + sign + "--" + WorkNo);
|
LogHelper.Info(JsonConvert.SerializeObject(startBit));
|
LogHelper.Info(JsonConvert.SerializeObject(EndBit));
|
bool j解锁起点库区排 = true;
|
if (!string.IsNullOrEmpty(WorkNo) && sign == 0)
|
{
|
//解锁时,有工单号。 查查除了这个工单号以外的其他 指定出库排执行
|
var orders = WCSHelper.GetWorkOrder2();
|
var thisOrder = orders.Find(x => x.SQL_WorkNo == WorkNo);
|
LogHelper.Info("移库解锁 --当前工单 sid:" + thisOrder?.S_ID);
|
var allarea_rows = orders.FindAll(x => x.S_ID != thisOrder.S_ID && x.start_area == thisOrder.start_area && x.start_row == thisOrder.start_row);
|
LogHelper.Info("移库解锁 --当前工单 的同库区排 其他工单:" + JsonConvert.SerializeObject(allarea_rows));
|
if (allarea_rows.Any())
|
j解锁起点库区排 = false;
|
//if (thisOrder != null)
|
//{
|
// var other = orders.Find(x => x.SQL_WorkNo != WorkNo && x.start_area == thisOrder.start_area && x.start_row == thisOrder.start_row);
|
// LogHelper.Info($"移库解锁 --其他工单 x.start_area == {thisOrder.start_area} start_row == {thisOrder.start_row} SID:" + other?.S_ID);
|
// if (other != null)
|
// j解锁起点库区排 = false;
|
//}
|
}
|
//if (sign == 1)
|
//{
|
// if (LocationHelper.GetRowLock(x => x.S_AREA_CODE == startBit.S_AREA_CODE && x.N_ROW == startBit.N_ROW).Count > 0)
|
// {
|
// return;
|
// }
|
//}
|
if (j解锁起点库区排)
|
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 lst = new List<string> { startBit.S_Fule_LOC, EndBit.S_Fule_LOC };
|
if (!j解锁起点库区排)
|
lst = new List<string> { EndBit.S_Fule_LOC };
|
var req = JsonConvert.SerializeObject(new
|
{
|
areaNum = lst,
|
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<string> { 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;
|
}
|
|
}
|
/// <summary>
|
/// 某工单的 起点列表, 和终点列表
|
/// 为了实时性 ,还是实时筛选吧
|
/// </summary>
|
//class D
|
//{
|
// public List<Location> StartLocs = new List<Location>();
|
// public List<Location> EndedLocs = new List<Location>();
|
//}
|
|
//节流。
|
public static int AutoTurn = 0;
|
//static Dictionary<string, D> SandELoclist = new Dictionary<string, D>();
|
|
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<string, D>();
|
//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<object>().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<WorkOrder>(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<WorkOrder>(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<Location>();
|
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<Location>();
|
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<string, int> map = new Dictionary<string, int>();
|
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<string>(); ;
|
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<string, int> map = new Dictionary<string, int>();//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<TurnWorkOrder>(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<WorkOrder>(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<WorkOrder>(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<RowLock>();
|
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<string> { 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<Location>(x => x.S_AREA_CODE == item.S_AREA_CODE && x.N_ROW == item.N_ROW);
|
if (locs.Find(x => x.N_CURRENT_NUM > 0) == null)
|
WCSHelper.Do(db => db.Deleteable(item).ExecuteCommand());
|
}
|
}
|
Rlock = Rlocks.FindAll(x => x.S_LOCK_STATE.Contains("入库锁"));
|
if (Rlock.Any())
|
{
|
foreach (var item in Rlock)
|
{
|
var locs = LocationHelper.GetList<Location>(x => x.S_LOCK_STATE != "报废" && x.S_AREA_CODE == item.S_AREA_CODE && x.N_ROW == item.N_ROW);
|
//var lastfull = locs.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault();
|
//if (lastfull != null)
|
//{
|
// if (lastfull.N_CURRENT_NUM == lastfull.N_CAPACITY)
|
// if (locs.Find(x => x.N_COL > lastfull.N_COL) == null)
|
// LocationHelper.SetRowLock(item, 0);
|
//}
|
//如果一排内无货。也无锁。 可能是物料的入库取消了。 取消当前排锁,防止后续不入这个物料了依然占着排。
|
if (locs.Find(x => x.N_CURRENT_NUM > 0) == null && locs.Find(x => x.S_LOCK_STATE != "无") == null) WCSHelper.Do(db => db.Deleteable(item).ExecuteCommand());
|
else
|
{
|
var lastloC = locs.OrderByDescending(x => x.N_COL).FirstOrDefault();
|
if (lastloC.N_CURRENT_NUM == lastloC.N_CAPACITY) WCSHelper.Do(db => db.Deleteable(item).ExecuteCommand());
|
else if (new List<string>() { "YWLAQWJ", "YWLBQWJ", "YWLCQSX", "YWLDQWJ" }.Contains(item.S_AREA_CODE)) WCSHelper.Do(db => db.Deleteable(item).ExecuteCommand());
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 领料出库。 公用于原材料出库。
|
/// </summary>
|
internal static void BottleCapAuto5()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var alrs = db.Queryable<LingItemOrder>().Where(x => x.WorkFromNo == "Auto" && x.State == "执行").ToList();
|
foreach (var item in alrs.FindAll(x => x.current < x.AreaNum))
|
{
|
Location StartBit = null;
|
List<LocCntrRel> 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<Location>(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<LocCntrRel>() { 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<LocCntrRel>() { 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<string> { lcr.FirstOrDefault().S_CNTR_CODE }, eb.N_CURRENT_NUM, endBit.N_CURRENT_NUM + 1, 1, 60);
|
}
|
}
|
return;
|
}
|
//
|
static List<string> ABlist = new List<string> { "YWLAQWJ", "YWLBQWJ" };
|
static List<string> CDlist = new List<string> { "YWLCQSX", "YWLDQWJ" };
|
static bool InworkLock = false;
|
//Dictionary<string, List<RowLock>> RGRowList = new Dictionary<string, List<RowLock>>();
|
public static List<RowLock> RGRow = new List<RowLock>();
|
/// <summary>
|
/// 原材料 检测各流转位置。 写入托盘货位s_type 中 下一个目的地。就开始中转。
|
/// 原物料纸箱,入库堆叠区转运 YWLRGDD--人工堆叠区
|
/// </summary>
|
internal static void BottTask()
|
{
|
//InworkLock = false;
|
var usingSpace = new List<string> { "入库接驳区", "库内接驳区", "出库接驳区", "提升机退料口" };
|
//usingSpace = new List<string> { "YWLRGDD", "YWLWJJB", "YWLYLTKQ", "YWLTKKTQ", "YWLKTDDQ", "YWLT1TSJ", "YWLT1TSJCD", "YWLT2TSJ", "YWLT2TSJCD" };
|
usingSpace = new List<string> { "YWLYLTKQ", "YWLTKKTQ", "YWLWJJB", "YWLRGDD", "YWLT1TSJ", "YWLT2TSJ" };
|
var dbll = new SqlHelper<object>().GetInstance();
|
///----------------------------退余料中间库区,退空中间库区,
|
/// /*托盘货位表的 S_TYPE。 库区1,库区,*/
|
foreach (var area in usingSpace)
|
{
|
try
|
{
|
|
var lolist = LocationHelper.GetAreaNormalLocList(area);// LocationHelper.GetList<Location>(x => x.S_AREA_CODE == area && x.S_LOCK_STATE != "报废");
|
var lgrow = lolist.GroupBy(x => x.N_ROW).OrderBy(x => x.Key);
|
Dictionary<string, List<Location>> dsll = new Dictionary<string, List<Location>>();
|
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<Location> 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();
|
|
if (EdnRarea == "YWLBQWJ" || EdnRarea == "YWLWJJB")//到B区的移库工单最多只能生成两条任务
|
{
|
//查询任务数
|
List<string> AreaLi = new List<string>() { "YWLBQWJ", "YWLWJJB" };
|
var db = new SqlHelper<object>().GetInstance();
|
var list = db.Queryable<Location>().Where(a => AreaLi.Contains(a.S_AREA_CODE) && a.S_LOCK_STATE == "入库锁").ToList();
|
if (list.Count() >= 2)
|
{
|
LogHelper.Info($"CreateTransport- CreateTask Error" + $"终点库区为YWLRGDD或者YWLWJJB 则最多只能生成两个任务");
|
continue;
|
}
|
}
|
string Last = string.Join(",", ccr.Skip(1));
|
|
if (ABlist.Contains(EdnRarea))
|
{
|
var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁" || x.S_LOCK_STATE == "出库锁"));
|
//var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁"));
|
if (ls.Count() > 1)
|
{
|
LogHelper.Info($"{EdnRarea}任务数1管制2");
|
continue;
|
}
|
}
|
if (CDlist.Contains(EdnRarea))
|
{
|
var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && x.S_LOCK_STATE == "入库锁");
|
//var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁"));
|
if (ls.Count() > 2)
|
{
|
LogHelper.Info($"{EdnRarea}任务数1管制3");
|
continue;
|
}
|
}
|
|
//else if (CDlist.Contains(EdnRarea))
|
//{
|
// var ls = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == EdnRarea && (x.S_LOCK_STATE == "入库锁")).ToList();
|
// if (ls.Count() > 2)
|
// {
|
// LogHelper.Info($"CD区入库任务管制最大数3 {EdnRarea}");
|
// continue;
|
// }
|
//}
|
var cntritems = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE);
|
if (!cntritems.Any())
|
continue;
|
var cir1 = cntritems.First();
|
|
var arloclist = LocationHelper.GetAreaNormalLocList(EdnRarea);// LocationHelper.GetList<Location>(x => x.S_AREA_CODE == _clrel0.S_TYPE && x.S_LOCK_STATE != "报废");
|
|
//有移库工单 排除移库工单上所对应的排
|
var order = LocationHelper.GetList<YWLZXtake>(X => X.S_ZX_STATE == "执行").ToList();
|
if (order.Count() > 0)
|
{
|
foreach (var item in order)
|
{
|
LogHelper.Info($"有移库工单排除对应的库区{item.S_START_AREA} 排{item.N_START_ROW}");
|
arloclist.RemoveAll(e => e.S_AREA_CODE == item.S_START_AREA && e.N_ROW == item.N_START_ROW);
|
}
|
}
|
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;
|
List<RowLock> inlockLis = new List<RowLock>();
|
bool isCd = false;
|
if (CDlist.Contains(EdnRarea))
|
{
|
isCd = true;
|
//inlockLis = LocationHelper.GetList<RowLock>(x => x.S_AREA_CODE == EdnRarea && x.S_LOCK_SRC == cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME && x.S_LOCK_STATE == "入库锁").ToList();
|
//if (inlockLis.Count() > 0)
|
//{
|
// inlock = inlockLis.FirstOrDefault();
|
//}
|
inlock = RGRow.FirstOrDefault();
|
if (inlock != null)
|
{
|
//当入库的任务能放满一排并且还有余的时候 开第二排
|
//先判断起点有多少相同的 能入的物料
|
if (_cl.S_AREA_CODE == "YWLRGDD")//判断起点是否是人工堆叠区
|
{
|
inlockLis = RGRow.FindAll(e => e.S_AREA_CODE == EdnRarea && e.S_LOCK_SRC == cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME).ToList();
|
//然后判断人工堆叠区需要入库多少托同品种物料 startMum
|
//货位 托盘 物料表联查
|
LogHelper.Info($"查起点有多少同品种的物料 开始");
|
var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
|
ca.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == cir1.S_ITEM_CODE && t.S_ITEM_NAME == cir1.S_ITEM_NAME && t.S_CJ_NAME == cir1.S_CJ_NAME && o.S_AREA_CODE == "YWLRGDD" && p.S_TYPE == _clrel0.S_TYPE);
|
var lstCanOutL = dbll.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).ToList();
|
LogHelper.Info($"起点要入CD的有多少托盘数量为{lstCanOutL.Count()}");
|
//判断终点排能入多少 少于入库托盘数则多开一排 EndMum
|
var EndMum = dbll.Queryable<Location>().Where(l => l.S_AREA_CODE == EdnRarea && l.N_CURRENT_NUM == 0 && l.S_LOCK_STATE == "无" && inlockLis.Select(e => e.N_ROW).ToList().Contains(l.N_ROW)).ToList();
|
LogHelper.Info($"终点CD排有多少空托能入{lstCanOutL.Count()}");
|
if (lstCanOutL.Count <= EndMum.Count())
|
{
|
arloclist = arloclist.FindAll(x => inlockLis.Select(e => e.N_ROW).ToList().Contains(x.N_ROW)).ToList();
|
}
|
else
|
{
|
arloclist = arloclist.FindAll(x => !inlockLis.Select(e => e.N_ROW).ToList().Contains(x.N_ROW)).ToList();
|
inlock = null;
|
}
|
LogHelper.Info($"查起点有多少同品种的物料 结束");
|
}
|
else
|
{
|
arloclist = arloclist.FindAll(x => x.N_ROW == inlock.N_ROW).ToList();
|
}
|
}
|
else
|
{
|
if (_cl.S_AREA_CODE == "YWLRGDD")
|
{
|
//查询是否有已经入了的排
|
var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
|
ca.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == cir1.S_ITEM_CODE && t.S_ITEM_NAME == cir1.S_ITEM_NAME && t.S_CJ_NAME == cir1.S_CJ_NAME && o.S_AREA_CODE == EdnRarea);
|
var lstCanOutL = dbll.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).ToList();
|
LogHelper.Info($"终点有相同的物料的货位有{lstCanOutL.Count()}");
|
|
var ca1 = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
|
ca1.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == cir1.S_ITEM_CODE && t.S_ITEM_NAME == cir1.S_ITEM_NAME && t.S_CJ_NAME == cir1.S_CJ_NAME && o.S_AREA_CODE == "YWLRGDD" && p.S_TYPE == EdnRarea);
|
var lstCanOutLSta = dbll.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca1.ToExpression()).ToList();
|
if (lstCanOutL.Count() > 0)
|
{
|
var EndMum = dbll.Queryable<Location>().Where(l => l.S_AREA_CODE == EdnRarea && l.N_CURRENT_NUM == 0 && l.S_LOCK_STATE == "无" && lstCanOutL.Select(e => e.N_ROW).ToList().Contains(l.N_ROW)).ToList();
|
if (EndMum.Count() > 0)
|
{
|
if (lstCanOutL.Count() <= EndMum.Count())
|
{
|
arloclist = arloclist.FindAll(x => lstCanOutL.Select(e => e.N_ROW).ToList().Contains(x.N_ROW)).ToList();
|
}
|
}
|
}
|
}
|
|
}
|
}
|
foreach (var rss in arloclist.GroupBy(x => x.N_ROW).OrderByDescending(x => x.Count(y => y.N_CURRENT_NUM > 0)).ThenBy(x => x.Key))
|
{
|
rowlist = rss.OrderBy(x => x.N_COL).ToList();
|
//if (rowlist.FindAll((Location x) => x.S_LOCK_STATE.Trim() == "空间锁").Count > 0) { continue; }
|
//if (rowlist.FindAll((Location x) => x.S_LOCK_STATE.Trim() != "无" && x.S_LOCK_STATE.Trim() != "报废").Count > 0)
|
//{
|
// continue;
|
//}
|
var _cl2 = rowlist.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault();
|
endbit = rowlist.Find(x => x.N_COL > (_cl2?.N_COL ?? 0));
|
if (endbit == null) continue;
|
|
if (_cl2 != null && (EdnRarea == "YWLYLTKQ" || EdnRarea == "YWLKTDDQ")) //退库区进行堆叠
|
{
|
Last = "";
|
var rr_clrel = LocationHelper.GetLocCntrRel(_cl2.S_LOC_CODE);
|
var s_clrel0 = rr_clrel.OrderByDescending(xx => xx.T_CREATE).FirstOrDefault();
|
if (s_clrel0 != null && string.IsNullOrEmpty(s_clrel0.S_TYPE))
|
{
|
var cntrrel = ContainerHelper.GetCntrItemRel(rr_clrel.FirstOrDefault()?.S_CNTR_CODE).FirstOrDefault();
|
if (cntrrel.S_ITEM_CODE == cir1.S_ITEM_CODE && cntrrel.S_ITEM_NAME == cir1.S_ITEM_NAME && cntrrel.S_CJ_NAME == cir1.S_CJ_NAME)
|
{
|
if (_cl2.N_CURRENT_NUM < _cl2.N_CAPACITY)
|
endbit = _cl2;
|
else LogHelper.Info($"{EdnRarea}退库》使用{endbit.S_LOC_CODE}");
|
}
|
else
|
{
|
endbit = null;
|
continue;
|
}
|
}
|
}
|
|
else if (_cl2 != null) // 流转,匹配同排,不堆叠
|
{
|
var rel = LocationHelper.GetLocCntrRel(_cl2.S_LOC_CODE);
|
var cntrrel = ContainerHelper.GetCntrItemRel(rel.FirstOrDefault()?.S_CNTR_CODE).FirstOrDefault();
|
if (cntrrel == null)
|
continue;
|
if (cntrrel.S_ITEM_CODE == cir1.S_ITEM_CODE && cntrrel.S_ITEM_NAME == cir1.S_ITEM_NAME && cntrrel.S_CJ_NAME == cir1.S_CJ_NAME)
|
{
|
LogHelper.Info($"入库库》使用{endbit.S_LOC_CODE}");
|
}
|
else
|
{
|
endbit = null;
|
continue;
|
}
|
//}
|
//else
|
//{
|
// endbit = null;
|
// continue;
|
//}
|
}
|
if (endbit != null) break;
|
}
|
if (endbit != null)
|
{
|
var sign = Settings.GetTimeStamp();
|
var res = TaskProcess.CreateTransport(sign, _cl.S_LOC_CODE, endbit.S_LOC_CODE, "原物料搬运-纸箱", _clrel.Select(x => x.S_CNTR_CODE).ToList(), 1, endbit.N_CURRENT_NUM + 1, 1, 50, Last);///, EdnRarea == "YWLYLTKQ" ? _clrel0.S_TYPE : "");
|
LogHelper.Info($"{r.Key}原物料搬运 {sign} 任务 ,创建{res} ");
|
if (CDlist.Contains(endbit.S_AREA_CODE) && res)
|
{
|
LogHelper.Info($"添加内存排锁");
|
var ggf = inlockLis.Find(e => e.S_LOCK_SRC == cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME && e.S_AREA_CODE == endbit.S_AREA_CODE && e.N_ROW == endbit.N_ROW);
|
LogHelper.Info($"添加内存排锁 是否查询到数据:{JsonConvert.SerializeObject(ggf)}");
|
if (ggf == null)
|
{
|
var rrrr = new RowLock { S_LOCK_SRC = cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁", S_AREA_CODE = endbit.S_AREA_CODE, N_ROW = endbit.N_ROW };
|
inlockLis.Add(rrrr);
|
LogHelper.Info($"添加内存排锁 添加数据到内存排锁中:{JsonConvert.SerializeObject(inlockLis)}");
|
}
|
}
|
//if (res && inlock == null && isCd)
|
//{
|
// var rrrr = new RowLock { S_LOCK_SRC = cir1.S_ITEM_CODE + cir1.S_ITEM_NAME + cir1.S_CJ_NAME, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁", S_AREA_CODE = endbit.S_AREA_CODE, N_ROW = endbit.N_ROW };
|
// LogHelper.Info($"原物料入库 添加排锁信息{JsonConvert.SerializeObject(rrrr)} ");
|
// 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
|
{
|
/// <summary>
|
/// 入库堆叠区
|
/// </summary>
|
public static string RK_BQDDQ = "WJBQDDKQ";
|
/// <summary>
|
/// 仓库货架
|
/// </summary>
|
public static string RK_BBHJQ = "WJBQ";
|
/// <summary>
|
/// wj拆垛
|
/// </summary>
|
public static string RK_BQCDQ = "WJBQDDKQ";
|
/// <summary>
|
/// jiebo
|
/// </summary>
|
public static string RK_BQJBQ = "WJBQJBQ";
|
/// <summary>
|
/// xianbian
|
/// </summary>
|
public static string RK_XBKQ = "WJXBKQ";
|
|
|
}
|
|
class SX_BQ
|
{
|
/// <summary>
|
/// 入库堆叠区
|
/// </summary>
|
public static string RK_BQDDQ = "SXBQDDKQ";
|
/// <summary>
|
/// 仓库货架
|
/// </summary>
|
public static string RK_BBHJQ = "SXBQHJ";
|
|
public static string RK_BQCDQ = "SXBQDDKQ";
|
|
}
|
/// <summary>
|
/// 提扣 。标签。PE膜出库
|
/// </summary>
|
internal static void YwlTKPEBQ_Auto()
|
{
|
LogHelper.CoCo(DateTime.Now + "标签-提扣-PE膜->>>>>>>>>>>> ", ConsoleColor.Cyan);
|
var locsFirst1 = LocationHelper.GetAreaNormalLocList(BQ_PRA.YWLRGDD);
|
var db = new SqlHelper<object>().GetInstance();
|
var locsFirstA = db.Queryable<LocCntrRel>()//标签绑定必须都是单层。 - 涉及堆叠与货架1层问题。
|
.InnerJoin<CntrItemRel>((lcr, cir) => lcr.S_CNTR_CODE == cir.S_CNTR_CODE)
|
//.LeftJoin<ItemInfo>((lcr, cir, item) => cir.S_ITEM_CODE == item.S_ITEM_CODE && cir.S_ITEM_NAME == item.S_ITEM_NAME)
|
.InnerJoin<Location>((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_BATCH_NO = cir.S_BATCH_NO,
|
S_CJ_NAME = cir.S_CJ_NAME,
|
S_CNTR_CODE = cir.S_CNTR_CODE
|
})
|
.ToList();
|
/// 人工堆叠区纸箱 和 标签 是按标识+物料筛选进行入库转运。
|
/// 物料名称包含对应种类进行入库。
|
foreach (var item in locsFirstA)
|
{
|
if (!string.IsNullOrEmpty(item.S_BATCH_NO))
|
{
|
item.S_NOTE = item.S_NOTE + "&" + item.S_BATCH_NO;
|
}
|
}
|
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<Task>();
|
var task1 = Task.Run(() =>
|
{
|
try
|
{
|
// var yuworders = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == "无菌标签出库" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => x.TagOverTime).ToList();
|
var yuworders = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == "无菌标签出库" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => x.OutNum > 0).OrderBy(x => x.TagOverTime).ToList();
|
if (!yuworders.Any())
|
{
|
YwlBQ_CreInwork(locsFirst, WJ_BQ.RK_BQDDQ, WJ_BQ.RK_BBHJQ);
|
}
|
else
|
{
|
LogHelper.Info($" 无菌出库 工单开启中 ");
|
// 标签出库。货架直接出到线边
|
YwlBQ_CreWJOutOrder();
|
}
|
|
// 标签无菌退库。
|
YwlBQ_CreWJTK();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error(ex.Message, ex);
|
}
|
});
|
|
var plc = Settings.GetDeviceInfoList().Where(a => a.deviceName == "T2提升机").FirstOrDefault();
|
var task2 = Task.Run(() =>
|
{
|
try
|
{
|
string pline = "T2提升机-标签";
|
var Syuworders = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == pline && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => x.TagOverTime).ToList();
|
//yuworders = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == plc.deviceName && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => !string.IsNullOrEmpty(x.TagOver) ? 1 : 2).ThenBy(x => x.TagOverTime).ToList();
|
|
var tklist = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == pline && x.WorkType == 1 && x.SQL_State == "执行中");
|
if (!Syuworders.Any())
|
{
|
//水线标签入库
|
YwlBQ_CreInwork(SlocsFirst, SX_BQ.RK_BQDDQ, SX_BQ.RK_BBHJQ);
|
}
|
if (tklist.Count() > 0)
|
{
|
var tk = tklist.FirstOrDefault();
|
var loc = LocationHelper.GetLoc(plc.location[0]);
|
if (loc.N_CURRENT_NUM > 0 && loc.S_LOCK_STATE == "无")
|
{
|
var rr_clrel = LocationHelper.GetLocCntrRel(loc.S_LOC_CODE);
|
if (rr_clrel.FirstOrDefault()?.S_TYPE == BQ_PRA.B && DateTime.Now.Subtract(rr_clrel.FirstOrDefault()?.T_CREATE ?? DateTime.Now).TotalSeconds > 10)
|
{
|
var s_type = ContainerHelper.GetCntrItemRel(rr_clrel.FirstOrDefault().S_CNTR_CODE).FirstOrDefault()?.N_BQ_TRAY_TYPE ?? 0;
|
if (s_type == 0)
|
{
|
LogHelper.CErrorLog($"{tk.SQL_WorkNo}-{tk.SQL_PLineNo} 退库工单开启,绑定的 零整 标记");
|
}
|
Location Endbit = null;
|
// var hjs = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == SX_BQ.RK_BBHJQ).FindAll(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0);
|
// var hjs = db.Queryable<Location>().Where(l => l.S_AREA_CODE == SX_BQ.RK_BBHJQ && l.S_LOCK_STATE.Trim() == "无").ToList();
|
var hjs = LocationHelper.GetAreaNormalLocList(SX_BQ.RK_BBHJQ, true, false);
|
Endbit = hjs.FindAll(x => x.N_LAYER == (s_type == .5 ? 1 : (s_type == .75 ? 2 : 3))).OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault();
|
if (Endbit != null)
|
{
|
var re = TaskProcess.CreateTransport("", loc.S_LOC_CODE.Trim(), Endbit.S_LOC_CODE, "标签叉运-SX标签退库", rr_clrel.Select(x => x.S_CNTR_CODE).ToList(), 1, 1, 1, 62);
|
LogHelper.CSucessLog($"from {loc.S_LOC_CODE} to {Endbit.S_LOC_CODE} 标签叉运-SX标签退库 ,创建{re}");
|
}
|
}
|
}
|
}
|
else if (Syuworders.Any())
|
{
|
YwlBQ_CreSXOutOrder(plc, Syuworders.FindAll(x => x.OutNum > 0));
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error(ex.Message, ex);
|
}
|
});
|
var task3 = Task.Run(() =>
|
{
|
try
|
{
|
//return;
|
YwlPETKtkOrder("YWLZSXBKQ", "YWLTKMKQ", "提扣叉运");//提扣 中水 退库。
|
YwlPETKOutOrder("YWLTKMKQ", "YWLZSXBKQ", "提扣叉运", 1);//提扣中水出库
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error(ex.Message, ex);
|
}
|
});
|
var task4 = Task.Run(() =>
|
{
|
try
|
{
|
//return;
|
///起点数据。 终点库区 堆叠层数。
|
YwlPETK_CreInwork(PElocsFirst, "YWLTKMKQ", "收缩膜叉运", 2);//PE膜
|
YwlPETK_CreInwork(TKlocsFirst, "YWLTKMKQ", "提扣叉运", 1); //提扣
|
//YwlPETKtkOrder("YWLZSXBKQ", "YWLTKMKQ", "收缩膜叉运");
|
//YwlPETKOutOrder("YWLTKMKQ", "YWLZSXBKQ", "收缩膜叉运");// PE中出库
|
|
var tklist = LocationHelper.GetList<YWLWorkOrder>(x => x.SQL_PLineNo == "T2提升机-收缩膜" && x.WorkType == 1 && x.SQL_State == "执行中");
|
if (tklist.Count() > 0)
|
{
|
LogHelper.Info("-收缩膜 退库!");
|
var tk = tklist.FirstOrDefault();
|
|
var loc = LocationHelper.GetLoc(plc.location[0]);
|
if (loc.N_CURRENT_NUM > 0 && loc.S_LOCK_STATE == "无")
|
{
|
var rr_clrel = LocationHelper.GetLocCntrRel(loc.S_LOC_CODE);
|
if (rr_clrel.FirstOrDefault()?.S_TYPE == BQ_PRA.B && DateTime.Now.Subtract(rr_clrel.FirstOrDefault()?.T_CREATE ?? DateTime.Now).TotalSeconds > 10)
|
{
|
var cir = ContainerHelper.GetCntrItemRel(rr_clrel.FirstOrDefault().S_CNTR_CODE).FirstOrDefault();
|
if (cir == null)
|
{ LogHelper.CErrorLog($"{loc.S_LOC_CODE} 没有托盘物料数据!!"); return; }
|
var s_type = cir?.N_BQ_TRAY_TYPE ?? 0;
|
if (s_type == 0)
|
{
|
LogHelper.CErrorLog($"{tk.SQL_WorkNo}-{tk.SQL_PLineNo} 退库工单开启,绑定的 零整 标记");
|
}
|
Location Endbit = null;
|
//Endbit = hjs.FindAll(x => x.N_LAYER == (s_type == .5 ? 1 : (s_type == .75 ? 2 : 3))).OrderBy(x => x.N_ROW).ThenBy(x => x.N_COL).FirstOrDefault();
|
//if (Endbit != null)
|
//{
|
// var re = TaskProcess.CreateTransport("", loc.S_LOC_CODE.Trim(), Endbit.S_LOC_CODE, "收缩膜叉运-T2退库", rr_clrel.Select(x => x.S_CNTR_CODE).ToList(), 1, 1, 1, 62);
|
// LogHelper.CSucessLog($"from {loc.S_LOC_CODE} to {Endbit.S_LOC_CODE} 标签叉运-T2退库 ,创建{re}");
|
//}
|
string v = "YWLTKMKQ";
|
var rklist = LocationHelper.GetRowLock(v);
|
int hof = (s_type == .5 ? 1 : (s_type == .75 ? 2 : 3));
|
|
var inlock = rklist.Find(x => x.S_LOCK_SRC == (cir.S_ITEM_CODE.Trim() + "&" + cir.S_ITEM_NAME.Trim() + hof) && x.S_LOCK_STATE.Contains("入库锁"));
|
Location EndBit = null;
|
var NormalList = LocationHelper.GetAreaNormalLocList(v);
|
//有入库锁排。 能入就入。不能就等。
|
if (inlock != null)
|
{
|
var loclist1 = NormalList.FindAll(x => inlock.N_ROW == (x.N_ROW));
|
foreach (var rs in loclist1.GroupBy(x => x.N_ROW).OrderBy(x => x.Key * -1))
|
{
|
var srloclist = rs.OrderBy(x => x.N_COL).ToList();
|
var lastfull = srloclist.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault();
|
if (lastfull != null)
|
{
|
var c = LocationHelper.GetList<LocCntrRel>(x => x.S_LOC_CODE == lastfull.S_LOC_CODE);
|
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 || xcir.S_CJ_NAME != cir.S_CJ_NAME)
|
continue;
|
}
|
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<string> { 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<RowLock>().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First();
|
if (row != null)
|
{
|
if (row.S_LOCK_SRC != r.S_LOCK_SRC)
|
{
|
db.Deleteable(row).ExecuteCommand();
|
db.Insertable(r).ExecuteCommand();
|
}
|
}
|
else db.Insertable(r).ExecuteCommand();
|
}
|
}
|
Thread.Sleep(1000);
|
|
}
|
}
|
}
|
else
|
//YwlPETKOutOrder("YWLTKMKQ", "", "PE叉运");// PE小出库
|
{
|
LogHelper.Info("-收缩膜 出库!");
|
var yuworders = LocationHelper.GetList<YWLWorkOrder>(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 => x.TagOverTime).ToList();
|
if (!yuworders.Any())
|
{
|
LogHelper.Info("-收缩膜 出库!没有出库单。");
|
return;
|
}
|
var ploc = plc.location[0];
|
retuse:
|
var order = yuworders.FirstOrDefault();
|
if (yuworders.Count() > 0)
|
{
|
//var Cjsj = LocationHelper.GetList<CjTimeOrder>(x => yuworders.Select(c => c.S_CJ_NAME).ToList().Contains(x.S_CJ_NAME) && yuworders.Select(c => c.SQL_ItemCode).ToList().Contains(x.S_ITEM_CODE));
|
//if (Cjsj.Count() > 0)
|
//{
|
// var Cj = Cjsj.OrderBy(e => e.T_CJ_TIME).ToList().FirstOrDefault();
|
// order = yuworders.Find(e => e.S_CJ_NAME == Cj.S_CJ_NAME && e.SQL_ItemCode == Cj.S_ITEM_CODE);
|
//}
|
}
|
if (order != null)
|
{
|
var Porder = WCSHelper.GetWorkOrder(order.SQL_LinkLineNO);
|
if (Porder == null)
|
{
|
LogHelper.CErrorLog("小水出库:" + (order.SQL_LinkLineNO) + "没有【执行中】的工单");
|
yuworders.Remove(order);
|
goto retuse;
|
}
|
var oto = new List<string>();
|
//if (!string.IsNullOrEmpty(order.TagOver))
|
// oto = order.TagOver.Split(',').ToList();
|
var oic = order.SQL_ItemCode?.Trim();
|
var oin = order.SQL_ItemName?.Trim();
|
if (string.IsNullOrEmpty(oic) || string.IsNullOrEmpty(oin))
|
{
|
LogHelper.CErrorLog("小水出库:" + (order.SQL_WorkNo) + "没有【指定物料;");
|
goto retuse;
|
}
|
LogHelper.Info("-收缩膜 出库!" + oic + oin);
|
|
string v = "YWLTKMKQ";
|
int ord = -1;
|
locCntItem StartBit = null;
|
Location EndBit = null;
|
CntrItemRel cir = null;
|
var rklist = LocationHelper.GetRowLock(v);
|
var outlock = rklist.Find(x => x.S_AREA_CODE == v && x.S_LOCK_SRC == (oic + "&" + oin) && x.S_LOCK_STATE.Contains("出库锁"));
|
var NormalList = LocationHelper.GetAreaNormalLocList(v);
|
if (outlock != null)
|
{
|
NormalList = NormalList.FindAll(x => outlock.N_ROW == (x.N_ROW));
|
}
|
var taglist = new List<string>() { 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<LocCntrRel>(x => x.S_LOC_CODE == lastfull.S_LOC_CODE);
|
if (!CNTR.Any()) continue;
|
var cirs = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE);
|
if (!cirs.Any()) continue;
|
cir = cirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault();
|
LogHelper.Info($"收缩膜 出库!{item.Key}排 [{cir.S_ITEM_CODE}-{order.SQL_ItemCode}] [{cir.S_ITEM_NAME}-{order.SQL_ItemName}] [{cir.S_CJ_NAME}-{order.S_CJ_NAME}] {(cir.S_ITEM_CODE == order.SQL_ItemCode && cir.S_ITEM_NAME == order.SQL_ItemName && cir.S_CJ_NAME == order.S_CJ_NAME)}");
|
if (cir.S_ITEM_CODE == order.SQL_ItemCode && cir.S_ITEM_NAME == order.SQL_ItemName && cir.S_CJ_NAME == order.S_CJ_NAME)
|
{
|
//plg 2025年6月13日 09:08:10
|
Temp = new locCntItem
|
{
|
N_CURRENT_NUM = lastfull.N_CURRENT_NUM,
|
S_CNTR_CODE = cir.S_CNTR_CODE,
|
S_LOC_CODE = lastfull.S_LOC_CODE,
|
HalfOrFull = (cir.N_BQ_TRAY_TYPE == .5 ? 1 : (cir.N_BQ_TRAY_TYPE == .75 ? 2 : 3)),
|
S_NOTE = cir.S_ITEM_CODE.Trim() + "&" + cir.S_ITEM_NAME.Trim(),
|
S_CJ_NAME = cir.S_CJ_NAME
|
};
|
if (outlock != null)
|
{
|
StartBit = Temp;
|
break;
|
}
|
}
|
if (Temp != null)
|
{
|
if (StartBit == null)
|
StartBit = Temp;
|
else if (StartBit.HalfOrFull > Temp.HalfOrFull)
|
{
|
StartBit = Temp;
|
}
|
if (StartBit.HalfOrFull == 1) break;
|
}
|
}
|
}
|
if (StartBit != null)
|
{
|
var tagLoc = StartBit;
|
// 直接出提升机位
|
|
LogHelper.Info(order.SQL_PLineNo + $"-收缩膜出库!终点{ploc}-{DeviceProcess.doorStatus[ploc]?.info}");
|
if (!string.IsNullOrEmpty(ploc) && plc != null && DeviceProcess.doorStatus[ploc]?.info == "1")
|
{
|
var loc = LocationHelper.GetLoc(ploc);
|
LogHelper.Info(order.SQL_PLineNo + $"-收缩膜出库!终点{loc.N_CURRENT_NUM}-{loc.S_LOCK_STATE}");
|
if (loc.N_CURRENT_NUM == 0 && loc.S_LOCK_STATE == "无")
|
{
|
var re = TaskProcess.CreateTransport("", tagLoc.S_LOC_CODE.Trim(), loc.S_LOC_CODE, "收缩膜叉运-货架出提升机", new List<string> { tagLoc.S_CNTR_CODE }, StartBit.N_CURRENT_NUM, 1, 1, 62);
|
LogHelper.CSucessLog($"from {tagLoc.S_LOC_CODE} to {loc.S_LOC_CODE} 收缩膜叉运-货架出提升机 ,创建{re} ");
|
if (re)
|
{
|
oto.Add(oic);
|
if (outlock == null)
|
{
|
var r = new RowLock { S_LOCK_SRC = (StartBit.S_NOTE /*+ StartBit.HalfOrFull*/), T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "出库锁", S_AREA_CODE = StartBit.S_AREA_CODE, N_ROW = StartBit.N_ROW };
|
db.Insertable(r).ExecuteCommand();
|
}
|
}
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info(order.SQL_PLineNo + "-收缩膜 出库! 没有可用物料");
|
}
|
|
var set1 = new HashSet<string>(oto);
|
var set2 = new HashSet<string>(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);
|
}
|
/// <summary>
|
/// 提扣,中水 退库
|
/// </summary>
|
/// <param name="v1">线边</param>
|
/// <param name="v2">仓库</param>
|
/// <param name="v3">任务类型</param>
|
/// <exception cref="NotImplementedException"></exception>
|
private static void YwlPETKtkOrder(string v1, string v2, string v3)
|
{
|
|
var db = new SqlHelper<object>().GetInstance();
|
var v = db.Queryable<Location>().
|
LeftJoin<LocCntrRel>((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<LocCntrRel>(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<string> { 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<RowLock>().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First();
|
//if (row != null)
|
//{
|
// if (row.S_LOCK_SRC != r.S_LOCK_SRC)
|
// {
|
// db.Deleteable(row).ExecuteCommand();
|
// db.Insertable(r).ExecuteCommand();
|
// }
|
//}
|
//else db.Insertable(r).ExecuteCommand();
|
}
|
}
|
}
|
}
|
}
|
}
|
|
//执行退库。。。
|
Console.WriteLine($"{v.FirstOrDefault()?.S_LOC_CODE} 需要退库-- 自动退库-未实现");
|
}
|
}
|
//标签退库。 线边转到 货架。
|
private static void YwlBQ_CreWJTK()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var v = db.Queryable<Location>().
|
LeftJoin<LocCntrRel>((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<LocCntrRel>(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 == 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<LocCntrRel>(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<string> { 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<YWLWorkOrder> Orders = new List<YWLWorkOrder>();
|
|
foreach (var pline in new[] { "提扣中水出库" })
|
{
|
Orders = LocationHelper.GetList<YWLWorkOrder>(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<LocCntrRel>(x => x.S_LOC_CODE == lastfull.S_LOC_CODE);
|
if (!CNTR.Any()) continue;
|
var cirs = ContainerHelper.GetCntrItemRel(CNTR.FirstOrDefault().S_CNTR_CODE);
|
if (!cirs.Any()) continue;
|
cir = cirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault();
|
if (cir.S_ITEM_CODE == od.SQL_ItemCode && cir.S_ITEM_NAME == od.SQL_ItemName && cir.S_CJ_NAME == od.S_CJ_NAME)
|
{
|
//plg 2025年6月13日 09:09:25
|
Temp = new locCntItem
|
{
|
N_CURRENT_NUM = lastfull.N_CURRENT_NUM,
|
S_CNTR_CODE = cir.S_CNTR_CODE,
|
S_LOC_CODE = lastfull.S_LOC_CODE,
|
HalfOrFull = (cir.N_BQ_TRAY_TYPE == .5 ? 1 : (cir.N_BQ_TRAY_TYPE == .75 ? 2 : 3)),
|
S_NOTE = cir.S_ITEM_CODE.Trim() + "&" + cir.S_ITEM_NAME.Trim(),
|
S_CJ_NAME = cir.S_CJ_NAME
|
};
|
if (outlock != null)
|
{
|
StartBit = Temp;
|
break;
|
}
|
}
|
if (Temp != null)
|
{
|
if (StartBit == null)
|
StartBit = Temp;
|
else if (StartBit.HalfOrFull > Temp.HalfOrFull)
|
{
|
StartBit = Temp;
|
}
|
if (StartBit.HalfOrFull == 1) break;
|
}
|
}
|
}
|
//}
|
if (StartBit != null)
|
{
|
//var rklist = LocationHelper.GetRowLock(v);
|
//var inlock = rklist.Find(x => x.S_LOCK_SRC == (cir.S_ITEM_CODE.Trim() + "&" + cir.S_ITEM_NAME.Trim() + (cir.N_BQ_TRAY_TYPE == .5 ? 1 : (cir.N_BQ_TRAY_TYPE == .75 ? 2 : 3))) && x.S_LOCK_STATE.Contains("出库锁"));
|
var NormalList2 = LocationHelper.GetAreaNormalLocList(v1);
|
//if (inlock != null)
|
//{
|
// var loclist1 = NormalList.FindAll(x => inlock.N_ROW == (x.N_ROW));
|
foreach (var rs in NormalList2.GroupBy(x => x.N_ROW).OrderBy(x => x.Key))
|
{
|
var srloclist = rs.OrderBy(x => x.N_COL).ToList();
|
var lastfull = srloclist.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault();
|
if (lastfull != null)
|
{
|
var CNTR = LocationHelper.GetList<LocCntrRel>(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<LocCntrRel>(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<string> { 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<RowLock>().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First();
|
//if (row != null)
|
//{
|
// if (row.S_LOCK_SRC != r.S_LOCK_SRC)
|
// {
|
// db.Deleteable(row).ExecuteCommand();
|
// db.Insertable(r).ExecuteCommand();
|
// }
|
//}
|
//else
|
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;
|
}
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 入库退库。 知道 零头满托。正常匹配。
|
/// </summary>
|
/// <param name="klocsFirst"></param>
|
/// <param name="v"></param>
|
/// <param name="v2"></param>
|
/// <param name="v1"></param>
|
private static void YwlPETK_CreInwork(List<locCntItem> 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 ptrlist = ptR.OrderBy(X => X.N_COL).ToList();
|
var rsfull = ptrlist.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault();
|
if (rsfull != null)
|
{
|
var cntrlist = ptrlist.FindAll(x => x.S_LOC_CODE == rsfull.S_LOC_CODE).Select(x => x.S_CNTR_CODE);
|
var rklist = LocationHelper.GetRowLock(v);
|
var inlock = rklist.Find(x => x.S_AREA_CODE == v && x.S_LOCK_SRC == (rsfull.S_NOTE + rsfull.HalfOrFull) && x.S_LOCK_STATE.Contains("入库锁"));
|
var NormalList = LocationHelper.GetAreaNormalLocList(v);
|
//有入库锁排。 能入就入。不能就等。
|
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 + cntrlist.Count()) <= Math.Min(x.N_CAPACITY, v1) && x.S_LOCK_STATE != "报废" && x.N_COL >= (lastfull?.N_COL ?? 0));
|
if (EndBit != null)
|
break;
|
}
|
}
|
else
|
{
|
var hasNum = NormalList.FindAll(x => x.N_CURRENT_NUM > 0).Select(x => x.N_ROW).Distinct();
|
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 + "-入库", cntrlist.ToList(), rsfull.N_CURRENT_NUM + 1 - cntrlist.Count(), EndBit.N_CURRENT_NUM + 1, 1, 62);
|
LogHelper.CSucessLog($"from {rsfull.S_LOC_CODE} to {EndBit.S_LOC_CODE} {(v2 + "-入库")} ,创建{res} ");
|
|
if (res && inlock == null)
|
{
|
var r = new RowLock { S_LOCK_SRC = rsfull.S_NOTE + rsfull.HalfOrFull, T_LOCK_TIME = DateTime.Now, S_LOCK_STATE = "入库锁", S_AREA_CODE = EndBit.S_AREA_CODE, N_ROW = EndBit.N_ROW };
|
var db = new SqlHelper<object>().GetInstance();
|
db.Insertable(r).ExecuteCommand();
|
//else
|
//{
|
// if (inlock.N_ROW != EndBit.N_ROW)
|
// {
|
// db.Deleteable(inlock).ExecuteCommand();
|
// var row = db.Queryable<RowLock>().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First();
|
// if (row != null)
|
// {
|
// if (row.S_LOCK_SRC != r.S_LOCK_SRC)
|
// {
|
// db.Deleteable(row).ExecuteCommand();
|
// db.Insertable(r).ExecuteCommand();
|
// }
|
// }
|
// else db.Insertable(r).ExecuteCommand();
|
// }
|
//}
|
}
|
}
|
Thread.Sleep(1000);
|
}
|
}
|
}
|
|
|
private static void YwlBQ_CreSXOutOrder(Settings.deviceInfo plc, List<YWLWorkOrder> yuworders)
|
{
|
//LogHelper.Info($"{plc.deviceName}-标签 {yuworders.FirstOrDefault()?.SQL_WorkNo}");
|
var ploc = plc.location[0];
|
var db = new SqlHelper<object>().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<LocCntrRel>(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<YWLWorkOrder>(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<string> { 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<Location>(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<string> { 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<YWLWorkOrder>(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<string>();
|
//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<Location>()
|
.LeftJoin<LocCntrRel>((l, lc) => l.S_LOC_CODE == lc.S_LOC_CODE)
|
.LeftJoin<CntrItemRel>((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<string>() { 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)
|
{
|
// 这里都是1层的,所以必走 current_num =1
|
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<string> { 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<LocCntrRel>(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<string> { 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<string>(oto);
|
var set2 = new HashSet<string>(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();
|
//}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 标签入库。 从人工绑定区 到 货架区。
|
/// </summary>
|
/// <param name="locsFirst"></param>
|
internal static void YwlBQ_CreInwork(List<locCntItem> 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<Location>(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<string> { 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<Location>(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<string> { 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<Location>(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<string> { 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<Location>(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<LocCntrRel> 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<LocCntrRel> 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<string> { 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<Location>(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("标签叉运-结束!");
|
}
|
/// <summary>
|
/// 1.无菌出库。 单词1版????
|
/// </summary>
|
/// <param name="slocsFirst"></param>
|
|
internal static void YwlBQ_CreWJOutOrder()
|
{
|
LogHelper.Info($" 无菌出库 开始");
|
//1.检查是否有退库
|
var db = new SqlHelper<object>().GetInstance();
|
|
if (false)
|
{
|
///第三段:接驳区 转 线边
|
var JQBS = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_BQJBQ);
|
foreach (var jbr in JQBS.GroupBy(x => x.N_ROW))
|
{
|
LogHelper.Info($" 无菌出库 接驳有数据");
|
var y2 = jbr.OrderBy(x => x.N_COL).ToList();
|
var l2 = y2.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault();
|
if (l2 != null)
|
{
|
var c = LocationHelper.GetList<LocCntrRel>(x => x.S_LOC_CODE == l2.S_LOC_CODE);
|
if (!c.Any() || c.FirstOrDefault()?.S_TYPE == BQ_PRA.B)
|
{
|
//回库。
|
LogHelper.Info($"循环有无退库==> 有 退库" + l2.S_LOC_CODE);
|
continue;
|
}
|
var cirs = ContainerHelper.GetCntrItemRel(c.FirstOrDefault().S_CNTR_CODE);
|
if (!cirs.Any())
|
{
|
LogHelper.Info($"循环有无退库==> 没有物料信息 托盘:" + c.FirstOrDefault().S_CNTR_CODE);
|
continue;
|
}
|
var cir = cirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault();
|
|
var xbqs = LocationHelper.GetAreaNormalLocList(WJ_BQ.RK_XBKQ);
|
foreach (var x1 in xbqs.GroupBy(x => x.N_ROW))
|
{
|
LogHelper.Info($" 无菌出库 线边有数据");
|
var x2 = x1.OrderBy(x => x.N_COL).ToList();
|
var l3 = x2.FindAll(x => x.N_CURRENT_NUM > 0).LastOrDefault();
|
if (l3 != null)
|
{
|
var xc = LocationHelper.GetList<LocCntrRel>(x => x.S_LOC_CODE == l3.S_LOC_CODE);
|
if (!xc.Any() || xc.FirstOrDefault()?.S_TYPE == BQ_PRA.B)
|
{
|
LogHelper.Info($"循环线边==> 有 退库" + xc.FirstOrDefault()?.S_TYPE);
|
continue;
|
}
|
var xcirs = ContainerHelper.GetCntrItemRel(xc.FirstOrDefault().S_CNTR_CODE);
|
if (!xcirs.Any())
|
{
|
LogHelper.Info($"循环线边==> 没有物料信息 托盘:" + xc.FirstOrDefault().S_CNTR_CODE);
|
continue;
|
}
|
|
var xcir = xcirs.OrderByDescending(x => x.T_CREATE).FirstOrDefault();
|
if (xcir.S_ITEM_CODE != cir.S_ITEM_CODE || xcir.S_ITEM_NAME != cir.S_ITEM_CODE)
|
{
|
LogHelper.Info($"循环线边==> 物料不匹配 托盘:" + xc.FirstOrDefault().S_CNTR_CODE);
|
continue;
|
}
|
}
|
var e = x2.FindAll(x => x.N_COL > (l3?.N_COL ?? 0) && x.N_CURRENT_NUM == 0).FirstOrDefault();
|
LogHelper.Info($"无菌 生成任务==> 是否有合适的货位信息" + e?.S_LOC_CODE);
|
if (e != null)
|
{
|
var re = TaskProcess.CreateTransport("", l2.S_LOC_CODE.Trim(), e.S_LOC_CODE, "标签叉运-接驳转线边", new List<string> { c.FirstOrDefault().S_CNTR_CODE }, 1, 1, 1, 62, BQ_PRA.Out);
|
LogHelper.Info($"from {l2.S_LOC_CODE} to {e.S_LOC_CODE} 标签叉运-接驳转线边 ,创建{re} ");
|
break;
|
}
|
}
|
}
|
}
|
LogHelper.Info($" 无菌出库 到线边 结束");
|
///拆垛区取消。
|
///第二段:拆垛区。拆去接驳。 或者回库。
|
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<LocCntrRel>(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<LocCntrRel>(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<string> { 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<Location>(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<string> { 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<YWLWorkOrder>(x => x.SQL_PLineNo == "无菌标签出库" && x.WorkType == 6 && x.SQL_State == "执行中").FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10).OrderBy(x => x.TagOverTime).ToList();
|
|
//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<string>();
|
//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<Location>()
|
.LeftJoin<LocCntrRel>((l, lc) => l.S_LOC_CODE == lc.S_LOC_CODE)
|
.LeftJoin<CntrItemRel>((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<string>() { 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_XBKQ);
|
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<LocCntrRel>(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<string> { 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<string>(oto);
|
var set2 = new HashSet<string>(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<Location> 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<string> { 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<int> 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<string> { 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<string> { "注塑机3", "注塑机4" };
|
//pl.Remove(laststring);
|
var ppp = new List<string> { "PPTMKZZ", "PPFMKZZ" };
|
if (laststring == pl[0])
|
ppp.Reverse();
|
|
B(true, new List<string> { 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<string> { 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<string> { "注塑机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<string> pl)
|
{
|
foreach (var spn in pl)
|
{
|
var order = WCSHelper.GetWorkOrder(spn);
|
|
List<string> rs = new List<string>();
|
List<int> rows = new List<int>();
|
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<int>();
|
//}
|
//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<string> { crl.S_CNTR_CODE }, strBit.N_CURRENT_NUM, endBit.N_CURRENT_NUM + 1, 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;
|
/// <summary>
|
/// 计数器 清除 控制台
|
/// </summary>
|
/// <exception cref="NotImplementedException"></exception>
|
internal static void A()
|
{
|
mun++;
|
if (mun > 3600)
|
{
|
Console.Clear();
|
mun = 0;
|
}
|
}
|
|
internal static void BottleCapAuto7()
|
{
|
var oos = LocationHelper.GetList<OutOrder>(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<TurnWorkOrder>(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<Location>();
|
string start_area = "", start_row = "", end_area = "", end_row = "", size = "";
|
string LineNo = "";
|
int TrayCount = 0;
|
bool isFule = false;
|
List<Location> allLoclist = new List<Location>(); //LocationHelper.GetList<Location>(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<Location>(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<LocCntrRel>().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<LocCntrRel>()
|
.LeftJoin<CntrItemRel>((lcr, cir) => lcr.S_CNTR_CODE == cir.S_CNTR_CODE)
|
.LeftJoin<Location>((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<Location>(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<TurnWorkOrder>(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<Location>(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<TurnWorkOrder>(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<LocCntrRel> _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<string, List<Dictitems>> dsi = new Dictionary<string, List<Dictitems>>();
|
public class Dictitems
|
{
|
public string ItemCode { get; set; }
|
public string ItemName { get; set; }
|
|
public string S_CJ_NAME { get; set; }
|
/// <summary>
|
/// 最高层
|
/// </summary>
|
public int ItemLayer { get; set; } = 0;
|
|
public string area { get; set; }
|
|
/// <summary>
|
/// 排
|
/// </summary>
|
public int Row { get; set; }
|
|
}
|
|
/// <summary>
|
/// AB区物料不足自动转运
|
/// </summary>
|
public static void ZdzyABArea()
|
{
|
try
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
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<YWLWorkOrder>(x => x.SQL_PLineNo == pline && x.WorkType == 6 && x.SQL_State == "执行中");
|
if (orkOrd.Any())
|
{
|
foreach (var od in orkOrd)
|
{
|
var loclist = LocationHelper.GetLocList(x => x.S_AREA_CODE == od.S_ROW);
|
//查询可用货位有多少
|
List<string> Ky = new List<string>() { "无", "出库锁", "入库锁" };
|
var loclistK = loclist.FindAll(x => Ky.Contains(x.S_LOCK_STATE)).Count();
|
var count = loclist.FindAll(x => x.N_CURRENT_NUM > 0 && x.S_LOCK_STATE == "无").Count();
|
LogHelper.Info("AutoRun13TSJ" + $"od.S_ROW 出库余量判断是否需要转运。-{count}< 总共能用的货位数{loclistK} -7");
|
if (count <= loclistK - 7)
|
{
|
LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}对应工单的{od.S_ROW} 物料数量不足。触发转运。");
|
// 先看是否有到该库区的转运任务。
|
var zxs = LocationHelper.GetList<YWLZXtake>(X => X.S_ZX_STATE == "执行" && X.S_END_AREA == od.S_ROW).ToList();
|
//查询是否有重复的工单在执行
|
var ggf = zxs.Find(x => x.S_ITEM_CODE == od.SQL_ItemCode && x.S_ITEM_NAME == od.SQL_ItemName);
|
if (ggf != null)
|
{
|
LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}已经存在转运了无需触发转运。");
|
continue;
|
}
|
//1.查看物料是否匹配。
|
//var itemTRUN = zxs.Any(x => x.S_ITEM_CODE == od.SQL_ItemCode && x.S_ITEM_NAME == od.SQL_ItemName && x.S_CJ_NAME == od.S_CJ_NAME);
|
//if (itemTRUN)
|
//{ //有到该库区的 物料转运任务了。 不需要继续了 。
|
|
// LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}已经存在转运了无需触发转运。");
|
// return;
|
//}
|
//人工转运没指定物料,我会自动写回转运单 物料数据。
|
|
//找CD 区 哪里有这个物料。
|
Dictitems TrunStart = new Dictitems();
|
foreach (var area in CDlist)
|
{
|
//var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
|
|
//ca.And((o, p, t) => o.S_AREA_CODE == area && o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == od.SQL_ItemCode && t.S_ITEM_NAME == od.SQL_ItemName && t.S_CJ_NAME == od.S_CJ_NAME);
|
var lstCanOutL = newDb.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where((o, p, t) => o.S_AREA_CODE == area && o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == od.SQL_ItemCode && t.S_ITEM_NAME == od.SQL_ItemName && t.S_CJ_NAME == od.S_CJ_NAME).ToList();
|
if (!lstCanOutL.Any())
|
{
|
lstCanOutL = newDb.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where((o, p, t) => o.S_AREA_CODE == area && o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == od.SQL_ItemCode && t.S_ITEM_NAME == od.SQL_ItemName).ToList();
|
}
|
//List<string> CRk = new List<string>() { "出库锁", "入库锁" };
|
//var EndMum = newDb.Queryable<Location>().Where(l => l.S_AREA_CODE == area && CRk.Contains(l.S_LOCK_STATE)).ToList();
|
//var RowLock = EndMum.GroupBy(e => e.N_ROW).Select(f => f.First()).ToList();
|
//foreach (var item in RowLock)
|
//{
|
// lstCanOutL.RemoveAll(e => e.N_ROW == item.N_ROW);
|
//}
|
if (lstCanOutL.Count() > 0)
|
{
|
//var LstCan = newDb.Queryable<LocCntrRel>().Where(a => lstCanOutL.Select(e => e.S_LOC_CODE).ToList().Contains(a.S_LOC_CODE)).ToList();
|
var loc = lstCanOutL.OrderBy(e => e.T_FULL_TIME).FirstOrDefault();
|
TrunStart.area = area;
|
TrunStart.Row = loc.N_ROW;
|
}
|
//if (dsi.TryGetValue(area, out var dictitems1))
|
//{
|
|
// var arearowsloc = LocationHelper.GetAreaNormalLocList(area);
|
// foreach (var d in dictitems1.FindAll(x => x.ItemCode == od.SQL_ItemCode && x.ItemName == od.SQL_ItemName && x.S_CJ_NAME == od.S_CJ_NAME))
|
// {
|
// if (arearowsloc.Exists(x => x.N_ROW == d.Row))
|
// {
|
// TrunStart = d;
|
// break;
|
// }
|
// }
|
//}
|
}
|
LogHelper.Info($"ZdzyABArea{od.SQL_WorkNo}触发转运。转运来源是{JsonConvert.SerializeObject(TrunStart)}");
|
if (TrunStart?.area != null)
|
{
|
var ggft = new YWLZXtake()
|
{
|
SQL_WorkNo = "CKD" + DateTime.Now.Ticks.ToString(),
|
S_START_AREA = TrunStart.area,
|
N_START_ROW = TrunStart.Row,
|
S_END_AREA = od.S_ROW,
|
S_ZX_STATE = "执行",
|
S_ITEM_CODE = od.SQL_ItemCode,
|
S_ITEM_NAME = od.SQL_ItemName,
|
S_CJ_NAME = od.S_CJ_NAME,
|
S_ZZ_AREA = (od.S_ROW == "YWLAQWJ" ? "YWLWJJB" : od.S_ROW)
|
};
|
var gf = newDb.Insertable(ggft).ExecuteCommand();
|
}
|
}
|
}
|
}
|
}
|
|
|
}
|
catch (Exception ex)
|
{
|
|
LogHelper.Info($"ZdzyABArea 触发转运 报错:{ex.Message}");
|
}
|
}
|
|
/// <summary>
|
/// 原物料纸箱出库
|
/// </summary>
|
public static void AutoRun13TSJ()
|
{
|
|
//Action<YWLWorkOrder> _sAB没物料或者余量不足开始触发跟根据自动转运_名字越长越好 = (od) =>
|
//{
|
// LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}对应工单的{od.S_ROW} 物料数量不足。触发转运。");
|
// // 先看是否有到该库区的转运任务。
|
// var zxs = LocationHelper.GetList<YWLZXtake>(X => X.S_ZX_STATE == "执行" && X.S_END_AREA == od.S_ROW);
|
// //1.查看物料是否匹配。
|
// var itemTRUN = zxs.Any(x => x.S_ITEM_CODE == od.SQL_ItemCode && x.S_ITEM_NAME == od.SQL_ItemName && x.S_CJ_NAME == od.S_CJ_NAME);
|
// if (itemTRUN)
|
// { //有到该库区的 物料转运任务了。 不需要继续了 。
|
|
// LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}已经存在转运了无需触发转运。");
|
// return;
|
// }
|
// //人工转运没指定物料,我会自动写回转运单 物料数据。
|
|
// //找CD 区 哪里有这个物料。
|
// Dictitems TrunStart = null;
|
// foreach (var area in CDlist)
|
// {
|
// if (dsi.TryGetValue(area, out var dictitems1))
|
// {
|
// var arearowsloc = LocationHelper.GetAreaNormalLocList(area);
|
// foreach (var d in dictitems1.FindAll(x => x.ItemCode == od.SQL_ItemCode && x.ItemName == od.SQL_ItemName && x.S_CJ_NAME == od.S_CJ_NAME))
|
// {
|
// if (arearowsloc.Exists(x => x.N_ROW == d.Row))
|
// {
|
// TrunStart = d;
|
// break;
|
// }
|
// }
|
// }
|
// }
|
|
// LogHelper.Info($"AutoRun13TSJ{od.SQL_WorkNo}触发转运。转运来源是{JsonConvert.SerializeObject(TrunStart)}");
|
// if (TrunStart != null)
|
// WCSHelper.Do(db =>
|
// {
|
// db.Insertable(new YWLZXtake
|
// {
|
// S_START_AREA = TrunStart.area,
|
// N_START_ROW = TrunStart.Row,
|
// S_END_AREA = od.S_ROW,
|
// S_ZX_STATE = "执行",
|
// S_ITEM_CODE = od.SQL_ItemCode,
|
// S_ITEM_NAME = od.SQL_ItemName,
|
// S_CJ_NAME = od.S_CJ_NAME,
|
// S_ZZ_AREA = (od.S_ROW == "YWLAQWJ" ? "YWLWJJB" : od.S_ROW)
|
// }).ExecuteCommand();
|
// });
|
//};
|
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<YWLWorkOrder>(x => x.SQL_PLineNo == pline && x.WorkType == 6 && x.SQL_State == "执行中");
|
bool can = false;
|
if (orkOrd.Any())
|
{
|
string areaaaaa = PLC.areaPriy[0];
|
var locs = LocationHelper.GetList<Location>(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;
|
}
|
|
orkOrd = orkOrd.FindAll(x => x.OutNum > 0 && DateTime.Now.Subtract(x.SQL_Modify_TIme ?? DateTime.Now).TotalSeconds > 10);
|
ReadCCK = can;
|
if (orkOrd.Any())
|
foreach (var od in orkOrd.OrderBy(x => x.TagOverTime).ThenBy(x => x.OutNum))
|
//foreach (var od in od2.ToList())
|
{
|
var l2 = new List<string>() { "YWLAQWJ", "YWLBQWJ" };//, "YWLCQSX", "YWLDQWJ" };
|
l2.Remove(od.S_ROW);
|
//l2.Remove(od.TagOver);
|
//var odsr = new List<string> { od.TagOver, od.S_ROW }.Concat(l2).Distinct().ToList();
|
var odsr = new List<string> { od.S_ROW }.Concat(l2).Distinct().ToList();
|
|
///汇总仓库里最大层是几层。
|
Dictitems Lart = null;
|
foreach (var area in odsr)//od.S_ROW.Split('$'))
|
{
|
if (string.IsNullOrEmpty(area))
|
{
|
continue;
|
}
|
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;
|
}
|
}
|
}
|
}
|
//等下要检测,如果没有可用排,或者AB库区内物料数<5 就要从CD 开始转运。
|
var autoTurn = false;
|
LogHelper.Info($"AutoRun13TSJ 筛选物料 库区排数据. {od.SQL_PLineNo} >>{od.OutNum}> {JsonConvert.SerializeObject(Lart)}");
|
// 需要数量 >= 仓库最大数量。 就开始出库。
|
if (Lart != null)
|
{
|
if (od.OutNum >= Lart?.ItemLayer)
|
{
|
var v = new List<string>() { Lart.area };
|
Location StartBit = null;
|
List<LocCntrRel> _clrel = new List<LocCntrRel>();
|
|
foreach (var area in v) //.Concat(od.S_ROW.Split('$')).Distinct())
|
{
|
if (ABlist.Contains(area))
|
{
|
//AreaRowlist = LocationHelper.GetAreaNormalLocList(area);YWLBQWJ
|
// var AreaRowlist = LocationHelper.GetAreaNormalLocList("YWLAQWJ").Union(LocationHelper.GetAreaNormalLocList("YWLBQWJ")).ToList();
|
var db = new SqlHelper<object>().GetInstance();
|
var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
|
ca.And((o, p, t) => o.N_CURRENT_NUM > 0 && o.S_LOCK_STATE == "无" && t.S_ITEM_CODE == od.SQL_ItemCode && t.S_ITEM_NAME == od.SQL_ItemName && (o.S_AREA_CODE == "YWLAQWJ" || o.S_AREA_CODE == "YWLBQWJ"));
|
var lstCanOutL = db.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).ToList();
|
if (lstCanOutL.Count() > 0)
|
{
|
var rl = lstCanOutL.OrderBy(e => e.T_FULL_TIME).FirstOrDefault();
|
_clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE);
|
//板型相同
|
var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First();
|
if (rl != null)
|
{
|
StartBit = rl;
|
}
|
}
|
else
|
{
|
LogHelper.Info($"AutoRun13TSJ 机台:{pline} 物料编码:{od.SQL_ItemCode}物料名称:{od.SQL_ItemName} AB区缺料");
|
}
|
|
|
//if (rl == null) continue;
|
//_clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE);
|
////板型相同
|
//var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).First();
|
//LogHelper.Info("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘类型。" + JsonConvert.SerializeObject(_clrel0));
|
//var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault();
|
//LogHelper.Info("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘上的物料信息。" + JsonConvert.SerializeObject(_clcntitem));
|
//if (_clcntitem != null)
|
//{
|
// LogHelper.Info("AutoRun13TSJ" + "相互是否匹配 _clcntitem S_ITEM_CODE:" + _clcntitem.S_ITEM_CODE + " od" + od.SQL_ItemCode + " _clcntitem S_ITEM_NAME:" + _clcntitem.S_ITEM_NAME + "od: " + od.SQL_ItemName + " od.S_CJ_NAME:" + od.S_CJ_NAME + "结果:" + (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName && _clcntitem.S_CJ_NAME == od.S_CJ_NAME));
|
// if (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName)
|
// {
|
// StartBit = rl;
|
// break;
|
// }
|
//}
|
|
}
|
else
|
{
|
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("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘类型。" + JsonConvert.SerializeObject(_clrel0));
|
var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault();
|
LogHelper.Info("AutoRun13TSJ" + rl.S_LOC_CODE + "识别托盘上的物料信息。" + JsonConvert.SerializeObject(_clcntitem));
|
if (_clcntitem != null)
|
{
|
LogHelper.Info("AutoRun13TSJ" + "相互是否匹配 _clcntitem S_ITEM_CODE:" + _clcntitem.S_ITEM_CODE + " od" + od.SQL_ItemCode + " _clcntitem S_ITEM_NAME:" + _clcntitem.S_ITEM_NAME + "od: " + od.SQL_ItemName + " od.S_CJ_NAME:" + od.S_CJ_NAME + "结果:" + (_clcntitem.S_ITEM_CODE == od.SQL_ItemCode && _clcntitem.S_ITEM_NAME == od.SQL_ItemName && _clcntitem.S_CJ_NAME == od.S_CJ_NAME));
|
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)
|
{
|
autoTurn = true;
|
LogHelper.Info("AutoRun13TSJ" + $"{od.SQL_PLineNo} 出库 {Lart.area}区域没有物料可用起点");
|
continue;
|
}
|
else
|
{
|
//检测指定库区的物料排总数量
|
if (dsi.TryGetValue(od.S_ROW, out var dictitems1))
|
{
|
//var rows = dictitems1.Select(x => x.Row).Distinct();
|
//var loclist = LocationHelper.GetLocList(x => x.S_AREA_CODE == od.S_ROW && rows.Contains(x.N_ROW));
|
////查询可用货位有多少
|
//List<string> Ky = new List<string>() { "无", "出库锁", "入库锁" };
|
//var loclistK = loclist.FindAll(x => Ky.Contains(x.S_LOCK_STATE)).Count();
|
//var count = loclist.FindAll(x => x.N_CURRENT_NUM > 0 && x.S_LOCK_STATE == "无").Sum(x => x.N_CURRENT_NUM);
|
//LogHelper.Info("AutoRun13TSJ" + $"od.S_ROW 出库余量判断是否需要转运。-{count}< 总共能用的货位数{loclistK} -7");
|
//if (count < loclistK - 7)
|
//{
|
// autoTurn = true;
|
// _sAB没物料或者余量不足开始触发跟根据自动转运_名字越长越好(od);
|
//}
|
}
|
}
|
Location Endbit = null;
|
|
var loc = LocationHelper.GetLoc(PLC.location[0]);
|
if (StartBit.N_CURRENT_NUM == 1)
|
{
|
if (loc?.N_CURRENT_NUM == 0 && DeviceProcess.doorStatus.ContainsKey(PLC.location[0]))
|
{
|
if (DeviceProcess.doorStatus[PLC.location[0]].info == "1")
|
{
|
Endbit = LocationHelper.GetLoc(PLC.location[0]);
|
}
|
}
|
if (Endbit == null)
|
break;
|
}
|
else
|
{
|
Endbit = LocationHelper.GetAreaNormalLocList(PLC.areaPriy[0]).Find(x => x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0);
|
}
|
|
if (StartBit != null && Endbit != null)
|
{
|
var crs = _clrel.Select(x => x.S_CNTR_CODE).ToList();
|
var jbbit = "";
|
if (od.S_ROW == "YWLCQSX" || od.S_ROW == "YWLDQWJ" || Endbit.S_AREA_CODE == "YWLDQWJ" || Endbit.S_AREA_CODE == "YWLCQSX")
|
{
|
var locs1 = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == "YWLWJJB" && x.S_LOCK_STATE != "报废" && x.S_LOCK_STATE == "无" && x.N_CURRENT_NUM == 0).ToList();
|
if (locs1.Count() > 0)
|
{
|
jbbit = locs1.FirstOrDefault().S_LOC_CODE;
|
}
|
else
|
{
|
continue;
|
}
|
}
|
var b = false;
|
if (!string.IsNullOrEmpty(jbbit))
|
b = TaskProcess.CreateTransport(od.SQL_WorkNo, StartBit.S_LOC_CODE, jbbit, "原物料搬运-纸箱", crs, StartBit.N_CURRENT_NUM - crs.Count + 1, 1, crs.Count, PLC.taskPri, "", Endbit.S_LOC_CODE);
|
else
|
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 db = new SqlHelper<object>().GetInstance();
|
od.TagOverTime = DateTime.Now;
|
od.TagOver = StartBit.S_AREA_CODE;
|
var ggf = db.Updateable(od).UpdateColumns(it => new { it.TagOverTime, it.TagOver }).ExecuteCommand();
|
LogHelper.Info($"上提升机任务 更新工单的时间影响行数: {ggf}");
|
|
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 };
|
|
//给终点锁定住
|
if (od.S_ROW == "YWLCQSX" || od.S_ROW == "YWLDQWJ")
|
{
|
var model = db.Queryable<Location>().Where(a => a.S_LOC_CODE == Endbit.S_LOC_CODE).First();
|
|
model.S_LOCK_STATE = "入库锁";
|
var res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0;
|
LogHelper.Info(Endbit.S_LOC_CODE + "LockLoc:锁结果" + res);
|
}
|
//排锁
|
//var row = db.Queryable<RowLock>().Where(x => x.S_AREA_CODE == r.S_AREA_CODE && r.N_ROW == x.N_ROW).First();
|
//if (row != null)
|
//{
|
// if (row.S_LOCK_SRC != r.S_LOCK_SRC)
|
// {
|
// db.Deleteable(row).ExecuteCommand();
|
// db.Insertable(r).ExecuteCommand();
|
// }
|
//}
|
//else db.Insertable(r).ExecuteCommand();
|
|
//break;
|
}
|
}
|
else
|
{
|
LogHelper.Info($"{od.SQL_PLineNo} 出库起点{StartBit.S_LOC_CODE}-{StartBit.N_CURRENT_NUM},没有可用终点");
|
continue;
|
}
|
}
|
}
|
//else
|
//{
|
// _sAB没物料或者余量不足开始触发跟根据自动转运_名字越长越好(od);
|
//}
|
}
|
}
|
}
|
public static void AutoRunABD()
|
{
|
LogHelper.Info($"AutoRunABD abcd物料汇总 >>{ReadCCK}|| {dsi.Count}");
|
if (!ReadCCK)
|
{
|
Thread.Sleep(3000);
|
return;
|
}
|
List<string> list = new List<string>();
|
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<YWLWorkOrder>(x => x.SQL_PLineNo == pline && x.WorkType == 6 && x.SQL_State == "执行中");
|
if (orkOrd.Any())
|
{
|
list = new List<string>() { "YWLAQWJ", "YWLBQWJ", "YWLCQSX", "YWLDQWJ" };
|
//foreach (var ork in orkOrd)
|
//{
|
// list = list.Concat(ork.S_ROW.Split('$')).ToList();
|
//}
|
}
|
|
}
|
foreach (var area in list.Distinct())
|
{
|
var AreaRowlist = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == area && x.N_CURRENT_NUM > 0);
|
foreach (var item in AreaRowlist.GroupBy(x => x.N_ROW))
|
{
|
var rl = item.ToList().FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault();
|
|
var _clrel = LocationHelper.GetLocCntrRel(rl.S_LOC_CODE);
|
if (!_clrel.Any())
|
{
|
LogHelper.Info($"{area}>> {rl.S_LOC_CODE}有数量, 没托盘");
|
continue;
|
}
|
//板型相同
|
var _clrel0 = _clrel.OrderByDescending(xx => xx.T_CREATE).FirstOrDefault();
|
LogHelper.Info(rl.S_LOC_CODE + "识别托盘类型。");
|
|
var _clcntitem = ContainerHelper.GetCntrItemRel(_clrel0.S_CNTR_CODE.Trim()).FirstOrDefault();
|
List<Dictitems> dictitems = new List<Dictitems>();
|
if (_clcntitem != null)
|
{
|
if (dsi.TryGetValue(area, out dictitems))
|
{
|
var ill = dictitems.Find(x => x.Row == rl.N_ROW && x.ItemCode == _clcntitem.S_ITEM_CODE && x.ItemName == _clcntitem.S_ITEM_NAME && _clcntitem.S_CJ_NAME == x.S_CJ_NAME);
|
if (ill == null)
|
{
|
ill = dictitems.Find(x => x.Row == rl.N_ROW && 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.N_ROW;
|
}
|
else continue;
|
}
|
else dictitems.Add(new Dictitems
|
{
|
ItemName = _clcntitem.S_ITEM_NAME,
|
ItemCode = _clcntitem.S_ITEM_CODE,
|
ItemLayer = rl.N_CURRENT_NUM,
|
S_CJ_NAME = _clcntitem.S_CJ_NAME,
|
area = area,
|
Row = rl.N_ROW
|
});
|
dsi[area] = dictitems;
|
}
|
else
|
{
|
dictitems = new List<Dictitems>();
|
dictitems.Add(new Dictitems
|
{
|
ItemName = _clcntitem.S_ITEM_NAME,
|
ItemCode = _clcntitem.S_ITEM_CODE,
|
ItemLayer = rl.N_CURRENT_NUM,
|
S_CJ_NAME = _clcntitem.S_CJ_NAME,
|
area = area,
|
Row = rl.N_ROW
|
});
|
dsi.Add(area, dictitems);
|
}
|
}
|
}
|
}
|
LogHelper.Info($"AutoRunABD abcd物料汇总完成 >>{ReadCCK}|| {dsi.Count}");
|
}
|
|
/// <summary>
|
/// 格式化内存排锁
|
/// </summary>
|
public static void Qchc()
|
{
|
try
|
{
|
LogHelper.Info($"内存中的排锁表中的数据" + $"{JsonConvert.SerializeObject(RGRow)}");
|
if (RGRow.Count() > 0)
|
{
|
var locs = LocationHelper.GetList<Location>(x => x.S_AREA_CODE == "YWLRGDD" && x.S_LOCK_STATE == "出库锁").ToList();
|
if (locs.Count() == 0)
|
{
|
RGRow = new List<RowLock>();
|
LogHelper.Info($"格式化内存中的排锁" + $"{JsonConvert.SerializeObject(RGRow)}");
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Info($"格式化内存中的排锁 失败" + $"{ex.Message}");
|
}
|
}
|
public static void chargeCCD()
|
{
|
var ods = LocationHelper.GetList<YWLWorkOrder>(x => x.WorkType == 2 && x.SQL_State == "执行中");
|
if (!ods.Any()) return;
|
List<string> list = new List<string>()
|
{
|
"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<Location>(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());
|
}
|
}
|
}
|
|
|
}
|
|
/// <summary>
|
/// 原物料纸箱库对库转运【经过接驳】
|
/// </summary>
|
internal static void YWL_ZX_Turn()
|
{
|
var dbcd = new SqlHelper<object>().GetInstance();
|
|
foreach (var ODs in LocationHelper.GetList<YWLZXtake>(X => X.S_ZX_STATE == "执行").GroupBy(x => x.S_START_AREA))
|
{
|
var locS = LocationHelper.GetAreaNormalLocList(ODs.Key);
|
foreach (var od in ODs)
|
{
|
if (od.S_END_AREA == "YWLBQWJ" || od.S_END_AREA == "YWLAQWJ")//到B区的移库工单最多只能生成两条任务
|
{
|
|
//查询任务数
|
List<string> AreaLi = new List<string>() { "YWLBQWJ", "YWLWJJB" };
|
var db = new SqlHelper<object>().GetInstance();
|
var list = db.Queryable<Location>().Where(a => AreaLi.Contains(a.S_AREA_CODE) && a.S_LOCK_STATE == "入库锁").ToList();
|
if (list.Count() >= 2)
|
{
|
LogHelper.Info($"CreateTransport- CreateTask Error" + $"终点库区为YWLRGDD或者YWLWJJB 则最多只能生成两个任务");
|
continue;
|
}
|
}
|
LogHelper.Info($"YWL_ZX_Turn from{od.S_START_AREA} mid:{od.S_ZZ_AREA} to{od.S_END_AREA} 开始 》》》");
|
if (string.IsNullOrEmpty(od.S_ZZ_AREA) && string.IsNullOrEmpty(od.S_END_AREA))
|
{
|
LogHelper.CError($"YWL_ZX_Turn from{od.S_START_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
|
{
|
if (od.N_END_ROW > 0)
|
{
|
var EndRow = dbcd.Queryable<Location>().Where(l => l.S_AREA_CODE == od.S_END_AREA && l.N_ROW == od.N_END_ROW && l.N_CURRENT_NUM == 0).ToList();
|
if (EndRow.Count() == 0)
|
{
|
//置为完成。
|
od.S_ZX_STATE = "完成";
|
WCSHelper.Do(db => db.Updateable(od).UpdateColumns(x => new { x.S_ZX_STATE }).ExecuteCommand());
|
}
|
}
|
else
|
{
|
var EndRow = dbcd.Queryable<Location>().Where(l => l.S_AREA_CODE == od.S_END_AREA && l.N_CURRENT_NUM == 0).ToList();
|
if (EndRow.Count() == 0)
|
{
|
//置为完成。
|
od.S_ZX_STATE = "完成";
|
WCSHelper.Do(db => db.Updateable(od).UpdateColumns(x => new { x.S_ZX_STATE }).ExecuteCommand());
|
}
|
}
|
var lastful = rows.FindAll(x => x.N_CURRENT_NUM > 0).OrderBy(x => x.N_COL).LastOrDefault();
|
if (lastful != null)
|
{
|
LogHelper.Info($"YWL_ZX_Turn from{od.S_START_AREA}to{od.S_END_AREA} 找到移库起点》{lastful.S_LOC_CODE}。");
|
var crs = LocationHelper.GetLocCntrRel(lastful.S_LOC_CODE);
|
var cntritems = ContainerHelper.GetCntrItemRel(crs.FirstOrDefault()?.S_CNTR_CODE);
|
if (!cntritems.Any())
|
continue;
|
LogHelper.Info($"YWL_ZX_Turn from{od.S_START_AREA}to{od.S_END_AREA} 找到移库起点》{lastful.S_LOC_CODE}。接驳是否被锁?:{InworkLock}");
|
var cir1 = cntritems.First();
|
|
if (!string.IsNullOrEmpty(od.S_ITEM_CODE))
|
{
|
///给移库单 写上转运的物料数据。
|
od.S_ITEM_CODE = cir1.S_ITEM_CODE;
|
od.S_ITEM_NAME = cir1.S_ITEM_NAME;
|
od.S_CJ_NAME = cir1.S_CJ_NAME;
|
WCSHelper.Do(db => db.Updateable(od).UpdateColumns(it => new { it.S_ITEM_NAME, it.S_ITEM_CODE, it.S_CJ_NAME }).ExecuteCommand());
|
}
|
|
if (od.S_ZZ_AREA == "YWLWJJB")
|
{
|
if (InworkLock)
|
continue;
|
else InworkLock = true;
|
}
|
else InworkLock = false;
|
string nextarea = !string.IsNullOrEmpty(od.S_ZZ_AREA) ? od.S_ZZ_AREA : od.S_END_AREA;
|
var zzlocs = LocationHelper.GetAreaNormalLocList(nextarea);
|
Location Endbit = null;
|
if (od.N_END_ROW == 0 && zzlocs.Any())
|
{
|
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 && cntrrel.S_CJ_NAME == cir1.S_CJ_NAME)
|
{
|
Endbit = zzrloclist.Find(x => x.N_COL > (_cl2?.N_COL ?? 0));
|
}
|
}
|
else
|
Endbit = zzrloclist.Find(x => x.N_COL > (_cl2?.N_COL ?? 0));
|
if (Endbit != null)
|
{
|
LogHelper.Info($"入中转区{nextarea}使用{Endbit.S_LOC_CODE}");
|
break;
|
}
|
}
|
}
|
else
|
{
|
if (zzlocs.Any() && od.N_END_ROW > 0)//用于库内 比如A库某排移到A库的另一排
|
{
|
zzlocs = zzlocs.FindAll(e => e.N_ROW == od.N_END_ROW);
|
//
|
var EndMt = dbcd.Queryable<Location>().Where(l => l.S_AREA_CODE == od.S_END_AREA && l.N_ROW == od.N_END_ROW && l.N_CURRENT_NUM > 0).ToList();
|
if (EndMt.Any())
|
{
|
var ggh = EndMt.OrderByDescending(e => e.N_COL).FirstOrDefault();
|
zzlocs = zzlocs.FindAll(e => e.N_COL > ggh.N_COL).ToList();
|
}
|
if (zzlocs.Any())
|
{
|
Endbit = zzlocs.OrderBy(e => e.N_COL).FirstOrDefault();
|
}
|
|
}
|
}
|
LogHelper.Info($"YWL_ZX_Turn from{od.S_START_AREA} mid:{od.S_ZZ_AREA} to{od.S_END_AREA} 找到移库终点》{Endbit?.S_LOC_CODE}");
|
if (Endbit != null)
|
{
|
//生成接驳区任务,标记为终点库区。
|
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, nextarea == od.S_END_AREA ? "" : 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 + "所有任务完成!");
|
}
|
}
|
}
|