Commit 6650ff7c by Neo Turing

优化升级

parent e8ded374
......@@ -40,12 +40,20 @@ namespace Jst.Lims.Timeliness
public TimeFilter TimeFilter { get; set; }//时间筛选
public decimal ReportTotalQuantity { get; set; }
public decimal ReportQuantity { get; set; }
public List<Guid> ReportKvids { get; set; }
public List<Report> Reports { get; set; }
public decimal ReportNoTimelinesQuantity { get; set; }
public List<Report> ReportNoTimelines { get; set; }
public decimal TimelinesQuantity { get; set; }
public List<Timeline> Timelines { get; set; }
public decimal TimelineTimeoutsQuantity { get; set; }
public List<Timeline> TimelineTimeouts { get; set; }
public decimal Quantity { get; set; }
public decimal TimeoutQuantity { get; set; }
public decimal NormalQuantity { get; set; }
public decimal TimeFilterQuantity { get; set; }
public decimal TimeFiltertTimeoutQuantity { get; set; }
public DateTime? PlanStartTime { get; set; }
public DateTime? RealStartTime { get; set; }
......@@ -61,6 +69,8 @@ namespace Jst.Lims.Timeliness
public List<TimelineStatistic> Details { get; set; }
}
[Api(Description = "报告数据录入/报告编制时效统计")]
......@@ -102,186 +112,267 @@ namespace Jst.Lims.Timeliness
var connL = KiviiContext.GetOpenedDbConnection<Report>();
var conn = KiviiContext.GetOpenedDbConnection<Timeline>();
var results = new List<TimelineStatistic>();
List<ReportItem> reportItems = null;
List<Report> reports = null;
List<Timeline> timelines = null;
if (connL.ConnectionString == conn.ConnectionString)//同一个数据库下的情况 用leftjoin联合查询
{
//connL.Close();
connL = conn;
var queryReport = conn.From<Report>();
queryReport.Where(o => o.DeadDate >= BeginDate && o.DeadDate <= EndDate);
queryReport.Select(o => new { o.ReportId, o.DeadDate, o.Kvid, o.DealDate, o.PreparationDate, o.IssueDate, o.ReviewDate, o.UrgentRate,o.CreateTime });
if (Urgent != null)
{
if (Urgent.Value) queryReport.And(o => o.UrgentRate > 1);
else queryReport.And(o => o.UrgentRate == 1);
}
reports = conn.Select(queryReport);
//Console.WriteLine($"---------------reports:{reports.Count}--------------------");
if (reports.IsNullOrEmpty()) return rtns;
//根据条件查出所有报告的Kvid
var queryReportKvid = conn.From<Report>();
queryReportKvid.Select(o => o.Kvid);
queryReportKvid.Where(o => o.DeadDate >= BeginDate && o.DeadDate <= EndDate);
if (Urgent != null)
{
if (Urgent.Value) queryReportKvid.And(o => o.UrgentRate > 1);
else queryReportKvid.And(o => o.UrgentRate == 1);
}
queryReportKvid.Select(o => o.Kvid);
//一次性查出日期范围内的报告的项目
var queryReportItem = conn.From<ReportItem>();
queryReportItem.Select(o => new { o.ReportKvid, o.WorkGroupName, o.Status, o.Type });
queryReportItem.Where(o => Sql.In(o.ReportKvid, queryReportKvid));
reportItems = conn.Select(queryReportItem);
reportItems = reportItems.filterReportItem();
var query = conn.From<Report>();
query.LeftJoin<Timeline>((r, t) => r.Kvid == t.BizKvid);
if (PolicyNodeKvids.IsNullOrEmpty()) query.Where<Timeline>(o => o.PreKvid == Guid.Empty && o.RootKvid == o.Kvid);//不指定节点,就查根节点
else query.Where<Timeline>(o => Sql.In(o.PolicyNodeKvid, PolicyNodeKvids) && o.PreKvid != Guid.Empty);//指定节点,不能包含根节点
query.Where<Report>(o => o.DeadDate >= BeginDate && o.DeadDate <= EndDate && Sql.In(o.TypeEx, "W", "Z"));//只查看不加急并且要求完成日期在所选范围内的时效记录
query.And<Report>(o => !o.ReportId.ToLower().Contains("test"));
//Console.WriteLine($"---------------reportItems:{reportItems.Count}--------------------");
var queryBizKvid = conn.From<Report>();
queryBizKvid.Where(o => o.DeadDate >= BeginDate && o.DeadDate <= EndDate);
if (Urgent != null)
{
if (Urgent.Value) query.And<Report>(o => o.UrgentRate > 1);
else query.And<Report>(o => o.UrgentRate == 1);
if (Urgent.Value) queryBizKvid.And(o => o.UrgentRate > 1);
else queryBizKvid.And(o => o.UrgentRate == 1);
}
query.And<Report>(o => (o.BizType != "G0" && o.BizType != "G1") || o.BizType == null);
query.OrderBy<Timeline>(o => o.PolicyNodeKvid);
query.ThenBy<Report>(o => o.DeadDate);
query.Select<Timeline, Report>((o, r) => new
{
o.Kvid,
o.RootKvid,
o.ParentKvid,
o.PolicyNodeKvid,
o.OperatorName,
o.OwnerKvid,
o.OwnerName,
r.ReportId,
ReportKvid=r.Kvid,
o.Title,
o.PlanStartTime,
o.RealStartTime,
o.PlanFinishTime,
o.RealFinishTime,
o.Summary,
o.Remark,
ReportDealDate = r.DealDate,
ReportDeadDate = r.DeadDate,
ReportPreparationDate = r.PreparationDate,
ReportReviewDate = r.ReviewDate,
ReportIssueDate = r.IssueDate,
ReportUrgentRate = r.UrgentRate
queryBizKvid.Select(o => o.Kvid);
var queryTimeline = conn.From<Timeline>();
if (PolicyNodeKvids.IsNullOrEmpty()) queryTimeline.And<Timeline>(o => o.PreKvid == Guid.Empty && o.RootKvid == o.Kvid);//不指定节点,就查根节点
else queryTimeline.And<Timeline>(o => Sql.In(o.PolicyNodeKvid, PolicyNodeKvids) && o.PreKvid != Guid.Empty);//指定节点,不能包含根节点
queryTimeline.And(o => Sql.In(o.BizKvid, queryBizKvid));
timelines = conn.Select(queryTimeline);
if (timelines.IsNullOrEmpty()) return rtns;
//Console.WriteLine($"---------------timelines:{timelines.Count}--------------------");
});
results = conn.Select<TimelineStatistic>(query);
}
if (Grouped)
if (PolicyNodeKvids.IsNullOrEmpty())//不按照节点Group统计,按照整个报告的时效进行统计
{
if (PolicyNodeKvids.IsNullOrEmpty())//不按照节点Group统计,按照整个报告的时效进行统计
var group = reports.GroupBy(o => o.DeadDate);
//Console.WriteLine($"---------------group:{group.Count()}--------------------");
foreach (var kv in group)
{
var group = results.GroupBy(o => o.ReportDeadDate);
foreach (var kv in group)
DateTime? filterTime = null;
switch (TimeFilter)
{
DateTime? filterTime = null;
switch (TimeFilter)
{
case TimeFilter.Unsupported:
filterTime = null;
break;
case TimeFilter.TwoPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 14:00:00"));
break;
case TimeFilter.ThreePM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 15:00:00"));
break;
case TimeFilter.FourPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 16:00:00"));
break;
case TimeFilter.FourHalfPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 16:30:00"));
break;
case TimeFilter.FiveHalfPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 17:30:00"));
break;
case TimeFilter.SixPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 18:00:00"));
break;
default:
filterTime = null;
break;
}
var total = new TimelineStatistic();
total.ReportDeadDate = kv.Key;
total.Quantity = kv.Count();
total.TimeFilter = TimeFilter;
total.Details = new List<TimelineStatistic>();
foreach (var item in kv)
case TimeFilter.Unsupported:
filterTime = null;
break;
case TimeFilter.TwoPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 14:00:00"));
break;
case TimeFilter.ThreePM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 15:00:00"));
break;
case TimeFilter.FourPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 16:00:00"));
break;
case TimeFilter.FourHalfPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 16:30:00"));
break;
case TimeFilter.FiveHalfPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 17:30:00"));
break;
case TimeFilter.SixPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 18:00:00"));
break;
default:
filterTime = null;
break;
}
var currentReports = kv.ToList();
var currentTimelines = timelines.Where(o => Sql.In(o.BizKvid, currentReports.ConvertAll(p => p.Kvid))).ToList();
var total = new TimelineStatistic();
total.ReportDeadDate = kv.Key;
//total.ReportQuantity = currentReports.Count();
total.Quantity = currentTimelines.IsNullOrEmpty() ? 0 : currentTimelines.Count();
total.TimeFilter = TimeFilter;
total.Details = new List<TimelineStatistic>();
if (currentTimelines.IsNullOrEmpty())
{
total.ReportNoTimelines = currentReports;
}
else
{
foreach (var report in kv)
{
var realFinishTime = item.RealFinishTime;
if (realFinishTime == null) realFinishTime = DateTime.Now;
if (item.PlanFinishTime != item.ReportDeadDate.Value.AddDays(1).AddSeconds(-1)) item.PlanFinishTime = item.ReportDeadDate.Value.AddDays(1).AddSeconds(-1);
if (item.PlanFinishTime != null && realFinishTime > item.PlanFinishTime) total.TimeoutQuantity++;
else total.NormalQuantity++;
if (filterTime != null && item.RealFinishTime != null && item.RealFinishTime <= filterTime) total.TimeFilterQuantity++;
else item.TimeoutQuantity = 1;
var item = currentTimelines.FirstOrDefault(o => o.BizKvid == report.Kvid);
if (item == null)
{
if (total.ReportNoTimelines == null) total.ReportNoTimelines = new List<Report>();
total.ReportNoTimelines.Add(report);
}
else
{
if (total.Reports == null) total.Reports = new List<Report>();
total.Reports.Add(report);
if (total.Timelines == null) total.Timelines = new List<Timeline>();
if (total.TimelineTimeouts == null) total.TimelineTimeouts = new List<Timeline>();
var realFinishTime = item.RealFinishTime;
if (realFinishTime == null) realFinishTime = DateTime.Now;
if (item.PlanFinishTime != report.DeadDate.Value.AddDays(1).AddSeconds(-1)) item.PlanFinishTime = report.DeadDate.Value.AddDays(1).AddSeconds(-1);
if (item.PlanFinishTime != null && realFinishTime > item.PlanFinishTime) total.TimelineTimeouts.Add(item);
else total.Timelines.Add(item);
//if (filterTime != null && item.RealFinishTime != null && item.RealFinishTime <= filterTime) total.TimeFilterQuantity++;
//else item.TimeoutQuantity = 1;
}
}
total.Details = kv.ToList();
rtns.Results.Add(total);
}
rtns.Results.Add(total);
}
else//按照节点Group
}
else//按照节点Group
{
List<Report> results = new List<Report>();
if (reportItems.IsNullOrEmpty()) return rtns;
var groupReportItem = reportItems.GroupBy(o => o.WorkGroupName);
//Console.WriteLine($"---------------groupReportItem:{groupReportItem.Count()}--------------------");
foreach (var kv in groupReportItem)
{
var group = results.GroupBy(o => new { o.PolicyNodeKvid, o.ReportDeadDate, o.Title });
foreach (var kv in group)
var repItems = kv.ToList();
var repKvids = repItems.ConvertAll(o => o.ReportKvid).Distinct().ToList();
//Console.WriteLine($"---------------repKvids:{repKvids.Count()}--------------------");
var currentReports = reports.Where(o => repKvids.Contains(o.Kvid)).ToList();
//Console.WriteLine($"---------------currentReports:{kv.Key}:{currentReports.Count()}--------------------");
foreach (var item in currentReports)
{
var reportGp = new Report();
reportGp.PopulateWith(item);
reportGp.DeadDate = DateTime.Parse(item.DeadDate.Value.ToString("yyyy-MM-dd"));
reportGp.Category = kv.Key;
results.Add(reportGp);
}
}
//Console.WriteLine($"---------------results:{results.Count()}--------------------");
DateTime? filterTime = null;
switch (TimeFilter)
{
case TimeFilter.Unsupported:
filterTime = null;
break;
case TimeFilter.TwoPM:
filterTime = DateTime.Parse(kv.Key.ReportDeadDate.Value.ToString("yyyy-MM-dd 14:00:00"));
break;
case TimeFilter.ThreePM:
filterTime = DateTime.Parse(kv.Key.ReportDeadDate.Value.ToString("yyyy-MM-dd 15:00:00"));
break;
case TimeFilter.FourPM:
filterTime = DateTime.Parse(kv.Key.ReportDeadDate.Value.ToString("yyyy-MM-dd 16:00:00"));
break;
case TimeFilter.FourHalfPM:
filterTime = DateTime.Parse(kv.Key.ReportDeadDate.Value.ToString("yyyy-MM-dd 16:30:00"));
break;
case TimeFilter.FiveHalfPM:
filterTime = DateTime.Parse(kv.Key.ReportDeadDate.Value.ToString("yyyy-MM-dd 17:30:00"));
break;
case TimeFilter.SixPM:
filterTime = DateTime.Parse(kv.Key.ReportDeadDate.Value.ToString("yyyy-MM-dd 18:00:00"));
break;
default:
filterTime = null;
break;
}
var titles = timelines.ConvertAll(x => x.Title).Distinct().ToList();
var group = results.GroupBy(o => new { o.DeadDate, o.Category });
//Console.WriteLine($"---------------group:{group.Count()}--------------------");
foreach (var kv in group)
{
var currtReportItems = reportItems.Where(o => o.WorkGroupName == kv.Key.Title).ToList();
//根据检验组分组统计
var reportCount = currtReportItems.ConvertAll(o => o.ReportKvid).Distinct().Count();
var reportkvids = currtReportItems.ConvertAll(o => o.ReportKvid).Distinct().ToList();
var total = new TimelineStatistic();
total.PolicyNodeKvid = kv.Key.PolicyNodeKvid;
total.ReportDeadDate = kv.Key.ReportDeadDate;
total.Title = kv.Key.Title;
total.ReportQuantity = reportCount;
total.ReportKvids = reportkvids;
total.Quantity = kv.Count();
total.TimeFilter = TimeFilter;
total.Details = new List<TimelineStatistic>();
foreach (var item in kv)
DateTime? filterTime = null;
switch (TimeFilter)
{
case TimeFilter.Unsupported:
filterTime = null;
break;
case TimeFilter.TwoPM:
filterTime = DateTime.Parse(kv.Key.DeadDate.Value.ToString("yyyy-MM-dd 14:00:00"));
break;
case TimeFilter.ThreePM:
filterTime = DateTime.Parse(kv.Key.DeadDate.Value.ToString("yyyy-MM-dd 15:00:00"));
break;
case TimeFilter.FourPM:
filterTime = DateTime.Parse(kv.Key.DeadDate.Value.ToString("yyyy-MM-dd 16:00:00"));
break;
case TimeFilter.FourHalfPM:
filterTime = DateTime.Parse(kv.Key.DeadDate.Value.ToString("yyyy-MM-dd 16:30:00"));
break;
case TimeFilter.FiveHalfPM:
filterTime = DateTime.Parse(kv.Key.DeadDate.Value.ToString("yyyy-MM-dd 17:30:00"));
break;
case TimeFilter.SixPM:
filterTime = DateTime.Parse(kv.Key.DeadDate.Value.ToString("yyyy-MM-dd 18:00:00"));
break;
default:
filterTime = null;
break;
}
var currentReports = kv.ToList();
//Console.WriteLine($"---------------currentReports:{kv.Key.DeadDate.Value.ToString("yyyy-MM-dd")} {kv.Key.Category}: {currentReports.Count()}--------------------");
var reportKvids = currentReports.ConvertAll(o => o.Kvid);
var currtReportItems = reportItems.Where(o => o.WorkGroupName == kv.Key.Category).ToList();
//根据检验组分组统计
var reportCount = currtReportItems.ConvertAll(o => o.ReportKvid).Where(o => reportKvids.Contains(o)).Distinct().Count();
var reportkvids = currtReportItems.ConvertAll(o => o.ReportKvid).Where(o => reportKvids.Contains(o)).Distinct().ToList();
var currentTimelines = timelines.Where(o => Sql.In(o.BizKvid, reportKvids) && o.Title == kv.Key.Category).ToList();
var total = new TimelineStatistic();
total.ReportDeadDate = kv.Key.DeadDate;
total.Title = kv.Key.Category;
total.ReportTotalQuantity = currentReports.Count();
total.Quantity = currentTimelines.IsNullOrEmpty() ? 0 : currentTimelines.Count();
total.TimeFilter = TimeFilter;
total.Details = new List<TimelineStatistic>();
total.Reports = new List<Report>();
total.Timelines = new List<Timeline>();
total.TimelineTimeouts = new List<Timeline>();
total.ReportNoTimelines = new List<Report>();
if (currentTimelines.IsNullOrEmpty())
{
//Console.WriteLine($"---------------currentTimelines:IsNullOrEmpty--------------------");
total.ReportNoTimelines.AddRange(currentReports);
}
else
{
//Console.WriteLine($"---------------currentTimelines:{currentTimelines.Count()}--------------------");
foreach (var report in kv)
{
var realFinishTime = item.RealFinishTime;
if (realFinishTime == null) realFinishTime = DateTime.Now;
//if (item.PlanFinishTime != item.ReportDeadDate.Value.AddDays(1).AddSeconds(-1)) item.PlanFinishTime = item.ReportDeadDate.Value.AddDays(1).AddSeconds(-1);
if (item.PlanFinishTime != null && realFinishTime > item.PlanFinishTime) total.TimeoutQuantity++;
else total.NormalQuantity++;
if (filterTime != null && item.RealFinishTime != null && item.RealFinishTime <= filterTime) total.TimeFilterQuantity++;
else item.TimeoutQuantity = 1;
//Console.WriteLine($"---------------report:{report.ReportId}--------------------");
var item = currentTimelines.FirstOrDefault(o => o.BizKvid == report.Kvid && o.Title == report.Category);
if (item == null)
{
//Console.WriteLine($"---------------item:null--------------------");
total.ReportNoTimelines.Add(report);
}
else
{
//Console.WriteLine($"---------------item:{item.BizId} {item.Title}--------------------");
total.Reports.Add(report);
var realFinishTime = item.RealFinishTime;
if (realFinishTime == null) realFinishTime = DateTime.Now;
if (filterTime == null)
{
if (item.PlanFinishTime != report.DeadDate.Value.AddDays(1).AddSeconds(-1)) item.PlanFinishTime = report.DeadDate.Value.AddDays(1).AddSeconds(-1);
if (item.PlanFinishTime != null && realFinishTime > item.PlanFinishTime) total.TimelineTimeouts.Add(item);
else total.Timelines.Add(item);
}
else
{
if (realFinishTime <= filterTime) total.Timelines.Add(item);
else total.TimelineTimeouts.Add(item);
}
}
}
total.Details = kv.ToList();
rtns.Results.Add(total);
}
total.ReportQuantity = total.Reports.Count;
total.TimelinesQuantity = total.Timelines.Count;
total.TimelineTimeoutsQuantity = total.TimelineTimeouts.Count;
total.ReportNoTimelinesQuantity = total.ReportNoTimelines.Count;
if (titles.Contains(total.Title)) rtns.Results.Add(total);
}
}
else rtns.Results = results;
//按照指定顺序排序
foreach (var rtn in rtns.Results)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment