1
huangxiaoqiang
2025-07-28 a79345cfd28611ba602d474b122d354d627bd72c
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -23,6 +23,9 @@
using WIDESEAWCS_Common;
using WIDESEAWCS_IBasicInfoRepository;
using WIDESEAWCS_BasicInfoService;
using WIDESEAWCS_Model.BasicInfo;
using WIDESEAWCS_Tasks.RGVJob;
using WIDESEAWCS_Tasks.ConveyorLineJob;
namespace WIDESEAWCS_Tasks
{
@@ -55,13 +58,18 @@
                CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams");
                if (commonStackerCrane != null)
                {
                    if (!commonStackerCrane.IsEventSubscribed)
                    //if (!commonStackerCrane.IsEventSubscribed)
                    //{
                    //    commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                    //}
                    //commonStackerCrane.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                    if (commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.TaskCompleted))
                    {
                        commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                        var x = commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.CurrentTaskNum);
                        StackerCraneTaskFinish(commonStackerCrane, commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.CurrentTaskNum));
                    }
                    commonStackerCrane.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                    if (commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Automatic) && !commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Fault) && !commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Running))
                    {
@@ -109,12 +117,12 @@
                        Automatic = commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Automatic),
                        Fault = commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Fault),
                        Running = commonStackerCrane.GetValue<StackerCraneDBName, bool>(StackerCraneDBName.Running),
                        commonStackerCrane.StackerCraneAutoStatusDes,
                        commonStackerCrane.StackerCraneWorkStatusDes,
                        commonStackerCrane.DeviceCode,
                        commonStackerCrane.DeviceName,
                        commonStackerCrane.CurrentTaskNum,
                        commonStackerCrane.LastTaskNum,
                        //commonStackerCrane.StackerCraneAutoStatusDes,
                        //commonStackerCrane.StackerCraneWorkStatusDes,
                        //commonStackerCrane.DeviceCode,
                        //commonStackerCrane.DeviceName,
                        //commonStackerCrane.CurrentTaskNum,
                        //commonStackerCrane.LastTaskNum,
                    };
                    _noticeService.StackerData(userIds?.FirstOrDefault(), userTokenIds, new { commonStackerCrane.DeviceName, data = obj });
@@ -153,6 +161,27 @@
                    str = $"{commonStackerCrane.DeviceName}】WMS|WCS任务完成:【{content.Status}】,堆垛机完成信号写入:【{isWorkType}】,任务号:【{e.TaskNum}】时间【{DateTime.Now}】";
                    WriteInfo(commonStackerCrane.DeviceName, str);
                    ConsoleHelper.WriteColorLine(str, ConsoleColor.Blue);
                }
            }
        }
        public void StackerCraneTaskFinish(CommonStackerCrane commonStackerCrane, int TaskNum)
        {
            if (commonStackerCrane != null)
            {
                #region æ—¥å¿—记录
                ConsoleHelper.WriteColorLine($"【{commonStackerCrane.DeviceName}】堆垛机作业状态:【】时间【{DateTime.Now}】", ConsoleColor.Magenta);
                string str = $"【{commonStackerCrane.DeviceName}】任务完成,任务号:【{TaskNum}】时间【{DateTime.Now}】";
                WriteInfo(commonStackerCrane.DeviceName, str);
                ConsoleHelper.WriteColorLine(str, ConsoleColor.Blue);
                #endregion
                var task = _taskRepository.QueryFirst(x => x.TaskNum == TaskNum);
                if (task != null)
                {
                    var content = _taskService.StackCraneTaskCompleted(TaskNum);
                }
            }
        }
