| | |
| | | #region << 版 本 注 释 >> |
| | | #region << 版 本 注 释 >> |
| | | |
| | | /*---------------------------------------------------------------- |
| | | * 命名空间:WIDESEAWCS_Tasks.ConveyorLineJob |
| | | * 创建者:胡童庆 |
| | | * 创建时间:2024/8/2 16:13:36 |
| | | * 版本:V1.0.0 |
| | | * 描述: |
| | | * 命名空间:WIDESEAWCS_Tasks.ConveyorLineJob |
| | | * 创建者:胡童庆 |
| | | * 创建时间:2024/8/2 16:13:36 |
| | | * 版本:V1.0.0 |
| | | * 描述: |
| | | * |
| | | * ---------------------------------------------------------------- |
| | | * 修改人: |
| | | * 修改时间: |
| | | * 版本:V1.0.1 |
| | | * 修改说明: |
| | | * 修改人: |
| | | * 修改时间: |
| | | * 版本:V1.0.1 |
| | | * 修改说明: |
| | | * |
| | | *----------------------------------------------------------------*/ |
| | | |
| | | #endregion << 版 本 注 释 >> |
| | | #endregion << 版 本 注 释 >> |
| | | |
| | | using AutoMapper; |
| | | using System.Data; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.Helper; |
| | |
| | | private readonly IRouterService _routerService; |
| | | private readonly IMapper _mapper; |
| | | |
| | | private readonly ConveyorLineTaskFilter _taskFilter; |
| | | private readonly ConveyorLineTargetAddressSelector _targetAddressSelector; |
| | | |
| | | public ConveyorLineDispatchHandler(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper) |
| | | { |
| | | _taskService = taskService; |
| | | _taskExecuteDetailService = taskExecuteDetailService; |
| | | _routerService = routerService; |
| | | _mapper = mapper; |
| | | |
| | | _taskFilter = new ConveyorLineTaskFilter(taskService); |
| | | _targetAddressSelector = new ConveyorLineTargetAddressSelector(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 心跳处理 |
| | | /// 心跳处理 |
| | | /// </summary> |
| | | /// <param name="conveyorLine"></param> |
| | | /// <param name="command"></param> |
| | | /// <param name="childDeviceCode"></param> |
| | | public void HeartBeat(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode) |
| | | { |
| | | //心跳处理逻辑 |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, 0, childDeviceCode); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 输送线请求入库 |
| | | /// 输送线请求入库 |
| | | /// </summary> |
| | | /// <param name="conveyorLine">输送线实例对象</param> |
| | | /// <param name="command">读取的请求信息</param> |
| | | /// <param name="childDeviceCode">子设备编号</param> |
| | | public void RequestInbound(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode) |
| | | { |
| | | if (_taskService.RequestWMSTask(command.Barcode, childDeviceCode).Status) |
| | | if (_taskFilter.RequestWmsTask(command.Barcode, childDeviceCode)) |
| | | { |
| | | Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); |
| | | Dt_Task? task = _taskFilter.QueryPendingTask(conveyorLine.DeviceCode, childDeviceCode); |
| | | if (task != null) |
| | | { |
| | | ConveyorLineTaskCommandNew taskCommand = _mapper.Map<ConveyorLineTaskCommandNew>(task); |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 输送线请求入库下一地址 |
| | | /// 输送线请求入库下一地址 |
| | | /// </summary> |
| | | /// <param name="conveyorLine">输送线实例对象</param> |
| | | /// <param name="command">读取的请求信息</param> |
| | | /// <param name="childDeviceCode">子设备编号</param> |
| | | public void RequestInNextAddress(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode) |
| | | { |
| | | Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNo, childDeviceCode); |
| | | if (task != null) |
| | | Dt_Task? task = _taskFilter.QueryExecutingTask(command.TaskNo, childDeviceCode); |
| | | if (task == null) |
| | | { |
| | | const string ConstraintMachineName = "拘束机"; |
| | | const string PinMachineName = "插拔钉机"; |
| | | return; |
| | | } |
| | | |
| | | var devices = Storage.Devices; |
| | | _targetAddressSelector.HandleInboundNextAddress(conveyorLine, task.NextAddress, childDeviceCode); |
| | | |
| | | if (string.Equals(task.NextAddress, ConstraintMachineName, StringComparison.Ordinal)) |
| | | Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress); |
| | | if (newTask != null) |
| | | { |
| | | if (_taskService.UpdateTaskStatusToNext(newTask).Status && newTask.TaskState == (int)TaskInStatusEnum.Line_InFinish) |
| | | { |
| | | ConstraintMachine? constraint = devices.OfType<ConstraintMachine>().FirstOrDefault(d => d.DeviceName == ConstraintMachineName); |
| | | if (constraint == null) return; |
| | | |
| | | ProcessDeviceRequest(conveyorLine, constraint, childDeviceCode, |
| | | () => constraint.GetValue<ConstraintMachineDBName, bool>(ConstraintMachineDBName.MaterialRequestUpper), |
| | | () => constraint.GetValue<ConstraintMachineDBName, bool>(ConstraintMachineDBName.OutputRequestUpper), |
| | | outputReq => constraint.SetValue(ConstraintMachineDBName.ConstraintTrayOutputReadyUpper, outputReq ? 1 : 0)); |
| | | } |
| | | else if (string.Equals(task.NextAddress, PinMachineName, StringComparison.Ordinal)) |
| | | { |
| | | PinMachine? pinMachine = devices.OfType<PinMachine>().FirstOrDefault(d => d.DeviceName == PinMachineName); |
| | | if (pinMachine == null) return; |
| | | |
| | | ProcessDeviceRequest(conveyorLine, pinMachine, childDeviceCode, |
| | | () => pinMachine.GetValue<PinMachineDBName, bool>(PinMachineDBName.MaterialRequestUpper), |
| | | () => pinMachine.GetValue<PinMachineDBName, bool>(PinMachineDBName.OutputRequestUpper), |
| | | outputReq => pinMachine.SetValue(PinMachineDBName.PlugPinTrayOutputReadyUpper, outputReq ? 1 : 0)); |
| | | } |
| | | |
| | | Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress); |
| | | if (newTask != null) |
| | | { |
| | | if (_taskService.UpdateTaskStatusToNext(newTask).Status && newTask.TaskState == (int)TaskInStatusEnum.Line_InFinish) |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_STB, 1, childDeviceCode); |
| | | } |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_STB, 1, childDeviceCode); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 输送线入库完成 |
| | | /// 输送线入库完成 |
| | | /// </summary> |
| | | /// <param name="conveyorLine">输送线实例对象</param> |
| | | /// <param name="command">读取的请求信息</param> |
| | | /// <param name="childDeviceCode">子设备编号</param> |
| | | public void ConveyorLineInFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode) |
| | | { |
| | | Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNo, childDeviceCode); |
| | | Dt_Task? task = _taskFilter.QueryExecutingTask(command.TaskNo, childDeviceCode); |
| | | if (task != null) |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode); |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 输送线请求出信息 |
| | | /// 输送线请求出信息 |
| | | /// </summary> |
| | | /// <param name="conveyorLine">输送线实例对象</param> |
| | | /// <param name="command">读取的请求信息</param> |
| | | /// <param name="childDeviceCode">子设备编号</param> |
| | | public void RequestOutbound(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode) |
| | | { |
| | | Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); |
| | | Dt_Task? task = _taskFilter.QueryPendingTask(conveyorLine.DeviceCode, childDeviceCode); |
| | | if (task != null) |
| | | { |
| | | //ConveyorLineTaskCommandNew taskCommand = _mapper.Map<ConveyorLineTaskCommandNew>(task); |
| | | //taskCommand.WCS_ACK = command.WCS_ACK; |
| | | //conveyorLine.SendCommand(taskCommand, childDeviceCode); |
| | | |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, task.TaskNum, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, task.TargetAddress, childDeviceCode); |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 输送线请求出库下一地址 |
| | | /// 输送线请求出库下一地址 |
| | | /// </summary> |
| | | /// <param name="conveyorLine">输送线实例对象</param> |
| | | /// <param name="command">读取的请求信息</param> |
| | | /// <param name="childDeviceCode">子设备编号</param> |
| | | public void RequestOutNextAddress(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode) |
| | | { |
| | | Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNo, childDeviceCode); |
| | | if (task != null) |
| | | Dt_Task? task = _taskFilter.QueryExecutingTask(command.TaskNo, childDeviceCode); |
| | | if (task == null) |
| | | { |
| | | const string ConstraintMachineName = "拘束机"; |
| | | const string PinMachineName = "插拔钉机"; |
| | | |
| | | var devices = Storage.Devices; |
| | | |
| | | if (string.Equals(task.NextAddress, ConstraintMachineName, StringComparison.Ordinal)) |
| | | { |
| | | ConstraintMachine? constraint = devices.OfType<ConstraintMachine>().FirstOrDefault(d => d.DeviceName == ConstraintMachineName); |
| | | if (constraint == null) |
| | | { |
| | | // 处理 processing 为空的情况(可根据实际业务需求添加处理逻辑) |
| | | return; |
| | | } |
| | | ProcessDeviceRequest(conveyorLine, constraint, childDeviceCode, |
| | | () => constraint.GetValue<ConstraintMachineDBName, bool>(ConstraintMachineDBName.MaterialRequestLower), |
| | | () => constraint.GetValue<ConstraintMachineDBName, bool>(ConstraintMachineDBName.OutputRequestLower), |
| | | outputReq => constraint.SetValue(ConstraintMachineDBName.ConstraintTrayOutputReadyLower, outputReq ? 1 : 0)); |
| | | } |
| | | else if (string.Equals(task.NextAddress, PinMachineName, StringComparison.Ordinal)) |
| | | { |
| | | PinMachine? pinMachine = devices.OfType<PinMachine>().FirstOrDefault(d => d.DeviceName == PinMachineName); |
| | | if (pinMachine == null) |
| | | { |
| | | // 处理 pinMachine 为空的情况(可根据实际业务需求添加处理逻辑) |
| | | return; |
| | | } |
| | | ProcessDeviceRequest(conveyorLine, pinMachine, childDeviceCode, |
| | | () => pinMachine.GetValue<PinMachineDBName, bool>(PinMachineDBName.MaterialRequestLower), |
| | | () => pinMachine.GetValue<PinMachineDBName, bool>(PinMachineDBName.OutputRequestLower), |
| | | outputReq => pinMachine.SetValue(PinMachineDBName.PlugPinTrayOutputReadyLower, outputReq ? 1 : 0)); |
| | | } |
| | | |
| | | Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress); |
| | | |
| | | return; |
| | | } |
| | | |
| | | _targetAddressSelector.HandleOutboundNextAddress(conveyorLine, task.NextAddress, childDeviceCode); |
| | | |
| | | _ = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 输送线出库完成 |
| | | /// 输送线出库完成 |
| | | /// </summary> |
| | | /// <param name="conveyorLine">输送线实例对象</param> |
| | | /// <param name="command">读取的请求信息</param> |
| | | /// <param name="childDeviceCode">子设备编号</param> |
| | | public void ConveyorLineOutFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommandNew command, string childDeviceCode) |
| | | { |
| | | Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNo, childDeviceCode); |
| | | Dt_Task? task = _taskFilter.QueryExecutingTask(command.TaskNo, childDeviceCode); |
| | | if (task != null) |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode); |
| | |
| | | Console.Out.WriteLine(content.Serialize()); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 通用的设备请求处理方法 |
| | | /// </summary> |
| | | private void ProcessDeviceRequest<T>(CommonConveyorLine conveyorLine, T device, string childDeviceCode, |
| | | Func<bool> getMaterialRequest, Func<bool> getOutputRequest, Action<bool> setOutputReady) |
| | | { |
| | | bool materialReq = getMaterialRequest(); |
| | | bool outputReq = getOutputRequest(); |
| | | |
| | | if (materialReq) |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, 1, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode); |
| | | } |
| | | else |
| | | { |
| | | setOutputReady(outputReq); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |