yanjinhui
6 天以前 aeb971fe12b73d83d31a83b00f0a6e2876b24a00
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task/HKTaskExtend.cs
@@ -1,6 +1,8 @@
using System;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
@@ -47,103 +49,204 @@
        {
            foreach (var item in tasks)
            {
                if (item.TaskState == (int)TaskTypeEnum.Q3CK)
                // å‡ºåº“任务处理 (从1楼出库到6楼)
                if (item.TaskType == (int)TaskTypeEnum.Q3CK || item.TaskType == (int)TaskTypeEnum.Q3RK)
                {
                    // è°ƒç”¨æŽ¥å£èŽ·å–å°è½¦ä¿¡æ¯
                    var result = _agvcartInfoService.CheckTheCar();
                    // åˆ¤æ–­æ˜¯å¦æœ‰ AA æˆ– FF
                    bool hasAAOrFF = false;
                    if (item.TaskState == (int)TaskTypeEnum.Q3CK)
                    var result = _agvcartInfoService.CheckTheCar("MR-Q3-600LE-D(M)(YWGP)");
                    if (result != null && result.Status)
                    {
                        if (result != null && result.Status)
                        var dataList = result.Data as List<HIKROBOTQueryData>;
                        if (dataList != null && dataList.Any())
                        {
                            var dataList = result.Data as List<HIKROBOTQueryData>;
                            if (dataList != null && dataList.Any())
                            // å‡ºåº“任务:检查是否有在1楼(AA)的小车
                            // Q3CK æ˜¯AA→FF的跨楼层任务,只能使用专用小车
                            var code = item.TaskType == (int)TaskTypeEnum.Q3CK ? "AA" : "FF";
                            var specialCarInAA = dataList.FirstOrDefault(d => d.mapCode == code);
                            if (specialCarInAA != null)
                            {
                                // æ£€æŸ¥è¿”回的 mapCode åˆ—表中是否有 AA
                                hasAAOrFF = dataList.Any(d => d.mapCode == "AA");
                                if (hasAAOrFF)
                                // æœ‰åœ¨1楼的小车,直接执行任务
                                var content = _taskService.SendHIKROBOTTask(item);
                                if (content.Status)
                                {
                                    var content = _taskService.SendHIKROBOTTask(item);
                                    item.TaskState = (int)TaskStatusEnum.Execut;
                                }
                                else//这里我就要呼叫空车来
                            }
                            else
                            {
                                // æ²¡æœ‰ä¸“用小车在1楼,需要呼叫专用小车来到1楼
                                var anySpecialCar = dataList.FirstOrDefault();
                                if (anySpecialCar != null)
                                {
                                    //添加空车运输任务
                                    AddAGVCartInfo(item);
                                    item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition;
                                    // èµ·ç‚¹ï¼šå°è½¦å½“前所在楼层的点位,目标:1楼点位
                                    var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, code);
                                    if (callCarResult.Status)
                                    {
                                        // åŽŸä»»åŠ¡çŠ¶æ€æ”¹ä¸ºç­‰å¾…ç©ºè½¦
                                        item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition;
                                    }
                                }
                                else
                                {
                                    item.ExceptionMessage = "未找到可用AGV小车";
                                }
                            }
                        }
                    }
                    else
                    {
                        if (result != null && result.Status)
                        item.ExceptionMessage = "获取AGV小车信息失败";
                    }
                }
                else if (item.TaskType == (int)TaskTypeEnum.F01)
                {
                    // F01任务处理:根据目标地址判断需要哪个楼层的小车
                    var result = _agvcartInfoService.CheckTheCar("MR-Q3-600LE-D(M)");
                    if (result != null && result.Status)
                    {
                        var dataList = result.Data as List<HIKROBOTQueryData>;
                        if (dataList != null && dataList.Any())
                        {
                            if (hasAAOrFF)
                            // ä»Žä»»åŠ¡çš„èµ·å§‹åœ°å€ä¸­æå–éœ€è¦çš„æ¥¼å±‚ä»£ç 
                            string requiredMapCode = GetMapCodeFromAddress(item.SourceAddress);
                            if (string.IsNullOrEmpty(requiredMapCode))
                            {
                                var content = _taskService.SendHIKROBOTTask(item);
                                item.TaskState = (int)TaskStatusEnum.Execut;
                                item.ExceptionMessage = $"无法从目标地址 {item.SourceAddress} ä¸­è¯†åˆ«æ¥¼å±‚信息";
                                _taskService.UpdateData(item);
                                continue;
                            }
                            else//这里我就要呼叫空车来
                            // æ£€æŸ¥æ˜¯å¦æœ‰åœ¨ç›®æ ‡æ¥¼å±‚的小车
                            var hasRequiredCar = dataList.FirstOrDefault(d => d.mapCode == requiredMapCode);
                            if (hasRequiredCar != null)
                            {
                                //添加空车运输任务
                                AddAGVCartInfo(item);
                                item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition;
                                // æœ‰åœ¨ç›®æ ‡æ¥¼å±‚的小车,直接执行任务
                                var content = _taskService.SendHIKROBOTTask(item);
                                if (content.Status)
                                {
                                    item.TaskState = (int)TaskStatusEnum.Execut;
                                }
                            }
                            else
                            {
                                // æ²¡æœ‰ç›®æ ‡æ¥¼å±‚的小车,需要呼叫空车从当前位置到目标楼层
                                var anySpecialCar = dataList.FirstOrDefault(d => d.CarType == "MR-Q3-600LE-D(M)");
                                if (anySpecialCar != null)
                                {
                                    var callCarResult = AddAGVCartInfo(item, anySpecialCar.mapCode, requiredMapCode);
                                    if (callCarResult.Status)
                                    {
                                        item.TaskState = (int)TaskStatusEnum.WaitingHkAGVMovePosition;
                                    }
                                }
                                else
                                {
                                    item.ExceptionMessage = "未找到可用AGV小车";
                                }
                            }
                        }
                    }
                }
                _taskService.UpdateData(item);
            }
            _taskService.UpdateData(tasks);
        }
        #endregion
        #region å¤„理海康agv搬运任务
        public WebResponseContent AddAGVCartInfo(Dt_Task task)
        /// <summary>
        /// åˆ›å»ºç©ºè½¦å‘¼å«ä»»åŠ¡ï¼šæ ¹æ®å°è½¦å½“å‰ä½ç½®å’Œç›®æ ‡æ¥¼å±‚ï¼Œè®¾ç½®ä»»åŠ¡çš„èµ·ç‚¹ã€å½“å‰ä½ç½®å’Œç›®æ ‡ç‚¹ï¼Œå¹¶ä¸‹å‘ç»™æµ·åº·æŽ¥å£
        /// </summary>
        /// <param name="task"></param>
        /// <param name="currentMapCode">当前位置</param>
        /// <param name="targetMapCode">目标地址</param>
        /// <returns></returns>
        public WebResponseContent AddAGVCartInfo(Dt_Task task, string currentMapCode, string targetMapCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                task.TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum));
                task.WMSTaskNum = null;
                task.TaskType = (int)TaskTypeEnum.Move;//换层任务
                task.TaskState = (int)TaskStatusEnum.CallingHKtransportation;
                var result = _taskService.SendHIKROBOTTask(task);
                _taskService.AddData(task);
                // èŽ·å–èµ·ç‚¹æ¥¼å±‚ä¿¡æ¯
                if (!FloorMapping.FloorMap.ContainsKey(currentMapCode))
                {
                    content.Error($"无效的起点楼层代码:{currentMapCode}");
                    return content;
                }
                // èŽ·å–ç›®æ ‡æ¥¼å±‚ä¿¡æ¯
                if (!FloorMapping.FloorMap.ContainsKey(targetMapCode))
                {
                    content.Error($"无效的目标楼层代码:{targetMapCode}");
                    return content;
                }
                var currentFloorInfo = FloorMapping.FloorMap[currentMapCode];
                var targetFloorInfo = FloorMapping.FloorMap[targetMapCode];
                // è®¾ç½®ä»»åŠ¡ä¿¡æ¯
                //task.SourceAddress = currentFloorInfo.PointCode;  // èµ·ç‚¹ï¼šå°è½¦å½“前位置的点位
                //task.CurrentAddress = currentFloorInfo.PointCode; // å½“前位置:小车当前位置的点位
                //task.TargetAddress = targetFloorInfo.PointCode;   // ç›®æ ‡ç‚¹ï¼šç›®æ ‡æ¥¼å±‚点位
                //task.NextAddress = targetFloorInfo.PointCode; // è®°å½•目标楼层代码
                Dt_Task newTask = new Dt_Task
                {
                    WMSTaskNum = "HK_" + task.WMSTaskNum, // ç”Ÿæˆå”¯ä¸€çš„WMS任务号
                    TaskNum = _taskService.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                    SourceAddress = currentFloorInfo.PointCode,
                    CurrentAddress = currentFloorInfo.PointCode,
                    TargetAddress = targetFloorInfo.PointCode,
                    NextAddress = targetFloorInfo.PointCode,
                    TaskType = (int)TaskTypeEnum.MOVE,
                    Grade = task.Grade,
                    PalletCode = "",
                    TaskState = (int)TaskStatusEnum.CallingHKtransportation,
                    // å¤åˆ¶å…¶ä»–必要字段
                    CreateDate = DateTime.Now,
                    Creater = "System"
                };
                var result = _taskService.SendHIKROBOTTask(newTask);
                if (result.Status)
                {
                    _taskService.AddData(newTask);  // æ·»åŠ æ–°ä»»åŠ¡
                    content.OK("空车呼叫任务创建成功", newTask);
                }
                else
                {
                    content.Error("空车呼叫任务下发失败");
                }
                return content;
            }
            catch (Exception ex)
            {
                content.Error($"创建失败:{ex.Message}");
                content.Error($"创建空车呼叫任务失败:{ex.Message}");
            }
            return content;
        }
        #endregion
        #region å¤„理agv待空车搬运任务
        public void SendHKWaitTask()
        public void SendHKWaitTask(List<Dt_Task> Tasks)
        {
            try
            {
                List<Dt_Task> reslut = _taskService.Repository.QueryData(x => x.TaskType == (int)TaskTypeEnum.Move);
                if (reslut.Count<0)
                List<Dt_Task> Uptasks = new List<Dt_Task>();
                foreach (var item in Tasks)
                {
                    foreach (var item in reslut)
                    var content = _taskService.SendHIKROBOTTask(item);
                    if (content.Status)
                    {
                        var content = _taskService.SendHIKROBOTTask(item);
                    }
                    reslut.ForEach(x =>
                    {
                        x.TaskState =(int)TaskStatusEnum.Execut;
                    });
                        item.TaskState = (int)TaskStatusEnum.Execut;
                        Uptasks.Add(item);
                    }
                }
                _taskService.UpdateData(reslut);
                _taskService.UpdateData(Uptasks);
            }
            catch (Exception ex)
            {
@@ -151,5 +254,29 @@
            }
        }
        #endregion
        /// <summary>
        /// ä»Žåœ°å€ä¸­æå–楼层代码(AA、BB、CC、DD、EE、FF)
        /// </summary>
        /// <param name="address">点位地址</param>
        /// <returns>楼层代码</returns>
        private string GetMapCodeFromAddress(string address)
        {
            if (string.IsNullOrEmpty(address))
                return null;
            // åœ°å€æ ¼å¼ç¤ºä¾‹ ï¼šAA å¯¹åº” 0339050AA0309145
            // keys æ˜¯ AA、BB、CC、DD、EE、FF,vule是对应的点位信息
            foreach (var floorCode in FloorMapping.FloorMap.Keys)
            {
                if (address.Contains(floorCode))
                {
                    return floorCode;//返回的就是AA、BB、CC、DD、EE、FF中的一个,代表对应的楼层
                }
            }
            return null;
        }
    }
}