using HH.WCS.Hexafluo;
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.ZCQTJ.dispatch;
using HH.WCS.ZCQTJ.Dto;
using HH.WCS.ZCQTJ.Entitys;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using static HH.WCS.SJML.api.ApiModel;
namespace HH.WCS.SJML.Bll
{
public class ZCBLL
{
///
/// 处理自管任务
///
public void SelfManageTaskOut(List TaskList)
{
try
{
#region 参数校验1 config
List ors = new List();
#endregion
var chi = new SqlHelper().GetInstance();
var newDb = chi.CopyNew();
foreach (var task in TaskList)
{
LogHelper.DanInfo("处理自管任务", " 出库 开始------任务:" + task.S_TASK_NO);
try
{
bool ggf = true;
bool WCSBOOL = false;
// 出库主任务是同时下两条子任务
if ((task.S_TYPE == "出库") && task.S_Subtask == "Y")
{
#region 出库
#region 参数校验2
//立库货位
string lkBit = task.S_START_LOC;
var locationBit = LocationHelper.LocationCode(lkBit);
var tTaskNum = newDb.Queryable().Where(e => e.S_AreaCode == task.S_START_LAREA && e.S_IsUse == "Y")?.First();
//获取托盘号 如果起点管控的话
var endArea = newDb.Queryable().Where(e => e.S_AREA_CODE == task.S_END_LAREA)?.First();
if (endArea != null && endArea.S_CONTROL_QTY == "Y")
{
var locaBit = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_CNTRS).First();
if (locaBit == null)
{
LogHelper.DanInfo("处理自管任务", "未找到托盘货位绑定:其中 S_CNTRS=" + task.S_CNTRS);
throw new Exception("未找到托盘货位绑定:其中 S_CNTRS=" + task.S_CNTRS);
}
}
var Itemgh = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_CNTRS).First();
var ToBit = LocationHelper.LocationCodeJbw(task.S_START_LOC);
if (ToBit == null)
{
LogHelper.DanInfo("处理自管任务", "未找到巷道号:其中 S_START_LOC=" + task.S_START_LOC);
throw new Exception("未找到巷道号:其中 S_START_LOC=" + task.S_START_LOC);
}
if (locationBit == null)
throw new Exception("未找到立库货位:" + lkBit);
//通过任务类型找接驳位
var _bit = "";
string input = task.S_Jb_Bit;
List result = input.Split(',').ToList();
if (tTaskNum != null && Itemgh != null)
{
//查询起点库区对应巷道总任务量
var TaskLis = newDb.Queryable().Where(e => e.S_START_LAREA == task.S_START_LAREA && e.S_Main_task == "主任务" && e.S_B_STATE == "未执行" && (e.S_Jb_Bit.Contains(result.FirstOrDefault()) || e.S_Jb_Bit.Contains(result.LastOrDefault()))).ToList();
if (TaskLis.Count > 0)
{
//筛选出库的全部满托任务
var TaskTray = TaskLis.Select(e => e.S_CNTRS).ToList();
LogHelper.DanInfo("处理自管任务", "筛选出库的全部满托任务" + JsonConvert.SerializeObject(TaskTray));
//查托盘空满
var TaskItemghList = newDb.Queryable().Where(e => TaskTray.Contains(e.S_CNTR_CODE)).ToList();
if (TaskItemghList.Count() > 0)
{
//获取满托的托盘集合
var MtTray = TaskItemghList.Select(e => e.S_CNTR_CODE).ToList();
LogHelper.DanInfo("处理自管任务", "筛选出库的全部满托任务" + JsonConvert.SerializeObject(MtTray));
TaskLis = TaskLis.FindAll(e => MtTray.Contains(e.S_CNTRS)).ToList();
}
}
if (TaskLis.Count() > 0)
{
LogHelper.DanInfo("处理自管任务", $"起点库区{task.S_START_LAREA} 所处的巷道的 未执行的任务量为:{TaskLis.Count()}");
LogHelper.DanInfo("处理自管任务", $"最大任务数为{tTaskNum.N_TaskQuantity}");
if (TaskLis.Count() < tTaskNum.N_TaskQuantity)
{
if (result.Count > 1)
{
LogHelper.DanInfo("处理自管任务", $"排除前接驳位有{JsonConvert.SerializeObject(result)}");
result.RemoveRange(1, result.Count - 1);
LogHelper.DanInfo("处理自管任务", $"排除后接驳位有{JsonConvert.SerializeObject(result)}");
}
}
}
}
Location connectBit = new Location();
foreach (var item in result)
{
if (string.IsNullOrEmpty(item))
continue;
connectBit = LocationHelper.LocationCodeJbw(item);
if (connectBit == null)
continue;
if (connectBit.N_CAPACITY > 1)
{
ggf = false;
//查任务数
List State = new List { "完成", "取消" };
var TaskLis = newDb.Queryable().Where(e => e.S_NOTE == "立库任务"
&& !State.Contains(e.S_B_STATE) && e.S_TYPE == "出库" && e.S_END_LOC == connectBit.S_LOC_CODE).ToList();
if (TaskLis.Count() >= connectBit.N_CAPACITY)
{
continue;
}
}
else
{
if (connectBit.S_LOCK_STATE != "无" || connectBit.N_CURRENT_NUM > 0)
continue;
}
_bit = item;
}
if (string.IsNullOrEmpty(_bit))
{
throw new Exception("当前出库任务" + task.S_TASK_NO + "没有可用接驳位!");
}
//var readytBit = LocationHelper.LocationCode(task.S_Zb_Bit);
//if (readytBit == null)
// throw new Exception("未找到准备点货位:" + task.S_Zb_Bit);
#endregion
//赋值接驳位
#region 检查待出库托盘的外侧是否有托盘阻挡,如果有则将其移开
bool existObstruct = false;
Location obstructBit = null;
WMSTask taskEntityYk = null;
string taskNoYk = task.S_TASK_NO + "_yk";
if (locationBit.N_SIDE == 2)
{
var lca = Expressionable.Create();
lca.And(it => it.N_ROW == locationBit.N_ROW);
lca.And(it => it.N_COL == locationBit.N_COL);
lca.And(it => it.N_LAYER == locationBit.N_LAYER);
lca.And(it => it.N_ROADWAY == locationBit.N_ROADWAY);
List lstLocation = newDb.Queryable().Where(lca.ToExpression()).ToList();
if (lstLocation.Count() == 0)
{
LogHelper.DanInfo("处理自管任务", "移库任务:: 货位表没有可用货位");
throw new Exception("没有可用货位");
}
//如果外侧有阻挡,就将外侧的货位的CN_S_TASK_NO 获取到
obstructBit = lstLocation.Where(o => o.S_LOC_CODE != locationBit.S_LOC_CODE).FirstOrDefault();
if (obstructBit != null)
if (obstructBit.S_LOCK_STATE == "无" && obstructBit.N_CURRENT_NUM > 0 && obstructBit.N_SIDE == 1)
{
existObstruct = true;
//生成一条移库任务LocCntrRel
LocCntrRel objTray = newDb.Queryable().Where(e => e.S_LOC_CODE == obstructBit.S_LOC_CODE).First();
if (objTray == null)
{
throw new Exception("阻挡货位没有绑定托盘:" + obstructBit.S_LOC_CODE);
}
//获取该巷道中的空货位
var emptyLca = Expressionable.Create();
emptyLca.And(it => it.S_LOCK_STATE == "无");
emptyLca.And(it => it.N_CURRENT_NUM == 0);
emptyLca.And(it => it.N_ROADWAY == locationBit.N_ROADWAY);
emptyLca.And(it => it.S_AREA_CODE == locationBit.S_AREA_CODE);
List emptyLocation = newDb.Queryable().Where(emptyLca.ToExpression()).ToList();
if (emptyLocation.Count() == 0)
{
LogHelper.DanInfo("处理自管任务", "移库任务:: 货位表没有该巷道中的可用空货位 CN_S_AREA_CODE=" + locationBit.S_AREA_CODE);
throw new Exception("没有可用货位");
}
var exp = Expressionable.Create();
exp.And(it => it.S_AREA_CODE == obstructBit.S_AREA_CODE);
exp.And(it => it.S_STRATEGY_TYPE == "入库");
exp.And(it => it.S_START_USING == "Y");
List lstStrategy = newDb.Queryable().Where(exp.ToExpression()).ToList();
//获取预出库锁定的货位
if (lstStrategy.Select(o => o.S_STRATEGY_CODE).ToList().Contains("FirstInLastOut"))
{
//去除预出库锁定的排列层
var loca = Expressionable.Create();
loca.And(it => it.S_WH_CODE == obstructBit.S_WH_CODE);
loca.And(it => it.S_AREA_CODE == obstructBit.S_AREA_CODE);
loca.And(it => it.S_LOCK_STATE == "出库锁");
List locationOutLock = newDb.Queryable().Where(loca.ToExpression()).ToList();
LogHelper.DanInfo("处理自管任务", "locationOutLock数据:" + JsonConvert.SerializeObject(locationOutLock));
foreach (Location lEntity in locationOutLock)
{
emptyLocation.RemoveAll(o => o.N_ROW == lEntity.N_ROW && o.N_COL == lEntity.N_COL && o.N_LAYER == lEntity.N_LAYER);
}
LogHelper.DanInfo("处理自管任务", "去除预出库锁定后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation));
//去除预入库锁定的排列层
var locaIn = Expressionable.Create();
locaIn.And(it => it.S_WH_CODE == obstructBit.S_WH_CODE);
locaIn.And(it => it.S_AREA_CODE == obstructBit.S_AREA_CODE);
locaIn.And(it => it.S_LOCK_STATE == "入库锁");
List locationInLock = newDb.Queryable().Where(locaIn.ToExpression()).ToList();
LogHelper.DanInfo("处理自管任务", "locationInLock数据:" + JsonConvert.SerializeObject(locationInLock));
foreach (Location lEntity in locationInLock)
{
emptyLocation.RemoveAll(o => o.N_ROW == lEntity.N_ROW && o.N_COL == lEntity.N_COL && o.N_LAYER == lEntity.N_LAYER);
}
LogHelper.DanInfo("处理自管任务", "去除预入库锁定后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation));
//去除被外侧货物阻挡的货位
var locaWc = Expressionable.Create();
locaWc.And(it => it.S_WH_CODE == obstructBit.S_WH_CODE);
locaWc.And(it => it.S_AREA_CODE == obstructBit.S_AREA_CODE);
locaWc.And(it => it.S_LOCK_STATE == "无");
locaWc.And(it => it.N_SIDE == 1);
lca.And(it => it.N_CURRENT_NUM > 0);
List lstLocationHasItem = newDb.Queryable().Where(locaWc.ToExpression()).ToList();
LogHelper.DanInfo("处理自管任务", "lstLocationHasItem数据:" + JsonConvert.SerializeObject(lstLocationHasItem));
List lstLocationHasItemOrder = new List();
foreach (Location itemC in lstLocationHasItem)
{
emptyLocation.RemoveAll(o => o.N_ROW == itemC.N_ROW && o.N_COL == itemC.N_COL && o.N_LAYER == itemC.N_LAYER && o.N_SIDE > itemC.N_SIDE);
}
LogHelper.DanInfo("处理自管任务", "去除阻挡后的emptyLocation数据:" + JsonConvert.SerializeObject(emptyLocation));
if (emptyLocation.Count() > 0)
{
var emptyLocation_inside = emptyLocation.FindAll(f => f.N_SIDE == 2);
if (emptyLocation_inside.Any())
{
emptyLocation = emptyLocation_inside;
}
}
else
{
LogHelper.DanInfo("处理自管任务", "移库任务:: 货位表没有该巷道中的可用空货位 S_AREA_CODE=" + locationBit.S_AREA_CODE);
throw new Exception("没有可用货位");
}
//
}
taskEntityYk = new WMSTask();
taskEntityYk.S_TASK_NO = taskNoYk;
taskEntityYk.S_START_LAREA = task.S_START_LAREA;
taskEntityYk.S_END_LAREA = task.S_END_LAREA;
taskEntityYk.S_START_LOC = obstructBit.S_LOC_CODE;
taskEntityYk.S_END_LOC = emptyLocation[0].S_LOC_CODE;
taskEntityYk.S_TYPE = "移库";
taskEntityYk.S_CNTRS = objTray.S_CNTR_CODE;
taskEntityYk.N_CNTR_COUNT = 1;
taskEntityYk.N_PRIORITY = 0;
taskEntityYk.S_NOTE = Constants.TaskFlag_LG;
taskEntityYk.S_SRC_SYS = task.S_SRC_SYS;
taskEntityYk.S_READ_LOCK = "N";
taskEntityYk.S_Subtask = "N";
taskEntityYk.S_FlowNo = "";
taskEntityYk.S_SRC_NO = task.S_TASK_NO;
taskEntityYk.S_UpstreamNo = task.S_UpstreamNo;
taskEntityYk.S_Jb_Bit = _bit;
taskEntityYk.S_Main_task = "子任务";
taskEntityYk.S_Zb_Bit = task.S_Zb_Bit;
}
}
#endregion
string taskNo1 = task.S_TASK_NO + "_1";
//创建第一个任务
#region 创建子任务 将参数放到 WMSTask 中
WMSTask taskEntity1 = new WMSTask();
taskEntity1.S_TASK_NO = taskNo1;
taskEntity1.S_START_LAREA = task.S_START_LAREA;
taskEntity1.S_END_LAREA = connectBit.S_AREA_CODE;
taskEntity1.S_START_LOC = task.S_START_LOC;
taskEntity1.S_END_LOC = _bit;
taskEntity1.S_TYPE = "出库";
taskEntity1.S_B_STATE = "未执行";
taskEntity1.S_CNTRS = task.S_CNTRS;
taskEntity1.N_CNTR_COUNT = 1;
taskEntity1.N_PRIORITY = 0;
taskEntity1.S_NOTE = Constants.TaskFlag_LG;
taskEntity1.S_READ_LOCK = "N";
taskEntity1.S_Subtask = "N";
taskEntity1.S_FlowNo = "";
taskEntity1.S_SRC_SYS = task.S_SRC_SYS;
taskEntity1.S_Jb_Bit = _bit;
taskEntity1.S_UpstreamNo = task.S_UpstreamNo;
taskEntity1.S_Zb_Bit = task.S_Zb_Bit;
taskEntity1.S_SRC_NO = task.S_TASK_NO;
taskEntity1.S_Main_task = "子任务";
taskEntity1.S_TOOLS_TPYE = task.S_TOOLS_TPYE;
LogHelper.DanInfo("处理自管任务", "11---" + JsonConvert.SerializeObject(taskEntity1));
string taskNo2 = task.S_TASK_NO + "_2";
//创建第二个任务
WMSTask taskEntity2 = new WMSTask()
{
S_TASK_NO = taskNo2,
S_START_LAREA = connectBit.S_AREA_CODE,
S_END_LAREA = task.S_END_LAREA,
S_START_LOC = _bit,
S_END_LOC = task.S_END_LOC,
S_TYPE = "出库",
S_B_STATE = "未执行",
S_CNTRS = task.S_CNTRS,
N_CNTR_COUNT = 1,
N_PRIORITY = 0,
S_SRC_SYS = task.S_SRC_SYS,
S_NOTE = Constants.TaskFlag_AGV,
S_READ_LOCK = "N",
S_Subtask = "N",
S_FlowNo = "",
S_Jb_Bit = _bit,
S_UpstreamNo = task.S_UpstreamNo,
S_Zb_Bit = task.S_Zb_Bit,
S_SRC_NO = task.S_TASK_NO,
S_Main_task = "子任务",
S_TOOLS_TPYE = task.S_TOOLS_TPYE
};
LogHelper.DanInfo("处理自管任务", "12---" + JsonConvert.SerializeObject(taskEntity2));
#region 任务下达
#region 如果有阻挡需要移库则产生移库任务
if (existObstruct)
{
newDb.BeginTran();
var A = newDb.Insertable(taskEntityYk).ExecuteCommand();
if (A == 0)
{
newDb.RollbackTran();
throw new Exception("任务表添加失败");
}
A = newDb.Updateable().SetColumns(it => it.S_LOCK_STATE == "入库锁").Where(x => x.S_LOC_CODE == taskEntityYk.S_END_LOC && x.S_LOCK_STATE == "无").ExecuteCommand();
if (A == 0)
{
newDb.RollbackTran();
throw new Exception("锁定终点货位并发异常:" + taskEntityYk.S_END_LOC);
}
LogHelper.DanInfo("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntityYk.S_END_LOC + "--锁定终点货位 任务号为:" + taskNoYk);
A = newDb.Updateable().SetColumns(it => new Location
{
S_LOCK_STATE = "出库锁",
T_MODIFY = DateTime.Now
}).Where(x => x.S_LOC_CODE == taskEntityYk.S_START_LOC && x.S_LOCK_STATE == "无").ExecuteCommand();
if (A == 0)
{
newDb.RollbackTran();
throw new Exception("锁定起点货位并发异常:" + taskEntityYk.S_START_LOC);
}
LogHelper.DanInfo("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntityYk.S_START_LOC + "--锁定终点货位 任务号为:" + taskNoYk);
LogHelper.DanInfo("处理自管任务", "移库任务下发给WCS 参数为" + JsonConvert.SerializeObject(taskEntityYk));
//下发任务给WCS--立库
var tr = BLLCreator.CreateSingleton().WcsTaskEntity(taskEntityYk);
LogHelper.DanInfo("处理自管任务", "移库任务调用WCS接口执行任务 执行结果:" + JsonConvert.SerializeObject(tr));
if (!tr.Success)
{
WCSBOOL = tr.Success;
newDb.RollbackTran();
throw new Exception("移库任务调用WCS接口执行任务: 执行结果:" + JsonConvert.SerializeObject(tr));
}
newDb.CommitTran();
}
#endregion
#region 添加第一个子任务
//增加子任务
newDb.BeginTran();
var B = newDb.Insertable(taskEntity1).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("任务表添加失败");
}
//更新接驳位状态
if (ggf)
{
B = newDb.Updateable().SetColumns(it =>
new Location
{
S_LOCK_STATE = "入库锁",
T_MODIFY = DateTime.Now
}).Where(x => x.S_LOC_CODE == taskEntity1.S_END_LOC && x.S_LOCK_STATE == "无").ExecuteCommand();
LogHelper.DanInfo("处理自管任务", "货位绑定任务号-- 货位码:" + taskEntity1.S_END_LOC + "--锁定货位为预入库 任务号为:" + taskNo1 + JsonConvert.SerializeObject(B));
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("锁定更新接驳位状态异常:" + taskEntity1.S_END_LOC);
}
}
// 更新主任务接驳位 状态置为执行中 记录接驳位和准备点
B = newDb.Updateable().SetColumns(it => it.S_B_STATE == Constants.TaskState_Executing).Where(x => x.S_ID == task.S_ID).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("更新主任务状态异常:" + taskEntity1.S_END_LOC);
}
#endregion
#region 发送Wcs任务
LogHelper.DanInfo("处理自管任务", "下发给WCS 参数为" + JsonConvert.SerializeObject(taskEntity1));
LogHelper.DanInfo("处理自管任务", "调用WCS接口");
var re = BLLCreator.CreateSingleton().WcsTaskEntity(taskEntity1, Itemgh);
//如果任务成功下达 则主任务不需要在循环了
if (!re.Success)
{
newDb.RollbackTran();
throw new Exception("调用WCS接口执行任务 执行结果:" + JsonConvert.SerializeObject(re));
}
else
{
WCSBOOL = re.Success;
}
LogHelper.DanInfo("处理自管任务", "调用WCS接口执行任务 执行结果:" + JsonConvert.SerializeObject(re));
#endregion
#region 添加第二个子任务
B = newDb.Insertable(taskEntity2).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("任务表添加失败");
}
#endregion
#region agv任务
//下达任务给Agv
//LogHelper.DanInfo("处理自管任务", "调用agv接口");
//var Are = TaskProcess.SendTask(taskEntity2);
//if (!Are)
//{
// AMSBOOL = Are;
// newDb.RollbackTran();
// throw new Exception("下达给AGV报错");
//}
#endregion
if (WCSBOOL)
{
B = newDb.Updateable().SetColumns(it => it.S_READ_LOCK == "Y").Where(x => x.S_ID == task.S_ID).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("更新主任务 是否已读失败:" + taskEntityYk.S_END_LOC);
}
newDb.CommitTran();
}
else
{
newDb.RollbackTran();
}
#endregion
#endregion
#endregion
}
ors.Add(OperateResult.Succeed("生成成功"));
}
catch (Exception ex)
{
newDb.RollbackTran();
ors.Add(OperateResult.Error(ex.Message));
}
}
LogHelper.DanInfo("处理自管任务", JsonConvert.SerializeObject(ors));
}
catch (Exception ex)
{
LogHelper.DanInfo("处理自管任务", " Error:" + ex.Message + ex.StackTrace);
}
}
///
/// 处理自管任务
///
public void SelfManageTaskIn(List TaskList)
{
try
{
#region 参数校验1 config
List ors = new List();
string msg = "";
// LocationHelper.LocationCode(); 验证货位信息
#endregion
var chi = new SqlHelper().GetInstance();
var newDb2 = chi.CopyNew();
foreach (var task in TaskList)
{
LogHelper.Info("处理自管任务", "入库开始------任务:" + task.S_TASK_NO);
try
{
bool WCSBOOL = false;
bool AMSBOOL = true;
// 出库主任务是同时下两条子任务
#region 入库
#region 校验参数
//未执行表示第一个任务
if (task.S_B_STATE == Constants.TaskState_NoExecuted && task.S_Subtask == "Y")
{
CntrItemRel CntItem = newDb2.Queryable().Where(e => e.S_CNTR_CODE == task.S_CNTRS)?.First();
//立库货位
string lkBit = string.Empty;
//根据任务类型判断立库货位
if (task.S_TYPE == Constants.In)
{
lkBit = task.S_END_LOC;
}
else
{
throw new Exception("自管任务任务类型不正确");
}
var locationBit = LocationHelper.LocationCode(lkBit);
if (locationBit == null)
throw new Exception("未找到立库货位:" + lkBit);
//回库优先缓存位条件
string input = task.S_Jb_Bit;
var result = input.Split(',').ToList();
//任务均衡
if (result.Count > 1)
{
List TaskState = new List() { "取消", "完成" };
var transportTask = newDb2.Queryable().Where(e => !TaskState.Contains(e.S_B_STATE) && result.Contains(e.S_Jb_Bit) && e.S_NOTE == "agv任务" && e.S_TYPE == Constants.In).ToList();
//分组 把任务量最少的
bool df = true;
foreach (var item in result)
{
//查询是否有没任务的接驳位,如果有就下任务到这个接驳位
var gg = transportTask.FindAll(e => e.S_Jb_Bit == item).ToList();
if (gg.Count() > 0)
{
continue;
}
else
{
df = false;
task.S_Jb_Bit = item;
break;
}
}
if (df)
{
//初步筛选没有空任务的入库接驳位 需要从中取任务量最少的
var fft = transportTask.GroupBy(e => e.S_Jb_Bit).Select(g => new { Jb_Bit = g.Key, Count = g.Count() }).ToList();
var MinJb_Bit = fft.OrderBy(e => e.Count)?.First();
task.S_Jb_Bit = MinJb_Bit.Jb_Bit;
}
}
var connectBit = LocationHelper.LocationCode(task.S_Jb_Bit);
if (connectBit == null)
throw new Exception("未找到接驳位 货位:" + task.S_Jb_Bit);
#endregion
#region 添加第一子任务 传参给WMSTask
string taskNo = task.S_TASK_NO + "_1";
//创建第一个任务
WMSTask taskEntity = new WMSTask()
{
S_TASK_NO = taskNo,
S_CNTRS = task.S_CNTRS,
S_START_LOC = task.S_START_LOC,
S_Jb_Bit = task.S_Jb_Bit,
S_Zb_Bit = task.S_Zb_Bit,
S_END_LOC = task.S_Jb_Bit,
S_B_STATE = Constants.TaskState_NoExecuted,
S_TYPE = "入库",
N_PRIORITY = task.N_PRIORITY,
S_NOTE = Constants.TaskFlag_AGV,
S_SRC_SYS = task.S_SRC_SYS,
S_READ_LOCK = "N",
S_Subtask = "N",
S_START_LAREA = task.S_START_LAREA,
S_END_LAREA = connectBit.S_AREA_CODE,
S_UpstreamNo = task.S_UpstreamNo,
N_CNTR_COUNT = 1,
S_SRC_NO = task.S_TASK_NO,
S_Main_task = "子任务",
S_TOOLS_TPYE = task.S_TOOLS_TPYE
};
LogHelper.Info("处理自管任务", "2-9---" + JsonConvert.SerializeObject(taskEntity));
#endregion
LogHelper.Info("处理自管任务", "15");
#region 添加第一个子任务 add
//增加子任务
// var newDb1 = newDb.CopyNew();
newDb2.BeginTran();
var B = newDb2.Insertable(taskEntity).ExecuteCommand();
if (B == 0)
{
newDb2.RollbackTran();
throw new Exception("任务表添加失败");
}
//更新接驳位状态
LogHelper.Info("处理自管任务", "2-10---Update" + taskNo);
// 更新主任务状态置为执行中
B = newDb2.Updateable().SetColumns(it => it.S_B_STATE == Constants.TaskState_Executing).Where(e => e.S_ID == task.S_ID).ExecuteCommand();
if (B == 0)
{
newDb2.RollbackTran();
throw new Exception("更新主任务状态置为执行中并发异常 任务号为:" + task.S_TASK_NO);
}
#endregion
//agv任务 需要调用调度接口
#region 调用接口--调度
//LogHelper.Info("处理自管任务", "调用Agv接口");
//var re = TaskProcess.SendTask(taskEntity);
#endregion
//LogHelper.Info("处理自管任务", "16");
//if (!re)
//{
// LogHelper.Info("处理自管任务", "调用调度接口:" + re);
// newDb.RollbackTran();
// throw new Exception("下达AGV调度失败");
//}
newDb2.CommitTran();
}
else
{
//执行一半的任务,开始创建第二个任务
if (task.S_B_STATE == Constants.TaskState_CompleteHalf)
{
#region 第二段子任务 参数校验
CntrItemRel CntItem = newDb2.Queryable().Where(e => e.S_CNTR_CODE == task.S_CNTRS)?.First();
string taskNo = task.S_TASK_NO + "_2";
var portTask = newDb2.Queryable().Where(e => e.S_TASK_NO == task.S_TASK_NO + "_1")?.First();
if (portTask == null)
{
throw new Exception("未查询到入库的一段agv任务");
}
var connectBit = LocationHelper.LocationCode(portTask.S_END_LOC);
var S_Jb_Bit = "";
if (task.S_Jb_Bit.Split(',').ToList().Count() > 1)
{
S_Jb_Bit = portTask.S_END_LOC;
}
else
{
S_Jb_Bit = task.S_Jb_Bit;
}
var conneBit = LocationHelper.LocationCode(task.S_END_LOC);
if (connectBit == null)
throw new Exception("未找到接驳位:" + S_Jb_Bit);
//入库接驳位不再管控货位状态可能会导致竞争,检查该任务的终点是否阻挡了其他任务
bool existCompete = false;
Location competeBit = null;
string competeTaskNo = string.Empty;
LogHelper.Info("处理自管任务", "入库任务双生位竞争 接驳位为:" + S_Jb_Bit);
if (conneBit.N_SIDE == 1)
{
LogHelper.Info("处理自管任务", "入库任务双生位竞争 接驳位为:" + S_Jb_Bit);
var Lstloca = Expressionable.Create();
Lstloca.And(it => it.S_WH_CODE == conneBit.S_WH_CODE);
Lstloca.And(it => it.S_AREA_CODE == conneBit.S_AREA_CODE);
Lstloca.And(it => it.N_ROW == conneBit.N_ROW);
Lstloca.And(it => it.N_COL == conneBit.N_COL);
Lstloca.And(it => it.N_LAYER == conneBit.N_LAYER);
List lstLocation = newDb2.Queryable().Where(Lstloca.ToExpression()).ToList();
competeBit = lstLocation.Where(o => o.S_LOC_CODE != conneBit.S_LOC_CODE).FirstOrDefault();
LogHelper.Info("处理自管任务", "入库任务双生位竞争 置换规则2 :lstLocation里面的拥有的值得大于1 (表示 同行列 排相同的货位数大于1)并且排除现在的货位码后 lstLocation.Count():" + lstLocation.Count() + "::competeBit" + JsonConvert.SerializeObject(competeBit));
if (lstLocation.Count() > 1 && competeBit != null)
{
LogHelper.Info("处理自管任务", "入库任务双生位竞争3");
//查询内侧货位的任务
List State = new List() { "未执行", "执行中" };
var LstTask = Expressionable.Create();
LstTask.And(it => State.Contains(it.S_B_STATE));
LstTask.And(it => it.S_END_LOC == competeBit.S_LOC_CODE);
var Task = newDb2.Queryable().Where(LstTask.ToExpression()).First();
if (Task != null)
{
if (competeBit.S_LOCK_STATE == "入库锁")
{
LogHelper.Info("处理自管任务", "入库任务双生位竞争4");
existCompete = true;
competeTaskNo = Task.S_ID;
}
}
}
}
#endregion
#region 子任务2 传参给WMSTask
//创建第二个任务
//获取mestask表里的标准重量
WMSTask taskEntity = null;
if (existCompete)
{
taskEntity = new WMSTask()
{
S_TASK_NO = taskNo,
S_CNTRS = task.S_CNTRS,
S_START_LOC = S_Jb_Bit,
S_END_LOC = competeBit.S_LOC_CODE,
S_START_LAREA = connectBit.S_AREA_CODE,
S_END_LAREA = task.S_END_LAREA,
S_Jb_Bit = task.S_Jb_Bit,
S_Zb_Bit = task.S_Zb_Bit,
S_B_STATE = Constants.TaskState_NoExecuted,
S_TYPE = "入库",
N_PRIORITY = task.N_PRIORITY,
S_SRC_SYS = task.S_SRC_SYS,
S_NOTE = Constants.TaskFlag_LG,
S_UpstreamNo = task.S_UpstreamNo,
S_READ_LOCK = "N",
S_Subtask = "N",
N_CNTR_COUNT = 1,
S_SRC_NO = task.S_TASK_NO,
S_InTaskType = task.S_InTaskType,
S_Main_task = "子任务",
S_TOOLS_TPYE = task.S_TOOLS_TPYE
};
}
else
{
taskEntity = new WMSTask()
{
S_TASK_NO = taskNo,
S_CNTRS = task.S_CNTRS,
S_START_LOC = S_Jb_Bit,
S_END_LOC = task.S_END_LOC,
S_START_LAREA = connectBit.S_AREA_CODE,
S_END_LAREA = task.S_END_LAREA,
S_Jb_Bit = task.S_Jb_Bit,
S_Zb_Bit = task.S_Zb_Bit,
S_B_STATE = Constants.TaskState_NoExecuted,
S_TYPE = "入库",
N_PRIORITY = task.N_PRIORITY,
S_SRC_SYS = task.S_SRC_SYS,
S_NOTE = Constants.TaskFlag_LG,
S_UpstreamNo = task.S_UpstreamNo,
S_READ_LOCK = "N",
S_Subtask = "N",
S_InTaskType = task.S_InTaskType,
N_CNTR_COUNT = 1,
S_SRC_NO = task.S_TASK_NO,
S_Main_task = "子任务",
S_TOOLS_TPYE = task.S_TOOLS_TPYE
};
}
LogHelper.Info("处理自管任务", "入库 二段任务:" + JsonConvert.SerializeObject(taskEntity));
#endregion
#region 添加第二个子任务 add
//增加子任务
newDb2.BeginTran();
var B = newDb2.Insertable(taskEntity).ExecuteCommand();
if (B == 0)
{
newDb2.RollbackTran();
throw new Exception("任务表添加失败");
}
//更新 主任务的 taskNo
//入库接驳位不再管控货位状态如果存在竞争
if (existCompete)
{
// 更新主任务接驳位 状态置为执行中
B = newDb2.Updateable().SetColumns(it => new WMSTask
{
S_B_STATE = Constants.TaskState_Executing,
S_END_LOC = competeBit.S_LOC_CODE
}).Where(x => x.S_ID == task.S_ID).ExecuteCommand();
if (B == 0)
{
newDb2.RollbackTran();
throw new Exception("任务更新终点货位:" + competeBit.S_LOC_CODE);
}
//将竞争任务的终点任务改为该任务的终点任务号
B = newDb2.Updateable().SetColumns(it => new WMSTask
{
S_END_LOC = conneBit.S_LOC_CODE
}).Where(x => x.S_ID == competeTaskNo).ExecuteCommand();
if (B == 0)
{
newDb2.RollbackTran();
throw new Exception("任务更新终点货位:" + competeBit.S_LOC_CODE);
}
}
else
{
// 更新主任务接驳位 状态置为执行中
B = newDb2.Updateable().SetColumns(it => new WMSTask
{
S_B_STATE = Constants.TaskState_Executing
}).Where(e => e.S_ID == task.S_ID).ExecuteCommand();
if (B == 0)
{
newDb2.RollbackTran();
throw new Exception("更新任务:" + task.S_TASK_NO + "的状态为:" + Constants.TaskState_Executing);
}
}
#endregion
#region 调接口 wcs 或ams
//立库任务 需要调用wcs接口
#region 待测试
LogHelper.Info("处理自管任务", "调用wcs接口");
OperateResult re = OperateResult.Succeed();
if (task.S_InTaskType != "N")
{
re = BLLCreator.CreateSingleton().WcsTaskEntity(taskEntity, CntItem);
}
// re = BLLCreator.CreateSingleton().WcsTaskEntity(taskEntity, CntItem);
//成功下达 则主任务改为已读
if (re.Success)
{
B = newDb2.Updateable().SetColumns(it => new WMSTask
{
S_READ_LOCK = "Y",
}).Where(e => e.S_ID == task.S_ID).ExecuteCommand();
if (B == 0)
{
newDb2.RollbackTran();
throw new Exception("任务更新读取状态为已读 失败");
}
newDb2.CommitTran();
}
else
{
newDb2.RollbackTran();
msg = re.Msg;
throw new Exception(re.Msg);
}
#endregion
#endregion
}
#endregion
}
ors.Add(OperateResult.Succeed("生成成功"));
}
catch (Exception ex)
{
newDb2.RollbackTran();
ors.Add(OperateResult.Error(ex.Message));
}
}
LogHelper.Info("处理自管任务", JsonConvert.SerializeObject(ors));
}
catch (Exception ex)
{
LogHelper.Info("处理自管任务", " Error:" + ex.Message + ex.StackTrace);
}
}
public OperateResult SedeWcsWtp(List tasL)
{
var chi = new SqlHelper().GetInstance();
var newDb = chi.CopyNew();
try
{
OperateResult re = OperateResult.Succeed();
foreach (var tas in tasL)
{
CntrItemRel CntItem = newDb.Queryable().Where(e => e.S_CNTR_CODE == tas.S_CNTRS)?.First();
re = BLLCreator.CreateSingleton().WcsTaskEntity(tas, CntItem);
if (re.Success)
{
try
{
newDb.BeginTran();
var B = newDb.Updateable().SetColumns(it => new WMSTask
{
S_READ_LOCK = "Y",
}).Where(e => e.S_ID == tas.S_ID).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("任务更新读取状态为已读 失败");
}
newDb.CommitTran();
}
catch (Exception ex)
{
newDb.RollbackTran();
}
}
else
{
throw new Exception(re.Msg);
}
}
return re;
}
catch (Exception ex)
{
LogHelper.DanInfo("下发无托盘入库立库任务", " Error:" + ex.Message + ex.StackTrace);
return OperateResult.Error();
}
}
///
/// 更换终点
///
///
public SetChangeDto GetDndLocation(WcsTaskState Vendor)
{
var Task = Expressionable.Create();
var chi = new SqlHelper().GetInstance();
var newDb = chi.CopyNew();
SetChangeDto change = new SetChangeDto();
Task.And(it => it.S_TASK_NO == Vendor.taskNo);
var Tasks = newDb.Queryable().Where(Task.ToExpression())?.First() ?? throw new Exception("未查询到该任务 任务号为:" + Vendor.taskNo);
//查询这个托盘是否有物料信息
var ggf = newDb.Queryable().Where(e => e.S_BATCH_NO == Tasks.S_CNTRS)?.First();
var endIsCurrentTask = newDb.Queryable().Where(e => e.S_LOC_CODE == Tasks.S_END_LOC)?.First();
List clas = new List() {
new areaPriorClass
{
areaCode=Tasks.S_END_LAREA,
Prior=0
}
};
if (string.IsNullOrEmpty(Tasks.S_END_LOC_AGO))
{
var aEntity = new InAssignEntity()
{
objectType = InAssignEntity.ObjectType.托盘,
objectCode = Tasks.S_CNTRS,
lstAreaPrior = clas,
projectCode = "",
logicAreaCode = Tasks.S_TOOLS_TPYE,
stockCode = endIsCurrentTask.S_WH_CODE,
S_Roadway = new List() { endIsCurrentTask.N_ROADWAY.ToString() },
itemCode = ggf?.S_ITEM_CODE,
IsChangeBit = 1,
// callSys = executeInWorkAreaPara.InWorkAreaEntity.sysName,
needCalLock = true
};
//根据库区获取货位
InAssignResultEntity resultEntity = BLLCreator.Create().InAssign(aEntity);
if (!resultEntity.Success)
{
change.S_LOC_CODE = "101";
try
{
newDb.BeginTran();
var C = newDb.Updateable().SetColumns(it => new Location
{
S_LOCK_STATE = "异常锁"
}).Where(x => x.S_LOC_CODE == Tasks.S_END_LOC).ExecuteCommand();
if (C == 0)
{
throw new Exception("起点 改异常锁失败");
}
newDb.CommitTran();
}
catch (Exception ex)
{
newDb.RollbackTran();
LogHelper.Info("更换终点", "报错--" + ex.Message);
}
return change;
}
newDb.BeginTran();
try
{
var B = newDb.Updateable().SetColumns(it => new WMSTask
{
S_END_LOC_AGO = Tasks.S_END_LOC,
S_END_LOC = resultEntity.locationCode
}).Where(x => x.S_TASK_NO == Tasks.S_TASK_NO).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("子任务--任务表更新失败");
}
if (Tasks.S_TASK_NO.IndexOf('_') > 0)
{
var navNo = "";
var tno = Tasks.S_TASK_NO;
navNo = tno.Substring(0, tno.LastIndexOf("_"));
B = newDb.Updateable().SetColumns(it => new WMSTask
{
S_END_LOC_AGO = Tasks.S_END_LOC,
S_END_LOC = resultEntity.locationCode
}).Where(x => x.S_TASK_NO == navNo).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("主任务--任务表更新失败");
}
}
B = newDb.Updateable().SetColumns(it => new Location
{
S_LOCK_STATE = "异常锁"
}).Where(x => x.S_LOC_CODE == Tasks.S_END_LOC).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("原先的货位解锁失败");
}
newDb.CommitTran();
change.S_LOC_CODE = resultEntity.locationCode;
}
catch (Exception ex)
{
change.S_LOC_CODE = "101";
newDb.RollbackTran();
LogHelper.Info("更换终点", "报错--" + ex.Message);
}
}
else
{
change.S_LOC_CODE = Tasks.S_END_LOC;
}
return change;
}
///
/// 更换起点
///
///
///
///
public SetChangeDto GetStaLocation(WcsTaskState Vendor)
{
var Task = Expressionable.Create();
SetChangeDto change = new SetChangeDto();
Task.And(it => it.S_TASK_NO == Vendor.taskNo);
var chi = new SqlHelper().GetInstance();
var newDb = chi.CopyNew();
var Tasks = newDb.Queryable().Where(Task.ToExpression())?.First() ?? throw new Exception("未查询到该任务 任务号为:" + Vendor.taskNo);
var endIsCurrentTask = newDb.Queryable().Where(e => e.S_LOC_CODE == Tasks.S_START_LOC)?.First();
var trayItemMsts = newDb.Queryable().Where(e => e.S_CNTR_CODE == Tasks.S_CNTRS)?.First();
List clas = new List() {
new areaPriorClass
{
areaCode=Tasks.S_START_LAREA,
Prior=0
}
};
OutAssignEnitty oEntity = new OutAssignEnitty()
{
stockCode = endIsCurrentTask.S_WH_CODE,
S_TASK_NO = Tasks.S_TASK_NO,
TrayType = Tasks.S_TOOLS_TPYE,
itemCode = trayItemMsts?.S_ITEM_CODE,
itemState = trayItemMsts?.S_ITEM_STATE,
projectCode = "",
S_Roadway = endIsCurrentTask.N_ROADWAY.ToString(),
endBit = "",
lstAreaPrior = clas
};
if (string.IsNullOrEmpty(Tasks.S_END_LOC_AGO))
{
//根据库区获取货位
OutAssignResultEntity ire = BLLCreator.Create().OutAssign(oEntity);
if (!ire.Success)
{
change.S_LOC_CODE = "102";
try
{
newDb.BeginTran();
var C = newDb.Updateable().SetColumns(it => new Location
{
S_LOCK_STATE = "异常锁"
}).Where(x => x.S_LOC_CODE == Tasks.S_START_LOC).ExecuteCommand();
if (C == 0)
{
throw new Exception("起点 改异常锁失败");
}
newDb.CommitTran();
}
catch (Exception ex)
{
newDb.RollbackTran();
LogHelper.Info("更换终点", "报错--" + ex.Message);
}
return change;
}
newDb.BeginTran();
try
{
var B = newDb.Updateable().SetColumns(it => new WMSTask
{
S_END_LOC_AGO = Tasks.S_START_LOC,
S_CNTRS = ire.trayCode,
S_START_LOC = ire.locationCode
}).Where(x => x.S_TASK_NO == Tasks.S_TASK_NO).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("子任务(立库)--任务表更新失败");
}
if (Tasks.S_TASK_NO.IndexOf('_') > 0)
{
var navNo = "";
var tno = Tasks.S_TASK_NO;
navNo = tno.Substring(0, tno.LastIndexOf("_"));
B = newDb.Updateable().SetColumns(it => new WMSTask
{
S_END_LOC_AGO = Tasks.S_START_LOC,
S_CNTRS = ire.trayCode,
S_START_LOC = ire.locationCode
}).Where(x => x.S_TASK_NO == navNo).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("主任务--任务表更新失败");
}
B = newDb.Updateable().SetColumns(it => new WMSTask
{
S_CNTRS = ire.trayCode
}).Where(x => x.S_TASK_NO == navNo + "_2").ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("子任务(agv)--任务表更新失败");
}
}
B = newDb.Updateable().SetColumns(it => new Location
{
S_LOCK_STATE = "异常锁"
}).Where(x => x.S_LOC_CODE == Tasks.S_START_LOC).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
throw new Exception("原先的货位解锁失败");
}
newDb.CommitTran();
change.S_LOC_CODE = ire.locationCode;
//查询子任务号 然后重新下达给立库
}
catch (Exception ex)
{
change.S_LOC_CODE = "102";
newDb.RollbackTran();
LogHelper.Info("更换终点", "报错--" + ex.Message);
}
}
else
{
change.S_LOC_CODE = Tasks.S_START_LOC;
}
return change;
}
///
/// 改道--中策
///
///
///
///
///
public OperateResult UpdateTaskEndLocation(WMSTask task, string Endlocation, Location Jb)
{
var chi = new SqlHelper().GetInstance();
var newDb = chi.CopyNew();
try
{
newDb.BeginTran();
//更改住任务终点货位
var B = newDb.Updateable().SetColumns(it => new WMSTask
{
S_END_LOC_AGO = task.S_END_LOC,
S_END_LOC = Endlocation,
S_Jb_Bit = Jb.S_LOC_CODE,
S_END_LAREA = task.S_END_LAREA,
}).Where(x => x.S_TASK_NO == task.S_TASK_NO).ExecuteCommand();
if (B == 0)
{
throw new Exception("任务表更新失败");
}
//更改子任务终点货位
B = newDb.Updateable().SetColumns(it => new WMSTask
{
S_END_LOC = Jb.S_LOC_CODE,
S_Jb_Bit = Jb.S_LOC_CODE,
S_END_LAREA = Jb.S_AREA_CODE,
}).Where(x => x.S_TASK_NO == task.S_TASK_NO + "_1").ExecuteCommand();
if (B == 0)
{
throw new Exception("任务表更新失败");
}
//B = SqlSugarHelper.Db.Updateable().SetColumns(it => new Location
//{
// S_LOCK_STATE = "入库锁"
//}).Where(x => x.S_LOC_CODE == Endlocation).ExecuteCommand();
//if (B == 0)
//{
// throw new Exception("新算的货位锁定失败");
//}
B = newDb.Updateable().SetColumns(it => new Location
{
S_LOCK_STATE = "无"
}).Where(x => x.S_LOC_CODE == task.S_END_LOC).ExecuteCommand();
if (B == 0)
{
throw new Exception("原先的货位释放锁定失败");
}
newDb.CommitTran();
return OperateResult.Succeed();
}
catch (Exception ex)
{
newDb.RollbackTran();
return OperateResult.Error(ex.Message);
}
}
public OperateResult SaveTask(MesTaskDto task)
{
OperateResult re = new OperateResult();
var chi = new SqlHelper().GetInstance();
var newDb = chi.CopyNew();
try
{
task.NeedTrig = Constants.N;
// Log.Info("TN_MES_TASK表添加数据", JsonConvert.SerializeObject(task));
newDb.BeginTran();
var B = newDb.Insertable(task).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
}
newDb.CommitTran();
LogHelper.Info("任务下发", "--是否成功添加MES_TASK表:" + JsonConvert.SerializeObject(re));
re = BLLCreator.Create().ExecTransferTask(task);
return re;
}
catch (Exception ex)
{
newDb.RollbackTran();
LogHelper.Info("任务下发", "--发生了错误 错误为:" + ex.Message);
return OperateResult.Error(ex.Message);
}
}
///
/// 线边缓存区 存取
///
///
///
public OperateResult BusTask(MesKtTaskDto task)
{
var chi = new SqlHelper().GetInstance();
var newDb = chi.CopyNew();
try
{
var transJson1 = newDb.Queryable().Where(e => e.Autoindex == "堆叠-" + task.TOOLS_TPYE)?.First();
if (transJson1 != null)
{
if (task.BUSI_TYPE == "3")//入库
{
//查询是否有空托任务进行缓存 ,有则送到线边去 ,没有则送到库中--
var transportTask1 = newDb.Queryable().Where(e => e.TOOLS_TPYE == task.TOOLS_TPYE && e.NeedTrig == "Y" && e.Task_State == "智能空桶").ToList();
if (transportTask1.Any())
{
transportTask1 = transportTask1.OrderBy(e => e.T_CREATE).ToList();
}
var transportTask = transportTask1.FirstOrDefault();
//必须要求终点的货位的当前容量小于总容量
if (transportTask != null)
{
//查货位的容量是否可以生成到线边的任务
var transJson = newDb.Queryable().Where(e => e.Autoindex == "堆叠-" + task.TOOLS_TPYE)?.First();
List ListString = new List();
if (transJson != null)
{
ListString = JsonConvert.DeserializeObject>(transJson.TypeJson);
}
if (ListString.Count() == 0)
{
LogHelper.Info("任务下发", "线边缓存区 存取 在入空托的时候查询线边缓存区货位配置时为空 配置索引为:" + "堆叠-" + task.TOOLS_TPYE);
return OperateResult.Error();
}
if (!ListString.Contains(transportTask.Location_To))
{
LogHelper.Info("任务下发", $"线边缓存区 存取 在入空托的时候查询线边缓存区货位配置时没有这个终点货位{transportTask.Location_To} 配置索引为:" + "堆叠-" + task.TOOLS_TPYE);
return OperateResult.Error();
}
//直接送至线边
List outWorkAreas = new List
{
new OutWorkAreaEntity()
{
taskNo = task.task_no,
startBit = task.Location_From,
endBit = transportTask.Location_To,
priority = transportTask.Priority,
trayCode = task.TOOLS_NO,
TaskOrderType = "MES",
NoAssist = "Y",
S_TransAgv = "Y"
}
};
var result = BLLCreator.CreateSingleton().OutWorkArea(outWorkAreas);
if (result.Success)
{
try
{
newDb.BeginTran();
var I = newDb.Updateable().SetColumns(it => new MesKtTaskDto()
{
NeedTrig = "N"
}).Where(x => x.S_ID == transportTask.S_ID).ExecuteCommand();
if (I == 0)
{
throw new Exception("影响行数为0");
}
newDb.CommitTran();
}
catch (Exception ex)
{
newDb.RollbackTran();
}
return OperateResult.Succeed();
}
else
{
return OperateResult.Error();
}
}
else
{
//送至库中
return OperateResult.Error();
}
}
else//出库
{
//1插入中间表 先查在插入
//var transportTask = newDb.Queryable().Where(e => e.Location_To == task.Location_To && e.NeedTrig == "Y")?.First();
//if (transportTask == null)
//{
try
{
task.NeedTrig = Constants.Y;
newDb.BeginTran();
var B = newDb.Insertable(task).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
}
newDb.CommitTran();
}
catch (Exception ex)
{
newDb.RollbackTran();
}
return OperateResult.Succeed();
// }
}
// return OperateResult.Succeed();
}
else
{
return OperateResult.Error();
}
}
catch (Exception ex)
{
return OperateResult.Succeed();
}
}
private static object lockoIn = new object();
private static object lockoOut = new object();
public OperateResult ExecTransferTask(MesTaskDto req)
{
OperateResult ors = new OperateResult();
ors.Success = true;
string startArea = string.Empty, endArea = string.Empty;
var chi = new SqlHelper().GetInstance();
var newDb = chi.CopyNew();
try
{
InWorkAreaEntity inModel = new InWorkAreaEntity();
inModel.taskNo = req.task_no;
inModel.trayCode = req.TOOLS_NO;
inModel.priority = req.Priority;
inModel.startBit = req.Location_From;
inModel.endBit = req.Location_To;
inModel.locationGear = req.TOOLS_TPYE;
inModel.TrayType = req.TOOLS_TPYE;
inModel.remark = "业务类型:" + req.BUSI_TYPE;
inModel.PRODUCE_TIME = req.PRODUCE_TIME;
inModel.CHECK_INFO = req.CHECK_INFO;
inModel.CURRENT_AMOUNT = req.CURRENT_AMOUNT;
inModel.funCode = "L";
inModel.mesTaskNo = req.task_no;
inModel.TaskOrderType = req.Givewayto;
if (req.Task_PDA == "无托盘入库")
{
inModel.flag = "N";
}
else
{
inModel.flag = "Y";
}
if (req.BUSI_TYPE == "12")
{
inModel.TrayType = "KJZ";
}
if (req.TOOLS_NO == "99")
{
inModel.trayCode = "";
}
inModel.takeEffectTime = req.SHELF_LIFE_TIME.AddHours(-req.SHELF_REP);
inModel.expireTime = req.EXPIRED_TIME.AddHours(req.EXPIRED_REP);
OutWorkAreaEntity outModel = new OutWorkAreaEntity();
outModel.taskNo = req.task_no;
outModel.trayCode = req.TOOLS_NO;
outModel.priority = req.Priority;
outModel.startBit = req.Location_From;
outModel.endBit = req.Location_To;
outModel.remark = "业务类型:" + req.BUSI_TYPE;
outModel.funCode = "L";
outModel.mesTaskNo = req.task_no;
outModel.TaskOrderType = req.Givewayto;
if (req.BUSI_TYPE == "12")
{
outModel.TrayType = "KJZ";
}
else
{
outModel.TrayType = req.TOOLS_TPYE;
}
// 要执行的阶段
bool needCreateTask = true;
string direction = "";
if (req.Task_type == "1")
{
if (!string.IsNullOrEmpty(req.PROD_NO))
{
inModel.Data = new List();
CntrItemRel itemE = new CntrItemRel();
itemE.S_ITEM_CODE = req.PROD_NO;
itemE.S_ITEM_NAME = req.PROD_BOM;
itemE.S_ITEM_STATE = req.CHECK_INFO;
itemE.TurnCardNum = req.TurnCardNum;
itemE.itemFeature = req.PROD_TECH;
itemE.itemModel = req.PROD_SPEC;
itemE.Level = req.PROD_BOM;
itemE.applyProdSpecList = req.applyProdSpecList;
inModel.Data.Add(itemE);
}
direction = Constants.In;
}
if (req.Task_type == "2")
{
// 出库
direction = Constants.Out;
// 修改出库任务的终点为空托位
if (inModel.endBit == null)
{
LogHelper.Info("任务下发", "终点不能为空" + outModel.endBit);
return OperateResult.Error("任务下发" + "终点不能为空" + outModel.endBit);
}
outModel.endBit = inModel.endBit;
//outModel.startBit = "";
outModel.Data = new List();
OutWorkDataEntity itemOut = new OutWorkDataEntity();
itemOut.ItemCode = req.PROD_NO;
// itemOut.ItemName = req.PROD_NO;
itemOut.itemState = req.CHECK_INFO;
itemOut.ItemModel = req.PROD_NO;
itemOut.ItemCode = req.PROD_NO;
outModel.Data.Add(itemOut);
direction = Constants.Out;
}
string taskNo = "";
OperateResult externalRes = new OperateResult();
// 更新MES任务阶段
if (needCreateTask)
{
if (direction == Constants.In)
{
//传递参数
List inWorkAreaEntitys = new List
{
inModel
};
try
{
LogHelper.Info("任务下发", "传参:" + JsonConvert.SerializeObject(inWorkAreaEntitys));
lock (lockoIn)
{
externalRes = BLLCreator.CreateSingleton().InWorkArea(inWorkAreaEntitys);
if (!externalRes.Success)
{
LogHelper.Info("任务下发", "报错:" + externalRes.Msg);
ors.Msg = "入作业区失败:" + externalRes.Msg;
ors.Code = externalRes.Code;
ors.Success = false;
}
}
taskNo = inModel.taskNo;
}
catch (Exception ex)
{
LogHelper.Info("任务下发", "失败,传参:" + JsonConvert.SerializeObject(inWorkAreaEntitys) + ex.ToString());
ors.Msg = "入作业区失败:" + ex.Message;
ors.Code = externalRes.Code;
ors.Success = false;
}
}
else if (direction == Constants.Out)
{
//传递参数
List outWorkAreaEntitys = new List();
var transportTask = SqlSugarHelper.Db.Queryable().Where(e => e.Autoindex == "1")?.First();
List ListString = new List();
if (transportTask != null)
{
ListString = JsonConvert.DeserializeObject>(transportTask.TypeJson);
}
if (!ListString.Contains(outModel.endBit))
{
List state = new List { "完成", "取消" };
var tasks = SqlSugarHelper.Db.Queryable().Where(e => e.S_END_LOC == outModel.endBit && !(state.Contains(e.S_B_STATE))).ToList();
if (tasks.Count > 0)
{
LogHelper.Info("任务下发", "终点货位" + outModel.endBit + ",最多只能同时存在一条任务 任务" + JsonConvert.SerializeObject(tasks?.FirstOrDefault()?.S_TASK_NO));
throw new Exception("终点货位" + outModel.endBit + ",最多只能同时存在一条任务!" + JsonConvert.SerializeObject(tasks?.FirstOrDefault()?.S_TASK_NO));
}
}
outWorkAreaEntitys.Add(outModel);
try
{
lock (lockoOut)
{
externalRes = BLLCreator.CreateSingleton().OutWorkArea(outWorkAreaEntitys);
if (!externalRes.Success)
{
LogHelper.Info("任务下发", "报错:" + externalRes.Msg);
ors.Msg = "出作业区失败:" + externalRes.Msg;
ors.Success = false;
ors.Code = externalRes.Code;
}
}
taskNo = outModel.taskNo;
}
catch (Exception ex)
{
LogHelper.Info("任务下发", "失败,传参:" + JsonConvert.SerializeObject(outWorkAreaEntitys) + ex.ToString());
ors.Msg = "出作业区失败:" + ex.Message;
ors.Code = externalRes.Code;
ors.Success = false;
}
}
else
{
LogHelper.Info("任务下发", " 任务号为:" + req.task_no + "未知的出入库类型");
ors.Msg = "未知的出入库类型:" + direction;
ors.Success = false;
return ors;
}
if (!string.IsNullOrEmpty(externalRes.Msg))
{
if (externalRes.Msg.Contains("库存不足") || externalRes.Msg.Contains("空货位不足"))
{
if (req.Givewayto == "MES")
{
ZCReceivePriorityEntity task_MES = new ZCReceivePriorityEntity()
{
taskNo = req.task_no,
Data_status = 3,
End_big = req.Location_To,
TOOLS_NO = req.TOOLS_NO,
operattime = DateTime.Now
};
// OperateResult qe = new OperateResult();
OperateResult qe = BLLCreator.CreateSingleton().MesTaskEntity(task_MES);
LogHelper.Info("任务下发", "失败 通知MES 返回参数:" + JsonConvert.SerializeObject(qe));
}
}
}
}
else
{
// 不需要创建wms任务的执行流程,标识为成功
externalRes.Success = true;
externalRes.okList = null;
}
//查询任务执行情况表是否有记录
var _serviceExec = SqlSugarHelper.Db.Queryable().Where(e => e.CN_S_TASK_NO == req.task_no)?.First();
if (_serviceExec != null)
{
}
else
{
//如果没有记录--写入数据
_serviceExec = new TN_Service_execEntitys()
{
CN_S_TASK_NO = req.task_no,
CN_S_ITEM_CODE = req.PROD_NO,
CN_S_ITEM_NAME = req.PROD_BOM,
CN_S_TASK_TYPE = "移送",
// CN_S_TRANS_TYPE = req.SECTION,
CN_S_TRAY_CODE = req.TOOLS_NO,
CN_N_PRIORITY = req.Priority,
CN_StartBit = req.Location_From,
CN_S_END_LOCATION = req.Location_To,
CN_T_CREATE = DateTime.Now,
CN_C_COMPLETE = Constants.N,
CN_C_SEND_MES = Constants.N,
CN_F_QUANTITY = Convert.ToDecimal(req.CURRENT_AMOUNT),
CN_N_REQUEST_TYPE = 0,
CN_S_MSG = externalRes.Msg,
CN_S_TRAY_TYPE = req.TOOLS_TPYE
};
try
{
newDb.BeginTran();
var B = newDb.Insertable(_serviceExec).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
}
newDb.CommitTran();
}
catch (Exception ex)
{
LogHelper.Info("任务下发", "任务执行情况记录 报错 " + ex.Message);
newDb.RollbackTran();
}
}
if (!externalRes.Success)//任务失败
{
_serviceExec.CN_C_COMPLETE = Constants.N;
_serviceExec.CN_C_SEND_MES = Constants.N;
_serviceExec.CN_S_MSG = externalRes.Msg;
if (req.BUSI_TYPE == "7")
{
//如果出库任务是半成品-空托出库 就异步回滚 次数5次 每隔一分钟一次
_serviceExec.CN_C_SEND_MES = Constants.Y;
req.NeedTrig = Constants.Y;
if (req.frequency > 2)
{
_serviceExec.CN_C_SEND_MES = Constants.Y;
req.NeedTrig = Constants.N;
}
//出库失败后将回报给mes
ZCReceivePriorityEntity Rollmes = new ZCReceivePriorityEntity();
Rollmes.taskNo = req.task_no;
Rollmes.operattime = DateTime.Now;
Rollmes.remark = externalRes.Msg;
LogHelper.Info("任务下发", "半成品空托出库失败回报给MES" + "参数为" + JsonConvert.SerializeObject(req));
OperateResult re = BLLCreator.CreateSingleton().RollMesAllocation(Rollmes);
LogHelper.Info("任务下发", "半成品空托出库失败回报给MES" + "执行结果:" + JsonConvert.SerializeObject(re));
try
{
newDb.BeginTran();
var B = newDb.Updateable(_serviceExec).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
}
newDb.CommitTran();
}
catch (Exception ex)
{
LogHelper.Info("任务下发", "任务执行情况记录 报错 " + ex.Message);
newDb.RollbackTran();
}
}
}
else
{
if (needCreateTask)
{
var ok = externalRes.okList[0];
_serviceExec.CN_S_TASK_NO = req.task_no;
_serviceExec.CN_StartBit = ok.startBit;
_serviceExec.CN_S_END_LOCATION = ok.endBit;
_serviceExec.CN_S_TRAY_CODE = req.TOOLS_NO ?? ok.trayCode;
_serviceExec.CN_S_TRAY_TYPE = req.TOOLS_TPYE;
}
else
{
_serviceExec.CN_StartBit = "";
_serviceExec.CN_S_END_LOCATION = "";
}
// var ok = externalRes.okList[0];
// _serviceExec.CN_S_START_LOCATION = ok.startBit;
// _serviceExec.CN_S_END_LOCATION = ok.endBit;
_serviceExec.CN_C_COMPLETE = Constants.Y;
_serviceExec.CN_C_SEND_MES = Constants.Y;
_serviceExec.CN_S_MSG = externalRes.Msg ?? "下达成功";
try
{
newDb.BeginTran();
var B = newDb.Updateable(_serviceExec).ExecuteCommand();
if (B == 0)
{
newDb.RollbackTran();
}
newDb.CommitTran();
}
catch (Exception ex)
{
LogHelper.Info("任务下发", "任务执行情况记录 报错 " + ex.Message);
newDb.RollbackTran();
}
req.NeedTrig = Constants.N;
ors.Msg = "下达成功";
ors.Success = true;
}
// Log.DomainInfo("移送任务 结果", JsonConvert.SerializeObject(ors));
}
catch (Exception ex)
{
ors.Msg = "移送任务失败:" + ex.Message;
ors.Success = false;
newDb.RollbackTran();
}
LogHelper.Info("任务下发", "移送任务 结果" + JsonConvert.SerializeObject(ors));
return ors;
}
///
/// 回滚服务
///
///
///
public OperateResult EmptyTaskList(List EmptyList)
{
try
{
foreach (var item in EmptyList)
{
var chi = new SqlHelper().GetInstance();
var newDb2 = chi.CopyNew();
try
{
LogHelper.Info("回滚任务服务", "出空托");
MesTaskDto MesTask = new MesTaskDto()
{
task_no = item.requestPk,
Task_type = "2",
Givewayto = "WCS",
Location_To = item.curPos
};
MesTask.TOOLS_TPYE = "QB";
var re = BLLCreator.Create().ExecTransferTask(MesTask);
LogHelper.Info("回滚任务服务", $"出空托是否成功:{JsonConvert.SerializeObject(re)}");
if (!re.Success)
{
LogHelper.Info("回滚任务服务", "出KJZ");
MesTask.Task_type = "2";
MesTask.BUSI_TYPE = "12";
MesTask.Givewayto = "WCS";
MesTask.Location_To = item.curPos;
re = BLLCreator.Create().ExecTransferTask(MesTask);
LogHelper.Info("回滚任务服务", $"出KJZ是否成功:{JsonConvert.SerializeObject(re)}");
}
if (re.Success)
{
newDb2.BeginTran();
var B = newDb2.Updateable().SetColumns(it => new TN_Empty_MiddleEntitys
{
isread = "Y",
}).Where(x => x.requestPk == item.requestPk).ExecuteCommand();
if (B == 0)
{
newDb2.RollbackTran();
}
newDb2.CommitTran();
}
LogHelper.Info("回滚任务服务", "移送任务 结果" + JsonConvert.SerializeObject(re));
}
catch (Exception ex)
{
LogHelper.Info("回滚任务服务", "移送任务 报错" + ex.Message);
SqlSugarHelper.Db.RollbackTran();
continue;
}
}
return OperateResult.Succeed();
}
catch (Exception ex)
{
return OperateResult.Error(ex.Message);
}
}
///
/// 绑定解绑
///
///
public OperateResult TrayBindLocation(MesItemList sendTaskEntity)
{
var chi = new SqlHelper().GetInstance();
var newDb = chi.CopyNew();
try
{
LogHelper.Info("绑定解绑", "开始");
if (sendTaskEntity.BUSI_TYPE == "100")
{
LogHelper.Info("绑定解绑", "绑定");
//先判断托盘码是否存在于数据库中
var TrayLocation = SqlSugarHelper.Db.Queryable().Where(e => e.S_CNTR_CODE == sendTaskEntity.TOOLS_NO).ToList();
if (TrayLocation.Count() > 0)
{
throw new Exception("查询到该工装已经绑定了货位信息");
}
var TrayItems = SqlSugarHelper.Db.Queryable().Where(e => e.S_CNTR_CODE == sendTaskEntity.TOOLS_NO).ToList();
if (TrayItems.Count() > 0)
{
throw new Exception("查询到该工装已经绑定了物料信息");
}
var Locations = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == sendTaskEntity.LOCATION_CODE)?.First();
if (Locations == null)
{
throw new Exception("未查询到需要绑定的货位信息");
}
if (Locations.S_LOCK_STATE != "无")
{
throw new Exception($"需要绑定的货位{Locations.S_LOC_CODE}的状态为{Locations.S_LOCK_STATE} 货位不可用");
}
if (Locations.C_ENABLE != "Y")
{
throw new Exception($"需要绑定的货位{Locations.S_LOC_CODE}的启用状态为{Locations.C_ENABLE} 货位不可用");
}
if (Locations.N_CURRENT_NUM > 0)
{
throw new Exception($"需要绑定的货位{Locations.S_LOC_CODE}的当前容量为{Locations.N_CURRENT_NUM} 货位不可用");
}
var LocCnt = new LocCntrRel();
LocCnt.S_CNTR_CODE = sendTaskEntity.TOOLS_NO;
LocCnt.S_LOC_CODE = sendTaskEntity.LOCATION_CODE;
newDb.BeginTran();
var I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 1 }).Where(x => x.S_LOC_CODE == sendTaskEntity.LOCATION_CODE).ExecuteCommand();
if (I == 0)
{
throw new Exception("更新货位数量为1失败");
}
I = newDb.Insertable(LocCnt).ExecuteCommand();
if (I == 0)
{
throw new Exception("添加托盘货位表数据失败");
}
var trayItemMstGuid = Guid.NewGuid().ToString();
//添加托盘物料关联表
CntrItemRel rel = new CntrItemRel();
rel.S_ITEM_CODE = sendTaskEntity.PROD_NO;
rel.S_ITEM_NAME = sendTaskEntity.PROD_BOM;
rel.S_CNTR_CODE = sendTaskEntity.TOOLS_NO;
rel.S_BATCH_NO = "";
rel.TurnCardNum = sendTaskEntity.TurnCardNum;
rel.Level = sendTaskEntity.PROD_BOM;
rel.itemModel = sendTaskEntity.PROD_NO;
rel.expireTime = sendTaskEntity.EXPIRED_TIME.AddHours(sendTaskEntity.EXPIRED_REP);
rel.takeEffectTime = sendTaskEntity.SHELF_LIFE_TIME.AddHours(-sendTaskEntity.SHELF_REP); ;
rel.F_QTY = Convert.ToDecimal(sendTaskEntity.CURRENT_AMOUNT);
rel.S_ITEM_STATE = sendTaskEntity.CHECK_INFO;
rel.productionDate = sendTaskEntity.PRODUCE_TIME;
rel.T_INSTOCK = DateTime.Now;
if (!string.IsNullOrEmpty(sendTaskEntity.PROD_NO))
{
var A = newDb.Insertable(rel).ExecuteCommand();
if (A == 0)
{
throw new Exception("物料表添加失败");
}
}
newDb.CommitTran();
LogHelper.Info("绑定解绑", "结束");
return OperateResult.Succeed("绑定成功");
}
else
{
LogHelper.Info("绑定解绑", "解绑");
LogHelper.Info("绑定解绑", "开始");
var ca = Expressionable.Create();
ca.AndIF(!string.IsNullOrEmpty(sendTaskEntity.Location_From), (o, p, t) => o.S_LOC_CODE == sendTaskEntity.Location_From);
ca.AndIF(!string.IsNullOrEmpty(sendTaskEntity.TurnCardNum), (o, p, t) => t.TurnCardNum == sendTaskEntity.TurnCardNum);
ca.AndIF(!string.IsNullOrEmpty(sendTaskEntity.TOOLS_NO), (o, p, t) => p.S_CNTR_CODE == sendTaskEntity.TOOLS_NO);
var Locations = SqlSugarHelper.Db.Queryable().InnerJoin((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).Includes(e => e.LocCntrRel, p => p.CntrItemRel)?.First();
if (Locations == null)
{
throw new Exception("未查询到需要解绑的货位信息");
}
if (Locations.S_LOCK_STATE != "无")
{
throw new Exception($"需要解绑的货位{Locations.S_LOC_CODE}的状态为{Locations.S_LOCK_STATE} 货位不可解绑");
}
newDb.BeginTran();
var I = newDb.Updateable().SetColumns(it => new Location() { T_MODIFY = DateTime.Now, N_CURRENT_NUM = 0 }).Where(x => x.S_LOC_CODE == Locations.S_LOC_CODE).ExecuteCommand();
if (I == 0)
{
throw new Exception("更新货位数量为0失败");
}
I = newDb.Deleteable().Where(e => e.S_LOC_CODE == Locations.S_LOC_CODE && e.S_CNTR_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand();
if (I == 0)
{
throw new Exception("删除托盘货位表失败");
}
I = newDb.Deleteable().Where(e => e.S_CNTR_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand();
if (I == 0)
{
throw new Exception("删除托盘物料表失败");
}
newDb.CommitTran();
LogHelper.Info("绑定解绑", "结束");
return OperateResult.Succeed("解绑成功");
}
}
catch (Exception ex)
{
newDb.RollbackTran();
LogHelper.Info("绑定解绑", ex.Message);
return OperateResult.Error(ex.Message);
}
}
///
/// 接驳
///
///
public void UnBing(List aloneWcsList)
{
var chi = new SqlHelper().GetInstance();
var newDb = chi.CopyNew();
foreach (var item in aloneWcsList)
{
try
{
var re = BLLCreator.CreateSingleton().WcsCvstate(item);
if (!re.Success)
{
continue;
}
}
catch (Exception ex)
{
continue;
}
try
{
var ca = Expressionable.Create();
ca.And((o, p, t) => o.S_LOC_CODE == item.JbLocation);
var Locations = (newDb.Queryable().InnerJoin((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).LeftJoin((o, p, t) => p.S_CNTR_CODE == t.S_CNTR_CODE).Where(ca.ToExpression()).Includes(e => e.LocCntrRel, p => p.CntrItemRel)?.First()) ?? throw new Exception("未查询到需要解绑的货位信息");
if (Locations.S_LOCK_STATE != "无")
{
throw new Exception($"需要解绑的货位{Locations.S_LOC_CODE}的状态为{Locations.S_LOCK_STATE} 货位不可解绑");
}
newDb.BeginTran();
var I = newDb.Updateable().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 == Locations.S_LOC_CODE).ExecuteCommand();
if (I == 0)
{
throw new Exception("更新货位数量为0失败");
}
I = newDb.Deleteable().Where(e => e.S_LOC_CODE == Locations.S_LOC_CODE && e.S_CNTR_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand();
if (I == 0)
{
throw new Exception("删除托盘货位表失败");
}
if (Locations.LocCntrRel.CntrItemRel != null)
{
I = newDb.Deleteable().Where(e => e.S_CNTR_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand();
if (I == 0)
{
throw new Exception("删除托盘物料表失败");
}
}
I = newDb.Updateable().SetColumns(it => new AloneWcsTaskUnbingEntitys()
{
IsRead = "Y"
}).Where(x => x.JbLocation == item.JbLocation).ExecuteCommand();
if (I == 0)
{
throw new Exception($"更新点对点接驳位释放表 接驳位为{item.JbLocation} 为已读失败");
}
newDb.CommitTran();
}
catch (Exception ex)
{
newDb.RollbackTran();
LogHelper.Info("绑定解绑", "事务触发解绑接驳位-->" + ex.Message);
}
}
}
///
/// 自动转运
///
public void AutoTransport()
{
var Product = SqlSugarHelper.Db.Queryable().Where(e => e.IsEnable == "Y").ToList();
foreach (var item in Product)
{
try
{
if (item.TaskState == "空架子出库")
{
//查询两个库区是否有空托 当没有空托的时候在出空架子
var StaArea = item.S_AreaList.Split(',').ToList();
var Location = SqlSugarHelper.Db.Queryable().Where(e => StaArea.Contains(e.S_AREA_CODE) && e.S_TRAY_TYPE == "KT").ToList();
if (Location.Count() == 0)
{
MesTaskDto task = new MesTaskDto
{
Task_type = "2",
Location_To = item.S_EndBit,
BUSI_TYPE = "12"
};
var tta = BLLCreator.Create().ExecTransferTask(task);
}
}
}
catch (Exception ex)
{
throw;
}
}
}
///
/// 超过5分钟的空托任务 从立库出库
///
public void MesKtTaskIssued(List dtos)
{
var chi = new SqlHelper().GetInstance();
var newDb2 = chi.CopyNew();
foreach (var item in dtos)
{
var properties = typeof(MesKtTaskDto).GetProperties();
MesTaskDto Mestask = new MesTaskDto();
foreach (var property in properties)
{
var value = property.GetValue(item);
if (value != null)
{
var targetProperty = typeof(MesTaskDto).GetProperty(property.Name);
if (targetProperty != null && targetProperty.PropertyType == property.PropertyType)
{
targetProperty.SetValue(Mestask, value);
}
}
}
//将模型为MesKtTaskDto 转为模型MesTaskDto
// var value = property.GetValue(item);
//查询终点货位的当前容量是否超过最大容量 并且是堆叠式的类型
//查货位的容量是否可以生成到线边的任务
var transJson = newDb2.Queryable().Where(e => e.Autoindex == "堆叠-" + Mestask.TOOLS_TPYE)?.First();
List ListString = new List();
if (transJson != null)
{
ListString = JsonConvert.DeserializeObject>(transJson.TypeJson);
}
if (ListString.Contains(Mestask.Location_To))
{
var ggf = BLLCreator.Create().ExecTransferTask(Mestask);
if (ggf.Success)
{
try
{
LogHelper.Info("MES", $"空托任务生成 {Mestask.TOOLS_TPYE} 终点为{Mestask.Location_To}的任务");
newDb2.BeginTran();
var I = newDb2.Updateable().SetColumns(it => new MesKtTaskDto()
{
NeedTrig = "N"
}).Where(x => x.task_no == Mestask.task_no).ExecuteCommand();
if (I == 0)
{
throw new Exception("影响行数为0");
}
newDb2.CommitTran();
}
catch (Exception ex)
{
LogHelper.Info("MES", $"空托任务生成 {Mestask.TOOLS_TPYE} 终点为{Mestask.Location_To}的任务报错:" + ex.Message);
newDb2.RollbackTran();
}
}
}
else
{
try
{
LogHelper.Info("MES", $"空托任务释放 {Mestask.TOOLS_TPYE} 终点为{Mestask.Location_To}的任务 原因 找不到对应的配置信息对应关系");
newDb2.BeginTran();
var I = newDb2.Updateable().SetColumns(it => new MesKtTaskDto()
{
NeedTrig = "N"
}).Where(x => x.task_no == Mestask.task_no).ExecuteCommand();
if (I == 0)
{
throw new Exception("影响行数为0");
}
newDb2.CommitTran();
}
catch (Exception ex)
{
LogHelper.Info("MES", $"空托任务释放 {Mestask.TOOLS_TPYE} 终点为{Mestask.Location_To}的任务报错:" + ex.Message);
newDb2.RollbackTran();
}
}
}
}
private bool ContainsAnyChar(string input, List charList)
{
bool gf = false;
foreach (var item in charList)
{
if (input.Contains(input))
{
gf = true;
break;
}
}
return gf;
}
}
}