Pārlūkot izejas kodu

update:新增入库任务数量管控 SRM

林豪 左 3 gadi atpakaļ
vecāks
revīzija
c4373fd1bb

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

@@ -425,13 +425,13 @@ namespace WCS.Service.Extensions
         /// <returns></returns>
         public StationDeviceGroup CurrentStation()
         {
-            return LocationList.Where(v => v.Entity.Is(DF.涂布RGV取货设备组)|| v.Entity.Is(DF.涂布RGV放货设备组)).Where(v =>
-              {
-                  //RGV与站台距离误差为 正负50500
-                  var max = v.Position + 500;
-                  var min = v.Position - 500;
-                  return Data2.Position < max && Data2.Position > min;
-              }).FirstOrDefault();
+            return LocationList.Where(v => v.Entity.Is(DF.涂布RGV取货设备组) || v.Entity.Is(DF.涂布RGV放货设备组)).Where(v =>
+               {
+                   //RGV与站台距离误差为 正负50500
+                   var max = v.Position + 500;
+                   var min = v.Position - 500;
+                   return Data2.Position < max && Data2.Position > min;
+               }).FirstOrDefault();
         }
 
         /// <summary>
@@ -582,6 +582,7 @@ namespace WCS.Service.Extensions
         public void FinishedTaskHandle()
         {
             WCS_TASK task = new WCS_TASK();
+
             DB.Do(db =>
             {
                 var taskIds = new List<int>() { Data2.FinishedTask_1, Data2.FinishedTask_2 }.ToArray();
@@ -609,11 +610,6 @@ namespace WCS.Service.Extensions
                         task.UPDATETIME = DateTime.Now;
                         db.Default.SaveChanges();
                         Uploader.Upload(db);
-
-                        var target = Device.Find(ELine).Create<StationDevice>();
-                        target.Data.Tasknum = task.ID;
-                        target.Data.Goodsstart = ELine.ToShort();
-                        target.Data.Goodsend = task.ADDRNEXT.ToShort();
                     }
                     else if (task.TYPE == TaskType.移库)
                     {
@@ -627,8 +623,44 @@ namespace WCS.Service.Extensions
                     }
                     else throw new Exception($"[{Entity.CODE}]任务类型错误");
 
-                    if (i == 0) Data.FinishedACK_1 = 1;
-                    else Data.FinishedACK_2 = 1;
+                    task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机执行}]变更为[{task.STATUS}]", this.GetType());
+                }
+            });
+
+            DB.Do(db =>
+            {
+                var taskIds = new List<int>() { Data2.FinishedTask_1, Data2.FinishedTask_2 }.ToArray();
+
+                for (int i = 0; i < taskIds.Length; i++)
+                {
+                    //判断当前工位是否有完成任务
+                    if (taskIds[i] == 0) continue;
+                    //获取当前工位的目标地址
+                    var ELine = i == 0 ? Data.ELine_1.ToString() : Data.ELine_2.ToString();
+                    task = db.Default.Set<WCS_TASK>().Single(v => taskIds[i] == v.ID);
+
+                    if (task.TYPE == TaskType.入库 && task.STATUS == TaskStatus.已完成)
+                    {
+                        if (i == 0) Data.FinishedACK_1 = 1;
+                        else Data.FinishedACK_2 = 1;
+                    }
+                    else if (task.TYPE == TaskType.出库 && task.STATUS == TaskStatus.堆垛机完成)
+                    {
+                        var target = Device.Find(ELine).Create<StationDevice>();
+                        target.Data.Tasknum = task.ID;
+                        target.Data.Goodsstart = ELine.ToShort();
+                        target.Data.Goodsend = task.ADDRNEXT.ToShort();
+
+                        if (i == 0) Data.FinishedACK_1 = 1;
+                        else Data.FinishedACK_2 = 1;
+                    }
+                    else if (task.TYPE == TaskType.移库 && task.STATUS == TaskStatus.堆垛机完成)
+                    {
+                        if (i == 0) Data.FinishedACK_1 = 1;
+                        else Data.FinishedACK_2 = 1;
+                    }
+                    else throw new Exception($"[{Entity.CODE}]任务类型错误");
+
                     task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机执行}]变更为[{task.STATUS}]", this.GetType());
                 }
             });

+ 22 - 1
Projects/永冠OPP/WCS.Service/Extensions/TaskExtension.cs

