wanshenmean
10 天以前 4fc1be40676b5f9928da3a83bdb1c215d0584ae9
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -18,24 +18,24 @@
#endregion << 版 本 注 释 >>
using MapsterMapper;
using Newtonsoft.Json;
using Microsoft.IdentityModel.Tokens;
using SqlSugar;
using System.Diagnostics.CodeAnalysis;
using System.Text.Json;
using WIDESEA_Core;
using WIDESEAWCS_Common.HttpEnum;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_Core.Http;
using WIDESEAWCS_DTO;
using WIDESEAWCS_DTO.Stock;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DeviceBase;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
@@ -47,7 +47,10 @@
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository;
        private readonly IMapper _mapper;
        private readonly HttpClientHelper _httpClientHelper;
        private readonly IOutboundTaskFlowService _outboundTaskFlowService;
        private readonly IInboundTaskFlowService _inboundTaskFlowService;
        private readonly IRelocationTaskFlowService _relocationTaskFlowService;
        private readonly IRobotTaskFlowService _robotTaskFlowService;
        private Dictionary<string, OrderByType> _taskOrderBy = new()
            {
@@ -66,13 +69,25 @@
        public List<int> TaskRobotTypes => typeof(TaskOtherTypeEnum).GetEnumIndexList();
        public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, HttpClientHelper httpClientHelper) : base(BaseDal)
        public TaskService(
            ITaskRepository BaseDal,
            IRouterService routerService,
            ITaskExecuteDetailService taskExecuteDetailService,
            ITaskExecuteDetailRepository taskExecuteDetailRepository,
            IMapper mapper,
            IOutboundTaskFlowService outboundTaskFlowService,
            IInboundTaskFlowService inboundTaskFlowService,
            IRelocationTaskFlowService relocationTaskFlowService,
            IRobotTaskFlowService robotTaskFlowService) : base(BaseDal)
        {
            _routerService = routerService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _taskExecuteDetailRepository = taskExecuteDetailRepository;
            _mapper = mapper;
            _httpClientHelper = httpClientHelper;
            _outboundTaskFlowService = outboundTaskFlowService;
            _inboundTaskFlowService = inboundTaskFlowService;
            _relocationTaskFlowService = relocationTaskFlowService;
            _robotTaskFlowService = robotTaskFlowService;
        }
        /// <summary>
@@ -94,30 +109,10 @@
                    }
                    Dt_Task task = _mapper.Map<Dt_Task>(item);
                    task.Creater = "WMS";
                    if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                    {
                        Dt_Router router = _routerService.QueryNextRoute(item.RoadWay, item.TargetAddress,item.TaskType);
                        //暂不考虑多路径
                        if (router !=null )
                        {
                            task.TaskStatus = (int)TaskOutStatusEnum.OutNew;
                            task.CurrentAddress = item.SourceAddress;
                            task.NextAddress = router.ChildPosi;
                        }
                    }
                    else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
                    {
                        Dt_Router routers = _routerService.QueryNextRoute(item.SourceAddress);
                        //暂不考虑多路径
                        if (!routers.IsNullOrEmpty())
                        {
                            task.TaskStatus = (int)TaskInStatusEnum.InNew;
                            task.CurrentAddress = item.SourceAddress;
                            task.NextAddress = routers.ChildPosi;
                        }
                    }
                    InitializeTaskOnReceive(task, item);
                    tasks.Add(task);
                }
                // TOOD: 这里注意添加错误要返回错误
                BaseDal.AddData(tasks);
                _taskExecuteDetailService.AddTaskExecuteDetail(tasks.Select(x => x.TaskNum).ToList(), "接收WMS任务");
