xu.lu vor 1 Jahr
Ursprung
Commit
1f5983fe94

+ 1 - 0
YWGC/FJK/WCS.WorkEngineering/Extensions/DeviceExtension.cs

@@ -419,6 +419,7 @@ namespace WCS.WorkEngineering.Extensions
         二次码垛RGV取货口 = 1L << 42,
         无交互触发设备 = 1L << 43,
         桁架18取货点 = 1L << 44,
+        重绕组盘取货站台口 = 1L << 45,
     }
 }
 

+ 209 - 102
YWGC/FJK/WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -10,6 +10,7 @@ using WCS.Entity;
 using WCS.Entity.Protocol.Station;
 using WCS.WorkEngineering.Extensions;
 using WCS.WorkEngineering.WebApi.Controllers;
+using WCS.WorkEngineering.WebApi.Models.WMS.Request;
 using WCS.WorkEngineering.Worlds;
 using TaskStatus = WCS.Entity.TaskStatus;
 
@@ -158,7 +159,19 @@ namespace WCS.WorkEngineering.Systems
                                                 tasknew.AddWCS_TASK_DTL(db.Default, "agv", "任务下发agv执行");
                                             }
                                         }
-                                        else
+                                        else if (agv.WorkShop == 222)//退料重绕
+                                        {
+                                            AgvApi.退料重绕(agv.Position, agv.ID.ToString(), agv.Station);
+                                            var tasknew = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.ID == agv.TaskId).First();
+                                            if (tasknew != null)
+                                            {
+                                                tasknew.Status = TaskStatus.AGVExecution;
+                                                tasknew.EditTime = DateTime.Now;
+                                                db.Default.UpdateableRowLock(tasknew).UpdateColumns(x => new { x.Status, x.EditTime }).ExecuteCommand();
+                                                tasknew.AddWCS_TASK_DTL(db.Default, "agv", "任务下发agv执行");
+                                            }
+                                        }
+                                        else if (agv.WorkShop != 111)
                                         {
                                             AgvApi.托盘回库(agv.Position, agv.ID.ToString(), agv.Station);
                                         }
@@ -169,142 +182,236 @@ namespace WCS.WorkEngineering.Systems
                                         {
                                             var task = db.Default.Queryable<WCS_TaskOld>().NoLock().Where(x => x.Id == agv.TaskId).SplitTable(x => x.Take(2)).First();
                                             if (task == null) throw new Exception($"未找到对应的WCS任务{agv.TaskId}");
-
-                                            //获取当前任务可以去的目标地址
-                                            var positionList = new List<string>(); //当前分配点对应的放货点
-                                            var allPositionList = new List<string>(); //同库区另一侧的放货点
-                                            var nearPositionList = new List<string>(); //所有的放货点
-
-                                            GetPositionList(positionList, nearPositionList, allPositionList, task.WarehouseCode);
-
-                                            List<WCS_AgvTaskInfo> agvs = new List<WCS_AgvTaskInfo>(); //当前分配点对应的放货点已用点
-                                            List<WCS_AgvTaskInfo> agvsNear = new List<WCS_AgvTaskInfo>(); //同库区另一侧的放货点已用点
-                                            List<WCS_AgvTaskInfo> agvsAll = new List<WCS_AgvTaskInfo>(); //所有的放货点已用点
-
-                                            agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && positionList.Contains(v.Station))
-                                                .SplitTable(v => v.Take(2)).ToList();
-                                            agvsAll = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && allPositionList.Contains(v.Station))
-                                                .SplitTable(v => v.Take(2)).ToList();
-                                            agvsNear = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && nearPositionList.Contains(v.Station))
-                                                .SplitTable(v => v.Take(2)).ToList();
-                                            //获取放货点
-                                            var agvPositionLists = agvs.Select(x => x.Station).Distinct();
-                                            var agvPositionListsNear = agvsNear.Select(x => x.Station).Distinct();
-                                            var agvPositionListsAll = agvsAll.Select(x => x.Station).Distinct();
-                                            //获取各区域可用点
-                                            var endDev = positionList.Where(x => !agvPositionLists.Contains(x)).ToList();
-                                            var endNearDev = nearPositionList.Where(x => !agvPositionListsNear.Contains(x)).ToList();
-                                            var endAllDev = allPositionList.Where(x => !agvPositionListsAll.Contains(x)).ToList();
-
-                                            World.Log($"agv可用巷道信息:{JsonConvert.SerializeObject(endDev)}");
-                                            World.Log($"agv可用巷道信息(所有):{JsonConvert.SerializeObject(endAllDev)}");
-
-                                            if (!endDev.Any() && !endAllDev.Any() && !endNearDev.Any())//没有可用放货站台
+                                            if (task.BusType == TaskBusType.帘线退料重绕.GetDescription())
                                             {
-                                                var msg = "已无可用放货站台,任务正在执行中:";
-                                                foreach (var ag in agvs)
+                                                //首先判断退料输送线是否可放货                                               
+                                                var ph_9001 = new Device<IStation523>(Device.All.First(x => x.Code == "9001"), World);
+                                                var ph_9101 = new Device<IStation523>(Device.All.First(x => x.Code == "9101"), World);
+                                                var flag1 = !db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station == "9001")
+                                                    .SplitTable(v => v.Take(2)).Any() && !ph_9001.Data.Status.HasFlag(StationStatus.PH_Status);
+                                                var flag2 = !db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station == "9101")
+                                                    .SplitTable(v => v.Take(2)).Any() && !ph_9101.Data.Status.HasFlag(StationStatus.PH_Status);
+                                                if (flag2)
                                                 {
-                                                    msg += $"[任务号:{ag.ID},目标地址:{ag.Station}]";
+                                                    agv.Status = AGVTaskStatus.Complete1;
+                                                    agv.Station = "9101";
+                                                    db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                                    task.AddrTo = agv.Station;
+                                                    db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo }).ExecuteCommand();
+                                                    task.AddWCS_TASK_DTL(db.Default, "帘线退料重绕分配目标放货点", agv.Station, $"任务分配至:{agv.Station}");                                                  
+                                                    AgvApi.ContinueTask(agv.AgvID, agv.Station);
+                                                    return;
                                                 }
