Forráskód Böngészése

Merge branch 'master' of zuolinhao/YG-OPP-WCS into 环穿

zuolinhao 3 éve
szülő
commit
b12af90c20

+ 6 - 1
Projects/永冠OPP/WCS.Service/DeviceExtentions.cs

@@ -119,6 +119,11 @@ namespace WCS.Service
             return source.PROTOCOLS.Any(v => v.DB.PROTOCOL == typeof(IStation521).AssemblyQualifiedName);
         }
 
+        public static bool IsDevGroup(this WCS_DEVICE source)
+        {
+            return source.CODE.Contains("G");
+        }
+
         /// <summary>
         /// 是否堆垛机
         /// </summary>
@@ -160,4 +165,4 @@ namespace WCS.Service
             return res.CODE;
         }
     }
-}
+}

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

@@ -935,53 +935,41 @@ namespace WCS.Service.Extensions
                         case "SRM3":
                             if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
                                 throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM4" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM3正在执行出库任务");
                             break;
 
                         case "SRM4":
                             srm = Device.Find("SRM3").Create<SRMDevice>();
                             task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM3" && v.TYPE == TaskType.出库);
                             if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
-                                throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM3" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM3正在执行出库任务");
+                                throw new DoException("SRM3正在执行出库任务");
                             break;
 
                         case "SRM5":
                             srm = Device.Find("SRM6").Create<SRMDevice>();
                             task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM6" && v.TYPE == TaskType.出库);
                             if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
-                                throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM6" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM6正在执行出库任务");
+                                throw new DoException("SRM6正在执行出库任务");
                             break;
 
                         case "SRM6":
                             srm = Device.Find("SRM5").Create<SRMDevice>();
                             task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM5" && v.TYPE == TaskType.出库);
                             if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
-                                throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM5" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM5正在执行出库任务");
+                                throw new DoException("SRM5正在执行出库任务");
                             break;
 
                         case "SRM7":
                             srm = Device.Find("SRM8").Create<SRMDevice>();
                             task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM8" && v.TYPE == TaskType.出库);
                             if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
-                                throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM8" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM7正在执行出库任务");
+                                throw new DoException("SRM8正在执行出库任务");
                             break;
 
                         case "SRM8":
                             srm = Device.Find("SRM7").Create<SRMDevice>();
                             task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM7" && v.TYPE == TaskType.出库);
                             if (srm.Data3.SCAlarm == 0 && srm.Data2.SRMMode == WCS.Entity.Protocol.SRM.SCMode.远程 && task)
-                                throw new DoException("SRM4正在执行出库任务");
-                            //if (db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM7" && v.TYPE == TaskType.出库))
-                            //    throw new DoException("SRM8正在执行出库任务");
+                                throw new DoException("SRM7正在执行出库任务");
                             break;
                     }
                 }
@@ -1136,4 +1124,4 @@ namespace WCS.Service.Extensions
         public WCS_DEVICE taskIN;
         public Device<ISRM520, ISRM521, ISRM537> SRM;
     }
-}
+}

+ 16 - 5
Projects/永冠OPP/WCS.Service/Extensions/TaskExtension.cs

@@ -63,20 +63,20 @@ namespace WCS.Service.Extensions
             //取任务巷道到达目标地址的下一个地址,即任务堆垛机的站台对应的设备组
             var stations = Device.Where(v => v.DEVICEGROUP.Any(p => p.MEMBER == Device.Find(task.TUNNEL).GetPath(task.ADDRTO.Replace("G", ""))))
                                  .Select(v => v.Create<StationDeviceGroup>())
-                                 .FirstOrDefault().Items
+                                 .FirstOrDefault()?.Items
                                  .OrderByDescending(v => v.Entity.CODE)
                                  .ToArray();
             //一工位放较大的站台号
             switch (srmFork)
             {
                 case SrmFork.货叉1:
-                    task.SRMSTATION = stations[0].Entity.CODE;
-                    task.ADDRNEXT = stations[0].Entity.GetPath(task.ADDRTO).CODE;
+                    task.SRMSTATION = stations?[0].Entity.CODE;
+                    task.ADDRNEXT = stations?[0].Entity.GetPath(task.ADDRTO).CODE;
                     break;
 
                 case SrmFork.货叉2:
-                    task.SRMSTATION = stations[1].Entity.CODE;
-                    task.ADDRNEXT = stations[1].Entity.GetPath(task.ADDRTO).CODE;
+                    task.SRMSTATION = stations?[1].Entity.CODE;
+                    task.ADDRNEXT = stations?[1].Entity.GetPath(task.ADDRTO).CODE;
                     break;
             }
         }
