xiazhengtongxue
2026-03-17 4f3b0a6727ecfa555892ebea64bd76e5a07cd6fb
ÏîÄ¿´úÂë/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs
@@ -1,10 +1,14 @@
using Microsoft.AspNetCore.Authorization;
using Autofac.Core;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
using Org.BouncyCastle.Asn1.Ocsp;
using System.Text;
using System.Text.RegularExpressions;
using WIDESEA_DTO.Agv;
using WIDESEA_External.Model;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
@@ -13,6 +17,7 @@
using WIDESEAWCS_Core.LogHelper;
using WIDESEAWCS_DTO;
using WIDESEAWCS_DTO.Agv;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
@@ -21,6 +26,7 @@
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_TaskInfoService;
using WIDESEAWCS_Tasks;
using WIDESEAWCS_Tasks.DBNames;
using static Dm.net.buffer.ByteArrayBuffer;
@@ -43,7 +49,181 @@
            _taskRepository = taskRepository;
            _routerRepository = routerRepository;
        }
        /// <summary>
        /// AGV任务更新
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("Callback"), AllowAnonymous]
        public WebResponseContent? Callback([FromBody]AgvUpdateDTO agvUpdateDTO)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                WriteLog.Write_Log("AGV任务更新接口", "AGV任务更新接口", "更新任务", $"任务:{agvUpdateDTO.ToJson()}");
                if (agvUpdateDTO.Message != null && agvUpdateDTO.Message == "ROBOT_ERROR-haiUnknownError")
                {
                    var task1 = _taskRepository.QueryFirst(x => (agvUpdateDTO.MissionCode ?? "") == x.GroupId);
                    if (task1 != null)
                    {
                        Dt_ErrorInfo errorInfo = new Dt_ErrorInfo()
                        {
                            RobotCode = agvUpdateDTO.RobotId,
                            Message = agvUpdateDTO.Message,
                            ErrorType = 2
                        };
                        if (task1.TaskType == 500)
                        {
                            errorInfo.Message = "入库异常";
                            errorInfo.StationCode = task1.CurrentAddress;
                        }
                        else
                        {
                            errorInfo.Message = "出库异常";
                            errorInfo.StationCode = task1.NextAddress;
                        }
                        _taskService.AgvSearchStatus1(errorInfo);
                    }
                }
                var task = _taskRepository.QueryFirst(x => (agvUpdateDTO.ContainerCode ?? "") == x.PalletCode);
                switch (agvUpdateDTO.MissionStatus)
                {
                    case nameof(AGVStatusEnum.PICKER_RECEIVE):
                        if (task == null) throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
                        _taskService.UpdateTask(task, TaskStatusEnum.AGV_TakeFinish);
                        Dt_ErrorInfo e1 = new Dt_ErrorInfo()
                        {
                            RobotCode = agvUpdateDTO.RobotId,
                            Message = agvUpdateDTO.Message,
                            ErrorType = 0
                        };
                        _taskService.AgvSearchStatus1(e1);
                        break;
                    case nameof(AGVStatusEnum.PICKER_SEND):
                        if (task == null) throw new Exception($"未找到料箱【{agvUpdateDTO.ContainerCode}】任务");
                        Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x => x.PickStationCode == task.NextAddress);
                        if (task.IsCancel > 0 && stationManger != null && stationManger.StationCode != agvUpdateDTO.CurrentPosition)
                        {
                            _taskService.TaskCancelCompleted(task.TaskNum);
                        }
                        else
                        {
                            _taskService.TaskCompleted(task.TaskNum);
                        }
                        Dt_ErrorInfo e2 = new Dt_ErrorInfo()
                        {
                            RobotCode = agvUpdateDTO.RobotId,
                            Message = agvUpdateDTO.Message,
                            ErrorType = 0
                        };
                        _taskService.AgvSearchStatus1(e2);
                        break;
                    case nameof(AGVStatusEnum.WAITFEEDBACK):
                        //AGV放行
                        List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt());
                        if (!stationMangers.Select(x => x.StationCode).Contains(agvUpdateDTO.CurrentPosition))
                        {
                            WebResponseContent responseContent = _taskService.AgvTaskFlow(agvUpdateDTO.MissionCode);
                            if (!responseContent.Status) throw new Exception($"{responseContent.Message}");
                        }
                        Dt_ErrorInfo e3 = new Dt_ErrorInfo()
                        {
                            RobotCode = agvUpdateDTO.RobotId,
                            Message = agvUpdateDTO.Message,
                            ErrorType = 0
                        };
                        _taskService.AgvSearchStatus1(e3);
                        break;
                    default:
                        break;
                }
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// AGV任务请求
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("WorkRequest"), AllowAnonymous]
        public AgvTaskReqContent WorkRequest([FromBody] AgvTaskRequestDTO agvTaskRequestDTO)
        {
            AgvTaskReqContent content = new AgvTaskReqContent();
            try
            {
                WriteLog.Write_Log("AGV任务请求", "AGV任务请求接口", "任务", $"任务:{agvTaskRequestDTO.ToJson()}");
                //获取任务
                Dt_Task? taskExist = _taskRepository.QueryFirst(x=>x.PalletCode==agvTaskRequestDTO.ContainerCode) ?? throw new Exception($"未找到料箱{agvTaskRequestDTO.ContainerCode}任务");
                //获取站台
                Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == agvTaskRequestDTO.PositionId) ?? throw new Exception($"未找到{agvTaskRequestDTO.PositionId}站台位置");
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode) ?? throw new Exception($"未找到对应设备{stationManger.StationDeviceCode}");
                OtherDevice commonConveyorLine = (OtherDevice)device;
                if (stationManger.StationType==StationTypeEnum.StationType_OnlyOutbound.ObjToInt())
                {
                    short IsPut = commonConveyorLine.Communicator.Read<short>("0");
                    if (IsPut != 256) throw new Exception($"{agvTaskRequestDTO.PositionId}禁止放箱");
                }
                else
                {
                    short IsTake = commonConveyorLine.Communicator.Read<short>("11");
                    if (IsTake != 256) throw new Exception($"{agvTaskRequestDTO.PositionId}禁止取箱");
                }
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// AGV作业完成
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("WorkFinish"), AllowAnonymous]
        public AgvTaskReqContent WorkFinish([FromBody] AgvTaskRequestDTO agvTaskRequestDTO)
        {
            AgvTaskReqContent content = new AgvTaskReqContent();
            try
            {
                WriteLog.Write_Log("AGV作业完成", "AGV作业完成接口", "任务", $"任务:{agvTaskRequestDTO.ToJson()}");
                //获取站台
                Dt_StationManger? stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == agvTaskRequestDTO.PositionId) ?? throw new Exception($"未找到{agvTaskRequestDTO.PositionId}站台位置");
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode) ?? throw new Exception($"未找到对应设备{stationManger.StationDeviceCode}");
                OtherDevice commonConveyorLine = (OtherDevice)device;
                if (stationManger.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt())
                {
                    commonConveyorLine.Communicator.Write("21", new byte[] { 1, 0 });
                }
                else
                {
                    commonConveyorLine.Communicator.Write("23", new byte[] { 1, 0 });
                }
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// AGV作业完成
        /// </summary>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("AgvSearchStatus"), AllowAnonymous]
        public void AgvSearchStatus()
        {
            _taskService.AgvSearchStatus();
        }
    }
}