From dcd80459e1ad3b7fc9ba6bcd581feb430f0778d3 Mon Sep 17 00:00:00 2001 From: Ben Lin <maobin001@msn.com> Date: 星期六, 26 十月 2024 00:35:01 +0800 Subject: [PATCH] 计划任务更新 --- Tiger.Business.MES/Task/TskJob.cs | 83 +++++++ Tiger.Business.MES/iERP/U9C_MES.cs | 157 ++++++++++++++ Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs | 100 +++++++- Tiger.Business/Services/Base/TigerJobBase.cs | 61 +++++ Tiger.IBusiness.MES/TSK/ITskJob.cs | 16 + Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs | 32 ++ Tiger.Business/Services/Base/InterfaceServiceNew.cs | 149 ++++++++++-- Tiger.Model.Net/Tiger.Model.Net.csproj | 1 Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs | 5 Tiger.Business/Services/Base/ITigerJob.cs | 22 + Tiger.IBusiness.MES/iERP/IU9C_MES.cs | 1 Tiger.Model.Net/Entitys/MES/ParameterEntity/TskParameter.cs | 27 ++ 12 files changed, 580 insertions(+), 74 deletions(-) diff --git a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs index fc9464d..9478f22 100644 --- a/Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs +++ b/Tiger.Business.MES/Task/Jobs.U9C_ME_GetWo.cs @@ -1,5 +1,4 @@ 锘縰sing Rhea.Common; -using Sundial; using System; using System.Collections.Generic; using System.Linq; @@ -9,6 +8,8 @@ using Tiger.IBusiness; using Tiger.Model; using Tiger.Model.Minsun; +using FluentScheduler; +using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser; namespace Tiger.Business.MES { @@ -17,13 +18,18 @@ /// </summary> public class U9C_MES_GetWo : TigerJobBase, ITigerJob { - public U9C_MES_GetWo() { + public string Id { get; set; } + public string Tag { get; set; } + public string Name { get; set; } + + 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(JobExecutingContext context, CancellationToken stoppingToken) + public async Task ExecuteAsync(Sundial.JobExecutingContext context, CancellationToken stoppingToken) { Logger.Scheduler.Info(context.Trigger.ConvertToMonitor()); try @@ -56,13 +62,15 @@ /// <summary> /// 浠嶶9C鑾峰彇宸ュ崟淇℃伅 FluentScheduler鐗� /// </summary> - public class fU9C_MES_GetWo : TigerJobBase, FluentScheduler.IJob + public class fU9C_MES_GetWo : TigerJobBase, ITJob { + public string Id { get; set; } + public string Tag { get; set; } + public string Name { get; set; } = typeof(fU9C_MES_GetWo).Name; public fU9C_MES_GetWo() { Id = Guid.NewGuid().ToString("N"); Tag = "U9C_MES_GetWo Interface Job"; - Name = "浠嶶9C鍚屾宸ュ崟淇℃伅"; } public void Execute() @@ -70,27 +78,79 @@ 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); - //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}"); - // } - //} - //SaveLog(context, "浠嶶9C鑾峰彇宸ュ崟淇℃伅鎴愬姛"); - Logger.Scheduler.Info($"璁″垝璋冨害(鍚嶇О:{Name})瀹屾垚\r\n"); + 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 = DI.Resolve<IU9C_MES>().GetU9CBasWo(input); + //if (!result.IsSuccessed) + //{ + // msg = $"鑾峰彇宸ュ崟淇℃伅寮傚父:{result.Message}"; + // Logger.Scheduler.Error(msg); + // status = "Failed"; + //} + //else + //{ + // msg = $"浠嶶9C鑾峰彇宸ュ崟淇℃伅鎴愬姛:{result.Message}"; + //} + } + SaveFluentSchedulerLog(Name, status, $"{msg}"); + Logger.Scheduler.Info($"璁″垝璋冨害(鍚嶇О:{Name})瀹屾垚锛岃繑鍥炰俊鎭�:{msg}\r\n"); } catch (System.Exception ex) { Logger.Scheduler.Fatal(ex, "鑾峰彇宸ュ崟淇℃伅寮傚父"); + SaveFluentSchedulerLog(Name, "Failed", ex.Message); + } + } + + public class fTest : TigerJobBase, ITJob + { + public string Id { get; set; } + public string Tag { get; set; } + public string Name { get; set; } + public fTest() + { + Id = Guid.NewGuid().ToString("N"); + Tag = "U9C_MES_GetWo Interface Job"; + Name = "娴嬭瘯鎺ュ彛"; + } + + public void Execute() + { + Logger.Scheduler.Info($"杩涘叆璁″垝璋冨害(鍚嶇О:{Name})...\r\n"); + try + { + var _lastRunTime = Biz.SysParam["GetWo_LastRun", "Interface_LastRun"].PARAM_VALUE; + var LastRunTime = string.IsNullOrEmpty(_lastRunTime) ? DateTime.Now.AddMinutes(-10) : Convert.ToDateTime(_lastRunTime); + //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("浠嶶9C鑾峰彇宸ュ崟淇℃伅鎴愬姛"); + 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..5215a8e --- /dev/null +++ b/Tiger.Business.MES/Task/TskJob.cs @@ -0,0 +1,83 @@ +锘縰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; + +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 + { + var _job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == input.JobName).First()??new() { + JobName = input.JobName, + JobType = input.JobType, + AssemblyName = input.AssemblyName, + 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, + }; + TSK_TRIG tskTrig = new TSK_TRIG() + { + JobId = _job.ID, + Args = JsonConvert.SerializeObject(Args), + Status = TSK_TRIG.Statuss.Ready.GetValue(), + StartTime = DateTime.Now, + NumberOfRuns = 1, + }; + + var db = Biz.Db; + var dbTran = db.UseTran(() => + { + var y = db.Storageable(_job) + .WhereColumns(t => new { t.JobName, t.GHOST_ROW }) + .ToStorage(); + y.AsInsertable.ExecuteCommand(); + y.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..1d5e8f1 100644 --- a/Tiger.Business.MES/iERP/U9C_MES.cs +++ b/Tiger.Business.MES/iERP/U9C_MES.cs @@ -539,5 +539,162 @@ Logger.Scheduler.Info($"瀹㈡埛鏉$爜淇℃伅瀛樺叆鏁版嵁搴擄紝鎬绘暟锛歔{items.Count}]"); return action; } + + public ApiAction GetU9CBasWo(GetWoInput 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 LastRun = db.Queryable<SYS_PARAM>().Where(q => q.PRMG_CODE == "Interface_LastRun" && q.PARAM_CODE == "GetWo_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_GetWo").ExecuteCommand(); + if (items.Any()) + { + if (items.Count > 150) + { + db.Utilities.PageEach(items, 1000, pageList => + { + var y = db.Storageable(pageList, "U9C") + .WhereColumns(t => new { t.ORDER_NO, t.GHOST_ROW }) + .ToStorage(); + y.BulkCopy(); + y.BulkUpdate(); + }); + } + 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 index 442f4e7..efc33f0 100644 --- a/Tiger.Business/Services/Base/ITigerJob.cs +++ b/Tiger.Business/Services/Base/ITigerJob.cs @@ -1,4 +1,4 @@ -锘縰sing Sundial; +锘縰sing FluentScheduler; using System; using System.Collections.Generic; using System.Linq; @@ -9,12 +9,22 @@ namespace Tiger.Business { /// <summary> - /// 浠诲姟鍩虹被 + /// Sundial浠诲姟鍩虹被 /// </summary> - public interface ITigerJob : IJob + public interface ITigerJob : Sundial.IJob { - string Id { get; set; } - string Tag { get; set; } - string Name { get; set; } + 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.Business/Services/Base/InterfaceServiceNew.cs b/Tiger.Business/Services/Base/InterfaceServiceNew.cs index fae4b69..c876b3d 100644 --- a/Tiger.Business/Services/Base/InterfaceServiceNew.cs +++ b/Tiger.Business/Services/Base/InterfaceServiceNew.cs @@ -5,12 +5,16 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +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 Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser; +using static Tiger.Model.TrigArgs; namespace Tiger.Business { @@ -270,6 +274,34 @@ 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() { + TSK_TRIG trig = new 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) + { + trig = Biz.Db.Queryable<TSK_TRIG>().Where(q => q.JobId == job.ID).First(); + trig.Status = TSK_TRIG.Statuss.Running.GetValue(); + trig.StartTime = DateTime.Now; + } + } + var db = Biz.Db; + //淇濆瓨鍒版暟鎹簱 + var dbTran = db.UseTran(() => + { + if (trig != null) + { + db.Updateable(trig, "system").UpdateColumns(q => new { q.Status, q.UPDATE_USER, q.UPDATE_TIME }).ExecuteCommand(); + } + }); + if (!dbTran.IsSuccess) + { + Logger.Scheduler.Trace(dbTran.ErrorException, $"浣滀笟淇濆瓨鍒版暟鎹簱寮傚父"); + } } /// <summary> @@ -279,26 +311,51 @@ /// <param name="newEntity"></param> /// <param name="jobParam"></param> /// <returns></returns> - public ApiAction AddJob<TJob>(TJob newEntity, FluentJobParam jobParam) where TJob : class, IJob + public ApiAction AddJob<TJob>(TJob newEntity, FluentJobParam jobParam) where TJob : class, ITJob { ApiAction apiAction = new(); try { - JobManager.AddJob<TJob>((s) => GenerateSchedule(jobParam.Args, s.WithName(jobParam.JobName))); - - //Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new - //{ - // TriggerId = jobParam.JobName + "_trigger1", - //}); - //_schedulerFactory.AddJob<TJob>(jobParam.JobName, triggerBuilder); - //var trigger = GetJob(jobParam.JobName).GetTrigger($"{jobParam.JobName}_trigger1"); - //TSK_JOB entity = ReturnDetail(jobParam.JobName); - //entity.Remark = jobParam.Remark; - //entity.JobType = typeof(TJob).Name; - //entity.JobName = jobParam.JobName; - //entity.TriggersWithGhost = new List<TSK_TRIG> { JsonConvert.DeserializeObject<TSK_TRIG>(JsonConvert.SerializeObject(trigger)) }; - //entity.Triggers[0].Args = jobParam.Period.ToString(); - //apiAction = SaveJob(entity); + JobManager.AddJob<TJob>((s) => GenerateSchedule(jobParam.Args, s.WithName(typeof(TJob).Name))); + string guid = Guid.NewGuid().ToString("N"); + var trigger = new TSK_TRIG() + { + JobId = guid, + Args = JsonConvert.SerializeObject(jobParam.Args), + Status = TSK_TRIG.Statuss.Running.GetValue(), + StartTime = DateTime.Now, + NumberOfRuns = 1, + }; + TSK_JOB job = new() + { + ID = guid, + Remark = jobParam.Remark, + JobType = typeof(TJob).Name, + AssemblyName = jobParam.AssemblyName, + JobName = jobParam.JobName, + }; + if (Biz.Db.Queryable<TSK_JOB>().Any(q=>q.JobName == typeof(TJob).Name)) { + apiAction.IsSuccessed = false; + apiAction.LocaleMsg = new($"浠诲姟宸茬粡瀛樺湪"); + return apiAction; + } + var db = Biz.Db; + //淇濆瓨鍒版暟鎹簱 + var dbTran = db.UseTran(() => + { + if (job != null) + { + db.Insertable(job, "system").ExecuteCommand(); + } + if (trigger != null) + { + db.Insertable(trigger, "system").ExecuteCommand(); + } + }); + if (!dbTran.IsSuccess) + { + Logger.Scheduler.Trace(dbTran.ErrorException, $"娣诲姞宸ヤ綔浠诲姟鏃朵繚瀛樺埌鏁版嵁搴撳紓甯�"); + } //apiAction.Data = entity; } @@ -307,6 +364,15 @@ Logger.Console.Fatal(ex, "Add Job From DB Exception"); } return apiAction; + } + + /// <summary> + /// 鍒犻櫎浣滀笟 + /// </summary> + /// <param name="jobname"></param> + public void RemovefJob(string jobname) + { + JobManager.RemoveJob(jobname); } /// <summary> @@ -344,9 +410,9 @@ /// <param name="JobName"></param> /// <param name="registry"></param> /// <returns></returns> - private Schedule Schedule<TJob>(TJob entity, string JobName, Registry registry) where TJob : class, IJob + private Schedule Schedule<TJob>(TJob entity, string JobName, Registry registry) where TJob : class, ITJob { - return registry.Schedule<TJob>().WithName(JobName); + return registry.Schedule<TJob>().WithName(typeof(TJob).Name); } /// <summary> @@ -358,12 +424,23 @@ { SpecificTimeUnit specificTimeUnit = null; TimeUnit timeUnit = null; - if (args.NonReentrant == "Y") { schedule = schedule.NonReentrant(); } - if (args.ToRunNow == "Y") { specificTimeUnit = schedule.ToRunNow(); } - if (args.ToRunOnceAt == "Y") { specificTimeUnit = schedule.ToRunOnceAt(args.ToRunOnceAtDt.AddMinutes(args.NowAddMinutes)); } - if (args.ToRunOnceIn > 0) { timeUnit = schedule.ToRunOnceIn(args.ToRunOnceIn); } - else if (args.ToRunEvery >= 0) { timeUnit = schedule.ToRunEvery(args.ToRunEvery); } - if (specificTimeUnit != null && args.AndEvery>0) { timeUnit = specificTimeUnit.AndEvery(args.AndEvery); } + 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) { @@ -371,7 +448,7 @@ timeUnit.Milliseconds(); break; case TrigArgs.EveryType.Seconds: - timeUnit.Seconds(); + timeUnit.Seconds(); //琛ㄧず鎸夌锛屽灏戠瑕佺湅鍓嶉潰Every鐨勬暟锛屾瘮濡傦細ToRunEvery(5).Seconds() 杩欎釜灏辫〃绀� 闅�5绉掕繍琛屼竴娆� break; case TrigArgs.EveryType.Minutes: timeUnit.Minutes(); @@ -379,7 +456,7 @@ case TrigArgs.EveryType.Hours: if (args.Minutes > 0) { - timeUnit.Hours().At(args.Minutes); + timeUnit.Hours().At(args.Minutes); //琛ㄧず鎸夋瘡灏忔椂鐨勫垎閽燂紝澶氬皯鍒嗚鐪嬪墠闈very鐨勬暟锛屾瘮濡傦細ToRunEvery(1).Hours().At(5) 杩欎釜灏辫〃绀� 闅�1灏忔椂鐨勭5鍒嗛挓杩愯涓�娆� } else { @@ -387,9 +464,9 @@ } break; case TrigArgs.EveryType.Days: - if (args.Hours > 0 && args.Minutes > 0) + if (args.Hours > 0) { - timeUnit.Days().At(args.Hours, args.Minutes); + timeUnit.Days().At(args.Hours, args.Minutes); //琛ㄧず鎸夊ぉ锛屽灏戝ぉ瑕佺湅鍓嶉潰Every鐨勬暟锛屾瘮濡傦細ToRunEvery(2).Days().At(14, 15) 杩欎釜灏辫〃绀� 闅�2澶╃殑14:15杩愯涓�娆� } else { @@ -397,9 +474,9 @@ } break; case TrigArgs.EveryType.Weeks: - if (args.Hours > 0 && args.Minutes > 0) + if (args.Hours > 0) { - timeUnit.Weeks().At(args.Hours, args.Minutes); + timeUnit.Weeks().At(args.Hours, args.Minutes); //琛ㄧず鎸夊懆锛屽灏戝懆瑕佺湅鍓嶉潰Every鐨勬暟锛屾瘮濡傦細ToRunEvery(1).Weeks().At(14, 15) 杩欎釜灏辫〃绀� 闅�1鍛ㄧ殑14:15杩愯涓�娆� } else { @@ -407,7 +484,7 @@ } break; case TrigArgs.EveryType.Weekdays: - if (args.Hours > 0 && args.Minutes > 0) + if (args.Hours > 0 ) { timeUnit.Weekdays().At(args.Hours, args.Minutes); } @@ -416,6 +493,16 @@ 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; } } diff --git a/Tiger.Business/Services/Base/TigerJobBase.cs b/Tiger.Business/Services/Base/TigerJobBase.cs index 842287b..226c523 100644 --- a/Tiger.Business/Services/Base/TigerJobBase.cs +++ b/Tiger.Business/Services/Base/TigerJobBase.cs @@ -11,10 +11,10 @@ /// </summary> public class TigerJobBase { - public string Id { get; set; } - public string Tag { get; set; } - public string Name { get; set; } - + /// <summary> + /// 寮�濮嬫椂闂� + /// </summary> + public static DateTime StartTime { get; set; } /// <summary> /// 淇濆瓨鏃ュ織 /// </summary> @@ -29,7 +29,7 @@ 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 +48,56 @@ return action; } + /// <summary> + /// 淇濆瓨鏃ュ織 + /// </summary> + /// <param name="JobName"></param> + /// <param name="remark"></param> + /// <returns></returns> + public static ApiAction SaveFluentSchedulerLog(string JobName,string status, string remark) + { + ApiAction action = new ApiAction(); + var job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == JobName).IncludesAllFirstLayer().First(); + var trig = job.Triggers?[0]; + 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.ElapsedTime,q.UpdatedTime,q.UPDATE_USER}).ExecuteCommand(); + db.Insertable(logentity).ExecuteCommand(); + }); + if (!dbTran.IsSuccess) + { + action.GetResponse().CatchExceptionWithLog(dbTran.ErrorException, $"浣滀笟鏃ュ織淇濆瓨鍒版暟鎹簱寮傚父"); + } + Logger.Scheduler.Info($"璁″垝璋冨害(鍚嶇О:{JobName})浣滀笟鏃ュ織淇濆瓨鍒版暟鎹簱瀹屾垚\r\n"); + return action; + } + } } 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..1ef6b60 100644 --- a/Tiger.IBusiness.MES/iERP/IU9C_MES.cs +++ b/Tiger.IBusiness.MES/iERP/IU9C_MES.cs @@ -16,5 +16,6 @@ public Task<ApiAction> GetSupplier(GetSupplierInput input); public Task<ApiAction> GetBasWo(GetWoInput input); public Task<ApiAction> GetCustBarCode(GetCustBarcodeInput input); + public ApiAction GetU9CBasWo(GetWoInput input); } } 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..2d5550f --- /dev/null +++ b/Tiger.Model.Net/Entitys/MES/ParameterEntity/TskParameter.cs @@ -0,0 +1,27 @@ +锘縰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 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; } + } +} diff --git a/Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs b/Tiger.Model.Net/Entitys/TSK/TSK_JOB.cs index 311ab70..b01b857 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; } @@ -160,6 +160,7 @@ public class FluentJobParam: TskJobParam { + public string AssemblyName { get; set; } /// <summary> /// 鍙傛暟 diff --git a/Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs b/Tiger.Model.Net/Entitys/TSK/TSK_TRIG.cs index d47cc78..5f0ab0b 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 @@ -182,16 +184,14 @@ public class TrigArgs { - public string ToRunNow { get; set; } - public string ToRunOnceAt { get; set; } - public DateTime ToRunOnceAtDt { get; set; } - public int NowAddMinutes { get; set; } - public int AndEvery { 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 Int64 Milliseconds { get; set; } + 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; } @@ -217,5 +217,17 @@ [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