林豪 左 1 рік тому
батько
коміт
70d169e68c
27 змінених файлів з 453 додано та 240 видалено
  1. 1 1
      ServiceCenter/Extensions/SqlExtension.cs
  2. 4 1
      ServiceCenter/SqlSugars/SqlSugarHelper.cs
  3. 4 4
      业务工程/分拣库/WCS.Entity.Protocol/Station/StationEnum.cs
  4. 0 1
      业务工程/分拣库/WCS.WorkEngineering/Extensions/DeviceExtension.cs
  5. 17 12
      业务工程/分拣库/WCS.WorkEngineering/Extensions/TaskExtension.cs
  6. 9 7
      业务工程/分拣库/WCS.WorkEngineering/Systems/AgvSystems.cs
  7. 9 1
      业务工程/分拣库/WCS.WorkEngineering/Systems/DeviceWriteSystem.cs
  8. 4 4
      业务工程/分拣库/WCS.WorkEngineering/Systems/NoInteractionSystems.cs
  9. 60 16
      业务工程/分拣库/WCS.WorkEngineering/Systems/RGVSystems.cs
  10. 33 10
      业务工程/分拣库/WCS.WorkEngineering/Systems/SrmSystems.cs
  11. 4 4
      业务工程/分拣库/WCS.WorkEngineering/Systems/UpLoadSystems.cs
  12. 9 9
      业务工程/分拣库/WCS.WorkEngineering/Systems/一楼叠盘机入库.cs
  13. 12 5
      业务工程/分拣库/WCS.WorkEngineering/Systems/一楼扫码入库.cs
  14. 1 1
      业务工程/分拣库/WCS.WorkEngineering/Systems/分拣主线/满轮主线预写入目标地址.cs
  15. 30 29
      业务工程/分拣库/WCS.WorkEngineering/Systems/分拣支线/桁架分流点.cs
  16. 32 11
      业务工程/分拣库/WCS.WorkEngineering/Systems/分拣支线/环形库分流点.cs
  17. 1 1
      业务工程/分拣库/WCS.WorkEngineering/Systems/机台叫料生成AGV任务.cs
  18. 1 1
      业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/二次码垛任务到RGV取货位处理.cs
  19. 2 2
      业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/创建二次码垛出库任务.cs
  20. 118 53
      业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架.cs
  21. 3 3
      业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架码垛区补空托盘任务生成.cs
  22. 4 4
      业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架码垛工位任务结束处理.cs
  23. 4 4
      业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架缓存放行点.cs
  24. 31 8
      业务工程/分拣库/WCS.WorkEngineering/Systems/环形库/机械臂cs.cs
  25. 3 3
      业务工程/分拣库/WCS.WorkEngineering/Systems/环形库/环形库码垛结束.cs
  26. 55 43
      业务工程/分拣库/WCS.WorkEngineering/Systems/码垛区域生成空托盘任务.cs
  27. 2 2
      业务工程/分拣库/WCS.WorkEngineering/WorkStart.cs

+ 1 - 1
ServiceCenter/Extensions/SqlExtension.cs

@@ -33,7 +33,7 @@ namespace ServiceCenter.Extensions
         /// <typeparam name="T"></typeparam>
         /// <param name="obj"></param>
         /// <returns></returns>
-        public static ISugarQueryable<T> UpdLock<T>(this ISugarQueryable<T> obj)
+        public static ISugarQueryable<T> UpdLock1<T>(this ISugarQueryable<T> obj)
         {
             return obj.With("WITH(ROWLOCK,UPDLOCK)");
         }

+ 4 - 1
ServiceCenter/SqlSugars/SqlSugarHelper.cs

@@ -127,7 +127,10 @@ namespace ServiceCenter.SqlSugars
             try
             {
                 db.Connect.BeginTran(IsolationLevel.ReadCommitted);//开始事务
-                db.Connect.Ado.CommandTimeOut = 2;
+                if (_Default != "")
+                {
+                    db.Default.Ado.CommandTimeOut = 2;
+                }
                 act(db);//执行委托
                 db.Connect.CommitTran();//提交事务
             }

+ 4 - 4
业务工程/分拣库/WCS.Entity.Protocol/Station/StationEnum.cs

@@ -377,7 +377,7 @@ namespace WCS.Entity.Protocol.Station
         Res = 1 << 0,
 
         /// <summary>
-        /// AGV取货通知
+        /// AGV放货运行
         /// </summary>
         [Description("备用")]
         Res1 = 1 << 1,
@@ -389,19 +389,19 @@ namespace WCS.Entity.Protocol.Station
         Res2 = 1 << 2,
 
         /// <summary>
-        ///  AGV取货结束
+        ///  AGV取货通知
         /// </summary>
         [Description("备用")]
         Res3 = 1 << 3,
 
         /// <summary>
-        /// 备用
+        /// AGV取货运行
         /// </summary>
         [Description("备用")]
         Res4 = 1 << 4,
 
         /// <summary>
-        /// 备用
+        /// AGV取货结束
         /// </summary>
         [Description("备用")]
         Res5 = 1 << 5,

+ 0 - 1
业务工程/分拣库/WCS.WorkEngineering/Extensions/DeviceExtension.cs

@@ -180,7 +180,6 @@ namespace WCS.WorkEngineering.Extensions
         public static string GetBCRCode(this IBCR81 bCR)
         {
             var barcode = bCR.Content.RemoveEscapeCharacters();
-            if (barcode.IsNullOrWhiteSpace()) throw new KnownException($"扫码失败,内容为空", LogLevelEnum.High);
             return barcode;
         }
 

+ 17 - 12
业务工程/分拣库/WCS.WorkEngineering/Extensions/TaskExtension.cs

@@ -3,6 +3,7 @@ using ServiceCenter.Logs;
 using ServiceCenter.Redis;
 using ServiceCenter.SqlSugars;
 using SqlSugar;
+using WCS.Core;
 using WCS.Entity;
 using TaskStatus = WCS.Entity.TaskStatus;
 
@@ -88,7 +89,7 @@ namespace WCS.WorkEngineering.Extensions
             if (taskInfo.Status == TaskStatus.NewBuild) return;
 
             // 同步任务信息
