using HH.WCS.XiaoMi.api;
|
using HH.WCS.XiaoMi.device;
|
using HH.WCS.XiaoMi.process;
|
using HH.WCS.XiaoMi.util;
|
using HH.WCS.XiaoMi.wms;
|
using Newtonsoft.Json;
|
using NLog.Fluent;
|
using Opc.Ua;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Reflection;
|
using System.Reflection.Emit;
|
using System.Text;
|
using System.Threading.Tasks;
|
using static HH.WCS.XiaoMi.device.S7Helper;
|
|
namespace HH.WCS.XiaoMi.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 CheckSortingTask()
|
{
|
//new SortingOrder().N_B_STATE
|
//遍历N_B_STATE = 3的分拣单创建作业
|
//或 遍历分拣单明细创建分拣作业,因为一个分拣单里面的明细都是批量生成的
|
var list = WMSHelper.GetWaitingSortingOperationList();
|
if (list.Count > 0)
|
{
|
list.ForEach(a =>
|
{
|
if (a.Details != null)
|
{
|
WMSHelper.CreateSortingOperation(a);
|
}
|
});
|
}
|
|
|
}
|
|
////监测摄像头处货位(送检入库区)空满状态 满的就叉到立库
|
//public static void MonitorFullStatus()
|
//{
|
// //bool result = false;
|
// //找送检入库区满托盘的货位
|
// var db = new SqlHelper<object>().GetInstance();
|
// try
|
// {
|
// var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "送检入库区").FirstOrDefault();
|
// var reservoirs2 = Settings.ReservoirAreas.Where(s => s.areaName == "立库入库区").FirstOrDefault();
|
// //三表联查查出托盘满的 按创建时间顺序
|
// var locCntrs = db.Queryable<LocCntrRel>().LeftJoin<Container>((p, c) => p.S_CNTR_CODE == c.S_CODE)
|
// .Where((p, c) => c.C_FULL == "2")
|
// .OrderBy((p, c) => p.T_CREATE)
|
// .Select((p, c) => p.S_LOC_CODE) // 选择托盘物料表的数据
|
// .ToList();
|
|
// //找送检入库区内托盘满了的货位
|
// var locList = db.Queryable<Location>()
|
// .Where(p => p.S_AREA_CODE == reservoirs.areaCode && p.N_LOCK_STATE == 0 && p.C_ENABLE == "Y")
|
// .Where(s => locCntrs.Contains(s.S_CODE.Trim()))
|
// .ToList();
|
|
// if (locList.Any())
|
// {
|
// LogHelper.Info($"任务摄像头监测空满状态找到货位{JsonConvert.SerializeObject(locList)}");
|
// //建任务
|
// var startLoc = locList.FirstOrDefault();
|
// var endLoc = TaskProcess.InWorkTransport(reservoirs2.areaCode);
|
// LogHelper.Info($"任务摄像头监测找到终点货位:{JsonConvert.SerializeObject(endLoc)}");
|
// if (endLoc != null)
|
// {
|
// var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
|
// LogHelper.Info($"任务摄像头监测找到托盘:{JsonConvert.SerializeObject(locCntrRel)}");
|
|
// TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "摄像头监测", locCntrRel.S_CNTR_CODE, 1, 1);
|
|
// }
|
|
// }
|
// }
|
// catch (Exception ex)
|
// {
|
// Console.WriteLine("MonitorFullStatus:" + ex.Message + ex.StackTrace);
|
// LogHelper.Error("MonitorFullStatus:" + ex.Message, ex);
|
// throw;
|
// }
|
|
|
// //return result;
|
|
|
//}
|
////常规送检空了自动从送检缓存区取一个送过去
|
//public static void AutoReplenish()
|
//{
|
// var db = new SqlHelper<object>().GetInstance();
|
// var isusinglist = db.Queryable<Isusing>().Where(a => a.S_TYPE == "自动补货").First();
|
// if (isusinglist.S_STATUS == 0)
|
// {
|
// return;
|
// }
|
// try
|
// {
|
// var cgreservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "常规送检区").FirstOrDefault();
|
// //找到常规送检区没有锁且空着的货位
|
// var endloc = TaskProcess.InWorkTransport(cgreservoirs.areaCode);
|
// if (endloc != null)
|
// {
|
// var hcreservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "送检缓存区").FirstOrDefault();
|
// //找送检缓存区有货的货位
|
// var startloc = TaskProcess.OutWorkTransport(hcreservoirs.areaCode);
|
// //LogHelper.Info($"AutoReplenish 自动补货 起点货位{JsonConvert.SerializeObject(startloc)}");
|
// if (startloc != null)
|
// {
|
// //创建送检任务
|
// var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startloc.S_CODE).First();
|
// LogHelper.Info($"创建任务 起点:{startloc.S_CODE}终点:{endloc.S_CODE}", "自动补货");
|
// var res = TaskProcess.CreateTransport(startloc.S_CODE, endloc.S_CODE, "自动补货", locCntrRel.S_CNTR_CODE, 1, 1);
|
// if (!res)
|
// {
|
// LogHelper.Info($"任务 起点:{startloc.S_CODE}终点:{endloc.S_CODE}创建失败", "自动补货");
|
// }
|
// }
|
|
// }
|
// }
|
// catch (Exception ex)
|
// {
|
// Console.WriteLine("AutoReplenish:" + ex.Message + ex.StackTrace);
|
// LogHelper.Error("AutoReplenish:" + ex.Message, ex);
|
// throw;
|
// }
|
|
//}
|
////空托缓存区有绑定的托盘就送到拆托机
|
//public static void AutoSendMachine()
|
//{
|
// var db = new SqlHelper<object>().GetInstance();
|
// var isusinglist = db.Queryable<Isusing>().Where(a => a.S_TYPE == "自动送托").First();
|
// if (isusinglist.S_STATUS == 0)
|
// {
|
// return;
|
// }
|
// try
|
// {
|
// var reservoirs1 = Settings.ReservoirAreas.Where(s => s.areaName == "3min空托区").FirstOrDefault();
|
// var reservoirs2 = Settings.ReservoirAreas.Where(s => s.areaName == "6min空托区").FirstOrDefault();
|
// var linePlcInfo1 = Settings.linePlcInfos.Where(s => s.deviceNo == "1").FirstOrDefault();
|
// var linePlcInfo2 = Settings.linePlcInfos.Where(s => s.deviceNo == "2").FirstOrDefault();
|
|
// //查询每排最后一列有托盘的货位 根据行分区 再找每一行的最后一列有货的货位
|
// var list = db.Queryable<Location>().
|
// Where(a => a.N_CURRENT_NUM > 0).Where(a => a.S_AREA_CODE.Trim() == reservoirs1.areaCode || a.S_AREA_CODE.Trim() == reservoirs2.areaCode)
|
// .PartitionBy(a => a.N_ROW)
|
// .OrderByDescending(a => a.N_COL).Take(1).ToList();
|
// if (list.Count > 0)
|
// {
|
// for (int i = 0; i < list.Count; i++)
|
// {
|
// //var loc = list[i];
|
// //判断送往3寸还是6寸拆托机
|
// string endLoc = null;
|
// string dev = null;
|
// if (list[i].S_AREA_CODE == reservoirs1.areaCode)
|
// {
|
// endLoc = linePlcInfo1.inLoca;
|
// dev = "1";
|
// }
|
// else if (list[i].S_AREA_CODE == reservoirs2.areaCode)
|
// {
|
// endLoc = linePlcInfo2.inLoca;
|
// dev = "2";
|
// }
|
// var endLocation = db.Queryable<Location>().Where(s => s.S_CODE == endLoc).First();
|
// if (endLocation == null || endLocation.N_LOCK_STATE != 0 || endLocation.C_ENABLE != "Y")
|
// {
|
// //LogHelper.Info($"拆托机货位{endLoc}不存在或已被锁");
|
// return;
|
// }
|
// //校验是否允许放货
|
// var plcDeviceTable = S7Helper.plcDeviceTables;
|
// LogHelper.Info($"自动送托 拆托机{dev}:{plcDeviceTable.requestPut1}");
|
// if ((plcDeviceTable.requestPut1 && dev == "1") ||
|
// (plcDeviceTable.requestPut2 && dev == "2"))
|
// {
|
// var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == list[i].S_CODE).First();
|
|
// LogHelper.Info($"创建任务 起点:{list[i].S_CODE}终点:{endLoc}");
|
// var res = TaskProcess.CreateTransport(list[i].S_CODE, endLoc, "送托", locCntrRel.S_CNTR_CODE, 1, 1);
|
// if (res)
|
// {
|
// LogHelper.Info($"起点:{list[i].S_CODE}终点:{endLoc}任务创建成功");
|
// }
|
// else
|
// {
|
// LogHelper.Info($"起点:{list[i].S_CODE}终点:{endLoc}任务创建失败");
|
// }
|
// }
|
// else
|
// {
|
// LogHelper.Info($"拆托机{endLoc}不允许放框");
|
// }
|
// }
|
// }
|
// }
|
// catch (Exception ex)
|
// {
|
// Console.WriteLine("AutoReplenish:" + ex.Message + ex.StackTrace);
|
// LogHelper.Error("AutoReplenish:" + ex.Message, ex);
|
// throw;
|
// }
|
|
|
|
//}
|
////产线自动补空托
|
//public static void AutoRepairEmptyTray()
|
//{
|
// var db = new SqlHelper<object>().GetInstance();
|
// try
|
// {
|
// //查自动补托表
|
// var autoLists = db.Queryable<AutoRepairEmptyTray>().ToList();
|
// foreach (var autolist in autoLists)
|
// {
|
// //找起点
|
// var priorityLoc = Settings.PriorityLocs.Where(s => s.Name == autolist.S_LOC_CODE).FirstOrDefault();
|
// var startLoc = db.Queryable<Location>()
|
// .Where(s => s.S_CODE == priorityLoc.Location).First();
|
// if (startLoc != null && startLoc.N_LOCK_STATE == 0 && startLoc.C_ENABLE == "Y")
|
// {
|
// var plcDeviceTable = S7Helper.plcDeviceTables;
|
// //找终点
|
// if (autolist.S_TYPE == "三寸")
|
// {
|
// var linePlcInfo = Settings.linePlcInfos.Where(s => s.deviceNo == "1").FirstOrDefault();
|
// //校验是否允许放货
|
// var endLoc = db.Queryable<Location>()
|
// .Where(s => s.S_CODE == linePlcInfo.outLoca).First();
|
// if (endLoc != null && endLoc.N_LOCK_STATE == 0 && endLoc.C_ENABLE == "Y")
|
// {
|
// if (plcDeviceTable.requestTake1)
|
// {
|
// var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
|
|
// LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}");
|
// var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "送托", locCntrRel.S_CNTR_CODE, 1, 1);
|
// if (res)
|
// {
|
// LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建成功");
|
// }
|
// else
|
// {
|
// LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建失败");
|
// }
|
// }
|
// }
|
// }
|
// else if (autolist.S_TYPE == "六寸")
|
// {
|
// var linePlcInfo = Settings.linePlcInfos.Where(s => s.deviceNo == "2").FirstOrDefault();
|
// //校验是否允许放货
|
// var endLoc = db.Queryable<Location>()
|
// .Where(s => s.S_CODE == linePlcInfo.outLoca).First();
|
// if (endLoc != null && endLoc.N_LOCK_STATE == 0 && endLoc.C_ENABLE == "Y")
|
// {
|
// if (plcDeviceTable.requestTake2)
|
// {
|
// var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
|
|
// LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}");
|
// var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "送托", locCntrRel.S_CNTR_CODE, 1, 1);
|
// if (res)
|
// {
|
// LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建成功");
|
// }
|
// else
|
// {
|
// LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建失败");
|
// }
|
// }
|
// }
|
// }
|
// }
|
// }
|
// }
|
// catch (Exception ex)
|
// {
|
// Console.WriteLine("AutoRepairEmptyTray:" + ex.Message + ex.StackTrace);
|
// LogHelper.Error("AutoRepairEmptyTray:" + ex.Message, ex);
|
// throw;
|
// }
|
|
|
|
//}
|
|
|
///// <summary>
|
///// 大件区到区 呼叫空箱
|
///// </summary>
|
///// <param name="model"></param>
|
///// <returns></returns>
|
//public static void bigMateriala2a()
|
//{
|
// var db = new SqlHelper<Location>().GetInstance();
|
// try
|
// {
|
// var startLoc = new Location();
|
// var endLoc = new Location();
|
// var endReservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "").FirstOrDefault();
|
// endLoc =TaskProcess.InWorkTransport(endReservoirs.areaCode);
|
// if (endLoc != null)
|
// {
|
// var startReservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "").FirstOrDefault();
|
// startLoc = TaskProcess.OutWorkTransport(startReservoirs.areaCode);
|
// var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
|
// //创建任务
|
// LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", "自动补空箱");
|
// var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "自动补空箱", locCntrRel.S_CNTR_CODE, 1, 1);
|
// if (res)
|
// {
|
// LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建成功");
|
// }
|
// else
|
// {
|
// LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建失败");
|
// }
|
// }
|
|
|
// }
|
// catch (Exception ex)
|
// {
|
// Console.WriteLine("bigMateriala2a:" + ex.Message + ex.StackTrace);
|
// LogHelper.Error("bigMateriala2a:" + ex.Message, ex);
|
// throw;
|
// }
|
|
//}
|
|
|
/// <summary>
|
/// 应急空料架上线_AMR
|
/// </summary>
|
/// <returns></returns>
|
public static void EmergencyEmptyMaterial()
|
{
|
var db = new SqlHelper<Location>().GetInstance();
|
try
|
{
|
var startLoc = new Location();
|
var endLoc = new Location();
|
var endReservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "应急空料架缓存区域").FirstOrDefault();
|
endLoc = TaskProcess.InWorkTransport(endReservoirs.areaCode);
|
if (endLoc != null)
|
{
|
var startReservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "空料架区").FirstOrDefault();
|
startLoc = TaskProcess.OutWorkTransport(startReservoirs.areaCode);
|
if (startLoc!=null)
|
{
|
var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
|
//创建任务
|
LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", "应急空料架上线_AMR");
|
var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "应急空料架上线_AMR", locCntrRel.S_CNTR_CODE, 1, 1);
|
if (res)
|
{
|
LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建成功");
|
}
|
else
|
{
|
LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建失败");
|
}
|
}
|
|
|
}
|
|
|
}
|
catch (Exception ex)
|
{
|
Console.WriteLine("EmergencyEmptyMaterial:" + ex.Message + ex.StackTrace);
|
LogHelper.Error("EmergencyEmptyMaterial:" + ex.Message, ex);
|
throw;
|
}
|
|
}
|
|
|
|
|
}
|
}
|