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 List GetTasks()
{
WebResponseContent content = new WebResponseContent();
//Expression> expressionOrder = x => true;
return BaseDal.QueryData(x => x.TaskStatus == AGVTaskStatusEnum.AGV_New.ObjToInt()).ToList();
}
///
/// 查询原材料出库任务
///
///
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;
}
}
}