From aacd99ebc27309c3fce8ddf2ccbdcae3f898c9e0 Mon Sep 17 00:00:00 2001 From: 刘磊 <1161824510@qq.com> Date: 星期一, 04 八月 2025 18:07:51 +0800 Subject: [PATCH] 同步 --- Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine_CW.cs | 342 ++++++++++++++ Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_CW/CommonConveyorLine_CWJob.cs | 632 ++++++++++++++++++++++++++ Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_CW/CWTask/RequestInbound.cs | 420 +++++++++++++++++ 3 files changed, 1,394 insertions(+), 0 deletions(-) diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine_CW.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine_CW.cs new file mode 100644 index 0000000..71d844a --- /dev/null +++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine_CW.cs @@ -0,0 +1,342 @@ +锘�#region << 鐗� 鏈� 娉� 閲� >> + +/*---------------------------------------------------------------- + * 鍛藉悕绌洪棿锛歐IDESEAWCS_QuartzJob + * 鍒涘缓鑰咃細鑳$搴� + * 鍒涘缓鏃堕棿锛�2024/8/2 16:13:36 + * 鐗堟湰锛歏1.0.0 + * 鎻忚堪锛氫竴鑸緭閫佺嚎瀹炵幇绫� + * + * ---------------------------------------------------------------- + * 淇敼浜猴細 + * 淇敼鏃堕棿锛� + * 鐗堟湰锛歏1.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_CW : 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_CW(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 == "DeviceCommand" && x.DeviceChildCode == deviceChildCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); + + if (devicePro == null) + { + throw new Exception($"銆恵_deviceCode}銆�--鏈壘鍒般�恵deviceChildCode}銆戝崗璁俊鎭�"); + } + 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($"鏈壘鍒般�恵deviceChildCode}銆戝崗璁俊鎭�"); + } + 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); + } + + //public bool IsOccupied(string deviceChildCode) + //{ + // if (Communicator.IsConnected) + // { + + // } + //} + + /// <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.DeviceChildCode == deviceChildCode && x.DeviceProParamName == "InteractiveSignal").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 == "InteractiveSignal" && 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 + } +} \ No newline at end of file diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_CW/CWTask/RequestInbound.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_CW/CWTask/RequestInbound.cs new file mode 100644 index 0000000..b15cf35 --- /dev/null +++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_CW/CWTask/RequestInbound.cs @@ -0,0 +1,420 @@ +锘縰sing Mapster; +using Masuit.Tools; +using Newtonsoft.Json; +using System.Threading.Tasks; +using WIDESEAWCS_Common; +using WIDESEAWCS_Common.TaskEnum; +using WIDESEAWCS_Core; +using WIDESEAWCS_Core.Helper; +using WIDESEAWCS_DTO.TaskInfo; +using WIDESEAWCS_DTO.WMS; +using WIDESEAWCS_Model.Models; +using WIDESEAWCS_QuartzJob; +using WIDESEAWCS_Tasks.ConveyorLineJob; +using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database; + +namespace WIDESEAWCS_Tasks +{ + public partial class CommonConveyorLine_CWJob + { + /// <summary> + /// 澶勭悊鍑哄簱浠诲姟 + /// </summary> + private void HandleTaskOut(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, int ProtocalDetailValue, Dt_Task taskOut) + { + if (taskOut == null) return; + + var taskCommand = MapTaskCommand(taskOut, command); + + bool isOutTray = taskOut.TaskType == (int)TaskOutboundTypeEnum.OutTray; + bool isOutboundAndOutFinish = taskOut.TaskType == (int)TaskOutboundTypeEnum.Outbound && taskOut.TaskState == (int)TaskOutStatusEnum.SC_OutFinish; + bool isOutboundAndLineOutExecuting = taskOut.TaskType == (int)TaskOutboundTypeEnum.Outbound && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting; + + if (isOutTray || isOutboundAndOutFinish || !isOutboundAndLineOutExecuting) + { + conveyorLine.SendCommand(taskCommand, childDeviceCode); + //ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); + _taskService.UpdateTaskStatusToNext(taskOut); + } + else if (taskOut.TaskType == (int)TaskOutboundTypeEnum.OutTray && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting) + { + CompleteWmsTask(taskOut, command, conveyorLine, childDeviceCode, ProtocalDetailValue); + } + } + + /// <summary> + /// 澶勭悊鏂颁换鍔� + /// </summary> + private void HandleNewTask(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) + { + Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode); + + if (stationManager == null) + { + // Handle the case where stationManager is not found, if necessary + Console.WriteLine($"鏈壘鍒皗childDeviceCode}绔欏彴"); + return; + } + + // 鏍规嵁绔欑被鍨嬫墽琛岀浉搴旂殑鏂规硶 + switch (stationManager.stationType) + { + case 8: + case 9: + case 11: + case 12: + var task = _taskService.QueryExecutingTaskByBarcode(command.ConveyorLineBarcode, childDeviceCode); + if (task != null) + { + ExecuteStationAction(stationManager, conveyorLine, command, childDeviceCode); + } + break; + case 1: + case 6: + case 10: + ExecuteStationAction(stationManager, conveyorLine, command, childDeviceCode); + break; + //case 16: + // ExecuteStationAction(stationManager, conveyorLine, command, childDeviceCode); + // break; + } + + #region + //Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode); + + //if (stationManager.stationType == 8) + //{ + // var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode); + // if (task != null) + // { + // RequestInNextAddress(conveyorLine, command, childDeviceCode); + // } + //} + //else if (stationManager.stationType == 9) + //{ + // var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode); + // if (task != null) + // { + // ConveyorLineInFinish(conveyorLine, command, childDeviceCode); + // } + //} + //else if (stationManager.stationType == 1) + //{ + // if (stationManager.stationArea.Contains("GW")) + // { + // var taskGW = _taskRepository.QueryFirst(x => x.TargetAddress == childDeviceCode && x.TaskState == (int)TaskOutStatusEnum.OutFinish); + // if (taskGW != null) + // { + // command.ConveyorLineBarcode = taskGW.PalletCode; + // } + // } + // RequestWmsTask(conveyorLine, command, childDeviceCode); + //} + //else if (stationManager.stationType == 10) + //{ + // var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); + // if (task != null) + // { + // RequestOutbound(conveyorLine, command, childDeviceCode); + // } + //} + //else if (stationManager.stationType == 11) + //{ + // var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode); + // if (task != null) + // { + // RequestOutNextAddress(conveyorLine, command, childDeviceCode); + // } + //} + //else if (stationManager.stationType == 12) + //{ + // var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode); + // if (task != null) + // { + // ConveyorLineOutFinish(conveyorLine, command, childDeviceCode); + // } + //} + #endregion + } + + private void ExecuteStationAction(Dt_StationManager stationManager, CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) + { + switch (stationManager.stationType) + { + case 8: + RequestInNextAddress(conveyorLine, command, childDeviceCode); + break; + + case 9: + ConveyorLineInFinish(conveyorLine, command, childDeviceCode); + break; + + case 10: + RequestOutbound(conveyorLine, command, childDeviceCode); + break; + + case 11: + RequestOutNextAddress(conveyorLine, command, childDeviceCode); + break; + + case 12: + ConveyorLineOutFinish(conveyorLine, command, childDeviceCode); + break; + + case 6: + CreateAndSendEmptyTrayTask(conveyorLine, command, childDeviceCode); + break; + case 16: + AbNormalStationBZTask(conveyorLine, command, childDeviceCode); + break; + case 1: + + //if (stationManager.stationArea.Contains("GW")) + //{ + //var taskGW = _taskRepository.QueryFirst(x => x.TargetAddress == childDeviceCode && (x.TaskState == (int)TaskOutStatusEnum.OutFinish || x.TaskState == (int)TaskOutStatusEnum.OutPending)); + //if (taskGW != null) + //{ + // command.ConveyorLineBarcode = taskGW.PalletCode; + //} + //} + //濡傞珮娓╁嚭搴撳悗浠诲姟鏍囪NG寮傚父鍒欏皢浠诲姟鏇存柊涓哄紓甯告帓鍑轰换鍔� --鍐犲畤鍙栨秷瓒呮椂妫�娴嬪悗 鎵樼洏瓒呮椂涓嶅湪鍑哄簱鑷冲紓甯稿彛 + //Dt_Task NGtask = _taskRepository.QueryFirst(x => x.Remark == "NG" && x.Roadway == stationManager.Roadway && x.Roadway.Contains("GW")); + //if (NGtask != null) + //{ + // CreateAbNormalOutbound(conveyorLine, command, childDeviceCode, NGtask); + // break; + //} + + RequestWmsTask(conveyorLine, command, childDeviceCode, stationManager); + break; + } + } + + /// <summary> + /// 鏄犲皠浠诲姟鍛戒护 + /// </summary> + private ConveyorLineTaskCommand_After MapTaskCommand(Dt_Task task, ConveyorLineTaskCommand_After command) + { + var comm = _mapper.Map<ConveyorLineTaskCommand_After>(task); + comm.InteractiveSignal = command.InteractiveSignal; + return comm; + } + + /// <summary> + /// 瀹屾垚WMS浠诲姟 + /// </summary> + private void CompleteWmsTask(Dt_Task taskOut, ConveyorLineTaskCommand_After command, CommonConveyorLine_CW conveyorLine, string childDeviceCode, int ProtocalDetailValue) + { + if (command.ConveyorLineBarcode == "NoRead") + { + var NGAddress = _platFormRepository.QueryFirst(x => x.PlatCode == taskOut.TargetAddress).Capacity; + taskOut.TargetAddress = NGAddress.ToString(); + } + + var keys = new Dictionary<string, object>() + { + {"taskNum", taskOut.TaskNum} + }; + var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); + var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue; + var completeTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.CompleteTask)?.ConfigValue; + if (wmsBase == null || completeTask == null) + { + throw new InvalidOperationException("WMS IP 鏈厤缃�"); + } + var wmsIpAddress = wmsBase + completeTask; + + var result = HttpHelper.GetAsync(wmsIpAddress, keys).Result; + WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result); + if (content.Status) + { + //ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); + _taskService.UpdateTaskStatusToNext(taskOut); + } + } + + /// <summary> + /// 鍒涘缓骞跺彂閫佺┖鎵樼洏浠诲姟 + /// </summary> + public void CreateAndSendEmptyTrayTask(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) + { + if (command.ConveyorLineBarcode != "NoRead") + { + var taskDTO = CreateEmptyTrayTaskDto(command.ConveyorLineBarcode, childDeviceCode); + + if (_taskRepository.QueryFirst(x => x.PalletCode == command.ConveyorLineBarcode) != null) + { + List<string> strings = new List<string>() { "1743", "1739", "1837", "1841" }; + + var taskExecuting = _taskRepository.QueryFirst(x => x.PalletCode == command.ConveyorLineBarcode && x.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting && strings.Contains(x.TargetAddress)); + + if (taskExecuting != null) + { + taskExecuting.ExceptionMessage = "鏈帴鏀跺埌绾夸綋瀹屾垚淇″彿绯荤粺鍐呴儴鑷姩瀹屾垚"; + _taskService.Delete(taskExecuting); + } + + ConsoleHelper.WriteErrorLine($"褰撳墠鎵樼洏瀛樺湪浠诲姟锛氥�恵command.ConveyorLineBarcode}銆�"); + + WriteInfo(conveyorLine.DeviceName, $"褰撳墠鎵樼洏瀛樺湪浠诲姟{command.ConveyorLineBarcode}"); + } + + var content = CreateAndSendTask(taskDTO); + if (content.Status) + { + var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode, command.ConveyorLineBarcode); + if (task != null) + { + var taskCommand = MapTaskCommand(task, command); + + bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode); + if (sendFlag) + { + _taskService.UpdateTaskStatusToNext(task); + } + } + } + } + } + + /// <summary> + /// 鍒涘缓绌烘墭鐩樹换鍔TO + /// </summary> + private WMSTaskDTO CreateEmptyTrayTaskDto(string barcode, string childDeviceCode) + { + var request = new RequestTaskDto() + { + Position = childDeviceCode, + PalletCode = barcode, + }; + + var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); + var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue; + var requestTrayInTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.RequestTrayInTask)?.ConfigValue; + if (wmsBase == null || requestTrayInTask == null) + { + throw new InvalidOperationException("WMS IP 鏈厤缃�"); + } + var wmsIpAddrss = wmsBase + requestTrayInTask; + var result = HttpHelper.PostAsync(wmsIpAddrss, request.ToJsonString()).Result; + if (result == null) + return new WMSTaskDTO(); + + WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result); + if (!content.Status) + return new WMSTaskDTO(); + + return JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString()); + } + + /// <summary> + /// 璇锋眰WMS浠诲姟 + /// </summary> + private async void RequestWmsTask(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, Dt_StationManager stationManager) + { + try + { + if (command.ConveyorLineBarcode.IsNullOrEmpty()) return; + var content = await _taskService.RequestWMSTask(command.ConveyorLineBarcode, childDeviceCode); + if (content.Status) + { + var task = _taskService.QueryBarCodeConveyorLineTask(command.ConveyorLineBarcode, childDeviceCode); + if (task != null) + { + if (childDeviceCode == "1039") + { + var GWTask = _taskRepository.QueryData(x => x.Roadway.Contains("GWSC2") && x.SourceAddress == "1039" && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskInStatusEnum.Line_InFinish)).ToList(); + if (GWTask.Count >= 2 && childDeviceCode == "1039" && task.Roadway.Contains("GWSC2")) + { + ConsoleHelper.WriteErrorLine($"鎵樼洏鍙凤細銆恵command.ConveyorLineBarcode}銆戦珮娓╀簩宸插瓨鍦ㄣ�恵GWTask.Count}銆戜釜浠诲姟澶т簬2涓换鍔′笉鍙笅鍙�"); + return; + } + } + + ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task); + //conveyorLine.SendCommand(taskCommand, childDeviceCode); + + bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode); + if (sendFlag) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + + _taskService.UpdateTaskStatusToNext(task); + } + } + } + else + { + if (content.Message != "璇锋眰杩囦簬棰戠箒锛岃绋嶅悗鍐嶈瘯" && content.Message != "鏃犳硶鑾峰彇鐩爣鍦板潃") + { + WriteInfo(conveyorLine.DeviceName, content.Message); + conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, stationManager.stationNGChildCode, childDeviceCode); + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + ConsoleHelper.WriteErrorLine($"銆恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戣姹傜偣浣嶏細銆恵childDeviceCode}銆戝紓甯镐俊鎭�恵content.Message}銆�"); + WriteInfo(conveyorLine.DeviceName, $"銆恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戣姹傜偣浣嶏細銆恵childDeviceCode}銆戝紓甯镐俊鎭�恵content.Message}銆�"); + } + ConsoleHelper.WriteErrorLine($"銆恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戣姹傜偣浣嶏細銆恵childDeviceCode}銆戝紓甯镐俊鎭�恵content.Message}銆�"); + } + } + catch (Exception ex) + { + WriteInfo(conveyorLine.DeviceName, $"銆恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戣姹傜偣浣嶏細銆恵childDeviceCode}銆戝紓甯镐俊鎭�恵ex.Message}銆戝紓甯歌銆恵ex.StackTrace}銆�"); + } + + } + + /// <summary> + /// 楂樻俯鍑哄簱鍚庝换鍔″畬鎴� 濡傛灉浠诲姟鏍囪瘑NG鍒欏皢浠诲姟鏀逛负寮傚父鎺掑嚭浠诲姟 + /// </summary> + /// <param name="conveyorLine"></param> + /// <param name="command"></param> + /// <param name="childDeviceCode"></param> + /// <param name="task"></param> + /// <exception cref="Exception"></exception> + private void CreateAbNormalOutbound(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, Dt_Task task) + { + Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode); + + if (stationManager == null || string.IsNullOrWhiteSpace(stationManager.stationNGChildCode) || string.IsNullOrWhiteSpace(stationManager.stationNGLocation)) + { + throw new Exception("鏈厤缃珯鍙扮殑瀵瑰簲NG鍙d俊鎭�"); + } + + task.SourceAddress = task.TargetAddress; + task.TargetAddress = stationManager.stationNGLocation; + task.TaskState = (int)TaskOutStatusEnum.OutNew; + task.TaskType = (int)TaskOutboundTypeEnum.InToOut; + task.Grade = 10; //姝ゅ 鍑哄簱鑷冲紓甯告帓鍑哄彛鐨勪换鍔″簲闄ょ伀璀﹀鏈�浼樺厛鎵ц + + _taskRepository.UpdateData(task); + //Dt_Task task= _taskRepository.QueryFirst(x=>) + //_taskRepository.QueryFirst() + } + + /// <summary> + /// 鍖呰寮傚父鎺掑嚭鍙i�昏緫 + /// </summary> + /// <param name="conveyorLine"></param> + /// <param name="command"></param> + /// <param name="childDeviceCode"></param> + private void AbNormalStationBZTask(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) + { + Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode && x.stationPLC == conveyorLine.DeviceCode); + + if (command.ConveyorLineBarcode.IsNullOrEmpty()) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + return; + } + + + if (conveyorLine.ReadValue(ConveyorLineDBName_After.InteractiveSignal, childDeviceCode).ObjToInt() == 0) //鎵樼洏姝e弽淇″彿 + { + + } + ; + conveyorLine.ReadValue(ConveyorLineDBName_After.InteractiveSignal, childDeviceCode); //鎵樼洏鏈夋棤鐢佃姱淇″彿 + } + + } +} \ No newline at end of file diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_CW/CommonConveyorLine_CWJob.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_CW/CommonConveyorLine_CWJob.cs new file mode 100644 index 0000000..ecb95db --- /dev/null +++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_CW/CommonConveyorLine_CWJob.cs @@ -0,0 +1,632 @@ +锘�#region MyRegion + +#region << 鐗� 鏈� 娉� 閲� >> + +/*---------------------------------------------------------------- + * 鍛藉悕绌洪棿锛歐IDESEAWCS_Tasks.ConveyorLineJob + * 鍒涘缓鑰咃細鑳$搴� + * 鍒涘缓鏃堕棿锛�2024/8/2 16:13:36 + * 鐗堟湰锛歏1.0.0 + * 鎻忚堪锛� + * + * ---------------------------------------------------------------- + * 淇敼浜猴細 + * 淇敼鏃堕棿锛� + * 鐗堟湰锛歏1.0.1 + * 淇敼璇存槑锛� + * + *----------------------------------------------------------------*/ + +#endregion << 鐗� 鏈� 娉� 閲� >> + +using AutoMapper; +using HslCommunication; +using Masuit.Tools; +using Microsoft.CodeAnalysis; +using Newtonsoft.Json; +using Quartz; +using SqlSugar; +using System.ComponentModel.Design; +using System.Reflection; +using WIDESEAWCS_BasicInfoRepository; +using WIDESEAWCS_Common; +using WIDESEAWCS_Common.TaskEnum; +using WIDESEAWCS_Core; +using WIDESEAWCS_Core.Helper; +using WIDESEAWCS_Core.HttpContextUser; +using WIDESEAWCS_DTO.MOM; +using WIDESEAWCS_DTO.TaskInfo; +using WIDESEAWCS_IProcessRepository; +using WIDESEAWCS_ISystemServices; +using WIDESEAWCS_ITaskInfoRepository; +using WIDESEAWCS_ITaskInfoService; +using WIDESEAWCS_Model.Models; +using WIDESEAWCS_QuartzJob; +using WIDESEAWCS_QuartzJob.DTO; +using WIDESEAWCS_QuartzJob.Repository; +using WIDESEAWCS_QuartzJob.Service; +using WIDESEAWCS_SignalR; +using WIDESEAWCS_Tasks.ConveyorLineJob; +using ICacheService = WIDESEAWCS_Core.Caches.ICacheService; +using Platform = WIDESEAWCS_Model.Models.Platform; + +namespace WIDESEAWCS_Tasks +{ + [DisallowConcurrentExecution] + public partial class CommonConveyorLine_CWJob : JobBase, IJob + { + public readonly ITaskService _taskService; + private readonly ITaskRepository _taskRepository; + private readonly ITaskExecuteDetailService _taskExecuteDetailService; + private readonly IRouterService _routerService; + private readonly IPlatFormRepository _platFormRepository; + private readonly ISys_ConfigService _sys_ConfigService; + private readonly IMapper _mapper; + private readonly IDt_StationManagerRepository _stationManagerRepository; + private readonly ICacheService _cacheService; + private readonly INoticeService _noticeService; + private readonly IDt_needBarcodeRepository _needBarcodeRepository; + private readonly IDeviceInfoRepository _deviceInfoRepository; + private static List<string>? userTokenIds; + private static List<int>? userIds; + private static List<string> childCodeList = new List<string>(); + + public CommonConveyorLine_CWJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper, ITaskRepository taskRepository, IPlatFormRepository platFormRepository, ISys_ConfigService sys_ConfigService, IDt_StationManagerRepository stationManagerRepository, ICacheService cacheService, INoticeService noticeService, IDt_needBarcodeRepository needBarcodeRepository, IDeviceInfoRepository deviceInfoRepository) + { + _taskService = taskService; + _taskExecuteDetailService = taskExecuteDetailService; + _routerService = routerService; + _mapper = mapper; + _taskRepository = taskRepository; + _platFormRepository = platFormRepository; + _sys_ConfigService = sys_ConfigService; + _stationManagerRepository = stationManagerRepository; + _cacheService = cacheService; + _noticeService = noticeService; + _needBarcodeRepository = needBarcodeRepository; + _deviceInfoRepository = deviceInfoRepository; + } + + public Task Execute(IJobExecutionContext context) + { + try + { + CommonConveyorLine_CW conveyorLine = (CommonConveyorLine_CW)context.JobDetail.JobDataMap.Get("JobParams"); + if (conveyorLine != null) + { + #region 绔欏彴鏂瑰紡 + + //List<Dt_StationManager> stationManagers = _stationManagerService.GetAllStationByDeviceCode(conveyorLine.DeviceCode); + + //foreach (var station in stationManagers) + //{ + // ConveyorLineTaskCommand_After command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand_After>(station.stationChildCode); + + // 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, station }); + // } + // } + //} + + #endregion 绔欏彴鏂瑰紡 + + #region 璺敱鏂瑰紡 + + List<string> childDeviceCodes = _routerService.QueryAllPositions(conveyorLine.DeviceCode); + DateTime dateTime = DateTime.Now; + Console.WriteLine($"寰幆寮�濮嬫椂闂磠dateTime}"); + foreach (string childDeviceCode in childDeviceCodes) + { + //Thread.Sleep(1000); + //if (childCodeList.Contains(childDeviceCode)) + //{ + // Console.WriteLine($"褰撳墠{childDeviceCode}鎵ц涓紝宸茶烦杩�"); + // continue; + //} + //childCodeList.Add(childDeviceCode); + //Console.WriteLine(childDeviceCode); + ConveyorLineTaskCommand_After command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand_After>(childDeviceCode); + + if (command == null) continue; + //if (command.InteractiveSignal == 0 && command.HasPallet != 1) continue; + 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 }); + } + } + + if (childDeviceCode == "1670" || childDeviceCode == "1666" || childDeviceCode == "1548" || childDeviceCode == "1448") + { + Platform platform = _platFormRepository.QueryFirst(x => x.DeviceCode == conveyorLine.DeviceCode && x.PlatCode == childDeviceCode && x.Status == "Active"); + if (platform != null) + { + if (command.HasPallet != 1) + { + MethodInfo? method = GetType().GetMethod(platform.ExecutionMethod); + if (method != null) + { + //var strings = platform.Location.Split(',').ToList(); + int count = 1; + method.Invoke(this, new object[] { conveyorLine, command, childDeviceCode, count, platform }); + } + } + } + } + + //childCodeList.Remove(childDeviceCode); + + #region 璋冪敤浜嬩欢鎬荤嚎閫氱煡鍓嶇 + + var tokenInfos = _cacheService.Get<List<UserInfo>>("Cache_UserToken"); + if (tokenInfos == null || !tokenInfos.Any()) + { + //throw new Exception(conveyorLine.DeviceName + "缂撳瓨涓湭鎵惧埌Token缂撳瓨"); + continue; + } + var userTokenIds = tokenInfos?.Select(x => x.Token_ID).ToList(); + var userIds = tokenInfos?.Select(x => x.UserId).ToList(); + + object obj = new + { + childDeviceCode, + commandAfter = command, + }; + _noticeService.LineData(userIds?.FirstOrDefault(), userTokenIds, new { conveyorLine.DeviceName, data = obj }); + + #endregion 璋冪敤浜嬩欢鎬荤嚎閫氱煡鍓嶇 + + } + DateTime ENDdateTime = DateTime.Now; + Console.WriteLine($"寰幆缁撴潫鏃堕棿{ENDdateTime}"); + + #endregion 璺敱鏂瑰紡 + } + } + catch (Exception ex) + { + Console.Out.WriteLine(nameof(CommonConveyorLine_CWJob) + ":" + DateTime.Now + ":" + 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_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) + { + try + { + var task = _taskService.QueryBarCodeConveyorLineTask(command.ConveyorLineBarcode, childDeviceCode); + var log = $"鏃堕棿锛氥�恵DateTime.Now}銆戙�恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戜换鍔″彿锛氥�恵command.ConveyorLineTaskNum}銆戣澶囩紪鐮侊細銆恵childDeviceCode}銆�"; + ConsoleHelper.WriteSuccessLine(log); + + //_noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" }); + WriteInfo(conveyorLine.DeviceName, log); + + if (task == null) + { + HandleNewTask(conveyorLine, command, childDeviceCode); + } + else + { + if (childDeviceCode == "1039") + { + var GWTask = _taskRepository.QueryData(x => x.Roadway.Contains("GWSC2") && x.SourceAddress == "1039" && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskInStatusEnum.Line_InFinish)).ToList(); + if (GWTask.Count >= 2 && childDeviceCode == "1039" && task.Roadway.Contains("GWSC2")) + { + ConsoleHelper.WriteErrorLine($"鏃堕棿锛氥�恵DateTime.Now}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戦珮娓╀簩宸插瓨鍦ㄣ�恵GWTask.Count}銆戜釜浠诲姟澶т簬2涓换鍔′笉鍙笅鍙�"); + return; + } + } + + ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task); + + bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode); + if (sendFlag) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + _taskService.UpdateTaskStatusToNext(task); + } + } + } + catch (Exception ex) + { + Console.Out.WriteLine(ex.ToString()); + } + } + + /// <summary> + /// 杈撻�佺嚎璇锋眰鍏ュ簱涓嬩竴鍦板潃 + /// </summary> + /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param> + /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param> + /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param> + public void RequestInNextAddress(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) + { + Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode, command.ConveyorLineBarcode); + if (task != null) + { + if (command.ConveyorLineBarcode != task.PalletCode) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + return; + } + + Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress); + if (newTask != null) + { + ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(newTask); + //conveyorLine.SendCommand(taskCommand, childDeviceCode); + + bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode); + if (sendFlag) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + _taskService.UpdateData(newTask); + } + } + } + //else + //{ + // //褰撳墠鍦板潃璇锋眰 瀵绘壘褰撳墠鍦板潃鐨勬墭鐩樺彿 浠诲姟鍙风殑浠诲姟锛屽瀛樺湪浠诲姟鍒欓噸鏂板啀娆″啓鍏ユ柊鐩爣鍦板潃 + // Dt_Task currentTask = _taskService.QueryExecutingCurrentConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode, command.ConveyorLineBarcode); + // if (currentTask != null) + // { + // conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, Convert.ToInt16(currentTask.TargetAddress), childDeviceCode); + // } + //} + } + + /// <summary> + /// 杈撻�佺嚎鍏ュ簱瀹屾垚 + /// </summary> + /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param> + /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param> + /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param> + /// <param name="ProtocalDetailValue">绾夸綋褰撳墠bool璇诲彇鍋忕Щ鍦板潃</param> + public void ConveyorLineInFinish(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) + { + var task = _taskService.QueryExecutingTaskByBarcode(command.ConveyorLineBarcode, childDeviceCode); + if (task != null && task.TaskState != (int)TaskInStatusEnum.Line_InFinish) + { + WebResponseContent content = _taskService.UpdateTaskStatusToNext(task); + + if (content.Status) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + } + + Console.Out.WriteLine(content.Serialize()); + } + } + + /// <summary> + /// 杈撻�佺嚎璇锋眰鍑轰俊鎭� + /// </summary> + /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param> + /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param> + /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param> + /// <param name="ProtocalDetailValue">绾夸綋褰撳墠bool璇诲彇鍋忕Щ鍦板潃</param> + public void RequestOutbound(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) + { + var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); + if (task != null) + { + ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task); + //conveyorLine.SendCommand(taskCommand, childDeviceCode); + + bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode); + if (sendFlag) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + + _taskService.UpdateTaskStatusToNext(task); + if (task.TaskType == (int)TaskOutboundTypeEnum.OutTray) + { + _taskService.UpdateTaskStatusToNext(task); + } + } + } + } + + /// <summary> + /// 杈撻�佺嚎璇锋眰鍑哄簱涓嬩竴鍦板潃 + /// </summary> + /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param> + /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param> + /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param> + public void RequestOutNextAddress(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) + { + Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode, command.ConveyorLineBarcode); + if (task != null) + { + var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); + var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.MOMIP_BASE)?.ConfigValue; + var ipAddress = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.TrayCellsStatus)?.ConfigValue; + if (wmsBase == null || ipAddress == null) + { + throw new InvalidOperationException("MOM IP 鏈厤缃�"); + } + Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode); + TrayCellsStatusDto trayCells = new TrayCellsStatusDto() + { + Software = "WMS", + TrayBarcode = command.ConveyorLineBarcode, + EquipmentCode = stationManager.stationEquipMOM, + SessionId = Guid.NewGuid().ToString(), + EmployeeNo = "MITest", + SceneType = "1", + RequestTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now).ToString("yyyy-MM-ddTHH:mm:ss.fffZ") + }; + + var MOMIpAddress = wmsBase + ipAddress; + + var result = HttpHelper.PostAsync(MOMIpAddress, trayCells.Serialize()).Result; + WriteInfo("鍏ョ珯鏍¢獙", $"銆恵childDeviceCode}銆戝叆绔欐牎楠岃姹傚弬鏁般�恵trayCells.Serialize()}銆�"); + WriteInfo("鍏ョ珯鏍¢獙", ""); + WriteInfo("鍏ョ珯鏍¢獙", $"銆恵childDeviceCode}銆戝叆绔欐牎楠岃繑鍥炲弬鏁般�恵result}銆�"); + ResultTrayCellsStatus result1 = JsonConvert.DeserializeObject<ResultTrayCellsStatus>(result); + if (result1.Success || task.Remark != "NG") + { + Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress); + if (newTask != null) + { + ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(newTask); + //conveyorLine.SendCommand(taskCommand, childDeviceCode); + + bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode); + if (sendFlag) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + _taskService.UpdateData(newTask); + } + } + } + else + { + ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task); + taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(stationManager.stationNGChildCode); + //conveyorLine.SendCommand(taskCommand, childDeviceCode); + + bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode); + if (sendFlag) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + _taskService.UpdateTaskStatusToNext(task); + } + } + } + } + + /// <summary> + /// 杈撻�佺嚎鍑哄簱瀹屾垚 + /// </summary> + /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param> + /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param> + /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param> + public void ConveyorLineOutFinish(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) + { + var log = $"鏃堕棿锛氥�恵DateTime.Now}銆戙�恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戜换鍔″彿锛氥�恵command.ConveyorLineTaskNum}銆戣澶囩紪鐮侊細銆恵childDeviceCode}銆�"; + ConsoleHelper.WriteSuccessLine(log); + + //_noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" }); + WriteInfo(conveyorLine.DeviceName, log); + + + var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode, command.ConveyorLineBarcode); + if (task != null) + { + WebResponseContent content = new WebResponseContent(); + ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task); + taskCommand.InteractiveSignal = command.InteractiveSignal; + Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode); + if (task.PalletCode != command.ConveyorLineBarcode) + { + taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(stationManager.stationNGChildCode); + } + else + { + taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(stationManager.stationLocation); + } + + if (stationManager.stationPLC == "1018" && stationManager.stationArea == "Cache") //鏇存柊鍦ㄩ�旀暟鎹� + { + dt_needBarcode needBarcode = _needBarcodeRepository.QueryFirst(x => x.productLine == stationManager.productLine && x.toArea == stationManager.stationChildCode); + + if (needBarcode != null) + { + needBarcode.inLineNum--; + _needBarcodeRepository.UpdateData(needBarcode); + } + } + + //conveyorLine.SendCommand(taskCommand, childDeviceCode); + bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode); + if (sendFlag) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + content = _taskService.UpdateTaskStatusToNext(task); + } + } + else + { + var taskNext = _taskService.QueryExecutingConveyorLineTask(childDeviceCode, command.ConveyorLineBarcode); + if (taskNext != null) + { + WebResponseContent content = new WebResponseContent(); + ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(taskNext); + taskCommand.InteractiveSignal = command.InteractiveSignal; + Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode); + if (taskNext.PalletCode != command.ConveyorLineBarcode) + { + taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(stationManager.stationNGChildCode); + } + else + { + taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(stationManager.stationLocation); + } + + if (stationManager.stationPLC == "1018" && stationManager.stationArea == "Cache") //鏇存柊鍦ㄩ�旀暟鎹� + { + dt_needBarcode needBarcode = _needBarcodeRepository.QueryFirst(x => x.productLine == stationManager.productLine && x.toArea == stationManager.stationChildCode); + + if (needBarcode != null) + { + needBarcode.inLineNum--; + _needBarcodeRepository.UpdateData(needBarcode); + } + } + + //conveyorLine.SendCommand(taskCommand, childDeviceCode); + + bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode); + if (sendFlag) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode); + + taskNext.ExceptionMessage = log; + content = _taskService.UpdateTaskStatusToNext(taskNext); + } + } + } + } + + /// <summary> + /// 鐩戞祴绌烘墭鐩樺疄鐩樺嚭搴� + /// </summary> + /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param> + /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param> + /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param> + /// <param name="index">绾夸綋褰撳墠bool璇诲彇鍋忕Щ鍦板潃</param> + public async void EmptyTrayReturn(CommonConveyorLine_CW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, int index, WIDESEAWCS_Model.Models.Platform platform) + { + try + { + TaskOutboundTypeEnum taskOutboundTypeEnum; + if (platform.PlatformType.Contains("OutTray")) + taskOutboundTypeEnum = TaskOutboundTypeEnum.OutTray; + else + taskOutboundTypeEnum = TaskOutboundTypeEnum.Outbound; + await CheckAndCreateTask(taskOutboundTypeEnum, childDeviceCode, index, platform); + } + catch (Exception) + { + } + } + + /// <summary> + /// 妫�鏌ヤ换鍔″苟鍒涘缓鏂颁换鍔� + /// </summary> + private async Task CheckAndCreateTask(TaskOutboundTypeEnum taskType, string childDeviceCode, int index, Platform platform) + { + var tasks = _taskRepository.QueryData(x => x.TaskType == (int)taskType && x.TargetAddress == childDeviceCode); + if (tasks.Count < platform.Capacity) + { + #region 璋冪敤WMS鑾峰彇鍑哄簱浠诲姟 + + WMSTaskDTO taskDTO = new WMSTaskDTO(); + + // 鑾峰彇WMSip鍦板潃 + var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); + var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue; + var requestTrayOutTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.RequestTrayOutTask)?.ConfigValue; + if (wmsBase == null || requestTrayOutTask == null) + { + throw new InvalidOperationException("WMS IP 鏈厤缃�"); + } + var wmsIpAddress = wmsBase + requestTrayOutTask; + + //var device = _deviceInfoRepository.QueryData(x => x.DeviceStatus == "1" && x.DeviceRemark == platform.Id.ToString()); + //var deviceCode = device.Select(x => x.DeviceCode).ToList(); + List<string> strings = platform.Location.Split(',').ToList(); + + var result = await HttpHelper.PostAsync(wmsIpAddress, new { Position = childDeviceCode, Tag = (int)taskType, AreaCdoe = platform.Stacker, AreaCdoes = strings, platform.ProductionLine }.Serialize()); + //var result = await HttpHelper.PostAsync("http://localhost:5000/api/Task/RequestTrayOutTaskAsync", dynamic.ToJsonString()); + + WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result); + + // 妫�鏌ョ姸鎬佸苟杩斿洖 + if (!content.Status) + return; + + taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString()); + + #endregion 璋冪敤WMS鑾峰彇鍑哄簱浠诲姟 + + CreateAndSendTask(taskDTO); + } + } + + /// <summary> + /// 鍒涘缓浠诲姟 + /// </summary> + public WebResponseContent CreateAndSendTask(WMSTaskDTO taskDTO) + { + var content = _taskService.ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO }); + if (content.Status) + { + Console.WriteLine($"{taskDTO.TaskType}鍛煎彨鎴愬姛"); + } + return content; + } + + public bool SendCommand(ConveyorLineTaskCommand_After taskCommand, CommonConveyorLine_CW conveyorLine, string childDeviceCode) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, Convert.ToInt16(taskCommand.ConveyorLineTargetAddress), childDeviceCode); + Thread.Sleep(100); + conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineBarcode, taskCommand.ConveyorLineBarcode, childDeviceCode); + Thread.Sleep(100); + conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTaskNum, taskCommand.ConveyorLineTaskNum, childDeviceCode); + for (int i = 0; i < 6; i++) + { + ConveyorLineTaskCommand_After command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand_After>(childDeviceCode); + if (command != null) + { + if (command.ConveyorLineBarcode == taskCommand.ConveyorLineBarcode && command.ConveyorLineTaskNum == taskCommand.ConveyorLineTaskNum && command.ConveyorLineTargetAddress == taskCommand.ConveyorLineTargetAddress) + { + WriteInfo(conveyorLine.DeviceName, $"鏃堕棿锛氥�恵DateTime.Now}銆戝啓鍏ヤ换鍔℃垚鍔熷啓鍏ユ鏁皗i}鍐欏叆浠诲姟銆恵JsonConvert.SerializeObject(taskCommand)}銆�"); + return true; + } + if (command.ConveyorLineTargetAddress != taskCommand.ConveyorLineTargetAddress) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, Convert.ToInt16(taskCommand.ConveyorLineTargetAddress), childDeviceCode); + Thread.Sleep(100); + } + if (command.ConveyorLineBarcode != taskCommand.ConveyorLineBarcode) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineBarcode, taskCommand.ConveyorLineBarcode, childDeviceCode); + Thread.Sleep(100); + } + if (command.ConveyorLineTaskNum != taskCommand.ConveyorLineTaskNum) + { + conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTaskNum, taskCommand.ConveyorLineTaskNum, childDeviceCode); Thread.Sleep(100); + } + + } + } + WriteInfo(conveyorLine.DeviceName, $"鏃堕棿锛氥�恵DateTime.Now}銆戝啓鍏ヤ换鍔″け璐ヤ换鍔″彿銆恵taskCommand.ConveyorLineTaskNum}銆戞墭鐩樺彿銆恵taskCommand.ConveyorLineBarcode}銆戠洰鏍囧湴鍧�銆恵taskCommand.ConveyorLineTargetAddress}銆戝綋鍓嶈妭鐐广�恵childDeviceCode}銆�"); + return false; + } + } +} +#endregion \ No newline at end of file -- Gitblit v1.9.3