using System;
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;
namespace WCS.Workflow
{
public class AgvWorkflow
{
private static int _agvRun = 0;
public static void AgvRun()
{
if (Interlocked.Exchange(ref _agvRun, 1) == 0)
{
Thread.Sleep(10000);
//熟化架缓冲区广电检测生成AGV任务
AgvCallMaturingRack();
//生产线AGV申请WMS生成出库任务
AgvCallOutTask();
//生产线AGV申请WMS生成退料入库任务
AgvCallBackInTask();
Interlocked.Exchange(ref _agvRun, 0);
}
}
private static int _agvUpdateStatus = 0;
public static void AgvUpdateStatus()
{
if (Interlocked.Exchange(ref _agvUpdateStatus, 1) == 0)
{
Thread.Sleep(1000);
//发送任务给AGV
SendTaskToAgv();
//无AGV模式WCS标识AGV任务完成
FinishAgvTaskAgvStatus();
//标识agv任务Wcs完成状态
FinishAgvTaskWcsStatus();
Interlocked.Exchange(ref _agvUpdateStatus, 0);
}
}
///
/// 生产线根据光电信号自动生成AGV任务
///
public static void AgvCallMaturingRack()
{
try
{
foreach (var item in Current.AgvCachePostionSet)
{
try
{
//if (item.WorkshopNo == "4")
//{
// if (item.CachePosNo.Contains("Empty04")) continue;
//}
//if (item.CachePosNo.Contains("Pvc_5_Empty")) continue;
int task_type = item.CachePosNo.Contains("Empty") ? 3 : 4;
#region 检测光电创建AGV任务
if (Current.SysSets.Any(t => t.SET_ID == item.Workshop && t.SET_VALUE == "0"))
{
if (item.CachePH_Status == false && task_type == 3)
{
if (!Current.AgvTaskSet.Any(v => v.Task_PosidTo == item.CachePosNo))
{
//创建AGV任务
var agvtask = new Middle_AGVTask()
{
Task_Type = task_type,
Task_Whid = Current.PvchouseputongCh,
Task_WorkshopNo = item.WorkshopNo,
Task_ProLineNo = item.ProLineNo,
Task_PosidFrom = item.ConvPostionNo,
Task_PosidTo = item.CachePosNo,
Task_CreateDate = DateTime.Now,
Task_CreateUser = "wcs",
Task_UpdateUser = "wcs",
Task_UpdateDate = DateTime.Now
};
SugarBase.DB.Insertable(agvtask).ExecuteCommand();
}
}
}
#endregion;
#region 创建半成品入库AGV任务
if (task_type == 4)
{
//查询半成品熟化架任务
var task = Current.TaskSet.Where(v => v.TASK_POSIDFROM == item.CachePosNo && v.TASK_WKSTATUS <= 1).OrderBy(v => v.TASK_ADDDATETIME).ToList().FirstOrDefault();
if (task == null) continue;
#region 避开指定车间出入库高峰期
//查询指定车间已下发给WCS的AGV任务列表
var agvtaskSet = Current.AgvTaskSet.Where(v => v.Task_WorkshopNo == item.WorkshopNo &&
v.Task_WcsStatus > 0 && v.Task_WcsStatus != 4 && v.Task_WcsStatus != 99 && v.Task_WcsStatus != 106).ToList();
if (item.WorkshopNo == "4")
{
//检测是否存在出库任务
if (Current.TaskSet.Any(v => agvtaskSet.Any(t => t.Task_Id.ToString() == v.TASK_ITEM8) &&
v.TASK_WKSTATUS > 1 && v.TASK_WKSTATUS != 5 && v.TASK_WKSTATUS != 6 && v.TASK_WKSTATUS != 99 && v.TASK_WKSTATUS != 106 &&
v.TASK_COMTYPE == 2 && v.TASK_POSIDNEXT != "1070" && v.TASK_POSIDNEXT != "1071" && v.TASK_POSIDNEXT != "1072"))
{
//存在已经执行中的WCS出库任务
if (item.WorkshopNo != "18")
{
string msg = string.Format("车间[{0}]半成品入库条码[{1}]稍等,为避开高峰期出库任务完成后执行。", item.WorkshopNo, task.TASK_BOXBARCODE);
BaseWorkflow.AddLedErrorMsg(item.ConvPostionNo, msg, 0);
LogMessageHelper.RecordLogMessage(msg);
continue;
}
}
}
else if (item.WorkshopNo == "5")
{
//检测是否存在出库任务
if (Current.TaskSet.Any(v => agvtaskSet.Any(t => t.Task_Id.ToString() == v.TASK_ITEM8) &&
v.TASK_WKSTATUS > 1 && v.TASK_WKSTATUS != 5 && v.TASK_WKSTATUS != 6 && v.TASK_WKSTATUS != 99 && v.TASK_WKSTATUS != 106 &&
v.TASK_COMTYPE == 2 && v.TASK_POSIDNEXT != "1070" && v.TASK_POSIDNEXT != "1071" && v.TASK_POSIDNEXT != "1072" && v.TASK_POSIDNEXT != "1085"))
{
//存在已经执行中的WCS出库任务
if (item.WorkshopNo != "18")
{
string msg = string.Format("车间[{0}]半成品入库条码[{1}]稍等,为避开高峰期出库任务完成后执行。", item.WorkshopNo, task.TASK_BOXBARCODE);
BaseWorkflow.AddLedErrorMsg(item.ConvPostionNo, msg, 0);
LogMessageHelper.RecordLogMessage(msg);
continue;
}
}
}
#endregion;
var agvtaskitem = Current.AgvTaskSet.OrderBy(v => v.Task_UpdateDate).FirstOrDefault(v => v.Task_PosidFrom == item.CachePosNo);
if (item.CachePH_Status)
{
if (agvtaskitem == null)
{
#region 创建AGV任务
var workshopNo = string.Format("Agv_{0}#", item.WorkshopNo);
int wcsStatus = 1;
//if (Current.SysSets.FirstOrDefault(v => v.SET_ID == workshopNo).SET_VALUE.Trim() == "0")
//{
// wcsStatus = 1;
//}
var agvtasks = SugarBase.DB.Queryable().Where(v => v.Task_PosidFrom == item.ConvPostionNo && v.Task_WcsStatus != 4 && v.Task_WcsStatus != 99 && v.Task_WcsStatus != 106).ToList();
if (agvtasks.Any(v => !string.IsNullOrWhiteSpace(v.Task_No)))
{
continue;
}
//创建AGV任务
var agvtask = new Middle_AGVTask()
{
Task_No = task.TASK_WMSNO,
Task_BreakTrayNo = task.TASK_BOXBARCODE,
Task_Type = task_type,
Task_Whid = Current.PvchouseputongCh,
Task_WorkshopNo = item.WorkshopNo,
Task_ProLineNo = item.ProLineNo,
Task_PosidFrom = item.CachePosNo,
Task_PosidTo = item.ConvPostionNo,
Task_WcsStatus = wcsStatus,
Task_CreateDate = DateTime.Now,
Task_CreateUser = "wcs",
Task_UpdateUser = "wcs",
Task_UpdateDate = DateTime.Now
};
string result = TryCachHelper.TryTranExecute((db) =>
{
int task_id = db.Insertable(agvtask).ExecuteReturnIdentity();
if (task_id <= 0)
{
throw new Exception(string.Format("WCS任务[{0}]添加agv任务失败", task_id));
}
string task_idStr = task_id.ToString();
//修改任务的状态
db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 10, TASK_EDITUSERNO = "WCS", TASK_ITEM8 = task_idStr, TASK_EDITDATETIME = DateTime.Now })
.Where(it => it.TASK_NO == task.TASK_NO)
.ExecuteCommand();
//添加修改明细
string msg = string.Format("任务[{0}]已下发AGV", task.TASK_NO);
CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg);
});
#endregion;
}
else
{
#region 修改AGV任务状态
if (agvtaskitem.Task_WcsStatus == 0 && agvtaskitem.Task_AgvStatus == 0)
{
string result = TryCachHelper.TryTranExecute((db) =>
{
db.Updateable(it => new Middle_AGVTask()
{
Task_WcsStatus = 1,
Task_UpdateUser = "wcs",
Task_UpdateDate = DateTime.Now
}).Where(it => it.Task_Id == agvtaskitem.Task_Id).ExecuteCommand();
string task_idStr = agvtaskitem.Task_Id.ToString();
//修改任务的状态
db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 10, TASK_EDITUSERNO = "WCS", TASK_ITEM8 = task_idStr, TASK_EDITDATETIME = DateTime.Now })
.Where(it => it.TASK_NO == task.TASK_NO)
.ExecuteCommand();
//添加修改明细
string msg = string.Format("任务[{0}]已下发AGV", task.TASK_NO);
CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg);
});
if (string.IsNullOrWhiteSpace(result))
{
LogMessageHelper.RecordLogMessage(string.Format("agvId[{0}]是agv错误插入的任务,WCS修改该任务的状态成功。", agvtaskitem.Task_Id));
}
}
#endregion;
}
}
else
{
#region 修改AGV任务状态
if (agvtaskitem != null && agvtaskitem.Task_WcsStatus == 0 && agvtaskitem.Task_AgvStatus == 0)
{
string result = TryCachHelper.TryTranExecute((db) =>
{
db.Updateable(it => new Middle_AGVTask()
{
Task_WcsStatus = 1,
Task_UpdateUser = "wcs",
Task_UpdateDate = DateTime.Now
}).Where(it => it.Task_Id == agvtaskitem.Task_Id).ExecuteCommand();
string task_idStr = agvtaskitem.Task_Id.ToString();
//修改任务的状态
db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 10, TASK_EDITUSERNO = "WCS", TASK_ITEM8 = task_idStr, TASK_EDITDATETIME = DateTime.Now })
.Where(it => it.TASK_NO == task.TASK_NO)
.ExecuteCommand();
//添加修改明细
string msg = string.Format("任务[{0}]已下发AGV", task.TASK_NO);
CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg);
});
if (string.IsNullOrWhiteSpace(result))
{
LogMessageHelper.RecordLogMessage(string.Format("agvId[{0}]是agv错误插入的任务,WCS修改该任务的状态成功。", agvtaskitem.Task_Id));
}
}
#endregion;
}
}
//if (item.CachePH_Status && task_type == 4)
//{
// //查询半成品熟化架任务
// var task = Current.TaskSet.Where(v => v.TASK_POSIDFROM == item.CachePosNo && v.TASK_WKSTATUS <= 1).OrderBy(v => v.TASK_ADDDATETIME).ToList().FirstOrDefault();
// if (task != null)
// {
// #region 创建AGV任务,修改WCS任务状态
// else
// #endregion;
// }
//}
#endregion;
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
///
/// 生产线AGV申请WMS生成出库任务
///
public static void AgvCallOutTask()
{
try
{
//查询AGV呼叫任务,申请生成WMS出库任务
var agvTasks = Current.AgvTaskSet.Where(v => (v.Task_WcsStatus == 5 || v.Task_WcsStatus==0) && (v.Task_Type == 1 || v.Task_Type == 3)).OrderBy(v => v.Task_CreateDate).ToList();
foreach (var item in agvTasks)
{
try
{
//if (item.Task_Type == 1 && (item.Task_WorkshopNo == "5" || item.Task_WorkshopNo == "6" || item.Task_WorkshopNo == "7"))
//{
// continue;
//}
if (!SugarBase.DB.Queryable().Any(v => v.TASK_ITEM8 == item.Task_Id.ToString()))
{
var param = new GetOutTaskParam();
param.OutId = item.Task_Id.ToString();
param.OutEndPostion = item.Task_PosidTo;
int tasktype = 0;
if (item.Task_Type == 1)
{
tasktype = 1;
}
else if (item.Task_Type == 3)
{
tasktype = 2;
}
param.OutType = tasktype;
param.WareHouseId = Current.Pvchouseputong;
if (item.Task_Type == 1 && item.Task_WorkshopNo != "18")
{
param.Memo1 = "1";
}
BaseWorkflow.GetOutTask(param);
//调用WMS接口生成出库任务
//ThreadHelper.TaskThread(BaseWorkflow.GetOutTask, param, 2000);
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
//查询18车间的空熟化架入库任务
var agvTaskItems = Current.AgvTaskSet.Where(v => v.Task_WcsStatus == 0 && v.Task_Type == 4 && v.Task_WorkshopNo=="18").OrderBy(v => v.Task_CreateDate).ToList();
foreach (var item in agvTaskItems)
{
SugarBase.DB.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 1, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now })
.Where(it => it.Task_Id == item.Task_Id)
.ExecuteCommand();
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
///
/// 生产线AGV申请WMS生成退料入库任务
///
public static void AgvCallBackInTask()
{
try
{
//查询AGV呼叫任务,申请生成WMS出库任务
var agvTasks = Current.AgvTaskSet.Where(v => v.Task_WcsStatus == 0 && v.Task_Type == 2 && v.Task_WorkshopNo.Trim() != "18").OrderBy(v => v.Task_CreateDate).ToList();
foreach (var item in agvTasks)
{
if (item.Task_WorkshopNo.Trim() == "18")
{
}
else
{
if (!Current.TaskSet.Any(v => v.TASK_ITEM8 == item.Task_Id.ToString()))
// if (!Current.TaskSet.Any(v => v.TASK_POSIDTO == item.Task_PosidFrom))
{
var param = new GetOutTaskParam()
{
OutId = item.Task_Id.ToString(),
OutEndPostion = item.Task_PosidFrom,
OutType = item.Task_Type == 2 ? 2 : 0,
WareHouseId = Current.Pvchouseputong
};
//调用WMS接口生成出库任务
ThreadHelper.TaskThread(BaseWorkflow.GetOutTask, param, 2000);
}
}
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
///
/// 半成品熟化架入库
///
//public static void AgvCallFullInTask()
//{
// try
// {
// //查询AGV呼叫任务,申请生成WMS出库任务
// var agvTasks = Current.AgvTaskSet.Where(v => v.Task_WcsStatus == 0 && v.Task_Type == 4).OrderBy(v => v.Task_CreateDate).ToList();
// foreach (var item in agvTasks)
// {
// if (!Current.TaskSet.Any(v => v.TASK_POSIDFROM == item.Task_PosidFrom))
// {
// var param = new GetInTaskParam();
// param.ContainerBarCode = string.Empty;
// param.ContainerType = 1;
// param.MatBarCode = string.Empty;
// param.WareHouseId = Current.Pvchouseputong;
// param.EquipmentNo = item.Task_PosidFrom;
// param.EndPostion = "srm";
// ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param, 3000);
// }
// }
// }
// catch (Exception ex)
// {
// LogMessageHelper.RecordLogMessage(ex);
// }
//}
///
/// 发送任务给AGV
///
public static void SendTaskToAgv()
{
try
{
var outPosNoList_4_5 = new List() { "1097", "1104" };//4#,5#
var tasks = SugarBase.DB.Queryable().Where(v => outPosNoList_4_5.Contains(v.TASK_POSIDCUR)).ToList();
var outPosNoList_6_7 = new List() { "1107", "1112", "1199" };//6#,7#,18#
var tasktemps = SugarBase.DB.Queryable().Where(v => outPosNoList_6_7.Contains(v.TASK_POSIDCUR)).ToList();
tasks.AddRange(tasktemps);
foreach (var item in tasks)
{
try
{
Thread.Sleep(100);
int agv_taskid = 0;
if (!string.IsNullOrWhiteSpace(item.TASK_ITEM8))
{
agv_taskid = Convert.ToInt32(item.TASK_ITEM8);
}
if (agv_taskid == 0) continue;
var agvtask = SugarBase.DB.Queryable().First(v => v.Task_Id == agv_taskid);
if (agvtask != null && agvtask.Task_AgvStatus == 0 && (agvtask.Task_WcsStatus == 0 || agvtask.Task_WcsStatus == 5))
{
string task_no = item.TASK_NO.ToString();
int wcsStatus = 5;
if (Current.SysSets.FirstOrDefault(v => v.SET_ID == agvtask.Task_Workshop).SET_VALUE.Trim() == "0")
{
wcsStatus = 1;
//任务下发给AGV
SugarBase.DB.Updateable(it => new Middle_AGVTask()
{
Task_No = item.TASK_WMSNO,
Task_WcsStatus = wcsStatus,
Task_BreakTrayNo = item.TASK_BOXBARCODE,
Task_BreakBarCode_1 = item.TASK_ITEM9,
Task_BreakBarCode_2 = item.TASK_ITEM10,
Task_UpdateUser = "wcs",
Task_UpdateDate = DateTime.Now,
Task_Remark = task_no
})
.Where(it => it.Task_Id == agv_taskid)
.ExecuteCommand();
}
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
///
/// 无AGV模式WCS标识AGV任务完成
///
private static void FinishAgvTaskAgvStatus()
{
try
{
var syssets = Current.SysSets.Where(v => v.SET_TYPE == "AgvDisable").ToList();
var agvtask = Current.AgvTaskSet.Where(v => v.Task_AgvStatus < 99 && v.Task_WcsStatus < 99 && syssets.Any(t => t.SET_ID == v.Task_Workshop && t.SET_VALUE.Trim() == "1")).ToList();
foreach (var item in agvtask)
{
try
{
if (string.IsNullOrWhiteSpace(item.Task_No)) continue;
if (string.IsNullOrWhiteSpace(item.Task_BreakTrayNo)) continue;
if (item.Task_Type == 1 | item.Task_Type == 3)
{
var routeitem = Current.EquRouteSet.SingleOrDefault(v => v.ROUTE_SONPOS == item.Task_PosidTo.Trim());
var task = Current.TaskSet.FirstOrDefault(v => v.TASK_WMSNO == item.Task_No && v.TASK_POSIDNEXT == routeitem.ROUTE_STARTPOS);
if (task != null)
{
//标识agv任务agv完成状态
SugarBase.DB.Updateable(it => new Middle_AGVTask()
{
Task_AgvStatus = 99,
Task_UpdateUser = "wcs",
Task_UpdateDate = DateTime.Now
})
.Where(it => it.Task_Id == item.Task_Id)
.ExecuteCommand();
}
}
else
{
if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE == item.Task_BreakTrayNo && v.TASK_WMSNO == item.Task_No && v.TASK_WKSTATUS == 2))
{
//标识agv任务agv完成状态
SugarBase.DB.Updateable(it => new Middle_AGVTask()
{
Task_AgvStatus = 99,
Task_UpdateUser = "wcs",
Task_UpdateDate = DateTime.Now
})
.Where(it => it.Task_Id == item.Task_Id)
.ExecuteCommand();
}
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
///
/// 标识agv任务Wcs完成状态
///
public static void FinishAgvTaskWcsStatus()
{
try
{
var agvTasks = Current.AgvTaskSet.Where(v => (v.Task_AgvStatus == 99 || v.Task_AgvStatus == 106) && v.Task_WcsStatus < 99).ToList();
foreach (var item in agvTasks)
{
try
{
var wcstask = Current.TaskSet.FirstOrDefault(v => v.TASK_WMSNO == item.Task_No);
if ((!string.IsNullOrWhiteSpace(item.Task_BreakBarCode_1)) &&
(!string.IsNullOrWhiteSpace(item.Task_BreakTrayNo)))
{
//检查是否生成了退料入库任务
if (!Current.TaskSet.Any(v => v.TASK_BOXBARCODE == item.Task_BreakTrayNo && v.TASK_COMTYPE == 1)) continue;
string result = TryCachHelper.TryTranExecute((db) =>
{
//标识agv任务Wcs完成状态
db.Updateable(it => new Middle_AGVTask()
{
Task_WcsStatus = item.Task_AgvStatus,
Task_UpdateUser = "wcs",
Task_UpdateDate = DateTime.Now
})
.Where(it => it.Task_Id == item.Task_Id)
.ExecuteCommand();
//标识wcs状态
if (wcstask != null && wcstask.TASK_COMTYPE == 1 && wcstask.TASK_WKSTATUS == 10)
{
db.Updateable(it => new WCS_TASK()
{
TASK_WKSTATUS = 12,
TASK_EDITUSERNO = "wcs",
TASK_EDITDATETIME = DateTime.Now
})
.Where(it => it.TASK_NO == wcstask.TASK_NO)
.ExecuteCommand();
//添加任务明细
string msg = string.Format("入库任务[{0}]AGV完成", wcstask.TASK_NO);
CommonData.AddWCS_TASK_DTL(db, wcstask.TASK_NO, wcstask.TASK_NO, wcstask.TASK_POSIDCUR, wcstask.TASK_POSIDCUR, msg);
}
});
}
else
{
string result = TryCachHelper.TryTranExecute((db) =>
{
//标识agv任务Wcs完成状态
db.Updateable(it => new Middle_AGVTask()
{
Task_WcsStatus = item.Task_AgvStatus,
Task_UpdateUser = "wcs",
Task_UpdateDate = DateTime.Now
})
.Where(it => it.Task_Id == item.Task_Id)
.ExecuteCommand();
//标识wcs状态
if (wcstask != null && wcstask.TASK_COMTYPE == 1)
{
db.Updateable(it => new WCS_TASK()
{
TASK_WKSTATUS = 12,
TASK_EDITUSERNO = "wcs",
TASK_EDITDATETIME = DateTime.Now
})
.Where(it => it.TASK_NO == wcstask.TASK_NO)
.ExecuteCommand();
//添加任务明细
string msg = string.Format("入库任务[{0}]AGV完成", wcstask.TASK_NO);
CommonData.AddWCS_TASK_DTL(db, wcstask.TASK_NO, wcstask.TASK_NO, wcstask.TASK_POSIDCUR, wcstask.TASK_POSIDCUR, msg);
}
});
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
}
}
}