using Microsoft.AspNetCore.Authorization; 
 | 
using Microsoft.AspNetCore.Http; 
 | 
using Microsoft.AspNetCore.Mvc; 
 | 
using WIDESEA_DTO.Agv; 
 | 
using WIDESEAWCS_Common.TaskEnum; 
 | 
using WIDESEAWCS_Core; 
 | 
using WIDESEAWCS_Core.Enums; 
 | 
using WIDESEAWCS_Core.Helper; 
 | 
using WIDESEAWCS_IBasicInfoRepository; 
 | 
using WIDESEAWCS_ITaskInfoRepository; 
 | 
using WIDESEAWCS_ITaskInfoService; 
 | 
using WIDESEAWCS_Model.Models; 
 | 
using WIDESEAWCS_QuartzJob; 
 | 
using WIDESEAWCS_Tasks; 
 | 
  
 | 
namespace WIDESEAWCS_Server.Controllers 
 | 
{ 
 | 
    [Route("api/[controller]")] 
 | 
    [ApiController] 
 | 
    public class CTU_AGVController : ControllerBase 
 | 
    { 
 | 
        private readonly IStationMangerRepository _stationMangerRepository; 
 | 
        private readonly ITaskService _taskService; 
 | 
        private readonly ITaskRepository _taskRepository; 
 | 
  
 | 
        public CTU_AGVController(IStationMangerRepository stationMangerRepository, ITaskService taskService, ITaskRepository taskRepository) 
 | 
        { 
 | 
            _stationMangerRepository = stationMangerRepository; 
 | 
            _taskService = taskService; 
 | 
            _taskRepository = taskRepository; 
 | 
        } 
 | 
        [HttpPost, HttpGet, Route("AGVFinish"), AllowAnonymous] 
 | 
        public WebResponseContent AGVFinish(string barcode) 
 | 
        { 
 | 
            WebResponseContent content = new WebResponseContent(); 
 | 
            try 
 | 
            { 
 | 
                var task = _taskRepository.QueryFirst(x => x.PalletCode == barcode); 
 | 
                if (task == null) throw new Exception($"未找到任务,托盘号【{barcode}】"); 
 | 
                AgvUpdateDTO updateDTO = new AgvUpdateDTO() 
 | 
                { 
 | 
                    TaskCode = task.AgvTaskNum, 
 | 
                    Method = "end" 
 | 
                }; 
 | 
                var agvResponseContent = CtuCallback(updateDTO); 
 | 
                if (agvResponseContent.Code == "1") throw new Exception(agvResponseContent.Message); 
 | 
                content.OK(); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                content.Error(ex.Message); 
 | 
            } 
 | 
            return content; 
 | 
        } 
 | 
  
 | 
        #region 安全信号申请 
 | 
        /// <summary> 
 | 
        /// 安全信号申请 AGV-WCS 
 | 
        /// </summary> 
 | 
        /// <param name="secureApplyModel"></param> 
 | 
        /// <returns></returns> 
 | 
        [HttpPost, HttpGet, Route("AgvSecureApply"), AllowAnonymous] 
 | 
        public AgvResponseContent AgvSecureApply([FromBody] AgvSecureApplyDTO secureApplyModel) 
 | 
        { 
 | 
            AgvResponseContent agvResponseContent = new AgvResponseContent(); 
 | 
            agvResponseContent.ReqCode = secureApplyModel.ReqCode; 
 | 
            try 
 | 
            { 
 | 
                var task = _taskRepository.QueryFirst(x => secureApplyModel.TaskCode == x.AgvTaskNum); 
 | 
                if (task == null) throw new Exception("未找到任务"); 
 | 
                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt()) 
 | 
                { 
 | 
                    var content = PutRequest(task.NextAddress, task.PalletType); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    var content = TakeRequest(task.CurrentAddress); 
 | 
                } 
 | 
                task.TaskState = TaskStatusEnum.AGV_WaitToExecute.ObjToInt(); 
 | 
                var up = _taskRepository.UpdateData(task); 
 | 
                agvResponseContent.Code = up ? "0" : "1"; 
 | 
                agvResponseContent.Message = up ? "成功" : "失败"; 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                agvResponseContent.Code = "1"; 
 | 
                agvResponseContent.Message = ex.Message; 
 | 
            } 
 | 
            return agvResponseContent; 
 | 
            //return _taskService.AgvSecureApply(secureApplyModel); 
 | 
        } 
 | 
        #endregion 
 | 
  
 | 
        /// <summary> 
 | 
        /// CtuAGV任务更新/完成 
 | 
        /// </summary> 
 | 
        /// <param name="agvUpdateModel"></param> 
 | 
        /// <returns></returns> 
 | 
        [HttpPost, HttpGet, Route("CtuCallback"), AllowAnonymous] 
 | 
        public AgvResponseContent CtuCallback([FromBody] AgvUpdateDTO agvUpdateModel) 
 | 
        { 
 | 
            AgvResponseContent agvResponseContent = new AgvResponseContent(); 
 | 
            try 
 | 
            { 
 | 
                if (agvUpdateModel == null) throw new Exception("未获取到请求参数"); 
 | 
                agvResponseContent.ReqCode = agvUpdateModel.ReqCode; 
 | 
                var task = _taskRepository.QueryFirst(x => agvUpdateModel.TaskCode == x.AgvTaskNum); 
 | 
                if (task == null) throw new Exception($"未找到任务,任务号【{agvUpdateModel.TaskCode}】"); 
 | 
  
 | 
                if (agvUpdateModel.Method == "end") 
 | 
                { 
 | 
                    if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt()) PutFinish(task.NextAddress); 
 | 
                    _taskService.TaskCompleted(task.TaskNum); 
 | 
                } 
 | 
                agvResponseContent.Code = "0"; 
 | 
                agvResponseContent.Message = "成功"; 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                agvResponseContent.Code = "1"; 
 | 
                agvResponseContent.Message = ex.Message; 
 | 
            } 
 | 
            return agvResponseContent; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 放货请求 
 | 
        /// </summary> 
 | 
        /// <param name="code"></param> 
 | 
        /// <param name="palletType"></param> 
 | 
        /// <returns></returns> 
 | 
        [HttpPost, HttpGet, Route("PutRequest"), AllowAnonymous] 
 | 
        public WebResponseContent PutRequest(string code, int palletType) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.AGVStationCode == code); 
 | 
                if (stationManger == null) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error($"未找到站台配置"); 
 | 
                } 
 | 
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode); 
 | 
                if (device == null) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error($"未找到对应设备"); 
 | 
                } 
 | 
  
 | 
                OtherDevice otherDevice = (OtherDevice)device; 
 | 
  
 | 
                bool canPut = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, stationManger.StationCode); 
 | 
                if (canPut) 
 | 
                { 
 | 
                    otherDevice.SetValue(GroundStationDBName.W_PutRequest, true, stationManger.StationCode); 
 | 
                    return WebResponseContent.Instance.OK(); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    otherDevice.SetValue(GroundStationDBName.W_PutRequest, true, stationManger.StationCode); 
 | 
                    Thread.Sleep(1000); 
 | 
                    canPut = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanPut, stationManger.StationCode); 
 | 
                    if (canPut) 
 | 
                    { 
 | 
                        return WebResponseContent.Instance.OK(); 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        return WebResponseContent.Instance.Error($"放货申请中"); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return WebResponseContent.Instance.Error(ex.Message); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        //[HttpPost, HttpGet, Route("PutFinish"), AllowAnonymous] 
 | 
        /// <summary> 
 | 
        /// 放货完成 
 | 
        /// </summary> 
 | 
        /// <param name="code"></param> 
 | 
        /// <returns></returns> 
 | 
        [HttpPost, HttpGet, Route("PutFinish"), AllowAnonymous] 
 | 
        public WebResponseContent PutFinish(string code) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.AGVStationCode == code); 
 | 
                if (stationManger == null) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error($"未找到站台配置"); 
 | 
                } 
 | 
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode); 
 | 
                if (device == null) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error($"未找到对应设备"); 
 | 
                } 
 | 
  
 | 
                OtherDevice otherDevice = (OtherDevice)device; 
 | 
                otherDevice.SetValue(GroundStationDBName.W_PutFinish, true, stationManger.StationCode); 
 | 
  
 | 
                return WebResponseContent.Instance.OK(); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return WebResponseContent.Instance.Error(ex.Message); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        //[HttpPost, HttpGet, Route("TakeRequest"), AllowAnonymous] 
 | 
        /// <summary> 
 | 
        /// 取货请求 
 | 
        /// </summary> 
 | 
        /// <param name="code"></param> 
 | 
        /// <returns></returns> 
 | 
        [HttpPost, HttpGet, Route("TakeRequest"), AllowAnonymous] 
 | 
        public WebResponseContent TakeRequest(string code) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.AGVStationCode == code); 
 | 
                if (stationManger == null) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error($"未找到站台配置"); 
 | 
                } 
 | 
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode); 
 | 
                if (device == null) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error($"未找到对应设备"); 
 | 
                } 
 | 
  
 | 
                OtherDevice otherDevice = (OtherDevice)device; 
 | 
  
 | 
                bool canPut = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanTake, stationManger.StationCode); 
 | 
                if (canPut) 
 | 
                { 
 | 
                    otherDevice.SetValue(GroundStationDBName.W_TakeRequest, true, stationManger.StationCode); 
 | 
                    return WebResponseContent.Instance.OK(); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    otherDevice.SetValue(GroundStationDBName.W_TakeRequest, true, stationManger.StationCode); 
 | 
                    Thread.Sleep(1000); 
 | 
                    canPut = otherDevice.GetValue<GroundStationDBName, bool>(GroundStationDBName.R_IsCanTake, stationManger.StationCode); 
 | 
                    if (canPut) 
 | 
                    { 
 | 
                        return WebResponseContent.Instance.OK(); 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        return WebResponseContent.Instance.Error($"取货申请中"); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return WebResponseContent.Instance.Error(ex.Message); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        //[HttpPost, HttpGet, Route("TakeFinish"), AllowAnonymous] 
 | 
        /// <summary> 
 | 
        /// 取货完成 
 | 
        /// </summary> 
 | 
        /// <param name="code"></param> 
 | 
        /// <returns></returns> 
 | 
        [HttpPost, HttpGet, Route("TakeFinish"), AllowAnonymous] 
 | 
        public WebResponseContent TakeFinish(string code) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.AGVStationCode == code); 
 | 
                if (stationManger == null) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error($"未找到站台配置"); 
 | 
                } 
 | 
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationManger.StationDeviceCode); 
 | 
                if (device == null) 
 | 
                { 
 | 
                    return WebResponseContent.Instance.Error($"未找到对应设备"); 
 | 
                } 
 | 
  
 | 
                OtherDevice otherDevice = (OtherDevice)device; 
 | 
                otherDevice.SetValue(GroundStationDBName.W_TakeFinish, true, stationManger.StationCode); 
 | 
                Thread.Sleep(1000); 
 | 
                otherDevice.SetValue(GroundStationDBName.W_TakeFinish, false, stationManger.StationCode); 
 | 
                return WebResponseContent.Instance.OK(); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                return WebResponseContent.Instance.Error(ex.Message); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |