#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEAWCS_Tasks.ConveyorLineJob * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using AutoMapper; using HslCommunication; using Quartz; using System; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using WIDESEA_Common.Log; using WIDESEAWCS_BasicInfoService; using WIDESEAWCS_Common; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_DTO.BasicInfo; using WIDESEAWCS_IBasicInfoRepository; using WIDESEAWCS_IBasicInfoService; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_Model.Models.System; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_Tasks.ConveyorLineJob; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class CommonConveyorLineOutJob : JobBase, IJob { private readonly ITaskService _taskService; private readonly IMapper _mapper; private readonly IOrderDetailsService _orderDetailsService; private readonly ITaskRepository _taskRepository; private readonly IContainerRepository _containerRepository; private static Dt_Container DischargeContainer; private static int dischargeStation = 8; public CommonConveyorLineOutJob(ITaskService taskService, IMapper mapper, IOrderDetailsService orderDetailsService, ITaskRepository taskRepository, IContainerRepository containerRepository) { _taskService = taskService; _mapper = mapper; _orderDetailsService = orderDetailsService; _taskRepository = taskRepository; _containerRepository = containerRepository; } public Task Execute(IJobExecutionContext context) { if (DischargeContainer == null) { DischargeContainer = _containerRepository.QueryFirst(x => x.ContainerEnable && x.ContainerType == ContainerTypeEnum.DischargeContainer.ObjToInt()); if (DischargeContainer != null) { dischargeStation = DischargeContainer.ContainerNo; } } bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (flag && value != null && value is OtherDevice) { OtherDevice otherDevice = (OtherDevice)value; try { bool request = otherDevice.GetValue(ConveyorLineStationDBName.PLCStationRequest); //申请 bool response = otherDevice.GetValue(ConveyorLineStationDBName.PLCStationResponse); //应答 bool wcsResponse = otherDevice.GetValue(ConveyorLineStationDBName.WCSStationResponse); //应答 if (request && !response && !wcsResponse) { DeviceProDTO? devicePro = otherDevice.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == ConveyorLineStationDBName.PLCStationBarcode.ToString()); if (devicePro != null) { string barcode = otherDevice.GetValue(ConveyorLineStationDBName.PLCStationBarcode); //List bytes = otherDevice.Communicator.Read(devicePro.DeviceProAddress, devicePro.DeviceProDataLength).ToList(); //byte[] temp = bytes.ToArray().SelectMiddle(2, bytes.IndexOf(0) - 2); //barcode = Encoding.Default.GetString(temp); if (!string.IsNullOrEmpty(barcode)) { OrderInfo orderInfo = _orderDetailsService.GetOrderInfoByBarcode(barcode); if (orderInfo.Width > AppSettings.Get("MaxWidth").ObjToInt() && orderInfo.Width < AppSettings.Get("MinWidth").ObjToInt()) { otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Length)); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Width)); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Thickness)); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, dischargeStation); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, 999); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true); } else { Dt_Task task = _taskRepository.QueryFirst(x => x.PalletCode == barcode); if (task == null) { try { task = _taskService.GenerateTask(orderInfo); if (task != null) { if (!string.IsNullOrEmpty(task.ItemInfo)) { string[] itemInfos = task.ItemInfo.Split("*"); if (itemInfos.Length == 3) { otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(itemInfos[0])); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(itemInfos[1])); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(itemInfos[2])); } } otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(task.TargetAddress)); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, task.TaskNum); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true); } } catch (Exception ex) { if (ex.Message.Contains("10001")) { otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Length)); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Width)); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Thickness)); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, dischargeStation); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, 999); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true); } else if (ex.Message.Contains("10002")) { WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", ex.Message, ex); } else { otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Length)); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Width)); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Thickness)); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, dischargeStation); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, 998); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true); WriteError(nameof(CommonConveyorLineOutJob), ex.Message, ex); } } } } } else { otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, dischargeStation); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, 997); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true); //otherDevice.SetValue(ConveyorLineStationDBName.WCSStationNoBarcode, true); } } } else { if (wcsResponse && !request) otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, false); //清除响应 } } catch (Exception ex) { otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, dischargeStation); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, 996); otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true); WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", ex.Message, ex); } } else { WriteError(nameof(CommonConveyorLineOutJob), "参数错误,未传递设备参数或设备类型错误"); } return Task.CompletedTask; } public int[] GetIndexArray(T[] values, T value) { List result = new List(); for (int i = 0; i < values.Length; i++) { if (value.Equals(values[i])) { result.Add(i); } } return result.ToArray(); } } }