-            var taskOld = db.Queryable<WCS_TaskOld>().UpdLock().Where(v => v.Id == taskInfo.ID).SplitTable(tabs => tabs.Take(2)).ToList().OrderByDescending(v => v.AddTime).First();
+            var taskOld = db.Queryable<WCS_TaskOld>().Where(v => v.Id == taskInfo.ID).SplitTable(tabs => tabs.Take(2)).ToList().OrderByDescending(v => v.AddTime).First();
             if (taskOld is not null)
             {
                 if (taskInfo.Status >= TaskStatus.Finish) taskInfo.CompleteOrCancelTasks(db);
@@ -114,7 +115,7 @@ namespace WCS.WorkEngineering.Extensions
         {
             if (taskInfo.Status is not Entity.TaskStatus.Finish and not Entity.TaskStatus.Cancel) throw new KnownException("任务未完成或取消,无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
             // 任务完成或取消,进行相关同步动作
-            var taskOld = db.Queryable<WCS_TaskOld>().UpdLock().Where(v => v.Id == taskInfo.ID).SplitTable(tabs => tabs.Take(2)).ToList().OrderByDescending(v => v.AddTime).First();
+            var taskOld = db.Queryable<WCS_TaskOld>().Where(v => v.Id == taskInfo.ID).SplitTable(tabs => tabs.Take(2)).ToList().OrderByDescending(v => v.AddTime).First();
             if (taskOld is not null)
             {
                 taskOld = taskInfo.Mapper<WCS_TaskOld, WCS_TaskInfo>();
@@ -189,10 +190,14 @@ namespace WCS.WorkEngineering.Extensions
         ///  初始化码垛信息
         /// </summary>
         /// <param name="task"></param>
-        public static void InitStackStructure(this WCS_TaskInfo task, SqlSugarScopeProvider db)
+        public static void InitStackStructure(this WCS_TaskInfo task, SqlSugarScopeProvider db, World world)
         {
             var billBomsetgrp = db.Queryable<BillBomsetgrp>().Single(x => x.IsStop == 0 && x.BomCode.Contains(task.MatCode));
-            if (billBomsetgrp == null) throw new KnownException($"物料规格[{task.MatCode}]无可用码垛垛形", LogLevelEnum.Mid);
+            if (billBomsetgrp == null)
+            {
+                world.Log($"物料规格[{task.MatCode}]无可用码垛垛形");
+                return;
+            };
             var billBomsetinfos = db.Queryable<BillBomsetinfo>().Where(x => x.BomSetHdrId == billBomsetgrp.Id).ToList();
 
             //开始构造垛形信息
@@ -215,7 +220,7 @@ namespace WCS.WorkEngineering.Extensions
             {
                 var layerNo = item.Key <= 6 ? 1 : 2;
                 //获取层信息
-                var palletizingLayer = db.Queryable<WCS_PalletizingLayer>().UpdLock().Single(x => x.PalletizingId == palletizing.Id && x.LayerNo == layerNo);
+                var palletizingLayer = db.Queryable<WCS_PalletizingLayer>().Single(x => x.PalletizingId == palletizing.Id && x.LayerNo == layerNo);
 
                 if (palletizingLayer == null)
                 {
@@ -229,7 +234,7 @@ namespace WCS.WorkEngineering.Extensions
                 }
 
                 //获取行信息
-                var palletizingRow = db.Queryable<WCS_PalletizingRow>().UpdLock().Single(x => x.PalletizingLayerId == palletizingLayer.Id && x.RowNo == item.Key);
+                var palletizingRow = db.Queryable<WCS_PalletizingRow>().Single(x => x.PalletizingLayerId == palletizingLayer.Id && x.RowNo == item.Key);
                 if (palletizingRow == null)
                 {
                     palletizingRow = new WCS_PalletizingRow()
@@ -244,14 +249,14 @@ namespace WCS.WorkEngineering.Extensions
 
                 //重新查询最新的数据
                 var layer = palletizingLayer;
-                palletizingLayer = db.Queryable<WCS_PalletizingLayer>().UpdLock().Single(x => x.Id == layer.Id);
+                palletizingLayer = db.Queryable<WCS_PalletizingLayer>().Single(x => x.Id == layer.Id);
                 var row = palletizingRow;
-                palletizingRow = db.Queryable<WCS_PalletizingRow>().UpdLock().Single(x => x.Id == row.Id);
+                palletizingRow = db.Queryable<WCS_PalletizingRow>().Single(x => x.Id == row.Id);
 
                 //构造位信息
                 foreach (var loc in item)
                 {
-                    var palletizingLoc = db.Queryable<WCS_PalletizingLoc>().UpdLock().Single(x => x.PalletizingRowId == palletizingRow.Id && x.XYNo == loc.XYNo);
+                    var palletizingLoc = db.Queryable<WCS_PalletizingLoc>().Single(x => x.PalletizingRowId == palletizingRow.Id && x.XYNo == loc.XYNo);
 
                     if (palletizingLoc == null)
                     {
@@ -275,13 +280,13 @@ namespace WCS.WorkEngineering.Extensions
                     db.UpdateableRowLock(palletizingRow).ExecuteCommand();
                 }
                 //更新行信息
-                palletizingRow = db.Queryable<WCS_PalletizingRow>().UpdLock().Includes(x => x.Locs).Single(x => x.Id == row.Id);
+                palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == row.Id);
                 palletizingRow.QtyMaxCount = palletizingRow.Locs.Count(x => !x.IsEmpty);
                 palletizingRow.IsEmpty = palletizingRow.QtyMaxCount <= 0;
                 palletizingRow.MatCodeList = palletizingRow.Locs.Select(x => x.MatCode).ToList().GetMatList();
                 db.UpdateableRowLock(palletizingRow).ExecuteCommand();
                 //更新层信息
-                palletizingLayer = db.Queryable<WCS_PalletizingLayer>().UpdLock().Includes(x => x.Rows, l => l.Locs).Single(x => x.Id == layer.Id);
+                palletizingLayer = db.Queryable<WCS_PalletizingLayer>().Includes(x => x.Rows, l => l.Locs).Single(x => x.Id == layer.Id);
                 var count = palletizingLayer.Rows.Count(x => !x.IsEmpty); //计算所有不空数量
                 palletizingLayer.IsEmpty = count <= 0;
                 palletizingLayer.RowCountQty = palletizingLayer.Rows.Count;
@@ -292,7 +297,7 @@ namespace WCS.WorkEngineering.Extensions
             }
 
             var palletizing1 = palletizing;
-            palletizing = db.Queryable<WCS_Palletizing>().UpdLock().Includes(x => x.Layers, r => r.Rows, l => l.Locs).Single(x => x.Id == palletizing1.Id);
+            palletizing = db.Queryable<WCS_Palletizing>().Includes(x => x.Layers, r => r.Rows, l => l.Locs).Single(x => x.Id == palletizing1.Id);
             //计算垛形信息
             var goods = palletizing.Layers.Select(x => x.Rows).SelectMany(x => x).Select(x => x.Locs).SelectMany(x => x).ToList();
             palletizing.CountQty = goods.Count(x => !x.IsEmpty);

+ 9 - 7
业务工程/分拣库/WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -1,9 +1,9 @@
 using Newtonsoft.Json;
 using PlcSiemens.Core.Extension;
+using ServiceCenter.Extensions;
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
-using ServiceCenter.Extensions;
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.Station;
@@ -57,7 +57,7 @@ namespace WCS.WorkEngineering.Systems
                                     //取货点安全交互
                                     case AGVTaskStatus.RequestOrPermission2 when agv.Status != AGVTaskStatus.RequestOrPermission2:
                                         {
-                                            var taskInfo = db.Default.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.ID == agv.TaskId);
+                                            var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == agv.TaskId);
                                             agv.Status = AGVTaskStatus.RequestOrPermission2;
                                             db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                             taskInfo.AddWCS_TASK_DTL(db.Default, "agv", $"允许AGV任务{agv.ID}在站台{agv.Station}取货");
@@ -72,17 +72,19 @@ namespace WCS.WorkEngineering.Systems
                                             break;
                                         }
                                     case AGVTaskStatus.LeaveGet when agv.Status != AGVTaskStatus.LeaveGet:
+                                        World.Log($"AGV取货结束:开始{agv.ID}--{agv.Station}");
                                         var devinfo = new Device<IStation520>(Device.All.First(x => x.Code == agv.Station), World);
-                                        devinfo.Data.CmdType = StationCmd.Res3;
+                                        devinfo.Data.CmdType = StationCmd.Res5;
                                         agv.Status = AGVTaskStatus.LeaveGet;
                                         db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                        World.Log($"AGV取货结束:结束{agv.ID}--{agv.Station}");
                                         break;
                                     //完成任务
                                     case AGVTaskStatus.MissionCompleted when agv.Status != AGVTaskStatus.MissionCompleted:
                                         {
                                             if (agv.TaskType is AGVTaskType.CallForMaterial or AGVTaskType.ForkliftFilling or AGVTaskType.CallMaterial)
                                             {
-                                                var taskInfo = db.Default.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.AgvTaskID == agv.ID);
+                                                var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
                                                 if (taskInfo == null) throw new Exception($"未找到AGV任务{agv.ID}对应WCS任务");
                                                 //更新AGV任务状态
                                                 agv.Status = AGVTaskStatus.MissionCompleted;
@@ -146,7 +148,7 @@ namespace WCS.WorkEngineering.Systems
                                     //巷道分配
                                     case AGVTaskStatus.RequestOrPermission1 when agv.Status != AGVTaskStatus.Complete1:
                                         {
-                                            var task = db.Default.Queryable<WCS_TaskOld>().UpdLock().Where(x => x.Id == agv.TaskId).SplitTable(x => x.Take(2)).First();
+                                            var task = db.Default.Queryable<WCS_TaskOld>().Where(x => x.Id == agv.TaskId).SplitTable(x => x.Take(2)).First();
                                             if (task == null) throw new Exception($"未找到对应的WCS任务{agv.TaskId}");
 
                                             //获取当前任务可以去的目标地址
@@ -166,7 +168,7 @@ namespace WCS.WorkEngineering.Systems
                                                     break;
 
                                                 case "2S":
-                                                    positionList.AddRange(new List<string>() { /*"3101", "3105", "3109", "3113"*/"2501", "2505", "2509", "2513" });
+                                                    positionList.AddRange(new List<string>() { "3101", "3105", "3109", "3113"/*"2501", "2505", "2509", "2513"*/ });
                                                     break;
 
                                                 case "3N":
@@ -179,7 +181,7 @@ namespace WCS.WorkEngineering.Systems
                                             }
 
                                             //当前可用地址正在执行的任务
-                                            var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().UpdLock().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && positionList.Contains(v.Station))
+                                            var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && positionList.Contains(v.Station))
                                                 .SplitTable(v => v.Take(2)).ToList();
                                             var agvPositionList = agvs.Select(x => x.Station).Distinct();
                                             //World.Log($"执行中的AGV任务目标地址:{JsonConvert.SerializeObject(agvPositionList)}");

+ 9 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/DeviceWriteSystem.cs

@@ -1,8 +1,10 @@
 using WCS.Core;
+using WCS.Entity.Protocol.RGV;
 using WCS.Entity.Protocol.SRM;
 using WCS.Entity.Protocol.Station;
 using WCS.WorkEngineering.Extensions;
 using WCS.WorkEngineering.Worlds;
+using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
 
 namespace WCS.WorkEngineering.Systems
 {
@@ -19,13 +21,16 @@ namespace WCS.WorkEngineering.Systems
 
         private Dictionary<string, SRM> Srms;
 
+        private Dictionary<string, RGV> Rgvs;
+
         /// <summary>
         ///  构造函数
         /// </summary>
         public DeviceWriteSystem()
         {
-            Convs = Device.All.Where(v => v.Code is "1602" or "1661" or "1666" or "1606" or "666" or "1632").Select(v => new Station(v, this.World)).ToDictionary(v => v.Entity.Code, v => v);
+            Convs = Device.All.Where(v => v.HasFlag(DeviceFlags.拆盘机, DeviceFlags.桁架码垛位, DeviceFlags.环形库码垛工位)).Select(v => new Station(v, this.World)).ToDictionary(v => v.Entity.Code, v => v);
             //Srms = Device.All.Where(v => v.HasProtocol<ISRM520>()).Select(v => new SRM(v, this.World)).ToDictionary(v => v.Entity.Code, v => v);
+            Rgvs = Device.All.Where(v => v.Code.Contains("RGV")).Select(v => new RGV(v, this.World)).ToDictionary(v => v.Entity.Code, v => v);
         }
 
         protected override void Do(DeviceWriteInfo info)
@@ -52,6 +57,9 @@ namespace WCS.WorkEngineering.Systems
                     break;
 
                 case DeviceTypeEnum.RGV:
+                    var rgv = Rgvs[info.Code];
+                    type = typeof(IRGV520).Assembly.GetTypes().Where(v => v.Name == info.Protocol).First();
+                    obj = rgv.Entity.Protocol(type, this.World);
                     break;
             }
             var p = type.GetProperty(info.Property);

+ 4 - 4
业务工程/分拣库/WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -37,7 +37,7 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(db =>
             {
                 //获取所有的新建任务,组盘任务不需要
-                taskInfos = db.Default.Queryable<WCS_TaskInfo>().ReadPast().Where(x => x.Status == 0).ToList().Where(x => x.Type != TaskType.SetPlate || (x.Type == TaskType.SetPlate && x.AddrFrom != "Robot")).Select(x => x.ID).ToList();
+                taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(x => x.Status == 0).ToList().Where(x => x.Type != TaskType.SetPlate || (x.Type == TaskType.SetPlate && x.AddrFrom != "Robot")).Select(x => x.ID).ToList();
             });
             if (!taskInfos.Any())
             {
@@ -49,7 +49,7 @@ namespace WCS.WorkEngineering.Systems
                 {
                     SqlSugarHelper.Do(db =>
                     {
-                        var task = db.Default.Queryable<WCS_TaskInfo>().UpdLock().Where(t => t.ID == item).First() ?? throw new Exception($"未找到对应的WCS任务[{item}]");
+                        var task = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.ID == item).First() ?? throw new Exception($"未找到对应的WCS任务[{item}]");
                         switch (task.Type)
                         {
                             case TaskType.SetPlate:
@@ -150,8 +150,8 @@ namespace WCS.WorkEngineering.Systems
 
                                             //开始计算当前这个任务要从哪个站台出
                                             //计算两个站台小于取货完成数量的AGV任务
-                                            var agv1 = db.Default.Queryable<WCS_AgvTaskInfo>().ReadPast().Where(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[0]).SplitTable(x => x.Take(2)).Count();
-                                            var agv2 = db.Default.Queryable<WCS_AgvTaskInfo>().ReadPast().Where(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[1]).SplitTable(x => x.Take(2)).Count();
+                                            var agv1 = db.Default.Queryable<WCS_AgvTaskInfo>().Where(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[0]).SplitTable(x => x.Take(2)).Count();
+                                            var agv2 = db.Default.Queryable<WCS_AgvTaskInfo>().Where(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[1]).SplitTable(x => x.Take(2)).Count();
                                             task.SrmStation = "";
                                             task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0];
                                         }

+ 60 - 16
业务工程/分拣库/WCS.WorkEngineering/Systems/RGVSystems.cs

@@ -1,4 +1,4 @@
-using System.Collections;
+using PlcSiemens.Core.Extension;
 using ServiceCenter.Extensions;
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
@@ -47,10 +47,23 @@ namespace WCS.WorkEngineering.Systems
         {
             try
             {
-                if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
-                if (obj.Data2.WorkMode != RGVWorkMode.Automatic) return;
-                if (obj.Data.RES1 == 1) return; //wcs任务完成确认信号未清除
+                if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
+                {
+                    World.Log($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
+                    return;
+                }
 
+                if (obj.Data2.WorkMode != RGVWorkMode.Automatic)
+                {
+                    World.Log(obj.Data2.WorkMode.GetDescription());
+                    return;
+                }
+                //wcs任务完成确认信号未清除
+                if (obj.Data.RES1 == 1)
+                {
+                    World.Log("wcs任务完成确认信号未清除");
+                    return;
+                }
                 if (obj.Data2.Status.HasFlag(RGVStatus.Taskfinishi))
                 {
                     switch (obj.Data2.CmdType)
@@ -58,6 +71,11 @@ namespace WCS.WorkEngineering.Systems
                         case RGVCmdType.PickGoods: //单独取货任务完成,默认只有空托盘才会下发单独取货任务
                                                    //开始申请读码信息
                             var bcrCode = obj.Data3.GetBCRCode();
+                            if (bcrCode.IsNullOrWhiteSpace())
+                            {
+                                World.Log("扫码失败,内容为空", LogLevelEnum.Mid);
+                                return;
+                            }
                             var taskNumber = 0;
                             SqlSugarHelper.Do(_db =>
                             {
@@ -66,8 +84,12 @@ namespace WCS.WorkEngineering.Systems
                                 if (dev.HasFlag(DeviceFlags.桁架码垛位))
                                 {
                                     //开始绑定任务,并下发新的任务信息到小车
-                                    var palletizingInfo = db.Queryable<WCS_Palletizing>().UpdLock().Single(x => x.Id == obj.Data2.TaskNumber);
-                                    if (palletizingInfo == null) return;
+                                    var palletizingInfo = db.Queryable<WCS_Palletizing>().Single(x => x.Id == obj.Data2.TaskNumber);
+                                    if (palletizingInfo == null)
+                                    {
+                                        World.Log($"未找到对应的码垛信息{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
+                                        return;
+                                    }
                                     palletizingInfo.PalleCode = bcrCode;
                                     db.UpdateableRowLock(palletizingInfo).ExecuteCommand();
                                     taskNumber = palletizingInfo.Id;
@@ -75,15 +97,25 @@ namespace WCS.WorkEngineering.Systems
                                 else if (dev.HasFlag(DeviceFlags.环形库码垛工位))
                                 {
                                     //开始处理对应的搬运任务信息
-                                    var task = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.Type == TaskType.Delivery && x.ID == obj.Data2.TaskNumber && x.AddrTo == obj.Data2.DestPosition.ToString());
-                                    if (task == null) throw new KnownException($"未找到对应的任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
+                                    var task = db.Queryable<WCS_TaskInfo>().First(x => x.Type == TaskType.Delivery && x.ID == obj.Data2.TaskNumber && x.AddrTo == obj.Data2.DestPosition.ToString());
+                                    if (task == null)
+                                    {
+                                        World.Log($"未找到对应的搬运任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
+                                        return;
+                                    }
+
                                     task.BarCode = bcrCode;
                                     db.UpdateableRowLock(task).ExecuteCommand();
                                     task.AddWCS_TASK_DTL(db, obj.Entity.Code, obj.Data2.DestPosition.ToString(), $"环形库码垛位{obj.Data2.DestPosition}搬运任务绑定条码信息{bcrCode}");
                                     taskNumber = task.ID;
                                 }
                             });
-                            if (taskNumber == 0) return;
+                            if (taskNumber == 0)
+                            {
+                                World.Log($"取货完成处理失败", LogLevelEnum.Mid);
+                                return;
+                            }
+
                             //清空起始点信息
                             var staDev = new Device<IStation520>(Device.All.FirstOrDefault(x => x.Code == obj.Data2.DestPosition.ToString())!, World);
                             staDev.Data.TaskNumber = 0;
@@ -159,7 +191,8 @@ namespace WCS.WorkEngineering.Systems
                             }
                             catch (Exception e)
                             {
-                                throw new KnownException($"处理小车放货完成是出现错误:{e.Message}-{e.StackTrace}", LogLevelEnum.High);
+                                World.Log($"处理小车放货完成是出现错误:{e.Message}-{e.StackTrace}");
+                                return;
                             }
                             obj.Data.RES1 = 1;
                             break;
@@ -179,23 +212,30 @@ namespace WCS.WorkEngineering.Systems
 
                             if (statDev.HasFlag(DeviceFlags.二次码垛RGV取货口))
                             {
-                                var dev = new Device<IStation520, IStation521, ITruss530>(statDev, World);
+                                var dev = new Device<IStation520, IStation521, ITruss530>(Device.All.FirstOrDefault(x => x.Code == obj.Data.DestPosition.ToString())!, World);
                                 WCS_Palletizing pall = new WCS_Palletizing();
                                 //获取码垛信息
                                 SqlSugarHelper.Do(_db =>
                                 {
                                     var db = _db.Default;
                                     pall = db.Queryable<WCS_Palletizing>().Includes(x => x.Layers, x => x.Rows, x => x.Locs)
-                                                                                          .First(x => x.Id == obj.Data2.TaskNumber) ?? throw new KnownException($"未找到对应任务{obj.Data2.TaskNumber}", LogLevelEnum.High);
+                                                                                          .First(x => x.Id == obj.Data2.TaskNumber);
                                 });
+                                if (pall == null)
+                                {
+                                    World.Log($"未找到对应任务{obj.Data2.TaskNumber}");
+                                }
                                 var pallLoc = pall.Layers.SelectMany(x => x.Rows).SelectMany(x => x.Locs).Select(x => new { XYNo = x.XYNo.ToShort(), x.Finish }).ToList();
 
-                                //var pallLoc1 = new BitArray(pallLoc.Where(x => x.XYNo is >= 1 and <= 16).OrderBy(x => x.XYNo).Select(x => x.Finish).ToArray());
-                                //var a = pallLoc1.;
                                 dev.Data3.MaxQuantity = pall.CountQty.ToShort();
                                 dev.Data3.Quantity = pallLoc.Count(x => x.Finish).ToShort();
                                 dev.Data3.Type = pall.ShortCode;
                                 dev.Data3.VoucherNo++;
+
+                                var destDev = new Device<IStation520, IStation521>(statDev, World);
+                                destDev.Data.TaskNumber = 0;
+                                destDev.Data.GoodsStart = 0;
+                                destDev.Data.GoodsEnd = 0;
                             }
                             else
                             {
@@ -214,7 +254,11 @@ namespace WCS.WorkEngineering.Systems
                     return;
                 }
 
-                if (obj.Data2.SystemStatus != RGVSystemStatus.空闲) return;
+                if (obj.Data2.SystemStatus != RGVSystemStatus.空闲)
+                {
+                    World.Log(obj.Data2.SystemStatus.GetDescription());
+                    return;
+                }
 
                 if (obj.Data2.Status.HasFlag(RGVStatus.RES1)) //离开非安全区域
                 {
@@ -288,7 +332,7 @@ namespace WCS.WorkEngineering.Systems
                     SqlSugarHelper.Do(_db =>
                     {
                         var db = _db.Default;
-                        var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(p => p.ID == dev.Data.TaskNumber && p.Status == TaskStatus.ConveyorExecution);
+                        var taskInfo = db.Queryable<WCS_TaskInfo>().First(p => p.ID == dev.Data.TaskNumber && p.Status == TaskStatus.ConveyorExecution);
                         if (taskInfo == null) return;
                         taskInfo.Status = TaskStatus.RgvExecution;
                         taskInfo.AddrNext = obj.Entity.Code;

+ 33 - 10
业务工程/分拣库/WCS.WorkEngineering/Systems/SrmSystems.cs

@@ -73,7 +73,7 @@ namespace WCS.WorkEngineering.Systems
                     #region 获取完成任务
 
                     //根据DB521任务号获取对应任务
-                    var task = db.Default.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.ID == obj.Data2.TaskFinishiId) ?? throw new KnownException($"堆垛机完成任务号{obj.Data2.TaskFinishiId},在WCS当前任务信息中未找到对应任务。", LogLevelEnum.High);
+                    var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskFinishiId) ?? throw new KnownException($"堆垛机完成任务号{obj.Data2.TaskFinishiId},在WCS当前任务信息中未找到对应任务。", LogLevelEnum.High);
                     if (task.Status != Entity.TaskStatus.StackerExecution) throw new KnownException($"任务{task.ID}状态是{task.Status.GetDescription()}.堆垛机完成任务需要对应任务状态处于堆垛机执行中", LogLevelEnum.High);
 
                     #endregion 获取完成任务
@@ -103,7 +103,7 @@ namespace WCS.WorkEngineering.Systems
                                 {
                                     case OutTypeEnum.自动出库任务 or OutTypeEnum.全自动手动出库任务:
 
-                                        if (task.SrmStation is "1601" or "1605" or "1611" or "1615" or "1632")
+                                        if (task.SrmStation is "1601" or "1605" or "1611" or "1615" or "1631")
                                         {
                                             task.Status = Entity.TaskStatus.Finish;
                                             var dev = new Station(Device.All.FirstOrDefault(v => v.Code == task.SrmStation) ?? throw new KnownException($"未找到{task.SrmStation}信息", LogLevelEnum.High), this.World);
@@ -161,9 +161,23 @@ namespace WCS.WorkEngineering.Systems
             #endregion 处理完成任务
 
             //堆垛机是否可以下发任务
-            if (obj.Data2.VoucherNo != obj.Data.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo},DB521:{obj.Data2.VoucherNo}", LogLevelEnum.Mid);
-            if (obj.Data2.AutoStatus != SrmAutoStatus.Automatic) throw new KnownException($"堆垛机处于{obj.Data2.AutoStatus.GetDescription()}模式", LogLevelEnum.Low);
-            if (obj.Data2.RunStatus != SrmRunStatus.Idle) throw new KnownException($"堆垛机处于{obj.Data2.RunStatus.GetDescription()}状态", LogLevelEnum.High);
+            if (obj.Data2.VoucherNo != obj.Data.VoucherNo)
+            {
+                World.Log($"凭证号不一致,DB520:{obj.Data.VoucherNo},DB521:{obj.Data2.VoucherNo}");
+                return;
+            }
+
+            if (obj.Data2.AutoStatus != SrmAutoStatus.Automatic)
+            {
+                World.Log($"堆垛机处于{obj.Data2.AutoStatus.GetDescription()}模式");
+                return;
+            }
+
+            if (obj.Data2.RunStatus != SrmRunStatus.Idle)
+            {
+                World.Log($"堆垛机处于{obj.Data2.RunStatus.GetDescription()}状态");
+                return;
+            }
 
             //默认没有移库任务
             var isTransfer = false;
@@ -202,7 +216,7 @@ namespace WCS.WorkEngineering.Systems
                 SqlSugarHelper.Do(db =>
                    {
                        //获取一条当前堆垛机优先级最高的新建移库任务
-                       var task = db.Default.Queryable<WCS_TaskInfo>().UpdLock().Where(v => v.Device == obj.Entity.Code && v.Type == TaskType.TransferDepot && v.Status == Entity.TaskStatus.NewBuild)
+                       var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Device == obj.Entity.Code && v.Type == TaskType.TransferDepot && v.Status == Entity.TaskStatus.NewBuild)
                                                                       .OrderByDescending(v => v.Priority)
                                                                       .First() ?? throw new KnownException("未找到移库任务", LogLevelEnum.High);
                        //任务状态改为堆垛机执行中
@@ -263,13 +277,18 @@ namespace WCS.WorkEngineering.Systems
 
                 //获取有货的设备
                 arrIn = arrIn.Where(v => (v.Data.TaskNumber > 0 || v.Data2.TaskNumber > 0) && v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.Run)).ToList();
-                if (!arrIn.Any()) throw new KnownException($"[{obj.Entity.Code}]等待入库任务输送到位", LogLevelEnum.Mid);
+                if (!arrIn.Any())
+                {
+                    World.Log($"[{obj.Entity.Code}]等待入库任务输送到位");
+                    return;
+                }
+
                 WCS_TaskInfo taskInfo = null;
                 Station station = null;
                 SqlSugarHelper.Do(db =>
                 {
                     //根据有货设备的任务号获取所有类型为入库状态为输送机执行中的任务
-                    var tasks = db.Default.Queryable<WCS_TaskInfo>().UpdLock().Where(v => (v.Type == TaskType.EnterDepot || v.Type == TaskType.EmptyInit)
+                    var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => (v.Type == TaskType.EnterDepot || v.Type == TaskType.EmptyInit)
                                                                               && (v.Status == TaskStatus.ConveyorExecution || v.Status == TaskStatus.RgvExecution || v.Status == TaskStatus.RgvCompleted)
                                                                               && (arrIn.Select(p => p.Data.TaskNumber).Contains(v.ID) || arrIn.Select(p => p.Data2.TaskNumber).Contains(v.ID))).ToList();
                     if (!tasks.Any()) throw new KnownException("无可用任务", LogLevelEnum.Mid);
@@ -338,7 +357,11 @@ namespace WCS.WorkEngineering.Systems
                                                 && !v.Data3.Status.HasFlag(StationStatus.UnassignedTask) //未分配任务
                                                 && v.Data3.Status.HasFlag(StationStatus.Auto)).ToList(); //自动
 
-                if (!arrOut.Any()) throw new KnownException($"[{obj.Entity.Code}]无可用放货站台", LogLevelEnum.Mid);
+                if (!arrOut.Any())
+                {
+                    World.Log($"[{obj.Entity.Code}]无可用放货站台");
+                    return;
+                }
 
                 WCS_TaskInfo taskInfo = null;
 
@@ -347,7 +370,7 @@ namespace WCS.WorkEngineering.Systems
                    var allOutCode = arrOut.Select(v => v.Entity.Code).ToList();
 
                    //按条件先后排序获取一条排序后第一条结果1.优先级2.所在楼层与本次优先执行楼层
-                   var task = db.Default.Queryable<WCS_TaskInfo>().UpdLock().Where(v => v.Type == TaskType.OutDepot && v.Status == TaskStatus.WaitingToExecute)
+                   var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Type == TaskType.OutDepot && v.Status == TaskStatus.WaitingToExecute)
                                                                   .Where(v => allOutCode.Contains(v.SrmStation))
                                                                   .OrderByDescending(v => v.Priority)
                                                                   .OrderByDescending(v => v.Floor == floor ? 1 : 0)

+ 4 - 4
业务工程/分拣库/WCS.WorkEngineering/Systems/UpLoadSystems.cs

@@ -32,7 +32,7 @@ namespace WCS.WorkEngineering.Systems
                 var nowTime = DateTime.Now;
 
                 var db = _db.Default;
-                var taskList = db.Queryable<WCS_TaskInfo>().ReadPast().Where(x => x.Type == TaskType.OutDepot && x.Status == TaskStatus.ConveyorExecution && x.Uploaded != TaskStatus.ConveyorExecution).ToList();
+                var taskList = db.Queryable<WCS_TaskInfo>().Where(x => x.Type == TaskType.OutDepot && x.Status == TaskStatus.ConveyorExecution && x.Uploaded != TaskStatus.ConveyorExecution).ToList();
 
                 foreach (var task in taskList)
                 {
@@ -44,7 +44,7 @@ namespace WCS.WorkEngineering.Systems
                 //拆分防止锁表
                 foreach (var taskId in taskIdList)
                 {
-                    var task = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.ID == taskId);
+                    var task = db.Queryable<WCS_TaskInfo>().First(x => x.ID == taskId);
                     task.Uploaded = TaskStatus.ConveyorExecution;
                     task.EditTime = DateTime.Now;
                     db.UpdateableRowLock(task).ExecuteCommand();
@@ -58,7 +58,7 @@ namespace WCS.WorkEngineering.Systems
                 var taskIdList = new List<int>();
                 var nowTime = DateTime.Now;
                 var db = _db.Default;
-                var taskList = db.Queryable<WCS_TaskOld>().ReadPast()
+                var taskList = db.Queryable<WCS_TaskOld>()
                     .Where(x =>
                                 ((x.Type == TaskType.SetPlate && x.WarehouseCode.Contains("R"))
                                  || ((x.Type == TaskType.EnterDepot || x.Type == TaskType.OutDepot) && !x.WarehouseCode.Contains("R")))
@@ -75,7 +75,7 @@ namespace WCS.WorkEngineering.Systems
                 //拆分防止锁表
                 foreach (var taskId in taskIdList)
                 {
-                    var task = db.Queryable<WCS_TaskOld>().UpdLock().Where(x => x.Id == taskId).SplitTable(x => x.Take(2)).First();
+                    var task = db.Queryable<WCS_TaskOld>().Where(x => x.Id == taskId).SplitTable(x => x.Take(2)).First();
                     task.Uploaded = TaskStatus.Finish;
                     task.EditTime = nowTime;
                     db.UpdateableRowLock(task).SplitTable(x => x.Take(2)).ExecuteCommand();

+ 9 - 9
业务工程/分拣库/WCS.WorkEngineering/Systems/一楼叠盘机入库.cs

@@ -1,7 +1,7 @@
-using ServiceCenter.Logs;
+using ServiceCenter.Extensions;
+using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
-using ServiceCenter.Extensions;
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.Station;
@@ -34,16 +34,16 @@ namespace WCS.WorkEngineering.Systems
             {
                 string barcode = "TPB";
                 var palletType = PalletType.PalletNo09;
-                if (obj.Entity.Code is "2527" or "2727" or "2927" or "3127" or "3327" or "3527")
-                {
-                    palletType = PalletType.Pallet09;
-                    barcode = "TPA";
-                }
+                //if (obj.Entity.Code is "2527" or "2727" or "2927" or "3127" or "3327" or "3527")
+                //{
+                //    palletType = PalletType.Pallet09;
+                //    barcode = "TPA";
+                //}
 
                 SqlSugarHelper.Do(_db =>
                 {
                     var db = _db.Default;
-                    var isTask = db.Queryable<WCS_TaskInfo>().UpdLock().Any(v => v.BarCode.Contains(barcode) && v.AddrFrom == obj.Entity.Code && v.Type == TaskType.EnterDepot);
+                    var isTask = db.Queryable<WCS_TaskInfo>().Any(v => v.BarCode.Contains(barcode) && v.AddrFrom == obj.Entity.Code && v.Type == TaskType.EnterDepot);
                     //验证是否有对应的任务
                     if (!isTask)
                     {
@@ -57,7 +57,7 @@ namespace WCS.WorkEngineering.Systems
                         if (res.ResCode == WebApi.Models.WMS.Response.ResponseStatusCodeEnum.Sucess) return;
                     }
                     //找到对应的任务
-                    var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.BarCode.Contains(barcode) && v.AddrFrom == obj.Entity.Code && v.Type == TaskType.EnterDepot);
+                    var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.BarCode.Contains(barcode) && v.AddrFrom == obj.Entity.Code && v.Type == TaskType.EnterDepot);
                     if (taskInfo.Status == Entity.TaskStatus.WaitingToExecute)
                     {
                         var tunnel = obj.Entity.Targets.FirstOrDefault(v => v.HasFlag(DeviceFlags.巷道));

+ 12 - 5
业务工程/分拣库/WCS.WorkEngineering/Systems/一楼扫码入库.cs

@@ -1,7 +1,8 @@
-using ServiceCenter.Logs;
+using PlcSiemens.Core.Extension;
+using ServiceCenter.Extensions;
+using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
-using ServiceCenter.Extensions;
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.BCR;
@@ -33,11 +34,17 @@ namespace WCS.WorkEngineering.Systems
             WCS_TaskInfo task = null;//处理完成的任务
             try
             {
+                //获取托盘条码
+                var barcode = obj.Data5.GetBCRCode();
+                if (barcode.IsNullOrWhiteSpace())
+                {
+                    World.Log("扫码失败,内容为空", LogLevelEnum.Mid);
+                    return;
+                }
                 SqlSugarHelper.Do(_db =>
                 {
                     var db = _db.Default;
-                    //获取托盘条码
-                    var barcode = obj.Data5.GetBCRCode();
+
                     //var barcode = "TAP00001";
                     //验证是否有对应的任务
                     if (!db.Queryable<WCS_TaskInfo>().Any(v => v.BarCode == barcode && v.Type == TaskType.EnterDepot))
@@ -55,7 +62,7 @@ namespace WCS.WorkEngineering.Systems
                         if (res.ResCode == WebApi.Models.WMS.Response.ResponseStatusCodeEnum.Sucess) return;
                     }
                     //找到对应的任务
-                    var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.BarCode == barcode && v.Type == TaskType.EnterDepot);
+                    var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.BarCode == barcode && v.Type == TaskType.EnterDepot);
                     if (taskInfo.Status == Entity.TaskStatus.WaitingToExecute)
                     {
                         var tunnel = obj.Entity.Targets.FirstOrDefault(v => v.HasFlag(DeviceFlags.巷道));

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/分拣主线/满轮主线预写入目标地址.cs

@@ -53,7 +53,7 @@ namespace WCS.WorkEngineering.Systems
                 {
                     World.Log($"{bcrCode}:路径错误,当前位置{obj.Entity.Code},目标位置:{srmCode}", LogLevelEnum.High);
                     continue;
-                }
+                }   
                 var next = path.Points[1].Code;
                 WCS_TaskInfo taskInfo = null;
 

+ 30 - 29
业务工程/分拣库/WCS.WorkEngineering/Systems/分拣支线/桁架分流点.cs

@@ -40,7 +40,7 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                var task = db.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.ID == obj.Data2.TaskNumber && v.Status == TaskStatus.WaitingToExecute) ?? throw new KnownException($"未找到对应的WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
+                var task = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == TaskStatus.WaitingToExecute) ?? throw new KnownException($"未找到对应的WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
                 if (Allot(db, task, obj)) taskInfo = task;
             });
 
@@ -49,6 +49,8 @@ namespace WCS.WorkEngineering.Systems
             obj.Data.TaskNumber = obj.Data2.TaskNumber;
             obj.Data.TaskNumber = obj.Data2.TaskNumber;
             obj.Data.GoodsStart = obj.Entity.Code.ToShort();
+            obj.Data.GoodsStart = obj.Entity.Code.ToShort();
+            obj.Data.GoodsEnd = taskInfo.AddrNext.ToShort();
             obj.Data.GoodsEnd = taskInfo.AddrNext.ToShort();
             obj.Data.VoucherNo++;
             World.Log($"执行记录:任务号[{obj.Data2.TaskNumber}][{obj.Data.VoucherNo}]");
@@ -59,7 +61,6 @@ namespace WCS.WorkEngineering.Systems
             return dev.HasFlag(Extensions.DeviceFlags.桁架分流点);
         }
 
-
         /// <summary>
         ///  计算去向
         /// </summary>
@@ -93,7 +94,7 @@ namespace WCS.WorkEngineering.Systems
                     break;
             }
             var cacheLineCodes = cacheLineDevList.Select(x => x.Code.ToShort());
-            var cacheLineList = db.Queryable<WCS_CacheLine>().UpdLock().Includes(x => x.Locations).ToList();
+            var cacheLineList = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).ToList();
 
             #region 跟据缓存信息寻找可以到达的缓存点
 
@@ -105,7 +106,7 @@ namespace WCS.WorkEngineering.Systems
             var cacheLoc = cacheLine?.Locations.Where(x => x is { InStock: false, IsEmpty: false }).MinBy(x => x.XYNo);
             if (cacheLoc != null)
             {
-                cacheLoc = db.Queryable<WCS_CacheLineLoc>().UpdLock().Single(x => x.Id == cacheLoc.Id);
+                cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
                 cacheLoc.InStock = true;
                 cacheLoc.TaskId = taskInfo.ID;
                 cacheLoc.EditTime = DateTime.Now;
@@ -131,31 +132,31 @@ namespace WCS.WorkEngineering.Systems
             if (devCode == 0)
             {
                 World.Log($"无可用线体:{taskInfo.ID}");
-                //var endTime = DateTime.Now.AddMinutes(-10);
-                ////找一个当前时间最早且已超过25分钟未码垛的码垛信息半托入库
-                ////未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
-                //var palletizing = db.Queryable<WCS_Palletizing>()
-                //    .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
-                //    .Where(x => !x.Finish && x.WarehouseCode == taskInfo.WarehouseCode && x.Layers.Any(l => l.Rows.Any(r => r.Finish)))
-                //    .Where(x => x.EditTime < endTime).ToList()
-                //    .MinBy(x => x.AddTime);
-                //cacheLineList = db.Queryable<WCS.Entity.WCS_CacheLine>().Where(x => x.WarehouseCode == taskInfo.WarehouseCode && x.IsTruss).ToList();
-
-                //if (palletizing != null && !cacheLineList.Any())
-                //{
-                //    var dev = Device.All.Where(x => x.Code == palletizing.PalletizingStation).Select(x => new Device<ITruss530>(x, World)).FirstOrDefault();
-                //    if (dev != null && !dev.Data.CmdType.HasFlag(TrussCmdType.Two))
-                //    {
-                //        dev.Data.CmdType = TrussCmdType.Two;
-                //    }
-                //}
+                var endTime = DateTime.Now.AddMinutes(-25);
+                //找一个当前时间最早且已超过25分钟未码垛的码垛信息半托入库
+                //未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
+                var palletizing = db.Queryable<WCS_Palletizing>()
+                    .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
+                    .Where(x => !x.Finish && x.WarehouseCode == taskInfo.WarehouseCode && x.Layers.Any(l => l.Rows.Any(r => r.Finish)))
+                    .Where(x => x.EditTime < endTime).ToList()
+                    .MinBy(x => x.AddTime);
+                cacheLineList = db.Queryable<WCS.Entity.WCS_CacheLine>().Where(x => x.WarehouseCode == taskInfo.WarehouseCode && x.IsTruss).ToList();
+
+                if (palletizing == null || cacheLineList.Any()) return false;
+                {
+                    var dev = Device.All.Where(x => x.Code == palletizing.PalletizingStation).Select(x => new Device<ITruss530>(x, World)).FirstOrDefault();
+                    if (dev != null && (!dev.Data.CmdType.HasFlag(TrussCmdType.Two) && !dev.Data.CmdType.HasFlag(TrussCmdType.End1)))
+                    {
+                        //如果找到的最早的一个托盘超六小时了,就直接强制结盘
+                        dev.Data.CmdType = palletizing.AddTime < DateTime.Now.AddHours(-6) ? TrussCmdType.End1 : TrussCmdType.Two;
+                    }
+                }
                 return false;
             }
             var result = false;
 
             //未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
             var palletizingList = db.Queryable<WCS_Palletizing>()
-                .UpdLock()
                 .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
                 .Where(x => (!x.Finish || (x.Finish && x.isItHalf)) && x.MatCodeList.Contains(taskInfo.MatCode) && x.WarehouseCode == taskInfo.WarehouseCode)
                 .OrderBy(x => x.AddTime)
@@ -203,11 +204,11 @@ namespace WCS.WorkEngineering.Systems
                     switch (obj.Entity.Code)
                     {
                         case "455":
-                            twoDevCode.AddRange(new List<string>() { "1674", "1675" });
+                            twoDevCode.AddRange(new List<string>() { "1670", "1671" });
                             break;
 
                         case "655":
-                            twoDevCode.AddRange(new List<string>() { "", "" });
+                            twoDevCode.AddRange(new List<string>() { "1685", "1686" });
                             break;
 
                         case "855":
@@ -252,7 +253,7 @@ namespace WCS.WorkEngineering.Systems
                     db.Updateable(palletizing).ExecuteCommand();
                 }
                 var res = db.InsertableRowLock(cacheLine).ExecuteReturnEntity();
-                palletizingRow = db.Queryable<WCS_PalletizingRow>().UpdLock().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
+                palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
                 palletizingRow.Locs = palletizingRow.Locs.OrderBy(x => x.XYNo).ToList();
                 palletizingRow.CacheLineId = res.Id;
                 palletizingRow.EditTime = DateTime.Now;
@@ -264,7 +265,8 @@ namespace WCS.WorkEngineering.Systems
                     IsEmpty = t.IsEmpty,
                     MatCode = t.MatCode,
                     TaskId = i == 0 ? taskInfo.ID : 0,
-                    CacheLineId = res.Id
+                    CacheLineId = res.Id,
+                    AddTime = DateTime.Now
                 }).ToList();
 
                 taskInfo.Status = TaskStatus.FinishOfShunt;
@@ -281,14 +283,13 @@ namespace WCS.WorkEngineering.Systems
 
             if (!result)
             {
-                taskInfo.InitStackStructure(db);
+                taskInfo.InitStackStructure(db,World);
             }
             return result;
 
             #endregion 初始化一个信息的缓存信息
         }
 
-
         ///// <summary>
         /////  计算去向
         ///// </summary>

+ 32 - 11
业务工程/分拣库/WCS.WorkEngineering/Systems/分拣支线/环形库分流点.cs

@@ -33,11 +33,29 @@ namespace WCS.WorkEngineering.Systems
                     obj.Data.TaskNumber = obj.Data2.TaskNumber;
                     World.Log($"复写:{obj.Data.TaskNumber}");
                 }
-                throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
+                World.Log($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}");
+                return;
+            }
+
+            if (obj.Data3.Status.HasFlag(StationStatus.Run))
+            {
+                World.Log("设备运行中");
+                return;
+            }
+
+            ;
+            if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status))
+            {
+                World.Log("站台货物信息与实际占用不一致");
+                return;
+            }
+
+            ;
+            if (obj.Data2.Request != 1)
+            {
+                World.Log("无请求");
+                return;
             }
-            if (obj.Data3.Status.HasFlag(StationStatus.Run)) throw new KnownException("设备运行中", LogLevelEnum.Low);
-            if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low);
-            if (obj.Data2.Request != 1) throw new KnownException("无请求", LogLevelEnum.Mid);
 
             var isPut = false;
             var nextAdd = GetNext(obj);
@@ -45,13 +63,13 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.ID == obj.Data2.TaskNumber && v.Status == TaskStatus.WaitingToExecute && !v.BarCode.Contains("Error"));
+                var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == TaskStatus.WaitingToExecute && !v.BarCode.Contains("Error"));
                 if (obj.Data2.TaskNumber == 2)
                 {
                     var goodsType = obj.Data4.Length.ToInt();
                     var type = goodsType.ToString();
                     //找到一条起点是当前位置且状态小于2的任务
-                    taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().OrderBy(x => x.AddTime).First(x => x.AddrFrom == obj.Entity.Code
+                    taskInfo = db.Queryable<WCS_TaskInfo>().OrderBy(x => x.AddTime).First(x => x.AddrFrom == obj.Entity.Code
                         && x.BarCode.Contains("Error")
                         && x.AddrNext == null && x.GoodsType == goodsType);
                     if (taskInfo == null)
@@ -65,19 +83,20 @@ namespace WCS.WorkEngineering.Systems
                         return;
                     }
                 }
-                else
-                if (taskInfo == null) throw new KnownException($"未找到对应的WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
-
+                else if (taskInfo == null)
+                {
+                    World.Log($"未找到对应的WCS任务{obj.Data2.TaskNumber}");
+                    return;
+                }
 
                 if (!taskInfo.BarCode.Contains("Error"))
                 {
                     switch (obj.Data4.Length.ToInt())
 
-
                     {
                         case 9:
                             if (!taskInfo.BarCode.Contains("HAWS09")) throw new Exception("外检结果与任务条码不匹配");
-                            break; 
+                            break;
 
                         case 18:
                             if (!taskInfo.BarCode.Contains("HAWS18")) throw new Exception("外检结果与任务条码不匹配");
@@ -146,6 +165,8 @@ namespace WCS.WorkEngineering.Systems
             obj.Data.TaskNumber = taskId;
             obj.Data.TaskNumber = taskId;
             obj.Data.GoodsStart = obj.Entity.Code.ToShort();
+            obj.Data.GoodsStart = obj.Entity.Code.ToShort();
+            obj.Data.GoodsEnd = nextAdd;
             obj.Data.GoodsEnd = nextAdd;
             obj.Data.VoucherNo++;
             World.Log($"执行记录:任务号[{taskId}]-[{obj.Data.VoucherNo}]");

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/机台叫料生成AGV任务.cs

@@ -30,7 +30,7 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                var task = db.Queryable<WCS_TaskInfo>().UpdLock().Single(x => x.ID == obj.Data.TaskNumber);
+                var task = db.Queryable<WCS_TaskInfo>().Single(x => x.ID == obj.Data.TaskNumber);
                 if (task == null) throw new Exception($"未找到对应任务{obj.Data.TaskNumber}");
                 if (task.Status != Entity.TaskStatus.ConveyorExecution) throw new Exception($"{task.ID}状态不是输送机执行中");
 

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/二次码垛任务到RGV取货位处理.cs

@@ -34,7 +34,7 @@ namespace WCS.WorkEngineering.Systems.桁架码垛
             {
                 var db = _db.Default;
                 var soDev = obj.Entity.Sources.First();
-                var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.SrmStation == soDev.Code && x.Status == TaskStatus.StackerCompleted);
+                var taskInfo = db.Queryable<WCS_TaskInfo>().Where(x => x.SrmStation == soDev.Code && x.Status == TaskStatus.StackerCompleted).OrderBy(x => x.EditTime).First();
                 if (taskInfo == null) return;
                 var pall = db.Queryable<WCS_Palletizing>().RowLock().First(x => x.TaskId == taskInfo.ID && !x.Finish);
                 if (pall == null) return;

+ 2 - 2
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/创建二次码垛出库任务.cs

@@ -24,10 +24,10 @@ namespace WCS.WorkEngineering.Systems.桁架码垛
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                var palls = db.Queryable<WCS_Palletizing>().UpdLock().Where(x => !x.Finish && x.isItHalf).ToList();
+                var palls = db.Queryable<WCS_Palletizing>().Where(x => !x.Finish && x.isItHalf).ToList();
                 foreach (var pall in palls)
                 {
-                    var task = db.Queryable<WCS_TaskInfo>().RowLock().First(x => x.ID == pall.Id);
+                    var task = db.Queryable<WCS_TaskInfo>().RowLock().First(x => x.ID == pall.TaskId);
                     if (task != null) continue;
 
                     try

+ 118 - 53
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架.cs

@@ -1,8 +1,8 @@
-using ServiceCenter.Extensions;
+using Newtonsoft.Json;
+using ServiceCenter.Extensions;
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
-using Newtonsoft.Json;
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.Station;
@@ -34,16 +34,21 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Truss obj)
         {
-            if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
+            if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
+            {
+                World.Log($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}");
+                return;
+            }
+
             if (obj.Data2.CmdType == 1)
             {
                 var isFinish = false;
-
+                var isEnd = false; //是否强制结盘
                 SqlSugarHelper.Do(_db =>
                 {
                     var db = _db.Default;
                     List<int> ids = new List<int>() { obj.Data2.PalletizingRowId1, obj.Data2.PalletizingRowId2 };
-                    var palletizingRow = db.Queryable<WCS_PalletizingRow>().UpdLock().Includes(x => x.CacheLine, c => c.Locations)
+                    var palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.CacheLine, c => c.Locations)
                                                                                                 .Includes(x => x.Locs)
                                                                                                 .Includes(x => x.Palletizing).Where(x => ids.Contains(x.Id)).ToList();
                     List<WCS.Entity.WCS_CacheLine> deleteCacheLine = new List<WCS.Entity.WCS_CacheLine>();
@@ -53,21 +58,29 @@ namespace WCS.WorkEngineering.Systems
                     //更新行数据
                     foreach (var row in palletizingRow)
                     {
-                        var cacheLine = db.Queryable<WCS.Entity.WCS_CacheLine>().UpdLock().Includes(x => x.Locations).Single(x => x.Id == row.CacheLine.Id);
+                        var cacheLine = db.Queryable<WCS.Entity.WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.Id == row.CacheLine.Id);
+                        if (cacheLine.AddTime < DateTime.Now.AddHours(-6))
+                        {
+                            isEnd = true;
+                        }
+
                         //先更新对应的位信息
                         try
                         {
                             var index = 0;
                             foreach (var loc in row.Locs.Where(x => !x.IsEmpty).OrderBy(x => x.XYNo))
                             {
-                                var cacheLoc = cacheLine.Locations[index];
-                                cacheLoc = db.Queryable<WCS_CacheLineLoc>().UpdLock().Single(x => x.Id == cacheLoc.Id);
-                                loc.TaskId = cacheLoc.TaskId;
-                                loc.Finish = true;
-
-                                upDateableLoc.Add(loc);
-                                deleteLoc.Add(cacheLoc);
-                                index++;
+                                if (index < cacheLine.Locations.Count)
+                                {
+                                    var cacheLoc = cacheLine.Locations[index];
+                                    cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
+                                    loc.TaskId = cacheLoc.TaskId;
+                                    loc.Finish = true;
+
+                                    upDateableLoc.Add(loc);
+                                    deleteLoc.Add(cacheLoc);
+                                    index++;
+                                }
                             }
                         }
                         catch (Exception a)
@@ -86,7 +99,7 @@ namespace WCS.WorkEngineering.Systems
                     db.DeleteableRowLock(deleteCacheLine).ExecuteCommand();
 
                     var layerId = palletizingRow.FirstOrDefault().PalletizingLayerId;
-                    var layer = db.Queryable<WCS_PalletizingLayer>().UpdLock().Includes(x => x.Rows).Single(x => x.Id == layerId);
+                    var layer = db.Queryable<WCS_PalletizingLayer>().Includes(x => x.Rows).Single(x => x.Id == layerId);
                     if (layer.Rows.All(x => x.Finish || x.IsEmpty))
                     {
                         layer.Finish = true;
@@ -95,7 +108,7 @@ namespace WCS.WorkEngineering.Systems
 
                     //码垛完成后开始绑定托盘
                     var palletizingId = upDateableRow.First().Palletizing.Id;
-                    var palletizing = db.Queryable<WCS_Palletizing>().UpdLock().Single(x => x.Id == palletizingId);
+                    var palletizing = db.Queryable<WCS_Palletizing>().Single(x => x.Id == palletizingId);
                     palletizing.EditTime = DateTime.Now;
                     db.UpdateableRowLock(palletizing).ExecuteCommand();
                     var taskId = upDateableRow.SelectMany(x => x.Locs).Select(x => x.TaskId).ToList();
@@ -103,10 +116,25 @@ namespace WCS.WorkEngineering.Systems
                     WmsApi.BingPallet(palletizing.PalleCode, taskList, palletizing.WarehouseCode, palletizing.PalletizingStation);
                     isFinish = true;
                 });
-                if (!isFinish) throw new KnownException($"绑盘失败", LogLevelEnum.High);
+                if (!isFinish)
+                {
+                    World.Log("绑盘失败");
+                    return;
+                }
 
+                if (isEnd)
+                {
+                    try
+                    {
+                        var dev = new Device<ITruss530>(Device.All.First(x => x.Code == obj.Data.TargetPallte1.ToString()), World);
+                        dev.Data.CmdType = TrussCmdType.End1;
+                    }
+                    catch (Exception e)
+                    {
+                        World.Log($"超时托盘自动结盘失败:{e.Message}--{obj.Data.TargetPallte1}");
+                    }
+                }
                 obj.Data.CmdType = 1;
-
                 obj.Data.DestPosition_1 = 0;
                 obj.Data.TargetPallte1 = 0;
                 obj.Data.Task1_1 = 0;
@@ -137,8 +165,17 @@ namespace WCS.WorkEngineering.Systems
                 obj.Data.PalletizingRowId2 = 0;
             }
             if (obj.Data2.CmdType == 0 && obj.Data.CmdType != 0) obj.Data.CmdType = 0;
-            if (obj.Data2.CmdType != 0 || obj.Data.CmdType != 0) throw new Exception($"完成信号未清除:{obj.Data2.CmdType}--{obj.Data.CmdType}");
-            if (obj.Data2.Status != TrussStatus.Idle) throw new Exception($"桁架处于{obj.Data2.Status.GetDescription()}");
+            if (obj.Data2.CmdType != 0 || obj.Data.CmdType != 0)
+            {
+                World.Log($"完成信号未清除:{obj.Data2.CmdType}--{obj.Data.CmdType}");
+                return;
+            }
+
+            if (obj.Data2.Status != TrussStatus.Idle)
+            {
+                World.Log($"桁架处于{obj.Data2.Status.GetDescription()}");
+                return;
+            }
 
             //查找所有的可用开始搬运的线体
             var pickUpDevices = _pickUpDevices.Where(v => v.Value.All(x => !x.Data2.Status.HasFlag(StationStatus.Run) && x.Data2.Status.HasFlag(StationStatus.Auto)))
@@ -146,9 +183,14 @@ namespace WCS.WorkEngineering.Systems
                 {
                     key = x.Key.Entity.Code,
                     Count = x.Value.Count(v => v.Data2.Status.HasFlag(StationStatus.PH_Status) && v.Data.TaskNumber > 0),
+                    HPCount = x.Value.Count(v => v.Data2.Status.HasFlag(StationStatus.PH_Status)),
                     Dev = x
-                }).ToList();
-            if (!pickUpDevices.Any()) throw new KnownException($"没有可用取货点,请在电控触摸屏检查实际可取货点是否每个位置都有光电与任务号", LogLevelEnum.Mid);
+                }).Where(x => x.HPCount == x.Count).ToList();
+            if (!pickUpDevices.Any())
+            {
+                World.Log($"没有可用取货点,请在电控触摸屏检查实际可取货点是否每个位置都有光电与任务号");
+                return;
+            }
 
             List<WCS_PalletizingRow> palletizingRowList = null;
             WCS_Palletizing palletizing = null;
@@ -156,38 +198,55 @@ namespace WCS.WorkEngineering.Systems
             {
                 var db = _db.Default;
                 //找到当前桁架所属所有还有层没结束的码垛记录信息,有对应托盘
-                var palletizingLsit = db.Queryable<WCS_Palletizing>().UpdLock().Includes(x => x.Layers, r => r.Rows, l => l.Locs)
+                var palletizingLsit = db.Queryable<WCS_Palletizing>().Includes(x => x.Layers, r => r.Rows, l => l.Locs)
                     .Where(x => !x.Finish && x.DeviceCode == obj.Entity.Code)
                     .Where(x => x.Layers.Any(l => !l.Finish) && x.PalletizingStation != null).ToList();
                 //筛选出目标位置有光电的码垛记录信息
                 var devCode = palletizingLsit.Select(x => x.PalletizingStation);
                 var taskCode = palletizingLsit.Select(x => x.Id);
-                var devList = Device.All.Where(x => devCode.Contains(x.Code)).Select(x => new Device<IStation521, IStation523, ITruss530>(x, World)).ToList();
-                devList = devList.Where(x => x.Data2.Status.HasFlag(StationStatus.PH_Status) && taskCode.Contains(x.Data.TaskNumber) && !x.Data3.CmdType.HasFlag(TrussCmdType.Two)).ToList();
+                var devList = Device.All.Where(x => devCode.Contains(x.Code)).Select(x => new Device<IStation521, IStation523, ITruss530, ITruss531>(x, World)).ToList();
+                devList = devList.Where(x => x.Data2.Status.HasFlag(StationStatus.PH_Status) && taskCode.Contains(x.Data.TaskNumber) && !x.Data4.CmdType.HasFlag(TrussCmdType.End1)).ToList();
                 devCode = devList.Select(x => x.Entity.Code);
-                if (!devCode.Any()) throw new KnownException($"无可用放货码垛位,请检查实际有货位置的光电是否正常", LogLevelEnum.Mid);
-                else
+                if (!devCode.Any())
                 {
-                    World.Log($"可用放货位:{JsonConvert.SerializeObject(devCode)}");
+                    World.Log($"无可用放货码垛位,请检查实际有货位置的光电是否正常");
+                    return;
                 }
+
+                World.Log($"可用放货位:{JsonConvert.SerializeObject(devCode)}");
                 palletizingLsit = palletizingLsit.Where(x => devCode.Contains(x.PalletizingStation)).ToList(); //可以放货的目标托盘
                 //可以取货的码垛信息
                 var pickUpCode = _pickUpDevices.Select(x => x.Key.Entity.Code.ToShort());
+                World.Log($"可用取货线体1:{JsonConvert.SerializeObject(pickUpCode)}");
                 //从缓存线信息找到可以取货的缓存线
-                var cacheLines = db.Queryable<WCS_CacheLine>().UpdLock().Where(x => pickUpCode.Contains(x.LocationNo)).ToList().Where(
+                var cacheLines = db.Queryable<WCS_CacheLine>().Where(x => pickUpCode.Contains(x.LocationNo)).ToList().Where(
                     x =>
                     {
-                        return pickUpDevices.Any(p => p.key == x.LocationNo.ToString() && p.Count == x.Quantity);
+                        var isTime = x.AddTime < DateTime.Now.AddHours(-6);
+                        var isPut = pickUpDevices.Any(p => p.key == x.LocationNo.ToString() && p.Count == x.Quantity);
+                        //满足取货条件,或者是超六小时
+                        return isPut || (pickUpDevices.Any(p => p.key == x.LocationNo.ToString()) && isTime);
                     });
+                if (!cacheLines.Any())
+                {
+                    World.Log($"无可用取货线体");
+                    return;
+                }
+                World.Log($"物理可用取货线体:{JsonConvert.SerializeObject(pickUpDevices.Select(x => x.key).ToList())}");
+                World.Log($"可用取货线体:{JsonConvert.SerializeObject(cacheLines.Select(x => x.LocationNo).ToList())}");
                 //找到可用缓存线可以去的码垛信息
                 palletizingLsit = palletizingLsit.Where(x => x.Layers
                     .Where(w => !w.Finish)
                     .SelectMany(w => w.Rows)
                     .Where(v => !v.Finish).Any(w =>
                     {
-                        return cacheLines.Any(a => a.MatCodeList == w.MatCodeList && a.Quantity == w.QtyMaxCount && a.WarehouseCode == w.WarehouseCode);
+                        return cacheLines.Any(a => a.MatCodeList == w.MatCodeList && (a.Quantity == w.QtyMaxCount || (a.AddTime < DateTime.Now.AddHours(-6) && a.Quantity <= w.QtyMaxCount)) && a.WarehouseCode == w.WarehouseCode);
                     })).ToList();
-                if (!palletizingLsit.Any()) throw new KnownException($"没有可用取货点,码垛信息是否正常", LogLevelEnum.Mid);
+                if (!palletizingLsit.Any())
+                {
+                    World.Log($"没有可用取货点,码垛信息是否正常");
+                    return;
+                }
 
                 foreach (var palletizingInfo in palletizingLsit)
                 {
@@ -200,7 +259,7 @@ namespace WCS.WorkEngineering.Systems
                         .MinBy(x => x.LayerNo) //取最下层
                         .Rows
                         .Where(x => x is { Finish: false, IsEmpty: false, LineCode: null }) //不空且未结束的行
-                        .Where(x => cacheLines.Any(a => a.MatCodeList == x.MatCodeList && a.Quantity == x.QtyMaxCount && a.WarehouseCode == x.WarehouseCode)); //获取可以取货的码垛信息行
+                        .Where(x => cacheLines.Any(a => a.MatCodeList == x.MatCodeList && (a.Quantity == x.QtyMaxCount || (a.AddTime < DateTime.Now.AddHours(-6) && a.Quantity <= x.QtyMaxCount)) && a.WarehouseCode == x.WarehouseCode)); //获取可以取货的码垛信息行
 
                     //无可用行,进入下一次迭代
                     if (!palletizingRow.Any())
@@ -213,7 +272,7 @@ namespace WCS.WorkEngineering.Systems
                     //跟据缓存信息找到对应的可用取货行
                     var rowList = cacheLines.Select(x =>
                     {
-                        var b = palletizingRow.Where(w => !rowIds.Contains(w.Id) && x.MatCodeList == w.MatCodeList && x.Quantity == w.QtyMaxCount && w.WarehouseCode == x.WarehouseCode).MinBy(o => o.RowNo);
+                        var b = palletizingRow.Where(w => !rowIds.Contains(w.Id) && x.MatCodeList == w.MatCodeList && (x.Quantity == w.QtyMaxCount || (x.AddTime < DateTime.Now.AddHours(-6) && x.Quantity <= w.QtyMaxCount)) && w.WarehouseCode == x.WarehouseCode).MinBy(o => o.RowNo);
                         if (b != null)
                         {
                             rowIds.Add(b.Id);
@@ -222,7 +281,8 @@ namespace WCS.WorkEngineering.Systems
                                 CacheLineId = x.Id,
                                 RowId = b.Id,
                                 x.LocationNo,
-                                b.RowNo
+                                b.RowNo,
+                                x.AddTime
                             };
                         }
                         return new
@@ -230,7 +290,8 @@ namespace WCS.WorkEngineering.Systems
                             CacheLineId = 0,
                             RowId = 0,
                             x.LocationNo,
-                            RowNo = 0
+                            RowNo = 0,
+                            x.AddTime
                         };
                     }).Where(x => x.CacheLineId != 0).OrderBy(x => x.RowNo).Take(2).ToList();
 
@@ -244,12 +305,12 @@ namespace WCS.WorkEngineering.Systems
                     foreach (var row in rowList)
                     {
                         //锁定缓存线
-                        var cacheLine = db.Queryable<WCS_CacheLine>().UpdLock().Includes(x => x.Locations).Single(x => x.Id == row.CacheLineId);
+                        var cacheLine = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.Id == row.CacheLineId);
                         cacheLine.IsTruss = true;
                         cacheLine.PalletizingRowId = row.RowId;
                         db.UpdateableRowLock(cacheLine).ExecuteCommand();
                         //解锁原有码垛信息
-                        var oldRow = db.Queryable<WCS_PalletizingRow>().UpdLock().First(x => x.CacheLineId == row.CacheLineId);
+                        var oldRow = db.Queryable<WCS_PalletizingRow>().First(x => x.CacheLineId == row.CacheLineId);
                         if (oldRow != null)
                         {
                             oldRow.CacheLineId = 0;
@@ -258,7 +319,7 @@ namespace WCS.WorkEngineering.Systems
                         }
 
                         //锁定现有码垛信息
-                        var wcsRow = db.Queryable<WCS_PalletizingRow>().UpdLock().Includes(x => x.Locs).First(x => x.Id == row.RowId);
+                        var wcsRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).First(x => x.Id == row.RowId);
                         wcsRow.CacheLineId = row.CacheLineId;
                         wcsRow.LineCode = row.LocationNo.ToString();
                         db.UpdateableRowLock(wcsRow).ExecuteCommand();
@@ -270,13 +331,17 @@ namespace WCS.WorkEngineering.Systems
                 }
             });
 
-            if (palletizingRowList == null || !palletizingRowList.Any()) throw new KnownException($"没有可用任务", LogLevelEnum.Mid);
+            if (palletizingRowList == null || !palletizingRowList.Any())
+            {
+                World.Log($"没有可用任务");
+                return;
+            }
 
             for (var i = 0; i < palletizingRowList.Count; i++)
             {
                 var palletizingRow = palletizingRowList[i];
                 var locs = palletizingRow.Locs.OrderBy(x => x.XYNo.ToInt()).ToArray();
-                var devs = pickUpDevices.FirstOrDefault(x => x.key == palletizingRow.LineCode).Dev.Value
+                var devs = pickUpDevices.FirstOrDefault(x => x.key == palletizingRow.LineCode).Dev.Value.Where(x => x.Data2.Status.HasFlag(StationStatus.PH_Status))
                     .OrderBy(x => x.Entity.Code).ToArray();
 
                 switch (i)
@@ -284,33 +349,33 @@ namespace WCS.WorkEngineering.Systems
                     case 0:
                         obj.Data.DestPosition_1 = palletizingRow.LineCode!.ToShort();
                         obj.Data.TargetPallte1 = palletizing.PalletizingStation!.ToShort();
-                        if (locs.Length >= 1)
+                        if (devs.Length >= 1)
                         {
                             obj.Data.Task1_1 = devs[0].Data.TaskNumber;
                             obj.Data.Dest1_1 = locs[0].XYNo.ToShort();
                         }
-                        if (locs.Length >= 2)
+                        if (devs.Length >= 2)
                         {
                             obj.Data.Task1_2 = devs[1].Data.TaskNumber;
                             obj.Data.Dest1_2 = locs[1].XYNo.ToShort();
                         }
-                        if (locs.Length >= 3)
+                        if (devs.Length >= 3)
                         {
                             obj.Data.Task1_3 = devs[2].Data.TaskNumber;
                             obj.Data.Dest1_3 = locs[2].XYNo.ToShort();
                         }
-                        if (locs.Length >= 4)
+                        if (devs.Length >= 4)
                         {
                             obj.Data.Task1_4 = devs[3].Data.TaskNumber;
                             obj.Data.Dest1_4 = locs[3].XYNo.ToShort();
                         }
-                        if (locs.Length == 5)
+                        if (devs.Length == 5)
                         {
                             obj.Data.Task1_5 = devs[4].Data.TaskNumber;
                             obj.Data.Dest1_5 = locs[4].XYNo.ToShort();
                         }
 
-                        obj.Data.TaskSum1 = palletizingRow.QtyMaxCount.ToShort();
+                        obj.Data.TaskSum1 = devs.Length.ToShort();
                         obj.Data.PalletizingRowId1 = palletizingRow.Id;
                         break;
 
@@ -318,33 +383,33 @@ namespace WCS.WorkEngineering.Systems
                         obj.Data.DestPosition_2 = palletizingRow.LineCode!.ToShort();
                         obj.Data.TargetPallte2 = palletizing.PalletizingStation!.ToShort();
 
-                        if (locs.Length >= 1)
+                        if (devs.Length >= 1)
                         {
                             obj.Data.Task2_1 = devs[0].Data.TaskNumber;
                             obj.Data.Dest2_1 = locs[0].XYNo.ToShort();
                         }
-                        if (locs.Length >= 2)
+                        if (devs.Length >= 2)
                         {
                             obj.Data.Task2_2 = devs[1].Data.TaskNumber;
                             obj.Data.Dest2_2 = locs[1].XYNo.ToShort();
                         }
-                        if (locs.Length >= 3)
+                        if (devs.Length >= 3)
                         {
                             obj.Data.Task2_3 = devs[2].Data.TaskNumber;
                             obj.Data.Dest2_3 = locs[2].XYNo.ToShort();
                         }
-                        if (locs.Length >= 4)
+                        if (devs.Length >= 4)
                         {
                             obj.Data.Task2_4 = devs[3].Data.TaskNumber;
                             obj.Data.Dest2_4 = locs[3].XYNo.ToShort();
                         }
-                        if (locs.Length == 5)
+                        if (devs.Length == 5)
                         {
                             obj.Data.Task2_5 = devs[4].Data.TaskNumber;
                             obj.Data.Dest2_5 = locs[4].XYNo.ToShort();
                         }
 
-                        obj.Data.TaskSum2 = palletizingRow.QtyMaxCount.ToShort();
+                        obj.Data.TaskSum2 = devs.Length.ToShort();
                         obj.Data.PalletizingRowId2 = palletizingRow.Id;
                         break;
                 }

+ 3 - 3
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架码垛区补空托盘任务生成.cs

@@ -15,8 +15,8 @@ namespace WCS.WorkEngineering.Systems
     ///  桁架码垛区补空托盘任务生成
     /// </summary>
    // [BelongTo(typeof(SortingPalletizingWorld))]
-    [Description("桁架码垛区补空托盘任务生成")]
-    public class TrussCreateEmptyTray : DeviceSystem<Device<IStation520>>
+    [Description("码垛区补空托盘任务生成")]
+    public class PalletizCreateEmptyTray : DeviceSystem<Device<IStation520>>
     {
         protected override bool ParallelDo => true;
 
@@ -29,7 +29,7 @@ namespace WCS.WorkEngineering.Systems
 
         public override bool Select(Device dev)
         {
-            return dev.Code == nameof(TrussCreateEmptyTray);
+            return dev.Code == nameof(PalletizCreateEmptyTray);
         }
     }
 }

+ 4 - 4
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架码垛工位任务结束处理.cs

@@ -39,16 +39,16 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                var palletizing = db.Queryable<WCS_Palletizing>().UpdLock().Single(x => x.PalletizingStation == obj.Entity.Code && !x.Finish);
+                var palletizing = db.Queryable<WCS_Palletizing>().Single(x => x.PalletizingStation == obj.Entity.Code && !x.Finish);
 
                 var TaskNoList = obj.Data5.GetTaskNoList().Where(x => x > 0).ToList();
-                var taskList = db.Queryable<WCS_TaskInfo>().UpdLock().Where(x => TaskNoList.Contains(x.ID)).ToList();
+                var taskList = db.Queryable<WCS_TaskInfo>().Where(x => TaskNoList.Contains(x.ID)).ToList();
                 var taskCodes = taskList.Select(x => x.BarCode).ToList();
                 if (!obj.Data5.CmdType.HasFlag(TrussCmdType.End1))
                 {
                     if (taskList.Count != TaskNoList.Count) throw new KnownException($"任务数量不一致!,请检查托盘任务信息", LogLevelEnum.Mid);
                 }
-                var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().Single(x => x.BarCode == palletizing.PalleCode && x.Type == TaskType.EnterDepot);
+                var taskInfo = db.Queryable<WCS_TaskInfo>().Single(x => x.BarCode == palletizing.PalleCode && x.Type == TaskType.EnterDepot);
                 if (taskInfo == null)
                 {
                     if (obj.Data5.CmdType.HasFlag(TrussCmdType.Two)) WmsApi.SecondaryBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
@@ -92,7 +92,7 @@ namespace WCS.WorkEngineering.Systems
 
         public override bool Select(Device dev)
         {
-            var devCodes = new List<string>() { "1670", "1671", "1715", "1716" };
+            var devCodes = new List<string>() { "1670", "1671", "1715", "1716", "1685", "1686" };
             return dev.HasFlag(DeviceFlags.桁架码垛位) || devCodes.Contains(dev.Code);
         }
     }

+ 4 - 4
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架缓存放行点.cs

@@ -47,9 +47,9 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                var cacheLine = db.Queryable<WCS_CacheLine>().UpdLock().Includes(x => x.Locations).Single(x => x.LocationNo == obj.Entity.Code.ToShort());
+                var cacheLine = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.LocationNo == obj.Entity.Code.ToShort());
                 //是否所有的位已全部分配位置
-                if (cacheLine != null && cacheLine.Locations.All(x => x is { IsEmpty: false, InStock: true }))
+                if (cacheLine != null && cacheLine.Locations.All(x => (x is { IsEmpty: false, InStock: true }) || (x.AddTime < DateTime.Now.AddHours(-6))))
                 {
                     //判断下一个地址当前是否有对应的任务
                     if (db.Queryable<WCS_CacheLine>().Any(x => x.LocationNo == nextCode && x.IsTruss == false)) return;
@@ -72,7 +72,7 @@ namespace WCS.WorkEngineering.Systems
             {
                 var db = _db.Default;
                 //先找到下一个地址对应的缓存信息
-                var lineCache = db.Queryable<WCS_CacheLine>().UpdLock().Includes(x => x.Locations).Single(x => x.LocationNo == nextCode && x.Locations.Any(s => s.TaskId == obj.Data2.TaskNumber));
+                var lineCache = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.LocationNo == nextCode && x.Locations.Any(s => s.TaskId == obj.Data2.TaskNumber));
                 if (lineCache == null) throw new Exception($"当前缓存组未分配完"); //找不到表示当前线体的任务组没有凑齐
 
                 //检测实物数量与有货总数是否相等
@@ -92,7 +92,7 @@ namespace WCS.WorkEngineering.Systems
                     //db.Updateable(pr).ExecuteCommand();
                 }
 
-                var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.FinishOfShunt) ?? throw new KnownException("未找到对应的WCS任务", LogLevelEnum.Mid);
+                var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.FinishOfShunt) ?? throw new KnownException("未找到对应的WCS任务", LogLevelEnum.Mid);
                 taskInfo.Status = Entity.TaskStatus.ConveyorExecution;
                 //taskInfo.AddrNext = obj.Entity.Targets.FirstOrDefault().Code;
                 taskInfo.EditWho = "WCS";

