diff --git a/NewLife.Cube/Areas/Cube/Controllers/CronJobController.cs b/NewLife.Cube/Areas/Cube/Controllers/CronJobController.cs index 2e0c3a67..ee2c453f 100644 --- a/NewLife.Cube/Areas/Cube/Controllers/CronJobController.cs +++ b/NewLife.Cube/Areas/Cube/Controllers/CronJobController.cs @@ -50,11 +50,18 @@ protected override Boolean Valid(CronJob entity, DataObjectMethodType type, Bool { if (post) { - var cron = new Cron(); - if (!cron.Parse(entity.Cron)) throw new ArgumentException("Cron表达式有误!", nameof(entity.Cron)); + var next = DateTime.MinValue; + foreach (var item in entity.Cron.Split(";")) + { + var cron = new Cron(); + if (!cron.Parse(item)) throw new ArgumentException("Cron表达式有误!", nameof(entity.Cron)); + + var dt = cron.GetNext(DateTime.Now); + if (next == DateTime.MinValue || dt < next) next = dt; + } // 重算下一次的时间 - if (entity is IEntity e && !e.Dirtys[nameof(entity.Name)]) entity.NextTime = cron.GetNext(DateTime.Now); + if (entity is IEntity e && !e.Dirtys[nameof(entity.Name)]) entity.NextTime = next; JobService.Wake(); } diff --git a/NewLife.CubeNC/Areas/Cube/Controllers/CronJobController.cs b/NewLife.CubeNC/Areas/Cube/Controllers/CronJobController.cs index 34a81560..f03775e0 100644 --- a/NewLife.CubeNC/Areas/Cube/Controllers/CronJobController.cs +++ b/NewLife.CubeNC/Areas/Cube/Controllers/CronJobController.cs @@ -1,5 +1,6 @@ using System.Collections; using System.ComponentModel; +using System.Linq.Expressions; using System.Reflection; using Microsoft.AspNetCore.Mvc; using NewLife.Cube.Entity; @@ -64,11 +65,18 @@ protected override Boolean Valid(CronJob entity, DataObjectMethodType type, Bool { if (post) { - var cron = new Cron(); - if (!cron.Parse(entity.Cron)) throw new ArgumentException("Cron表达式有误!", nameof(entity.Cron)); + var next = DateTime.MinValue; + foreach (var item in entity.Cron.Split(";")) + { + var cron = new Cron(); + if (!cron.Parse(item)) throw new ArgumentException("Cron表达式有误!", nameof(entity.Cron)); + + var dt = cron.GetNext(DateTime.Now); + if (next == DateTime.MinValue || dt < next) next = dt; + } // 重算下一次的时间 - if (entity is IEntity e && !e.Dirtys[nameof(entity.Name)]) entity.NextTime = cron.GetNext(DateTime.Now); + if (entity is IEntity e && !e.Dirtys[nameof(entity.Name)]) entity.NextTime = next; JobService.Wake(); } diff --git a/NewLife.CubeNC/Common/EntityController.cs b/NewLife.CubeNC/Common/EntityController.cs index 5e7f535a..23e5f92f 100644 --- a/NewLife.CubeNC/Common/EntityController.cs +++ b/NewLife.CubeNC/Common/EntityController.cs @@ -720,18 +720,21 @@ public virtual ActionResult DeleteAll() /// protected virtual Int32 OnUpdate(TEntity entity) { - // 遍历表单字段,部分字段可能有扩展 - foreach (var item in EditFormFields) + if (Request.HasFormContentType) { - if (item is FormField ef && ef.GetExpand != null) + // 遍历表单字段,部分字段可能有扩展 + foreach (var item in EditFormFields) { - // 获取参数对象,展开参数,从表单字段接收参数 - var p = ef.GetExpand(entity); - if (p != null && p is not String && !(entity as IEntity).Dirtys[ef.Name]) + if (item is FormField ef && ef.GetExpand != null) { - // 保存参数对象 - if (FieldCollection.ReadForm(p, Request.Form, ef.Name + "_")) - entity.SetItem(ef.Name, p.ToJson(true)); + // 获取参数对象,展开参数,从表单字段接收参数 + var p = ef.GetExpand(entity); + if (p != null && p is not String && !(entity as IEntity).Dirtys[ef.Name]) + { + // 保存参数对象 + if (FieldCollection.ReadForm(p, Request.Form, ef.Name + "_")) + entity.SetItem(ef.Name, p.ToJson(true)); + } } } } diff --git a/NewLife.CubeNC/Services/JobService.cs b/NewLife.CubeNC/Services/JobService.cs index 74234973..8b2f750f 100644 --- a/NewLife.CubeNC/Services/JobService.cs +++ b/NewLife.CubeNC/Services/JobService.cs @@ -208,8 +208,11 @@ public void Start() var id = $"{expession}@{cmd}@{job.Argument}"; if (id == _id && _timer != null) return; - var cron = new Cron(); - if (!cron.Parse(expession)) throw new InvalidOperationException($"无效表达式 {expession}"); + foreach (var item in expession.Split(";")) + { + var cron = new Cron(); + if (!cron.Parse(item)) throw new InvalidOperationException($"无效表达式 {item}"); + } // 找到类和方法 _type = cmd.GetTypeEx(); @@ -339,7 +342,17 @@ private async void DoJobWork(Object state) job.WriteLog(job.Name, success, message); - job.NextTime = _timer.Cron.GetNext(_timer.NextTime); + //job.NextTime = _timer.Cron.GetNext(_timer.NextTime); + // 本次任务未完成,timer.NextTime不变 + //job.NextTime = _timer.NextTime; + var next = DateTime.MinValue; + foreach (var cron in _timer.Crons) + { + var dt = cron.GetNext(_timer.NextTime); + if (next == DateTime.MinValue || dt < next) next = dt; + } + job.NextTime = next; + job.Update(); } } \ No newline at end of file diff --git a/NewLife.CubeNC/ViewModels/FormField.cs b/NewLife.CubeNC/ViewModels/FormField.cs index 66ed9e5e..df36b74f 100644 --- a/NewLife.CubeNC/ViewModels/FormField.cs +++ b/NewLife.CubeNC/ViewModels/FormField.cs @@ -1,6 +1,6 @@ namespace NewLife.Cube.ViewModels; -/// +/// 获取扩展字段委托 /// /// public delegate Object GetExpandDelegate(Object entity);