dengjunjie
2024-12-27 3c7658b4fff5cfba50105357eb3723dcbcea5c6a
AGV接口逻辑
已修改5个文件
已添加1个文件
379 ■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGVController.cs 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVExtend.cs 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVJob.cs 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_SystemRepository/Sys_MenuRepository.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs
@@ -52,7 +52,13 @@
        /// AGV完成
        /// </summary>
        [Description("AGV完成")]
        AGV_Finish = 320,
        AGV_Finish = 330,
        /// <summary>
        /// AGV待继续执行
        /// </summary>
        [Description("AGV待继续执行")]
        AGV_WaitToExecute = 320,
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGVController.cs
@@ -1,8 +1,14 @@
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;
@@ -14,13 +20,121 @@
    public class AGVController : ControllerBase
    {
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly ITaskService _taskService;
        private readonly ITaskRepository _taskRepository;
        public AGVController(IStationMangerRepository stationMangerRepository)
        public AGVController(IStationMangerRepository stationMangerRepository, ITaskService taskService, ITaskRepository taskRepository)
        {
            _stationMangerRepository = stationMangerRepository;
            _taskService = taskService;
            _taskRepository = taskRepository;
        }
        /// <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.ObjToInt() == x.TaskNum);
                if (task == null) throw new Exception("未找到任务");
                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt())
                {
                    var content = TakeRequest(task.CurrentAddress);
                    if (!content.Status) throw new Exception(content.Message);
                }
                else
                {
                    var content = PutRequest(task.NextAddress, task.PalletType);
                    if (!content.Status) throw new Exception(content.Message);
                }
                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);
        }
        /// <summary>
        /// AGV任务更新/完成
        /// </summary>
        /// <param name="agvUpdateModel"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("AgvCallback"), AllowAnonymous]
        public AgvResponseContent AgvUpdateTask([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.ObjToInt() == x.TaskNum);
                if (task == null) throw new Exception("未找到任务");
                switch (agvUpdateModel.Method)
                {
                    case "start":
                        break;
                    case "outbin"://出库根据这个信号判断取货完成
                        if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt())
                        {
                            var content = TakeFinish(task.CurrentAddress);
                            if (!content.Status) throw new Exception(content.Message);
                            task.TaskState = TaskStatusEnum.AGV_Finish.ObjToInt();
                            var up = _taskRepository.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成);
                            agvResponseContent.Code = up ? "0" : "1";
                            agvResponseContent.Message = up ? "成功" : "失败";
                            return agvResponseContent;
                        }
                        break;
                    case "end"://入库根据这个信号判断放货完成
                        if (task.TaskType != TaskTypeEnum.Outbound.ObjToInt())
                        {
                            var content = PutFinish(task.CurrentAddress);
                            if (!content.Status) throw new Exception(content.Message);
                            task.TaskState = TaskStatusEnum.SC_Execute.ObjToInt();
                            var up = _taskRepository.UpdateData(task);
                            agvResponseContent.Code = up ? "0" : "1";
                            agvResponseContent.Message = up ? "成功" : "失败";
                            return agvResponseContent;
                        }
                        break;
                    case "cancel":
                        task.TaskState = TaskStatusEnum.Cancel.ObjToInt();
                        _taskRepository.UpdateData(task);
                        break;
                    default:
                        throw new Exception($"未定义方法名【{agvUpdateModel.Method}】");
                }
                agvResponseContent.Code = "0";
                agvResponseContent.Message = "成功";
            }
            catch (Exception ex)
            {
                agvResponseContent.Code = "1";
                agvResponseContent.Message = ex.Message;
            }
            return agvResponseContent;
            //return _taskService.AgvUpdateTask(agvUpdateModel);
        }
        [HttpPost, HttpGet, Route("PutRequest"), AllowAnonymous]
        /// <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
