using AutoMapper; using Quartz; using WIDESEA_Common.Log; using WIDESEAWCS_Core; using WIDESEAWCS_DTO.Enum; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_Tasks.ConveyorLineJob; using WIDESEAWCS_Tasks.StackerCraneJob; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class CommonConveyorLineJob : IJob { private readonly ITaskService _taskService; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly IRouterService _routerService; private readonly IAgvStationService _agvStationService; private readonly IMapper _mapper; private readonly IRgvOperationService _gvOperationService; private readonly IEquipmentStatusService _equipmentStatusService; public CommonConveyorLineJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IAgvStationService agvStation, IMapper mapper, IRgvOperationService gvOperationService, IEquipmentStatusService equipmentStatusService) { _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _routerService = routerService; _agvStationService = agvStation; _mapper = mapper; _gvOperationService = gvOperationService; _equipmentStatusService=equipmentStatusService; } public async Task Execute(IJobExecutionContext context) { try { CommonConveyorLine conveyorLine = (CommonConveyorLine)context.JobDetail.JobDataMap.Get("JobParams"); if (conveyorLine != null) { //根据设备查找出对应的站台信息 List aGVStations = _agvStationService.GetYljSide(conveyorLine.DeviceCode); foreach (var Stations in aGVStations) { if (Stations.Station_material == (int)RGVEquipment.AQMexit) { bool Security = SecurityDoorEquipment(conveyorLine, Stations); if (Security) continue; } else { bool HCJPlat=PlatformEquipmentInformation(conveyorLine, Stations); if (HCJPlat) continue; } } } } catch (Exception ex) { WriteLog.Write_Log("安全门", "运行状况", "故障", new { 信息 = ex.Message }); } return; } //处理安全门的逻辑 private void HandleDoorRequest(AQMReturnnormal aQMConveyor, AGVStation aGVStation,int tasktype) //1:入库 2:出库 { if (_gvOperationService.AQMReadAlarminform(tasktype) && _equipmentStatusService.GetSCstatus()) { //写入报警 GetDeviceAddress.WriteSecurityDoorpolice(aGVStation.ChildPosiDeviceCode, "AlarmSummary", 1); _gvOperationService.WriteOutbuttonpause(null); } if (aQMConveyor.DoorRequest == 1 && aQMConveyor.IndicatorStatus == (int)SafetyDoorStatus.YellowBlink2Hz) { if (aQMConveyor.EmergencyStopStatus == 1) { bool AQMzckm = tasktype == 1 ? GetDeviceAddress.InRGVRGVStepprocess() : GetDeviceAddress.OutRGVRGVStepprocess(); //判断是否有进程任务 if (AQMzckm) { //写入停止的信息 bool RGVRGV_DWorkingmode = tasktype == 1 ? _gvOperationService.InWriteOutbuttonpause(null).Status : _gvOperationService.WriteOutbuttonpause(null).Status; bool RGVstate = tasktype == 1 ? GetDeviceAddress.InRGVStatice() : GetDeviceAddress.OutRGVStatice(); //判断是否全为手动 if (RGVstate) { //写入开门信号 GetDeviceAddress.WriteSecurityDoorpolice(aGVStation.ChildPosiDeviceCode, "OpenDoor", 1); } } } else { bool AQMkm = tasktype == 1 ? GetDeviceAddress.InRGVStatice() : GetDeviceAddress.OutRGVStatice(); if (AQMkm) { GetDeviceAddress.WriteSecurityDoorpolice(aGVStation.ChildPosiDeviceCode, "OpenDoor", 1); } } } } //安全门设备信息管理 private bool SecurityDoorEquipment(CommonConveyorLine conveyorLine, AGVStation Stations) { try { // 获取安全门信息 AQMReturnnormal aQMConveyor = AQMStoticCommand(conveyorLine, Stations.ChildPosiDeviceCode); if (aQMConveyor.SafetyLockStatus == 1) { //写入报警 GetDeviceAddress.WriteSecurityDoorpolice(Stations.ChildPosiDeviceCode, "AlarmSummary", 0); //写入开门信号 GetDeviceAddress.WriteSecurityDoorpolice(Stations.ChildPosiDeviceCode, "OpenDoor", 0); } // 根据任务类型选择处理策略 if (Stations.Station_tasktype == (int)RGVTasktype.Outbound) { if (aQMConveyor.EmergencyStopStatus == 0) _gvOperationService.WriteOutbuttonpause(null); HandleDoorRequest(aQMConveyor, Stations, 2); } else { if (aQMConveyor.EmergencyStopStatus == 0) _gvOperationService.InWriteOutbuttonpause(null); HandleDoorRequest(aQMConveyor, Stations, 1); } return false; } catch (Exception ex) { return true; throw; } } private bool PlatformEquipmentInformation(CommonConveyorLine conveyorLine, AGVStation Stations) { try { PlatformStatus aQMConveyor = StoticCommand(conveyorLine, Stations.ChildPosiDeviceCode); if (aQMConveyor.HCJ_GoodsStatus == 0) //可进行放货 { WebResponseContent webResponseContent = new WebResponseContent(); //根据类型查找任务 if (Stations.Station_material == (int)RGVEquipment.AbnormalOutbound) { //查找是否有异常搬运任务 webResponseContent = _taskService.UpdateDeliveryAddress(Stations.HCJStorageaddress.ToString(), 1); //还需要传入地址 } else { //出库站台的任务 webResponseContent = _taskService.UpdateDeliveryAddress(Stations.HCJStorageaddress.ToString(), 2); } } return false; } catch (Exception ex) { return true; throw; } } /// /// 安全门信号 /// public AQMReturnnormal AQMStoticCommand(CommonConveyorLine conveyorLine, string kladder) { try { AQMReturnnormal conveyorRgvCommand = new AQMReturnnormal(); List deviceProDTO6 = conveyorLine.DeviceProDTOs .Where(x => x.DeviceChildCode == kladder //&& DBLine.ConveyorAQMReturnnormal.Contains(x.DeviceProParamName) && x.DeviceProParamType == "ReadDeviceCommand") .ToList(); foreach (var item in deviceProDTO6) { var paramName = item.DeviceProParamName; var propertyInfo = typeof(AQMReturnnormal).GetProperty(paramName); if (propertyInfo != null) { if (item.DeviceDataType == "short") { var value = conveyorLine.Communicator.Read(item.DeviceProAddress); propertyInfo.SetValue(conveyorRgvCommand, value); } } } return conveyorRgvCommand; } catch (Exception ex) { return null; throw; } } public DeviceProDTO? GetDeviceProDTO(CommonConveyorLine conveyorLine, string PLCmanipula, string DeviceProParamName, string DeviceProParamType) { return conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == PLCmanipula && x.DeviceProParamName == DeviceProParamName && x.DeviceProParamType == DeviceProParamType); } //站台信号 public PlatformStatus StoticCommand(CommonConveyorLine conveyorLine, string kladder) { PlatformStatus conveyorRgvCommand = new PlatformStatus(); List deviceProDTO6 = conveyorLine.DeviceProDTOs .Where(x => x.DeviceChildCode == kladder && x.DeviceProParamName== "HCJ_GoodsStatus" && x.DeviceProParamType == "ReadDeviceCommand") .ToList(); foreach (var item in deviceProDTO6) { var paramName = item.DeviceProParamName; var propertyInfo = typeof(PlatformStatus).GetProperty(paramName); if (propertyInfo != null) { if (item.DeviceDataType == "short") { var value = conveyorLine.Communicator.Read(item.DeviceProAddress); propertyInfo.SetValue(conveyorRgvCommand, value); } } } return conveyorRgvCommand; } } }