Просмотр исходного кода

更改堆垛机的业务与动作下发顺序

林豪 左 3 лет назад
Родитель
Сommit
ba322f3a56

+ 56 - 32
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -700,31 +700,46 @@ namespace WCS.Service.Extensions
 
                     if (task.STATUS == TaskStatus.堆垛机完成)
                     {
-                        if (i == 0) Data.FinishedACK_1 = 1;
-                        else Data.FinishedACK_2 = 1;
+                        if (i == 0)
+                        {
+                            Data.FinishedACK_1 = 1;
+                            Data.TaskID_1 = 0;
+                        }
+                        else
+                        {
+                            Data.FinishedACK_2 = 1;
+                            Data.TaskID_2 = 0;
+                        }
+
                         throw new DoException("二次处理堆垛机完成任务");
                     }
 
-                    if (task.TYPE == TaskType.入库)
-                    {
-                        task.ENDTIME = DateTime.Now;
-                        task.STATUS = TaskStatus.已完成;
-                        task.UPDATETIME = DateTime.Now;
-                    }
-                    else if (task.TYPE == TaskType.出库)
-                    {
-                        task.STATUS = TaskStatus.堆垛机完成;
-                        task.UPDATETIME = DateTime.Now;
-                    }
-                    else if (task.TYPE == TaskType.移库)
+                    switch (task.TYPE)
                     {
-                        if (task.STATUS == TaskStatus.堆垛机执行)
-                        {
+                        case TaskType.入库:
+                            task.ENDTIME = DateTime.Now;
                             task.STATUS = TaskStatus.已完成;
                             task.UPDATETIME = DateTime.Now;
-                        }
+                            break;
+
+                        case TaskType.出库:
+                            task.STATUS = TaskStatus.堆垛机完成;
+                            task.UPDATETIME = DateTime.Now;
+                            break;
+
+                        case TaskType.移库:
+                            {
+                                if (task.STATUS == TaskStatus.堆垛机执行)
+                                {
+                                    task.STATUS = TaskStatus.已完成;
+                                    task.UPDATETIME = DateTime.Now;
+                                }
+
+                                break;
+                            }
+                        default:
+                            throw new Exception($"[{Entity.CODE}]任务类型错误,{task.ID}");
                     }
-                    else throw new Exception($"[{Entity.CODE}]任务类型错误,{task.ID}");
 
                     task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机执行}]变更为[{task.STATUS}]", this.GetType());
                 }
@@ -742,8 +757,16 @@ namespace WCS.Service.Extensions
                     //获取当前工位的目标地址
                     task = db.Default.Set<WCS_TASK>().Single(v => taskIds[i] == v.ID);
 
-                    if (i == 0) Data.FinishedACK_1 = 1;
-                    else Data.FinishedACK_2 = 1;
+                    if (i == 0)
+                    {
+                        Data.FinishedACK_1 = 1;
+                        Data.TaskID_1 = 0;
+                    }
+                    else
+                    {
+                        Data.FinishedACK_2 = 1;
+                        Data.TaskID_2 = 0;
+                    }
                 }
             });
         }
@@ -867,20 +890,21 @@ namespace WCS.Service.Extensions
         /// <returns></returns>
         public SrmFork GetFork(Task task, int index)
         {
-            if (index > 1) throw new WarnException("一次最多下发两个任务");
-            //如果索引是1,直接返回货叉2
-            if (index == 1) return SrmFork.货叉2;
-
-            //判断任务列是多少
-            return task.Col switch
+            return index switch
             {
-                102 => Entity.CODE switch
+                > 1 => throw new WarnException("一次最多下发两个任务"),
+                //如果索引是1,直接返回货叉2
+                1 => SrmFork.货叉2,
+                _ => task.Col switch
                 {
-                    "SRM1" => SrmFork.货叉1,
-                    _ => SrmFork.货叉2,
-                },
-                112 => SrmFork.货叉2,
-                _ => SrmFork.货叉1,
+                    102 => Entity.CODE switch
+                    {
+                        "SRM1" => SrmFork.货叉1,
+                        _ => SrmFork.货叉2,
+                    },
+                    112 => SrmFork.货叉2,
+                    _ => SrmFork.货叉1,
+                }
             };
         }
 

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

@@ -49,7 +49,7 @@ namespace WCS.Service.Works.RGV
                     var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
                     if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
                         throw new WarnException("任务组ID不一致");
-                    if (tasks.GroupBy(p => p.TaskGroupKey).Count() == 0)
+                    if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
                         throw new WarnException("无任务组ID");
                     var gw1 = obj.Items.ToArray()[0];
                     var gw2 = obj.Items.ToArray()[1];
