林豪 左 3 years ago
parent
commit
74c11f5971

+ 26 - 6
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -900,9 +900,20 @@ namespace WCS.Service.Extensions
             Data.SLine_1 = task.Line;
             Data.SCol_1 = task.Col;
             Data.SLayer_1 = task.Layer;
-            Data.ELine_1 = task.SRMSTATION.ToShort();
-            Data.ECol_1 = 0;
-            Data.ELayer_1 = 0;
+
+            if (task.TYPE == TaskType.移库)
+            {
+                Data.ELine_1 = task.EndLine;
+                Data.ECol_1 = task.EndCol;
+                Data.ELayer_1 = task.EndLayer;
+            }
+            else
+            {
+                Data.ELine_1 = task.SRMSTATION.ToShort();
+                Data.ECol_1 = 0;
+                Data.ELayer_1 = 0;
+            }
+
             Data.RES1_1 = goodsnum;
             Data.VoucherNo_1++;
             InfoLog.INFO_SRMINFO($"出库--写入堆垛机[{Entity.CODE}]1工位-结束:[{Data.TaskID_1}][{Data.SLine_1}][{Data.SCol_1}][{Data.SLayer_1}][{Data.ELine_1}][{Data.VoucherNo_1}]--[{Data.RES1_1}]");
@@ -920,9 +931,18 @@ namespace WCS.Service.Extensions
             Data.SLine_2 = task.Line;
             Data.SCol_2 = task.Col;
             Data.SLayer_2 = task.Layer;
-            Data.ELine_2 = task.SRMSTATION.ToShort();
-            Data.ECol_2 = 0;
-            Data.ELayer_2 = 0;
+            if (task.TYPE == TaskType.移库)
+            {
+                Data.ELine_2 = task.EndLine;
+                Data.ECol_2 = task.EndCol;
+                Data.ELayer_2 = task.EndLayer;
+            }
+            else
+            {
+                Data.ELine_2 = task.SRMSTATION.ToShort();
+                Data.ECol_2 = 0;
+                Data.ELayer_2 = 0;
+            }
             Data.RES1_2 = goodsnum;
             Data.VoucherNo_2++;
             InfoLog.INFO_SRMINFO($"出库--写入堆垛机[{Entity.CODE}]2工位-结束:[{Data.TaskID_2}][{Data.SLine_2}][{Data.SCol_2}][{Data.SLayer_2}][{Data.ELine_2}][{Data.VoucherNo_2}]--[{Data.RES1_2}]");

+ 25 - 0
Projects/永冠OPP/WCS.Service/Extensions/TaskExtension.cs

@@ -167,9 +167,26 @@ namespace WCS.Service.Extensions
         /// </summary>
         public short Layer { get; set; }
 
+        /// <summary>
+        /// 行
+        /// </summary>
+        public short EndLine { get; set; }
+
+        /// <summary>
+        /// 列
+        /// </summary>
+        public short EndCol { get; set; }
+
+        /// <summary>
+        /// 层
+        /// </summary>
+        public short EndLayer { get; set; }
+
         public Task(WCS_TASK task)
         {
+
             var addrFrom = task.ADDRFROM.Split("-");
+
             ADDRTO = task.ADDRTO;
             TUNNEL = task.TUNNEL;
             DEVICE = task.DEVICE;
@@ -182,6 +199,14 @@ namespace WCS.Service.Extensions
             Line = addrFrom[0].ToShort();
             Col = addrFrom[1].ToShort();
             Layer = addrFrom[2].ToShort();
+            TYPE = task.TYPE;
+            if (task.TYPE == TaskType.移库)
+            {
+                var addrto = task.ADDRTO.Split("-");
+                EndLine = addrto[0].ToShort();
+                EndCol = addrto[1].ToShort();
+                EndLayer = addrto[2].ToShort();
+            }
         }
     }
 }

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

@@ -120,8 +120,8 @@ namespace WCS.Service.WebApi
                                 STATUS = WCS.Entity.TaskStatus.新建,
                                 DEVICE = "SRM" + obj.SRMNo.Last(),
                                 BARCODE = obj.PalletCode,
-                                ADDRFROM = obj.StartLocation,
-                                ADDRTO = obj.EndLocation,
+                                ADDRFROM = $"{obj.StartRow}-{obj.StartCol}-{obj.StartLayer}",
+                                ADDRTO = $"{obj.EndRow}-{obj.EndCol}-{obj.EndLayer}",
                                 UPDATETIME = DateTime.Now,
                                 UPDATEUSER = "WMS",
                                 TUNNEL = tunnel,

+ 60 - 36
Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

