huangxiaoqiang
2 天以前 2d9272bdcdbdbca81396a61493e4ef6a822dcf4a
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
@@ -37,6 +37,7 @@
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DeviceBase;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_SignalR;
using WIDESEAWCS_Tasks.ConveyorLineJob;
@@ -48,8 +49,6 @@
    public partial class CommonConveyorLineJob : JobBase, IJob
    {
        private readonly ITaskService _taskService;
        private readonly IRGVTaskService _rgvtaskService;
        private readonly IRGVTask_HtyService _rgvtask_HtyService;
        private readonly ITaskRepository _taskRepository;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly IRouterService _routerService;
@@ -58,12 +57,12 @@
        private readonly IDt_StationManagerRepository _stationManagerRepository;
        private readonly IMapper _mapper;
        private readonly ICacheService _cacheService;
        private readonly IDeviceInfoRepository _deviceInfoRepository;
        private readonly INoticeService _noticeService;
        private static List<string>? userTokenIds;
        private static List<int>? userIds;
        public CommonConveyorLineJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IDt_StationManagerService stationManagerService, IMapper mapper, ICacheService cacheService, INoticeService noticeService, ITaskRepository taskRepository, IRGVTaskService rgvtaskService, IRGVTask_HtyService rgvtask_HtyService,
        IDt_StationManagerRepository stationManagerRepository)
        public CommonConveyorLineJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IDt_StationManagerService stationManagerService, IMapper mapper, ICacheService cacheService, INoticeService noticeService, ITaskRepository taskRepository, IDt_StationManagerRepository stationManagerRepository, IDeviceInfoRepository deviceInfoRepository)
        {
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
@@ -73,9 +72,8 @@
            _cacheService = cacheService;
            _noticeService = noticeService;
            _taskRepository = taskRepository;
            _rgvtaskService = rgvtaskService;
            _rgvtask_HtyService = rgvtask_HtyService;
            _stationManagerRepository = stationManagerRepository;
            _deviceInfoRepository = deviceInfoRepository;
        }
        public async Task Execute(IJobExecutionContext context)
