| #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 System.Reflection; | 
| using WIDESEAWCS_BasicInfoRepository; | 
| using WIDESEAWCS_BasicInfoService; | 
| using WIDESEAWCS_Common; | 
| using WIDESEAWCS_Core.Helper; | 
| using WIDESEAWCS_DTO.MOM; | 
| using WIDESEAWCS_IProcessRepository; | 
| 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 partial class CommonConveyorLine_BZJob : JobBase, IJob | 
|     { | 
|         public readonly ITaskService _taskService; | 
|         private readonly ITaskRepository _taskRepository; | 
|         private readonly ITaskExecuteDetailService _taskExecuteDetailService; | 
|         private readonly IRouterService _routerService; | 
|         private readonly IPlatFormRepository _platFormRepository; | 
|         private readonly ISys_ConfigService _sys_ConfigService; | 
|         private readonly IMapper _mapper; | 
|         private readonly IDt_StationManagerService _stationManagerService; | 
|         private readonly IDt_StationManagerRepository _stationManagerRepository; | 
|         private readonly ICacheService _cacheService; | 
|         private readonly INoticeService _noticeService; | 
|         private readonly IDt_needBarcodeRepository _needBarcodeRepository; | 
|   | 
|         public CommonConveyorLine_BZJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper, ITaskRepository taskRepository, IPlatFormRepository platFormRepository, ISys_ConfigService sys_ConfigService, IDt_StationManagerRepository stationManagerRepository, ICacheService cacheService, INoticeService noticeService, IDt_StationManagerService stationManagerService, IDt_needBarcodeRepository needBarcodeRepository) | 
|         { | 
|             _taskService = taskService; | 
|             _taskExecuteDetailService = taskExecuteDetailService; | 
|             _routerService = routerService; | 
|             _mapper = mapper; | 
|             _taskRepository = taskRepository; | 
|             _platFormRepository = platFormRepository; | 
|             _sys_ConfigService = sys_ConfigService; | 
|             _stationManagerRepository = stationManagerRepository; | 
|             _cacheService = cacheService; | 
|             _noticeService = noticeService; | 
|             _stationManagerService = stationManagerService; | 
|             _needBarcodeRepository = needBarcodeRepository; | 
|         } | 
|   | 
|         public Task Execute(IJobExecutionContext context) | 
|         { | 
|             try | 
|             { | 
|                 CommonConveyorLine_BZ conveyorLine = (CommonConveyorLine_BZ)context.JobDetail.JobDataMap.Get("JobParams"); | 
|                 if (conveyorLine != null) | 
|                 { | 
|                     #region 站台方式 | 
|   | 
|                     List<Dt_StationManager> stationManagers = _stationManagerService.GetAllStationByDeviceCode(conveyorLine.DeviceCode); | 
|   | 
|                     foreach (var station in stationManagers) | 
|                     { | 
|                         ConveyorLineTaskCommand_After command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand_After>(station.stationChildCode); | 
|   | 
|                         DeviceProtocolDetailDTO? deviceProtocolDetails = conveyorLine.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(ConveyorLineTaskCommand_After.InteractiveSignal) && x.ProtocalDetailValue == command.InteractiveSignal.ToString()); | 
|                         if (deviceProtocolDetails != null) | 
|                         { | 
|                             MethodInfo? method = GetType().GetMethod(deviceProtocolDetails.ProtocolDetailType); | 
|                             if (method != null) | 
|                             { | 
|                                 method.Invoke(this, new object[] { conveyorLine, command, station }); | 
|                             } | 
|                         } | 
|   | 
|                         #region 调用事件总线通知前端 | 
|   | 
|                         //var tokenInfos = _cacheService.Get<List<UserInfo>>("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 | 
|                         //{ | 
|                         //    station.stationChildCode, | 
|                         //    commandAfter = command, | 
|                         //}; | 
|                         //_noticeService.StackerData(userIds?.FirstOrDefault(), userTokenIds, new { conveyorLine.DeviceName, data = obj }); | 
|   | 
|                         #endregion 调用事件总线通知前端 | 
|                     } | 
|   | 
|                     #endregion 站台方式 | 
|   | 
|                     #region 路由方式 | 
|   | 
|                     //List<string> childDeviceCodes = _routerService.QueryAllPositions(conveyorLine.DeviceCode); | 
|                     //foreach (string childDeviceCode in childDeviceCodes) | 
|                     //{ | 
|                     //    ConveyorLineTaskCommand_After command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand_After>(childDeviceCode); | 
|   | 
|                     //    if (command == null) continue; | 
|                     //    if (command.ConveyorLineBarcode.Trim().Contains("\0")) command.ConveyorLineBarcode = ""; | 
|   | 
|                     //    DeviceProtocolDetailDTO? deviceProtocolDetails = conveyorLine.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(ConveyorLineTaskCommand_After.InteractiveSignal) && x.ProtocalDetailValue == command.InteractiveSignal.ToString()); | 
|                     //    if (deviceProtocolDetails != null) | 
|                     //    { | 
|                     //        MethodInfo? method = GetType().GetMethod(deviceProtocolDetails.ProtocolDetailType); | 
|                     //        if (method != null) | 
|                     //        { | 
|                     //            method.Invoke(this, new object[] { conveyorLine, command, childDeviceCode }); | 
|                     //        } | 
|                     //    } | 
|   | 
|                     //    if (childDeviceCode == "1670") | 
|                     //    { | 
|                     //        Platform platform = _platFormRepository.QueryFirst(x => x.PLCCode == conveyorLine.DeviceCode && x.PlatCode == childDeviceCode && x.Status == "Active"); | 
|                     //        if (platform != null) | 
|                     //        { | 
|                     //            if (command.HasPallet != 1) | 
|                     //            { | 
|                     //                MethodInfo? method = GetType().GetMethod(platform.ExecutionMethod); | 
|                     //                if (method != null) | 
|                     //                { | 
|                     //                    int count = string.IsNullOrEmpty(platform.Location) ? 0 + 1 : platform.Location.Split(',').Count() + 1; | 
|                     //                    method.Invoke(this, new object[] { conveyorLine, command, childDeviceCode, count, platform }); | 
|                     //                } | 
|                     //            } | 
|                     //        } | 
|                     //    } | 
|                     //} | 
|   | 
|                     #endregion 路由方式 | 
|                 } | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 Console.Out.WriteLine(nameof(CommonConveyorLine_BZJob) + ":" + ex.ToString()); | 
|             } | 
|             finally | 
|             { | 
|                 //WriteDebug("CommonConveyorLineJob", "test"); | 
|                 //Console.Out.WriteLine(DateTime.Now); | 
|             } | 
|             return Task.CompletedTask; | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 输送线请求出信息 | 
|         /// </summary> | 
|         /// <param name="conveyorLine">输送线实例对象</param> | 
|         /// <param name="command">读取的请求信息</param> | 
|         /// <param name="childDeviceCode">子设备编号</param> | 
|         /// <param name="station">线体当前bool读取偏移地址</param> | 
|         public void RequestOutbound(CommonConveyorLine_BZ conveyorLine, ConveyorLineTaskCommand_After command, Dt_StationManager station) | 
|         { | 
|             //查询对应产线的在途数据 | 
|             dt_needBarcode needBarcode = _needBarcodeRepository.QueryFirst(x => x.productLine == station.productLine && x.toArea == station.stationChildCode); | 
|   | 
|             needBarcode.inLineNum = _taskRepository.QueryData(x => x.TargetAddress == station.stationChildCode).Count(); | 
|   | 
|             //若在途数量小于目标位置的缓存数量 则寻找对应常温库存中常温3工序的可出库数据 并建立出库任务 | 
|             if (needBarcode.inLineNum < needBarcode.cacheNum) | 
|             { | 
|                 if (_taskService.RequestOutTaskToBZAsync(station).Result.Status) | 
|                 { | 
|                     needBarcode.inLineNum++; | 
|                     _needBarcodeRepository.UpdateData(needBarcode); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         /// <summary> | 
|         /// 到达目标位置后  将对应任务清除 并更新在途数据 | 
|         /// </summary> | 
|         /// <param name="conveyorLine"></param> | 
|         /// <param name="command"></param> | 
|         /// <param name="station"></param> | 
|         public void RecivcePalletBarcode(CommonConveyorLine_BZ conveyorLine, ConveyorLineTaskCommand_After command, Dt_StationManager station) | 
|         { | 
|             Dt_Task task = _taskRepository.QueryFirst(x => x.PalletCode == command.ConveyorLineBarcode && x.CurrentAddress == station.stationChildCode); | 
|   | 
|             dt_needBarcode needBarcode = _needBarcodeRepository.QueryFirst(x => x.toArea == station.stationChildCode); | 
|             if (needBarcode == null) throw new Exception($"未配置相关{station.stationChildCode}的产线在途数据"); | 
|   | 
|             if (task != null) //如任务不为空 则为送包装料 写入下一地址 清除对应任务 并更新在途数据 | 
|             { | 
|                 conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, task.NextAddress, station.stationChildCode); | 
|                 _taskRepository.DeleteData(task); | 
|   | 
|                 if (--needBarcode.inLineNum <= 0) needBarcode.inLineNum = 0; | 
|                 _needBarcodeRepository.UpdateData(needBarcode); | 
|             } | 
|             else  //如无任务 则判定为从NG口上料 调取MOM接口  判断返回参数 无异常则送入包装,有异常则退回NG口 | 
|             { | 
|                 var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); | 
|                 var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.MOMIP_BASE)?.ConfigValue; | 
|                 var ipAddress = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.TrayCellsStatus)?.ConfigValue; | 
|                 if (wmsBase == null || ipAddress == null) | 
|                 { | 
|                     throw new InvalidOperationException("MOM IP 未配置"); | 
|                 } | 
|                 TrayCellsStatusDto trayCells = new TrayCellsStatusDto() | 
|                 { | 
|                     Software = "WMS", | 
|                     TrayBarcode = command.ConveyorLineBarcode, | 
|                     EquipmentCode = station.stationEquipMOM, | 
|                     SessionId = Guid.NewGuid().ToString(), | 
|                     EmployeeNo = "MITest", | 
|                     //SceneType = "1", | 
|                     RequestTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now).ToString("yyyy-MM-ddTHH:mm:ss.fffZ") | 
|                 }; | 
|   | 
|                 var MOMIpAddress = wmsBase + ipAddress; | 
|   | 
|                 var result = HttpHelper.PostAsync(MOMIpAddress, trayCells.ToJsonString()).Result; | 
|                 ResultTrayCellsStatus result1 = JsonConvert.DeserializeObject<ResultTrayCellsStatus>(result); | 
|   | 
|                 if (!result1.Success) | 
|                 { | 
|                     conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, station.stationNGChildCode, station.stationChildCode); | 
|                 } | 
|                 else | 
|                 { | 
|                     //写入对应产线的目标地址 | 
|                     if (station.productLine == "ZJ-7") | 
|                     { | 
|                         conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, "", station.stationChildCode); | 
|                     } | 
|                     else | 
|                     { | 
|                         conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, "", station.stationChildCode); | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|     } | 
| } | 
|   | 
| #endregion |