林豪 左 há 1 ano atrás
pai
commit
43acb80145
18 ficheiros alterados com 162 adições e 126 exclusões
  1. 2 1
      ServiceCenter/Extensions/SqlExtension.cs
  2. 27 0
      ServiceCenter/SqlSugars/SqlSugarHelper.cs
  3. 18 22
      业务工程/分拣库/WCS.WorkEngineering/Extensions/TaskExtension.cs
  4. 1 1
      业务工程/分拣库/WCS.WorkEngineering/Systems/DeviceWriteSystem.cs
  5. 2 2
      业务工程/分拣库/WCS.WorkEngineering/Systems/NoInteractionSystems.cs
  6. 15 15
      业务工程/分拣库/WCS.WorkEngineering/Systems/SrmSystems.cs
  7. 2 2
      业务工程/分拣库/WCS.WorkEngineering/Systems/UpLoadSystems.cs
  8. 5 2
      业务工程/分拣库/WCS.WorkEngineering/Systems/分拣主线/满轮主线预写入目标地址.cs
  9. 13 11
      业务工程/分拣库/WCS.WorkEngineering/Systems/分拣支线/桁架分流点.cs
  10. 9 7
      业务工程/分拣库/WCS.WorkEngineering/Systems/分拣支线/环形库分流点.cs
  11. 8 10
      业务工程/分拣库/WCS.WorkEngineering/Systems/机台叫料生成AGV任务.cs
  12. 3 3
      业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/二次码垛任务到RGV取货位处理.cs
  13. 4 3
      业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/创建二次码垛出库任务.cs
  14. 20 20
      业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架.cs
  15. 6 6
      业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架码垛工位任务结束处理.cs
  16. 7 6
      业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架缓存放行点.cs
  17. 19 14
      业务工程/分拣库/WCS.WorkEngineering/Systems/环形库/机械臂cs.cs
  18. 1 1
      业务工程/分拣库/WCS.WorkEngineering/Systems/码垛区域生成空托盘任务.cs

+ 2 - 1
ServiceCenter/Extensions/SqlExtension.cs

@@ -29,13 +29,14 @@ namespace ServiceCenter.Extensions
 
         /// <summary>
         ///  指定在读表中数据时设置更新锁(update lock)而不是设置共享锁,该锁一直保持到这个语句或整个事务结束,使用UpdLock的作用是允许用户先读取数据(而且不阻塞其他用户读数据),并且保证在后来再更新数据时,这一段时间内这些数据没有被其他用户修改。
+        ///  默认持有行级更新锁
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <param name="obj"></param>
         /// <returns></returns>
         public static ISugarQueryable<T> UpdLock<T>(this ISugarQueryable<T> obj)
         {
-            return obj.With(SqlWith.UpdLock);
+            return obj.With("WITH(ROWLOCK,UPDLOCK)");
         }
 
         /// <summary>

+ 27 - 0
ServiceCenter/SqlSugars/SqlSugarHelper.cs

@@ -127,6 +127,7 @@ namespace ServiceCenter.SqlSugars
             try
             {
                 db.Connect.BeginTran(IsolationLevel.ReadCommitted);//开始事务
+                db.Connect.Ado.CommandTimeOut = 2;
                 act(db);//执行委托
                 db.Connect.CommitTran();//提交事务
             }
@@ -136,5 +137,31 @@ namespace ServiceCenter.SqlSugars
                 throw new Exception(ex.Message);
             }
         }
+
+        /// <summary>
+        ///  直接返回查询结果
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="act"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public static T Do<T>(Func<SqlSugarHelper, T> act)
+        {
+            if (_Db == null) throw new Exception("请调用[SqlSugarHelper.SetDb]方法设置设置数据库连接");
+            var db = new SqlSugarHelper();
+            try
+            {
+                db.Connect.BeginTran();//开始事务
+                db.Connect.Ado.CommandTimeOut = 2;
+                var res = act(db);//执行委托
+                db.Connect.CommitTran();//提交事务
+                return res;
+            }
+            catch (Exception ex)
+            {
+                db.Connect.RollbackTran();//回滚事务
+                throw new Exception(ex.Message);
+            }
+        }
     }
 }

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

@@ -136,9 +136,6 @@ namespace WCS.WorkEngineering.Extensions
         /// <param name="db"></param>
         public static void Updateable(this WCS_TaskInfo taskInfo, SqlSugarScopeProvider db)
         {
-            taskInfo.EditTime = DateTime.Now;
-            taskInfo.EditWho = "WCS";
-            db.Updateable(taskInfo).ExecuteCommand();
         }
 
         ///// <summary>
@@ -213,13 +210,13 @@ namespace WCS.WorkEngineering.Extensions
                 WarehouseCode = task.WarehouseCode,
                 DeviceCode = task.Device
             };
-            palletizing = db.Insertable(palletizing).ExecuteReturnEntity();
-            foreach (var item in billBomsetinfos.GroupBy(x => x.Row).OrderBy(x => x.Key))
+            palletizing = db.InsertableRowLock(palletizing).ExecuteReturnEntity();
+            foreach (var item in billBomsetinfos.Where(x => x.IsEmpty == 0).GroupBy(x => x.Row).OrderBy(x => x.Key))
             {
                 var layerNo = item.Key <= 6 ? 1 : 2;
                 //获取层信息
-                var palletizingLayer = db.Queryable<WCS_PalletizingLayer>()
-                    .Single(x => x.PalletizingId == palletizing.Id && x.LayerNo == layerNo);
+                var palletizingLayer = db.Queryable<WCS_PalletizingLayer>().UpdLock().Single(x => x.PalletizingId == palletizing.Id && x.LayerNo == layerNo);
+
                 if (palletizingLayer == null)
                 {
                     palletizingLayer = new WCS_PalletizingLayer()
@@ -228,12 +225,11 @@ namespace WCS.WorkEngineering.Extensions
                         PalletizingId = palletizing.Id,
                         WarehouseCode = palletizing.WarehouseCode,
                     };
-                    palletizingLayer = db.Insertable(palletizingLayer).ExecuteReturnEntity();
+                    palletizingLayer = db.InsertableRowLock(palletizingLayer).ExecuteReturnEntity();
                 }
 
                 //获取行信息
