using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; 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点到点搬运任务 /// public static AGVResponseModel GenAgvSchedulingTask(LocationInfo startLocation, LocationInfo endLocation, string shelfCode, string createUser) { var url = @"http://192.168.18.150:8181/rcms/services/rest/hikRpcService/genAgvSchedulingTask"; var startPositionCodePathItem = new PositionCodePathItem() { positionCode = startLocation.RcsStoreCode, }; var endPositionCodePathItem = new PositionCodePathItem() { positionCode = endLocation.RcsStoreCode, }; List positionCodePathItems = new List(); positionCodePathItems.Add(startPositionCodePathItem); positionCodePathItems.Add((endPositionCodePathItem)); //任务只允许一个一个发送 lock (lockFlag) { var body = new GenAgvSchedulingTaskRequest() { positionCodePath = positionCodePathItems, }; var response = ApiHelp.GetDataFromHttp(url, body, "POST", true); if (response.code == "0" && response.message == "成功") { //生成任务数据 var task = new AgvTask() { ShelfCode = shelfCode, RequestCode = body.reqCode, TaskCode = body.taskCode, TaskType = "GenAgvSchedulingTask", StratLocationId = startLocation.Id, StartLocationCode = startLocation.LocationCode, EndLocationId = endLocation.Id, EndLocationCode = endLocation.LocationCode, CreateUser = createUser }; DbHelp.db.Insertable(task).ExecuteCommand(); } 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}" }; } } } }