-                                                throw new Exception(msg);
-                                            }
-
-                                            //获取没有光电信息的设备集合
-                                            try
-                                            {
-                                                // 获取可用站台
-                                                var devs = Device.All.Where(x => endDev.Contains(x.Code)).Select(x =>
-                                                    new Device<IStation520, IStation521, IStation523>(x, World));
-                                                devs = devs.Where(x =>
-                                                    !x.Data3.Status.HasFlag(StationStatus.Run) &&
-                                                    !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
-                                                    x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
+                                                else if (flag1)
+                                                {
+                                                    agv.Status = AGVTaskStatus.Complete1;
+                                                    agv.Station = "9001";
+                                                    db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                                    task.AddrTo = agv.Station;
+                                                    db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo }).ExecuteCommand();
+                                                    task.AddWCS_TASK_DTL(db.Default, "帘线退料重绕分配目标放货点", agv.Station, $"任务分配至:{agv.Station}");                                                    
+                                                    AgvApi.ContinueTask(agv.AgvID, agv.Station);
+                                                    return;
+                                                }
+                                                else//请求WMS分配可用放货点
+                                                {
+                                                    List<string> allDevs = new List<string> {"9201","9202","9203", "9204", "9205", "9206", "9207", "9208", "9209" };
 
-                                                var devsNear = Device.All.Where(x => endNearDev.Contains(x.Code)).Select(x =>
-                                                    new Device<IStation520, IStation521, IStation523>(x, World));
-                                                devsNear = devsNear.Where(x =>
-                                                    !x.Data3.Status.HasFlag(StationStatus.Run) &&
-                                                    !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
-                                                    x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
+                                                    var agvStas = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && allDevs.Contains(v.Station))
+                                                    .SplitTable(v => v.Take(2)).ToList();
+                                                    var agvStaLists = agvStas.Select(x => x.Station).Distinct();
+                                                    var devs = allDevs.Where(x => !agvStaLists.Contains(x)).ToList();
+                                                    var devsPut = Device.All.Where(x => devs.Contains(x.Code)).Select(x =>
+                                                        new Device<IStation520, IStation521, IStation523>(x, World));
+                                                    devsPut = devsPut.Where(x =>
+                                                        !x.Data3.Status.HasFlag(StationStatus.Run) &&
+                                                        !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
+                                                        x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
 
-                                                var devsAll = Device.All.Where(x => endAllDev.Contains(x.Code)).Select(x =>
-                                                    new Device<IStation520, IStation521, IStation523>(x, World));
-                                                devsAll = devsAll.Where(x =>
-                                                    !x.Data3.Status.HasFlag(StationStatus.Run) &&
-                                                    !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
-                                                    x.Data3.Status.HasFlag(StationStatus.Auto)).OrderBy(v => allPositionList.Contains(v.Entity.Code)).ToList();
-                                                if (!devs.Any()) //自身所属位置无可用放货点
-                                                {
-                                                    if (devsNear.Any())//先判断同库一侧
+                                                    if (devsPut.Any())
                                                     {
-                                                        foreach (var dev in devsNear)
+                                                        foreach (var dev in devsPut)
                                                         {
                                                             if (!dev.Data3.Status.HasFlag(StationStatus.Run) && !dev.Data3.Status.HasFlag(StationStatus.PH_Status) && dev.Data3.Status.HasFlag(StationStatus.Auto))
                                                             {
-                                                                World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devsAll.Select(x => x.Entity.Code).ToList())}");
+                                                                
                                                                 agv.Status = AGVTaskStatus.Complete1;
                                                                 agv.Station = dev.Entity.Code;
                                                                 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}");
-                                                                World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
-                                                                AgvApi.ContinueTask(agv.AgvID, agv.Station);
-                                                                World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
+                                                                task.AddrTo = agv.Station;
+                                                                db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo }).ExecuteCommand();
+                                                                task.AddWCS_TASK_DTL(db.Default, "帘线退料重绕分配目标放货点", agv.Station, $"任务分配至:{agv.Station}");
+                                                                AgvApi.ContinueTask(agv.AgvID, agv.Station);                                                              
                                                                 return;
                                                             }
-                                                            
                                                         }
                                                     }
