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;
}
}
}