using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_ITaskInfoService; using WIDESEA_ITaskInfoRepository; using WIDESEA_Model.Models; using WIDESEA_Common.AGVEunm; using WIDESEA_Core; using WIDESEA_Core.Helper; using WIDESEA_Core.BaseRepository; using Microsoft.VisualBasic; using System.Security.Cryptography; using Org.BouncyCastle.Crypto.Digests; using WIDESEA_Core.Const; using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; using WIDESEA_Core.Enums; using System.Diagnostics; using WIDESEA_Core.Log; using FastReport.DevComponents.DotNetBar; namespace WIDESEA_Tasks { public partial class AGVjob { private readonly IUnitOfWorkManage _unitOfWorkManage; public string url = AppSettings.Configuration["AGVTaskPend"]; WebResponseContent content = new WebResponseContent(); public void SendAgvTask() { try { List agvtasks = _taskService.GetTasks(); var workshop1Tasks = agvtasks.Where(t => t.SourceAddress.Contains("PVC成品")) .OrderBy(t => t.CreateDate) .ToList(); var workshop2Tasks = agvtasks.Where(t => t.SourceAddress.Contains("硅烷成品")) .OrderBy(t => t.CreateDate) .ToList(); var workshop3Tasks = agvtasks.Where(t => !t.SourceAddress.Contains("成品") || t.SourceAddress.Contains("半成品")) .OrderBy(t => t.CreateDate) .ToList(); int maxCount = Math.Max(workshop1Tasks.Count, workshop2Tasks.Count); for (int i = 0; i < maxCount; i++) { if (i < workshop1Tasks.Count) { ProcessTask(workshop1Tasks[i]); } if (i < workshop2Tasks.Count) { ProcessTask(workshop2Tasks[i]); } } foreach (var task in workshop3Tasks) { ProcessTask(task); } void ProcessTask(Dt_Task agvtask) { //foreach (Dt_Task agvtask in agvtasks) //{ bool text = true; bool text1 = true; bool text2 = true; bool text3 = true; Thread.Sleep(500); Dt_CachePoint CachePointSO = _cachePointRepository.QueryFirst(x => x.PointCode == agvtask.SourceAddress);//查询起点 Dt_CachePoint CachePoint = _cachePointRepository.QueryFirst(x => x.PointCode == agvtask.TargetAddress && x.PointCode.Contains("成品库"));//|| x.PointCode.Contains("原材料库")) && x.Remark != null Dt_CachePoint dt_CachePoint = _cachePointRepository.QueryFirst(x => x.PointCode == agvtask.TargetAddress && x.Remark != null);//查询终点 Dt_CachePoint CachePointYCl = _cachePointRepository.QueryFirst(x => x.PointCode == agvtask.SourceAddress && x.Remark != null && x.PointCode.Contains("原材料库")); if (CachePoint != null && CachePointSO != null) { var pointnames = _cachePointRepository.QueryData(x => x.Remark == CachePoint.Remark && x.Depth != 0).ToList(); foreach (var item in pointnames) { var a = CachePoint.Depth.ObjToInt(); var b = item.Depth.ObjToInt(); if (a > b) { Dt_Task dt_Task = _taskRepository.QueryFirst(x => x.TargetAddress == item.PointCode); if (dt_Task != null) { text = false; continue; } } if (a < b) { if (item.PointStatus == LocationStatusEnum.InStock.ObjToInt()) { text = false; } } } if (CachePointSO.Remark != null) { var pointname = _cachePointRepository.QueryData(x => x.Remark == CachePointSO.Remark && x.Depth != 0).ToList(); foreach (var item1 in pointname) { var c = CachePointSO.Depth.ObjToInt(); var d = item1.Depth.ObjToInt(); if (c > d) { Dt_Task dt_Task = _taskRepository.QueryFirst(x => x.SourceAddress == item1.PointCode); if (dt_Task != null) { text1 = false; continue; } } } } if (text == true && text1 == true) { AGVTask(agvtask); } } else if (CachePointYCl != null && dt_CachePoint != null) { var pointnames = _cachePointRepository.QueryData(x => x.Remark == CachePointYCl.Remark).ToList(); foreach (var item in pointnames) { var a = CachePointYCl.Depth.ObjToInt(); var b = item.Depth.ObjToInt(); if (a > b) { Dt_Task dt_Task = _taskRepository.QueryFirst(x => x.SourceAddress == item.PointCode); if (dt_Task != null) { text2 = false; continue; } } } var pointname = _cachePointRepository.QueryData(x => x.Remark == dt_CachePoint.Remark).ToList(); foreach (var item1 in pointname) { var c = dt_CachePoint.Depth.ObjToInt(); var d = item1.Depth.ObjToInt(); if (c > d) { Dt_Task dt_Task = _taskRepository.QueryFirst(x => x.TargetAddress == item1.PointCode); if (dt_Task != null) { text3 = false; continue; } } } if (text2 == true && text3 == true) { AGVTask(agvtask); } } else { AGVTask(agvtask); } //} } } catch (Exception ex) { //_unitOfWorkManage.RollbackTran(); content = WebResponseContent.Instance.Error($"{ex.Message}"); //throw new Exception($"下发任务失败" + ex); } } public void AGVTask(Dt_Task agvtask) { AGVTaskPend pend = new AGVTaskPend(); //pend.requestType = pend.requestType; //pend.accessId = pend.accessId; //pend.requestId = pend.requestId; Pend data = new Pend(); TaskPend taskPend = new TaskPend(); { taskPend.taskNo = agvtask.TaskNum.ToString(); taskPend.taskType = "MV"; DateTime date = DateTime.Now; taskPend.taskDate = date.ToString("yyyy-MM-dd HH:mm:ss"); taskPend.taskState = "00"; taskPend.priority = "1"; taskPend.wareCode = "W01"; taskPend.docNo = ""; taskPend.sku = ""; taskPend.uom = ""; taskPend.qty = 0; taskPend.trace = ""; taskPend.fmLoc = agvtask.SourceAddress.ToString(); taskPend.toLoc = agvtask.TargetAddress.ToString(); taskPend.udf01 = ""; taskPend.udf02 = ""; } data.detail.Add(taskPend); pend.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(pend); var respone = HttpHelper.Post(url, posy, headers: headers); var res = JsonConvert.DeserializeObject(respone); if (res.Code == 200) { agvtask.Dispatchertime = DateTime.Now; agvtask.TaskStatus = AGVTaskStatusEnum.AGV_SendOut.ObjToInt(); _taskService.UpdateData(agvtask); Thread.Sleep(1000); WriteLog.GetLog("无人叉车任务下发").Write("任务号:" + agvtask.TaskNum, "无人叉车任务下发"); } else { //_unitOfWorkManage.RollbackTran(); content = WebResponseContent.Instance.Error($"{res.msg}"); WriteLog.GetLog("无人叉车任务下发失败").Write("任务号:" + agvtask.TaskNum + '\n' + "失败信息" + res.msg, "无人叉车任务下发失败"); } } 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; } } }