-                                                    else if (devsAll.Any())
+                                                    else
+                                                    {
+                                                        throw new Exception("已无可用放货站台,请等待");
+                                                    }
+
+                                                }
+
+                                            }
+                                            else
+                                            {
+                                                //获取当前任务可以去的目标地址
+                                                var positionList = new List<string>(); //当前分配点对应的放货点
+                                                var allPositionList = new List<string>(); //同库区另一侧的放货点
+                                                var nearPositionList = new List<string>(); //所有的放货点
+
+                                                GetPositionList(positionList, nearPositionList, allPositionList, task.WarehouseCode);
+
+                                                List<WCS_AgvTaskInfo> agvs = new List<WCS_AgvTaskInfo>(); //当前分配点对应的放货点已用点
+                                                List<WCS_AgvTaskInfo> agvsNear = new List<WCS_AgvTaskInfo>(); //同库区另一侧的放货点已用点
+                                                List<WCS_AgvTaskInfo> agvsAll = new List<WCS_AgvTaskInfo>(); //所有的放货点已用点
+
+                                                agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && positionList.Contains(v.Station))
+                                                    .SplitTable(v => v.Take(2)).ToList();
+                                                agvsAll = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && allPositionList.Contains(v.Station))
+                                                    .SplitTable(v => v.Take(2)).ToList();
+                                                agvsNear = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && nearPositionList.Contains(v.Station))
+                                                    .SplitTable(v => v.Take(2)).ToList();
+                                                //获取放货点
+                                                var agvPositionLists = agvs.Select(x => x.Station).Distinct();
+                                                var agvPositionListsNear = agvsNear.Select(x => x.Station).Distinct();
+                                                var agvPositionListsAll = agvsAll.Select(x => x.Station).Distinct();
+                                                //获取各区域可用点
+                                                var endDev = positionList.Where(x => !agvPositionLists.Contains(x)).ToList();
+                                                var endNearDev = nearPositionList.Where(x => !agvPositionListsNear.Contains(x)).ToList();
+                                                var endAllDev = allPositionList.Where(x => !agvPositionListsAll.Contains(x)).ToList();
+
+                                                World.Log($"agv可用巷道信息:{JsonConvert.SerializeObject(endDev)}");
+                                                World.Log($"agv可用巷道信息(所有):{JsonConvert.SerializeObject(endAllDev)}");
+
+                                                if (!endDev.Any() && !endAllDev.Any() && !endNearDev.Any())//没有可用放货站台
+                                                {
+                                                    var msg = "已无可用放货站台,任务正在执行中:";
+                                                    foreach (var ag in agvs)
+                                                    {
+                                                        msg += $"[任务号:{ag.ID},目标地址:{ag.Station}]";
+                                                    }
+                                                    throw new Exception(msg);
+                                                }
+
+                                                //获取没有光电信息的设备集合
+                                                try
+                                                {
+                                                    // 获取可用站台
+                                                    var devs = Device.All.Where(x => endDev.Contains(x.Code)).Select(x =>
+                                                        new Device<IStation520, IStation521, IStation523>(x, World));
+                                                    devs = devs.Where(x =>
+                                                        !x.Data3.Status.HasFlag(StationStatus.Run) &&
+                                                        !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
+                                                        x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
+
+                                                    var devsNear = Device.All.Where(x => endNearDev.Contains(x.Code)).Select(x =>
+                                                        new Device<IStation520, IStation521, IStation523>(x, World));
+                                                    devsNear = devsNear.Where(x =>
+                                                        !x.Data3.Status.HasFlag(StationStatus.Run) &&
+                                                        !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
+                                                        x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
+
+                                                    var devsAll = Device.All.Where(x => endAllDev.Contains(x.Code)).Select(x =>
+                                                        new Device<IStation520, IStation521, IStation523>(x, World));
+                                                    devsAll = devsAll.Where(x =>
+                                                        !x.Data3.Status.HasFlag(StationStatus.Run) &&
+                                                        !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
+                                                        x.Data3.Status.HasFlag(StationStatus.Auto)).OrderBy(v => allPositionList.Contains(v.Entity.Code)).ToList();
+                                                    if (!devs.Any()) //自身所属位置无可用放货点
                                                     {
-                                                        foreach (var dev in devsAll)
+                                                        if (devsNear.Any())//先判断同库一侧
                                                         {
-                                                            if (!dev.Data3.Status.HasFlag(StationStatus.Run) && !dev.Data3.Status.HasFlag(StationStatus.PH_Status) && dev.Data3.Status.HasFlag(StationStatus.Auto))
+                                                            foreach (var dev in devsNear)
                                                             {
-                                                                World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devsAll.Select(x => x.Entity.Code).ToList())}");
-                                                                agv.Status = AGVTaskStatus.Complete1;
-                                                                agv.Station = dev.Entity.Code;
-                                                                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}");
-                                                                World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
-                                                                AgvApi.ContinueTask(agv.AgvID, agv.Station);
-                                                                World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
-                                                                return;
+                                                                if (!dev.Data3.Status.HasFlag(StationStatus.Run) && !dev.Data3.Status.HasFlag(StationStatus.PH_Status) && dev.Data3.Status.HasFlag(StationStatus.Auto))
+                                                                {
+                                                                    World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devsAll.Select(x => x.Entity.Code).ToList())}");
+                                                                    agv.Status = AGVTaskStatus.Complete1;
+                                                                    agv.Station = dev.Entity.Code;
+                                                                    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}");
+                                                                    World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
+                                                                    AgvApi.ContinueTask(agv.AgvID, agv.Station);
+                                                                    World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
+                                                                    return;
+                                                                }
+
+                                                            }
+                                                        }
+                                                        else if (devsAll.Any())
+                                                        {
+                                                            foreach (var dev in devsAll)
+                                                            {
+                                                                if (!dev.Data3.Status.HasFlag(StationStatus.Run) && !dev.Data3.Status.HasFlag(StationStatus.PH_Status) && dev.Data3.Status.HasFlag(StationStatus.Auto))
+                                                                {
+                                                                    World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devsAll.Select(x => x.Entity.Code).ToList())}");
+                                                                    agv.Status = AGVTaskStatus.Complete1;
+                                                                    agv.Station = dev.Entity.Code;
+                                                                    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}");
+                                                                    World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
+                                                                    AgvApi.ContinueTask(agv.AgvID, agv.Station);
+                                                                    World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
+                                                                    return;
+                                                                }
                                                             }
                                                         }
+                                                        World.Log("可用站台均有货或有执行中任务");
+                                                        return;
                                                     }
-                                                    World.Log("可用站台均有货或有执行中任务");
-                                                    return;
-                                                }
 
-                                                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.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}");
-                                                World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
-                                                AgvApi.ContinueTask(agv.AgvID, agv.Station);
-                                                World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
-                                            }
-                                            catch (Exception e)
-                                            {
-                                                throw new Exception($"执行错误:{e.Message + e.StackTrace}");
+                                                    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.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}");
+                                                    World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
+                                                    AgvApi.ContinueTask(agv.AgvID, agv.Station);
+                                                    World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
+                                                }
+                                                catch (Exception e)
+                                                {
+                                                    throw new Exception($"执行错误:{e.Message + e.StackTrace}");
+                                                }                                             
                                             }
-
                                             break;
                                         }
                                     //放货站点安全交互
                                     case AGVTaskStatus.RequestOrPermission2 when agv.Status != AGVTaskStatus.RequestOrPermission2:
                                         {
                                             if (agv.Station.IsNullOrEmpty()) throw new Exception($"无有效放货地址");
+                                            var taskBus = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.ID == agv.TaskId).First();
+                                            var flag = false;
+                                            if (taskBus != null && taskBus.BusType == "人工满托入库")
+                                            {
+                                                flag = true;
+                                            }
                                             var dev = Device.All.First(x => x.Code == agv.Station);
                                             var ph = new Device<IStation523>(Device.All.First(x => x.Code == agv.Station), World);
                                             if (ph.Data.Status.HasFlag(StationStatus.PH_Status))
                                             {
                                                 throw new Exception($"{agv.Station}站台有光电小车无法放货,请检查并处理");
                                             }
