dengjunjie
2026-02-27 4492293132bb8f2020d89730dc894426ed7d5eb9
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/RGVTaskExtend.cs
@@ -3,6 +3,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.LocationEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core.Helper;
@@ -16,16 +17,18 @@
    public partial class TaskJob
    {
        #region ä¸‹å‘四向车任务
        public void SendRGVTask(List<Dt_Task> tasks)
        #region ä¸‹å‘四向车入库任务
        /// <summary>
        /// ä¸‹å‘四向车新建入库任务
        /// </summary>
        /// <param name="tasks"></param>
        public void SendRGVInTask(List<Dt_Task> tasks)
        {
            FOURBOTnewMovePodTask fOURBOTnewMovePodTask = new();
            try
            {
                Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
                #region å…¥åº“
                var intasks = tasks.Where(x => x.TaskType == (int)TaskTypeEnum.CPInbound).ToList();
                foreach (var item in intasks)
                foreach (var item in tasks)
                {
                    fOURBOTnewMovePodTask.priority = item.Grade;
                    fOURBOTnewMovePodTask.podID = item.PalletCode;
@@ -39,45 +42,59 @@
                    FOURBOTReturn fOURBOTReturn = response.DeserializeObject<FOURBOTReturn>();
                    if (fOURBOTReturn.returnCode == 0)
                    {
                        item.RGVTaskId = fOURBOTReturn.data.taskID;
                        FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID");
                        item.RGVTaskId = fOURBO.taskID;
                        item.TaskState = (int)TaskStatusEnum.Execut;
                    }
                }
                _taskService.UpdateData(intasks);
                #endregion
                _taskService.UpdateData(tasks);
            }
            catch (Exception ex)
            {
                WriteError(nameof(TaskJob), ex.Message, ex);
            }
        }
        #endregion
                #region å‡ºåº“
                var outtasks = tasks.Where(x => x.TaskType == (int)TaskTypeEnum.CPOutbound).ToList();
                foreach (var item in outtasks)
        #region å¤„理出库任务是否需要移库
        /// <summary>
        /// å¤„理出库任务是否需要移库
        /// </summary>
        /// <param name="tasks"></param>
        public void IsMoveTask(List<Dt_Task> tasks)
        {
            try
            {
                Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(GetBlockPodContentDto)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
                List<Dt_Task> dt_Tasks = new List<Dt_Task>();
                //var PalletCodes = tasks.Select(x => x.PalletCode).ToList();
                GetBlockPodContentDto content = new GetBlockPodContentDto();
                content.CandidatePodIDs = tasks.Select(x => x.PalletCode).ToList();
                string response = HttpHelper.Post(apiInfo.ApiAddress, content.Serialize());
                FOURBOTReturn fOURBOTReturn = response.DeserializeObject<FOURBOTReturn>();
                if (fOURBOTReturn.returnCode == 0)
                {
                    ///判断是否需要移库,出库站台是否空闲
                    if (IsNoMoveTask(item) && StationIsFree(item.TargetAddress))
                    ReturnBlockPodResultDto getBlockPod = fOURBOTReturn.data as ReturnBlockPodResultDto ?? throw new Exception("未获取到阻碍托盘关系数据");
                    foreach (var Result in getBlockPod.Result)
                    {
                        #region ä¸‹å‘出库任务
                        fOURBOTnewMovePodTask.priority = item.Grade;
                        fOURBOTnewMovePodTask.podID = item.PalletCode;
                        fOURBOTnewMovePodTask.destination = item.NextAddress;
                        fOURBOTnewMovePodTask.desExt = new
                        foreach (var item in Result.outPods)
                        {
                            unload = 1//是否放下容器,0否1是
                        };
                        fOURBOTnewMovePodTask.desType = 2;
                        string response = HttpHelper.Post(apiInfo.ApiAddress, fOURBOTnewMovePodTask.Serialize());
                        FOURBOTReturn fOURBOTReturn = response.DeserializeObject<FOURBOTReturn>();
                        if (fOURBOTReturn.returnCode == 0)
                        {
                            item.RGVTaskId = fOURBOTReturn.data.taskID;
                            item.TaskState = (int)TaskStatusEnum.Execut;
                            var task = tasks.First(x => x.PalletCode == item.outPod);
                            if (item.blockPods.Count > 0)
                            {
                                task.TaskState = (int)TaskStatusEnum.RGV_WaitMoveToExecute;
                                dt_Tasks.Add(task);
                                AddMoveTask(item.blockPods);
                            }
                            else
                            {
                                task.TaskState = (int)TaskStatusEnum.RGV_WaitSend;
                                dt_Tasks.Add(task);
                            }
                        }
                        #endregion
                    }
                    else
                    {
                        item.TaskState = (int)TaskStatusEnum.RGV_WaitMoveToExecute;
                    }
                    _taskService.UpdateData(dt_Tasks);
                }
                _taskService.UpdateData(outtasks);
                #endregion
            }
            catch (Exception ex)
            {
@@ -112,6 +129,7 @@
                    {
                        item.CurrentAddress = item.NextAddress;
                        item.NextAddress = rGVLocationInfo.LocationCode;
                        item.Roadway = rGVLocationInfo.RoadwayNo;
                        fOURBOTnewMovePodTask.priority = item.Grade;
                        fOURBOTnewMovePodTask.podID = item.PalletCode;
                        fOURBOTnewMovePodTask.destination = item.NextAddress;
@@ -124,7 +142,8 @@
                        FOURBOTReturn fOURBOTReturn = response.DeserializeObject<FOURBOTReturn>();
                        if (fOURBOTReturn.returnCode == 0)
                        {
                            item.RGVTaskId = fOURBOTReturn.data.taskID;
                            FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID");
                            item.RGVTaskId = fOURBO.taskID;
                            item.TaskState = (int)TaskStatusEnum.Puting;
                            rGVLocationInfo.LocationStatus = LocationStatusEnum.InLock.ObjToInt();
                            rGVLocationInfos.Add(rGVLocationInfo);
@@ -173,7 +192,8 @@
                    FOURBOTReturn fOURBOTReturn = response.DeserializeObject<FOURBOTReturn>();
                    if (fOURBOTReturn.returnCode == 0)
                    {
                        item.RGVTaskId = fOURBOTReturn.data.taskID;
                        FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID");
                        item.RGVTaskId = fOURBO.taskID;
                        item.TaskState = (int)TaskStatusEnum.Puting;
                    }
                }
@@ -186,32 +206,114 @@
        }
        #endregion
        #region åˆ¤æ–­æ˜¯å¦éœ€è¦ç§»åº“
        public static bool IsNoMoveTask(Dt_Task task)
        #region æ·»åŠ ç§»åº“ä»»åŠ¡
        public void AddMoveTask(List<string> blockPods)
        {
            var isNoMove = true;
            try
            {
                List<Dt_Task> tasks = new List<Dt_Task>();
                List<Dt_RGVLocationInfo> _UpRGVLocationInfos = new List<Dt_RGVLocationInfo>();
                List<Dt_RGVLocationInfo> rGVLocationInfos = _rGVLocationInfoService.Repository.QueryData(x => blockPods.Contains(x.PalletCode));
                var FreeLocationInfos = _rGVLocationInfoService.GetFreeLocationInfos();
                if (FreeLocationInfos.Count < 1) throw new Exception($"成品库创建移库任务无可用空货位");
                foreach (var item in rGVLocationInfos)
                {
                    Dt_RGVLocationInfo? rGVLocationInfo = FreeLocationInfos.Where(x => x.Layer == item.Layer).OrderBy(n => Math.Abs(n.Row - item.Row)).FirstOrDefault();
                    rGVLocationInfo ??= FreeLocationInfos.First();
                    Dt_Task dt_Task = new()
                    {
                        TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                        //WMSTaskNum = taskDTO.taskCode,
                        //WMSId = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                        Grade = 1,
                        PalletCode = item.PalletCode,
                        Roadway = item.RoadwayNo,
                        TaskState = TaskStatusEnum.RGV_NewMoveTask.ObjToInt(),
                        TaskType = TaskTypeEnum.CPMoveInventory.ObjToInt(),
                        SourceAddress = item.LocationCode,
                        CurrentAddress = item.LocationCode,
                        NextAddress = rGVLocationInfo.LocationCode,
                        TargetAddress = rGVLocationInfo.LocationCode,
                        Creater = "WCS",
                    };
                    tasks.Add(dt_Task);
                    item.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt();
                    rGVLocationInfo.LocationStatus = LocationStatusEnum.MoveLock.ObjToInt();
                    _UpRGVLocationInfos.Add(rGVLocationInfo);
                    FreeLocationInfos.Remove(rGVLocationInfo);
                }
                _rGVLocationInfoService.UpdateData(rGVLocationInfos);
                _rGVLocationInfoService.UpdateData(_UpRGVLocationInfos);
                _taskService.AddData(tasks);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return isNoMove;
        }
        #endregion
        #region åˆ¤æ–­å‡ºåº“口是否空闲
        public bool StationIsFree(string StationCode)
        #region ä¸‹å‘四向车批量移库任务
        public void SendMoveTasks(List<Dt_Task> tasks)
        {
            Dt_StationManger stationManger = _stationMangerService.GetOutStationInfo(StationCode);
            return stationManger.IsOccupied == LocationStatusEnum.Free.ObjToInt();
            try
            {
                List<Dt_Task> dt_Tasks = new List<Dt_Task>();
                List<MoveBlockPodContentDto> moveBlocks = new List<MoveBlockPodContentDto>();
                Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(MoveBlockPodContentDto)) ?? throw new Exception("未找到四向车批量搬运阻碍托任务接口配置信息!请检查接口配置");
                foreach (var item in tasks)
                {
                    MoveBlockPodContentDto moveBlock = new MoveBlockPodContentDto()
                    {
                        podID = item.PalletCode,
                        des = item.TargetAddress
                    };
                    moveBlocks.Add(moveBlock);
                }
                string response = HttpHelper.Post(apiInfo.ApiAddress, moveBlocks.Serialize());
                FOURBOTReturn fOURBOTReturn = response.DeserializeObject<FOURBOTReturn>();
                if (fOURBOTReturn.returnCode == 0)
                {
                    MoveBlockPodsDataDto moveBlockPodsData = fOURBOTReturn.data as MoveBlockPodsDataDto ?? throw new Exception("未获取到四向车批量搬运阻碍托返回的任务ID");
                    foreach (var item in moveBlockPodsData.succList)
                    {
                        var task = tasks.First(x => x.PalletCode == item.podID);
                        task.RGVTaskId = item.taskID;
                        task.TaskState = TaskStatusEnum.RGV_MoveTaskSend.ObjToInt();
                        dt_Tasks.Add(task);
                    }
                    _taskService.UpdateData(dt_Tasks);
                }
            }
            catch (Exception ex)
            {
                WriteError(nameof(TaskJob), ex.Message, ex);
            }
        }
        #endregion
        #region ç§»åº“后下发出库任务
        public void SendMoveToExecuteTask(List<Dt_Task> tasks)
        #region å¤„理待移库后出库任务
        public void MoveToExecuteTask(List<Dt_Task> tasks)
        {
            try
            {
                foreach (var item in tasks)
                {
                    if (_taskService.Repository.QueryFirst(x => x.Roadway == item.Roadway && x.TaskType == (int)TaskTypeEnum.CPMoveInventory) == null)
                        item.TaskState = (int)TaskStatusEnum.RGV_WaitSend;
                }
                _taskService.UpdateData(tasks);
            }
            catch (Exception ex)
            {
                WriteError(nameof(TaskJob), ex.Message, ex);
            }
        }
        #endregion
        #region ä¸‹å‘出库任务
        public void SendOutTask(List<Dt_Task> tasks)
        {
            try
            {
@@ -219,8 +321,8 @@
                Dt_ApiInfo? apiInfo = _apiInfoService.Repository.QueryFirst(x => x.ApiCode == nameof(FOURBOTnewMovePodTask)) ?? throw new Exception("未找到四向车任务下发接口配置信息!请检查接口配置");
                foreach (var item in tasks)
                {
                    if (_taskService.Repository.QueryData(x => x.Roadway == item.Roadway && x.TaskType == (int)TaskTypeEnum.CPMoveInventory).Any()) continue;
                    if (!StationIsFree(item.TargetAddress)) continue;
                    var stationManger = _stationMangerService.GetOutStationInfo(item.TargetAddress);
                    if (stationManger.IsOccupied != LocationStatusEnum.Free.ObjToInt()) continue;
                    #region ä¸‹å‘出库任务
                    fOURBOTnewMovePodTask.priority = item.Grade;
                    fOURBOTnewMovePodTask.podID = item.PalletCode;
@@ -234,8 +336,11 @@
                    FOURBOTReturn fOURBOTReturn = response.DeserializeObject<FOURBOTReturn>();
                    if (fOURBOTReturn.returnCode == 0)
                    {
                        item.RGVTaskId = fOURBOTReturn.data.taskID;
                        FOURBOTnewMovePodTaskResponseData fOURBO = fOURBOTReturn.data as FOURBOTnewMovePodTaskResponseData ?? throw new Exception("未获取到四向车返回的任务ID");
                        item.RGVTaskId = fOURBO.taskID;
                        item.TaskState = (int)TaskStatusEnum.Execut;
                        stationManger.IsOccupied = LocationStatusEnum.Lock.ObjToInt();
                        _stationMangerService.UpdateData(stationManger);
                    }
                    #endregion
                }