using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection.Metadata; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; using SqlSugar; using WIDESEA_Common; using WIDESEA_Common.AGVEunm; using WIDESEA_Core; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_Core.Log; using WIDESEA_ITaskInfoService; using WIDESEA_Model.Models; using static WIDESEA_Common.AGVEunm.AGVTaskrevoke; namespace WIDESEA_TaskInfoService { public partial class TaskService { public string url1 = AppSettings.Configuration["AGVTaskrevokes"]; /// /// 立库出库AGV搬运 /// /// /// public WebResponseContent ShelfOutboundCarry(Dt_Task outTask) { Dt_CachePoint cachePoint = GetCachePointByStartPoint(outTask.TargetAddress); Dt_Task task = new() { CurrentAddress = outTask.TargetAddress, Grade = 0, NextAddress = cachePoint.PointCode, OrderNo = outTask.OrderNo, PalletCode = outTask.PalletCode + "-AGV", Roadway = "", SourceAddress = outTask.TargetAddress, TargetAddress = cachePoint.PointCode, SourceKey = outTask.TaskId, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), TaskStatus = AGVTaskStatusEnum.AGV_New.ObjToInt(), TaskType = TaskTypeEnum.AGVCarry.ObjToInt(), CreateDate = DateTime.Now, Creater = App.User.UserId > 0 ? App.User.UserName : "System", }; cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt(); _basicService.CachePointService.Repository.UpdateData(cachePoint); Repository.AddData(task); return WebResponseContent.Instance.OK(); } /// /// 叫料 /// /// /// public WebResponseContent CallMateriel(string endPoint) { try { Dt_CachePoint cachePoint = GetCachePointByEndPoint(endPoint); Dt_Task task = new Dt_Task() { CurrentAddress = cachePoint.PointCode, Grade = 0, NextAddress = endPoint, OrderNo = "", PalletCode = cachePoint.Remark, Roadway = "", SourceAddress = cachePoint.PointCode, TargetAddress = endPoint, SourceKey = 0, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), TaskStatus = AGVTaskStatusEnum.AGV_New.ObjToInt(), TaskType = TaskTypeEnum.AGVCarry.ObjToInt(), }; cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt(); _basicService.CachePointService.Repository.UpdateData(cachePoint); Repository.AddData(task); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 物料搬运 /// /// /// public WebResponseContent MaterielCarry(string startPoint) { try { Dt_CachePoint cachePoint = GetCachePointByStartPoint(startPoint); Dt_Task task = new() { CurrentAddress = startPoint, Grade = 0, NextAddress = cachePoint.PointCode, OrderNo = "", PalletCode = startPoint + "-AGV", Roadway = "", SourceAddress = startPoint, TargetAddress = cachePoint.PointCode, SourceKey = 0, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), TaskStatus = AGVTaskStatusEnum.AGV_New.ObjToInt(), TaskType = TaskTypeEnum.AGVCarry.ObjToInt(), }; cachePoint.PointStatus = LocationStatusEnum.Lock.ObjToInt(); _basicService.CachePointService.Repository.UpdateData(cachePoint); Repository.AddData(task); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } private Dt_CachePoint GetCachePointByStartPoint(string startPoint) { Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.StartArea == startPoint); if (areaRouter == null) { throw new Exception("未找到路由信息!"); } Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.NextArea); if (areaInfo == null) { throw new Exception("未找到下一区域信息!"); } Dt_CachePoint? cachePoint = _basicService.CachePointService.AssignCachePoint(areaInfo.Id); if (cachePoint == null) { throw new Exception("未找到空闲缓存点!"); } return cachePoint; } private Dt_CachePoint GetCachePointByEndPoint(string endPoint) { Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.NextArea == endPoint); if (areaRouter == null) { throw new Exception("未找到路由信息!"); } Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.StartArea); if (areaInfo == null) { throw new Exception("未找到起点缓存区域信息!"); } Dt_CachePoint? cachePoint = _basicService.CachePointService.GetIbStockCachePoint(areaInfo.Id); if (cachePoint == null) { throw new Exception("未找到有货缓存点!"); } return cachePoint; } public object AGVTaskFeedBack(AGVTaskFeedBackModel model) { Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == Convert.ToInt32(model.Task_id)); if (task == null) { return new { code = 404, message = "未找到该任务!" }; } Dt_CachePoint startCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.SourceAddress); if (startCachePoint != null) { startCachePoint.PointStatus = LocationStatusEnum.Free.ObjToInt(); _basicService.CachePointService.Repository.UpdateData(startCachePoint); } Dt_CachePoint endCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.TargetAddress); if (endCachePoint != null) { endCachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt(); _basicService.CachePointService.Repository.UpdateData(endCachePoint); } BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); return new { code = 200, message = "成功" }; } /// /// 查询AGV新建任务 /// /// public Dt_Task GetTasks() { WebResponseContent content = new WebResponseContent(); Expression> expressionOrder = x => true; return BaseDal.QueryFirst(x => x.TaskStatus == AGVTaskStatusEnum.AGV_New.ObjToInt()); } /// /// 查询原材料出库任务 /// /// public Dt_Task GetTasksout() { WebResponseContent content = new WebResponseContent(); //Expression> expressionOrder = x => true; return BaseDal.QueryFirst(x => x.TaskType == TaskTypeEnum.Outbound.ObjToInt()&&x.SourceAddress.Contains("原材料")&&x.TaskStatus==AGVTaskStatusEnum.AGV_Query.ObjToInt()); } /// /// 查询成品有货货位 /// /// public Dt_CachePoint GetTasksoin() { WebResponseContent content = new WebResponseContent(); Expression> expressionOrder = x => true; return _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode.Contains("成品库") && x.PointStatus == LocationStatusEnum.InStock.ObjToInt()); } /// /// AGV告警反馈 /// /// /// public WCSback EquipmentTask(AGVTaskEquipment saveModel) { WCSback content = new WCSback(); try { var broad = saveModel.data.detail.FirstOrDefault(); Dt_Equipment equipment = new Dt_Equipment { deviceId = broad.deviceId.ToString(), deviceName = broad.deviceName.ToString(), taskNo = broad.taskNo.ToString(), eventId = broad.eventId.ToString(), title = broad.title.ToString(), message = broad.message.ToString(), status = broad.status.ToString(), Creater = App.User.UserId > 0 ? App.User.UserName : "System", }; _basicService.EquipmentService.AddData(equipment); content = WCSback.Instance.OK(); } catch (Exception ex) { content = WCSback.Instance.Error($"异常,错误信息:{ex.Message}"); throw; } return content; } public WebResponseContent PrintStatusUp(int tasknum, string palletCode) { WebResponseContent content = new WebResponseContent(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum && x.PalletCode == palletCode); if (task == null) { return content.Error("打印信息不存在"); } task.Status = PrintEnum.Printed.ObjToInt(); BaseDal.UpdateData(task); return content.OK(); } catch (Exception ex) { content.Error("错误:" + ex.Message); } return content; } /// /// 叉车报警 /// /// public WebResponseContent GetConfig() { WebResponseContent content = new WebResponseContent(); DateTime currentTime = DateTime.Now; // 获取当前时间 DateTime twoSecondsBefore = currentTime.AddSeconds(-1000); Dt_Equipment equipment = _basicService.EquipmentService.Repository.QueryFirst(x => x.CreateDate > twoSecondsBefore); if (equipment != null) { content = WebResponseContent.Instance.OK(data: "设备id" + equipment.deviceId.ToString() + " " + "设备名称" + equipment.deviceName.ToString() + " " + "任务号" + equipment.taskNo.ToString() + " " + equipment.eventId.ToString() + " " + "告警标题" + equipment.title.ToString() + " " + "告警内容" + equipment.message.ToString() + " " + "告警状态" + equipment.status.ToString()); } return content; } /// /// 任务完成 /// /// /// public WCSback UpdateAgvTask(AGVTaskFeedback feedback) { try { WCSback content = new WCSback(); var bored = feedback.data.detail.FirstOrDefault(); //接受任务号对应wcs任务号,任务状态判断.......需修改 int tasknum = bored.taskNo.ObjToInt();//任务号 int taskState = bored.taskState.ObjToInt();//任务状态 var task = BaseDal.QueryData(x => x.TaskNum == tasknum).First(); if (task != null) { Update(task, taskState); content.code = 200; content.message = "处理成功"; } return content; } catch (Exception ex) { return WCSback.Instance.Error(ex.Message); } } private void Update(Dt_Task task, int taskState) { Thread.Sleep(1000); if (taskState == 99) { int TaskStatus = AGVTaskStatusEnum.AGV_Finish.ObjToInt(); _taskHtyService.AddTaskHty(task, TaskStatus); HCJFree(task, TaskStatus); BaseDal.DeleteData(task); WriteLog.GetLog("无人叉车任务完成").Write("任务号:" + task.TaskNum, "无人叉车任务完成"); } else if (taskState == 90) { int TaskStatus = AGVTaskStatusEnum.AGV_Cancel.ObjToInt(); _taskHtyService.AddTaskHty(task, TaskStatus); BaseDal.DeleteData(task); WriteLog.GetLog("无人叉车任务取消").Write("任务号:" + task.TaskNum, "无人叉车任务取消"); } //else if (taskState == 91) //{ // int TaskStatus = AGVTaskStatusEnum.AGV_Fail.ObjToInt(); // _taskHtyService.AddTaskHty(task, TaskStatus); // BaseDal.DeleteData(task); //} else if (taskState == 60) { task.TaskStatus = AGVTaskStatusEnum.AGV_Executing.ObjToInt(); BaseDal.UpdateData(task); } } /// /// 撤销已下发任务 /// /// 任务号 /// 返回处理结果 public WebResponseContent AGVTaskrevokes(int tasknum) { try { WebResponseContent content = new WebResponseContent(); Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum); AGVTaskrevoke taskrevoke = new AGVTaskrevoke(); revoke data = new revoke(); Taskrevoke taskrevoke1 = new Taskrevoke(); { taskrevoke1.taskNo = task.TaskNum.ToString(); DateTime date = DateTime.Now; taskrevoke1.stateTime = date.ToString("yyyy-MM-dd HH:mm:ss"); taskrevoke1.taskState = "90"; taskrevoke1.toLoc = task.TargetAddress.ToString(); DateTime date1 = task.CreateDate; taskrevoke1.taskDate = date1.ToString("yyyy-MM-dd HH:mm:ss"); } data.detail.Add(taskrevoke1); taskrevoke.data = data; var time = new DateTimeOffset(DateTime.Now); long timestampStr = time.ToUnixTimeMilliseconds();//时间戳 string appkeystr = "appsalt=" + AGVopenApi.appsalt + "&appkey=" + AGVopenApi.appkey; string appkeyEcrypt = GetMD5Hex(appkeystr); string origin = appkeyEcrypt + "&appsecret=" + AGVopenApi.appsecret + "×tamp=" + timestampStr + "&uniquestr=" + timestampStr; string signstr = GetMD5Hex(origin); Dictionary headers = new Dictionary() { {"appkey",AGVopenApi.appkey }, {"timestamp",timestampStr.ToString() }, {"sign",signstr } }; string posy = JsonConvert.SerializeObject(taskrevoke); var respone = HttpHelper.Post(url1, posy, headers: headers); var res = JsonConvert.DeserializeObject(respone); if (res.success) { return WebResponseContent.Instance.OK(); } else { return WebResponseContent.Instance.Error(res.msg); } } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 继续任务 /// /// /// /// public WebResponseContent AGVTaskConts(int tasknum) { try { WebResponseContent content = new WebResponseContent(); Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum); AGVTaskCont taskCont = new AGVTaskCont(); Cont data = new Cont(); TaskCont taskconts = new TaskCont(); { taskconts.taskNo = task.TaskNum.ToString(); } data.detail.Add(taskconts); taskCont.data = data; var time = new DateTimeOffset(DateTime.Now); long timestampStr = time.ToUnixTimeMilliseconds();//时间戳 string appkeystr = "appsalt=" + AGVopenApi.appsalt + "&appkey=" + AGVopenApi.appkey; string appkeyEcrypt = GetMD5Hex(appkeystr); string origin = appkeyEcrypt + "&appsecret=" + AGVopenApi.appsecret + "×tamp=" + timestampStr + "&uniquestr=" + timestampStr; string signstr = GetMD5Hex(origin); Dictionary headers = new Dictionary() { {"appkey",AGVopenApi.appkey }, {"timestamp",timestampStr.ToString() }, {"sign",signstr } }; string posy = JsonConvert.SerializeObject(taskCont); var respone = HttpHelper.Post(url1, posy, headers: headers); var res = JsonConvert.DeserializeObject(respone); if (res.success) { return WebResponseContent.Instance.OK(); } else { return WebResponseContent.Instance.Error(res.msg); } } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 完成任务 /// /// /// /// public WebResponseContent AGVTaskEnds(int tasknum) { try { WebResponseContent content = new WebResponseContent(); Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum); AGVTaskEnd taskEnd = new AGVTaskEnd(); End data = new End(); TaskEnd taskEnds = new TaskEnd(); { taskEnds.taskNo = task.TaskNum.ToString(); taskEnds.goBack = "1"; } data.detail.Add(taskEnds); taskEnd.data = data; var time = new DateTimeOffset(DateTime.Now); long timestampStr = time.ToUnixTimeMilliseconds();//时间戳 string appkeystr = "appsalt=" + AGVopenApi.appsalt + "&appkey=" + AGVopenApi.appkey; string appkeyEcrypt = GetMD5Hex(appkeystr); string origin = appkeyEcrypt + "&appsecret=" + AGVopenApi.appsecret + "×tamp=" + timestampStr + "&uniquestr=" + timestampStr; string signstr = GetMD5Hex(origin); Dictionary headers = new Dictionary() { {"appkey",AGVopenApi.appkey }, {"timestamp",timestampStr.ToString() }, {"sign",signstr } }; string posy = JsonConvert.SerializeObject(taskEnd); var respone = HttpHelper.Post(url1, posy, headers: headers); var res = JsonConvert.DeserializeObject(respone); if (res.success) { int TaskStatus = AGVTaskStatusEnum.AGV_Finish.ObjToInt(); _taskHtyService.AddTaskHty(task, TaskStatus); BaseDal.DeleteData(task); return WebResponseContent.Instance.OK(); } else { return WebResponseContent.Instance.Error(res.msg); } } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 暂停任务 /// /// /// /// public WebResponseContent AGVTaskSuspends(int tasknum) { try { WebResponseContent content = new WebResponseContent(); Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum); AGVTaskSuspend suspend = new AGVTaskSuspend(); spend data = new spend(); TaskSuspend suspends = new TaskSuspend(); { suspends.taskNo = task.TaskNum.ToString(); } data.detail.Add(suspends); suspend.data = data; var respone = HttpHelper.Post(url + "AGVTaskSuspend/" + suspend, "暂停任务"); int TaskStatus = AGVTaskStatusEnum.AGV_Finish.ObjToInt(); _taskHtyService.AddTaskHty(task, TaskStatus); BaseDal.DeleteData(task); if (respone.success) { return WebResponseContent.Instance.OK(); } else { return WebResponseContent.Instance.Error(respone.msg); } } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 恢复任务 /// /// /// /// public WebResponseContent AGVTaskRecoverys(int tasknum) { try { WebResponseContent content = new WebResponseContent(); Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == tasknum); AGVTaskRecovery recovery = new AGVTaskRecovery(); Recovery data = new Recovery(); TaskRecovery recoverys = new TaskRecovery(); { recoverys.taskNo = task.TaskNum.ToString(); } data.detail.Add(recoverys); recovery.data = data; var respone = HttpHelper.Post(url + "AGVTaskRecovery/" + recovery, "恢复任务"); if (respone.success) { return WebResponseContent.Instance.OK(); } else { return WebResponseContent.Instance.Error(respone.msg); } } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public string GetMD5Hex(string appkeystr) { using MD5 md5Hash = MD5.Create(); // 将输入字符串转换为字节数组并计算其MD5哈希。 byte[] dataBytes = Encoding.UTF8.GetBytes(appkeystr); byte[] hashBytes = md5Hash.ComputeHash(dataBytes); // 创建一个新的Stringbuilder来收集字节并创建一个字符串。 StringBuilder builder = new StringBuilder(); // 循环通过每个字节的哈希,并格式化为十六进制字符串。 for (int i = 0; i < hashBytes.Length; i++) { builder.Append(hashBytes[i].ToString("x2")); } string appkeyEcrypt = builder.ToString(); return appkeyEcrypt; } } }