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
|
{
|
/// <summary>
|
/// 处理自管任务
|
/// </summary>
|
public void SelfManageTaskOut(List<WMSTask> TaskList)
|
{
|
try
|
{
|
#region 参数校验1 config
|
List<OperateResult> ors = new List<OperateResult>();
|
#endregion
|
var chi = new SqlHelper<object>().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<OutAreaTaskAnyJbEntitys>().Where(e => e.S_AreaCode == task.S_START_LAREA && e.S_IsUse == "Y")?.First();
|
//获取托盘号 如果起点管控的话
|
var endArea = newDb.Queryable<TN_AreaEntitys>().Where(e => e.S_AREA_CODE == task.S_END_LAREA)?.First();
|
if (endArea != null && endArea.S_CONTROL_QTY == "Y")
|
{
|
var locaBit = newDb.Queryable<LocCntrRel>().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<CntrItemRel>().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<string> result = input.Split(',').ToList();
|
if (tTaskNum != null && Itemgh != null)
|
{
|
//查询起点库区对应巷道总任务量
|
var TaskLis = newDb.Queryable<WMSTask>().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<CntrItemRel>().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<string> State = new List<string> { "完成", "取消" };
|
var TaskLis = newDb.Queryable<WMSTask>().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<Location>();
|
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<Location> lstLocation = newDb.Queryable<Location>().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<LocCntrRel>().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<Location>();
|
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<Location> emptyLocation = newDb.Queryable<Location>().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<TN_ArithmeticEntitys>();
|
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<TN_ArithmeticEntitys> lstStrategy = newDb.Queryable<TN_ArithmeticEntitys>().Where(exp.ToExpression()).ToList();
|
//获取预出库锁定的货位
|
if (lstStrategy.Select(o => o.S_STRATEGY_CODE).ToList().Contains("FirstInLastOut"))
|
{
|
//去除预出库锁定的排列层
|
var loca = Expressionable.Create<Location>();
|
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<Location> locationOutLock = newDb.Queryable<Location>().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<Location>();
|
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<Location> locationInLock = newDb.Queryable<Location>().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<Location>();
|
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<Location> lstLocationHasItem = newDb.Queryable<Location>().Where(locaWc.ToExpression()).ToList();
|
LogHelper.DanInfo("处理自管任务", "lstLocationHasItem数据:" + JsonConvert.SerializeObject(lstLocationHasItem));
|
List<Location> lstLocationHasItemOrder = new List<Location>();
|
|
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<Location>().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<Location>().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<WcsTask>().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<Location>().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<WMSTask>().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<WcsTask>().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<WMSTask>().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);
|
}
|
}
|
|
|
/// <summary>
|
/// 处理自管任务
|
/// </summary>
|
public void SelfManageTaskIn(List<WMSTask> TaskList)
|
{
|
try
|
{
|
#region 参数校验1 config
|
List<OperateResult> ors = new List<OperateResult>();
|
string msg = "";
|
// LocationHelper.LocationCode(); 验证货位信息
|
#endregion
|
var chi = new SqlHelper<object>().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<CntrItemRel>().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<string> TaskState = new List<string>() { "取消", "完成" };
|
var transportTask = newDb2.Queryable<WMSTask>().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<WMSTask>().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<CntrItemRel>().Where(e => e.S_CNTR_CODE == task.S_CNTRS)?.First();
|
string taskNo = task.S_TASK_NO + "_2";
|
var portTask = newDb2.Queryable<WMSTask>().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<Location>();
|
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<Location> lstLocation = newDb2.Queryable<Location>().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<string> State = new List<string>() { "未执行", "执行中" };
|
var LstTask = Expressionable.Create<WMSTask>();
|
LstTask.And(it => State.Contains(it.S_B_STATE));
|
LstTask.And(it => it.S_END_LOC == competeBit.S_LOC_CODE);
|
var Task = newDb2.Queryable<WMSTask>().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<WMSTask>().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<WMSTask>().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<WMSTask>().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<WcsTask>().WcsTaskEntity(taskEntity, CntItem);
|
}
|
// re = BLLCreator.CreateSingleton<WcsTask>().WcsTaskEntity(taskEntity, CntItem);
|
//成功下达 则主任务改为已读
|
if (re.Success)
|
{
|
B = newDb2.Updateable<WMSTask>().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<WMSTask> tasL)
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
try
|
{
|
OperateResult re = OperateResult.Succeed();
|
foreach (var tas in tasL)
|
{
|
CntrItemRel CntItem = newDb.Queryable<CntrItemRel>().Where(e => e.S_CNTR_CODE == tas.S_CNTRS)?.First();
|
re = BLLCreator.CreateSingleton<WcsTask>().WcsTaskEntity(tas, CntItem);
|
if (re.Success)
|
{
|
try
|
{
|
newDb.BeginTran();
|
var B = newDb.Updateable<WMSTask>().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();
|
}
|
}
|
|
/// <summary>
|
/// 更换终点
|
/// </summary>
|
/// <returns></returns>
|
public SetChangeDto GetDndLocation(WcsTaskState Vendor)
|
{
|
var Task = Expressionable.Create<WMSTask>();
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
SetChangeDto change = new SetChangeDto();
|
Task.And(it => it.S_TASK_NO == Vendor.taskNo);
|
var Tasks = newDb.Queryable<WMSTask>().Where(Task.ToExpression())?.First() ?? throw new Exception("未查询到该任务 任务号为:" + Vendor.taskNo);
|
|
//查询这个托盘是否有物料信息
|
var ggf = newDb.Queryable<CntrItemRel>().Where(e => e.S_BATCH_NO == Tasks.S_CNTRS)?.First();
|
var endIsCurrentTask = newDb.Queryable<Location>().Where(e => e.S_LOC_CODE == Tasks.S_END_LOC)?.First();
|
List<areaPriorClass> clas = new List<areaPriorClass>() {
|
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<string>() { endIsCurrentTask.N_ROADWAY.ToString() },
|
itemCode = ggf?.S_ITEM_CODE,
|
IsChangeBit = 1,
|
// callSys = executeInWorkAreaPara.InWorkAreaEntity.sysName,
|
needCalLock = true
|
};
|
|
//根据库区获取货位
|
InAssignResultEntity resultEntity = BLLCreator.Create<In_AlgorBLL>().InAssign(aEntity);
|
if (!resultEntity.Success)
|
{
|
change.S_LOC_CODE = "101";
|
try
|
{
|
newDb.BeginTran();
|
var C = newDb.Updateable<Location>().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<WMSTask>().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<WMSTask>().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<Location>().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;
|
}
|
|
/// <summary>
|
/// 更换起点
|
/// </summary>
|
/// <param name="Vendor"></param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
public SetChangeDto GetStaLocation(WcsTaskState Vendor)
|
{
|
var Task = Expressionable.Create<WMSTask>();
|
SetChangeDto change = new SetChangeDto();
|
Task.And(it => it.S_TASK_NO == Vendor.taskNo);
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
var Tasks = newDb.Queryable<WMSTask>().Where(Task.ToExpression())?.First() ?? throw new Exception("未查询到该任务 任务号为:" + Vendor.taskNo);
|
|
var endIsCurrentTask = newDb.Queryable<Location>().Where(e => e.S_LOC_CODE == Tasks.S_START_LOC)?.First();
|
var trayItemMsts = newDb.Queryable<CntrItemRel>().Where(e => e.S_CNTR_CODE == Tasks.S_CNTRS)?.First();
|
List<areaPriorClass> clas = new List<areaPriorClass>() {
|
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<Out_AlgorBLL>().OutAssign(oEntity);
|
if (!ire.Success)
|
{
|
change.S_LOC_CODE = "102";
|
try
|
{
|
newDb.BeginTran();
|
var C = newDb.Updateable<Location>().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<WMSTask>().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<WMSTask>().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<WMSTask>().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<Location>().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;
|
}
|
/// <summary>
|
/// 改道--中策
|
/// </summary>
|
/// <param name="task"></param>
|
/// <param name="Endlocation"></param>
|
/// <param name="Jb"></param>
|
/// <returns></returns>
|
public OperateResult UpdateTaskEndLocation(WMSTask task, string Endlocation, Location Jb)
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
try
|
{
|
newDb.BeginTran();
|
//更改住任务终点货位
|
var B = newDb.Updateable<WMSTask>().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<WMSTask>().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<Location>().SetColumns(it => new Location
|
//{
|
// S_LOCK_STATE = "入库锁"
|
//}).Where(x => x.S_LOC_CODE == Endlocation).ExecuteCommand();
|
//if (B == 0)
|
//{
|
// throw new Exception("新算的货位锁定失败");
|
//}
|
B = newDb.Updateable<Location>().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<object>().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<ZCBLL>().ExecTransferTask(task);
|
|
return re;
|
}
|
catch (Exception ex)
|
{
|
newDb.RollbackTran();
|
LogHelper.Info("任务下发", "--发生了错误 错误为:" + ex.Message);
|
return OperateResult.Error(ex.Message);
|
}
|
|
}
|
|
/// <summary>
|
/// 线边缓存区 存取
|
/// </summary>
|
/// <param name="task"></param>
|
/// <returns></returns>
|
public OperateResult BusTask(MesKtTaskDto task)
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
try
|
{
|
var transJson1 = newDb.Queryable<ConfigJsonEntitys>().Where(e => e.Autoindex == "堆叠-" + task.TOOLS_TPYE)?.First();
|
if (transJson1 != null)
|
{
|
if (task.BUSI_TYPE == "3")//入库
|
{
|
//查询是否有空托任务进行缓存 ,有则送到线边去 ,没有则送到库中--
|
var transportTask1 = newDb.Queryable<MesKtTaskDto>().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<ConfigJsonEntitys>().Where(e => e.Autoindex == "堆叠-" + task.TOOLS_TPYE)?.First();
|
List<string> ListString = new List<string>();
|
if (transJson != null)
|
{
|
ListString = JsonConvert.DeserializeObject<List<string>>(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<OutWorkAreaEntity> outWorkAreas = new List<OutWorkAreaEntity>
|
{
|
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<OutWorkAreaBll>().OutWorkArea(outWorkAreas);
|
if (result.Success)
|
{
|
try
|
{
|
newDb.BeginTran();
|
var I = newDb.Updateable<MesKtTaskDto>().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<MesKtTaskDto>().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<object>().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>();
|
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>();
|
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<InWorkAreaEntity> inWorkAreaEntitys = new List<InWorkAreaEntity>
|
{
|
inModel
|
};
|
try
|
{
|
LogHelper.Info("任务下发", "传参:" + JsonConvert.SerializeObject(inWorkAreaEntitys));
|
lock (lockoIn)
|
{
|
externalRes = BLLCreator.CreateSingleton<InWorkAreaBll>().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<OutWorkAreaEntity> outWorkAreaEntitys = new List<OutWorkAreaEntity>();
|
var transportTask = SqlSugarHelper.Db.Queryable<ConfigJsonEntitys>().Where(e => e.Autoindex == "1")?.First();
|
List<string> ListString = new List<string>();
|
if (transportTask != null)
|
{
|
ListString = JsonConvert.DeserializeObject<List<string>>(transportTask.TypeJson);
|
}
|
if (!ListString.Contains(outModel.endBit))
|
{
|
List<string> state = new List<string> { "完成", "取消" };
|
var tasks = SqlSugarHelper.Db.Queryable<WMSTask>().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<OutWorkAreaBll>().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<MesTask>().MesTaskEntity(task_MES);
|
LogHelper.Info("任务下发", "失败 通知MES 返回参数:" + JsonConvert.SerializeObject(qe));
|
}
|
}
|
}
|
}
|
else
|
{
|
// 不需要创建wms任务的执行流程,标识为成功
|
externalRes.Success = true;
|
externalRes.okList = null;
|
}
|
//查询任务执行情况表是否有记录
|
var _serviceExec = SqlSugarHelper.Db.Queryable<TN_Service_execEntitys>().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<MesTask>().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;
|
}
|
|
/// <summary>
|
/// 回滚服务
|
/// </summary>
|
/// <param name="EmptyList"></param>
|
/// <returns></returns>
|
public OperateResult EmptyTaskList(List<TN_Empty_MiddleEntitys> EmptyList)
|
{
|
try
|
{
|
foreach (var item in EmptyList)
|
{
|
var chi = new SqlHelper<object>().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<ZCBLL>().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<ZCBLL>().ExecTransferTask(MesTask);
|
LogHelper.Info("回滚任务服务", $"出KJZ是否成功:{JsonConvert.SerializeObject(re)}");
|
}
|
if (re.Success)
|
{
|
|
newDb2.BeginTran();
|
var B = newDb2.Updateable<TN_Empty_MiddleEntitys>().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);
|
}
|
}
|
|
/// <summary>
|
/// 绑定解绑
|
/// </summary>
|
/// <returns></returns>
|
public OperateResult TrayBindLocation(MesItemList sendTaskEntity)
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
try
|
{
|
LogHelper.Info("绑定解绑", "开始");
|
if (sendTaskEntity.BUSI_TYPE == "100")
|
{
|
LogHelper.Info("绑定解绑", "绑定");
|
//先判断托盘码是否存在于数据库中
|
var TrayLocation = SqlSugarHelper.Db.Queryable<LocCntrRel>().Where(e => e.S_CNTR_CODE == sendTaskEntity.TOOLS_NO).ToList();
|
if (TrayLocation.Count() > 0)
|
{
|
throw new Exception("查询到该工装已经绑定了货位信息");
|
}
|
var TrayItems = SqlSugarHelper.Db.Queryable<CntrItemRel>().Where(e => e.S_CNTR_CODE == sendTaskEntity.TOOLS_NO).ToList();
|
if (TrayItems.Count() > 0)
|
{
|
throw new Exception("查询到该工装已经绑定了物料信息");
|
}
|
var Locations = SqlSugarHelper.Db.Queryable<Location>().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<Location>().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<Location, LocCntrRel, CntrItemRel>();
|
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<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).InnerJoin<CntrItemRel>((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<Location>().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<LocCntrRel>().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<CntrItemRel>().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);
|
}
|
}
|
|
/// <summary>
|
/// 接驳
|
/// </summary>
|
/// <param name="aloneWcsList"></param>
|
public void UnBing(List<AloneWcsTaskUnbingEntitys> aloneWcsList)
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
foreach (var item in aloneWcsList)
|
{
|
try
|
{
|
var re = BLLCreator.CreateSingleton<WcsTask>().WcsCvstate(item);
|
if (!re.Success)
|
{
|
continue;
|
}
|
}
|
catch (Exception ex)
|
{
|
continue;
|
}
|
|
try
|
{
|
var ca = Expressionable.Create<Location, LocCntrRel, CntrItemRel>();
|
ca.And((o, p, t) => o.S_LOC_CODE == item.JbLocation);
|
var Locations = (newDb.Queryable<Location>().InnerJoin<LocCntrRel>((o, p) => o.S_LOC_CODE == p.S_LOC_CODE).LeftJoin<CntrItemRel>((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<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 == Locations.S_LOC_CODE).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("更新货位数量为0失败");
|
}
|
I = newDb.Deleteable<LocCntrRel>().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<CntrItemRel>().Where(e => e.S_CNTR_CODE == Locations.LocCntrRel.S_CNTR_CODE).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("删除托盘物料表失败");
|
}
|
}
|
I = newDb.Updateable<AloneWcsTaskUnbingEntitys>().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);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 自动转运
|
/// </summary>
|
public void AutoTransport()
|
{
|
var Product = SqlSugarHelper.Db.Queryable<AutoTransportEntitys>().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<Location>().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<ZCBLL>().ExecTransferTask(task);
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
|
throw;
|
}
|
}
|
}
|
|
/// <summary>
|
/// 超过5分钟的空托任务 从立库出库
|
/// </summary>
|
public void MesKtTaskIssued(List<MesKtTaskDto> dtos)
|
{
|
var chi = new SqlHelper<object>().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<ConfigJsonEntitys>().Where(e => e.Autoindex == "堆叠-" + Mestask.TOOLS_TPYE)?.First();
|
List<string> ListString = new List<string>();
|
if (transJson != null)
|
{
|
ListString = JsonConvert.DeserializeObject<List<string>>(transJson.TypeJson);
|
}
|
if (ListString.Contains(Mestask.Location_To))
|
{
|
var ggf = BLLCreator.Create<ZCBLL>().ExecTransferTask(Mestask);
|
if (ggf.Success)
|
{
|
try
|
{
|
LogHelper.Info("MES", $"空托任务生成 {Mestask.TOOLS_TPYE} 终点为{Mestask.Location_To}的任务");
|
newDb2.BeginTran();
|
var I = newDb2.Updateable<MesKtTaskDto>().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<MesKtTaskDto>().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<string> charList)
|
{
|
bool gf = false;
|
foreach (var item in charList)
|
{
|
if (input.Contains(input))
|
{
|
gf = true;
|
break;
|
}
|
}
|
return gf;
|
}
|
|
}
|
}
|