林豪 左 1 年之前
父節點
當前提交
905853bf06

+ 27 - 1
ServiceCenter/Extensions/SqlExtension.cs

@@ -26,7 +26,6 @@ namespace ServiceCenter.Extensions
             return obj.With(SqlWith.ReadPast);
         }
 
-
         /// <summary>
         ///  指定在读表中数据时设置更新锁(update lock)而不是设置共享锁,该锁一直保持到这个语句或整个事务结束,使用UpdLock的作用是允许用户先读取数据(而且不阻塞其他用户读数据),并且保证在后来再更新数据时,这一段时间内这些数据没有被其他用户修改。
         ///  默认持有行级更新锁
@@ -59,6 +58,15 @@ namespace ServiceCenter.Extensions
         /// <returns></returns>
         public static IUpdateable<T> UpdateableRowLock<T>(this SqlSugarScopeProvider scope, T updateObj) where T : class, new() => scope.ScopedContext.Updateable<T>(updateObj).With(SqlWith.RowLock);
 
+        /// <summary>
+        ///  更新时使用行级锁
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="scope"></param>
+        /// <param name="updateObj"></param>
+        /// <returns></returns>
+        public static IUpdateable<T> UpdateableRowLock<T>(this SqlSugarScopeProvider scope, List<T> updateObj) where T : class, new() => scope.ScopedContext.Updateable<T>(updateObj).With(SqlWith.RowLock);
+
         /// <summary>
         ///  插入时使用行级锁
         /// </summary>
@@ -68,6 +76,15 @@ namespace ServiceCenter.Extensions
         /// <returns></returns>
         public static IInsertable<T> InsertableRowLock<T>(this SqlSugarScopeProvider scope, T insertObj) where T : class, new() => scope.ScopedContext.Insertable<T>(insertObj).With(SqlWith.RowLock);
 
+        /// <summary>
+        ///  插入时使用行级锁
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="scope"></param>
+        /// <param name="updateObj"></param>
+        /// <returns></returns>
+        public static IInsertable<T> InsertableRowLock<T>(this SqlSugarScopeProvider scope, List<T> insertObj) where T : class, new() => scope.ScopedContext.Insertable<T>(insertObj).With(SqlWith.RowLock);
+
         /// <summary>
         ///  删除时使用行级锁
         /// </summary>
@@ -76,5 +93,14 @@ namespace ServiceCenter.Extensions
         /// <param name="deleteObj"></param>
         /// <returns></returns>
         public static IDeleteable<T> DeleteableRowLock<T>(this SqlSugarScopeProvider scope, T deleteObj) where T : class, new() => scope.ScopedContext.Deleteable<T>(deleteObj).With(SqlWith.RowLock);
+
+        /// <summary>
+        ///  删除时使用行级锁
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="scope"></param>
+        /// <param name="deleteObj"></param>
+        /// <returns></returns>
+        public static IDeleteable<T> DeleteableRowLock<T>(this SqlSugarScopeProvider scope, List<T> deleteObj) where T : class, new() => scope.ScopedContext.Deleteable<T>(deleteObj).With(SqlWith.RowLock);
     }
 }

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

@@ -3,6 +3,7 @@ using PlcSiemens.Core.Extension;
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
+using ServiceCenter.Extensions;
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.Station;
@@ -56,9 +57,9 @@ namespace WCS.WorkEngineering.Systems
                                     //取货点安全交互
                                     case AGVTaskStatus.RequestOrPermission2 when agv.Status != AGVTaskStatus.RequestOrPermission2:
                                         {
-                                            var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == agv.TaskId);
+                                            var taskInfo = db.Default.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.ID == agv.TaskId);
                                             agv.Status = AGVTaskStatus.RequestOrPermission2;
-                                            db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                            db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                             taskInfo.AddWCS_TASK_DTL(db.Default, "agv", $"允许AGV任务{agv.ID}在站台{agv.Station}取货");
                                             AgvApi.ContinueTask(agv.AgvID, agv.Station);
                                             break;
@@ -66,7 +67,7 @@ namespace WCS.WorkEngineering.Systems
                                     case AGVTaskStatus.PutRequestOrPermission when agv.Status != AGVTaskStatus.PutRequestOrPermission:
                                         {
                                             agv.Status = AGVTaskStatus.PutRequestOrPermission;
-                                            db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                            db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                             AgvApi.ContinueTask(agv.AgvID, agv.Station);
                                             break;
                                         }
