Ver Fonte

重构锁定方法及优化任务状态同步逻辑

在 `SqlExtension.cs` 文件中,`UpdLock` 方法的实现从 `WITH(ROWLOCK)` 改为 `WITH(ROWLOCK,UPDLOCK)`。

在多个文件中,将 `UpdLock` 方法调用替换为 `RowLock` 方法调用:
- `TaskExtension.cs`
- `AgvSystems.cs`
- `NoInteractionSystems.cs`
- `RGVSystems.cs`
- `SrmSystems.cs`
- `AgvController.cs`

在 `UpLoadSystems.cs` 文件中,增加了 `System.ComponentModel` 和 `System.Threading.Tasks` 的引用,并对 `UpLoadSystems` 类进行了重构,优化了任务状态同步的逻辑。
林豪 左 há 1 ano atrás
pai
commit
8750c2e89b

+ 1 - 1
ServiceCenter/Extensions/SqlExtension.cs

@@ -35,7 +35,7 @@ namespace ServiceCenter.Extensions
         /// <returns></returns>
         public static ISugarQueryable<T> UpdLock<T>(this ISugarQueryable<T> obj)
         {
-            return obj.With("WITH(ROWLOCK)");
+            return obj.With("WITH(ROWLOCK,UPDLOCK)");
         }
 
         /// <summary>

+ 2 - 2
YWGC/FJK/WCS.WorkEngineering/Extensions/TaskExtension.cs

@@ -90,7 +90,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>().RowLock().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);
@@ -116,7 +116,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>().RowLock().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>();

+ 1 - 1
YWGC/FJK/WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -102,7 +102,7 @@ namespace WCS.WorkEngineering.Systems
                                         {
                                             if (agv.TaskType is AGVTaskType.CallForMaterial or AGVTaskType.ForkliftFilling or AGVTaskType.CallMaterial)
                                             {
-                                                var taskInfoFinish = db.Default.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.AgvTaskID == agv.ID);
+                                                var taskInfoFinish = db.Default.Queryable<WCS_TaskInfo>().RowLock().First(v => v.AgvTaskID == agv.ID);
                                                 //if (taskInfo == null) throw new Exception($"未找到AGV任务{agv.ID}对应WCS任务");
                                                 //更新AGV任务状态
                                                 agv.Status = AGVTaskStatus.MissionCompleted;

+ 1 - 1
YWGC/FJK/WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -257,7 +257,7 @@ namespace WCS.WorkEngineering.Systems
                                         };
                                         //开始处理车间叫料AGV任务任务
                                         db.Default.InsertableRowLock(agvTask).SplitTable().ExecuteCommand();
