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;
using WCS.PLC.Model.Equipment;
namespace WCS.Workflow
{
public class WCSWorkflow
{
///
/// 查询重复使用的数据
///
public static void RefreshData()
{
var result = TryCachHelper.TryExecute((db) =>
{
Current.TaskSet = db.Queryable().ToList().Where(v => Current.WareNameList.Contains(v.TASK_WHID)).ToList();
Current.AgvTaskSet = db.Queryable().ToList().Where(v => Current.WareNameList.Contains(v.Task_Whid)).ToList();
Current.AgvCachePostionSet = db.Queryable().ToList();
Current.WCS_TASKTIMEPOINTSet = db.Queryable().ToList();
Current.SysSets = db.Queryable().ToList();
Current.WCS_SrmOutInInfoSet = db.Queryable().ToList().Where(v => Current.PlcSet.Any(t => t.PLC_NAME == v.SRMOUTIN_CONVPLCNAME)).ToList();
Current.WCS_CacheInfoSet = SugarBase.DB.Queryable().ToList();
Current.WCS_RGVOutInInfoSet = SugarBase.DB.Queryable().ToList().Where(v => Current.PlcSet.Any(t => t.PLC_NAME == v.PLCNAME)).ToList();
});
}
///
/// 查询最新1000条日志信息
///
public static void RefreshLogData()
{
TryCachHelper.TryExecute((db) =>
{
BaseCurrent.Wcs_LogSet = db.Queryable().OrderBy(v => v.LOG_ID, SqlSugar.OrderByType.Desc).ToPageList(0, 1000);
//Current.SysSets = db.Queryable().ToList();
});
}
private static int _UpdateTaskCurAddress = 0;
public static void UpdateTaskCurAddress()
{
if (Interlocked.Exchange(ref _UpdateTaskCurAddress, 1) == 0)
{
TryCachHelper.TryExecute((db) =>
{
foreach (var plc in Current.PlcSet)
{
if (plc.PLC_ISENABLE == false) continue;
foreach (var equipment in plc.WCS_EquipmentInfoSet)
{
if (equipment.Equ_Type == EquipmentType.conveyor.ToString())
{
var cs = equipment.EquSignal_Conv;
if (cs != null && cs.DB521_Tasknum > 0)
{
var task = db.Queryable().First(v => v.TASK_NO == cs.DB521_Tasknum);
if (task != null && task.TASK_POSIDCUR != equipment.Equ_No && task.TASK_WKSTATUS != 13)
{
db.Updateable(it => new WCS_TASK() { TASK_POSIDCUR = equipment.Equ_No, TASK_EDITDATETIME = DateTime.Now })
.Where(it => it.TASK_NO == task.TASK_NO)
.ExecuteCommand();
}
}
}
else if (equipment.Equ_Type == EquipmentType.rgv.ToString())
{
var rs = equipment.EquSignal_Rgv;
if (rs == null) continue;
if (rs.DB521_TaskID_1 > 0 && rs.DB521_PH_Status_1)
{
var rgvoutininfoSet = Current.WCS_RGVOutInInfoSet.Where(v => v.RGVOUTIN_RGVNO == equipment.Equ_No).ToList();
bool isExitConvTask = false;
foreach (var item in rgvoutininfoSet)
{
var conv = ConveyorHelper.GetConveyorSignal(item.PLCNAME, item.RGVOUTIN_CONVNO);
if (conv.DB521_Tasknum == rs.DB521_TaskID_1)
{
isExitConvTask = true;
break;
}
}
if (isExitConvTask == false)
{
var task = db.Queryable().First(v => v.TASK_NO == rs.DB521_TaskID_1);
if (task != null && task.TASK_POSIDCUR != equipment.Equ_No && (task.TASK_WKSTATUS == 7 || task.TASK_WKSTATUS == 3 || task.TASK_WKSTATUS == 4))
{
db.Updateable(it => new WCS_TASK() { TASK_POSIDCUR = equipment.Equ_No, TASK_EDITDATETIME = DateTime.Now })
.Where(it => it.TASK_NO == task.TASK_NO)
.ExecuteCommand();
}
}
}
if (rs.DB521_TaskID_2 > 0 && rs.DB521_PH_Status_2)
{
var rgvoutininfoSet = Current.WCS_RGVOutInInfoSet.Where(v => v.RGVOUTIN_RGVNO == equipment.Equ_No).ToList();
bool isExitConvTask = false;
foreach (var item in rgvoutininfoSet)
{
var conv = ConveyorHelper.GetConveyorSignal(item.PLCNAME, item.RGVOUTIN_CONVNO);
if (conv.DB521_Tasknum == rs.DB521_TaskID_2)
{
isExitConvTask = true;
break;
}
}
if (isExitConvTask == false)
{
var task = db.Queryable().First(v => v.TASK_NO == rs.DB521_TaskID_2);
if (task != null && task.TASK_POSIDCUR != equipment.Equ_No && (task.TASK_WKSTATUS == 7 || task.TASK_WKSTATUS == 3 || task.TASK_WKSTATUS == 4))
{
db.Updateable(it => new WCS_TASK() { TASK_POSIDCUR = equipment.Equ_No, TASK_EDITDATETIME = DateTime.Now })
.Where(it => it.TASK_NO == task.TASK_NO)
.ExecuteCommand();
}
}
}
}
}
}
});
Interlocked.Exchange(ref _UpdateTaskCurAddress, 0);
}
}
private static int _updateExceptionTask = 0;
public static void UpdateExceptionTask()
{
if (Interlocked.Exchange(ref _updateExceptionTask, 1) == 0)
{
try
{
int milliseconds = 1000 * 60 * 10;//延时10分钟
Thread.Sleep(milliseconds);
var task = SugarBase.DB.Queryable().First(v => v.TASK_COMTYPE == 6 && v.TASK_WKSTATUS > 1 && v.TASK_WKSTATUS < 99);
var dt = SugarBase.DB.GetDate();
if (task != null && task.TASK_EDITDATETIME.AddHours(8) < dt)//8小时未完成,自动完成
{
SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITDATETIME = dt })
.Where(it => it.TASK_NO == task.TASK_NO)
.ExecuteCommand();
}
}
catch (Exception ex)
{
LogMessageHelper.RecordLogMessage(ex);
}
finally
{
Interlocked.Exchange(ref _updateExceptionTask, 0);
}
}
}
#region AGV相关
#endregion;
}
}