@@ -74,29 +75,29 @@ namespace WCS.WorkEngineering.Systems
                                         var devinfo = new Device<IStation520>(Device.All.First(x => x.Code == agv.Station), World);
                                         devinfo.Data.CmdType = StationCmd.Res3;
                                         agv.Status = AGVTaskStatus.LeaveGet;
-                                        db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                        db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                         break;
                                     //完成任务
                                     case AGVTaskStatus.MissionCompleted when agv.Status != AGVTaskStatus.MissionCompleted:
                                         {
                                             if (agv.TaskType is AGVTaskType.CallForMaterial or AGVTaskType.ForkliftFilling or AGVTaskType.CallMaterial)
                                             {
-                                                var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
+                                                var taskInfo = db.Default.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.AgvTaskID == agv.ID);
                                                 if (taskInfo == null) throw new Exception($"未找到AGV任务{agv.ID}对应WCS任务");
                                                 //更新AGV任务状态
                                                 agv.Status = AGVTaskStatus.MissionCompleted;
-                                                db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                                db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                                 //更新WCS任务状态
                                                 taskInfo.Status = Entity.TaskStatus.Finish;
                                                 taskInfo.EndTime = DateTime.Now;
-                                                db.Default.Updateable(taskInfo).ExecuteCommand();
+                                                db.Default.UpdateableRowLock(taskInfo).ExecuteCommand();
                                                 taskInfo.AddWCS_TASK_DTL(db.Default, "agv", "任务完成");
                                                 taskInfos.Add(taskInfo);
                                             }
                                             else
                                             {
                                                 agv.Status = AGVTaskStatus.MissionCompleted;
-                                                db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                                db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                             }
 
                                             break;
@@ -140,12 +141,12 @@ namespace WCS.WorkEngineering.Systems
                                         agv.AgvID = agv.ID.ToString();
                                         agv.Status = AGVTaskStatus.Confirm;
                                         agv.AgvStatus = AGVTaskStatus.Confirm;
-                                        db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                        db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                         break;
                                     //巷道分配
                                     case AGVTaskStatus.RequestOrPermission1 when agv.Status != AGVTaskStatus.Complete1:
                                         {
-                                            var task = db.Default.Queryable<WCS_TaskOld>().Where(x => x.Id == agv.TaskId).SplitTable(x => x.Take(2)).First();
+                                            var task = db.Default.Queryable<WCS_TaskOld>().UpdLock().Where(x => x.Id == agv.TaskId).SplitTable(x => x.Take(2)).First();
                                             if (task == null) throw new Exception($"未找到对应的WCS任务{agv.TaskId}");
 
                                             //获取当前任务可以去的目标地址
@@ -178,7 +179,7 @@ namespace WCS.WorkEngineering.Systems
                                             }
 
                                             //当前可用地址正在执行的任务
-                                            var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && positionList.Contains(v.Station))
+                                            var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().UpdLock().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && positionList.Contains(v.Station))
                                                 .SplitTable(v => v.Take(2)).ToList();
                                             var agvPositionList = agvs.Select(x => x.Station).Distinct();
                                             //World.Log($"执行中的AGV任务目标地址:{JsonConvert.SerializeObject(agvPositionList)}");
@@ -208,7 +209,7 @@ namespace WCS.WorkEngineering.Systems
                                                 World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devs.Select(x => x.Entity.Code).ToList())}");
                                                 agv.Status = AGVTaskStatus.Complete1;
                                                 agv.Station = devs.MinBy(x => x.Entity.Code).Entity.Code;
-                                                db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                                db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                                 World.Log($"任务执行过程:完成agv任务更新{agv.ID}--{agv.Station}");
                                                 task.AddWCS_TASK_DTL(db.Default, "皮盘返库任务分配巷道", agv.Station,
                                                     $"任务分配至:{agv.Station}");
