陈勇
2024-11-14 0dfb009511d5265194d9162008e0faf60961b666
WCS合并  WMS分容接口
已修改3个文件
已添加16个文件
1656 ■■■■■ 文件已修改
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine_After.cs 333 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/CustomProfile.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_After/CommonConveyorLine_AfterJob.cs 702 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_After/ConveyorLineDBName_After.cs 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_After/ConveyorLineTaskCommand_After.cs 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/Const/ConfigConst.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/Enums/ManageEnum.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MCS/NotifyFinishTest.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MCS/NotityInFinish.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MCS/RequestReMove.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MCS/RequsetCellInfo.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MCS/WorkState.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStoragIntegrationServices/MCS/IMCSService.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MCS/MCSService.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MCS/Partial/ModifyAccessStatus.cs 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MCS/Partial/NotifyFinishTest.cs 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MCS/Partial/RequestChangeLocation.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MCS/Partial/RequsetCellInfo.cs 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MCS/MCSController.cs 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine_After.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,333 @@
#region << ç‰ˆ æœ¬ æ³¨ é‡Š >>
/*----------------------------------------------------------------
 * å‘½åç©ºé—´ï¼šWIDESEAWCS_QuartzJob
 * åˆ›å»ºè€…:胡童庆
 * åˆ›å»ºæ—¶é—´ï¼š2024/8/2 16:13:36
 * ç‰ˆæœ¬ï¼šV1.0.0
 * æè¿°ï¼šä¸€èˆ¬è¾“送线实现类
 *
 * ----------------------------------------------------------------
 * ä¿®æ”¹äººï¼š
 * ä¿®æ”¹æ—¶é—´ï¼š
 * ç‰ˆæœ¬ï¼šV1.0.1
 * ä¿®æ”¹è¯´æ˜Žï¼š
 *
 *----------------------------------------------------------------*/
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using HslCommunication;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Communicator;
using WIDESEAWCS_QuartzJob.ConveyorLine.Enum;
using WIDESEAWCS_QuartzJob.DeviceBase;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
namespace WIDESEAWCS_QuartzJob
{
    [Description("输送线")]
    public class CommonConveyorLine_After : IConveyorLine
    {
        #region Private Member
        /// <summary>
        /// å †åž›æœºé€šè®¯å¯¹è±¡
        /// </summary>
        private readonly BaseCommunicator _communicator;
        /// <summary>
        /// å †åž›æœºåè®®ä¿¡æ¯
        /// </summary>
        private readonly List<DeviceProDTO> _deviceProDTOs;
        /// <summary>
        /// å †åž›æœºåè®®æ˜Žç»†ä¿¡æ¯
        /// </summary>
        private readonly List<DeviceProtocolDetailDTO> _deviceProtocolDetailDTOs;
        /// <summary>
        /// è®¾å¤‡ç¼–号
        /// </summary>
        public readonly string _deviceCode;
        /// <summary>
        /// è®¾å¤‡åç§°
        /// </summary>
        public readonly string _deviceName;
        private bool _heartStatr = true;
        private bool _isConnected = true;
        #endregion
        #region Public Member
        /// <summary>
        /// è¾“送线通讯对象
        /// </summary>
        public BaseCommunicator Communicator => _communicator;
        /// <summary>
        /// è¾“送线协议信息
        /// </summary>
        public List<DeviceProDTO> DeviceProDTOs => _deviceProDTOs;
        /// <summary>
        /// è¾“送线协议明细信息
        /// </summary>
        public List<DeviceProtocolDetailDTO> DeviceProtocolDetailDTOs => _deviceProtocolDetailDTOs;
        /// <summary>
        /// è®¾å¤‡ç¼–号
        /// </summary>
        public string DeviceCode => _deviceCode;
        /// <summary>
        /// è®¾å¤‡åç§°
        /// </summary>
        public string DeviceName => _deviceName;
        /// <summary>
        /// æ˜¯å¦æœ‰æ•…éšœ
        /// </summary>
        public bool IsFault => false;
        /// <summary>
        /// é€šè®¯æ˜¯å¦å·²è¿žæŽ¥
        /// </summary>
        public bool IsConnected => Communicator.IsConnected && _isConnected;
        /// <summary>
        /// è®¾å¤‡çŠ¶æ€
        /// </summary>
        public DeviceStatus Status => DeviceStatus.Offline;
        #endregion
        #region Constructor Function
        /// <summary>
        /// æž„造函数
        /// </summary>
        /// <param name="communicator">堆垛机通讯对象</param>
        /// <param name="deviceProDTOs">堆垛机协议信息</param>
        /// <param name="deviceProtocolDetailDTOs">堆垛机协议明细信息</param>
        /// <param name="deviceCode">设备编号</param>
        /// <param name="deviceName">设备名称</param>
        public CommonConveyorLine_After(BaseCommunicator communicator, List<DeviceProDTO> deviceProDTOs, List<DeviceProtocolDetailDTO> deviceProtocolDetailDTOs, string deviceCode, string deviceName)
        {
            _communicator = communicator;
            _deviceProDTOs = deviceProDTOs;
            _deviceProtocolDetailDTOs = deviceProtocolDetailDTOs;
            _deviceCode = deviceCode;
            _deviceName = deviceName;
            CheckConnect();
        }
        #endregion
        #region Private Method
        private void CheckConnect()
        {
            Task.Run(() =>
            {
                while (_heartStatr)
                {
                    try
                    {
                        DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault();
                        if (devicePro == null)
                            _isConnected = false;
                        else
                            Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
                        _isConnected = true;
                    }
                    catch (Exception ex)
                    {
                        _isConnected = false;
                    }
                    Thread.Sleep(500);
                }
            });
        }
        #endregion
        #region Public Method
        /// <summary>
        /// è¯»å–PLC协议地址的数据
        /// </summary>
        /// <typeparam name="TEnum">协议信息的枚举对象信息。</typeparam>
        /// <typeparam name="TRsult">读取数据的类型对象信息。</typeparam>
        /// <param name="value">枚举值</param>
        /// <param name="deviceChildCode">设备子编号</param>
        /// <returns>读取到的数据</returns>
        public TRsult GetValue<TEnum, TRsult>(TEnum value, string deviceChildCode) where TEnum : Enum
        {
            if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络");
            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == value.ToString() && x.DeviceChildCode == deviceChildCode);
            return devicePro == null ? throw new Exception() : (TRsult)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
        }
        /// <summary>
        /// ä¸Žè®¾å¤‡çš„心跳
        /// </summary>
        public void Heartbeat()
        {
            throw new NotImplementedException();
        }
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="command"></param>
        /// <param name="deviceChildCode"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public bool SendCommand<T>(T command, string deviceChildCode) where T : IDataTransfer, new()
        {
            if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络");
            DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand) && x.DeviceChildCode == deviceChildCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
            if (devicePro == null)
            {
                return false;
            }
            if (Communicator.WriteCustomer(devicePro.DeviceProAddress, command))
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// è¯»å–PLC数据,返回自定义对象
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="deviceChildCode">子设备编号</param>
        /// <returns>返回自定义对象或抛出异常</returns>
        /// <exception cref="Exception"></exception>
        public T ReadCustomer<T>(string deviceChildCode) where T : IDataTransfer, new()
        {
            if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络");
            DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == "ReadDeviceCommand" && x.DeviceChildCode == deviceChildCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
            if (devicePro == null)
            {
                throw new Exception("未找到协议信息");
            }
            else
            {
                return Communicator.ReadCustomer<T>(devicePro.DeviceProAddress);
            }
        }
        /// <summary>
        /// è¯»å–PLC数据,返回自定义对象
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="deviceChildCode">子设备编号</param>
        /// <param name="deviceProParamType">参数类型</param>
        /// <returns>返回自定义对象或抛出异常</returns>
        /// <exception cref="Exception"></exception>
        public T ReadCustomer<T>(string deviceChildCode, string deviceProParamType) where T : IDataTransfer, new()
        {
            if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络");
            DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == deviceProParamType && x.DeviceChildCode == deviceChildCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
            if (devicePro == null)
            {
                throw new Exception("未找到协议信息");
            }
            else
            {
                return Communicator.ReadCustomer<T>(devicePro.DeviceProAddress);
            }
        }
        /// <summary>
        /// æ ¹æ®å‚数名称、设备子编号写入对应的数据。
        /// </summary>
        /// <typeparam name="TEnum">参数名称枚举类型。</typeparam>
        /// <typeparam name="TValue">要写入的数据类型。</typeparam>
        /// <param name="enum">参数名称。</param>
        /// <param name="value">要写入的数据。</param>
        /// <param name="deviceChildCode">设备子编号写</param>
        /// <returns>返回写入成功或失败</returns>
        public bool SetValue<TEnum, TValue>(TEnum @enum, TValue value, string deviceChildCode)
            where TEnum : Enum
            where TValue : notnull
        {
            if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络");
            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == @enum.ToString() && x.DeviceChildCode == deviceChildCode);
            return devicePro == null ? throw new Exception() : Communicator.WriteObj(devicePro.DeviceProAddress, devicePro.DeviceDataType, value);
        }
        /// <summary>
        /// æ ¹æ®å‚数名称、设备子编号读取对应的数据。
        /// </summary>
        /// <typeparam name="TEnum">参数名称枚举类型。</typeparam>
        /// <param name="enum">参数名称。</param>
        /// <param name="deviceChildCode">设备子编号写</param>
        /// <returns>返回写入成功或失败</returns>
        public object ReadValue<TEnum>(TEnum @enum, string deviceChildCode)
            where TEnum : Enum
        {
            if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络");
            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == @enum.ToString() && x.DeviceChildCode == deviceChildCode);
            return devicePro == null ? throw new Exception() : Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="deviceChildCode"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public bool IsOccupied(string deviceChildCode)
        {
            if (Communicator.IsConnected)
            {
                List<DeviceProDTO> devicePros = _deviceProDTOs.Where(x => x.DeviceProParamType == ConveyorLineStatus.IsOccupied.ToString()).ToList();
                if (devicePros.Count == 0)
                {
                    //todo åè®®ä¿¡æ¯æœªèŽ·å–åˆ°æ—¶æŠ›å‡ºå¼‚å¸¸
                    throw new Exception();
                }
                for (int i = 0; i < devicePros.Count; i++)
                {
                    object readStatus = Communicator.ReadAsObj(devicePros[i].DeviceProAddress, devicePros[i].DeviceDataType);
                    //todo åè®®æ˜Žç»†ä¿¡æ¯æœªèŽ·å–åˆ°æ—¶æŠ›å‡ºå¼‚å¸¸
                    DeviceProtocolDetailDTO? deviceProtocolDetail = _deviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePros[i].DeviceProParamName) ?? throw new Exception();
                    deviceProtocolDetail = _deviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePros[i].DeviceProParamType && x.ProtocalDetailValue.Equals(readStatus.ToString()));
                    if (deviceProtocolDetail != null)
                    {
                        return true;
                    }
                    return false;
                }
            }
            //todo é€šè®¯æœªè¿žæŽ¥æ—¶æŠ›å‡ºå¼‚常
            return false;
        }
        public void Dispose()
        {
            _heartStatr = false;
            _communicator.Dispose();
            GC.SuppressFinalize(this);
        }
        #endregion
    }
}
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Filter/CustomProfile.cs
@@ -22,6 +22,7 @@
            CreateMap<Dt_DeviceInfo,DeviceInfoDTO>();
            CreateMap<WMSTaskDTO, Dt_Task>().ForMember(a => a.WMSId, b => b.MapFrom(b => b.Id));
            CreateMap<Dt_Task, ConveyorLineTaskCommand>().ForMember(a => a.TargetAddress, b => b.MapFrom(b => b.NextAddress)).ForMember(a => a.Barcode, b => b.MapFrom(b => b.PalletCode)).ForMember(a => a.TaskNum, b => b.MapFrom(b => b.TaskNum));
            CreateMap<Dt_Task,ConveyorLineTaskCommand_After>().ForMember(a => a.ConveyorLineTargetAddress, b => b.MapFrom(b => b.NextAddress)).ForMember(a => a.ConveyorLineBarcode, b => b.MapFrom(b => b.PalletCode)).ForMember(a => a.ConveyorLineTaskNum, b => b.MapFrom(b => b.TaskNum));
        }
    }
}
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_After/CommonConveyorLine_AfterJob.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,702 @@
#region MyRegion
#region << ç‰ˆ æœ¬ æ³¨ é‡Š >>
/*----------------------------------------------------------------
 * å‘½åç©ºé—´ï¼šWIDESEAWCS_Tasks.ConveyorLineJob
 * åˆ›å»ºè€…:胡童庆
 * åˆ›å»ºæ—¶é—´ï¼š2024/8/2 16:13:36
 * ç‰ˆæœ¬ï¼šV1.0.0
 * æè¿°ï¼š
 *
 * ----------------------------------------------------------------
 * ä¿®æ”¹äººï¼š
 * ä¿®æ”¹æ—¶é—´ï¼š
 * ç‰ˆæœ¬ï¼šV1.0.1
 * ä¿®æ”¹è¯´æ˜Žï¼š
 *
 *----------------------------------------------------------------*/
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using AutoMapper;
using HslCommunication;
using Microsoft.AspNetCore.Server.HttpSys;
using Newtonsoft.Json;
using Quartz;
using SqlSugar;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Threading.Tasks;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
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.Service;
using WIDESEAWCS_Tasks.ConveyorLineJob;
namespace WIDESEAWCS_Tasks
{
    [DisallowConcurrentExecution]
    public class CommonConveyorLine_AfterJob : JobBase, IJob
    {
        private readonly ITaskService _taskService;
        private readonly ITaskRepository _taskRepository;
        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
        private readonly IRouterService _routerService;
        private readonly IMapper _mapper;
        public CommonConveyorLine_AfterJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper, ITaskRepository taskRepository)
        {
            _taskService = taskService;
            _taskExecuteDetailService = taskExecuteDetailService;
            _routerService = routerService;
            _mapper = mapper;
            _taskRepository = taskRepository;
        }
        public Task Execute(IJobExecutionContext context)
        {
            try
            {
                CommonConveyorLine_After conveyorLine = (CommonConveyorLine_After)context.JobDetail.JobDataMap.Get("JobParams");
                if (conveyorLine != null)
                {
                    List<string> childDeviceCodes = _routerService.QueryAllPositions(conveyorLine.DeviceCode);
                    //List<Task> tasks = new List<Task>();
                    foreach (string childDeviceCode in childDeviceCodes)
                    {
                        ConveyorLineTaskCommand_After command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand_After>(childDeviceCode);
                        if (command.ConveyorLineBarcode.Trim().Contains("\0")) command.ConveyorLineBarcode = "";
                        DeviceProtocolDetailDTO? deviceProtocolDetails = conveyorLine.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(ConveyorLineTaskCommand_After.InteractiveSignal) && x.ProtocalDetailValue == command.InteractiveSignal.ToString());
                        if (deviceProtocolDetails != null)
                        {
                            MethodInfo? method = GetType().GetMethod(deviceProtocolDetails.ProtocolDetailType);
                            if (method != null)
                            {
                                method.Invoke(this, new object[] { conveyorLine, command, childDeviceCode });
                            }
                        }
                    }
                    //Task.WaitAll(tasks.ToArray());
                }
            }
            catch (Exception ex)
            {
                Console.Out.WriteLine(nameof(CommonConveyorLineJob) + ":" + ex.ToString());
            }
            finally
            {
                //WriteDebug("CommonConveyorLineJob", "test");
                //Console.Out.WriteLine(DateTime.Now);
            }
            return Task.CompletedTask;
        }
        /// <summary>
        /// è¾“送线请求入库
        /// </summary>
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="command">读取的请求信息</param>
        /// <param name="childDeviceCode">子设备编号</param>
        /// <param name="ProtocalDetailValue">线体当前bool读取偏移地址</param>
        public void RequestInbound(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
        {
            var taskNew = _taskService.QueryCraneConveyorLineTask(command.ConveyorLineTaskNum.ObjToInt(), childDeviceCode);
            if (taskNew == null)
            {
                string barcode = command.ConveyorLineBarcode.TrimEnd();
                if (_taskService.RequestWMSTask(command.ConveyorLineBarcode, childDeviceCode).Status)
                {
                    Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
                    if (task != null)
                    {
                        ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task);
                        //taskCommand.InteractiveSignal = command.InteractiveSignal;
                        taskCommand.ResponState = 1;
                        taskCommand.ConveyorLineTaskNum = task.TaskNum;
                        taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(task.NextAddress);
                        conveyorLine.SendCommand(taskCommand, childDeviceCode);
                        //ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
                        _taskService.UpdateTaskStatusToNext(task);
                    }
                }
            }
            var inTask = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum.ObjToInt(), childDeviceCode);
            if (inTask != null)
            {
                ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(inTask);
                //taskCommand.InteractiveSignal = command.InteractiveSignal;
                taskCommand.ResponState = 1;
                conveyorLine.SendCommand(taskCommand, childDeviceCode);
                _taskService.UpdateTaskStatusToNext(inTask);
            }
        }
        /// <summary>
        /// è¾“送线请求入库下一地址
        /// </summary>
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="command">读取的请求信息</param>
        /// <param name="childDeviceCode">子设备编号</param>
        public void RequestInNextAddress(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
        {
            //if(command)
            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
            if (task != null)
            {
                Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
                if (newTask != null)
                {
                    ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(newTask);
                    //taskCommand.InteractiveSignal = command.InteractiveSignal;
                    conveyorLine.SendCommand(taskCommand, childDeviceCode);
                }
            }
        }
        /// <summary>
        /// è¾“送线入库完成
        /// </summary>
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="command">读取的请求信息</param>
        /// <param name="childDeviceCode">子设备编号</param>
        /// <param name="ProtocalDetailValue">线体当前bool读取偏移地址</param>
        public void ConveyorLineInFinish(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
        {
            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
            if (task != null && task.TaskState != (int)TaskInStatusEnum.Line_InFinish)
            {
                //ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
                //conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, 0, childDeviceCode);
                WebResponseContent content = _taskService.UpdateTaskStatusToNext(task);
                Console.Out.WriteLine(content.Serialize());
            }
        }
        /// <summary>
        /// è¾“送线请求出信息
        /// </summary>
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="command">读取的请求信息</param>
        /// <param name="childDeviceCode">子设备编号</param>
        public void RequestOutbound(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
        {
            Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
            if (task != null)
            {
                // ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task);
                //taskCommand.InteractiveSignal = command.InteractiveSignal;
                // conveyorLine.SendCommand(taskCommand, childDeviceCode);
                _taskService.UpdateTaskStatusToNext(task);
            }
        }
        /// <summary>
        /// è¾“送线请求出库下一地址
        /// </summary>
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="command">读取的请求信息</param>
        /// <param name="childDeviceCode">子设备编号</param>
        public void RequestOutNextAddress(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
        {
            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
            if (task != null)
            {
                Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
                if (newTask != null)
                {
                    ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(newTask);
                    //taskCommand.InteractiveSignal = command.InteractiveSignal;
                    conveyorLine.SendCommand(taskCommand, childDeviceCode);
                }
            }
        }
        /// <summary>
        /// è¾“送线出库完成
        /// </summary>
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="command">读取的请求信息</param>
        /// <param name="childDeviceCode">子设备编号</param>
        public void ConveyorLineOutFinish(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
        {
            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
            if (task != null)
            {
                conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, 0, childDeviceCode);
                WebResponseContent content = _taskService.UpdateTaskStatusToNext(task);
                Console.Out.WriteLine(content.Serialize());
            }
        }
        /// <summary>
        /// è¾“送线交互完成
        /// </summary>
        /// <param name="conveyorLine">输送线实例对象</param>
        /// <param name="childDeviceCode">子设备编号</param>
        /// <param name="ProtocalDetailValue">线体当前bool读取偏移地址</param>
        /// <param name="value">值</param>
        public void ConveyorLineSendFinish(CommonConveyorLine_After conveyorLine, string childDeviceCode, int ProtocalDetailValue, bool value)
        {
            DeviceProDTO? devicePro = conveyorLine.DeviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand) && x.DeviceChildCode == childDeviceCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
            string[] x = devicePro.DeviceProAddress.Split('.');
            x[x.Length - 1] = (ProtocalDetailValue + 1).ToString();
            string DeviceProAddress = string.Join(".", x);
            conveyorLine.Communicator.Write(DeviceProAddress, value);
        }
    }
}
#endregion
#region MyRegion
//using AutoMapper;
//using HslCommunication;
//using Newtonsoft.Json;
//using Quartz;
//using SqlSugar;
//using System.Reflection;
//using WIDESEAWCS_Common.TaskEnum;
//using WIDESEAWCS_Core;
//using WIDESEAWCS_Core.Helper;
//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.Service;
//using WIDESEAWCS_Tasks.ConveyorLineJob;
//namespace WIDESEAWCS_Tasks
//{
//    [DisallowConcurrentExecution]
//    public class CommonConveyorLine_AfterJob : JobBase, IJob
//    {
//        private readonly List<string> _deviceCodes1 = new List<string>() { "1063", "1061", "1060" };
//        private readonly List<string> _deviceCodes2 = new List<string>() { "1067", "1069", "1068" };
//        private readonly string[] HCTrayCode = { "1012", "1013" };
//        private readonly ITaskService _taskService;
//        private readonly ITaskRepository _taskRepository;
//        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
//        private readonly IRouterService _routerService;
//        private readonly IMapper _mapper;
//        public CommonConveyorLine_AfterJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper, ITaskRepository taskRepository)
//        {
//            _taskService = taskService;
//            _taskExecuteDetailService = taskExecuteDetailService;
//            _routerService = routerService;
//            _mapper = mapper;
//            _taskRepository = taskRepository;
//        }
//        public Task Execute(IJobExecutionContext context)
//        {
//            try
//            {
//                CommonConveyorLine_After conveyorLine = (CommonConveyorLine_After)context.JobDetail.JobDataMap.Get("JobParams");
//                if (conveyorLine != null)
//                {
//                    List<string> childDeviceCodes = _routerService.QueryAllPositions(conveyorLine.DeviceCode);
//                    List<Task> tasks = new List<Task>();
//                    foreach (string childDeviceCode in childDeviceCodes)
//                    {
//                        //Task task = Task.Run(() =>
//                        //{
//                        ConveyorLineTaskCommand_After command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand_After>(childDeviceCode);
//                        if (command != null)
//                        {
//                            var structs = BitConverter.GetBytes(command.InteractiveSignal).Reverse().ToArray().ToBoolArray();
//                            List<DeviceProtocolDetailDTO>? deviceProtocolDetails = conveyorLine.DeviceProtocolDetailDTOs.Where(x => x.DeviceProParamName == nameof(ConveyorLineTaskCommand_After.InteractiveSignal)).ToList();
//                            if (deviceProtocolDetails != null)
//                            {
//                                foreach (var item in deviceProtocolDetails)
//                                {
//                                    var outDeviceCodes = _routerService.QueryOutDeviceCodes(conveyorLine.DeviceCode);
//                                    if (structs[item.ProtocalDetailValue.ObjToInt()] == true)
//                                    {
//                                        MethodInfo? method = GetType().GetMethod(item.ProtocolDetailType);
//                                        if (method != null)
//                                        {
//                                            method.Invoke(this, new object[] { conveyorLine, command, childDeviceCode, item.ProtocalDetailValue.ObjToInt() });
//                                        }
//                                    }
//                                    else
//                                    {
//                                        //DeviceProDTO? devicePro = conveyorLine.DeviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand) && x.DeviceChildCode == childDeviceCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
//                                        //string[] x = devicePro.DeviceProAddress.Split('.');
//                                        //x[x.Length - 1] = (item.ProtocalDetailValue.ObjToInt() + 1).ToString();
//                                        //string DeviceProAddress = string.Join(".", x);
//                                        //var writeRead = conveyorLine.Communicator.Read<bool>(DeviceProAddress);
//                                        //if (writeRead)
//                                        //{
//                                        //    ConveyorLineSendFinish(conveyorLine, childDeviceCode, item.ProtocalDetailValue.ObjToInt(), false);
//                                        //}
//                                    }
//                                }
//                            }
//                        }
//                        //});
//                        //tasks.Add(task);
//                    }
//                    Task.WaitAll(tasks.ToArray());
//                }
//            }
//            catch (Exception ex)
//            {
//                Console.Out.WriteLine(nameof(CommonConveyorLineJob) + ":" + ex.ToString());
//            }
//            finally
//            {
//                //WriteDebug("CommonConveyorLineJob", "test");
//                //Console.Out.WriteLine(DateTime.Now);
//            }
//            return Task.CompletedTask;
//        }
//        /// <summary>
//        /// è¾“送线请求入库
//        /// </summary>
//        /// <param name="conveyorLine">输送线实例对象</param>
//        /// <param name="command">读取的请求信息</param>
//        /// <param name="childDeviceCode">子设备编号</param>
//        /// <param name="ProtocalDetailValue">线体当前bool读取偏移地址</param>
//        public void RequestInbound(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, int ProtocalDetailValue)
//        {
//            var taskNew = _taskService.QueryCraneConveyorLineTask(command.Barcode.ObjToInt(), childDeviceCode);
//            var Taskout = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
//            if (Taskout != null)
//            {
//                // ç©ºæ‰˜ç›˜ä»»åŠ¡
//                if (Taskout.TaskType == (int)TaskOutboundTypeEnum.OutTray)
//                {
//                    if (Taskout.TaskState == (int)TaskOutStatusEnum.SC_OutFinish)
//                    {
//                        ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(Taskout);
//                        taskCommand.InteractiveSignal = command.InteractiveSignal;
//                        if (command.Barcode == "")
//                        {
//                            taskCommand.TargetAddress = 1092;
//                        }
//                        conveyorLine.SendCommand(taskCommand, childDeviceCode);
//                        ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
//                        _taskService.UpdateTaskStatusToNext(Taskout);
//                    }
//                    else if (Taskout.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting)
//                    {
//                        if (command.Barcode == "")
//                        {
//                            ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(Taskout);
//                            taskCommand.InteractiveSignal = command.InteractiveSignal;
//                            taskCommand.TargetAddress = 1092;
//                            conveyorLine.SendCommand(taskCommand, childDeviceCode);
//                            ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
//                            _taskService.UpdateTaskStatusToNext(Taskout);
//                        }
//                    }
//                }
//                else if (Taskout.TaskType == (int)TaskOutboundTypeEnum.Outbound)
//                {
//                    if (Taskout.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting)
//                    {
//                        ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(Taskout);
//                        taskCommand.InteractiveSignal = command.InteractiveSignal;
//                        if (command.Barcode == "")
//                        {
//                            //todo æ²¡æœ‰æ˜Žç¡®å¼‚常口,送到目标巷道的NG口
//                            //taskCommand.TargetAddress = 1092;
//                        }
//                        conveyorLine.SendCommand(taskCommand, childDeviceCode);
//                        ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
//                        _taskService.UpdateTaskStatusToNext(Taskout);
//                    }
//                    else if (Taskout.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting)
//                    {
//                        if (command.Barcode == "")
//                        {
//                            ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(Taskout);
//                            taskCommand.InteractiveSignal = command.InteractiveSignal;
//                            // todo  é€åˆ°ç›®æ ‡å··é“çš„NG口
//                            taskCommand.TargetAddress = 1092;
//                            conveyorLine.SendCommand(taskCommand, childDeviceCode);
//                            ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
//                            _taskService.UpdateTaskStatusToNext(Taskout);
//                        }
//                        else
//                        {
//                            // todo è°ƒç”¨WMS任务完成接口
//                            var x = new { taskNum = Taskout.TaskNum };
//                            var result = HttpHelper.GetAsync("http:127.0.0.1:8098/api/Task/CompleteTaskAsync", x.ToJsonString()).Result;
//                            WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result);
//                            if (content.Status)
//                            {
//                                ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
//                                _taskService.UpdateTaskStatusToNext(Taskout);
//                            }
//                        }
//                    }
//                }
//            }
//            if (taskNew == null)
//            {
//                if (_taskService.RequestWMSTask(command.Barcode, childDeviceCode).Status)
//                {
//                    Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
//                    if (task != null)
//                    {
//                        ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task);
//                        taskCommand.InteractiveSignal = command.InteractiveSignal;
//                        conveyorLine.SendCommand(taskCommand, childDeviceCode);
//                        ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
//                        _taskService.UpdateTaskStatusToNext(task);
//                    }
//                }
//            }
//        }
//        //
//        /// <summary>
//        /// ç©ºæ‰˜ç›˜å›žæµ
//        /// </summary>
//        /// <param name="conveyorLine">输送线实例对象</param>
//        /// <param name="command">读取的请求信息</param>
//        /// <param name="childDeviceCode">子设备编号</param>
//        /// <param name="index">读取的第一个位置</param>
//        public void EmptyTrayReturn(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, int index)
//        {
//            var tasks = _taskRepository.QueryData(x => (x.TaskState == (int)TaskOutStatusEnum.OutNew || x.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting) && x.TaskType == (int)TaskOutboundTypeEnum.OutTray);
//            if (tasks.Count <= index)
//            {
//                WMSTaskDTO taskDTO = new WMSTaskDTO()
//                {
//                    TaskNum = Convert.ToInt32(DateTime.Now.ToString("HHmmss")),
//                    Grade = 1,
//                    PalletCode = DateTime.Now.ToString("yyyyMMddHHmmss"),
//                    RoadWay = "CHSC01",
//                    SourceAddress = "001-001-001",
//                    TargetAddress = childDeviceCode,
//                    TaskState = (int)TaskOutStatusEnum.OutNew,
//                    Id = 0,
//                    TaskType = (int)TaskOutboundTypeEnum.OutTray
//                };
//                #region çœŸå®žæ•°æ®
//                // TODO: è°ƒç”¨æŽ¥å£èŽ·å–ä¸‹ä¸€ä¸ªåœ°å€
//                //RequestTaskDto request = new RequestTaskDto()
//                //{
//                //    Position = sourceAddress,
//                //    PalletCode = palletCode,
//                //};
//                //// å‘送请求并等待响应
//                //var result = HttpHelper.PostAsync("http:127.0.0.1:8098/api/Task/RequestTaskAsync", request.ToJsonString()).Result;
//                //// ååºåˆ—化响应内容
//                //WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result);
//                //// æ£€æŸ¥çŠ¶æ€å¹¶è¿”å›ž
//                ////if (!content.Status)
//                ////    return content;
//                //// ååºåˆ—化任务数据
//                //WMSTaskDTO task = JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString());
//                #endregion
//                var content = _taskService.ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
//                if (content.Status)
//                {
//                    Console.WriteLine("空托盘呼叫成功");
//                }
//            }
//        }
//        ///// <summary>
//        ///// é™ˆåŒ–出库
//        ///// </summary>
//        ///// <param name="conveyorLine">输送线实例对象</param>
//        ///// <param name="command">读取的请求信息</param>
//        ///// <param name="childDeviceCode">子设备编号</param>
//        ///// <param name="index">线体当前bool读取偏移地址</param>
//        //public void ChuanhuaOutbound(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, int index)
//        //{
//        //    var tasks = _taskRepository.QueryData(x => (x.TaskState == (int)TaskOutStatusEnum.OutNew || x.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting) && x.TaskType == (int)TaskOutboundTypeEnum.Outbound);
//        //    if (tasks.Count <= index)
//        //    {
//        //        WMSTaskDTO taskDTO = new WMSTaskDTO()
//        //        {
//        //            TaskNum = Convert.ToInt32(DateTime.Now.ToString("HHmmss")),
//        //            Grade = 1,
//        //            PalletCode = DateTime.Now.ToString("MMddHHmmss"),
//        //            RoadWay = "CHSC01",
//        //            SourceAddress = "001-001-001",
//        //            TargetAddress = childDeviceCode,
//        //            TaskState = (int)TaskOutStatusEnum.OutNew,
//        //            Id = 0,
//        //            TaskType = (int)TaskOutboundTypeEnum.Outbound,
//        //        };
//        //        var content = _taskService.ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
//        //        if (content.Status)
//        //        {
//        //            Console.WriteLine("出库呼叫成功");
//        //        }
//        //    }
//        //    else
//        //    {
//        //        Dt_Task task = tasks[index];
//        //        if (task != null)
//        //        {
//        //            ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task);
//        //            taskCommand.InteractiveSignal = command.InteractiveSignal;
//        //            conveyorLine.SendCommand(taskCommand, childDeviceCode);
//        //        }
//        //    }
//        //}
//        /// <summary>
//        /// è¾“送线请求入库下一地址
//        /// </summary>
//        /// <param name="conveyorLine">输送线实例对象</param>
//        /// <param name="command">读取的请求信息</param>
//        /// <param name="childDeviceCode">子设备编号</param>
//        public void RequestInNextAddress(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
//        {
//            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNum, childDeviceCode);
//            if (task != null)
//            {
//                Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
//                if (newTask != null)
//                {
//                    ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(newTask);
//                    taskCommand.InteractiveSignal = command.InteractiveSignal;
//                    conveyorLine.SendCommand(taskCommand, childDeviceCode);
//                }
//            }
//        }
//        /// <summary>
//        /// è¾“送线入库完成
//        /// </summary>
//        /// <param name="conveyorLine">输送线实例对象</param>
//        /// <param name="command">读取的请求信息</param>
//        /// <param name="childDeviceCode">子设备编号</param>
//        /// <param name="ProtocalDetailValue">线体当前bool读取偏移地址</param>
//        public void ConveyorLineInFinish(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, int ProtocalDetailValue)
//        {
//            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNum, childDeviceCode);
//            if (task != null && task.TaskState != (int)TaskInStatusEnum.Line_InFinish)
//            {
//                ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
//                //conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, 0, childDeviceCode);
//                WebResponseContent content = _taskService.UpdateTaskStatusToNext(task);
//                Console.Out.WriteLine(content.Serialize());
//            }
//        }
//        /// <summary>
//        /// è¾“送线请求出信息
//        /// </summary>
//        /// <param name="conveyorLine">输送线实例对象</param>
//        /// <param name="command">读取的请求信息</param>
//        /// <param name="childDeviceCode">子设备编号</param>
//        public void RequestOutbound(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
//        {
//            Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
//            if (task != null)
//            {
//                ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task);
//                taskCommand.InteractiveSignal = command.InteractiveSignal;
//                conveyorLine.SendCommand(taskCommand, childDeviceCode);
//                _taskService.UpdateTaskStatusToNext(task);
//            }
//        }
//        /// <summary>
//        /// è¾“送线请求出库下一地址
//        /// </summary>
//        /// <param name="conveyorLine">输送线实例对象</param>
//        /// <param name="command">读取的请求信息</param>
//        /// <param name="childDeviceCode">子设备编号</param>
//        public void RequestOutNextAddress(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
//        {
//            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNum, childDeviceCode);
//            if (task != null)
//            {
//                Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
//                if (newTask != null)
//                {
//                    ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(newTask);
//                    taskCommand.InteractiveSignal = command.InteractiveSignal;
//                    conveyorLine.SendCommand(taskCommand, childDeviceCode);
//                }
//            }
//        }
//        /// <summary>
//        /// è¾“送线出库完成
//        /// </summary>
//        /// <param name="conveyorLine">输送线实例对象</param>
//        /// <param name="command">读取的请求信息</param>
//        /// <param name="childDeviceCode">子设备编号</param>
//        public void ConveyorLineOutFinish(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
//        {
//            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.TaskNum, childDeviceCode);
//            if (task != null)
//            {
//                conveyorLine.SetValue(ConveyorLineDBName.WriteInteractiveSignal, 0, childDeviceCode);
//                WebResponseContent content = _taskService.UpdateTaskStatusToNext(task);
//                Console.Out.WriteLine(content.Serialize());
//            }
//        }
//        /// <summary>
//        /// è¾“送线交互完成
//        /// </summary>
//        /// <param name="conveyorLine">输送线实例对象</param>
//        /// <param name="childDeviceCode">子设备编号</param>
//        /// <param name="ProtocalDetailValue">线体当前bool读取偏移地址</param>
//        /// <param name="value">值</param>
//        public void ConveyorLineSendFinish(CommonConveyorLine_After conveyorLine, string childDeviceCode, int ProtocalDetailValue, bool value)
//        {
//            DeviceProDTO? devicePro = conveyorLine.DeviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand) && x.DeviceChildCode == childDeviceCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
//            string[] x = devicePro.DeviceProAddress.Split('.');
//            x[x.Length - 1] = (ProtocalDetailValue + 1).ToString();
//            string DeviceProAddress = string.Join(".", x);
//            conveyorLine.Communicator.Write(DeviceProAddress, value);
//        }
//    }
//}
#endregion
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_After/ConveyorLineDBName_After.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
#region << ç‰ˆ æœ¬ æ³¨ é‡Š >>
/*----------------------------------------------------------------
 * å‘½åç©ºé—´ï¼šWIDESEAWCS_Tasks.ConveyorLineJob
 * åˆ›å»ºè€…:胡童庆
 * åˆ›å»ºæ—¶é—´ï¼š2024/8/2 16:13:36
 * ç‰ˆæœ¬ï¼šV1.0.0
 * æè¿°ï¼š
 *
 * ----------------------------------------------------------------
 * ä¿®æ”¹äººï¼š
 * ä¿®æ”¹æ—¶é—´ï¼š
 * ç‰ˆæœ¬ï¼šV1.0.1
 * ä¿®æ”¹è¯´æ˜Žï¼š
 *
 *----------------------------------------------------------------*/
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_Tasks.ConveyorLineJob
{
    public enum ConveyorLineDBName_After
    {
        #region ReadDevice
        /// <summary>
        /// ç›®çš„地址
        /// </summary>
        ConveyorLineTargetAddress,
        /// <summary>
        /// ä»»åŠ¡å·
        /// </summary>
        ConveyorLineTaskNum,
        /// <summary>
        /// æ‰˜ç›˜å·
        /// </summary>
        ConveyorLineBarcode,
        /// <summary>
        /// è¯·æ±‚反馈
        /// </summary>
        ResponState,
        Reserve2,
        Reserve3,
        /// <summary>
        /// è¯·æ±‚信号
        /// </summary>
        InteractiveSignal,
        /// <summary>
        /// æœ‰ç›˜ä¿¡å·
        /// </summary>
        HasPallet,
        /// <summary>
        /// æŠ¥è­¦ä»£ç 
        /// </summary>
        ConveyorLineAlarm,
        Reserve4,
        Reserve5,
        #endregion
        #region WriteDevice
        #endregion
    }
}
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_After/ConveyorLineTaskCommand_After.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
#region << ç‰ˆ æœ¬ æ³¨ é‡Š >>
/*----------------------------------------------------------------
 * å‘½åç©ºé—´ï¼šWIDESEAWCS_Tasks.ConveyorLineJob
 * åˆ›å»ºè€…:胡童庆
 * åˆ›å»ºæ—¶é—´ï¼š2024/8/2 16:13:36
 * ç‰ˆæœ¬ï¼šV1.0.0
 * æè¿°ï¼š
 *
 * ----------------------------------------------------------------
 * ä¿®æ”¹äººï¼š
 * ä¿®æ”¹æ—¶é—´ï¼š
 * ç‰ˆæœ¬ï¼šV1.0.1
 * ä¿®æ”¹è¯´æ˜Žï¼š
 *
 *----------------------------------------------------------------*/
#endregion << ç‰ˆ æœ¬ æ³¨ é‡Š >>
using System.Runtime.CompilerServices;
using WIDESEAWCS_QuartzJob.DeviceBase;
namespace WIDESEAWCS_Tasks.ConveyorLineJob
{
    //public class ConveyorLineTaskCommand_After : DeviceCommand
    //{
    //    public short TargetAddress { get; set; }
    //    public short TaskNum { get; set; }
    //    public ushort InteractiveSignal { get; set; }
    //    [DataLength(25)]
    //    public string Barcode { get; set; }
    //    public short ConveyorLineAlarm { get; set; }
    //}
    public class ConveyorLineTaskCommand_After : DeviceCommand
    {
        public short ConveyorLineTargetAddress { get; set; }
        public int ConveyorLineTaskNum { get; set; }
        [DataLength(25)]
        public string ConveyorLineBarcode { get; set; }
        public short ResponState { get; set; }
        public short Reserved2 { get; set; }
        public short Reserved3 { get; set; }
        public byte InteractiveSignal { get; set; }
        public short HasPallet { get; set; }
        public short ConveyorLineAlarm { get; set; }
        public short Reserved4 { get; set; }
        public short Reserved5 { get; set; }
    }
    //public class ConveyorLineTaskCommandWrite : DeviceCommand
    //{
    //    public ushort WriteInteractiveSignal { get; set; }
    //    [DataLength(25)]
    //    public string Barcode { get; set; }
    //    public short TargetAddress { get; set; }
    //    public short TaskNum { get; set; }
    //}
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/Const/ConfigConst.cs
@@ -20,6 +20,11 @@
        /// é‚®ç®±é…ç½®
        /// </summary>
        public const string CONFIG_SYS_RegExmail = "Sys_RegExmail";
        /// <summary>
        /// IP接口地址
        /// </summary>
        public const string CONFIG_SYS_IPAddress = "CONFIG_SYS_IPAddress";
    }
    /// <summary>
@@ -60,5 +65,15 @@
        ///  é‚®ç®±å†…容标题
        /// </summary>
        public const string SMTP_RegUser = "smtpRegUser";
        /// <summary>
        /// WCS IP
        /// </summary>
        public const string WCSIPAddress = "WCSIPAddress";
        /// <summary>
        /// HK IP
        /// </summary>
        public const string HKIPAddress = "HKIPAddress";
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/Enums/ManageEnum.cs
@@ -143,6 +143,12 @@
        /// </summary>
        [Description("空托盘出库")]
        OutTray = 104,
        /// <summary>
        /// NG出库
        /// </summary>
        [Description("NG出库")]
        OutNG =105,
    }
    public enum TaskRelocationTypeEnum
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MCS/NotifyFinishTest.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_DTO
{
    public class NotifyFinishTest
    {
        /// <summary>
        /// åº“区
        /// </summary>
        public int LocationArea { get; set; }
        /// <summary>
        /// æ‰˜ç›˜å·
        /// </summary>
        public string PalletBarcode { get; set; }
        /// <summary>
        /// åº“位号
        /// </summary>
        public string LocationID { get; set; }
        /// <summary>
        /// æ˜¯å¦å­˜åœ¨NG (1-有;2-无)
        /// </summary>
        public int IsNG { get; set; }
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MCS/NotityInFinish.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_DTO
{
    public class NotityInFinish
    {
        /// <summary>
        /// åº“区
        /// </summary>
        public int LocationArea { get; set; }
        /// <summary>
        /// æ‰˜ç›˜å·
        /// </summary>
        public string PalletBarcode { get; set; }
        /// <summary>
        /// åº“位号
        /// </summary>
        public string LocationID { get; set; }
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MCS/RequestReMove.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_DTO
{
    public class RequestReMove
    {
        /// <summary>
        /// åº“区
        /// </summary>
        public int LocationArea { get; set; }
        /// <summary>
        /// æ‰˜ç›˜å·
        /// </summary>
        public string PalletBarcode { get; set; }
        /// <summary>
        /// åº“位号
        /// </summary>
        public string LocationID { get; set; }
        /// <summary>
        /// ç§»åº“类型(1-正常移库/检修移库 2-转移到异常踢出口(移入Ng站)  5-消防移库(火警))
        /// </summary>
        public int MoveType { get; set; }
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MCS/RequsetCellInfo.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_DTO
{
    /// <summary>
    ///     è¯·æ±‚库位信息
    /// </summary>
    public class RequsetCellInfo
    {
        /// <summary>
        /// åº“区
        /// </summary>
        public int LocationArea { get; set; }
        /// <summary>
        /// åº“位号
        /// </summary>
        public string LocationID { get; set; }
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MCS/WorkState.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEA_DTO
{
    public class WorkState
    {
        /// <summary>
        /// åº“位数据(弃用,2024å¹´11月5日面谈 å°†é›†åˆåº“位数据改为单个库位数据同步)
        /// </summary>
        public List<LocationWorkState> workStates { get; set; }
    }
    public class LocationWorkState
    {
        public int LocationArea { get; set; }
        /// <summary>
        /// çŠ¶æ€
        /// </summary>
        public int StateCode { get; set; }
        /// <summary>
        /// åº“位编号
        /// </summary>
        public string LocationID { get; set; }
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStoragIntegrationServices/MCS/IMCSService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
namespace WIDESEA_IStoragIntegrationServices
{
    public interface IMCSService : IDependency
    {
        WebResponseContent NotifyFinishTest(object json);
        WebResponseContent RequestChangeLocation(object json);
        WebResponseContent ModifyAccessStatus(object json);
        WebResponseContent RequsetCellInfo(object json);
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MCS/MCSService.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_IStorageBasicRepository;
using WIDESEA_IStorageTaskRepository;
using WIDESEA_IStoragIntegrationServices;
namespace WIDESEA_StoragIntegrationServices
{
    public partial class MCSService : IMCSService
    {
        private readonly ILocationInfoRepository _locationRepository;
        private readonly IDt_TaskRepository _taskRepository;
        private readonly IStockInfoRepository _stockInfoRepository;
        public MCSService(ILocationInfoRepository locationRepository,IDt_TaskRepository taskRepository,IStockInfoRepository stockInfoRepository)
        {
            _locationRepository = locationRepository;
            _taskRepository = taskRepository;
            _stockInfoRepository = stockInfoRepository;
        }
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MCS/Partial/ModifyAccessStatus.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
using MailKit;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_DTO;
namespace WIDESEA_StoragIntegrationServices
{
    public partial class MCSService
    {
        public WebResponseContent ModifyAccessStatus(object json)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (string.IsNullOrEmpty(json.ToString())) throw new Exception("上传参数为空");
                var result = JsonConvert.DeserializeObject<LocationWorkState>(json.ToString());
                var locationinfo = _locationRepository.QueryFirst(x => x.AreaId == result.LocationArea && x.LocationCode == result.LocationID);
                if (locationinfo != null)
                {
                    //检测柜提供的货位状态,只有wms未锁定且提供的状态为允许才允许放货
                    if (locationinfo.Remark != LocationStatusByCode(result.StateCode))
                    {
                        locationinfo.Remark = LocationStatusByCode(result.StateCode);
                        _locationRepository.UpdateData(locationinfo);
                    }
                }
                else
                    throw new Exception("货位不存在");
                return content.OK();
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
        private static string LocationStatusByCode(int code)
        {
            string str = null;
            switch (code)
            {
                case 1: str = "LocationState_Allows"; break;
                case 2: str = "LocationState_NotAllows"; break;
                //case 2: str = LocationState.LocationLock.ToString(); break;
                default:
                    str = "LocationState_NotAllows"; break;
            }
            return str;
        }
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MCS/Partial/NotifyFinishTest.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_DTO;
using WIDESEA_DTO.WMS;
using WIDESEA_Model.Models;
using WIDESEA_StorageBasicRepository;
namespace WIDESEA_StoragIntegrationServices
{
    public partial class MCSService
    {
        public WebResponseContent NotifyFinishTest(object json)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (string.IsNullOrEmpty(json.ToString())) throw new Exception("上传参数为空");
                var result = JsonConvert.DeserializeObject<NotifyFinishTest>(json.ToString());
                if (string.IsNullOrEmpty(result?.PalletBarcode))
                    throw new Exception("上传托盘号为空");
                var location = _locationRepository.QueryFirst(x => x.AreaId == result.LocationArea && x.LocationCode == result.LocationID);
                if (location == null) throw new Exception("未知库位");
                int taskNum = _taskRepository.GetTaskNo().Result;
                Dt_Task task = new Dt_Task
                {
                    CreateDate = DateTime.Now,
                    Creater = "HK",
                    CurrentAddress = result.LocationID,
                    Grade = 1,
                    PalletCode = result.PalletBarcode,
                    Roadway = location.RoadwayNo,
                    SourceAddress = result.LocationID,
                    TaskState = (int)TaskOutStatusEnum.OutNew,
                    TaskType = result.IsNG == 1 ? (int)TaskOutboundTypeEnum.OutNG : (int)TaskOutboundTypeEnum.Outbound,
                    TargetAddress = "",
                    TaskNum = taskNum, //_taskRepository.GetTaskNo().Result,
                    TaskId = 0,
                };
                WMSTaskDTO taskDTO = new WMSTaskDTO
                {
                    Id = 0,
                    Grade = 1,
                    PalletCode = result.PalletBarcode,
                    RoadWay = location.RoadwayNo,
                    SourceAddress = result.LocationID,
                    TargetAddress = result.LocationID,
                    TaskNum = taskNum,  //_taskRepository.GetTaskNo().Result,
                    TaskState = (int)TaskOutStatusEnum.OutNew,
                    TaskType = result.IsNG == 1 ? (int)TaskOutboundTypeEnum.OutNG : (int)TaskOutboundTypeEnum.Outbound,
                };
                var respon = HttpHelper.Post("http://localhost:9291/api/Task/ReceiveTask", JsonConvert.SerializeObject(taskDTO));
                if (respon != null)
                {
                }
                return content.OK();
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MCS/Partial/RequestChangeLocation.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_DTO;
namespace WIDESEA_StoragIntegrationServices
{
    public partial class MCSService
    {
        /// <summary>
        /// è¯·æ±‚移库
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public WebResponseContent RequestChangeLocation(object json)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (string.IsNullOrEmpty(json.ToString())) throw new Exception("上传参数为空");
                var result = JsonConvert.DeserializeObject<RequestReMove>(json.ToString());
                return content.OK();
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MCS/Partial/RequsetCellInfo.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Core;
using WIDESEA_DTO;
namespace WIDESEA_StoragIntegrationServices
{
    public partial class MCSService
    {
        /// <summary>
        /// èŽ·å–åº“ä½ä¿¡æ¯
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public WebResponseContent RequsetCellInfo(object json)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                if (string.IsNullOrEmpty(json.ToString())) throw new Exception("上传参数为空");
                var result = JsonConvert.DeserializeObject<RequsetCellInfo>(json.ToString());
                //_stockInfoRepository.QueryFirst(x=>x.LocationCode == result.LocationID && x)
                //todo
                return content.OK();
            }
            catch (Exception ex)
            {
                return content.Error(ex.Message);
            }
        }
    }
}
Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/MCS/MCSController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_DTO;
using WIDESEA_IStoragIntegrationServices;
namespace WIDESEA_WMSServer.Controllers;
[Route("api/[controller]")]
[ApiController]
public class MCSController : Controller
{
    private readonly IMCSService _MCSService;
    public MCSController(IMCSService MCSService) { _MCSService = MCSService; }
    [HttpPost("NotifyFinishTest")]
    public WebResponseContent NotifyFinishTest([FromBody] object input)
    {
        return _MCSService.NotifyFinishTest(input);
    }
    [HttpPost("RequestChangeLocation")]
    public WebResponseContent RequestChangeLocation([FromBody] object input)
    {
        return _MCSService.RequestChangeLocation(input);
    }
    [HttpPost("ModifyAccessStatus")]
    public WebResponseContent ModifyAccessStatus([FromBody] object input)
    {
        return _MCSService.ModifyAccessStatus(input);
    }
    [HttpPost("RequsetCellInfo")]
    public WebResponseContent RequsetCellInfo([FromBody] object input)
    {
        return _MCSService.RequsetCellInfo(input);
    }
}