-                                        agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
+                                        agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().RowLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
                                         if (agvTask.Status != AGVTaskStatus.NewBuild)
                                         {
                                             World.Log($"AGV任务{agvTask.ID}状态不是新建", LogLevelEnum.High);

+ 4 - 4
YWGC/FJK/WCS.WorkEngineering/Systems/RGVSystems.cs

@@ -134,7 +134,7 @@ 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());
+                                    var task = db.Queryable<WCS_TaskInfo>().RowLock().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);
@@ -150,7 +150,7 @@ namespace WCS.WorkEngineering.Systems
                                 else //默认除了桁架码垛工位与环形库码垛工位外的任务就只有芯股用空托入库了
                                 {
                                     //开始处理对应的入库任务信息
-                                    var task = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.Type == TaskType.EnterDepot && x.ID == obj.Data2.TaskNumber && x.AddrNext == obj.Data2.DestPosition.ToString());
+                                    var task = db.Queryable<WCS_TaskInfo>().RowLock().First(x => x.Type == TaskType.EnterDepot && x.ID == obj.Data2.TaskNumber && x.AddrNext == obj.Data2.DestPosition.ToString());
                                     if (task == null)
                                     {
                                         World.Log($"未找到对应的空托入库任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
@@ -209,7 +209,7 @@ namespace WCS.WorkEngineering.Systems
                                         }
                                         else if (destPosition.HasFlag(DeviceFlags.环形库码垛工位))
                                         {
-                                            var deliveryTask = db.Queryable<WCS_TaskInfo>().UpdLock()
+                                            var deliveryTask = db.Queryable<WCS_TaskInfo>().RowLock()
                                                 .First(x => x.ID == obj.Data.TaskNumber);
                                             countQty = deliveryTask.FullQty;
                                             shortCode = deliveryTask.PalletType;
@@ -223,7 +223,7 @@ namespace WCS.WorkEngineering.Systems
                                     }
                                     else
                                     {
-                                        var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.ID == obj.Data.TaskNumber);
+                                        var taskInfo = db.Queryable<WCS_TaskInfo>().RowLock().First(x => x.ID == obj.Data.TaskNumber);
                                         taskInfo.Status = TaskStatus.RgvCompleted;
                                         taskInfo.EditTime = DateTime.Now;
                                         taskInfo.LastInteractionPoint = obj.Entity.Code;

+ 1 - 1
YWGC/FJK/WCS.WorkEngineering/Systems/SrmSystems.cs

@@ -377,7 +377,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.Status == TaskStatus.WaitingToExecute && allOutCode.Contains(v.SrmStation) && v.Type == TaskType.OutDepot)
+                   var task = db.Default.Queryable<WCS_TaskInfo>().RowLock().Where(v => v.Status == TaskStatus.WaitingToExecute && allOutCode.Contains(v.SrmStation) && v.Type == TaskType.OutDepot)
                                                                   .OrderByDescending(v => v.Priority)
                                                                   .OrderByDescending(v => v.Floor == floor ? 1 : 0)
                                                                   .OrderBy(v => v.AddTime)

+ 150 - 104
YWGC/FJK/WCS.WorkEngineering/Systems/UpLoadSystems.cs

@@ -1,6 +1,7 @@
-using ServiceCenter.Extensions;
+using System.ComponentModel;
+using System.Threading.Tasks;
+using ServiceCenter.Extensions;
 using ServiceCenter.SqlSugars;
-using System.ComponentModel;
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.Station;
@@ -10,126 +11,171 @@ using WCS.WorkEngineering.WebApi.Models.WMS.Response;
 using WCS.WorkEngineering.Worlds;
 using TaskStatus = WCS.Entity.TaskStatus;
 