@@ -240,7 +241,7 @@ namespace WCS.WorkEngineering.Systems
                                         if (agv.TaskType == AGVTaskType.EnterDepot)
                                         {
                                             agv.Status = AGVTaskStatus.MissionCompleted;
-                                            db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                            db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                             var devinfo = new Device<IStation520, IStation521>(Device.All.First(x => x.Code == agv.Station), World);
                                             devinfo.Data.CmdType = StationCmd.Res2;
                                         }
@@ -249,7 +250,7 @@ namespace WCS.WorkEngineering.Systems
                                     case AGVTaskStatus.Cancel when agv.Status != AGVTaskStatus.Cancel:
 
                                         agv.Status = AGVTaskStatus.Cancel;
-                                        db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                        db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
                                         break;
                                 }
 

+ 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" or "666").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" or "1632").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

@@ -150,8 +150,8 @@ namespace WCS.WorkEngineering.Systems
 
                                             //开始计算当前这个任务要从哪个站台出
                                             //计算两个站台小于取货完成数量的AGV任务
-                                            var agv1 = db.Default.Queryable<WCS_AgvTaskInfo>().Where(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[0]).SplitTable(x => x.Take(2)).Count();
-                                            var agv2 = db.Default.Queryable<WCS_AgvTaskInfo>().Where(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[1]).SplitTable(x => x.Take(2)).Count();
+                                            var agv1 = db.Default.Queryable<WCS_AgvTaskInfo>().ReadPast().Where(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[0]).SplitTable(x => x.Take(2)).Count();
+                                            var agv2 = db.Default.Queryable<WCS_AgvTaskInfo>().ReadPast().Where(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[1]).SplitTable(x => x.Take(2)).Count();
                                             task.SrmStation = "";
                                             task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0];
                                         }

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

@@ -66,19 +66,19 @@ namespace WCS.WorkEngineering.Systems
                                 if (dev.HasFlag(DeviceFlags.桁架码垛位))
                                 {
                                     //开始绑定任务,并下发新的任务信息到小车
-                                    var palletizingInfo = db.Queryable<WCS_Palletizing>().Single(x => x.Id == obj.Data2.TaskNumber);
+                                    var palletizingInfo = db.Queryable<WCS_Palletizing>().UpdLock().Single(x => x.Id == obj.Data2.TaskNumber);
                                     if (palletizingInfo == null) return;
                                     palletizingInfo.PalleCode = bcrCode;
-                                    db.Updateable(palletizingInfo).ExecuteCommand();
+                                    db.UpdateableRowLock(palletizingInfo).ExecuteCommand();
                                     taskNumber = palletizingInfo.Id;
                                 }
                                 else if (dev.HasFlag(DeviceFlags.环形库码垛工位))
                                 {
                                     //开始处理对应的搬运任务信息
-                                    var task = db.Queryable<WCS_TaskInfo>().First(x => x.Type == TaskType.Delivery && x.ID == obj.Data2.TaskNumber && x.AddrTo == obj.Data2.DestPosition.ToString());
+                                    var task = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.Type == TaskType.Delivery && x.ID == obj.Data2.TaskNumber && x.AddrTo == obj.Data2.DestPosition.ToString());
                                     if (task == null) throw new KnownException($"未找到对应的任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
                                     task.BarCode = bcrCode;
-                                    db.Updateable(task).ExecuteCommand();
+                                    db.UpdateableRowLock(task).ExecuteCommand();
                                     task.AddWCS_TASK_DTL(db, obj.Entity.Code, obj.Data2.DestPosition.ToString(), $"环形库码垛位{obj.Data2.DestPosition}搬运任务绑定条码信息{bcrCode}");
                                     taskNumber = task.ID;
                                 }
@@ -288,13 +288,13 @@ namespace WCS.WorkEngineering.Systems
                     SqlSugarHelper.Do(_db =>
                     {
                         var db = _db.Default;
-                        var taskInfo = db.Queryable<WCS_TaskInfo>().First(p => p.ID == dev.Data.TaskNumber && p.Status == TaskStatus.ConveyorExecution);
+                        var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(p => p.ID == dev.Data.TaskNumber && p.Status == TaskStatus.ConveyorExecution);
                         if (taskInfo == null) return;
                         taskInfo.Status = TaskStatus.RgvExecution;
                         taskInfo.AddrNext = obj.Entity.Code;
                         taskInfo.EditWho = "WCS";
                         taskInfo.EditTime = DateTime.Now; ;
-                        db.Updateable(taskInfo).ExecuteCommand();
+                        db.UpdateableRowLock(taskInfo).ExecuteCommand();
                         taskInfo.AddWCS_TASK_DTL(db, dev.Entity.Code, obj.Entity.Code, $"任务分配至{obj.Entity.Code}");
                         task = taskInfo;
                     });