@@ -163,15 +161,9 @@
                var log = $"【{conveyorLine._deviceName}】站台【{station.stationChildCode}】请求取货";
                await LogAndWarn(conveyorLine.DeviceName, log);
                var task = _taskService.QueryConveyorLineTask(station.stationChildCode);
                //if (task != null)
                //{
                //    RequestInOrOutbound(command, conveyorLine, station, task);
                //}
                //else
                //{
                var task = _taskService.QueryConveyorLineTask(station.stationChildCode, command.TaskNum);
                    await HandleNewTaskAsync(conveyorLine, command, station.stationChildCode, task);
                //}
            }
            catch (Exception ex)
            {
@@ -186,18 +178,25 @@
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="command">读取的请求信息</param>
        /// <param name="childDeviceCode">子设备编号</param>
        public async Task ConveyorLineFinish(ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, Dt_StationManager station)
        public async Task ConveyorLineFinish(ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, Dt_StationManager stationManager)
        {
            try
            {
                // è¾“出信息,表示站台请求取货
                var log = $"【{conveyorLine._deviceName}】站台【{station.stationChildCode}】,任务号:【{command.TaskNum}】完成";
                var log = $"【{conveyorLine._deviceName}】站台【{stationManager.stationChildCode}】,任务号:【{command.TaskNum}】完成";
                await LogAndWarn(conveyorLine.DeviceName, log);
                var task = _taskService.QueryConveyorLineFinishTask(station.stationChildCode);
                var task = _taskService.QueryConveyorLineFinishTask(stationManager.stationChildCode, command.TaskNum);
                //改查询方法
                HandleFinishTaskAsync(conveyorLine, command, station.stationChildCode, task);
                if(stationManager.stationType==5||stationManager.stationType==4)
                {
                    // å¦‚果任务存在
                    if (task != null)
                    {
                        Thread.Sleep(1000);
                        _taskService.UpdateTaskStatusToNext(task);
                    }
                }
            }
            catch (Exception ex)
@@ -212,18 +211,8 @@
        /// <param name="command">读取的请求信息</param>
        /// <param name="childDeviceCode">子设备编号</param>
        /// <param name="ProtocalDetailValue">线体当前bool读取偏移地址</param>
        public void RequestInOrOutbound(ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, Dt_StationManager station,Dt_Task task)
        public void RequestNextAddress(ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, Dt_StationManager station, Dt_Task task)
        {
            try
            {
                // è¾“出成功信息,包括输送线名称、任务号、托盘条码和子设备代码,以及任务信息
                var logs = $"【{conveyorLine._deviceName}】任务号:【{task.TaskNum}】,托盘条码:【{task.PalletCode}】已到达【{station.stationChildCode}】输送线,task{task.ToJsonString()}";
                ConsoleHelper.WriteSuccessLine(logs);
                _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = logs, time = DateTime.Now.ToString("G"), color = "red" });
                WriteInfo(conveyorLine.DeviceName, logs);
                // å¦‚果任务不为空,则执行以下操作
                if (task != null)
                {
                    ConveyorLineTaskCommandWrite taskCommand = new ConveyorLineTaskCommandWrite()
@@ -233,8 +222,8 @@
                        WriteInteractiveSignal = task.TaskType == (int)TaskOutboundTypeEnum.Outbound ? (byte)Convert.ToSByte(2) : (byte)Convert.ToSByte(1)
                    };
                    // è¾“出成功信息,包括输送线名称、任务号、托盘条码、子设备代码和下一目标地址
                    var log = $"【{conveyorLine._deviceName}】任务号:【{command.TaskNum}】,托盘条码:【{command.Barcode}】已到达【{station.stationChildCode}】输送线请求出库,下一目标地址【{taskCommand.TargetAddress}】";
                var log = $"【{conveyorLine._deviceName}】任务号:【{task.TaskNum}】,托盘条码:【{task.PalletCode}】已到达【{station.stationChildCode}】下一目标地址【{taskCommand.TargetAddress}】输送线,task{task.ToJsonString()}";
                    ConsoleHelper.WriteSuccessLine(log);
                    _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" });
@@ -243,113 +232,12 @@
                    var result = SendCommand(taskCommand, conveyorLine, station.stationChildCode);
                    if (result)
                    {
                        _taskService.UpdateTaskStatusToNext(task);
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }
        /// <summary>
        /// è¾“送线请求出库下一地址
        /// </summary>
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="command">读取的请求信息</param>
        /// <param name="childDeviceCode">子设备编号</param>
        public void ConveyorLineInOrOutFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager station, Dt_Task task)
        {
            // æ‰“印成功日志,显示当前设备名称、任务号、托盘条码以及请求出库下一地址的子设备代码
            var log = $"【{conveyorLine._deviceName}】任务号:【{command.TaskNum}】,托盘条码:【{command.Barcode}】已到达【{station.stationChildCode}】输送线请求出库完成";
            ConsoleHelper.WriteSuccessLine(log);
            _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" });
            WriteInfo(conveyorLine.DeviceName, log);
            // å¦‚果任务存在
            if (task != null)
            {
                _taskService.UpdateTaskStatusToNext(task);
            }
        }
        /// <summary>
        /// è¾“送线请求出库下一地址
        /// </summary>
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="command">读取的请求信息</param>
        /// <param name="childDeviceCode">子设备编号</param>
        public void RequestNextAddress(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager station, Dt_Task task)
        {
            // æ‰“印成功日志,显示当前设备名称、任务号、托盘条码以及请求出库下一地址的子设备代码
            var log = $"【{conveyorLine._deviceName}】任务号:【{command.TaskNum}】,托盘条码:【{command.Barcode}】已到达【{station.stationChildCode}】输送线请求出库下一地址";
            ConsoleHelper.WriteSuccessLine(log);
            _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" });
            WriteInfo(conveyorLine.DeviceName, log);
            // å¦‚果任务存在
            if (task != null)
            {
                ConveyorLineTaskCommandWrite taskCommand = new ConveyorLineTaskCommandWrite()
                {
                    TaskNum = Convert.ToInt16(task.TaskNum),
                    TargetAddress = Convert.ToInt16(task.NextAddress),
                    WriteInteractiveSignal = task.TaskType == (int)TaskOutboundTypeEnum.Outbound ? (byte)Convert.ToSByte(2) : (byte)Convert.ToSByte(1)
                };
                // æ‰“印成功日志,显示当前设备名称、任务号、托盘条码、子设备代码以及下一目标地址
                var logs = $"【{conveyorLine._deviceName}】任务号:【{command.TaskNum}】,托盘条码:【{command.Barcode}】已到达【{station.stationChildCode}】输送线请求出库下一地址,下一目标地址【{taskCommand.TargetAddress}】";
                ConsoleHelper.WriteSuccessLine(logs);
                _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = logs, time = DateTime.Now.ToString("G"), color = "red" });
                WriteInfo(conveyorLine.DeviceName, logs);
                var result = SendCommand(taskCommand, conveyorLine, station.stationChildCode);
                if (result)
                {
                    Thread.Sleep(1000);
                    _taskService.UpdateTaskStatusToNext(task);
                }
            }
        }
        /// <summary>
        /// è¾“送线出库完成
        /// </summary>
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="command">读取的请求信息</param>
        /// <param name="childDeviceCode">子设备编号</param>
        public void ConveyorLineOutFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager station,Dt_Task task)
        {
            try
            {
                // æ‰“印成功信息,表示托盘已到达指定输送线并完成出库
                var logs = $"【{conveyorLine.DeviceName}】任务号:【{command.TaskNum}】,托盘条码:【{command.Barcode}】已到达【{station.stationChildCode}】输送线出库完成";
                ConsoleHelper.WriteSuccessLine(logs);
                _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = logs, time = DateTime.Now.ToString("G"), color = "red" });
                WriteInfo(conveyorLine.DeviceName, logs);
                ConveyorLineTaskCommandWrite taskCommand = new ConveyorLineTaskCommandWrite()
                {
                    TaskNum = 100,
                    TargetAddress = Convert.ToInt16(station.stationNextChildCode),
                    WriteInteractiveSignal = (byte)Convert.ToSByte(3)
                };
                var result = SendCommand(taskCommand, conveyorLine, station.stationChildCode);
            }
            catch (Exception ex)
            {
            }
        }
        /// <summary>
        /// è¾“送线报警
        /// </summary>