@@ -172,20 +172,24 @@ namespace WCS.Service.Works.RGV
 
                         if (rgvDevice.RGVList.Count != 6)//有小车进入维修站时启用该逻辑,避免在正常使用时影响效率
                         {
-                            //var stationList = rgvDevice.LocationList.Where(v => v.Entity.Is(DF.涂布RGV取货设备组)).Where(v => v.RGVGetTaskedDevice().Any())
-                            //    .Where(v => v.CurrentRGV() == null);
-                            //if (stationList != null)
-                            //{
-                            //    var station11 = stationList.MinBy(rgvDevice.Distance);
-                            //    //该站台到当前小车的范围中没有车
-                            //    if (rgvDevice.RGVList.Any(v => station11!.Position <= v.Position && rgvDevice.Position > v.Position))
-                            //    {
-                            //        rgvDevice.Move(station11);
-                            //        return;
-                            //    }
-                            //}
+                            var stationList = rgvDevice.LocationList.Where(v => v.Entity.Is(DF.涂布RGV取货设备组)).Where(v => v.RGVGetTaskedDevice().Any())
+                                .Where(v =>
+                                {
+                                    if (v.CurrentRGV() == null) return true;
+                                    return false;
+                                });
+                            if (stationList != null)
+                            {
+                                var station11 = stationList.MinBy(rgvDevice.Distance);
+                                //该站台到当前小车的范围中没有车
+                                if (rgvDevice.RGVList.Any(v => station11!.Position <= v.Position && rgvDevice.Position > v.Position))
+                                {
+                                    rgvDevice.Move(station11);
+                                    return;
+                                }
+                            }
                         }
-                         if (pickStation.Entity.CODE == "G9")
+                        if (pickStation.Entity.CODE == "G9")
                         {
                             //九站台的小车需要额外检测一下11站台是否需要取货
                             var station11 = Device.Find("G11").Create<StationDeviceGroup>();
@@ -401,4 +405,4 @@ namespace WCS.Service.Works.RGV
             return dev.Is(DF.BOPPRGV);
         }
     }
-}
+}

+ 163 - 117
Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