-                var palletizingRow = db.Queryable<WCS_PalletizingRow>()
-                    .Single(x => x.PalletizingLayerId == palletizingLayer.Id && x.RowNo == item.Key);
+                var palletizingRow = db.Queryable<WCS_PalletizingRow>().UpdLock().Single(x => x.PalletizingLayerId == palletizingLayer.Id && x.RowNo == item.Key);
                 if (palletizingRow == null)
                 {
                     palletizingRow = new WCS_PalletizingRow()
@@ -243,19 +239,19 @@ namespace WCS.WorkEngineering.Extensions
                         PalletizingId = palletizing.Id,
                         WarehouseCode = palletizingLayer.WarehouseCode
                     };
-                    palletizingRow = db.Insertable(palletizingRow).ExecuteReturnEntity();
+                    palletizingRow = db.InsertableRowLock(palletizingRow).ExecuteReturnEntity();
                 }
 
                 //重新查询最新的数据
                 var layer = palletizingLayer;
-                palletizingLayer = db.Queryable<WCS_PalletizingLayer>().Single(x => x.Id == layer.Id);
+                palletizingLayer = db.Queryable<WCS_PalletizingLayer>().UpdLock().Single(x => x.Id == layer.Id);
                 var row = palletizingRow;
-                palletizingRow = db.Queryable<WCS_PalletizingRow>().Single(x => x.Id == row.Id);
+                palletizingRow = db.Queryable<WCS_PalletizingRow>().UpdLock().Single(x => x.Id == row.Id);
 
                 //构造位信息
                 foreach (var loc in item)
                 {
-                    var palletizingLoc = db.Queryable<WCS_PalletizingLoc>().Single(x => x.PalletizingRowId == palletizingRow.Id && x.XYNo == loc.XYNo);
+                    var palletizingLoc = db.Queryable<WCS_PalletizingLoc>().UpdLock().Single(x => x.PalletizingRowId == palletizingRow.Id && x.XYNo == loc.XYNo);
 
                     if (palletizingLoc == null)
                     {
@@ -271,37 +267,37 @@ namespace WCS.WorkEngineering.Extensions
                             Finish = false,
                             WarehouseCode = palletizingRow.WarehouseCode
                         };
-                        db.Insertable(palletizingLoc).ExecuteReturnEntity();
+                        db.InsertableRowLock(palletizingLoc).ExecuteReturnEntity();
                     }
 
                     //同步是否混合料行
                     palletizingRow.IsMixRow = loc.IsMixRow != 0;
-                    db.Updateable(palletizingRow).ExecuteCommand();
+                    db.UpdateableRowLock(palletizingRow).ExecuteCommand();
                 }
                 //更新行信息
-                palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == row.Id);
+                palletizingRow = db.Queryable<WCS_PalletizingRow>().UpdLock().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.Updateable(palletizingRow).ExecuteCommand();
+                db.UpdateableRowLock(palletizingRow).ExecuteCommand();
                 //更新层信息
-                palletizingLayer = db.Queryable<WCS_PalletizingLayer>().Includes(x => x.Rows, l => l.Locs).Single(x => x.Id == layer.Id);
+                palletizingLayer = db.Queryable<WCS_PalletizingLayer>().UpdLock().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;
                 palletizingLayer.Finish = false;
                 palletizingLayer.MatCodeList = palletizingLayer.Rows.SelectMany(x => x.Locs).Select(x => x.MatCode).ToList().GetMatList();
 
-                db.Updateable(palletizingLayer).ExecuteCommand();
+                db.UpdateableRowLock(palletizingLayer).ExecuteCommand();
             }
 
             var palletizing1 = palletizing;
-            palletizing = db.Queryable<WCS_Palletizing>().Includes(x => x.Layers, r => r.Rows, l => l.Locs).Single(x => x.Id == palletizing1.Id);
+            palletizing = db.Queryable<WCS_Palletizing>().UpdLock().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);
             palletizing.MatCodeList = palletizing.Layers.SelectMany(x => x.Rows).SelectMany(x => x.Locs).Select(x => x.MatCode).ToList().GetMatList();
-            db.Updateable(palletizing).ExecuteCommand();
+            db.UpdateableRowLock(palletizing).ExecuteCommand();
         }
 
         public static string GetMatList(this List<string> matList)

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

@@ -24,7 +24,7 @@ namespace WCS.WorkEngineering.Systems
         /// </summary>
         public DeviceWriteSystem()
         {
-            Convs = Device.All.Where(v => v.Code is "1602" or "1661" or "1666" or "1606").Select(v => new Station(v, this.World)).ToDictionary(v => v.Entity.Code, v => v);
+            Convs = Device.All.Where(v => v.Code is "1602" or "1661" or "1666" or "1606" or "666").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);
         }
 

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

@@ -37,7 +37,7 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(db =>
             {
                 //获取所有的新建任务,组盘任务不需要
-                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();
+                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();
             });
             if (!taskInfos.Any())
             {
@@ -180,7 +180,7 @@ namespace WCS.WorkEngineering.Systems
                                                 AddWho = "WCS",
                                                 AddTime = DateTime.Now
                                             };
-                                            db.Default.UpdateableRowLock(b).SplitTable().ExecuteCommand();
+                                            db.Default.InsertableRowLock(b).SplitTable().ExecuteCommand();
                                         }
                                         //更新任务状态
                                         task.Status = Entity.TaskStatus.WaitingToExecute;

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

@@ -73,7 +73,7 @@ namespace WCS.WorkEngineering.Systems
                     #region 获取完成任务
 
                     //根据DB521任务号获取对应任务
-                    var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskFinishiId) ?? throw new KnownException($"堆垛机完成任务号{obj.Data2.TaskFinishiId},在WCS当前任务信息中未找到对应任务。", LogLevelEnum.High);
+                    var task = db.Default.Queryable<WCS_TaskInfo>().UpdLock().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 获取完成任务
@@ -85,7 +85,7 @@ namespace WCS.WorkEngineering.Systems
                             //完成任务
                             task.Status = Entity.TaskStatus.Finish;
                             task.EndTime = DateTime.Now;
-                            db.Default.Updateable(task).ExecuteCommand();
+                            db.Default.UpdateableRowLock(task).ExecuteCommand();
                             task.AddWCS_TASK_DTL(db.Default, task.AddrTo, "入库任务结束");
                             break;
 
@@ -94,7 +94,7 @@ namespace WCS.WorkEngineering.Systems
                             if (devs.Contains(task.SrmStation))
                             {
                                 task.Status = Entity.TaskStatus.StackerCompleted;
-                                db.Default.Updateable(task).ExecuteCommand();
+                                db.Default.UpdateableRowLock(task).ExecuteCommand();
                                 task.AddWCS_TASK_DTL(db.Default, task.SrmStation, "出库任务到达放货站台");
                             }
                             else
@@ -107,7 +107,7 @@ namespace WCS.WorkEngineering.Systems
                                         {
                                             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);
-                                            db.Default.Updateable(task).ExecuteCommand();
+                                            db.Default.UpdateableRowLock(task).ExecuteCommand();
                                             task.AddWCS_TASK_DTL(db.Default, task.SrmStation, "出库任务到达放货站台");
                                         }
                                         else
@@ -115,7 +115,7 @@ namespace WCS.WorkEngineering.Systems
                                             task.Status = Entity.TaskStatus.ConveyorExecution;
                                             var dev = new Station(Device.All.FirstOrDefault(v => v.Code == task.SrmStation) ?? throw new KnownException($"未找到{task.SrmStation}信息", LogLevelEnum.High), this.World);
                                             dev.Data.TaskNumber = task.ID;
-                                            db.Default.Updateable(task).ExecuteCommand();
+                                            db.Default.UpdateableRowLock(task).ExecuteCommand();
                                             task.AddWCS_TASK_DTL(db.Default, task.SrmStation, "出库任务到达放货站台");
                                         }
 
@@ -124,7 +124,7 @@ namespace WCS.WorkEngineering.Systems
                                     case OutTypeEnum.半自动手动出库任务:
                                         task.Status = Entity.TaskStatus.Finish;
                                         task.EditTime = DateTime.Now;
-                                        db.Default.Updateable(task).ExecuteCommand();
+                                        db.Default.UpdateableRowLock(task).ExecuteCommand();
                                         task.AddWCS_TASK_DTL(db.Default, task.SrmStation, "半自动手动出库任务结束");
                                         break;
                                 }
@@ -135,14 +135,14 @@ namespace WCS.WorkEngineering.Systems
                         case TaskType.TransferDepot:
                             task.Status = Entity.TaskStatus.Finish;
                             task.EndTime = DateTime.Now;
-                            db.Default.Updateable(task).ExecuteCommand();
+                            db.Default.UpdateableRowLock(task).ExecuteCommand();
                             task.AddWCS_TASK_DTL(db.Default, task.AddrTo, "移库任务结束");
                             break;
 
                         case TaskType.EmptyInit:
                             task.Status = Entity.TaskStatus.Finish;
                             task.EndTime = DateTime.Now;
-                            db.Default.Updateable(task).ExecuteCommand();
+                            db.Default.UpdateableRowLock(task).ExecuteCommand();
                             task.AddWCS_TASK_DTL(db.Default, task.AddrTo, "空轮初始化任务结束");
                             break;
                     }
@@ -175,7 +175,7 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(db =>
             {
                 //获取当前堆垛机的所有未完成任务
-                var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Status < Entity.TaskStatus.Finish && (v.Device == obj.Entity.Code));
+                var tasks = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(v => v.Status < Entity.TaskStatus.Finish && (v.Device == obj.Entity.Code));
                 //任务集合是否有处于堆垛机执行状态的任务
                 if (tasks.Any(v => v.Status == Entity.TaskStatus.StackerExecution)) throw new KnownException($"有任务处于堆垛机执行状态", LogLevelEnum.High);
 
@@ -202,13 +202,13 @@ namespace WCS.WorkEngineering.Systems
                 SqlSugarHelper.Do(db =>
                    {
                        //获取一条当前堆垛机优先级最高的新建移库任务
-                       var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Device == obj.Entity.Code && v.Type == TaskType.TransferDepot && v.Status == Entity.TaskStatus.NewBuild)
+                       var task = db.Default.Queryable<WCS_TaskInfo>().UpdLock().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);
                        //任务状态改为堆垛机执行中
                        task.Status = Entity.TaskStatus.StackerExecution;
                        task.StartTime = DateTime.Now;
-                       db.Default.Updateable(task).ExecuteCommand();
+                       db.Default.UpdateableRowLock(task).ExecuteCommand();
                        task.AddWCS_TASK_DTL(db.Default, task.AddrFrom, task.Device, $"堆垛机{obj.Entity.Code}开始执行任务");
                        taskInfo = task;
                    });
@@ -269,7 +269,7 @@ namespace WCS.WorkEngineering.Systems
                 SqlSugarHelper.Do(db =>
                 {
                     //根据有货设备的任务号获取所有类型为入库状态为输送机执行中的任务
-                    var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => (v.Type == TaskType.EnterDepot || v.Type == TaskType.EmptyInit)
+                    var tasks = db.Default.Queryable<WCS_TaskInfo>().UpdLock().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);
@@ -286,7 +286,7 @@ namespace WCS.WorkEngineering.Systems
                     task.AddrTo = $"{loc[0]}-{loc[1]}-{loc[2]}";
                     task.LastInteractionPoint = station.Entity.Code;
                     task.EditWho = "WCS";
-                    db.Default.Updateable(task).ExecuteCommand();
+                    db.Default.UpdateableRowLock(task).ExecuteCommand();
                     task.AddWCS_TASK_DTL(db.Default, station.Entity.Code, task.AddrTo, "任务下发堆垛机执行");
 
                     taskInfo = task;
@@ -347,7 +347,7 @@ namespace WCS.WorkEngineering.Systems
                    var allOutCode = arrOut.Select(v => v.Entity.Code).ToList();
 
                    //按条件先后排序获取一条排序后第一条结果1.优先级2.所在楼层与本次优先执行楼层
-                   var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Type == TaskType.OutDepot && v.Status == TaskStatus.WaitingToExecute)
+                   var task = db.Default.Queryable<WCS_TaskInfo>().UpdLock().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)
@@ -356,7 +356,7 @@ namespace WCS.WorkEngineering.Systems
                    task.Status = TaskStatus.StackerExecution;
                    task.LastInteractionPoint = task.Device;
                    task.EditWho = "WCS";
-                   db.Default.Updateable(task).ExecuteCommand();
+                   db.Default.UpdateableRowLock(task).ExecuteCommand();
                    task.AddWCS_TASK_DTL(db.Default, task.Device, task.SrmStation, "任务下发堆垛机执行");
                    taskInfo = task;
                });

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

@@ -44,7 +44,7 @@ namespace WCS.WorkEngineering.Systems
                 //拆分防止锁表
                 foreach (var taskId in taskIdList)
                 {
-                    var task = db.Queryable<WCS_TaskInfo>().ReadPast().First(x => x.ID == taskId);
+                    var task = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.ID == taskId);
                     task.Uploaded = TaskStatus.ConveyorExecution;
                     task.EditTime = DateTime.Now;
                     db.UpdateableRowLock(task).ExecuteCommand();
