瀏覽代碼

update:更新涂布出库

林豪 左 3 年之前
父節點
當前提交
f1203c4b9c

+ 8 - 8
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取货站台)).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>
@@ -569,7 +569,7 @@ namespace WCS.Service.Extensions
         /// </summary>
         public List<StationDevice> GetPickPoint()
         {
-            return Device.Where(v => v.Is(DF.一楼SRM取货) || v.Is(DF.二楼SRM取货))
+            return Device.Where(v => v.Is(DF.SRM二级品取货) || v.Is(DF.SRM涂布取货))
                          .Where(v => v.ROUTES.Any(p => p.NEXT.ROUTES.Any(d => d.NEXT == Entity)))
                          .Select(v => v.Create<StationDevice>())
                          .ToList();

+ 19 - 0
Projects/永冠OPP/WCS.Service/Handlers/CoatingHandler.cs

@@ -0,0 +1,19 @@
+using System.ComponentModel;
+using WCS.Core;
+
+namespace WCS.Service.Handlers
+{
+    /// <summary>
+    /// 涂布处理中心
+    /// </summary>
+    [Description("涂布处理中心")]
+    internal class CoatingHandler : WorkHandler
+    {
+        public override bool ParallelRun => false;
+
+        protected override void DoWork(WorkInfo work)
+        {
+            base.DoWork(work);
+        }
+    }
+}

+ 4 - 1
Projects/永冠OPP/WCS.Service/Handlers/ProductHandler.cs

@@ -3,7 +3,10 @@ using WCS.Core;
 
 namespace WCS.Service
 {
-    [Description("产品")]
+    /// <summary>
+    /// 二级品及月台发货
+    /// </summary>
+    [Description("一楼出入库处理中心")]
     internal class ProductHandler : WorkHandler
     {
         public override bool ParallelRun => false;

+ 0 - 16
Projects/永冠OPP/WCS.Service/Handlers/SCHandler.cs

@@ -1,16 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using WCS.Core;
-
-namespace WCS.Service.Handlers
-{
-    [Description("堆垛机")]
-    class SCHandler : WorkHandler
-    {
-        public override bool ParallelRun =>true;
-    }
-}

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

@@ -72,33 +72,6 @@ namespace WCS.Service.WebApi
                                 ADDRNEXT = obj.EndLocation
                             };
 
-                            ////当前货物可以使用的放货点
-                            //var deliveryPoints = Device.Find(task.DEVICE).Create<SRMDevice>().GetDeliveryPoint();
-                            ////确定放货站台 通过设备组关联 此时一定是一组设备组
-                            ////结果为堆垛机放货设备组
-                            //var group = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == task.ADDRTO)).SelectMany(v => v.DEVICEGROUP).Select(v => v.MEMBER);
-                            ////结果为当前堆垛机可用设备 此时会是两个单独的设备
-                            //deliveryPoints = deliveryPoints.Where(v => group.Contains(v.Entity)).OrderByDescending(v => v.Entity.CODE).ToList();
-
-                            //var addrTo = Device.Find(task.ADDRTO).Create<StationDeviceGroup>().Items.ToArray();
-
-                            ////判断是否可以到达
-                            ////确定当前工位的货物是一工位还是二工位
-                            //if (obj.StartCol.ToShort().OddNumberOrEven())
-                            //{
-                            //    //一工位 也是设备在堆垛机放货后的第一个地点
-                            //    task.SRMSTATION = deliveryPoints[0].Entity.CODE;
-                            //    if (deliveryPoints[0].Entity.PATHS.Any(v => v.END == addrTo[0].Entity)) task.ADDRTO = addrTo[0].Entity.CODE;
-                            //    else task.ADDRNEXT = addrTo[0].Entity.CODE;
-                            //}
-                            //else
-                            //{
-                            //    //二工位
-                            //    task.SRMSTATION = deliveryPoints[1].Entity.CODE;
-                            //    if (deliveryPoints[1].Entity.PATHS.Any(v => v.END == addrTo[0].Entity)) task.ADDRTO = addrTo[0].Entity.CODE;
-                            //    else task.ADDRNEXT = addrTo[1].Entity.CODE;
-                            //}
-
                             db.Default.Add(task);
                             db.Default.SaveChanges();
                             //task.CreateStatusLog(db);

+ 14 - 8
Projects/永冠OPP/WCS.Service/Worker.cs

@@ -96,18 +96,24 @@ namespace WCS.Service
                 Device.AddFlag(DF.一楼RGV放货, "G1035", "G1044", "G1053", "G1062");
                 Device.AddFlag(DF.SRM, "SRM1", "SRM2", "SRM3", "SRM4", "SRM5", "SRM6", "SRM7", "SRM8");
                 Device.AddFlag(DF.月台, "G1469", "G1561", "G1538", "G1574", "G1509");
-                Device.AddFlag(DF.SRM放货, "1473", "1476", "1474", "1475", "1491", "1492", "1493", "1494");
-                Device.AddFlag(DF.SRM放货, "1520", "1521", "1522", "1523", "1545", "1546", "1451", "1453");
-                Device.AddFlag(DF.一楼SRM取货, "1040", "1041", "1042", "1043", "1049", "1050", "1051", "1052");
-                Device.AddFlag(DF.一楼SRM取货, "1058", "1059", "1060", "1061", "1067", "1068");
+                Device.AddFlag(DF.SRM二级品取货, "1040", "1041", "1042", "1043", "1049", "1050", "1051", "1052");
+                Device.AddFlag(DF.SRM二级品取货, "1058", "1059", "1060", "1061", "1067", "1068");
+                Device.AddFlag(DF.SRM月台放货, "1473", "1476", "1474", "1475", "1491", "1492", "1493", "1494");
+                Device.AddFlag(DF.SRM月台放货, "1520", "1521", "1522", "1523", "1545", "1546", "1451", "1453");
+                Device.AddFlag(DF.SRM涂布取货, "1428", "1429", "1422", "1423", "1424", "1425", "1415", "1416");
+                Device.AddFlag(DF.SRM涂布取货, "1412", "1414", "1406", "1407", "1408", "1409");
+                Device.AddFlag(DF.SRM涂布放货, "1283", "1284", "1290", "1291", "1292", "1293", "1299", "1300");
+                Device.AddFlag(DF.SRM涂布放货, "1301", "1302", "1308", "1309", "1310", "1311");
                 Device.AddFlag(DF.涂布RGV, "RGV9", "RGV10", "RGV11", "RGV12", "RGV13", "RGV14");
-                Device.AddFlag(DF.涂布RGV取货站台, "G2", "G3", "G5", "G7", "G9", "G11");
-                Device.AddFlag(DF.涂布RGV放货站台, "G1", "G4", "G6", "G8", "G10");
+                Device.AddFlag(DF.涂布RGV取货设备组, "G2", "G3", "G5", "G7", "G9", "G11");
+                Device.AddFlag(DF.涂布RGV放货设备组, "G1", "G4", "G6", "G8", "G10");
                 Device.AddFlag(DF.拉膜RGV, "RGV1", "RGV2", "RGV3", "RGV4", "RGV5", "RGV6", "RGV7");
                 //Device.AddFlag(DF.涂布出库取货站台, "G5", "G7", "G9", "G11");
                 //Device.AddFlag(DF.涂布入库取货站台, "G2", "G3");
-                Device.AddFlag(DF.涂布出库取货站台, "1285", "1286", "1294", "1295", "1303", "1304", "1312", "1313", "");
-                Device.AddFlag(DF.涂布入库取货站台, "1391", "1392", "1399", "1400");
+                Device.AddFlag(DF.涂布出库RGV取货站台, "1285", "1286", "1294", "1295", "1303", "1304", "1312", "1313");
+                Device.AddFlag(DF.涂布入库RGV取货站台, "1391", "1392", "1399", "1400");
+                Device.AddFlag(DF.涂布RGV取货站台, "1285", "1286", "1294", "1295", "1303", "1304", "1312", "1313");
+                Device.AddFlag(DF.涂布RGV取货站台, "1391", "1392", "1399", "1400");
 
                 #endregion 设备扩展数据配置
 

+ 1 - 1
Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

@@ -165,7 +165,7 @@ namespace WCS.Service.Works.RGV
                         //取小车的目标位置值
                         var destStation = Device.Find($"G{afterStation.Data2.DestPosition_1}").Create<StationDeviceGroup>();
                         //取被挡住小车的目标位置的下一个取货点
-                        var beforeSickStation = Device.Where(v => v.Is(DF.涂布RGV取货站台) && v.CODE != destStation.Entity.CODE)
+                        var beforeSickStation = Device.Where(v => v.Is(DF.涂布出库RGV取货站台) || v.Is(DF.涂布入库RGV取货站台) && v.CODE != destStation.Entity.CODE)
                                       .Select(v => v.Create<StationDeviceGroup>())
                                       .OrderBy(v => destStation.Distance(v))
                                       .FirstOrDefault();

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

@@ -71,7 +71,7 @@ namespace WCS.Service.Works.Station
         }
     }
 