@@ -112,6 +112,17 @@ namespace WCS.Service.Extensions
             return taskList;
         }
 
+        /// <summary>
+        /// 用于任务创建时获取放货站台
+        /// </summary>
+        /// <param name="task"></param>
+        public static void TaskGetSrmStation(this WCS_TASK task)
+        {
+            task.GetSrmStationAndaddNext(SrmFork.货叉1);
+            task.SRMSTATION = Device.Where(v => v.IsDevGroup()).FirstOrDefault(v => v.DEVICEGROUP.Any(b => b.MEMBER.CODE == task.SRMSTATION))?.CODE;
+            task.ADDRNEXT = string.Empty;
+        }
+
         public static void AGVStatusChange(this WCS_AGVTask task, AGVTaskStatus status, string type = "同步")
         {
             InfoLog.INFO_AGV($"AGV状态更新Status:{task.Status},AGVStatus:{status},{type}");

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

@@ -1,14 +1,12 @@
 using DBHelper;
 using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore;
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Service.Entity;
-using WCS.Service.WebApi.ViewModels;
+using WCS.Service.Extensions;
 
 namespace WCS.Service.WebApi
 {
@@ -52,19 +50,19 @@ namespace WCS.Service.WebApi
                         }
                         else if (obj.TaskType == "2")
                         {  //出库任务
-                            var wmstaskid = int.Parse(obj.WMSTaskNo);
-                            if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmstaskid))
-                                throw new Exception("任务号" + wmstaskid + "重复下发");
+                            var wmsTaskId = int.Parse(obj.WMSTaskNo);
+                            if (db.Default.Set<WCS_TASK>().Any(v => v.WMSTASK == wmsTaskId))
+                                throw new Exception("任务号" + wmsTaskId + "重复下发");
 
                             var tunnel = "TY" + obj.SRMNo.Last();
 
                             var task = new WCS_TASK
                             {
                                 TYPE = TaskType.出库,
-                                STATUS = WCS.Entity.TaskStatus.新建,
+                                STATUS = TaskStatus.新建,
                                 DEVICE = "SRM" + obj.SRMNo.Last(),
                                 BARCODE = obj.PalletCode,
-                                ADDRFROM = string.Format("{0}-{1}-{2}", obj.StartRow, obj.StartCol, obj.StartLayer),
+                                ADDRFROM = $"{obj.StartRow}-{obj.StartCol}-{obj.StartLayer}",
                                 ADDRTO = obj.EndLocation,
                                 UPDATETIME = DateTime.Now,
                                 UPDATEUSER = "WMS",
@@ -73,9 +71,14 @@ namespace WCS.Service.WebApi
                                 ADDRNEXT = obj.EndLocation,
                                 Length = obj.Length,
                                 MaterialCode = obj.MaterialCode,
-                                FLOOR = 1,
+                                FLOOR = obj.EndLocation == "G1340" ? 1 : 2
                             };
 
+                            task.TaskGetSrmStation();
+                            //task.GetSrmStationAndaddNext(SrmFork.货叉1);
+                            //task.SRMSTATION = Device.Where(v => v.IsDevGroup()).FirstOrDefault(v => v.DEVICEGROUP.Any(b => b.MEMBER.CODE == task.SRMSTATION))?.CODE;
+                            //task.ADDRNEXT = string.Empty;
+
                             db.Default.Add(task);
                         }
                         else if (obj.TaskType == "1")
@@ -284,7 +287,6 @@ namespace WCS.Service.WebApi
         //        result.AddRange(GetDeviceStatusWhere(conv, v => v.Data.Tasknum == model.TASKNUM));
         //    }
 