@@ -75,7 +75,7 @@ namespace WCS.WorkEngineering.Systems
                 //拆分防止锁表
                 foreach (var taskId in taskIdList)
                 {
-                    var task = db.Queryable<WCS_TaskOld>().ReadPast().Where(x => x.Id == taskId).SplitTable(x => x.Take(2)).First();
+                    var task = db.Queryable<WCS_TaskOld>().UpdLock().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();

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

@@ -62,7 +62,7 @@ namespace WCS.WorkEngineering.Systems
                     SqlSugarHelper.Do(_db =>
                     {
                         var db = _db.Default;
-                        var task = db.Queryable<WCS_TaskInfo>().Single(x => x.BarCode == bcrCode && x.ID == mainlineDiversion.TaskId && x.Status == TaskStatus.NewBuild);
+                        var task = db.Queryable<WCS_TaskInfo>().UpdLock().Single(x => x.BarCode == bcrCode && x.ID == mainlineDiversion.TaskId && x.Status == TaskStatus.NewBuild);
                         if (task == null)
                         {
                             World.Log($"{bcrCode}-{mainlineDiversion}:找不到匹配任务", LogLevelEnum.High);
@@ -72,7 +72,7 @@ namespace WCS.WorkEngineering.Systems
                         task.EditWho = "WCS";
                         task.StartTime = DateTime.Now;
                         task.EditTime = DateTime.Now;
-                        db.Updateable(task).ExecuteCommand();
+                        db.UpdateableRowLock(task).ExecuteCommand();
                         task.AddWCS_TASK_DTL(db, obj.Entity.Code, next, "任务完成预分流");
                         taskInfo = task;
                     });
@@ -86,8 +86,11 @@ namespace WCS.WorkEngineering.Systems
                 if (taskInfo == null) continue;
                 //开始赋值
                 obj.Data3.GetType().GetProperty($"BcrCode{obj.Data3.NextIndex}").SetValue(obj.Data3, bcrCode);
+                obj.Data3.GetType().GetProperty($"BcrCode{obj.Data3.NextIndex}").SetValue(obj.Data3, bcrCode);
+                obj.Data3.GetType().GetProperty($"TaskNumber{obj.Data3.NextIndex}").SetValue(obj.Data3, taskInfo.ID);
                 obj.Data3.GetType().GetProperty($"TaskNumber{obj.Data3.NextIndex}").SetValue(obj.Data3, taskInfo.ID);
                 obj.Data3.GetType().GetProperty($"GoodsEnd{obj.Data3.NextIndex}").SetValue(obj.Data3, next.ToShort());
+                obj.Data3.GetType().GetProperty($"GoodsEnd{obj.Data3.NextIndex}").SetValue(obj.Data3, next.ToShort());
                 if (obj.Data3.NextIndex >= 49)
                 {
                     obj.Data3.NextIndex = 0;

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

@@ -40,12 +40,13 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                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);
+                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);
                 if (Allot(db, task, obj)) taskInfo = task;
             });
 
             if (taskInfo == null) return;
 
+            obj.Data.TaskNumber = obj.Data2.TaskNumber;
             obj.Data.TaskNumber = obj.Data2.TaskNumber;
             obj.Data.GoodsStart = obj.Entity.Code.ToShort();
             obj.Data.GoodsEnd = taskInfo.AddrNext.ToShort();
@@ -92,7 +93,7 @@ namespace WCS.WorkEngineering.Systems
                     break;
             }
             var cacheLineCodes = cacheLineDevList.Select(x => x.Code.ToShort());
-            var cacheLineList = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).ToList();
+            var cacheLineList = db.Queryable<WCS_CacheLine>().UpdLock().Includes(x => x.Locations).ToList();
 
             #region 跟据缓存信息寻找可以到达的缓存点
 
@@ -104,18 +105,18 @@ 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>().Single(x => x.Id == cacheLoc.Id);
+                cacheLoc = db.Queryable<WCS_CacheLineLoc>().UpdLock().Single(x => x.Id == cacheLoc.Id);
                 cacheLoc.InStock = true;
                 cacheLoc.TaskId = taskInfo.ID;
                 cacheLoc.EditTime = DateTime.Now;
-                db.Updateable(cacheLoc).ExecuteCommand();
+                db.UpdateableRowLock(cacheLoc).ExecuteCommand();
 
                 //WCS任务相关信息
                 taskInfo.Status = TaskStatus.FinishOfShunt;
                 taskInfo.AddrNext = cacheLine.LocationNo.ToString();
                 taskInfo.EditWho = "WCS";
                 taskInfo.EditTime = DateTime.Now;
-                db.Updateable(taskInfo).ExecuteCommand();
+                db.UpdateableRowLock(taskInfo).ExecuteCommand();
                 taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
 
                 return true;
@@ -154,6 +155,7 @@ namespace WCS.WorkEngineering.Systems
 
             //未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
             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)
@@ -241,7 +243,7 @@ namespace WCS.WorkEngineering.Systems
                     palletizing.Finish = false;
                     palletizing.PalletizingStation = twoDevs.FirstOrDefault();
                     palletizing.TaskAddNext ??= devCode.ToString();
-                    db.Updateable(palletizing).ExecuteCommand();
+                    db.UpdateableRowLock(palletizing).ExecuteCommand();
                 }
 
                 if (palletizing.TaskAddNext == null)
@@ -249,8 +251,8 @@ namespace WCS.WorkEngineering.Systems
                     palletizing.TaskAddNext = devCode.ToString();
                     db.Updateable(palletizing).ExecuteCommand();
                 }
-                var res = db.Insertable(cacheLine).ExecuteReturnEntity();
-                palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
+                var res = db.InsertableRowLock(cacheLine).ExecuteReturnEntity();
+                palletizingRow = db.Queryable<WCS_PalletizingRow>().UpdLock().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;
@@ -269,10 +271,10 @@ namespace WCS.WorkEngineering.Systems
                 taskInfo.AddrNext = devCode.ToString();
                 taskInfo.EditWho = "WCS";
                 taskInfo.EditTime = DateTime.Now;
-                db.Updateable(taskInfo).ExecuteCommand();
+                db.UpdateableRowLock(taskInfo).ExecuteCommand();
                 taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
