服务端的TigerApi 框架,基于.NET6 2024 版本
Ben Lin
2025-01-09 c40ce123424183b2fce3bf9dfb24d859f3eacb52
Tiger.Business/Services/Base/InterfaceServiceNew.cs
@@ -6,6 +6,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
@@ -324,14 +325,22 @@
                {
                    JobManager.AddJob<TJob>((s) => GenerateSchedule(jobParam.Args, s.WithName(jobParam.JobName)));
                    string guid = Guid.NewGuid().ToString("N");
                    TSK_JOB job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == jobParam.JobName).First() ?? new()
                    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,
                        Remark = jobParam.Remark,
                        JobType = jobParam.JobName,
                        AssemblyName = jobParam.AssemblyName,
                        JobName = jobParam.JobName,
                    };
                    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,
@@ -345,7 +354,7 @@
                    var dbTran = db.UseTran(() =>
                    {
                        var y = db.Storageable(job)
                           .WhereColumns(t => new { t.JobName, t.GHOST_ROW })
                           .WhereColumns(t => new { t.JobName,t.JobType, t.GHOST_ROW })
                           .ToStorage();
                        y.AsInsertable.ExecuteCommand();
                        y.AsUpdateable.IgnoreColumns(x => x.ID).ExecuteCommand();
@@ -409,15 +418,12 @@
                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);
                    }
                    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)
@@ -437,7 +443,7 @@
        /// <returns></returns>
        private Schedule Schedule<TJob>(TJob entity, string JobName, Registry registry) where TJob : class, ITJob
        {
            return registry.Schedule<TJob>().WithName(typeof(TJob).Name);
            return registry.Schedule<TJob>().WithName(JobName);
        }
        /// <summary>
@@ -532,6 +538,47 @@
        }
        /// <summary>
        /// 立即运行
        /// </summary>
        /// <param name="jobname"></param>
        public ApiAction ImmediateRun<TJob>(TJob newEntity, string jobname) where TJob : class, ITJob
        {
            ApiAction apiAction = new();
            try
            {
                if (JobManager.AllSchedules.Any(q => q.Name == jobname))
                {
                    JobManager.RemoveJob(jobname);
                    string guid = Guid.NewGuid().ToString("N");
                    TSK_JOB job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == jobname).IncludesAllFirstLayer().First();
                    var trigger = job.Triggers[0];
                    TrigArgs args = JsonConvert.DeserializeObject<TrigArgs>(job.Triggers[0].Args);
                    args.runType = RunType.ToRunNow;
                    JobManager.AddJob<TJob>((s) => GenerateSchedule(args, s.WithName(jobname)));
                    trigger.Status = TSK_TRIG.Statuss.Running.GetValue();
                    trigger.Args = JsonConvert.SerializeObject(args);
                    var db = Biz.Db;
                    //保存到数据库
                    var dbTran = db.UseTran(() =>
                    {
                        db.Updateable(trigger, "system_ImmediateRun_job").UpdateColumns(q => new { q.Status, q.Args, q.UPDATE_TIME, q.UPDATE_USER }).ExecuteCommand();
                    });
                    if (!dbTran.IsSuccess)
                    {
                        Logger.Scheduler.Fatal(dbTran.ErrorException, $"立即运行工作任务时保存状态到数据库异常");
                    }
                    apiAction.LocaleMsg = new($"立即运行工作任务成功");
                }
            }
            catch (System.Exception ex)
            {
                apiAction.CatchExceptionWithLog(ex);
            }
            return apiAction;
        }
        /// <summary>
        /// 停止服务
        /// </summary>
        public void Stop()