From 7195cf4e463af9a9f5138ced6be433f62d8ee68a Mon Sep 17 00:00:00 2001
From: xiazhengtongxue <133085197+xiazhengtongxue@users.noreply.github.com>
Date: 星期四, 25 十二月 2025 17:09:28 +0800
Subject: [PATCH] 播种墙一期优化

---
 项目代码/WCSServices/WIDESEAWCS_Tasks/AGV/AGVExtend.cs |  273 +++++++++++++++++++++++------------------------------
 1 files changed, 119 insertions(+), 154 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Tasks/AGV/AGVExtend.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Tasks/AGV/AGVExtend.cs"
index a7df9df..4babe88 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Tasks/AGV/AGVExtend.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCSServices/WIDESEAWCS_Tasks/AGV/AGVExtend.cs"
@@ -6,6 +6,7 @@
 using System.Text;
 using System.Threading.Tasks;
 using WIDESEA_DTO.Agv;
+using WIDESEAWCS_Common;
 using WIDESEAWCS_Common.APIEnum;
 using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_Core;
@@ -22,191 +23,155 @@
         {
             try
             {
-                var newTasks = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt()|| x.TaskState == TaskStatusEnum.New.ObjToInt()) && x.DeviceCode=="AGV").ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList();
-
-                if (newTasks.Count>0)
+                var newTasksOut = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt()) && x.TaskType==TaskTypeEnum.Outbound.ObjToInt() && x.DeviceCode == "AGV").ToList().OrderBy(x => x.Grade).ThenBy(x => x.TaskNum).ToList();
+                var newTasksIn = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt()) && x.TaskType == TaskTypeEnum.Inbound.ObjToInt() && x.DeviceCode == "AGV").ToList().OrderBy(x => x.Grade).ThenBy(x => x.TaskNum).ToList();
+                var taskDownOut = _taskService.Db.Queryable<Dt_Task>().Where(x => (x.TaskState > TaskStatusEnum.AGV_Execute.ObjToInt()) && x.TaskType == TaskTypeEnum.Outbound.ObjToInt() && x.DeviceCode == "AGV").OrderBy(x => x.TaskNum).ToList();
+                #region 鍑哄簱浠诲姟涓嬪彂
+                if (newTasksOut.Count>0)
                 {
-                    foreach (var task in newTasks)
+                    foreach (var GroupTask in newTasksOut.GroupBy(x=>x.NextAddress))
                     {
-                        try
+                        int taskCount = 6;
+                        if (GroupTask.ObjToInt() > 201)
                         {
-                            Guid guid = Guid.NewGuid(); 
-                            AgvTaskSendDTO agvTaskSend = new AgvTaskSendDTO()
+                            taskCount = 4;
+                        }
+                        var tasks = GroupTask.Take(taskCount).ToList();
+                        TimeSpan span = DateTime.Now - tasks.FirstOrDefault().CreateDate;
+                        int taskDownCount = taskDownOut.Where(x => x.NextAddress == GroupTask.Key).Count();
+                        if (taskDownCount < (GroupTask.ObjToInt() > 201 ? 4 : 6) && (tasks.Count >= 4 || (int)span.TotalSeconds >= 20))
+                        {
+                            try
                             {
-                                SysToken=guid.ToString().Replace("-",""),
-                                ReceiveTaskID=task.TaskNum.ToString(),
-                                MapCode="01",
-                                Variables=new List<PointDetail>()
-                            };
-                            if (task.NextAddress== "涓�妤兼湀鍙扮爜澶�")
-                            {
-                                string? address =_taskService.RequestTargetAddress(task.TaskNum);
-                                if (address.IsNullOrEmpty())
+                                AgvTaskSendDTO agvTaskSend = new AgvTaskSendDTO()
                                 {
-                                    task.ExceptionMessage = "鏈壘鍒癆GV绔欑偣";
-                                    continue;
-                                }
-                                task.NextAddress = address;
-                            }
-                            Dt_StationManger stationMangerStart = _stationMangerRepository.QueryFirst(x=>x.StationCode==task.CurrentAddress);
-                            Dt_StationManger stationMangerEnd = _stationMangerRepository.QueryFirst(x => x.StationCode == task.NextAddress);
-                            //娣诲姞浠诲姟璺緞鍙婇珮搴�
-                            if (stationMangerStart !=null && stationMangerEnd != null)
-                            {
-                                PointDetail pointDetail1 = new PointDetail()
-                                {
-                                    Code= "GoodPoint",
-                                    Value=stationMangerStart.AGVStationCode
+                                    MissionData = new List<MissionDataItem>()
                                 };
-                                //鍒ゆ柇鏄惁鏈夊墠缃偣
-                                if (!string.IsNullOrEmpty(stationMangerStart.AGVFrontCode))
+                                string taskGroupId = Guid.NewGuid().ToString().Replace("-", "");
+                                
+                                foreach (var task in tasks)
                                 {
-                                    PointDetail pointDetail2 = new PointDetail()
+                                    //鑾峰彇鐩爣鐐硅揣浣�
+                                    Dt_LocationInfo locationInfoStart = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.CurrentAddress);
+                                    //鑾峰彇鎷i�夊嚭搴撶珯鍙�
+                                    Dt_StationManger stationMangerEnd = _stationMangerRepository.QueryFirst(x => x.PickStationCode == task.NextAddress);
+
+                                    if (locationInfoStart == null || stationMangerEnd == null) throw new Exception($"鏈壘鍒颁换鍔″彿${task.TaskNum}璧峰鐐箋task.CurrentAddress}鎴栫洰鏍囩偣{task.NextAddress}浣嶇疆淇℃伅");
+                                    agvTaskSend.RequestId = taskGroupId;
+                                    agvTaskSend.MissionCode = taskGroupId;
+                                    agvTaskSend.ViewBoardType = "W01";
+                                    //鏂欑瀛愭惉杩愪换鍔�
+                                    MissionDataItem missionDataItem = new MissionDataItem()
                                     {
-                                        Code = "CostPoint",
-                                        Value = stationMangerStart.AGVFrontCode
+                                        Sequence = task.TaskNum,
+                                        BinCode = task.PalletCode,
+                                        StartPosition = locationInfoStart.AgvPoint,
+                                        StartSlotCode = locationInfoStart.LocationCode,
+                                        EndPosition = stationMangerEnd.StationCode,
+                                        EndSlotCode = stationMangerEnd.CraneStationCode,
+                                        TakeActionConfirm = false,
+                                        TakeActionInform = false,
+                                        PutActionConfirm = true,
+                                        PutActionInform = true,
                                     };
-                                    agvTaskSend.Variables.Add(pointDetail2);
+                                    agvTaskSend.MissionData.Add(missionDataItem);
                                 }
-                                PointDetail pointDetail3 = new PointDetail()
+                                if (tasks.OrderByDescending(x => x.Grade).FirstOrDefault()?.Grade == 0)
                                 {
-                                    Code = "PointB",
-                                    Value = stationMangerEnd.AGVStationCode
-                                };
-                                //鍒ゆ柇鏄惁鏈夊墠缃偣
-                                if (!string.IsNullOrEmpty(stationMangerEnd.AGVFrontCode))
-                                {
-                                    PointDetail pointDetail4 = new PointDetail()
-                                    {
-                                        Code = "PointA",
-                                        Value = stationMangerEnd.AGVFrontCode
-                                    };
-                                    agvTaskSend.Variables.Add(pointDetail4);
-                                }
-                                PointDetail pointDetail5 = new PointDetail()
-                                {
-                                    Code = "QUQTH",
-                                    Value = stationMangerStart.AGVStationHeight.ToString()
-                                };
-                                PointDetail pointDetail6 = new PointDetail()
-                                {
-                                    Code = "FHMH",
-                                    Value = stationMangerEnd.AGVStationHeight.ToString()
-                                };
-                                agvTaskSend.Variables.Add(pointDetail1);
-                                agvTaskSend.Variables.Add(pointDetail3);
-                                agvTaskSend.Variables.Add(pointDetail5);
-                                agvTaskSend.Variables.Add(pointDetail6);
-                            }
-                            else
-                            {
-                                throw new Exception("鏈壘鍒癆GV绔欑偣");
-                            }
-                            //鍙栨斁浠诲姟妯$増
-                            if (stationMangerStart.StationCode.Contains("PNT") && !stationMangerEnd.StationCode.Contains("PNT") && stationMangerEnd.IsManual==0)//璇锋眰鏀�
-                            {
-                                agvTaskSend.TaskCode = "DUIGAO1";
-                                if (stationMangerStart.StationType == 998 || stationMangerEnd.StationType == 998)//娼滀紡椤跺崌杞�
-                                {
-                                    agvTaskSend.TaskCode = "DUOLUN1";
-                                }
-                            }
-                            else if (!stationMangerStart.StationCode.Contains("PNT") && stationMangerEnd.StationCode.Contains("PNT") && stationMangerStart.IsManual == 0)//璇锋眰鍙�
-                            {
-                                agvTaskSend.TaskCode = "DUIGAO2";
-                                if (stationMangerStart.StationType==998 || stationMangerEnd.StationType == 998)//娼滀紡椤跺崌杞�
-                                {
-                                    agvTaskSend.TaskCode = "DUOLUN2";
-                                }
-                            }
-                            else if (!stationMangerStart.StationCode.Contains("PNT") && !stationMangerEnd.StationCode.Contains("PNT") && stationMangerStart.IsManual == 0 && stationMangerStart.IsManual == 0)//璇锋眰鍙栨斁
-                            {
-                                agvTaskSend.TaskCode = "DUIGAO3";
-                                if (stationMangerStart.StationType == 998 || stationMangerEnd.StationType == 998)//娼滀紡椤跺崌杞�
-                                {
-                                    agvTaskSend.TaskCode = "DUOLUN3";
-                                }
-                            }
-                            else//鏃犺姹�
-                            {
-                                agvTaskSend.TaskCode = "DUIGAO4";
-                                if (stationMangerStart.StationType == 998 || stationMangerEnd.StationType == 998)//娼滀紡椤跺崌杞�
-                                {
-                                    agvTaskSend.TaskCode = "DUOLUN4";
-                                }
-                            }
-                            if (stationMangerStart.StationType == 998 || stationMangerEnd.StationType == 998)//娼滀紡椤跺崌杞�
-                            {
-                                agvTaskSend.Variables.FirstOrDefault(x => x.Code == "FHMH").Value = "0";
-                                agvTaskSend.Variables.FirstOrDefault(x => x.Code == "GoodPoint").Value = "";
-                                //鍒ゆ柇浜哄伐鎵嬪姩
-                                PointDetail complete = new();
-                                if (stationMangerStart.IsManual==1 && stationMangerEnd.IsManual==0)
-                                {
-                                    complete = new()
-                                    {
-                                        Code = "Complete",
-                                        Value = "1"
-                                    };
-                                }
-                                else if (stationMangerStart.IsManual == 0 && stationMangerEnd.IsManual == 1)
-                                {
-                                    complete = new()
-                                    {
-                                        Code = "Complete",
-                                        Value = "2"
-                                    };
-                                }
-                                else if (stationMangerStart.IsManual == 1 && stationMangerEnd.IsManual == 1)
-                                {
-                                    complete = new()
-                                    {
-                                        Code = "Complete",
-                                        Value = "3"
-                                    };
+                                    agvTaskSend.Priority = 99;
                                 }
                                 else
                                 {
-                                    complete = new()
-                                    {
-                                        Code = "Complete",
-                                        Value = "0"
-                                    };
+                                    agvTaskSend.Priority = 99 - tasks.OrderByDescending(x => x.Grade).FirstOrDefault().Grade;
                                 }
-                                //涓嬪彂浠诲姟AGV浠诲姟闆嗙兢
-                                agvTaskSend.AgvGroupCode = "QianF";
-                                PointDetail pointDetail2 = new PointDetail()
+                                tasks.ForEach(x =>
                                 {
-                                    Code = "CostPoint",
-                                    Value = stationMangerStart.AGVStationCode
-                                };
-                                agvTaskSend.Variables.Add(pointDetail2);
-                                agvTaskSend.Variables.Add(complete);
+                                    x.GroupId = taskGroupId;
+                                });
+                                //鍙戦�丄GV浠诲姟
+                                WebResponseContent content = _taskService.AgvSendTask(agvTaskSend, APIEnum.AgvSendTask);
+                                if (!content.Status)
+                                    throw new Exception(content.Message);
+                                tasks.ForEach(x =>
+                                {
+                                    x.Dispatchertime = DateTime.Now;
+                                    x.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
+                                });
+                                _taskService.UpdateData(tasks);
+                                Thread.Sleep(500);
                             }
-                            if (task.TaskType==TaskTypeEnum.OutCarton.ObjToInt())
+                            catch (Exception ex)
                             {
-                                agvTaskSend.AgvGroupCode = "GAOc";
+                                tasks.ForEach(x =>
+                                {
+                                    x.TaskState = TaskStatusEnum.Exception.ObjToInt();
+                                    x.ExceptionMessage = ex.Message;
+                                });
+                                _taskService.UpdateData(tasks);
                             }
+                        }
+                    }
+                }
+                #endregion
+                #region 鍏ュ簱浠诲姟涓嬪彂
+                if (newTasksIn.Count > 0)
+                {
+                    foreach (var task in newTasksIn)
+                    {
+                        try
+                        {
+                            AgvTaskSendDTO agvTaskSend = new AgvTaskSendDTO()
+                            {
+                                MissionData = new List<MissionDataItem>()
+                            };
+                            //鑾峰彇鐩爣鐐硅揣浣�
+                            Dt_LocationInfo locationInfoEnd = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.NextAddress);
+                            //鑾峰彇绾夸綋鍏ュ簱绔欏彴
+                            Dt_StationManger stationMangerStart = _stationMangerRepository.QueryFirst(x => x.StationCode == task.CurrentAddress);
+                            if (locationInfoEnd == null || stationMangerStart == null) throw new Exception($"鏈壘鍒颁换鍔″彿${task.TaskNum}璧峰鐐箋task.CurrentAddress}鎴栫洰鏍囩偣{task.NextAddress}浣嶇疆淇℃伅");
+                            agvTaskSend.RequestId = Guid.NewGuid().ToString().Replace("-", "");
+                            agvTaskSend.MissionCode = task.TaskNum.ToString();
+                            agvTaskSend.ViewBoardType = "W02";
+                            if (task.Grade == 0)
+                            {
+                                agvTaskSend.Priority = 99;
+                            }
+                            else
+                            {
+                                agvTaskSend.Priority = 99 - task.Grade;
+                            }
+                            //鏂欑瀛愭惉杩愪换鍔�
+                            MissionDataItem missionDataItem = new MissionDataItem()
+                            {
+                                Sequence = task.TaskNum,
+                                BinCode = task.PalletCode,
+                                StartPosition = stationMangerStart.StationCode,
+                                StartSlotCode = stationMangerStart.CraneStationCode,
+                                EndPosition = locationInfoEnd.AgvPoint,
+                                EndSlotCode = locationInfoEnd.LocationCode,
+                                TakeActionConfirm = true,
+                                TakeActionInform = true,
+                                PutActionConfirm = false,
+                                PutActionInform = false,
+                            };
+                            agvTaskSend.MissionData.Add(missionDataItem);
                             //鍙戦�丄GV浠诲姟
                             WebResponseContent content = _taskService.AgvSendTask(agvTaskSend, APIEnum.AgvSendTask);
                             if (!content.Status)
                                 throw new Exception(content.Message);
-                            task.Dispatchertime = DateTime.Now;
-                            _taskService.UpdateTask(task, TaskStatusEnum.AGV_Executing);
+                            task.Dispatchertime = DateTime.Now; task.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
+                            _taskService.UpdateData(task);
                             Thread.Sleep(500);
                         }
                         catch (Exception ex)
                         {
                             task.TaskState = TaskStatusEnum.Exception.ObjToInt();
                             task.ExceptionMessage = ex.Message;
+                            _taskService.UpdateData(task);
                         }
-                    }
-                    //鏇存柊浠诲姟
-                    if (newTasks.Count > 0)
-                    {
-                        _taskService.UpdateData(newTasks);
-                    }
+                    }    
                 }
+                #endregion
             }
             catch (Exception ex)
             {

--
Gitblit v1.9.3