+                                            if (flag)
+                                            {
+                                                if (!ph.Data.Status.HasFlag(StationStatus.Low_Station_2))
+                                                {
+                                                    throw new Exception($"{agv.Station}站台不在低位小车无法放货,请检查并处理");
+                                                }
+                                                else if (db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot
+                                                        && v.Station == agv.Station && v.GoodsSum == 1).SplitTable(tabs => tabs.Take(2)).Any())
+                                                {
+                                                    throw new Exception($"{agv.Station}站台有执行中任务{agv.ID}");
+                                                }
+                                                agv.GoodsSum = 1;
+                                            }
+                                            agv.Status = AGVTaskStatus.RequestOrPermission2;
+                                            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.Res1;
                                             //调继续执行任务接口
@@ -323,7 +430,7 @@ namespace WCS.WorkEngineering.Systems
                                             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;
-                                            if (taskold.LastInteractionPoint == "2") //如果是单独取空任务直接完成
+                                            if (taskold.LastInteractionPoint == "2" || taskold.BusType == TaskBusType.重绕满托入库.GetDescription() || taskold.BusType == TaskBusType.帘线退料重绕.GetDescription()) //如果是单独取空任务直接完成
                                             {
                                                 var task = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.ID == agv.TaskId).First();
                                                 if (task != null)

+ 74 - 11
YWGC/FJK/WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -116,10 +116,10 @@ namespace WCS.WorkEngineering.Systems
                                         Station = task.WarehouseCode switch
                                         {
                                             "1N" => "2533",
-                                            "1S" => "2733",                                            
+                                            "1S" => "2733",
                                             _ => "2533"
                                         },
-                                         AddWho = "WCS",
+                                        AddWho = "WCS",
                                         AddTime = DateTime.Now
                                     };
                                     db.Default.InsertableRowLock(agv).SplitTable().ExecuteCommand();
@@ -139,6 +139,31 @@ namespace WCS.WorkEngineering.Systems
                                     db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.Status, x.AgvTaskID, x.Device, x.Height }).ExecuteCommand();
                                     task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化人工满托入库任务");
                                 }
+                                else if (task.BusType == TaskBusType.重绕满托入库.GetDescription())
+                                {
+                                    task.Status = Entity.TaskStatus.WaitingToExecute;
+                                    db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.Status }).ExecuteCommand();
+                                    task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
+                                }
+                                else if (task.BusType == TaskBusType.帘线退料重绕.GetDescription())
+                                {
+                                    var agv = new WCS_AgvTaskInfo()
+                                    {
+                                        ID = db.GetAgvTaskId(),
+                                        TaskType = AGVTaskType.EnterDepot,
+                                        Status = AGVTaskStatus.NewBuild,
+                                        TaskId = task.ID,
+                                        Position = task.WorkBench,
+                                        WorkShop = 222,
+                                        Station = "9001",
+                                        AddWho = "WCS",
+                                        AddTime = DateTime.Now
+                                    };
+                                    db.Default.InsertableRowLock(agv).SplitTable().ExecuteCommand();
+                                    task.Status = Entity.TaskStatus.WaitingToExecute;
+                                    db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.Status }).ExecuteCommand();
+                                    task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
+                                }
                                 else
                                 {
                                     //更新任务状态
@@ -294,7 +319,14 @@ namespace WCS.WorkEngineering.Systems
                                             var agv1 = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.Status <= TaskStatus.StackerExecution && x.AddrTo == srmStation[0]).Count();
                                             var agv2 = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.Status <= TaskStatus.StackerExecution && x.AddrTo == srmStation[1]).Count();
                                             task.SrmStation = "";
-                                            task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0];
+                                            if (srmStation[0] == "2534" || srmStation[0] == "2934")
+                                            {
+                                                task.AddrTo = srmStation[0];
+                                            }
+                                            else
+                                            {
+                                                task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0];
+                                            }
                                         }
                                         if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台
                                         {
@@ -313,6 +345,29 @@ namespace WCS.WorkEngineering.Systems
                                         task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
                                         isEnd = true;
                                     }
+                                    else if (task.Device == "CR")
+                                    {
+                                        task.AddrTo = task.WorkBench;
+                                        task.WarehouseCode = "CRZP";
+
+                                        var agv = new WCS_AgvTaskInfo()
+                                        {
+                                            ID = db.GetAgvTaskId(),
+                                            TaskType = AGVTaskType.EnterDepot,
+                                            Status = AGVTaskStatus.NewBuild,
+                                            TaskId = task.ID,
+                                            Position = task.WorkBench,
+                                            Station = task.AddrFrom,
+                                            AddWho = "WCS",
+                                            AddTime = DateTime.Now
+                                        };
+                                        db.Default.InsertableRowLock(agv).SplitTable().ExecuteCommand();
+
+                                        //更新任务状态
+                                        task.Status = Entity.TaskStatus.WaitingToExecute;
+                                        db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.SrmStation, x.AddrTo, x.Status }).ExecuteCommand();
+                                        task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
+                                    }
                                     else //立库出库任务
                                     {
                                         if (task.SrmStation == "1")
@@ -357,7 +412,14 @@ namespace WCS.WorkEngineering.Systems
                                             var agv1 = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.Status <= TaskStatus.StackerExecution && x.AddrTo == srmStation[0]).Count();
                                             var agv2 = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.Status <= TaskStatus.StackerExecution && x.AddrTo == srmStation[1]).Count();
                                             task.SrmStation = "";
-                                            task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0];
+                                            if (srmStation[0] == "2534" || srmStation[0] == "2934")
+                                            {
+                                                task.AddrTo = srmStation[0];
+                                            }
+                                            else
+                                            {
+                                                task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0];
+                                            }
                                         }
                                         if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台
                                         {
@@ -446,25 +508,25 @@ namespace WCS.WorkEngineering.Systems
             //同侧之间均分
             if (warehouseCode.Contains("1"))
             {
-                n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("25"))
+                n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("25"))
                            .SplitTable(v => v.Take(2)).Count();
