From 3c7658b4fff5cfba50105357eb3723dcbcea5c6a Mon Sep 17 00:00:00 2001 From: dengjunjie <dengjunjie@hnkhzn.com> Date: 星期五, 27 十二月 2024 18:38:24 +0800 Subject: [PATCH] AGV接口逻辑 --- 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs | 8 + 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVJob.cs | 62 +------- 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs | 15 +- 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVExtend.cs | 121 +++++++++++++++++ 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGVController.cs | 139 +++++++++++++++++++ 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_SystemRepository/Sys_MenuRepository.cs | 34 ++-- 6 files changed, 296 insertions(+), 83 deletions(-) diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs" index 8424dd8..80b262c 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/TaskEnum/TaskStatusEnum.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/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> /// 浠诲姟瀹屾垚 diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGVController.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGVController.cs" index bf814b7..0cf13a6 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGVController.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/AGVController.cs" @@ -1,8 +1,14 @@ 锘縰sing 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 diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs" index 5f367e3..129ec17 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/InvokeAGVService.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/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(); } } diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVExtend.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVExtend.cs" new file mode 100644 index 0000000..3f480c9 --- /dev/null +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVExtend.cs" @@ -0,0 +1,121 @@ +锘縰sing 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(); + } + } + } +} diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVJob.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVJob.cs" index 09bcf17..3371042 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/AGV/AGVJob.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/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(); - } } } } diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_SystemRepository/Sys_MenuRepository.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_SystemRepository/Sys_MenuRepository.cs" index da9c152..139ac7f 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_SystemRepository/Sys_MenuRepository.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/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() -- Gitblit v1.9.3