+ 31 - 8
业务工程/分拣库/WCS.WorkEngineering/Systems/环形库/机械臂cs.cs

@@ -68,7 +68,7 @@ namespace WCS.WorkEngineering.Systems
                     World.Log($"机械臂任务处理:开始--完成任务{obj.Data2.TaskFinishId1}--{obj.Data2.TaskFinishId2}", LogLevelEnum.Low);
 
                     //根据DB521任务号获取对应任务
-                    var taskInfoList = db.Default.Queryable<WCS_TaskInfo>().UpdLock().Where(v => v.ID == obj.Data2.TaskFinishId1 || v.ID == obj.Data2.TaskFinishId2).ToList();
+                    var taskInfoList = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.ID == obj.Data2.TaskFinishId1 || v.ID == obj.Data2.TaskFinishId2).ToList();
                     foreach (var task in taskInfoList.Where(task => task.Status == Entity.TaskStatus.StackerExecution))
                     {
                         //根据任务类型做不同的处理
@@ -114,9 +114,23 @@ namespace WCS.WorkEngineering.Systems
             #endregion 处理完成任务
 
             //robot是否可以下发任务
-            if (obj.Data2.VoucherNo != obj.Data.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo},DB521:{obj.Data2.VoucherNo}", LogLevelEnum.Mid);
-            if (obj.Data2.RobotMode != RobotMode.Automatic) throw new KnownException($"robot处于{obj.Data2.RobotMode.GetDescription()}模式", LogLevelEnum.Low);
-            if (obj.Data2.RunStatus != RobotRunStatus.Idle) throw new KnownException($"robot处于{obj.Data2.RunStatus.GetDescription()}状态", LogLevelEnum.High);
+            if (obj.Data2.VoucherNo != obj.Data.VoucherNo)
+            {
+                World.Log($"凭证号不一致,DB520:{obj.Data.VoucherNo},DB521:{obj.Data2.VoucherNo}");
+                return;
+            }
+
+            if (obj.Data2.RobotMode != RobotMode.Automatic)
+            {
+                World.Log($"robot处于{obj.Data2.RobotMode.GetDescription()}模式");
+                return;
+            }
+
+            if (obj.Data2.RunStatus != RobotRunStatus.Idle)
+            {
+                World.Log($"robot处于{obj.Data2.RunStatus.GetDescription()}状态");
+                return;
+            }
 
             //判断是否有任务是机器人执行中
             //再检查是否有等待执行的货物
@@ -164,7 +178,12 @@ namespace WCS.WorkEngineering.Systems
                                                       })
                                                       .ToList();
 