-namespace WCS.WorkEngineering.Systems
+namespace WCS.WorkEngineering.Systems;
+
+/// <summary>
+///     UpLoadSystems
+/// </summary>
+[BelongTo(typeof(UpLoadWorld))]
+[Description("UpLoadSystems")]
+public class UpLoadSystems : DeviceSystem<Device<IStation520>>
 {
-    /// <summary>
-    ///  UpLoadSystems
-    /// </summary>
-    [BelongTo(typeof(UpLoadWorld))]
-    [Description("UpLoadSystems")]
-    public class UpLoadSystems : DeviceSystem<Device<IStation520>>
-    {
-        protected override bool ParallelDo => true;
+    protected override bool ParallelDo => true;
 
-        public override void Do(Device<IStation520> obj)
+    public override void Do(Device<IStation520> obj)
+    {
+        //更新出库放货完成状态
+        SqlSugarHelper.Do(_db =>
         {
-            //更新出库放货完成状态
-            SqlSugarHelper.Do(_db =>
-            {
-                var taskIdList = new List<WCS_TaskInfo>();
-                var nowTime = DateTime.Now;
+            var nowTime = DateTime.Now;
 
-                var db = _db.Default;
-                var taskList = db.Queryable<WCS_TaskInfo>().UpdLock().Where(x => x.Uploaded != TaskStatus.ConveyorExecution && x.Status == TaskStatus.StackerCompleted && x.Type == TaskType.OutDepot).ToList();
+            var db = _db.Default;
+            var taskList = db.Queryable<WCS_TaskInfo>().RowLock().Where(x =>
+                x.Uploaded != TaskStatus.ConveyorExecution && x.Status == TaskStatus.StackerCompleted &&
+                x.Type == TaskType.OutDepot).ToList();
 
-                var isEnd = false;
+            WCS_TaskInfo taskNow = null;
 
-                //一次就同步一条数据即可
-                foreach (var task in taskList)
-                {
-                    if (isEnd) continue;
-
-                    var res = WmsApi.SrmPickOutCompleted(task.ID);
-                    if (res.ResCode == ResponseStatusCodeEnum.Sucess)
-                    {
-                        taskIdList.Add(task); //更新成功
-                        isEnd = true;
-                    }
-                    World.Log($"出库放货完成状态同步失败:{task.ID}[{res.ResMsg}]");
-                }
+            // 1. 遍历任务列表,处理任务完成状态
+            foreach (var task in taskList)
+            {
+                var res = WmsApi.SrmPickOutCompleted(task.ID);
 
-                //拆分防止锁表
-                foreach (var task in taskIdList)
+                if (res.ResCode == ResponseStatusCodeEnum.Sucess)
                 {
-                    task.Uploaded = TaskStatus.ConveyorExecution;
-                    task.Status = TaskStatus.ConveyorExecution;
-                    task.EditTime = nowTime;
-                    db.UpdateableRowLock(task).UpdateColumns(x => new { x.Uploaded, x.EditTime, x.Status }).ExecuteCommand();
-                    task.AddWCS_TASK_DTL(db, "", $"同步出库任务放货完成状态同步至WMS");
+                    taskNow = task; // 记录成功的任务
+                    break; // 只需要成功处理一个任务,跳出循环
                 }
-            });
 
-            //环形库组盘任务/立库入库任务/二楼立库出库//芯股叫料 更新完成
-            SqlSugarHelper.Do(_db =>
+                World.Log($"出库放货完成状态同步失败: 任务ID {task.ID}, 错误信息: {res.ResMsg}");
+            }
+
+            // 2. 更新任务状态并记录日志,仅当 taskOld 不为 null 时才执行
+            taskNow.Uploaded = TaskStatus.ConveyorExecution;
+            taskNow.Status = TaskStatus.ConveyorExecution;
+            taskNow.EditTime = nowTime;
+            try
             {
-                var taskIdList = new List<WCS_TaskOld>();
-                var nowTime = DateTime.Now;
-                var db = _db.Default;
-                var taskList = db.Queryable<WCS_TaskOld>().UpdLock()
-                    .Where(x => ((x.Type == TaskType.SetPlate && x.WarehouseCode.Contains("R"))
-                                || ((x.Type == TaskType.EnterDepot || x.Type == TaskType.OutDepot) && !x.WarehouseCode.Contains("R"))
-                                || (x.Type == TaskType.EnterDepot && x.WarehouseCode.Contains("CRZP"))
-                                || (x.Type == TaskType.OutDepot && x.Device == "CR")
-                                || (x.Type == TaskType.OutDepot && x.AddrFrom.Contains("NSTJ") && x.AddrTo.Contains("NSTJ")))
-                               && x.Status == TaskStatus.Finish && x.Uploaded != TaskStatus.Finish)
-                    .SplitTable(x => x.Take(2)).ToList();
-
-                var isEnd = false;
-                foreach (var task in taskList)
-                {
-                    if (isEnd) continue;
-                    var res = WmsApi.CompleteTask(task.Id);
-                    if (res.ResCode == ResponseStatusCodeEnum.Sucess)
-                    {
-                        taskIdList.Add(task);
-                        isEnd = true;
-                    }
-                    World.Log($"入库完成状态同步失败:{task.Id}[{res.ResMsg}]");
-                }
+                // 使用行锁和分表更新,防止锁表
+                db.Updateable(taskNow).UpdateColumns(x => new { x.Uploaded, x.EditTime, x.Status }).ExecuteCommand();
+                // 记录任务详细日志
+                taskNow.AddWCS_TASK_DTL(db, "", "同步出库任务放货完成状态同步至WMS");
+            }
+            catch (Exception ex)
+            {
+                World.Log($"任务ID {taskNow.ID} 出库放货完成状态同步失败,错误信息: {ex.Message}");
+            }
 
-                //拆分防止锁表
-                foreach (var task in taskIdList)
-                {
-                    task.Uploaded = TaskStatus.Finish;
-                    task.EditTime = nowTime;
-                    db.UpdateableRowLock(task).SplitTable(x => x.Take(2)).ExecuteCommand();
-                    task.AddWCS_TASK_DTL(db, "", $"同步入库完成状态同步至WMS");
-                }
-            });
+            var isEnd = false;
 
-            ////立库二楼出库更新完成
-            //SqlSugarHelper.Do(_db =>
+            ////一次就同步一条数据即可
+            //foreach (var task in taskList)
             //{
-            //    var taskIdList = new List<int>();
-            //    var nowTime = DateTime.Now;
-            //    var db = _db.Default;
-            //    var taskList = db.Queryable<WCS_TaskOld>().SplitTable(x => x.Take(2))
-            //        .Where(x => ((x.Type == TaskType.SetPlate && x.WarehouseCode.Contains("R")) || (x.Type == TaskType.EnterDepot && !x.WarehouseCode.Contains("R")))
-            //                    && x.Status == TaskStatus.Finish
-            //                    && x.Uploaded != TaskStatus.Finish).ToList();
-
-            //    foreach (var task in taskList)
-            //    {
-            //        var res = WmsApi.CompleteTask(task.Id);
-            //        if (res.ResCode == ResponseStatusCodeEnum.Sucess) taskIdList.Add(task.Id);
-            //        else World.Log($"入库完成状态同步失败:{task.Id}[{res.ResMsg}]");
-            //    }
+            //    if (isEnd) continue;
 
-            //    //拆分防止锁表
-            //    foreach (var taskId in taskIdList)
+            //    var res = WmsApi.SrmPickOutCompleted(task.ID);
+            //    if (res.ResCode == ResponseStatusCodeEnum.Sucess)
             //    {
-            //        var task = db.Queryable<WCS_TaskOld>().SplitTable(x => x.Take(2)).First(x => x.Id == taskId);
-            //        task.Uploaded = TaskStatus.Finish;
-            //        task.EditTime = nowTime;
-            //        db.Updateable(task).SplitTable(x => x.Take(2)).ExecuteCommand();
-            //        task.AddWCS_TASK_DTL(db, "", $"同步入库完成状态同步至WMS");
+            //        taskIdList.Add(task); //更新成功
+            //        isEnd = true;
             //    }
-            //});
-        }
 
-        public override bool Select(Device dev)
+            //    World.Log($"出库放货完成状态同步失败:{task.ID}[{res.ResMsg}]");
+            //}
+
+            ////拆分防止锁表
+            //foreach (var task in taskIdList)
+            //{
+            //    task.Uploaded = TaskStatus.ConveyorExecution;
+            //    task.Status = TaskStatus.ConveyorExecution;
+            //    task.EditTime = nowTime;
+            //    db.UpdateableRowLock(task).UpdateColumns(x => new { x.Uploaded, x.EditTime, x.Status })
+            //        .ExecuteCommand();
+            //    task.AddWCS_TASK_DTL(db, "", "同步出库任务放货完成状态同步至WMS");
+            //}
+
+        });
+
+        //环形库组盘任务/立库入库任务/二楼立库出库//芯股叫料 更新完成
+        SqlSugarHelper.Do(_db =>
         {
-            return dev.Code == nameof(UpLoadSystems);
-        }
+            var nowTime = DateTime.Now;
+            var db = _db.Default;
+            var taskList = db.Queryable<WCS_TaskOld>().RowLock()
+                .Where(x => ((x.Type == TaskType.SetPlate && x.WarehouseCode.Contains("R"))
+                             || ((x.Type == TaskType.EnterDepot || x.Type == TaskType.OutDepot) &&
+                                 !x.WarehouseCode.Contains("R"))
+                             || (x.Type == TaskType.EnterDepot && x.WarehouseCode.Contains("CRZP"))
+                             || (x.Type == TaskType.OutDepot && x.Device == "CR")
+                             || (x.Type == TaskType.OutDepot && x.AddrFrom.Contains("NSTJ") &&
+                                 x.AddrTo.Contains("NSTJ")))
+                            && x.Status == TaskStatus.Finish && x.Uploaded != TaskStatus.Finish)
+                .SplitTable(x => x.Take(2)).ToList();
+
+            WCS_TaskOld taskOld = null;
+
+            // 1. 遍历任务列表,处理任务完成状态
+            foreach (var task in taskList)
+            {
+                var res = WmsApi.CompleteTask(task.Id);
+
+                if (res.ResCode == ResponseStatusCodeEnum.Sucess)
+                {
+                    taskOld = task; // 记录成功的任务
+                    break; // 只需要成功处理一个任务,跳出循环
+                }
+
+                World.Log($"入库完成状态同步失败: 任务ID {task.Id}, 错误信息: {res.ResMsg}");
+            }
+
+            // 2. 更新任务状态并记录日志,仅当 taskOld 不为 null 时才执行
+            taskOld.Uploaded = TaskStatus.Finish;
+            taskOld.EditTime = nowTime;
+            try
+            {
+                // 使用行锁和分表更新,防止锁表
+                db.Updateable(taskOld).SplitTable(x => x.Take(2)).ExecuteCommand();
+                // 记录任务详细日志
+                taskOld.AddWCS_TASK_DTL(db, "", "同步入库完成状态同步至WMS");
+            }
+            catch (Exception ex)
+            {
+                World.Log($"任务ID {taskOld.Id} 入库完成状态同步失败,错误信息: {ex.Message}");
+            }
+        });
+
+        ////立库二楼出库更新完成
+        //SqlSugarHelper.Do(_db =>
+        //{
+        //    var taskIdList = new List<int>();
+        //    var nowTime = DateTime.Now;
+        //    var db = _db.Default;
+        //    var taskList = db.Queryable<WCS_TaskOld>().SplitTable(x => x.Take(2))
+        //        .Where(x => ((x.Type == TaskType.SetPlate && x.WarehouseCode.Contains("R")) || (x.Type == TaskType.EnterDepot && !x.WarehouseCode.Contains("R")))
+        //                    && x.Status == TaskStatus.Finish
+        //                    && x.Uploaded != TaskStatus.Finish).ToList();
+
+        //    foreach (var task in taskList)
+        //    {
+        //        var res = WmsApi.CompleteTask(task.Id);
+        //        if (res.ResCode == ResponseStatusCodeEnum.Sucess) taskIdList.Add(task.Id);
+        //        else World.Log($"入库完成状态同步失败:{task.Id}[{res.ResMsg}]");
+        //    }
+
+        //    //拆分防止锁表
+        //    foreach (var taskId in taskIdList)
+        //    {
+        //        var task = db.Queryable<WCS_TaskOld>().SplitTable(x => x.Take(2)).First(x => x.Id == taskId);
+        //        task.Uploaded = TaskStatus.Finish;
+        //        task.EditTime = nowTime;
+        //        db.Updateable(task).SplitTable(x => x.Take(2)).ExecuteCommand();
+        //        task.AddWCS_TASK_DTL(db, "", $"同步入库完成状态同步至WMS");
+        //    }
+        //});
+    }
+
+    public override bool Select(Device dev)
+    {
+        return dev.Code == nameof(UpLoadSystems);
     }
 }

