using HH.WCS.DaYang.util;
|
using HH.WCS.DaYang.wms;
|
using Opc.Ua;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Reflection;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace HH.WCS.DaYang.core
|
{
|
internal class WMSCore
|
{
|
/// <summary>
|
/// 遍历定版的发货单,生产分拣单主表和子表(也可以手动调接口触发)
|
/// </summary>
|
internal static void CheckShippingOrder()
|
{
|
//1.0、获取已经定版的发货单,生产分拣单子表和主表,设置【发货单】的业务状态 N_B_STATE = 1(待分拣)
|
//2.0、如果发货单C_AUTO_SORTING=Y,则自动将分拣单状态设置为开始配货
|
|
}
|
/// <summary>
|
/// 开始配货创建分拣单明细(改成调接口触发)
|
/// </summary>
|
internal static void CheckSortingOrder()
|
{
|
//new SortingOrder().N_B_STATE
|
//1.0、获取 N_B_STATE = 1 (开始配货)状态的分拣单
|
//2.0、遍历分拣单子表,创建分拣单明细,更新分拣单子表的明细汇总F_ACC_S_QTY
|
//3.0、全部分拣单子表的明细创建完毕,子表明细汇总和子表数量一致,更新分拣单状态,N_B_STATE = 2配货完成
|
//4.0、如果分拣单是自动作业,就直接更新到 N_B_STATE = 3开始作业
|
//WMSHelper.GetWaitingSortingOrderList();
|
|
}
|
|
|
|
|
/// <summary>
|
/// 作业启动,创建子任务
|
/// </summary>
|
internal static void Start()
|
{
|
|
List<WMSTask> list = WMSHelper.GetWaitingOperationList();
|
if (list.Count > 0)
|
{
|
var db = new SqlHelper<WCSTask>().GetInstance();
|
//空托回库任务创建
|
list.ForEach(a =>
|
{
|
//空托回库
|
if (a.N_TYPE == 1)
|
{
|
if (!string.IsNullOrEmpty(a.S_END_LOC))
|
{
|
var jbwloc = db.Queryable<Location>().Where(b => b.S_CODE == "XTGKW-1-1").First();
|
if (jbwloc == null)
|
{
|
LogHelper.Info("创建出库任务未找到接驳位货位编码,请假查接驳位置货位");
|
}
|
//创建agv搬运任务
|
var wcsTask1 = new WCSTask
|
{
|
S_OP_CODE = a.S_CODE,
|
S_OP_NAME = "入库",
|
S_CODE = WCSHelper.GenerateTaskNo(),
|
S_TYPE = "空托回库",
|
S_START_LOC = a.S_START_LOC,
|
S_START_AREA = a.S_START_AREA,
|
S_END_LOC = jbwloc.S_CODE,
|
S_END_AREA = jbwloc.S_AREA_CODE,
|
N_SCHEDULE_TYPE = 1,
|
N_CNTR_COUNT = 1,
|
S_CNTR_CODE = a.S_CNTR_CODE,
|
|
};
|
//创建wcs回库任务
|
var wcsTask2 = new WCSTask
|
{
|
S_OP_CODE = a.S_CODE,
|
S_OP_NAME = "入库",
|
S_CODE = WCSHelper.GenerateTaskNo(),
|
S_TYPE = "空托回库",
|
S_START_LOC = jbwloc.S_CODE,
|
S_START_AREA = jbwloc.S_AREA_CODE,
|
S_END_LOC = a.S_END_LOC,
|
S_END_AREA = a.S_END_AREA,
|
N_SCHEDULE_TYPE = 2,
|
N_CNTR_COUNT = 1,
|
S_CNTR_CODE = a.S_CNTR_CODE,
|
|
};
|
|
if (WCSHelper.CreateTask(wcsTask1) && WCSHelper.CreateTask(wcsTask2))
|
{
|
//更新作业状态为执行
|
a.N_B_STATE = 1;
|
a.S_B_STATE = "执行";
|
LocationHelper.LockLoc(a.S_START_LOC, 2);
|
LocationHelper.LockLoc(a.S_END_LOC, 1);
|
WMSHelper.UpdateTaskState(a);
|
}
|
}
|
}
|
else if (a.N_TYPE == 2)
|
{
|
#region MyRegion
|
//判断外侧有没有托盘,需不需要移库
|
var StartLoc = db.Queryable<Location>().Where(b => b.S_CODE == a.S_START_LOC).First();
|
if (StartLoc.N_POS == 1)
|
{
|
var OutLoc = db.Queryable<Location>().Where(b => b.S_AREA_CODE == StartLoc.S_AREA_CODE && b.N_LAYER == StartLoc.N_LAYER && b.N_POS == 2 && b.N_CURRENT_NUM == 1 && b.N_LOCK_STATE == 0).First();
|
if (OutLoc != null)
|
{
|
//根据起点获取托盘和托盘物料绑定关系
|
string itemCode = "";
|
var cntrLoc = LocationHelper.GetLocCntr(OutLoc.S_CODE).FirstOrDefault();
|
if (cntrLoc != null)
|
{
|
//获取托盘物料绑定关系
|
var cntrItem = db.Queryable<CntrItemDetail>().Where(b => b.S_CNTR_CODE == cntrLoc.S_CNTR_CODE).First();
|
if (cntrItem != null)
|
{
|
itemCode = cntrItem.S_ITEM_CODE;
|
}
|
}
|
|
var YiKuLoc = LocationHelper.InStorage(itemCode);
|
if (YiKuLoc != null)
|
{
|
var wcsTask = new WCSTask
|
{
|
S_OP_CODE = a.S_CODE,
|
S_OP_NAME = "出库",
|
S_CODE = WCSHelper.GenerateTaskNo(),
|
S_TYPE = "移库",
|
S_START_LOC = OutLoc.S_CODE,
|
S_END_LOC = YiKuLoc.S_CODE,
|
N_SCHEDULE_TYPE = 2,
|
N_CNTR_COUNT = 1,
|
S_CNTR_CODE = a.S_CNTR_CODE,
|
|
};
|
if (WCSHelper.CreateTask(wcsTask))
|
{
|
//更新作业状态为执行
|
LocationHelper.LockLoc(OutLoc.S_CODE, 2);
|
LocationHelper.LockLoc(YiKuLoc.S_CODE, 1);
|
}
|
}
|
else
|
{
|
LogHelper.Info($"作业:{a.S_CODE}外侧货位{OutLoc.S_CODE},未计算到移库货位,作业不启动");
|
return;
|
}
|
|
}
|
}
|
#endregion
|
|
// string JbwLoc = "XTGKW-1-1";
|
var jbwloc= db.Queryable<Location>().Where(b => b.S_CODE == "XTGKW-1-1").First();
|
if (jbwloc == null)
|
{
|
LogHelper.Info("创建出库任务未找到接驳位货位编码,请假查接驳位置货位");
|
}
|
//创建wcs任务
|
var wcsTask1 = new WCSTask
|
{
|
S_OP_CODE = a.S_CODE,
|
S_OP_NAME = "出库",
|
S_CODE = WCSHelper.GenerateTaskNo(),
|
S_TYPE = "出库",
|
S_START_LOC = a.S_START_LOC,
|
S_START_AREA = a.S_START_AREA,
|
S_END_LOC = jbwloc.S_CODE,
|
S_END_AREA = jbwloc.S_AREA_CODE,
|
N_SCHEDULE_TYPE = 2,
|
N_CNTR_COUNT = 1,
|
S_CNTR_CODE = a.S_CNTR_CODE,
|
|
};
|
//创建agv出库任务
|
var wcsTask2 = new WCSTask
|
{
|
S_OP_CODE = a.S_CODE,
|
S_OP_NAME = "出库",
|
S_CODE = WCSHelper.GenerateTaskNo(),
|
S_TYPE = "出库",
|
S_START_LOC = jbwloc.S_CODE,
|
S_START_AREA = jbwloc.S_AREA_CODE,
|
S_END_LOC = a.S_END_LOC,
|
S_END_AREA = a.S_END_AREA,
|
N_SCHEDULE_TYPE = 1,
|
N_CNTR_COUNT = 1,
|
S_CNTR_CODE = a.S_CNTR_CODE,
|
|
};
|
|
if (WCSHelper.CreateTask(wcsTask1) && WCSHelper.CreateTask(wcsTask2))
|
{
|
//更新作业状态为执行
|
a.N_B_STATE = 1;
|
a.S_B_STATE = "执行";
|
LocationHelper.LockLoc(a.S_START_LOC, 2);
|
LocationHelper.LockLoc(a.S_END_LOC, 1);
|
WMSHelper.UpdateTaskState(a);
|
}
|
}
|
|
});
|
|
}
|
}
|
}
|
}
|