-                s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("27"))
+                s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("27"))
                            .SplitTable(v => v.Take(2)).Count();
                 sta = n > s ? "2701" : "2501";
             }
             else if (warehouseCode.Contains("2"))
             {
-                n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("29"))
+                n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("29"))
                            .SplitTable(v => v.Take(2)).Count();
-                s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("31"))
+                s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("31"))
                            .SplitTable(v => v.Take(2)).Count();
                 sta = n > s ? "3101" : "2901";
             }
             else if (warehouseCode.Contains("3"))
             {
-                n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("33"))
+                n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("33"))
                            .SplitTable(v => v.Take(2)).Count();
-                s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("35"))
+                s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot && v.Station.StartsWith("35"))
                                .SplitTable(v => v.Take(2)).Count();
                 sta = n > s ? "3501" : "3301";
             }
@@ -480,7 +542,8 @@ namespace WCS.WorkEngineering.Systems
                 .SplitTable(v => v.Take(2)).Count();
             if (n > 5)
             {
-                sta = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot)
+                sta = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.Complete1 && v.TaskType == AGVTaskType.EnterDepot
+                && (v.Station != "2533" && v.Station != "2933"))
                     .SplitTable(v => v.Take(2)).ToList().GroupBy(x => x.Station).Select(x => new { x.Key, Count = x.Count() }).MinBy(x => x.Count).Key;
             }
 

+ 1 - 30
YWGC/FJK/WCS.WorkEngineering/Systems/UpLoadSystems.cs

@@ -93,36 +93,7 @@ namespace WCS.WorkEngineering.Systems
                     db.UpdateableRowLock(task).SplitTable(x => x.Take(2)).ExecuteCommand();
                     task.AddWCS_TASK_DTL(db, "", $"同步入库完成状态同步至WMS");
                 }
-            });
-
-            ////立库二楼出库更新完成
-            //SqlSugarHelper.Do(_db =>
-            //{
-            //    var taskIdList = new List<int>();
-            //    var nowTime = DateTime.Now;
-            //    var db = _db.Default;
-            //    var taskList = db.Queryable<WCS_TaskOld>().SplitTable(x => x.Take(2))
-            //        .Where(x => ((x.Type == TaskType.SetPlate && x.WarehouseCode.Contains("R")) || (x.Type == TaskType.EnterDepot && !x.WarehouseCode.Contains("R")))
-            //                    && x.Status == TaskStatus.Finish
-            //                    && x.Uploaded != TaskStatus.Finish).ToList();
-
-            //    foreach (var task in taskList)
-            //    {
-            //        var res = WmsApi.CompleteTask(task.Id);
-            //        if (res.ResCode == ResponseStatusCodeEnum.Sucess) taskIdList.Add(task.Id);
-            //        else World.Log($"入库完成状态同步失败:{task.Id}[{res.ResMsg}]");
-            //    }
-
-            //    //拆分防止锁表
-            //    foreach (var taskId in taskIdList)
-            //    {
-            //        var task = db.Queryable<WCS_TaskOld>().SplitTable(x => x.Take(2)).First(x => x.Id == taskId);
-            //        task.Uploaded = TaskStatus.Finish;
-            //        task.EditTime = nowTime;
-            //        db.Updateable(task).SplitTable(x => x.Take(2)).ExecuteCommand();
-            //        task.AddWCS_TASK_DTL(db, "", $"同步入库完成状态同步至WMS");
-            //    }
-            //});
+            });           
         }
 
         public override bool Select(Device dev)

+ 112 - 0
YWGC/FJK/WCS.WorkEngineering/Systems/重绕区/扫码位分配.cs

@@ -0,0 +1,112 @@
+using ServiceCenter.Extensions;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using ServiceCenter.Logs;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WCS.Core;
+using WCS.Entity.Protocol.Station;
+using WCS.WorkEngineering.Worlds;
+using WCS.WorkEngineering.Extensions;
+using ServiceCenter.SqlSugars;
+using WCS.Entity;
+using TaskStatus = WCS.Entity.TaskStatus;
+
+namespace WCS.WorkEngineering.Systems.重绕区
+{
+    /// <summary>
+    ///  扫码位分配
+    /// </summary>
+    [BelongTo(typeof(RewindWorld))]
+    [Description("扫码位分配")]
+    public class 扫码位分配 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
+    {
+        protected override bool ParallelDo => true;
+
+        public override void Do(Device<IStation520, IStation521, IStation523> obj)
+        {
+            if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
+            {
+                World.Log($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}");
+                return;
+            }
+
+            if (obj.Data3.Status.HasFlag(StationStatus.Run))
+            {
+                World.Log("设备运行中");
+                return;
+            }
+            ;
+            if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status))
+            {
+                World.Log("站台货物信息与实际占用不一致");
+                return;
+            }
+
+            if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status))
+            {
+                World.Log("无光电");
+                return;
+            }
+            ;
+            if (obj.Data2.Request != 1)
+            {
+                World.Log("无请求");
+                return;
+            }
+
+            List<string> stations = new List<string> {"9119","9120","9121","9122","9123","9124","9125","9130", "9131", "9132", "9133", "9134", "9135", "9136", "9141", 
+                "9142", "9143", "9144", "9145", "9146", "9147"};
+            List<string> targetStations = new List<string> { "9125", "9136", "9147" };
+
+            var devs = Device.All.Where(x => stations.Contains(x.Code)).Select(x =>
+                                                    new Device<IStation520, IStation521, IStation523>(x, World));
+            devs = devs.Where(x =>targetStations.Contains(x.Data.GoodsEnd.ToString())).ToList();
+            short next = 9147;
+            var num_9125 = devs.Count(x => x.Data.GoodsEnd.ToString() == "9125");
+            var num_9136 = devs.Count(x => x.Data.GoodsEnd.ToString() == "9136");
+            var num_9147 = devs.Count(x => x.Data.GoodsEnd.ToString() == "9147");
+            if (devs.Count() == 0)
+            {
+                next = 9147;
+            }
+            else
+            {
+                next = ComputeAddto(num_9125, num_9136, num_9147);
+            }
+
+
+            obj.Data.TaskNumber = obj.Entity.Code.ToShort();
+            obj.Data.TaskNumber = obj.Entity.Code.ToShort();
+            obj.Data.GoodsStart = obj.Entity.Code.ToShort();
+            obj.Data.GoodsStart = obj.Entity.Code.ToShort();
+            obj.Data.GoodsEnd = next;          
+            obj.Data.GoodsEnd = next;
+            obj.Data.SetVoucherNo();
+        }
+
+        public short ComputeAddto(int num_9125, int num_9136, int num_9147)
+        {
+
+            if (num_9125 < num_9136 && num_9125 < num_9147)
+            {
+                return num_9125.ToShort();
+            }
+            else if (num_9136 < num_9125 && num_9136 < num_9147)
+            {
+                return num_9136.ToShort();
+            }
+            else
+            {
+                return num_9147.ToShort();
+            }
+        }
+
+        public override bool Select(Device dev)
+        {
+            return dev.Code is "9115" or "9021";
+        }
+    }
+}