+ 4 - 5
业务工程/分拣库/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;
@@ -42,7 +43,7 @@ namespace WCS.WorkEngineering.Systems
                 SqlSugarHelper.Do(_db =>
                 {
                     var db = _db.Default;
-                    var isTask = db.Queryable<WCS_TaskInfo>().Any(v => v.BarCode.Contains(barcode) && v.AddrFrom == obj.Entity.Code && v.Type == TaskType.EnterDepot);
+                    var isTask = db.Queryable<WCS_TaskInfo>().UpdLock().Any(v => v.BarCode.Contains(barcode) && v.AddrFrom == obj.Entity.Code && v.Type == TaskType.EnterDepot);
                     //验证是否有对应的任务
                     if (!isTask)
                     {
@@ -56,7 +57,7 @@ namespace WCS.WorkEngineering.Systems
                         if (res.ResCode == WebApi.Models.WMS.Response.ResponseStatusCodeEnum.Sucess) return;
                     }
                     //找到对应的任务
-                    var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.BarCode.Contains(barcode) && v.AddrFrom == obj.Entity.Code && v.Type == TaskType.EnterDepot);
+                    var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().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.巷道));
@@ -83,10 +84,8 @@ namespace WCS.WorkEngineering.Systems
                             "3528" => "SRM6",
                             _ => taskInfo.Device
                         };
-                        ;
+                        db.UpdateableRowLock(taskInfo).ExecuteCommand();
                         taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, "开始执行入库任务");
-                        db.Updateable(taskInfo).ExecuteCommand();
-
                         task = taskInfo;
                     }
                     else throw new KnownException($"未找到对应的任务{taskInfo}", LogLevelEnum.Mid);

+ 3 - 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.BCR;
@@ -54,7 +55,7 @@ namespace WCS.WorkEngineering.Systems
                         if (res.ResCode == WebApi.Models.WMS.Response.ResponseStatusCodeEnum.Sucess) return;
                     }
                     //找到对应的任务
-                    var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.BarCode == barcode && v.Type == TaskType.EnterDepot);
+                    var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().First(v => v.BarCode == barcode && v.Type == TaskType.EnterDepot);
                     if (taskInfo.Status == Entity.TaskStatus.WaitingToExecute)
                     {
                         var tunnel = obj.Entity.Targets.FirstOrDefault(v => v.HasFlag(DeviceFlags.巷道));
@@ -75,9 +76,8 @@ namespace WCS.WorkEngineering.Systems
                             "3532" => "SRM6",
                             _ => taskInfo.Device
                         };
-                        ;
+                        db.UpdateableRowLock(taskInfo).ExecuteCommand();
                         taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, "开始执行入库任务");
-                        db.Updateable(taskInfo).ExecuteCommand();
                         task = taskInfo;
                     }
                     else return;

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

