Yw.Run.Core.sln
@@ -11,7 +11,11 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.Entry.Run.Core", "Yw.Entry.Run.Core\Yw.Entry.Run.Core.csproj", "{B5BCA833-E9A4-46B8-B7CF-40D1EF66B989}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yw.Dto.Run.Core", "Yw.Dto.Run.Core\Yw.Dto.Run.Core.csproj", "{E953B3D9-5F8A-4119-B519-B9A87EAA55A9}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.Dto.Run.Core", "Yw.Dto.Run.Core\Yw.Dto.Run.Core.csproj", "{E953B3D9-5F8A-4119-B519-B9A87EAA55A9}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yw.Server.Run", "Yw.Server.Run\Yw.Server.Run.csproj", "{15CD7CB4-980B-4F7B-87D0-7664AAB530F6}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Yw.TopShelf.Run", "Yw.TopShelf.Run\Yw.TopShelf.Run.csproj", "{3944FCF7-C6F3-4F6C-AD3D-25AB6FB5BD7F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -39,6 +43,14 @@ {E953B3D9-5F8A-4119-B519-B9A87EAA55A9}.Debug|Any CPU.Build.0 = Debug|Any CPU {E953B3D9-5F8A-4119-B519-B9A87EAA55A9}.Release|Any CPU.ActiveCfg = Release|Any CPU {E953B3D9-5F8A-4119-B519-B9A87EAA55A9}.Release|Any CPU.Build.0 = Release|Any CPU {15CD7CB4-980B-4F7B-87D0-7664AAB530F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {15CD7CB4-980B-4F7B-87D0-7664AAB530F6}.Debug|Any CPU.Build.0 = Debug|Any CPU {15CD7CB4-980B-4F7B-87D0-7664AAB530F6}.Release|Any CPU.ActiveCfg = Release|Any CPU {15CD7CB4-980B-4F7B-87D0-7664AAB530F6}.Release|Any CPU.Build.0 = Release|Any CPU {3944FCF7-C6F3-4F6C-AD3D-25AB6FB5BD7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3944FCF7-C6F3-4F6C-AD3D-25AB6FB5BD7F}.Debug|Any CPU.Build.0 = Debug|Any CPU {3944FCF7-C6F3-4F6C-AD3D-25AB6FB5BD7F}.Release|Any CPU.ActiveCfg = Release|Any CPU {3944FCF7-C6F3-4F6C-AD3D-25AB6FB5BD7F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE Yw.Server.Run/00-core/ConfigHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ namespace Yw.Server { /// <summary> /// /// </summary> internal class ConfigHelper { /// <summary> /// éç½®é¢ç /// </summary> public static int ResetFrequency { get { return Settings.RunParasHelper.Run.Task.Frequency; } } } } Yw.Server.Run/00-core/IJobHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ namespace Yw.Server { /// <summary> /// ä»»å¡è¾ å©ç±»æ¥å£ /// </summary> public interface IJobHelper { /// <summary> /// å¼å§ä»»å¡ /// </summary> Task StartJob(); /// <summary> /// åæ¶ä»»å¡ /// </summary> Task CancelJob(); } } Yw.Server.Run/00-core/JobHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,33 @@ namespace Yw.Server { /// <summary> /// /// </summary> public class JobHelper { private List<IJobHelper> _jobHelpers = new List<IJobHelper>() { new EquipmentRunAnalyServiceJobHelper(), new EMWSRunAnalyServiceJobHelper() }; /// <summary> /// /// </summary> public void StartJob() { _jobHelpers.ForEach(async x => await x.StartJob()); } /// <summary> /// /// </summary> public void CancelJob() { _jobHelpers.ForEach(async x => await x.CancelJob()); } } } Yw.Server.Run/01-equipment/01-service/EquipmentRunAnalyServiceJob.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,99 @@ namespace Yw.Server { /// <summary> /// 设å¤è¿è¡åææå¡ä»»å¡ /// </summary> [DisallowConcurrentExecution] public class EquipmentRunAnalyServiceJob : IJob { private static readonly List<EquipmentRunAnalySingleJobHelper> _jobHelpers = new List<EquipmentRunAnalySingleJobHelper>(); /// <summary> /// /// </summary> public Task Execute(IJobExecutionContext context) { return Task.Run(async () => { try { #region å è½½é ç½® var configureList = new Yw.Service.RunAnalyConfigure().GetAll(); configureList = configureList?.Where(x => x.ObjectType == Yw.Assets.DataType.Equipment).ToList(); if (configureList == null || configureList.Count < 1) { LogHelper.Error("设å¤è¿è¡åææå¡ä»»å¡ä¸ï¼æªæ£ç´¢å°é 置信æ¯"); CancelJobs(); return; } #endregion #region å¼å¯ä»»å¡ foreach (var configure in configureList) { var jobHelper = _jobHelpers.Find(x => x.Configure.ObjectType == configure.ObjectType && x.Configure.ObjectID == configure.ObjectID && x.Configure.ChangeTimes == configure.ChangeTimes && x.Configure.Frequency == configure.Frequency); if (jobHelper == null) { jobHelper = new EquipmentRunAnalySingleJobHelper(); await jobHelper.StartJob(configure); _jobHelpers.Add(jobHelper); LogHelper.Info($"设å¤è¿è¡åææå¡ä»»å¡ä¸,æ°æ®id:{configure.ObjectID},æ¹å次æ°:{configure.ChangeTimes},åæé¢ç:{configure.Frequency},计åä»»å¡å¼å¯ï¼"); } } #endregion #region å ³éä»»å¡ foreach (var jobHelper in _jobHelpers.ToList()) { var configure = configureList.Find(x => x.ObjectType == jobHelper.Configure.ObjectType && x.ObjectID == jobHelper.Configure.ObjectID && x.ChangeTimes == jobHelper.Configure.ChangeTimes && x.Frequency == jobHelper.Configure.Frequency); if (configure == null) { await jobHelper.CancelJob(); _jobHelpers.Remove(jobHelper); LogHelper.Info($"设å¤è¿è¡åææå¡ä»»å¡ä¸ï¼,æ°æ®id:{jobHelper.Configure.ObjectID},æ¹å次æ°:{jobHelper.Configure.ChangeTimes},åæé¢ç:{jobHelper.Configure.Frequency},计åä»»å¡å ³éï¼"); } } #endregion LogHelper.Info($"设å¤è¿è¡åææå¡ä»»å¡ä¸ï¼å¼å¯ä»»å¡æ°é为{_jobHelpers.Count}ï¼"); } catch (Exception ex) { LogHelper.Error("设å¤è¿è¡åææå¡ä»»å¡ä¸ï¼æ§è¡åºéï¼", ex); var e = new JobExecutionException(ex); throw e; } }); } /// <summary> /// åæ¶ä»»å¡ /// </summary> public static void CancelJobs() { if (_jobHelpers != null && _jobHelpers.Count > 0) { _jobHelpers.ForEach(async x => await x.CancelJob()); _jobHelpers.Clear(); } } } } Yw.Server.Run/01-equipment/01-service/EquipmentRunAnalyServiceJobHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,65 @@ namespace Yw.Server { /// <summary> /// 设å¤è¿è¡æå¡ä»»å¡è¾ å©ç±» /// </summary> public class EquipmentRunAnalyServiceJobHelper : IJobHelper { private const string _jobName = "EquipmentRunAnalyServiceJobName"; private const string _jobGroup = "EquipmentRunAnalyServiceJobGroup"; private const string _triggerName = "EquipmentRunAnalyServiceJobTrigger"; private static IScheduler _sched;//è°åº¦å¨ /// <summary> /// å¼å§ä»»å¡ /// </summary> public async Task StartJob() { if (_sched != null) return; // 1.å建schedulerçå¼ç¨ var fac = new Quartz.Impl.StdSchedulerFactory(); _sched = await fac.GetScheduler(); //2.å¯å¨ scheduler await _sched.Start(); //3.åå»ºä»»å¡ var job = JobBuilder.Create<EquipmentRunAnalyServiceJob>() .WithIdentity(_jobName, _jobGroup) .Build(); //4.å建Trigger var trigger = TriggerBuilder.Create() .WithIdentity(_triggerName, _jobGroup) .WithSimpleSchedule(x => x.WithIntervalInMinutes(ConfigHelper.ResetFrequency) .RepeatForever() .WithMisfireHandlingInstructionNextWithRemainingCount()) .Build(); //5.å å ¥è°åº¦ç®¡çå¨ await _sched.ScheduleJob(job, trigger); } /// <summary> /// åæ¶ä»»å¡ /// </summary> public async Task CancelJob() { if (_sched == null) return; var triggerKey = new TriggerKey(_triggerName, _jobGroup); if (await _sched.CheckExists(triggerKey)) { await _sched.UnscheduleJob(triggerKey); } EquipmentRunAnalyServiceJob.CancelJobs(); } } } Yw.Server.Run/01-equipment/02-single/EquipmentRunAnalyChangeTimesHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,55 @@ namespace Yw.Server { /// <summary> /// /// </summary> public class EquipmentRunAnalyChangeTimesHelper { private static ConcurrentDictionary<long, List<Yw.Model.MonitorRealRecord>> _dict = new();//ç¼å /// <summary> /// 设置 /// </summary> public static void Set(long configureId, int changeTimes, Yw.Model.MonitorRealRecord record) { _dict.TryAdd(configureId, new List<Yw.Model.MonitorRealRecord>()); if (_dict[configureId].Count >= changeTimes) { _dict[configureId].RemoveAt(0); } if (record != null) { _dict[configureId].Add(record); } } /// <summary> /// æ¯å¦æ¹å /// </summary> public static bool HasChanged(long configureId, int changeTimes) { if (!_dict.ContainsKey(configureId)) { return false; } if (_dict[configureId].Count < changeTimes) { return false; } if (_dict[configureId].Select(x => x.DataValue).Distinct().Count() > 1) { return false; } return true; } } } Yw.Server.Run/01-equipment/02-single/EquipmentRunAnalySingleJob.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,211 @@ namespace Yw.Server { /// <summary> /// 设å¤è¿è¡åæåä»»å¡ /// </summary> [DisallowConcurrentExecution]//æ¤ç¹æ§æ è¯ å¿ é¡»çå¾ è¿æ¬¡ä»»å¡æ§è¡å®æåï¼æè½æ§è¡ä¸æ¬¡ä»»å¡ public class EquipmentRunAnalySingleJob : IJob { internal const string Instance = "Instance"; private Yw.Model.RunAnalyConfigure _configure; /// <summary> /// /// </summary> public Task Execute(IJobExecutionContext context) { return Task.Run(() => { try { #region 任塿°æ® var dataMap = context.MergedJobDataMap; var jobModel = (Yw.Model.RunAnalyConfigure)dataMap[Instance]; if (jobModel == null) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼ä»»å¡æ°æ®ä¼ è¾å¤±è´¥ï¼"); return; } var configure = jobModel; _configure = configure; #endregion #region è·åè®¾å¤ var allEquipmentList = new Yw.Service.Equipment().GetChildAndSelfByID(configure.ObjectID); if (allEquipmentList == null || allEquipmentList.Count < 1) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} æ£ç´¢è®¾å¤å¤±è´¥ï¼"); return; } var allEquipmentIds = allEquipmentList.Select(x => x.ID).Distinct().ToList(); #endregion #region è·åæµç¹ var allMonitorMappingList = new Yw.Service.EquipmentMonitorMapping().GetByEquipmentIds(allEquipmentIds); if (allMonitorMappingList == null || allMonitorMappingList.Count < 1) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} æ£ç´¢æµç¹å ³è失败ï¼"); return; } var allMonitorIds = allMonitorMappingList.Select(x => x.MonitorPointID).Distinct().ToList(); var allMonitorList = new Yw.Service.MonitorPoint().GetExSignalWithSignalTypeByIds(allMonitorIds); allMonitorList = allMonitorList?.Where(x => x.UseStatus == Yw.Model.eUseStatus.Enable).ToList(); if (allMonitorList == null || allMonitorList.Count < 1) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} æ£ç´¢æµç¹å¤±è´¥ï¼"); return; } #endregion #region è¿è¡æµç¹ var monitorList = allMonitorList.Where(x => x.SignalList.Exists(t => t.SignalType.Code == Yw.Monitor.SignalType.è¿è¡ç¶æ)).ToList(); if (monitorList == null || monitorList.Count < 1) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} æ£ç´¢è¿è¡ç¶ææµç¹å¤±è´¥ï¼"); return; } var monitor = monitorList.Find(x => x.Flags.Contains(Yw.Monitor.Flags.é»è®¤)); if (monitor == null) { monitor = monitorList.First(); } #endregion #region è¿ç»ç¼å var lastRecord = new Yw.Service.MonitorRealRecord().GetLastRecord(monitor.SignalList.First().ID); EquipmentRunAnalyChangeTimesHelper.Set(configure.ID, configure.ChangeTimes, lastRecord); #endregion #region æ°æ®åæ var run_record = new Yw.Model.RunRealRecord() { ObjectType = configure.ObjectType, ObjectID = configure.ObjectID, DataTime = DateTime.Now, RSa = Yw.Run.RunStatus.Stop, ContinueRunTime = 0, TotalRunTime = 0, BootTimes = 0, AnalyStatus = Yw.Run.AnalyStatus.Normal, AnalyInfo = null }; var lastRunRecord = new Yw.Service.RunRealRecord().GetLastRecord(configure.ObjectType, configure.ObjectID); if (lastRunRecord == null) { run_record.AnalyInfo = "馿¬¡åæ"; if (lastRecord == null) { run_record.AnalyStatus = Yw.Run.AnalyStatus.Missing; } else { if (double.TryParse(lastRecord.DataValue, out double outDataValue)) { if (outDataValue > 0) { run_record.RSa = Yw.Run.RunStatus.Run; run_record.ContinueRunTime += configure.Frequency; run_record.TotalRunTime += configure.Frequency; run_record.BootTimes += 1; } } else { run_record.AnalyStatus = Yw.Run.AnalyStatus.Abnormal; } } } else { run_record.RSa = lastRunRecord.RSa; run_record.ContinueRunTime = lastRunRecord.ContinueRunTime; run_record.TotalRunTime = lastRunRecord.TotalRunTime; run_record.BootTimes = lastRunRecord.BootTimes; if (lastRecord == null) { run_record.AnalyStatus = Yw.Run.AnalyStatus.Missing; } else { if (double.TryParse(lastRecord.DataValue, out double outDataValue)) { var run_status = outDataValue > 0 ? Yw.Run.RunStatus.Run : Yw.Run.RunStatus.Stop; if (run_status != run_record.RSa) { if (EquipmentRunAnalyChangeTimesHelper.HasChanged(configure.ID, configure.ChangeTimes)) { run_record.RSa = run_status; if (run_status == Yw.Run.RunStatus.Run) { run_record.BootTimes += 1; } if (run_record.RSa == Yw.Run.RunStatus.Stop) { run_record.ContinueRunTime = 0; } } } } else { run_record.AnalyStatus = Yw.Run.AnalyStatus.Abnormal; } } if (run_record.RSa == Yw.Run.RunStatus.Run) { run_record.TotalRunTime += configure.Frequency; run_record.ContinueRunTime += configure.Frequency; } } #endregion #region æ°æ®åå¨ var bol = new Yw.Service.RunRealRecord().InsertLastRecord(run_record); if (bol) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} è¿è¡è®°å½åææåï¼"); } else { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} è¿è¡è®°å½ä¿å失败ï¼"); } #endregion } catch (Exception ex) { LogHelper.Error($"设å¤è¿è¡åæåä»»å¡ä¸ï¼ æ°æ®id:{_configure.ObjectID}, æ§è¡åºé", ex); var e = new JobExecutionException(ex); throw e; } }); } } } Yw.Server.Run/01-equipment/02-single/EquipmentRunAnalySingleJobHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,73 @@ namespace Yw.Server { /// <summary> /// 设å¤è¿è¡åæåä»»å¡è¾ å©ç±» /// </summary> public class EquipmentRunAnalySingleJobHelper { private IScheduler _sched;//è°åº¦å¨ /// <summary> /// é ç½® /// </summary> public Yw.Model.RunAnalyConfigure Configure { get; set; } /// <summary> /// å¼å§ä»»å¡ /// </summary> public async Task StartJob(Yw.Model.RunAnalyConfigure configure) { if (_sched != null) { return; } this.Configure = configure; var jobName = EquipmentRunAnalySingleJobNameHelper.GetJobName(configure); var jobGroupName = EquipmentRunAnalySingleJobNameHelper.GetJobGroupName(configure); var triggerName = EquipmentRunAnalySingleJobNameHelper.GetTriggerName(configure); // 1.å建schedulerçå¼ç¨ var fac = new Quartz.Impl.StdSchedulerFactory(); _sched = await fac.GetScheduler(); //2.å¯å¨ scheduler await _sched.Start(); //3.åå»ºä»»å¡ var job = JobBuilder.Create<EquipmentRunAnalySingleJob>() .WithIdentity(jobName, jobGroupName) .Build(); job.JobDataMap.Put(EquipmentRunAnalySingleJob.Instance, configure); //4.å建Trigger var trigger = TriggerBuilder.Create() .WithIdentity(triggerName, jobGroupName) .WithSimpleSchedule(x => x.WithIntervalInSeconds(configure.Frequency) .RepeatForever().WithMisfireHandlingInstructionNextWithRemainingCount()) .Build(); //5.å å ¥è°åº¦ç®¡çå¨ await _sched.ScheduleJob(job, trigger); } /// <summary> /// åæ¶ä»»å¡ /// </summary> public async Task CancelJob() { if (_sched == null) return; var jobGroupName = EquipmentRunAnalySingleJobNameHelper.GetJobGroupName(this.Configure); var triggerName = EquipmentRunAnalySingleJobNameHelper.GetTriggerName(this.Configure); var triggerKey = new TriggerKey(triggerName, jobGroupName); if (await _sched.CheckExists(triggerKey)) { await _sched.UnscheduleJob(triggerKey); } } } } Yw.Server.Run/01-equipment/02-single/EquipmentRunAnalySingleJobNameHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ namespace Yw.Server { /// <summary> /// 设å¤è¿è¡åä»»å¡åç§°è¾ å©ç±» /// </summary> public class EquipmentRunAnalySingleJobNameHelper { private const string _jobNameHeader = "EquipmentRunAnalySingleJobName"; private const string _jobGroupHeader = "EquipmentRunAnalySingleJobGroup"; private const string _triggerNameHeader = "EquipmentRunAnalySingleJobTrigger"; /// <summary> /// è·åä»»å¡åç§° /// </summary> public static string GetJobName(Yw.Model.RunAnalyConfigure rhs) { return $"{_jobNameHeader}_{rhs.ID}"; } /// <summary> /// è·åä»»å¡ç»åç§° /// </summary> public static string GetJobGroupName(Yw.Model.RunAnalyConfigure rhs) { return $"{_jobGroupHeader}_{rhs.ID}"; } /// <summary> /// è·å触åå¨åç§° /// </summary> public static string GetTriggerName(Yw.Model.RunAnalyConfigure rhs) { return $"{_triggerNameHeader}_{rhs.ID}"; } } } Yw.Server.Run/02-emws/01-service/EMWSRunAnalyServiceJob.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,100 @@ namespace Yw.Server { /// <summary> /// å·¥ä½è¿è¡åææå¡ä»»å¡ /// </summary> [DisallowConcurrentExecution] public class EMWSRunAnalyServiceJob : IJob { private static readonly List<EMWSRunAnalySingleJobHelper> _jobHelpers = new List<EMWSRunAnalySingleJobHelper>(); /// <summary> /// /// </summary> public Task Execute(IJobExecutionContext context) { return Task.Run(async () => { try { #region å è½½é ç½® var configureList = new Yw.Service.RunAnalyConfigure().GetAll(); configureList = configureList?.Where(x => x.ObjectType == Yw.EMWS.DataType.WorkSite).ToList(); if (configureList == null || configureList.Count < 1) { LogHelper.Error("å·¥ä½è¿è¡åææå¡ä»»å¡ä¸ï¼æªæ£ç´¢å°é 置信æ¯"); CancelJobs(); return; } #endregion #region å¼å¯ä»»å¡ foreach (var configure in configureList) { var jobHelper = _jobHelpers.Find(x => x.Configure.ObjectType == configure.ObjectType && x.Configure.ObjectID == configure.ObjectID && x.Configure.ChangeTimes == configure.ChangeTimes && x.Configure.Frequency == configure.Frequency); if (jobHelper == null) { jobHelper = new EMWSRunAnalySingleJobHelper(); await jobHelper.StartJob(configure); _jobHelpers.Add(jobHelper); LogHelper.Info($"å·¥ä½è¿è¡åææå¡ä»»å¡ä¸,æ°æ®id:{configure.ObjectID},æ¹å次æ°:{configure.ChangeTimes},åæé¢ç:{configure.Frequency},计åä»»å¡å¼å¯ï¼"); } } #endregion #region å ³éä»»å¡ foreach (var jobHelper in _jobHelpers.ToList()) { var configure = configureList.Find(x => x.ObjectType == jobHelper.Configure.ObjectType && x.ObjectID == jobHelper.Configure.ObjectID && x.ChangeTimes == jobHelper.Configure.ChangeTimes && x.Frequency == jobHelper.Configure.Frequency); if (configure == null) { await jobHelper.CancelJob(); _jobHelpers.Remove(jobHelper); LogHelper.Info($"å·¥ä½è¿è¡åææå¡ä»»å¡ä¸ï¼,æ°æ®id:{jobHelper.Configure.ObjectID},æ¹å次æ°:{jobHelper.Configure.ChangeTimes},åæé¢ç:{jobHelper.Configure.Frequency},计åä»»å¡å ³éï¼"); } } #endregion LogHelper.Info($"å·¥ä½è¿è¡åææå¡ä»»å¡ä¸ï¼å¼å¯ä»»å¡æ°é为{_jobHelpers.Count}ï¼"); } catch (Exception ex) { LogHelper.Error("å·¥ä½è¿è¡åææå¡ä»»å¡ä¸ï¼æ§è¡åºéï¼", ex); var e = new JobExecutionException(ex); throw e; } }); } /// <summary> /// åæ¶ä»»å¡ /// </summary> public static void CancelJobs() { if (_jobHelpers != null && _jobHelpers.Count > 0) { _jobHelpers.ForEach(async x => await x.CancelJob()); _jobHelpers.Clear(); } } } } Yw.Server.Run/02-emws/01-service/EMWSRunAnalyServiceJobHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,65 @@ namespace Yw.Server { /// <summary> /// å·¥ä½è¿è¡æå¡ä»»å¡è¾ å©ç±» /// </summary> public class EMWSRunAnalyServiceJobHelper : IJobHelper { private const string _jobName = "EMWSRunAnalyServiceJobName"; private const string _jobGroup = "EMWSRunAnalyServiceJobGroup"; private const string _triggerName = "EMWSRunAnalyServiceJobTrigger"; private static IScheduler _sched;//è°åº¦å¨ /// <summary> /// å¼å§ä»»å¡ /// </summary> public async Task StartJob() { if (_sched != null) return; // 1.å建schedulerçå¼ç¨ var fac = new Quartz.Impl.StdSchedulerFactory(); _sched = await fac.GetScheduler(); //2.å¯å¨ scheduler await _sched.Start(); //3.åå»ºä»»å¡ var job = JobBuilder.Create<EMWSRunAnalyServiceJob>() .WithIdentity(_jobName, _jobGroup) .Build(); //4.å建Trigger var trigger = TriggerBuilder.Create() .WithIdentity(_triggerName, _jobGroup) .WithSimpleSchedule(x => x.WithIntervalInMinutes(ConfigHelper.ResetFrequency) .RepeatForever() .WithMisfireHandlingInstructionNextWithRemainingCount()) .Build(); //5.å å ¥è°åº¦ç®¡çå¨ await _sched.ScheduleJob(job, trigger); } /// <summary> /// åæ¶ä»»å¡ /// </summary> public async Task CancelJob() { if (_sched == null) return; var triggerKey = new TriggerKey(_triggerName, _jobGroup); if (await _sched.CheckExists(triggerKey)) { await _sched.UnscheduleJob(triggerKey); } EMWSRunAnalyServiceJob.CancelJobs(); } } } Yw.Server.Run/02-emws/02-single/EMWSRunAnalyChangeTimesHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,55 @@ namespace Yw.Server { /// <summary> /// /// </summary> public class EMWSRunAnalyChangeTimesHelper { private static ConcurrentDictionary<long, List<Yw.Model.MonitorRealRecord>> _dict = new();//ç¼å /// <summary> /// 设置 /// </summary> public static void Set(long configureId, int changeTimes, Yw.Model.MonitorRealRecord record) { _dict.TryAdd(configureId, new List<Yw.Model.MonitorRealRecord>()); if (_dict[configureId].Count >= changeTimes) { _dict[configureId].RemoveAt(0); } if (record != null) { _dict[configureId].Add(record); } } /// <summary> /// æ¯å¦æ¹å /// </summary> public static bool HasChanged(long configureId, int changeTimes) { if (!_dict.ContainsKey(configureId)) { return false; } if (_dict[configureId].Count < changeTimes) { return false; } if (_dict[configureId].Select(x => x.DataValue).Distinct().Count() > 1) { return false; } return true; } } } Yw.Server.Run/02-emws/02-single/EMWSRunAnalySingleJob.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,222 @@ namespace Yw.Server { /// <summary> /// å·¥ä½è¿è¡åæåä»»å¡ /// </summary> [DisallowConcurrentExecution]//æ¤ç¹æ§æ è¯ å¿ é¡»çå¾ è¿æ¬¡ä»»å¡æ§è¡å®æåï¼æè½æ§è¡ä¸æ¬¡ä»»å¡ public class EMWSRunAnalySingleJob : IJob { internal const string Instance = "Instance"; private Yw.Model.RunAnalyConfigure _configure; /// <summary> /// /// </summary> public Task Execute(IJobExecutionContext context) { return Task.Run(() => { try { #region 任塿°æ® var dataMap = context.MergedJobDataMap; var jobModel = (Yw.Model.RunAnalyConfigure)dataMap[Instance]; if (jobModel == null) { LogHelper.Info($"å·¥ä½è¿è¡åæåä»»å¡ä¸ï¼ä»»å¡æ°æ®ä¼ è¾å¤±è´¥ï¼"); return; } var configure = jobModel; _configure = configure; #endregion #region æå¡åå¤ var service_work_site = new Lazy<Yw.Service.EMWSWorkSite>(() => new Yw.Service.EMWSWorkSite());//å·¥ä½æå¡ var service_work_mapping = new Lazy<Yw.Service.EMWSWorkMapping>(() => new Yw.Service.EMWSWorkMapping());//å·¥ä½ä¸æµç¹æ å°æå¡ var service_monitor = new Lazy<Yw.Service.MonitorPoint>(() => new Yw.Service.MonitorPoint());//æµç¹æå¡ var service_monitor_record = new Lazy<Yw.Service.MonitorRealRecord>(() => new Yw.Service.MonitorRealRecord());//æµç¹è®°å½æå¡ var service_run_record = new Lazy<Yw.Service.RunRealRecord>(() => new Yw.Service.RunRealRecord());//è¿è¡åæè®°å½æå¡ #endregion #region è·åå·¥ä½ var allWorKSiteList = service_work_site.Value.GetChildAndSelfByID(configure.ObjectID); if (allWorKSiteList == null || allWorKSiteList.Count < 1) { LogHelper.Info($"å·¥ä½è¿è¡åæåä»»å¡ä¸ï¼è·å工使°æ®å¤±è´¥ï¼"); return; } var allWorkSiteIds = allWorKSiteList.Select(x => x.ID).Distinct().ToList(); var currentWorkSite = allWorKSiteList.Find(x => x.ID == configure.ObjectID); #endregion #region è·åæµç¹ var allMonitorMappingList = service_work_mapping.Value.GetByWorkIdsAndMappingType(allWorkSiteIds, Yw.Monitor.DataType.MonitorPoint); if (allMonitorMappingList == null || allMonitorMappingList.Count < 1) { LogHelper.Info($"å·¥ä½è¿è¡åæåä»»å¡ä¸ï¼å·¥ä½åç§°:{currentWorkSite.Name}ï¼å·¥ä½id:{currentWorkSite.ID}ï¼è·åå ³èæµç¹ä¿¡æ¯å¤±è´¥ï¼"); return; } var allMonitorIds = allMonitorMappingList.Select(x => x.MappingID).Distinct().ToList(); var allMonitorList = service_monitor.Value.GetExSignalWithSignalTypeByIds(allMonitorIds); allMonitorList = allMonitorList?.Where(x => x.UseStatus == Yw.Model.eUseStatus.Enable).ToList(); allMonitorList = allMonitorList?.Where(x => x.CronType == Yw.Monitor.eCronType.Real).ToList(); if (allMonitorList == null || allMonitorList.Count < 1) { LogHelper.Info($"å·¥ä½è¿è¡åæåä»»å¡ä¸ï¼å·¥ä½åç§°:{currentWorkSite.Name}ï¼å·¥ä½id:{currentWorkSite.ID}ï¼è·åæææµç¹ä¿¡æ¯å¤±è´¥ï¼"); return; } #endregion #region è¿è¡æµç¹ var monitorList = allMonitorList.Where(x => x.SignalList.Exists(t => t.SignalType.Code == Yw.Monitor.SignalType.è¿è¡ç¶æ)).ToList(); if (monitorList == null || monitorList.Count < 1) { LogHelper.Info($"å·¥ä½è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} æ£ç´¢è¿è¡ç¶ææµç¹å¤±è´¥ï¼"); return; } var monitor = monitorList.Find(x => x.Flags.Contains(Yw.Monitor.Flags.é»è®¤)); if (monitor == null) { monitor = monitorList.First(); } #endregion #region è¿ç»ç¼å var lastMonitorRecord = service_monitor_record.Value.GetLastRecord(monitor.SignalList.First().ID); EMWSRunAnalyChangeTimesHelper.Set(configure.ID, configure.ChangeTimes, lastMonitorRecord); #endregion #region æ°æ®åæ var run_record = new Yw.Model.RunRealRecord() { ObjectType = configure.ObjectType, ObjectID = configure.ObjectID, DataTime = DateTime.Now, RSa = Yw.Run.RunStatus.Stop, ContinueRunTime = 0, TotalRunTime = 0, BootTimes = 0, AnalyStatus = Yw.Run.AnalyStatus.Normal, AnalyInfo = null }; var lastRunRecord = service_run_record.Value.GetLastRecord(configure.ObjectType, configure.ObjectID); if (lastRunRecord == null) { run_record.AnalyInfo = "馿¬¡åæ"; if (lastMonitorRecord == null) { run_record.AnalyStatus = Yw.Run.AnalyStatus.Missing; } else { if (double.TryParse(lastMonitorRecord.DataValue, out double outDataValue)) { if (outDataValue > 0) { run_record.RSa = Yw.Run.RunStatus.Run; run_record.ContinueRunTime += configure.Frequency; run_record.TotalRunTime += configure.Frequency; run_record.BootTimes += 1; } } else { run_record.AnalyStatus = Yw.Run.AnalyStatus.Abnormal; } } } else { run_record.RSa = lastRunRecord.RSa; run_record.ContinueRunTime = lastRunRecord.ContinueRunTime; run_record.TotalRunTime = lastRunRecord.TotalRunTime; run_record.BootTimes = lastRunRecord.BootTimes; if (lastMonitorRecord == null) { run_record.AnalyStatus = Yw.Run.AnalyStatus.Missing; } else { if (double.TryParse(lastMonitorRecord.DataValue, out double outDataValue)) { var run_status = outDataValue > 0 ? Yw.Run.RunStatus.Run : Yw.Run.RunStatus.Stop; if (run_status != run_record.RSa) { if (EMWSRunAnalyChangeTimesHelper.HasChanged(configure.ID, configure.ChangeTimes)) { run_record.RSa = run_status; if (run_status == Yw.Run.RunStatus.Run) { run_record.BootTimes += 1; } if (run_record.RSa == Yw.Run.RunStatus.Stop) { run_record.ContinueRunTime = 0; } } } } else { run_record.AnalyStatus = Yw.Run.AnalyStatus.Abnormal; } } if (run_record.RSa == Yw.Run.RunStatus.Run) { run_record.TotalRunTime += configure.Frequency; run_record.ContinueRunTime += configure.Frequency; } } #endregion #region æ°æ®åå¨ var bol = service_run_record.Value.InsertLastRecord(run_record); if (bol) { LogHelper.Info($"å·¥ä½è¿è¡åæåä»»å¡ä¸ï¼å·¥ä½åç§°:{currentWorkSite.Name}ï¼å·¥ä½id:{currentWorkSite.ID}, è¿è¡è®°å½åææåï¼"); } else { LogHelper.Info($"å·¥ä½è¿è¡åæåä»»å¡ä¸ï¼å·¥ä½åç§°:{currentWorkSite.Name}ï¼å·¥ä½id:{currentWorkSite.ID},è¿è¡è®°å½ä¿å失败ï¼"); } #endregion } catch (Exception ex) { LogHelper.Error($"å·¥ä½è¿è¡åæåä»»å¡ä¸ï¼ å·¥ä½id:{_configure.ObjectID}, æ§è¡åºé", ex); var e = new JobExecutionException(ex); throw e; } }); } } } Yw.Server.Run/02-emws/02-single/EMWSRunAnalySingleJobHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,73 @@ namespace Yw.Server { /// <summary> /// å·¥ä½è¿è¡åæåä»»å¡è¾ å©ç±» /// </summary> public class EMWSRunAnalySingleJobHelper { private IScheduler _sched;//è°åº¦å¨ /// <summary> /// é ç½® /// </summary> public Yw.Model.RunAnalyConfigure Configure { get; set; } /// <summary> /// å¼å§ä»»å¡ /// </summary> public async Task StartJob(Yw.Model.RunAnalyConfigure configure) { if (_sched != null) { return; } this.Configure = configure; var jobName = EMWSRunAnalySingleJobNameHelper.GetJobName(configure); var jobGroupName = EMWSRunAnalySingleJobNameHelper.GetJobGroupName(configure); var triggerName = EMWSRunAnalySingleJobNameHelper.GetTriggerName(configure); // 1.å建schedulerçå¼ç¨ var fac = new Quartz.Impl.StdSchedulerFactory(); _sched = await fac.GetScheduler(); //2.å¯å¨ scheduler await _sched.Start(); //3.åå»ºä»»å¡ var job = JobBuilder.Create<EMWSRunAnalySingleJob>() .WithIdentity(jobName, jobGroupName) .Build(); job.JobDataMap.Put(EMWSRunAnalySingleJob.Instance, configure); //4.å建Trigger var trigger = TriggerBuilder.Create() .WithIdentity(triggerName, jobGroupName) .WithSimpleSchedule(x => x.WithIntervalInSeconds(configure.Frequency) .RepeatForever().WithMisfireHandlingInstructionNextWithRemainingCount()) .Build(); //5.å å ¥è°åº¦ç®¡çå¨ await _sched.ScheduleJob(job, trigger); } /// <summary> /// åæ¶ä»»å¡ /// </summary> public async Task CancelJob() { if (_sched == null) return; var jobGroupName = EMWSRunAnalySingleJobNameHelper.GetJobGroupName(this.Configure); var triggerName = EMWSRunAnalySingleJobNameHelper.GetTriggerName(this.Configure); var triggerKey = new TriggerKey(triggerName, jobGroupName); if (await _sched.CheckExists(triggerKey)) { await _sched.UnscheduleJob(triggerKey); } } } } Yw.Server.Run/02-emws/02-single/EMWSRunAnalySingleJobNameHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ namespace Yw.Server { /// <summary> /// å·¥ä½è¿è¡åä»»å¡åç§°è¾ å©ç±» /// </summary> public class EMWSRunAnalySingleJobNameHelper { private const string _jobNameHeader = "EMWSRunAnalySingleJobName"; private const string _jobGroupHeader = "EMWSRunAnalySingleJobGroup"; private const string _triggerNameHeader = "EMWSRunAnalySingleJobTrigger"; /// <summary> /// è·åä»»å¡åç§° /// </summary> public static string GetJobName(Yw.Model.RunAnalyConfigure rhs) { return $"{_jobNameHeader}_{rhs.ID}"; } /// <summary> /// è·åä»»å¡ç»åç§° /// </summary> public static string GetJobGroupName(Yw.Model.RunAnalyConfigure rhs) { return $"{_jobGroupHeader}_{rhs.ID}"; } /// <summary> /// è·å触åå¨åç§° /// </summary> public static string GetTriggerName(Yw.Model.RunAnalyConfigure rhs) { return $"{_triggerNameHeader}_{rhs.ID}"; } } } Yw.Server.Run/GlobalUsings.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,10 @@ global using System.Text; global using System.ComponentModel; global using System.Security.Cryptography; global using System.Reflection; global using System.Data; global using System.Globalization; global using System.Collections; global using Quartz; global using Yw; global using System.Collections.Concurrent; Yw.Server.Run/Program.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ // See https://aka.ms/new-console-template for more information using Yw.Server; LogHelper.Info("å¼å§å¯å¨èå·éåºæå¡..."); var jobHelper = new JobHelper(); jobHelper.StartJob(); AppDomain.CurrentDomain.ProcessExit += (sender, e) => { jobHelper.CancelJob(); }; LogHelper.Info("èå·éåºæå¡å¯å¨æåï¼"); Console.ReadLine(); Yw.Server.Run/Yw.Server.Run.csproj
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>disable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Yw.Quartz.Core" Version="3.0.0" /> <PackageReference Include="Yw.Service.Assets.Core" Version="3.0.5" /> <PackageReference Include="Yw.Service.EMWS.Core" Version="3.0.1" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\Yw.Service.Run.Core\Yw.Service.Run.Core.csproj" /> </ItemGroup> </Project> Yw.Service.Run.Core/Yw.Service.Run.Core.csproj
@@ -27,8 +27,8 @@ </ItemGroup> <ItemGroup> <PackageReference Include="Yw.DAL.PostgreSql.Core" Version="3.0.0" /> <PackageReference Include="Yw.DAL.SQLite.Core" Version="3.0.0" /> <PackageReference Include="Yw.DAL.PostgreSql.Core" Version="3.0.1" /> <PackageReference Include="Yw.DAL.SQLite.Core" Version="3.0.1" /> <PackageReference Include="Yw.DALFactory.Core" Version="3.0.0" /> <PackageReference Include="Yw.ExchangeFactory.Core" Version="3.0.0" /> <PackageReference Include="Yw.LCacheFactory.Core" Version="3.0.0" /> Yw.TopShelf.Run/Program.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ // See https://aka.ms/new-console-template for more information using Yw.TopShelf; using Topshelf; //SZJT HostFactory.Run(x => { x.Service<Service>(); x.RunAsLocalSystem(); x.SetDescription("æºæ §æ³µç«Coreçè¿è¡åæç¨åº(SZJT)"); x.SetDisplayName("IStation.Core.Server.Run.SZJT"); x.SetServiceName("IStation.Core.Server.Run.SZJT"); x.EnableServiceRecovery(r => r.RestartService(TimeSpan.FromSeconds(120))); x.StartAutomatically(); }); Yw.TopShelf.Run/Service.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,35 @@ using Topshelf; using Yw.Server; namespace Yw.TopShelf { /// <summary> /// /// </summary> public class Service : ServiceControl { private readonly JobHelper _jobHelper = new(); /// <summary> /// /// </summary> /// <param name="hostControl"></param> /// <returns></returns> public bool Start(HostControl hostControl) { _jobHelper.StartJob(); return true; } /// <summary> /// /// </summary> /// <param name="hostControl"></param> /// <returns></returns> public bool Stop(HostControl hostControl) { _jobHelper.CancelJob(); return true; } } } Yw.TopShelf.Run/Yw.TopShelf.Run.csproj
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Yw.TopShelf" Version="3.0.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\Yw.Server.Run\Yw.Server.Run.csproj" /> </ItemGroup> </Project>