@@ -65,7 +179,12 @@
            }
        }
        [HttpPost, HttpGet, Route("PutFinish"), AllowAnonymous]
        //[HttpPost, HttpGet, Route("PutFinish"), AllowAnonymous]
        /// <summary>
        /// æ”¾è´§å®Œæˆ
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public WebResponseContent PutFinish(string code)
        {
            try
@@ -92,7 +211,12 @@
            }
        }
        [HttpPost, HttpGet, Route("TakeRequest"), AllowAnonymous]
        //[HttpPost, HttpGet, Route("TakeRequest"), AllowAnonymous]
        /// <summary>
        /// å–货请求
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public WebResponseContent TakeRequest(string code)
        {
            try
@@ -136,7 +260,12 @@
            }
        }
        [HttpPost, HttpGet, Route("TakeFinish"), AllowAnonymous]
        //[HttpPost, HttpGet, Route("TakeFinish"), AllowAnonymous]
        /// <summary>
        /// å–货完成
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public WebResponseContent TakeFinish(string code)
        {
            try
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs
@@ -6,6 +6,7 @@
using System.Threading.Tasks;
using WIDESEA_DTO.Agv;
using WIDESEAWCS_Common.APIEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
@@ -23,12 +24,12 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                string apiAddress = AppSettings.Get(APIEnum.AgvSendTask.ToString());
                string apiAddress = "http://10.30.4.19:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask";// AppSettings.Get(APIEnum.AgvSendTask.ToString());
                string response = HttpHelper.Post(apiAddress, taskModel.Serialize());
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>();
                if (agvContent.Code == "200")
                if (agvContent.Code == "0")
                {
                    content.OK(agvContent.Message);
                    content.OK(data: agvContent.Data);
                }
                else
                {
@@ -46,11 +47,10 @@
        /// </summary>
        public AgvResponseContent AgvSecureApply(AgvSecureApplyDTO secureApplyModel)
        {
            return new AgvResponseContent();
        }
        /// <summary>
        /// å®‰å…¨ä¿¡å·å›žå¤ WCS-AGV
        /// å®‰å…¨ä¿¡å·å›žå¤ WCS-AGV  //AGV任务继续执行
        /// </summary>
        /// <param name="secureModel"></param>
        /// <returns></returns>
@@ -59,10 +59,10 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                string apiAddress = AppSettings.Get(APIEnum.AgvSecureReply.ToString());
                string apiAddress = "http://10.30.4.19:8182/rcms/services/rest/hikRpcService/continueTask";// AppSettings.Get(APIEnum.AgvSecureReply.ToString());
                string response = HttpHelper.Post(apiAddress, secureReplyModel.Serialize());
                AgvResponseContent agvContent = response.DeserializeObject<AgvResponseContent>();
                if (agvContent.Code == "200")
                if (agvContent.Code == "0")
                {
                    content.OK(agvContent.Message);
                }
@@ -84,7 +84,6 @@
        /// <returns></returns>
        public AgvResponseContent AgvUpdateTask(AgvUpdateDTO agvUpdateModel)
        {
            return new AgvResponseContent();
        }
    }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVExtend.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_DTO.Agv;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_Tasks
{
    public partial class AGVJob
    {
        /// <summary>
        /// ä¸‹å‘AGV任务
        /// </summary>
        public void SendAGVTask()
        {
            try
            {
                var newTasks = _taskService.Db.Queryable<Dt_Task>().Where(x => x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt() || x.TaskState == TaskStatusEnum.New.ObjToInt()).ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList();
                foreach (var agvTask in newTasks)
                {
                    AgvTaskDTO taskDTO = new AgvTaskDTO()
                    {
                        ReqCode = Guid.NewGuid().ToString().Replace("-", ""),
                        TaskTyp = AgvTaskType(agvTask.TaskType, agvTask.DeviceCode),
                        PositionCodePath = new List<CodePath>()
                        {
                            new CodePath()
                            {
                                type="00",
                                positionCode=agvTask.CurrentAddress
                            },
                            new CodePath()
                            {
                                type="00",
                                positionCode=agvTask.NextAddress
                            }
                        },
                        TaskCode = agvTask.TaskNum.ToString(),
                        PodTyp = agvTask.PalletType == 1 ? "XX" : "DD",
                    };
                    WebResponseContent content = _taskService.AgvSendTask(taskDTO);
                    if (content.Status)
                    {
                        agvTask.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
                        agvTask.Remark = content.Data.ObjToString();
                    }
                    else
                    {
                        agvTask.TaskState = TaskStatusEnum.Exception.ObjToInt();
                        //agvTask.Remark = content.Data.ObjToString();
                        agvTask.ExceptionMessage = content.Message;
                    }
                }
                _taskService.UpdateData(newTasks);
            }
            catch (Exception ex)
            {
                Console.Out.WriteLine(nameof(AGVJob) + ":" + ex.Message);
            }
        }
        /// <summary>
        /// ä¸‹å‘AGV继续执行任务
        /// </summary>
        public void SendAGVWaitToTask()
        {
            try
            {
                var WaitToTasks = _taskService.Db.Queryable<Dt_Task>().Where(x => x.TaskState == TaskStatusEnum.AGV_WaitToExecute.ObjToInt()).ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList();
                foreach (var WaitToTask in WaitToTasks)
                {
                    AgvSecureReplyDTO replyDTO = new AgvSecureReplyDTO()
                    {
                        ReqCode = Guid.NewGuid().ToString().Replace("-", ""), //WaitToTask.TaskNum.ToString(),
                        taskCode = WaitToTask.Remark,
                    };
                    WebResponseContent content = _taskService.AgvSecureReply(replyDTO);
                    if (content.Status)
                    {
                        WaitToTask.TaskState = TaskStatusEnum.AGV_Executing.ObjToInt();
                    }
                    else
                    {
                        WaitToTask.TaskState = TaskStatusEnum.Exception.ObjToInt();
                        WaitToTask.ExceptionMessage = content.Message;
                    }
                }
                _taskService.UpdateData(WaitToTasks);
            }
            catch (Exception ex)
            {
                Console.Out.WriteLine(nameof(AGVJob) + ":" + ex.Message);
            }
        }
        public string AgvTaskType(int TaskType, string DeviceCode)
        {
            switch (DeviceCode)
            {
                case "SC01_CSJ":
                    {
                        return TaskType == TaskTypeEnum.ProductionReturn.ObjToInt() ? "23" : "24";
                    }
                case "SC01_ZH":
                    {
                        if (TaskType == TaskTypeEnum.InboundXB.ObjToInt())
                            return "20";
                        else if (TaskType == TaskTypeEnum.InboundJT.ObjToInt())
                            return "21";
                        else return "22";
                    }
                default:
                    throw new NotImplementedException();
            }
        }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVJob.cs
@@ -12,6 +12,7 @@
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
@@ -20,82 +21,35 @@
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public class AGVJob : JobBase, IJob
    public partial class AGVJob : JobBase, IJob
    {
        public readonly ITaskService _taskService;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly IRouterService _routerService;
        private readonly IStationMangerRepository _stationMangerRepository;
        private readonly IMapper _mapper;
        public AGVJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper)
        public AGVJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IStationMangerRepository stationMangerRepository, IMapper mapper)
        {
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _routerService = routerService;
            _stationMangerRepository = stationMangerRepository;
            _mapper = mapper;
        }
        public Task Execute(IJobExecutionContext context)
        {
            try
            {
                List<Dt_Task> UpTasks = new List<Dt_Task>();
                var newTasks = _taskService.Db.Queryable<Dt_Task>().Where(x => x.TaskState == TaskStatusEnum.AGV_Execute.ObjToInt() || x.TaskState == TaskStatusEnum.New.ObjToInt()).ToList().OrderBy(x => x.Grade).ThenBy(x => x.CreateDate).ToList();
                foreach (var agvTask in newTasks)
                {
                    AgvTaskDTO taskDTO = new AgvTaskDTO()
                    {
                        ReqCode = agvTask.TaskNum.ToString(),
                        TaskTyp = AgvTaskType(agvTask.TaskType, agvTask.DeviceCode),
                        PositionCodePath = new List<CodePath>()
                        {
                            new CodePath()
                            {
                                type="",
                                positionCode=""
                            },
                            new CodePath()
                            {
                                type="",
                                positionCode=""
                            }
                        },
                        PodTyp = agvTask.PalletType == 1 ? "XX" : "DD",
                    };
                    WebResponseContent content = _taskService.AgvSendTask(taskDTO);
                    if (content.Status)
                    {
                        agvTask.TaskState = TaskStatusEnum.AGV_Execute.ObjToInt();
                        UpTasks.Add(agvTask);
                    }
                }
                _taskService.UpdateData(UpTasks);
                SendAGVTask();
                SendAGVWaitToTask();
            }
            catch (Exception ex)
            {
                Console.Out.WriteLine(nameof(AGVJob) + ":" + ex.Message);
            }
            return Task.CompletedTask;
        }
        public string AgvTaskType(int TaskType, string DeviceCode)
        {
            switch (DeviceCode)
            {
                case "SC01-CSJ":
                    {
                        return TaskType == TaskTypeEnum.ProductionReturn.ObjToInt() ? "23" : "24";
                    }
                case "SC01-ZH":
                    {
                        if (TaskType == TaskTypeEnum.InboundXB.ObjToInt())
                            return "20";
                        else if (TaskType == TaskTypeEnum.InboundJT.ObjToInt())
                            return "21";
                        else return "22";
                    }
                default:
                    throw new NotImplementedException();
            }
        }
    }
}
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_SystemRepository/Sys_MenuRepository.cs
@@ -47,22 +47,26 @@
        public List<MenuDTO> GetAllMenuPDA()
        {
            List<Sys_Menu> menus = base.QueryData(x => (x.Enable == 1 || x.Enable == 2) && x.MenuType == 1).OrderByDescending(a => a.OrderNo).ThenByDescending(q => q.ParentId).ToList();
            List<MenuDTO> _menus = _mapper.Map<List<MenuDTO>>(menus);
            _menus.ForEach(x =>
            //List<Sys_Menu> menus = base.QueryData(x => (x.Enable == 1 || x.Enable == 2) && x.MenuType == App.User.MenuType).OrderByDescending(a => a.OrderNo).ThenByDescending(q => q.ParentId).ToList();
            //List<MenuDTO> _menus = _mapper.Map<List<MenuDTO>>(menus);
            //_menus.ForEach(x =>
            //{
            //    if (!string.IsNullOrEmpty(x.Auth) && x.Auth.Length > 10)
            //    {
            //        try
            //        {
            //            x.Actions = x.Auth.DeserializeObject<List<ActionDTO>>();
            //        }
            //        catch { }
            //    }
            //    x.Actions ??= new List<ActionDTO>();
            //});
            if (App.User.IsRoleIdSuperAdmin(App.User.RoleId))
            {
                if (!string.IsNullOrEmpty(x.Auth) && x.Auth.Length > 10)
                {
                    try
                    {
                        x.Actions = x.Auth.DeserializeObject<List<ActionDTO>>();
                    }
                    catch { }
                }
                x.Actions ??= new List<ActionDTO>();
            });
            string test = _menus.Serialize();
            return _menus;
                return GetAllMenu();
            }
            List<int> menuIds = GetPermissions(App.User.RoleId).Select(x => x.MenuId).ToList();
            return GetAllMenu().Where(x => menuIds.Contains(x.MenuId)).ToList();
        }
        public object GetSuperAdminMenu()