using Autofac.Core; using Microsoft.AspNetCore.Components.Routing; using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; using Quartz; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common; using WIDESEAWCS_Common.Helper; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Communicator; using WIDESEAWCS_Core; using WIDESEAWCS_Core.BaseServices; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_IBasicInfoRepository; using WIDESEAWCS_IPackInfoRepository; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.ConveyorLine.Enum; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Models; using WIDESEAWCS_QuartzJob.Repository; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_TaskInfoRepository; using WIDESEAWCS_Tasks.ConveyorLineJob; using WIDESEAWCS_Tasks.DBNames; using ICacheService = WIDESEAWCS_Core.Caches.ICacheService; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class MDJob3_CP : JobBase, IJob { private readonly ICacheService _cacheService; private readonly IStationMangerRepository _stationMangerRepository; private readonly IPackaxisRepository _packaxisRepository; private readonly IPackaxisTaskRepository _packaxisTaskRepository; private readonly IPackaxisTaskService _packaxisTaskService; private readonly IStationPackInfoRepository _stationPackInfoRepository; private readonly List warehouseDevices; public MDJob3_CP(ICacheService cacheService, IStationMangerRepository stationMangerRepository, IPackaxisRepository packaxisRepository, IPackaxisTaskRepository packaxisTaskRepository,IPackaxisTaskService packaxisTaskService, IStationPackInfoRepository stationPackInfoRepository) { _cacheService = cacheService; _stationMangerRepository = stationMangerRepository; _packaxisRepository = packaxisRepository; string? warehouseDevicesStr = _cacheService.Get(nameof(Dt_WarehouseDevice)); if (!string.IsNullOrEmpty(warehouseDevicesStr)) { warehouseDevices = JsonConvert.DeserializeObject>(warehouseDevicesStr) ?? new List(); } else { warehouseDevices = new List(); } _packaxisTaskRepository = packaxisTaskRepository; _packaxisTaskService = packaxisTaskService; _stationPackInfoRepository = stationPackInfoRepository; } public Task Execute(IJobExecutionContext context) { try { bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (flag && value != null) { OtherDevice device = (OtherDevice)value; if (!device.IsConnected) { return Task.CompletedTask; } List stationMangers = _stationMangerRepository.QueryData(x => x.StackerCraneCode == device.DeviceCode && x.StationType == StationTypeEnum.StationType_InStartAndOutEnd.ObjToInt()); //获取协议 DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == device.DeviceCode && x.DeviceProParamType == nameof(R_MDDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); DeviceProDTO? deviceProWrite = device.DeviceProDTOs.Where(x => x.DeviceChildCode == device.DeviceCode && x.DeviceProParamType == nameof(W_MDDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); if (deviceProRead != null && deviceProWrite != null) { foreach (var item in stationMangers) { short Allow = device.GetValue(R_MDDB.R_MDAllow, item.StackerCraneCode); #region 读取工位状态 short R_MDStatus1 = device.GetValue(R_MDDB.R_MDStatus1, item.StackerCraneCode); short R_MDStatus2 = device.GetValue(R_MDDB.R_MDStatus2, item.StackerCraneCode); short R_MDStatus3 = device.GetValue(R_MDDB.R_MDStatus3, item.StackerCraneCode); short R_MDStatus4 = device.GetValue(R_MDDB.R_MDStatus4, item.StackerCraneCode); short ReceiveDoneState = device.GetValue(W_MDDB.W_MDReceiveDone, item.StackerCraneCode); #endregion //码垛状态 short PackState = device.GetValue(GetPackStateEnum(item.StackerCraneStationCode), item.StackerCraneCode); short PackSendState = device.GetValue(GetPackSendEnum(item.StackerCraneStationCode), item.StackerCraneCode); //码垛数量 short PackNum = device.GetValue(GetPackNumEnum(item.StackerCraneStationCode), item.StackerCraneCode); if ((R_MDStatus1 == 1 || R_MDStatus2 == 1 || R_MDStatus3 == 1 || R_MDStatus4 == 1) && Allow == 4) { Thread.Sleep(200); if (ReceiveDoneState != 0) { device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDReceiveDone.ToString()).DeviceProDataBlock, 0); WriteInfo(item.StackerCraneCode, $"{item.StackerCraneCode}工位任务下发标识值为:{ReceiveDoneState},机器人读取状态为:{Allow},1工位{R_MDStatus1},2工位{R_MDStatus2},3工位{R_MDStatus3},4工位{R_MDStatus4},码垛清除下发标识信号"); } continue; } if (PackState == 2 && PackSendState == 2) { Thread.Sleep(200); device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 4); WriteInfo(item.StationName, $"{item.StationName}写入清托信号"); continue; } if (PackState == 4 && PackSendState == 4) { Thread.Sleep(200); device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 0); WriteInfo(item.StationName, $"{item.StationName}清托信号复位"); continue; } //获取当前工位码垛执行中数据 Dt_StationPackInfo stationPackInfo = _stationPackInfoRepository.QueryFirst(x => x.StationCode == item.StationCode && x.AssignNum > 0); if (stationPackInfo!=null) { var axis = _packaxisRepository.QueryFirst(x => x.DeviceCode == item.StackerCraneCode && x.StationCode == stationPackInfo.StationCode && x.PackType== stationPackInfo.PackType); if (axis != null) { //进行结托 if (Convert.ToInt32(PackNum) == axis.PackNum) { WebResponseContent responseContent = _packaxisTaskService.BoxingInBound(item.StationCode); if (responseContent.Status) { device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 2); WriteInfo(item.StationName, $"{item.StationName}写入工位结托信号"); } else { WriteError(item.StationName, $"{responseContent.Message}"); } continue; } //码垛申请 if (Allow == 3 || Allow == 7) { //获取当前任务 Dt_PackaxisTask packaxisTask = _packaxisTaskRepository.QueryFirst(x => x.NextAddress == item.StationCode && x.DeviceCode == item.StackerCraneCode && x.PackType == stationPackInfo.PackType && x.TaskState == TaskStatusEnum.MD_Executing.ObjToInt()); if (packaxisTask != null) { //写入工位号 device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDSendID.ToString()).DeviceProDataBlock, Convert.ToInt16(item.StackerCraneStationCode)); //写入工位允许码垛 device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 1); #region 获取写入码垛X、Y、Z坐标 (int, int, int) result = GetAxis(PackNum, axis, item.StackerCraneStationCode); device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDX.ToString()).DeviceProDataBlock, result.Item1); device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDY.ToString()).DeviceProDataBlock, result.Item2); device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDZ.ToString()).DeviceProDataBlock, result.Item3); WriteInfo(item.StationName, $"码垛数量【{PackNum}】,下发码垛坐标X、Y、Z【{result.Serialize()}】"); #endregion device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDA.ToString()).DeviceProDataBlock, 1); //写入下发标识 device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDReceiveDone.ToString()).DeviceProDataBlock, 3); packaxisTask.TaskState = TaskStatusEnum.Finish.ObjToInt(); _packaxisTaskRepository.UpdateData(packaxisTask); //任务完成 WebResponseContent webResponse = _packaxisTaskService.TaskCompleted(packaxisTask: packaxisTask); if (!webResponse.Status) { WriteError(item.StationName, $"任务号{packaxisTask.PackTaskNum}码垛完成错误{webResponse.Message}"); } else { WriteInfo(item.StationName, $"任务号{packaxisTask.PackTaskNum}码垛完成"); } Thread.Sleep(800); return Task.CompletedTask; } } } else { WriteError(item.StationName, $"未找到该工位{item.StationName}的坐标信息,请核对数据"); } } } } else { WriteError(device.DeviceCode, $"未找到设备{device.DeviceCode}的协议信息"); } } } catch (Exception ex) { WriteError(nameof(MDJob3_CP),ex.Message); } return Task.CompletedTask; } /// /// 码垛数量 /// public R_MDDB GetPackNumEnum(string StationCode) { switch (StationCode) { case "1": return R_MDDB.R_MDQtys1; case "2": return R_MDDB.R_MDQtys2; case "3": return R_MDDB.R_MDQtys3; case "4": return R_MDDB.R_MDQtys4; default: throw new Exception("未定义工位"); } } /// /// 码垛状态 /// public R_MDDB GetPackStateEnum(string StationCode) { switch (StationCode) { case "1": return R_MDDB.R_MDStatus1; case "2": return R_MDDB.R_MDStatus2; case "3": return R_MDDB.R_MDStatus3; case "4": return R_MDDB.R_MDStatus4; default: throw new Exception("未定义工位"); } } /// /// 码垛工位 /// public W_MDDB GetPackSendEnum(string StationCode) { switch (StationCode) { case "1": return W_MDDB.W_MDSend1; case "2": return W_MDDB.W_MDSend2; case "3": return W_MDDB.W_MDSend3; case "4": return W_MDDB.W_MDSend4; default: throw new Exception("未定义工位"); } } public (int, int ,int) GetAxis(int PackNum, Dt_Packaxis axis, string StationCode) { int X = PackNum / axis.AxisYCount % axis.AxisXCount; int Y = PackNum % axis.AxisYCount; int Z = PackNum / (axis.AxisYCount * axis.AxisXCount) % axis.AxisZCount; int axisx = 0; int axisy = 0; int axisz = 0; if (axis == null) { throw new Exception("未找到坐标值"); } switch (StationCode) { case "1": return (axisx = axis.AxisX - X * axis.AxisXSpacing, axisy = axis.AxisY + Y * axis.AxisYSpacing,axisz= axis.AxisZ + Z * axis.AxisZSpacing); case "2": return (axisx = axis.AxisX - X * axis.AxisXSpacing, axisy = axis.AxisY - Y * axis.AxisYSpacing, axisz = axis.AxisZ + Z * axis.AxisZSpacing); case "3": return (axisx = axis.AxisX + X * axis.AxisXSpacing, axisy = axis.AxisY + Y * axis.AxisYSpacing, axisz = axis.AxisZ + Z * axis.AxisZSpacing); case "4": return (axisx = axis.AxisX + X * axis.AxisXSpacing, axisy = axis.AxisY - Y * axis.AxisYSpacing, axisz = axis.AxisZ + Z * axis.AxisZSpacing); default: throw new Exception("未定义工位"); } } } }