-                if (!arrIn.Any()) throw new KnownException($"[{obj.Entity.Code}]等待入库任务输送到位", LogLevelEnum.Mid);
+                if (!arrIn.Any())
+                {
+                    World.Log($"[{obj.Entity.Code}]等待入库任务输送到位");
+                    return;
+                }
+
                 //等待下发的任务信息
                 var taskList = new List<Tuple<WCS_TaskInfo, Device<IStation523, IStation524>>>();
                 SqlSugarHelper.Do(db =>
@@ -177,7 +196,7 @@ namespace WCS.WorkEngineering.Systems
                     if (!devGroup.Any()) throw new KnownException($"无有效入库取货位", LogLevelEnum.High);
                     foreach (var dev in devGroup)
                     {
-                        var task = db.Default.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.Type == TaskType.SetPlate && v.Status == Entity.TaskStatus.FinishOfShunt && dev.Data2.TaskNumber == v.ID);
+                        var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.Type == TaskType.SetPlate && v.Status == Entity.TaskStatus.FinishOfShunt && dev.Data2.TaskNumber == v.ID);
                         if (task == null) continue;
                         var res = WmsApi.RingApplyStockInLoc(task.ID, task.Device, dev.Entity.Code, task.GoodsType);
                         task.Status = Entity.TaskStatus.StackerExecution;
