using YLErp.Modules.SystemModule; namespace YLErp.Modules.EodModule.SettlementModule { /// /// /// public class EodTaskQueryService : YLBaseService { public EodTaskQueryService(OptUserInfo userInfo) : base(userInfo) { } public IEnumerable GetEodTasksToShow(bool onlyLastRunTask) { var lastTask = EodTaskRunner.LastTask; //onlyLastRunTask时如果runner没有lastTask则从数据库取第一个 if (onlyLastRunTask && lastTask != null) { return new[] { lastTask }; } var taskId = lastTask?.id ?? 0; var startDate = DateTime.Today.AddDays(-3); var taskPredicate = PredicateBuilder.Create(t => t.TaskStartTime > startDate && t.id != taskId); List taskList; if (onlyLastRunTask) { //查找今天最后一次执行的任务 var firstTask = DbContext.EodTask.Where(taskPredicate).Where(t => t.TaskStartTime > DateTime.Today) .OrderByDescending(t => t.TaskStartTime).FirstOrDefault(); if (firstTask == null) { //查找正在等待执行的任务 firstTask = DbContext.EodTask.Where(taskPredicate).Where(t => t.TaskState < EodTaskState.completed) .OrderBy(t => t.StartDate).ThenBy(n => n.id).FirstOrDefault(); if (firstTask == null) { return Enumerable.Empty(); } } taskList = new List { firstTask }; taskPredicate = taskPredicate.And(n => n.id == firstTask.id); } else { taskList = DbContext.EodTask.Where(taskPredicate).OrderByDescending(n => n.TaskStartTime).ToList(); } var detailQuery = from t in DbContext.EodTask.Where(taskPredicate) join d in DbContext.EodTaskDetail on t.id equals d.TaskId orderby d.TaskId, d.id descending select new EodTaskDetailDto { TaskId = d.TaskId, ValueDate = d.ValueDate, ElapsedMilliseconds = d.ElapsedMilliseconds }; var detailGroup = detailQuery.ToLookup(n => n.TaskId); foreach (var task in taskList) { if (task.TaskState == EodTaskState.running) { task.TaskState = EodTaskState.interrupted; } var dg = detailGroup.FirstOrDefault(n => n.Key == task.id); if (dg != null) { task.Details = dg.Take(4).ToArray(); } var clientNameStr = ""; if (!string.IsNullOrEmpty(task.ClientIds)) { var clientNames= ClientDataModelV1.GetAllOpenClient(isContainClosed: true).Where(l=> task.ClientIds.Split(',').ToArray().Contains(l.Value)).Select(l=>l.Text); clientNameStr = string.Join(",", clientNames); } task.ClientNameStr= clientNameStr; } if (lastTask != null) { taskList.Insert(0, lastTask); } return taskList; } } }