using HH.WCS.Mobox3.YNJuXing.api;
|
using HH.WCS.Mobox3.YNJuXing.device;
|
using HH.WCS.Mobox3.YNJuXing.process;
|
using HH.WCS.Mobox3.YNJuXing.util;
|
using HH.WCS.Mobox3.YNJuXing.wms;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading;
|
using System.Threading.Tasks;
|
|
namespace HH.WCS.Mobox3.YNJuXing.core
|
{
|
/// <summary>
|
/// 定时轮询任务
|
/// </summary>
|
internal class Monitor
|
{
|
internal static void CheckThirdOutWork()
|
{
|
//第三方读中间表
|
//var db= new SqlHelper<object>().GetInstance("中间表的sql连接字符串");
|
// db.Queryable<object>
|
|
//读到了出库单,插入到我们的表
|
|
|
}
|
|
internal static void CheckOutWork()
|
{
|
//读自己的中间表,我们自己的表有表有个字段计数,计数小于最大值,继续出库,一次生成一条任务
|
|
}
|
|
|
internal static void CheckDevice()
|
{
|
//检测输送线状态
|
|
S7Helper.ReadStr("plc1", 100, 1, 8);
|
S7Helper.ReadBit("plc1", 101, 1, 2);
|
S7Helper.ReadInt("plc1", 102, 1, 6);
|
//1 设备plc的ip deviceNo 自动建立连接
|
//2 设备对应的通讯项和线体类型(输送线入口、输送线出口、提升机的入口。。。。)起始读的偏移地址,写的偏移地址
|
//{ "deviceNo":"5","code":"9001","location":"F1CJ-SSX1-01","writeAddr900":0,"writeAddr905":-1,"writeAddr710":0,"readAddr901":2,"readAddr902":0,"lineType":1},
|
//3 通讯项自动读plc,读到的数据根据lineType做处理,自动创建任务或者更新任务状态(创建一个设备动作或任务动作,如果是任务动作有个线程去读)
|
}
|
|
|
|
#region 巨星二期
|
internal static void OutTask()
|
{
|
try
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var info = db.Queryable<OutWorkNo>().OrderBy(a => a.CREATTIME).ToList();
|
foreach (var item in info)
|
{
|
LogHelper.Info($"出库单号={item.WORKORDERNO} 开始时间={item.STARTTIME} 结束时间={item.ENDTIME}");
|
if (item.TYPE == 0)
|
{
|
OutLocation(db, item);
|
}
|
else
|
{
|
if (item.ENDTIME > DateTime.Now && item.STARTTIME < DateTime.Now)
|
{
|
//查找可生成任务的托盘
|
OutLocation(db, item);
|
}
|
else if (item.ENDTIME < DateTime.Now)
|
{
|
//删除记录
|
db.Deleteable<OutTask>().Where(a => a.WORKORDERNO == item.WORKORDERNO).ExecuteCommand();
|
db.Deleteable(item).ExecuteCommand();
|
}
|
}
|
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Info($"出库流程异常 异常信息={ex.Message}", "出库");
|
}
|
|
}
|
|
private static void OutLocation(SqlSugar.SqlSugarClient db, OutWorkNo item)
|
{
|
var trayNo = db.Queryable<OutTask>().Where(a => a.WORKORDERNO == item.WORKORDERNO).ToList();
|
LogHelper.Info($"出库托盘数 {trayNo.Count}");
|
if (trayNo.Count > 0)
|
{
|
//出库算法
|
foreach (var it in trayNo)
|
{
|
var istask = db.Queryable<WCSTask>().Where(a => a.S_CNTR_CODE == it.TRAYCODE && a.N_B_STATE != 2 && a.N_B_STATE != 3).First();
|
if (istask == null)
|
{
|
string sysNo = "";
|
Location startbit = null;
|
Location endbit = null;
|
string tasktype = "";
|
string traycode = "";
|
string endarea = it.ENDAREA;
|
var trayinfo = db.Queryable<LocCntrRel>().Where(a => a.S_CNTR_CODE == it.TRAYCODE).First();
|
if (trayinfo != null)
|
{
|
var locinfo = db.Queryable<Location>().Where(a => a.S_CODE == trayinfo.S_LOC_CODE).First();
|
LogHelper.Info($"托盘{it.TRAYCODE} 当前所在位置{locinfo.S_CODE} 侧={locinfo.N_SIDE} 货位状态={locinfo.S_LOCK_STATE}");
|
//查找该托盘位置
|
if (locinfo.N_SIDE == 1 && (locinfo.S_LOCK_STATE == "无" || locinfo.S_LOCK_STATE == "锁定"))
|
{
|
//直接生成任务 查询终点接驳位 接驳位信息(未定)
|
if (WMSHelper.DuiDuoBool(locinfo.N_ROADWAY))
|
{
|
if (string.IsNullOrEmpty(it.ENDBIT))
|
{
|
startbit = locinfo;
|
endbit = WMSHelper.GetConnectBit(ref endarea, locinfo.N_ROADWAY);
|
traycode = it.TRAYCODE;
|
tasktype = "出库";
|
}
|
else
|
{
|
startbit = locinfo;
|
endbit = db.Queryable<Location>().Where(a => a.S_CODE == it.ENDBIT).First();
|
traycode = it.TRAYCODE;
|
tasktype = "出库";
|
endarea = "接驳位";
|
}
|
}
|
else
|
{
|
LogHelper.Info($"出库任务 托盘{it.TRAYCODE} 所在巷道{locinfo.N_ROADWAY} 对应堆垛机不可用");
|
}
|
|
}
|
else if (locinfo.N_SIDE == 2 && locinfo.S_LOCK_STATE == "无")
|
{
|
var nextloc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == locinfo.S_AREA_CODE && a.N_ROW == locinfo.N_ROW && a.N_COL == locinfo.N_COL && a.N_LAYER == locinfo.N_LAYER && a.N_SIDE == 1).Includes(a => a.LocCntrRel).First();
|
if (nextloc != null)
|
{
|
if (nextloc.N_CURRENT_NUM == 0 && nextloc.S_LOCK_STATE == "无")
|
{
|
if (WMSHelper.DuiDuoBool(locinfo.N_ROADWAY))
|
{
|
//直接生成任务 查询终点接驳位 接驳位信息(未定)
|
if (string.IsNullOrEmpty(it.ENDBIT))
|
{
|
startbit = locinfo;
|
endbit = WMSHelper.GetConnectBit(ref endarea, locinfo.N_ROADWAY);
|
traycode = it.TRAYCODE;
|
tasktype = "出库";
|
}
|
else
|
{
|
startbit = locinfo;
|
endbit = db.Queryable<Location>().Where(a => a.S_CODE == it.ENDBIT).First();
|
traycode = it.TRAYCODE;
|
tasktype = "出库";
|
endarea = "接驳位";
|
}
|
}
|
else
|
{
|
LogHelper.Info($"出库任务 托盘{it.TRAYCODE} 所在巷道{locinfo.N_ROADWAY} 对应堆垛机不可用");
|
}
|
}
|
else if (nextloc.N_CURRENT_NUM == 1 && nextloc.S_LOCK_STATE == "无")
|
{
|
traycode = nextloc.LocCntrRel.S_CNTR_CODE;
|
var OutInfo = db.Queryable<OutTask>().Where(a => a.TRAYCODE == traycode).First();
|
if (OutInfo == null)
|
{
|
if (WMSHelper.DuiDuoBool(locinfo.N_ROADWAY))
|
{
|
startbit = nextloc;
|
sysNo = nextloc.LocCntrRel.S_SRC_SYS;
|
//生成移动任务
|
endbit = WMSHelper.YiDong(nextloc);
|
tasktype = "移动";
|
}
|
else
|
{
|
LogHelper.Info($"出库任务 托盘{it.TRAYCODE} 所在巷道{locinfo.N_ROADWAY} 对应堆垛机不可用");
|
}
|
}
|
else
|
{
|
LogHelper.Info($"双深位外侧货位{nextloc.S_CODE} 在出库单中 等待出库 无需移库");
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info($"站点异常 找不到站点{locinfo.S_CODE} 的相邻货位信息", "出库");
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info($"托盘{it.TRAYCODE}不在库内", "出库");
|
}
|
if (startbit != null && endbit != null)
|
{
|
string sourNo = "";
|
string StartBit = "";
|
string traytype = "";
|
int pri = 0;
|
string islong = "";
|
string endArea = "";
|
int isdouble = 0;
|
float length = 0;
|
var res = false;
|
if (EndAreaBool(endbit, tasktype))
|
{
|
//创建搬运任务 (设备到接驳位将触发二段任务 因此将托盘目的地存入容器表 待完整任务完成以后删除)
|
if (WCSHelper.JuXingTaskBool(traycode, tasktype, ref sourNo, ref traytype, ref pri, ref islong, ref sysNo, ref endArea, ref isdouble, ref length))
|
//if (TaskProcess.JuXingTaskBol(traycode, "出库", ref sourNo, ref StartBit))
|
{
|
if (!string.IsNullOrEmpty(sourNo) || tasktype == "移动")
|
{
|
//校验托盘是否在出库单中 防止时间差重复生成任务
|
var dbinfo = db.Queryable<OutTask>().Where(a => a.TRAYCODE == traycode).First();
|
if (dbinfo != null || tasktype == "移动")
|
{
|
if (tasktype == "出库")
|
{
|
res = WMSHelper.CreateWmsTask(sourNo, startbit, endbit, traycode, tasktype, 2, "WCS", 1, sysNo, traytype);
|
}
|
else
|
{
|
res = WMSHelper.CreateWmsTask(sourNo, startbit, endbit, traycode, tasktype, 2, "WCS", 1, sysNo, startbit.LocCntrRel.TRAYTYPE);
|
}
|
if (res && tasktype == "出库")
|
{
|
if (endarea != "接驳位")
|
{
|
LogHelper.Info($"插入容器表 托盘号{it.TRAYCODE}");
|
var containerinfo = db.Queryable<ContainerDest>().Where(k => k.S_CODE == it.TRAYCODE).First();
|
if (containerinfo == null)
|
{
|
//插入容器表
|
ContainerDest model = new ContainerDest
|
{
|
S_CODE = it.TRAYCODE,
|
S_DEST = endarea,
|
S_SRC = startbit.S_CODE
|
};
|
db.Insertable(model).ExecuteCommand();
|
}
|
else
|
{
|
containerinfo.S_DEST = endarea;
|
containerinfo.S_SRC = startbit.S_CODE;
|
db.Updateable(containerinfo).UpdateColumns(k => new { k.S_DEST, k.S_SRC }).ExecuteCommand();
|
}
|
|
}
|
//it.isTask = 1;
|
//db.Updateable(it).UpdateColumns(s => new { s.isTask }).ExecuteCommand();
|
}
|
}
|
else
|
{
|
LogHelper.Info($"出库任务生成前校验 托盘不在出库任务表中 防止重复生成");
|
}
|
}
|
else
|
{
|
LogHelper.Info($"巨星返回上游任务号有误");
|
}
|
}
|
}
|
else LogHelper.Info($"终点接驳位{endbit.S_CODE}管控 不允许出库");
|
}
|
}
|
//if (it.isTask == 0)
|
//{
|
|
//}
|
else LogHelper.Info($"托盘{it.TRAYCODE} 已分配任务 任务号{istask.S_CODE}");
|
}
|
}
|
else
|
{
|
//删除出库单记录
|
db.Deleteable(item).ExecuteCommand();
|
}
|
}
|
|
internal static void GridOut()
|
{
|
GridOutTask();
|
Thread.Sleep(500);
|
WorkOrderGridOutTask();
|
}
|
|
internal static void GridOutTask()
|
{
|
LogHelper.Info($"网架库 指引出库");
|
var db = new SqlHelper<object>().GetInstance();
|
var itemInfoList = new List<CntrItemRel>();
|
var YKloc = "";
|
Location startLoc = null;
|
Location endLoc = null;
|
var traycode = "";
|
try
|
{
|
var OutTasks = db.Queryable<GridstructureOutTask>().Where(a => string.IsNullOrEmpty(a.S_CNTR_CODE)).ToList();
|
LogHelper.Info($"网架库 指引出库 获取数据{OutTasks.Count}条");
|
foreach (var item in OutTasks)
|
{
|
LogHelper.Info($"网架库 指引出库 处理数据 终点{item.S_END_LOC} 长度{item.F_LENGTH} 托盘类型{item.S_TRAY_TYPE}");
|
if (item.S_TRAY_TYPE == "空托")
|
{
|
itemInfoList = db.Queryable<CntrItemRel>().Where(a => a.F_QTY == 0).ToList();
|
}
|
else
|
{
|
//不满
|
itemInfoList = db.Queryable<CntrItemRel>().Where(a => (a.F_QTY < (a.F_MAX_QTY - item.F_LENGTH) && a.F_QTY > 0)||a.F_QTY==0).OrderByDescending(a=>a.F_QTY).ToList();
|
}
|
|
LogHelper.Info($"网架库 指引出库 获取容器货品明细{itemInfoList.Count}条");
|
if (itemInfoList.Count > 0)
|
{
|
var cntrCodes = itemInfoList.Select(a => a.S_CNTR_CODE).Distinct().ToList();
|
var cntrInfos = db.Queryable<LocCntrRel>()
|
.Where(a => cntrCodes.Contains(a.S_CNTR_CODE))
|
.ToList()
|
.ToDictionary(a => a.S_CNTR_CODE);
|
|
var locCodes = cntrInfos.Values.Select(a => a.S_LOC_CODE).Distinct().ToList();
|
var locInfos = db.Queryable<Location>()
|
.Where(a => locCodes.Contains(a.S_CODE) && a.S_AREA_CODE == "ZG1")
|
.Includes(a => a.LocCntrRel)
|
.ToList()
|
.ToDictionary(a => a.S_CODE);
|
|
foreach (var it in itemInfoList)
|
{
|
if (cntrInfos.TryGetValue(it.S_CNTR_CODE, out var cntrInfo) && locInfos.TryGetValue(cntrInfo.S_LOC_CODE, out var locinfo))
|
{
|
LogHelper.Info($"网架库 指引出库 托盘{cntrInfo.S_CNTR_CODE} 符合要求 算取货位");
|
if (locinfo.N_SIDE == 1 && (locinfo.S_LOCK_STATE == "无" || locinfo.S_LOCK_STATE == "锁定"))
|
{
|
//直接生成任务 查询终点接驳位 接驳位信息(未定)
|
if (WMSHelper.DuiDuoBool(locinfo.N_ROADWAY))
|
{
|
traycode = it.S_CNTR_CODE;
|
startLoc = locinfo;
|
break;
|
}
|
else
|
{
|
LogHelper.Info($"出库任务 托盘{it.S_CNTR_CODE} 所在巷道{locinfo.N_ROADWAY} 对应堆垛机不可用");
|
}
|
|
}
|
else if (locinfo.N_SIDE == 2 && locinfo.S_LOCK_STATE == "无")
|
{
|
var nextloc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == locinfo.S_AREA_CODE && a.N_ROW == locinfo.N_ROW && a.N_COL == locinfo.N_COL && a.N_LAYER == locinfo.N_LAYER && a.N_SIDE == 1).Includes(a => a.LocCntrRel).First();
|
if (nextloc != null)
|
{
|
if (nextloc.N_CURRENT_NUM == 0 && nextloc.S_LOCK_STATE == "无")
|
{
|
if (WMSHelper.DuiDuoBool(locinfo.N_ROADWAY))
|
{
|
traycode = it.S_CNTR_CODE;
|
startLoc = locinfo;
|
break;
|
}
|
else
|
{
|
LogHelper.Info($"出库任务 托盘{it.S_CNTR_CODE} 所在巷道{locinfo.N_ROADWAY} 对应堆垛机不可用");
|
}
|
}
|
else if (nextloc.N_CURRENT_NUM == 1 && nextloc.S_LOCK_STATE == "无")
|
{
|
//能不移就不移 先记录托盘
|
traycode = nextloc.LocCntrRel.S_CNTR_CODE;
|
var OutInfo = db.Queryable<OutTask>().Where(a => a.TRAYCODE == traycode).First();
|
if (OutInfo == null)
|
{
|
if (WMSHelper.DuiDuoBool(locinfo.N_ROADWAY))
|
{
|
if (string.IsNullOrEmpty(YKloc))
|
{
|
YKloc = nextloc.S_CODE;
|
endLoc = WMSHelper.YiDong(nextloc);
|
}
|
}
|
else
|
{
|
LogHelper.Info($"出库任务 托盘{traycode} 所在巷道{locinfo.N_ROADWAY} 对应堆垛机不可用");
|
}
|
}
|
else
|
{
|
LogHelper.Info($"双深位外侧货位{nextloc.S_CODE} 在出库单中 等待出库 无需移库");
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info($"站点异常 找不到站点{locinfo.S_CODE} 的相邻货位信息", "出库");
|
}
|
}
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info("未找到符合条件的容器");
|
}
|
|
if (startLoc == null)
|
{
|
LogHelper.Info($"未查询到起点货位 检查是否有需要移库的货位");
|
if (!string.IsNullOrEmpty(YKloc))
|
{
|
startLoc = db.Queryable<Location>().Where(a => a.S_CODE == YKloc).Includes(a => a.LocCntrRel).First();
|
if (startLoc != null && endLoc != null)
|
{
|
//查看有没有需要移库的任务
|
var res = WMSHelper.CreateWmsTask("", startLoc, endLoc, traycode, "移动", 2, "WCS", 1, startLoc.LocCntrRel.S_SRC_SYS, startLoc.LocCntrRel.TRAYTYPE);
|
if (res)
|
{
|
item.S_CNTR_CODE = traycode;
|
db.Updateable(item).UpdateColumns(a => new { a.S_CNTR_CODE }).ExecuteCommand();
|
}
|
}
|
}
|
}
|
else
|
{
|
//创建出库任务
|
endLoc = db.Queryable<Location>().Where(a => a.S_CODE == item.S_END_LOC && a.N_LOCK_STATE == 0 && a.N_CURRENT_NUM == 0).First();
|
if (endLoc != null)
|
{
|
var res = WMSHelper.CreateWmsTask("", startLoc, endLoc, traycode, "指引出库", 2, "WCS", 1, startLoc.LocCntrRel.S_SRC_SYS, startLoc.LocCntrRel.TRAYTYPE);
|
if (res)
|
{
|
item.S_CNTR_CODE = traycode;
|
db.Updateable(item).UpdateColumns(a => new { a.S_CNTR_CODE }).ExecuteCommand();
|
}
|
}
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"网架库 计算长度出库异常 异常信息{ex.Message}", ex);
|
}
|
|
}
|
|
internal static void WorkOrderGridOutTask()
|
{
|
LogHelper.Info($"网架库空托出库 指引出库");
|
var db = new SqlHelper<object>().GetInstance();
|
var YKloc = "";
|
Location startLoc = null;
|
Location endLoc = null;
|
var traycode = "";
|
|
try
|
{
|
var OutTasks = db.Queryable<GridstructureOutTaskWorkOrder>().Where(a => a.S_STATE == "执行" && string.IsNullOrEmpty(a.S_CNTR_CODE)).ToList();
|
LogHelper.Info($"网架库空托出库 指引出库 获取数据{OutTasks.Count}条");
|
if (OutTasks.Count > 0)
|
{
|
var itemInfoList = db.Queryable<CntrItemRel>().Where(a => a.F_QTY == 0).ToList();
|
LogHelper.Info($"网架库空托出库 指引出库 获取容器货品明细{itemInfoList.Count}条");
|
foreach (var item in OutTasks)
|
{
|
if (item.N_SUM < item.N_MAX_SUM)
|
{
|
LogHelper.Info($"网架库空托出库 指引出库 处理数据 终点{item.S_END_LOC}");
|
if (itemInfoList.Count > 0)
|
{
|
var cntrCodes = itemInfoList.Select(a => a.S_CNTR_CODE).Distinct().ToList();
|
var cntrInfos = db.Queryable<LocCntrRel>()
|
.Where(a => cntrCodes.Contains(a.S_CNTR_CODE))
|
.ToList()
|
.ToDictionary(a => a.S_CNTR_CODE);
|
|
var locCodes = cntrInfos.Values.Select(a => a.S_LOC_CODE).Distinct().ToList();
|
var locInfos = db.Queryable<Location>()
|
.Where(a => locCodes.Contains(a.S_CODE) && a.S_AREA_CODE == "ZG1")
|
.Includes(a => a.LocCntrRel)
|
.ToList()
|
.ToDictionary(a => a.S_CODE);
|
|
foreach (var it in itemInfoList)
|
{
|
if (cntrInfos.TryGetValue(it.S_CNTR_CODE, out var cntrInfo) && locInfos.TryGetValue(cntrInfo.S_LOC_CODE, out var locinfo))
|
{
|
LogHelper.Info($"网架库 指引出库 托盘{cntrInfo.S_CNTR_CODE} 符合要求 算取货位");
|
if (locinfo.N_SIDE == 1 && (locinfo.S_LOCK_STATE == "无" || locinfo.S_LOCK_STATE == "锁定"))
|
{
|
//直接生成任务 查询终点接驳位 接驳位信息(未定)
|
if (WMSHelper.DuiDuoBool(locinfo.N_ROADWAY))
|
{
|
traycode = it.S_CNTR_CODE;
|
startLoc = locinfo;
|
break;
|
}
|
else
|
{
|
LogHelper.Info($"出库任务 托盘{it.S_CNTR_CODE} 所在巷道{locinfo.N_ROADWAY} 对应堆垛机不可用");
|
}
|
|
}
|
else if (locinfo.N_SIDE == 2 && locinfo.S_LOCK_STATE == "无")
|
{
|
var nextloc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == locinfo.S_AREA_CODE && a.N_ROW == locinfo.N_ROW && a.N_COL == locinfo.N_COL && a.N_LAYER == locinfo.N_LAYER && a.N_SIDE == 1).Includes(a => a.LocCntrRel).First();
|
if (nextloc != null)
|
{
|
if (nextloc.N_CURRENT_NUM == 0 && nextloc.S_LOCK_STATE == "无")
|
{
|
if (WMSHelper.DuiDuoBool(locinfo.N_ROADWAY))
|
{
|
traycode = it.S_CNTR_CODE;
|
startLoc = locinfo;
|
break;
|
}
|
else
|
{
|
LogHelper.Info($"出库任务 托盘{it.S_CNTR_CODE} 所在巷道{locinfo.N_ROADWAY} 对应堆垛机不可用");
|
}
|
}
|
else if (nextloc.N_CURRENT_NUM == 1 && nextloc.S_LOCK_STATE == "无")
|
{
|
//能不移就不移 先记录托盘
|
traycode = nextloc.LocCntrRel.S_CNTR_CODE;
|
var OutInfo = db.Queryable<OutTask>().Where(a => a.TRAYCODE == traycode).First();
|
if (OutInfo == null)
|
{
|
if (WMSHelper.DuiDuoBool(locinfo.N_ROADWAY))
|
{
|
if (string.IsNullOrEmpty(YKloc))
|
{
|
YKloc = nextloc.S_CODE;
|
endLoc = WMSHelper.YiDong(nextloc);
|
}
|
}
|
else
|
{
|
LogHelper.Info($"出库任务 托盘{traycode} 所在巷道{locinfo.N_ROADWAY} 对应堆垛机不可用");
|
}
|
}
|
else
|
{
|
LogHelper.Info($"双深位外侧货位{nextloc.S_CODE} 在出库单中 等待出库 无需移库");
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info($"站点异常 找不到站点{locinfo.S_CODE} 的相邻货位信息", "出库");
|
}
|
}
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info("未找到符合条件的容器");
|
}
|
|
if (startLoc == null)
|
{
|
LogHelper.Info($"未查询到起点货位 检查是否有需要移库的货位");
|
if (!string.IsNullOrEmpty(YKloc))
|
{
|
startLoc = db.Queryable<Location>().Where(a => a.S_CODE == YKloc).Includes(a => a.LocCntrRel).First();
|
if (startLoc != null && endLoc != null)
|
{
|
//查看有没有需要移库的任务
|
var res = WMSHelper.CreateWmsTask("", startLoc, endLoc, traycode, "移动", 2, "WCS", 1, startLoc.LocCntrRel.S_SRC_SYS, startLoc.LocCntrRel.TRAYTYPE);
|
if (res)
|
{
|
item.S_CNTR_CODE = traycode;
|
db.Updateable(item).UpdateColumns(a => new { a.S_CNTR_CODE }).ExecuteCommand();
|
}
|
}
|
}
|
}
|
else
|
{
|
//创建出库任务
|
endLoc = db.Queryable<Location>().Where(a => a.S_CODE == item.S_END_LOC && a.N_LOCK_STATE == 0 && a.N_CURRENT_NUM == 0).First();
|
if (endLoc != null)
|
{
|
var res = WMSHelper.CreateWmsTask("", startLoc, endLoc, traycode, "指引出库", 2, "WCS", 1, startLoc.LocCntrRel.S_SRC_SYS, startLoc.LocCntrRel.TRAYTYPE);
|
if (res)
|
{
|
item.S_CNTR_CODE = traycode;
|
db.Updateable(item).UpdateColumns(a => new { a.S_CNTR_CODE }).ExecuteCommand();
|
}
|
}
|
}
|
}
|
else
|
{
|
item.S_STATE = "完成";
|
db.Updateable(item).UpdateColumns(a => new { a.S_STATE }).ExecuteCommand();
|
}
|
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"网架库自动出空托流程异常 异常信息{ex.Message}", ex);
|
}
|
|
}
|
|
internal static void ErrorInTask()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
try
|
{
|
var InTasks = db.Queryable<InTasks>().ToList();
|
if (InTasks.Count > 0)
|
{
|
InTasks.ForEach(a =>
|
{
|
WMSHelper.GetSendcondTask(a.STARTBIT, a.TRAYCODE, a.ENDAREA, a.WORK, a.SOURNO);
|
});
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"agv重新生成入库任务异常 异常信息{ex.Message}", ex);
|
}
|
}
|
|
internal static void InTask()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
try
|
{
|
var startAreaList = db.Queryable<PeiZhi>().Where(a => a.OUTINTYPE == 1).PartitionBy(a => a.AREACODE).Take(1).ToList();
|
if (startAreaList.Count > 0)
|
{
|
LogHelper.Info($"agv自动转运入库流程 获取入库模式配置{startAreaList.Count}条");
|
startAreaList.ForEach(it =>
|
{
|
LogHelper.Info($"agv自动转运入库流程 检查起点库区{it.AREACODE}是否有可以转运的托盘");
|
var startArea = it.AREACODE;
|
var startAreaLock = db.Queryable<Location>().Where(a => a.S_AREA_CODE == startArea && a.S_LOCK_STATE != "无").First();
|
if (startAreaLock == null)
|
{
|
var startLocList = db.Queryable<Location>()
|
.Where(a => a.S_AREA_CODE == startArea && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE == "无")
|
.Includes(a => a.LocCntrRel)
|
.PartitionBy(a => a.N_ROW)
|
.OrderByDescending(a => a.N_COL)
|
.Take(1)
|
.ToList();
|
LogHelper.Info($"agv自动转运入库流程 获取起点库区{it.AREACODE}可搬运托盘数{startLocList.Count}");
|
foreach (var startLoc in startLocList)
|
{
|
if (startLoc.LocCntrRel != null && startLoc.LocCntrRel.S_CNTR_CODE.Substring(0, 2) == "TP")
|
{
|
var trayNo = startLoc.LocCntrRel.S_CNTR_CODE;
|
var startlock = db.Queryable<Location>().Where(a => a.S_AREA_CODE == startLoc.S_AREA_CODE && a.N_ROW == startLoc.N_ROW && a.S_LOCK_STATE != "无").First();
|
if (startlock == null)
|
{
|
var endbitlist = db.Queryable<PeiZhi>().Where(a => a.AREACODE.Contains(startLoc.S_AREA_CODE) && a.OUTINTYPE == 1).ToList();
|
if (endbitlist.Count > 0)
|
{
|
foreach (var item in endbitlist)
|
{
|
var endbit = db.Queryable<Location>().Where(a => a.S_CODE == item.BITCODE).First();
|
if (endbit != null)
|
{
|
if (ApiHelper.StartAreaBool(endbit.S_CODE))
|
{
|
//创建任务
|
var res = WMSHelper.CreateWmsTask("", startLoc, endbit, trayNo, "AGV入库", 1, "AGV");
|
break;
|
}
|
else
|
{
|
LogHelper.Info($"InWorkArea 终点{endbit.S_CODE} 不允许入库");
|
}
|
}
|
}
|
}
|
else
|
{
|
LogHelper.Info($"接驳位配置信息异常 无法找到起点库区{startLoc.S_AREA_CODE}对应接驳位");
|
}
|
break;
|
}
|
else
|
{
|
LogHelper.Info($"agv自动转运入库流程 货位{startLoc.S_CODE}当前排有货位锁定 无法出库");
|
}
|
}
|
else
|
{
|
LogHelper.Info($"货位{startLoc.S_CODE} 绑定托盘异常 无法转运");
|
}
|
}
|
}
|
});
|
}
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"agv入库流程异常 异常信息{ex.Message}", ex);
|
}
|
}
|
|
internal static void ErrorTask()
|
{
|
try
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var tasks = db.Queryable<ErrorTask>().ToList().OrderBy(a => a.CREATTIME).ToList();
|
LogHelper.Info($"获取到数据条数{tasks.Count}");
|
tasks.ForEach(a =>
|
{
|
var task = WCSHelper.GetTask(a.TASKNO);
|
if (task != null)
|
{
|
var bol = TaskProcess.ThirdReportStatus(task.S_OP_CODE, "", a.STATE, "", task, a.BOL);
|
if (bol)
|
{
|
//删除记录
|
//db.Deleteable(a).ExecuteCommand();
|
db.Deleteable<ErrorTask>().Where(it => it.TASKNO == a.TASKNO && it.STATE == a.STATE).ExecuteCommand();
|
}
|
}
|
});
|
}
|
catch (Exception ex)
|
{
|
LogHelper.Error($"任务自动回报异常 异常信息={ex.Message}", ex);
|
}
|
|
}
|
|
private static bool EndAreaBool(Location endbit, string tasktype)
|
{
|
var result = true;
|
var db = new SqlHelper<object>().GetInstance();
|
var type = db.Queryable<InOutType>().Where(a => a.LOCATION == endbit.S_CODE).First();
|
if (type != null)
|
{
|
if (type.TYPE != tasktype && type.TYPE.Trim() != "空" && tasktype != "移动")
|
{
|
result = false;
|
}
|
}
|
|
|
return result;
|
}
|
#endregion
|
|
|
}
|
}
|