+ 1 - 1
YWGC/FJK/WCS.WorkEngineering/Systems/一楼叠盘机入库.cs

@@ -102,7 +102,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>().RowLock().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.巷道));

+ 2 - 2
YWGC/FJK/WCS.WorkEngineering/Systems/分拣支线/环形库分流点.cs

@@ -69,12 +69,12 @@ 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.FinishOfShunt && !v.BarCode.Contains("Error"));
+                var taskInfo = db.Queryable<WCS_TaskInfo>().RowLock().First(v => v.ID == obj.Data2.TaskNumber && v.Status < TaskStatus.FinishOfShunt && !v.BarCode.Contains("Error"));
                 if (obj.Data2.TaskNumber == 1 || obj.Data2.TaskNumber == 3 || obj.Data2.TaskNumber == 2)
                 {
                     var type = goodsType.ToString();
                     //找到一条起点是当前位置且状态小于2的任务
-                    taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().OrderBy(x => x.AddTime).First(x => x.AddrFrom == obj.Entity.Code && x.BarCode.Contains("Error") && x.AddrNext == null && x.GoodsType == goodsType);
+                    taskInfo = db.Queryable<WCS_TaskInfo>().RowLock().OrderBy(x => x.AddTime).First(x => x.AddrFrom == obj.Entity.Code && x.BarCode.Contains("Error") && x.AddrNext == null && x.GoodsType == goodsType);
                     if (taskInfo == null)
                     {
                         if (obj.Data2.TaskNumber == 1)

+ 1 - 1
YWGC/FJK/WCS.WorkEngineering/Systems/机台叫料生成AGV任务.cs

@@ -59,7 +59,7 @@ namespace WCS.WorkEngineering.Systems
                 var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only) + task.ID;
 
                 //开始创建AGV任务
-                var agvTask = db.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
+                var agvTask = db.Queryable<WCS_AgvTaskInfo>().RowLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
                 if (agvTask == null)
                 {
                     //开始处理车间叫料AGV任务任务

+ 5 - 2
YWGC/FJK/WCS.WorkEngineering/Systems/环形库/机械臂cs.cs

@@ -340,8 +340,11 @@ namespace WCS.WorkEngineering.Systems
                         v.Data4.Type
                     }).ToList();
                     //两个工位同时码垛,并不会一个执行一次,只有一个托盘任务全部执行完毕,才会继续执行下一个,先生成任务的码垛工位会优先执行
-                    var taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(v => (v.Status == Entity.TaskStatus.WaitingToExecute || v.Status == TaskStatus.ConveyorExecution) && v.Type == TaskType.OutDepot)
-                        .ToList().Where(v => allOutCode.Any(x => v.SrmStation == x.Code && v.PalletType == x.Type)).ToList();
+                    var taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(v =>
+                            (v.Status == TaskStatus.WaitingToExecute || v.Status == TaskStatus.ConveyorExecution) &&
+                            v.Type == TaskType.OutDepot && v.Device == obj.Entity.Code)
+                        .ToList().Where(v => allOutCode.Any(x => v.SrmStation == x.Code && v.PalletType == x.Type))
+                        .ToList();
 
                     var deliveryTask = db.Default.Queryable<WCS_TaskInfo>().Where(x => x.Status > 0 && x.Type == TaskType.Delivery).ToList().Select(x => x.AddrTo);
                     taskInfos = taskInfos.Where(x => deliveryTask.Contains(x.SrmStation)).ToList();

+ 3 - 3
YWGC/FJK/WCS.WorkEngineering/Systems/环形库码垛结束.cs

@@ -39,14 +39,14 @@ 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 tasks = db.Queryable<WCS_TaskInfo>().RowLock().Where(x => taskNoList.Contains(x.ID) && x.Status == TaskStatus.ConveyorExecution).ToList();
                 if (tasks.Count() > 0 && tasks.Count() != obj.Data5.MaxQuantity)
                 {
                     World.Log($"任务数量{tasks.Count()}-最大码垛数量{obj.Data5.MaxQuantity}");
                     return;
                 } 
