Commit 6650ff7c by Neo Turing

优化升级

parent e8ded374
...@@ -40,12 +40,20 @@ namespace Jst.Lims.Timeliness ...@@ -40,12 +40,20 @@ namespace Jst.Lims.Timeliness
public TimeFilter TimeFilter { get; set; }//时间筛选 public TimeFilter TimeFilter { get; set; }//时间筛选
public decimal ReportTotalQuantity { get; set; }
public decimal ReportQuantity { 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 Quantity { get; set; }
public decimal TimeoutQuantity { get; set; } public decimal TimeoutQuantity { get; set; }
public decimal NormalQuantity { get; set; } public decimal NormalQuantity { get; set; }
public decimal TimeFilterQuantity { get; set; } public decimal TimeFilterQuantity { get; set; }
public decimal TimeFiltertTimeoutQuantity { get; set; }
public DateTime? PlanStartTime { get; set; } public DateTime? PlanStartTime { get; set; }
public DateTime? RealStartTime { get; set; } public DateTime? RealStartTime { get; set; }
...@@ -61,6 +69,8 @@ namespace Jst.Lims.Timeliness ...@@ -61,6 +69,8 @@ namespace Jst.Lims.Timeliness
public List<TimelineStatistic> Details { get; set; } public List<TimelineStatistic> Details { get; set; }
} }
[Api(Description = "报告数据录入/报告编制时效统计")] [Api(Description = "报告数据录入/报告编制时效统计")]
...@@ -102,186 +112,267 @@ namespace Jst.Lims.Timeliness ...@@ -102,186 +112,267 @@ namespace Jst.Lims.Timeliness
var connL = KiviiContext.GetOpenedDbConnection<Report>(); var connL = KiviiContext.GetOpenedDbConnection<Report>();
var conn = KiviiContext.GetOpenedDbConnection<Timeline>(); var conn = KiviiContext.GetOpenedDbConnection<Timeline>();
var results = new List<TimelineStatistic>();
List<ReportItem> reportItems = null; List<ReportItem> reportItems = null;
List<Report> reports = null;
List<Timeline> timelines = null;
if (connL.ConnectionString == conn.ConnectionString)//同一个数据库下的情况 用leftjoin联合查询 if (connL.ConnectionString == conn.ConnectionString)//同一个数据库下的情况 用leftjoin联合查询
{ {
//connL.Close(); //connL.Close();
connL = conn; 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 //根据条件查出所有报告的Kvid
var queryReportKvid = conn.From<Report>(); var queryReportKvid = conn.From<Report>();
queryReportKvid.Select(o => o.Kvid);
queryReportKvid.Where(o => o.DeadDate >= BeginDate && o.DeadDate <= EndDate); 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>(); var queryReportItem = conn.From<ReportItem>();
queryReportItem.Select(o => new { o.ReportKvid, o.WorkGroupName, o.Status, o.Type }); queryReportItem.Select(o => new { o.ReportKvid, o.WorkGroupName, o.Status, o.Type });
queryReportItem.Where(o => Sql.In(o.ReportKvid, queryReportKvid)); queryReportItem.Where(o => Sql.In(o.ReportKvid, queryReportKvid));
reportItems = conn.Select(queryReportItem); reportItems = conn.Select(queryReportItem);
reportItems = reportItems.filterReportItem(); reportItems = reportItems.filterReportItem();
//Console.WriteLine($"---------------reportItems:{reportItems.Count}--------------------");
var query = conn.From<Report>();
query.LeftJoin<Timeline>((r, t) => r.Kvid == t.BizKvid); var queryBizKvid = conn.From<Report>();
if (PolicyNodeKvids.IsNullOrEmpty()) query.Where<Timeline>(o => o.PreKvid == Guid.Empty && o.RootKvid == o.Kvid);//不指定节点,就查根节点 queryBizKvid.Where(o => o.DeadDate >= BeginDate && o.DeadDate <= EndDate);
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"));
if (Urgent != null) if (Urgent != null)
{ {
if (Urgent.Value) query.And<Report>(o => o.UrgentRate > 1); if (Urgent.Value) queryBizKvid.And(o => o.UrgentRate > 1);
else query.And<Report>(o => o.UrgentRate == 1); else queryBizKvid.And(o => o.UrgentRate == 1);
} }
query.And<Report>(o => (o.BizType != "G0" && o.BizType != "G1") || o.BizType == null); queryBizKvid.Select(o => o.Kvid);
query.OrderBy<Timeline>(o => o.PolicyNodeKvid); var queryTimeline = conn.From<Timeline>();
query.ThenBy<Report>(o => o.DeadDate); if (PolicyNodeKvids.IsNullOrEmpty()) queryTimeline.And<Timeline>(o => o.PreKvid == Guid.Empty && o.RootKvid == o.Kvid);//不指定节点,就查根节点
query.Select<Timeline, Report>((o, r) => new else queryTimeline.And<Timeline>(o => Sql.In(o.PolicyNodeKvid, PolicyNodeKvids) && o.PreKvid != Guid.Empty);//指定节点,不能包含根节点
{ queryTimeline.And(o => Sql.In(o.BizKvid, queryBizKvid));
o.Kvid, timelines = conn.Select(queryTimeline);
o.RootKvid, if (timelines.IsNullOrEmpty()) return rtns;
o.ParentKvid, //Console.WriteLine($"---------------timelines:{timelines.Count}--------------------");
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
});
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); DateTime? filterTime = null;
foreach (var kv in group) switch (TimeFilter)
{ {
DateTime? filterTime = null; case TimeFilter.Unsupported:
switch (TimeFilter) filterTime = null;
{ break;
case TimeFilter.Unsupported: case TimeFilter.TwoPM:
filterTime = null; filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 14:00:00"));
break; break;
case TimeFilter.TwoPM: case TimeFilter.ThreePM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 14:00:00")); filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 15:00:00"));
break; break;
case TimeFilter.ThreePM: case TimeFilter.FourPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 15:00:00")); filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 16:00:00"));
break; break;
case TimeFilter.FourPM: case TimeFilter.FourHalfPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 16:00:00")); filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 16:30:00"));
break; break;
case TimeFilter.FourHalfPM: case TimeFilter.FiveHalfPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 16:30:00")); filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 17:30:00"));
break; break;
case TimeFilter.FiveHalfPM: case TimeFilter.SixPM:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 17:30:00")); filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 18:00:00"));
break; break;
case TimeFilter.SixPM: default:
filterTime = DateTime.Parse(kv.Key.Value.ToString("yyyy-MM-dd 18:00:00")); filterTime = null;
break; break;
default: }
filterTime = null; var currentReports = kv.ToList();
break; var currentTimelines = timelines.Where(o => Sql.In(o.BizKvid, currentReports.ConvertAll(p => p.Kvid))).ToList();
} var total = new TimelineStatistic();
var total = new TimelineStatistic(); total.ReportDeadDate = kv.Key;
total.ReportDeadDate = kv.Key; //total.ReportQuantity = currentReports.Count();
total.Quantity = kv.Count(); total.Quantity = currentTimelines.IsNullOrEmpty() ? 0 : currentTimelines.Count();
total.TimeFilter = TimeFilter; total.TimeFilter = TimeFilter;
total.Details = new List<TimelineStatistic>(); total.Details = new List<TimelineStatistic>();
foreach (var item in kv) if (currentTimelines.IsNullOrEmpty())
{
total.ReportNoTimelines = currentReports;
}
else
{
foreach (var report in kv)
{ {
var realFinishTime = item.RealFinishTime; var item = currentTimelines.FirstOrDefault(o => o.BizKvid == report.Kvid);
if (realFinishTime == null) realFinishTime = DateTime.Now; if (item == null)
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++; if (total.ReportNoTimelines == null) total.ReportNoTimelines = new List<Report>();
else total.NormalQuantity++; total.ReportNoTimelines.Add(report);
if (filterTime != null && item.RealFinishTime != null && item.RealFinishTime <= filterTime) total.TimeFilterQuantity++; }
else item.TimeoutQuantity = 1; 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 }); var repItems = kv.ToList();
foreach (var kv in group) 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; var titles = timelines.ConvertAll(x => x.Title).Distinct().ToList();
switch (TimeFilter) var group = results.GroupBy(o => new { o.DeadDate, o.Category });
{ //Console.WriteLine($"---------------group:{group.Count()}--------------------");
case TimeFilter.Unsupported: foreach (var kv in group)
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 currtReportItems = reportItems.Where(o => o.WorkGroupName == kv.Key.Title).ToList(); DateTime? filterTime = null;
//根据检验组分组统计 switch (TimeFilter)
var reportCount = currtReportItems.ConvertAll(o => o.ReportKvid).Distinct().Count(); {
var reportkvids = currtReportItems.ConvertAll(o => o.ReportKvid).Distinct().ToList(); case TimeFilter.Unsupported:
var total = new TimelineStatistic(); filterTime = null;
total.PolicyNodeKvid = kv.Key.PolicyNodeKvid; break;
total.ReportDeadDate = kv.Key.ReportDeadDate; case TimeFilter.TwoPM:
total.Title = kv.Key.Title; filterTime = DateTime.Parse(kv.Key.DeadDate.Value.ToString("yyyy-MM-dd 14:00:00"));
total.ReportQuantity = reportCount; break;
total.ReportKvids = reportkvids; case TimeFilter.ThreePM:
total.Quantity = kv.Count(); filterTime = DateTime.Parse(kv.Key.DeadDate.Value.ToString("yyyy-MM-dd 15:00:00"));
total.TimeFilter = TimeFilter; break;
total.Details = new List<TimelineStatistic>(); case TimeFilter.FourPM:
foreach (var item in kv) 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; //Console.WriteLine($"---------------report:{report.ReportId}--------------------");
if (realFinishTime == null) realFinishTime = DateTime.Now; var item = currentTimelines.FirstOrDefault(o => o.BizKvid == report.Kvid && o.Title == report.Category);
//if (item.PlanFinishTime != item.ReportDeadDate.Value.AddDays(1).AddSeconds(-1)) item.PlanFinishTime = item.ReportDeadDate.Value.AddDays(1).AddSeconds(-1); if (item == null)
if (item.PlanFinishTime != null && realFinishTime > item.PlanFinishTime) total.TimeoutQuantity++; {
else total.NormalQuantity++; //Console.WriteLine($"---------------item:null--------------------");
if (filterTime != null && item.RealFinishTime != null && item.RealFinishTime <= filterTime) total.TimeFilterQuantity++; total.ReportNoTimelines.Add(report);
else item.TimeoutQuantity = 1; }
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) 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