Ver Fonte

变更申请入库任务的逻辑

林豪 左 há 3 anos atrás
pai
commit
2866376e02

+ 14 - 18
Projects/永冠OPP/WCS.Entity.Protocol/Station/IStation520.cs

@@ -1,62 +1,58 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace WCS.Entity.Protocol
+namespace WCS.Entity.Protocol
 {
     /// <summary>
-    /// 
+    ///
     /// </summary>
     public interface IStation520 : IProtocol
     {
         /// <summary>
         ///  任务号
         /// </summary>
-         int Tasknum { get; set; }
+        int Tasknum { get; set; }
 
         /// <summary>
-        /// 货物数条码
+        /// 货物数条码 涂布入库口代表AGV任务
         /// </summary>
-         int Goodscode { get; set; }
+        int Goodscode { get; set; }
 
         /// <summary>
         /// 货物数量(1.两个位置放1个货物,2.两个位置放2个货物)
         /// </summary>
-         short Goodsnum { get; set; }
+        short Goodsnum { get; set; }
 
         /// <summary>
         /// 货物高度
         /// </summary>
-         short GoodsSize { get; set; }
+        short GoodsSize { get; set; }
 
         /// <summary>
         /// 起始地址
         /// </summary>
-         short Goodsstart { get; set; }
+        short Goodsstart { get; set; }
 
         /// <summary>
         /// 目标地址
         /// </summary>
-         short Goodsend { get; set; }
+        short Goodsend { get; set; }
 
         /// <summary>
         /// 请求
         /// </summary>
-         IstationRequest Request { get; set; }
+        IstationRequest Request { get; set; }
 
         /// <summary>
         /// 命令类型
         /// </summary>
-         IstationCmdType CmdType { get; set; }
+        IstationCmdType CmdType { get; set; }
 
         /// <summary>
         /// 凭证号 每次累加
         /// </summary>
-         short VoucherNo { get; set; }
+        short VoucherNo { get; set; }
 
         /// <summary>
         /// 输送机状态
         /// </summary>
-         IstationStatus Istation521Status { get; set; }
+        IstationStatus Istation521Status { get; set; }
     }
-}
+}

+ 2 - 2
Projects/永冠OPP/WCS.Service/WebApi/WMS/WMS.cs

@@ -21,7 +21,7 @@ namespace WCS.Service
         /// <param name="getTunnel"></param>
         /// <returns></returns>
         /// <exception cref="Exception"></exception>
-        public static I_WCS_GetInTaskResponseItem I_WCS_GetInTask(string barcode, string devCode, bool getTunnel = false)
+        public static List<I_WCS_GetInTaskResponseItem> I_WCS_GetInTask(string barcode, string devCode, bool getTunnel = false)
         {
             var res = APICaller.CallApi<I_WCS_GetInTaskResponse>(Url + "/api/Task/I_WCS_GetInTask", new List<I_WCS_GetInTaskRequest>()
             {
@@ -37,7 +37,7 @@ namespace WCS.Service
                 TaskException(devCode, res.ResMessage);
                 throw new WarnException(res.ResMessage);
             }
-            return res.TaskList.FirstOrDefault();
+            return res.TaskList;
         }
 
         /// <summary>

+ 20 - 2
Projects/永冠OPP/WCS.Service/Works/Station/一楼入库.cs

@@ -7,6 +7,7 @@ using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Entity.Protocol.SRM;
+using WCS.Service.Entity;
 using WCS.Service.Extensions;
 
 namespace WCS.Service.Works.Station
@@ -100,18 +101,35 @@ namespace WCS.Service.Works.Station
                 //创建对应的任务
                 DB.Do(db =>
                 {
+                    var devs = new List<Tuple<StationDevice, string>>();
+
+                    //获取需要执行的设备信息
                     foreach (var dev in obj.Items)
                     {
                         if (dev.Data2.Request != IstationRequest.扫码入库) continue; //没有请求
                         if (dev.Data2.Tasknum > 10000) continue; //没有任务号
-                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) continue;
+                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) continue; //没有光电
 
                         var bcr = dev.Entity.BCR();
                         var barcode = bcr.Content.Trim('\r');
                         if (barcode == "") continue; //扫码失败
+                        devs.Add(new Tuple<StationDevice, string>(dev.Entity.Create<StationDevice>(), barcode));
+                    }
+
+                    if (!devs.Any()) return;
+                    var items = devs.ToArray();
+                    List<I_WCS_GetInTaskResponseItem> Infos = items.Length switch
+                    {
+                        1 => WMS.I_WCS_GetInTask(items[0].Item2, items[0].Item1.Entity.CODE),
+                        2 => WMS.I_WCS_GetInTask(items[0].Item2, items[0].Item1.Entity.CODE, items[1].Item2, items[1].Item1.Entity.CODE),
+                        _ => throw new WarnException($"一组任务数量最大为2,当前{items.Length}"),
+                    };
 
-                        var info = WMS.I_WCS_GetInTask(barcode, dev.Entity.CODE);
+                    foreach (var item in devs)
+                    {
+                        var dev = item.Item1;
                         var next = dev.Entity.CODE == "1028" ? "1030" : "1031";
+                        var info = Infos.FirstOrDefault(v => item.Item2.Contains(v.ContainerCode));
                         if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库)) continue;
 
                         var task = new WCS_TASK();