@@ -1,4 +1,5 @@
-using System;
+using DBHelper;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using WCS.Core;
@@ -34,6 +35,26 @@ namespace WCS.Service.Extensions
                         .ToArray();
         }
 
+        /// <summary>
+        /// 入库任务是否有效
+        /// </summary>
+        /// <param name="source"></param>
+        /// <param name="dev1IsThereATask"></param>
+        /// <param name="dev2IsThereATask"></param>
+        /// <param name="db"></param>
+        /// <returns></returns>
+        /// <exception cref="WarnException"></exception>
+        public static bool TaskValid(this WCS_TASK source, bool dev1IsThereATask, bool dev2IsThereATask, DB db)
+        {
+            var taskCount = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == source.TaskGroupKey);
+            return taskCount switch
+            {
+                1 => dev1IsThereATask || dev2IsThereATask,
+                2 => dev1IsThereATask && dev2IsThereATask,
+                _ => throw new WarnException($"同组任务最多为2,当前任务组有{taskCount}"),
+            };
+        }
+
         /// <summary>
         /// 获取出库任务的站台号及下一个地址
         /// </summary>

+ 4 - 3
Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

@@ -47,8 +47,9 @@ namespace WCS.Service.Works.SRM
                 //处理堆垛机已完成的任务
                 if (obj.Data2.FinishedTask_1 != 0 || obj.Data2.FinishedTask_2 != 0)
                 {
+                    InfoLog.INFO_SRMINFO($"开始完成任务:[{obj.Entity.CODE}]-{obj.Data2.FinishedTask_1}-{obj.Data2.FinishedTask_2}");
                     obj.FinishedTaskHandle();
-                    InfoLog.INFO_SRMINFO($"[{obj.Entity.CODE}]-{obj.Data2.FinishedTask_1}-{obj.Data2.FinishedTask_2}");
+                    InfoLog.INFO_SRMINFO($"完成任务处理结束:[{obj.Entity.CODE}]-{obj.Data2.FinishedTask_1}-{obj.Data2.FinishedTask_2}");
                     return;
                 }
 
@@ -164,8 +165,6 @@ namespace WCS.Service.Works.SRM
                         var dev1IsThereATask = dev1.Data2.Tasknum > 0 && dev1.Data2.Status.HasFlag(IstationStatus.光电状态) && !dev1.Data3.Status.HasFlag(StationStatus.运行状态位);
                         var dev2IsThereATask = dev2.Data2.Tasknum > 0 && dev2.Data2.Status.HasFlag(IstationStatus.光电状态) && !dev2.Data3.Status.HasFlag(StationStatus.运行状态位);
 
-                        //
-
                         //处理一工位
                         if (dev1IsThereATask)
                         {
@@ -173,6 +172,7 @@ namespace WCS.Service.Works.SRM
                             var task1 = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.STATUS < TaskStatus.堆垛机执行 && v.ID == dev1.Data2.Tasknum);
                             if (task1 == null)
                                 throw new WarnException($"设备有光电有任务且不在运行状态,但WCS找不到任务{dev1.Data2.Tasknum}");
+                            if (!task1.TaskValid(dev1IsThereATask, dev2IsThereATask, db)) throw new WarnException("任务数量异常");
                             var loc = WMS.GetLocalIn(task1.WMSTASK, tunnel, dev1.Entity.CODE, Entity.WareCellForkNum.货叉1);
                             var locno = string.Format("{0}-{1}-{2}", loc.Row, loc.Colomn, loc.Layer);
                             var oldTask = task1.STATUS;
@@ -199,6 +199,7 @@ namespace WCS.Service.Works.SRM
                             var tunnel = dev2.Entity.ROUTES.First().NEXT.CODE;
                             var task2 = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.STATUS < TaskStatus.堆垛机执行 && v.ID == dev2.Data2.Tasknum);
                             if (task2 == null) throw new WarnException($"设备有光电有任务且不在运行状态,但WCS找不到任务{dev2.Data2.Tasknum}");
+                            if (!task2.TaskValid(dev1IsThereATask, dev2IsThereATask, db)) throw new WarnException("任务数量异常");
                             var loc = WMS.GetLocalIn(task2.WMSTASK, tunnel, dev2.Entity.CODE, Entity.WareCellForkNum.货叉2);
                             var locno = string.Format("{0}-{1}-{2}", loc.Row, loc.Colomn, loc.Layer);
                             var oldTask = task2.STATUS;