@@ -293,7 +312,11 @@ namespace WCS.WorkEngineering.Systems
 
                 //获取可以放货的设备集合
                 arrOut = arrOut.Where(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && v.Data.TaskNumber == 0 && v.Data.GoodsEnd == 0).ToList();//有光电
-                if (!arrOut.Any()) throw new KnownException($"[{obj.Entity.Code}]等待出库任务输送到位", LogLevelEnum.Mid);
+                if (!arrOut.Any())
+                {
+                    World.Log($"[{obj.Entity.Code}]等待出库任务输送到位");
+                    return;
+                }
 
                 var taskInfoList = new List<WCS_TaskInfo>();
                 var nextAdd = "";
@@ -307,7 +330,7 @@ namespace WCS.WorkEngineering.Systems
                                 v.Data4.Type
                             }).ToList();
                             //两个工位同时码垛,并不会一个执行一次,只有一个托盘任务全部执行完毕,才会继续执行下一个,先生成任务的码垛工位会优先执行
-                            var taskInfos = db.Default.Queryable<WCS_TaskInfo>().UpdLock().Where(v => v.Type == TaskType.OutDepot && (v.Status == Entity.TaskStatus.WaitingToExecute || v.Status == TaskStatus.ConveyorExecution))
+                            var taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Type == TaskType.OutDepot && (v.Status == Entity.TaskStatus.WaitingToExecute || v.Status == TaskStatus.ConveyorExecution))
                                 .ToList()
                                                                                                     .Where(v => allOutCode.Any(x => v.SrmStation == x.Code && v.PalletType == x.Type)).ToList();
 