-   [WorkTitle(typeof(ProductHandler), "一楼分配巷道")]
+    [WorkTitle(typeof(ProductHandler), "一楼分配巷道")]
     internal class 巷道分配 : Work<StationDeviceGroup>
     {
         private readonly string ConvGroup_1030 = "G1030";
@@ -117,7 +117,7 @@ namespace WCS.Service.Works.Station
                     foreach (var item in tunnels)
                     {
                         //当前巷道的取货点
-                        var allIn = Device.Where(v => v.Is(DF.一楼SRM取货)) //一楼所有取货点
+                        var allIn = Device.Where(v => v.Is(DF.SRM二级品取货)) //一楼所有取货点
                                           .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
                                           .Select(v => v.CODE)
                                           .ToList();

+ 1 - 1
Projects/永冠OPP/WCS.Service/Works/Station/一楼出库.cs

@@ -39,7 +39,7 @@ namespace WCS.Service.Works.Station
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.Is(DF.SRM放货);
+            return dev.Is(DF.SRM月台放货);
         }
     }
 

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

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.Service.Works.Station
+{
+    internal class 涂布入库
+    {
+    }
+}

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

@@ -1,95 +0,0 @@
-using DBHelper;
-using System.Linq;
-using WCS.Core;
-using WCS.Entity;
-using WCS.Entity.Protocol;
-using WCS.Service.Extensions;
-
-namespace WCS.Service.Works.Station
-{
-    /// <summary>
-    /// 涂布出库分配出库口
-    /// </summary>
-    //[WorkTitle(typeof(ProductHandler), "涂布出库分配出库口")]
-    public class 涂布出库分配出库口 : DeviceWork<StationDevice>
-    {
-        protected override void Do(StationDevice obj)
-        {
-            obj.EX(obj =>
-            {
-                if (!obj.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电");
-                if (obj.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("设备运行中");
-                if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
-                    throw new WarnException($"等待任务[{obj.Data2.Tasknum}]执行--凭证号不一致[{obj.Data.VoucherNo}][{obj.Data2.VoucherNo}]");
-                if (obj.Data2.Tasknum < 10000) throw new DoException("无任务");
-                if (obj.Data2.Request != IstationRequest.请求分配目标地址) throw new WarnException("有任务无请求");
-
-                DB.Do(db =>
-                {
-                    var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == obj.Entity.CODE && v.STATUS == WCS.Entity.TaskStatus.堆垛机完成);
-                    var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == task.TaskGroupKey);
-                    if (tasks.Any(v => v.STATUS != WCS.Entity.TaskStatus.堆垛机完成 && v.STATUS != WCS.Entity.TaskStatus.执行中))
-                        throw new WarnException("任务异常,同组任务状态不为堆垛机完成或执行中");
-                    if (task == null) throw new WarnException("WCS无该任务信息");
-                    if (task.SRMSTATION != obj.Entity.CODE && task.STATUS != WCS.Entity.TaskStatus.堆垛机完成) throw new WarnException("任务状态不是堆垛机完成");
-                    task.STATUS = WCS.Entity.TaskStatus.执行中;
-                    db.Default.SaveChanges();
-                    task.CreateStatusLog(db, $"状态由[{WCS.Entity.TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
-                    //开始写入目标地址
-                    obj.Data.Tasknum = task.ID;
-                    obj.Data.Goodsstart = obj.Entity.CODE.ToShort();
-                    obj.Data.Goodsend = task.ADDRNEXT.ToShort();
-                    obj.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
-                    obj.Data.VoucherNo++;
-                });
-            });
-        }
-
-        protected override bool SelectDevice(WCS_DEVICE dev)
-        {
-            return dev.Is(DF.涂布出库取货站台);
-        }
-    }
-
-    /// <summary>
-    /// 涂布出库分配AGV取货点
-    /// </summary>
-    //[WorkTitle(typeof(ProductHandler), "涂布出库分配AGV取货点")]
-    public class 涂布出库分配AGV取货点 : DeviceWork<StationDevice>
-    {
-        protected override void Do(StationDevice obj)
-        {
-            obj.EX(obj =>
-            {
-                if (!obj.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电");
-                if (obj.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("设备运行中");
-                if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
-                    throw new WarnException($"等待任务[{obj.Data2.Tasknum}]执行--凭证号不一致[{obj.Data.VoucherNo}][{obj.Data2.VoucherNo}]");
-                if (obj.Data2.Tasknum < 10000) throw new DoException("无任务");
-                if (obj.Data2.Request != IstationRequest.请求分配目标地址) throw new WarnException("有任务无请求");
-
-                DB.Do(db =>
-                {
-                    var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == obj.Entity.CODE && v.STATUS == WCS.Entity.TaskStatus.执行中);
-                    if (task == null) throw new WarnException("WCS无该任务信息");
-
-                    //全部统一分配目标地址至
-
-                    db.Default.SaveChanges();
-                    task.CreateStatusLog(db, $"状态由[{WCS.Entity.TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
-                    //开始写入目标地址
-                    obj.Data.Tasknum = task.ID;
-                    obj.Data.Goodsstart = obj.Entity.CODE.ToShort();
-                    obj.Data.Goodsend = task.ADDRNEXT.ToShort();
-                    obj.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
-                    obj.Data.VoucherNo++;
-                });
-            });
-        }
-
-        protected override bool SelectDevice(WCS_DEVICE dev)
-        {
-            return dev.CODE == "1332" || dev.CODE == "1333";
-        }
-    }
-}

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

@@ -0,0 +1,308 @@
+using DBHelper;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using WCS.Core;
+using WCS.Entity;
+using WCS.Entity.Protocol;
+using WCS.Service.Extensions;
+using WCS.Service.Handlers;
+
+namespace WCS.Service.Works.Station
+{
+    /// <summary>
+    /// 涂布堆垛机放货分配目标地址
+    /// </summary>
+    [WorkTitle(typeof(CoatingHandler), "涂布堆垛机放货分配目标地址")]
+    public class 涂布堆垛机放货分配目标地址 : DeviceWork<StationDevice>
+    {
+        protected override void Do(StationDevice obj)
+        {
+            obj.EX(obj =>
+            {
+                obj.WhetherToExecute(IstationRequest.堆垛机放货完成请求目标地址);
+                //找到当前站台为当前设备且任务为堆垛机完成的任务
+                DB.Do(db =>
+                {
+                    var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == obj.Entity.CODE && v.STATUS == TaskStatus.堆垛机完成);
+                    var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == task.TaskGroupKey);
+                    if (tasks.Any(v => v.STATUS != TaskStatus.堆垛机完成 && v.STATUS != TaskStatus.执行中))
+                        throw new WarnException("任务异常,同组任务状态不为堆垛机完成或执行中");
+                    if (task == null) throw new WarnException("WCS无该任务信息");
+                    if (task.SRMSTATION != obj.Entity.CODE && task.STATUS != TaskStatus.堆垛机完成) throw new WarnException("任务状态不是堆垛机完成");
+                    task.STATUS = TaskStatus.执行中;
+                    db.Default.SaveChanges();
+                    task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
+                    //开始写入目标地址
+                    obj.Data.Tasknum = task.ID;
+                    obj.Data.Goodsstart = obj.Entity.CODE.ToShort();
+                    obj.Data.Goodsend = task.ADDRNEXT.ToShort();
+                    obj.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
+                    obj.Data.VoucherNo++;
+                });
+            });
+        }
+
+        protected override bool SelectDevice(WCS_DEVICE dev)
+        {
+            return dev.Is(DF.SRM涂布放货);
+        }
+    }
+
+    /// <summary>
+    /// 涂布出库分配出库口
+    /// </summary>
+    [WorkTitle(typeof(CoatingHandler), "涂布出库分配出库口")]
+    public class 涂布出库分配出库口 : DeviceWork<StationDevice>
+    {
+        protected override void Do(StationDevice obj)
+        {
+            obj.EX(obj =>
+            {
+                if (!obj.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电");
+                if (obj.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("设备运行中");
+                if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
+                    throw new WarnException($"等待任务[{obj.Data2.Tasknum}]执行--凭证号不一致[{obj.Data.VoucherNo}][{obj.Data2.VoucherNo}]");
+                if (obj.Data2.Tasknum < 10000) throw new DoException("无任务");
+                if (obj.Data2.Request != IstationRequest.请求分配目标地址) throw new WarnException("有任务无请求");
+
+                DB.Do(db =>
+                {
+                    var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == obj.Entity.CODE && v.STATUS == WCS.Entity.TaskStatus.堆垛机完成);
+                    if (task == null) throw new WarnException("WCS无该任务信息");
+                    task.ADDRNEXT = "G1";
+                    db.Default.SaveChanges();
+                    task.CreateStatusLog(db, $"分配目标地址{task.ADDRNEXT}", this.GetType());
+                    //开始写入目标地址
+                    obj.Data.Tasknum = task.ID;
+                    obj.Data.Goodsstart = obj.Entity.CODE.ToShort();
+                    obj.Data.Goodsend = task.ADDRNEXT.ToShort();
+                    obj.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
+                    obj.Data.VoucherNo++;
+                });
+            });
+        }
+
+        protected override bool SelectDevice(WCS_DEVICE dev)
+        {
+            return dev.Is(DF.涂布出库RGV取货站台);
+        }
+    }
+
+    /// <summary>
+    /// 涂布出库分配AGV取货点
+    /// </summary>
+    [WorkTitle(typeof(CoatingHandler), "涂布出库分配AGV取货点")]
+    public class 涂布出库分配AGV取货点 : DeviceWork<StationDevice>
+    {
+        protected override void Do(StationDevice obj)
+        {
+            obj.EX(obj =>
+            {
+                if (!obj.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电");
+                if (obj.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("设备运行中");
+                if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
+                    throw new WarnException($"等待任务[{obj.Data2.Tasknum}]执行--凭证号不一致[{obj.Data.VoucherNo}][{obj.Data2.VoucherNo}]");
+                if (obj.Data2.Tasknum < 10000) throw new DoException("无任务");
+                if (obj.Data2.Request != IstationRequest.请求分配目标地址) throw new WarnException("有任务无请求");
+
+                DB.Do(db =>
+                {
+                    var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == obj.Entity.CODE && v.STATUS == WCS.Entity.TaskStatus.执行中);
+                    if (task == null) throw new WarnException("WCS无该任务信息");
+                    var addNext = "";
+                    if (obj.Entity.CODE == "1340")
+                    {
+                        var Station1343 = Device.Find("1343").Create<StationDevice>();
+                        addNext = "1343";
+                        if (Station1343.Data2.Status.HasFlag(IstationStatus.光电状态) && Station1343.Data3.Status.HasFlag(StationStatus.运行状态位))
+                            addNext = "1340";
+                    }
+                    else if (obj.Entity.CODE == "1341")
+                    {
+                        var Station1344 = Device.Find("1344").Create<StationDevice>();
+                        addNext = "1344";
+                        if (Station1344.Data2.Status.HasFlag(IstationStatus.光电状态) && Station1344.Data3.Status.HasFlag(StationStatus.运行状态位))
+                            addNext = "1341";
+                    }
+
+                    //全部统一分配目标地址至
+                    task.ADDRNEXT = addNext;
+                    db.Default.SaveChanges();
+                    task.CreateStatusLog(db, $"状态由[{WCS.Entity.TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
+                    //开始写入目标地址
+                    obj.Data.Tasknum = task.ID;
+                    obj.Data.Goodsstart = obj.Entity.CODE.ToShort();
+                    obj.Data.Goodsend = task.ADDRNEXT.ToShort();
+                    obj.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
+                    obj.Data.VoucherNo++;
+                });
+            });
+        }
+
+        protected override bool SelectDevice(WCS_DEVICE dev)
+        {
+            return dev.CODE == "1340" || dev.CODE == "1341";
+        }
+    }
+
+    /// <summary>
+    /// 涂布叫料
+    /// </summary>
+    [WorkTitle(typeof(CoatingHandler), "涂布叫料")]
+    public class 涂布叫料 : Work<StationDeviceGroup>
+    {
+        protected override void Do(StationDeviceGroup obj)
+        {
+            obj.EX(obj =>
+             {
+                 var station = obj.Entity.CODE;
+
+                 #region 处理新增叫料任务
+
+                 DB.Do(db =>
+                 {
+                     //找到所有的AGV任务
+                     var agvTasks = db.Default.Set<WCS_AGVTask>().Where(v => v.Station == station && v.TaskType == AGVTaskType.叫料)
+                     .Where(v => v.Status < AGVTaskStatus.完成).ToArray();
+
+                     foreach (var agvtask in agvTasks)
+                     {
+                         var position = agvtask.Position;
+                         if (!ProtocolProxy.AllDatas.ContainsKey(position))
+                             ProtocolProxy.AllDatas[position] = new ProdLineData();
+                         var pld = ProtocolProxy.AllDatas[position] as ProdLineData;
+                         pld.Frame = LogicHandler.Frame;
+                         pld.Code = position;
+                         pld.TaskList.Add(agvtask);
+
+                         if (Ltc.Do(agvtask, agvtask => agvtask.Status == AGVTaskStatus.新建))
+                         {
+                             var qty = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成)
+                            .Where(v => v.Position == agvtask.Position).Count();
+                             //TODO:暂时不考虑单卷叫料
+                             if (Ltc.Do(qty, OutTaskQty => OutTaskQty > 8))
+                             {
+                                 throw new Exception($"{agvtask.Position}正在执行的叫料任务数量已达{qty},暂停出库");
+                             }
+                             //涂布叫料默认目标地址G1340,到达G1340后再决定是否要继续前进一步
+                             var res = WMS.GetOutTask(agvtask.Position, "G1340");
+                             res.ForEach(outTask =>
+                             {
+                                 var srm = Device.Find(outTask.TunnelNum).ROUTES.Where(v => v.NEXT.IsSC()).Select(v => v.NEXT).FirstOrDefault();
+
+                                 var loc = string.Format("{0}-{1}-{2}", outTask.Row, outTask.Colomn, outTask.Layer);
+
+                                 var task = new WCS_TASK
+                                 {
+                                     TYPE = TaskType.出库,
+                                     STATUS = WCS.Entity.TaskStatus.新建,
+                                     ADDRFROM = loc,
+                                     ADDRTO = "G1340",
+                                     BARCODE = outTask.ContainerBarCode,
+                                     TUNNEL = outTask.TunnelNum,
+                                     WMSTASK = int.Parse(outTask.WMSTaskNum),
+                                     UPDATEUSER = "WCS",
+                                     SRMSTATION = outTask.Memo1,
+                                     DEVICE = srm.CODE,
+                                     //ADDRCURRENT = loc,
+                                     AgvTask = agvtask.ID,
+                                 };
+                                 db.Default.Set<WCS_TASK>().Add(task);
+                                 db.Default.SaveChanges();
+
+                                 agvtask.Status = AGVTaskStatus.确认;
+                                 agvtask.UpdateTime = DateTime.Now;
+                                 db.Default.SaveChanges();
+                             });
+                         }
+                         else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.完成))
+                         {
+                             agvtask.Status = agvtask.AGVStatus;
+                             agvtask.UpdateTime = DateTime.Now;
+                             db.Default.SaveChanges();
+                         }
+                         else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.取消))
+                         {
+                             agvtask.Status = agvtask.AGVStatus;
+                             agvtask.UpdateTime = DateTime.Now;
+                             db.Default.SaveChanges();
+                         }
+                     }
+                 });
+
+                 #endregion 处理新增叫料任务
+
+                 //空闲自动,停止运行
+                 if (obj.Items.Any(v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException("等待执行任务");
+                 if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动))) return;
+                 if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException("设备运行中");
+                 if (obj.Items.Any(v => !v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("没有光电");
+
+                 var taskIds = new List<int>();
+                 obj.Items.ToList().ForEach(dev => taskIds.Add(dev.Data2.Tasknum));
+                 DB.Do(db =>
+                 {
+                     var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID));
+                     if (taskList == null) throw new WarnException($"WCS任务号{JsonConvert.SerializeObject(taskIds)}不存在");
+                     if (taskList.Any(v => v.TYPE != TaskType.出库)) throw new WarnException("有任务的类型不是出库");
+                     if (taskList.Any(v => v.AgvTask == 0)) throw new WarnException("人工出库任务,请手动搬走");
+                     var agvtask = db.Default.Set<WCS_AGVTask>().Find(taskList.FirstOrDefault().AgvTask);
+                     if (agvtask == null) throw new WarnException($"AGV任务号{taskList.FirstOrDefault().AgvTask}不存在");
+
+                     if (agvtask.Status == AGVTaskStatus.确认)
+                     {
+                         var flag = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料)
+                         .Where(v => v.Status > AGVTaskStatus.确认 && v.Status < AGVTaskStatus.取放完成).Count();
+                         if (flag > 2) throw new Exception("有2未完成的AGV出库任务");
+
+                         taskList.ToList().ForEach(task =>
+                         {
+                             task.STATUS = WCS.Entity.TaskStatus.已完成;
+                             task.UPDATETIME = DateTime.Now;
+                             task.ENDTIME = DateTime.Now;
+                         });
+
+                         agvtask.Station = obj.Entity.CODE;
+                         agvtask.Status = AGVTaskStatus.执行;
+                         agvtask.UpdateTime = DateTime.Now;
+                         db.Default.SaveChanges();
+                     }
+                     else if (agvtask.Status < agvtask.AGVStatus)
+                     {
+                         if (agvtask.AGVStatus == AGVTaskStatus.请求_允许)
+                         {
+                             if (agvtask.Status < AGVTaskStatus.执行) throw new WarnException($"AGV状态错误-{agvtask.Status}");
+                             if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.RES1))) throw new WarnException("任务清零信号未清除");
+
+                             agvtask.Status = agvtask.AGVStatus;
+                             agvtask.UpdateTime = DateTime.Now;
+                             db.Default.SaveChanges();
+                         }
+                         else if (agvtask.AGVStatus == AGVTaskStatus.取放完成)
+                         {
+                             if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.RES1))) throw new WarnException("任务清零信号未清除");
+                             if (obj.Items.Any(v => !v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new WarnException("AGV取货完成后依然有光电信号");
+                             if (agvtask.Status < AGVTaskStatus.请求_允许) throw new WarnException("AGV任务状态有误");
+
+                             agvtask.Status = agvtask.AGVStatus;
+                             agvtask.UpdateTime = DateTime.Now;
+                             db.Default.SaveChanges();
+
+                             obj.Items.ToList().ForEach(dev =>
+                             {
+                                 dev.Data2.Status = IstationStatus.RES1;
+                             });
+                         }
+                     }
+                 });
+             });
+        }
+
+        protected override bool SelectDevice(WCS_DEVICE dev)
+        {
+            return dev.CODE == "G1340" || dev.CODE == "G1343";
+        }
+    }
+}

