#region MyRegion #region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEAWCS_Tasks.ConveyorLineJob * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using AutoMapper; using HslCommunication; using Newtonsoft.Json; using Quartz; using SqlSugar; using System.Reflection; using System.Threading.Tasks; using WIDESEAWCS_BasicInfoRepository; using WIDESEAWCS_BasicInfoService; using WIDESEAWCS_Common; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Core.HttpContextUser; using WIDESEAWCS_DTO.TaskInfo; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_SignalR; using WIDESEAWCS_Tasks.ConveyorLineJob; using ICacheService = WIDESEAWCS_Core.Caches.ICacheService; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class CommonConveyorLineJob : JobBase, IJob { private readonly ITaskService _taskService; private readonly ITaskRepository _taskRepository; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly IRouterService _routerService; private readonly IMapper _mapper; private readonly IDt_StationManagerService _stationManagerService; private readonly ISys_ConfigService _sys_ConfigService; private readonly ICacheService _cacheService; private readonly INoticeService _noticeService; private readonly IDt_needBarcodeRepository _needBarcodeRepository; private static List? userTokenIds; private static List? userIds; public CommonConveyorLineJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper, ITaskRepository taskRepository, IDt_StationManagerService stationManagerService, ISys_ConfigService sys_ConfigService, ICacheService cacheService, INoticeService noticeService, IDt_needBarcodeRepository needBarcodeRepository) { _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _routerService = routerService; _mapper = mapper; _taskRepository = taskRepository; _stationManagerService = stationManagerService; _sys_ConfigService = sys_ConfigService; _cacheService = cacheService; _noticeService = noticeService; _needBarcodeRepository = needBarcodeRepository; } public async Task Execute(IJobExecutionContext context) { try { CommonConveyorLine conveyorLine = (CommonConveyorLine)context.JobDetail.JobDataMap.Get("JobParams"); if (conveyorLine != null) { List stationManagers = _stationManagerService.GetAllStationByDeviceCode(conveyorLine.DeviceCode); foreach (var station in stationManagers) { ConveyorLineTaskCommand command = conveyorLine.ReadCustomer(station.stationChildCode); DeviceProtocolDetailDTO? deviceProtocolDetails = conveyorLine.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == station.stationChildCode && x.ProtocalDetailValue == command.ConveyorLineSingal.ToString()); //x.DeviceProParamName == nameof(ConveyorLineTaskCommand.ConveyorLineSingal) if (deviceProtocolDetails != null) { MethodInfo? method = GetType().GetMethod(deviceProtocolDetails.ProtocolDetailType); if (method != null) { method.Invoke(this, new object[] { conveyorLine, command, station }); } } //if (station.stationChildCode == "3010") //{ // ConveyorLineTaskCommand_CZ command2 = conveyorLine.ReadCustomer(station.stationChildCode); // DeviceProtocolDetailDTO? deviceProtocolDetails_cz = conveyorLine.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == station.stationChildCode && x.ProtocalDetailValue == command2.ConveyorLineSingal.ToString()); // if (deviceProtocolDetails_cz != null) // { // MethodInfo? method = GetType().GetMethod(deviceProtocolDetails_cz.ProtocolDetailType); // if (method != null) // { // method.Invoke(this, new object[] { conveyorLine, command2, station }); // } // } //} #region 调用事件总线通知前端 //var tokenInfos = _cacheService.Get>("Cache_UserToken"); //if (tokenInfos == null || !tokenInfos.Any()) //{ // //throw new Exception(conveyorLine.DeviceName + "缓存中未找到Token缓存"); // continue; //} //var userTokenIds = tokenInfos?.Select(x => x.Token_ID).ToList(); //var userIds = tokenInfos?.Select(x => x.UserId).ToList(); //object obj = new //{ // childDeviceCode = station.stationChildCode, // commandAfter = command, //}; //await _noticeService.StackerData(userIds?.FirstOrDefault(), userTokenIds, new { conveyorLine.DeviceName, data = obj }); #endregion 调用事件总线通知前端 } } } catch (Exception ex) { Console.Out.WriteLine(nameof(CommonConveyorLineJob) + ":" + ex.ToString()); } finally { //WriteDebug("CommonConveyorLineJob", "test"); //Console.Out.WriteLine(DateTime.Now); } return; } /// /// 输送线请求入库 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 public void RequestInbound(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager stationInfo) { var log = $"【{conveyorLine.DeviceName}】,托盘号:【{stationInfo.stationChildCode}】,站台:【{stationInfo.remark}】请求任务"; ConsoleHelper.WriteSuccessLine(log); //_noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" }); WriteInfo(conveyorLine.DeviceName, log); //if() var taskNew = _taskService.QueryConveyorLineTask(command.Number, stationInfo.stationChildCode); if (taskNew == null) { if (_taskService.RequestTask(command.Number, stationInfo).Result.Status) { Dt_Task task = _taskService.QueryConveyorLineTask(command.Number, stationInfo.stationChildCode); if (task != null) { conveyorLine.SetValue(ConveyorLineDBName.Number, task.PalletCode, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.TargetAddress, task.NextAddress, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.ResponState, 1, stationInfo.stationChildCode); _taskService.UpdateTaskStatusToNext(task); } } else { //如果任务请求失败 conveyorLine.SetValue(ConveyorLineDBName.ResponState, 2, stationInfo.stationChildCode); } } else { conveyorLine.SetValue(ConveyorLineDBName.Number, taskNew.PalletCode, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.TargetAddress, taskNew.NextAddress, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.ResponState, 1, stationInfo.stationChildCode); _taskService.UpdateTaskStatusToNext(taskNew); } } /// /// 输送线入库完成 /// /// /// /// public void ConveyorLineInFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager stationInfo) { //string clinfo = conveyorLine.ReadValue(ConveyorLineDBName.Number, stationInfo.stationChildCode).ToString(); var task = _taskService.QueryExecutingTaskByBarcode(command.Number, stationInfo.stationChildCode); if (task != null && task.TaskState != (int)TaskInStatusEnum.Line_InFinish) { //ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); WebResponseContent content = _taskService.UpdateTaskStatusToNext(task); ConsoleHelper.WriteErrorLine($"{stationInfo.stationChildCode}站台请求响应信息:{content.ToJsonString()}"); if (content.Status) { conveyorLine.SetValue(ConveyorLineDBName.ResponState, 1, stationInfo.stationChildCode); } else { conveyorLine.SetValue(ConveyorLineDBName.ResponState, 2, stationInfo.stationChildCode); } } } /// /// 输送线请求出信息 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 /// 线体当前bool读取偏移地址 public void RequestOutbound(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager stationInfo) { var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceName, stationInfo.stationChildCode); if (task != null) { conveyorLine.SetValue(ConveyorLineDBName.Number, task.PalletCode, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.TargetAddress, task.TargetAddress, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.ResponState, 1, stationInfo.stationChildCode); //ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); _taskService.UpdateTaskStatusToNext(task); if (task.TargetAddress == "2009" && task.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting) { _taskService.UpdateTaskStatusToNext(task); } } } /// /// 输送线请求车轮信息 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 /// 线体当前bool读取偏移地址 public void RequestWheelsInfo(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager stationInfo) { var task = _taskService.QueryExecutingTaskByBarcode(command.Number, stationInfo.stationChildCode); if (task != null) { int wheelsType = task.TaskType == (int)TaskOutboundTypeEnum.OutWheels ? 3 : 4; // 3-车轮 4-制动盘 int wheelsNewOld = task.WheelsNewOrOld == "0" ? 1 : 2; //1-新 2-旧 int wheels_mttype = task.wheels_mttype == "M" ? 1 : 2; //1-动车 2-拖车 conveyorLine.SetValue(ConveyorLineDBName.CarType, task.CarType, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.WheelsCategory, wheelsType, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.WheelsType, wheels_mttype, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.WheelsNewOld, wheelsNewOld, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.WheelsDiameter, task.wheels_gkcc, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.WheelsLX, task.WheelsLX, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.ResponState, 1, stationInfo.stationChildCode); _taskService.UpdatePosition(task.TaskNum, stationInfo.stationChildCode); } } /// /// 输送线通知车轮测量到位 /// /// 输送线对象 /// 读取参数 /// 站台信息 public void RequestCheckInfo(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager stationInfo) { var task = _taskService.QueryExecutingTaskByBarcode(command.Number, stationInfo.stationChildCode); if (task != null) { if (_taskService.UpdateCheckTask(command.Number, stationInfo).Result.Status) { conveyorLine.SetValue(ConveyorLineDBName.ResponState, 1, stationInfo.stationChildCode); _taskService.UpdatePosition(task.TaskNum, stationInfo.stationChildCode); } else { conveyorLine.SetValue(ConveyorLineDBName.ResponState, 2, stationInfo.stationChildCode); } } else { conveyorLine.SetValue(ConveyorLineDBName.ResponState, 2, stationInfo.stationChildCode); } } /// /// 输送线任务完成 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 /// 线体当前bool读取偏移地址 public void ConveyorLineOutFinish(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager stationInfo) { var task = _taskService.QueryExecutingTaskByBarcode(command.Number, stationInfo.stationChildCode); if (task != null) { //根据车轴缓存位置 写入对应目标地址 if (task.TargetAddress == stationInfo.stationChildCode) { WebResponseContent content = _taskService.RequestWheelsFlow(task.task_CZInfo).Result; if (content.Status) { string taraddress = content.Data.ToString(); // "2032"; conveyorLine.SetValue(ConveyorLineDBName.TargetAddress, taraddress, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.ResponState, 1, stationInfo.stationChildCode); _taskService.UpdateTaskStatusToNext(task); } else { conveyorLine.SetValue(ConveyorLineDBName.ResponState, 2, stationInfo.stationChildCode); } } else { conveyorLine.SetValue(ConveyorLineDBName.TargetAddress, task.TargetAddress, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.ResponState, 1, stationInfo.stationChildCode); _taskService.UpdateTaskStatusToNext(task); } } else { conveyorLine.SetValue(ConveyorLineDBName.ResponState, 2, stationInfo.stationChildCode); } //_taskService.UpdatePosition(task.TaskNum, stationInfo.stationChildCode); } #region 车轴线交互 /// /// 车轴上料交互 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 /// 线体当前bool读取偏移地址 public void RequestCZInfo(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager stationInfo) { var task = _taskService.QueryExecutingTaskByBarcode(command.Number, stationInfo.stationChildCode); if (task == null) { //todo 查询WMS车轴数据返回 Random random = new Random(20); string cztm = "CZ00" + random.Next(); //conveyorLine //conveyorLine.SetValue(ConveyorLineDBName.Number, cztm, stationInfo.stationChildCode); conveyorLine.SetValue(ConveyorLineDBName.ResponState, 1, stationInfo.stationChildCode); } } /// /// 车轴下料交互 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 /// 线体当前bool读取偏移地址 public void RequestTakeCZ(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, Dt_StationManager stationInfo) { var task = _taskService.QueryExecutingTaskByBarcode(command.Number, stationInfo.stationChildCode); if (task == null) { //conveyorLine conveyorLine.SetValue(ConveyorLineDBName.ResponState, 1, stationInfo.stationChildCode); } } #endregion /// /// 输送线请求入库 /// /// 输送线实例对象 /// 读取的请求信息 /// 子设备编号 //public void RequestInbound(CommonConveyorLine_After conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) //{ // var stationInfo = _stationManagerService.GetStationInfoByChildCode(childDeviceCode); // if (stationInfo != null) // { // //_taskService.r // } // var taskNew = _taskService.QueryCraneConveyorLineTask(command.ConveyorLineTaskNum.ObjToInt(), childDeviceCode); // if (taskNew == null) // { // string barcode = command.ConveyorLineBarcode.TrimEnd(); // if (_taskService.RequestWMSTask(command.ConveyorLineBarcode, childDeviceCode).Result.Status) // { // Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); // if (task != null) // { // ConveyorLineTaskCommand_After taskCommand = _mapper.Map(task); // //taskCommand.InteractiveSignal = command.InteractiveSignal; // taskCommand.ResponState = 1; // taskCommand.ConveyorLineTaskNum = task.TaskNum; // taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(task.NextAddress); // conveyorLine.SendCommand(taskCommand, childDeviceCode); // //ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); // _taskService.UpdateTaskStatusToNext(task); // } // } // } //} } } #endregion