using IWareCC.CacheInfo;
|
using IWareCC.Extend;
|
using IWareCC.ORM;
|
using IWareCC.Properties;
|
using IWareCommon.Enum.Common;
|
using IWareCommon.Enum.Rgv;
|
using IWareCommon.Enum.Srm;
|
using IWareCommon.Help;
|
using System;
|
using System.Collections.Generic;
|
using System.Data.SqlClient;
|
using System.Linq;
|
using System.Text;
|
using System.Threading;
|
using System.Threading.Tasks;
|
|
namespace IWareCC.Task
|
{
|
public class TaskService
|
{
|
|
private static object Lock = new object();
|
|
private TaskService() { }
|
|
private static TaskService Instance = null;
|
|
/// <summary>
|
/// 获取单例的方法
|
/// </summary>
|
/// <returns>用户服务的单例实体</returns>
|
public static TaskService GetInstance()
|
{
|
if (Instance == null)
|
{
|
lock (Lock)
|
{
|
if (Instance == null)
|
{
|
Instance = new TaskService();
|
}
|
}
|
}
|
return Instance;
|
}
|
|
/// <summary>
|
/// 发送主任务
|
/// </summary>
|
/// <param name="taskId">任务号</param>
|
/// <param name="sourcePlce">起始位置</param>
|
/// <param name="toPlace">目标位置</param>
|
/// <param name="taskType">任务类型</param>
|
/// <param name="containerType">托盘类型</param>
|
/// <param name="deliveryType">出库类型</param>
|
/// <returns></returns>
|
public bool CreateMainTask(int taskId, string sourcePlce, string toPlace, int taskType, int containerType, int storageno, int height, string containerName, ref string errMsg, int wmsTaskId)
|
{
|
try
|
{
|
if (!CheckDevIsOK(taskType, storageno, containerType, ref errMsg))
|
{
|
LogTextHelper.WriteLog("C:/CCSLog/SendTask", this.ToString(), "SendTask", "设备条件不满足," + errMsg);
|
return false;
|
}
|
// LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "SendTask", "收到任务id={0},sourcePlce={1},toPlace={2},taskType={3}", taskId, sourcePlce, toPlace, taskType);
|
using (DbModel db = new DbModel())
|
{
|
#region 增加是否重复了发送了任务 [Editby shaocx,2024-10-14]
|
var _query_taskno = taskId.ToString();
|
var isExist = db.MainTasks.Where(x => x.wmsTaskId == wmsTaskId && x.taskno == _query_taskno).FirstOrDefault();
|
if (isExist != null)
|
{
|
LogTextHelper.WriteLog("C:/CCSLog/SendTask", this.ToString(), "SendTask", "重复任务:" + taskId);
|
return true;
|
}
|
#endregion
|
MainTask task = new MainTask()
|
{
|
taskno = taskId.ToString(),
|
wmsTaskId = wmsTaskId,
|
containertype = containerType,
|
taskcode = NumberHelp.GenerateRandomCodeForMainTask(),
|
decompositiontimes = 0,
|
decompositiontime = DateTime.Now,
|
deliverytype = 0,
|
priority = 1,//默认为1,原先是100 【EditBy shaocx,2022-10-21】
|
sendtime = DateTime.Now,
|
sourceplace = sourcePlce,
|
toplace = toPlace,
|
tasktype = taskType,
|
status = 0,//EMainTaskStatus.未分解
|
finishstatus = 0,//,使用枚举 EMainTaskFinishstatus
|
heighttype = height,
|
storageno = storageno,
|
containername = containerName
|
|
};
|
db.MainTasks.Add(task);
|
|
if (task.tasktype == (int)EMainTaskType.常规出库)//检查设备是否空闲再下发
|
{
|
LogTextHelper.WriteLog("C:/CCSLog/SendTask", this.ToString(), "SendTask", "收到出库任务id={0},sourcePlce={1},toPlace={2},taskType={3}", taskId, sourcePlce, toPlace, taskType);
|
var chaitask = db.PartTasks.OrderBy(x => x.updatetime).FirstOrDefault(x => x.eqtype == (int)EPartTaskType.堆垛机任务 && x.isfinished == (int)EYesOrNo.否 && x.storageno == storageno && x.maintasktype == (int)EMainTaskType.常规出库);
|
if (chaitask != null && chaitask.id > 0)
|
{
|
var mainTask = db.MainTasks.Where(x => x.id == chaitask.maintaskid).FirstOrDefault();//增加显示WCS任务号 [EditBy shaocx,2022-09-26]
|
LogTextHelper.WriteLog("C:/CCSLog/SendTask", this.ToString(), "SendTask", "收到出库任务id={0},出库任务不满足", taskId);
|
errMsg = "收到出库任务id" + taskId + ",出库任务不满足,前面有未结束的堆垛机任务,未结束的WCS任务号:" + mainTask.taskno;
|
return false;
|
}
|
}
|
if (task.tasktype == (int)EMainTaskType.入库拆盘)//检查设备是否空闲再下发
|
{
|
int eqqid = 0;
|
if (containerType == (int)EContainerType.大托盘)
|
{
|
eqqid = (int)EDeviceId.大盘拆盘机;
|
}
|
else
|
{
|
eqqid = (int)EDeviceId.小盘拆盘机;
|
}
|
LogTextHelper.WriteLog("C:/CCSLog/SendTask", this.ToString(), "SendTask", "收到拆盘任务id={0},sourcePlce={1},toPlace={2},taskType={3}", taskId, sourcePlce, toPlace, taskType);
|
var chaitask = db.PartTasks.OrderBy(x => x.updatetime).FirstOrDefault(x => x.eqtype == (int)EPartTaskType.拆叠机任务 && x.isfinished == (int)EYesOrNo.否 && x.eqid == eqqid && x.maintasktype == (int)EMainTaskType.入库拆盘);
|
if (chaitask != null && chaitask.id > 0)
|
{
|
var mainTask = db.MainTasks.Where(x => x.id == chaitask.maintaskid).FirstOrDefault();//增加显示WCS任务号 [EditBy shaocx,2022-09-26]
|
LogTextHelper.WriteLog("C:/CCSLog/SendTask", this.ToString(), "SendTask", "收到拆盘任务id={0},拆盘任务不满足", taskId);
|
errMsg = "收到拆盘任务id" + taskId + ",拆盘任务不满足,前面有未结束的任务,未结束的WCS任务号:" + mainTask.taskno;
|
return false;
|
}
|
}
|
|
if (task.tasktype == (int)EMainTaskType.常规入库)
|
{
|
task.heighttype = 0;
|
task.toplace = "0";
|
}
|
else
|
{
|
if (string.IsNullOrEmpty(toPlace))
|
{
|
LogTextHelper.WriteLog("C:/CCSLog/SendTask", this.ToString(), "SendTask", "toPlace为空");
|
errMsg = "目标位不能为空";
|
return false;
|
}
|
}
|
|
if (task.tasktype == (int)EMainTaskType.出库叠盘)
|
{
|
var chaitask = db.PartTasks.FirstOrDefault(x => x.toplace == task.sourceplace && x.maintasktype == task.tasktype && x.isfinished == 0);
|
if (chaitask != null)
|
{
|
LogTextHelper.WriteLog("C:/CCSLog/SendTask", this.ToString(), "SendTask", "存在chaitask");
|
errMsg = "已经存在出库叠盘任务";
|
return false;
|
}
|
}
|
|
if (task.tasktype == (int)EMainTaskType.空托出库 || task.tasktype == (int)EMainTaskType.满空托回库)
|
{
|
if (task.containertype == (int)EContainerType.小托盘)
|
{
|
if (task.tasktype == (int)EMainTaskType.空托出库)
|
{
|
var cdtask = db.ChaiDieTransports.FirstOrDefault(x => x.status == 0 && x.dev == (int)EDeviceId.小盘拆盘机);
|
if (cdtask != null)//代表已经开始执行
|
{
|
cdtask.status = 2;
|
}
|
}
|
else
|
{
|
var cdtask = db.ChaiDieTransports.FirstOrDefault(x => x.status == 0 && x.dev == (int)EDeviceId.小盘叠盘机);
|
if (cdtask != null)
|
{
|
cdtask.status = 2;
|
}
|
}
|
|
}
|
else
|
{
|
if (task.tasktype == (int)EMainTaskType.空托出库)
|
{
|
var cdtask = db.ChaiDieTransports.FirstOrDefault(x => x.status == 0 && x.dev == (int)EDeviceId.大盘拆盘机);
|
if (cdtask != null)
|
{
|
cdtask.status = 2;
|
}
|
}
|
else
|
{
|
var cdtask = db.ChaiDieTransports.FirstOrDefault(x => x.status == 0 && x.dev == (int)EDeviceId.大盘叠盘机);
|
if (cdtask != null)
|
{
|
cdtask.status = 2;
|
}
|
}
|
}
|
}
|
|
bool bl = db.SaveChanges() > 0 ? true : false;
|
if (!bl)
|
{
|
LogTextHelper.WriteLog("C:/CCSLog/SendTask", this.ToString(), "SendTask", "写入数据库失败!");
|
errMsg = "写入数据库失败";
|
}
|
return bl;
|
}
|
}
|
catch (Exception ex)
|
{
|
|
LogTextHelper.WriteLog("C:/CCSLog/SendTask", this.ToString(), "SendTask", ex.Message);
|
errMsg = "出现异常:" + ex.Message;
|
return false;
|
}
|
|
}
|
public static string GenerateRandomCode()
|
{
|
var result = new StringBuilder();
|
for (var i = 0; i < 5; i++)
|
{
|
var r = new Random(Guid.NewGuid().GetHashCode());
|
result.Append(r.Next(0, 10));
|
}
|
return result.ToString();
|
}
|
|
/// <summary>
|
/// 检查设备是否满足下发任务的条件
|
/// </summary>
|
/// <returns></returns>
|
private bool CheckDevIsOK(int type, int storageno, int contype, ref string errMsg)
|
{
|
bool b1 = false;
|
errMsg = "默认为FALSE";
|
//检验所有的设备是否在线
|
switch (type)
|
{
|
case (int)EMainTaskType.常规入库:
|
b1 = IsDevOk(1, storageno, contype, ref errMsg);
|
break;
|
case (int)EMainTaskType.空托出库:
|
b1 = IsDevOk(1, storageno, contype, ref errMsg);
|
break;
|
case (int)EMainTaskType.组盘出库:
|
b1 = IsDevOk(1, storageno, contype, ref errMsg);
|
break;
|
case (int)EMainTaskType.常规出库:
|
b1 = IsDevOk(2, storageno, contype, ref errMsg);
|
break;
|
case (int)EMainTaskType.余料回库:
|
b1 = IsDevOk(2, storageno, contype, ref errMsg);
|
break;
|
case (int)EMainTaskType.满空托回库:
|
b1 = IsDevOk(2, storageno, contype, ref errMsg);
|
break;
|
case (int)EMainTaskType.移库:
|
b1 = IsDevOk(3, storageno, contype, ref errMsg);
|
break;
|
case (int)EMainTaskType.出库叠盘:
|
b1 = IsDevOk(4, storageno, contype, ref errMsg);
|
break;
|
case (int)EMainTaskType.入库拆盘:
|
b1 = IsDevOk(5, storageno, contype, ref errMsg);
|
break;
|
default:
|
b1 = false;
|
errMsg = "任务类型不合法";
|
break;
|
|
}
|
return b1;
|
}
|
|
public bool IsDevOk(int type, int storageno, int contype, ref string errMsg)
|
{
|
|
bool bl = false;
|
errMsg = "默认返回FALSE";
|
var cy = CacheEntity.Conveyors.FirstOrDefault();
|
var srm1 = CacheEntity.Srms.FirstOrDefault(x => x.SrmName == "Srm1");
|
var srm2 = CacheEntity.Srms.FirstOrDefault(x => x.SrmName == "Srm2");
|
var rgv1 = CacheEntity.Rgvs.FirstOrDefault(x => x.RgvName == "Rgv1");
|
var rgv2 = CacheEntity.Rgvs.FirstOrDefault(x => x.RgvName == "Rgv2");
|
switch (type)
|
{
|
case 1:
|
|
#region 入库测检测设备
|
if (cy.IsOnline && rgv1.IsOnline)
|
{
|
if (storageno == 1)
|
{
|
if (srm1.IsOnline)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "1号堆垛机不在线";
|
}
|
|
}
|
else
|
{
|
if (srm2.IsOnline)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号堆垛机不在线";
|
}
|
}
|
}
|
else
|
{
|
bl = false;
|
errMsg = "输送线或1号RGV不在线";
|
}
|
//检验主要设备是否报警
|
if (!rgv1.RAlarm)
|
{
|
if (storageno == 1)
|
{
|
if (!srm1.RAlarm)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "1号堆垛机有报警";
|
}
|
|
}
|
else
|
{
|
if (!srm2.RAlarm)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号堆垛机有报警";
|
}
|
}
|
}
|
else
|
{
|
bl = false;
|
errMsg = "1号RGV有报警";
|
}
|
//检验主要设备模式是否正确
|
if (rgv1.RMode == (int)ERgvMode.连机自动模式)
|
{
|
if (storageno == 1)
|
{
|
if (srm1.RMode == (int)ESrmMode.自动模式)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "1号堆垛机是非自动模式";
|
}
|
|
}
|
else
|
{
|
if (srm2.RMode == (int)ESrmMode.自动模式)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号堆垛机是非自动模式";
|
}
|
}
|
}
|
else
|
{
|
bl = false;
|
errMsg = "1号RGV是非连机自动模式";
|
}
|
#endregion
|
break;
|
case 2:
|
|
#region 出库测检测设备
|
if (cy.IsOnline && rgv2.IsOnline)
|
{
|
if (storageno == 1)
|
{
|
if (srm1.IsOnline)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "1号堆垛机不在线";
|
}
|
|
}
|
else
|
{
|
if (srm2.IsOnline)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号堆垛机不在线";
|
}
|
}
|
}
|
else
|
{
|
bl = false;
|
errMsg = "输送线或2号RGV不在线";
|
}
|
//检验主要设备是否报警
|
if (!rgv2.RAlarm)
|
{
|
if (storageno == 1)
|
{
|
if (!srm1.RAlarm)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "1号堆垛机有报警";
|
}
|
|
}
|
else
|
{
|
if (!srm2.RAlarm)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号堆垛机有报警";
|
}
|
}
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号RGV有报警";
|
}
|
//检验主要设备模式是否正确
|
if (rgv2.RMode == (int)ERgvMode.连机自动模式)
|
{
|
if (storageno == 1)
|
{
|
if (srm1.RMode == (int)ESrmMode.自动模式)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "1号堆垛机是非自动模式";
|
}
|
|
}
|
else
|
{
|
if (srm2.RMode == (int)ESrmMode.自动模式)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号堆垛机是非自动模式";
|
}
|
}
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号RGV是非连机自动模式";
|
}
|
#endregion
|
break;
|
case 3:
|
|
#region 移库检测设备
|
if (storageno == 1)
|
{
|
if (srm1.IsOnline)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "1号堆垛机不在线";
|
}
|
|
}
|
else
|
{
|
if (srm2.IsOnline)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号堆垛机不在线";
|
}
|
}
|
|
//检验主要设备是否报警
|
|
if (storageno == 1)
|
{
|
if (!srm1.RAlarm)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "1号堆垛机有报警";
|
}
|
|
}
|
else
|
{
|
if (!srm2.RAlarm)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号堆垛机有报警";
|
}
|
}
|
|
//检验主要设备模式是否正确
|
|
if (storageno == 1)
|
{
|
if (srm1.RMode == (int)ESrmMode.自动模式)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "1号堆垛机是非自动模式";
|
}
|
|
}
|
else
|
{
|
if (srm2.RMode == (int)ESrmMode.自动模式)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号堆垛机是非自动模式";
|
}
|
}
|
#endregion
|
break;
|
case 4:
|
if (cy.IsOnline && rgv2.IsOnline)
|
{
|
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "输送线或2号RGV不在线";
|
}
|
//检验主要设备是否报警
|
if (!rgv2.RAlarm)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号RGV有报警";
|
}
|
//检验主要设备模式是否正确
|
if (rgv2.RMode == (int)ERgvMode.连机自动模式)
|
{
|
bl = true;
|
}
|
else
|
{
|
bl = false;
|
errMsg = "2号RGV是非连机自动模式";
|
}
|
if (contype == 1)
|
{
|
var cd1 = CacheEntity.ChaiDies.FirstOrDefault(x => x.ChaiDieName == "ChaiDei2");
|
string msg = "";
|
bl = cd1.CanSendTask(cd1.DeviceId, out msg);
|
if (bl == false) errMsg = "下发失败:" + msg;
|
}
|
else
|
{
|
var cd2 = CacheEntity.ChaiDies.FirstOrDefault(x => x.ChaiDieName == "ChaiDei1");
|
string msg = "";
|
bl = cd2.CanSendTask(cd2.DeviceId, out msg);
|
if (bl == false) errMsg = "下发失败:" + msg;
|
}
|
break;
|
case 5:
|
if (contype == 1)
|
{
|
var cd1 = CacheEntity.ChaiDies.FirstOrDefault(x => x.ChaiDieName == "ChaiDei3");
|
string msg = "";
|
bl = cd1.CanSendTask(cd1.DeviceId, out msg);
|
if (bl == false) errMsg = "下发失败:" + msg;
|
}
|
else
|
{
|
var cd2 = CacheEntity.ChaiDies.FirstOrDefault(x => x.ChaiDieName == "ChaiDei4");
|
string msg = "";
|
bl = cd2.CanSendTask(cd2.DeviceId, out msg);
|
if (bl == false) errMsg = "下发失败:" + msg;
|
}
|
break;
|
}
|
|
return bl;
|
}
|
|
/// <summary>
|
/// 获取任务是否完成(0带表未完成;1代表完成;2代表外形检测不通过)
|
/// </summary>
|
/// <param name="taskId"></param>
|
/// <param name="wmsTaskId">WMS任务ID</param>
|
/// <returns></returns>
|
public int GetTaskIsFinishOrCheckOk(int taskId, int wmsTaskId)
|
{
|
try
|
{
|
using (DbModel db = new DbModel())
|
{
|
string taskid = taskId.ToString();
|
MainTask maintask = null;
|
if (wmsTaskId != 0)
|
{
|
maintask = db.MainTasks.Where(x => x.taskno == taskid && x.wmsTaskId == wmsTaskId).OrderByDescending(x => x.id).FirstOrDefault();
|
}
|
else
|
{
|
maintask = db.MainTasks.Where(x => x.taskno == taskid).OrderByDescending(x => x.id).FirstOrDefault();
|
}
|
if (maintask != null)
|
{
|
#region 判定空托出库或者满盘回库的任务是否完成,完成的话则不再主动发送需要空头或满托的接口
|
//,使用枚举 EMainTaskFinishstatus
|
if (maintask.finishstatus == 1 && (maintask.tasktype == (int)EMainTaskType.空托出库 || maintask.tasktype == (int)EMainTaskType.满空托回库))
|
{
|
ChaiDieTransport cdt = new ChaiDieTransport();
|
if (maintask.tasktype == (int)EMainTaskType.空托出库)
|
{
|
if (maintask.containertype == (int)EContainerType.小托盘)
|
{
|
cdt = db.ChaiDieTransports.FirstOrDefault(x => x.status == 0 && x.dev == (int)EDeviceId.小盘拆盘机);
|
}
|
else
|
{
|
cdt = db.ChaiDieTransports.FirstOrDefault(x => x.status == 0 && x.dev == (int)EDeviceId.大盘拆盘机);
|
}
|
}
|
else
|
{
|
if (maintask.containertype == (int)EContainerType.小托盘)
|
{
|
cdt = db.ChaiDieTransports.FirstOrDefault(x => x.status == 0 && x.dev == (int)EDeviceId.小盘叠盘机);
|
}
|
else
|
{
|
cdt = db.ChaiDieTransports.FirstOrDefault(x => x.status == 0 && x.dev == (int)EDeviceId.大盘叠盘机);
|
}
|
}
|
if (cdt != null && cdt.id > 0)
|
{
|
cdt.status = 2;
|
db.SaveChanges();
|
}
|
}
|
#endregion
|
|
return maintask.finishstatus;//,使用枚举 EMainTaskFinishstatus
|
}
|
else
|
{
|
return 0;
|
}
|
|
}
|
}
|
catch (Exception ex)
|
{
|
|
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "GetTaskIsFinishOrCheckOk", ex.Message);
|
return 0;
|
}
|
}
|
|
public BackData GetCheckIsNeedOrSendcontainer()
|
{
|
try
|
{
|
using (DbModel db = new DbModel())
|
{
|
|
var task = db.ChaiDieTransports.OrderBy(x => x.updatetime).ToList().FirstOrDefault(x => x.status == 0);
|
if (task != null)
|
{
|
task.updatetime = DateTime.Now;
|
db.SaveChanges();
|
int containertype = 1;
|
if (task.devname == "小盘拆盘机" || task.devname == "小盘叠盘机")
|
{
|
containertype = 1;
|
}
|
else
|
{
|
containertype = 2;
|
}
|
return new BackData()
|
{
|
ContainerType = containertype,
|
DevId = task.dev,
|
DevName = task.devname,
|
Type = task.type,
|
Id = task.id
|
};
|
}
|
else
|
{
|
return null;
|
}
|
|
}
|
}
|
catch (Exception ex)
|
{
|
|
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "GetCheckIsNeedOrSendcontainer", ex.Message);
|
return null;
|
}
|
}
|
/// <summary>
|
/// 删除所有任务
|
/// </summary>
|
/// <param name="containerName"></param>
|
/// <returns></returns>
|
public bool DealAllPartTask(string containerName)
|
{
|
try
|
{
|
using (DbModel db = new DbModel())
|
{
|
bool b1 = false;
|
string msg = "";
|
var task = db.PartTasks.Where(x => x.containername == containerName && x.isfinished == 0).ToList();
|
if (task != null && task.Count > 0)
|
{
|
|
task.ForEach(x =>
|
{
|
if (x.eqtype == (int)EPartTaskType.堆垛机任务 && x.isreleased == 1)
|
{
|
var srm = CacheEntity.Srms.FirstOrDefault(y => y.DeviceId == x.eqid);
|
if (srm.RAlarm || srm.RMode != (int)ESrmMode.自动模式)
|
{
|
b1 = srm.SendDelTask(x.eqid, int.Parse(x.taskcode), out msg);
|
if (!b1)
|
{
|
b1 = srm.SendDelTask(x.eqid, int.Parse(x.taskcode), out msg);
|
}
|
}
|
else
|
{
|
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "DealAllPartTask", "设备任务删除失败,只有设备报警或者非自动才允许删除");
|
}
|
}
|
else
|
{
|
b1 = true;
|
}
|
if (x.eqtype == (int)EPartTaskType.Rgv任务 && x.isreleased == 1)
|
{
|
|
var rgv = CacheEntity.Rgvs.FirstOrDefault(y => y.DeviceId == x.eqid);
|
if (rgv.RAlarm || rgv.RMode != (int)ERgvMode.连机自动模式)
|
{
|
b1 = rgv.DeleteTask(x.eqid, int.Parse(x.taskcode), out msg);
|
if (!b1)
|
{
|
b1 = rgv.DeleteTask(x.eqid, int.Parse(x.taskcode), out msg);
|
}
|
}
|
else
|
{
|
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "DealAllPartTask", "设备任务删除失败,只有设备报警或者非自动才允许删除");
|
}
|
}
|
else
|
{
|
b1 = true;
|
}
|
if (x.eqtype == (int)EPartTaskType.输送线任务 && x.isreleased == 1)
|
{
|
string name = "Line" + x.sourceplace;
|
var conve = CacheEntity.Conveyors.FirstOrDefault(y => y.ConveyorName == name);
|
b1 = conve.DeleteTask(x.eqid, out msg);
|
if (!b1)
|
{
|
b1 = conve.DeleteTask(x.eqid, out msg);
|
}
|
|
string toname = "";
|
if (x.sourceplace == "1008" || x.sourceplace == "1003" || x.sourceplace == "1001")
|
{
|
toname = "Line" + x.sourceplace;
|
}
|
else
|
{
|
if (x.toplace == "1011" || x.toplace == "1005")//此两处要判断的是后一位的位置的光电信号
|
{
|
toname = "Line" + (int.Parse(x.toplace) + 1).ToString();
|
}
|
else
|
{
|
toname = "Line" + x.toplace;
|
}
|
}
|
var TConveyor = CacheEntity.Conveyors.FirstOrDefault(y => y.ConveyorName == toname);
|
if (TConveyor.RTaskNo == int.Parse(x.taskcode))
|
{
|
if (!TConveyor.DeleteTask(x.eqid, out msg))
|
{
|
TConveyor.DeleteTask(x.eqid, out msg);
|
}
|
}
|
|
}
|
else
|
{
|
b1 = true;
|
}
|
if (b1)
|
{
|
x.isreleased = 1;
|
x.isfinished = 1;
|
x.nexthandel = (int)ENextHandelTask.已全部完成;
|
x.filereason = "任务已经被强制删除!";
|
}
|
});
|
if (b1)
|
{
|
var maintask = db.MainTasks.OrderByDescending(x => x.id).FirstOrDefault(x => x.containername == containerName);
|
if (maintask != null && maintask.id > 0)
|
{
|
maintask.status = 1;//EMainTaskStatus.已分解,使用枚举 EMainTaskFinishstatus
|
maintask.finishstatus = 1;
|
maintask.decompositiontimes = 1;
|
}
|
db.SaveChanges();
|
return true;
|
}
|
else
|
{
|
return false;
|
}
|
}
|
else
|
{
|
return false;
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
|
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "DealPartTask", ex.Message);
|
return false;
|
}
|
}
|
|
/// <summary>
|
/// 设置主任务任务权重
|
/// </summary>
|
/// <param name="taskno"></param>
|
/// <param name="priority"></param>
|
/// <returns></returns>
|
public bool SetMainTaskPriority(string taskno, int priority, int wmsTaskId)
|
{
|
try
|
{
|
using (DbModel db = new DbModel())
|
{
|
MainTask task = null;
|
if (wmsTaskId != 0)
|
{
|
task = db.MainTasks.Where(x => x.taskno == taskno && x.wmsTaskId == wmsTaskId).OrderByDescending(x => x.sendtime).FirstOrDefault();
|
}
|
else
|
{
|
task = db.MainTasks.Where(x => x.taskno == taskno).OrderByDescending(x => x.sendtime).FirstOrDefault();
|
}
|
|
if (task == null)
|
{
|
return false;
|
}
|
task.priority = priority;
|
if (db.SaveChanges() < 1)
|
{
|
Thread.Sleep(1000);
|
db.SaveChanges();
|
}
|
|
return true;
|
}
|
}
|
catch
|
{
|
return false;
|
}
|
}
|
/// <summary>
|
/// 设置子任务任务权重
|
/// </summary>
|
/// <param name="taskcode"></param>
|
/// <param name="priority"></param>
|
/// <returns></returns>
|
public bool SetPartTaskPriority(string taskcode, int priority)
|
{
|
try
|
{
|
using (DbModel db = new DbModel())
|
{
|
var task = db.PartTasks.Where(x => x.taskcode == taskcode).OrderByDescending(x => x.createtime).FirstOrDefault();
|
if (task == null)
|
{
|
return false;
|
}
|
task.priority = priority;
|
if (db.SaveChanges() < 1)
|
{
|
Thread.Sleep(1000);
|
db.SaveChanges();
|
}
|
|
return true;
|
}
|
}
|
catch
|
{
|
return false;
|
}
|
}
|
|
/// <summary>
|
/// 处理任务
|
/// </summary>
|
/// <param name="taskId">要处理的子任务号</param>
|
/// <param name="type">处理类型(1:强制完成;2:删除任务)</param>
|
/// <returns></returns>
|
public bool DealPartTask(int taskId, int type)
|
{
|
try
|
{
|
using (DbModel db = new DbModel())
|
{
|
|
var task = db.PartTasks.FirstOrDefault(x => x.id == taskId);
|
if (task != null)
|
{
|
if (type == 1)
|
{
|
task.isreleased = 1;
|
task.isfinished = 1;
|
if (task.nexthandel == (int)ENextHandelTask.已全部完成)
|
{
|
var maintask = db.MainTasks.OrderByDescending(x => x.id).FirstOrDefault(x => x.id == task.maintaskid);
|
if (maintask != null)
|
{
|
maintask.finishstatus = 1;//,使用枚举 EMainTaskFinishstatus
|
}
|
}
|
}
|
else if (type == 2)
|
{
|
db.PartTasks.Remove(task);
|
}
|
db.SaveChanges();
|
return true;
|
}
|
else
|
{
|
return false;
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
|
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "DealPartTask", ex.Message);
|
return false;
|
}
|
}
|
|
internal List<DevAlert> GetDevAlert(int pageIndex, int pagecount, out int totalNum, Dictionary<string, string> parm)
|
{
|
try
|
{
|
using (DbModel db = new DbModel())
|
{
|
var sqlParamsCount = new List<SqlParameter>();
|
var sqlParamsData = new List<SqlParameter>();
|
string sqlCount = "SELECT COUNT(*) FROM DevAlert WHERE 1=1";
|
string sqlData = "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY finishtime desc ) AS ROWNUM from DevAlert where 1=1";
|
if (parm.Count > 0)
|
{
|
if (!parm.Keys.Contains("?"))
|
{
|
foreach (var key in parm.Keys)
|
{
|
if (parm[key] != null && !string.IsNullOrEmpty(parm[key] + ""))
|
{
|
sqlParamsCount.Add(new SqlParameter("@S_" + key, "%" + parm[key] + "%"));
|
sqlParamsData.Add(new SqlParameter("@S_" + key, "%" + parm[key] + "%"));
|
sqlCount += string.Format(" AND {0} LIKE {1}", key, "@S_" + key);
|
sqlData += string.Format(" AND {0} LIKE {1}", key, "@S_" + key);
|
}
|
}
|
}
|
|
}
|
pageIndex = pageIndex < 1 ? 1 : pageIndex;
|
pagecount = pagecount < 1 ? 10 : pagecount;
|
sqlParamsData.Add(new SqlParameter("@PI_Start", (pageIndex - 1) * pagecount + 1));
|
sqlParamsData.Add(new SqlParameter("@PI_End", pageIndex * pagecount));
|
sqlData += string.Format(") t Where t.ROWNUM between {0} and {1} ", "@PI_Start", "@PI_End");
|
totalNum = db.Database.SqlQuery<int>(sqlCount, sqlParamsCount.ToArray()).ToList()[0];
|
var datas = db.Database.SqlQuery<DevAlert>(sqlData, sqlParamsData.ToArray()).ToList();
|
if (datas != null)
|
{
|
|
return datas;
|
}
|
else
|
{
|
return new List<DevAlert>();
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
totalNum = 0;
|
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "GetDevAlert", ex.Message);
|
return new List<DevAlert>();
|
}
|
}
|
|
internal List<PartTask> GetPartTask(int pageIndex, int pagecount, out int totalNum, Dictionary<string, string> parm)
|
{
|
try
|
{
|
using (DbModel db = new DbModel())
|
{
|
var sqlParamsCount = new List<SqlParameter>();
|
var sqlParamsData = new List<SqlParameter>();
|
string sqlCount = "SELECT COUNT(*) FROM PartTask WHERE 1=1";
|
string sqlData = "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY maintaskid ) AS ROWNUM from PartTask where 1=1";
|
if (parm.Count > 0)
|
{
|
if (!parm.Keys.Contains("?"))
|
{
|
foreach (var key in parm.Keys)
|
{
|
if (parm[key] != null && !string.IsNullOrEmpty(parm[key] + ""))
|
{
|
sqlParamsCount.Add(new SqlParameter("@S_" + key, "%" + parm[key] + "%"));
|
sqlParamsData.Add(new SqlParameter("@S_" + key, "%" + parm[key] + "%"));
|
sqlCount += string.Format(" AND {0} LIKE {1}", key, "@S_" + key);
|
sqlData += string.Format(" AND {0} LIKE {1}", key, "@S_" + key);
|
}
|
}
|
}
|
}
|
pageIndex = pageIndex < 1 ? 1 : pageIndex;
|
pagecount = pagecount < 1 ? 10 : pagecount;
|
sqlParamsData.Add(new SqlParameter("@PI_Start", (pageIndex - 1) * pagecount + 1));
|
sqlParamsData.Add(new SqlParameter("@PI_End", pageIndex * pagecount));
|
sqlData += string.Format(") t Where t.ROWNUM between {0} and {1} ", "@PI_Start", "@PI_End");
|
totalNum = db.Database.SqlQuery<int>(sqlCount, sqlParamsCount.ToArray()).ToList()[0];
|
var datas = db.Database.SqlQuery<PartTask>(sqlData, sqlParamsData.ToArray()).ToList();
|
if (datas != null)
|
{
|
|
return datas;
|
}
|
else
|
{
|
return new List<PartTask>();
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
totalNum = 0;
|
LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "GetPartTask", ex.Message);
|
return new List<PartTask>();
|
}
|
}
|
}
|
}
|