wankeda
2025-06-24 1caea0fdc7ed1788d854a2aba8853984b4494e01
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/PartialTaskService_AGV.cs
@@ -1,18 +1,31 @@
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"];
        /// <summary>
        /// ç«‹åº“出库AGV搬运
        /// </summary>
@@ -82,7 +95,7 @@
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
@@ -121,7 +134,7 @@
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
}
        }
        private Dt_CachePoint GetCachePointByStartPoint(string startPoint)
        {
@@ -191,5 +204,445 @@
            return new { code = 200, message = "成功" };
        }
        /// <summary>
        /// æŸ¥è¯¢AGV新建任务
        /// </summary>
        /// <returns></returns>
        public List<Dt_Task> GetTasks()
        {
            WebResponseContent content = new WebResponseContent();
            //Expression<Func<Dt_Task, bool>> expressionOrder = x => true;
            return BaseDal.QueryData(x => x.TaskStatus == AGVTaskStatusEnum.AGV_New.ObjToInt() || x.TaskStatus == AGVTaskStatusEnum.AGV_Wait.ObjToInt()).ToList();
        }
        /// <summary>
        /// æŸ¥è¯¢åŽŸææ–™å‡ºåº“ä»»åŠ¡
        /// </summary>
        /// <returns></returns>
        public Dt_Task GetTasksout()
        {
            WebResponseContent content = new WebResponseContent();
            //Expression<Func<Dt_Task, bool>> expressionOrder = x => true;
            return BaseDal.QueryFirst(x => x.TaskType == TaskTypeEnum.Outbound.ObjToInt() && x.SourceAddress.Contains("原材料") && x.TaskStatus == AGVTaskStatusEnum.AGV_Query.ObjToInt());
        }
        /// <summary>
        /// æŸ¥è¯¢æˆå“æœ‰è´§è´§ä½
        /// </summary>
        /// <returns></returns>
        public Dt_CachePoint GetTasksoin()
        {
            WebResponseContent content = new WebResponseContent();
            Expression<Func<Dt_CachePoint, bool>> expressionOrder = x => true;
            return _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode.Contains("成品库") && x.PointStatus == LocationStatusEnum.InStock.ObjToInt());
        }
        /// <summary>
        /// AGV告警反馈
        /// </summary>
        /// <param name="saveModel"></param>
        /// <returns></returns>
        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;
        }
        /// <summary>
        /// å‰è½¦æŠ¥è­¦
        /// </summary>
        /// <returns></returns>
        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;
        }
        /// <summary>
        /// ä»»åŠ¡å®Œæˆ
        /// </summary>
        /// <param name="feedback"></param>
        /// <returns></returns>
        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);
                HCJFree(task, TaskStatus);
                BaseDal.DeleteData(task);
                WriteLog.GetLog("无人叉车任务取消").Write("任务号:" + task.TaskNum, "无人叉车任务取消");
            }
            else if (taskState == 91)
            {
                int TaskStatus = AGVTaskStatusEnum.AGV_Fail.ObjToInt();
                _taskHtyService.AddTaskHty(task, TaskStatus);
                HCJFree(task, TaskStatus);
                BaseDal.DeleteData(task);
            }
            else if (taskState == 93)
            {
                int TaskStatus = AGVTaskStatusEnum.AGV_Complete.ObjToInt();
                if (task.SourceAddress.Contains("原材料库"))
                {
                    HCJCope(task, TaskStatus);
                }
                BaseDal.UpdateData(task);
            }
            else if (taskState == 60)
            {
                task.TaskStatus = AGVTaskStatusEnum.AGV_Executing.ObjToInt();
                BaseDal.UpdateData(task);
            }
        }
        /// <summary>
        /// æ’¤é”€å·²ä¸‹å‘任务
        /// </summary>
        /// <param name="taskNum">任务号</param>
        /// <returns>返回处理结果</returns>
        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 + "&timestamp=" + 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(taskrevoke);
                var respone = HttpHelper.Post(url1, posy, headers: headers);
                var res = JsonConvert.DeserializeObject<WebResponseContent>(respone);
                if (res.success)
                {
                    return WebResponseContent.Instance.OK();
                }
                else
                {
                    return WebResponseContent.Instance.Error(res.msg);
                }
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// ç»§ç»­ä»»åŠ¡
        /// </summary>
        /// <param name="tasknum"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        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 + "&timestamp=" + 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(taskCont);
                var respone = HttpHelper.Post(url1, posy, headers: headers);
                var res = JsonConvert.DeserializeObject<WebResponseContent>(respone);
                if (res.success)
                {
                    return WebResponseContent.Instance.OK();
                }
                else
                {
                    return WebResponseContent.Instance.Error(res.msg);
                }
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// å®Œæˆä»»åŠ¡
        /// </summary>
        /// <param name="tasknum"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        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 + "&timestamp=" + 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(taskEnd);
                var respone = HttpHelper.Post(url1, posy, headers: headers);
                var res = JsonConvert.DeserializeObject<WebResponseContent>(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);
            }
        }
        /// <summary>
        /// æš‚停任务
        /// </summary>
        /// <param name="tasknum"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        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<WebResponseContent>(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);
            }
        }
        /// <summary>
        /// æ¢å¤ä»»åŠ¡
        /// </summary>
        /// <param name="tasknum"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        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<WebResponseContent>(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;
        }
    }
}