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 { /// /// 遍历定版的发货单,生产分拣单主表和子表(也可以手动调接口触发) /// internal static void CheckShippingOrder() { //1.0、获取已经定版的发货单,生产分拣单子表和主表,设置【发货单】的业务状态 N_B_STATE = 1(待分拣) //2.0、如果发货单C_AUTO_SORTING=Y,则自动将分拣单状态设置为开始配货 } /// /// 开始配货创建分拣单明细(改成调接口触发) /// 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(); } /// /// 遍历分拣单明细创建出库作业 /// 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().GetInstance(); // try // { // var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "送检入库区").FirstOrDefault(); // var reservoirs2 = Settings.ReservoirAreas.Where(s => s.areaName == "立库入库区").FirstOrDefault(); // //三表联查查出托盘满的 按创建时间顺序 // var locCntrs = db.Queryable().LeftJoin((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() // .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().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().GetInstance(); // var isusinglist = db.Queryable().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().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().GetInstance(); // var isusinglist = db.Queryable().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(). // 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().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().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().GetInstance(); // try // { // //查自动补托表 // var autoLists = db.Queryable().ToList(); // foreach (var autolist in autoLists) // { // //找起点 // var priorityLoc = Settings.PriorityLocs.Where(s => s.Name == autolist.S_LOC_CODE).FirstOrDefault(); // var startLoc = db.Queryable() // .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() // .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().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() // .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().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; // } //} ///// ///// 大件区到区 呼叫空箱 ///// ///// ///// //public static void bigMateriala2a() //{ // var db = new SqlHelper().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().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; // } //} /// /// 应急空料架上线_AMR /// /// public static void EmergencyEmptyMaterial() { var db = new SqlHelper().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().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; } } } }