@@ -147,10 +142,10 @@
                    TaskNum = Convert.ToInt32(DateTime.Now.ToString("HHmmss")),
                    Grade = 1,
                    PalletCode = palletCode,
                    RoadWay = "SC01",
                    Roadway = "SC01",
                    SourceAddress = sourceAddress,
                    TargetAddress = "SC01",
                    TaskState = (int)TaskInStatusEnum.InNew,
                    TaskStatus = (int)TaskInStatusEnum.InNew,
                    Id = 0,
                    TaskType = (int)TaskInboundTypeEnum.Inbound
                };
@@ -162,6 +157,32 @@
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// 按任务分组初始化任务接收信息。
        /// </summary>
        /// <param name="task">任务实体。</param>
        /// <param name="source">WMS原始任务对象。</param>
        private void InitializeTaskOnReceive(Dt_Task task, WMSTaskDTO source)
        {
            switch (task.TaskType.GetTaskTypeGroup())
            {
                case TaskTypeGroup.OutbondGroup:
                    _outboundTaskFlowService.InitializeOnReceive(task, source);
                    break;
                case TaskTypeGroup.InboundGroup:
                    _inboundTaskFlowService.InitializeOnReceive(task, source);
                    break;
                case TaskTypeGroup.RelocationGroup:
                    _relocationTaskFlowService.InitializeOnReceive(task, source);
                    break;
                case TaskTypeGroup.OtherGroup:
                    _robotTaskFlowService.InitializeOnReceive(task, source);
                    break;
                default:
                    break;
            }
        }
        /// <summary>