@@ -341,54 +341,78 @@ namespace WCS.Service.Works.SRM
                 {
                     #region 移库
 
+                    var finishTaskList = new List<FinishTaskList<SrmFork, Task>>();
                     DB.Do(db =>
                     {
-                        //获取当前堆垛机未执行的任务的组ID
-                        var taskGroupKey = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == deviceCode && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).OrderBy(p => p.CREATETIME).FirstOrDefault()!.TaskGroupKey;
+                        //获取当前堆垛机未执行的任务
+                        var taskList = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == srmDevice.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).OrderBy(p => p.CREATETIME);
                         //通过任务的组ID找到本组的所有任务
-                        var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == taskGroupKey);
-
-                        var taskList = tasks.Select(v => v.Create<Task>());
-                        foreach (var item in taskList)
-                        {
-                        }
+                        var tasks = taskList.ToList().GetOutTask();
 
-                        //双工位  货架列单数为一工位取放点  货架列双数为二工位取放点
-                        foreach (var task in tasks)
+                        for (var i = 0; i < tasks.Length; i++)
                         {
-                            var addFrom = task.ADDRFROM.Split("-");
-                            var addrTo = task.ADDRTO.Split("-");
-
-                            var oldTaskStatus = task.STATUS;
+                            var item = tasks[i];
+                            var task = db.Default.Set<WCS_TASK>().Find(item.ID);
+                            var oldTaskStatus = task!.STATUS;
                             task.STARTTIME = DateTime.Now;
                             task.UPDATETIME = DateTime.Now;
                             task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
-                            task.DEVICE = deviceCode;
-                            db.Default.SaveChanges();
-                            Uploader.Upload(db);
-                            task.CreateStatusLog(db, $"状态由[{oldTaskStatus}]变更为[{task.STATUS}]", this.GetType());
+                            task.DEVICE = srmDevice.Entity.CODE;
+                            task.TaskGroupKey = tasks.Length switch
+                            {
+                                1 => $"{tasks[0].ID}_0",
+                                2 => $"{tasks[0].ID}_{tasks[1].ID}",
+                                _ => throw new WarnException($"可用任务数异常{tasks.Length}"),
+                            };
+                            var fork = srmDevice.GetFork(item, i);
+                            var msg = "";
+                            msg = fork == SrmFork.货叉1 ? $"状态由[{oldTaskStatus}]变更为[{task.STATUS}]" : $"状态由[{oldTaskStatus}]变更为[{task.STATUS}]";
+                            task.CreateStatusLog(db, msg, this.GetType());
+                            finishTaskList.Add(new FinishTaskList<SrmFork, Task>(fork, item));
+                        }
 
-                            if (addFrom[2].ToShort().OddNumberOrEven())
+                        db.Default.SaveChanges();
+
+                        //此处只做标记,表示当前事务已经提交
+                        foreach (var finish in finishTaskList)
+                        {
+                            switch (finish.FinishCode)
                             {
-                                srmDevice.Data.TaskID_1 = task.ID;
-                                srmDevice.Data.SLine_1 = addFrom[0].ToShort();
-                                srmDevice.Data.SCol_1 = addFrom[1].ToShort();
-                                srmDevice.Data.SLayer_1 = addFrom[2].ToShort();
-                                srmDevice.Data.ELine_1 = addrTo[0].ToShort();
-                                srmDevice.Data.ECol_1 = addrTo[1].ToShort();
-                                srmDevice.Data.ELayer_1 = addrTo[2].ToShort();
-                                srmDevice.Data.VoucherNo_1++;
+                                // 列数较小的放一工位
+                                case SrmFork.货叉1:
+                                    obj.Data.TaskID_1 = finish.Station.ID;
+                                    break;
+                                //列数较大的放二工位
+                                case SrmFork.货叉2:
+                                    obj.Data.TaskID_2 = finish.Station.ID;
+                                    break;
+
+                                default:
+                                    throw new ArgumentOutOfRangeException();
                             }
-                            else
+                        }
+                    });
+
+                    //检查标记好的出库任务,并将出库任务下达至堆垛机
+                    DB.Do(db =>
+                    {
+                        //此处只做标记,表示当前事务已经提交
+                        foreach (var finish in finishTaskList)
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(finish.Station.ID).Create<Task>();
+                            switch (finish.FinishCode)
                             {
-                                srmDevice.Data.TaskID_2 = task.ID;
-                                srmDevice.Data.SLine_2 = addFrom[0].ToShort();
-                                srmDevice.Data.SCol_2 = addFrom[1].ToShort();
-                                srmDevice.Data.SLayer_2 = addFrom[2].ToShort();
-                                srmDevice.Data.ELine_2 = addrTo[0].ToShort();
-                                srmDevice.Data.ECol_2 = addrTo[1].ToShort();
-                                srmDevice.Data.ELayer_2 = addrTo[2].ToShort();
-                                srmDevice.Data.VoucherNo_2++;
+                                // 列数较小的放一工位
+                                case SrmFork.货叉1:
+                                    obj.WriteTask1(task, (short)finishTaskList.Count);
+                                    break;
+                                //列数较大的放二工位
+                                case SrmFork.货叉2:
+                                    obj.WriteTask2(task, (short)finishTaskList.Count);
+                                    break;
+
+                                default:
+                                    throw new ArgumentOutOfRangeException();
                             }
                         }
                     });