+ 3 - 3
业务工程/分拣库/WCS.WorkEngineering/Systems/环形库/环形库码垛结束.cs

@@ -39,9 +39,9 @@ namespace WCS.WorkEngineering.Systems.环形库
             {
                 var db = _db.Default;
                 var taskNoList = obj.Data5.GetTaskNoList().ToList();
-                var tasks = db.Queryable<WCS_TaskInfo>().UpdLock().Where(x => taskNoList.Contains(x.ID) && x.Status == TaskStatus.ConveyorExecution).ToList();
-                var deliveryTask = db.Queryable<WCS_TaskInfo>().UpdLock().Single(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code) ?? throw new KnownException($"未找到当前站台对应的托盘搬运任务", LogLevelEnum.High);
-                var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().Single(x => x.AddrFrom == obj.Entity.Code && x.Type == TaskType.EnterDepot);
+                var tasks = db.Queryable<WCS_TaskInfo>().Where(x => taskNoList.Contains(x.ID) && x.Status == TaskStatus.ConveyorExecution).ToList();
+                var deliveryTask = db.Queryable<WCS_TaskInfo>().Single(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code) ?? throw new KnownException($"未找到当前站台对应的托盘搬运任务", LogLevelEnum.High);
+                var taskInfo = db.Queryable<WCS_TaskInfo>().Single(x => x.AddrFrom == obj.Entity.Code && x.Type == TaskType.EnterDepot);
                 if (deliveryTask.Status != Entity.TaskStatus.RgvCompleted) throw new KnownException($"搬运任务状态异常:{deliveryTask.ID}", LogLevelEnum.High);
                 if (taskInfo == null)
                 {

+ 55 - 43
业务工程/分拣库/WCS.WorkEngineering/Systems/码垛区域生成空托盘任务.cs

@@ -25,14 +25,16 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Device<IStation520> objDev)
         {
-            if (objDev.Entity.Code == nameof(TrussCreateEmptyTray))
+            var lastIsTruss = objDev.Entity.GetFlag<bool>("LastIsTruss");
+            objDev.Entity.SetFlag("LastIsTruss", !lastIsTruss);
+            if (lastIsTruss)
             {
                 WCS_Palletizing palletizing = null;
                 SqlSugarHelper.Do(_db =>
                 {
                     var db = _db.Default;
                     //取一个时间最靠前的,没有绑定码垛工位的码垛记录
-                    var palletizingInfoList = db.Queryable<WCS_Palletizing>().UpdLock().Where(x => x.PalletizingStation == null && !x.Finish).OrderBy(x => x.AddTime).ToList();
+                    var palletizingInfoList = db.Queryable<WCS_Palletizing>().Where(x => x.PalletizingStation == null && !x.Finish).OrderBy(x => x.AddTime).ToList();
                     if (!palletizingInfoList.Any())
                     {
                         World.Log("没有码垛信息可用!");
@@ -41,8 +43,6 @@ namespace WCS.WorkEngineering.Systems
                     foreach (var palletizingInfo in palletizingInfoList)
                     {
                         if (palletizing != null) continue;
-                        //var palleTask = db.Queryable<WCS_TaskInfo>().First(x => x.ID == palletizingInfo.TaskId && (x.Status == TaskStatus.FinishOfShunt || x.Status == TaskStatus.ConveyorExecution));
-                        //if (palleTask == null) throw new Exception($"未找到任务{palleTask.ID}");
                         //获取可以使用的放货站台信息
                         var taskAddNext = Device.All.FirstOrDefault(x => x.Code == palletizingInfo.TaskAddNext)?.Targets.FirstOrDefault()?.Targets.Where(x => x.HasFlag(DeviceFlags.桁架码垛位));
                         if (taskAddNext == null)
@@ -52,7 +52,7 @@ namespace WCS.WorkEngineering.Systems
                         }
                         var devs = Device.All.Where(x => taskAddNext.Contains(x)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).ToList();
                         //获取所有的未结束且有码垛工位的码垛记录
-                        var palletizingStation = db.Queryable<WCS_Palletizing>().UpdLock().Where(x => !x.Finish && x.PalletizingStation != null).Select(x => x.PalletizingStation).ToList();
+                        var palletizingStation = db.Queryable<WCS_Palletizing>().Where(x => !x.Finish && x.PalletizingStation != null).Select(x => x.PalletizingStation).ToList();
 
                         //取一个可用用于码垛的地方
                         var dev = devs.Where(x => !palletizingStation.Contains(x.Entity.Code)).FirstOrDefault(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status));
@@ -102,58 +102,70 @@ namespace WCS.WorkEngineering.Systems
             }
             else
             {
-                var obj = new Device<IStation520, IStation521, IStation523>(Device.All.First(x => x.Code == objDev.Entity.Code), World);
-                if (obj.Data3.Status.HasFlag(StationStatus.PH_Status)) return;
+                var devs = Device.All.Where(x => x.HasFlag(DeviceFlags.环形库码垛工位)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World));
+                devs.Where(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status));
                 WCS_TaskInfo deliveryTask = null;
-                SqlSugarHelper.Do(_db =>
+                foreach (var obj in devs)
                 {
-                    var db = _db.Default;
-                    //检查是否有待执行状态放货点是自己的出库任务
-                    var ringTask = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.Type == TaskType.OutDepot && x.Status <= TaskStatus.WaitingToExecute && x.SrmStation == obj.Entity.Code);
-                    if (ringTask == null)
+                    if (deliveryTask != null)
                     {
-                        //开始申请码垛任务
-                        WmsApi.ApplyPalletizingStockOut(obj.Entity.Code, obj.Entity.Sources.Single(x => x.HasFlag(DeviceFlags.Robot)).Code);
-                        return;
+                        continue;
                     }
-                    var task = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code);
-                    if (task != null) return;
-                    //开始获取当前地址上个设备的上一个设备中的非零九托盘拆机
-                    var addrFrom = obj.Entity.Sources.SelectMany(x => x.Sources).Single(x => x.HasFlag(DeviceFlags.拆盘机));
-                    var dev = Device.All.Where(x => x.Code == addrFrom.Code).Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
-                    if (dev.Data.TaskNumber != 0 || dev.Data.GoodsEnd != 0) throw new Exception($"{dev.Entity.Code}有残留任务信息,请处理!");
-                    //开始创建搬运任务
-                    task = new WCS_TaskInfo()
+                    SqlSugarHelper.Do(_db =>
                     {
-                        AddrFrom = addrFrom.Code,
-                        AddrTo = obj.Entity.Code,
-                        BarCode = "码垛托盘搬运-" + obj.Entity.Code,
-                        Status = Entity.TaskStatus.NewBuild,
-                        PalletType = ringTask.PalletType,
-                        FullQty = ringTask.FullQty,
-                        Type = TaskType.Delivery,
-                        AddWho = "WCS",
-                        AddTime = DateTime.Now
-                    };
-                    var res = db.InsertableRowLock(task).ExecuteReturnEntity();
-                    var taskOld = res.Mapper<WCS_TaskOld, WCS_TaskInfo>();
-                    taskOld.Id = res.ID;
-                    taskOld.AddTime = DateTime.Now; ;
-                    db.InsertableRowLock(taskOld).SplitTable().ExecuteCommand();
-                    res.AddWCS_TASK_DTL(db, obj.Entity.Code, task.AddrTo, "初始化码垛托盘搬运任务");
-                    deliveryTask = res;
-                });
+                        var db = _db.Default;
+                        //检查是否有待执行状态放货点是自己的出库任务
+                        var ringTask = db.Queryable<WCS_TaskInfo>().First(x => x.Type == TaskType.OutDepot && x.Status <= TaskStatus.WaitingToExecute && x.SrmStation == obj.Entity.Code);
+                        if (ringTask == null)
+                        {
+                            //开始申请码垛任务
+                            WmsApi.ApplyPalletizingStockOut(obj.Entity.Code, obj.Entity.Sources.Single(x => x.HasFlag(DeviceFlags.Robot)).Code);
+                            return;
+                        }
+                        var task = db.Queryable<WCS_TaskInfo>().First(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code);
+                        if (task != null) return;
+                        //开始获取当前地址上个设备的上一个设备中的非零九托盘拆机
+                        var addrFrom = obj.Entity.Sources.SelectMany(x => x.Sources).Single(x => x.HasFlag(DeviceFlags.拆盘机));
+                        var dev = Device.All.Where(x => x.Code == addrFrom.Code).Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
+                        if (dev.Data.TaskNumber != 0 || dev.Data.GoodsEnd != 0)
+                        {
+                            World.Log($"{dev.Entity.Code}有残留任务信息,请处理!");
+                            return;
+                        }
+
+                        //开始创建搬运任务
+                        task = new WCS_TaskInfo()
+                        {
+                            AddrFrom = addrFrom.Code,
+                            AddrTo = obj.Entity.Code,
+                            BarCode = "码垛托盘搬运-" + obj.Entity.Code,
+                            Status = Entity.TaskStatus.NewBuild,
+                            PalletType = ringTask.PalletType,
+                            FullQty = ringTask.FullQty,
+                            Type = TaskType.Delivery,
+                            AddWho = "WCS",
+                            AddTime = DateTime.Now
+                        };
+                        var res = db.InsertableRowLock(task).ExecuteReturnEntity();
+                        var taskOld = res.Mapper<WCS_TaskOld, WCS_TaskInfo>();
+                        taskOld.Id = res.ID;
+                        taskOld.AddTime = DateTime.Now;
+                        db.InsertableRowLock(taskOld).SplitTable().ExecuteCommand();
+                        res.AddWCS_TASK_DTL(db, obj.Entity.Code, task.AddrTo, "初始化码垛托盘搬运任务");
+                        deliveryTask = res;
+                    });
+                }
 
                 if (deliveryTask == null) return;
                 var dev = Device.All.Where(x => x.Code == deliveryTask.AddrFrom).Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
                 dev.Data.TaskNumber = deliveryTask.ID;
