소스 검색

更改一楼入库生产任务的逻辑

林豪 左 3 년 전
부모
커밋
c726adbf53

+ 14 - 3
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -874,7 +874,14 @@ namespace WCS.Service.Extensions
             InfoLog.INFO_INFO($"[{Entity.CODE}]--{ex.Message}");
         }
 
-        public static void WarnExceptionEX(this WarnException ex, WCS_DEVICE Entity)
+        /// <summary>
+        /// 警报执行记录
+        /// </summary>
+        /// <param name="ex">警报信息</param>
+        /// <param name="Entity">发生设备</param>
+        /// <param name="reportMonitor">是否上报监控</param>
+        /// <exception cref="Exception"></exception>
+        public static void WarnExceptionEX(this WarnException ex, WCS_DEVICE Entity, bool reportMonitor = true)
         {
             InfoLog.INFO_WARN($"[{Entity.CODE}]--{ex.Message}");
             if (ex.Message.Contains("The database operation was expected")) return;
@@ -882,8 +889,12 @@ namespace WCS.Service.Extensions
             LogHelper.AddWCS_EXCEPTION(ex.Message, Entity.CODE, WCS_EXCEPTIONTYPE.无.ToString());
             //排除部分频繁触发的异常上报
             if (ex.Message.Contains("触发并发管控")) return;
-            Ltc.Log(ex.GetBaseException().Message);
-            throw new Exception($"[{Entity.CODE}]--{ex.Message}");
+
+            if (reportMonitor)
+            {
+                Ltc.Log(ex.GetBaseException().Message);
+                throw new Exception($"[{Entity.CODE}]--{ex.Message}");
+            }
         }
 
         public static void ExceptionEx(this Exception ex, WCS_DEVICE Entity)

+ 0 - 1
Projects/永冠OPP/WCS.Service/Extensions/WCS_TaskExtensions.cs

@@ -28,7 +28,6 @@ namespace WCS.Service.Extensions
                     msg = msg,
                 };
                 db.Default.Add(statusLog);
-                db.Default.SaveChanges();
             }
             catch (Exception e)
             {

+ 134 - 45
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;
@@ -10,63 +11,151 @@ using WCS.Service.Extensions;
 
 namespace WCS.Service.Works.Station
 {
+    //[WorkTitle(typeof(ProductHandler), "一楼入库扫码")]
+    //internal class 一楼入库 : DeviceWork<StationDevice>
+    //{
+    //    private readonly string Conv_1028 = "1028";
+    //    private readonly string Conv_1029 = "1029";
+
+    //    protected override bool SelectDevice(WCS_DEVICE dev)
+    //    {
+    //        return dev.CODE == Conv_1028 || dev.CODE == Conv_1029;
+    //    }
+
+    //    protected override void Do(StationDevice dev)
+    //    {
+    //        dev.EX(dev =>
+    //        {
+    //            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.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.CODE == Conv_1028 ? "1030" : "1031";
+    //            if (db.Default.Set<WCS_TASK>().Any(v => v.BARCODE == info.ContainerCode && v.STATUS<TaskStatus.已完成 && v.TYPE == TaskType.入库))
+    //            {
+    //                        throw new WarnException($"WCS有正在执行的{info.ContainerCode},WMS任务号:{info.WMSTaskNum}");
+    //            }
+
+    //            var station = dev.Entity.CODE;
+    //            DB.Do(db =>
+    //            {
+    //                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;
+
+    //                db.Default.Set<WCS_TASK>().Add(task);
+    //                db.Default.SaveChanges();
+
+    //                dev.Data.Tasknum = task.ID;
+    //                dev.Data.Goodsstart = task.ADDRFROM.ToShort();
+    //                dev.Data.Goodsend = task.ADDRNEXT.ToShort();
+    //                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());
+    //            });
+    //        });
+    //    }
+    //}
+
     [WorkTitle(typeof(ProductHandler), "一楼入库扫码")]
-    internal class 一楼入库 : DeviceWork<StationDevice>
+    internal class 一楼入库 : Work<StationDeviceGroup>
     {
-        private readonly string Conv_1028 = "1028";
-        private readonly string Conv_1029 = "1029";
-
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.CODE == Conv_1028 || dev.CODE == Conv_1029;
+            return dev.CODE == "G1028";
         }
 
-        protected override void Do(StationDevice dev)
+        protected override void Do(StationDeviceGroup obj)
         {
-            dev.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.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.CODE == Conv_1028 ? "1030" : "1031";
-                var station = dev.Entity.CODE;
+                //设备组无论单卷还是双卷都必须满足的条件
+                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
+                if (obj.Items.Any(v => !v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException($"无光电");
+                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
+
+                //成功创建的任务
+                var finishTaskList = new List<Tuple<int, StationDevice>>();
+
+                //创建对应的任务
                 DB.Do(db =>
                 {
-                    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;
-
-                    db.Default.Set<WCS_TASK>().Add(task);
+                    foreach (var dev in obj.Items)
+                    {
+                        if (dev.Data2.Request != IstationRequest.扫码入库) continue; //没有请求
+                        if (dev.Data2.Tasknum > 10000) continue; //没有任务号
+
+                        var bcr = dev.Entity.BCR();
+                        var barcode = bcr.Content.Trim('\r');
+                        if (barcode == "") continue; //扫码失败
+
+                        var info = WMS.I_WCS_GetInTask(barcode, dev.Entity.CODE);
+                        var next = dev.Entity.CODE == "1028" ? "1030" : "1031";
+                        if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库))
+                        {
+                            throw new WarnException($"WCS有正在执行的{info.ContainerCode},WMS任务号:{info.WMSTaskNum}");
+                        }
+
+                        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;
+
+                        db.Default.Set<WCS_TASK>().Add(task);
+                        finishTaskList.Add(new Tuple<int, StationDevice>(task.ID, dev.Entity.Create<StationDevice>()));
+
+                        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.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.ID == 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++;
+                    }
                 });
             });
         }