-                db.Updateable(palletizingRow).ExecuteCommand();
-                db.Insertable(createCacheLoc).ExecuteCommand();
+                db.UpdateableRowLock(palletizingRow).ExecuteCommand();
+                db.InsertableRowLock(createCacheLoc).ExecuteCommand();
 
                 result = true;
             }

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

@@ -28,7 +28,7 @@ namespace WCS.WorkEngineering.Systems
         {
             if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
             {
-                if (obj.Data2.TaskNumber != 0 && obj.Data2.TaskNumber != 1)
+                if (obj.Data2.TaskNumber != 0 && obj.Data2.TaskNumber != 2)
                 {
                     obj.Data.TaskNumber = obj.Data2.TaskNumber;
                     World.Log($"复写:{obj.Data.TaskNumber}");
@@ -45,13 +45,13 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                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 == 1)
+                var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().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>().OrderBy(x => x.AddTime).First(x => x.AddrFrom == obj.Entity.Code
+                    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);
                     if (taskInfo == null)
@@ -72,10 +72,12 @@ namespace WCS.WorkEngineering.Systems
                 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("外检结果与任务条码不匹配");
@@ -127,7 +129,7 @@ namespace WCS.WorkEngineering.Systems
                     taskInfo.WarehouseCode = taskInfo.WarehouseCode.Contains("R") ? taskInfo.WarehouseCode : taskInfo.WarehouseCode + "R";
                     taskInfo.AddrTo = "Robot";
                     taskInfo.GoodsType = obj.Data4.Length.ToInt();
-                    db.Updateable(taskInfo).ExecuteCommand();
+                    db.UpdateableRowLock(taskInfo).ExecuteCommand();
                     taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, nextAdd.ToString(), "工字轮完成环形库分流");
                 }
                 else
@@ -135,7 +137,7 @@ namespace WCS.WorkEngineering.Systems
                     taskInfo.AddrNext = nextAdd.ToString();
                     taskInfo.EditTime = DateTime.Now;
                     taskInfo.GoodsType = obj.Data4.Length.ToInt();
-                    db.Updateable(taskInfo).ExecuteCommand();
+                    db.UpdateableRowLock(taskInfo).ExecuteCommand();
                     taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, nextAdd.ToString(), "工字轮途径环形库分流点");
                 }
                 isPut = true;

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

@@ -30,18 +30,16 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                var task = db.Queryable<WCS_TaskInfo>().Single(x => x.ID == obj.Data.TaskNumber);
+                var task = db.Queryable<WCS_TaskInfo>().ReadPast().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}状态不是输送机执行中");
 
-
-
-
                 //开始创建AGV任务
                 var agvTask = db.Queryable<WCS_AgvTaskInfo>().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
                 if (agvTask == null)
                 {
-                    var a = new WCS_AgvTaskInfo()
+                    //开始处理车间叫料AGV任务任务
+                    db.InsertableRowLock(new WCS_AgvTaskInfo()
                     {
                         ID = _db.GetAgvTaskId(),
                         TaskType = AGVTaskType.CallMaterial,
@@ -51,9 +49,7 @@ namespace WCS.WorkEngineering.Systems
                         Station = task.SrmStation,
                         AddWho = "WCS",
                         AddTime = DateTime.Now
-                    };
-                    //开始处理车间叫料AGV任务任务
-                    db.Insertable(a).SplitTable().ExecuteCommand();
+                    }).SplitTable().ExecuteCommand();
                     World.Log($"{task.ID}未找到对应的AGV任务");
                     return;
                 }
@@ -65,10 +61,12 @@ namespace WCS.WorkEngineering.Systems
                 agvTask.AgvID = agvId;
                 agvTask.Status = AGVTaskStatus.Confirm;
                 agvTask.AgvStatus = AGVTaskStatus.Confirm;
-                db.Updateable(agvTask).SplitTable(x => x.Take(2)).ExecuteCommand();
+                db.UpdateableRowLock(agvTask).SplitTable(x => x.Take(2)).ExecuteCommand();
                 task.Status = TaskStatus.AGVExecution;
                 task.AgvTaskID = agvTask.ID;
-                task.Updateable(db);
+                task.EditTime = DateTime.Now;
+                task.EditWho = "WCS";
+                db.UpdateableRowLock(task).ExecuteCommand();
                 task.AddWCS_TASK_DTL(db, obj.Entity.Code, "AGV", $"任务下发至AGV{agvId}");
             });
         }

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

@@ -34,14 +34,14 @@ namespace WCS.WorkEngineering.Systems.桁架码垛
             {
                 var db = _db.Default;
                 var soDev = obj.Entity.Sources.First();
-                var taskInfo = db.Queryable<WCS_TaskInfo>().First(x => x.SrmStation == soDev.Code && x.Status == TaskStatus.StackerCompleted);
+                var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.SrmStation == soDev.Code && x.Status == TaskStatus.StackerCompleted);
                 if (taskInfo == null) return;
-                var pall = db.Queryable<WCS_Palletizing>().First(x => x.TaskId == taskInfo.ID && !x.Finish);
+                var pall = db.Queryable<WCS_Palletizing>().RowLock().First(x => x.TaskId == taskInfo.ID && !x.Finish);
                 if (pall == null) return;
                 taskInfo.Status = TaskStatus.Finish;
                 taskInfo.EditTime = DateTime.Now;
                 taskInfo.EndTime = DateTime.Now;
-                db.Updateable(taskInfo).ExecuteCommand();
+                db.UpdateableRowLock(taskInfo).ExecuteCommand();
                 taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, "二次码垛出库任务完成");
                 addNext = pall.PalletizingStation.ToShort();
                 taskId = pall.Id;

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