@@ -18,85 +18,103 @@ namespace WCS.Service.Works.SRM
     [WorkTitle(typeof(SRMHandler), "堆垛机")]
     internal class SRMWork : DeviceWork<SRMDevice>
     {
-        //月台发货需要的设备
-        private StationDevice[] DockDevs;
-
-        public SRMWork()
-        {
-            //只取设备组 设备过多,先写程序后填写
-            DockDevs = new string[]
-            {
-            }.Select(v => Device.Find(v)).SelectMany(v => v.DEVICEGROUP).Select(v => v.MEMBER.Create<StationDevice>()).ToArray();
-        }
-
         protected override void Do(SRMDevice obj)
         {
-            obj.EX(obj =>
+            obj.EX(srmDevice =>
             {
-                var deviceCode = obj.Entity.CODE;
+                var deviceCode = srmDevice.Entity.CODE;
                 //先检查堆垛机是否报警
-                if (obj.Data3.SCAlarm != 0)
+                if (srmDevice.Data3.SCAlarm != 0)
                 {
-                    if (obj.Entity.WakeupOn(5000)) WMS.DevInfo(obj.Entity.CODE, obj.Data3.SCAlarm.ToString());
-                    InfoLog.INFO_SRMALARM($"{obj.Entity.CODE}-{obj.Data3.SCAlarm}");
+                    if (srmDevice.Entity.WakeupOn(5000)) WMS.DevInfo(srmDevice.Entity.CODE, srmDevice.Data3.SCAlarm.ToString());
+                    InfoLog.INFO_SRMALARM($"{srmDevice.Entity.CODE}-{srmDevice.Data3.SCAlarm}");
                     return;
                 }
-                if (obj.Data.FinishedACK_1 == 1 || obj.Data.FinishedACK_2 == 1) throw new WarnException($"堆垛机完成任务WCS反馈信号未清除");
-                if (obj.Data2.VoucherNo_1 != obj.Data.VoucherNo_1 || obj.Data2.VoucherNo_2 != obj.Data.VoucherNo_2)
+                if (srmDevice.Data.FinishedACK_1 == 1 || srmDevice.Data.FinishedACK_2 == 1) throw new WarnException($"堆垛机完成任务WCS反馈信号未清除");
+                if (srmDevice.Data2.VoucherNo_1 != srmDevice.Data.VoucherNo_1 || srmDevice.Data2.VoucherNo_2 != srmDevice.Data.VoucherNo_2)
                 {
                     DB.Do(db =>
                     {
-                        if (obj.Data2.VoucherNo_1 != obj.Data.VoucherNo_1)
+                        if (srmDevice.Data2.VoucherNo_1 != srmDevice.Data.VoucherNo_1)
                         {
-                            if (db.Default.Set<WCS_TASK>().Find(obj.Data.TaskID_1).STATUS == TaskStatus.新建)
+                            if (db.Default.Set<WCS_TASK>().Find(srmDevice.Data.TaskID_1)!.STATUS == TaskStatus.新建)
                             {
-                                obj.Data.VoucherNo_1 = obj.Data2.VoucherNo_1;
+                                srmDevice.Data.VoucherNo_1 = srmDevice.Data2.VoucherNo_1;
                             }
                         }
-                        if (obj.Data2.VoucherNo_2 != obj.Data.VoucherNo_2)
+                        if (srmDevice.Data2.VoucherNo_2 != srmDevice.Data.VoucherNo_2)
                         {
-                            if (db.Default.Set<WCS_TASK>().Find(obj.Data.TaskID_2).STATUS == TaskStatus.新建)
+                            if (db.Default.Set<WCS_TASK>().Find(srmDevice.Data.TaskID_2)!.STATUS == TaskStatus.新建)
                             {
-                                obj.Data.VoucherNo_2 = obj.Data2.VoucherNo_2;
+                                srmDevice.Data.VoucherNo_2 = srmDevice.Data2.VoucherNo_2;
                             }
                         }
                     });
-                    throw new WarnException($"等待执行{obj.Data.TaskID_1}-{obj.Data.TaskID_2}");
+                    throw new WarnException($"等待执行{srmDevice.Data.TaskID_1}-{srmDevice.Data.TaskID_2}");
                 }
 
+                //检查标记好的出库任务,并将出库任务下达至堆垛机
+                DB.Do(db =>
+                {
+                    //找到两个任务
+                    var taksLsit = db.Default.Set<WCS_TASK>().Where(v => v.ID == srmDevice.Data.TaskID_1 || v.ID == srmDevice.Data.TaskID_2 && v.STATUS == TaskStatus.堆垛机执行).ToList()
+                                                                        .Select(v => v.Create<Task>()).OrderBy(v => v.Col).ToArray();
+                    if (!taksLsit.Any()) return;
+                    for (var i = 0; i < taksLsit.Length; i++)
+                    {
+                        var item = taksLsit[i];
+
+                        var fork = srmDevice.GetFork(item, i);
+
+                        switch (fork)
+                        {
+                            // 列数较小的放一工位
+                            case SrmFork.货叉1:
+                                obj.WriteTask1(item, (short)taksLsit.Length);
+                                break;
+                            //列数较大的放二工位
+                            case SrmFork.货叉2:
+                                obj.WriteTask2(item, (short)taksLsit.Length);
+                                break;
+                            default:
+                                throw new ArgumentOutOfRangeException();
+                        }
+                    }
+                });
+
                 //处理堆垛机已完成的任务
-                if (obj.Data2.FinishedTask_1 != 0 || obj.Data2.FinishedTask_2 != 0)
+                if (srmDevice.Data2.FinishedTask_1 != 0 || srmDevice.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($"开始完成任务:[{srmDevice.Entity.CODE}]-{srmDevice.Data2.FinishedTask_1}-{srmDevice.Data2.FinishedTask_2}");
+                    srmDevice.FinishedTaskHandle();
+                    InfoLog.INFO_SRMINFO($"完成任务处理结束:[{srmDevice.Entity.CODE}]-{srmDevice.Data2.FinishedTask_1}-{srmDevice.Data2.FinishedTask_2}");
                     return;
                 }
 
-                if (obj.Data2.SRMMode != SCMode.远程) return;
-                if (obj.Data2.SRMStatus != SCRunStatus.空闲) return;
+                if (srmDevice.Data2.SRMMode != SCMode.远程) return;
+                if (srmDevice.Data2.SRMStatus != SCRunStatus.空闲) return;
 
                 var isTransfer = new List<WCS_TASK>(); //是否有移库任务
-                WCS_TASK enterPriority = new WCS_TASK(), outPriority = new WCS_TASK(); //出入库优先级任务
+                WCS_TASK enterPriority = new(), outPriority = new(); //出入库优先级任务
                 //再检查是否有等待执行的货物
                 DB.Do(db =>
                 {
-                    var task = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE).Where(v => v.STATUS == TaskStatus.堆垛机执行).FirstOrDefault();
+                    var task = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == srmDevice.Entity.CODE).FirstOrDefault(v => v.STATUS == TaskStatus.堆垛机执行);
                     if (task != null) throw new WarnException($"[{deviceCode}]有正在执行的任务:[{task.ID}]");
                     //属于当前堆垛机未执行的移库任务
-                    isTransfer = db.Default.Set<WCS_TASK>().AsNoTracking().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).ToList();
+                    isTransfer = db.Default.Set<WCS_TASK>().AsNoTracking().Where(v => v.DEVICE == srmDevice.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).ToList();
                     //判断是否存在调整优先级任务,存在初始化isTransfer值 让本次执行优先任务
-                    if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.DEVICE == obj.Entity.CODE && v.TYPE != TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行 && v.Priority > 0))
+                    if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.DEVICE == srmDevice.Entity.CODE && v.TYPE != TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行 && v.Priority > 0))
                         isTransfer = new List<WCS_TASK>();