-                dev.Data.GoodsEnd = obj.Entity.Code.ToShort();
+                dev.Data.GoodsEnd = deliveryTask.AddrTo.ToShort();
             }
         }
 
         public override bool Select(Device dev)
         {
-            return dev.HasFlag(DeviceFlags.环形库码垛工位) || dev.Code == nameof(TrussCreateEmptyTray);
+            return dev.Code == nameof(PalletizCreateEmptyTray);
         }
     }
 }

+ 2 - 2
业务工程/分拣库/WCS.WorkEngineering/WorkStart.cs

@@ -28,7 +28,7 @@ namespace WCS.WorkEngineering
         {
             #region 无交互触发设备
 
-            var devs = new List<string>() { nameof(TrussCreateEmptyTray), "AGVIn", "AGVOut", nameof(NoInteractionSystems), nameof(UpLoadSystems), nameof(TrussCreateTwoOut) };
+            var devs = new List<string>() { nameof(PalletizCreateEmptyTray), "AGVIn", "AGVOut", nameof(NoInteractionSystems), nameof(UpLoadSystems), nameof(TrussCreateTwoOut) };
             foreach (var conv in devs.Select(code => new Device(code)))
             {
                 conv.AddProtocol<IStation520>(0, 520, "1");
@@ -1097,7 +1097,7 @@ namespace WCS.WorkEngineering
                      "1261", "1275", "1289", "1303", "1317", "1331", "1345", "1359", "1373", "1386" , "1461", "1475", "1489", "1503", "1517", "1531", "1545", "1559", "1573", "1586" } },
                 //{ DeviceFlags.拆盘机09, new List<string>(){ /*"1606", "1616",*/"1626","1636","1646","1656" } },
                 { DeviceFlags.拆盘机, new List<string>(){ "1602", "1612", "1622", "1632", "1642", "1652" } },
