Commit e8ded374 by Neo Turing

优化

parent 65334be3
using Kivii.Timeliness.Entities;
using Kivii.Web;
using Kivii;
using System;
using System.Collections.Generic;
using System.Linq;
using Kivii.Lims.Entities;
using Kivii.Lims.Transforms;
using Kivii.Linq;
using Kivii.Timeliness;
using Kivii.Timeliness.Extensions;
namespace Jst.Lims.Timeliness
{
public class ModelX
{
public RequestDto RequestDto { get; set; }
public ReportAssignResponse ResponseDto { get; set; }
public Dictionary<string, object> Meta { get; set; }
public bool IsRequestFilter { get; set; }
public Injection Injection { get; set; }
}
public class Injection
{
public void RunResponseFilter() { }
}
public class RequestDto
{
public ReportStatusType StatusType { get; set; }
public List<Guid> ReportKvids { get; set; }
public Dictionary<string, string> Meta { get; set; }
}
public class ResponseDto
{
}
public class Txxxxx
{
public void OnExecution(IRequest req, IResponse res)
{
var Model = new ModelX();
if (Model.IsRequestFilter)
{
HttpError err = null;
try
{
ReportStatusType statusType = Model.RequestDto.StatusType;
List<Guid> reportKvids = Model.RequestDto.ReportKvids;
Dictionary<string, string> meta = Model.RequestDto.Meta;
if (statusType != ReportStatusType.CommissionAccept) { return; }
var nodeTitle = "委托受理";
var nodeType = NodeType.Begin;
Model.Meta["NodeTitle"] = nodeTitle;
Model.Meta["NodeType"] = nodeType;
var connR = KiviiContext.GetOpenedDbConnection<Report>();
var reports = connR.Select<Report>(o => Sql.In(o.Kvid, reportKvids));
if (reports.IsNullOrEmpty()) { return; }
var conn = KiviiContext.GetOpenedDbConnection<Policy>();
var queryPolicy = conn.From<Policy>();
queryPolicy.Where(o => o.InternalCode == "Lims" && o.Enabled == true);
var policys = conn.Select(queryPolicy);
if (policys.IsNullOrEmpty()) { return; }
if (policys.Count() > 1) { throw new Exception("存在多个时效策略数据,请核查时效策略表!"); }
var policy = policys[0];
conn.InitEntityType<PolicyNode>();
var policyNodes = conn.Select<PolicyNode>(o => o.PolicyKvid == policy.Kvid);
if (policyNodes.IsNullOrEmpty()) { return; }
foreach (var report in reports)
{
if (report.CreateTime < DateTime.Parse("2023-11-06")) { continue; }//2023-11-06新规之前的报告就不绩效了
DateTime? deadTime = null;
if (report.DeadDate != null) { deadTime = report.DeadDate.Value.AddDays(1).AddSeconds(-1); }
var enableRequest = new TimelinessRequest();
enableRequest.InternalCode = "Lims";
enableRequest.NodeType = nodeType;
if (nodeType == NodeType.SubNode) { enableRequest.NodeSubTitle = nodeTitle; }
else { enableRequest.NodeTitle = nodeTitle; }
enableRequest.BizId = report.ReportId;
enableRequest.BizKvid = report.Kvid;
enableRequest.RelationTitle = report.SampleSourceBatchNumber;
if (!PolicyExtension.VerifyEnable(enableRequest, policy, policyNodes, conn)) { return; }
var existRequest = new Kivii.Timeliness.TimelinessRequest();
existRequest.InternalCode = "Lims";
existRequest.NodeTitle = nodeTitle;
existRequest.NodeType = nodeType;
existRequest.RelationTitle = report.SampleSourceBatchNumber;
existRequest.BizId = report.ReportId;
existRequest.BizKvid = report.Kvid;
existRequest.PlanFinishTime = report.DeadDate;
existRequest.RealStartTime = DateTime.Now;
var existTime = PolicyExtension.GetPreNode(existRequest, policy, policyNodes, conn);
if (existTime != null)//原本就有时效
{
Model.Meta[report.ReportId] = existTime;
Console.WriteLine("---------------------Request:existTime--------------------------");
existRequest.NodeTitle = "任务分派";
existRequest.NodeType = NodeType.Node;
var existNext = PolicyExtension.GetPreNode(existRequest, policy, policyNodes, conn);
if (existNext != null)//没有下一个节点的时效,就要更新
{
Model.Meta[report.ReportId + "ExistNext"] = existNext;//有此Key说明existTime不要更新
Console.WriteLine("---------------------Request:existNext--------------------------");
return;
}
}
else
{
var verifyRequest = new TimelinessRequest();
verifyRequest.InternalCode = "Lims";
verifyRequest.NodeType = nodeType;
if (nodeType == NodeType.SubNode) { verifyRequest.NodeSubTitle = nodeTitle; }
else { verifyRequest.NodeTitle = nodeTitle; }
verifyRequest.BizId = report.ReportId;
verifyRequest.BizKvid = report.Kvid;
verifyRequest.RelationTitle = report.SampleSourceBatchNumber;
var verify = PolicyExtension.VerifyTimeline(verifyRequest, policy, policyNodes, conn);//验证是否超时
var addRequest = new Kivii.Timeliness.TimelinessRequest();
addRequest.InternalCode = "Lims";
addRequest.NodeType = nodeType;
if (nodeType == NodeType.SubNode) { addRequest.NodeSubTitle = nodeTitle; }
else { addRequest.NodeTitle = nodeTitle; }
addRequest.RelationTitle = report.SampleSourceBatchNumber;
addRequest.BizId = report.ReportId;
addRequest.BizKvid = report.Kvid;
addRequest.PlanFinishTime = deadTime;
addRequest.Metadata = new Dictionary<string, string>();
foreach (var prop in report.GetType().GetProperties())
{
try
{
var key = prop.Name;
if (key == "Metadata") { continue; }
var type = prop.GetType();
var value = prop.GetValue(report, null);
if (value == null) { continue; }
addRequest.Metadata[key] = value.ToString();
if (type == typeof(DateTime)) { addRequest.Metadata[key] = DateTime.Parse(value.ToString()).ToString("yyyy-MM-dd"); }
}
catch { continue; }
}
if (verify)
{
if (meta.IsNullOrEmpty() || meta["Timeline"].IsNullOrEmpty())
{
err = new HttpError(System.Net.HttpStatusCode.Forbidden, "TimelineTimeout", "时效考核超时");
}
addRequest.Summary = meta["Timeline"];
}
Console.WriteLine("---------------------Request:addRequest--------------------------");
Model.Meta[report.ReportId + "Add"] = addRequest;//有此Key说明要创建时效
}
}
Model.Injection.RunResponseFilter();
return;
}
catch { }
finally
{
if (err != null)
{
throw err;
}
}
}
else
{
try
{
ReportAssignResponse rtns = Model.ResponseDto as ReportAssignResponse;
if (rtns == null) { return; }
var th = KiviiContext.NewThread(() =>
{
foreach (var report in rtns.Results)
{
TimelinessRequest addRequest = null;
Timeline existNext = null;
Timeline exist = null;
if (Model.Meta.ContainsKey(report.ReportId + "Add"))
{
addRequest = Model.Meta[report.ReportId + "Add"] as TimelinessRequest;
}
else if (Model.Meta.ContainsKey(report.ReportId))
{
exist = Model.Meta[report.ReportId] as Timeline;
if (Model.Meta.ContainsKey(report.ReportId + "ExistNext"))
{
existNext = Model.Meta[report.ReportId + "ExistNext"] as Timeline;
}
}
if (addRequest != null)
{
PolicyExtension.AddTimeliness(addRequest);
Console.WriteLine("---------------------Response:addRequest--------------------------");
}
else if (exist != null && existNext == null)
{
var updateRequest = new TimelinessRequest();
updateRequest.OwnerKvid = KiviiContext.CurrentMember.DepartmentKvid;
updateRequest.OwnerName = KiviiContext.CurrentMember.DepartmentName;
updateRequest.OperatorKvid = KiviiContext.CurrentMember.Kvid;
updateRequest.OperatorName = KiviiContext.CurrentMember.FullName;
updateRequest.RealFinishTime = DateTime.Now;
if (exist.PlanFinishTime != null && exist.PlanFinishTime < updateRequest.RealFinishTime)
{
updateRequest.Summary = "委托受理打回后重新下达超时";
}
PolicyExtension.UpdateTimeline(exist, updateRequest);
Console.WriteLine("---------------------Response:updateRequest--------------------------");
}
else { continue; }
}
});
th.Start();
return;
}
catch { }
}
return;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectView>ProjectFiles</ProjectView>
</PropertyGroup>
</Project>
\ No newline at end of file
...@@ -32,6 +32,6 @@ using System.Runtime.InteropServices; ...@@ -32,6 +32,6 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示: //通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("5.4.2024.6200")] [assembly: AssemblyVersion("5.4.2024.8200")]
[assembly: AssemblyFileVersion("5.4.2024.6200")] [assembly: AssemblyFileVersion("5.4.2024.8200")]
using Kivii; using Kivii;
using Kivii.Lims.Entities; using Kivii.Lims.Entities;
using Kivii.Linq; using Kivii.Linq;
using Kivii.Lims.Extensions;
using Kivii.Timeliness.Entities; using Kivii.Timeliness.Entities;
using Kivii.Web; using Kivii.Web;
using System; using System;
...@@ -14,6 +15,7 @@ namespace Jst.Lims.Timeliness ...@@ -14,6 +15,7 @@ namespace Jst.Lims.Timeliness
[Api(Description = "时效统计")] [Api(Description = "时效统计")]
public class TimelineStatistic public class TimelineStatistic
{ {
public int SortId { get; set; }
public Guid Kvid { get; set; } public Guid Kvid { get; set; }
public Guid PolicyNodeKvid { get; set; } public Guid PolicyNodeKvid { get; set; }
...@@ -28,6 +30,7 @@ namespace Jst.Lims.Timeliness ...@@ -28,6 +30,7 @@ namespace Jst.Lims.Timeliness
public Guid OwnerKvid { get; set; }//当前节点所属部门 public Guid OwnerKvid { get; set; }//当前节点所属部门
public string ReportId { get; set; }//报告信息 public string ReportId { get; set; }//报告信息
public Guid ReportKvid { get; set; }//报告信息
public string Title { get; set; }//节点信息 public string Title { get; set; }//节点信息
...@@ -37,6 +40,8 @@ namespace Jst.Lims.Timeliness ...@@ -37,6 +40,8 @@ namespace Jst.Lims.Timeliness
public TimeFilter TimeFilter { get; set; }//时间筛选 public TimeFilter TimeFilter { get; set; }//时间筛选
public decimal ReportQuantity { get; set; }
public List<Guid> ReportKvids { 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; }
...@@ -60,6 +65,246 @@ namespace Jst.Lims.Timeliness ...@@ -60,6 +65,246 @@ namespace Jst.Lims.Timeliness
[Api(Description = "报告数据录入/报告编制时效统计")] [Api(Description = "报告数据录入/报告编制时效统计")]
[RequiresAnyRole(SystemRoles.Everyone)] [RequiresAnyRole(SystemRoles.Everyone)]
public class TimelineStatisticDataEntry2 : RestfulExecution<TimelineStatistic>
{
public List<Guid> PolicyNodeKvids { get; set; }
/// <summary>
/// 统计的开始日期
/// </summary>
public DateTime BeginDate { get; set; }
/// <summary>
/// 统计的结束日期
/// </summary>
public DateTime EndDate { get; set; }
public TimeFilter TimeFilter { get; set; }
public bool Grouped { get; set; }
public bool? Urgent { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
int monthDay = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
if (BeginDate == DateTime.MinValue) BeginDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
if (EndDate == DateTime.MinValue) EndDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, monthDay);
BeginDate = DateTime.Parse(BeginDate.ToString("yyyy-MM-dd"));
EndDate = DateTime.Parse(EndDate.ToString("yyyy-MM-dd"));
if (EndDate < BeginDate) throw new Exception("查询结束日期不可小于开始日期!");
var days = EndDate.Subtract(BeginDate).Days;
if (days > 92) throw new Exception("最多查询三个月的数据,您已超出日期范围上线!");
var rtns = new RestfulQueryResponse<TimelineStatistic>();
rtns.Results = new List<TimelineStatistic>();
var connL = KiviiContext.GetOpenedDbConnection<Report>();
var conn = KiviiContext.GetOpenedDbConnection<Timeline>();
var results = new List<TimelineStatistic>();
List<ReportItem> reportItems = null;
if (connL.ConnectionString == conn.ConnectionString)//同一个数据库下的情况 用leftjoin联合查询
{
//connL.Close();
connL = conn;
//根据条件查出所有报告的Kvid
var queryReportKvid = conn.From<Report>();
queryReportKvid.Select(o => o.Kvid);
queryReportKvid.Where(o => o.DeadDate >= BeginDate && o.DeadDate <= EndDate);
//一次性查出日期范围内的报告的项目
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"));
if (Urgent != null)
{
if (Urgent.Value) query.And<Report>(o => o.UrgentRate > 1);
else query.And<Report>(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
});
results = conn.Select<TimelineStatistic>(query);
}
if (Grouped)
{
if (PolicyNodeKvids.IsNullOrEmpty())//不按照节点Group统计,按照整个报告的时效进行统计
{
var group = results.GroupBy(o => o.ReportDeadDate);
foreach (var kv in group)
{
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)
{
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;
}
total.Details = kv.ToList();
rtns.Results.Add(total);
}
}
else//按照节点Group
{
var group = results.GroupBy(o => new { o.PolicyNodeKvid, o.ReportDeadDate, o.Title });
foreach (var kv in group)
{
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 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)
{
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;
}
total.Details = kv.ToList();
rtns.Results.Add(total);
}
}
}
else rtns.Results = results;
//按照指定顺序排序
foreach (var rtn in rtns.Results)
{
if (rtn.Title == "安全组") rtn.SortId = 1;
else if (rtn.Title == "纤维含量组") rtn.SortId = 2;
else if (rtn.Title == "微生物组") rtn.SortId = 3;
else if (rtn.Title == "物理组") rtn.SortId = 4;
else if (rtn.Title == "色牢度组") rtn.SortId = 5;
else if (rtn.Title == "开样组") rtn.SortId = 6;
else if (rtn.Title == "功能组") rtn.SortId = 7;
else if (rtn.Title == "轻工组") rtn.SortId = 8;
else if (rtn.Title == "纤检组") rtn.SortId = 9;
else if (rtn.Title == "羽绒组") rtn.SortId = 10;
else rtn.SortId = 99;
}
rtns.Results = rtns.Results.OrderBy(o => o.SortId).ToList();
rtns.Total = rtns.Results.Count;
return rtns;
}
}
[Api(Description = "报告数据录入/报告编制时效统计")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class TimelineStatisticDataEntry : RestfulExecution<TimelineStatistic> public class TimelineStatisticDataEntry : RestfulExecution<TimelineStatistic>
{ {
public List<Guid> PolicyNodeKvids { get; set; } public List<Guid> PolicyNodeKvids { get; set; }
......
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