using HH.WCS.Mobox3.FJJF.models;
|
using HH.WCS.Mobox3.FJJT.api;
|
using HH.WCS.Mobox3.FJJT.device;
|
using HH.WCS.Mobox3.FJJT.models;
|
using HH.WCS.Mobox3.FJJT.process;
|
using HH.WCS.Mobox3.FJJT.util;
|
using HH.WCS.Mobox3.FJJT.wms;
|
using NLog.Fluent;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading;
|
using System.Threading.Tasks;
|
using System.Web.UI.WebControls;
|
using static HH.WCS.Mobox3.FJJT.api.ApiHelper;
|
using static HH.WCS.Mobox3.FJJT.util.Settings;
|
|
namespace HH.WCS.Mobox3.FJJT.core
|
{
|
/// <summary>
|
/// 定时轮询任务
|
/// </summary>
|
internal class Monitor
|
{
|
|
/// <summary>
|
/// 监听MES任务中间表
|
/// 1.钢包满料下线
|
/// 2.成型机叫料
|
/// </summary>
|
public static void MonitorMesTask() {
|
LogHelper.Info("监听MES任务中间表", "WMS");
|
var mesTaskList = WMSHelper.GetLjMesTaskList("PENDING");
|
foreach (var mesTask in mesTaskList)
|
{
|
// 1.钢包满料下线
|
List<string> lineLoclist = new List<string>() { };
|
lineLoclist.Add("GBJTW-01");
|
lineLoclist.Add("GBJTW-02");
|
if (mesTask.MSG_TYPE == "1" && mesTask.PALLET_TYPE == "7" && lineLoclist.Contains(mesTask.PALLET_ID))
|
{
|
LogHelper.Info("MES钢包满料下线任务", "WMS");
|
OffLineRequest request = new OffLineRequest(){ loc = mesTask.POSITION_ID, cntrNo = mesTask.PALLET_ID};
|
ApiHelper.offLineProcess(request);
|
}
|
|
// 2.成新机叫料
|
if (mesTask.MSG_TYPE == "0") {
|
var lineSideLoc = WMSHelper.GetLineSideLoc(mesTask.POSITION_ID);
|
if (lineSideLoc != null )
|
{
|
LogHelper.Info("MES成新机叫料任务", "WMS");
|
|
// 2.1成新机叫料(斜裁)
|
if (mesTask.PALLET_TYPE == "5" || mesTask.PALLET_TYPE == "6")
|
{
|
var xcTask = WMSHelper.GetLjXcTaskById(mesTask.ID);
|
if (xcTask == null)
|
{
|
ApiHelper.callMaterialHDK(mesTask.MATERIAL_CODE, mesTask.POSITION_ID, mesTask.ID);
|
}
|
else
|
{
|
mesTask.RETURN_CODE = xcTask.RETURN_CODE;
|
mesTask.RECEIVE_FLAG = xcTask.RECEIVE_FLAG;
|
mesTask.RECEIVE_DATE = xcTask.RECEIVE_DATE;
|
WMSHelper.updateLjMesTask(mesTask);
|
}
|
}
|
else
|
{
|
// 2.2 成新机叫料
|
ApiHelper.callMaterial(mesTask.MATERIAL_CODE, mesTask.POSITION_ID, mesTask.ID);
|
}
|
}
|
}
|
}
|
}
|
|
/// <summary>
|
/// 监听XC出库任务中间表
|
/// 读取斜裁立库出库任务表,查询任务是否执行完成,完成则,触发AGV任务
|
/// </summary>
|
public static void MonitorXcOutTask()
|
{
|
var xcOutTasks = WMSHelper.getLjXcOutTask("PENDING", "2");
|
foreach (var outTask in xcOutTasks)
|
{
|
var mesTask = WMSHelper.GetLjMesTaskById(outTask.ID);
|
if (mesTask != null && mesTask.RETURN_CODE == "2")
|
{
|
Location startLoc = LocationHelper.GetLoc(outTask.POSITION_ID);
|
Location endLoc = LocationHelper.GetLoc(mesTask.POSITION_ID);
|
|
var wmsTask = WMSHelper.GetWmsTaskByCntr(outTask.PALLET_ID);
|
if (wmsTask == null)
|
{
|
if (startLoc.N_LOCK_STATE == 0 && endLoc.N_LOCK_STATE == 0)
|
{
|
// 1.创建斜裁-成新机叫料作业
|
wmsTask = new WMSTask()
|
{
|
S_CNTR_CODE = outTask.PALLET_ID,
|
S_CODE = WMSHelper.GenerateTaskNo(),
|
S_START_LOC = startLoc.S_CODE,
|
S_START_AREA = startLoc.S_AREA_CODE,
|
S_END_LOC = endLoc.S_CODE,
|
S_END_AREA = endLoc.S_AREA_CODE,
|
S_TYPE = "叫料出库任务",
|
S_OP_DEF_CODE = mesTask.ID.ToString(),
|
S_OP_DEF_NAME = "成型机叫料出库任务(斜裁)",
|
T_START_TIME = DateTime.Now,
|
};
|
if (WMSHelper.CreateWmsTask(wmsTask))
|
{
|
WCSTask wcsTask = new WCSTask()
|
{
|
S_OP_NAME = wmsTask.S_OP_DEF_NAME,
|
S_OP_CODE = wmsTask.S_CODE,
|
S_CODE = WCSHelper.GenerateTaskNo(),
|
S_CNTR_CODE = wmsTask.S_CNTR_CODE,
|
S_TYPE = wmsTask.S_TYPE,
|
S_START_LOC = startLoc.S_CODE,
|
S_START_AREA = startLoc.S_AREA_CODE,
|
S_END_LOC = endLoc.S_CODE,
|
S_END_AREA = endLoc.S_AREA_CODE,
|
S_SCHEDULE_TYPE = "AGV",
|
N_PRIORITY = 10,
|
T_START_TIME = DateTime.Now,
|
};
|
|
if (WCSHelper.CreateTask(wcsTask))
|
{
|
// 起点、终点加锁
|
LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
|
LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
|
|
// 更新作业任务状态
|
wmsTask.N_B_STATE = 1;
|
WMSHelper.UpdateTaskState(wmsTask);
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info($"XC出库任务ID:{mesTask.ID},无法生成叫料任务,起点或终点上锁", "斜裁");
|
}
|
}
|
else
|
{
|
WCSTask wcsTask = new WCSTask()
|
{
|
S_OP_NAME = wmsTask.S_OP_DEF_NAME,
|
S_OP_CODE = wmsTask.S_CODE,
|
S_CODE = WCSHelper.GenerateTaskNo(),
|
S_CNTR_CODE = wmsTask.S_CNTR_CODE,
|
S_TYPE = wmsTask.S_TYPE,
|
S_START_LOC = startLoc.S_CODE,
|
S_START_AREA = startLoc.S_AREA_CODE,
|
S_END_LOC = endLoc.S_CODE,
|
S_END_AREA = endLoc.S_AREA_CODE,
|
S_SCHEDULE_TYPE = "AGV",
|
N_PRIORITY = 10,
|
T_START_TIME = DateTime.Now,
|
};
|
|
if (WCSHelper.CreateTask(wcsTask))
|
{
|
// 起点、终点加锁
|
LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
|
LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
|
|
// 更新作业任务状态
|
wmsTask.N_B_STATE = 1;
|
WMSHelper.UpdateTaskState(wmsTask);
|
}
|
}
|
}
|
}
|
}
|
|
|
/// <summary>
|
/// 自动补充空工装到接驳位
|
/// </summary>
|
public static void AutoReplenishEmptyPallet()
|
{
|
var logicConfigs = WMSHelper.getLogicConfigByTaskType("3");
|
if (logicConfigs != null && logicConfigs.Count > 0)
|
{
|
foreach (var item in logicConfigs)
|
{
|
var jbLoc = LocationHelper.GetLoc(item.S_LKKTJBLOC);
|
var wmsTask = WMSHelper.GetWmsTaskByEnd(item.S_LKKTJBLOC);
|
if (wmsTask == null && jbLoc.N_CURRENT_NUM == 0)
|
{
|
LogHelper.Info($"非直连接驳位:{jbLoc.S_CODE},需要补充空工装", "WMS");
|
Location startLoc = WMSHelper.getOutStockStartLoc(item.S_AREA_CODE, null);
|
if (startLoc != null)
|
{
|
var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
|
// 1.创建斜裁-成新机叫料作业
|
wmsTask = new WMSTask()
|
{
|
S_CNTR_CODE = locCntrRels[0].S_CNTR_CODE,
|
S_CODE = WMSHelper.GenerateTaskNo(),
|
S_START_LOC = startLoc.S_CODE,
|
S_START_AREA = startLoc.S_AREA_CODE,
|
S_END_LOC = jbLoc.S_CODE,
|
S_END_AREA = jbLoc.S_AREA_CODE,
|
S_TYPE = "空工装出库",
|
S_OP_DEF_NAME = "自动补充空工装到接驳位",
|
T_START_TIME = DateTime.Now,
|
};
|
if (WMSHelper.CreateWmsTask(wmsTask))
|
{
|
WCSTask wcsTask = new WCSTask()
|
{
|
S_OP_NAME = wmsTask.S_OP_DEF_NAME,
|
S_OP_CODE = wmsTask.S_CODE,
|
S_CODE = WCSHelper.GenerateTaskNo(),
|
S_CNTR_CODE = wmsTask.S_CNTR_CODE,
|
S_TYPE = wmsTask.S_TYPE,
|
S_START_LOC = startLoc.S_CODE,
|
S_START_AREA = startLoc.S_AREA_CODE,
|
S_END_LOC = jbLoc.S_CODE,
|
S_END_AREA = jbLoc.S_AREA_CODE,
|
S_SCHEDULE_TYPE = "WCS",
|
N_PRIORITY = 10,
|
T_START_TIME = DateTime.Now,
|
};
|
|
if (WCSHelper.CreateTask(wcsTask))
|
{
|
// 起点、终点加锁
|
LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
|
LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
|
|
// 更新作业任务状态
|
wmsTask.N_B_STATE = 1;
|
WMSHelper.UpdateTaskState(wmsTask);
|
}
|
}
|
}
|
else
|
{
|
WMSHelper.addAlarmRecord("流程异常", "高", $"非直连接驳位:{jbLoc.S_CODE}补充空工装失败,原因:库区:{item.S_AREA_CODE}没有空工装");
|
}
|
}
|
}
|
}
|
}
|
|
|
/// <summary>
|
/// 中转库空工装周转c厂
|
/// 1.监听MES任务,查询入库中转库的任务
|
/// 2.查询是否创建对应的空工装出库任务
|
/// 3.没有,则查询中转库数量满足是否创建出库任务
|
/// </summary>
|
public static void ZZKInStockTaskMonitor() {
|
|
}
|
|
|
/// <summary>
|
/// 监听MES托盘与物料信息表 、基础物料信息表
|
/// </summary>
|
public static void MonitorPalletAndMateral()
|
{
|
// 1.监听MES托盘物料绑定关系表,更新容器物料表
|
LogHelper.Info("监听托盘物料绑定关系表,更新容器物料表", "WMS");
|
WMSHelper.updatePalletAndMateral();
|
|
|
// 2.监听MES物料表,更新物料信息
|
LogHelper.Info("监听物料表,更新物料信息", "WMS");
|
WMSHelper.updateMateral();
|
}
|
|
/// <summary>
|
/// 定时更新库存信息 更新频率: 1分钟
|
/// </summary>
|
public static void UpdateInventoryRegularly()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var locations = db.Queryable<Location>()
|
.LeftJoin<LjLotOnhand>((a, b) => a.S_CODE == b.STORAGE_LOCATION)
|
.LeftJoin<LocCntrRel>((a, b, c) => a.S_CODE == c.S_LOC_CODE)
|
.Where((a, b, c) => b.PALLET_ID != c.S_CNTR_CODE)
|
.ToList();
|
|
foreach (var loc in locations)
|
{
|
var lotOnhand = db.Queryable<LjLotOnhand>().Where(a => a.STORAGE_LOCATION == loc.S_CODE).First();
|
if (lotOnhand != null) {
|
db.Deleteable(lotOnhand).ExecuteCommand();
|
}
|
|
var locCntrRels = LocationHelper.GetLocCntr(loc.S_CODE);
|
if (locCntrRels != null && locCntrRels.Count > 0)
|
{
|
locCntrRels.ForEach(a => {
|
var cntrItemRels = ContainerHelper.GetCntrItemRel(a.S_CNTR_CODE);
|
foreach (var cntrItem in cntrItemRels)
|
{
|
var material = WMSHelper.GetMaterial(cntrItem.S_ITEM_CODE);
|
LjLotOnhand ljLotOnhand = new LjLotOnhand()
|
{
|
MATERIAL_CODE = cntrItem.S_ITEM_CODE,
|
LOT_NAME = cntrItem.S_BATCH_NO,
|
PALLET_ID = cntrItem.S_CNTR_CODE,
|
STORAGE_LOCATION = loc.S_CODE,
|
QC_STATUS = cntrItem.S_ITEM_STATE,
|
UNIT = material.S_UNIT,
|
QTY = cntrItem.F_QTY,
|
IN_DATE = cntrItem.T_INBOUND_TIME,
|
};
|
db.Insertable(lotOnhand).ExecuteCommand();
|
}
|
});
|
}
|
}
|
}
|
|
/// <summary>
|
/// 监听批次状态表,更新批次的最长停放日期和最小停放日期
|
/// 更新频次:分钟
|
/// </summary>
|
public static void AutoUpdateBatchStatus() {
|
var db = new SqlHelper<object>().GetInstance();
|
var lotStatusList = db.Queryable<LjLotStatus>().Where(a => a.RECEIVE_FLAG.Trim() == "PENDING").ToList();
|
foreach (var lotStatus in lotStatusList)
|
{
|
var cntrItemRels = db.Queryable<CntrItemRel>().Where(a => a.S_ITEM_CODE.Trim() == lotStatus.MATERIAL_CODE && a.S_BATCH_NO == lotStatus.LOT_NAME).ToList();
|
if (cntrItemRels != null && cntrItemRels.Count > 0)
|
{
|
foreach (var item in cntrItemRels)
|
{
|
item.D_EXP_DATE = lotStatus.SHELFLIFE_DATE;
|
item.D_EXP_DATE1 = lotStatus.MINSHELFLIFE_DATE;
|
db.Updateable(lotStatus).ExecuteCommand();
|
}
|
}
|
lotStatus.RECEIVE_DATE = DateTime.Now;
|
lotStatus.RECEIVE_FLAG = "COMPLETE";
|
db.Updateable(lotStatus).ExecuteCommand();
|
}
|
}
|
|
|
/// <summary>
|
/// 监听物料配置中间表
|
/// </summary>
|
public static void MonitorItemConfig()
|
{
|
|
|
}
|
|
}
|
}
|