|
|
@@ -0,0 +1,276 @@
|
|
|
+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<StationDeviceGroup>
|
|
|
+ {
|
|
|
+ protected override bool SelectDevice(WCS_DEVICE dev)
|
|
|
+ {
|
|
|
+ return dev.CODE is "G3052";
|
|
|
+ }
|
|
|
+
|
|
|
+ protected override void Do(StationDeviceGroup obj)
|
|
|
+ {
|
|
|
+ var timer = new Stopwatch();
|
|
|
+ timer.Start();
|
|
|
+ obj.EX(obj =>
|
|
|
+ {
|
|
|
+ //if (!obj.BcrStationIsForbid()) return;
|
|
|
+
|
|
|
+ //设备组无论单卷还是双卷都必须满足的条件
|
|
|
+ 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($"设备运行中");
|
|
|
+
|
|
|
+ //成功创建的任务
|
|
|
+ var finishTaskList = new List<FinishTaskList<int>>();
|
|
|
+ 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未返回结果");
|
|
|
+ //创建对应的任务
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ 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<WCS_TASK>().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;
|
|
|
+ task.FLOOR = 1;
|
|
|
+
|
|
|
+ db.Default.Set<WCS_TASK>().Add(task);
|
|
|
+ finishTaskList.Add(new FinishTaskList<int>(task.WMSTASK, item.Station));
|
|
|
+ }
|
|
|
+ //两个任务一起创建
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ });
|
|
|
+
|
|
|
+ //检查对应的任务是否已创建成功
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ foreach (var finishTask in finishTaskList)
|
|
|
+ {
|
|
|
+ var task = db.Default.Set<WCS_TASK>().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++;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (finishTaskList.Any())
|
|
|
+ {
|
|
|
+ timer.Stop();
|
|
|
+ InfoLog.INFO_TIMING($"{obj.Entity.CODE}--扫码入库,耗时{timer.ElapsedMilliseconds}");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 涂布入库AGV交互
|
|
|
+ /// </summary>
|
|
|
+ //[WorkTitle(typeof(ProductHandler), "连廊入库AGV交互")]
|
|
|
+ //public class 连廊入库agv交互 : Work<StationDeviceGroup>
|
|
|
+ //{
|
|
|
+ // protected override void Do(StationDeviceGroup obj)
|
|
|
+ // {
|
|
|
+ // obj.EX(stationDeviceGroup =>
|
|
|
+ // {
|
|
|
+ // var station = stationDeviceGroup.Entity.CODE;
|
|
|
+
|
|
|
+ // #region 处理新增AGV任务
|
|
|
+
|
|
|
+ // DB.Do(db =>
|
|
|
+ // {
|
|
|
+ // //找到所有的AGV任务
|
|
|
+ // var agvTasks = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库)
|
|
|
+ // .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.执行, "确认执行");
|
|
|
+ // }
|
|
|
+ // //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<WCS_AGVTask>().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.执行, "分配放货点");
|
|
|
+ // }
|
|
|
+ // else if (tasking.Status < tasking.AGVStatus)
|
|
|
+ // {
|
|
|
+ // if (tasking.Station != stationDeviceGroup.Entity.CODE)
|
|
|
+ // {
|
|
|
+ // InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}不是当前站台的AGV任务");
|
|
|
+ // continue;
|
|
|
+ // }
|
|
|
+ // if (tasking.AGVStatus == AGVTaskStatus.请求_允许)
|
|
|
+ // {
|
|
|
+ // 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<WCS_AGVTask>().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.完成))
|
|
|
+ // {
|
|
|
+ // tasking.Status = tasking.AGVStatus;
|
|
|
+ // tasking.UpdateTime = DateTime.Now;
|
|
|
+ // db.Default.SaveChanges();
|
|
|
+ // var devise = Device.Find(tasking.Station).Create<StationDeviceGroup>();
|
|
|
+ // foreach (var dev in devise.Items)
|
|
|
+ // {
|
|
|
+ // dev.Data.Goodscode = tasking.ID;
|
|
|
+ // }
|
|
|
+ // 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";
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+}
|