using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using WCS.Data;
using WCS.Data.Models;
using WCS.Data.Utils;
using WCS.PLC.Model.Equipment;
using static WCS.PLC.Base_Conv;
namespace WCS.PLC
{
public class ConveyorHelper
{
///
/// 获取输送线信号
///
///
///
///
public static ConvSignal GetConveyorSignal(string plc_name, string conveyorNo)
{
var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == plc_name);
var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == conveyorNo);
if (conveyor == null)
{
Log4netHelper.Logger_Info.InfoFormat("plc:" + plc_name + "输送线:" + conveyorNo);
return null;
}
return conveyor.EquSignal_Conv;
}
private static List QuerySrmList(List srms)
{
var result = new List();
Dictionary dicsrm = new Dictionary();
foreach (var item in srms)
{
string srm = string.Format("srm0{0}", item);
int taskcount = Current.TaskSet.Where(v => v.TASK_COMTYPE == 1 && v.TASK_WKSTATUS == 2 && v.TASK_SRMNO == srm).Count();
dicsrm.Add(srm, taskcount);
}
result = dicsrm.OrderBy(v => v.Value).Select(t => t.Key).ToList();
return result;
}
private static Dictionary QueryDicList(List srms)
{
Dictionary dicsrm = new Dictionary();
foreach (var item in srms)
{
string srm = string.Format("srm0{0}", item);
int taskcount = Current.TaskSet.Where(v => v.TASK_COMTYPE == 1 && v.TASK_WKSTATUS == 2 && v.TASK_SRMNO == srm).Count();
dicsrm.Add(srm, taskcount);
}
return dicsrm;
}
///
/// 看板提示
///
///
///
///
public static void AddLedAlarmsMsg(string equipmentNo, string alaram, int writeCount = 100)
{
var time = SugarBase.DB.GetDate();//获取当前时间
var alarmsmsgSet = SugarBase.DB.Queryable().Where(v => v.LED_CONVYORNO == equipmentNo).ToList();
if (alarmsmsgSet.Count() < writeCount)
{
WCS_LEDALARMSMSG updateAlaram = null;
var alarams = alarmsmsgSet.OrderByDescending(v => v.LED_UPDATETIME).ToList();
if (alarams.Count > 0)
{
if (alarams[0].LED_ALARMSMSG == alaram)
{
updateAlaram = alarams[0];
}
}
if (updateAlaram == null)
{
//添加
var alarmsmsg = new WCS_LEDALARMSMSG();
alarmsmsg.LED_ID = Guid.NewGuid().ToString();
alarmsmsg.LED_ADDRESS = string.Empty;
alarmsmsg.LED_CONVYORNO = equipmentNo;
alarmsmsg.LED_NO = "1";
alarmsmsg.LED_ALARMSMSG = alaram;
alarmsmsg.LED_DEFAULTMESSAGE = Current.LED_DEFAULTMESSAGE;
alarmsmsg.LED_UPDATETIME = time;
alarmsmsg.LED_NOTES = string.Empty;
SugarBase.DB.Insertable(alarmsmsg).ExecuteCommand();
}
else if (updateAlaram.LED_UPDATETIME.AddMilliseconds(3) < time)
{
//更新时间大于3秒,更新最新提示
SugarBase.DB.Updateable(it => new WCS_LEDALARMSMSG() { LED_UPDATETIME = time })
.Where(it => it.LED_ID == updateAlaram.LED_ID)
.ExecuteCommand();
}
}
else
{
var alaitem = alarmsmsgSet.OrderByDescending(v => v.LED_UPDATETIME).ToList()[0];
if (alaitem.LED_ALARMSMSG != alaram)
{
var alaramsmsgitem = alarmsmsgSet.OrderBy(v => v.LED_UPDATETIME).ToList()[0];
//更新最新提示
SugarBase.DB.Updateable(it => new WCS_LEDALARMSMSG() { LED_ALARMSMSG = alaram, LED_UPDATETIME = time })
.Where(it => it.LED_ID == alaramsmsgitem.LED_ID)
.ExecuteCommand();
}
}
}
///
/// 入口是否报警
///
public static bool ConvGoodsAlarms(string convNo, ConvSignal cs)
{
var alarmsMsg = new StringBuilder();
if (cs.DB521_Goods_Err)
{
alarmsMsg.Append(string.Format("外形/条码等故障"));
}
if (cs.DB521_F_Outside)
{
if (alarmsMsg.Length > 0)
{
alarmsMsg.Append(";");
}
alarmsMsg.Append(string.Format("前超长故障"));
}
if (cs.DB521_B_Outside)
{
if (alarmsMsg.Length > 0)
{
alarmsMsg.Append(";");
}
alarmsMsg.Append(string.Format("后超长故障"));
}
if (cs.DB521_L_Outside)
{
if (alarmsMsg.Length > 0)
{
alarmsMsg.Append(";");
}
alarmsMsg.Append(string.Format("左超长故障"));
}
if (cs.DB521_R_Outside)
{
if (alarmsMsg.Length > 0)
{
alarmsMsg.Append(";");
}
alarmsMsg.Append(string.Format("右超长故障"));
}
if (cs.DB521_H_Outside)
{
if (alarmsMsg.Length > 0)
{
alarmsMsg.Append(";");
}
alarmsMsg.Append(string.Format("超高故障"));
}
if (cs.DB521_BCR_Noread)
{
if (alarmsMsg.Length > 0)
{
alarmsMsg.Append(";");
}
alarmsMsg.Append(string.Format("条码未读出"));
}
if (cs.DB521_Overload)
{
if (alarmsMsg.Length > 0)
{
alarmsMsg.Append(";");
}
alarmsMsg.Append(string.Format("超重"));
}
if (alarmsMsg.Length > 0)
{
string result = string.Format("输送线[{0}]货物[{1}]", convNo, alarmsMsg.ToString());
Log4netHelper.Logger_Error.ErrorFormat(result);
return true;
}
else
{
return false;
}
}
internal static string QueryTunnel(string wmstaskno, string tunnelNum,out string srmNo)
{
string tunnelNo = string.Empty;
srmNo = string.Empty;
var tunnelList = tunnelNum.Split(',').ToList();
//根据物料缓存状态统计堆垛机入库任务数量
var SrmCacheInfoSet = QuerySrmInConvCacheInfoList(tunnelList);
foreach (var item in tunnelList)
{
var srmitem = SrmCacheInfoSet.FirstOrDefault(v => v.SrmTunnel == item);
if (srmitem.ConvCacheIsAvailable)
{
//var plctemp = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == srmitem.SrmNo);
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.DB521_Auto_status != (int)SrmModeEnum.远程) continue;
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.SrmDB541_Alarm) continue;
tunnelNo = srmitem.SrmTunnel;
srmNo = srmitem.SrmNo;
break;
}
}
if (string.IsNullOrWhiteSpace(tunnelNo))
{
var SrmCacheInfoList = SrmCacheInfoSet.OrderBy(v => v.ConvCacheInTaskCount).ToList();
foreach (var tunnelInfo in SrmCacheInfoList)
{
//var plctemp = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == srm);
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.DB521_Auto_status != (int)SrmModeEnum.远程) continue;
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.SrmDB541_Alarm) continue;
tunnelNo = tunnelInfo.SrmTunnel;
srmNo = tunnelInfo.SrmNo;
break;
}
}
if (string.IsNullOrWhiteSpace(tunnelNo))
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,WMS返回的巷道[{1}]在WCS系统中未找到。", wmstaskno, tunnelNum));
}
return tunnelNo;
}
internal static string AssignSrm(string convNo, string tunnelNum)
{
string srmno = string.Empty;
var routeSet = EquRouteHelper.QueryRoute(convNo, "srm");
var srmList = tunnelNum.Split(',').ToList();
//根据物料缓存状态统计堆垛机入库任务数量
//var dicsrm = QueryDicList(srmList);
var SrmCacheInfoSet = QuerySrmInConvCacheInfoList(srmList);
foreach (var item in srmList)
{
//if (srm == "srm03" || srm == "srm01" || srm == "srm04")
//{
var srmitem = SrmCacheInfoSet.FirstOrDefault(v => v.SrmTunnel == item);
if (srmitem.ConvCacheIsAvailable)
{
var plctemp = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == srmitem.SrmNo);
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.DB521_Auto_status != (int)SrmModeEnum.远程) continue;
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.SrmDB541_Alarm) continue;
var touteTo = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == srmitem.SrmNo);
if (touteTo == null) continue;
srmno = srmitem.SrmNo;
break;
}
//}
}
if (string.IsNullOrWhiteSpace(srmno))
{
var result = SrmCacheInfoSet.OrderBy(v => v.ConvCacheInTaskCount).Select(t => t.SrmNo).ToList();
foreach (var srm in result)
{
//if (srm == "srm03" || srm == "srm01" || srm == "srm04")
//{
var plctemp = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == srm);
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.DB521_Auto_status != (int)SrmModeEnum.远程) continue;
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.SrmDB541_Alarm) continue;
var touteTo = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == srm);
if (touteTo == null) continue;
srmno = srm;
break;
//}
}
}
return srmno;
}
internal static List QuerySrmInConvCacheInfoList(List tunnels)
{
var srmList = new List();
foreach (var tunnel in tunnels)
{
var syssetitem = Current.SysSets.Where(v => v.SET_ID.Contains("Tunnel")).FirstOrDefault(v => v.SET_VALUE == tunnel);
int taskcount = Current.TaskSet.Where(v => v.TASK_COMTYPE == 1 && (v.TASK_WKSTATUS == 2 || v.TASK_WKSTATUS == 5) && v.TASK_EndTunnelNum == tunnel).Count();
if (syssetitem.SET_TYPE == "srm01")
{
srmList.Add(new SrmInConvCacheInfo { SrmTunnel = tunnel, SrmNo = syssetitem.SET_TYPE, ConvCacheCount = 100, ConvCacheInTaskCount = taskcount });
}
else
{
srmList.Add(new SrmInConvCacheInfo { SrmTunnel = tunnel, SrmNo = syssetitem.SET_TYPE, ConvCacheCount = 2, ConvCacheInTaskCount = taskcount });
}
}
return srmList;
}
///
/// 分配堆垛机(分配巷道)
///
/// 路由轨迹清单
/// 要写入plc的信息
/// 任务号
public static void AssignSrm(List routeSet, WCSWriteToConveyorSignal converywrite, int wmstaskNum)
{
var param = new GetTunnelListParam();
param.WMSTaskNum = wmstaskNum.ToString();
//分配巷道
var tunnelListReply = Current.WmsInterface.I_WCS_GetTunnelList(param);
if (tunnelListReply == null)
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,原因[接口返回对象不正确,解析失败]", wmstaskNum));
}
else if (tunnelListReply.ResType)
{
if (string.IsNullOrWhiteSpace(tunnelListReply.TunnelNum))
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,原因[没有返回巷道列表]", wmstaskNum));
}
var srmList = tunnelListReply.TunnelNum.Split(',').ToList();
//根据物料缓存状态统计堆垛机入库任务数量
//var dicsrm = QueryDicList(srmList);
var SrmCacheInfoSet = QuerySrmInConvCacheInfoList(srmList);
foreach (var item in srmList)
{
//string srm = string.Empty;
//if (item.Length == 2)
//{
// srm = string.Format("srm{0}", item);
//}
//else
//{
// srm = string.Format("srm0{0}", item);
//}
//if (srm == "srm03" || srm == "srm01" || srm == "srm04")
//{
var srmitem = SrmCacheInfoSet.FirstOrDefault(v => v.SrmTunnel == item);
if (srmitem.ConvCacheIsAvailable)
{
var plctemp = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == srmitem.SrmNo);
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.DB521_Auto_status != (int)SrmModeEnum.远程) continue;
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.SrmDB541_Alarm) continue;
var touteTo = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == srmitem.SrmNo);
if (touteTo == null) continue;
converywrite.Goodsend = Convert.ToInt32(touteTo.ROUTE_STARTPOS);
converywrite.Srmno = srmitem.SrmNo;
break;
}
//}
}
if (converywrite.Goodsend <= 0)
{
var result = SrmCacheInfoSet.OrderBy(v => v.ConvCacheInTaskCount).Select(t => t.SrmNo).ToList();
foreach (var srm in result)
{
//if (srm == "srm03" || srm == "srm01" || srm == "srm04")
//{
var plctemp = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == srm);
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.DB521_Auto_status != (int)SrmModeEnum.远程) continue;
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.SrmDB541_Alarm) continue;
var touteTo = routeSet.FirstOrDefault(v => v.ROUTE_SONPOS == srm);
if (touteTo == null) continue;
converywrite.Goodsend = Convert.ToInt32(touteTo.ROUTE_STARTPOS);
converywrite.Srmno = srm;
break;
//}
}
}
}
if (converywrite.Goodsend <= 0)
{
if (tunnelListReply.ResType)
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,原因[WMS接口返回成功,设备信号因素导致失败]", wmstaskNum));
}
else
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,原因[{1}]", wmstaskNum, tunnelListReply.ResMessage));
}
}
else
{
var result = TryCachHelper.TryExecute((db) =>
{
var task = db.Queryable().First(v => v.TASK_NO == converywrite.Tasknum);
db.Updateable(it => new WCS_TASK()
{
TASK_POSIDTO = converywrite.Srmno,
TASK_SRMNO = converywrite.Srmno,
TASK_EDITUSERNO = "WCS",
TASK_EDITDATETIME = DateTime.Now
})
.Where(it => it.TASK_NO == task.TASK_NO)
.ExecuteCommand();
});
if (!string.IsNullOrWhiteSpace(result))
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道更新任务失败,原因[{1}]", wmstaskNum, result));
}
}
}
public static void AssignSrm(WCS_TASK task)
{
try
{
var param = new GetTunnelListParam();
param.WMSTaskNum = task.TASK_WMSNO;
if (task.TASK_POSIDCUR == "1023" || task.TASK_POSIDNEXT == "1023")
{
var plctemp = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == "srm01");
var srm = plctemp.WCS_EquipmentInfoSet.FirstOrDefault().EquSignal_Srm;
if (srm.DB521_ToRowPos == 1 || srm.DB521_ToRowPos == 2)
{
param.Memo1 = "1";
}
else
{
param.Memo1 = "2";
}
}
//分配巷道
var tunnelListReply = Current.WmsInterface.I_WCS_GetTunnelList(param);
if (tunnelListReply == null)
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,原因[接口返回对象不正确,解析失败]", task.TASK_WMSNO));
}
if (tunnelListReply.ResType)
{
if (string.IsNullOrWhiteSpace(tunnelListReply.TunnelNum))
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,原因[没有返回巷道列表]", task.TASK_WMSNO));
}
}
else
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,原因[{1}]", task.TASK_WMSNO, tunnelListReply.ResMessage));
}
string tunnelNo = string.Empty;
string tunnelSrmNo = string.Empty;
var srmList = tunnelListReply.TunnelNum.Split(',').ToList();
//根据物料缓存状态统计堆垛机入库任务数量
var SrmCacheInfoSet = QuerySrmInConvCacheInfoList(srmList);
foreach (var item in srmList)
{
var srmitem = SrmCacheInfoSet.FirstOrDefault(v => v.SrmTunnel == item);
if (srmitem.ConvCacheIsAvailable)
{
//var plctemp = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == srmitem.SrmNo);
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.DB521_Auto_status != (int)SrmModeEnum.远程) continue;
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.SrmDB541_Alarm) continue;
tunnelNo = srmitem.SrmTunnel;
tunnelSrmNo = srmitem.SrmNo;
break;
}
}
if (string.IsNullOrWhiteSpace(tunnelSrmNo))
{
var SrmCacheInfoList = SrmCacheInfoSet.OrderBy(v => v.ConvCacheInTaskCount).ToList();
foreach (var tunnelInfo in SrmCacheInfoList)
{
//var plctemp = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == srm);
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.DB521_Auto_status != (int)SrmModeEnum.远程) continue;
//if (plctemp.WCS_StackerDataSet[0].SrmSignalItem.SrmDB541_Alarm) continue;
tunnelNo = tunnelInfo.SrmTunnel;
tunnelSrmNo = tunnelInfo.SrmNo;
break;
}
}
if (string.IsNullOrWhiteSpace(tunnelSrmNo))
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,WMS返回的巷道[{1}]在WCS系统中未找到。", task.TASK_WMSNO, tunnelListReply.TunnelNum));
}
if (task.TASK_POSIDFROM == "1004")
{
tunnelNo = "1";
}
else if (task.TASK_POSIDFROM == "1013")
{
tunnelNo = "2";
}
var result = TryCachHelper.TryExecute((db) =>
{
db.Updateable(it => new WCS_TASK()
{
TASK_EndTunnelNum = tunnelNo,
TASK_POSIDTO = tunnelSrmNo,
TASK_SRMNO = tunnelSrmNo,
TASK_EDITUSERNO = "WCS",
TASK_EDITDATETIME = DateTime.Now
})
.Where(it => it.TASK_NO == task.TASK_NO)
.ExecuteCommand();
});
if (string.IsNullOrWhiteSpace(result))
{
task.TASK_POSIDTO = tunnelSrmNo;
task.TASK_EndTunnelNum = tunnelNo;
task.TASK_SRMNO = tunnelSrmNo;
}
else
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道更新任务失败,原因[{1}]", task.TASK_WMSNO, result));
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
///
/// 预分配巷道
///
public static void PreparatoryAssignSrmTunnel(WCS_TASK task)
{
try
{
var param = new GetTunnelListParam();
param.WMSTaskNum = task.TASK_WMSNO;
//分配巷道
var tunnelListReply = Current.WmsInterface.I_WCS_GetTunnelList(param);
if (tunnelListReply == null)
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,原因[接口返回对象不正确,解析失败]", task.TASK_WMSNO));
}
if (tunnelListReply.ResType)
{
if (string.IsNullOrWhiteSpace(tunnelListReply.TunnelNum))
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,原因[没有返回巷道列表]", task.TASK_WMSNO));
}
}
else
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道失败,原因[{1}]", task.TASK_WMSNO, tunnelListReply.ResMessage));
}
var result = TryCachHelper.TryExecute((db) =>
{
db.Updateable(it => new WCS_TASK()
{
TASK_ITEM7 = tunnelListReply.TunnelNum,
TASK_EDITUSERNO = "WCS",
TASK_EDITDATETIME = DateTime.Now
})
.Where(it => it.TASK_NO == task.TASK_NO)
.ExecuteCommand();
});
if (!string.IsNullOrWhiteSpace(result))
{
throw new Exception(string.Format("WMS任务[{0}]分配巷道更新任务失败,原因[{1}]", task.TASK_WMSNO, result));
}
else
{
task.TASK_ITEM7 = tunnelListReply.TunnelNum;
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
}
public struct SrmInConvCacheInfo
{
///
/// 巷道
///
public string SrmTunnel { get; set; }
///
/// 堆垛机
///
public string SrmNo { get; set; }
///
/// 输送线缓存数量
///
public int ConvCacheCount { get; set;}
///
/// 缓存中的入库任务数量
///
public int ConvCacheInTaskCount { get; set; }
///
/// 输送线缓存区是否够用
///
public bool ConvCacheIsAvailable
{
get
{
return ConvCacheCount > ConvCacheInTaskCount;
}
}
}
}