-
         //    if (model.PH_STATUS != null)
         //    {
         //        result.AddRange(GetDeviceStatusWhere(rgv, v => v.Data.TaskID_1 == model.TASKNUM));
@@ -427,8 +429,6 @@ namespace WCS.Service.WebApi
         //    return result;
         //}
 
-       
-
         #endregion 静态方法
     }
-}
+}

+ 14 - 7
Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

@@ -35,16 +35,19 @@ namespace WCS.Service.Works.SRM
                 {
                     DB.Do(db =>
                     {
+                        WCS_TASK task;
                         if (srmDevice.Data2.VoucherNo_1 != srmDevice.Data.VoucherNo_1)
                         {
-                            if (db.Default.Set<WCS_TASK>().Find(srmDevice.Data.TaskID_1)!.STATUS == TaskStatus.新建)
+                            task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == srmDevice.Data.TaskID_1) ?? throw new WarnException($"未好到对应的WCS任务--{srmDevice.Data.TaskID_1}");
+                            if (task.STATUS == TaskStatus.新建)
                             {
                                 srmDevice.Data.VoucherNo_1 = srmDevice.Data2.VoucherNo_1;
                             }
                         }
                         if (srmDevice.Data2.VoucherNo_2 != srmDevice.Data.VoucherNo_2)
                         {
-                            if (db.Default.Set<WCS_TASK>().Find(srmDevice.Data.TaskID_2)!.STATUS == TaskStatus.新建)
+                            task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == srmDevice.Data.TaskID_2) ?? throw new WarnException($"未好到对应的WCS任务--{srmDevice.Data.TaskID_2}");
+                            if (task.STATUS == TaskStatus.新建)
                             {
                                 srmDevice.Data.VoucherNo_2 = srmDevice.Data2.VoucherNo_2;
                             }
@@ -255,9 +258,8 @@ namespace WCS.Service.Works.SRM
                     if (enterPriority != null && outPriority != null && enterPriority.Priority > outPriority.Priority) return;
 
                     //获取当前堆垛机所有的放货点
-                    var list = srmDevice.GetDeliveryPoint();
 
-                    list = list.Where(v =>
+                    var list = srmDevice.GetDeliveryPoint().Where(v =>
                     {
                         //true:满足条件  false:不满足条件
                         //返回结果为无货的设备  默认无货
@@ -300,10 +302,13 @@ namespace WCS.Service.Works.SRM
                         }
 
                         return res;
-                    }).ToList();
+                    }).Select(v => v.Entity.CODE).ToList();
 
                     //没有可用货位
-                    if (list.Count == 0) return;
+                    if (!list.Any()) return;
+
+                    //找到对应的设备组编号
+                    var groupList = Device.Where(v => v.IsDevGroup()).Where(v => v.DEVICEGROUP.Any(b => list.Contains(b.MEMBER.CODE))).Select(v => v.CODE).ToList();
 
                     //堆垛机设备
                     var srm = srmDevice.Entity.CODE;
@@ -317,7 +322,9 @@ namespace WCS.Service.Works.SRM
                         var waitTask = db.Default.Set<WCS_TASK>().Where(v => v.STATUS == TaskStatus.新建)
                                                       .Where(v => v.DEVICE == srm)
                                                       .Where(v => v.TYPE == TaskType.出库)
-                                                      .Where(v => !db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)).ToList();
+                                                      .Where(v => !db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行))
+                                                      .Where(v => groupList.Contains(v.SRMSTATION)) //站台必须可用
+                                                      .ToList();
 
                         //同时对结果进行排序,分组
                         var maximum = ProtocolProxy.YGWMS150Redis.Get("SaleTaskGroupCount").ToInt();

+ 1 - 0
Projects/永冠OPP/WCS.Service/Works/Station/涂布出库.cs

@@ -466,6 +466,7 @@ namespace WCS.Service.Works.Station
                                      Length = outTask.Length,
                                      FLOOR = 2
                                  };
+                                 task.TaskGetSrmStation();
                                  db.Default.Set<WCS_TASK>().Add(task);
                                  tasking.Status = AGVTaskStatus.确认;
                                  tasking.UpdateTime = DateTime.Now;