-                    enterPriority = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.入库 && v.STATUS < TaskStatus.堆垛机执行)
+                    enterPriority = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == srmDevice.Entity.CODE && v.TYPE == TaskType.入库 && v.STATUS < TaskStatus.堆垛机执行)
                                                                  .OrderByDescending(v => v.Priority).FirstOrDefault();
-                    outPriority = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.出库 && v.STATUS < TaskStatus.堆垛机执行)
+                    outPriority = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == srmDevice.Entity.CODE && v.TYPE == TaskType.出库 && v.STATUS < TaskStatus.堆垛机执行)
                                                                   .OrderByDescending(v => v.Priority).FirstOrDefault();
                 });
 
                 //最后一个是否是出库任务
-                var LastIsOut = obj.Entity.Get<bool>("LastIsOut");
-                obj.Entity.Set("LastIsOut", !LastIsOut);
+                var LastIsOut = srmDevice.Entity.Get<bool>("LastIsOut");
+                srmDevice.Entity.Set("LastIsOut", !LastIsOut);
                 if (isTransfer.Count > 0) //防止因为无当前堆垛机移库任务导致无法执行其他类型任务
                 {
                     #region 移库
@@ -104,7 +122,7 @@ namespace WCS.Service.Works.SRM
                     DB.Do(db =>
                     {
                         //获取当前堆垛机未执行的任务的组ID
-                        var taskGroupKey = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == obj.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).OrderBy(p => p.CREATETIME).FirstOrDefault().TaskGroupKey;
+                        var taskGroupKey = db.Default.Set<WCS_TASK>().Where(v => v.DEVICE == srmDevice.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).OrderBy(p => p.CREATETIME).FirstOrDefault()!.TaskGroupKey;
                         //通过任务的组ID找到本组的所有任务
                         var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == taskGroupKey);
 
@@ -123,32 +141,32 @@ namespace WCS.Service.Works.SRM
                             task.STARTTIME = DateTime.Now;
                             task.UPDATETIME = DateTime.Now;
                             task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
-                            task.DEVICE = obj.Entity.CODE;
+                            task.DEVICE = srmDevice.Entity.CODE;
                             db.Default.SaveChanges();
                             Uploader.Upload(db);
                             task.CreateStatusLog(db, $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}]", this.GetType());
 
                             if (addrFrom[2].ToShort().OddNumberOrEven())
                             {
-                                obj.Data.TaskID_1 = task.ID;
-                                obj.Data.SLine_1 = addrFrom[0].ToShort();
-                                obj.Data.SCol_1 = addrFrom[1].ToShort();
-                                obj.Data.SLayer_1 = addrFrom[2].ToShort();
-                                obj.Data.ELine_1 = addrTo[0].ToShort();
-                                obj.Data.ECol_1 = addrTo[1].ToShort();
-                                obj.Data.ELayer_1 = addrTo[2].ToShort();
-                                obj.Data.VoucherNo_1++;
+                                srmDevice.Data.TaskID_1 = task.ID;
+                                srmDevice.Data.SLine_1 = addrFrom[0].ToShort();
+                                srmDevice.Data.SCol_1 = addrFrom[1].ToShort();
+                                srmDevice.Data.SLayer_1 = addrFrom[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++;
                             }
                             else
                             {
-                                obj.Data.TaskID_2 = task.ID;
-                                obj.Data.SLine_2 = addrFrom[0].ToShort();
-                                obj.Data.SCol_2 = addrFrom[1].ToShort();
-                                obj.Data.SLayer_2 = addrFrom[2].ToShort();
-                                obj.Data.ELine_2 = addrTo[0].ToShort();
-                                obj.Data.ECol_2 = addrTo[1].ToShort();
-                                obj.Data.ELayer_2 = addrTo[2].ToShort();
-                                obj.Data.VoucherNo_2++;
+                                srmDevice.Data.TaskID_2 = task.ID;
+                                srmDevice.Data.SLine_2 = addrFrom[0].ToShort();
+                                srmDevice.Data.SCol_2 = addrFrom[1].ToShort();
+                                srmDevice.Data.SLayer_2 = addrFrom[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++;
                             }
                         }
                     });