+ 9 - 9
WCS.Core/Device.cs

@@ -160,18 +160,18 @@ public enum DF
 {
     无 = 0,
     SRM = 1 << 0,
-    一楼SRM取货 = 1 << 1,
-    二楼SRM取货 = 1 << 2,
-    SRM放货 = 1 << 3,
+    SRM二级品取货 = 1 << 1,
+    SRM涂布取货 = 1 << 2,
+    SRM月台放货 = 1 << 3,
     一楼RGV放货 = 1 << 4,
     月台 = 1 << 5,
     涂布RGV = 1 << 6,
     拉膜RGV = 1 << 7,
-    涂布RGV取货站台 = 1 << 8,
-    涂布RGV放货站台 = 1 << 9,
-    涂布出库取货站台 = 1 << 10,
-    涂布入库取货站台 = 1 << 11,
-    备用7 = 1 << 12,
-    备用8 = 1 << 13,
+    涂布RGV取货设备组 = 1 << 8,
+    涂布RGV放货设备组 = 1 << 9,
+    涂布出库RGV取货站台 = 1 << 10,
+    涂布入库RGV取货站台 = 1 << 11,
+    SRM涂布放货 = 1 << 12,
+    涂布RGV取货站台 = 1 << 13,
     备用9 = 1 << 14,
 }