-                var deliveryTask = db.Queryable<WCS_TaskInfo>().UpdLock().Single(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code && x.Status >= TaskStatus.RgvExecution && x.Status < TaskStatus.Finish) ?? throw new KnownException($"未找到当前站台对应的托盘搬运任务", LogLevelEnum.High);
-                var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().Single(x => x.Status <= TaskStatus.RgvCompleted && x.AddrFrom == obj.Entity.Code && x.Type == TaskType.EnterDepot);
+                var deliveryTask = db.Queryable<WCS_TaskInfo>().RowLock().Single(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code && x.Status >= TaskStatus.RgvExecution && x.Status < TaskStatus.Finish) ?? throw new KnownException($"未找到当前站台对应的托盘搬运任务", LogLevelEnum.High);
+                var taskInfo = db.Queryable<WCS_TaskInfo>().RowLock().Single(x => x.Status <= TaskStatus.RgvCompleted && x.AddrFrom == obj.Entity.Code && x.Type == TaskType.EnterDepot);
                 if (deliveryTask.Status != TaskStatus.RgvCompleted) throw new KnownException($"搬运任务状态异常:{deliveryTask.ID}", LogLevelEnum.High);
                 if (taskInfo == null)
                 {

+ 1 - 1
YWGC/FJK/WCS.WorkEngineering/Systems/重绕区/叫料生成AGV任务.cs

@@ -52,7 +52,7 @@ namespace WCS.WorkEngineering.Systems.重绕区
                 var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only) + task.ID;
 
                 //开始创建AGV任务