@@ -159,13 +177,13 @@ namespace WCS.Service.Works.SRM
                 {
                     #region 入库
 
-                    var floor = obj.Entity.Get<int>("LastInFloor");
+                    var floor = srmDevice.Entity.Get<int>("LastInFloor");
                     floor = floor % 2 + 1;
-                    obj.Entity.Set("LastInFloor", floor);
+                    srmDevice.Entity.Set("LastInFloor", floor);
                     if (enterPriority != null && outPriority != null && outPriority.Priority > enterPriority.Priority) return;
 
-                    var arrIn = obj.GetPickPoint()
-                                   .Where(v => Device.Where(d => d.IsConv()).Select(d => d.Device<IStation521>()).Where(d => d.Data.Goodsend == v.Entity.Code()).Any()) //有正在前往取货点的任务
+                    var arrIn = srmDevice.GetPickPoint()
+                                   .Where(v => Device.Where(d => d.IsConv()).Select(d => d.Device<IStation521>()).Any(d => d.Data.Goodsend == v.Entity.Code())) //有正在前往取货点的任务
                                    .ToList();
 
                     if (!arrIn.Any()) return; //当前堆垛机无入库任务
@@ -179,7 +197,7 @@ namespace WCS.Service.Works.SRM
                     var item = Device.Where(v => v.DEVICEGROUP.Any(p => p.MEMBER.CODE == station.Entity.CODE)).Single();
                     //对数据进行排序,根据CAD图纸规划,取货点两个设备中设备号较大的一个一定对应到堆垛机的一工位货叉
                     //因此按照降序进行排序,可以保证数组中第一个一定是放到堆垛机一工位的数据
-                    var devs = item.DEVICEGROUP.Select(v => v.MEMBER)
+                    var devise = item.DEVICEGROUP.Select(v => v.MEMBER)
                                                .Select(v => v.Create<StationDevice>())
                                                .OrderByDescending(v => v.Entity.CODE)
                                                .ToArray();
@@ -188,7 +206,7 @@ namespace WCS.Service.Works.SRM
                     DB.Do(db =>
                     {
                         //检测有效任务数与实际任务是是否相等
-                        var validDev = devs.Where(v => v.Data2.Tasknum > 10000 && v.Data2.Status.HasFlag(IstationStatus.光电状态) && !v.Data3.Status.HasFlag(StationStatus.运行状态位));
+                        var validDev = devise.Where(v => v.Data2.Tasknum > 10000 && v.Data2.Status.HasFlag(IstationStatus.光电状态) && !v.Data3.Status.HasFlag(StationStatus.运行状态位));
                         if (!validDev.Any()) throw new DoException("无有效入库任务");
                         var tasknum = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == validDev.First().Data2.Tasknum);
                         var taskList = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == tasknum.TaskGroupKey && v.TYPE == TaskType.入库);
@@ -201,14 +219,14 @@ namespace WCS.Service.Works.SRM
                             var tunnel = dev.Entity.ROUTES.First().NEXT.CODE;
                             I_WCS_GetWareCellResponse loc;
                             //判定当前设备对应的堆垛机工位
-                            if (dev.Entity.CODE == devs[0].Entity.CODE) loc = WMS.GetLocalIn(task.WMSTASK, tunnel, dev.Entity.CODE, Entity.WareCellForkNum.货叉1); //一工位
-                            else if (dev.Entity.CODE == devs[1].Entity.CODE) loc = WMS.GetLocalIn(task.WMSTASK, tunnel, dev.Entity.CODE, Entity.WareCellForkNum.货叉2); //2工位
+                            if (dev.Entity.CODE == devise[0].Entity.CODE) loc = WMS.GetLocalIn(task.WMSTASK, tunnel, dev.Entity.CODE, Entity.WareCellForkNum.货叉1); //一工位
+                            else if (dev.Entity.CODE == devise[1].Entity.CODE) loc = WMS.GetLocalIn(task.WMSTASK, tunnel, dev.Entity.CODE, Entity.WareCellForkNum.货叉2); //2工位
                             else throw new WarnException($"设备{dev.Entity.CODE}无法对应至堆垛机的任一一个工位");
 
                             task.UPDATETIME = DateTime.Now;
                             task.STATUS = TaskStatus.堆垛机执行;
-                            task.ADDRTO = string.Format("{0}-{1}-{2}", loc.Row, loc.Colomn, loc.Layer);
-                            task.DEVICE = obj.Entity.CODE;
+                            task.ADDRTO = $"{loc.Row}-{loc.Colomn}-{loc.Layer}";
+                            task.DEVICE = srmDevice.Entity.CODE;
                             task.TUNNEL = tunnel;
                             task.CreateStatusLog(db, $"状态由{oldTask}变更至{task.STATUS}", this.GetType());
                             finishTaskList.Add(new FinishTaskList<int>(task.ID, dev));
@@ -221,33 +239,33 @@ namespace WCS.Service.Works.SRM
                         {
                             var task = db.Default.Set<WCS_TASK>().Find(finish.FinishCode);
                             var addTo = task.ADDRTO.Split("-");
-                            if (finish.Station.Entity.CODE == devs[0].Entity.CODE)  //一工位
+                            if (finish.Station.Entity.CODE == devise[0].Entity.CODE)  //一工位
                             {
-                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]1工位-开始:[{obj.Data.TaskID_1}][{obj.Data.SLine_1}][{obj.Data.ELine_1}][{obj.Data.ECol_1}][{obj.Data.ELayer_1}][{obj.Data.VoucherNo_1}]--[{finishTaskList.Count.ToShort()}]");
-                                obj.Data.TaskID_1 = task.ID;
-                                obj.Data.SLine_1 = finish.Station.Entity.CODE.ToShort();
-                                obj.Data.SCol_1 = 0;
-                                obj.Data.SLayer_1 = 0;
-                                obj.Data.ELine_1 = addTo[0].ToShort();
-                                obj.Data.ECol_1 = addTo[1].ToShort();
-                                obj.Data.ELayer_1 = addTo[2].ToShort();
-                                obj.Data.RES1_1 = finishTaskList.Count.ToShort();
-                                obj.Data.VoucherNo_1++;
-                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]1工位-结束:[{obj.Data.TaskID_1}][{obj.Data.SLine_1}][{obj.Data.ELine_1}][{obj.Data.ECol_1}][{obj.Data.ELayer_1}][{obj.Data.VoucherNo_1}]--[{finishTaskList.Count.ToShort()}]");
+                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{srmDevice.Entity.CODE}]1工位-开始:[{srmDevice.Data.TaskID_1}][{srmDevice.Data.SLine_1}][{srmDevice.Data.ELine_1}][{srmDevice.Data.ECol_1}][{srmDevice.Data.ELayer_1}][{srmDevice.Data.VoucherNo_1}]--[{finishTaskList.Count.ToShort()}]");
+                                srmDevice.Data.TaskID_1 = task.ID;
+                                srmDevice.Data.SLine_1 = finish.Station.Entity.CODE.ToShort();
+                                srmDevice.Data.SCol_1 = 0;
+                                srmDevice.Data.SLayer_1 = 0;
+                                srmDevice.Data.ELine_1 = addTo[0].ToShort();
+                                srmDevice.Data.ECol_1 = addTo[1].ToShort();
+                                srmDevice.Data.ELayer_1 = addTo[2].ToShort();
+                                srmDevice.Data.RES1_1 = finishTaskList.Count.ToShort();
+                                srmDevice.Data.VoucherNo_1++;
+                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{srmDevice.Entity.CODE}]1工位-结束:[{srmDevice.Data.TaskID_1}][{srmDevice.Data.SLine_1}][{srmDevice.Data.ELine_1}][{srmDevice.Data.ECol_1}][{srmDevice.Data.ELayer_1}][{srmDevice.Data.VoucherNo_1}]--[{finishTaskList.Count.ToShort()}]");
                             }