@@ -62,15 +62,24 @@ namespace WCS.WorkEngineering.Systems
                     SqlSugarHelper.Do(_db =>
                     {
                         var db = _db.Default;
-                        var task = db.Queryable<WCS_TaskInfo>().UpdLock().Single(x => x.BarCode == bcrCode && x.ID == mainlineDiversion.TaskId && x.Status == TaskStatus.NewBuild);
+                        var task = db.Queryable<WCS_TaskInfo>().NoLock().Single(x => x.BarCode == bcrCode && x.ID == mainlineDiversion.TaskId && x.Status == TaskStatus.NewBuild);
                         if (task == null)
                         {
-                            World.Log($"{bcrCode}-{mainlineDiversion}:找不到匹配任务", LogLevelEnum.High);
+                            World.Log($"{bcrCode}:找不到匹配任务--{value}", LogLevelEnum.High);
                             return;
                         }
-                        task.Status = TaskStatus.WaitingToExecute;
-                        task.EditWho = "WCS";
-                        task.StartTime = DateTime.Now;
+
+                        if ((obj.Entity.Code == "18" && task.WarehouseCode == "1N") ||
+                            (obj.Entity.Code == "118" && task.WarehouseCode == "1S") ||
+                            (obj.Entity.Code == "38" && task.WarehouseCode == "2N") ||
+                            (obj.Entity.Code == "138" && task.WarehouseCode == "2S") ||
+                            (obj.Entity.Code == "58" && task.WarehouseCode == "3N") ||
+                            (obj.Entity.Code == "158" && task.WarehouseCode == "3S"))
+                        {
+                            task.Status = TaskStatus.WaitingToExecute;
+                            task.EditWho = "WCS";
+                            task.StartTime = DateTime.Now;
+                        }
                         task.EditTime = DateTime.Now;
                         db.UpdateableRowLock(task).ExecuteCommand();
                         task.AddWCS_TASK_DTL(db, obj.Entity.Code, next, "任务完成预分流");
@@ -79,7 +88,7 @@ namespace WCS.WorkEngineering.Systems
                 }
                 catch (Exception e)
                 {
-                    World.Log($"{bcrCode}-{mainlineDiversion}:----{e.Message}", LogLevelEnum.High);
+                    World.Log($"{bcrCode}:----{e.Message}-{value}", LogLevelEnum.High);
                     continue;
                 }
 

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

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

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

@@ -355,7 +355,7 @@ namespace WCS.WorkEngineering.Systems
 
         public override bool Select(Device dev)
         {
-            return dev.Code is "Truss1" /*or "Truss2" or "Truss3"*/;
+            return dev.Code is "Truss1" or "Truss2" /*or "Truss3"*/;
         }
 
         public 桁架()

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

@@ -39,9 +39,9 @@ namespace WCS.WorkEngineering.Systems.环形库
             {
                 var db = _db.Default;
                 var taskNoList = obj.Data5.GetTaskNoList().ToList();
-                var tasks = db.Queryable<WCS_TaskInfo>().Where(x => taskNoList.Contains(x.ID) && x.Status == TaskStatus.ConveyorExecution).ToList();
-                var deliveryTask = db.Queryable<WCS_TaskInfo>().Single(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code) ?? throw new KnownException($"未找到当前站台对应的托盘搬运任务", LogLevelEnum.High);
-                var taskInfo = db.Queryable<WCS_TaskInfo>().Single(x => x.AddrFrom == obj.Entity.Code && x.Type == TaskType.EnterDepot);
+                var tasks = db.Queryable<WCS_TaskInfo>().UpdLock().Where(x => taskNoList.Contains(x.ID) && x.Status == TaskStatus.ConveyorExecution).ToList();
+                var deliveryTask = db.Queryable<WCS_TaskInfo>().UpdLock().Single(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code) ?? throw new KnownException($"未找到当前站台对应的托盘搬运任务", LogLevelEnum.High);
+                var taskInfo = db.Queryable<WCS_TaskInfo>().UpdLock().Single(x => x.AddrFrom == obj.Entity.Code && x.Type == TaskType.EnterDepot);
                 if (deliveryTask.Status != Entity.TaskStatus.RgvCompleted) throw new KnownException($"搬运任务状态异常:{deliveryTask.ID}", LogLevelEnum.High);
                 if (taskInfo == null)
                 {
@@ -73,18 +73,18 @@ namespace WCS.WorkEngineering.Systems.环形库
                 {
                     item.Status = TaskStatus.Finish;
                     item.EndTime = DateTime.Now;
-                    db.Updateable(item).ExecuteCommand();
+                    db.UpdateableRowLock(item).ExecuteCommand();
                     item.AddWCS_TASK_DTL(db, obj.Entity.Code, "任务结束");
                 }
 
                 deliveryTask.Status = TaskStatus.Finish;
                 deliveryTask.EndTime = DateTime.Now;
-                db.Updateable(deliveryTask).ExecuteCommand();
+                db.UpdateableRowLock(deliveryTask).ExecuteCommand();
                 deliveryTask.AddWCS_TASK_DTL(db, obj.Entity.Code, $"任务结束");
                 var dev = DevicePath.GetPath(obj.Entity.Code, "SRM").Points.Last();
                 taskInfo.Status = TaskStatus.ConveyorExecution;
                 taskInfo.WarehouseCode = dev.Code.GetWareCode();
-                db.Updateable(taskInfo).ExecuteCommand();
+                db.UpdateableRowLock(taskInfo).ExecuteCommand();
                 taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, $"更新任务对应仓库信息{taskInfo.WarehouseCode}");
 
                 task = taskInfo;

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

@@ -32,39 +32,58 @@ namespace WCS.WorkEngineering.Systems
                 {
                     var db = _db.Default;
                     //取一个时间最靠前的,没有绑定码垛工位的码垛记录
-                    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}");
-                    //获取可以使用的放货站台信息
-                    var taskAddNext = Device.All.FirstOrDefault(x => x.Code == palletizingInfo.TaskAddNext)?.Targets.FirstOrDefault()?.Targets.Where(x => x.HasFlag(DeviceFlags.桁架码垛位));
-                    if (taskAddNext == null) throw new Exception($"未找到{palletizingInfo.TaskAddNext}可去的码垛工位");
-                    var devs = Device.All.Where(x => taskAddNext.Contains(x)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).ToList();
-
-                    //获取所有的未结束且有码垛工位的码垛记录
-                    var palletizingStation = db.Queryable<WCS_Palletizing>().Where(x => !x.Finish && x.PalletizingStation != null).Select(x => x.PalletizingStation).ToList();
+                    var palletizingInfoList = db.Queryable<WCS_Palletizing>().UpdLock().Where(x => x.PalletizingStation == null && !x.Finish).OrderBy(x => x.AddTime).ToList();
+                    if (!palletizingInfoList.Any())
+                    {
+                        World.Log("没有码垛信息可用!");
+                        return;
+                    }
+                    foreach (var palletizingInfo in palletizingInfoList)
+                    {
+                        if (palletizing != null) continue;
+                        //var palleTask = db.Queryable<WCS_TaskInfo>().First(x => x.ID == palletizingInfo.TaskId && (x.Status == TaskStatus.FinishOfShunt || x.Status == TaskStatus.ConveyorExecution));
+                        //if (palleTask == null) throw new Exception($"未找到任务{palleTask.ID}");
+                        //获取可以使用的放货站台信息
+                        var taskAddNext = Device.All.FirstOrDefault(x => x.Code == palletizingInfo.TaskAddNext)?.Targets.FirstOrDefault()?.Targets.Where(x => x.HasFlag(DeviceFlags.桁架码垛位));
+                        if (taskAddNext == null)
+                        {
+                            World.Log($"未找到{palletizingInfo.TaskAddNext}可去的码垛工位:{palletizingInfo.Id}");
+                            continue;
+                        }
+                        var devs = Device.All.Where(x => taskAddNext.Contains(x)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).ToList();
+                        //获取所有的未结束且有码垛工位的码垛记录
+                        var palletizingStation = db.Queryable<WCS_Palletizing>().UpdLock().Where(x => !x.Finish && x.PalletizingStation != null).Select(x => x.PalletizingStation).ToList();
 
-                    //取一个可用用于码垛的地方
-                    var dev = devs.Where(x => !palletizingStation.Contains(x.Entity.Code)).FirstOrDefault(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status));
-                    if (dev == null) throw new Exception($"没有可用码垛工位");
+                        //取一个可用用于码垛的地方
+                        var dev = devs.Where(x => !palletizingStation.Contains(x.Entity.Code)).FirstOrDefault(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status));
+                        if (dev == null)
+                        {
+                            World.Log("没有可用码垛工");
+                            continue;
+                        }
 
-                    var addrFromCode = palletizingInfo.WarehouseCode switch
-                    {
-                        "1N" => "1602",
-                        "1S" => "1612",
-                        "2N" => "1622",
-                        "2S" => "1632",
-                        "3N" => "1642",
-                        "3S" => "1652",
-                        _ => "9999"
-                    };
+                        var addrFromCode = palletizingInfo.WarehouseCode switch
+                        {
+                            "1N" => "1602",
+                            "1S" => "1612",
+                            "2N" => "1622",
+                            "2S" => "1632",
+                            "3N" => "1642",
+                            "3S" => "1652",
+                            _ => "9999"
+                        };
 
-                    var endDev = Device.All.Where(x => x.Code == addrFromCode).Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
-                    if (endDev.Data.TaskNumber != 0 || endDev.Data.GoodsEnd != 0) throw new Exception($"{endDev.Entity.Code}有残留任务信息,请处理!");
+                        var endDev = Device.All.Where(x => x.Code == addrFromCode).Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
+                        if (endDev.Data.TaskNumber != 0 || endDev.Data.GoodsEnd != 0)
+                        {
+                            World.Log($"{endDev.Entity.Code}有残留任务信息,请处理!");
+                            continue;
+                        }
 
-                    palletizingInfo.PalletizingStation = dev.Entity.Code;
-                    db.Updateable(palletizingInfo).ExecuteCommand();
-                    palletizing = palletizingInfo;
+                        palletizingInfo.PalletizingStation = dev.Entity.Code;
+                        db.UpdateableRowLock(palletizingInfo).ExecuteCommand();
+                        palletizing = palletizingInfo;
+                    }
                 });
                 if (palletizing == null) return;
                 var addrFromCode = palletizing.WarehouseCode switch
