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.Helper; using WIDESEAWCS_IBasicInfoRepository; using WIDESEAWCS_IPackInfoRepository; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_Model.Models.PackInfo; 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_Tasks.ConveyorLineJob; using WIDESEAWCS_Tasks.DBNames; using ICacheService = WIDESEAWCS_Core.Caches.ICacheService; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class MDJob_CP : JobBase, IJob { private readonly ICacheService _cacheService; private readonly ITaskService _taskService; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly ITaskRepository _taskRepository; private readonly IStationMangerRepository _stationMangerRepository; private readonly IDt_PackaxisRepository _packaxisRepository; private readonly IRouterRepository _routerRepository; private readonly IRouterService _routerService; private readonly IRouterExtension _routerExtension; private readonly List warehouseDevices; public MDJob_CP(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService, IRouterExtension routerExtension, IDt_PackaxisRepository packaxisRepository) { _cacheService = cacheService; _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _taskRepository = taskRepository; _stationMangerRepository = stationMangerRepository; _routerRepository = routerRepository; _routerService = routerService; _routerExtension = routerExtension; _packaxisRepository = packaxisRepository; string? warehouseDevicesStr = _cacheService.Get(nameof(Dt_WarehouseDevice)); if (!string.IsNullOrEmpty(warehouseDevicesStr)) { warehouseDevices = JsonConvert.DeserializeObject>(warehouseDevicesStr) ?? new List(); } else { warehouseDevices = new List(); } } public Task Execute(IJobExecutionContext context) { bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (flag && value != null) { OtherDevice device = (OtherDevice)value; List stationMangers = _stationMangerRepository.QueryData(x => x.StackerCraneCode == device.DeviceCode && x.StationType == 33); foreach (var item in stationMangers) { //获取协议 DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StackerCraneCode && x.DeviceProParamType == nameof(R_MDDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); DeviceProDTO? deviceProWrite = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StackerCraneCode && x.DeviceProParamType == nameof(W_MDDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); if (deviceProRead != null && deviceProWrite != null && item.IsOccupied == 0) { 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); #endregion short PackState = device.GetValue(GetPackStateEnum(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) { Thread.Sleep(500); device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDReceiveDone.ToString()).DeviceProDataBlock, 0); } if (PackState == 2) { device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 0); } var axis = _packaxisRepository.QueryFirst(x => x.DeviceCode == item.StackerCraneCode && x.StationCode == Convert.ToInt32(item.StackerCraneStationCode)); if (axis != null) { if (Convert.ToInt32(PackNum) == axis.PackNum) { device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 2); } ConsoleHelper.WriteInfoLine($"码垛工位{item.StationCode}状态{Allow}"); if (Allow == 3 || Allow == 7) { //获取当前任务 Dt_Task task = _taskRepository.QueryData(x => x.NextAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.TaskState == TaskStatusEnum.MD_Executing.ObjToInt() && x.DeviceCode == device.DeviceCode).OrderBy(x => x.TaskNum).FirstOrDefault(); if (task != null) //码垛申请 { device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == GetPackSendEnum(item.StackerCraneStationCode).ToString()).DeviceProDataBlock, 1); device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDSendID.ToString()).DeviceProDataBlock, Convert.ToInt16(item.StackerCraneStationCode)); #region 获取写入码垛X、Y、Z坐标 (int, int, int) result = GetAxis(PackNum, axis, item.StackerCraneStationCode); WriteInfo(item.StationName, $"码垛数量【{PackNum}】,下发码垛坐标X、Y、Z【{result.Serialize()}】"); 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); #endregion if (device.DeviceCode == "MD8_CP") { device.Communicator.Write(device.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == W_MDDB.W_MDA.ToString()).DeviceProDataBlock, -1); } else { 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); //更新任务信息 //_taskService.TaskCompleted(task.TaskNum); task.TaskState = TaskStatusEnum.Finish.ObjToInt(); //_taskRepository.UpdateData(task); Thread.Sleep(1500); WriteInfo(item.StationName, $"任务号{task.TaskNum}码垛"); } } } else { WriteError(item.StationName, $"未找到该工位{item.StationName}的坐标信息,请核对数据"); } } else { WriteError(item.StationName, $"未找到设备子编号{item.StationCode}的协议信息"); } } } 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("未定义工位"); } } } }