diff --git a/WCS.BLL/Manager/AGVManager.cs b/WCS.BLL/Manager/AGVManager.cs index ae30c1b..df566b7 100644 --- a/WCS.BLL/Manager/AGVManager.cs +++ b/WCS.BLL/Manager/AGVManager.cs @@ -7,12 +7,84 @@ using WCS.BLL.DbModels; using WCS.BLL.Tool; using WCS.DAL.Db; using WCS.DAL.DbModels; +using WCS.Model; +using WCS.Model.ApiModel.AGV; +using WCS.Model.ApiModel.InOutRecord; +using WCS.Model.ApiModel.MXBackgroundThread; namespace WCS.BLL.Manager { //AGV动作相关 public static class AGVManager { + public static void InitBackgroundThread() + { + #region 定时任务:定时查询任务状态 + Task.Run(() => + { + while (true) + { + //每5秒同步一次 + Thread.Sleep(5000); + try + { + var url = @"http://192.168.18.150:8181/rcms/services/rest/hikRpcService/queryTaskStatus"; + + var tasks = DbHelp.db.Queryable() + .Where(t => t.CreateTime > DateTime.Now.AddDays(-7)) //只查询7天内agv任务数据 + .Where(t =>t.TaskStatus != TaskStatusEnum.取消完成 && t.TaskStatus!= TaskStatusEnum.已结束) + .OrderBy(t => t.Id) + .ToList(); + if (tasks != null && tasks.Count > 0) + { + for (int i = 0; i < tasks.Count; i++) + { + try + { + //请求RCS获取任务状态 + var data = new AGVQueryTaskStatusRequest(); + data.taskCodes.Add(tasks[i].TaskCode); + + var result = ApiHelp.GetDataFromHttp(url, data, "POST", true); + if (result != null && result.code == "0" && result.data !=null && result.data.Count > 0) + { + var isUpdate = false; + //获取成功 是否与当前任务状态一致 如果不一致 进行更新 + var responseData = result.data.First(); + if (responseData.agvCode != tasks[i].AgvCode) + { + isUpdate = true; + tasks[i].AgvCode = responseData.agvCode; + } + if (responseData.taskStatus != tasks[i].TaskStatus.ToString()) + { + Enum.TryParse(responseData.taskStatus, out TaskStatusEnum status); + isUpdate = true; + tasks[i].TaskStatus = status; + } + if (isUpdate) + { + DbHelp.db.Updateable(tasks[i]).ExecuteCommand(); + } + } + } + catch (Exception ex) + { + Logs.Write("【定时任务】获取任务状态异常:" + ex.Message); + } + Thread.Sleep(50); + } + } + } + catch (Exception ex) + { + Logs.Write("【定时任务】获取任务状态异常:" + ex.Message); + } + } + }); + #endregion + } + public static object lockFlag = new object(); /// /// 产生AGV点到点搬运任务 @@ -36,7 +108,7 @@ namespace WCS.BLL.Manager //任务只允许一个一个发送 lock (lockFlag) { - var body = new AGVRequestModel() + var body = new GenAgvSchedulingTaskRequest() { positionCodePath = positionCodePathItems, }; @@ -63,6 +135,38 @@ namespace WCS.BLL.Manager return response; } } - } + public static AGVResponseModel CancelTask(AgvTask agvTask) + { + try + { + var url = @"http://192.168.18.150:8181/rcms/services/rest/hikRpcService/cancelTask"; + + //任务只允许一个一个发送 + lock (lockFlag) + { + var body = new AGVCancelTaskRequest() + { + taskCode = agvTask.TaskCode, + }; + + var response = ApiHelp.GetDataFromHttp(url, body, "POST", true); + if (response.code == "0" && response.message == "成功") + { + agvTask.TaskStatus = Model.ApiModel.AGV.TaskStatusEnum.取消完成; + DbHelp.db.Updateable(agvTask).ExecuteCommand(); + } + return response; + } + } + catch (Exception ex) + { + return new AGVResponseModel() + { + code = "-1", + message = $"发生异常:{ex.Message}" + }; + } + } + } } diff --git a/WCS.BLL/Manager/AGVRequestModel.cs b/WCS.BLL/Manager/GenAgvSchedulingTaskRequest.cs similarity index 97% rename from WCS.BLL/Manager/AGVRequestModel.cs rename to WCS.BLL/Manager/GenAgvSchedulingTaskRequest.cs index 642ac4e..b90c197 100644 --- a/WCS.BLL/Manager/AGVRequestModel.cs +++ b/WCS.BLL/Manager/GenAgvSchedulingTaskRequest.cs @@ -19,7 +19,7 @@ namespace WCS.BLL.Manager public string type { get; set; } = "00"; } - public class AGVRequestModel + public class GenAgvSchedulingTaskRequest { /// /// 请求码 每一次请求唯一 diff --git a/WCS.Model/ApiModel/AGV/AGVCancelTaskRequest.cs b/WCS.Model/ApiModel/AGV/AGVCancelTaskRequest.cs new file mode 100644 index 0000000..80184f0 --- /dev/null +++ b/WCS.Model/ApiModel/AGV/AGVCancelTaskRequest.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.AGV +{ + /// + /// 取消任务 + /// + public class AGVCancelTaskRequest + { + /// + /// 请求码 每一次请求唯一 + /// + public string reqCode { get; set; } = Guid.NewGuid().ToString().Replace("-", ""); + + /// + /// 请求时间 + /// + public string reqTime { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + /// + /// 客户端编号 + /// + public string clientCode { get; set; } = "PDA"; + + /// + /// 任务单号 + /// + public string taskCode { get; set; } + } +} diff --git a/WCS.Model/ApiModel/AGV/AGVQueryTaskStatusRequest.cs b/WCS.Model/ApiModel/AGV/AGVQueryTaskStatusRequest.cs new file mode 100644 index 0000000..d875d3b --- /dev/null +++ b/WCS.Model/ApiModel/AGV/AGVQueryTaskStatusRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.AGV +{ + //AGV获取任务状态 + public class AGVQueryTaskStatusRequest + { + /// + /// 请求码 每一次请求唯一 + /// + public string reqCode { get; set; } = Guid.NewGuid().ToString().Replace("-", ""); + + /// + /// 请求时间 + /// + public string reqTime { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + /// + /// 任务编码数组 + /// + public List taskCodes = new List(); + } +} diff --git a/WCS.Model/ApiModel/AGV/AGVQueryTaskStatusResponse.cs b/WCS.Model/ApiModel/AGV/AGVQueryTaskStatusResponse.cs new file mode 100644 index 0000000..3ad3bd9 --- /dev/null +++ b/WCS.Model/ApiModel/AGV/AGVQueryTaskStatusResponse.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.AGV +{ + //如果好用,请收藏地址,帮忙分享。 + public class AGVQueryTaskStatusResponseData + { + /// + /// + /// + public string agvCode { get; set; } + /// + /// + /// + public string taskCode { get; set; } + /// + /// + /// + public string taskStatus { get; set; } + /// + /// 任务类型 + /// + public string taskTyp { get; set; } + } + + public class AGVQueryTaskStatusResponse + { + /// + /// + /// + public string code { get; set; } + /// + /// + /// + public List data { get; set; } + /// + /// + /// + public string interrupt { get; set; } + /// + /// 成功 + /// + public string message { get; set; } + /// + /// + /// + public string msgErrCode { get; set; } + /// + /// + /// + public string reqCode { get; set; } + } + +} diff --git a/WCS.Model/ApiModel/AGV/CancelAGVTasksRequest.cs b/WCS.Model/ApiModel/AGV/CancelAGVTasksRequest.cs new file mode 100644 index 0000000..0fedfd9 --- /dev/null +++ b/WCS.Model/ApiModel/AGV/CancelAGVTasksRequest.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace WCS.Model.ApiModel.AGV +{ + /// + /// 取消任务 + /// + public class CancelAGVTasksRequest : RequestBase + { + public int TaskId { get; set; } = 0; + + public string TaskCode { get; set; } + } +} diff --git a/WCS.WebApi/Controllers/AgvTaskController.cs b/WCS.WebApi/Controllers/AgvTaskController.cs index 866a315..ea00773 100644 --- a/WCS.WebApi/Controllers/AgvTaskController.cs +++ b/WCS.WebApi/Controllers/AgvTaskController.cs @@ -32,7 +32,7 @@ namespace WCS.WebApi.Controllers } /// - /// agv任务回调 + /// 获取AGV任务列表 /// /// /// @@ -51,6 +51,7 @@ namespace WCS.WebApi.Controllers var totalCount = await recordsQueryable.CountAsync(); var records = await recordsQueryable + .OrderByDescending(t => t.CreateTime) .Skip((request.PageNumber - 1) * request.PageSize).Take(request.PageSize) .ToListAsync(); //生成序号 @@ -81,5 +82,78 @@ namespace WCS.WebApi.Controllers } } + /// + /// 取消任务 + /// + /// + /// + [Route("cancelAGVTask")] + [HttpPost(Name = "cancelAGVTask")] + public async Task cancelAGVTask(CancelAGVTasksRequest request) + { + try + { + #region 参数、数据校验 + if (request.TaskId == 0 || string.IsNullOrEmpty(request.TaskCode)) + { + return new ResponseCommon() + { + Code = 201, + Message = $"传入参数错误!", + }; + } + + var agvTask = await DbHelp.db.Queryable() + .Where(t => t.Id == request.TaskId) + .Where(t => t.TaskCode == request.TaskCode) + .FirstAsync(); + if (agvTask == null) + { + return new ResponseCommon() + { + Code = 201, + Message = $"任务[{agvTask.TaskCode}]不存在!", + }; + } + + if (agvTask.TaskStatus != TaskStatusEnum.正在执行) + { + return new ResponseCommon() + { + Code = 201, + Message = $"任务[{agvTask.TaskCode}]状态为【{agvTask.TaskStatus}】,无法取消!", + }; + } + #endregion + + #region 调用RCS进行取消任务 + var response = AGVManager.CancelTask(agvTask); + if (response.code == "0" && response.message == "成功") + { + return new ResponseCommon() + { + Code = 200, + Message = $"success", + }; + } + else + { + return new ResponseCommon() + { + Code = 201, + Message = response.message, + }; + } + #endregion + } + catch (Exception ex) + { + return new ResponseCommon() + { + Code = 300, + Message = $"任务取消失败:{ex.Message}", + }; + } + } } } diff --git a/WCS.WebApi/Program.cs b/WCS.WebApi/Program.cs index 7df87af..bc49a60 100644 --- a/WCS.WebApi/Program.cs +++ b/WCS.WebApi/Program.cs @@ -33,13 +33,16 @@ namespace WebApi //Ϣط߳ WarningManager.StartWarningMessageThread(); - //Ѷ˾̨߳ - if (LocalFile.Config.IsMx) - { - MXBackgroundThread.InitBackgroundThread(); - var str = string.Empty; - MXBackgroundThread.SendDingDingMsg($"{LocalFile.Config.GroupName}̨ɹ", new List { "104379" }, ref str); - } + //ع˾AGV̨߳ + AGVManager.InitBackgroundThread(); + + ////Ѷ˾̨߳ + //if (LocalFile.Config.IsMx) + //{ + // MXBackgroundThread.InitBackgroundThread(); + // var str = string.Empty; + // MXBackgroundThread.SendDingDingMsg($"{LocalFile.Config.GroupName}̨ɹ", new List { "104379" }, ref str); + //} //̨ı־ Task.Run(async () => diff --git a/货架标准上位机/ViewModels/AGVTaskViewModel.cs b/货架标准上位机/ViewModels/AGVTaskViewModel.cs index 8fd9b02..6b5ec64 100644 --- a/货架标准上位机/ViewModels/AGVTaskViewModel.cs +++ b/货架标准上位机/ViewModels/AGVTaskViewModel.cs @@ -196,9 +196,6 @@ namespace 智慧物流软件系统.ViewModel } - /// - /// 物料删除操作 - /// public ICommand BtnCommitCommand { get => new DelegateCommand(BtnCommit); } public async void BtnCommit() { @@ -238,54 +235,14 @@ namespace 智慧物流软件系统.ViewModel }); } - /// - /// 物料修改操作 - /// - public ICommand BtnEditCommand { get => new DelegateCommand(BtnEdit); } - public async void BtnEdit() - { - ////查询勾选的第一个数据 - //var matDetailStocktakingInfo = DataGridItemSource?.Where(t => t.IsSelected == true).FirstOrDefault(); - //if (matDetailStocktakingInfo == null) - //{ - // Growl.Warning("请选择需要修改的数据!"); - // return; - //} - //else - //{ - // var updateView = new MatDetailStocktakingInfoUpdateView("修改盘点数据", matDetailStocktakingInfo); - // updateView.ShowDialog(); - // if (updateView.DialogResult == true) - // { - // matDetailStocktakingInfo = updateView.matDetailStocktakingInfo; - // var body = new UpdateStocktakingInfoRequest() - // { - // MatDetailStocktakingInfoId = matDetailStocktakingInfo.Id, - // StocktakingQty = matDetailStocktakingInfo.StocktakingQty, - // UserName = LocalStatic.CurrentUser, - // DeviceType = LocalFile.Config.DeviceType, - // }; - // var Result = ApiHelp.GetDataFromHttp>(LocalFile.Config.ApiIpHost + "PDAStocktaking/updateStocktakingInfos", body, "POST"); - // if (Result != null && Result.Code == 200) - // { - // CurrentPage = 1; - // Growl.Success("修改成功!"); - // } - // else - // { - // Growl.Error($"{Result?.Message?.ToString()}"); - // } - // } - //} - } /// /// 物料删除操作 /// - public ICommand BtnDeleteCommand { get => new DelegateCommand(BtnDelete); } - public async void BtnDelete() + public ICommand BtnCancelCommand { get => new DelegateCommand(BtnCancel); } + public async void BtnCancel() { - Growl.Ask($"是否删除所有勾选得数据]!", isConfirmed => + Growl.Ask($"是否取消所有勾选的任务?", isConfirmed => { if (isConfirmed) { @@ -293,24 +250,26 @@ namespace 智慧物流软件系统.ViewModel var needDeleteIds = DataGridItemSource?.Where(t => t.IsSelected == true) .Select(t => t.Id) .ToList(); + var task = DataGridItemSource?.Where(t => t.IsSelected == true).First(); - if (needDeleteIds == null) + if (needDeleteIds == null || needDeleteIds.Count == 0) { - Growl.Warning("请选择需要修改的数据!"); + Growl.Warning("请选择需要取消的任务!"); } else { - var body = new DeleteInfosRequest() + var body = new CancelAGVTasksRequest() { + TaskId = task == null ? 0 : task.Id, + TaskCode = task?.TaskCode, UserName = LocalStatic.CurrentUser, DeviceType = LocalFile.Config.DeviceType, - needDeleteIds = needDeleteIds, }; - var Result = ApiHelp.GetDataFromHttp>(LocalFile.Config.ApiIpHost + "PDAStocktaking/deleteStocktakingInfos", body, "POST"); + var Result = ApiHelp.GetDataFromHttp>(LocalFile.Config.ApiIpHost + "agvTask/cancelAGVTask", body, "POST"); if (Result != null && Result.Code == 200) { CurrentPage = 1; - Growl.Success("删除成功!" + Result?.Message); + Growl.Success("取消成功!" + Result?.Message); } else { diff --git a/货架标准上位机/Views/AGVTaskView.xaml b/货架标准上位机/Views/AGVTaskView.xaml index 70d8f42..6dc2e93 100644 --- a/货架标准上位机/Views/AGVTaskView.xaml +++ b/货架标准上位机/Views/AGVTaskView.xaml @@ -154,7 +154,7 @@ Content="取 消" FontFamily="{StaticResource IconFont}" Foreground="WhiteSmoke" - Command="{Binding BtnDeleteCommand}" + Command="{Binding BtnCancelCommand}" Style="{StaticResource ButtonDanger}">