using Autofac.Core; using HslCommunication; using HslCommunication.Core; using HslCommunication.WebSocket; using Microsoft.Extensions.Hosting; using Microsoft.VisualBasic.FileIO; using Newtonsoft.Json; using Quartz; using SixLabors.ImageSharp.PixelFormats; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Communicator; using WIDESEAWCS_Core.BaseRepository; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_IWMSPart; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_QuartzJob.StackerCrane.Enum; using WIDESEAWCS_TaskInfoService; using WIDESEAWCS_Tasks.OHT; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class GZJJob : JobBase, IJob { private readonly ITaskService _taskService; private readonly Idt_ErrormsginfoService _ErrormsginfoService; private readonly IRepository _dt_stationInfoRepository; private readonly IRepository _dt_taskRepositiry; private readonly ILocationInfoService _locationInfoService; private readonly IRepository _storagemodeRepository; private readonly IRepository _outStockRepository; private readonly IRepository _batchInfoRepository; private readonly IRepository _StockInfoRepository; WebSocketServer _webSocketServer; public GZJJob(ITaskService taskService, WebSocketServer webSocketServer, Idt_ErrormsginfoService errormsginfoService, Idt_StationinfoService stationinfoService, IRepository dt_stationInfoRepository, IRepository dt_taskRepositiry, ILocationInfoService locationInfoService, IRepository outStockRepository, IRepository storagemodeRepository, IRepository batchInfoRepository, IRepository StockInfoRepository) { _taskService = taskService;//注入 _webSocketServer = webSocketServer; _ErrormsginfoService = errormsginfoService; _dt_stationInfoRepository = dt_stationInfoRepository; _dt_taskRepositiry = dt_taskRepositiry; _locationInfoService = locationInfoService; _storagemodeRepository = storagemodeRepository; _outStockRepository = outStockRepository; _batchInfoRepository = batchInfoRepository; _StockInfoRepository = StockInfoRepository; } public Task Execute(IJobExecutionContext context) { bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (flag && value != null) { OtherDevice device = (OtherDevice)value; try { #region 生成入库任务 if (!OHTJob.oHTReadData.R_GZJ_isWork) { throw new Exception($"规整机投入使用信号为false"); } Dt_Task task = new Dt_Task(); var storagemode = _storagemodeRepository.QueryFirst(v=>v.Id==1); if (OHTJob.oHTReadData.R_RGVMode && OHTJob.oHTReadData.R_DK_isready)//RGV上料模式,且东跨架子有上料信号 { var station=_dt_stationInfoRepository.QueryFirst(v=>v.msg== "东跨架子"); task.SourceAddress = station.Row + "-" + station.Column + "-1"; task.TargetAddress = _locationInfoService.GetInLocation(storagemode.storagemode).LocationCode; task.Grade = 1; task.Remark = (int)MateTypeEnum.ZiChan; } else if (OHTJob.oHTReadData.R_RGVMode && OHTJob.oHTReadData.R_XK_isready)//RGV上料模式,且西跨架子有上料信号 { var station = _dt_stationInfoRepository.QueryFirst(v => v.msg == "西跨架子"); task.SourceAddress = station.Row + "-" + station.Column + "-1"; task.TargetAddress = _locationInfoService.GetInLocation(storagemode.storagemode).LocationCode; var DKstation = _dt_stationInfoRepository.QueryFirst(v => v.msg == "东跨架子"); string address= DKstation.Row + "-" + DKstation.Column + "-1"; var oldtask = _dt_taskRepositiry.QueryFirst(v=>v.SourceAddress== address); if (oldtask!=null && oldtask.TaskState== (int)TaskInStatusEnum.InNew) { task.Grade = 2; } else { task.Grade = 1; } task.Remark = (int)MateTypeEnum.ZiChan; } else if (OHTJob.oHTReadData.R_CCMode && OHTJob.oHTReadData.R_XK_isready)//人工叉车上料模式,且西跨架子有上料信号 { var station = _dt_stationInfoRepository.QueryFirst(v => v.msg == "西跨架子"); task.SourceAddress = station.Row + "-" + station.Column + "-1"; task.TargetAddress = _locationInfoService.GetInLocation(storagemode.storagemode).LocationCode; task.Grade = 1; task.Remark = (int)MateTypeEnum.WaiGou; } else if (OHTJob.oHTReadData.R_CCMode && OHTJob.oHTReadData.R_DK_isready)//人工叉车上料模式,且东跨架子有上料信号 { var station = _dt_stationInfoRepository.QueryFirst(v => v.msg == "东跨架子"); task.SourceAddress = station.Row + "-" + station.Column + "-1"; task.TargetAddress = _locationInfoService.GetInLocation(storagemode.storagemode).LocationCode; var XKstation = _dt_stationInfoRepository.QueryFirst(v => v.msg == "西跨架子"); string address= XKstation.Row + "-" + XKstation.Column + "-1"; var oldtask = _dt_taskRepositiry.QueryFirst(v => v.SourceAddress == address); if (oldtask != null && oldtask.TaskState == (int)TaskInStatusEnum.InNew) { task.Grade = 2; } else { task.Grade = 1; } task.Remark = (int)MateTypeEnum.WaiGou; } else { throw new Exception($"规整机当前信号不满足入库任务生成条件"); } task.Roadway = "TC01"; task.TaskType = (int)TaskInboundTypeEnum.Inbound; task.TaskState = (int)TaskInStatusEnum.InNew; _dt_taskRepositiry.AddData(task); #endregion } catch (Exception ex) { _ErrormsginfoService.UpdateErrorMsg(ex.Message, 2); } try { #region 生成出库任务 var isout = _outStockRepository.QueryFirst(v => v.Id == 1); if (isout.isout != 1) { throw new Exception($"当前系统设置为不出库模式"); } if (!OHTJob.oHTReadData.R_ZXJ_isWork) { throw new Exception($"整形机投入使用信号为false"); } if (!OHTJob.oHTReadData.R_ZXJ_TCMode || OHTJob.oHTReadData.R_HC_isReadyWork) { throw new Exception($"整形机不属于天车上料模式或天车放板信号为false"); } //查询当前任务池中是否存在出库任务,出库任务只能存在一条 var oldtask = _dt_taskRepositiry.QueryFirst(v => v.TaskType == (int)TaskOutboundTypeEnum.Outbound); if (oldtask != null) { throw new Exception($"当前任务池中已存在一条出库任务"); } //查询当前需要出库的批次号,以及出库物料类型 var batch = _batchInfoRepository.QueryFirst(v => v.Id == 1); //查询库存物料库存信息 var stocks = _StockInfoRepository.QueryData(v => v.Remark == batch.materType && v.BatchNo == batch.OutBatch).OrderBy(v => v.CreateDate).ToList(); if (stocks.Count <= 0) { throw new Exception($"当前库存中没有【{batch.materType}】(0自产 1外购)且批次为【{batch.OutBatch}】的物料"); } //查询终点站台信息 var station = _dt_stationInfoRepository.QueryFirst(v => v.msg == "整形机放料位"); //开始创建任务 Dt_Task outtask = new Dt_Task(); outtask.Roadway = "TC01"; outtask.TaskType = (int)TaskOutboundTypeEnum.Outbound; outtask.TaskState = (int)TaskOutStatusEnum.OutNew; outtask.SourceAddress = stocks[0].LocationCode; outtask.TargetAddress = station.Row + "-" + station.Column + "-1"; ; outtask.Grade = 1; outtask.Remark = batch.materType; _dt_taskRepositiry.AddData(outtask); #endregion } catch (Exception ex) { _ErrormsginfoService.UpdateErrorMsg(ex.Message, 3); } } return Task.CompletedTask; } } }