@@ -356,195 +377,41 @@
            var result = task.TaskType.GetTaskTypeGroup() switch
            {
                TaskTypeGroup.OutbondGroup => ProcessOutboundTaskStatus(task),
                TaskTypeGroup.InboundGroup => ProcessInboundTaskStatus(task),
                TaskTypeGroup.RelocationGroup => ProcessRelocationTaskStatus(task),
                TaskTypeGroup.OtherGroup => ProcessRobotTaskStatus(task),
                TaskTypeGroup.OutbondGroup => _outboundTaskFlowService.MoveToNextStatus(task),
                TaskTypeGroup.InboundGroup => _inboundTaskFlowService.MoveToNextStatus(task),
                TaskTypeGroup.RelocationGroup => _relocationTaskFlowService.MoveToNextStatus(task),
                TaskTypeGroup.OtherGroup => _robotTaskFlowService.MoveToNextStatus(task),
                _ => WebResponseContent.Instance.Error($"任务类型错误,未找到该任务类型,任务号:【{task.TaskNum}】,任务类型:【{task.TaskType}】")
            };
            if (!result.Status)
                return result;
            // 出库完成线体节点时,可能需要接收入库新任务。
            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup
                && result.Data is List<WMSTaskDTO> wmsTasks
                && wmsTasks.Count > 0)
            {
                return ReceiveWMSTask(wmsTasks);
            }
            // 更新任务数据
            task.ModifyDate = DateTime.Now;
            task.Modifier = "System";
            BaseDal.UpdateData(task);
            if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish)
            {
                BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成);
            }
            else
            {
                BaseDal.UpdateData(task);
            }
            // 记录任务执行详情
            string logMessage = App.User.UserId > 0
                ? $"人工手动将任务状态从【{oldState}】跳转到【{task.TaskStatus}】"
                : $"系统自动流程,任务状态从【{oldState}】转到【{task.TaskStatus}】";
            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, logMessage);
            return WebResponseContent.Instance.OK();
        }
        /// <summary>
        /// 处理出库任务状态转换
        /// </summary>
        private WebResponseContent ProcessOutboundTaskStatus(Dt_Task task)
        {
            if (task.TaskStatus >= (int)TaskOutStatusEnum.OutFinish)
                return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】");
            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>();
            if (task.TaskStatus <= 0)
                return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】");
            // 根据状态调用不同的WMS接口
            if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish)
            {
                return NotifyWMSOutboundFinish(task);
            }
            else
            {
                // return UpdateWMSTaskStatus(task);
                return WebResponseContent.Instance.OK();
            }
        }
        /// <summary>
        /// 处理入库任务状态转换
        /// </summary>
        private WebResponseContent ProcessInboundTaskStatus(Dt_Task task)
        {
            if (task.TaskStatus >= (int)TaskInStatusEnum.InFinish)
                return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】");
            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
            if (task.TaskStatus <= 0)
                return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】");
            // 根据状态调用不同的WMS接口
            if (task.TaskStatus == (int)TaskInStatusEnum.Line_InFinish)
            {
                return GetWMSInboundLocation(task);
            }
            else
            {
                return UpdateWMSTaskStatus(task);
            }
        }
        /// <summary>
        /// 处理机械手任务状态转换
        /// </summary>
        private WebResponseContent ProcessRobotTaskStatus(Dt_Task task)
        {
            if (task.TaskStatus >= (int)TaskRobotStatusEnum.RobotFinish)
                return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】");
            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRobotStatusEnum>();
            if (task.TaskStatus <= 0)
                return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】");
            return WebResponseContent.Instance.OK();
        }
        /// <summary>
        /// 处理移库任务状态转换
        /// </summary>
        private WebResponseContent ProcessRelocationTaskStatus(Dt_Task task)
        {
            if (task.TaskStatus >= (int)TaskRelocationStatusEnum.RelocationFinish)
                return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】");
            task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
            if (task.TaskStatus <= 0)
                return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】");
            // 移库任务开始时,同步WMS任务状态
            if (task.TaskStatus == (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
            {
                return UpdateWMSTaskStatus(task);
            }
            // 移库任务完成时,调用WMS移库完成接口
            if (task.TaskStatus == (int)TaskRelocationStatusEnum.RelocationFinish)
            {
                return NotifyWMSRelocationFinish(task);
            }
            return WebResponseContent.Instance.OK();
        }
        /// <summary>
        /// 通知WMS系统出库完成
        /// </summary>
        private WebResponseContent NotifyWMSOutboundFinish(Dt_Task task)
        {
            var result = _httpClientHelper.Post<WebResponseContent>(
                nameof(ConfigKey.OutboundFinishTaskAsync),
                new StockInfoDTO { PalletCode = task.PalletCode, TaskNum = task.TaskNum }.ToJson());
            if (!result.IsSuccess || !result.Data.Status)
                return WebResponseContent.Instance.Error($"通知WMS系统堆垛机出库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Data?.Message}】");
            return WebResponseContent.Instance.OK();
        }
        /// <summary>
        /// 从WMS系统获取入库目标地址
        /// </summary>
        private WebResponseContent GetWMSInboundLocation(Dt_Task task)
        {
            var result = _httpClientHelper.Post<WebResponseContent>(
                nameof(ConfigKey.GetTasksLocation),
                new CreateTaskDto { PalletCode = task.PalletCode }.ToJson());
            if (!result.IsSuccess || !result.Data.Status)
                return WebResponseContent.Instance.Error($"调用WMS接口获取任务目标地址失败,任务号:【{task.TaskNum}】,错误信息:【{result.Data?.Message}】");
            var nextAddress = result.Data.Data?.ToString();
            if (string.IsNullOrEmpty(nextAddress))
                return WebResponseContent.Instance.Error($"调用WMS接口获取任务目标地址失败,任务号:【{task.TaskNum}】,错误信息:【未获取到有效的目标地址】");
            task.CurrentAddress = task.NextAddress;
            task.NextAddress = nextAddress;
            task.TargetAddress = nextAddress;
            return WebResponseContent.Instance.OK();
        }
        /// <summary>
        /// 更新WMS系统任务状态
        /// </summary>
        private WebResponseContent UpdateWMSTaskStatus(Dt_Task task)
        {
            var result = _httpClientHelper.Post<WebResponseContent>(
                nameof(ConfigKey.UpdateTaskByStatus),
                new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus }.ToJson());
            if (!result.IsSuccess || !result.Data.Status)
                return WebResponseContent.Instance.Error($"调用WMS接口更新任务状态失败,任务号:【{task.TaskNum}】,错误信息:【{result.Data?.Message}】");
            return WebResponseContent.Instance.OK();
        }
        /// <summary>
        /// 通知WMS系统移库任务完成
        /// </summary>
        private WebResponseContent NotifyWMSRelocationFinish(Dt_Task task)
        {
            var result = _httpClientHelper.Post<WebResponseContent>(
                nameof(ConfigKey.RelocationFinishTask),
                new CreateTaskDto
                {
                    PalletCode = task.PalletCode,
                    SourceAddress = task.CurrentAddress,
                    TargetAddress = task.TargetAddress,
                    Roadway = task.Roadway,
                    TaskType = task.TaskType
                }.ToJson());
            if (!result.IsSuccess || !result.Data.Status)
                return WebResponseContent.Instance.Error($"通知WMS系统移库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Data?.Message}】");
            return WebResponseContent.Instance.OK();
        }
@@ -568,7 +435,8 @@
                string oldCurrentPos = task.CurrentAddress;
                string oldNextPos = task.NextAddress;
                Dt_Router routers = _routerService.QueryNextRoute(task.CurrentAddress);
                Dt_Router routers = _routerService.QueryNextRoute(oldNextPos, task.TargetAddress);
                if (routers == null) throw new Exception($"未找到设备路由信息");
                task.CurrentAddress = task.NextAddress;
@@ -600,87 +468,41 @@
            {
                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
                if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
                if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup && task.TaskStatus == (int)TaskOutStatusEnum.SC_OutExecuting)
                TaskTypeGroup taskTypeGroup = task.TaskType.GetTaskTypeGroup();
                content = taskTypeGroup switch
                {
                    List<Dt_Router> routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress);
                    if (!routers.Any()) return WebResponseContent.Instance.Error($"未找到设备路由信息");
                    int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>();
                    task.TaskStatus = nextStatus;
                    task.CurrentAddress = task.NextAddress;
                    task.NextAddress = routers.FirstOrDefault().ChildPosi;
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = "System";
                    var result = _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.OutboundFinishTaskAsync), (new StockInfoDTO() { PalletCode = task.PalletCode, TaskNum = task.TaskNum }).ToJson());
                    if (result.IsSuccess && result.Data.Status)
                    {
                        BaseDal.UpdateData(task);
                        _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机出库完成");
                        return content.Error($"通知WMS系统堆垛机出库完成成功,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】");
                    }
                    else
                    {
                        return content.Error($"通知WMS系统堆垛机出库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Data.Message}】");
                    }
                }
                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup && task.TaskStatus == (int)TaskInStatusEnum.SC_InExecuting)
                    TaskTypeGroup.OutbondGroup => _outboundTaskFlowService.CompleteStackerTask(task),
                    TaskTypeGroup.InboundGroup => _inboundTaskFlowService.CompleteStackerTask(task),
                    TaskTypeGroup.RelocationGroup => _relocationTaskFlowService.CompleteStackerTask(task),
                    TaskTypeGroup.OtherGroup => _robotTaskFlowService.CompleteStackerTask(task),
                    _ => throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{taskNum}】,任务类型:【{task.TaskType}】")
                };
                if (!content.Status)
                {
                    int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>();
                    task.TaskStatus = nextStatus;
                    task.ModifyDate = DateTime.Now;
                    task.Modifier = "System";
                    var result = _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.InboundFinishTaskAsync), (new CreateTaskDto()
                    {
                        PalletCode = task.PalletCode,
                    }).ToJson());
                    if (result.IsSuccess && result.Data.Status)
                    {
                        BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成);
                        _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机入库完成");
                        return content.Error($"通知WMS系统堆垛机入库完成成功,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】");
                    }
                    else
                    {
                        return content.Error($"通知WMS系统堆垛机入库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Data.Message}】");
                    }
                    return content;
                }
                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
                if (taskTypeGroup == TaskTypeGroup.OutbondGroup && task.TaskStatus == (int)TaskOutStatusEnum.SC_OutFinish)
                {
                    if (task.TaskStatus == (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
                    {
                        int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>();
                        task.TaskStatus = nextStatus;
                        task.ModifyDate = DateTime.Now;
                        task.Modifier = "System";
                    BaseDal.UpdateData(task);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "堆垛机出库完成");
                    return content;
                }
                        WebResponseContent result = NotifyWMSRelocationFinish(task);
                        if (result.Status)
                        {
                            BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成);
                            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机移库完成");
                            return content.Error($"通知WMS系统堆垛机移库完成成功,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】");
                        }
                        else
                        {
                            return content.Error($"通知WMS系统堆垛机移库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Message}】");
                        }
                    }
                }
                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OtherGroup)
                if (taskTypeGroup == TaskTypeGroup.InboundGroup && task.TaskStatus == (int)TaskInStatusEnum.SC_InFinish)
                {
                    BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "堆垛机入库完成");
                    return content;
                }
                else
                if (taskTypeGroup == TaskTypeGroup.RelocationGroup && task.TaskStatus == (int)TaskRelocationStatusEnum.RelocationFinish)
                {
                    throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{taskNum}】,任务类型:【{task.TaskType}】");
                    BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成);
                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "堆垛机移库完成");
                    return content;
                }
                content = WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