-                { DeviceFlags.桁架码垛位, new List<string>(){ "1670", "1671", "1672", "1673", "1674", "1675", "1664","1662","1663","1665","1677","1678","1679","1680","1685","1686","1687","1688","1689",
+                { DeviceFlags.桁架码垛位, new List<string>(){ /*"1670", "1671",*/ "1672", "1673", "1674", "1675", "1664","1662","1663","1665","1677","1678","1679","1680",/*"1685","1686",*/"1687","1688","1689",
                     "1690", "1692", "1693", "1694", "1695", "1700", "1701", "1702", "1703", "1704", "1705", "1707", "1708", "1709", "1710", "1715", "1716", "1717", "1718", "1719", "1720", "1722", "1723", "1724", "1725", "1730", "1731", "1732", "1733", "1734", "1735", "1737", "1738", "1739", "1740", "1745", "1746", "1747", "1748", "1749", "1750" } },
                 { DeviceFlags.环形库码垛工位, new List<string>(){ "1666", "1661", "1676", "1681", "1691", "1696", "1706", "1711"/*, "1721", "1726", "1736", "1741"*/ } },
                 { DeviceFlags.AGV取货站台口, new List<string>(){ "2533", "2534", "2734", "2733","2934","2933","3133", "3134"/*,"3333","3334","3533","3534" */} },