+ 119 - 0
YWGC/FJK/WCS.WorkEngineering/Systems/重绕区/扫码入库.cs

@@ -0,0 +1,119 @@
+using PlcSiemens.Core.Extension;
+using ServiceCenter.Extensions;
+using ServiceCenter.Logs;
+using ServiceCenter.SqlSugars;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WCS.Core;
+using WCS.Entity;
+using WCS.Entity.Protocol.BCR;
+using WCS.Entity.Protocol.Station;
+using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.WebApi.Controllers;
+using WCS.WorkEngineering.WebApi.Models.WMS.Request;
+using WCS.WorkEngineering.Worlds;
+using TaskStatus = WCS.Entity.TaskStatus;
+
+namespace WCS.WorkEngineering.Systems.重绕区
+{
+    /// <summary>
+    ///  扫码入库
+    /// </summary>
+    [BelongTo(typeof(RewindWorld))]
+    [Description("扫码入库")]
+    public class 扫码入库 : DeviceSystem<Device<IStation520, IStation521, IStation523, IBCR81>>
+    {
+        protected override bool ParallelDo => true;
+
+        public override void Do(Device<IStation520, IStation521, IStation523, IBCR81> obj)
+        {
+            if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
+            {
+                World.Log($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}");
+                return;
+            }
+            if (obj.Data3.Status.HasFlag(StationStatus.Run))
+            {
+                World.Log("设备运行中");
+                return;
+            }
+            if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status))
+            {
+                World.Log("站台货物信息与实际占用不一致");
+                return;
+            }
+            if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status))
+            {
+            }
+            if (obj.Data2.Request != 1)
+            {
+                World.Log("无请求");
+                return;
+            }
+            SqlSugarHelper.Do(db =>
+            {
+                var task = db.Default.Queryable<WCS_TaskInfo>().First(v => obj.Data2.TaskNumber == v.ID);
+                if (task == null)
+                {
+                    World.Log($"未找到任务[{obj.Data2.TaskNumber}],请人工接入处理!!!!");
+                    return;
+                }
+                try
+                {
+                    //获取托盘条码
+                    var barcode = obj.Data4.GetBCRCode();
+                    if (barcode.IsNullOrWhiteSpace())
+                    {
+                        World.Log("扫码失败,内容为空", LogLevelEnum.Mid);
+                        return;
+                    }
+                    else if (!barcode.Contains("TPB"))
+                    {
+                        World.Log($"扫码异常{barcode},请检查扫码器", LogLevelEnum.Mid);
+                        return;
+                    }
+                    SqlSugarHelper.Do(_db =>
+                    {
+                        var db = _db.Default;
+                        //找到对应的任务
+                        var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.BarCode == barcode && v.Type == TaskType.EnterDepot && v.Status < Entity.TaskStatus.Finish);
+                        if (taskInfo.Status != Entity.TaskStatus.WaitingToExecute) return;
+                        {
+                            taskInfo.Status = Entity.TaskStatus.ConveyorExecution;
+                            taskInfo.EditTime = DateTime.Now;                          
+                            db.UpdateableRowLock(taskInfo).UpdateColumns(x => new { x.Status, x.EditTime }).ExecuteCommand();
+                            taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, $"任务{taskInfo.ID}扫码成功,条码{taskInfo.BarCode}");
+                            task = taskInfo;
+                        }
+                    });
+                }
+                catch (Exception ex)
+                {
+                    throw new KnownException(ex.Message, LogLevelEnum.High);
+                }
+                if (task == null) return;
+
+                obj.Data.TaskNumber = task.ID;
+                obj.Data.GoodsStart = obj.Entity.Code.ToShort();
+                obj.Data.GoodsEnd = obj.Entity.Code switch
+                {
+                    "9125" => 9126.ToShort(),
+                    "9136" => 9137.ToShort(),
+                    "9147" => 9148.ToShort(),
+                    _ => 9999
+                };
+                obj.Data.VoucherNo++;
+
+            });
+        }
+
+        public override bool Select(Device dev)
+        {
+            return dev.Code is "9125" or "9136" or "9147";
+        }
+    }
+}

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

