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