-                            else if (finish.Station.Entity.CODE == devs[1].Entity.CODE)
+                            else if (finish.Station.Entity.CODE == devise[1].Entity.CODE)
                             {
-                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]2工位-开始:[{obj.Data.TaskID_2}][{obj.Data.SLine_2}][{obj.Data.ELine_2}][{obj.Data.ECol_2}][{obj.Data.ELayer_2}][{obj.Data.VoucherNo_2}]--[{finishTaskList.Count.ToShort()}]");
-                                obj.Data.TaskID_2 = task.ID;
-                                obj.Data.SLine_2 = finish.Station.Entity.CODE.ToShort();
-                                obj.Data.SCol_2 = 0;
-                                obj.Data.SLayer_2 = 0;
-                                obj.Data.ELine_2 = addTo[0].ToShort();
-                                obj.Data.ECol_2 = addTo[1].ToShort();
-                                obj.Data.ELayer_2 = addTo[2].ToShort();
-                                obj.Data.RES1_2 = finishTaskList.Count.ToShort();
-                                obj.Data.VoucherNo_2++;
-                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{obj.Entity.CODE}]2工位-结束:[{obj.Data.TaskID_2}][{obj.Data.SLine_2}][{obj.Data.ELine_2}][{obj.Data.ECol_2}][{obj.Data.ELayer_2}][{obj.Data.VoucherNo_2}]--[{finishTaskList.Count.ToShort()}]");
+                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{srmDevice.Entity.CODE}]2工位-开始:[{srmDevice.Data.TaskID_2}][{srmDevice.Data.SLine_2}][{srmDevice.Data.ELine_2}][{srmDevice.Data.ECol_2}][{srmDevice.Data.ELayer_2}][{srmDevice.Data.VoucherNo_2}]--[{finishTaskList.Count.ToShort()}]");
+                                srmDevice.Data.TaskID_2 = task.ID;
+                                srmDevice.Data.SLine_2 = finish.Station.Entity.CODE.ToShort();
+                                srmDevice.Data.SCol_2 = 0;
+                                srmDevice.Data.SLayer_2 = 0;
+                                srmDevice.Data.ELine_2 = addTo[0].ToShort();
+                                srmDevice.Data.ECol_2 = addTo[1].ToShort();
+                                srmDevice.Data.ELayer_2 = addTo[2].ToShort();
+                                srmDevice.Data.RES1_2 = finishTaskList.Count.ToShort();
+                                srmDevice.Data.VoucherNo_2++;
+                                InfoLog.INFO_SRMINFO($"入库--写入堆垛机[{srmDevice.Entity.CODE}]2工位-结束:[{srmDevice.Data.TaskID_2}][{srmDevice.Data.SLine_2}][{srmDevice.Data.ELine_2}][{srmDevice.Data.ECol_2}][{srmDevice.Data.ELayer_2}][{srmDevice.Data.VoucherNo_2}]--[{finishTaskList.Count.ToShort()}]");
                             }
                         }
                     });
