using DBHelper; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol; using WCS.Entity.Protocol.SRM; using WCS.Service.Extensions; using WCS.Service.Helpers; using WCS.Service.Log; using TaskStatus = WCS.Entity.TaskStatus; namespace WCS.Service.Works.Station { [WorkTitle(typeof(ProductHandler), "连廊车间扫码入库")] internal class 连廊车间扫码入库 : Work { protected override bool SelectDevice(WCS_DEVICE dev) { return dev.CODE is "G3052" or "G3003"; } protected override void Do(StationDeviceGroup obj) { var timer = new Stopwatch(); timer.Start(); obj.EX(obj => { //if (!obj.BcrStationIsForbid()) return; if (!SystemConfigHelpers.GetDeviceConfig(obj.Entity.CODE)) throw new WarnException($"已禁止{obj.Entity.CODE}入库,请联系相关人员查询"); //设备组无论单卷还是双卷都必须满足的条件 if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致"); if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中"); if (!obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) return; //成功创建的任务 var finishTaskList = new List>(); var devs = obj.GetBcrValid(); if (!devs.Valid(obj.Entity.CODE)) return; var infos = devs.GetWMSInTask(); if (!infos.Any()) throw new WarnException($"{obj.Entity.CODE}: WMS未返回结果"); WCS_AGVTask agvTask = null; //创建对应的任务 DB.Do(db => { if (obj.Entity.CODE == "G3052" && !obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.手动入库))) { agvTask = db.Default.Set().FirstOrDefault(v => v.Status == AGVTaskStatus.完成 && (v.Station == "G3052" || v.Station == "3054")) ?? throw new WarnException("无完成AGV任务"); if (agvTask.Status != AGVTaskStatus.完成扫码) { agvTask.Status = AGVTaskStatus.完成扫码; agvTask.UpdateTime = DateTime.Now; } } foreach (var item in devs) { var dev = item.Station; var next = dev.Entity.GetPath("SRM").CODE; var info = infos.FirstOrDefault(v => item.FinishCode.Contains(v.ContainerCode + "}")); if (db.Default.Set().AsNoTracking().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库)) throw new WarnException($"生产条码{info.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用"); var task = new WCS_TASK(); task.BARCODE = info.ContainerCode; task.TYPE = TaskType.入库; task.STATUS = TaskStatus.执行中; task.ADDRFROM = dev.Entity.CODE; task.ADDRTO = info.EndPostion; task.STARTTIME = DateTime.Now; task.UPDATEUSER = "WCS"; task.UPDATETIME = DateTime.Now; task.WMSTASK = int.Parse(info.WMSTaskNum); task.TaskGroupKey = info.TaskGroupKey; task.ADDRNEXT = next; task.HEIGHT = dev.Data2.GoodsSize; if (obj.Entity.CODE == "G3052" && !obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.手动入库))) { task.AgvTask = obj.Entity.CODE == "G3052" ? agvTask.ID : 0; } task.FLOOR = 1; db.Default.Set().Add(task); finishTaskList.Add(new FinishTaskList(task.WMSTASK, item.Station)); } //两个任务一起创建 db.Default.SaveChanges(); }); //检查对应的任务是否已创建成功 DB.Do(db => { foreach (var finishTask in finishTaskList) { var task = db.Default.Set().FirstOrDefault(v => v.WMSTASK == finishTask.FinishCode); if (task == null) continue; finishTask.Station.Data.Tasknum = task.ID; finishTask.Station.Data.Goodsstart = task.ADDRFROM.ToShort(); finishTask.Station.Data.Goodsend = task.ADDRNEXT.ToShort(); finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort(); finishTask.Station.Data.CmdType = IstationCmdType.扫码入库; finishTask.Station.Data.VoucherNo++; task.CreateStatusLog(db, $"任务已下发给输送机[{task.ADDRFROM}]执行,起始地址[{task.ADDRFROM}],目标地址[{task.ADDRNEXT}]", this.GetType()); } db.Default.SaveChanges(); }); if (finishTaskList.Any()) { timer.Stop(); InfoLog.INFO_TIMING($"{obj.Entity.CODE}--扫码入库,耗时{timer.ElapsedMilliseconds}"); } }); } } /// /// 24车间入库 /// [WorkTitle(typeof(ProductHandler), "连廊入库AGV交互")] public class 连廊入库agv交互 : Work { protected override void Do(StationDeviceGroup obj) { obj.EX(stationDeviceGroup => { var station = stationDeviceGroup.Entity.CODE; var isJudge = obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) || v.Data2.Tasknum>10000); #region 处理新增AGV任务 DB.Do(db => { //找到所有的AGV任务 var agvTasks = db.Default.Set().Where(v => v.TaskType == AGVTaskType.入库 && v.Workshop == 24) .Where(v => v.Status < AGVTaskStatus.完成).OrderByDescending(v => v.Status).ThenBy(v => v.CreateTime).ToArray(); foreach (var tasking in agvTasks) { var position = tasking.Position; if (!ProtocolProxy.AllDatas.ContainsKey(position)) ProtocolProxy.AllDatas[position] = new ProdLineData(); var pld = ProtocolProxy.AllDatas[position] as ProdLineData; pld!.Frame = LogicHandler.Frame; pld.Code = position; pld.TaskList.Add(tasking); if (tasking.Status == AGVTaskStatus.新建) { tasking.Status = AGVTaskStatus.执行; tasking.UpdateTime = DateTime.Now; db.Default.SaveChanges(); tasking.AGVStatusChange(AGVTaskStatus.执行, "确认执行"); } #region 111 //agv到达指定位置给确认后分配站台 //else if (tasking.Status == AGVTaskStatus.执行 && tasking.AGVStatus == AGVTaskStatus.确认 && string.IsNullOrEmpty(tasking.Station)) //{ // //判断提升机是否被禁用 // if (!stationDeviceGroup.BcrStationIsForbid()) continue; // if (stationDeviceGroup.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动))) // { // InfoLog.INFO_INFO($"{station}手动状态"); // continue; // } // //var qty = db.Default.Set().Where(v => v.TaskType == AGVTaskType.入库 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成); // //if (qty.Any(v => v.Station == stationDeviceGroup.Entity.CODE) || agvTasks.Any(v => v.Station == stationDeviceGroup.Entity.CODE)) // //{ // // InfoLog.INFO_WARN($"已有到达{stationDeviceGroup.Entity.CODE}放货任务,暂停AGV站台分配"); // // continue; // //} // tasking.Station = stationDeviceGroup.Entity.CODE; // tasking.Status = AGVTaskStatus.执行; // tasking.UpdateTime = DateTime.Now; // db.Default.SaveChanges(); // tasking.AGVStatusChange(AGVTaskStatus.执行, "分配放货点"); //} #endregion else if (tasking.Status < tasking.AGVStatus) { if (tasking.AGVStatus == AGVTaskStatus.请求_允许 && !isJudge) { if (stationDeviceGroup.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动))) { InfoLog.INFO_INFO("不在自动状态"); continue; } if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) { InfoLog.INFO_INFO("设备运行中"); continue; } if (stationDeviceGroup.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.高位))) { InfoLog.INFO_WarnDb("不在高位", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) { InfoLog.INFO_WarnDb("AGV请求放货,但有光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号))) { InfoLog.INFO_WarnDb("AGV放货完成信号未清除", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } if (stationDeviceGroup.Items.Any(v => v.Data2.Tasknum > 0)) { InfoLog.INFO_WarnDb("已有WCS任务号", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } if (db.Default.Set().Any(v => v.Station == tasking.Station && v.Status >= AGVTaskStatus.请求_允许 && v.Status < AGVTaskStatus.完成扫码 && v.ID != tasking.ID)) //只能允许一个 { InfoLog.INFO_WarnDb("上一个允许放货的AGV任务未完成", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } tasking.Status = tasking.AGVStatus; tasking.UpdateTime = DateTime.Now; db.Default.SaveChanges(); tasking.AGVStatusChange(tasking.AGVStatus, "允许放货"); } else if (tasking.AGVStatus == AGVTaskStatus.取放完成) { if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号))) { InfoLog.INFO_WarnDb("AGV放货完成信号未清楚", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } if (!stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) { InfoLog.INFO_WarnDb("放货完成无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } tasking.Status = tasking.AGVStatus; tasking.UpdateTime = DateTime.Now; db.Default.SaveChanges(); foreach (var dev in stationDeviceGroup.Items) { if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) { InfoLog.INFO_WarnDb($"AGV请求放货,但设备{dev.Entity.CODE}无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } dev.Data.Goodsnum = (short)tasking.Goodsnum; dev.Data.Istation521Status = IstationStatus.AGV放货完成信号; } tasking.AGVStatusChange(tasking.AGVStatus, "允许设备顶升下降"); } else if (Ltc.Do(tasking, v => v.AGVStatus == AGVTaskStatus.完成 && v.Status == AGVTaskStatus.取放完成)) { tasking.Status = tasking.AGVStatus; tasking.UpdateTime = DateTime.Now; db.Default.SaveChanges(); var devise = Device.Find("G3052").Create(); foreach (var dev in devise.Items) { dev.Data.Goodscode = tasking.ID; continue; } tasking.AGVStatusChange(tasking.AGVStatus, "完成任务"); } else if (Ltc.Do(tasking, v => v.AGVStatus == AGVTaskStatus.取消)) { tasking.Status = tasking.AGVStatus; tasking.UpdateTime = DateTime.Now; db.Default.SaveChanges(); tasking.AGVStatusChange(tasking.AGVStatus, "取消任务"); } } } }); #endregion 处理新增AGV任务 }); } protected override bool SelectDevice(WCS_DEVICE dev) { return dev.CODE is "G3052"; } } }