@@ -0,0 +1,133 @@
+using Microsoft.OpenApi.Extensions;
+using ServiceCenter.Extensions;
+using ServiceCenter.Logs;
+using ServiceCenter.SqlSugars;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WCS.Core;
+using WCS.Entity;
+using WCS.Entity.Protocol.Station;
+using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.WebApi.Controllers;
+using WCS.WorkEngineering.Worlds;
+using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
+using TaskStatus = WCS.Entity.TaskStatus;
+
+namespace WCS.WorkEngineering.Systems.重绕区
+{
+    /// <summary>
+    ///  组盘缓存生成AGV任务
+    /// </summary>
+    [BelongTo(typeof(RewindWorld))]
+    [Description("组盘缓存生成AGV任务")]
+    public class 组盘缓存生成AGV任务 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
+    {
+        protected override bool ParallelDo => true;
+
+        public override void Do(Device<IStation520, IStation521, IStation523> obj)
+        {
+            if (!obj.Data3.Status.HasFlag(StationStatus.Auto))
+            {
+                World.Log($"设备处于{obj.Data3.Status.GetDisplayName()}状态");
+                return;
+            }
+
+            if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status))
+            {
+                World.Log($"设备无光电");
+                return;
+            }
+
+            if (obj.Data3.Status.HasFlag(StationStatus.PH_Status) && !obj.Data3.Status.HasFlag(StationStatus.Low_Station_2))
+            {
+                World.Log($"设备有光电,但不在低位", LogLevelEnum.High);
+                return;
+            }
+
+            if (!obj.Data3.Status.HasFlag(StationStatus.Low_Station_2))
+            {
+                World.Log($"设备不在低位", LogLevelEnum.High);
+                return;
+            }
+
+            SqlSugarHelper.Do(_db =>
+            {
+                var db = _db.Default;
+                var task = db.Queryable<WCS_TaskInfo>().ReadPastUpdLock().Single(x => x.Uploaded == TaskStatus.ConveyorExecution && x.Status == TaskStatus.ConveyorExecution && x.ID == obj.Data.TaskNumber);
+                if (task == null)
+                {
+                    World.Log($"未找到对应任务[{obj.Data.TaskNumber}],请检查该任务状态与更新状态是否均为输送机执行中", LogLevelEnum.High);
+                    return;
+                }
+                var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only) + task.ID;
+
+                //开始创建AGV任务
+                var agvTask = db.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.EnterDepot);
+                if (agvTask == null)
+                {                    
+                    db.InsertableRowLock(new WCS_AgvTaskInfo()
+                    {
+                        ID = _db.GetAgvTaskId(),
+                        TaskType = AGVTaskType.EnterDepot,
+                        Status = AGVTaskStatus.NewBuild,
+                        TaskId = task.ID,
+                        Position = obj.Entity.Code,
+                        Station = task.SrmStation,
+                        WorkShop = 111,
+                        AddWho = "WCS",
+                        AddTime = DateTime.Now,
+                        AgvID = agvId
+                    }).SplitTable().ExecuteCommand();
+                    World.Log($"{task.ID}未找到对应的AGV任务");
+                    return;
+                }
+
+                if (agvTask.Status != AGVTaskStatus.NewBuild)
+                {
+                    World.Log($"AGV任务{agvTask.ID}状态不是新建", LogLevelEnum.High);
+                    return;
+                }
+                //分配缓存货位 暂时先根据光电判断
+                List<string> cacheWells = new List<string> { "9201", "9202", "9203", "9204", "9205", "9206", "9207", "9208", "9209" };
+                var devs = Device.All.Where(x => cacheWells.Contains(x.Code)).Select(x =>
+                                                    new Device<IStation520, IStation521, IStation523>(x, World));
+                if (!devs.Any()) return;
+                string sta = "";
+                foreach ( var dev in devs ) 
+                {
+                    if (dev.Data3.Status.HasFlag(StationStatus.PH_Status) && !db.Queryable<WCS_AgvTaskInfo>().UpdLock().SplitTable(x => x.Take(2)).Any(x => x.Station == dev.Entity.Code && x.TaskType == AGVTaskType.EnterDepot 
+                    && x.Status < AGVTaskStatus.MissionCompleted))
+                    { 
+                        sta = dev.Entity.Code;
+                        break;
+                    }
+                }
+                agvId = agvTask.AgvID;
+   
+                agvTask.Status = AGVTaskStatus.Confirm;
+                agvTask.AgvStatus = AGVTaskStatus.Confirm;
+                agvTask.Station = sta;
+                db.UpdateableRowLock(agvTask).UpdateColumns(x => new { x.AgvID, x.Status, x.AgvStatus, x.Station}).SplitTable(x => x.Take(2)).ExecuteCommand();
+                task.Status = TaskStatus.AGVExecution;
+                task.AgvTaskID = agvTask.ID;
+                task.EditTime = DateTime.Now;
+                task.EditWho = "WCS";
+                db.Updateable(task).UpdateColumns(x => new { x.Status, x.AgvTaskID, x.EditTime, x.EditWho }).ExecuteCommand();
+                task.AddWCS_TASK_DTL(db, obj.Entity.Code, "AGV", $"任务下发至AGV{agvId}");
+                var res = AgvApi.组盘入库(obj.Entity.Code, agvTask.Station, agvId);
+            });
+        }
+
+       
+
+        public override bool Select(Device dev)
+        {
+            return dev.Code is "9126" or "9137" or "9148";
+        }
+    }
+}
+

+ 49 - 0
YWGC/FJK/WCS.WorkEngineering/WebApi/Controllers/AgvApi.cs

@@ -82,6 +82,28 @@ namespace WCS.WorkEngineering.WebApi.Controllers
             }, "1", taskCode, "ZTGT35", "1");
         }
 
+        /// <summary>
+        ///   组盘入库
+        /// </summary>
+        /// <param name="SPosition">起始点</param>
+        /// <param name="EPosition">目标点</param>
+        /// <param name="taskCode">WMS任务号</param>
+        /// <returns></returns>
+        public static GenAgvSchedulingTaskResponse 组盘入库(string SPosition, string EPosition, string taskCode)
+        {
+            return GenAgvSchedulingTask("iwms_third", "", "4", new List<positionCodeClass>()
+            {
+                new positionCodeClass(){ //取货位置
+                    positionCode=SPosition,
+                    type="00"
+                },
+                new positionCodeClass(){ //放货位置
+                    positionCode=EPosition,
+                    type="00"
+                }
+            }, "1", taskCode, "ZTGT67", "1");
+        }
+
         /// <summary>
         ///   托盘回库
         /// </summary>
@@ -142,6 +164,33 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                 }
             }, "1", taskCode, "ZTGT31", "1");
         }
