完善作业列表页

This commit is contained in:
智能大石头 2024-04-22 23:50:09 +08:00
parent fe9068b821
commit 58f4832e0b
11 changed files with 169 additions and 120 deletions

View File

@ -16,6 +16,7 @@ var set = AntSetting.Current;
var scheduler = new Scheduler
{
ServiceProvider = services.BuildServiceProvider(),
Log = XTrace.Log,
};
scheduler.Join(set.Server, set.AppID, set.Secret, set.Debug);

View File

@ -854,6 +854,17 @@
<td></td>
</tr>
<tr>
<td>Enable</td>
<td>启用</td>
<td>Boolean</td>
<td></td>
<td></td>
<td></td>
<td>N</td>
<td></td>
</tr>
<tr>
<td>Mode</td>
<td>调度模式</td>
@ -1096,17 +1107,6 @@
<td></td>
</tr>
<tr>
<td>Enable</td>
<td>启用</td>
<td>Boolean</td>
<td></td>
<td></td>
<td></td>
<td>N</td>
<td></td>
</tr>
<tr>
<td>LastStatus</td>
<td>最后一次状态</td>

View File

@ -62,6 +62,14 @@ public partial class Job
[BindColumn("DisplayName", "显示名", "")]
public String DisplayName { get => _DisplayName; set { if (OnPropertyChanging("DisplayName", value)) { _DisplayName = value; OnPropertyChanged("DisplayName"); } } }
private Boolean _Enable;
/// <summary>启用</summary>
[DisplayName("启用")]
[Description("启用")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Enable", "启用", "")]
public Boolean Enable { get => _Enable; set { if (OnPropertyChanging("Enable", value)) { _Enable = value; OnPropertyChanged("Enable"); } } }
private JobModes _Mode;
/// <summary>调度模式。定时调度只要达到时间片开头就可以跑,数据调度要求达到时间片末尾才可以跑</summary>
[DisplayName("调度模式")]
@ -136,6 +144,7 @@ public partial class Job
private Int32 _MaxTask;
/// <summary>并行度。一共允许多少个任务并行处理,多执行端时平均分配,确保该作业整体并行度</summary>
[Category("控制参数")]
[DisplayName("并行度")]
[Description("并行度。一共允许多少个任务并行处理,多执行端时平均分配,确保该作业整体并行度")]
[DataObjectField(false, false, false, 0)]
@ -144,6 +153,7 @@ public partial class Job
private Int32 _MaxError;
/// <summary>最大错误。连续错误达到最大错误数时停止</summary>
[Category("控制参数")]
[DisplayName("最大错误")]
[Description("最大错误。连续错误达到最大错误数时停止")]
[DataObjectField(false, false, false, 0)]
@ -152,6 +162,7 @@ public partial class Job
private Int32 _MaxRetry;
/// <summary>最大重试。默认10次超过该次数后将不再重试</summary>
[Category("控制参数")]
[DisplayName("最大重试")]
[Description("最大重试。默认10次超过该次数后将不再重试")]
[DataObjectField(false, false, false, 0)]
@ -160,6 +171,7 @@ public partial class Job
private Int32 _MaxTime;
/// <summary>最大执行时间。默认600秒超过该时间则认为执行器故障将会把该任务分配给其它执行器</summary>
[Category("控制参数")]
[DisplayName("最大执行时间")]
[Description("最大执行时间。默认600秒超过该时间则认为执行器故障将会把该任务分配给其它执行器")]
[DataObjectField(false, false, false, 0)]
@ -168,6 +180,7 @@ public partial class Job
private Int32 _MaxRetain;
/// <summary>保留。任务项保留天数超过天数的任务项将被删除默认3天</summary>
[Category("控制参数")]
[DisplayName("保留")]
[Description("保留。任务项保留天数超过天数的任务项将被删除默认3天")]
[DataObjectField(false, false, false, 0)]
@ -176,6 +189,7 @@ public partial class Job
private Int32 _MaxIdle;
/// <summary>最大空闲时间。默认3600秒超过该时间不更新则认为应用程序故障系统触发告警</summary>
[Category("控制参数")]
[DisplayName("最大空闲时间")]
[Description("最大空闲时间。默认3600秒超过该时间不更新则认为应用程序故障系统触发告警")]
[DataObjectField(false, false, false, 0)]
@ -184,6 +198,7 @@ public partial class Job
private Int32 _ErrorDelay;
/// <summary>错误延迟。默认60秒出错延迟后重新发放</summary>
[Category("控制参数")]
[DisplayName("错误延迟")]
[Description("错误延迟。默认60秒出错延迟后重新发放")]
[DataObjectField(false, false, false, 0)]
@ -192,6 +207,7 @@ public partial class Job
private DateTime _Deadline;
/// <summary>最后期限。超过该时间后,任务将不再执行</summary>
[Category("控制参数")]
[DisplayName("最后期限")]
[Description("最后期限。超过该时间后,任务将不再执行")]
[DataObjectField(false, false, true, 0)]
@ -200,6 +216,7 @@ public partial class Job
private Int64 _Total;
/// <summary>总数。任务处理的总数据例如数据调度抽取得到的总行数定时调度默认1</summary>
[Category("统计")]
[DisplayName("总数")]
[Description("总数。任务处理的总数据例如数据调度抽取得到的总行数定时调度默认1")]
[DataObjectField(false, false, false, 0)]
@ -208,6 +225,7 @@ public partial class Job
private Int64 _Success;
/// <summary>成功。成功处理的数据取自于Handler.Execute返回值或者ProcessItem返回true的个数</summary>
[Category("统计")]
[DisplayName("成功")]
[Description("成功。成功处理的数据取自于Handler.Execute返回值或者ProcessItem返回true的个数")]
[DataObjectField(false, false, false, 0)]
@ -216,6 +234,7 @@ public partial class Job
private Int32 _Error;
/// <summary>错误</summary>
[Category("统计")]
[DisplayName("错误")]
[Description("错误")]
[DataObjectField(false, false, false, 0)]
@ -224,6 +243,7 @@ public partial class Job
private Int32 _Times;
/// <summary>次数</summary>
[Category("统计")]
[DisplayName("次数")]
[Description("次数")]
[DataObjectField(false, false, false, 0)]
@ -232,22 +252,16 @@ public partial class Job
private Int32 _Speed;
/// <summary>速度</summary>
[Category("统计")]
[DisplayName("速度")]
[Description("速度")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Speed", "速度", "")]
public Int32 Speed { get => _Speed; set { if (OnPropertyChanging("Speed", value)) { _Speed = value; OnPropertyChanged("Speed"); } } }
private Boolean _Enable;
/// <summary>启用</summary>
[DisplayName("启用")]
[Description("启用")]
[DataObjectField(false, false, false, 0)]
[BindColumn("Enable", "启用", "")]
public Boolean Enable { get => _Enable; set { if (OnPropertyChanging("Enable", value)) { _Enable = value; OnPropertyChanged("Enable"); } } }
private JobStatus _LastStatus;
/// <summary>最后一次状态</summary>
[Category("统计")]
[DisplayName("最后一次状态")]
[Description("最后一次状态")]
[DataObjectField(false, false, false, 0)]
@ -256,6 +270,7 @@ public partial class Job
private DateTime _LastTime;
/// <summary>最后一次时间</summary>
[Category("统计")]
[DisplayName("最后一次时间")]
[Description("最后一次时间")]
[DataObjectField(false, false, true, 0)]
@ -365,6 +380,7 @@ public partial class Job
"Name" => _Name,
"ClassName" => _ClassName,
"DisplayName" => _DisplayName,
"Enable" => _Enable,
"Mode" => _Mode,
"Cron" => _Cron,
"Topic" => _Topic,
@ -387,7 +403,6 @@ public partial class Job
"Error" => _Error,
"Times" => _Times,
"Speed" => _Speed,
"Enable" => _Enable,
"LastStatus" => _LastStatus,
"LastTime" => _LastTime,
"Data" => _Data,
@ -411,6 +426,7 @@ public partial class Job
case "Name": _Name = Convert.ToString(value); break;
case "ClassName": _ClassName = Convert.ToString(value); break;
case "DisplayName": _DisplayName = Convert.ToString(value); break;
case "Enable": _Enable = value.ToBoolean(); break;
case "Mode": _Mode = (JobModes)value.ToInt(); break;
case "Cron": _Cron = Convert.ToString(value); break;
case "Topic": _Topic = Convert.ToString(value); break;
@ -433,7 +449,6 @@ public partial class Job
case "Error": _Error = value.ToInt(); break;
case "Times": _Times = value.ToInt(); break;
case "Speed": _Speed = value.ToInt(); break;
case "Enable": _Enable = value.ToBoolean(); break;
case "LastStatus": _LastStatus = (JobStatus)value.ToInt(); break;
case "LastTime": _LastTime = value.ToDateTime(); break;
case "Data": _Data = Convert.ToString(value); break;
@ -482,6 +497,9 @@ public partial class Job
/// <summary>显示名</summary>
public static readonly Field DisplayName = FindByName("DisplayName");
/// <summary>启用</summary>
public static readonly Field Enable = FindByName("Enable");
/// <summary>调度模式。定时调度只要达到时间片开头就可以跑,数据调度要求达到时间片末尾才可以跑</summary>
public static readonly Field Mode = FindByName("Mode");
@ -548,9 +566,6 @@ public partial class Job
/// <summary>速度</summary>
public static readonly Field Speed = FindByName("Speed");
/// <summary>启用</summary>
public static readonly Field Enable = FindByName("Enable");
/// <summary>最后一次状态</summary>
public static readonly Field LastStatus = FindByName("LastStatus");
@ -608,6 +623,9 @@ public partial class Job
/// <summary>显示名</summary>
public const String DisplayName = "DisplayName";
/// <summary>启用</summary>
public const String Enable = "Enable";
/// <summary>调度模式。定时调度只要达到时间片开头就可以跑,数据调度要求达到时间片末尾才可以跑</summary>
public const String Mode = "Mode";
@ -674,9 +692,6 @@ public partial class Job
/// <summary>速度</summary>
public const String Speed = "Speed";
/// <summary>启用</summary>
public const String Enable = "Enable";
/// <summary>最后一次状态</summary>
public const String LastStatus = "LastStatus";

View File

@ -139,6 +139,7 @@
<Column Name="Name" DataType="String" Master="True" Length="100" Description="名称" />
<Column Name="ClassName" DataType="String" Length="100" Description="类名。支持该作业的处理器实现" />
<Column Name="DisplayName" DataType="String" Description="显示名" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="Mode" DataType="Int32" Description="调度模式。定时调度只要达到时间片开头就可以跑,数据调度要求达到时间片末尾才可以跑" Type="JobModes" />
<Column Name="Cron" DataType="String" Description="执行频次。定时调度的Cron表达式" />
<Column Name="Topic" DataType="String" Description="主题。消息调度时消费的主题" />
@ -148,22 +149,21 @@
<Column Name="Step" DataType="Int32" Description="步进。切分任务的时间区间,秒" />
<Column Name="BatchSize" DataType="Int32" Description="批大小。数据调度每次抽取数据的分页大小,或消息调度每次处理的消息数,定时调度不适用" />
<Column Name="Offset" DataType="Int32" ItemType="TimeSpan" Description="偏移。距离AntServer当前时间的秒数避免因服务器之间的时间误差而错过部分数据秒" />
<Column Name="MaxTask" DataType="Int32" Description="并行度。一共允许多少个任务并行处理,多执行端时平均分配,确保该作业整体并行度" />
<Column Name="MaxError" DataType="Int32" Description="最大错误。连续错误达到最大错误数时停止" />
<Column Name="MaxRetry" DataType="Int32" Description="最大重试。默认10次超过该次数后将不再重试" />
<Column Name="MaxTime" DataType="Int32" Description="最大执行时间。默认600秒超过该时间则认为执行器故障将会把该任务分配给其它执行器" />
<Column Name="MaxRetain" DataType="Int32" Description="保留。任务项保留天数超过天数的任务项将被删除默认3天" />
<Column Name="MaxIdle" DataType="Int32" Description="最大空闲时间。默认3600秒超过该时间不更新则认为应用程序故障系统触发告警" />
<Column Name="ErrorDelay" DataType="Int32" Description="错误延迟。默认60秒出错延迟后重新发放" />
<Column Name="Deadline" DataType="DateTime" Description="最后期限。超过该时间后,任务将不再执行" />
<Column Name="Total" DataType="Int64" Description="总数。任务处理的总数据例如数据调度抽取得到的总行数定时调度默认1" />
<Column Name="Success" DataType="Int64" Description="成功。成功处理的数据取自于Handler.Execute返回值或者ProcessItem返回true的个数" />
<Column Name="Error" DataType="Int32" Description="错误" />
<Column Name="Times" DataType="Int32" Description="次数" />
<Column Name="Speed" DataType="Int32" Description="速度" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="LastStatus" DataType="Int32" Description="最后一次状态" Type="JobStatus" />
<Column Name="LastTime" DataType="DateTime" Description="最后一次时间" />
<Column Name="MaxTask" DataType="Int32" Description="并行度。一共允许多少个任务并行处理,多执行端时平均分配,确保该作业整体并行度" Category="控制参数" />
<Column Name="MaxError" DataType="Int32" Description="最大错误。连续错误达到最大错误数时停止" Category="控制参数" />
<Column Name="MaxRetry" DataType="Int32" Description="最大重试。默认10次超过该次数后将不再重试" Category="控制参数" />
<Column Name="MaxTime" DataType="Int32" Description="最大执行时间。默认600秒超过该时间则认为执行器故障将会把该任务分配给其它执行器" Category="控制参数" />
<Column Name="MaxRetain" DataType="Int32" Description="保留。任务项保留天数超过天数的任务项将被删除默认3天" Category="控制参数" />
<Column Name="MaxIdle" DataType="Int32" Description="最大空闲时间。默认3600秒超过该时间不更新则认为应用程序故障系统触发告警" Category="控制参数" />
<Column Name="ErrorDelay" DataType="Int32" Description="错误延迟。默认60秒出错延迟后重新发放" Category="控制参数" />
<Column Name="Deadline" DataType="DateTime" Description="最后期限。超过该时间后,任务将不再执行" Category="控制参数" />
<Column Name="Total" DataType="Int64" Description="总数。任务处理的总数据例如数据调度抽取得到的总行数定时调度默认1" Category="统计" />
<Column Name="Success" DataType="Int64" Description="成功。成功处理的数据取自于Handler.Execute返回值或者ProcessItem返回true的个数" Category="统计" />
<Column Name="Error" DataType="Int32" Description="错误" Category="统计" />
<Column Name="Times" DataType="Int32" Description="次数" Category="统计" />
<Column Name="Speed" DataType="Int32" Description="速度" Category="统计" />
<Column Name="LastStatus" DataType="Int32" Description="最后一次状态" Category="统计" Type="JobStatus" />
<Column Name="LastTime" DataType="DateTime" Description="最后一次时间" Category="统计" />
<Column Name="Data" DataType="String" Length="-1" Description="数据。Sql模板或C#模板" />
<Column Name="CreateUserID" DataType="Int32" Description="创建人" Category="扩展" />
<Column Name="CreateUser" DataType="String" Description="创建者" Category="扩展" />

View File

@ -25,7 +25,7 @@ public class AppController : AntEntityController<App>
{
var df = ListFields.GetField("Name") as ListField;
df.Url = "/Ant/Ant/Detail?id={ID}";
df.Url = "/Ant/App/Detail?id={ID}";
df.Target = "_blank";
}
{

View File

@ -1,8 +1,11 @@
using System.ComponentModel;
using AntJob.Data;
using AntJob.Data.Entity;
using Microsoft.AspNetCore.Mvc;
using NewLife;
using NewLife.Cube;
using NewLife.Cube.ViewModels;
using NewLife.Data;
using NewLife.Security;
using NewLife.Web;
using XCode.Membership;
@ -19,8 +22,39 @@ public class JobController : AntEntityController<Job>
{
LogOnChange = true;
ListFields.RemoveField("ClassName", "Cron", "Topic", "MessageCount", "Time", "End");
ListFields.RemoveField("MaxError", "MaxRetry", "MaxTime", "MaxRetain", "MaxIdle", "ErrorDelay", "Deadline");
ListFields.RemoveField("Total", "Success", "Error", "Times", "Speed");
ListFields.RemoveCreateField().RemoveUpdateField();
ListFields.AddListField("UpdateTime");
{
var df = ListFields.AddListField("Task", "UpdateUser");
df.DisplayName = "任务";
df.Url = "/Ant/JobTask?appid={AppID}&jobId={ID}";
}
{
var df = ListFields.AddListField("Title", null, "Mode");
df.Header = "执行频次";
df.AddService(new MyTextField());
}
}
class MyTextField : ILinkExtend
{
public String Resolve(DataField field, IModel data)
{
var job = data as Job;
return job.Mode switch
{
JobModes.Data => "Start=" + job.Time.ToFullString(""),
JobModes.Time => job.Cron,
JobModes.Message => job.Topic,
JobModes.CSharp => "[C#]" + job.Time.ToString(""),
JobModes.Sql => "[Sql]" + job.Time.ToString(""),
_ => job.Time.ToString(""),
};
}
}
/// <summary>搜索数据集</summary>

View File

@ -2,7 +2,6 @@
using AntJob.Handlers;
using AntJob.Models;
using NewLife;
using NewLife.Log;
using NewLife.Threading;
namespace AntJob.Providers;
@ -48,6 +47,8 @@ public class NetworkJobProvider : JobProvider
{
var svr = Server;
WriteLog("正在连接调度中心:{0}", svr);
// 使用配置中心账号
var ant = new AntClient(svr)
{

View File

@ -6,47 +6,44 @@ using HisData;
using NewLife.Security;
using XCode;
namespace HisAgent
namespace HisAgent;
[DisplayName("生产病人")]
[Description("定时生成一批随机病人")]
internal class BuildPatient : Handler
{
[DisplayName("生产病人")]
[Description("定时生成一批随机病人")]
internal class BuildPatient : Handler
public BuildPatient()
{
public BuildPatient()
{
var job = Job;
job.Time = DateTime.Today;
job.Step = 15;
}
Job.Cron = "5 1/3 * * * ?";
}
protected override Int32 Execute(JobContext ctx)
{
// 随机造几个病人
var count = Rand.Next(1, 9);
protected override Int32 Execute(JobContext ctx)
{
// 随机造几个病人
var count = Rand.Next(1, 9);
var list = new List<ZYBH0>();
for (var i = 0; i < count; i++)
var list = new List<ZYBH0>();
for (var i = 0; i < count; i++)
{
var time = DateTime.Now.AddSeconds(Rand.Next(-30 * 24 * 3600, 0));
var time2 = time.AddSeconds(Rand.Next(3600, 10 * 24 * 3600));
var pi = new ZYBH0
{
var time = DateTime.Now.AddSeconds(Rand.Next(-30 * 24 * 3600, 0));
var time2 = time.AddSeconds(Rand.Next(3600, 10 * 24 * 3600));
var pi = new ZYBH0
{
Bhid = Rand.Next(999999),
XM = Rand.NextString(8),
Ryrq = time,
Cyrq = time2,
Sfzh = Rand.NextString(18),
FB = Rand.NextString(6),
State = Rand.Next(8),
Flag = Rand.Next(2),
};
Bhid = Rand.Next(999999),
XM = Rand.NextString(8),
Ryrq = time,
Cyrq = time2,
Sfzh = Rand.NextString(18),
FB = Rand.NextString(6),
State = Rand.Next(8),
Flag = Rand.Next(2),
};
list.Add(pi);
}
list.Insert(true);
// 成功处理数据量
return count;
list.Add(pi);
}
list.Insert(true);
// 成功处理数据量
return count;
}
}

View File

@ -6,48 +6,48 @@ using HisData;
using NewLife.Security;
using XCode;
namespace HisAgent
namespace HisAgent;
[DisplayName("生产遗嘱")]
[Description("根据病人生成其对应的遗嘱")]
class BuildWill : DataHandler
{
[DisplayName("生产遗嘱")]
[Description("根据病人生成其对应的遗嘱")]
class BuildWill : DataHandler
public BuildWill()
{
public BuildWill()
var job = Job;
job.Time = DateTime.Today;
job.Step = 30;
job.BatchSize = 1000;
}
public override Boolean Start()
{
// 指定要抽取数据的实体类以及时间字段
Factory = ZYBH0.Meta.Factory;
Field = ZYBH0._.CreateTime;
return base.Start();
}
protected override Boolean ProcessItem(JobContext ctx, IEntity entity)
{
var pi = entity as ZYBH0;
// 创建医嘱信息
var will = new ZYBHYZ0
{
var job = Job;
job.Time = DateTime.Today;
job.Step = 30;
}
Bhid = pi.Bhid,
Mgroupid = Rand.Next(9999),
public override Boolean Start()
{
// 指定要抽取数据的实体类以及时间字段
Factory = ZYBH0.Meta.Factory;
Field = ZYBH0._.CreateTime;
Kyzrq = pi.Ryrq.AddHours(1),
Tyzrq = pi.Cyrq.AddHours(-3),
Kyzys = Rand.NextString(8),
return base.Start();
}
State = pi.State,
};
protected override Boolean ProcessItem(JobContext ctx, IEntity entity)
{
var pi = entity as ZYBH0;
will.Insert();
// 创建医嘱信息
var will = new ZYBHYZ0
{
Bhid = pi.Bhid,
Mgroupid = Rand.Next(9999),
Kyzrq = pi.Ryrq.AddHours(1),
Tyzrq = pi.Cyrq.AddHours(-3),
Kyzys = Rand.NextString(8),
State = pi.State,
};
will.Insert();
return true;
}
return true;
}
}

View File

@ -10,10 +10,7 @@ internal class HelloJob : Handler
{
public HelloJob()
{
// 今天零点开始每10秒一次
var job = Job;
job.Time = DateTime.Today;
job.Step = 10;
Job.Cron = "7/30 * * * * ?";
}
protected override Int32 Execute(JobContext ctx)

View File

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using AntJob;
using Microsoft.Extensions.Hosting;
using NewLife;
using NewLife.Log;
namespace HisAgent;
@ -22,12 +23,15 @@ public class JobHost : BackgroundService
var scheduler = new Scheduler
{
ServiceProvider = _serviceProvider,
Log = XTrace.Log,
};
scheduler.Join(set.Server, set.AppID, set.Secret, set.Debug);
// 添加作业
scheduler.AddHandler<HelloJob>();
scheduler.AddHandler<BuildPatient>();
scheduler.AddHandler<BuildWill>();
// 启动调度引擎,调度器内部多线程处理
scheduler.Start();