@@ -1,6 +1,7 @@
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
+using ServiceCenter.Extensions;
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.Station;
@@ -23,10 +24,10 @@ namespace WCS.WorkEngineering.Systems.桁架码垛
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                var palls = db.Queryable<WCS_Palletizing>().Where(x => !x.Finish && x.isItHalf).ToList();
+                var palls = db.Queryable<WCS_Palletizing>().UpdLock().Where(x => !x.Finish && x.isItHalf).ToList();
                 foreach (var pall in palls)
                 {
-                    var task = db.Queryable<WCS_TaskInfo>().First(x => x.ID == pall.Id);
+                    var task = db.Queryable<WCS_TaskInfo>().RowLock().First(x => x.ID == pall.Id);
                     if (task != null) continue;
 
                     try
@@ -34,7 +35,7 @@ namespace WCS.WorkEngineering.Systems.桁架码垛
                         //没有对应的出库任务
                         var res = WmsApi.GetTwoPallet(pall.WarehouseCode, pall.TaskId);
                         pall.TaskId = res.ResData;
-                        db.Updateable(pall).ExecuteCommand();
+                        db.UpdateableRowLock(pall).ExecuteCommand();
                     }
                     catch (Exception e)
                     {

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

@@ -43,7 +43,7 @@ namespace WCS.WorkEngineering.Systems
                 {
                     var db = _db.Default;
                     List<int> ids = new List<int>() { obj.Data2.PalletizingRowId1, obj.Data2.PalletizingRowId2 };
-                    var palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.CacheLine, c => c.Locations)
+                    var palletizingRow = db.Queryable<WCS_PalletizingRow>().UpdLock().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,7 +53,7 @@ namespace WCS.WorkEngineering.Systems
                     //更新行数据
                     foreach (var row in palletizingRow)
                     {
-                        var cacheLine = db.Queryable<WCS.Entity.WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.Id == row.CacheLine.Id);
+                        var cacheLine = db.Queryable<WCS.Entity.WCS_CacheLine>().UpdLock().Includes(x => x.Locations).Single(x => x.Id == row.CacheLine.Id);
                         //先更新对应的位信息
                         try
                         {
@@ -61,7 +61,7 @@ namespace WCS.WorkEngineering.Systems
                             foreach (var loc in row.Locs.Where(x => !x.IsEmpty).OrderBy(x => x.XYNo))
                             {
                                 var cacheLoc = cacheLine.Locations[index];
-                                cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
+                                cacheLoc = db.Queryable<WCS_CacheLineLoc>().UpdLock().Single(x => x.Id == cacheLoc.Id);
                                 loc.TaskId = cacheLoc.TaskId;
                                 loc.Finish = true;
 
@@ -80,26 +80,26 @@ namespace WCS.WorkEngineering.Systems
                     }
                     //更新层数据
 
-                    db.Updateable(upDateableLoc).ExecuteCommand();
-                    db.Deleteable(deleteLoc).ExecuteCommand();
-                    db.Updateable(upDateableRow).ExecuteCommand();
-                    db.Deleteable(deleteCacheLine).ExecuteCommand();
+                    db.UpdateableRowLock(upDateableLoc).ExecuteCommand();
+                    db.DeleteableRowLock(deleteLoc).ExecuteCommand();
+                    db.UpdateableRowLock(upDateableRow).ExecuteCommand();
+                    db.DeleteableRowLock(deleteCacheLine).ExecuteCommand();
 
                     var layerId = palletizingRow.FirstOrDefault().PalletizingLayerId;
-                    var layer = db.Queryable<WCS_PalletizingLayer>().Includes(x => x.Rows).Single(x => x.Id == layerId);
+                    var layer = db.Queryable<WCS_PalletizingLayer>().UpdLock().Includes(x => x.Rows).Single(x => x.Id == layerId);
                     if (layer.Rows.All(x => x.Finish || x.IsEmpty))
                     {
                         layer.Finish = true;
-                        db.Updateable(layer).ExecuteCommand();
+                        db.UpdateableRowLock(layer).ExecuteCommand();
                     }
 
                     //码垛完成后开始绑定托盘
                     var palletizingId = upDateableRow.First().Palletizing.Id;
-                    var palletizing = db.Queryable<WCS_Palletizing>().Single(x => x.Id == palletizingId);
+                    var palletizing = db.Queryable<WCS_Palletizing>().UpdLock().Single(x => x.Id == palletizingId);
                     palletizing.EditTime = DateTime.Now;
-                    db.Updateable(palletizing).ExecuteCommand();
+                    db.UpdateableRowLock(palletizing).ExecuteCommand();
                     var taskId = upDateableRow.SelectMany(x => x.Locs).Select(x => x.TaskId).ToList();
-                    var taskList = db.Queryable<WCS_TaskInfo>().Where(x => taskId.Contains(x.ID)).Select(x => x.BarCode).ToList();
+                    var taskList = db.Queryable<WCS_TaskInfo>().RowLock().Where(x => taskId.Contains(x.ID)).Select(x => x.BarCode).ToList();
                     WmsApi.BingPallet(palletizing.PalleCode, taskList, palletizing.WarehouseCode, palletizing.PalletizingStation);
                     isFinish = true;
                 });
