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(); } } }