| | |
| | | using Rhea.Common; |
| | | using Sundial; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | |
| | | using Tiger.IBusiness; |
| | | using Tiger.Model; |
| | | using Tiger.Model.Minsun; |
| | | using FluentScheduler; |
| | | using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser; |
| | | |
| | | namespace Tiger.Business.MES |
| | | { |
| | |
| | | /// </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 |
| | |
| | | /// <summary> |
| | | /// ä»U9Cè·åå·¥åä¿¡æ¯ 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 = "ä»U9C忥工åä¿¡æ¯"; |
| | | } |
| | | |
| | | 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); |
| | | //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, "ä»U9Cè·åå·¥åä¿¡æ¯æå"); |
| | | 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 = $"ä»U9Cè·åå·¥åä¿¡æ¯æå:{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("ä»U9Cè·åå·¥åä¿¡æ¯æå"); |
| | | Logger.Scheduler.Info($"计åè°åº¦(åç§°:{Name})宿\r\n"); |
| | | } |
| | | catch (System.Exception ex) |
| | | { |
| | | Logger.Scheduler.Fatal(ex, "è·åå·¥åä¿¡æ¯å¼å¸¸\r\n"); |
| | | } |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | using 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 |
| | | } |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | |
| | | using Sundial; |
| | | using FluentScheduler; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | |
| | | 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; } |
| | | } |
| | | } |
| | |
| | | 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 |
| | | { |
| | |
| | | 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> |
| | |
| | | /// <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; |
| | | |
| | | } |
| | |
| | | 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> |
| | |
| | | /// <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> |
| | |
| | | { |
| | | 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ãToRunOnceAtåé¢ |
| | | //ææ¶é´ç±»åæ¥è¿è¡ |
| | | switch (args.Type) |
| | | { |
| | |
| | | timeUnit.Milliseconds(); |
| | | break; |
| | | case TrigArgs.EveryType.Seconds: |
| | | timeUnit.Seconds(); |
| | | timeUnit.Seconds(); //表示æç§ï¼å¤å°ç§è¦çåé¢Everyçæ°ï¼æ¯å¦ï¼ToRunEvery(5).Seconds() è¿ä¸ªå°±è¡¨ç¤º é5ç§è¿è¡ä¸æ¬¡ |
| | | break; |
| | | case TrigArgs.EveryType.Minutes: |
| | | timeUnit.Minutes(); |
| | |
| | | case TrigArgs.EveryType.Hours: |
| | | if (args.Minutes > 0) |
| | | { |
| | | timeUnit.Hours().At(args.Minutes); |
| | | timeUnit.Hours().At(args.Minutes); //è¡¨ç¤ºææ¯å°æ¶çåéï¼å¤å°åè¦çåé¢Everyçæ°ï¼æ¯å¦ï¼ToRunEvery(1).Hours().At(5) è¿ä¸ªå°±è¡¨ç¤º é1å°æ¶ç第5åéè¿è¡ä¸æ¬¡ |
| | | } |
| | | else |
| | | { |
| | |
| | | } |
| | | 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 |
| | | { |
| | |
| | | } |
| | | 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 |
| | | { |
| | |
| | | } |
| | | break; |
| | | case TrigArgs.EveryType.Weekdays: |
| | | if (args.Hours > 0 && args.Minutes > 0) |
| | | if (args.Hours > 0 ) |
| | | { |
| | | timeUnit.Weekdays().At(args.Hours, args.Minutes); |
| | | } |
| | |
| | | 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> |
| | | 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> |
| | |
| | | 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 |
| | |
| | | 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; |
| | | } |
| | | |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | using 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); |
| | | } |
| | | } |
| | |
| | | public Task<ApiAction> GetSupplier(GetSupplierInput input); |
| | | public Task<ApiAction> GetBasWo(GetWoInput input); |
| | | public Task<ApiAction> GetCustBarCode(GetCustBarcodeInput input); |
| | | public ApiAction GetU9CBasWo(GetWoInput input); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | using 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; } |
| | | } |
| | | } |
| | |
| | | [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; } |
| | |
| | | |
| | | public class FluentJobParam: TskJobParam |
| | | { |
| | | public string AssemblyName { get; set; } |
| | | |
| | | /// <summary> |
| | | /// åæ° |
| | |
| | | Unknown, |
| | | [Description("æªç¥ä½ä¸å¤çç¨åºï¼ä½ä¸å¤çç¨åºç±»åè¿è¡æ¶ç±»å为null")] |
| | | Unhandled, |
| | | [Description("忢")] |
| | | Stop, |
| | | } |
| | | #endregion |
| | | |
| | |
| | | |
| | | 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; } |
| | |
| | | [Description("æ")] |
| | | Months, |
| | | } |
| | | |
| | | public enum RunType |
| | | { |
| | | [Description("马ä¸è¿è¡")] |
| | | ToRunNow, |
| | | [Description("å¨(T)è¿è¡")] |
| | | ToRunOnceAt, |
| | | [Description("é(T)è¿è¡")] |
| | | ToRunEvery, |
| | | [Description("(T)åè¿è¡")] |
| | | ToRunOnceIn, |
| | | } |
| | | } |
| | | } |
| | |
| | | <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" /> |