-                var agvTask = db.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
+                var agvTask = db.Queryable<WCS_AgvTaskInfo>().RowLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
                 if (agvTask == null)
                 {
                     //开始处理叫料AGV任务任务

+ 2 - 2
YWGC/FJK/WCS.WorkEngineering/Systems/重绕区/组盘缓存生成AGV任务.cs

@@ -54,7 +54,7 @@ namespace WCS.WorkEngineering.Systems.重绕区
                 var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only) + task.ID;
 
                 //开始创建AGV任务
-                var agvTask = db.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.EnterDepot);
+                var agvTask = db.Queryable<WCS_AgvTaskInfo>().RowLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.EnterDepot);
                 if (agvTask == null)
                 {
                     db.InsertableRowLock(new WCS_AgvTaskInfo()
@@ -88,7 +88,7 @@ namespace WCS.WorkEngineering.Systems.重绕区
                 if (!devs.Any(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status))) return;
                 foreach (var dev in devs)
                 {
-                    if (!dev.Data3.Status.HasFlag(StationStatus.PH_Status) && !db.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(x => x.Take(2)).Any(x => x.Station == dev.Entity.Code && x.TaskType == AGVTaskType.EnterDepot
+                    if (!dev.Data3.Status.HasFlag(StationStatus.PH_Status) && !db.Queryable<WCS_AgvTaskInfo>().RowLock().SplitTable(x => x.Take(2)).Any(x => x.Station == dev.Entity.Code && x.TaskType == AGVTaskType.EnterDepot
                     && x.Status < AGVTaskStatus.MissionCompleted))
                     {
                         var res = WmsApi.GetFlatLocalIn(obj.Data2.TaskNumber,"T1",dev.Entity.Code,1);

+ 1 - 1
YWGC/FJK/WCS.WorkEngineering/Systems/重绕区/退料搬运.cs

@@ -62,7 +62,7 @@ namespace WCS.WorkEngineering.Systems.重绕区
                     var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only) + 9001;
 
                     //开始创建AGV任务
-                    var agvTask = db.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(x => x.Take(2)).Single(x => x.Position == obj.Entity.Code && x.TaskType == AGVTaskType.EnterDepot && x.Status < AGVTaskStatus.MissionCompleted);
+                    var agvTask = db.Queryable<WCS_AgvTaskInfo>().RowLock().SplitTable(x => x.Take(2)).Single(x => x.Position == obj.Entity.Code && x.TaskType == AGVTaskType.EnterDepot && x.Status < AGVTaskStatus.MissionCompleted);
                     if (agvTask == null)
                     {
                         //开始处理叫料AGV任务任务

+ 1 - 1
YWGC/FJK/WCS.WorkEngineering/WebApi/Controllers/AgvController.cs

@@ -71,7 +71,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         //            SqlSugarHelper.Do(db =>
         //            {
         //                //跟据AGVid找到对应的AGV任务
-        //                var agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(tabs => tabs.Take(2))
+        //                var agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().RowLock()().SplitTable(tabs => tabs.Take(2))
         //                    .First(v => v.AgvID == reqDto.taskCode && v.Status < AGVTaskStatus.MissionCompleted);
         //                if (agvTask == null)
         //                {