From 02af3287e8dd054d39d8d8158041323437cbf9a7 Mon Sep 17 00:00:00 2001 From: Rodney Chen <rodney.chen@hotmail.com> Date: 星期一, 28 十月 2024 15:12:35 +0800 Subject: [PATCH] Merge branch 'master' of http://47.115.28.255:8110/r/TigerClouds-Tech/Server/TigerApi6_2024 --- Tiger.IBusiness.MES/TSK/ITskJob.cs | 16 Tiger.Model.Net/Tiger.Model.Net.csproj | 1 Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs | 15 Tiger.Business.MES/Task/Jobs.U9C_ME_GetCustSn.cs | 52 + Tiger.Business.MES/Task/Jobs.U9C_ME_GetSupplier.cs | 52 + Tiger.Business/Services/Base/TigerJobBase.cs | 187 ++++++ Tiger.Business/Services/Base/InterfaceServiceNew.cs | 358 ++++++++++++- Tiger.Controllers.System/Controllers/TSK/TskController.Base.cs | 67 ++ Tiger.Api/Controllers/Test/TestController.B.cs | 2 Tiger.Business.MES/Task/Jobs.U9C_ME_GetItem.cs | 47 + Tiger.Business/Services/ServicesBus.cs | 26 Tiger.Business.MES/Task/TskJob.cs | 108 ++++ Tiger.Business.MES/iERP/U9C_MES.cs | 248 +++++++-- Tiger.IBusiness/Service/IInterfaceService.cs | 16 Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs | 118 ++++ Tiger.Business/Services/Base/InterfaceService.cs | 40 + Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs | 53 ++ Tiger.Dependencies/Tiger.Dependencies.csproj | 1 Tiger.IBusiness/Service/ITigerJob.cs | 30 + Tiger.Business.MES/Common/WoContext.cs | 2 Tiger.Business.MES/Task/Jobs.U9C_ME_GetCustomer.cs | 52 + Tiger.IBusiness.MES/iERP/IU9C_MES.cs | 9 Tiger.Model.Net/Entitys/MES/ParameterEntity/TskParameter.cs | 35 + /dev/null | 20 Tiger.Model.Net/Entitys/MES/ParameterEntity/U9C_MES_Input.cs | 1 25 files changed, 1,318 insertions(+), 238 deletions(-) diff --git a/Tiger.Api/Controllers/Test/TestController.B.cs b/Tiger.Api/Controllers/Test/TestController.B.cs index 056f4e9..df3fc2a 100644 --- a/Tiger.Api/Controllers/Test/TestController.B.cs +++ b/Tiger.Api/Controllers/Test/TestController.B.cs @@ -116,7 +116,7 @@ ApiAction response = new(); try { - response = response.GetResponse(await DI.Resolve<IU9C_MES>().GetBasItem(action.Data)); + response = response.GetResponse(DI.Resolve<IU9C_MES>().GetBasItem(action.Data)); } catch (System.Exception ex) { diff --git a/Tiger.Business.MES/Common/WoContext.cs b/Tiger.Business.MES/Common/WoContext.cs index 9804f8d..fda4192 100644 --- a/Tiger.Business.MES/Common/WoContext.cs +++ b/Tiger.Business.MES/Common/WoContext.cs @@ -50,7 +50,7 @@ /// <returns></returns> public static bool ExistsBatch(string workorder, string lineCode, string batchNo = "", bool canDoWork = false) { - return WoBatchDic.WhereIF(canDoWork, q => q.Value.Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || q.Value.Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue()) + return WoBatchDic.WhereIF(canDoWork, q => !q.Value.Batch.IsNullOrEmpty() && (q.Value.Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Release.GetValue() || q.Value.Batch.STATUS == BIZ_MES_WO_BATCH.STATUSs.Working.GetValue())) .Any(q => q.Value.Batch.ORDER_NO == workorder && q.Value.Batch.ACT_LINE == lineCode && (batchNo.IsNullOrEmpty() || q.Value.Batch.BATCH_NO == batchNo)); } diff --git a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetCustSn.cs b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetCustSn.cs index b192ab2..0458c8f 100644 --- a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetCustSn.cs +++ b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetCustSn.cs @@ -1,5 +1,5 @@ 锘縰sing Rhea.Common; -using Sundial; +using FluentScheduler; using System; using System.Collections.Generic; using System.Linq; @@ -15,39 +15,53 @@ /// <summary> /// 浠嶶9C鑾峰彇瀹㈡埛鏉$爜淇℃伅 /// </summary> - public class U9C_ME_GetCustSn : TigerJobBase, ITigerJob + public class U9C_ME_GetCustSn : TigerJobBase, ITJob { public string Id { get; set; } = Guid.NewGuid().ToString("N"); - public string Tag { get; set; } = "U9C_ME_GetCustSn Interface Job"; - public string Name { get; set; } = "U9C_ME_GetCustSn Interface Job"; - - public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + public string Tag { get; set; } + public string Name { get; set; } + public U9C_ME_GetCustSn() { - Logger.Scheduler.Info(context.Trigger.ConvertToMonitor()); + Id = Guid.NewGuid().ToString("N"); + Tag = "U9C_ME_GetCustSn Interface Job"; + GetJob(typeof(U9C_ME_GetCustSn).Name); + Name = Job.JobName; + } + + public void Execute() + { + Logger.Scheduler.Info($"杩涘叆璁″垝璋冨害(鍚嶇О:{Name})...\r\n"); try { - var _lastRunTime = Biz.SysParam["GetCustBar_LastTime", "Interface_LastRun"].PARAM_VALUE; - var LastRunTime = string.IsNullOrEmpty(_lastRunTime) ? DateTime.Now.AddMinutes(-30) : Convert.ToDateTime(_lastRunTime); - if ((DateTime.Now - LastRunTime).TotalMinutes > 30) + Schedule = JobManager.GetSchedule(Name); + StartTime = DateTime.Now; + string msg = ""; + string status = "Successed"; + GetJob(typeof(U9C_ME_GetCustSn).Name); + TskJobInput tskJobInput = CheckIFCanGo(); + if (tskJobInput.result) { - GetCustBarcodeInput input = new GetCustBarcodeInput - { - startTime = LastRunTime.ToString("yyyy-MM-dd HH:mm:ss"), - endTime = LastRunTime.AddMinutes(30).ToString("yyyy-MM-dd HH:mm:ss") - }; - var result = await DI.Resolve<IU9C_MES>().GetCustBarCode(input); + var result = DI.Resolve<IU9C_MES>().GetCustBarCode(tskJobInput.input); if (!result.IsSuccessed) { - Logger.Scheduler.Error($"鑾峰彇瀹㈡埛鏉$爜淇℃伅寮傚父:{result.Message}"); + msg = $"鑾峰彇瀹㈡埛鏉$爜淇℃伅寮傚父:{result.Message}"; + Logger.Scheduler.Error(msg); + status = "Failed"; + } + else + { + msg = $"浠嶶9C鑾峰彇瀹㈡埛鏉$爜淇℃伅鎴愬姛:{result.Message}"; + Trig.LastRunTime = (tskJobInput.input.endTime.ToDateTime() - DateTime.Now).TotalMinutes > 0 ? Trig.LastRunTime : tskJobInput.input.endTime.ToDateTime(); } } - //SaveLog(context, "浠嶶9C鑾峰彇瀹㈡埛鏉$爜淇℃伅鎴愬姛"); + SaveFluentSchedulerLog(status, $"{msg}"); + Logger.Scheduler.Info($"璁″垝璋冨害(鍚嶇О:{Name})瀹屾垚锛岃繑鍥炰俊鎭�:{msg}\r\n"); } catch (System.Exception ex) { Logger.Scheduler.Fatal(ex, "鑾峰彇瀹㈡埛鏉$爜淇℃伅寮傚父"); + SaveFluentSchedulerLog("Failed", ex.Message); } - await Task.CompletedTask; } } } diff --git a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetCustomer.cs b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetCustomer.cs index e5776c3..5aeef52 100644 --- a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetCustomer.cs +++ b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetCustomer.cs @@ -1,5 +1,5 @@ 锘縰sing Rhea.Common; -using Sundial; +using FluentScheduler; using System; using System.Collections.Generic; using System.Linq; @@ -15,39 +15,53 @@ /// <summary> /// 浠嶶9C鑾峰彇瀹㈡埛淇℃伅 /// </summary> - public class U9C_MES_GetCustomer : TigerJobBase, ITigerJob + public class U9C_MES_GetCustomer : TigerJobBase, ITJob { public string Id { get; set; } = Guid.NewGuid().ToString("N"); - public string Tag { get; set; } = "U9C_MES_GetCustomer Interface Job"; - public string Name { get; set; } = "U9C_MES_GetCustomer Interface Job"; - - public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + public string Tag { get; set; } + public string Name { get; set; } + public U9C_MES_GetCustomer() { - Logger.Scheduler.Info(context.Trigger.ConvertToMonitor()); + Id = Guid.NewGuid().ToString("N"); + Tag = "U9C_MES_GetCustomer Interface Job"; + GetJob(typeof(U9C_MES_GetCustomer).Name); + Name = Job.JobName; + } + + public void Execute() + { + Logger.Scheduler.Info($"杩涘叆璁″垝璋冨害(鍚嶇О:{Name})...\r\n"); try { - var _lastRunTime = Biz.SysParam["GetCust_LastRun", "Interface_LastRun"].PARAM_VALUE; - var LastRunTime = string.IsNullOrEmpty(_lastRunTime) ? DateTime.Now.AddDays(-1) : Convert.ToDateTime(_lastRunTime); - if ((DateTime.Now - LastRunTime).TotalDays > 1) + Schedule = JobManager.GetSchedule(Name); + StartTime = DateTime.Now; + string msg = ""; + string status = "Successed"; + GetJob(typeof(U9C_MES_GetCustomer).Name); + TskJobInput tskJobInput = CheckIFCanGo(); + if (tskJobInput.result) { - GetCustomerInput input = new GetCustomerInput - { - startTime = LastRunTime.ToString("yyyy-MM-dd HH:mm:ss"), - endTime = LastRunTime.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss") - }; - var result = await DI.Resolve<IU9C_MES>().GetCustomer(input); + var result = DI.Resolve<IU9C_MES>().GetCustomer(tskJobInput.input); if (!result.IsSuccessed) { - Logger.Scheduler.Error($"鑾峰彇瀹㈡埛淇℃伅寮傚父:{result.Message}"); + msg = $"鑾峰彇瀹㈡埛淇℃伅寮傚父:{result.Message}"; + Logger.Scheduler.Error(msg); + status = "Failed"; + } + else + { + msg = $"浠嶶9C鑾峰彇瀹㈡埛淇℃伅鎴愬姛:{result.Message}"; + Trig.LastRunTime = (tskJobInput.input.endTime.ToDateTime() - DateTime.Now).TotalMinutes > 0 ? Trig.LastRunTime : tskJobInput.input.endTime.ToDateTime(); } } - //SaveLog(context, "浠嶶9C鑾峰彇瀹㈡埛淇℃伅鎴愬姛"); + SaveFluentSchedulerLog(status, $"{msg}"); + Logger.Scheduler.Info($"璁″垝璋冨害(鍚嶇О:{Name})瀹屾垚锛岃繑鍥炰俊鎭�:{msg}\r\n"); } catch (System.Exception ex) { Logger.Scheduler.Fatal(ex, "鑾峰彇瀹㈡埛淇℃伅寮傚父"); + SaveFluentSchedulerLog("Failed", ex.Message); } - await Task.CompletedTask; } } } diff --git a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetItem.cs b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetItem.cs index c67e11f..d6e6081 100644 --- a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetItem.cs +++ b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetItem.cs @@ -1,5 +1,5 @@ 锘縰sing Rhea.Common; -using Sundial; +using FluentScheduler; using System; using System.Collections.Generic; using System.Linq; @@ -15,39 +15,54 @@ /// <summary> /// 浠嶶9C鑾峰彇鐗╂枡淇℃伅 /// </summary> - public class U9C_MES_GetItem : TigerJobBase, ITigerJob + public class U9C_MES_GetItem : TigerJobBase, ITJob { public string Id { get; set; } = Guid.NewGuid().ToString("N"); public string Tag { get; set; } = "U9C_MES_GetItem Interface Job"; public string Name { get; set; } = "U9C_MES_GetItem Interface Job"; - public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + public U9C_MES_GetItem() { - Logger.Scheduler.Info(context.Trigger.ConvertToMonitor()); + Id = Guid.NewGuid().ToString("N"); + Tag = "U9C_MES_GetItem Interface Job"; + GetJob(typeof(U9C_MES_GetItem).Name); + Name = Job.JobName; + } + + public void Execute() + { + Logger.Scheduler.Info($"杩涘叆璁″垝璋冨害(鍚嶇О:{Name})...\r\n"); try { - var _lastRunTime = Biz.SysParam["GetItem_LastRun", "Interface_LastRun"].PARAM_VALUE; - var LastRunTime = string.IsNullOrEmpty(_lastRunTime) ? DateTime.Now.AddDays(-1) : Convert.ToDateTime(_lastRunTime); - if ((DateTime.Now - LastRunTime).TotalDays > 1) + Schedule = JobManager.GetSchedule(Name); + StartTime = DateTime.Now; + string msg = ""; + string status = "Successed"; + GetJob(typeof(U9C_MES_GetItem).Name); + TskJobInput tskJobInput = CheckIFCanGo(); + if (tskJobInput.result) { - GetBasItemInput input = new GetBasItemInput - { - startTime = LastRunTime.ToString("yyyy-MM-dd HH:mm:ss"), - endTime = LastRunTime.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss") - }; - var result = await DI.Resolve<IU9C_MES>().GetBasItem(input); + var result = DI.Resolve<IU9C_MES>().GetBasItem(tskJobInput.input); if (!result.IsSuccessed) { - Logger.Scheduler.Error($"鑾峰彇鐗╂枡淇℃伅寮傚父:{result.Message}"); + msg = $"鑾峰彇鐗╂枡淇℃伅寮傚父:{result.Message}"; + Logger.Scheduler.Error(msg); + status = "Failed"; + } + else + { + msg = $"浠嶶9C鑾峰彇鐗╂枡淇℃伅鎴愬姛:{result.Message}"; + Trig.LastRunTime = (tskJobInput.input.endTime.ToDateTime() - DateTime.Now).TotalMinutes > 0 ? Trig.LastRunTime : tskJobInput.input.endTime.ToDateTime(); } } - //SaveLog(context, "浠嶶9C鑾峰彇鐗╂枡淇℃伅鎴愬姛"); + SaveFluentSchedulerLog(status, $"{msg}"); + Logger.Scheduler.Info($"璁″垝璋冨害(鍚嶇О:{Name})瀹屾垚锛岃繑鍥炰俊鎭�:{msg}\r\n"); } catch (System.Exception ex) { Logger.Scheduler.Fatal(ex, "鑾峰彇鐗╂枡淇℃伅寮傚父"); + SaveFluentSchedulerLog("Failed", ex.Message); } - await Task.CompletedTask; } } } diff --git a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetSupplier.cs b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetSupplier.cs index eaaf92f..5619878 100644 --- a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetSupplier.cs +++ b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetSupplier.cs @@ -1,11 +1,12 @@ 锘縰sing Rhea.Common; -using Sundial; +using FluentScheduler; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; +using Newtonsoft.Json; using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Minsun; @@ -15,39 +16,54 @@ /// <summary> /// 浠嶶9C鑾峰彇渚涘簲鍟嗕俊鎭� /// </summary> - public class U9C_ME_GetSupplier : TigerJobBase, ITigerJob + public class U9C_ME_GetSupplier : TigerJobBase, ITJob { public string Id { get; set; } = Guid.NewGuid().ToString("N"); - public string Tag { get; set; } = "U9C_ME_GetSupplier Interface Job"; - public string Name { get; set; } = "U9C_ME_GetSupplier Interface Job"; + public string Tag { get; set; } + public string Name { get; set; } - public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + public U9C_ME_GetSupplier() { - Logger.Scheduler.Info(context.Trigger.ConvertToMonitor()); + Id = Guid.NewGuid().ToString("N"); + Tag = "U9C_ME_GetSupplier Interface Job"; + GetJob(typeof(U9C_ME_GetSupplier).Name); + Name = Job.JobName; + } + + public void Execute() + { + Logger.Scheduler.Info($"杩涘叆璁″垝璋冨害(鍚嶇О:{Name})...\r\n"); try { - var _lastRunTime = Biz.SysParam["Vender_LastTime", "Interface_LastRun"].PARAM_VALUE; - var LastRunTime = string.IsNullOrEmpty(_lastRunTime) ? DateTime.Now.AddDays(-1) : Convert.ToDateTime(_lastRunTime); - if ((DateTime.Now - LastRunTime).TotalDays > 1) + Schedule = JobManager.GetSchedule(Name); + StartTime = DateTime.Now; + string msg = ""; + string status = "Successed"; + GetJob(typeof(U9C_ME_GetSupplier).Name); + TskJobInput tskJobInput = CheckIFCanGo(); + if (tskJobInput.result) { - GetSupplierInput input = new GetSupplierInput - { - startTime = LastRunTime.ToString("yyyy-MM-dd HH:mm:ss"), - endTime = LastRunTime.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss") - }; - var result = await DI.Resolve<IU9C_MES>().GetSupplier(input); + var result = DI.Resolve<IU9C_MES>().GetSupplier(tskJobInput.input); if (!result.IsSuccessed) { - Logger.Scheduler.Error($"鑾峰彇渚涘簲鍟嗕俊鎭紓甯�:{result.Message}"); + msg = $"鑾峰彇渚涘簲鍟嗕俊鎭紓甯�:{result.Message}"; + Logger.Scheduler.Error(msg); + status = "Failed"; + } + else + { + msg = $"浠嶶9C鑾峰彇渚涘簲鍟嗕俊鎭垚鍔�:{result.Message}"; + Trig.LastRunTime = (tskJobInput.input.endTime.ToDateTime() - DateTime.Now).TotalMinutes > 0 ? Trig.LastRunTime : tskJobInput.input.endTime.ToDateTime(); } } - //SaveLog(context, "浠嶶9C鑾峰彇渚涘簲鍟嗕俊鎭垚鍔�"); + SaveFluentSchedulerLog(status, $"{msg}"); + Logger.Scheduler.Info($"璁″垝璋冨害(鍚嶇О:{Name})瀹屾垚锛岃繑鍥炰俊鎭�:{msg}\r\n"); } catch (System.Exception ex) { Logger.Scheduler.Fatal(ex, "鑾峰彇渚涘簲鍟嗕俊鎭紓甯�"); + SaveFluentSchedulerLog("Failed", ex.Message); } - await Task.CompletedTask; } } } diff --git a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs index cf411c3..0188002 100644 --- a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs +++ b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs @@ -1,14 +1,18 @@ 锘縰sing Rhea.Common; -using Sundial; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; +using Newtonsoft.Json; using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Minsun; +using FluentScheduler; +using Sundial; +using Microsoft.IdentityModel.Tokens; +using Tiger.Model.Entitys.MES.Position; namespace Tiger.Business.MES { @@ -17,11 +21,18 @@ /// </summary> public class U9C_MES_GetWo : TigerJobBase, ITigerJob { - public string Id { get; set; } = Guid.NewGuid().ToString("N"); - public string Tag { get; set; } = "U9C_MES_GetWo Interface Job"; - public string Name { get; set; } = "U9C_MES_GetWo Interface Job"; + public string Id { get; set; } + public string Tag { get; set; } + public string Name { get; set; } - public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + public U9C_MES_GetWo() + { + Id = Guid.NewGuid().ToString("N"); + Tag = "U9C_MES_GetWo Interface Job"; + Name = "U9C_MES_GetWo Interface Job"; + } + + public async Task ExecuteAsync(Sundial.JobExecutingContext context, CancellationToken stoppingToken) { Logger.Scheduler.Info(context.Trigger.ConvertToMonitor()); try @@ -50,4 +61,101 @@ await Task.CompletedTask; } } + + /// <summary> + /// 浠嶶9C鑾峰彇宸ュ崟淇℃伅 FluentScheduler鐗� + /// </summary> + public class fU9C_MES_GetWo : TigerJobBase, ITJob + { + public string Id { get; set; } + public string Tag { get; set; } + public string Name { get; set; } + public fU9C_MES_GetWo() + { + Id = Guid.NewGuid().ToString("N"); + Tag = "U9C_MES_GetWo Interface Job"; + GetJob(typeof(fU9C_MES_GetWo).Name); + Name = Job.JobName; + } + + public void Execute() + { + Logger.Scheduler.Info($"杩涘叆璁″垝璋冨害(鍚嶇О:{Name})...\r\n"); + try + { + Schedule = JobManager.GetSchedule(Name); + StartTime = DateTime.Now; + string msg = ""; + string status = "Successed"; + GetJob(typeof(fU9C_MES_GetWo).Name); + TskJobInput tskJobInput = CheckIFCanGo(); + if (tskJobInput.result) + { + var result = DI.Resolve<IU9C_MES>().GetU9CBasWo(tskJobInput.input); + if (!result.IsSuccessed) + { + msg = $"鑾峰彇宸ュ崟淇℃伅寮傚父:{result.Message}"; + Logger.Scheduler.Error(msg); + status = "Failed"; + } + else + { + msg = $"浠嶶9C鑾峰彇宸ュ崟淇℃伅鎴愬姛:{result.Message}"; + Trig.LastRunTime = (tskJobInput.input.endTime.ToDateTime() - DateTime.Now).TotalMinutes > 0 ? Trig.LastRunTime : tskJobInput.input.endTime.ToDateTime(); + } + } + SaveFluentSchedulerLog(status, $"{msg}"); + Logger.Scheduler.Info($"璁″垝璋冨害(鍚嶇О:{Name})瀹屾垚锛岃繑鍥炰俊鎭�:{msg}\r\n"); + } + catch (System.Exception ex) + { + Logger.Scheduler.Fatal(ex, "鑾峰彇宸ュ崟淇℃伅寮傚父"); + SaveFluentSchedulerLog("Failed", ex.Message); + } + } + }//endClass + + public class fTest : TigerJobBase, ITJob + { + public string Id { get; set; } + public string Tag { get; set; } + public string Name { get; set; } = typeof(fTest).Name; + public fTest() + { + Id = Guid.NewGuid().ToString("N"); + Tag = "U9C_MES_GetWo Interface Job"; + } + + public void Execute() + { + Logger.Scheduler.Info($"杩涘叆璁″垝璋冨害(鍚嶇О:{Name})...\r\n"); + try + { + string msg = ""; + string status = "Successed"; + var _lastRunTime = Biz.SysParam["GetWo_LastRun", "Interface_LastRun"].PARAM_VALUE; + var LastRunTime = string.IsNullOrEmpty(_lastRunTime) ? DateTime.Now.AddMinutes(-10) : Convert.ToDateTime(_lastRunTime); + StartTime = DateTime.Now; + //if ((DateTime.Now - LastRunTime).TotalMinutes > 10) + //{ + // GetWoInput input = new GetWoInput + // { + // startTime = LastRunTime.ToString("yyyy-MM-dd HH:mm:ss"), + // endTime = LastRunTime.AddMinutes(10).ToString("yyyy-MM-dd HH:mm:ss") + // }; + // var result = await DI.Resolve<IU9C_MES>().GetBasWo(input); + // if (!result.IsSuccessed) + // { + // Logger.Scheduler.Error($"鑾峰彇宸ュ崟淇℃伅寮傚父:{result.Message}"); + // } + //} + SaveFluentSchedulerLog(status, "娴嬭瘯浠诲姟鎴愬姛"); + Logger.Scheduler.Info($"璁″垝璋冨害(鍚嶇О:{Name})瀹屾垚\r\n"); + } + catch (System.Exception ex) + { + Logger.Scheduler.Fatal(ex, "娴嬭瘯浠诲姟寮傚父\r\n"); + } + } + } } diff --git a/Tiger.Business.MES/Task/TskJob.cs b/Tiger.Business.MES/Task/TskJob.cs new file mode 100644 index 0000000..a3b3afa --- /dev/null +++ b/Tiger.Business.MES/Task/TskJob.cs @@ -0,0 +1,108 @@ +锘縰sing Rhea.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Tiger.IBusiness; +using Tiger.Model; +using Tiger.Model.Minsun; +using FluentScheduler; +using Newtonsoft.Json; +using static Tiger.Model.TrigArgs; +using System.Reflection; + +namespace Tiger.Business.MES +{ + /// <summary> + /// 浠诲姟鐩稿叧 + /// </summary> + public partial class TskJob : ITskJob + { + /// <summary> + /// 淇濆瓨璁″垝浠诲姟 + /// </summary> + /// <param name="input"></param> + /// <returns></returns> + public async Task<ApiAction> SaveTskJob(TskParameter input) + { + var result = new ApiAction(); + try + { + if (input.type == EveryType.Milliseconds && input.ToRunEvery<100) + { + result.IsSuccessed = false; + result.LocaleMsg = new($"鏃堕棿鏄绉掓椂锛岃嚦灏戣澶т簬100姣"); + return result; + } + if (Biz.Db.Queryable<TSK_JOB>().Any(x => + (x.JobName != input.JobName && x.JobType == input.JobType) || + (x.JobName == input.JobName && x.JobType != input.JobType))) + { + result.IsSuccessed = false; + result.LocaleMsg = new($"鐩稿悓鐨勭被鍚嶄笉鑳芥湁涓嶅悓鐨勪换鍔″悕鎴栬�呯浉鍚岀殑浠诲姟鍚嶄笉鑳芥湁涓嶅悓鐨勭被鍚�"); + return result; + } + var _job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == input.JobName && x.JobType == input.JobType).First() ?? new() + { + JobName = input.JobName, + JobType = input.JobType, + AssemblyName = input.AssemblyName, + }; + _job.Remark = input.Remark; + + //璁″垝浠诲姟鍙傛暟 + var Args = new TrigArgs() + { + ToRunOnceAtDt = input.ToRunOnceAtDt, + NowAddMinutes = input.NowAddMinutes, + ToRunEvery = input.ToRunEvery, + ToRunOnceIn = input.ToRunOnceIn, + NonReentrant = input.NonReentrant, + Type = input.type, + runType = input.runType, + Minutes = input.Minutes, + Hours = input.Hours, + Days = input.Days, + Interval = input.Interval, + }; + TSK_TRIG tskTrig = Biz.Db.Queryable<TSK_TRIG>().Where(x => x.JobId == _job.ID).First() ?? new() + { + JobId = _job.ID, + Status = TSK_TRIG.Statuss.Ready.GetValue(), + StartTime = DateTime.Now, + NumberOfRuns = 1, + }; + tskTrig.LastRunTime = input.LastRunTime; + tskTrig.Args = JsonConvert.SerializeObject(Args); + + var db = Biz.Db; + var dbTran = db.UseTran(() => + { + var y = db.Storageable(_job) + .WhereColumns(t => new { t.JobName, t.JobType, t.GHOST_ROW }) + .ToStorage(); + y.AsInsertable.ExecuteCommand(); + y.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); + + var z = db.Storageable(tskTrig) + .WhereColumns(t => new { t.JobId, t.GHOST_ROW }) + .ToStorage(); + z.AsInsertable.ExecuteCommand(); + z.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); + }); + if (!dbTran.IsSuccess) + { + result.IsSuccessed = false; + result.Message = $"淇濆瓨璁″垝浠诲姟寮傚父"; + } + } + catch (Exception ex) + { + result.CatchExceptionWithLog(ex, "淇濆瓨璁″垝浠诲姟寮傚父"); + } + return await Task.FromResult(result); + } + } //endClass +} diff --git a/Tiger.Business.MES/iERP/U9C_MES.cs b/Tiger.Business.MES/iERP/U9C_MES.cs index c1e912d..ba786d4 100644 --- a/Tiger.Business.MES/iERP/U9C_MES.cs +++ b/Tiger.Business.MES/iERP/U9C_MES.cs @@ -16,6 +16,7 @@ using Tiger.Model.Entitys.MES.Position; using Apache.NMS.ActiveMQ.Commands; using System.Security.Cryptography; +using System.Diagnostics; namespace Tiger.Business.MES { @@ -26,7 +27,7 @@ /// </summary> /// <param name="input"></param> /// <returns></returns> - public async Task<ApiAction> GetBasItem(GetBasItemInput input) + public ApiAction GetBasItem(U9C_MES_Input input) { var action = new ApiAction(); Logger.Scheduler.Info($"鐗╂枡淇℃伅寮�濮嬪悓姝ャ�傘�傘�傛暟鎹鏌ヨ繘琛屼腑銆傘�傘��"); @@ -83,46 +84,41 @@ } } Logger.Scheduler.Info($"鐗╂枡淇℃伅瀛樺叆瀹炰綋涓紝鎬绘暟锛歔{items.Count}]"); - db = Biz.Db; - var LastRun = await db.Queryable<SYS_PARAM>().Where(q => q.PRMG_CODE == "Interface_LastRun" && q.PARAM_CODE == "GetItem_LastRun").SingleAsync(); - LastRun.PARAM_VALUE = (input.endTime.ToDateTime() - DateTime.Now).TotalMinutes > 0 ? LastRun.PARAM_VALUE : input.endTime; var dbTran = db.UseTran(() => { - db.Storageable(LastRun, "U9C_MES_GetItem").ExecuteCommand(); if (items.Any()) { - if (items.Count > 150) + if (items.Count > 100) { - db.Utilities.PageEach(items, 1000, pageList => + db.Utilities.PageEach(items, 100, pageList => { var y = db.Storageable(pageList, "U9C") .WhereColumns(t => new { t.ID, t.GHOST_ROW }) .ToStorage(); - y.BulkCopy(); - y.BulkUpdate(); + y.AsInsertable.ExecuteCommand(); + y.AsUpdateable.ExecuteCommand(); }); } - else - { - var s = db.Storageable(items, "U9C") - .WhereColumns(t => new { t.ID, t.GHOST_ROW }) - .ToStorage(); - s.AsInsertable.ExecuteCommand(); - s.AsUpdateable.ExecuteCommand(); + else { + var y = db.Storageable(items, "U9C") + .WhereColumns(t => new { t.ID, t.GHOST_ROW }) + .ToStorage(); + y.AsInsertable.ExecuteCommand(); + y.AsUpdateable.ExecuteCommand(); } } if (itemExts.Any()) { - if (itemExts.Count > 150) + if (itemExts.Count > 100) { - db.Utilities.PageEach(itemExts, 1000, pageList => - { - var y = db.Storageable(pageList, "U9C") - .WhereColumns(t => new { t.ITEM_ID, t.GHOST_ROW }) - .ToStorage(); - y.BulkCopy(); - y.BulkUpdate(); - }); + db.Utilities.PageEach(itemExts, 100, pageList => + { + var y = db.Storageable(pageList, "U9C") + .WhereColumns(t => new { t.ITEM_ID, t.GHOST_ROW }) + .ToStorage(); + y.AsInsertable.ExecuteCommand(); + y.AsUpdateable.ExecuteCommand(); + }); } else { @@ -309,14 +305,14 @@ /// <param name="input"></param> /// <returns></returns> /// <exception cref="NotImplementedException"></exception> - public async Task<ApiAction> GetCustomer(GetCustomerInput input) + public ApiAction GetCustomer(U9C_MES_Input input) { var action = new ApiAction(); Logger.Scheduler.Info($"瀹㈡埛淇℃伅寮�濮嬪悓姝ャ�傘�傘�傛暟鎹鏌ヨ繘琛屼腑銆傘�傘��"); Logger.Scheduler.Info($"{input.triggerDetail}"); DbClient db = Biz.DataSource["YadaU9C"].Client; var list = db.Queryable<dynamic>().AS("mes_Customer").Where("ModifiedOn > @startTime And ModifiedOn < @endTime", new { startTime = input.startTime, endTime = input.endTime }).ToList(); - var orgs = await Biz.Db.Queryable<SYS_ORGANIZATION>().ToListAsync(); + var orgs = Biz.Db.Queryable<SYS_ORGANIZATION>().ToList(); List<BAS_CUSTOMER> items = new(); if (list != null && list.Count > 0) { @@ -344,23 +340,19 @@ } } Logger.Scheduler.Info($"瀹㈡埛淇℃伅瀛樺叆瀹炰綋涓紝鎬绘暟锛歔{items.Count}]"); - db = Biz.Db; - var LastRun = db.Queryable<SYS_PARAM>().Where(q => q.PRMG_CODE == "Interface_LastRun" && q.PARAM_CODE == "GetCust_LastRun").Single(); - LastRun.PARAM_VALUE = (input.endTime.ToDateTime() - DateTime.Now).TotalMinutes > 0 ? LastRun.PARAM_VALUE : input.endTime; var dbTran = db.UseTran(() => { - db.Storageable(LastRun, "U9C_MES_GetCustomer").ExecuteCommand(); if (items.Any()) { - if (items.Count > 150) + if (items.Count > 100) { - db.Utilities.PageEach(items, 1000, pageList => + db.Utilities.PageEach(items, 100, pageList => { var y = db.Storageable(pageList, "U9C") .WhereColumns(t => new { t.CUST_CODE, t.GHOST_ROW }) .ToStorage(); - y.BulkCopy(); - y.BulkUpdate(); + y.AsInsertable.ExecuteCommand(); + y.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); }); } else @@ -388,14 +380,14 @@ /// </summary> /// <param name="input"></param> /// <returns></returns> - public async Task<ApiAction> GetSupplier(GetSupplierInput input) + public ApiAction GetSupplier(U9C_MES_Input input) { var action = new ApiAction(); Logger.Scheduler.Info($"渚涘簲鍟嗕俊鎭紑濮嬪悓姝ャ�傘�傘�傛暟鎹鏌ヨ繘琛屼腑銆傘�傘��"); Logger.Scheduler.Info($"{input.triggerDetail}"); DbClient db = Biz.DataSource["YadaU9C"].Client; var list = db.Queryable<dynamic>().AS("mes_Supplier").Where("ModifiedOn > @startTime And ModifiedOn < @endTime", new { startTime = input.startTime, endTime = input.endTime }).ToList(); - var orgs = await Biz.Db.Queryable<SYS_ORGANIZATION>().ToListAsync(); + var orgs = Biz.Db.Queryable<SYS_ORGANIZATION>().ToList(); List<BAS_SUPPLIER> items = new(); if (list != null && list.Count > 0) { @@ -420,23 +412,19 @@ } } Logger.Scheduler.Info($"渚涘簲鍟嗕俊鎭瓨鍏ュ疄浣撲腑锛屾�绘暟锛歔{items.Count}]"); - db = Biz.Db; - var LastRun = db.Queryable<SYS_PARAM>().Where(q => q.PRMG_CODE == "Interface_LastRun" && q.PARAM_CODE == "Vender_LastTime").Single(); - LastRun.PARAM_VALUE = (input.endTime.ToDateTime() - DateTime.Now).TotalMinutes > 0 ? LastRun.PARAM_VALUE : input.endTime; var dbTran = db.UseTran(() => { - db.Storageable(LastRun, "U9C_MES_GetCustomer").ExecuteCommand(); if (items.Any()) { - if (items.Count > 150) + if (items.Count > 100) { - db.Utilities.PageEach(items, 1000, pageList => + db.Utilities.PageEach(items, 100, pageList => { var y = db.Storageable(pageList, "U9C") .WhereColumns(t => new { t.SUPP_CODE, t.GHOST_ROW }) .ToStorage(); - y.BulkCopy(); - y.BulkUpdate(); + y.AsInsertable.ExecuteCommand(); + y.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); }); } else @@ -464,7 +452,7 @@ /// </summary> /// <param name="input"></param> /// <returns></returns> - public async Task<ApiAction> GetCustBarCode(GetCustBarcodeInput input) + public ApiAction GetCustBarCode(U9C_MES_Input input) { var action = new ApiAction(); Logger.Scheduler.Info($"瀹㈡埛鏉$爜淇℃伅寮�濮嬪悓姝ャ�傘�傘�傛暟鎹鏌ヨ繘琛屼腑銆傘�傘��"); @@ -483,7 +471,7 @@ { if (di["MoDoc"] != null) { - var _MES_WO = await Biz.Db.Queryable<BIZ_MES_WO>().Where(x => x.ORDER_NO == di["MoDoc"].ToString()).FirstAsync(); + var _MES_WO = Biz.Db.Queryable<BIZ_MES_WO>().Where(x => x.ORDER_NO == di["MoDoc"].ToString()).First(); MES_CUST_SN snItem = new() { CUST_CODE = _MES_WO?.CUST_CODE ?? "", @@ -501,23 +489,19 @@ } } Logger.Scheduler.Info($"瀹㈡埛鏉$爜淇℃伅瀛樺叆瀹炰綋涓紝鎬绘暟锛歔{items.Count}]"); - db = Biz.Db; - var LastRun = db.Queryable<SYS_PARAM>().Where(q => q.PRMG_CODE == "Interface_LastRun" && q.PARAM_CODE == "GetCustBar_LastTime").Single(); - LastRun.PARAM_VALUE = (input.endTime.ToDateTime() - DateTime.Now).TotalMinutes > 0 ? LastRun.PARAM_VALUE : input.endTime; var dbTran = db.UseTran(() => { - db.Storageable(LastRun, "U9C_MES_GetCustomer").ExecuteCommand(); if (items.Any()) { - if (items.Count > 150) + if (items.Count > 100) { - db.Utilities.PageEach(items, 1000, pageList => + db.Utilities.PageEach(items, 100, pageList => { var y = db.Storageable(pageList, "U9C") .WhereColumns(t => new { t.CUST_SN, t.GHOST_ROW }) .ToStorage(); - y.BulkCopy(); - y.BulkUpdate(); + y.AsInsertable.ExecuteCommand(); + y.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); }); } else @@ -539,5 +523,159 @@ Logger.Scheduler.Info($"瀹㈡埛鏉$爜淇℃伅瀛樺叆鏁版嵁搴擄紝鎬绘暟锛歔{items.Count}]"); return action; } + + public ApiAction GetU9CBasWo(U9C_MES_Input input) + { + var action = new ApiAction(); + Logger.Scheduler.Info($"宸ュ崟淇℃伅寮�濮嬪悓姝ャ�傘�傘�傛暟鎹鏌ヨ繘琛屼腑銆傘�傘��"); + Logger.Scheduler.Info($"{input.triggerDetail}"); + DbClient db = Biz.DataSource["YadaU9C"].Client; + var list = db.Queryable<dynamic>().AS("mes_Mo").Where("ModifiedOn > @startTime And ModifiedOn < @endTime", new { startTime = input.startTime, endTime = input.endTime }).ToList(); + var orgs = Biz.Db.Queryable<SYS_ORGANIZATION>().ToList(); + List<BIZ_MES_WO> items = new(); + if (list != null && list.Count > 0) + { + foreach (var item in list) + { + var d = item as System.Dynamic.ExpandoObject; + var di = d as IDictionary<string, object>; + di = di?.ToDictionary(x => x.Key, x => x.Value); + if (di != null) + { + var orgId = di["Org"] == null ? "" : di["Org"].ToString(); + var itemId = di["ItemMaster"] == null ? "" : di["ItemMaster"].ToString(); + var basItem = Biz.Db.Queryable<BAS_ITEM>().Where(x => x.ID == itemId).First(); + BIZ_MES_WO woItem = new() + { + ORDER_NO = di["DocNo"] == null ? "" : di["DocNo"].ToString(), + ORDER_TYPE = di["DocTypeCode"] == null ? 0 : di["DocTypeCode"].ToInt32(), + PLAN_QTY = di["ProductQty"] == null ? 0 : di["ProductQty"].ToInt32(), + CUST_CODE = di["CustomerCode"] == null ? "" : di["CustomerCode"].ToString(), + ITEM_CODE = basItem != null ? basItem.ITEM_CODE : "", + CREATE_TIME = di["CreatedOn"].ToDateTime(), + UPDATE_TIME = di["ModifiedOn"].ToDateTime(), + PLAN_START_TIME = di["CreatedOn"].ToDateTime(), + STATUS = 0, + AUTH_ORG = orgs.Where(x => x.ID == orgId).Select(q => q.ORG_CODE).FirstOrDefault(), + SALES_ORDER = di["SrcDoc_SrcDocNo"] == null ? "" : di["SrcDoc_SrcDocNo"].ToString(), + SALES_REMARK = di["SoLineMemo"] == null ? "" : di["SoLineMemo"].ToString(), + SERIAL_NO = di["MoSerial"] == null ? "" : di["MoSerial"].ToString(), + SN_PREFIX = di["InBarHead"] == null ? "" : di["InBarHead"].ToString(), + CUST_PREFIX = di["OutBarHead"] == null ? "" : di["OutBarHead"].ToString(), + SALES_CONTRACT = di["Contracts"] == null ? "" : di["Contracts"].ToString(), + }; + if (!Biz.Db.Queryable<BIZ_MES_WO>().Any(x => x.ORDER_NO == woItem.ORDER_NO && (x.STATUS > BIZ_MES_WO.STATUSs.Init.GetValue() || x.ROUTE_STATUS > BIZ_MES_WO.ROUTE_STATUSs.WaitSet.GetValue()))) + { + items.Add(woItem); + } + else + { + var _wo = Biz.Db.Queryable<BIZ_MES_WO>().Where(x => x.ORDER_NO == woItem.ORDER_NO).First(); + Logger.Scheduler.Info($"宸ュ崟[{woItem.ORDER_NO}]淇℃伅瀛樺湪骞朵笖鐘舵�佷笉鏄垵濮嬪寲锛屾垨鑰呭伐鑹哄凡缁忛厤缃�傜姸鎬乕{EnumHelper.GetDesc(EnumHelper.GetEnum<BIZ_MES_WO.STATUSs>(_wo.STATUS))}]锛屽伐鑹洪厤缃姸鎬乕{EnumHelper.GetDesc(EnumHelper.GetEnum<BIZ_MES_WO.ROUTE_STATUSs>(_wo.ROUTE_STATUS))}]"); + } + } + } + } + Logger.Scheduler.Info($"宸ュ崟淇℃伅瀛樺叆瀹炰綋涓紝鎬绘暟锛歔{items.Count}]"); + db = Biz.Db; + var dbTran = db.UseTran(() => + { + if (items.Any()) + { + if (items.Count > 100) + { + db.Utilities.PageEach(items, 100, pageList => + { + var y = db.Storageable(pageList, "U9C") + .WhereColumns(t => new { t.ORDER_NO, t.GHOST_ROW }) + .ToStorage(); + y.AsInsertable.ExecuteCommand(); + y.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); + }); + } + else + { + var s = db.Storageable(items, "U9C") + .WhereColumns(t => new { t.ORDER_NO, t.GHOST_ROW }) + .ToStorage(); + s.AsInsertable.ExecuteCommand(); + s.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); + } + } + + }); + if (!dbTran.IsSuccess) + { + action.CatchExceptionWithLog(dbTran.ErrorException, $"鏁版嵁澶勭悊澶辫触"); + Logger.Scheduler.Error(action.Message); + } + action.Message = $"宸ュ崟淇℃伅瀛樺叆鏁版嵁搴擄紝鎬绘暟锛歔{items.Count}]"; + Logger.Scheduler.Info($"{action.Message}"); + if (action.IsSuccessed && items.Count > 0) + { + //寮傛璺戠粦瀹氬伐鑹鸿矾绾� + Work.DoAsync(() => + { + List<BIZ_MES_WO> woList = new(); + foreach (var wo in items) + { + //鍙湁宸ュ崟鐘舵�佷负鍒濆鍖栧拰宸ヨ壓鐘舵�佷负寰呴厤缃墠鑷姩缁戝畾宸ヨ壓璺嚎 + if (wo.STATUS == BIZ_MES_WO.STATUSs.Init.GetValue() && wo.ROUTE_STATUS == BIZ_MES_WO.ROUTE_STATUSs.WaitSet.GetValue()) + { + try + { + var rot = Biz.Db.Queryable<MES_PROD_OPER>() + .GroupBy(x => new { x.PROD_CODE, x.ROT_ID }) + .Where(q => q.PROD_CODE == wo.ITEM_CODE) + .Select(it => new { + PROD_CODE = it.PROD_CODE, + ROT_ID = it.ROT_ID + }) + .First(); + if (rot != null) + { + SugarParameter[] pars = Biz.Db.Ado.GetParameters(new { ROT_ID = rot.ROT_ID, WO = wo.ORDER_NO, ERR_CODE = 0, ERR_MSG = "" }); + pars[2].Direction = System.Data.ParameterDirection.Output; + pars[3].Direction = System.Data.ParameterDirection.Output; + Biz.Db.Ado.UseStoredProcedure().ExecuteCommand("SP_MES_PROD2WO", pars); + if (pars[2].Value.ToInt32() == 0) + { + Logger.Scheduler.Info($"宸ュ崟[{wo.ORDER_NO}]缁戝畾宸ヨ壓璺嚎[{rot.ROT_ID}]鎴愬姛,{pars[3].Value.ToString()}"); + wo.ROUTE_STATUS = BIZ_MES_WO.ROUTE_STATUSs.Finish.GetValue(); + woList.Add(wo); + } + else + { + Logger.Scheduler.Error(pars[3].Value.ToString()); + } + } + } + catch (System.Exception ex) + { + Logger.Scheduler.Error(ex.Message); + } + } + } + var _db = Biz.Db; + var dbTran = _db.UseTran(() => + { + if (woList.Any()) + { + var s = _db.Storageable(woList, "U9C") + .WhereColumns(t => new { t.ORDER_NO, t.GHOST_ROW }) + .ToStorage(); + s.AsInsertable.ExecuteCommand(); + s.AsUpdateable.IgnoreColumns(x => x.ID).UpdateColumns(x => new { x.ROUTE_STATUS }).ExecuteCommand(); + } + + }); + if (!dbTran.IsSuccess) + { + Logger.Scheduler.Error(dbTran.ErrorException.Message); + } + }); + } + return action; + } } } diff --git a/Tiger.Business/Services/Base/ITigerJob.cs b/Tiger.Business/Services/Base/ITigerJob.cs deleted file mode 100644 index 442f4e7..0000000 --- a/Tiger.Business/Services/Base/ITigerJob.cs +++ /dev/null @@ -1,20 +0,0 @@ -锘縰sing Sundial; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace Tiger.Business -{ - /// <summary> - /// 浠诲姟鍩虹被 - /// </summary> - public interface ITigerJob : IJob - { - string Id { get; set; } - string Tag { get; set; } - string Name { get; set; } - } -} diff --git a/Tiger.Business/Services/Base/InterfaceService.cs b/Tiger.Business/Services/Base/InterfaceService.cs index 90edc20..0dfcd20 100644 --- a/Tiger.Business/Services/Base/InterfaceService.cs +++ b/Tiger.Business/Services/Base/InterfaceService.cs @@ -1,10 +1,10 @@ 锘縰sing Apache.NMS.ActiveMQ.Threads; +using FluentScheduler; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Rhea.Common; using SqlSugar; -using Sundial; using System; using System.Collections; using System.Collections.Generic; @@ -15,7 +15,6 @@ using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Minsun; -using static System.Collections.Specialized.BitVector32; namespace Tiger.Business { @@ -24,12 +23,12 @@ /// </summary> public class InterfaceService: IInterfaceService { - public ISchedulerFactory _schedulerFactory { get; set; } + public Sundial.ISchedulerFactory _schedulerFactory { get; set; } /// <summary> /// 璁剧疆璁″垝浠诲姟宸ュ巶绫� /// </summary> /// <param name="schedulerFactory"></param> - public void SetSchedulerFactory(ISchedulerFactory schedulerFactory) + public void SetSchedulerFactory(Sundial.ISchedulerFactory schedulerFactory) { _schedulerFactory = schedulerFactory; } @@ -40,10 +39,10 @@ /// <typeparam name="TJob"></typeparam> /// <param name="newEntity"></param> /// <param name="jobParam"></param> - public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, IJob + public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, Sundial.IJob { ApiAction apiAction = new(); - TriggerBuilder triggerBuilder = Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new + Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new { TriggerId = jobParam.JobName + "_trigger1", }); @@ -57,7 +56,7 @@ /// <typeparam name="TJob"></typeparam> /// <param name="jobname"></param> /// <param name="triggerBuilders"></param> - public ApiAction AddJob<TJob>(string jobname, params TriggerBuilder[] triggerBuilders) where TJob : class, IJob + public ApiAction AddJob<TJob>(string jobname, params Sundial.TriggerBuilder[] triggerBuilders) where TJob : class, Sundial.IJob { ApiAction apiAction = new(); triggerBuilders[0].LoadFrom(new @@ -77,9 +76,9 @@ public ApiAction UpdateJob(TSK_JOB job) { ApiAction apiAction = new ApiAction(); - IScheduler scheduler = GetJob(job.JobName); + Sundial.IScheduler scheduler = GetJob(job.JobName); var trigger = scheduler.GetTrigger($"{job.JobName}_trigger1"); - if (trigger.Status == TriggerStatus.Running) + if (trigger.Status == Sundial.TriggerStatus.Running) { apiAction.IsSuccessed = false; apiAction.Message = $"浣滀笟[{job.JobName}]姝e湪杩愯涓嶈兘缂栬緫"; @@ -114,7 +113,7 @@ public void StartJob(string jobname) { // 甯﹁繑鍥炲�� - IScheduler scheduler; + Sundial.IScheduler scheduler; var scheduleResult = _schedulerFactory.TryRunJob(jobname, out scheduler); } @@ -123,9 +122,9 @@ /// </summary> /// <param name="jobname"></param> /// <returns></returns> - public IScheduler GetJob(string jobname) + public Sundial.IScheduler GetJob(string jobname) { - IScheduler scheduler; + Sundial.IScheduler scheduler; var scheduleResult = _schedulerFactory.TryGetJob(jobname, out scheduler); return scheduler; } @@ -134,7 +133,7 @@ /// 鑾峰彇鎵�鏈変綔涓� /// </summary> /// <returns></returns> - public List<IScheduler> GetJobs() + public List<Sundial.IScheduler> GetJobs() { return _schedulerFactory.GetJobs().ToList(); } @@ -171,5 +170,20 @@ { ; } + + public void JobInitialize() + { + JobManager.Initialize(); + } + + ApiAction IInterfaceService.AddTskJob<TJob>(TJob newEntity, FluentJobParam jobParam) + { + throw new NotImplementedException(); + } + + public void RemovefJob(string jobname) + { + throw new NotImplementedException(); + } } } diff --git a/Tiger.Business/Services/Base/InterfaceServiceNew.cs b/Tiger.Business/Services/Base/InterfaceServiceNew.cs index ec9be57..5b362a3 100644 --- a/Tiger.Business/Services/Base/InterfaceServiceNew.cs +++ b/Tiger.Business/Services/Base/InterfaceServiceNew.cs @@ -1,29 +1,38 @@ -锘縰sing Newtonsoft.Json; +锘縰sing FluentScheduler; +using Newtonsoft.Json; using Rhea.Common; using Sundial; using System; using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Reflection; +using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; using Tiger.IBusiness; using Tiger.Model; +using Tiger.Model.Entitys.MES.Position; using Tiger.Model.Minsun; -using static System.Collections.Specialized.BitVector32; +using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser; +using static Tiger.Model.TrigArgs; namespace Tiger.Business { - public class InterfaceServiceNew: IInterfaceService + /// <summary> + /// + /// </summary> + public class InterfaceServiceNew : IInterfaceService { + #region Sundial璁″垝璋冨害 鏃х増鏈娇鐢� - public ISchedulerFactory _schedulerFactory { get; set; } + public Sundial.ISchedulerFactory _schedulerFactory { get; set; } /// <summary> /// 璁剧疆璁″垝浠诲姟宸ュ巶绫� /// </summary> /// <param name="schedulerFactory"></param> - public void SetSchedulerFactory(ISchedulerFactory schedulerFactory) + public void SetSchedulerFactory(Sundial.ISchedulerFactory schedulerFactory) { _schedulerFactory = schedulerFactory; } @@ -34,10 +43,10 @@ /// <typeparam name="TJob"></typeparam> /// <param name="newEntity"></param> /// <param name="jobParam"></param> - public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, IJob + public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, Sundial.IJob { ApiAction apiAction = new(); - TriggerBuilder triggerBuilder = Triggers.Period(jobParam.Period*60*1000).LoadFrom(new + Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new { TriggerId = jobParam.JobName + "_trigger1", }); @@ -60,7 +69,7 @@ /// <typeparam name="TJob"></typeparam> /// <param name="jobname"></param> /// <param name="triggerBuilders"></param> - public ApiAction AddJob<TJob>(string jobname, params TriggerBuilder[] triggerBuilders) where TJob : class, IJob + public ApiAction AddJob<TJob>(string jobname, params Sundial.TriggerBuilder[] triggerBuilders) where TJob : class, Sundial.IJob { ApiAction apiAction = new(); triggerBuilders[0].LoadFrom(new @@ -84,9 +93,9 @@ public ApiAction UpdateJob(TSK_JOB job) { ApiAction apiAction = new ApiAction(); - IScheduler scheduler = GetJob(job.JobName); + Sundial.IScheduler scheduler = GetJob(job.JobName); var trigger = scheduler.GetTrigger($"{job.JobName}_trigger1"); - if (trigger.Status == TriggerStatus.Running) + if (trigger.Status == Sundial.TriggerStatus.Running) { apiAction.IsSuccessed = false; apiAction.Message = $"浣滀笟[{job.JobName}]姝e湪杩愯涓嶈兘缂栬緫"; @@ -143,7 +152,7 @@ public void StartJob(string jobname) { // 甯﹁繑鍥炲�� - IScheduler scheduler; + Sundial.IScheduler scheduler; var scheduleResult = _schedulerFactory.TryRunJob(jobname, out scheduler); } @@ -152,9 +161,9 @@ /// </summary> /// <param name="jobname"></param> /// <returns></returns> - public IScheduler GetJob(string jobname) + public Sundial.IScheduler GetJob(string jobname) { - IScheduler scheduler; + Sundial.IScheduler scheduler; var scheduleResult = _schedulerFactory.TryGetJob(jobname, out scheduler); return scheduler; } @@ -163,7 +172,7 @@ /// 鑾峰彇鎵�鏈変綔涓� /// </summary> /// <returns></returns> - public List<IScheduler> GetJobs() + public List<Sundial.IScheduler> GetJobs() { return _schedulerFactory.GetJobs().ToList(); } @@ -200,20 +209,20 @@ { try { - var jobs = Biz.Db.Queryable<TSK_JOB>().IncludesAllFirstLayer().ToList(); - foreach (var job in jobs) - { - Type type = Type.GetType($"{job.AssemblyName}.{job.JobType},{job.AssemblyName}", throwOnError: true); - _schedulerFactory.AddJob(type, job.JobName, Triggers.Period(Convert.ToInt32(job.Triggers?[0].Args ?? "3") * 60 * 1000)); - if (job.Triggers[0]?.Status == 3) - { - Work.DoAsync(() => - { - Thread.Sleep(2000); - PauseJob(job.JobName); - }); - } - } + var jobs = Biz.Db.Queryable<TSK_JOB>().IncludesAllFirstLayer().ToList(); + foreach (var job in jobs) + { + Type type = Type.GetType($"{job.AssemblyName}.{job.JobType},{job.AssemblyName}", throwOnError: true); + _schedulerFactory.AddJob(type, job.JobName, Sundial.Triggers.Period(Convert.ToInt32(job.Triggers?[0].Args ?? "3") * 60 * 1000)); + if (job.Triggers[0]?.Status == 3) + { + Work.DoAsync(() => + { + Thread.Sleep(2000); + PauseJob(job.JobName); + }); + } + } } catch (System.Exception ex) { @@ -255,5 +264,298 @@ } return action; } + #endregion + + #region 鏂扮増鏈鍒掕皟搴� FluentScheduler + /// <summary> + /// 鍒濆鍖栬鍒掕皟搴� + /// </summary> + public void JobInitialize() + { + JobManager.Initialize(AddJobsFromDB()); + JobManager.JobException += info => Logger.Scheduler.Error("An error just happened with a scheduled job: " + info.Exception); + JobManager.JobStart += info => Logger.Scheduler.Info($"{info.Name}: started\r\n"); + JobManager.JobEnd += info => Logger.Scheduler.Info($"{info.Name}: ended ({info.Duration})\r\n"); + SaveRunningStatus(); //淇濆瓨鐘舵�� + } + + private void SaveRunningStatus() + { + List<TSK_TRIG> listTrig = new List<TSK_TRIG>(); + foreach (var schedule in JobManager.RunningSchedules) + { + var job = Biz.Db.Queryable<TSK_JOB>().Where(q => q.JobName == schedule.Name).First(); + if (job != null) + { + TSK_TRIG trig = new TSK_TRIG(); + trig = Biz.Db.Queryable<TSK_TRIG>().Where(q => q.JobId == job.ID).First(); + trig.Status = TSK_TRIG.Statuss.Running.GetValue(); + trig.StartTime = DateTime.Now; + listTrig.Add(trig); + } + } + var db = Biz.Db; + //淇濆瓨鍒版暟鎹簱 + var dbTran = db.UseTran(() => + { + if (listTrig.Count > 0) + { + db.Updateable(listTrig, "system").UpdateColumns(q => new { q.Status, q.UPDATE_USER, q.UPDATE_TIME }).ExecuteCommand(); + } + }); + if (!dbTran.IsSuccess) + { + Logger.Scheduler.Trace(dbTran.ErrorException, $"浣滀笟淇濆瓨鍒版暟鎹簱寮傚父"); + } + } + + /// <summary> + /// 娣诲姞宸ヤ綔浠诲姟 + /// </summary> + /// <typeparam name="TJob"></typeparam> + /// <param name="newEntity"></param> + /// <param name="jobParam"></param> + /// <returns></returns> + public ApiAction AddTskJob<TJob>(TJob newEntity, FluentJobParam jobParam) where TJob : class, ITJob + { + ApiAction apiAction = new(); + try + { + if (!JobManager.AllSchedules.Any(q => q.Name == jobParam.JobName)) + { + JobManager.AddJob<TJob>((s) => GenerateSchedule(jobParam.Args, s.WithName(jobParam.JobName))); + string guid = Guid.NewGuid().ToString("N"); + if (Biz.Db.Queryable<TSK_JOB>().Any(x => + (x.JobName != jobParam.JobName && x.JobType == jobParam.DataType) || + (x.JobName == jobParam.JobName && x.JobType != jobParam.DataType))) + { + apiAction.IsSuccessed = false; + apiAction.LocaleMsg = new($"鐩稿悓鐨勭被鍚嶄笉鑳芥湁涓嶅悓鐨勪换鍔″悕鎴栬�呯浉鍚岀殑浠诲姟鍚嶄笉鑳芥湁涓嶅悓鐨勭被鍚�"); + return apiAction; + } + TSK_JOB job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == jobParam.JobName && x.JobType == jobParam.DataType).First() ?? new() + { + ID = guid, + }; + job.Remark = jobParam.Remark; + job.JobType = jobParam.DataType; + job.AssemblyName = jobParam.AssemblyName; + job.JobName = jobParam.JobName; + var trigger = Biz.Db.Queryable<TSK_TRIG>().Where(x => x.JobId == job.ID).First() ?? new TSK_TRIG() + { + JobId = guid, + StartTime = DateTime.Now, + NumberOfRuns = 1, + }; + trigger.Args = JsonConvert.SerializeObject(jobParam.Args); + trigger.Status = TSK_TRIG.Statuss.Running.GetValue(); + var db = Biz.Db; + //淇濆瓨鍒版暟鎹簱 + var dbTran = db.UseTran(() => + { + var y = db.Storageable(job) + .WhereColumns(t => new { t.JobName,t.JobType, t.GHOST_ROW }) + .ToStorage(); + y.AsInsertable.ExecuteCommand(); + y.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); + + var z = db.Storageable(trigger) + .WhereColumns(t => new { t.JobId, t.GHOST_ROW }) + .ToStorage(); + z.AsInsertable.ExecuteCommand(); + z.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand(); + }); + if (!dbTran.IsSuccess) + { + apiAction.CatchExceptionWithLog(dbTran.ErrorException, $"娣诲姞宸ヤ綔浠诲姟鏃朵繚瀛樺埌鏁版嵁搴撳紓甯�"); + } + } + + } + catch (System.Exception ex) + { + apiAction.CatchExceptionWithLog(ex); + } + if (!apiAction.IsSuccessed) { JobManager.RemoveJob(jobParam.JobName); } + return apiAction; + } + + /// <summary> + /// 鍒犻櫎浣滀笟 + /// </summary> + /// <param name="jobname"></param> + public void RemovefJob(string jobname) + { + if (JobManager.AllSchedules.Any(q => q.Name == jobname)) + { + string guid = Guid.NewGuid().ToString("N"); + TSK_JOB job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == jobname).First(); + var trigger = Biz.Db.Queryable<TSK_TRIG>().Where(x => x.JobId == job.ID).First(); + trigger.Status = TSK_TRIG.Statuss.Stop.GetValue(); + var db = Biz.Db; + //淇濆瓨鍒版暟鎹簱 + var dbTran = db.UseTran(() => + { + db.Updateable(trigger, "system_job").UpdateColumns(q=>new { q.Status,q.UPDATE_TIME,q.UPDATE_USER}).ExecuteCommand(); + }); + if (!dbTran.IsSuccess) + { + Logger.Scheduler.Fatal(dbTran.ErrorException, $"娣诲姞宸ヤ綔浠诲姟鏃朵繚瀛樺埌鏁版嵁搴撳紓甯�"); + } + } + JobManager.RemoveJob(jobname); + } + + /// <summary> + /// 浠庢暟鎹簱鎵归噺娣诲姞浠诲姟 + /// </summary> + public Registry AddJobsFromDB() + { + // 澹版槑涓�涓猂egistry绫� + var registry = new Registry(); + try + { + var jobs = Biz.Db.Queryable<TSK_JOB>().IncludesAllFirstLayer().ToList(); + foreach (var job in jobs) + { + //if (job.JobName == "fU9C_MES_GetWo" || job.JobName == "fTest") + { + Type type = Type.GetType($"{job.AssemblyName}.{job.JobType},{job.AssemblyName}", throwOnError: true); + dynamic _type = Activator.CreateInstance(type); + TrigArgs args = JsonConvert.DeserializeObject<TrigArgs>(job.Triggers[0].Args); + Schedule schedule = Schedule(_type, job.JobName, registry); + //鐢熸垚璁″垝 + GenerateSchedule(args, schedule); + } + } + } + catch (System.Exception ex) + { + Logger.Console.Fatal(ex, "Add Job From DB Exception"); + } + return registry; + } + + /// <summary> + /// 鏍规嵁瀹炰綋鍚嶆敞鍐岃鍒� + /// </summary> + /// <typeparam name="TJob"></typeparam> + /// <param name="entity"></param> + /// <param name="JobName"></param> + /// <param name="registry"></param> + /// <returns></returns> + private Schedule Schedule<TJob>(TJob entity, string JobName, Registry registry) where TJob : class, ITJob + { + return registry.Schedule<TJob>().WithName(JobName); + } + + /// <summary> + /// 鐢熸垚璁″垝 + /// </summary> + /// <param name="args"></param> + /// <param name="schedule"></param> + private void GenerateSchedule(TrigArgs args, Schedule schedule) + { + SpecificTimeUnit specificTimeUnit = null; + TimeUnit timeUnit = null; + if (args.NonReentrant == "Y") { schedule = schedule.NonReentrant(); } //灏辨槸鏄惁璺熶箣鍓嶇殑杩樻病杩愯瀹岀殑璁″垝鍚屾椂杩愯銆� + switch (args.runType) + { + case RunType.ToRunNow: + specificTimeUnit = schedule.ToRunNow(); //椹笂杩愯 + break; + case RunType.ToRunOnceAt: + specificTimeUnit = schedule.ToRunOnceAt(args.ToRunOnceAtDt.AddMinutes(args.NowAddMinutes)); //杩愯涓�娆″湪鍝釜鏃堕棿, + break; + case RunType.ToRunOnceIn: + timeUnit = schedule.ToRunOnceIn(args.ToRunOnceIn); //鍦ㄥ灏戝悗杩愯涓�娆� + break; + case RunType.ToRunEvery: + timeUnit = schedule.ToRunEvery(args.ToRunEvery); //姣忛殧澶氬皯杩愯涓�鍥� + break; + } + if (specificTimeUnit != null) { timeUnit = specificTimeUnit.AndEvery(args.ToRunEvery); } //姣忛殧澶氬皯杩愯涓�鍥烇紝鍔犲湪ToRunNow銆乀oRunOnceAt鍚庨潰 + //鎸夋椂闂寸被鍨嬫潵杩愯 + switch (args.Type) + { + case TrigArgs.EveryType.Milliseconds: + timeUnit.Milliseconds(); + break; + case TrigArgs.EveryType.Seconds: + timeUnit.Seconds(); //琛ㄧず鎸夌锛屽灏戠瑕佺湅鍓嶉潰Every鐨勬暟锛屾瘮濡傦細ToRunEvery(5).Seconds() 杩欎釜灏辫〃绀� 闅�5绉掕繍琛屼竴娆� + break; + case TrigArgs.EveryType.Minutes: + timeUnit.Minutes(); + break; + case TrigArgs.EveryType.Hours: + if (args.Minutes > 0) + { + timeUnit.Hours().At(args.Minutes); //琛ㄧず鎸夋瘡灏忔椂鐨勫垎閽燂紝澶氬皯鍒嗚鐪嬪墠闈very鐨勬暟锛屾瘮濡傦細ToRunEvery(1).Hours().At(5) 杩欎釜灏辫〃绀� 闅�1灏忔椂鐨勭5鍒嗛挓杩愯涓�娆� + } + else + { + timeUnit.Hours(); + } + break; + case TrigArgs.EveryType.Days: + if (args.Hours > 0) + { + timeUnit.Days().At(args.Hours, args.Minutes); //琛ㄧず鎸夊ぉ锛屽灏戝ぉ瑕佺湅鍓嶉潰Every鐨勬暟锛屾瘮濡傦細ToRunEvery(2).Days().At(14, 15) 杩欎釜灏辫〃绀� 闅�2澶╃殑14:15杩愯涓�娆� + } + else + { + timeUnit.Days(); + } + break; + case TrigArgs.EveryType.Weeks: + if (args.Hours > 0) + { + timeUnit.Weeks().At(args.Hours, args.Minutes); //琛ㄧず鎸夊懆锛屽灏戝懆瑕佺湅鍓嶉潰Every鐨勬暟锛屾瘮濡傦細ToRunEvery(1).Weeks().At(14, 15) 杩欎釜灏辫〃绀� 闅�1鍛ㄧ殑14:15杩愯涓�娆� + } + else + { + timeUnit.Weeks(); + } + break; + case TrigArgs.EveryType.Weekdays: + if (args.Hours > 0) + { + timeUnit.Weekdays().At(args.Hours, args.Minutes); + } + else + { + timeUnit.Weekdays(); + } + break; + case TrigArgs.EveryType.Months: + if (args.Days > 0 && args.Hours > 0) + { + timeUnit.Months().On(args.Days).At(args.Hours, args.Minutes); + } + else + { + timeUnit.Months(); + } + break; + } + } + + /// <summary> + /// 鍋滄鏈嶅姟 + /// </summary> + public void Stop() + { + JobManager.Stop(); + } + + /// <summary> + /// 鍦ㄤ换鍔″畬鎴愬悗绛夊緟鎴栬�呭仠姝� + /// </summary> + public void StopAndBlock() + { + JobManager.StopAndBlock(); + } + + #endregion } } diff --git a/Tiger.Business/Services/Base/TigerJobBase.cs b/Tiger.Business/Services/Base/TigerJobBase.cs index 0cac359..af7a6f8 100644 --- a/Tiger.Business/Services/Base/TigerJobBase.cs +++ b/Tiger.Business/Services/Base/TigerJobBase.cs @@ -1,8 +1,11 @@ -锘縰sing Rhea.Common; +锘縰sing FluentScheduler; +using Newtonsoft.Json; +using Rhea.Common; using Sundial; using System; using Tiger.IBusiness; using Tiger.Model; +using Tiger.Model.Entitys.MES.Position; namespace Tiger.Business { @@ -11,25 +14,31 @@ /// </summary> public class TigerJobBase { - public string Id { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public string Tag { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - public string Name { get => throw new NotImplementedException(); set => throw new NotImplementedException(); } - + public static Schedule Schedule; + public static TSK_JOB Job = new TSK_JOB(); + public static TSK_TRIG Trig = new TSK_TRIG(); + public static TrigArgs Args = new TrigArgs(); + /// <summary> + /// 寮�濮嬫椂闂� + /// </summary> + public static DateTime StartTime { get; set; } /// <summary> /// 淇濆瓨鏃ュ織 /// </summary> - public static ApiAction SaveLog(JobExecutingContext context,string remark) { + public static ApiAction SaveLog(JobExecutingContext context, string remark) + { ApiAction action = new ApiAction(); Type type = Type.GetType(context.JobDetail.JobType, throwOnError: true); - var job = Biz.Db.Queryable<TSK_JOB>().Where(x=>x.JobName == context.JobId && x.JobType == type.Name).First(); - var logentity = new TSK_LOG { + var job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == context.JobId && x.JobType == type.Name).First(); + var logentity = new TSK_LOG + { JobId = job.ID, - TriggerType =context.JobDetail.JobType, + TriggerType = context.JobDetail.JobType, AssemblyName = context.JobDetail.AssemblyName, Args = context.Trigger.Args, Operation = context.Trigger.Status.ToString(), Status = "Successed", - StartTime = context.Trigger.StartTime, + StartTime = StartTime, EndTime = context.Trigger.EndTime, ElapsedTime = context.Trigger.ElapsedTime, Remark = remark @@ -48,5 +57,163 @@ return action; } + /// <summary> + /// 淇濆瓨鏃ュ織 + /// </summary> + /// <param name="JobName"></param> + /// <param name="remark"></param> + /// <returns></returns> + public static ApiAction SaveFluentSchedulerLog(string status, string remark) + { + ApiAction action = new ApiAction(); + if (Trig != null) + { + Trig.ElapsedTime = (long)Math.Ceiling((DateTime.Now - StartTime).TotalMilliseconds); + Trig.StartTime = StartTime; + Trig.EndTime = DateTime.Now; + } + else + { + action.IsSuccessed = false; + action.LocaleMsg = new($"宸ヤ綔浠诲姟涓嶅瓨鍦�"); + Logger.Scheduler.Error("宸ヤ綔浠诲姟涓嶅瓨鍦╘r\n"); + return action; + } + var logentity = new TSK_LOG + { + JobId = Job.ID, + AssemblyName = Job.AssemblyName, + Args = Trig.Args, + //Operation = job.Triggers?[0].Status.ToString(), + Status = status, //job.Triggers?[0].Status.ToString(), + StartTime = Trig.StartTime, + EndTime = Trig.EndTime, + ElapsedTime = Trig.ElapsedTime, + Remark = remark + }; + + var db = Business.Biz.Db; + //淇濆瓨鍒版暟鎹簱 + var dbTran = db.UseTran(() => + { + db.Updateable(Trig, "System_Job").UpdateColumns(q => new { q.StartTime, q.LastRunTime, q.ElapsedTime, q.UpdatedTime, q.UPDATE_USER }).ExecuteCommand(); + db.Insertable(logentity).ExecuteCommand(); + }); + if (!dbTran.IsSuccess) + { + action.GetResponse().CatchExceptionWithLog(dbTran.ErrorException, $"浣滀笟鏃ュ織淇濆瓨鍒版暟鎹簱寮傚父"); + } + Logger.Scheduler.Info($"璁″垝璋冨害(鍚嶇О:{Job.JobName})浣滀笟鏃ュ織淇濆瓨鍒版暟鎹簱瀹屾垚\r\n"); + return action; + } + + /// <summary> + /// 鑾峰彇浠诲姟 + /// </summary> + public static void GetJob(string jobType) + { + Job = Biz.Db.Queryable<TSK_JOB>().Where(q => q.JobType == jobType).IncludesAllFirstLayer().First(); + Args = JsonConvert.DeserializeObject<TrigArgs>(Job.Triggers[0].Args); + Trig = Job.Triggers[0]; + } + + /// <summary> + /// 鍒ゆ柇鏃堕棿锛岃繑鍥炴槸鍚﹀彲浠ョ户缁伐浣滀换鍔� + /// </summary> + /// <returns></returns> + public static TskJobInput CheckIFCanGo() + { + TskJobInput tskJobInput = new TskJobInput(); + var dateTime = DateTime.Now; + if (Args.Interval > 0) + { + tskJobInput.result = true; + tskJobInput.input = new() + { + startTime = dateTime.AddHours(-Args.Interval).ToString("yyyy-MM-dd HH:mm:ss"), + endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + }; + } + else + { + //鎸夋椂闂寸被鍨嬫潵杩愯 + switch (Args.Type) + { + case TrigArgs.EveryType.Milliseconds: + dateTime = Trig.LastRunTime ?? DateTime.Now.AddMilliseconds(-Args.ToRunEvery); + tskJobInput.result = (DateTime.Now - dateTime).TotalMilliseconds > Args.ToRunEvery; + tskJobInput.input = new() + { + startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"), + endTime = dateTime.AddMilliseconds(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"), + }; + break; + case TrigArgs.EveryType.Seconds: + dateTime = Trig.LastRunTime ?? DateTime.Now.AddSeconds(-Args.ToRunEvery); + tskJobInput.result = (DateTime.Now - dateTime).TotalSeconds > Args.ToRunEvery; + tskJobInput.input = new() + { + startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"), + endTime = dateTime.AddSeconds(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"), + }; + break; + case TrigArgs.EveryType.Minutes: + dateTime = Trig.LastRunTime ?? DateTime.Now.AddMinutes(-Args.ToRunEvery); + tskJobInput.result = (DateTime.Now - dateTime).TotalMinutes > Args.ToRunEvery; + tskJobInput.input = new() + { + startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"), + endTime = dateTime.AddMinutes(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"), + }; + break; + case TrigArgs.EveryType.Hours: + dateTime = Trig.LastRunTime ?? DateTime.Now.AddHours(-Args.ToRunEvery); + tskJobInput.result = (DateTime.Now - dateTime).TotalHours > Args.ToRunEvery; + tskJobInput.input = new() + { + startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"), + endTime = dateTime.AddHours(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"), + }; + break; + case TrigArgs.EveryType.Days: + dateTime = Trig.LastRunTime ?? DateTime.Now.AddDays(-Args.ToRunEvery); + tskJobInput.result = (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery; + tskJobInput.input = new() + { + startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"), + endTime = dateTime.AddDays(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"), + }; + break; + case TrigArgs.EveryType.Weeks: + dateTime = Trig.LastRunTime ?? DateTime.Now.AddDays(-7); + tskJobInput.result = (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery * 7; + tskJobInput.input = new() + { + startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"), + endTime = dateTime.AddDays(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"), + }; + break; + case TrigArgs.EveryType.Weekdays: + dateTime = Trig.LastRunTime ?? DateTime.Now.AddDays(-Args.ToRunEvery); + tskJobInput.result = (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery; + tskJobInput.input = new() + { + startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"), + endTime = dateTime.AddDays(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"), + }; + break; + case TrigArgs.EveryType.Months: + dateTime = Trig.LastRunTime ?? DateTime.Now.AddMonths(-Args.ToRunEvery); + tskJobInput.result = (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery * DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month); + tskJobInput.input = new() + { + startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"), + endTime = dateTime.AddMonths(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"), + }; + break; + } + } + return tskJobInput; + } } } diff --git a/Tiger.Business/Services/ServicesBus.cs b/Tiger.Business/Services/ServicesBus.cs index 96d6428..db5d5b0 100644 --- a/Tiger.Business/Services/ServicesBus.cs +++ b/Tiger.Business/Services/ServicesBus.cs @@ -21,29 +21,13 @@ if (ApiConfig.RunInterface) { BizContext.InterfaceService = DI.Resolve<IInterfaceService>(); - BizContext.InterfaceService.SetSchedulerFactory(schedulerFactory); - //鍚姩鏃朵粠鏈嶅姟鍣ㄥ姞杞芥墍鏈変綔涓� - BizContext.InterfaceService.AddJobFromDB(); + //BizContext.InterfaceService.SetSchedulerFactory(schedulerFactory); + ////鍚姩鏃朵粠鏈嶅姟鍣ㄥ姞杞芥墍鏈変綔涓� + //BizContext.InterfaceService.AddJobFromDB(); + //鏂扮増鏈鍒掕皟璇曞垵濮嬪寲 + BizContext.InterfaceService.JobInitialize(); - //BizContext.InterfaceService.AddJob(); - - //BizContext.InterfaceService.AddJob<Jobs.QqtSrmToXCSJJob>("XCSJ_QqtRM_Supplier_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("XCSJ_QqtRM_Supplier_Interface"); - //BizContext.InterfaceService.AddJob<Jobs.QqtSrmToDGXCJob>("DGXC_QqtRM_Supplier_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("DGXC_QqtRM_Supplier_Interface"); - //BizContext.InterfaceService.AddJob<Jobs.QqtSrmToAHXCJob>("AHXC_QqtRM_Supplier_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("AHXC_QqtRM_Supplier_Interface"); - - - //BizContext.InterfaceService.AddJob<Jobs.ReceiptHToErpXCSJJob>("XCSJ_ReceiptHToErp_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("XCSJ_ReceiptHToErp_Interface"); - //BizContext.InterfaceService.AddJob<Jobs.ReceiptHToErpDGXCJob>("DGXC_ReceiptHToErp_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("DGXC_ReceiptHToErp_Interface"); - //BizContext.InterfaceService.AddJob<Jobs.ReceiptHToErpAHXCJob>("AHXC_ReceiptHToErp_Interface", Triggers.Period(5 * 60 * 1000)); - //BizContext.InterfaceService.StartJob("AHXC_ReceiptHToErp_Interface"); - - //BizContext.InterfaceService.StartJob(); ConsoleExt.WriteLine("Start Interface Service..........", ConsoleColor.Yellow); } } diff --git a/Tiger.Controllers.System/Controllers/TSK/TskController.Base.cs b/Tiger.Controllers.System/Controllers/TSK/TskController.Base.cs index 58bea14..358e6d6 100644 --- a/Tiger.Controllers.System/Controllers/TSK/TskController.Base.cs +++ b/Tiger.Controllers.System/Controllers/TSK/TskController.Base.cs @@ -147,5 +147,72 @@ } return Ok(response); } + + /// <summary> + /// 淇濆瓨浣滀笟 + /// </summary> + /// <param name="action"></param> + /// <returns></returns> + [HttpPost] + [Route("api/[controller]/[action]")] + public async Task<IActionResult> SaveTskJob(ApiAction<TskParameter> action) + { + ApiAction response = new(); + try + { + response = response.GetResponse(DI.Resolve<ITskJob>().SaveTskJob(action.Data)); + } + catch (System.Exception ex) + { + response = response.GetResponse().CatchExceptionWithLog(ex); + } + return Ok(response); + } + + #region 鏂扮増璁″垝浠诲姟 + + + /// <summary> + /// 鏍规嵁Job瀹炰綋鍚嶇О鍜孞ob鍚嶇О娣诲姞浠诲姟 + /// </summary> + /// <param name="action"></param> + /// <returns></returns> + [HttpPost] + [Route("api/[controller]/[action]")] + public async Task<IActionResult> AddTskJob(ApiAction<FluentJobParam> action) + { + ApiAction response = new(); + try + { + response = response.GetResponse(DI.Resolve<IBizContext>().GetInterfaceService()?.AddTskJob(action.NewDataEntity(), action.Data) ?? new ApiAction($"浠诲姟鏈惎鐢�", false)); + } + catch (System.Exception ex) + { + response = response.GetResponse().CatchExceptionWithLog(ex); + } + return Ok(response); + } + + /// <summary> + /// 鍒犻櫎浣滀笟 + /// </summary> + /// <param name="action"></param> + /// <returns></returns> + [HttpPost] + [Route("api/[controller]/[action]")] + public async Task<IActionResult> RemoveTskJob(ApiAction action) + { + ApiAction response = new(); + try + { + DI.Resolve<IBizContext>().GetInterfaceService()?.RemovefJob(action.Data?.ToString()); + } + catch (System.Exception ex) + { + response = response.GetResponse().CatchExceptionWithLog(ex); + } + return Ok(response); + } + #endregion } } diff --git a/Tiger.Dependencies/Tiger.Dependencies.csproj b/Tiger.Dependencies/Tiger.Dependencies.csproj index ce5e8ff..51c837f 100644 --- a/Tiger.Dependencies/Tiger.Dependencies.csproj +++ b/Tiger.Dependencies/Tiger.Dependencies.csproj @@ -13,6 +13,7 @@ <PackageReference Include="Autofac" Version="8.1.0" /> <PackageReference Include="Autofac.Configuration" Version="7.0.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="10.0.0" /> + <PackageReference Include="FluentScheduler" Version="5.5.1" /> <PackageReference Include="MailKit" Version="4.7.1.1" /> <PackageReference Include="NLog" Version="5.3.4" /> <PackageReference Include="NLog.Database" Version="5.3.4" /> diff --git a/Tiger.IBusiness.MES/TSK/ITskJob.cs b/Tiger.IBusiness.MES/TSK/ITskJob.cs new file mode 100644 index 0000000..b589d30 --- /dev/null +++ b/Tiger.IBusiness.MES/TSK/ITskJob.cs @@ -0,0 +1,16 @@ +锘縰sing Rhea.Common; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tiger.Model; + +namespace Tiger.IBusiness +{ + public interface ITskJob + { + public Task<ApiAction> SaveTskJob(TskParameter input); + } +} diff --git a/Tiger.IBusiness.MES/iERP/IU9C_MES.cs b/Tiger.IBusiness.MES/iERP/IU9C_MES.cs index 61b22fb..7591b50 100644 --- a/Tiger.IBusiness.MES/iERP/IU9C_MES.cs +++ b/Tiger.IBusiness.MES/iERP/IU9C_MES.cs @@ -11,10 +11,11 @@ { public interface IU9C_MES { - public Task<ApiAction> GetBasItem(GetBasItemInput input); - public Task<ApiAction> GetCustomer(GetCustomerInput input); - public Task<ApiAction> GetSupplier(GetSupplierInput input); + public ApiAction GetBasItem(U9C_MES_Input input); + public ApiAction GetCustomer(U9C_MES_Input input); + public ApiAction GetSupplier(U9C_MES_Input input); public Task<ApiAction> GetBasWo(GetWoInput input); - public Task<ApiAction> GetCustBarCode(GetCustBarcodeInput input); + public ApiAction GetCustBarCode(U9C_MES_Input input); + public ApiAction GetU9CBasWo(U9C_MES_Input input); } } diff --git a/Tiger.IBusiness/Service/IInterfaceService.cs b/Tiger.IBusiness/Service/IInterfaceService.cs index 4723d4b..52e71df 100644 --- a/Tiger.IBusiness/Service/IInterfaceService.cs +++ b/Tiger.IBusiness/Service/IInterfaceService.cs @@ -1,4 +1,5 @@ -锘縰sing Rhea.Common; +锘縰sing FluentScheduler; +using Rhea.Common; using Sundial; using System; using System.Collections.Generic; @@ -11,16 +12,19 @@ { public interface IInterfaceService:IDependency { - public void SetSchedulerFactory(ISchedulerFactory schedulerFactory); - public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, IJob; - public ApiAction AddJob<TJob>(string jobname, params TriggerBuilder[] triggerBuilders) where TJob : class, IJob; + public void SetSchedulerFactory(Sundial.ISchedulerFactory schedulerFactory); + public ApiAction AddJob<TJob>(TJob newEntity, TskJobParam jobParam) where TJob : class, Sundial.IJob; + public ApiAction AddTskJob<TJob>(TJob newEntity, FluentJobParam jobParam) where TJob : class, ITJob; + public ApiAction AddJob<TJob>(string jobname, params Sundial.TriggerBuilder[] triggerBuilders) where TJob : class, Sundial.IJob; public ApiAction UpdateJob(TSK_JOB job); public void StartAllJob(); public void StartJob(string jobname); - public IScheduler GetJob(string jobname); - public List<IScheduler> GetJobs(); + public Sundial.IScheduler GetJob(string jobname); + public List<Sundial.IScheduler> GetJobs(); public void PauseJob(string jobname); public void RemoveJob(string jobname); + public void RemovefJob(string jobname); public void AddJobFromDB(); + public void JobInitialize(); } } diff --git a/Tiger.IBusiness/Service/ITigerJob.cs b/Tiger.IBusiness/Service/ITigerJob.cs new file mode 100644 index 0000000..5284c34 --- /dev/null +++ b/Tiger.IBusiness/Service/ITigerJob.cs @@ -0,0 +1,30 @@ +锘縰sing FluentScheduler; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Tiger.IBusiness +{ + /// <summary> + /// Sundial浠诲姟鍩虹被 + /// </summary> + public interface ITigerJob : Sundial.IJob + { + public string Id { get; set; } + public string Tag { get; set; } + public string Name { get; set; } + } + + /// <summary> + /// FluentScheduler浠诲姟鍩虹被 + /// </summary> + public interface ITJob : IJob + { + public string Id { get; set; } + public string Tag { get; set; } + public string Name { get; set; } + } +} diff --git a/Tiger.Model.Net/Entitys/MES/ParameterEntity/TskParameter.cs b/Tiger.Model.Net/Entitys/MES/ParameterEntity/TskParameter.cs new file mode 100644 index 0000000..5400955 --- /dev/null +++ b/Tiger.Model.Net/Entitys/MES/ParameterEntity/TskParameter.cs @@ -0,0 +1,35 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tiger.Model; + +namespace Tiger.Model +{ + public class TskParameter + { + public string JobName { get; set; } + public string JobType { get; set; } + public string AssemblyName { get; set; } + public string Remark { get; set; } + public string NonReentrant { get; set; } + public DateTime ToRunOnceAtDt { get; set; } + public DateTime LastRunTime { get; set; } + public TrigArgs.RunType runType { get; set; } + public TrigArgs.EveryType type { get; set; } + public int NowAddMinutes { get; set; } //涓婇潰鏃堕棿鍔犲灏戝垎閽燂紝琛ㄧず寤惰繜澶氬皯鍒嗛挓杩愯 + public int ToRunEvery { get; set; } //姣忛殧澶氬皯杩愯涓�鍥� + public int ToRunOnceIn { get; set; } //鍦ㄥ灏戝悗杩愯涓�娆� + public int Minutes { get; set; } + public int Hours { get; set; } + public int Days { get; set; } + public double Interval { get; set; } + } + + public class TskJobInput + { + public bool result { get; set; } + public U9C_MES_Input input { get; set; } + } +} diff --git a/Tiger.Model.Net/Entitys/MES/ParameterEntity/U9C_MES_Input.cs b/Tiger.Model.Net/Entitys/MES/ParameterEntity/U9C_MES_Input.cs index 9472194..7f7ebf4 100644 --- a/Tiger.Model.Net/Entitys/MES/ParameterEntity/U9C_MES_Input.cs +++ b/Tiger.Model.Net/Entitys/MES/ParameterEntity/U9C_MES_Input.cs @@ -11,6 +11,7 @@ public string startTime { get; set; } public string endTime { get; set; } public string triggerDetail { get; set; } + public DateTime LastRunTime { get; set; } } public class GetBasItemInput : U9C_MES_Input diff --git a/Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs b/Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs index b74d86c..d18d68d 100644 --- a/Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs +++ b/Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs @@ -95,8 +95,8 @@ [SugarColumn(IsIgnore = true)] public string Status => Triggers?.FirstOrDefault()?.StatusStr + "," + Triggers?.FirstOrDefault()?.StatusStr.GetEnum<TSK_TRIG.Statuss>().GetDesc() ?? TSK_TRIG.Statuss.Ready.GetName() + "," + TSK_TRIG.Statuss.Ready.GetDesc(); - [SugarColumn(IsIgnore = true)] - public int Period => Convert.ToInt32(Triggers?.FirstOrDefault()?.Args ?? $"2"); + //[SugarColumn(IsIgnore = true)] + //public int Period => Convert.ToInt32(Triggers?.FirstOrDefault()?.Args ?? $"2"); [SugarColumn(IsIgnore = true)] public int uPeriod { get; set; } @@ -157,4 +157,15 @@ /// </summary> public string Remark { get; set; } } + + public class FluentJobParam: TskJobParam + { + public string AssemblyName { get; set; } + public string DataType { get; set; } + + /// <summary> + /// 鍙傛暟 + /// </summary> + public TrigArgs Args { get; set; } + } } \ No newline at end of file diff --git a/Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs b/Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs index 8450c34..a1a74df 100644 --- a/Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs +++ b/Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs @@ -170,6 +170,8 @@ Unknown, [Description("鏈煡浣滀笟澶勭悊绋嬪簭锛屼綔涓氬鐞嗙▼搴忕被鍨嬭繍琛屾椂绫诲瀷涓簄ull")] Unhandled, + [Description("鍋滄")] + Stop, } #endregion @@ -178,4 +180,55 @@ #endregion }//endClass + + + public class TrigArgs + { + public DateTime ToRunOnceAtDt { get; set; } //涓婇潰瑕佽繍琛岀殑鏃堕棿 + public int NowAddMinutes { get; set; } //涓婇潰鏃堕棿鍔犲灏戝垎閽燂紝琛ㄧず寤惰繜澶氬皯鍒嗛挓杩愯 + public int ToRunEvery { get; set; } //姣忛殧澶氬皯杩愯涓�鍥� + public int ToRunOnceIn { get; set; } //鍦ㄥ灏戝悗杩愯涓�娆� + public string NonReentrant { get; set; } //Y涓嶉噸澶嶏紝N閲嶅銆傚氨鏄槸鍚﹁窡涔嬪墠鐨勮繕娌¤繍琛屽畬鐨勮鍒掑悓鏃惰繍琛屻�� + public EveryType Type { get; set; } //鏃堕棿绫诲瀷 + public RunType runType { get; set; } //杩愯绫诲瀷 + public Int64 Milliseconds { get; set; } + public int Seconds { get; set; } + public int Minutes { get; set; } + public int Hours { get; set; } + public int Days { get; set; } + public int Weekday { get; set; } + public double Interval { get; set; } + + public enum EveryType + { + [Description("姣")] + Milliseconds, + [Description("绉�")] + Seconds, + [Description("鍒嗛挓")] + Minutes, + [Description("灏忔椂")] + Hours, + [Description("澶�")] + Days, + [Description("鍛�")] + Weeks, + [Description("鏄熸湡鍑�")] + Weekdays, + [Description("鏈�")] + Months, + } + + public enum RunType + { + [Description("椹笂杩愯")] + ToRunNow, + [Description("鍦�(T)杩愯")] + ToRunOnceAt, + [Description("闅�(T)杩愯")] + ToRunEvery, + [Description("(T)鍚庤繍琛�")] + ToRunOnceIn, + } + } } \ No newline at end of file diff --git a/Tiger.Model.Net/Tiger.Model.Net.csproj b/Tiger.Model.Net/Tiger.Model.Net.csproj index 9fb5ae4..c8a8462 100644 --- a/Tiger.Model.Net/Tiger.Model.Net.csproj +++ b/Tiger.Model.Net/Tiger.Model.Net.csproj @@ -170,6 +170,7 @@ <Compile Include="Entitys\MES\ParameterEntity\SmtLoadingInput.cs" /> <Compile Include="Entitys\MES\ParameterEntity\PositionParameter.cs" /> <Compile Include="Entitys\MES\ParameterEntity\RouteInput.cs" /> + <Compile Include="Entitys\MES\ParameterEntity\TskParameter.cs" /> <Compile Include="Entitys\MES\ParameterEntity\U9C_MES_Input.cs" /> <Compile Include="Entitys\MES\R_Wip_Tracking_T.cs" /> <Compile Include="Entitys\MES\SMT_FEEDER.cs" /> -- Gitblit v1.9.3