using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; using Quartz; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common; using WIDESEAWCS_Common.Helper; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Caches; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_IBasicInfoRepository; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Models; using WIDESEAWCS_QuartzJob.Repository; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_TaskInfoService; using WIDESEAWCS_Tasks.ConveyorLineJob; using ICacheService = WIDESEAWCS_Core.Caches.ICacheService; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class ConveyorLineJob_BC : JobBase, IJob { private readonly ICacheService _cacheService; private readonly ITaskService _taskService; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly ITaskRepository _taskRepository; private readonly IStationMangerRepository _stationMangerRepository; private readonly IRouterRepository _routerRepository; private readonly IRouterService _routerService; private readonly IRouterExtension _routerExtension; private readonly List warehouseDevices; public ConveyorLineJob_BC(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService, IRouterExtension routerExtension) { _cacheService = cacheService; _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _taskRepository = taskRepository; _stationMangerRepository = stationMangerRepository; _routerRepository = routerRepository; _routerService = routerService; _routerExtension = routerExtension; 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; Dt_WarehouseDevice? warehouseDevice = warehouseDevices.FirstOrDefault(x => x.DeviceCode == device.DeviceCode); if (warehouseDevice == null) { WriteError(device.DeviceName, $"请配置仓库设备信息"); return Task.CompletedTask; } List deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).ToList(); List stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode); foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode))) { DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(R_ConveyorLineDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); DeviceProDTO? deviceProWrite = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(W_ConveyorLineDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); if (deviceProRead != null && deviceProWrite != null) { R_ConveyorLineInfo conveyorLineInfoRead = device.Communicator.ReadCustomer(deviceProRead.DeviceProAddress); W_ConveyorLineInfo conveyorLineInfoWrite = device.Communicator.ReadCustomer(deviceProWrite.DeviceProAddress); if (conveyorLineInfoRead == null || conveyorLineInfoWrite == null) { continue; } R_ConveyorLineStatus conveyorLineStatus = conveyorLineInfoRead.Status.ByteToBoolObject(); ConveyorLineSignal conveyorLineSignalRead = conveyorLineInfoRead.Signal.ByteToBoolObject(); ConveyorLineSignal conveyorLineSignalWrite = conveyorLineInfoWrite.Signal.ByteToBoolObject(); if (item.StationType == StationTypeEnum.StationType_PakcPallet.ObjToInt()) { if (conveyorLineSignalRead.STB && !conveyorLineSignalWrite.ACK) { device.SetValue(W_ConveyorLineDB.TaskNum, 1, item.StationCode); device.SetValue(W_ConveyorLineDB.StartPos, item.StationCode, item.StationCode); device.SetValue(W_ConveyorLineDB.EndPos, 1102, item.StationCode); device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt(), item.StationCode); device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode); } else if(!conveyorLineSignalRead.STB && conveyorLineSignalWrite.ACK) { device.SetValue(W_ConveyorLineDB.ACK, false, item.StationCode); } } if (item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt()) { { #region 生成任务后给输送线启动信号 Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) /*&& x.DeviceCode == item.StationDeviceCode*/ && (x.TaskState == TaskStatusEnum.New.ObjToInt()) && x.WarehouseId == warehouseDevice.WarehouseId); if (task != null && conveyorLineInfoWrite.Spare2 == 0 && conveyorLineStatus.Goods) { //List stations = _routerExtension.GetEndPoint(item.StationCode, TaskTypeEnum.Inbound.ObjToInt()).Select(x => x.NextPosi).ToList(); ////分配巷道 //WebResponseContent responseContent = _taskService.RequestWMSAssignRoadway(stations, task.TaskNum, conveyorLineInfoRead.Spare2); //if (responseContent.Status) //{ // device.SetValue(W_ConveyorLineDB.Spare2, 1, item.StationCode); // _taskService.UpdateTask(task, TaskStatusEnum.Line_Execute, deviceCode: item.StationDeviceCode, roadwayNo: responseContent.Data.ToString() ?? ""); //} device.SetValue(W_ConveyorLineDB.Spare2, 1, item.StationCode); _taskService.UpdateTask(task, TaskStatusEnum.Line_Execute, deviceCode: item.StationDeviceCode); } else { if (conveyorLineInfoWrite.Spare2 != 0) { WriteDebug(device.DeviceName, $"启动信号已写入"); } } #endregion } if (conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.ACK) { if (conveyorLineInfoRead.TaskNum == 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.Barcode))//采购入库 { #region 任务号为0,且有托盘号,则是采购入库 Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.DeviceCode == item.StationDeviceCode && (x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt()) && x.PalletCode == conveyorLineInfoRead.Barcode && x.WarehouseId == warehouseDevice.WarehouseId); if (task != null) { List stations = _routerExtension.GetEndPoint(item.StationCode, TaskTypeEnum.Inbound.ObjToInt()).Select(x => x.NextPosi).ToList(); //分配巷道 if (stations.Count>1) { WebResponseContent responseContent = _taskService.RequestWMSAssignRoadway(stations, task.TaskNum, conveyorLineInfoRead.Spare2); if (responseContent.Status) { _taskService.UpdateTask(task, TaskStatusEnum.Line_Execute, roadwayNo: responseContent.Data.ToString() ?? "",heightType: conveyorLineInfoRead.Spare2); } } device.SetValue(W_ConveyorLineDB.Spare2, 0, item.StationCode); string currentAddress = task.CurrentAddress; string nextAddress = task.NextAddress; string targetAddress = task.TargetAddress; string deviceCode = task.DeviceCode; TaskStatusEnum taskState = TaskStatusEnum.Line_Executing; List routers = _routerService.QueryNextRoutes(item.StationCode, task.Roadway, task.TaskType); Dt_Router? router = routers.FirstOrDefault(); if (routers == null || routers.Count == 0 || router == null) { WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{task.TaskNum}"); continue; } if (routers.Count > 1) { WriteError(item.StationName, $"路由信息配置错误,设备编号:{item.StationCode},任务号:{task.TaskNum}"); continue; } if (router.IsEnd) { string? targetLoca = _taskService.RequestAssignLocationByHeight(task.TaskNum, task.Roadway, conveyorLineInfoRead.Spare2); if (!string.IsNullOrEmpty(targetLoca)) { currentAddress = item.StackerCraneStationCode; targetAddress = targetLoca; nextAddress = targetLoca; taskState = TaskStatusEnum.SC_Execute; deviceCode = item.StackerCraneCode; device.SetValue(W_ConveyorLineDB.EndPos, task.CurrentAddress, item.StationCode); } else { WriteError(item.StationName, $"请求分配货位失败,设备编号:{item.StationCode},任务号:{task.TaskNum}"); continue; } } else { //task.NextAddress可能是router.NextPosi nextAddress = router.NextPosi; device.SetValue(W_ConveyorLineDB.EndPos, router.NextPosi, item.StationCode); } device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum, item.StationCode); device.SetValue(W_ConveyorLineDB.StartPos, task.CurrentAddress, item.StationCode); device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt(), item.StationCode); device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode); if (router.IsEnd) { _taskService.UpdateTask(task, taskState, currentAddress: currentAddress, nextAddress: nextAddress, targetAddress: targetAddress, deviceCode: deviceCode); } else { _taskService.UpdateTask(task, taskState, nextAddress: nextAddress); } } else { WriteInfo(device.DeviceName, $"未找到托盘{conveyorLineInfoRead.Barcode}对应的任务信息"); } #endregion } else//生产退库 //换巷道入库 { #region 生产退库,带任务号查询任务 Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.TaskNum && x.NextAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.WarehouseId == warehouseDevice.WarehouseId && x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt()); // 带任务号查询任务 Dt_Task taskIn = _taskRepository.QueryFirst(x => x.TaskNum == conveyorLineInfoRead.TaskNum && _taskService.TaskInboundTypes.Contains(x.TaskType) && x.DeviceCode == item.StationDeviceCode && x.NextAddress == item.StationCode && x.WarehouseId == warehouseDevice.WarehouseId && x.TaskState == TaskStatusEnum.Line_Executing.ObjToInt()); // 带任务号查询任务 if (task != null) { List stations = _routerExtension.GetEndPoint(item.StationCode, TaskTypeEnum.Inbound.ObjToInt()).Select(x => x.NextPosi).ToList(); WebResponseContent responseContent = _taskService.RequestWMSAssignRoadway(stations, task.TaskNum, conveyorLineInfoRead.Spare2); if (responseContent.Status) { //string currentAddress = task.CurrentAddress; //string nextAddress = task.NextAddress; //string targetAddress = task.TargetAddress; string roadwayNo = task.Roadway; string currentAddress = task.CurrentAddress; string nextAddress = task.NextAddress; string targetAddress = task.TargetAddress; string deviceCode = task.DeviceCode; TaskStatusEnum taskState = TaskStatusEnum.Line_Executing; List routers = _routerService.QueryNextRoutes(item.StationCode, responseContent.Data.ToString(), task.TaskType); Dt_Router? router = routers.FirstOrDefault(); if (routers == null || routers.Count == 0 || router == null) { WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{task.TaskNum}"); continue; } if (routers.Count > 1) { WriteError(item.StationName, $"路由信息配置错误,设备编号:{item.StationCode},任务号:{task.TaskNum}"); continue; } if (router.IsEnd) { string? targetLoca = _taskService.RequestAssignLocationByHeight(task.TaskNum, responseContent.Data.ToString(), conveyorLineInfoRead.Spare2); if (!string.IsNullOrEmpty(targetLoca)) { currentAddress = item.StackerCraneStationCode; targetAddress = targetLoca; nextAddress = targetLoca; taskState = TaskStatusEnum.SC_Execute; deviceCode = item.StackerCraneCode; roadwayNo = responseContent.Data.ToString(); device.SetValue(W_ConveyorLineDB.EndPos, task.NextAddress, item.StationCode); device.SetValue(W_ConveyorLineDB.StartPos, task.CurrentAddress, item.StationCode); } else { WriteError(item.StationName, $"请求分配货位失败,设备编号:{item.StationCode},任务号:{task.TaskNum}"); continue; } } else { //task.NextAddress可能是router.NextPosi roadwayNo = responseContent.Data.ToString(); deviceCode = router.ChildPosiDeviceCode; currentAddress = router.StartPosi; nextAddress= router.NextPosi; device.SetValue(W_ConveyorLineDB.EndPos, router.NextPosi, item.StationCode); device.SetValue(W_ConveyorLineDB.StartPos, router.StartPosi, item.StationCode); } device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum, item.StationCode); device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt(), item.StationCode); device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode); _taskService.UpdateTask(task, taskState, currentAddress: currentAddress, nextAddress: nextAddress, targetAddress: targetAddress, deviceCode: deviceCode, roadwayNo: roadwayNo,heightType: conveyorLineInfoRead.Spare2); } } if (taskIn!=null) { string currentAddress = taskIn.CurrentAddress; string nextAddress = taskIn.NextAddress; string targetAddress = taskIn.TargetAddress; string deviceCode = taskIn.DeviceCode; TaskStatusEnum taskState = (TaskStatusEnum)taskIn.TaskState; List routers = _routerService.QueryNextRoutes(item.StationCode, taskIn.Roadway, taskIn.TaskType); Dt_Router? router = routers.FirstOrDefault(); if (routers == null || routers.Count == 0 || router == null) { WriteError(item.StationName, $"未找到对应路由信息,设备编号:{item.StationCode},任务号:{taskIn.TaskNum}"); continue; } if (routers.Count > 1) { WriteError(item.StationName, $"路由信息配置错误,设备编号:{item.StationCode},任务号:{taskIn.TaskNum}"); continue; } if (router.IsEnd) { string? targetLoca = _taskService.RequestAssignLocationByHeight(taskIn.TaskNum, taskIn.Roadway, taskIn.HeightType); if (!string.IsNullOrEmpty(targetLoca)) { currentAddress = item.StackerCraneStationCode; targetAddress = targetLoca; nextAddress = targetLoca; taskState = TaskStatusEnum.SC_Execute; deviceCode = item.StackerCraneCode; device.SetValue(W_ConveyorLineDB.EndPos, taskIn.CurrentAddress, item.StationCode); } else { WriteError(item.StationName, $"请求分配货位失败,设备编号:{item.StationCode},任务号:{task.TaskNum}"); continue; } } device.SetValue(W_ConveyorLineDB.TaskNum, taskIn.TaskNum, item.StationCode); device.SetValue(W_ConveyorLineDB.StartPos, taskIn.CurrentAddress, item.StationCode); device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt(), item.StationCode); device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode); _taskService.UpdateTask(taskIn, taskState, currentAddress: currentAddress, nextAddress: nextAddress, targetAddress: targetAddress, deviceCode: deviceCode); } #endregion } } else if (!conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && conveyorLineSignalWrite.ACK) { device.SetValue(W_ConveyorLineDB.ACK, false, item.StationCode); } else if (!conveyorLineSignalRead.STB && !conveyorLineSignalRead.ACK && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !conveyorLineSignalWrite.STB && !conveyorLineSignalWrite.ACK && conveyorLineInfoRead.TaskNum == 0)//出库 { Dt_Task task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskOutboundTypes.Contains(x.TaskType) && x.DeviceCode == item.StationDeviceCode && x.TaskState == TaskStatusEnum.Line_Execute.ObjToInt() && x.WarehouseId == warehouseDevice.WarehouseId); if (task != null) { _taskService.UpdateTask(task, TaskStatusEnum.Line_Executing); device.SetValue(W_ConveyorLineDB.TaskNum, task.TaskNum, item.StationCode); device.SetValue(W_ConveyorLineDB.StartPos, task.CurrentAddress, item.StationCode); device.SetValue(W_ConveyorLineDB.EndPos, task.NextAddress, item.StationCode); device.SetValue(W_ConveyorLineDB.Spare1, ConveyorWorkTypeEnum.Outbound.ObjToInt(), item.StationCode); device.SetValue(W_ConveyorLineDB.STB, true, item.StationCode); } //else //调拨使用 //{ // device.SetValue(W_ConveyorLineDB.STB, true, item.StationCode); //} //{ // task = _taskRepository.QueryFirst(x => x.CurrentAddress == item.StationCode && _taskService.TaskInboundTypes.Contains(x.TaskType) && string.IsNullOrEmpty(x.DeviceCode) && x.TaskState == TaskStatusEnum.New.ObjToInt() && x.WarehouseId == warehouseDevice.WarehouseId); // if (task != null) // { // Dt_StationManger stationManger = _stationMangerRepository.QueryFirst(x => x.StationCode == task.CurrentAddress); // if (stationManger != null) // { // _taskService.UpdateTask(task, TaskStatusEnum.SC_Execute, deviceCode: stationManger.StackerCraneCode, currentAddress: stationManger.StackerCraneStationCode, nextAddress: task.TargetAddress); // } // } //} //else } else if (!conveyorLineSignalRead.STB && conveyorLineSignalRead.ACK && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && conveyorLineSignalWrite.STB && !conveyorLineSignalWrite.ACK) { device.SetValue(W_ConveyorLineDB.STB, false, item.StationCode); } } //else if (item.StationType == StationTypeEnum.StationType_InStartAndOutEnd.ObjToInt()) //{ // if (!conveyorLineSignalWrite.ACK && conveyorLineSignalRead.STB && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm) // { // if (conveyorLineInfoRead.TaskNum == 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.Barcode))//退料入库 // { // } // else//出库完成 // { // } // } // else if (conveyorLineSignalWrite.STB && conveyorLineSignalRead.ACK && !conveyorLineStatus.Alarm) // { // device.SetValue(W_ConveyorLineDB.STB, false, item.StationCode); // } // else if (!conveyorLineSignalRead.STB && conveyorLineSignalWrite.ACK && !conveyorLineStatus.Alarm) // { // device.SetValue(W_ConveyorLineDB.ACK, false, item.StationCode); // } //} } else { WriteError(device.DeviceName, $"未找到设备子编号{item.StationCode}的协议信息"); } } } return Task.CompletedTask; } } }