@@ -90,14 +109,14 @@ namespace WCS.WorkEngineering.Systems
                 {
                     var db = _db.Default;
                     //检查是否有待执行状态放货点是自己的出库任务
-                    var ringTask = db.Queryable<WCS_TaskInfo>().First(x => x.Type == TaskType.OutDepot && x.Status <= TaskStatus.WaitingToExecute && x.SrmStation == obj.Entity.Code);
+                    var ringTask = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.Type == TaskType.OutDepot && x.Status <= TaskStatus.WaitingToExecute && x.SrmStation == obj.Entity.Code);
                     if (ringTask == null)
                     {
                         //开始申请码垛任务
                         WmsApi.ApplyPalletizingStockOut(obj.Entity.Code, obj.Entity.Sources.Single(x => x.HasFlag(DeviceFlags.Robot)).Code);
                         return;
                     }
-                    var task = db.Queryable<WCS_TaskInfo>().First(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code);
+                    var task = db.Queryable<WCS_TaskInfo>().UpdLock().First(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code);
                     if (task != null) return;
                     //开始获取当前地址上个设备的上一个设备中的非零九托盘拆机
                     var addrFrom = obj.Entity.Sources.SelectMany(x => x.Sources).Single(x => x.HasFlag(DeviceFlags.拆盘机));