+
+        /// <summary>
+        ///   退料重绕
+        /// </summary>
+        /// <param name="position">取货机台</param>
+        /// <param name="taskCode">WMS任务号</param>
+        /// <param name="station">站台</param>
+        /// <returns></returns>
+        public static GenAgvSchedulingTaskResponse 退料重绕(string position, string taskCode, string station)
+        {           
+
+            return GenAgvSchedulingTask("iwms_third", "", "4", new List<positionCodeClass>()
+            {
+                new positionCodeClass(){ //取货机台
+                    positionCode=position,
+                    type="00"
+                },
+                new positionCodeClass(){ //巷道分配点
+                    positionCode=station,
+                    type="00"
+                },
+                new positionCodeClass(){ //预分配放货点
+                    positionCode="9999",
+                    type="00"
+                }
+            }, "1", taskCode, "ZTGT70", "1");
+        }
         /// <summary>
         /// 满托入库
         /// </summary>

+ 13 - 1
YWGC/FJK/WCS.WorkEngineering/WebApi/Models/WMS/Request/FJBuildEmptyPalletsStockRequest.cs

@@ -156,6 +156,18 @@ namespace WCS.WorkEngineering.WebApi.Models.WMS.Request
         ///  皮盘入库
         /// </summary>
         [Description("皮盘入库")]
-        皮盘入库 = 16
+        皮盘入库 = 16,
+
+        /// <summary>
+        ///  重绕满托入库
+        /// </summary>
+        [Description("重绕满托入库")]
+        重绕满托入库 = 17,
+
+        /// <summary>
+        ///  帘线退料重绕
+        /// </summary>
+        [Description("帘线退料重绕")]
+        帘线退料重绕 = 18
     }
 }

+ 66 - 3
YWGC/FJK/WCS.WorkEngineering/WorkStart.cs

@@ -67,7 +67,7 @@ namespace WCS.WorkEngineering
                     new("10.30.37.166",new List<Tuple<int, int>>() //北侧满轮主线
                     {
                         new(1, 100),
-                        new(9001, 9010),//暂用,无意义
+                        //new(9001, 9010),//暂用,无意义
                         new(401, 599),
                         new(801,999),
                         new(1201,1399),
@@ -370,6 +370,8 @@ namespace WCS.WorkEngineering
 
                 #endregion 外检信息
 
+
+               
                 #endregion 初始化输送机相关信息
 
                 #region 初始化桁架相关信息
@@ -1013,7 +1015,7 @@ namespace WCS.WorkEngineering
 
                 #region 巷道--一楼堆垛机放货口
 
-                new RouteInfo("TY3", new string[] { "2932","2934","2933" }), //人工取货口
+                new RouteInfo("TY3", new string[] { "2932","2934",/*"2933"*/ }), //人工取货口
                 new RouteInfo("TY4", new string[] { "3132","3134","3133" }),
 
                 #endregion 巷道--一楼堆垛机放货口
@@ -1822,6 +1824,67 @@ namespace WCS.WorkEngineering
                 #endregion 添加设备组
             }
 
+            if (WareHouses.Contains("CR"))
+            {
+                #region 基本信息
+
+                #region 重绕区输送线
+
+                var tuples_cr = new List<Tuple<string, List<Tuple<int, int>>>>
+                {
+                    new("10.30.21.171",new List<Tuple<int, int>>()
+                    {
+                        new(9001, 9228)
+                    }),
+                };
+
+                foreach (var item in tuples_cr)
+                {
+                    var db520 = 0;
+                    var db521 = 0;
+                    var db523 = 0;
+                    foreach (var item1 in item.Item2)
+                    {
+                        for (var i = item1.Item1; i <= item1.Item2; i++)
+                        {
+                            var conv = new Device(i.ToString());
+                            conv.AddFlag(DeviceFlags.输送机);
+
+                            conv.AddProtocol<IStation520>(db520, 520, item.Item1);
+                            conv.AddProtocol<IStation521>(db521, 521, item.Item1);
+                            conv.AddProtocol<IStation523>(db523, 523, item.Item1);
+
+                            db520 += 14;
+                            db521 += 16;
+                            db523 += 12;
+                        }
+                    }
+                }
+
+                #endregion 重绕区输送线
+
+                #endregion 基本信息
+
+                #region 重绕区扫码器
+
+                var bcrInfo_cr = new List<BcrInfo>
+            {
+                new(new [] { "9125", "9136" ,"9147"}, "10.30.21.171"),
+            };
+
+                foreach (var item in bcrInfo_cr)
+                {
+                    for (var i = 0; i < item.DeviceNo.Length; i++)
+                    {
+                        var device = Device.All.FirstOrDefault(v => v.Code == item.DeviceNo[i]);
+                        device.AddFlag(DeviceFlags.扫码);
+                        var pos = i * 130;
+                        device.AddProtocol<IBCR81>(pos, 81, item.Ip);
+                    }
+                }
+                #endregion 重绕区扫码器
+            }
+
             #region 标签配置
 
             Dictionary<DeviceFlags, List<string>> devices = new Dictionary<DeviceFlags, List<string>>();
@@ -1841,7 +1904,7 @@ namespace WCS.WorkEngineering
                      { DeviceFlags.拆盘机, new List<string>(){ "1602", "1612" } },
                      { DeviceFlags.桁架码垛位, new List<string>(){ "1670","1671","1672","1673","1674","1675","1664","1662","1663","1665","1677","1678","1679","1680","1685","1686","1687","1688","1689","1690","1606","1616"} },
                      { DeviceFlags.环形库码垛工位, new List<string>(){ "1666", "1661", "1676", "1681" } },
-                     { DeviceFlags.AGV取货站台口, new List<string>(){ "2533", "2534", "2734", "2733"} },
+                     { DeviceFlags.AGV取货站台口, new List<string>(){ "2533", "2534", "2734", "2733"} },                   
                      { DeviceFlags.Robot, new List<string>(){ "Robot1", "Robot2" } },
                      {DeviceFlags.二次码垛RGV取货口, new List<string>(){ "1606", "1616"}}
                  };

+ 18 - 0
YWGC/FJK/WCS.WorkEngineering/Worlds/RewindWorld.cs

@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.WorkEngineering.Worlds
+{
+    /// <summary>
+    ///  重绕区
+    /// </summary>
+    [Description("重绕区")]
+    public class RewindWorld : MainWorld
+    {
+        public RewindWorld() { }
+    }
+}