using Autofac.Core; using HslCommunication; using HslCommunication.Core; using Microsoft.VisualBasic.FileIO; using OfficeOpenXml.FormulaParsing.Excel.Functions.Information; using Quartz; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common; using WIDESEAWCS_Common.LocationEnum; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Communicator; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_IBasicInfoService; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.StackerCrane.Enum; using WIDESEAWCS_TaskInfoService; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class TSJJob : JobBase, IJob { private readonly ITaskService _taskService; private readonly IStationMangerService _stationMangerService; private readonly IStationInfoService _stationInfoService; public TSJJob(ITaskService taskService, IStationMangerService stationMangerService, IStationInfoService stationInfoService) { _taskService = taskService;//注入 _stationMangerService = stationMangerService; _stationInfoService = stationInfoService; } public Task Execute(IJobExecutionContext context) { bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (flag && value != null) { OtherDevice device = (OtherDevice)value; //Example //device.GetValue 读取 //device.SetValue 写入 // _taskService.Repository 仓储层,进行数据库访问 try { List Uptasks = new List(); //查询所有任务类型为3,4楼的入库任务类型且任务状态为AGV_WaitToExecute的任务 var taskList = _taskService.Repository.QueryData(x => x.TaskState == TaskStatusEnum.AGV_WaitToExecute.ObjToInt()); //任务的目标地址对于站台号; foreach (var task in taskList) { //先检查设备状态 if (device.GetValue(HoistEnum.EquipmentStatus, "TSJ") == 2) { if (task.ExceptionMessage == "提升机设备故障") { continue; } task.ExceptionMessage = "提升机设备故障"; Uptasks.Add(task); continue; //throw new Exception("设备故障"); } if (task.TaskType == TaskTypeEnum.RK3F.ObjToInt() || task.TaskType == TaskTypeEnum.CHUKU1.ObjToInt() || task.TaskType == TaskTypeEnum.F04.ObjToInt()) { if (task.TaskType == TaskTypeEnum.RK3F.ObjToInt()) { //判断3楼入库箱号有无 if (device.GetValue(HoistEnum.OutboundInplace, task.TargetAddress) != 2) { if (task.ExceptionMessage == "3楼入库箱号有货,请先处理") { continue; } task.ExceptionMessage = "3楼入库箱号有货,请先处理"; Uptasks.Add(task); continue; } } else { if (device.GetValue(HoistEnum.ReturnbinAvailable, task.TargetAddress) != 2) { if (task.ExceptionMessage != "4F提升机入口有货") { task.ExceptionMessage = "4F提升机入口有货"; Uptasks.Add(task); } continue; } } //然后调用输送线接口,通知输送线有料箱需要入库,任务举行执行 var result = _taskService.Hikvisiontaskscontinue(task.WMSTaskNum); if (result.Status == false) { if (task.ExceptionMessage != result.Message) { task.ExceptionMessage = result.Message; Uptasks.Add(task); } continue; } task.TaskState = (int)TaskStatusEnum.AGV_ToExecute; task.ExceptionMessage = ""; Uptasks.Add(task); //这里任务变成了CheckPalletCodeing } else if (task.TaskType == TaskTypeEnum.CK3F.ObjToInt() || task.TaskType == TaskTypeEnum.Q1TSJ4.ObjToInt() || task.TaskType == TaskTypeEnum.F03.ObjToInt()) //出库 { ////出库料箱缓存数量(这个是库区查询的时候要查一下,返给wms) //if (device.GetValue(HoistEnum.Outboundmaterialbox, "TSJ") == 0) throw new Exception("没有出库料箱缓存数量为空"); if (task.TaskType == TaskTypeEnum.CK3F.ObjToInt()) { //读取3楼出库料箱到位 if (device.GetValue(HoistEnum.SOutboundmaterialbox, task.SourceAddress) != 1) { if (task.ExceptionMessage != "3楼提升机出口光电反馈无货") { task.ExceptionMessage = "3楼提升机出口光电反馈无货"; Uptasks.Add(task); } continue; } } else { if (device.GetValue(HoistEnum.FOutboundmaterialbox, task.SourceAddress) != 1) { if (task.ExceptionMessage != "4楼提升机出口光电反馈无货") { task.ExceptionMessage = "4楼提升机出口光电反馈无货"; Uptasks.Add(task); } continue; } if (device.GetValue(HoistEnum.ROutScanningCompletionSignal, task.SourceAddress) != 1) { if (task.ExceptionMessage != "4楼提升机出口扫码完成信号没有完成") { task.ExceptionMessage = "4楼提升机出口扫码完成信号没有完成"; Uptasks.Add(task); } continue; } } //然后调用输送线接口,通知输送线有料箱需要入库,任务举行执行 var result = _taskService.Hikvisiontaskscontinue(task.WMSTaskNum); if (result.Status == false) { if (task.ExceptionMessage != result.Message) { task.ExceptionMessage = result.Message; Uptasks.Add(task); } continue; } task.TaskState = (int)TaskStatusEnum.AGV_ToExecute; task.ExceptionMessage = ""; Uptasks.Add(task); } } if (Uptasks.Count > 0) { _taskService.UpdateData(Uptasks); } #region 托盘号确认中 //查找三楼入库任务状态为CheckPalletCodeing的任务托盘号确认中 var RK3FTask = _taskService.Repository.QueryFirst(x => x.TaskType == TaskTypeEnum.RK3F.ObjToInt() && x.TaskState == (int)TaskStatusEnum.CheckPalletCodeing); if (RK3FTask != null) { if (device.GetValue(HoistEnum.RInScanningCompletionSignal, RK3FTask.TargetAddress) != 1) { RK3FTask.ExceptionMessage = "3楼扫码完成信号没有完成"; _taskService.UpdateData(RK3FTask); } else //完成就把任务状态改成托盘号确认完成 { //检查3楼入库箱号是多少,然后传给wms var BinNumber = device.GetValue(HoistEnum.Inboxnumber, RK3FTask.TargetAddress); if (!string.IsNullOrEmpty(BinNumber)) { BinNumber = BinNumber.TrimEnd('\0').Substring(2); //根据读到的箱号进行料箱检验,检验通过就触发读码器读取,如果不通过就抛出异常 var Verification = _taskService.MaterialBoxInspection(RK3FTask.WMSTaskNum, BinNumber); if (!Verification.Status) { if (RK3FTask.ExceptionMessage != Verification.Message) { RK3FTask.ExceptionMessage = Verification.Message; _taskService.UpdateData(RK3FTask); } } else { //如果质检通过就不改变RK3FTask.TargetAddress的值, if (!string.IsNullOrEmpty(Verification.Message)) { //寻找平库货位 var Location = _stationInfoService.Repository.QueryFirst(x=>x.StationRegion==Verification.Message.ObjToInt()&&x.StationStatus==(int)LocationStatusEnum.Free&&x.FloorNumber=="CC"&&x.IsOccupied==(int)LocationStatusEnum.Free); RK3FTask.NextAddress = Location.StationCode; RK3FTask.TargetAddress = Location.StationCode; RK3FTask.CurrentAddress = RK3FTask.TargetAddress; _taskService.UpdateData(RK3FTask); } //调用海康进行执行完成接口 var result = _taskService.Hikvisiontaskscontinue(RK3FTask.WMSTaskNum, RK3FTask.NextAddress); if (result.Status) { RK3FTask.ExceptionMessage = ""; RK3FTask.TaskState = (int)TaskStatusEnum.CheckPalletCodeFinish; _taskService.UpdateData(RK3FTask); } else { if (RK3FTask.ExceptionMessage != result.Message) { RK3FTask.ExceptionMessage = result.Message; _taskService.UpdateData(RK3FTask); } } } } } } #endregion #region 4F提升机出口托盘号上报WMS var Address = "TSJC4F"; if (device.GetValue(HoistEnum.ROutScanningCompletionSignal, Address) == 1) { var BinNumber = device.GetValue(HoistEnum.Emptycontainernumber, Address); if (!string.IsNullOrEmpty(BinNumber)) { BinNumber = BinNumber.TrimEnd('\0').Substring(2); _taskService.InboundElevatorExit(Address, BinNumber); } } #endregion //WriteInfo(device.DeviceName, "infoLog"); //WriteDebug(device.DeviceName, "debugLog"); } catch (Exception ex) { WriteError(device.DeviceName, "错误", ex); } } else { WriteError(nameof(TSJJob), "参数错误,未传递设备参数或设备类型错误"); } return Task.CompletedTask; } } }