using HH.WCS.ZhongCeJinTan.device;
|
using HH.WCS.ZhongCeJinTan.dispatch;
|
using HH.WCS.ZhongCeJinTan.util;
|
using Newtonsoft.Json;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using System.Web.Services.Description;
|
using System.Xml.Linq;
|
using static HH.WCS.ZhongCeJinTan.util.Settings;
|
using static HH.WCS.ZhongCeJinTan.wms.WcsModel;
|
|
namespace HH.WCS.ZhongCeJinTan.wms
|
{
|
internal class TaskHelper
|
{
|
internal static string GenerateTaskNo() {
|
var date = DateTime.Now.ToString("yyMMdd");
|
var id = SYSHelper.GetSerialNumber("任务号", "TN" + date);
|
return $"TN{date}{id.ToString().PadLeft(4, '0')}";
|
}
|
|
internal static string GenerateTrayNo()
|
{
|
var id = SYSHelper.GetSerialNumber("托盘号", "TP");
|
var date = DateTime.Now.ToString("yyMMdd");
|
return $"TP{date}{id.ToString().PadLeft(4, '0')}";
|
}
|
|
internal static bool UpdateStatus(WMSTask task, string status) {
|
var res = false;
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
task.S_B_STATE = status;
|
task.N_B_STATE = 1;
|
db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE,it.N_B_STATE }).ExecuteCommand();
|
return res;
|
}
|
|
|
|
|
|
internal static WMSTask GetTask(string no) {
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_CODE.Trim() == no).First();
|
return task;
|
}
|
|
//查找WCS立库任务 参数作业编码,调度类型 agv/wcs
|
internal static WMSTask GetTaskByWorkNo(string no,string type)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_OP_CODE == no && a.S_SCHEDULE_TYPE== type).First();
|
return task;
|
}
|
|
|
internal static WmsWork GetWmsWork(string no) {
|
var db = new SqlHelper<WmsWork>().GetInstance();
|
return db.Queryable<WmsWork>().Where(it => it.S_CODE == no).First();
|
}
|
|
|
|
internal static WMSTask GetTaskByCntrCode(string cntrCode)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_CNTR_CODE.Trim() == cntrCode && a.S_B_STATE!= "取消" && a.S_B_STATE != "失败").First();
|
return task;
|
}
|
|
|
|
internal static List<WMSTask> GetTask()
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
|
return db.Queryable<WMSTask>().Where(b => b.S_B_STATE == "已推送" || b.S_B_STATE == "执行中" || b.S_B_STATE == "完成" || b.S_B_STATE == "取消").OrderByDescending(a => a.T_CREATE).ToList();
|
}
|
|
internal static WMSTask GetTaskByKwName(string kwName,bool flag,int gzId)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = new WMSTask();
|
if (flag)
|
{
|
//起点库位名称
|
//task = db.Queryable<WMSTask>().Where(a => a.stratKwName==kwName && a.GZ_ID==gzId && a.S_B_STATE != "取消" && a.S_B_STATE != "失败" ).OrderByDescending(b=> b.T_CREATE).First();
|
}
|
else {
|
//终点库位名称
|
//task = db.Queryable<WMSTask>().Where(a => a.endKwName == kwName && a.GZ_ID == gzId && a.S_B_STATE != "取消" && a.S_B_STATE != "失败" ).OrderByDescending(b => b.T_CREATE).First();
|
}
|
|
|
return task;
|
}
|
|
|
|
|
|
/// <summary>
|
/// 查找起点有执行的任务
|
/// </summary>
|
/// <param name="loc"></param>
|
/// <returns></returns>
|
internal static WMSTask GetTaskByStartLoc(string loc)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_START_LOC == loc && a.S_B_STATE != "完成" && a.S_B_STATE != "取消" && a.S_B_STATE != "失败" && a.S_B_STATE != "已完成").OrderByDescending(b => b.T_CREATE).First();
|
return task;
|
}
|
/// <summary>
|
/// 查找终点有执行的任务
|
/// </summary>
|
/// <param name="loc"></param>
|
/// <returns></returns>
|
internal static WMSTask GetTaskByEndLoc(string loc)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_END_LOC == loc && a.S_B_STATE != "完成" && a.S_B_STATE != "取消" && a.S_B_STATE != "失败" && a.S_B_STATE != "已完成").OrderByDescending(b => b.T_CREATE).First();
|
return task;
|
}
|
|
internal static List<WMSTask> GetTask(long start, long end) {
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var tasks = db.Queryable<WMSTask>().Where(a => SqlFunc.Between(SqlFunc.ToInt64(SqlFunc.Substring(a.S_CODE, 2, a.S_CODE.Length)), start, end)).ToList();
|
return tasks;
|
}
|
|
|
internal static List<WMSTask> GetTaskByStart(string bit) {
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_START_LOC.Trim() == bit.Trim()).ToList();
|
return task;
|
}
|
internal static List<WMSTask> GetTaskByEnd(string bit) {
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_END_LOC.Trim() == bit.Trim()).ToList();
|
return task;
|
}
|
internal static List<WMSTask> GetTaskByType(string taskType) {
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_TYPE.Trim() == taskType).ToList();
|
}
|
internal static bool CreateTask(string no, string from, string to, string taskType, int pri, string cntrInfo, int cntrCount = 1, int startLayer = 1, int endLayer = 1) {
|
var fromLoc = LocationHelper.GetLocOne(from);
|
var endLoc = LocationHelper.GetLocOne(to);
|
|
WMSTask wmsTask = new WMSTask() {
|
S_CODE = GenerateTaskNo(),
|
S_START_AREA = fromLoc.S_AREA_CODE,
|
S_END_AREA = endLoc.S_AREA_CODE,
|
S_START_LOC = from,
|
S_END_LOC = to,
|
S_TYPE = taskType,
|
N_PRIORITY = pri,
|
S_B_STATE = "未执行",
|
S_CNTR_CODE = cntrInfo,
|
S_START_SITE_LAYER = startLayer,
|
S_END_SITE_LAYER = endLayer,
|
N_CNTR_COUNT = cntrCount,
|
};
|
LogHelper.Info("任务创建:" + JsonConvert.SerializeObject(wmsTask),"任务");
|
return CreateTask(wmsTask);
|
}
|
|
|
/// <summary>
|
/// 根据作业创建对应任务
|
/// </summary>
|
/// <param name="operation">作业模型</param>
|
public static void CreateTask(WmsWork operation)
|
{
|
// 根据任务类型创建不同的任务
|
switch (operation.N_TYPE)
|
{
|
case 0:
|
//钢丝 纤维满托出一段任务
|
CreateOneTask(operation);
|
break;
|
case 1:
|
//入库两段任务
|
CreateInTowTask(operation);
|
break;
|
case 2:
|
//85纤维 95钢丝一段任务入三层货架
|
if (operation.TOOLSTYPE == "85" || operation.TOOLSTYPE == "95")
|
{
|
CreateOneTask(operation);
|
}
|
else
|
{
|
//半桶回库二段任务入立库区
|
CreateInTowTask(operation);
|
}
|
break;
|
case 3:
|
//空托入库作业,没接驳位就一段任务
|
if (string.IsNullOrEmpty(operation.CONNECTION))
|
{
|
CreateOneTask(operation);
|
}
|
else {
|
CreateInTowTask(operation);
|
}
|
|
break;
|
case 4:
|
//胎面呼叫空托出库两段任务
|
CreateOutTowTask(operation);
|
break;
|
case 5:
|
//钢丝 纤维空托出一段任务
|
CreateOneTask(operation);
|
break;
|
case 7:
|
//出库两段任务
|
CreateOutTowTask(operation);
|
break;
|
case 9:
|
//85纤维 95钢丝一段任务从三层货架取
|
if (operation.TOOLSTYPE == "85" || operation.TOOLSTYPE == "95")
|
{
|
CreateOneTask(operation);
|
}
|
else {
|
//呼叫胶料出库两段任务
|
CreateOutTowTask(operation);
|
}
|
break;
|
case 12:
|
CreateOneTask(operation);
|
break;
|
case 20:
|
CreateOneTask(operation);
|
break;
|
}
|
}
|
|
|
/// <summary>
|
/// 创建一条任务
|
/// </summary>
|
/// <param name="operation"></param>
|
private static void CreateOneTask(WmsWork operation)
|
{
|
var tasks = new List<Task>();
|
|
|
|
// 任务1
|
var task1 = new WMSTask()
|
{
|
// 作业编码
|
S_OP_CODE = operation.S_CODE,
|
// 任务号
|
S_CODE = operation.S_CODE + "_1",
|
// 任务类型
|
N_TYPE = operation.N_TYPE,
|
// 任务类型
|
S_TYPE = operation.S_TYPE,
|
// 起点货位
|
S_START_LOC = operation.S_START_LOC,
|
// 起点库区
|
S_START_AREA = operation.S_START_AREA,
|
//起点库区名称
|
S_START_AREA_NAME = operation.S_START_AREA_NAME,
|
//终点库区名称
|
S_END_AREA_NAME = operation.S_END_AREA_NAME,
|
// 终点货位
|
S_END_LOC = operation.S_END_LOC,
|
// 终点库区
|
S_END_AREA = operation.S_END_AREA,
|
// 设备类型
|
N_SCHEDULE_TYPE = 1,
|
// 设备类型
|
S_SCHEDULE_TYPE = "agv",
|
// 容器编码
|
S_CNTR_CODE = operation.S_CNTR_CODE,
|
//任务状态
|
S_B_STATE = "未执行",
|
// 优先级
|
N_PRIORITY = operation.N_PRIORITY,
|
//工装类型
|
TOOLSTYPE = operation.TOOLSTYPE,
|
|
|
|
|
};
|
|
try
|
{
|
// 修改作业状态为执行中
|
operation.N_B_STATE = 1;
|
operation.S_B_STATE = "执行";
|
|
if (CreateTask(task1))
|
{
|
LocationHelper.LockLoc(operation.S_START_LOC, "出库锁", 2);
|
LocationHelper.LockLoc(operation.S_END_LOC, "入库锁", 1);
|
LogHelper.Info($"任务{task1.S_OP_CODE}创建成功", "任务");
|
var db = new SqlHelper<object>().GetInstance();
|
db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
|
}
|
else {
|
LogHelper.Info($"任务{task1.S_OP_CODE}创建失败", "任务");
|
}
|
|
}
|
catch (Exception e)
|
{
|
LogHelper.Info("CreateOneTask异常信息" + e.Message, "任务");
|
throw;
|
}
|
}
|
|
/// <summary>
|
/// 创建两条任务(两段任务)
|
/// </summary>
|
/// <param name="operation"></param>
|
private static void CreateInTowTask(WmsWork operation)
|
{
|
|
var ConnectionLoc = LocationHelper.GetLocOne(operation.CONNECTION);
|
|
|
// 任务1
|
var task1 = new WMSTask()
|
{
|
// 作业编码
|
S_OP_CODE = operation.S_CODE,
|
// 任务号
|
S_CODE = operation.S_CODE+"_1",
|
// 任务类型
|
N_TYPE = operation.N_TYPE,
|
// 任务类型
|
S_TYPE = operation.S_TYPE,
|
// 起点货位
|
S_START_LOC = operation.S_START_LOC,
|
// 起点库区
|
S_START_AREA = operation.S_START_AREA,
|
// 终点货位
|
S_END_LOC = operation.CONNECTION,
|
// 终点库区
|
S_END_AREA = ConnectionLoc.S_AREA_CODE,
|
// 设备类型
|
N_SCHEDULE_TYPE = 2,
|
// 设备类型
|
S_SCHEDULE_TYPE = "agv",
|
// 容器编码
|
S_CNTR_CODE = operation.S_CNTR_CODE,
|
//任务状态
|
S_B_STATE = "未执行",
|
// 优先级
|
N_PRIORITY = operation.N_PRIORITY,
|
//工装类型
|
TOOLSTYPE = operation.TOOLSTYPE,
|
//起点库区名称
|
S_START_AREA_NAME = operation.S_START_AREA_NAME,
|
//终点库区名称
|
S_END_AREA_NAME = operation.CONNECTION_AREA,
|
|
};
|
|
// 任务2
|
var task2 = new WMSTask()
|
{
|
// 作业编码
|
S_OP_CODE = operation.S_CODE,
|
// 任务号
|
S_CODE = operation.S_CODE + "_2",
|
// 任务类型
|
N_TYPE = operation.N_TYPE,
|
// 任务类型
|
S_TYPE = operation.S_TYPE,
|
// 起点货位
|
S_START_LOC = operation.CONNECTION,
|
// 起点库区
|
S_START_AREA = ConnectionLoc.S_AREA_CODE,
|
// 终点货位
|
S_END_LOC = operation.S_END_LOC,
|
// 终点库区
|
S_END_AREA = operation.S_END_AREA,
|
// 设备类型
|
N_SCHEDULE_TYPE = 3,
|
// 设备类型
|
S_SCHEDULE_TYPE = "wcs",
|
// 容器编码
|
S_CNTR_CODE = operation.S_CNTR_CODE,
|
//任务状态
|
S_B_STATE = "未执行",
|
// 优先级
|
N_PRIORITY = operation.N_PRIORITY,
|
//工装类型
|
TOOLSTYPE = operation.TOOLSTYPE,
|
//起点库区名称
|
S_START_AREA_NAME = operation.CONNECTION_AREA,
|
//终点库区名称
|
S_END_AREA_NAME = operation.S_END_AREA_NAME,
|
};
|
|
try
|
{
|
// 修改作业状态为执行中
|
operation.N_B_STATE = 1;
|
operation.S_B_STATE = "执行";
|
|
if (CreateTask(task1) && CreateTask(task2))
|
{
|
LocationHelper.LockLoc(operation.S_START_LOC, "出库锁", 2);
|
LocationHelper.LockLoc(operation.S_END_LOC, "入库锁", 1);
|
LocationHelper.LockLoc(operation.CONNECTION, "其他锁", 3);
|
LogHelper.Info($"任务{task1.S_CODE},{task2.S_CODE}创建成功", "任务");
|
var db = new SqlHelper<object>().GetInstance();
|
db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
|
}
|
else
|
{
|
LogHelper.Info($"任务{task1.S_CODE},{task2.S_CODE}创建失败", "任务");
|
}
|
|
}
|
catch (Exception e)
|
{
|
LogHelper.Info("CreateOneTask异常信息" + e.Message, "任务");
|
throw;
|
}
|
}
|
|
private static void CreateOutTowTask(WmsWork operation)
|
{
|
|
var ConnectionLoc = LocationHelper.GetLocOne(operation.CONNECTION);
|
|
var count = LocationHelper.GetConnectionTaskCount(operation.CONNECTION);
|
LogHelper.Info($"CreateOneTask 作业:{operation.S_CODE},接驳位:{operation.CONNECTION},任务数量:{count}", "任务");
|
if (count<=2)
|
{
|
|
// 任务1
|
var task1 = new WMSTask()
|
{
|
// 作业编码
|
S_OP_CODE = operation.S_CODE,
|
// 任务号
|
S_CODE = operation.S_CODE + "_1",
|
// 任务类型
|
N_TYPE = operation.N_TYPE,
|
// 任务类型
|
S_TYPE = operation.S_TYPE,
|
// 起点货位
|
S_START_LOC = operation.S_START_LOC,
|
// 起点库区
|
S_START_AREA = operation.S_START_AREA,
|
// 终点货位
|
S_END_LOC = operation.CONNECTION,
|
// 终点库区
|
S_END_AREA = ConnectionLoc.S_AREA_CODE,
|
// 设备类型
|
N_SCHEDULE_TYPE = 2,
|
// 设备类型
|
S_SCHEDULE_TYPE = "wcs",
|
// 容器编码
|
S_CNTR_CODE = operation.S_CNTR_CODE,
|
//任务状态
|
S_B_STATE = "未执行",
|
// 优先级
|
N_PRIORITY = operation.N_PRIORITY,
|
//工装类型
|
TOOLSTYPE = operation.TOOLSTYPE,
|
//起点库区名称
|
S_START_AREA_NAME = operation.S_START_AREA_NAME,
|
//终点库区名称
|
S_END_AREA_NAME = operation.CONNECTION_AREA,
|
};
|
|
// 任务2
|
var task2 = new WMSTask()
|
{
|
// 作业编码
|
S_OP_CODE = operation.S_CODE,
|
// 任务号
|
S_CODE = operation.S_CODE + "_2",
|
// 任务类型
|
N_TYPE = operation.N_TYPE,
|
// 任务类型
|
S_TYPE = operation.S_TYPE,
|
// 起点货位
|
S_START_LOC = operation.CONNECTION,
|
// 起点库区
|
S_START_AREA = ConnectionLoc.S_AREA_CODE,
|
// 终点货位
|
S_END_LOC = operation.S_END_LOC,
|
// 终点库区
|
S_END_AREA = operation.S_END_AREA,
|
// 设备类型
|
N_SCHEDULE_TYPE = 3,
|
// 设备类型
|
S_SCHEDULE_TYPE = "agv",
|
// 容器编码
|
S_CNTR_CODE = operation.S_CNTR_CODE,
|
//任务状态
|
S_B_STATE = "未执行",
|
// 优先级
|
N_PRIORITY = operation.N_PRIORITY,
|
//工装类型
|
TOOLSTYPE = operation.TOOLSTYPE,
|
//起点库区名称
|
S_START_AREA_NAME = operation.CONNECTION_AREA,
|
//终点库区名称
|
S_END_AREA_NAME = operation.S_END_AREA_NAME,
|
};
|
|
try
|
{
|
// 修改作业状态为执行中
|
operation.N_B_STATE = 1;
|
operation.S_B_STATE = "执行";
|
|
if (CreateTask(task1) && CreateTask(task2))
|
{
|
//LocationHelper.LockLoc(operation.S_START_LOC, "出库锁", 2);
|
//LocationHelper.LockLoc(operation.S_END_LOC, "入库锁", 1);
|
//LocationHelper.LockLoc(operation.CONNECTION, "入库锁", 1);
|
LogHelper.Info($"任务{task1.S_CODE},{task2.S_CODE}创建成功", "任务");
|
var db = new SqlHelper<object>().GetInstance();
|
db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
|
}
|
else
|
{
|
LogHelper.Info($"任务{task1.S_CODE},{task2.S_CODE}创建失败", "任务");
|
}
|
|
}
|
catch (Exception e)
|
{
|
LogHelper.Info("CreateOneTask异常信息" + e.Message, "任务");
|
throw;
|
}
|
}
|
|
|
|
}
|
|
|
internal static bool CheckExist(string no) {
|
return GetTask(no.Trim()) != null;
|
}
|
internal static bool UpdateStatus(string no, string status) {
|
var res = false;
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_CODE.Trim() == no).First();
|
//if (task != null) {
|
task.S_B_STATE = status;
|
//需要判断任务是否失败或者已完成,不允许再修改
|
res = db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand() > 0;
|
//}
|
return res;
|
}
|
internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData = "0") {
|
var db = new SqlHelper<WmsTaskAction>().GetInstance();
|
var action = new WmsTaskAction() {
|
S_ACTION = state.ToString(),
|
N_ACTION_CODE = state,
|
S_TASK_CODE = no,
|
S_EQ_CODE = forkliftNo,
|
S_EQ_TYPE = "agv",
|
S_DATA = extData
|
};
|
return db.Insertable(action).ExecuteCommand() > 0;
|
}
|
internal static WmsTaskAction GetActionRecord(string taskNo,string action)
|
{
|
var db = new SqlHelper<WmsTaskAction>().GetInstance();
|
|
var ac = db.Queryable<WmsTaskAction>().Where(a => a.S_TASK_CODE == taskNo && a.S_ACTION == action).First();
|
|
return ac;
|
}
|
|
/// <summary>
|
/// 任务拦截
|
/// </summary>
|
/// <param name="task"></param>
|
/// <returns></returns>
|
internal static bool Intercept()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
|
var model = db.Queryable<ManualTaskSwitch>().First();
|
if (model != null && model.State == "Y")
|
{
|
return false;
|
}
|
else
|
{
|
return true;
|
}
|
|
}
|
|
|
internal static bool WcsAddActionRecord(string no, string state, string forkliftNo, string extData = "0")
|
{
|
var db = new SqlHelper<WmsTaskAction>().GetInstance();
|
var action = new WmsTaskAction()
|
{
|
S_ACTION = state.ToString(),
|
N_ACTION_CODE = int.Parse(state),
|
S_TASK_CODE = no,
|
S_EQ_CODE = forkliftNo,
|
S_EQ_TYPE = "wcs",
|
S_DATA = extData
|
};
|
return db.Insertable(action).ExecuteCommand() > 0;
|
}
|
|
|
|
|
internal static bool CheckActionRecordExist(string no, string code) {
|
var db = new SqlHelper<WmsTaskAction>().GetInstance();
|
return db.Queryable<WmsTaskAction>().Count(a => a.S_TASK_CODE.Trim() == no.Trim() && a.S_ACTION == code) > 0;
|
}
|
//internal static void Begin(WMSTask task,string avgNo) {
|
// var db = new SqlHelper<WMSTask>().GetInstance();
|
// if (task != null) {
|
// if (task.S_B_STATE.Trim() == "已推送") {
|
// task.S_B_STATE = "执行中";
|
// task.T_START_TIME = DateTime.Now;
|
// task.S_EQ_NO = avgNo;
|
// db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE, it.T_START_TIME,it.S_EQ_NO }).ExecuteCommand();
|
// }
|
|
// }
|
//}
|
|
|
internal static WcsRfidCheckoutEntitys GetRfid(string TaskCode) {
|
var db = new SqlHelper<WcsRfidCheckoutEntitys>().GetInstance();
|
return db.Queryable<WcsRfidCheckoutEntitys>().Where(a=> a.S_TASK_NO== TaskCode).First();
|
}
|
|
|
|
|
|
internal static void Begin(WMSTask task, string avgNo="")
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
if (task != null)
|
{
|
if (task.N_B_STATE == 1)
|
{
|
task.N_B_STATE = 2;
|
task.S_B_STATE = WMSTask.GetStateStr(task.N_B_STATE);
|
task.S_EQ_NO = avgNo;
|
task.T_START_TIME = DateTime.Now;
|
db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_START_TIME,it.S_EQ_NO }).ExecuteCommand();
|
}
|
}
|
}
|
|
internal static void TmSafety(WMSTask wmsTask) {
|
|
safetyLocation safety1 = null;
|
if (wmsTask.S_TYPE.Contains("入库"))
|
{
|
safety1 = Settings.safetyLocations.Where(a => a.Area.Contains(wmsTask.S_START_AREA)).FirstOrDefault();
|
if (safety1 != null)
|
{
|
if (safety1.type==2)
|
{
|
var safety = Settings.TmDeviceInfos.Where(a => a.locCode.Contains(wmsTask.S_START_LOC)).FirstOrDefault();
|
if (safety != null)
|
{
|
LogHelper.Info($"胎面入库任务开始,任务号={wmsTask.S_CODE}需要和胎面机台交互,地址{safety.beginAddr}写入1", "胎面交互");
|
ModbusHelper.WriteSingleRegister(safety.beginAddr, 1);
|
}
|
}
|
}
|
}
|
else if (wmsTask.S_TYPE.Contains("出库"))
|
{
|
safety1 = Settings.safetyLocations.Where(a => a.Area.Contains(wmsTask.S_END_AREA)).FirstOrDefault();
|
if (safety1 != null)
|
{
|
if (safety1.type == 2)
|
{
|
var safety = Settings.TmDeviceInfos.Where(a => a.locCode.Contains(wmsTask.S_END_LOC)).FirstOrDefault();
|
if (safety != null)
|
{
|
LogHelper.Info($"胎面出库任务开始,任务号={wmsTask.S_CODE}需要和胎面机台交互,地址{safety.beginAddr}写入1", "胎面交互");
|
ModbusHelper.WriteSingleRegister(safety.beginAddr, 1);
|
}
|
}
|
}
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
internal static void End(WMSTask task)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
if (task != null)
|
{
|
task.N_B_STATE = 3;
|
task.S_B_STATE = WMSTask.GetStateStr(task.N_B_STATE);
|
task.T_END_TIME = DateTime.Now;
|
db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_END_TIME }).ExecuteCommand();
|
}
|
|
if (task.S_TYPE.Contains("出库") && task.S_SCHEDULE_TYPE.Contains("wcs")) {
|
LocationHelper.LockLoc(task.S_END_LOC, "出库锁", 2);
|
}
|
|
if (task.S_TYPE.Contains("出库") && task.S_SCHEDULE_TYPE.Contains("agv"))
|
{
|
var location = db.Queryable<Location>().Where(a => a.S_CODE == task.S_END_LOC).First();
|
location.N_CURRENT_NUM = 0;
|
db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
|
db.Deleteable<Container>().Where(it => it.S_CODE == task.S_CNTR_CODE).ExecuteCommand();
|
db.Deleteable<LocCntrRel>().Where(it => it.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
|
db.Deleteable<CntrItemRel>().Where(it => it.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
|
}
|
}
|
|
|
|
internal static void Fail(WMSTask task)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
if (task != null)
|
{
|
task.N_B_STATE = 5;
|
task.S_B_STATE = WMSTask.GetStateStr(task.N_B_STATE);
|
task.T_END_TIME = DateTime.Now;
|
db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE,it.T_END_TIME}).ExecuteCommand();
|
}
|
}
|
|
|
internal static bool CreateTask(WMSTask wmsTask) {
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
return db.Insertable(wmsTask).ExecuteCommand() > 0;
|
|
}
|
|
/// <summary>
|
/// 保存到mes任务记录
|
/// </summary>
|
/// <param name="task"></param>
|
/// <returns></returns>
|
//public bool SaveTask(MesTask task)
|
//{
|
// var db = new SqlHelper<MesTask>().GetInstance();
|
// try
|
// {
|
// db.BeginTran();
|
// if (db.Insertable(task).ExecuteCommand() > 0)
|
// {
|
// db.CommitTran();
|
// LogHelper.Info($"保存Mes任务{task.task_no}记录成功:","Mes任务下发");
|
// return true;
|
// }
|
// else {
|
// db.RollbackTran();
|
// LogHelper.Info($"保存Mes任务{task.task_no}记录失败:", "Mes任务下发");
|
// return false;
|
// }
|
// }
|
// catch (Exception ex)
|
// {
|
// db.RollbackTran();
|
// LogHelper.Info($"保存Mes任务{task.task_no}记录异常:" + ex.Message, "Mes任务下发");
|
// return false;
|
// }
|
|
//}
|
|
//根据流程编号查找作业流程
|
public static WorkFlow selectWorkFlow(string flowCode){
|
var db = new SqlHelper<WorkFlow>().GetInstance();
|
return db.Queryable<WorkFlow>().Where(a => a.FLOWCODE == flowCode).First();
|
}
|
|
//根据流程编号和工装类型查找作业流程
|
public static WorkFlow selectWorkFlowByType(string flowCode,string type="")
|
{
|
var db = new SqlHelper<WorkFlow>().GetInstance();
|
return db.Queryable<WorkFlow>().Where(a => a.FLOWCODE == flowCode && a.TOOLSTYPE == type).First();
|
}
|
|
//根据流程编号和起点库区查找作业流程
|
public static WorkFlow selectWorkFlowByStratArea(string flowCode, string startArea)
|
{
|
var db = new SqlHelper<WorkFlow>().GetInstance();
|
return db.Queryable<WorkFlow>().Where(a => a.FLOWCODE == flowCode && a.STARTAREA==startArea).First();
|
}
|
|
/// <summary>
|
/// 根据任务状态获取agv任务
|
/// </summary>
|
/// <param name="state"></param>
|
/// <returns></returns>
|
internal static List<WMSTask> GetTaskListByState(string state,string eq) {
|
try {
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_B_STATE.Trim() == state && a.S_SCHEDULE_TYPE.Contains(eq)).OrderByDescending(a=>a.N_PRIORITY).OrderBy(s=>s.T_CREATE).ToList();
|
}
|
catch (Exception ex) {
|
LogHelper.Error(ex.Message, ex);
|
return new List<WMSTask>();
|
}
|
}
|
|
/// <summary>
|
/// 根据任务状态获取任务
|
/// </summary>
|
/// <param name="state"></param>
|
/// <returns></returns>
|
internal static List<WMSTask> GetWcsTaskListByState(string state, string eq, string type)
|
{
|
try
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_B_STATE.Trim() == state && a.S_SCHEDULE_TYPE.Contains(eq) && a.S_TYPE.Contains(type)).OrderByDescending(a => a.N_PRIORITY).OrderBy(s => s.T_CREATE).ToList();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error(ex.Message, ex);
|
return new List<WMSTask>();
|
}
|
}
|
/// <summary>
|
/// 根据任务状态和作业编码和设备类型获取单个任务
|
/// </summary>
|
/// <param name="state"></param>
|
/// <returns></returns>
|
internal static WMSTask GetTaskByState(string state, string eq,string opCode,string type)
|
{
|
try
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_B_STATE.Trim() == state && a.S_SCHEDULE_TYPE.Contains(eq) && a.S_OP_CODE.Contains(opCode) && a.S_TYPE.Contains(type)).First();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error(ex.Message, ex);
|
return new WMSTask();
|
}
|
|
}
|
|
|
/// <summary>
|
/// 根据任务状态和起点和类型查找任务
|
/// </summary>
|
/// <param name="state"></param>
|
/// <returns></returns>
|
internal static WMSTask GetTaskByType(string start,string type,string state)
|
{
|
try
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_B_STATE.Trim() == state && a.S_TYPE.Contains(type) && a.S_START_LOC.Contains(start)).First();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error(ex.Message, ex);
|
return new WMSTask();
|
}
|
|
}
|
|
|
|
/// <summary>
|
/// 根据作业编码和设备类型获取单个任务
|
/// </summary>
|
/// <param name="state"></param>
|
/// <returns></returns>
|
internal static WMSTask GetTaskByWork(string eq, string opCode)
|
{
|
try
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_SCHEDULE_TYPE.Contains(eq) && a.S_OP_CODE.Contains(opCode)).First();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error(ex.Message, ex);
|
return new WMSTask();
|
}
|
|
}
|
|
/// <summary>
|
/// 返回当前接驳位执行中任务数量
|
/// </summary>
|
internal static int GetConnectionTask(string Connection)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
|
|
var ConnectionList = 0;
|
ConnectionList = db.Queryable<WMSTask>().Where(a => a.S_END_LOC.Contains(Connection) && a.S_TYPE.Contains("出库") && a.S_B_STATE != "完成" && a.S_B_STATE != "取消" && a.S_B_STATE != "未执行").ToList().Count();
|
|
return ConnectionList;
|
}
|
|
|
//internal static bool CreateAgvState(AgvState agvState)
|
//{
|
// try
|
// {
|
// var db = new SqlHelper<object>().GetInstance();
|
|
// return db.Insertable<AgvState>(agvState).ExecuteCommand() > 0;
|
// }
|
// catch (Exception ex)
|
// {
|
// LogHelper.Info($"添加Agv动作缓存异常" + ex.Message, "NDC");
|
// throw;
|
// }
|
//}
|
|
|
internal static bool CreateMesKtTask(MesKtTask cntr)
|
{
|
try
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
|
return db.Insertable<MesKtTask>(cntr).ExecuteCommand() > 0;
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Info($"添加Mes空托缓存异常" + ex.Message, "Mes任务下发");
|
throw;
|
}
|
}
|
|
internal static MesKtTask GetMesKtTask(string end)
|
{
|
|
var db = new SqlHelper<object>().GetInstance();
|
|
return db.Queryable<MesKtTask>().Where(a => a.Location_To==end && a.Status=="N").First();
|
}
|
|
internal static bool ChangeMesKtTask(MesKtTask kt)
|
{
|
|
var db = new SqlHelper<object>().GetInstance();
|
kt.Status = "Y";
|
return db.Updateable(kt).UpdateColumns(it => new {
|
it.Status
|
}).ExecuteCommand()>0;
|
|
|
}
|
|
internal static List<UnlimitedLoc> GetMesKtLoc()
|
{
|
|
var db = new SqlHelper<object>().GetInstance();
|
|
return db.Queryable<UnlimitedLoc>().Where(a=>a.Enable=="Y").ToList();
|
}
|
|
|
/// <summary>
|
/// 获取入库优先级表
|
/// </summary>
|
/// <returns></returns>
|
internal static List<InPri> GetInPri()
|
{
|
|
var db = new SqlHelper<object>().GetInstance();
|
|
return db.Queryable<InPri>().Where(a=>a.Enable=="Y") .ToList();
|
}
|
|
|
/// <summary>
|
/// 添加agv动作缓存
|
/// </summary>
|
/// <param name="agv"></param>
|
/// <returns></returns>
|
internal static bool CreateAgvActionState(AgvActionState agv)
|
{
|
try
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Insertable<AgvActionState>(agv).ExecuteCommand() > 0;
|
}
|
catch (Exception ex)
|
{
|
Console.WriteLine(ex.Message);
|
throw;
|
}
|
}
|
|
|
/// <summary>
|
/// 获取agv动作
|
/// </summary>
|
/// <returns></returns>
|
internal static List<AgvActionState> GetAgvActionState( string taskNo)
|
{
|
|
var db = new SqlHelper<object>().GetInstance();
|
|
return db.Queryable<AgvActionState>().Where(a => a.task_no==taskNo).ToList();
|
}
|
|
|
}
|
}
|