@@ -116,11 +135,11 @@ namespace WCS.WorkEngineering.Systems
                         AddWho = "WCS",
                         AddTime = DateTime.Now
                     };
-                    var res = db.Insertable(task).ExecuteReturnEntity();
+                    var res = db.InsertableRowLock(task).ExecuteReturnEntity();
                     var taskOld = res.Mapper<WCS_TaskOld, WCS_TaskInfo>();
                     taskOld.Id = res.ID;
                     taskOld.AddTime = DateTime.Now; ;
-                    db.Insertable(taskOld).SplitTable().ExecuteCommand();
+                    db.InsertableRowLock(taskOld).SplitTable().ExecuteCommand();
                     res.AddWCS_TASK_DTL(db, obj.Entity.Code, task.AddrTo, "初始化码垛托盘搬运任务");
                     deliveryTask = res;
                 });

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

@@ -1088,17 +1088,17 @@ namespace WCS.WorkEngineering
                     "866", "880", "894", "908", "922", "936", "950", "964", "978", "991", "1066", "1080", "1094", "1108", "1122", "1136", "1150", "1164", "1178", "1191"/*,
                     "1266", "1280", "1294", "1308", "1322", "1336", "1350", "1364", "1378", "1391", "1466", "1480", "1494", "1408", "1422", "1436", "1450", "1464", "1478", "1591" */} },
                 { DeviceFlags.桁架09缓存放行点, new List<string>(){ "466", "480", "494", "508", "522", "536", "666", "680", "694", "708", "722", "736"
-                    , "866", "880", "894", "908", "922", "936", "1066", "1080", "1094", "1108", "1122", "1136"/*,
-                     "1266", "1280", "1294", "1308", "1322", "1336",  "1466", "1480", "1494", "1408", "1422", "1436"*/ } },
-                { DeviceFlags.桁架09异常缓存放行点, new List<string>(){ "591", "791", "991" , "1191"/* , "1391" , "1591"*/ } },
+                    , "866", "880", "894", "908", "922", "936", "1066", "1080", "1094", "1108", "1122", "1136",
+                     "1266", "1280", "1294", "1308", "1322", "1336",  "1466", "1480", "1494", "1408", "1422", "1436" } },
+                { DeviceFlags.桁架09异常缓存放行点, new List<string>(){ "591", "791", "991" , "1191"/* , "1391" , "1591" } },
                 { DeviceFlags.桁架18缓存放行点, new List<string>(){ "550", "564", "578", "750", "764", "778", "950", "964", "978" , "1150", "1164", "1178" /*, "1350", "1364", "1378" , "1450", "1464", "1478"*/ } },
                 { DeviceFlags.桁架取货点, new List<string>(){ "461", "475", "489", "503", "517", "531", "545", "559", "573", "586", "661", "675", "689", "703", "717", "731", "745", "759", "773", "786",
-                     "861", "875", "889", "903", "917", "931", "945", "959", "973", "986", "1061", "1075", "1089", "1103", "1117", "1131", "1145", "1159", "1173", "1186"/*,
-                     "1261", "1275", "1289", "1303", "1317", "1331", "1345", "1359", "1373", "1386" , "1461", "1475", "1489", "1503", "1517", "1531", "1545", "1559", "1573", "1586"*/ } },
+                     "861", "875", "889", "903", "917", "931", "945", "959", "973", "986", "1061", "1075", "1089", "1103", "1117", "1131", "1145", "1159", "1173", "1186",
+                     "1261", "1275", "1289", "1303", "1317", "1331", "1345", "1359", "1373", "1386" , "1461", "1475", "1489", "1503", "1517", "1531", "1545", "1559", "1573", "1586" } },
                 //{ DeviceFlags.拆盘机09, new List<string>(){ /*"1606", "1616",*/"1626","1636","1646","1656" } },