@@ -817,4 +639,92 @@
            return BaseDal.QueryFirst(x => x.TaskNum == taskNum);
        }
    }
}
    public enum ConveyorLineDBNameNew
    {
        Barcode
    }
    public class ConveyorLineTaskCommandNew : DeviceCommand
    {
        /// <summary>
        /// 任务号
        /// </summary>
        public short TaskNo { get; set; }
        /// <summary>
        /// 源位置 开始地址
        /// </summary>
        public short Source { get; set; }
        /// <summary>
        /// 目标位置
        /// </summary>
        public short Target { get; set; }
        /// <summary>
        /// 箱型
        /// </summary>
        public byte BoxType { get; set; }
        /// <summary>
        /// 输送线状态 设备空闲状态
        /// </summary>
        public byte CV_State { get; set; }
        /// <summary>
        /// 输送线错误代码
        /// </summary>
        public byte CV_ERRCode { get; set; }
        /// <summary>
        /// WCS就绪标志 WCS下发完成时,触发为1
        /// </summary>
        public byte WCS_STB { get; set; }
        /// <summary>
        /// WCS应答标志 WCS收到完成时,触发为1
        /// </summary>
        public byte WCS_ACK { get; set; }
        /// <summary>
        /// PLC就绪标志 完成任务时,触发为1
        /// </summary>
        public byte PLC_STB { get; set; }
        /// <summary>
        /// PLC应答标志 收到任务时,触发为1
        /// </summary>
        public byte PLC_ACK { get; set; }
        /// <summary>
        /// PLC请求标志 入库站台,到位写1
        /// </summary>
        public byte PLC_REQ { get; set; }
        /// <summary>
        /// WCS错误代码
        /// </summary>
        public byte WCS_ERRCode { get; set; }
        /// <summary>
        /// WCS特殊标志 (旋转标识、强制放行、循环、特殊申请、是否叠盘、是否堵塞)
        /// </summary>
        public byte WCS_Special { get; set; }
        /// <summary>
        /// 设备自动模式 手动1,自动2
        /// </summary>
        public byte Equ_Auto { get; set; }
        /// <summary>
        /// 尾板标志
        /// </summary>
        public byte Last_pallet { get; set; }
        /// <summary>
        /// 条码(22个字符)
        /// </summary>
        [DataLength(22)]
        public string Barcode { get; set; }
    }
}