Commit 19e4f6a2 by 陶然

init

parents
################################################################################
# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。
################################################################################
/.vs
/Src/bin/Debug
/Src/obj/Debug
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{D62D3A36-2FA3-46C5-AEFD-95B9CDCB4A6A}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Jst.Lims.Timeliness</RootNamespace>
<AssemblyName>Jst.Domain.Lims.Timeliness.V4.5</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Kivii.Common.V4.5, Version=5.6.2023.10280, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\local.Jst\packages\Kivii.Common.5.6.2023.10280\lib\net45\Kivii.Common.V4.5.dll</HintPath>
</Reference>
<Reference Include="Kivii.Core.V4.5, Version=5.6.2023.9000, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\local.Jst\packages\Kivii.Core.5.6.2023.9000\lib\net45\Kivii.Core.V4.5.dll</HintPath>
</Reference>
<Reference Include="Kivii.Linq.V4.5, Version=5.6.2023.10000, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\local.Jst\packages\Kivii.Linq.5.6.2023.10000\lib\net45\Kivii.Linq.V4.5.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RestfulTimeliness.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Kivii.K5\Kivii.Biz.Lims\Src\Kivii.Biz.Lims.V4.5.csproj">
<Project>{a1971816-ee6f-4558-8923-b1b85779cb7f}</Project>
<Name>Kivii.Biz.Lims.V4.5</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\Kivii.K5\Kivii.Biz.Timeliness\Src\Kivii.Biz.Timeliness.V4.5.csproj">
<Project>{6c4d6207-e339-47c1-9170-fe92528401eb}</Project>
<Name>Kivii.Biz.Timeliness.V4.5</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Jst.Domain.Lims.Timeliness.V4.5")]
[assembly: AssemblyDescription("报告时效分析")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Jst.Domain.Lims.Timeliness.V4.5")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("d62d3a36-2fa3-46c5-aefd-95b9cdcb4a6a")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("5.4.2023.12150")]
[assembly: AssemblyFileVersion("5.4.2023.12150")]
using Kivii;
using Kivii.Lims.Entities;
using Kivii.Linq;
using Kivii.Timeliness.Entities;
using Kivii.Web;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Jst.Lims.Timeliness
{
[Api(Description = "时效统计")]
public class TimelineStatistic
{
public string OwnerName { get; set; }
public Guid OwnerKvid { get; set; }//当前节点所属部门
public string ReportId { get; set; }//报告信息
public string Title { get; set; }//节点信息
public TimeFilter TimeFilter { get; set; }//时间筛选
public decimal Quantity { get; set; }
public decimal TimeoutQuantity { get; set; }
public decimal NormalQuantity { get; set; }
public decimal TimeFilterQuantity { get; set; }
public DateTime? PlanStartTime { get; set; }
public DateTime? RealStartTime { get; set; }
public DateTime? PlanFinishTime { get; set; }
public DateTime? RealFinishTime { get; set; }
public DateTime? ReportDealDate { get; set; }
public DateTime? ReportDeadDate { get; set; }
public DateTime? ReportPreparationDate { get; set; }//编制时间
public DateTime? ReportReviewDate { get; set; }//审核时间
public DateTime? ReportIssueDate { get; set; }//签发时间
public decimal? ReportUrgentRate { get; set; }
public List<TimelineStatistic> Details { get; set; }
}
[Api(Description = "报告时效统计")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class TimelineStatisticReport : RestfulExecution<TimelineStatistic>
{
public Guid PolicyNodeKvid { 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 rtns = new RestfulQueryResponse<TimelineStatistic>();
rtns.Results = new List<TimelineStatistic>();
var connL = KiviiContext.GetOpenedDbConnection<Report>();
var conn = KiviiContext.GetOpenedDbConnection<Timeline>();
var results = new List<TimelineStatistic>();
if (connL.ConnectionString == conn.ConnectionString)//同一个数据库下的情况 用leftjoin联合查询
{
//connL.Close();
connL = conn;
var query = conn.From<Timeline>();
query.LeftJoin<Report>((o, r) => o.BizKvid == r.Kvid);
if (PolicyNodeKvid == Guid.Empty) query.Where<Timeline>(o => o.PreKvid == Guid.Empty && o.RootKvid == o.Kvid);//不指定节点,就查根节点
else query.Where<Timeline>(o => o.PolicyNodeKvid == PolicyNodeKvid && o.PreKvid != Guid.Empty);//指定节点,不能包含根节点
query.Where<Report>(o => o.TypeEx == "W" && 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);
}
query.And<Report>(o => (o.BizType != "G0" && o.BizType != "G1") || o.BizType == null);
query.OrderBy<Report>(o => o.DeadDate);
query.Select<Timeline, Report>((o, r) => new
{
o.OwnerKvid,
o.OwnerName,
r.ReportId,
o.Title,
o.PlanStartTime,
o.RealStartTime,
o.PlanFinishTime,
o.RealFinishTime,
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 (PolicyNodeKvid == Guid.Empty)//不按照节点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++;
}
total.Details = kv.ToList();
rtns.Results.Add(total);
}
}
else//按照节点Group
{
var group = results.GroupBy(o => new { 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 total = new TimelineStatistic();
total.ReportDeadDate = kv.Key.ReportDeadDate;
total.Title = kv.Key.Title;
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++;
}
total.Details = kv.ToList();
rtns.Results.Add(total);
}
}
}
else rtns.Results = results;
rtns.Total = rtns.Results.Count;
return rtns;
}
}
public enum TimeFilter
{
Unsupported = 0,
/// <summary>
/// 14:00
/// </summary>
TwoPM,
/// <summary>
/// 15:00
/// </summary>
ThreePM,
/// <summary>
/// 16:00
/// </summary>
FourPM,
/// <summary>
/// 16:30
/// </summary>
FourHalfPM,
/// <summary>
/// 17:30
/// </summary>
FiveHalfPM,
/// <summary>
/// 18:00
/// </summary>
SixPM
}
}
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Kivii.Common" version="5.6.2023.10280" targetFramework="net45" />
<package id="Kivii.Core" version="5.6.2023.9000" targetFramework="net45" />
<package id="Kivii.Linq" version="5.6.2023.10000" targetFramework="net45" />
</packages>
\ No newline at end of file
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