@@ -258,16 +276,14 @@ namespace WCS.Service.Works.SRM
                 {
                     #region 出库
 
-                    //obj.EXOutStock(obj =>
-                    //{
-                    obj.CheckOutTask();
-                    var floor = obj.Entity.Get<int>("LastOutFloor");
+                    srmDevice.CheckOutTask();
+                    var floor = srmDevice.Entity.Get<int>("LastOutFloor");
                     floor = floor % 2 + 1;
-                    obj.Entity.Set("LastOutFloor", floor);
+                    srmDevice.Entity.Set("LastOutFloor", floor);
                     if (enterPriority != null && outPriority != null && enterPriority.Priority > outPriority.Priority) return;
 
                     //获取当前堆垛机所有的放货点
-                    var list = obj.GetDeliveryPoint();
+                    var list = srmDevice.GetDeliveryPoint();
 
                     list = list.Where(v =>
                     {
@@ -280,16 +296,48 @@ namespace WCS.Service.Works.SRM
                         else if (v.Data2.Status.HasFlag(IstationStatus.光电状态)) res = false;
                         else if (v.Data2.Request == IstationRequest.堆垛机放货完成请求目标地址) res = false;
                         else if (v.Data2.Tasknum > 10000) res = false;
+                        else if (v.Entity.Is(DF.SRM涂布放货)) //涂布分货,应为电控不会等到RGV取货点无货时,再让货物离开无动力站台,因此需要判断一次旋转台的状态
+                        {
+                            var devise = new List<StationDevice>();
+                            switch (v.Entity.CODE)
+                            {
+                                case "1283" or "1284":
+                                    devise = Device.Where(b => b.CODE is "1281" or "1282").Select(b => b.Create<StationDevice>()).ToList();
+                                    break;
+
+                                case "1290" or "1291" or "1292" or "1293":
+                                    devise = Device.Where(b => b.CODE is "1288" or "1289").Select(b => b.Create<StationDevice>()).ToList();
+                                    break;
+
+                                case "1299" or "1300" or "1301" or "1302":
+                                    devise = Device.Where(b => b.CODE is "1297" or "1298").Select(b => b.Create<StationDevice>()).ToList();
+                                    break;
+
+                                case "1308" or "1309" or "1310" or "1311":
+                                    devise = Device.Where(b => b.CODE is "1306" or "1307").Select(b => b.Create<StationDevice>()).ToList();
+                                    break;
+                            }
+
+                            if (!devise.Any()) return res;
+                            foreach (var stationDevice in devise)
+                            {
+                                //放货点是否有货
+                                if (stationDevice.Data.VoucherNo != stationDevice.Data2.VoucherNo) res = false;
+                                else if (stationDevice.Data3.Status.HasFlag(StationStatus.运行状态位)) res = false;
+                                else if (stationDevice.Data2.Status.HasFlag(IstationStatus.光电状态)) res = false;
+                                else if (stationDevice.Data2.Request == IstationRequest.堆垛机放货完成请求目标地址) res = false;
+                                else if (stationDevice.Data2.Tasknum > 10000) res = false;
+                            }
+                        }
+
                         return res;
                     }).ToList();
 
                     //没有可用货位
                     if (list.Count == 0) return;
 
-                    //月台所有设备当前有的任务号
-                    var taskidList = DockDevs.Select(v => v.Data2.Tasknum).Where(v => v > 10000).ToList();
                     //堆垛机设备
-                    var srm = obj.Entity.CODE;
+                    var srm = srmDevice.Entity.CODE;
                     DB.Do(db =>
                     {
                         //堆垛机当前是否有正在执行的任务
@@ -302,9 +350,9 @@ namespace WCS.Service.Works.SRM
                                                       .Where(v => !db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)).ToList();
 
                         //同时对结果进行排序,分组
-                        var maxnum = ProtocolProxy.YGWMS150Redis.Get("SaleTaskGroupCount").ToInt();
+                        var maximum = ProtocolProxy.YGWMS150Redis.Get("SaleTaskGroupCount").ToInt();
                         //所有 有优先级任务的出货口
-                        var priorityADDRTO = db.Default.Set<WCS_TASK>().Where(v => v.Priority > 0 && v.STATUS == TaskStatus.新建 && v.DEVICE != obj.Entity.CODE).ToList()
+                        var priorityADDRTO = db.Default.Set<WCS_TASK>().Where(v => v.Priority > 0 && v.STATUS == TaskStatus.新建 && v.DEVICE != srmDevice.Entity.CODE).ToList()
                                                                         .GroupBy(v => v.ADDRTO).Select(v => new { v.Key, List = v.Select(p => p.DEVICE).Distinct().ToList() })
                                                                         .Where(v => v.List.Where(p =>
                                                                         {
@@ -316,16 +364,15 @@ namespace WCS.Service.Works.SRM
                         var cTaskList = db.Default.Set<WCS_TASK>().AsNoTracking()
                                                                   .Where(d => d.TYPE == TaskType.出库)
                                                                   .Where(d => d.STATUS > TaskStatus.新建)
-                                                                  .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID)).ToList();
-                        var outDepotList = waitTask.Where(v => cTaskList.Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR).GroupBy(d => d.TaskGroupKey).Count() < maxnum)
+                                                                  .Where(d => d.STATUS < TaskStatus.已完成).ToList();
+                        var outDepotList = waitTask.Where(v => cTaskList.Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR).GroupBy(d => d.TaskGroupKey).Count() < maximum)
                                                    .OrderByDescending(v => v.Priority)
                                                    .ThenBy(v => v.ADDRTO == "G1340" ? 0 : 1)
                                                    .ThenBy(v => v.FLOOR == floor ? 0 : 1)
                                                    .ThenBy(v => cTaskList.Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR).GroupBy(d => d.TaskGroupKey).Count())
                                                    .ThenBy(v => v.CREATETIME)
                                                    .GroupBy(v => v.ADDRTO)
