using iWareCommon;
using iWareCommon.Common.Globle;
using iWareCommon.Utils;
using iWareModel;
using iWareSql;
using iWareSql.DataAccess;
using iWareSql.DbOrm;
using iWareSql.Orm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using XiGang.Core.Model;
namespace iWareCC
{
///
/// 设备线程服务
///
public class DeviceThreadServiceHandle
{
private static string _namespace = "iWareSda.DeviceThreadService";
public LogType currentLogType = LogType.AGVTheadService;
///
/// 线程休眠的时间(毫秒)
///
public int cycleDelay = 500;//100,暂时 改成每次5秒一次循环
#region 启动服务
///
/// 启动服务
///
public virtual void StartService()
{
}
#endregion
#region 下发任务线程
///
/// 下发设备任务线程
///
///
public void IssueTaskThread(EDevice x)
{
ThreadHelper.StartThread(new Thread(new ParameterizedThreadStart(IssueTask)), (int)x);
}
///
/// 下发设备任务
///
///
public virtual void IssueTask(object deviceId)
{
}
///
/// 下发设备任务处理
///
///
public virtual void IssueTaskHandle(int deviceId, out string errMsg)
{
errMsg = "";
}
#endregion
#region 任务完成确认线程
///
/// 任务完成确认线程
///
///
public void ConfirmFinishTaskThread(EDevice x)
{
ThreadHelper.StartThread(new Thread(new ParameterizedThreadStart(ConfirmFinishTask)), (int)x);
}
///
/// 任务完成确认
///
///
public virtual void ConfirmFinishTask(object deviceId)
{
}
///
/// 任务完成确认处理
///
///
public virtual void ConfirmFinishTaskHandle(int deviceId, out string errMsg)
{
errMsg = "";
}
#endregion
#region 确认任务完成线程
#endregion
#region 验证
///
/// 验证设备是否可以下发新任务
///
///
///
public virtual bool ValidateDeviceIsAllowSendTask(int int_deviceId, out string errMsg)
{
errMsg = "";
EDevice device = (EDevice)Enum.Parse(typeof(EDevice), int_deviceId.ToString());
//if (Wms_EquipmentSituationHandler.IsEquipmentBreakdown(int_deviceId).result)
//{//如果设备已经设定为 故障状态,不允许下发任务!!! [EditBy shaocx,2020-12-07]
// errMsg = device.ToString() + "被设定为故障状态,不允许下发新任务";
// return false;
//}
return true;
}
///
/// 验证设备是否可以下发新任务
///
///
///
public virtual bool ValidateDeviceIsAllowSendTask(int int_deviceId, ware_task_sub task, out string errMsg)
{
errMsg = "";
return true;
}
///
/// 验证目标点是否已经有库存!
///
///
///
public virtual bool ValidateIsHasStoreForToPlace(int int_deviceId, int placeId, string placeNo, out string errMsg)
{
errMsg = "";
EDevice device = (EDevice)Enum.Parse(typeof(EDevice), int_deviceId.ToString());
//增加验证-验证目标点是否有库存,如果有库存,则不允许下发新任务 【EditBy shaocx,2022-04-15】
//using (DbOrm edm = new DbOrm())
//{
// var store = StoreHandler.GetV_AllStoreByPlaceId(edm, placeId);
// if (store != null)
// {
// errMsg = "目标点" + placeNo + "系统显示已经有货,不允许给" + device.ToString() + "下发新任务,货物类型:" + store.MaterialTypeName + ",货物托盘号:" + store.SalverCode;
// return false;
// }
//}
return true;
}
///
/// 验证前面存在同一个起点、目标点的任务
///
///
///
///
/// true:验证通过,false:验证不通过
public virtual bool ValidateIsHasNoFinishedSameTask(int int_deviceId, ware_task_sub part, out string errMsg)
{
errMsg = "";
EDevice device = (EDevice)Enum.Parse(typeof(EDevice), int_deviceId.ToString());
//using (DbModel edm = new DbModel())
//{
// var queryState1 = (int)SubTaskStateEnum.已取消;
// var queryState2 = (int)SubTaskStateEnum.已完成;
// var partList = edm.Task_Part.Where(x => x.Id != part.Id && x.DeviceId == int_deviceId
// //&& x.MainTaskSequence <= part.MainTaskSequence
// && x.CreateTime < part.CreateTime
// && x.SourcePlace == part.SourcePlace
// && x.ToPlace == part.ToPlace
// && x.TaskState != queryState1 && x.TaskState != queryState2
// ).ToList();
// if (partList != null && partList.Count > 0)
// {
// errMsg = "前面存在同一个起点、目标点的任务,不允许给" + device.ToString() + "下发新任务:" + part.PlcTaskId;
// return false;
// }
//}
return true;
}
///
/// 验证设备是否可以接受任务
///
///
///
public virtual bool ValidateDeviceIsOK(int int_deviceId, ware_task_sub _task, int taskId, out string errMsg)
{
errMsg = "";
return true;
}
///
/// 验证根据设备号是否能找到设备
///
///
///
public virtual T ValidateIsExistDevice(int int_deviceId)
{
return default(T);
}
///
/// 验证设备是否任务完成
///
///
///
public virtual bool ValidateDeviceTaskIsFinsished(int int_deviceId, ware_task_sub _task, out string errMsg)
{
errMsg = "";
return false;
}
///
/// 验证设备是否任务完成
///
///
/// 0表示没有任务完成,其他表示任务完成,并返回任务号
public virtual bool ValidateDeviceTaskIsFinsished(int int_deviceId, ware_task_sub _task, int taskId, out string errMsg)
{
errMsg = "";
return false;
}
///
/// 验证设备是否任务完成
///
///
/// 0表示没有任务完成,其他表示任务完成,并返回任务号
public virtual bool ValidateDeviceTaskIsFinsished(int int_deviceId, ware_task_sub _task, int taskId, bool? isAllowSimulateExecute, out string errMsg)
{
errMsg = "";
return false;
}
///
/// 验证起点和终点是否正确
///
///
/// 起始点的主键ID
/// 目标点的主键ID
///
public bool ValdiatePalceIsRight(DbOrm dbOrm, string sourcePlace, string toPlace, ref RealPlaceEntity realPlaceEntity)
{
#region 新增异常信息表 【EditBy shaocx,2020-01-20】
IDictionary logDict = new Dictionary();
logDict.Add("sourcePlace", sourcePlace);
logDict.Add("toPlace", toPlace);
iWareSql.DbOrm.Base_SysExceptionInfo exception = SysExceptionInfoHandler.GetExceptionInfo>(currentLogType, _namespace, "ValdiatePalceIsRight", logDict);
#endregion
try
{
if (FormCC.IsSimulationPLC)
return true;
var db_fromPlace = dbOrm.ware_site.FirstOrDefault(x => x.Code == sourcePlace);
var db_toPlace = dbOrm.ware_site.FirstOrDefault(x => x.Code == toPlace);
if (db_fromPlace == null)
{
exception.exceptionMsg = "起点'" + sourcePlace + "'没有找到";
SysExceptionInfoHandler.InsertExceptionInfo(exception, true);
return false;
}
if (db_toPlace == null)
{
exception.exceptionMsg = "终点'" + toPlace + "'没有找到";
SysExceptionInfoHandler.InsertExceptionInfo(exception, true);
return false;
}
realPlaceEntity = new RealPlaceEntity();
realPlaceEntity.real_sourcePlace = db_fromPlace;
realPlaceEntity.real_toPlace = db_toPlace;
return true;
}
catch (Exception ex)
{
SysExceptionInfoHandler.GetExceptionInfoForError("验证起点和终点是否正确出现异常:" + ex.Message, ex, ref exception);
SysExceptionInfoHandler.InsertExceptionInfo(exception);
throw;
}
}
///
/// 验证数据库中是否有任务要处理
///
/// 设备号
///
public virtual T ValidateIsExistTaskToDispose(DbOrm dbModel, int int_deviceId, out string errMsg, TaskExcuteTypeEnum _TaskExcuteTypeEnum)
{
errMsg = "";
return default(T);
}
///
/// 验证数据库中是否有任务要处理
///
///
///
/// Rgv设备号
///
///
///
public ware_task_sub ValidateIsExistTaskToDispose(DbOrm dbOrm, int int_deviceId, out string errMsg, SubTaskStateEnum _SubTaskStateEnum)
{
errMsg = "";
ware_task_sub currTask = null;
switch (_SubTaskStateEnum)
{
//查找需要下发的子任务
case SubTaskStateEnum.已下发:
List currTasks = dbOrm.ware_task_sub.Where(x => x.DeviceId == int_deviceId && x.TaskState == (int)SubTaskStateEnum.未开始).ToList().OrderBy(x => x.CreatedTime).ToList();//按照主任务优先级的升序排序
//看同一个设备,是否还有其他正在执行的任务!修改为看同一个站台是否有任务
var partTasks = dbOrm.ware_task_sub.Where(x => x.DeviceId == int_deviceId && x.TaskState == (int)SubTaskStateEnum.已下发).
OrderBy(x => x.CreatedTime).ToList();//按照主任务的顺序升序
foreach (var item in currTasks)
{
//检查任务优先级,是否可以下发
var isExist = dbOrm.ware_task_sub.AsNoTracking().Any(x => x.TaskId == item.TaskId && x.TaskSequence < item.TaskSequence && x.TaskState == (int)SubTaskStateEnum.未开始);
if (isExist)
{
continue;
}
var partTask = partTasks.Find(u => u.SourcePlace == item.ToPlace || u.SourcePlace == item.SourcePlace || u.ToPlace == item.ToPlace || u.ToPlace == item.SourcePlace);
if (partTask != null)
{
errMsg = string.Format("站台{0}的正在执行任务,任务ID:" + partTask.Id + ",主任务:" + partTask.TaskId + ",PLC任务号:" + partTask.TaskNo, partTask.SourcePlace);
//return default(ware_task_sub);
continue;
}
currTask = item;
break;
}
break;
//查找需要完成的子任务
case SubTaskStateEnum.已完成:
currTask = dbOrm.ware_task_sub.Where(x => x.DeviceId == int_deviceId && x.TaskState == (int)SubTaskStateEnum.已下发).ToList().OrderBy(x => x.CreatedTime).FirstOrDefault();//按照主任务优先级的升序排序
break;
}
return currTask;
}
///
/// 当设备任务完成后,验证站点是否有其他任务被占用
///
///
///
/// 本次任务排除
///
public bool ValdiatePalceIsUsedByTask(DbOrm dbModel, int placeId, string excludeTaskId)
{
try
{
var queryState1 = (int)SubTaskStateEnum.已取消;
var queryState2 = (int)SubTaskStateEnum.已完成;
//int srmCount = dbModel.ware_task_sub.Count(x => x.TaskState != queryState1 && x.TaskState != queryState2 && (x.SourcePlace == placeId || x.ToPlace == placeId) && x.Id != excludeTaskId);
//if (srmCount > 0)
//{
// return false;
//}
//int rgvCount = dbModel.ware_task_sub.Count(x => x.TaskState != queryState1 && x.TaskState != queryState2 && (x.SourcePlace == placeId || x.ToPlace == placeId) && x.Id != excludeTaskId);
//if (rgvCount > 0)
//{
// return false;
//}
return true;
}
catch (Exception ex)
{
throw;
}
}
#endregion
#region 获取指定任务阶段的某个设备的所有任务列表
///
/// 获取指定任务阶段的某个设备的所有任务列表
///
///
///
///
///
public List GetPartListByDevice(DbOrm dbModel, int int_deviceId, TaskExcuteTypeEnum _TaskExcuteTypeEnum)
{
switch (_TaskExcuteTypeEnum)
{
case TaskExcuteTypeEnum.执行任务:
return dbModel.ware_task_sub.Where(x => x.DeviceId == int_deviceId && x.TaskState == (int)SubTaskStateEnum.未开始).ToList().OrderBy(x => x.CreatedTime).ToList();//按照主任务的顺序升序
case TaskExcuteTypeEnum.结束任务:
return dbModel.ware_task_sub.Where(x => x.DeviceId == int_deviceId && x.TaskState == (int)SubTaskStateEnum.已下发).ToList().OrderBy(x => x.CreatedTime).ToList();//按照主任务的顺序升序
default:
return null;
}
}
#endregion
}
}