林豪 左 1 year ago
parent
commit
e1fae8c8ce

+ 1 - 0
ServiceCenter/Redis/RedisHub.cs

@@ -181,6 +181,7 @@ namespace ServiceCenter.Redis
         {
             if (!RedisClients.Any()) throw new Exception($"请调用{nameof(CreateContext)}方法设置设置数据库连接");
             var redis = Context(key);
+            lockKey = "ConcurrentLock:" + lockKey;
             try
             {
                 if (redis.Exists(lockKey)) throw new Exception($"重复调用:{lockKey}");

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

@@ -31,160 +31,155 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Device<IStation520> obj)
         {
-            var key = $"WCS:Lock:无交互系统{obj.Entity.Code}";
-            RedisHub.Do(key, redis =>
+            RedisHub.Do(obj.Entity.Code, redis =>
             {
-                try
+                var taskInfos = new List<WCS_TaskInfo>();
+                SqlSugarHelper.Do(db =>
                 {
-                    List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>();
-                    SqlSugarHelper.Do(db =>
-                    {
-                        taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild && !(t.Type == TaskType.SetPlate && t.AddrFrom == "Robot")).ToList();
-                    });
-                    if (taskInfos.Any())
+                    //获取所有的新建任务,组盘任务不需要
+                    taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild && !(t.Type == TaskType.SetPlate && t.AddrFrom == "Robot")).ToList();
+                });
+                if (!taskInfos.Any()) return;
+                foreach (var item in taskInfos)
+                {
+                    try
                     {
-                        foreach (var item in taskInfos)
+                        SqlSugarHelper.Do(db =>
                         {
-                            try
+                            var task = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.ID == item.ID).First() ?? throw new Exception($"未找到对应的WCS任务[{item.ID}]");
+                            switch (task.Type)
                             {
-                                SqlSugarHelper.Do(db =>
-                                {
-                                    var task = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.ID == item.ID).First() ?? throw new Exception($"未找到对应的WCS任务[{item.ID}]");
-                                    switch (task.Type)
+                                case TaskType.SetPlate:
+                                    if (task.AddrFrom != "Robot")
                                     {
-                                        case TaskType.SetPlate:
-                                            if (task.AddrFrom != "Robot")
-                                            {
-                                                //更新任务状态
-                                                task.Status = TaskStatus.WaitingToExecute;
-                                                db.Default.Updateable(task).ExecuteCommand();
-                                                task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
-                                            }
+                                        //更新任务状态
+                                        task.Status = TaskStatus.WaitingToExecute;
+                                        db.Default.Updateable(task).ExecuteCommand();
+                                        task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
+                                    }
+                                    break;
+
+                                case TaskType.EnterDepot:
+                                    //更新任务状态
+                                    task.Status = Entity.TaskStatus.WaitingToExecute;
+                                    switch (task.WarehouseCode)
+                                    {
+                                        case "1N":
+                                            task.Device = "SRM1";
                                             break;
+                                    }
 
-                                        case TaskType.EnterDepot:
-                                            //更新任务状态
-                                            task.Status = Entity.TaskStatus.WaitingToExecute;
-                                            switch (task.WarehouseCode)
-                                            {
-                                                case "1N":
-                                                    task.Device = "SRM1";
-                                                    break;
-                                            }
+                                    if (task.AddrFrom is "1666" or "1661")
+                                    {
+                                        task.Device = "SRM1";
+                                    }
 
-                                            if (task.AddrFrom is "1666" or "1661")
-                                            {
-                                                task.Device = "SRM1";
-                                            }
+                                    //计算下一个地址
+                                    var path1 = DevicePath.GetPath(task.AddrFrom, task.Device);
+                                    task.AddrNext = path1.Points[1].Code;
+                                    task.SrmStation = task.BarCode.Contains("TPA") || task.BarCode.Contains("TPB") ? task.AddrFrom : path1.Points[2].Code;
 
-                                            //计算下一个地址
-                                            var path1 = DevicePath.GetPath(task.AddrFrom, task.Device);
-                                            task.AddrNext = path1.Points[1].Code;
-                                            task.SrmStation = task.BarCode.Contains("TPA") || task.BarCode.Contains("TPB") ? task.AddrFrom : path1.Points[2].Code;
+                                    db.Default.Updateable(task).ExecuteCommand();
+                                    task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
+                                    break;
 
+                                case TaskType.OutDepot:
+                                    {
+                                        if (task.Device.Contains("Robot"))
+                                        {
+                                            var pos = task.AddrFrom.Split("-");
+                                            task.Status = Entity.TaskStatus.WaitingToExecute;
+                                            task.Line = pos[0].ToShort();
+                                            task.Col = pos[1].ToShort();
+                                            task.Layer = pos[2].ToShort();
+                                            task.Depth = pos[3].ToShort();
                                             db.Default.Updateable(task).ExecuteCommand();
-                                            task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
-                                            break;
-
-                                        case TaskType.OutDepot:
+                                            task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
+                                        }
+                                        else
+                                        {
+                                            if (task.SrmStation == "1")
                                             {
-                                                if (task.Device.Contains("Robot"))
+                                                var srmStation = new string[2];
+                                                switch (task.Device)
                                                 {
-                                                    var pos = task.AddrFrom.Split("-");
-                                                    task.Status = Entity.TaskStatus.WaitingToExecute;
-                                                    task.Line = pos[0].ToShort();
-                                                    task.Col = pos[1].ToShort();
-                                                    task.Layer = pos[2].ToShort();
-                                                    task.Depth = pos[3].ToShort();
-                                                    db.Default.Updateable(task).ExecuteCommand();
-                                                    task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
+                                                    case "SRM1":
+                                                        srmStation[0] = "2534";
+                                                        srmStation[1] = "2533";
+                                                        break;
+
+                                                    case "SRM2":
+                                                        srmStation[0] = "";
+                                                        srmStation[1] = "";
+                                                        break;
                                                 }
-                                                else
-                                                {
-
 
-                                                    if (task.SrmStation == "1")
-                                                    {
-                                                        //var srmStation = new string[2];
-                                                        //switch (task.Device)
-                                                        //{
-                                                        //    case "SRM1":
-                                                        //        srmStation[0] = "2534";
-                                                        //        srmStation[1] = "2533";
-                                                        //        break;
-                                                        //}
-                                                        //task.SrmStation = "";
-                                                        //task.AddrTo = "2534";
-
-                                                        task.SrmStation = "";
-                                                        task.AddrTo = "2534";
-                                                        task.Device = "SRM" + task.WarehouseCode.Substring(0, 1);
-                                                    }
-                                                    if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台
-                                                    {
-                                                        if (task.Device.IsNullOrEmpty())
-                                                        {
-                                                            task.Device = "SRM" + task.Tunnel.GetLastDigit();
-                                                        }
-                                                        //获取堆垛机到目标地址的路径信息
-                                                        var path = DevicePath.GetPath(task.Device, task.AddrTo);
-                                                        task.SrmStation = path.Points[1].Code;
-                                                    }
-
-                                                    var devs = Device.All.Where(x => x.HasFlag(DeviceFlags.AGV取货站台口)).Select(x => x.Code);
-                                                    if (devs.Contains(task.SrmStation))
-                                                    {
-                                                        //开始处理车间叫料AGV任务任务
-                                                        db.Default.Insertable(new WCS_AgvTaskInfo()
-                                                        {
-                                                            ID = db.GetAgvTaskId(),
-                                                            TaskType = AGVTaskType.CallMaterial,
-                                                            Status = AGVTaskStatus.NewBuild,
-                                                            TaskId = task.ID,
-                                                            Position = task.WorkBench,
-                                                            Station = task.SrmStation,
-                                                            AddWho = "WCS",
-                                                            AddTime = DateTime.Now
-                                                        }).SplitTable().ExecuteCommand();
-
-                                                        db.Default.Insertable(new WCS_AgvTaskInfo()
-                                                        {
-                                                            ID = db.GetAgvTaskId(),
-                                                            TaskType = AGVTaskType.EnterDepot,
-                                                            Status = AGVTaskStatus.NewBuild,
-                                                            TaskId = task.ID,
-                                                            Position = task.WorkBench,
-                                                            Station = "2501",
-                                                            AddWho = "WCS",
-                                                            AddTime = DateTime.Now
-                                                        }).SplitTable().ExecuteCommand();
-                                                    }
-                                                    //更新任务状态
-                                                    task.Status = Entity.TaskStatus.WaitingToExecute;
-                                                    db.Default.Updateable(task).ExecuteCommand();
-                                                    task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
+                                                //TODO:暂时不考虑入库卡控
+                                                //开始计算当前这个任务要从哪个站台出
+                                                //计算两个站台小于取货完成数量的AGV任务
+                                                var agv1 = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(x => x.Take(2)).Count(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[0]);
+                                                var agv2 = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(x => x.Take(2)).Count(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[1]);
+                                                task.SrmStation = "";
+                                                task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0];
+                                            }
+                                            if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台
+                                            {
+                                                if (task.Device.IsNullOrEmpty())
+                                                {
+                                                    task.Device = "SRM" + task.Tunnel.GetLastDigit();
                                                 }
-                                                break;
+                                                //获取堆垛机到目标地址的路径信息
+                                                var path = DevicePath.GetPath(task.Device, task.AddrTo);
+                                                task.SrmStation = path.Points[1].Code;
                                             }
-                                        case TaskType.Delivery:
-                                            break;
 
-                                        case TaskType.EmptyInit:
-                                            break;
+                                            var devs = Device.All.Where(x => x.HasFlag(DeviceFlags.AGV取货站台口)).Select(x => x.Code);
+                                            if (devs.Contains(task.SrmStation))
+                                            {
+                                                //开始处理车间叫料AGV任务任务
+                                                db.Default.Insertable(new WCS_AgvTaskInfo()
+                                                {
+                                                    ID = db.GetAgvTaskId(),
+                                                    TaskType = AGVTaskType.CallMaterial,
+                                                    Status = AGVTaskStatus.NewBuild,
+                                                    TaskId = task.ID,
+                                                    Position = task.WorkBench,
+                                                    Station = task.SrmStation,
+                                                    AddWho = "WCS",
+                                                    AddTime = DateTime.Now
+                                                }).SplitTable().ExecuteCommand();
+
+                                                db.Default.Insertable(new WCS_AgvTaskInfo()
+                                                {
+                                                    ID = db.GetAgvTaskId(),
+                                                    TaskType = AGVTaskType.EnterDepot,
+                                                    Status = AGVTaskStatus.NewBuild,
+                                                    TaskId = task.ID,
+                                                    Position = task.WorkBench,
+                                                    Station = "2501",
+                                                    AddWho = "WCS",
+                                                    AddTime = DateTime.Now
+                                                }).SplitTable().ExecuteCommand();
+                                            }
+                                            //更新任务状态
+                                            task.Status = Entity.TaskStatus.WaitingToExecute;
+                                            db.Default.Updateable(task).ExecuteCommand();
+                                            task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
+                                        }
+                                        break;
                                     }
-                                });
-                            }
-                            catch (Exception ex)
-                            {
-                                World.Log(ex.Message, LogLevelEnum.Mid);
-                                continue;
+                                case TaskType.Delivery:
+                                    break;
+
+                                case TaskType.EmptyInit:
+                                    break;
                             }
-                        }
+                        });
+                    }
+                    catch (Exception ex)
+                    {
+                        World.Log(ex.Message, LogLevelEnum.Mid);
                     }
-                }
-                catch (Exception ex)
-                {
-                    World.Log(ex.Message, LogLevelEnum.Mid);
                 }
             });
         }

+ 4 - 1
业务工程/分拣库/WCS.WorkEngineering/WCS.WorkEngineering.csproj

@@ -22,9 +22,12 @@
   <ItemGroup>
     <PackageReference Include="MessagePack" Version="2.5.108" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.5" />
-    <PackageReference Include="ServiceCenter" Version="1.0.5.3" />
     <PackageReference Include="WCS.Entity.Protocol" Version="1.0.4.4" />
     <PackageReference Include="wms.sqlsugar" Version="1.0.0.4" />
   </ItemGroup>
 
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\ServiceCenter\ServiceCenter.csproj" />
+  </ItemGroup>
+
 </Project>