using HH.WCS.Hexafluo;
|
using HH.WCS.Hexafluo.device;
|
using HH.WCS.Hexafluo.dispatch;
|
using HH.WCS.Hexafluo.process;
|
using HH.WCS.Hexafluo.util;
|
using HH.WCS.Hexafluo.wms;
|
using HH.WCS.SJML.Comm;
|
using HH.WCS.SJML.dispatch;
|
using HH.WCS.SJML.Dto;
|
using HH.WCS.SJML.Entitys;
|
using HH.WCS.SJML.util;
|
using HH.WCS.ZCQTJ.dispatch;
|
using HH.WCS.ZCQTJ.Entitys;
|
using HH.WCS.ZCQTJ.Entitys.MES中间表;
|
using Newtonsoft.Json;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Data;
|
using System.Linq;
|
using System.Threading.Tasks;
|
using static HH.WCS.Hexafluo.device.OITcpHelper;
|
|
namespace HH.WCS.SJML.Bll
|
{
|
public class StateTaskBLL
|
{
|
public virtual OperateResult ExecuteState(string taskNo, string taskState, LogPara logPara, WMSTask Task = null, string UserName = "")
|
{
|
var executeStatePara = ExecuteStateHandlePara(taskNo, taskState, logPara, Task, UserName);
|
if (executeStatePara == null)
|
{
|
return OperateResult.Error("未查询到任务数据!任务号为:" + taskNo);
|
}
|
var result = new OperateResult();
|
switch (taskState)
|
{
|
case "执行中":
|
result = StartTask(executeStatePara, logPara);
|
break;
|
case "开始取货":
|
result = StartTaskQh(executeStatePara, logPara);
|
break;
|
case "取货完成":
|
result = PickSucc(executeStatePara, logPara);
|
if (!executeStatePara.transportTask.S_TASK_NO.Contains("_") && executeStatePara.transportTask.S_TYPE == "出库" && executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.JbTray != null)
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
var transportTask = newDb.Queryable<ConfigJsonEntitys>().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First();
|
var TaryJb = JsonConvert.DeserializeObject<List<TranyJb>>(transportTask.TypeJson);
|
var Kklock = newDb.Queryable<FunctionEntitys>().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First();
|
if (TaryJb.FindAll(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ToList().Count > 0 && (Kklock != null && Kklock.TransportLock == "Y"))
|
{
|
try
|
{
|
newDb.BeginTran();
|
newDb.Deleteable<JbTrayNumberEntitys>().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "取货完成释放接驳位的空托缓存数据 报错:" + ex.Message);
|
}
|
}
|
}
|
break;
|
case "完成":
|
result = CompleteTask(executeStatePara, logPara);
|
|
if (!executeStatePara.transportTask.S_TASK_NO.Contains("_") && executeStatePara.transportTask.S_TYPE == "出库" && executeStatePara.transportTask.S_NOTE.Equals("立库任务"))
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
var transportTask = newDb.Queryable<ConfigJsonEntitys>().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First();
|
var TaryJb = JsonConvert.DeserializeObject<List<TranyJb>>(transportTask.TypeJson);
|
var Kklock = newDb.Queryable<FunctionEntitys>().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First();
|
if (TaryJb.FindAll(e => e.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ToList().Count > 0 && (Kklock != null && Kklock.TransportLock == "Y"))
|
{
|
JbTrayNumberEntitys jbTray = new JbTrayNumberEntitys();
|
jbTray.S_LOC_CODE = executeStatePara.transportTask.S_END_LOC;
|
jbTray.S_CNTR_CODE = executeStatePara.transportTask.S_CNTRS;
|
try
|
{
|
newDb.BeginTran();
|
newDb.Insertable(jbTray).ExecuteCommand();
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "任务完成释放接驳位的空托缓存数据 报错:" + ex.Message);
|
}
|
}
|
}
|
try
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
var transJson = newDb.Queryable<ConfigJsonEntitys>().Where(e => e.Autoindex == "库区任务统计对照单")?.First();
|
var ListString = JsonConvert.DeserializeObject<List<AreaTaskNumber>>(transJson.TypeJson);
|
#region 巷道任务数量统计表
|
if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "入库" && result.Success)
|
{
|
var taskview = newDb.Queryable<TaskViewEntitys>().Where(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA
|
&& e.N_ROADWAY == executeStatePara.endIsCurrentTask.N_ROADWAY && e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd"))?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
TaskViewEntitys taskView = new TaskViewEntitys();
|
taskView.S_AREA_CODE = executeStatePara.transportTask.S_END_LAREA;
|
taskView.N_ROADWAY = executeStatePara.endIsCurrentTask.N_ROADWAY;
|
taskView.TASK_NUM = 1;
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成统计任务数量 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<TaskViewEntitys>().SetColumns(it => new TaskViewEntitys()
|
{
|
TASK_NUM = taskview.TASK_NUM + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成统计任务数量 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "出库" && result.Success)
|
{
|
var taskview = newDb.Queryable<TaskViewEntitys>().Where(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA
|
&& e.N_ROADWAY == executeStatePara.startIsCurrentTask.N_ROADWAY && e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd"))?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
TaskViewEntitys taskView = new TaskViewEntitys();
|
taskView.S_AREA_CODE = executeStatePara.transportTask.S_START_LAREA;
|
taskView.N_ROADWAY = executeStatePara.startIsCurrentTask.N_ROADWAY;
|
taskView.TASK_NUM = 1;
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成统计任务数量 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<TaskViewEntitys>().SetColumns(it => new TaskViewEntitys()
|
{
|
TASK_NUM = taskview.TASK_NUM + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成统计任务数量 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
#endregion
|
|
#region 库区出入库总量统计表
|
if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "入库" && result.Success)
|
{
|
var Texp = Expressionable.Create<AREANUMEntitys>();
|
AREANUMEntitys taskView = new AREANUMEntitys();
|
var ggd = ListString.Find(e => e.AreaCode == executeStatePara.transportTask.S_END_LAREA);
|
if (ggd != null)
|
{
|
taskView.S_CNTR_TYPE = ggd.TrayState;
|
}
|
if (executeStatePara.transportTask.S_END_LAREA == "LC11T")
|
{
|
Texp.And(e => e.S_CNTR_TYPE == executeStatePara.transportTask.S_TOOLS_TPYE);
|
|
taskView.S_CNTR_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE;
|
}
|
Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA);
|
Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd"));
|
|
var taskview = newDb.Queryable<AREANUMEntitys>().Where(Texp.ToExpression())?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
|
taskView.S_AREA_CODE = executeStatePara.transportTask.S_END_LAREA;
|
taskView.N_ENTER_NUM = 1;
|
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<AREANUMEntitys>().SetColumns(it => new AREANUMEntitys()
|
{
|
N_ENTER_NUM = taskview.N_ENTER_NUM + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "出库" && result.Success)
|
{
|
|
var Texp = Expressionable.Create<AREANUMEntitys>();
|
AREANUMEntitys taskView = new AREANUMEntitys();
|
var ggd = ListString.Find(e => e.AreaCode == executeStatePara.transportTask.S_START_LAREA);
|
if (ggd != null)
|
{
|
taskView.S_CNTR_TYPE = ggd.TrayState;
|
}
|
if (executeStatePara.transportTask.S_START_LAREA == "LC11T")
|
{
|
Texp.And(e => e.S_CNTR_TYPE == executeStatePara.transportTask.S_TOOLS_TPYE);
|
|
taskView.S_CNTR_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE;
|
}
|
Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA);
|
Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd"));
|
var taskview = newDb.Queryable<AREANUMEntitys>().Where(Texp.ToExpression())?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
taskView.S_AREA_CODE = executeStatePara.transportTask.S_START_LAREA;
|
taskView.N_OUT_NUM = 1;
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<AREANUMEntitys>().SetColumns(it => new AREANUMEntitys()
|
{
|
N_OUT_NUM = taskview.N_OUT_NUM + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
#endregion
|
#region 库区出入库小时统计表
|
DateTime Da = DateTime.Now;
|
if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "入库" && result.Success)
|
{
|
AreaTaskHourNumberEntitys taskView = new AreaTaskHourNumberEntitys();
|
var Texp = Expressionable.Create<AreaTaskHourNumberEntitys>();
|
var ggd = ListString.Find(e => e.AreaCode == executeStatePara.transportTask.S_END_LAREA);
|
if (ggd != null)
|
{
|
taskView.S_CNTR_TYPE = ggd.TrayState;
|
}
|
if (executeStatePara.transportTask.S_END_LAREA == "LC11T")
|
{
|
Texp.And(e => e.S_CNTR_TYPE == executeStatePara.transportTask.S_TOOLS_TPYE);
|
|
taskView.S_CNTR_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE;
|
}
|
Texp.And(e => e.Area_Code == executeStatePara.transportTask.S_END_LAREA);
|
Texp.And(e => e.Date == Da.Date);
|
Texp.And(e => e.hour == Da.Hour);
|
var taskview = newDb.Queryable<AreaTaskHourNumberEntitys>().Where(Texp.ToExpression())?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
|
taskView.Area_Code = executeStatePara.transportTask.S_END_LAREA;
|
taskView.Num_RK = 1;
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<AreaTaskHourNumberEntitys>().SetColumns(it => new AreaTaskHourNumberEntitys()
|
{
|
Num_RK = taskview.Num_RK + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.transportTask.S_TYPE == "出库" && result.Success)
|
{
|
AreaTaskHourNumberEntitys taskView = new AreaTaskHourNumberEntitys();
|
var Texp = Expressionable.Create<AreaTaskHourNumberEntitys>();
|
var ggd = ListString.Find(e => e.AreaCode == executeStatePara.transportTask.S_END_LAREA);
|
if (ggd != null)
|
{
|
taskView.S_CNTR_TYPE = ggd.TrayState;
|
}
|
if (executeStatePara.transportTask.S_START_LAREA == "LC11T")
|
{
|
Texp.And(e => e.S_CNTR_TYPE == executeStatePara.transportTask.S_TOOLS_TPYE);
|
taskView.S_CNTR_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE;
|
}
|
Texp.And(e => e.Area_Code == executeStatePara.transportTask.S_START_LAREA);
|
Texp.And(e => e.Date == Da.Date);
|
Texp.And(e => e.hour == Da.Hour);
|
var taskview = newDb.Queryable<AreaTaskHourNumberEntitys>().Where(Texp.ToExpression())?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
taskView.Area_Code = executeStatePara.transportTask.S_START_LAREA;
|
taskView.Num_CK = 1;
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<AreaTaskHourNumberEntitys>().SetColumns(it => new AreaTaskHourNumberEntitys()
|
{
|
Num_CK = taskview.Num_CK + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
#endregion
|
#region AGV每小时出入库统计
|
DateTime Daagv = DateTime.Now;
|
if (executeStatePara.transportTask.S_NOTE == "agv任务" && executeStatePara.transportTask.S_TYPE == "入库" && result.Success)
|
{
|
var taskview = newDb.Queryable<AgvAreaTaskHourNumberEntitys>().Where(e => e.AgvLicense == executeStatePara.transportTask.S_EQ_NO
|
&& e.Date == Daagv.Date && e.hour == Daagv.Hour)?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
AgvAreaTaskHourNumberEntitys taskView = new AgvAreaTaskHourNumberEntitys();
|
taskView.AgvLicense = executeStatePara.transportTask.S_EQ_NO;
|
taskView.Num_RK = 1;
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<AgvAreaTaskHourNumberEntitys>().SetColumns(it => new AgvAreaTaskHourNumberEntitys()
|
{
|
Num_RK = taskview.Num_RK + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
if (executeStatePara.transportTask.S_NOTE == "agv任务" && executeStatePara.transportTask.S_TYPE == "出库" && result.Success)
|
{
|
var taskview = newDb.Queryable<AgvAreaTaskHourNumberEntitys>().Where(e => e.AgvLicense == executeStatePara.transportTask.S_EQ_NO
|
&& e.Date == Daagv.Date && e.hour == Daagv.Hour)?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
AgvAreaTaskHourNumberEntitys taskView = new AgvAreaTaskHourNumberEntitys();
|
taskView.AgvLicense = executeStatePara.transportTask.S_EQ_NO;
|
taskView.Num_CK = 1;
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<AgvAreaTaskHourNumberEntitys>().SetColumns(it => new AgvAreaTaskHourNumberEntitys()
|
{
|
Num_CK = taskview.Num_CK + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
#endregion
|
|
#region 库区出入库天统计表
|
if (!executeStatePara.transportTask.S_TASK_NO.Contains("_") && result.Success)
|
{
|
var Texp = Expressionable.Create<DayAreaTaskEntitys>();
|
DayAreaTaskEntitys taskView = new DayAreaTaskEntitys();
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA);
|
}
|
else
|
{
|
// Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA);
|
Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA);
|
}
|
Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd"));
|
var taskview = newDb.Queryable<DayAreaTaskEntitys>().Where(Texp.ToExpression())?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
taskView.S_AREA_CODE = executeStatePara.transportTask.S_END_LAREA;
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
taskView.Num_RK = 1;
|
}
|
else
|
{
|
taskView.Num_CK = 1;
|
}
|
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
|
newDb.BeginTran();
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
var I = newDb.Updateable<DayAreaTaskEntitys>().SetColumns(it => new DayAreaTaskEntitys()
|
{
|
Num_RK = taskview.Num_RK + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
}
|
else
|
{
|
var I = newDb.Updateable<DayAreaTaskEntitys>().SetColumns(it => new DayAreaTaskEntitys()
|
{
|
Num_CK = taskview.Num_CK + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
}
|
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
else
|
{
|
if (executeStatePara.transportTask.S_NOTE == "立库任务" && result.Success)
|
{
|
var Texp = Expressionable.Create<DayAreaTaskEntitys>();
|
DayAreaTaskEntitys taskView = new DayAreaTaskEntitys();
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA);
|
}
|
else
|
{
|
Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA);
|
}
|
|
Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd"));
|
var taskview = newDb.Queryable<DayAreaTaskEntitys>().Where(Texp.ToExpression())?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
|
taskView.S_AREA_CODE = executeStatePara.transportTask.S_END_LAREA;
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
taskView.Num_RK = 1;
|
}
|
else
|
{
|
taskView.Num_CK = 1;
|
}
|
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
var I = newDb.Updateable<DayAreaTaskEntitys>().SetColumns(it => new DayAreaTaskEntitys()
|
{
|
Num_RK = taskview.Num_RK + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
}
|
else
|
{
|
var I = newDb.Updateable<DayAreaTaskEntitys>().SetColumns(it => new DayAreaTaskEntitys()
|
{
|
Num_CK = taskview.Num_CK + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
}
|
#endregion
|
#region 任务 年统计
|
if (!executeStatePara.transportTask.S_TASK_NO.Contains("_") && result.Success)
|
{
|
var Texp = Expressionable.Create<YearAreaTaskEntitys>();
|
YearAreaTaskEntitys taskView = new YearAreaTaskEntitys();
|
Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy"));
|
var taskview = newDb.Queryable<YearAreaTaskEntitys>().Where(Texp.ToExpression())?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
taskView.TASK_NUM = 1;
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<YearAreaTaskEntitys>().SetColumns(it => new YearAreaTaskEntitys()
|
{
|
TASK_NUM = taskview.TASK_NUM + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
else
|
{
|
if (executeStatePara.transportTask.S_NOTE == "立库任务" && result.Success)
|
{
|
var Texp = Expressionable.Create<YearAreaTaskEntitys>();
|
YearAreaTaskEntitys taskView = new YearAreaTaskEntitys();
|
Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy"));
|
var taskview = newDb.Queryable<YearAreaTaskEntitys>().Where(Texp.ToExpression())?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
taskView.TASK_NUM = 1;
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<YearAreaTaskEntitys>().SetColumns(it => new YearAreaTaskEntitys()
|
{
|
TASK_NUM = taskview.TASK_NUM + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
}
|
}
|
#endregion
|
#region 库区出库物料统计表
|
if (executeStatePara.transportTask.S_NOTE == "立库任务" && executeStatePara.trayItemMsts.Count > 0 && executeStatePara.transportTask.S_TYPE == "出库" && result.Success)
|
{
|
if (executeStatePara.trayItemMsts.Count > 0)
|
{
|
var Texp = Expressionable.Create<AreaIetmNumEntitys>();
|
AreaIetmNumEntitys taskView = new AreaIetmNumEntitys();
|
var ggd = ListString.Find(e => e.AreaCode == executeStatePara.transportTask.S_START_LAREA);
|
if (ggd != null)
|
{
|
taskView.S_CNTR_TYPE = ggd.TrayState;
|
}
|
if (executeStatePara.transportTask.S_START_LAREA == "LC11T")
|
{
|
Texp.And(e => e.S_CNTR_TYPE == executeStatePara.transportTask.S_TOOLS_TPYE);
|
|
taskView.S_CNTR_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE;
|
}
|
Texp.And(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA);
|
Texp.And(e => e.D_DATE == DateTime.Now.ToString("yyyy-MM-dd"));
|
var taskview = newDb.Queryable<AreaIetmNumEntitys>().Where(Texp.ToExpression())?.First();
|
if (taskview == null)//创建
|
{
|
try
|
{
|
taskView.S_AREA_CODE = executeStatePara.transportTask.S_START_LAREA;
|
taskView.N_OUT_NUM = 1;
|
newDb.BeginTran();
|
var I = newDb.Insertable(taskView).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
else//任务数+1
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<AreaIetmNumEntitys>().SetColumns(it => new AreaIetmNumEntitys()
|
{
|
N_OUT_NUM = taskview.N_OUT_NUM + 1
|
}).Where(x => x.S_ID == taskview.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "立库任务完成 出入库总量统计 报错:" + ex.Message);
|
newDb.RollbackTran();
|
}
|
}
|
|
}
|
|
}
|
#endregion
|
|
}
|
catch (Exception ex)
|
{
|
throw;
|
}
|
if (!executeStatePara.transportTask.S_TASK_NO.Contains("_") && executeStatePara.transportTask.S_TYPE == "出库" && executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.JbTray != null)
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
var transportTask = newDb.Queryable<ConfigJsonEntitys>().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First();
|
var TaryJb = JsonConvert.DeserializeObject<List<TranyJb>>(transportTask.TypeJson);
|
var Kklock = newDb.Queryable<FunctionEntitys>().Where(e => e.Autoindex == "空托自动出库到接驳位")?.First();
|
if (TaryJb.FindAll(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ToList().Count > 0 && (Kklock != null && Kklock.TransportLock == "Y"))
|
{
|
try
|
{
|
newDb.BeginTran();
|
newDb.Deleteable<JbTrayNumberEntitys>().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
newDb.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, "任务完成释放接驳位的空托缓存数据 报错:" + ex.Message);
|
}
|
}
|
}
|
|
break;
|
case "开始卸货":
|
result = StartTaskXh(executeStatePara, logPara);
|
break;
|
case "卸货完成":
|
result = UnloadingSucc(executeStatePara, logPara);
|
break;
|
case "取消":
|
result = CancelTask(executeStatePara, logPara, UserName);
|
break;
|
}
|
return result;
|
|
}
|
|
public ExecuteStateParaDto ExecuteStateHandlePara(string taskNo, string taskState, LogPara logPara, WMSTask Task = null, string UserName = "")
|
{
|
var executeStatePara = new ExecuteStateParaDto();
|
executeStatePara.Name = UserName;
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
//查询任务
|
if (Task != null)
|
{
|
executeStatePara.transportTask = Task;
|
}
|
else
|
{
|
LogHelper.TaskDetail(logPara, "开始查询:任务编号: " + taskNo);
|
executeStatePara.transportTask = newDb.Queryable<WMSTask>().Where(e => e.S_TASK_NO == taskNo)?.First();
|
}
|
|
if (executeStatePara.transportTask == null)
|
{
|
return null;
|
}
|
|
executeStatePara.transportTaskSrc = newDb.Queryable<WMSTask>().Where(e => e.S_SRC_NO == executeStatePara.transportTask.S_SRC_NO).ToList();
|
if (taskNo.IndexOf('_') > 0)
|
{
|
var tno = taskNo.Substring(0, taskNo.LastIndexOf("_"));
|
executeStatePara.transportTaskZ = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno);
|
}
|
LogHelper.TaskDetail(logPara, "结束查询 任务结束:任务编号: " + taskNo);
|
//起点库区
|
var QbArea = newDb.Queryable<TN_AreaEntitys>().Where(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA.Trim() || e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA.Trim()).ToList();
|
executeStatePara.startStockArea = QbArea.Find(e => e.S_AREA_CODE == executeStatePara.transportTask.S_START_LAREA.Trim());
|
//结束库区
|
executeStatePara.endStockArea = QbArea.Find(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA.Trim());
|
// SqlSugarHelper.Db.Queryable<TN_AreaEntitys>().Where(e => e.S_AREA_CODE == executeStatePara.transportTask.S_END_LAREA.Trim())?.First();
|
LogHelper.TaskDetail(logPara, "结束查询 起点/终点 库区结束:任务编号: " + taskNo);
|
//起点货位是否绑定托盘
|
//executeStatePara.startTrayLocation = SqlSugarHelper.Db.Queryable<LocCntrRel>().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS)?.First();
|
var QbTrayCode = newDb.Queryable<LocCntrRel>().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC || e.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ToList();
|
executeStatePara.startTrayLocation = QbTrayCode.Find(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC);
|
//终点货位是否绑定托盘
|
executeStatePara.endTrayLocation = QbTrayCode.Find(e => e.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC);
|
LogHelper.TaskDetail(logPara, "结束查询 起点/终点 托盘货位结束:任务编号: " + taskNo);
|
//起点货位拓展
|
var QbLocation = newDb.Queryable<Location>().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC || e.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ToList();
|
executeStatePara.startIsCurrentTask = QbLocation.Find(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC);
|
//终点货位拓展
|
executeStatePara.endIsCurrentTask = QbLocation.Find(e => e.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC);
|
LogHelper.TaskDetail(logPara, "结束查询 起点/终点 货位结束:任务编号: " + taskNo);
|
//托盘物料主表
|
executeStatePara.trayItemMsts = newDb.Queryable<CntrItemRel>().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ToList();
|
LogHelper.TaskDetail(logPara, "结束查询 托盘物料结束:任务编号: " + taskNo);
|
////作业流程
|
executeStatePara.WorkFlows = newDb.Queryable<TN_WorkFlowEntitys>().Where(e => e.S_FlowNo == executeStatePara.transportTask.S_FlowNo)?.First();
|
|
executeStatePara.JbTray = newDb.Queryable<JbTrayNumberEntitys>().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS && e.S_IS_USE == "N")?.First();
|
|
//任务状态
|
executeStatePara.taskState = taskState;
|
return executeStatePara;
|
}
|
|
public virtual OperateResult StartTask(ExecuteStateParaDto executeStatePara, LogPara logPara)
|
{
|
if (!executeStatePara.transportTask.S_B_STATE.Equals(Constants.TaskState_NoExecuted) && !executeStatePara.transportTask.S_B_STATE.Equals("已推送"))
|
return OperateResult.Error("请启动未执行的任务!");
|
|
if (executeStatePara.transportTask.S_NOTE.Equals("自管任务") && executeStatePara.transportTask.S_Subtask == "Y")
|
{
|
return OperateResult.Error("主任务禁止直接开始任务!");
|
}
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
string UserName = "";
|
WMSTask task = executeStatePara.transportTask;
|
if (executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.Name == "")
|
{
|
UserName = "agv";
|
}
|
else if (!executeStatePara.transportTask.S_NOTE.Equals("自管任务") && executeStatePara.Name == "")
|
{
|
UserName = "立库";
|
}
|
else
|
{
|
UserName = executeStatePara.Name;
|
}
|
if (executeStatePara.transportTask.S_NOTE == "立库任务")
|
{
|
string no = executeStatePara.transportTask.S_TASK_NO;
|
if (no.IndexOf('_') > 0)
|
{
|
no = no.Substring(0, no.LastIndexOf("_"));
|
task = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == no);
|
}
|
// 获取主任务
|
|
LogHelper.TaskDetail(logPara, "获取主任务:任务编号: " + no);
|
var bit = "";
|
if (task.S_TYPE == "出库")
|
{
|
bit = task.S_END_LOC;
|
}
|
}
|
if (executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
var tac = newDb.Queryable<TN_TcpCont>().Where(a => a.LocationCode == executeStatePara.transportTask.S_START_LOC)?.First();
|
if (tac != null)
|
{
|
//查询通讯方式
|
if (tac.CtiaMode == "MODBUS")
|
{
|
if (string.IsNullOrEmpty(tac.host) || tac.port == 0)
|
{
|
LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{executeStatePara.transportTask.S_START_LOC} ip地址 写入目标设备的IP端口 有空值或者默认值");
|
}
|
else
|
{
|
RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel();
|
Register.host = tac.host;
|
Register.port = tac.port;
|
Register.addr = tac.addr + 1;
|
Register.data = tac.dataNum;
|
LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}");
|
var ta = OITcpHelper.RegisterWriteOutPut(Register);
|
LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}");
|
}
|
}
|
if (tac.CtiaMode == "VMI")
|
{
|
var Alone = newDb.Queryable<SqlCountEntitys>().Where(e => e.ConfigId == tac.host)?.First();
|
if (Alone == null)
|
{
|
throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串");
|
}
|
var childA = new SqlHelper<object>().GetInstance(Alone.ConnectionString);
|
var GGF = childA.Updateable<DATA_TO_HMI>().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_READY_FOR_OPERATION").ExecuteCommand();
|
if (GGF == 0)
|
{
|
throw new Exception("写安全信号交互表 IMES_AGV_BDST_READY_FOR_OPERATION字段为 1失败");
|
}
|
LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_READY_FOR_OPERATION 字段为 1成功");
|
}
|
}
|
}
|
else if (executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.transportTask.S_TYPE == "出库")
|
{
|
var tac = newDb.Queryable<TN_TcpCont>().Where(a => a.LocationCode == executeStatePara.transportTask.S_END_LOC)?.First();
|
if (tac != null)
|
{
|
//查询通讯方式
|
if (tac.CtiaMode == "MODBUS")
|
{
|
if (string.IsNullOrEmpty(tac.host) || tac.port == 0)
|
{
|
LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{executeStatePara.transportTask.S_END_LOC} ip地址 写入目标设备的IP端口 有空值或者默认值");
|
}
|
else
|
{
|
RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel();
|
Register.host = tac.host;
|
Register.port = tac.port;
|
Register.addr = tac.addr;
|
Register.data = tac.dataNum;
|
var ta = OITcpHelper.RegisterWriteOutPut(Register);
|
LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}");
|
LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}");
|
}
|
}
|
if (tac.CtiaMode == "VMI")
|
{
|
var Alone = newDb.Queryable<SqlCountEntitys>().Where(e => e.ConfigId == tac.host)?.First();
|
if (Alone == null)
|
{
|
throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串");
|
}
|
var childA = new SqlHelper<object>().GetInstance(Alone.ConnectionString);
|
var GGF = childA.Updateable<DATA_TO_HMI>().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_READY_FOR_OPERATION").ExecuteCommand();
|
if (GGF == 0)
|
{
|
throw new Exception("写安全信号交互表 IMES_AGV_BDST_READY_FOR_OPERATION字段为 1失败");
|
}
|
LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_READY_FOR_OPERATION 字段为 1成功");
|
}
|
}
|
}
|
try
|
{
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO);
|
newDb.BeginTran();
|
|
var I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { T_START_TIME = DateTime.Now, S_B_STATE = Constants.TaskState_Executing }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
if (executeStatePara.transportTask.S_TYPE == "入库" && executeStatePara.transportTask.S_NOTE.Equals("agv任务"))
|
{
|
var fff = executeStatePara.transportTaskSrc.Select(e => e.S_ID).ToList();
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { T_START_TIME = DateTime.Now, T_MODIFY = DateTime.Now }).Where(e => fff.Contains(e.S_ID)).ExecuteCommand();
|
}
|
if (executeStatePara.transportTask.S_TYPE == "出库" && executeStatePara.transportTask.S_NOTE.Equals("立库任务"))
|
{
|
var fff = executeStatePara.transportTaskSrc.Select(e => e.S_ID).ToList();
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { T_START_TIME = DateTime.Now, T_MODIFY = DateTime.Now }).Where(e => fff.Contains(e.S_ID)).ExecuteCommand();
|
}
|
newDb.CommitTran();
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO);
|
Task.Run(() =>
|
{
|
if (executeStatePara.transportTask.S_SRC_SYS == "MES")
|
{
|
ZCReceivePriorityEntity mes = new ZCReceivePriorityEntity();
|
var tno = executeStatePara.transportTask.S_TASK_NO;
|
mes.taskNo = executeStatePara.transportTask.S_UpstreamNo;
|
var task2 = new WMSTask();
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
task2 = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == executeStatePara.transportTask.S_UpstreamNo);
|
}
|
else
|
{
|
if (tno.IndexOf('_') > 0)
|
{
|
tno = tno.Substring(0, tno.LastIndexOf("_"));
|
}
|
//task2 = SqlSugarHelper.Db.Queryable<WMSTask>().Where(e => e.S_TASK_NO == tno)?.First();
|
task2 = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno);
|
}
|
if (task2 != null)
|
{
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
mes.End_big = task2?.S_START_LOC ?? executeStatePara.transportTask.S_START_LOC;
|
}
|
if (executeStatePara.transportTask.S_TYPE == "出库")
|
{
|
mes.End_big = task2?.S_END_LOC ?? executeStatePara.transportTask.S_END_LOC;
|
}
|
mes.Data_status = 1;
|
//调mes接口
|
BLLCreator.CreateSingleton<MesTask>().MesTaskEntity(mes);
|
}
|
}
|
});
|
return OperateResult.Succeed();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex));
|
newDb.RollbackTran();
|
return OperateResult.Error(JsonConvert.SerializeObject(ex));
|
}
|
}
|
|
public virtual OperateResult StartTaskQh(ExecuteStateParaDto executeStatePara, LogPara logPara)
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
try
|
{
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO);
|
newDb.BeginTran();
|
|
var I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { T_START_TIME = DateTime.Now, T_MODIFY = DateTime.Now, S_B_STATE = Constants.TaskState_Executing }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
newDb.CommitTran();
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO);
|
return OperateResult.Succeed();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex));
|
newDb.RollbackTran();
|
return OperateResult.Error(JsonConvert.SerializeObject(ex));
|
}
|
}
|
public virtual OperateResult StartTaskXh(ExecuteStateParaDto executeStatePara, LogPara logPara)
|
{
|
List<string> TaskState = new List<string>() { "取消", "完成", "卸货完成" };
|
if (TaskState.Contains(executeStatePara.transportTask.S_B_STATE))
|
{
|
return OperateResult.Error("只能执行没有 取消/完成/卸货完成的任务!");
|
}
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
|
try
|
{
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO);
|
newDb.BeginTran();
|
|
var I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { S_B_STATE = Constants.TaskState_Executing }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
|
newDb.CommitTran();
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO);
|
return OperateResult.Succeed();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex));
|
newDb.RollbackTran();
|
return OperateResult.Error(JsonConvert.SerializeObject(ex));
|
}
|
}
|
|
/// <summary>
|
/// 任务完成
|
/// </summary>
|
/// <param name="executeStatePara"></param>
|
/// <param name="logPara"></param>
|
/// <returns></returns>
|
public virtual OperateResult CompleteTask(ExecuteStateParaDto executeStatePara, LogPara logPara)
|
{
|
//对取消的任务类型进行筛选
|
if (!executeStatePara.transportTask.S_B_STATE.Equals("未执行") && !executeStatePara.transportTask.S_B_STATE.Equals("已推送") && !executeStatePara.transportTask.S_B_STATE.Equals("执行中") && !executeStatePara.transportTask.S_B_STATE.Equals("完成一半") && !executeStatePara.transportTask.S_B_STATE.Equals("取货完成") && !executeStatePara.transportTask.S_B_STATE.Equals("卸货完成"))
|
{
|
return OperateResult.Error("只能完成未执行、执行中的任务!");
|
}
|
//需要写入货位表的参数合集
|
#region 拼接上下架表数据
|
GroundingOffshelfEntitys UoDown = new GroundingOffshelfEntitys();
|
UoDown.S_CNTR_CODE = executeStatePara.transportTask.S_CNTRS;
|
UoDown.S_TRAY_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE;
|
UoDown.S_TASK_NO = executeStatePara.transportTask.S_TASK_NO;
|
#endregion
|
var productionDate = "";
|
var takeEffectTime = "";
|
var expireTime = "";
|
var S_TRAY_TYPE = "";
|
deadlockRollEntitys Deck = new deadlockRollEntitys();
|
Deck.S_INTER_STATE = "2";
|
Deck.S_VALUE_JSON = executeStatePara.transportTask.S_TASK_NO;
|
|
if (executeStatePara.transportTask.S_CNTRS != null && executeStatePara.transportTask.S_CNTRS.Contains("KJZ"))
|
{
|
S_TRAY_TYPE = "KJZ";
|
UoDown.S_TRAY_TYPE = "KJZ";
|
}
|
else
|
{
|
if (executeStatePara.trayItemMsts?.Count() > 0)
|
{
|
S_TRAY_TYPE = "MT";
|
}
|
else
|
{
|
S_TRAY_TYPE = "KT";
|
}
|
}
|
if (executeStatePara.trayItemMsts?.Count() > 0)
|
{
|
var tex = executeStatePara.trayItemMsts.FirstOrDefault();
|
productionDate = tex.productionDate.ToString();
|
takeEffectTime = tex.takeEffectTime.ToString();
|
expireTime = tex.expireTime.ToString();
|
UoDown.S_ITEM_CODE = tex.S_ITEM_CODE;
|
UoDown.S_ITEM_NAME = tex.S_ITEM_NAME;
|
UoDown.F_QTY = tex.F_QTY;
|
UoDown.F_AVG_QTY = tex.F_AVG_QTY;
|
UoDown.F_SUM_QTY = tex.F_SUM_QTY;
|
UoDown.expireTime = tex.expireTime;
|
UoDown.itemFeature = tex.itemFeature;
|
UoDown.itemModel = tex.itemModel;
|
UoDown.Level = tex.Level;
|
UoDown.productionDate = tex.productionDate;
|
UoDown.takeEffectTime = tex.takeEffectTime;
|
UoDown.TurnCardNum = tex.TurnCardNum;
|
UoDown.S_ITEM_STATE = tex.S_ITEM_STATE;
|
UoDown.S_BATCH_NO = tex.S_BATCH_NO;
|
UoDown.applyProdSpecList = tex.applyProdSpecList;
|
}
|
|
//判断是否是自管任务 因为中策项目的流程是拆分子任务的流程 主任务直接完成了 但是子任务任在运行 当子任务上报完成了 主任务比子任务先完成 会出现逻辑错误
|
if (executeStatePara.transportTask.S_NOTE.Equals("自管任务") && executeStatePara.transportTask.S_Subtask == "Y")
|
{
|
return OperateResult.Error("主任务禁止直接完成!");
|
}
|
string no = executeStatePara.transportTask.S_TASK_NO;
|
if (no.IndexOf('_') < 1 && executeStatePara.transportTask.S_Subtask == "Y")
|
{
|
return OperateResult.Error("主任务不允许直接完成,请先完成子任务!!");
|
}
|
string UserName = "";
|
if (executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.Name == "")
|
{
|
UserName = "agv";
|
}
|
else if (!executeStatePara.transportTask.S_NOTE.Equals("自管任务") && executeStatePara.Name == "" && executeStatePara.transportTask.S_Subtask == "Y")
|
{
|
UserName = "立库";
|
}
|
else
|
{
|
UserName = executeStatePara.Name;
|
}
|
string tno = executeStatePara.transportTask.S_TASK_NO;
|
if (tno.IndexOf('_') > 0)
|
{
|
tno = tno.Substring(0, tno.LastIndexOf("_"));
|
}
|
var cno = "";
|
// 获取主任务
|
// var task = SqlSugarHelper.Db.Queryable<WMSTask>().Where(e => e.S_TASK_NO == tno)?.First();
|
var task = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno);
|
UoDown.S_TASK_NO = task?.S_TASK_NO;
|
executeStatePara.ZtransportTask = task;
|
string bit = null;
|
|
|
if (task.S_TYPE == "出库")
|
{
|
bit = task.S_END_LOC;
|
if (task.S_Subtask == "Y" && executeStatePara.transportTask.S_NOTE == "agv任务")
|
{
|
var WcsTask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == executeStatePara.transportTask.S_SRC_NO + "_1");
|
if (WcsTask != null)
|
{
|
if (WcsTask.S_B_STATE != "完成")
|
{
|
return OperateResult.Error("立库任务还没完成,agv任务暂时不能完成!");
|
}
|
}
|
}
|
}
|
//更新任务状态
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
try
|
{
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO);
|
newDb.BeginTran();
|
var I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { T_END_TIME = DateTime.Now, S_B_STATE = Constants.TaskState_Complete }).Where(x => x.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新任务状态-任务号:" + executeStatePara.transportTask.S_TASK_NO + "状态为:" + executeStatePara.taskState);
|
|
if (executeStatePara.transportTask.S_SRC_NO == executeStatePara.transportTask.S_TASK_NO)
|
{
|
var Task_tk = tno + "_yk";
|
if (Task_tk != executeStatePara.transportTask.S_TASK_NO)
|
{
|
if (executeStatePara.transportTaskZ != null)
|
{
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { T_END_TIME = DateTime.Now, S_B_STATE = Constants.TaskState_Complete }).Where(x => x.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
}
|
|
}
|
}
|
string taskNo = executeStatePara.transportTask.S_TASK_NO;
|
//出库第二阶段任务 标记 用于完成时跳过起点货位状态变动
|
string JbTaskNo = null;
|
//立库任务 子任务完成时,需要同步处理主任务
|
if (taskNo.IndexOf('_') > 0)
|
{
|
string topNo = taskNo.Substring(0, taskNo.IndexOf("_"));
|
string navNo = taskNo.Substring(taskNo.IndexOf("_") + 1);
|
cno = navNo;
|
if (navNo == "2")
|
{
|
JbTaskNo = navNo;
|
}
|
//A到B的AGV搬运任务
|
if (navNo == "1")
|
{
|
if (task.S_TYPE == "出库")
|
{
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { T_START_TIME = DateTime.Now, S_B_STATE = Constants.TaskState_Executing }).Where(x => x.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新主任务状态-任务号:" + topNo + "状态为:" + Constants.TaskState_Executing);
|
}
|
else
|
{
|
//主任务状态更改为:完成一半
|
//I = SqlSugarHelper.Db.Updateable<WMSTask>().SetColumns(it => new WMSTask() { S_B_STATE = Constants.TaskState_CompleteHalf, S_READ_LOCK = "N" }).Where(x => x.S_TASK_NO == topNo).ExecuteCommand();
|
//if (I == 0)
|
//{
|
// throw new Exception("更新任务状态失败");
|
//}
|
//LogHelper.TaskDetail(logPara, "更新主任务状态-任务号:" + topNo + "状态为:" + Constants.TaskState_CompleteHalf);
|
}
|
}
|
//B到C的立库搬运任务
|
if (navNo == "2")
|
{
|
//主任务状态更改为:完成
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { T_END_TIME = DateTime.Now, S_B_STATE = Constants.TaskState_Complete }).Where(x => x.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新任务状态-任务号:" + topNo + "状态为:" + Constants.TaskState_Complete);
|
}
|
}
|
if (executeStatePara.transportTask.S_TYPE == null)
|
executeStatePara.transportTask.S_TYPE = "";
|
#region 入库 + 转运
|
if (executeStatePara.transportTask.S_TYPE.Equals("入库") || executeStatePara.transportTask.S_TYPE.Equals("转运"))
|
{
|
var LocCnt = new LocCntrRel();
|
LocCnt.S_CNTR_CODE = executeStatePara.transportTask.S_CNTRS;
|
LocCnt.S_LOC_CODE = executeStatePara.transportTask.S_END_LOC;
|
LocCnt.S_TYPE = executeStatePara.transportTask.S_TOOLS_TPYE;
|
if (executeStatePara.transportTask.S_CNTRS != null && executeStatePara.transportTask.S_CNTRS.Contains("KJZ"))
|
{
|
LocCnt.S_TYPE = "KJZ";
|
}
|
if (executeStatePara.startTrayLocation != null)
|
{
|
//解绑托盘与货位的关系
|
I = newDb.Deleteable<LocCntrRel>().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
if (I == 0)
|
{
|
LogHelper.TaskDetail(logPara, "删除起点托盘货位表失败");
|
// throw new Exception("删除起点托盘货位表失败");
|
}
|
else
|
{
|
LogHelper.TaskDetail(logPara, "删除起点托盘货位表成功");
|
}
|
LogHelper.TaskDetail(logPara, "删除起点托盘货位表");
|
//起点
|
if (executeStatePara.startIsCurrentTask != null && executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y") && executeStatePara.transportTask.S_TYPE.Equals("转运"))
|
{
|
I = newDb.Updateable<Location>().SetColumns(it => new Location()
|
{
|
T_MODIFY = DateTime.Now,
|
N_CURRENT_NUM = 0,
|
T_EMPTY_TIME = DateTime.Now,
|
S_LOCK_STATE = "无",
|
S_TRAY_TYPE = "",
|
productionDate = "",
|
takeEffectTime = "",
|
expireTime = ""
|
}).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新出库锁的货位状态为无数量为0失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新出库锁的货位状态为无数量为0,起点货位号:" + executeStatePara.transportTask.S_START_LOC);
|
}
|
}
|
if (executeStatePara.endTrayLocation == null)
|
{
|
if ((
|
executeStatePara.endIsCurrentTask != null) &&
|
executeStatePara.endStockArea.S_CONTROL_QTY.Equals("Y"))
|
{
|
//添加托盘货位
|
I = newDb.Insertable(LocCnt).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("添加托盘货位表数据失败 " + executeStatePara.transportTask.S_CNTRS);
|
}
|
LogHelper.TaskDetail(logPara, "添加终点托盘货位表 " + executeStatePara.transportTask.S_CNTRS);
|
UoDown.Type = "+";
|
I = newDb.Insertable(UoDown).ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "添加上架表");
|
I = newDb.Updateable<Location>().SetColumns(it => new Location()
|
{
|
T_MODIFY = DateTime.Now,
|
N_CURRENT_NUM = 1,
|
T_FULL_TIME = DateTime.Now,
|
S_LOCK_STATE = "无",
|
S_TRAY_TYPE = S_TRAY_TYPE,
|
productionDate = productionDate,
|
takeEffectTime = takeEffectTime,
|
expireTime = expireTime
|
}).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新入库锁的货位状态为无数量为1失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新入库锁的货位状态为无数量为1,终点货位号:" + executeStatePara.transportTask.S_END_LOC);
|
}
|
}
|
}
|
#endregion
|
#region 出库
|
if (executeStatePara.transportTask.S_TYPE.Equals("出库"))
|
{
|
var LocCnt = new LocCntrRel();
|
LocCnt.S_CNTR_CODE = executeStatePara.transportTask.S_CNTRS;
|
LocCnt.S_LOC_CODE = executeStatePara.transportTask.S_END_LOC;
|
if (executeStatePara.startTrayLocation != null)
|
{
|
I = newDb.Deleteable<LocCntrRel>().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
if (I == 0)
|
{
|
LogHelper.TaskDetail(logPara, "删除起点托盘货位表失败 " + executeStatePara.transportTask.S_CNTRS);
|
// throw new Exception("删除起点托盘货位表失败");
|
}
|
else
|
{
|
LogHelper.TaskDetail(logPara, "删除起点托盘货位表成功 " + executeStatePara.transportTask.S_CNTRS);
|
}
|
//if (executeStatePara.trayItemMsts?.Count() > 0)
|
//{
|
// I = SqlSugarHelper.Db.Deleteable<LocCntrRel>().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
// if (I == 0)
|
// {
|
// LogHelper.TaskDetail(logPara, "删除起点托盘货位表失败 " + executeStatePara.transportTask.S_CNTRS);
|
// // throw new Exception("删除起点托盘货位表失败");
|
// }
|
// else
|
// {
|
// LogHelper.TaskDetail(logPara, "删除起点托盘货位表成功 " + executeStatePara.transportTask.S_CNTRS);
|
// }
|
//}
|
if (executeStatePara.trayItemMsts?.Count() > 0)
|
{
|
I = newDb.Deleteable<CntrItemRel>().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "删除托盘物料表 " + executeStatePara.transportTask.S_CNTRS + $" 影响行数{I}");
|
}
|
|
}
|
if (executeStatePara.startIsCurrentTask.S_LOC_TYPE != "接驳位")
|
{
|
UoDown.Type = "-";
|
I = newDb.Insertable(UoDown).ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "添加下架表");
|
}
|
//起点
|
if (executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y") && string.IsNullOrEmpty(JbTaskNo) && executeStatePara.startIsCurrentTask.N_CAPACITY < 2)
|
{
|
I = newDb.Updateable<Location>().SetColumns(it => new Location()
|
{
|
T_MODIFY = DateTime.Now,
|
N_CURRENT_NUM = 0,
|
T_EMPTY_TIME = DateTime.Now,
|
S_LOCK_STATE = "无",
|
S_TRAY_TYPE = "",
|
productionDate = "",
|
takeEffectTime = "",
|
expireTime = ""
|
}).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新出库锁的货位状态为无数量为0失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新出库锁的货位状态为无数量为0,起点货位号:" + executeStatePara.transportTask.S_START_LOC);
|
}
|
//终点
|
if (executeStatePara.endStockArea.S_CONTROL_QTY.Equals("Y") && executeStatePara.endIsCurrentTask.N_CAPACITY < 2)
|
{
|
I = newDb.Updateable<Location>().SetColumns(it => new Location()
|
{
|
T_MODIFY = DateTime.Now,
|
N_CURRENT_NUM = 1,
|
T_FULL_TIME = DateTime.Now,
|
S_LOCK_STATE = "无",
|
S_TRAY_TYPE = S_TRAY_TYPE,
|
productionDate = productionDate,
|
takeEffectTime = takeEffectTime,
|
expireTime = expireTime
|
}).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新入库锁的货位状态为无数量为1失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新入库锁的货位状态为无数量为1,终点货位号:" + executeStatePara.transportTask.S_END_LOC);
|
//添加托盘货位
|
if (executeStatePara.endTrayLocation == null)
|
{
|
I = newDb.Insertable(LocCnt).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("添加托盘货位表数据失败 " + executeStatePara.transportTask.S_CNTRS);
|
}
|
LogHelper.TaskDetail(logPara, "添加终点托盘货位表 " + executeStatePara.transportTask.S_CNTRS);
|
}
|
}
|
else
|
{
|
if (executeStatePara.trayItemMsts.Any())
|
{
|
I = newDb.Deleteable<CntrItemRel>().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
if (I == 0)
|
{
|
LogHelper.TaskDetail(logPara, "删除托盘物料表失败");
|
// throw new Exception("删除托盘物料表失败");
|
}
|
else
|
{
|
LogHelper.TaskDetail(logPara, "删除托盘物料表成功");
|
}
|
}
|
if (executeStatePara.endIsCurrentTask.S_LOC_TYPE == "堆叠")
|
{
|
I = newDb.Updateable<Location>().SetColumns(it => new Location()
|
{
|
T_MODIFY = DateTime.Now,
|
N_CURRENT_NUM = it.N_CURRENT_NUM + 1,
|
T_FULL_TIME = DateTime.Now,
|
S_LOCK_STATE = "无",
|
S_TRAY_TYPE = S_TRAY_TYPE
|
}).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "堆叠式更新货位容量,终点货位号:" + executeStatePara.transportTask.S_END_LOC + " 影响行数:" + I);
|
}
|
}
|
}
|
|
#endregion
|
#region 移库
|
|
if (executeStatePara.transportTask.S_TYPE.Equals("移库"))
|
{
|
|
var LocCnt = new LocCntrRel();
|
LocCnt.S_CNTR_CODE = executeStatePara.transportTask.S_CNTRS;
|
LocCnt.S_LOC_CODE = executeStatePara.transportTask.S_END_LOC;
|
|
if (executeStatePara.startTrayLocation != null)
|
{
|
//解绑托盘与货位的关系
|
|
I = newDb.Deleteable<LocCntrRel>().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("删除起点托盘货位表失败");
|
}
|
LogHelper.TaskDetail(logPara, "删除起点托盘货位表");
|
}
|
|
if (executeStatePara.endTrayLocation == null)
|
{
|
//添加托盘货位
|
I = newDb.Insertable(LocCnt).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("添加托盘货位表数据失败");
|
}
|
LogHelper.TaskDetail(logPara, "添加终点托盘货位表");
|
//终点
|
if (executeStatePara.endIsCurrentTask != null && executeStatePara.endStockArea.S_CONTROL_QTY.Equals("Y"))
|
{
|
I = newDb.Updateable<Location>().SetColumns(it => new Location()
|
{
|
T_MODIFY = DateTime.Now,
|
N_CURRENT_NUM = 1,
|
T_FULL_TIME = DateTime.Now,
|
S_LOCK_STATE = "无",
|
S_TRAY_TYPE = S_TRAY_TYPE,
|
productionDate = productionDate,
|
takeEffectTime = takeEffectTime,
|
expireTime = expireTime
|
}).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新入库锁的货位状态为无数量为1失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新入库锁的货位状态为无数量为1失败,终点货位号:" + executeStatePara.transportTask.S_END_LOC);
|
}
|
|
//起点
|
if (executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y"))
|
{
|
I = newDb.Updateable<Location>().SetColumns(it => new Location()
|
{
|
T_MODIFY = DateTime.Now,
|
N_CURRENT_NUM = 0,
|
T_EMPTY_TIME = DateTime.Now,
|
S_LOCK_STATE = "无",
|
S_TRAY_TYPE = "",
|
productionDate = "",
|
takeEffectTime = "",
|
expireTime = ""
|
}).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新出库锁的货位状态为无数量为0失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新出库锁的货位状态为无数量为0,起点货位号:" + executeStatePara.transportTask.S_START_LOC);
|
}
|
}
|
}
|
#endregion
|
#region 添加点对点接驳位释放表数据
|
if (executeStatePara.transportTask.S_Subtask != "Y" && executeStatePara.transportTask.S_TASK_NO.IndexOf('_') < 0 && executeStatePara.transportTask.S_TYPE == "出库" && executeStatePara.transportTask.S_NOTE == "立库任务")
|
{
|
if (executeStatePara.endStockArea.S_CONTROL_QTY.Equals("Y"))
|
{
|
AloneWcsTaskUnbingEntitys aloneWcsTask = new AloneWcsTaskUnbingEntitys()
|
{
|
|
S_TASK_NO = executeStatePara.transportTask.S_TASK_NO,
|
JbLocation = executeStatePara.transportTask.S_END_LOC,
|
IsRead = "N"
|
};
|
I = newDb.Insertable(aloneWcsTask).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("添加点对点接驳位释放表数据失败");
|
}
|
LogHelper.TaskDetail(logPara, "添加点对点接驳位释放表数据失败");
|
}
|
}
|
#endregion
|
newDb.CommitTran();
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO);
|
Task.Run(() =>
|
{
|
if (executeStatePara.transportTask.S_SRC_SYS == "MES")
|
{
|
ZCReceivePriorityEntity mes = new ZCReceivePriorityEntity();
|
|
mes.taskNo = executeStatePara.transportTask.S_UpstreamNo;
|
var task2 = new WMSTask();
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
task2 = SqlSugarHelper.Db.Queryable<WMSTask>().Where(e => e.S_TASK_NO == executeStatePara.transportTask.S_UpstreamNo)?.First();
|
}
|
else
|
{
|
task2 = SqlSugarHelper.Db.Queryable<WMSTask>().Where(e => e.S_TASK_NO == tno)?.First();
|
}
|
if (task2 != null)
|
{
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
mes.End_big = "LCRKAGV";
|
}
|
if (executeStatePara.transportTask.S_TYPE == "出库")
|
{
|
mes.End_big = task2?.S_END_LOC ?? executeStatePara.transportTask.S_END_LOC;
|
}
|
mes.Data_status = 2;
|
//调mes接口
|
BLLCreator.CreateSingleton<MesTask>().MesTaskEntity(mes);
|
}
|
}
|
});
|
|
return OperateResult.Succeed();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex));
|
newDb.RollbackTran();
|
|
if (ex.Message.Contains("死锁"))
|
{
|
newDb.BeginTran();
|
|
var I = newDb.Insertable(Deck).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
|
}
|
return OperateResult.Error(JsonConvert.SerializeObject(ex));
|
}
|
}
|
public virtual OperateResult CancelTask(ExecuteStateParaDto executeStatePara, LogPara logPara, string UserName = "")
|
{
|
List<string> TaskState = new List<string>() { "取消", "完成", "卸货完成" };
|
if (TaskState.Contains(executeStatePara.transportTask.S_B_STATE))
|
{
|
return OperateResult.Error("只能取消非取消/完成/卸货完成的任务!");
|
}
|
deadlockRollEntitys Deck = new deadlockRollEntitys();
|
Deck.S_INTER_STATE = "7";
|
Deck.S_VALUE_JSON = executeStatePara.transportTask.S_TASK_NO;
|
//中策项目对取消操作管控的最严 一不留神的操作可能造成整个任务和数据的错乱
|
WMSTask task = executeStatePara.transportTask;
|
WMSTask Wmtask = null;
|
WMSTask Twotask = null;
|
WMSTask Agvtask = null;
|
string tno = executeStatePara.transportTask.S_TASK_NO;
|
string navNo = "";
|
if (tno.IndexOf('_') > 0)
|
{
|
navNo = tno.Substring(tno.IndexOf("_") + 1);
|
}
|
//主任务号
|
string Tno = "";
|
bool Desc = false;
|
bool esc = false;
|
bool Wcs = false;
|
bool CkTask2 = false;
|
bool RkTask = false;
|
var WcsTask = new WMSTask();
|
//这里 如果任务有分发子任务 说明是出库任务 并且该任务在进行的途中 这时候是不允许取消主任务的
|
//立库任务取消要通知立库
|
if (tno.IndexOf('_') < 0 && executeStatePara.transportTask.S_Subtask == "Y")
|
{
|
var tasklist = new List<string> { tno + "_1", tno + "_2" };
|
Wmtask = executeStatePara.transportTaskSrc.Find(e => tasklist.Contains(e.S_TASK_NO));
|
|
if (Wmtask != null)
|
{
|
return OperateResult.Error("主任务不允许直接取消,请先取消子任务!!");
|
}
|
}
|
//如果程序进入这里 ↓ 说明是子任务取消操作 这时候获取主任务的信息
|
if (tno.IndexOf('_') > 0)
|
{
|
tno = tno.Substring(0, tno.LastIndexOf("_"));
|
task = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno);
|
Tno = tno;
|
}
|
else if (executeStatePara.transportTask.S_TYPE.Equals("入库"))
|
{
|
//能进这里 说明是agv在入库 或者 RFID不符的时候 上报取消操作 这时候需要先删除库中的物料
|
RkTask = true;
|
}
|
if (navNo == "2" && executeStatePara.transportTask.S_NOTE.Equals("agv任务"))//出库
|
{
|
//能进这里 说明是agv在出库 这时候要判断 立库是否执行完成 如果完成了 可以取消 没完成禁止取消
|
Twotask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == Tno + "_1");
|
if (Twotask.S_B_STATE.Trim().Equals("完成") || Twotask.S_B_STATE.Trim().Equals("取消"))
|
{
|
Desc = true;
|
}
|
else
|
{
|
return OperateResult.Error("立库任务一旦运行,无法取消!");
|
}
|
}
|
if (navNo == "2" && executeStatePara.transportTask.S_NOTE.Equals("agv任务"))//出库
|
{
|
//能进这里说明立库任务已经处于完成状态 这时候 查询agv任务
|
Twotask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == Tno + "_2");
|
|
if (Twotask.S_B_STATE.Equals("取货完成"))
|
{
|
CkTask2 = true;
|
}
|
}
|
if (navNo == "2" && executeStatePara.transportTask.S_NOTE.Equals("立库任务"))//入库
|
{
|
//能进这里说明是入库的第二阶段 八成原因的RFID异常 要取消任务 这时候需要判断ams任务是否处于完成状态
|
Twotask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == Tno + "_1");
|
|
if (Twotask.S_B_STATE.Trim().Equals("完成") || Twotask.S_B_STATE.Trim().Equals("卸货完成"))
|
{
|
esc = true;
|
}
|
}
|
if (navNo == "1" && executeStatePara.transportTask.S_NOTE.Equals("立库任务"))//出库
|
{
|
//能进这里说明 是出库任务 并且报取消的是立库任务 这时候需要判断立库任务的实时状态
|
Twotask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == Tno + "_1");
|
Agvtask = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == Tno + "_2");
|
if (Twotask.S_B_STATE.Trim().Equals("未执行") || Twotask.S_B_STATE.Trim().Equals("执行中") || Twotask.S_B_STATE.Trim().Equals("取货完成"))
|
{
|
Wcs = true;
|
}
|
else
|
{
|
return OperateResult.Error("立库任务一旦运行,无法取消!");
|
}
|
}
|
if (navNo == "1" && executeStatePara.transportTask.S_NOTE.Equals("agv任务"))//入库
|
{
|
//能进这里说明 是入库任务 并且报取消的是立库任务 这时候需要判断立库任务的实时状态
|
|
Task.Run(() =>
|
{
|
NDCHelper.Cancel(executeStatePara.transportTask.S_TASK_NO);//取消agv任务
|
LogHelper.TaskDetail(logPara, "1通知agv取消任务" + executeStatePara.transportTask.S_TASK_NO);
|
});
|
|
}
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
try
|
{
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO);
|
newDb.BeginTran();
|
var I = 0;
|
if (CkTask2)
|
{
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新任务状态失败" + executeStatePara.transportTask.S_TASK_NO);
|
|
if (Tno != "")
|
{
|
//当子任务取消了 主任务跟着取消
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
}
|
}
|
if (RkTask)
|
{
|
I = newDb.Deleteable<CntrItemRel>().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "删除托盘物料表 托盘:" + executeStatePara.transportTask.S_CNTRS);
|
}
|
if (executeStatePara.transportTask.S_NOTE.Equals("agv任务") && UserName == "")
|
{
|
UserName = "agv";
|
}
|
else if (!executeStatePara.transportTask.S_NOTE.Equals("自管任务") && UserName == "")
|
{
|
UserName = "立库";
|
}
|
//更新任务状态
|
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新任务状态成功" + executeStatePara.transportTask.S_TASK_NO);
|
if (Tno != "")
|
{
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新任务状态失败 " + "子任务取消 主任务跟着取消 主任务 任务号为" + Tno);
|
}
|
//终点
|
if (executeStatePara.transportTask.S_TYPE.Equals("入库") || executeStatePara.transportTask.S_TYPE.Equals("转运")
|
|| executeStatePara.transportTask.S_TYPE.Equals("移库"))
|
{
|
if (executeStatePara.transportTask.S_TASK_NO.IndexOf('_') < 1 && executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.transportTask.S_Subtask != "Y")
|
{
|
NDCHelper.Cancel(executeStatePara.transportTask.S_TASK_NO);//取消agv任务
|
LogHelper.TaskDetail(logPara, "通知agv取消3任务" + executeStatePara.transportTask.S_TASK_NO);
|
}
|
else if (executeStatePara.transportTask.S_TASK_NO.IndexOf('_') < 1 && executeStatePara.transportTask.S_NOTE.Equals("立库任务") && executeStatePara.transportTask.S_Subtask != "Y")
|
{
|
var re = BLLCreator.CreateSingleton<WcsTask>().WcsCancellTask(executeStatePara.transportTask);
|
LogHelper.TaskDetail(logPara, $"立库任务取消通知{JsonConvert.SerializeObject(executeStatePara.transportTask)} 是否成功:{JsonConvert.SerializeObject(re)}");
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
}
|
if (executeStatePara.endStockArea.S_CONTROL_QTY.Equals("Y"))
|
{
|
I = newDb.Updateable<Location>().SetColumns(it => new Location() { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC && x.S_LOCK_STATE == "入库锁").ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "更新终点货位" + executeStatePara.transportTask.S_END_LOC + "的状态为无!" + $"影响行数{I}");
|
}
|
if (task != null)
|
{
|
I = newDb.Updateable<Location>().SetColumns(it => new Location() { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == task.S_END_LOC && x.S_LOCK_STATE == "入库锁").ExecuteCommand();
|
|
LogHelper.TaskDetail(logPara, "更新主任务终点货位" + task.S_END_LOC + "的状态为无!" + $"影响行数{I}");
|
if (task.S_TYPE.Equals("入库"))
|
{
|
I = newDb.Deleteable<CntrItemRel>().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "删除托盘产品关联结果--托盘:" + executeStatePara.transportTask.S_CNTRS);
|
}
|
}
|
}
|
if (Desc)
|
{
|
if (executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y"))
|
{
|
AloneWcsTaskUnbingEntitys aloneWcsTask = new AloneWcsTaskUnbingEntitys()
|
{
|
S_TASK_NO = executeStatePara.transportTask.S_TASK_NO,
|
JbLocation = Twotask.S_START_LOC,
|
IsRead = "N"
|
};
|
I = newDb.Insertable(aloneWcsTask).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("Agv取消释放接驳位");
|
}
|
LogHelper.TaskDetail(logPara, "Agv取消释放接驳位");
|
}
|
NDCHelper.Cancel(Twotask.S_TASK_NO);//取消agv任务
|
LogHelper.TaskDetail(logPara, "2通知agv取消任务" + Twotask.S_TASK_NO);
|
}
|
if (esc)
|
{
|
var re = BLLCreator.CreateSingleton<WcsTask>().WcsCancellTask(executeStatePara.transportTask);
|
LogHelper.TaskDetail(logPara, $"立库任务取消通知{JsonConvert.SerializeObject(executeStatePara.transportTask)} 是否成功:{JsonConvert.SerializeObject(re)}");
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
I = newDb.Updateable<Location>().SetColumns(it => new Location() { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC && x.S_LOCK_STATE == "入库锁").ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "更新主任务终点货位" + executeStatePara.transportTask.S_END_LOC + "的状态为无!");
|
}
|
//在立库任务没有执行的时候取消任务则释放 终点接驳位
|
if (Wcs)
|
{
|
var re = BLLCreator.CreateSingleton<WcsTask>().WcsCancellTask(Twotask);
|
LogHelper.TaskDetail(logPara, $"立库任务取消通知{JsonConvert.SerializeObject(Twotask)} 是否成功:{JsonConvert.SerializeObject(re)}");
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
I = newDb.Updateable<Location>().SetColumns(it => new Location() { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == Twotask.S_END_LOC && x.S_LOCK_STATE == "入库锁").ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "更新立库任务终点货位" + Twotask.S_END_LOC + "的状态为无!" + $"影响行数{I}");
|
//更新agv子任务 任务状态
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == Agvtask.S_ID).ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "更新agv子任务的任务 " + Agvtask.S_TASK_NO + "的状态为取消!" + $"影响行数{I}");
|
NDCHelper.Cancel(Agvtask.S_TASK_NO);//取消agv任务
|
LogHelper.TaskDetail(logPara, "3通知agv取消任务" + Agvtask.S_TASK_NO);
|
}
|
//起点
|
if (executeStatePara.transportTask.S_TYPE.Equals("出库") || executeStatePara.transportTask.S_TYPE.Equals("转运")
|
|| executeStatePara.transportTask.S_TYPE.Equals("移库"))
|
{
|
if (executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y"))
|
{
|
var Stalocarion = Twotask?.S_START_LOC ?? executeStatePara.transportTask.S_START_LOC;
|
I = newDb.Updateable<Location>().SetColumns(it => new Location() { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == Stalocarion && x.S_LOCK_STATE == "出库锁").ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "更新起点货位" + executeStatePara.transportTask.S_START_LOC + "的状态为无!" + $"影响行数{I}");
|
}
|
if (executeStatePara.transportTask.S_TASK_NO.IndexOf('_') < 1 && executeStatePara.transportTask.S_NOTE.Equals("agv任务") && executeStatePara.transportTask.S_Subtask != "Y")
|
{
|
NDCHelper.Cancel(executeStatePara.transportTask.S_TASK_NO);//取消agv任务
|
LogHelper.TaskDetail(logPara, "4通知agv取消任务" + executeStatePara.transportTask.S_TASK_NO);
|
}
|
if (executeStatePara.transportTask.S_TASK_NO.IndexOf('_') < 1 && executeStatePara.transportTask.S_NOTE.Equals("立库任务") && executeStatePara.transportTask.S_Subtask != "Y")
|
{
|
var re = BLLCreator.CreateSingleton<WcsTask>().WcsCancellTask(executeStatePara.transportTask);
|
LogHelper.TaskDetail(logPara, $"立库任务取消通知{JsonConvert.SerializeObject(executeStatePara.transportTask)} 是否成功:{JsonConvert.SerializeObject(re)}");
|
if (!re.Success)
|
{
|
throw new Exception(re.Msg);
|
}
|
}
|
if (executeStatePara.transportTask.S_Subtask == "Y" && executeStatePara.transportTask.S_NOTE.Equals("agv任务"))
|
{
|
if (executeStatePara.transportTask.S_B_STATE.Equals("未执行") || executeStatePara.transportTask.S_B_STATE.Equals("执行中") || executeStatePara.transportTask.S_B_STATE.Equals("已推送"))
|
{
|
AloneWcsTaskUnbingEntitys aloneWcsTask = new AloneWcsTaskUnbingEntitys()
|
{
|
|
S_TASK_NO = executeStatePara.transportTask.S_TASK_NO,
|
JbLocation = executeStatePara.transportTask.S_START_LOC,
|
IsRead = "N"
|
};
|
I = newDb.Insertable(aloneWcsTask).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("添加点对点接驳位释放表数据失败");
|
}
|
LogHelper.TaskDetail(logPara, "添加点对点接驳位释放表数据");
|
}
|
}
|
}
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO);
|
newDb.CommitTran();
|
Task.Run(() =>
|
{
|
if (executeStatePara.transportTask.S_SRC_SYS == "MES")
|
{
|
ZCReceivePriorityEntity mes = new ZCReceivePriorityEntity();
|
mes.taskNo = executeStatePara.transportTask.S_UpstreamNo;
|
var task2 = new WMSTask();
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
task2 = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == executeStatePara.transportTask.S_UpstreamNo);
|
}
|
else
|
{
|
task2 = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno);
|
}
|
if (task2 != null)
|
{
|
if (executeStatePara.transportTask.S_TYPE == "入库")
|
{
|
mes.End_big = task2?.S_START_LOC ?? executeStatePara.transportTask.S_START_LOC;
|
}
|
if (executeStatePara.transportTask.S_TYPE == "出库")
|
{
|
mes.End_big = task2?.S_END_LOC ?? executeStatePara.transportTask.S_END_LOC;
|
}
|
mes.Data_status = 3;
|
//调mes接口
|
BLLCreator.CreateSingleton<MesTask>().MesTaskEntity(mes);
|
}
|
|
}
|
});
|
|
return OperateResult.Succeed();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex));
|
newDb.RollbackTran();
|
if (ex.Message.Contains("死锁"))
|
{
|
newDb.BeginTran();
|
|
var I = newDb.Insertable(Deck).ExecuteCommand();
|
if (I == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
|
}
|
return OperateResult.Error(JsonConvert.SerializeObject(ex));
|
}
|
}
|
public OperateResult PickSucc(ExecuteStateParaDto executeStatePara, LogPara logPara)
|
{
|
if (!executeStatePara.transportTask.S_B_STATE.Equals("未执行") && !executeStatePara.transportTask.S_B_STATE.Equals("已推送") && !executeStatePara.transportTask.S_B_STATE.Equals("执行中") && !executeStatePara.transportTask.S_B_STATE.Equals("开始取货"))
|
{
|
return OperateResult.Error("只能执行已推送/未执行/执行中的任务!");
|
}
|
var locationExt = SqlSugarHelper.Db.Queryable<Location>().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC)?.First();
|
if (locationExt == null)
|
{
|
return OperateResult.Error("当前任务起点未找到货位扩展记录!");
|
}
|
|
|
string tno = executeStatePara.transportTask.S_TASK_NO;
|
if (tno.IndexOf('_') > 0)
|
{
|
tno = tno.Substring(0, tno.LastIndexOf("_"));
|
}
|
// 获取主任务
|
// var task = SqlSugarHelper.Db.Queryable<WMSTask>().Where(e => e.S_TASK_NO == tno)?.First();
|
var task = executeStatePara.transportTaskSrc.Find(e => e.S_TASK_NO == tno);
|
LogHelper.TaskDetail(logPara, "获取主任务:任务编号: " + tno);
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
Location location2 = null;
|
List<ConfigValueList> ListValues = new List<ConfigValueList>();
|
//if (executeStatePara.startIsCurrentTask.S_NOTE == "智能空桶满托")
|
//{
|
// //查询配置表信息
|
// var transport = newDb.Queryable<ConfigJsonEntitys>().Where(e => e.Autoindex == "智能空桶缓存")?.First();
|
// if (transport != null)
|
// {
|
// ListValues = JsonConvert.DeserializeObject<List<ConfigValueList>>(transport.TypeJson);
|
// if (ListValues.Count() > 0)
|
// {
|
// //查询出对应的空托缓存位
|
// var ggf = ListValues.Find(e => e.LocationCode1 == executeStatePara.transportTask.S_START_LOC);
|
// if (ggf != null)
|
// {
|
// location2 = newDb.Queryable<Location>().Where(e => e.S_LOC_CODE == ggf.LocationCode2)?.First();
|
// }
|
// }
|
// }
|
//}
|
try
|
{
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO);
|
newDb.BeginTran();
|
//更新任务状态
|
var I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新任务状态" + executeStatePara.transportTask.S_TASK_NO);
|
LogHelper.TaskDetail(logPara, "更新任务状态为:" + executeStatePara.taskState);
|
//回报mes
|
var bit = "";
|
if (task.S_TYPE == "出库")
|
{
|
bit = task.S_END_LOC;
|
}
|
if (executeStatePara.startTrayLocation != null)
|
{
|
//解绑托盘与货位的关系
|
I = newDb.Deleteable<LocCntrRel>().Where(e => e.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
//I = SqlSugarHelper.Db.Deleteable(executeStatePara.startTrayLocation).ExecuteCommand();
|
if (I == 0)
|
{
|
LogHelper.TaskDetail(logPara, "删除起点托盘货位表失败 " + executeStatePara.transportTask.S_CNTRS);
|
// throw new Exception("删除起点托盘货位表失败");
|
}
|
else
|
{
|
LogHelper.TaskDetail(logPara, "删除起点托盘货位表成功 " + executeStatePara.transportTask.S_CNTRS);
|
}
|
//I = SqlSugarHelper.Db.Updateable<Location>().SetColumns(it => new Location() { N_CURRENT_NUM = 0, S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC && x.S_LOCK_STATE == "出库锁").ExecuteCommand();
|
//if (I == 0)
|
//{
|
// throw new Exception("更新终点货位" + executeStatePara.transportTask.S_END_LOC + "的状态为无!");
|
//}
|
//LogHelper.TaskDetail(logPara, "更新任务终点货位" + executeStatePara.transportTask.S_START_LOC + "的状态锁为无!");
|
}
|
//if (executeStatePara.transportTask.S_TYPE.Equals("入库") && executeStatePara.startIsCurrentTask.S_NOTE == "智能空桶满托")
|
//{
|
// if (location2 != null && (location2.N_CURRENT_NUM - 1 >= 0))
|
// {
|
// I = newDb.Updateable<Location>().SetColumns(it => new Location()
|
// {
|
// T_MODIFY = DateTime.Now,
|
// N_CURRENT_NUM = it.N_CURRENT_NUM - 1,
|
// T_EMPTY_TIME = DateTime.Now
|
// }).Where(x => x.S_LOC_CODE == location2.S_LOC_CODE).ExecuteCommand();
|
// if (I == 0)
|
// {
|
// throw new Exception("更新终点当前容量-1失败");
|
// }
|
// }
|
//}
|
if (executeStatePara.transportTask.S_TYPE.Equals("出库"))
|
{
|
//删除托盘产品关联
|
if (executeStatePara.endStockArea.S_CONTROL_QTY != "Y")
|
{
|
I = newDb.Deleteable<CntrItemRel>().Where(e => e.S_CNTR_CODE == executeStatePara.transportTask.S_CNTRS).ExecuteCommand();
|
//if (I == 0)
|
//{
|
// throw new Exception("删除托盘物料表失败");
|
//}
|
LogHelper.TaskDetail(logPara, "删除托盘产品关联结果--托盘:" + executeStatePara.transportTask.S_CNTRS);
|
}
|
}
|
//起点是否属于当前任务
|
if (executeStatePara.startIsCurrentTask != null && executeStatePara.startStockArea.S_CONTROL_QTY.Equals("Y"))
|
{
|
if (executeStatePara.startIsCurrentTask.N_CAPACITY < 2)
|
{
|
I = newDb.Updateable<Location>().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 0, S_LOCK_STATE = "无", S_TRAY_TYPE = "", productionDate = "", takeEffectTime = "", expireTime = "" }).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_START_LOC).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新终点货位" + executeStatePara.transportTask.S_START_LOC + "的状态为无 更新失败!");
|
}
|
LogHelper.TaskDetail(logPara, "更新任务终点货位" + executeStatePara.transportTask.S_START_LOC + "的状态锁为无!");
|
}
|
}
|
newDb.CommitTran();
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO);
|
return OperateResult.Succeed();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex));
|
newDb.RollbackTran();
|
return OperateResult.Error(JsonConvert.SerializeObject(ex));
|
}
|
}
|
|
/// <summary>
|
/// 卸货完成
|
/// </summary>
|
/// <param name="executeStatePara"></param>
|
/// <param name="logPara"></param>
|
/// <returns></returns>
|
public OperateResult UnloadingSucc(ExecuteStateParaDto executeStatePara, LogPara logPara)
|
{
|
List<string> TaskState = new List<string>() { "取消", "完成", "卸货完成" };
|
if (TaskState.Contains(executeStatePara.transportTask.S_B_STATE))
|
{
|
return OperateResult.Error("只能执行没有 取消/完成/卸货完成的任务!");
|
}
|
if (executeStatePara.transportTask.S_NOTE.Equals("自管任务") && executeStatePara.transportTask.S_Subtask == "Y")
|
{
|
return OperateResult.Error("主任务禁止直接完成!");
|
}
|
var taskNo = executeStatePara.transportTask.S_TASK_NO;
|
string topNo = "";
|
if (taskNo.IndexOf("_") > 0)
|
{
|
topNo = taskNo.Substring(0, taskNo.IndexOf("_"));
|
}
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
|
List<string> AreaLo = new List<string>() { "TCXB", "TTXB", "NCXB", "DSXB", "TMXB", "TQXB", "TQJT" };
|
WMSTask PritTask = null;
|
//查询是否是相关库区
|
if (executeStatePara.transportTask.S_TYPE == "出库" && AreaLo.Contains(executeStatePara.transportTask.S_END_LAREA))
|
{
|
LogHelper.TaskDetail(logPara, $"更新任务优先级-任务号:{executeStatePara.transportTask.S_TASK_NO} 终点库区是否包含{JsonConvert.SerializeObject(AreaLo)} 本任务:" + executeStatePara.transportTask.S_END_LAREA);
|
//查询配置文件
|
var transportTask = STAttribute.GetValueTwo(executeStatePara.transportTask.S_END_LAREA + "-送满取空");
|
if (transportTask != null)
|
{
|
var ListString = JsonConvert.DeserializeObject<List<ConfigValueListTwo>>(transportTask);
|
if (ListString != null && ListString.Count > 0)
|
{
|
var Strin = ListString.Find(e => e.LocationCode1 == executeStatePara.transportTask.S_END_LOC);
|
LogHelper.TaskDetail(logPara, "更新任务优先级-任务号:" + executeStatePara.transportTask.S_TASK_NO + "是否匹配到了队友的货位信息" + JsonConvert.SerializeObject(Strin));
|
if (Strin != null)
|
{
|
//查询旁边的货位是否有已推送但是没执行的任务
|
// List<string> TaskState2 = new List<string> { "未执行", "已推送", "执行中" };
|
var SfgLo = newDb.Queryable<WMSTask>().Where(e => Strin.LocationCode2.Contains(e.S_START_LOC) && e.S_NOTE.Equals("agv任务") && (e.S_B_STATE == "未执行" || e.S_B_STATE == "已推送" || e.S_B_STATE == "执行中")).ToList();
|
LogHelper.TaskDetail(logPara, "更新任务优先级-任务号:" + executeStatePara.transportTask.S_TASK_NO + "匹配到的货位 是否存在 是agv任务 并且任务状态为 未执行/已推送/执行中 的任务有:" + JsonConvert.SerializeObject(SfgLo));
|
if (SfgLo.Count() > 0)//有这个任务
|
{
|
//看这个任务是否是有处于配置空托第一位的货位
|
var OneLoc = Strin.LocationCode2.FirstOrDefault();
|
LogHelper.TaskDetail(logPara, "更新任务优先级 配置中第一个货位为:" + OneLoc);
|
var OneTask = SfgLo.Find(e => e.S_START_LOC == OneLoc);
|
if (OneTask != null)
|
{
|
if (OneTask.S_B_STATE == "未执行")//推送任务
|
{
|
OneTask.N_PRIORITY = 60;
|
TaskProcess.SendTask(OneTask);
|
}
|
else
|
{
|
var Agvstr = NDCHelper.ChangeParamPri(OneTask.S_TASK_NO, 60);
|
LogHelper.TaskDetail(logPara, "更新任务优先级-任务号:" + OneTask.S_TASK_NO + "优先级为:" + 60 + " 是否成功 :" + Agvstr);
|
}
|
PritTask = OneTask;
|
}
|
else
|
{
|
SfgLo = SfgLo.OrderBy(e => e.T_CREATE).ToList();
|
var OneTaskR = SfgLo.FirstOrDefault();
|
if (OneTaskR.S_B_STATE == "未执行")//推送任务
|
{
|
OneTaskR.N_PRIORITY = 60;
|
TaskProcess.SendTask(OneTaskR);
|
}
|
else
|
{
|
var Agvstr = NDCHelper.ChangeParamPri(OneTaskR.S_TASK_NO, 60);
|
LogHelper.TaskDetail(logPara, "更新任务优先级-任务号:" + OneTaskR.S_TASK_NO + "优先级为:" + 60 + " 是否成功 :" + Agvstr);
|
}
|
PritTask = OneTaskR;
|
}
|
}
|
}
|
}
|
}
|
}
|
|
try
|
{
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务开始:" + executeStatePara.transportTask.S_TASK_NO);
|
newDb.BeginTran();
|
//更新任务状态
|
var I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { S_B_STATE = executeStatePara.taskState }).Where(e => e.S_ID == executeStatePara.transportTask.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新任务状态" + executeStatePara.transportTask.S_TASK_NO);
|
LogHelper.TaskDetail(logPara, "更新任务状态为:" + executeStatePara.taskState);
|
//主任务状态更改为:完成一半
|
LogHelper.TaskDetail(logPara, $" 主任务号{topNo} 类型:{executeStatePara.transportTask.S_TYPE} mark:{executeStatePara.transportTask.mark}");
|
if (!string.IsNullOrEmpty(topNo) && executeStatePara.transportTask.S_TYPE.Equals("入库") && executeStatePara.transportTask.mark != "Y")
|
{
|
if (executeStatePara.endIsCurrentTask.S_LOC_TYPE != "接驳位")
|
{
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { S_B_STATE = Constants.TaskState_Complete }).Where(e => e.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新主任务状态-任务号:" + topNo + "状态为:" + Constants.TaskState_Complete);
|
}
|
else
|
{
|
I = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { S_B_STATE = Constants.TaskState_CompleteHalf, S_READ_LOCK = "N" }).Where(e => e.S_ID == executeStatePara.transportTaskZ.S_ID).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新任务状态失败");
|
}
|
LogHelper.TaskDetail(logPara, "更新主任务状态-任务号:" + topNo + "状态为:" + Constants.TaskState_CompleteHalf);
|
}
|
}
|
if (executeStatePara.endIsCurrentTask.S_NOTE == "智能空桶缓存点")
|
{
|
if (executeStatePara.endIsCurrentTask.N_CURRENT_NUM + 1 <= executeStatePara.endIsCurrentTask.N_CAPACITY)
|
{
|
I = newDb.Updateable<Location>().SetColumns(it => new Location()
|
{
|
T_MODIFY = DateTime.Now,
|
N_CURRENT_NUM = it.N_CURRENT_NUM + 1,
|
T_EMPTY_TIME = DateTime.Now
|
}).Where(x => x.S_LOC_CODE == executeStatePara.transportTask.S_END_LOC).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新终点当前容量+1失败");
|
}
|
}
|
}
|
|
if (PritTask != null)
|
{
|
// var ddd = executeStatePara.transportTaskSrc.Select(e => e.S_ID).ToList();
|
var ggj = newDb.Updateable<WMSTask>().SetColumns(it => new WMSTask() { N_PRIORITY = 60 }).Where(e => e.S_ID == PritTask.S_ID).ExecuteCommand();
|
LogHelper.TaskDetail(logPara, "更新任务优先级-任务号:" + PritTask.S_TASK_NO + "优先级为:" + 60 + " 是否成功 改wms任务 影响行数:" + ggj);
|
}
|
newDb.CommitTran();
|
LogHelper.TaskDetail(logPara, "更新任务状态 事务结束:" + executeStatePara.transportTask.S_TASK_NO);
|
return OperateResult.Succeed();
|
}
|
catch (Exception ex)
|
{
|
LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex));
|
newDb.RollbackTran();
|
return OperateResult.Error(JsonConvert.SerializeObject(ex));
|
}
|
}
|
|
}
|
|
}
|