using DevExpress.XtraCharts;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using HL_FristAidPlatform_Public;
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
namespace HL_FristAidPlatform_ChestPain_Statistics
{
///
/// 胸痛中心指标分析--基层版
/// LYM 2020-06-24
///
public partial class Form_Report_Basic : XtraForm
{
#region 全局变量
///
/// 当前统计 院区编号
///
private string Cur_HospitalGuid = string.Empty;
///
/// 当前统计 开始时间
///
private string Cur_StartDate = string.Empty;
///
/// 当前统计 结束时间
///
private string Cur_EndDate = string.Empty;
///
/// 当前统计 数据类型 -1:全部 0:未上传;1:已上传
///
private string Cur_DataType = string.Empty;
///
/// 当前统计 报表类型 1:月报表
///
private string Cur_ReportType = string.Empty;
///
/// 当前统计 报表名称 与枚举 Enumerate.ChestPainStandardReport 对比
///
private string Cur_ReportName = string.Empty;
///
/// 报表标题
///
private string Cur_ReportTitle = string.Empty;
///
/// 等待窗体
///
private Loading loading = new Loading();
///
/// 报表头
///
private ChartTitle chartTitle_Report = new ChartTitle();
///
/// 当前报表数据源
///
private DataSet Cur_DataSet = new DataSet();
#endregion
///
/// 胸痛中心指标分析--基层版
///
/// 医院编号
/// 开始时间
/// 结束时间
/// 数据类型 0:全部 1:已上传
/// 报表类型 1:月报表
/// 报表名称 与枚举 Enumerate.ChestPainStandardReport 对比
/// 报表标题
public Form_Report_Basic(string _hospitalGuid, string _startDate, string _endDate, string _dataType, string _reportType, string _reportName, string _reportTitle)
{
Cur_HospitalGuid = _hospitalGuid;
Cur_StartDate = _startDate;
Cur_EndDate = _endDate;
Cur_DataType = _dataType;
Cur_ReportType = _reportType;
Cur_ReportName = _reportName;
Cur_ReportTitle = _reportTitle;
InitializeComponent();
}
///
/// 窗体加载
///
///
///
private void Form_Report_Basic_Load(object sender, EventArgs e)
{
BindHospital();
date_Start.TimeValue = Cur_StartDate;
date_End.TimeValue = Cur_EndDate;
radioGroup_DataType.EditValue = Cur_DataType;
radioGroup_ReportType.EditValue = Cur_ReportType;
lookUp_Hospital.EditValue = Cur_HospitalGuid;
BindInfo();
this.Text += "(" + Cur_ReportName + ")";
}
///
/// 绑定机构信息
///
private void BindHospital()
{
try
{
//数据源
DataTable ResultDT = new DataTable();
//有所有院区权限
if (PublicHelp.IsHaveAllDistrictRight(Information.User.ID))
{
string Url = "api/base/T_Base_Hospital/GetList";
ResultDT = DBHelpClass.Get(Url);
}
//只获取当前院区数据
else
{
string Url = string.Format("api/base/T_Base_Hospital/{0}", Information.Hospital.GUID);
ResultDT = DBHelpClass.GetDataRow(Url);
}
PublicClass.SetLookUpList(lookUp_Hospital, ResultDT, "guid", "name", true);
}
catch (Exception ex)
{
PublicClass.WriteErrorLog(this.Text, "绑定机构信息:\r\n" + ex);
}
}
///
/// 绑定数据
///
private void BindInfo()
{
string HospitalGuid = PublicClass.ToString(lookUp_Hospital.EditValue, "");
string StartDate = PublicClass.ToDateTime(date_Start.TimeValue, PublicClass.DefaultTime).ToString(PublicClass.TimeToString);
string EndDate = PublicClass.ToDateTime(date_End.TimeValue, PublicClass.DefaultTime).ToString(PublicClass.TimeToString);
string DataType = PublicClass.ToString(radioGroup_DataType.EditValue, "");
string ReportType = PublicClass.ToString(radioGroup_ReportType.EditValue, "");
string StartTimeAxisID = string.Empty;
string EndTimeAxisID = string.Empty;
string DiffFlag = "2";//获取差异标记 0:天,1:时,2:分,3:秒
string ReportName = Cur_ReportName;
string SeriesName = string.Empty;//报表名称
//主报表标题
chart_Report1.Titles.Clear();
chartTitle_Report.Text = Cur_ReportName + "、" + Cur_ReportTitle; ;
chartTitle_Report.Font = new Font("Tahoma", 12, GraphicsUnit.Point);
chart_Report1.Titles.AddRange(new ChartTitle[] { chartTitle_Report });
ClientFactory httpClient = new HttpClientFactory();
Client client = httpClient.VisitFactory();
#region 报表
//5.16、对于自行来院或经救护车入院的所有急性胸痛患者,缩短了从首次医疗接触到完成首份心电图时间,且要求月平均小于10分钟;
if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版516))
{
SeriesName = "平均时间";
DrawLine(10, "分钟");
StartTimeAxisID = PublicClassForDataBase.Config1003;
EndTimeAxisID = PublicClassForDataBase.Config1004;
}
//5.17、对于STEMI患者,缩短了从完成首份心电图至首份心电图确诊时间,且要求月平均小于10分钟;
if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版517))
{
SeriesName = "平均时间";
DrawLine(10, "分钟");
StartTimeAxisID = PublicClassForDataBase.Config1004;
EndTimeAxisID = PublicClassForDataBase.Config1006;
}
//5.18、经救护车入院的STEMI患者,院前远程传输心电图至胸痛中心的比例不低于30%且在过去6个月内呈现增加趋势;
if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版518))
{
SeriesName = "上传比例(%)";
DrawLine(30, "%");
StartTimeAxisID = "";
EndTimeAxisID = "";
}
//5.19、肌钙蛋白从抽血完成到获取报告时间20分钟;
if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版519))
{
SeriesName = "平均时间";
DrawLine(20, "分钟");
StartTimeAxisID = PublicClassForDataBase.Config1009;
EndTimeAxisID = PublicClassForDataBase.Config1010;
}
//5.20、发病至首次医疗接触在12小时以内的STEMI患者早期再灌注治疗(溶栓 + PPCI)的比例不低于75%;
else if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版520))
{
SeriesName = "再灌注治疗比例(%)";
DrawLine(75, "%");
DiffFlag = "1";
StartTimeAxisID = PublicClassForDataBase.Config1001;
EndTimeAxisID = PublicClassForDataBase.Config1003;
}
//5.21、适合溶栓的患者接受溶栓治疗的比例不低于50%且在过去6个月内呈现增加趋势;
else if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版521))
{
SeriesName = "患者接受溶栓治疗的比例";
DrawLine(50, "%");
StartTimeAxisID = "";
EndTimeAxisID = "";
}
//5.22、经120入院的STEMI患者直达溶栓场所的比例大于50%或呈明显增加趋势
else if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版522))
{
SeriesName = "STEMI患者直达溶栓场所的比例";
DrawLine(50, "%");
StartTimeAxisID = "";
EndTimeAxisID = "";
}
//5.23、所有院内溶栓STEMI患者进门-溶栓时间已明显缩短,平均时间应在30分钟以内,且至少 75%的病例能达到此标准;如果目前无法达到上述要求,至少近6个月已经呈现出明显的缩短趋势 且至少50%的病例达30分钟以内,且已制定合理计划以确保在通过认证后的第1年内达到平均30分 钟以内且75%的合格率;
else if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版523))
{
SeriesName = "平均时间";
DrawLine(30, "分钟");
StartTimeAxisID = PublicClassForDataBase.Config1007;
EndTimeAxisID = PublicClassForDataBase.Config1018;
}
//5.24、所有院前溶栓患者,首次医疗接触-溶栓时间呈现缩短趋势,且小于30分钟的比例大于30%;
else if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版524))
{
SeriesName = "平均时间";
DrawLine(30, "分钟");
StartTimeAxisID = PublicClassForDataBase.Config1003;
EndTimeAxisID = PublicClassForDataBase.Config1018;
}
//5.31、本院介入医生或转运介入医生实施PPCI月平均入门-导丝通过时间90分钟,且达标率75%,若当前无法达到,则应呈现改进趋势,且应制订措施促进改进,确保在通过认证后1年逐步达到上述要求;
else if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版531))
{
SeriesName = "平均时间";
DrawLine(90, "分钟");
StartTimeAxisID = PublicClassForDataBase.Config1007;
EndTimeAxisID = PublicClassForDataBase.Config1027;
}
//5.32、导管室激活时间小于30分钟;
else if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版532))
{
SeriesName = "平均时间";
DrawLine(30, "分钟");
StartTimeAxisID = PublicClassForDataBase.Config1021;
EndTimeAxisID = PublicClassForDataBase.Config1022;
}
string Url = string.Format("api/service/T_Service_ChestPain_Statistics/GetReportBasic?hospitalGuid={0}&startDate={1}&endDate={2}&dataType={3}&reportType={4}&startTimeAxisID={5}&endTimeAxisID={6}&diffFlag={7}&reportName={8}", HospitalGuid, StartDate, EndDate, DataType, ReportType, StartTimeAxisID, EndTimeAxisID, DiffFlag, ReportName);
//执行
Cur_DataSet = client.GetDataSet(Url);
//绘制报表
DrawReport(Cur_DataSet, SeriesName);
#endregion
}
///
/// 绘制参考线
///
/// 参考线的值
/// 参考线的单位
private void DrawLine(object lineValue, string lineUnit)
{
//绘制参考线
if (lineValue != null)
{
XYDiagram diagram1 = (XYDiagram)chart_Report1.Diagram;
if (diagram1 != null)
{
ConstantLine constantLine1 = new ConstantLine();
diagram1.AxisY.ConstantLines.Add(constantLine1);
constantLine1.AxisValue = lineValue;//线条的值
constantLine1.Visible = true;
constantLine1.ShowInLegend = false;
constantLine1.ShowBehind = false;
constantLine1.Title.Visible = true;
constantLine1.Title.Text = lineValue + lineUnit;//显示的文本
constantLine1.Title.TextColor = Color.Red;//文本颜色
constantLine1.Title.Font = new Font("宋体", 10, FontStyle.Regular);
constantLine1.Title.ShowBelowLine = false;//文本显示在线上面还是线下面
constantLine1.Title.Alignment = ConstantLineTitleAlignment.Far;//文本的位置
constantLine1.Color = Color.Red;//线条颜色
constantLine1.LineStyle.DashStyle = DashStyle.DashDot;//线条样式
constantLine1.LineStyle.Thickness = 1;
}
}
}
///
/// 绘制报表
///
/// 数据源
/// 统计图名称
private void DrawReport(DataSet dataSet, string seriesName)
{
//图表
grid_Chart.DataSource = null;
//详细列表
grid_Detail.DataSource = null;
DataTable data = new DataTable();
data.Columns.Add("X轴", typeof(string));
data.Columns.Add("Y轴", typeof(decimal));
DateTime StartDate = PublicClass.ToDateTime(date_Start.TimeValue, PublicClass.DefaultTime);//统计开始时间
DateTime EndDate = PublicClass.ToDateTime(date_End.TimeValue, PublicClass.DefaultTime);//统计结束时间
//在统计区间内生成每个月份的数据列
for (DateTime dt = StartDate; dt <= EndDate; dt = dt.AddMonths(1))
{
DataRow newRow = data.NewRow();
string BindMonth = dt.ToString("yyyy-MM");
newRow["X轴"] = BindMonth; //格式:2020-01
//原始数据不为空
if (dataSet != null)
{
if (dataSet.Tables.Count >= 1)
{
//图表
grid_Chart.DataSource = dataSet.Tables[0];
foreach (DataRow dataRow in dataSet.Tables[0].Rows)
{
string dataTime = PublicClass.ToDateTime(dataRow["年份"] + "-" + dataRow["月份"], PublicClass.DefaultTime).ToString("yyyy-MM");
if (BindMonth == dataTime)
{
#region Y轴数据
if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版516)
|| Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版517)
|| Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版519)
|| Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版523)
|| Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版524)
|| Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版532))
{
newRow["Y轴"] = dataRow["平均时间"];
}
else if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版518)
|| Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版520)
|| Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版521)
|| Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版522))
{
newRow["Y轴"] = dataRow["百分比"];
}
else if (Cur_ReportName == PublicClass.GetEnumDescription(Enumerate.ChestPainBasicReport.基层版531))
{
newRow["Y轴"] = dataRow["达标率(%)"];
}
#endregion
break;
}
else
{
newRow["Y轴"] = "0";
}
}
}
else
{
newRow["Y轴"] = "0";
}
}
else
{
newRow["Y轴"] = "0";
}
data.Rows.Add(newRow);
//绘制图表
chart_Report1.Series.Clear();
ViewType viewType = new ViewType();
switch (PublicClass.ToString(radioGroup_ViewType.EditValue, ""))
{
case "1":
viewType = ViewType.Line;
break;
case "2":
viewType = ViewType.Bar;
break;
default:
break;
}
Series series = new Series(seriesName, viewType);
series.ArgumentDataMember = "X轴";
series.ValueDataMembers[0] = "Y轴";
series.DataSource = data;
chart_Report1.Series.Add(series);
series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True;//显示标注标签
if (dataSet.Tables.Count >= 2)
{
//详细列表
grid_Detail.DataSource = dataSet.Tables[1];
gridView_Detail.Columns["GUID"].Visible = false;
}
}
}
///
/// 统计
///
///
///
private void btn_Report_Click(object sender, EventArgs e)
{
BindInfo();
}
///
/// 单击月份列显示每月详情
///
///
///
private void grid_Chart_MouseClick(object sender, MouseEventArgs e)
{
try
{
GridHitInfo hi = gridView_Chart.CalcHitInfo(new Point(e.X, e.Y));
//单击数据行
if (hi.InRow)//单击的是列头 hi.InColumn
{
//详细列表
grid_Detail.DataSource = null;
if (gridView_Chart.DataRowCount > 0)
{
if (Cur_DataSet.Tables.Count >= 2)
{
int selectRow = gridView_Chart.GetSelectedRows()[0];
string Year = gridView_Chart.GetRowCellValue(selectRow, "年份").ToString();
string Month = gridView_Chart.GetRowCellValue(selectRow, "月份").ToString();
DateTime SelectMonth = PublicClass.ToDateTime(Year + "-" + Month, PublicClass.DefaultTime);
string StartTime = PublicClass.FirstDayOfMonth(SelectMonth, 2).ToString(PublicClass.TimeToString);
string EndTime = PublicClass.LastDayOfMonth(SelectMonth, 2).ToString(PublicClass.TimeToString);
DataTable DataTable = Cur_DataSet.Tables[1].Clone();
string WhereStr = string.Format("建档时间>='{0}' And 建档时间<='{1}'", StartTime, EndTime);
DataRow[] dr = Cur_DataSet.Tables[1].Select(WhereStr);
for (int i = 0; i < dr.Length; i++)
{
DataTable.ImportRow((DataRow)dr[i]);
}
//详细列表
grid_Detail.DataSource = DataTable;
gridView_Detail.Columns["GUID"].Visible = false;
}
}
}
}
catch (Exception ex)
{
PublicClass.WriteErrorLog(this.Text, "单击月份列显示每月详情:\r\n" + ex);
}
}
///
/// 双击患者跳转到详情
///
///
///
private void grid_Detail_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (gridView_Detail.DataRowCount > 0)
{
int selectRow = gridView_Detail.GetSelectedRows()[0];
string PatientGuid = PublicClass.ToString(gridView_Detail.GetRowCellValue(selectRow, "GUID"), "");
//反射
loading.ShowMessage();
Form form = PublicHelp.GetReflection("HL_FristAidPlatform_ChestPain", "Form_ChestPain_PatientMain", 0, PatientGuid, Cur_HospitalGuid, Enumerate.PatientMainState.时间轴, false, "", "", "",0);
form.ShowDialog();
loading.HideMessage();
}
}
///
/// 绘制行号
///
///
///
private void gridView_Chart_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
{
if (e.Info.IsRowIndicator && e.RowHandle > -1)
{
e.Info.DisplayText = (e.RowHandle + 1).ToString();
}
}
///
/// 绘制行号
///
///
///
private void gridView_Detail_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
{
if (e.Info.IsRowIndicator && e.RowHandle > -1)
{
e.Info.DisplayText = (e.RowHandle + 1).ToString();
}
}
///
/// 图表类型切换
///
///
///
private void radioGroup_ViewType_SelectedIndexChanged(object sender, EventArgs e)
{
BindInfo();
}
}
}