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<Dt_Task> 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<string, string> headers = new Dictionary<string, string>()
|
{
|
{"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<WebResponseContent>(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;
|
}
|
}
|
|
}
|