@@ -227,12 +256,12 @@
        /// <returns>如果未被占用,返回传入的任务信息,否则,返回null</returns>
        private Dt_Task? OutTaskStationIsOccupied([NotNull] Dt_Task task)
        {
            var stationinfo = _stationManagerRepository.QueryFirst(x => x.stationLocation == task.TargetAddress && x.Roadway == task.Roadway);
            var stationinfo = _stationManagerRepository.QueryFirst(x => x.stationChildCode==task.NextAddress && x.Roadway == task.Roadway);
            IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationinfo.stationPLC);
            if (device != null)
            {
                CommonConveyorLine_After conveyorLine = (CommonConveyorLine_After)device;
                if (conveyorLine.IsOccupied(stationinfo.stationChildCode))//出库站台未被占用
                CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
                if (conveyorLine.IsOccupiedx(stationinfo.stationChildCode))//出库站台未被占用
                {
                    return task;
                }
@@ -289,21 +318,31 @@
            StackerCraneTaskCommand stackerCraneTaskCommand = new StackerCraneTaskCommand();
            stackerCraneTaskCommand.TaskNum = (byte)Convert.ToSByte(task.TaskNum);
            stackerCraneTaskCommand.WorkType = 1;
            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//判断是否是入库任务
            {
                List<Dt_Router> routers = _routerService.QueryNextRoutes(task.CurrentAddress, task.Roadway);
                if (routers.Count > 0)
                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.Roadway == task.Roadway && x.stationChildCode == task.CurrentAddress);
                if (stationManager != null)
                {
                    stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(Convert.ToInt16(routers.FirstOrDefault().SrmRow));
                    stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(routers.FirstOrDefault().SrmColumn);
                    stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(routers.FirstOrDefault().SrmLayer);
                    stackerCraneTaskCommand.WorkType = (byte)Convert.ToSByte(17);
                    string[] sourceCodes = stationManager.stationLocation.Split("-");
                    if (sourceCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(sourceCodes[0]);
                        stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(sourceCodes[1]);
                        stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(sourceCodes[2]);
                    }
                    else
                    {
                        //数据配置错误
                        _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"入库任务终点错误,起点:【{task.NextAddress}】");
                        return null;
                    }
                    string[] targetCodes = task.NextAddress.Split("-");
                    string[] targetCodes = task.TargetAddress.Split("-");
                    if (targetCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(Convert.ToInt16(targetCodes[0]) % 2 != 0 ? (short)1 : (short)2);
                        stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(targetCodes[0]);
                        stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[1]);
                        stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[2]);
                    }
@@ -322,20 +361,29 @@
            }
            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
            {
                List<Dt_Router> routers = _routerService.QueryNextRoutes(task.Roadway, task.TargetAddress);
                if (routers.Count > 0)
                stackerCraneTaskCommand.WorkType = (byte)Convert.ToSByte(18);
                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.Roadway == task.Roadway && x.stationChildCode == task.NextAddress);
                if (stationManager != null)
                {
                    stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(routers.FirstOrDefault().SrmRow);
                    stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(routers.FirstOrDefault().SrmColumn);
                    stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(routers.FirstOrDefault().SrmLayer);
                    string[] sourceCodes = task.CurrentAddress.Split("-");
                    if (sourceCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(Convert.ToInt16(sourceCodes[0]) % 2 != 0 ? (short)1 : (short)2);
                        stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(sourceCodes[0]);
                        stackerCraneTaskCommand.StartColumn = (byte)Convert.ToSByte(sourceCodes[1]);
                        stackerCraneTaskCommand.StartLayer = (byte)Convert.ToSByte(sourceCodes[2]);
                    }
                    else
                    {
                        //数据配置错误
                        _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"出库任务起点错误,起点:【{task.CurrentAddress}】");
                        return null;
                    }
                    string[] targetCodes = stationManager.stationLocation.Split("-");
                    if (targetCodes.Length == 3)
                    {
                        stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(targetCodes[0]);
                        stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[1]);
                        stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[2]);
                    }
                    else
                    {
@@ -352,20 +400,8 @@
            }
            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
            {
                string[] targetCodes = task.NextAddress.Split("-");
                if (targetCodes.Length == 3)
                {
                    stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(Convert.ToInt16(targetCodes[0]) % 2 != 0 ? (short)1 : (short)2);
                    stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[1]);
                    stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[2]);
                }
                else
                {
                    //数据配置错误
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务终点错误,起点:【{task.NextAddress}】");
                    return null;
                }
                string[] sourceCodes = task.CurrentAddress.Split("-");
                stackerCraneTaskCommand.WorkType = (byte)Convert.ToSByte(20);
                string[] sourceCodes = task.SourceAddress.Split("-");
                if (sourceCodes.Length == 3)
                {
                    stackerCraneTaskCommand.StartRow = (byte)Convert.ToSByte(Convert.ToInt16(sourceCodes[0]) % 2 != 0 ? (short)1 : (short)2);
@@ -378,6 +414,19 @@
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务起点错误,起点:【{task.CurrentAddress}】");
                    return null;
                }
                string[] targetCodes = task.TargetAddress.Split("-");
                if (targetCodes.Length == 3)
                {
                    stackerCraneTaskCommand.EndRow = (byte)Convert.ToSByte(Convert.ToInt16(targetCodes[0]) % 2 != 0 ? (short)1 : (short)2);
                    stackerCraneTaskCommand.EndColumn = (byte)Convert.ToSByte(targetCodes[1]);
                    stackerCraneTaskCommand.EndLayer = (byte)Convert.ToSByte(targetCodes[2]);
                }
                else
                {
                    //数据配置错误
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"移库任务终点错误,起点:【{task.NextAddress}】");
                    return null;
                }
            }
            return stackerCraneTaskCommand;
        }