@@ -156,7 +156,7 @@ namespace WCS.WorkEngineering.Systems
             {
                 var db = _db.Default;
                 //找到当前桁架所属所有还有层没结束的码垛记录信息,有对应托盘
-                var palletizingLsit = db.Queryable<WCS_Palletizing>().Includes(x => x.Layers, r => r.Rows, l => l.Locs)
+                var palletizingLsit = db.Queryable<WCS_Palletizing>().UpdLock().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();
                 //筛选出目标位置有光电的码垛记录信息
@@ -174,7 +174,7 @@ namespace WCS.WorkEngineering.Systems
                 //可以取货的码垛信息
                 var pickUpCode = _pickUpDevices.Select(x => x.Key.Entity.Code.ToShort());
                 //从缓存线信息找到可以取货的缓存线
-                var cacheLines = db.Queryable<WCS_CacheLine>().Where(x => pickUpCode.Contains(x.LocationNo)).ToList().Where(
+                var cacheLines = db.Queryable<WCS_CacheLine>().UpdLock().Where(x => pickUpCode.Contains(x.LocationNo)).ToList().Where(
                     x =>
                     {
                         return pickUpDevices.Any(p => p.key == x.LocationNo.ToString() && p.Count == x.Quantity);
@@ -244,24 +244,24 @@ namespace WCS.WorkEngineering.Systems
                     foreach (var row in rowList)
                     {
                         //锁定缓存线
-                        var cacheLine = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.Id == row.CacheLineId);
+                        var cacheLine = db.Queryable<WCS_CacheLine>().UpdLock().Includes(x => x.Locations).Single(x => x.Id == row.CacheLineId);
                         cacheLine.IsTruss = true;
                         cacheLine.PalletizingRowId = row.RowId;
-                        db.Updateable(cacheLine).ExecuteCommand();
+                        db.UpdateableRowLock(cacheLine).ExecuteCommand();
                         //解锁原有码垛信息
-                        var oldRow = db.Queryable<WCS_PalletizingRow>().First(x => x.CacheLineId == row.CacheLineId);
+                        var oldRow = db.Queryable<WCS_PalletizingRow>().UpdLock().First(x => x.CacheLineId == row.CacheLineId);
                         if (oldRow != null)
                         {
                             oldRow.CacheLineId = 0;
                             oldRow.LineCode = null;
-                            db.Updateable(oldRow).ExecuteCommand();
+                            db.UpdateableRowLock(oldRow).ExecuteCommand();
                         }
 
                         //锁定现有码垛信息
-                        var wcsRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).First(x => x.Id == row.RowId);
+                        var wcsRow = db.Queryable<WCS_PalletizingRow>().UpdLock().Includes(x => x.Locs).First(x => x.Id == row.RowId);
                         wcsRow.CacheLineId = row.CacheLineId;
                         wcsRow.LineCode = row.LocationNo.ToString();
-                        db.Updateable(wcsRow).ExecuteCommand();
+                        db.UpdateableRowLock(wcsRow).ExecuteCommand();
                         palletizingRows.Add(wcsRow);
                     }
 

+ 6 - 6
业务工程/分拣库/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>().Single(x => x.PalletizingStation == obj.Entity.Code && !x.Finish);
+                var palletizing = db.Queryable<WCS_Palletizing>().UpdLock().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>().Where(x => TaskNoList.Contains(x.ID)).ToList();
+                var taskList = db.Queryable<WCS_TaskInfo>().UpdLock().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>().Single(x => x.BarCode == palletizing.PalleCode && x.Type == TaskType.EnterDepot);
+                var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().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);
@@ -67,7 +67,7 @@ namespace WCS.WorkEngineering.Systems
                 {
                     x.Status = TaskStatus.Finish;
                     x.EndTime = DateTime.Now;
-                    db.Updateable(x).ExecuteCommand();
+                    db.UpdateableRowLock(x).ExecuteCommand();
                     x.AddWCS_TASK_DTL(db, obj.Entity.Code, "任务结束");
                 }
 
@@ -77,9 +77,9 @@ namespace WCS.WorkEngineering.Systems
                 {
                     palletizing.TaskId = taskInfo.ID; //如果是半托入库,需要把绑定的任务切换成入库任务
                 }
-                db.Updateable(palletizing).ExecuteCommand();
+                db.UpdateableRowLock(palletizing).ExecuteCommand();
                 taskInfo.Status = TaskStatus.ConveyorExecution;
-                db.Updateable(taskInfo).ExecuteCommand();
+                db.UpdateableRowLock(taskInfo).ExecuteCommand();
                 taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, $"桁架码垛结束处理完成");
                 task = taskInfo;
             });

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

@@ -47,7 +47,7 @@ namespace WCS.WorkEngineering.Systems
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
-                var cacheLine = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.LocationNo == obj.Entity.Code.ToShort());
+                var cacheLine = db.Queryable<WCS_CacheLine>().UpdLock().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 }))
                 {
@@ -60,7 +60,7 @@ namespace WCS.WorkEngineering.Systems
                     cacheLine.InStock = true;
                     cacheLine.LocationNo = devCode.Code.ToShort();
                     cacheLine.EditTime = DateTime.Now;
-                    db.Updateable(cacheLine).ExecuteCommand();
+                    db.UpdateableRowLock(cacheLine).ExecuteCommand();
                 }
             });
 
@@ -72,7 +72,7 @@ namespace WCS.WorkEngineering.Systems
             {
                 var db = _db.Default;
                 //先找到下一个地址对应的缓存信息
-                var lineCache = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.LocationNo == nextCode && x.Locations.Any(s => s.TaskId == obj.Data2.TaskNumber));
+                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));
                 if (lineCache == null) throw new Exception($"当前缓存组未分配完"); //找不到表示当前线体的任务组没有凑齐
 
                 //检测实物数量与有货总数是否相等
@@ -84,7 +84,7 @@ namespace WCS.WorkEngineering.Systems
                     if (qty != devQty && devQty < qty) throw new Exception($"当前缓存组工字轮未到齐"); //表示当前货物未全部到位
 
                     lineCache.Put = true;
-                    db.Updateable(lineCache).ExecuteCommand();
+                    db.UpdateableRowLock(lineCache).ExecuteCommand();
 
                     //TODO:此处不绑定码垛信息的行
                     //var pr = db.Queryable<WCS_PalletizingRow>().Single(x => x.Id == lineCache.PalletizingRowId);
@@ -92,18 +92,19 @@ namespace WCS.WorkEngineering.Systems
                     //db.Updateable(pr).ExecuteCommand();
                 }
 
-                var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.FinishOfShunt) ?? throw new KnownException("未找到对应的WCS任务", LogLevelEnum.Mid);
+                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);
                 taskInfo.Status = Entity.TaskStatus.ConveyorExecution;
                 //taskInfo.AddrNext = obj.Entity.Targets.FirstOrDefault().Code;
                 taskInfo.EditWho = "WCS";
                 taskInfo.EditTime = DateTime.Now;
-                db.Updateable(taskInfo).ExecuteCommand();
+                db.UpdateableRowLock(taskInfo).ExecuteCommand();
                 taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, "桁架缓存放行");
                 task = taskInfo;
                 nextAdd = obj.Entity.Targets.FirstOrDefault().Code.ToShort();
             });
             if (task == null) return;
             obj.Data.TaskNumber = obj.Data2.TaskNumber;
+            obj.Data.TaskNumber = obj.Data2.TaskNumber;
             obj.Data.GoodsStart = obj.Entity.Code.ToShort();
             obj.Data.GoodsEnd = nextAdd;
             obj.Data.VoucherNo++;

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

@@ -35,7 +35,7 @@ namespace WCS.WorkEngineering.Systems
         /// <summary>
         /// 放货设备
         /// </summary>
-        private Dictionary<string, List<Device<IStation520, IStation521, IStation523>>> PutDevices = new();
+        private Dictionary<string, List<Device<IStation520, IStation521, IStation523, IRobot530>>> PutDevices = new();
 
         public 机械臂()
         {
@@ -47,7 +47,7 @@ namespace WCS.WorkEngineering.Systems
             {
                 //取货设备
                 PickUpDevices.Add(robot.Code, robot.Sources.Where(v => v.HasFlag(DeviceFlags.输送机)).Select(v => v).ToList());
-                PutDevices.Add(robot.Code, robot.Targets.Where(v => v.HasFlag(DeviceFlags.输送机)).Select(v => new Device<IStation520, IStation521, IStation523>(v, World)).ToList());
+                PutDevices.Add(robot.Code, robot.Targets.Where(v => v.HasFlag(DeviceFlags.输送机)).Select(v => new Device<IStation520, IStation521, IStation523, IRobot530>(v, World)).ToList());
             }
         }
 