+ 84 - 46
Projects/永冠OPP/WCS.Service/Works/Station/涂布入库.cs

@@ -1,4 +1,5 @@
 using DBHelper;
+using Microsoft.EntityFrameworkCore;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -6,6 +7,7 @@ using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Entity.Protocol.SRM;
+using WCS.Service.Entity;
 using WCS.Service.Extensions;
 using WCS.Service.Handlers;
 
@@ -140,31 +142,47 @@ namespace WCS.Service.Works.Station
     /// 涂布扫码入库
     /// </summary>
     [WorkTitle(typeof(CoatingHandler), "涂布入库")]
-    public class 涂布扫码入库 : DeviceWork<StationDevice>
+    public class 涂布扫码入库 : Work<StationDeviceGroup>
     {
-        protected override void Do(StationDevice obj)
+        protected override void Do(StationDeviceGroup obj)
         {
-            obj.EX(dev =>
+            obj.EX(obj =>
             {
-                var code = dev.Entity.CODE;
-                if (dev.Data.VoucherNo != dev.Data2.VoucherNo)
-                    throw new WarnException($"等待任务[{dev.Data2.Tasknum}]执行--凭证号不一致[{dev.Data.VoucherNo}][{dev.Data2.VoucherNo}]");
-                if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电");
-                if (dev.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("设备运行中");
-                if (!dev.Data3.Status.HasFlag(StationStatus.低位)) throw new DoException("不在低位");
-                if (dev.Data2.Request != IstationRequest.扫码入库) throw new WarnException("有光电无请求");
-                if (dev.Data2.Tasknum > 10000) throw new WarnException("有光电有请求,但已生产任务");
-
-                var bcr = dev.Entity.BCR();
-                var barcode = bcr.Content.Trim('\r');
-                if (barcode == "") throw new WarnException("扫码失败");
-
-                var info = WMS.I_WCS_GetInTask(barcode, dev.Entity.CODE);
-                var next = dev.Entity.GetPath("SRM");
-                var station = Device.Where(v => v.DEVICEGROUP.Any(p => p.MEMBER.CODE == dev.Entity.CODE)).FirstOrDefault().Create<StationDeviceGroup>();
+                //设备组无论单卷还是双卷都必须满足的条件
+                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.Data3.Status.HasFlag(StationStatus.低位))) throw new DoException("不在低位");
+
+                //成功创建的任务
+                var finishTaskList = new List<Tuple<int, StationDevice>>();
+
+                //创建对应的任务
                 DB.Do(db =>
                 {
-                    var agvTask = db.Default.Set<WCS_AGVTask>().Where(v => v.ID == dev.Data.Goodscode).FirstOrDefault() ?? throw new WarnException("无完成AGV任务");
+                    var devs = new List<Tuple<StationDevice, string>>();
+
+                    //获取需要执行的设备信息
+                    foreach (var dev in obj.Items)
+                    {
+                        if (dev.Data2.Request != IstationRequest.扫码入库) continue; //没有请求
+                        if (dev.Data2.Tasknum > 10000) continue; //没有任务号
+                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) continue; //没有光电
+
+                        var bcr = dev.Entity.BCR();
+                        var barcode = bcr.Content.Trim('\r');
+                        if (barcode == "") continue; //扫码失败
+                        devs.Add(new Tuple<StationDevice, string>(dev.Entity.Create<StationDevice>(), barcode));
+                    }
+
+                    if (!devs.Any()) return;
+                    var items = devs.ToArray();
+                    List<I_WCS_GetInTaskResponseItem> Infos = items.Length switch
+                    {
+                        1 => WMS.I_WCS_GetInTask(items[0].Item2, items[0].Item1.Entity.CODE),
+                        2 => WMS.I_WCS_GetInTask(items[0].Item2, items[0].Item1.Entity.CODE, items[1].Item2, items[1].Item1.Entity.CODE),
+                        _ => throw new WarnException($"一组任务数量最大为2,当前{items.Length}"),
+                    };
+                    var agvTask = db.Default.Set<WCS_AGVTask>().Where(v => v.ID == items[0].Item1.Data.Goodscode).FirstOrDefault() ?? throw new WarnException("无完成AGV任务");
 
                     if (agvTask.Status != AGVTaskStatus.完成扫码)
                     {
@@ -172,40 +190,60 @@ namespace WCS.Service.Works.Station
                         agvTask.UpdateTime = DateTime.Now;
                     }
 
-                    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.CODE;
-                    task.HEIGHT = dev.Data2.GoodsSize;
-                    task.AgvTask = agvTask.ID;
-
-                    db.Default.Set<WCS_TASK>().Add(task);
+                    foreach (var item in devs)
+                    {
+                        var dev = item.Item1;
+                        var next = dev.Entity.GetPath("SRM");
+                        var info = Infos.FirstOrDefault(v => item.Item2.Contains(v.ContainerCode));
+                        if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库)) continue;
+
+                        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.CODE;
+                        task.HEIGHT = dev.Data2.GoodsSize;
+                        task.AgvTask = agvTask.ID;
+
+                        db.Default.Set<WCS_TASK>().Add(task);
+
+                        var msg = $"下达从{dev.Entity.CODE}移动至{next}的PLC指令。";
+                        msg += $"[{dev.Data.Tasknum}][{dev.Data.Goodsstart}][{dev.Data.Goodsend}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
+                        task.CreateStatusLog(db, msg, this.GetType());
+                    }
+                    //两个任务一起创建
                     db.Default.SaveChanges();
+                });
 
-                    dev.Data.Tasknum = task.ID;
-                    dev.Data.Goodsstart = task.ADDRFROM.ToShort();
-                    dev.Data.Goodsend = task.ADDRNEXT.ToShort();
-                    //dev.Data.Goodsnum = (short)agvTask.Goodsnum;
-                    dev.Data.CmdType = IstationCmdType.扫码入库;
-                    dev.Data.VoucherNo++;
-                    var msg = $"下达从{dev.Entity.CODE}移动至{next}的PLC指令。";
-                    msg += $"[{dev.Data.Tasknum}][{dev.Data.Goodsstart}][{dev.Data.Goodsend}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
-                    task.CreateStatusLog(db, msg, this.GetType());
+                //检查对应的任务是否已创建成功
+                DB.Do(db =>
+                {
+                    foreach (var finishTask in finishTaskList)
+                    {
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finishTask.Item1);
+                        if (task == null) continue;
+
+                        finishTask.Item2.Data.Tasknum = task.ID;
+                        finishTask.Item2.Data.Goodsstart = task.ADDRFROM.ToShort();
+                        finishTask.Item2.Data.Goodsend = task.ADDRNEXT.ToShort();
+                        finishTask.Item2.Data.CmdType = IstationCmdType.扫码入库;
+                        finishTask.Item2.Data.VoucherNo++;
+                    }
                 });
             });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.CODE == "1386" || dev.CODE == "1387" || dev.CODE == "1394" || dev.CODE == "1395";
+            return dev.CODE == "G1386" || dev.CODE == "G1394";
+            //return dev.CODE == "1386" || dev.CODE == "1387" || dev.CODE == "1394" || dev.CODE == "1395";
         }
     }