-                { DeviceFlags.拆盘机, new List<string>(){ "1602", "1612", "1622", "1632"/*,"1642","1652"*/ } },
-                { DeviceFlags.桁架码垛位, new List<string>(){ /*"1670", "1671",*/ "1672", "1673", "1674", "1675", "1664","1662","1663","1665","1677","1678","1679","1680","1685","1686","1687","1688","1689",
-                    /*"1690", "1692", "1693", "1694", "1695", "1700", "1701", "1702", "1703", "1704", "1705", "1707", "1708", "1709", "1710", "1715", "1716", "1717", "1718", "1719", "1720", "1722", "1723", "1724", "1725", "1730", "1731", "1732", "1733", "1734", "1735", "1737", "1738", "1739", "1740", "1745", "1746", "1747", "1748", "1749", "1750"*/ } },
+                { DeviceFlags.拆盘机, new List<string>(){ "1602", "1612", "1622", "1632", "1642", "1652" } },
+                { DeviceFlags.桁架码垛位, new List<string>(){ "1670", "1671", "1672", "1673", "1674", "1675", "1664","1662","1663","1665","1677","1678","1679","1680","1685","1686","1687","1688","1689",
+                    "1690", "1692", "1693", "1694", "1695", "1700", "1701", "1702", "1703", "1704", "1705", "1707", "1708", "1709", "1710", "1715", "1716", "1717", "1718", "1719", "1720", "1722", "1723", "1724", "1725", "1730", "1731", "1732", "1733", "1734", "1735", "1737", "1738", "1739", "1740", "1745", "1746", "1747", "1748", "1749", "1750" } },
                 { DeviceFlags.环形库码垛工位, new List<string>(){ "1666", "1661", "1676", "1681", "1691", "1696", "1706", "1711"/*, "1721", "1726", "1736", "1741"*/ } },
                 { DeviceFlags.AGV取货站台口, new List<string>(){ "2533", "2534", "2734", "2733","2934","2933","3133", "3134"/*,"3333","3334","3533","3534" */} },
                 { DeviceFlags.Robot, new List<string>(){ "Robot1", "Robot2", "Robot3", "Robot4"/* , "Robot5", "Robot6"*/ } },