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