@@ -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>().Where(v => v.ID == obj.Data2.TaskFinishId1 || v.ID == obj.Data2.TaskFinishId2).ToList();
+                    var taskInfoList = db.Default.Queryable<WCS_TaskInfo>().UpdLock().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))
                     {
                         //根据任务类型做不同的处理
@@ -78,7 +78,7 @@ namespace WCS.WorkEngineering.Systems
                                 //完成任务
                                 task.Status = Entity.TaskStatus.Finish;
                                 task.EndTime = DateTime.Now;
-                                db.Default.Updateable(task).ExecuteCommand();
+                                db.Default.UpdateableRowLock(task).ExecuteCommand();
                                 task.AddWCS_TASK_DTL(db.Default, task.AddrTo, "入库任务结束");
                                 break;
 
@@ -88,7 +88,7 @@ namespace WCS.WorkEngineering.Systems
                                     x.Status < TaskStatus.Finish).First() ?? throw new Exception($"未找到对应的托盘搬运任务,无法进行绑盘");
                                 task.Status = Entity.TaskStatus.ConveyorExecution;
                                 task.EditTime = DateTime.Now;
-                                db.Default.Updateable(task).ExecuteCommand();
+                                db.Default.UpdateableRowLock(task).ExecuteCommand();
                                 task.AddWCS_TASK_DTL(db.Default, task.AddrTo, "出库任务结束");
 
                                 break;
@@ -96,7 +96,7 @@ namespace WCS.WorkEngineering.Systems
                             case TaskType.TransferDepot:
                                 task.Status = Entity.TaskStatus.Finish;
                                 task.EndTime = DateTime.Now;
-                                db.Default.Updateable(task).ExecuteCommand();
+                                db.Default.UpdateableRowLock(task).ExecuteCommand();
                                 task.AddWCS_TASK_DTL(db.Default, task.AddrTo, "移库任务结束");
                                 break;
                         }
@@ -122,8 +122,8 @@ namespace WCS.WorkEngineering.Systems
             //再检查是否有等待执行的货物
             SqlSugarHelper.Do(db =>
             {
-                //获取当前堆垛机的所有未完成任务
-                var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Status < Entity.TaskStatus.Finish && v.Device == obj.Entity.Code);
+                //获取当前堆垛机的所有未完成任务 ,就算查到了未提交的事务也无所谓,无非下一个周期再执行一次
+                var tasks = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(v => v.Status < Entity.TaskStatus.Finish && v.Device == obj.Entity.Code);
                 //任务集合是否有处于堆垛机执行状态的任务
                 if (tasks.Any(v => v.Status == Entity.TaskStatus.StackerExecution)) throw new KnownException($"有任务处于堆垛机执行状态", LogLevelEnum.High);
             });
@@ -177,7 +177,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>().First(v => v.Type == TaskType.SetPlate && v.Status == Entity.TaskStatus.FinishOfShunt && dev.Data2.TaskNumber == v.ID);
+                        var task = db.Default.Queryable<WCS_TaskInfo>().UpdLock().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;
@@ -190,7 +190,7 @@ namespace WCS.WorkEngineering.Systems
                         task.SrmStation = dev.Entity.Code;
                         task.Device = obj.Entity.Code;
                         task.EditWho = "WCS";
-                        db.Default.Updateable(task).ExecuteCommand();
+                        db.Default.UpdateableRowLock(task).ExecuteCommand();
                         task.AddWCS_TASK_DTL(db.Default, dev.Entity.Code, task.AddrTo, "任务下发机械臂执行");
                         taskList.Add(new(task, dev));
                     }
@@ -301,10 +301,15 @@ namespace WCS.WorkEngineering.Systems
                 SqlSugarHelper.Do(db =>
                         {
                             //所有出库点设备号,即
-                            var allOutCode = arrOut.Select(v => v.Entity.Code).ToList();
+                            var allOutCode = arrOut.Select(v => new
+                            {
+                                v.Entity.Code,
+                                v.Data4.Type
+                            }).ToList();
                             //两个工位同时码垛,并不会一个执行一次,只有一个托盘任务全部执行完毕,才会继续执行下一个,先生成任务的码垛工位会优先执行
-                            var taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Type == TaskType.OutDepot && (v.Status == Entity.TaskStatus.WaitingToExecute || v.Status == TaskStatus.ConveyorExecution))
-                                                                                                    .Where(v => allOutCode.Contains(v.SrmStation)).ToList();
+                            var taskInfos = db.Default.Queryable<WCS_TaskInfo>().UpdLock().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();
 
                             if (!taskInfos.Any()) throw new KnownException($"未找到站台{JsonConvert.SerializeObject(allOutCode)}可用的出库任务", LogLevelEnum.Mid);
                             var srmStation = taskInfos.GroupBy(x => x.SrmStation).Where(x => x.Any(s => s.Status == TaskStatus.WaitingToExecute)).Select(x => new
@@ -346,7 +351,7 @@ namespace WCS.WorkEngineering.Systems
                                 task.StartTime = DateTime.Now;
                                 task.EditWho = "WCS";
                                 nextAdd = task.SrmStation;
-                                db.Default.Updateable(task).ExecuteCommand();
+                                db.Default.UpdateableRowLock(task).ExecuteCommand();
                                 task.AddWCS_TASK_DTL(db.Default, task.Device, task.SrmStation, "任务下发机械臂执行");
                                 taskInfoList.Add(task);
                             }

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/环形库/环形库码垛区补空托盘任务生成.cs → 业务工程/分拣库/WCS.WorkEngineering/Systems/码垛区域生成空托盘任务.cs

@@ -32,7 +32,7 @@ namespace WCS.WorkEngineering.Systems
                 {
                     var db = _db.Default;
                     //取一个时间最靠前的,没有绑定码垛工位的码垛记录
-                    var palletizingInfo = db.Queryable<WCS_Palletizing>().OrderBy(x => x.AddTime).First(x => x.PalletizingStation == null && !x.Finish);
+                    var palletizingInfo = db.Queryable<WCS_Palletizing>().ReadPast().OrderBy(x => x.AddTime).First(x => x.PalletizingStation == null && !x.Finish);
                     if (palletizingInfo == null) throw new Exception($"没有可用码垛信息");
                     //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}");