@@ -362,7 +250,7 @@
            var task = _taskRepository.QueryFirst(x => x.TaskNum == command.TaskNum);
            conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal,Convert.ToSByte(3), station.stationChildCode);
            //conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal,Convert.ToSByte(3), station.stationChildCode);
        }
        public async Task LogAndWarn(string deviceName, string log, string color = "red")
@@ -374,35 +262,13 @@
        public bool SendCommand(ConveyorLineTaskCommandWrite taskCommand, CommonConveyorLine conveyorLine, string childDeviceCode)
        {
            conveyorLine.SetValue(ConveyorLineDBName.ConveyorLineTargetAddress, Convert.ToInt16(taskCommand.TargetAddress), childDeviceCode);
            conveyorLine.SetValue(ConveyorLineDBName.WriteConveyorLineTargetAddress, Convert.ToInt16(taskCommand.TargetAddress), childDeviceCode);
            Thread.Sleep(100);
            conveyorLine.SetValue(ConveyorLineDBName.ConveyorLineTaskNum, Convert.ToInt16(taskCommand.TaskNum), childDeviceCode);
            conveyorLine.SetValue(ConveyorLineDBName.WriteConveyorLineTaskNum, Convert.ToInt16(taskCommand.TaskNum), childDeviceCode);
            Thread.Sleep(100);
            conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, Convert.ToSByte(taskCommand.WriteInteractiveSignal), childDeviceCode);
            for (int i = 0; i < 6; i++)
            {
                ConveyorLineTaskCommand command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand>(childDeviceCode);
                if (command != null)
                {
                    if (command.TaskNum == taskCommand.TaskNum && command.TargetAddress == taskCommand.TargetAddress)
                    {
                        WriteInfo(conveyorLine.DeviceName, $"写入任务成功写入次数{i}写入任务【{JsonConvert.SerializeObject(taskCommand)}】");
                        return true;
                    }
                    if (command.TargetAddress != taskCommand.TargetAddress)
                    {
                        conveyorLine.SetValue(ConveyorLineDBName.ConveyorLineTargetAddress, Convert.ToInt16(taskCommand.TargetAddress), childDeviceCode);
                        Thread.Sleep(100);
                    }
                    if (command.TaskNum != taskCommand.TaskNum)
                    {
                        conveyorLine.SetValue(ConveyorLineDBName.ConveyorLineTaskNum, taskCommand.TaskNum, childDeviceCode); Thread.Sleep(100);
                    }
                }
            }
            WriteInfo(conveyorLine.DeviceName, $"写入任务失败任务号【{taskCommand.TaskNum}】托盘号【{taskCommand.Barcode}】目标地址【{taskCommand.TargetAddress}】当前节点【{childDeviceCode}】");
            return false;
            return true;
        }
    }
}