wangxinhui
18 小时以前 67348f250a1b7970059698002949a5e0a5f3c52f
ÏîÄ¿´úÂë/WCS/WCSServices/WIDESEAWCS_Server/Controllers/AGV/AGVController.cs
@@ -1,18 +1,23 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Text;
using WIDESEA_DTO.Agv;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core.LogHelper;
using WIDESEAWCS_DTO.Agv;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_Tasks;
using static Dm.net.buffer.ByteArrayBuffer;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using WIDESEAWCS_Tasks.DBNames;
namespace WIDESEAWCS_Server.Controllers
{
@@ -77,6 +82,114 @@
            //return _taskService.AgvSecureApply(secureApplyModel);
        }
        /// <summary>
        /// æå‡æœºç”³è¯· AGV-WCS
        /// </summary>
        /// <param name="secureApplyModel"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("AgvHoisterApply"), AllowAnonymous]
        public AgvResponse AgvHoisterApply([FromBody] AgvHoisterApplyDTO agvHoisterApplyDTO)
        {
            AgvResponse agvResponse = new AgvResponse();
            try
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == agvHoisterApplyDTO.HoisterCode);
                if (device == null)
                {
                    return agvResponse.Error($"未找到对应设备{agvHoisterApplyDTO.HoisterCode}");
                }
                OtherDevice otherDevice = (OtherDevice)device;
                //获取设备协议
                DeviceProDTO? deviceProRead = otherDevice.DeviceProDTOs.Where(x => x.DeviceChildCode == device.DeviceCode && x.DeviceProParamType == nameof(R_HoisterDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                DeviceProDTO? deviceProWrite = otherDevice.DeviceProDTOs.Where(x => x.DeviceChildCode == device.DeviceCode && x.DeviceProParamType == nameof(W_HoisterDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
                if (deviceProRead == null || deviceProWrite == null)
                {
                    return agvResponse.Error($"未找到设备{device.DeviceCode}协议");
                }
                //获取读取和写入
                R_HoisterInfo r_HoisterInfo = otherDevice.Communicator.ReadCustomer<R_HoisterInfo>(deviceProRead.DeviceProAddress);
                W_HoisterInfo w_HoisterInfo = otherDevice.Communicator.ReadCustomer<W_HoisterInfo>(deviceProWrite.DeviceProAddress);
                if (r_HoisterInfo == null || w_HoisterInfo == null)
                {
                    return agvResponse.Error($"未读取到设备{device.DeviceCode}信号");
                }
                if (r_HoisterInfo.R_HoisterSysStatus!=3)
                {
                    return agvResponse.Error($"设备状态不为自动");
                }
                QuartzLogger.WriteLogToFile("Info_" + device.DeviceCode, $"r_HoisterInfo:{r_HoisterInfo.Serialize()}{Environment.NewLine}w_HoisterInfo:{w_HoisterInfo.Serialize()}{Environment.NewLine}");
                bool IsSuccess = false;
                switch (agvHoisterApplyDTO.Request)
                {
                    case "1":
                        //判断提升机是否在当前层 å¦‚果当前层,关门状态,无货待命直接写入开门信号
                        if (r_HoisterInfo.R_HoisterCurrent == agvHoisterApplyDTO.CurrentLayer && r_HoisterInfo.R_HoisterLoadStatus == 2 && r_HoisterInfo.R_HoisterDoorStatus == 2)
                        {
                            otherDevice.SetValue(W_HoisterDB.W_HoisterDoorStatus, 1);
                            IsSuccess = true;
                        }
                        else if (r_HoisterInfo.R_HoisterCurrent == agvHoisterApplyDTO.CurrentLayer && r_HoisterInfo.R_HoisterLoadStatus == 2 && r_HoisterInfo.R_HoisterDoorStatus == 1)
                        {
                            IsSuccess = true;
                        }
                        else if (r_HoisterInfo.R_HoisterCurrent != agvHoisterApplyDTO.CurrentLayer && r_HoisterInfo.R_HoisterLoadStatus == 2 && r_HoisterInfo.R_HoisterDoorStatus == 1)
                        {
                            otherDevice.SetValue(W_HoisterDB.W_HoisterDoorStatus, 2);
                        }
                        //判断提升机不在当前层 å¦‚果不在当前层,关门状态,无货待命直接写入移动开门信号(当前)
                        else if (r_HoisterInfo.R_HoisterCurrent != agvHoisterApplyDTO.CurrentLayer && r_HoisterInfo.R_HoisterLoadStatus == 2 && r_HoisterInfo.R_HoisterDoorStatus == 2)
                        {
                            otherDevice.SetValue(W_HoisterDB.W_HoisterTarget, agvHoisterApplyDTO.CurrentLayer);
                            otherDevice.SetValue(W_HoisterDB.W_HoisterTask, 99);
                        }
                        return IsSuccess ? agvResponse.OK($"请求{agvHoisterApplyDTO.Request}成功,任务{agvHoisterApplyDTO.ReceiveTaskID}","1"): agvResponse.Error($"请求{agvHoisterApplyDTO.Request}失败,任务{agvHoisterApplyDTO.ReceiveTaskID}");
                    case "2":
                        //判断提升机是否在当前层 å¦‚果当前层,开门状态,无货待命 æ”¾è¡Œ
                        if (r_HoisterInfo.R_HoisterCurrent == agvHoisterApplyDTO.CurrentLayer && r_HoisterInfo.R_HoisterLoadStatus == 2 && r_HoisterInfo.R_HoisterDoorStatus == 1)
                        {
                            IsSuccess = true;
                        }
                        return IsSuccess ? agvResponse.OK($"请求{agvHoisterApplyDTO.Request}成功,任务{agvHoisterApplyDTO.ReceiveTaskID}", "2") : agvResponse.Error($"请求{agvHoisterApplyDTO.Request}失败,任务{agvHoisterApplyDTO.ReceiveTaskID}");
                    case "3":
                        //判断提升机是否在当前层 å¦‚果当前层,开门状态,有货待命写入关门信号
                        if (r_HoisterInfo.R_HoisterCurrent == agvHoisterApplyDTO.CurrentLayer && r_HoisterInfo.R_HoisterLoadStatus == 1 && r_HoisterInfo.R_HoisterDoorStatus == 1 && w_HoisterInfo.W_HoisterDoorStatus!=2)
                        {
                            otherDevice.SetValue(W_HoisterDB.W_HoisterDoorStatus, 2);
                        }
                        //判断提升机是否在当前层 å¦‚果当前层,关门状态,有货待命写入移动开门信号(目的)
                        if (r_HoisterInfo.R_HoisterCurrent == agvHoisterApplyDTO.CurrentLayer && r_HoisterInfo.R_HoisterLoadStatus == 1 && r_HoisterInfo.R_HoisterDoorStatus == 2)
                        {
                            otherDevice.SetValue(W_HoisterDB.W_HoisterTarget, agvHoisterApplyDTO.TargetLayer);
                            otherDevice.SetValue(W_HoisterDB.W_HoisterDoorStatus, 1);
                            otherDevice.SetValue(W_HoisterDB.W_HoisterTask, 99);
                            IsSuccess = true;
                        }
                        return IsSuccess ? agvResponse.OK($"请求{agvHoisterApplyDTO.Request}成功,任务{agvHoisterApplyDTO.ReceiveTaskID}", "3") : agvResponse.Error($"请求{agvHoisterApplyDTO.Request}失败,任务{agvHoisterApplyDTO.ReceiveTaskID}");
                    case "4":
                        //判断提升机是否在目的层 å¦‚果目的层,开门状态,有货待命 æ”¾è¡Œ
                        if (r_HoisterInfo.R_HoisterCurrent == agvHoisterApplyDTO.TargetLayer && r_HoisterInfo.R_HoisterLoadStatus == 1 && r_HoisterInfo.R_HoisterDoorStatus == 1)
                        {
                            IsSuccess = true;
                        }
                        return IsSuccess ? agvResponse.OK($"请求{agvHoisterApplyDTO.Request}成功,任务{agvHoisterApplyDTO.ReceiveTaskID}", "4") : agvResponse.Error($"请求{agvHoisterApplyDTO.Request}失败,任务{agvHoisterApplyDTO.ReceiveTaskID}");
                    case "5":
                        //判断提升机是否在目的层 å¦‚果目的层,开门状态,无货待命写入关门信号
                        if (r_HoisterInfo.R_HoisterCurrent == agvHoisterApplyDTO.TargetLayer && r_HoisterInfo.R_HoisterLoadStatus == 2 && r_HoisterInfo.R_HoisterDoorStatus == 1)
                        {
                            otherDevice.SetValue(W_HoisterDB.W_HoisterDoorStatus, 2);
                            IsSuccess = true;
                        }
                        return IsSuccess ? agvResponse.OK($"请求{agvHoisterApplyDTO.Request}成功,任务{agvHoisterApplyDTO.ReceiveTaskID}", "5") : agvResponse.Error($"请求{agvHoisterApplyDTO.Request}失败,任务{agvHoisterApplyDTO.ReceiveTaskID}");
                    default:
                        return agvResponse.Error($"未找到对应请求,Request:{agvHoisterApplyDTO.Request}");
                }
            }
            catch (Exception ex)
            {
                agvResponse.Error($"请求{agvHoisterApplyDTO.Request}失败,错误{ex.Message},任务{agvHoisterApplyDTO.ReceiveTaskID}");
            }
            return agvResponse;
        }
        /// <summary>
        /// AGV任务更新/完成
        /// </summary>
        /// <param name="agvUpdateModel"></param>