You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
6.8 KiB
C#

using System.Linq.Expressions;
using System;
using System.Threading.Tasks;
using EntrustSettle.IServices;
using EntrustSettle.Model.Models;
using EntrustSettle.Services.Base;
using EntrustSettle.Common.Extensions;
using SqlSugar;
using EntrustSettle.Model;
using System.Collections.Generic;
using System.Linq;
namespace EntrustSettle.Services
{
public partial class TasksLogServices : BaseServices<TasksLog>, ITasksLogServices
{
public async Task<PageModel<TasksLog>> GetTaskLogs(long jobId, int page, int pageSize, DateTime? runTime, DateTime? endTime)
{
RefAsync<int> totalCount = 0;
Expression<Func<TasksLog, bool>> whereExpression = log => true;
if (jobId > 0) whereExpression = whereExpression.And(log => log.JobId == jobId);
var data = await this.Db.Queryable<TasksLog>()
.LeftJoin<TasksQz>((log, qz) => log.JobId == qz.Id)
.OrderByDescending((log) => log.RunTime)
.WhereIF(jobId > 0, (log) => log.JobId == jobId)
.WhereIF(runTime != null, (log) => log.RunTime >= runTime.Value)
.WhereIF(endTime != null, (log) => log.RunTime <= endTime.Value)
.Select((log, qz) => new TasksLog
{
RunPars = log.RunPars,
RunResult = log.RunResult,
RunTime = log.RunTime,
EndTime = log.EndTime,
ErrMessage = log.ErrMessage,
ErrStackTrace = log.ErrStackTrace,
TotalTime = log.TotalTime,
Name = qz.Name,
JobGroup = qz.JobGroup
})
.ToPageListAsync(page, pageSize, totalCount);
return new PageModel<TasksLog>(page, totalCount, pageSize, data);
}
public async Task<object> GetTaskOverview(long jobId, DateTime? runTime, DateTime? endTime, string type)
{
//按年
if ("year".Equals(type))
{
var days = endTime.Value.Year - runTime.Value.Year;
var dayArray = new List<DateTime>();
while (days >= 0)
{
dayArray.Add(new DateTime(runTime.Value.Year + days, 1, 1));
days--;
}
var queryableLeft = this.Db.Reportable(dayArray).ToQueryable<DateTime>();
var queryableRight = this.Db.Queryable<TasksLog>().Where((x) => x.RunTime.Year >= runTime.Value.Year && x.RunTime.Year <= endTime.Value.Year); ; ; //声名表
var list = this.Db.Queryable(queryableLeft, queryableRight, JoinType.Left,
(x1, x2) => x1.ColumnName.Year == x2.RunTime.Year)
.GroupBy((x1, x2) => x1.ColumnName)
.Select((x1, x2) => new
{
= SqlFunc.AggregateSum(SqlFunc.IIF(x2.Id > 0, 1, 0)),
date = x1.ColumnName.Year.ToString() + "年"
}).ToList().OrderBy(t => t.date);
return list;
}
else if ("month".Equals(type))
{
//按月
var queryableLeft = this.Db.Reportable(ReportableDateType.MonthsInLast1years).ToQueryable<DateTime>(); //生成月份 //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤
var queryableRight = this.Db.Queryable<TasksLog>().Where((x) => x.RunTime.Year == runTime.Value.Year); //声名表
//月份和表JOIN
var list = queryableLeft
.LeftJoin(queryableRight, (x1, x2) => x2.RunTime.ToString("MM月") == x1.ColumnName.ToString("MM月"))
.GroupBy((x1, x2) => x1.ColumnName)
.Select((x1, x2) => new
{
//null的数据要为0所以不能用count
= SqlFunc.AggregateSum(SqlFunc.IIF(x2.Id > 0, 1, 0)),
date = x1.ColumnName.ToString("MM月")
}
).ToList().OrderBy(t => t.date);
await Task.CompletedTask;
return list;
}
else if ("day".Equals(type))
{
//按日
var time = runTime.Value;
var days = DateTime.DaysInMonth(time.Year, time.Month);
var dayArray = Enumerable.Range(1, days).Select(it => Convert.ToDateTime(time.ToString("yyyy-MM-" + it))).ToList();//转成时间数组
var queryableLeft = this.Db.Reportable(dayArray).ToQueryable<DateTime>();
var star = Convert.ToDateTime(runTime.Value.ToString("yyyy-MM-01 00:00:00"));
var end = Convert.ToDateTime(runTime.Value.ToString($"yyyy-MM-{days} 23:59:59"));
var queryableRight = this.Db.Queryable<TasksLog>().Where((x) => x.RunTime >= star && x.RunTime <= end); ; ; //声名表
var list = this.Db.Queryable(queryableLeft, queryableRight, JoinType.Left,
(x1, x2) => x1.ColumnName.Date == x2.RunTime.Date)
.GroupBy((x1, x2) => x1.ColumnName)
.Select((x1, x2) => new
{
= SqlFunc.AggregateSum(SqlFunc.IIF(x2.Id > 0, 1, 0)),
date = x1.ColumnName.Day
}).ToList().OrderBy(t => t.date);
await Task.CompletedTask;
return list;
}
else if ("hour".Equals(type))
{
//按小时
var time = runTime.Value;
var days = 24;
var dayArray = Enumerable.Range(0, days).Select(it => Convert.ToDateTime(time.ToString($"yyyy-MM-dd {it.ToString().PadLeft(2, '0')}:00:00"))).ToList();//转成时间数组
var queryableLeft = this.Db.Reportable(dayArray).ToQueryable<DateTime>();
var queryableRight = this.Db.Queryable<TasksLog>().Where((x) => x.RunTime >= runTime.Value.Date && x.RunTime <= runTime.Value.Date.AddDays(1).AddMilliseconds(-1)); //声名表
var list = this.Db.Queryable(queryableLeft, queryableRight, JoinType.Left,
(x1, x2) => x1.ColumnName.Hour == x2.RunTime.Hour)
.GroupBy((x1, x2) => x1.ColumnName)
.Select((x1, x2) => new
{
= SqlFunc.AggregateSum(SqlFunc.IIF(x2.Id > 0, 1, 0)),
date = x1.ColumnName.Hour
}).ToList().OrderBy(t => t.date);
await Task.CompletedTask;
return list;
}
await Task.CompletedTask;
return null;
}
}
}