-                                                   .Where(v => !priorityADDRTO.Contains(v.Key))
-                                                   .FirstOrDefault()
+                                                   .FirstOrDefault(v => !priorityADDRTO.Contains(v.Key))!
                                                    .Select(v => v).ToList();
 
                         //获取两个个可执行任务,此时这两个任务的目标地址是一致的
@@ -347,7 +394,7 @@ namespace WCS.Service.Works.SRM
 
                         var finishTaskList = new List<FinishTaskList<SrmFork, Task>>();
 
-                        for (int i = 0; i < tasks.Length; i++)
+                        for (var i = 0; i < tasks.Length; i++)
                         {
                             var item = tasks[i];
                             var task = db.Default.Set<WCS_TASK>().Find(item.ID);
@@ -355,21 +402,18 @@ namespace WCS.Service.Works.SRM
                             task.STARTTIME = DateTime.Now;
                             task.UPDATETIME = DateTime.Now;
                             task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
-                            task.DEVICE = obj.Entity.CODE;
+                            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 = obj.GetFork(item, i);
+                            var fork = srmDevice.GetFork(item, i);
                             //获取站台及下一个地址
                             task.GetSrmStationAndaddNext(fork);
                             var msg = "";
-                            if (fork == SrmFork.货叉1)
-                                msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_1}-{obj.Data.SCol_1}-{obj.Data.SLayer_1}][{obj.Data.ELine_1}][{obj.Data.VoucherNo_1}]";
-                            else
-                                msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_2}-{obj.Data.SCol_2}-{obj.Data.SLayer_2}][{obj.Data.ELine_2}][{obj.Data.VoucherNo_2}]";
+                            msg = fork == SrmFork.货叉1 ? $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{srmDevice.Data.SLine_1}-{srmDevice.Data.SCol_1}-{srmDevice.Data.SLayer_1}][{srmDevice.Data.ELine_1}][{srmDevice.Data.VoucherNo_1}]" : $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{srmDevice.Data.SLine_2}-{srmDevice.Data.SCol_2}-{srmDevice.Data.SLayer_2}][{srmDevice.Data.ELine_2}][{srmDevice.Data.VoucherNo_2}]";
                             task.CreateStatusLog(db, msg, this.GetType());
                             item.SRMSTATION = task.SRMSTATION;
                             finishTaskList.Add(new FinishTaskList<SrmFork, Task>(fork, item));
@@ -377,19 +421,21 @@ namespace WCS.Service.Works.SRM
 
                         db.Default.SaveChanges();
 
+                        //此处只做标记,表示当前事务已经提交
                         foreach (var finish in finishTaskList)
                         {
                             if (finish.FinishCode == SrmFork.货叉1) // 列数较小的放一工位
                             {
-                                obj.WriteTask1(finish.Station, (short)tasks.Length);
+                                srmDevice.Data.TaskID_1 = finish.Station.ID;
+                                //obj.WriteTask1(finish.Station, (short)tasks.Length);
                             }
                             else if (finish.FinishCode == SrmFork.货叉2) //列数较大的放二工位
                             {
-                                obj.WriteTask2(finish.Station, (short)tasks.Length);
+                                srmDevice.Data.TaskID_2 = finish.Station.ID;
+                                //obj.WriteTask2(finish.Station, (short)tasks.Length);
                             }
                         }
                     });
-                    //});
 
                     #endregion 出库
                 }
@@ -401,4 +447,4 @@ namespace WCS.Service.Works.SRM
             return dev.Is(DF.SRM);
         }
     }
-}
+}