Files
2025-08-02 05:20:17 +07:00

551 lines
35 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Linq;
using Datalib.DatabaseSpecific;
using System.Windows.Forms;
using Datalib.Linq;
using Datalib.EntityClasses;
using Datalib.FactoryClasses;
using Datalib.HelperClasses;
using PatientMan.Classes;
namespace PatientMan.Classes
{
class clsHivqual
{
public DevExpress.XtraSpreadsheet.SpreadsheetControl spreed;
public DateTime BeginDate;
public DateTime EndDate;
private DevExpress.Spreadsheet.Worksheet _Hivqual, _Common, _Tracking;
public DataAccessAdapter adapter = new DataAccessAdapter(SettingInfo.Constr);
int row, col;
public void Calculate()
{
// var path = Application.StartupPath;
// var templatefile = path + @"\templates\Hivqual.xls";
// var repfile = path + @"\Excels\Hivqual.xls";
// Microsoft.Office.Interop.Excel.Workbook wb;
row = 5; col = 4;
// var app = new Excel.Application();
// File.Copy(templatefile, repfile, true);
// wb = app.Workbooks.Open(repfile);
_Hivqual = this.spreed.Document.Worksheets["VN"];
_Tracking = this.spreed.Document.Worksheets["Tracking"];
_Common = this.spreed.Document.Worksheets["Common"];
_Common.Cells[1, 1].Value = BeginDate;
_Common.Cells[1, 2].Value = EndDate;
Hivqual1(); Hivqual2(); Hivqual3(); Hivqual4(); Hivqual5(); Hivqual6(); Hivqual7(); Hivqual8(); Hivqual9(); Hivqual10();
string DateInfo = _Hivqual.Cells[3, 2].Value.ToString();
DateInfo = DateInfo.Replace("{startdate}", BeginDate.ToShortDateString());
DateInfo = DateInfo.Replace("{enddate}", EndDate.ToShortDateString());
_Hivqual.Cells[3, 2].Value = DateInfo;
// app.Visible = true;
}
#region "Hivqual"
private void Hivqual1()
{
/*Mẫu số: Lọc trong bảng tblPatient những bệnh nhân có DateofRegistration trong khoảng ngày báo cáo và loại trừ những bệnh nhân có DateofReferral!=nul.
Từ số: Trong bảng tblPreclicnic, lọc những bản ghi CD4 có ngày TestDate DateofRegistration <=15. Hoặc có ngày TestDate DateofRegistration >= -180.
Nhóm lại để lấy duy nhất nều tồn tại ở một bệnh nhân có 2 lần là CD4 thỏa mãn điều kiện trên.
*/
int numerator, denominator;
var thisPatients = new EntityCollection<TblPatientEntity>();
var tests = new EntityCollection<TblPreClinicsInfoEntity>();
adapter.FetchEntityCollection(thisPatients, null);
adapter.FetchEntityCollection(tests, null);
var thisBeginDate = this.BeginDate;
var thisEndDate = this.EndDate;
var dDominator = (from q in thisPatients where (q.DateofRegistration != null && q.DateofRegistration >= thisBeginDate && q.DateofRegistration <= thisEndDate.AddDays(-15) && q.Dateofreferral == null) select q).ToList();
var sDenominator = string.Join(",", dDominator.Select(m => m.PatientId).ToArray());
denominator = dDominator.Count;
var dNumerator = (from q in tests join p in dDominator on q.PatientId equals p.PatientId where (q.Testid == "01" && q.TestDate != null) select new { q.TestDate, p.DateofRegistration, q.PatientId, diff = ((TimeSpan)(q.TestDate - p.DateofRegistration)).TotalDays }).ToList().Where(s => s.diff <= 15 && s.diff >= -180).GroupBy(g => g.PatientId).Select(m => m.First().PatientId).ToList();
numerator = dNumerator.Count;
var sNumerator = string.Join(",", dNumerator.ToArray());
double result = denominator == 0 ? 0 : (double)numerator / (double)denominator;
_Hivqual.Cells[row, col].Value = result;
_Hivqual.Cells[row, col + 1].Value = denominator;
_Tracking.Cells[row, col + 1].Value = sDenominator; _Tracking.Cells[row, col].Value = sNumerator;
}
private void Hivqual2()
{
/* Tỷ lệe bệnh nhân chưa điều trị ARV tới tái khám định kỳ
* Mấu số: Lọc bệnh nhân trong bảng tblPatients thỏa mãn điều kiện có ngày DateofArv == null hoặc ngày DateofArv > EndDate. Và có ít nhất 1 ngày khám trong giai đoạn đánh giá.
Tử số: Lọc trong bảng tblExamination có ngày khám cuối trong giai đoạn đó ngày cuối giai đoạn đánh giá >= -90. . Nhóm lại nếu có nhiều bản ghi cho mỗi bệnh nhân để lấy bản ghi duy nhất.
*/
int numerator, denominator;
var thisPatients = new EntityCollection<TblPatientEntity>();
var exams = new EntityCollection<TblExaminationInfoEntity>();
adapter.FetchEntityCollection(thisPatients, null);
adapter.FetchEntityCollection(exams, null);
var thisBeginDate = this.BeginDate;
var thisEndDate = this.EndDate;
List<string> includes = (from q in exams
where (q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate)
group q by q.PatientId into g
select g.First().PatientId).ToList();
var dDenominator = (from q in thisPatients where ((q.DateofArv == null || q.DateofArv > thisEndDate) && includes.Contains(q.PatientId)) select q.PatientId).ToList();
denominator = dDenominator.Count;
var sDenominator = string.Join(",", dDenominator.ToArray());
var dNumerator = (from q in exams
where (dDenominator.Contains(q.PatientId) && ((TimeSpan)(q.ExamDate - thisEndDate)).TotalDays >= -90)
group q by q.PatientId
into g
select g.Last().PatientId).ToList();
var sNumerator = string.Join(",", dNumerator.ToArray());
numerator = dNumerator.Count;
double result = denominator == 0 ? 0 : (double)numerator / (double)denominator;
_Hivqual.Cells[row + 1, col].Value = result;
_Hivqual.Cells[row + 1, col + 1].Value = denominator;
_Tracking.Cells[row + 1, col + 1].Value = sDenominator; _Tracking.Cells[row + 1, col].Value = sNumerator;
}
private void Hivqual3()
{
/*Tỷ lệ bệnh nhân mới đăng ký tại PKNT đủ tiêu chuẩn dự phòng INH (IPT) được kê đơn dự phòng trong vòng 6 tháng qua
Mẫu số:
Bước 1: Lọc ra những BN có ngày đăng kí trong giai đoạn đánh giá và ngày chuyển tới = null.
Bước 2: Từ các BN ở bước 1, Lọc ra những BN ở lần khám cuối thỏa tất cả:
- Sàng lọc lao = “01”
- Kết quả sàng lọc = “01” (âm tính)
- Kết quả AST, ALT gần nhất nhưng phải nằm trong giai đoạn đánh giá < 200 (nếu ko có là ko thỏa). ALT< 200 và [(AST <200) hoặc (AST = null)]
- Không có rối loạn thần kinh ngoại biên
- Không có Vàng da, vàng mắt
- Tự khám
Tử số:
Lấy tất cả mẫu số, thỏa có INH (mã số 03) ở lần khám cuối (bảng tblTreatments).
*/
int numerator, denominator;
var thisPatients = new EntityCollection<TblPatientEntity>();
var exams = new EntityCollection<TblExaminationInfoEntity>();
var treatments = new EntityCollection<TblTreatmentInfoEntity>();
var tests = new EntityCollection<TblPreClinicsInfoEntity>();
adapter.FetchEntityCollection(thisPatients, null);
adapter.FetchEntityCollection(exams, null);
adapter.FetchEntityCollection(treatments, null);
adapter.FetchEntityCollection(tests, null);
var thisBeginDate = this.BeginDate;
var thisEndDate = this.EndDate;
List<string> includesPatient = (from q in thisPatients
where q.DateofRegistration >= thisBeginDate && q.DateofRegistration <= thisEndDate && q.Dateofreferral == null
select q.PatientId).ToList();
var examciriteria = (from q in exams where ( q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate && includesPatient.Contains(q.PatientId)) group q by q.PatientId into g select g.Last()).Where( q=>q.TbScreenResult == "01" && q.Jaundice == 0 && q.Blackouts==0 && q.NoSelfExam ==0).Select(p=>p.PatientId).ToList();
var altcriteria = (from q in tests where (examciriteria.Contains(q.PatientId) && q.Testid == "03" && q.TestDate >= thisBeginDate && q.TestDate <= thisEndDate) group q by q.PatientId into g select g.Last()).Where(p=>p.QuantityResult <200).Select(p=>new{p.PatientId}).ToList();
var astcriteria = (from q in tests where (examciriteria.Contains(q.PatientId) && q.Testid == "04" && q.TestDate >= thisBeginDate && q.TestDate <= thisEndDate) group q by q.PatientId into g select g.Last()).Select(p =>new{ p.PatientId, p.QualityResult}).ToList();
var tbTreatment = (from q in treatments where q.TreatmentId =="02"
select new
{
q.PatientId,
tbSdate = q.TreatmentSdate,
tbEdate = (q.TreatmentEdate == null) ? DateTime.Today.AddYears(100) : q.TreatmentEdate,
}).ToList();
var lastExams = exams.Where(q => q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate).OrderBy(q => q.PatientId).GroupBy(q => q.PatientId).Select(g => g.OrderBy(p=>p.ExamDate).Last()).ToList();
List<string> Excludes = (from p in tbTreatment join q in lastExams on p.PatientId equals q.PatientId select new { q.PatientId, q.ExamDate, p.tbSdate, p.tbEdate }).Where(q => q.ExamDate >= q.tbSdate && q.ExamDate <= q.tbEdate).GroupBy(q => q.PatientId).Select(g => g.Key).ToList();
// var denominatorset = (from q in tests where (examciriteria.Contains(q.PatientId) && q.Testid == "03" && (q.QuantityResult >= 200 || q.Testid == "04" && q.QuantityResult >= 200) && q.TestDate >= thisBeginDate && q.TestDate >= thisEndDate) group q by q.PatientId into g select g.First().PatientId).ToList();
var denominatorset = (from p in altcriteria join q in astcriteria on p.PatientId equals q.PatientId into g from m in g.DefaultIfEmpty() select new { p.PatientId, QuantityResult = m == null ? 0 : m.QualityResult }).Where(p => p.QuantityResult < 200 && !Excludes.Contains(p.PatientId)).Select(p => p.PatientId).ToList();
var sDenominator = string.Join(",", denominatorset.ToArray());
denominator = denominatorset.Count;
var numeratorset = (from q in treatments where (denominatorset.Contains(q.PatientId) && q.TreatmentSdate >= thisBeginDate && q.TreatmentSdate <= thisEndDate && q.TreatmentId == "03") group q by q.PatientId into p select p.Last().PatientId).ToList();
var sNumerator = string.Join(",", numeratorset.ToArray());
numerator = (from q in numeratorset where denominatorset.Contains(q) select q).Count();
double result = denominator == 0 ? 0 : (double)numerator / (double)denominator;
_Hivqual.Cells[row + 2, col].Value = result;
_Hivqual.Cells[row + 2, col + 1].Value = denominator;
_Tracking.Cells[row + 2, col + 1].Value = sDenominator; _Tracking.Cells[row + 2, col].Value = sNumerator;
}
private void Hivqual4()
{
/*
Tỷ lệ bệnh nhân ARV đến tái khám đúng hẹn trong lần khám gần nhất
Mẫu số: Lọc các bệnh nhân có ngày điều trị ARV < cuối giai đoạn đánh giá và có ngày tái khám trong khoảng giai đoạn đánh giá. Nhóm lại để lấy duy nhất nếu tồn tại BN có nhiều hơn 1 ngày khám trong giai đoạn đánh giá.
Tử số: lọc các bệnh án có ngày hẹn tái khám >cuối kì báo cáo và có Daydiff <= 1.
Lọc các bản ghi lần khám gần nhất của các bệnh nhân đang điều trị Arv có DayDiff <=1 để lấy làm tử số
*/
int numerator, denominator;
var thisPatients = new EntityCollection<TblPatientEntity>();
var exams = new EntityCollection<TblExaminationInfoEntity>();
adapter.FetchEntityCollection(thisPatients, null);
adapter.FetchEntityCollection(exams, null);
var thisBeginDate = this.BeginDate;
var thisEndDate = this.EndDate;
List<string> arvPatients =
thisPatients.Where(q => q.DateofArv != null && q.DateofArv <= thisEndDate).Select(q => q.PatientId).ToList();
List<string> dDenominator = exams.Where(m => m.ExamDate <= thisEndDate && m.ExamDate >= thisBeginDate && arvPatients.Contains(m.PatientId)).GroupBy(g => g.PatientId).Select(g => g.OrderBy(m => m.ExamDate).Last()).Where(m => m.EndExamDate == null || m.EndExamDate > thisEndDate || m.ReasonEnd =="10").Select(m => m.PatientId).ToList();
denominator = dDenominator.Count;
var dNumerator = (from q in exams where (q.ExamDate <= thisEndDate && dDenominator.Contains(q.PatientId)) group q by q.PatientId into p select p.Last()).Where(g => g.DayDiff <= 1).Where(p=>p.ReExamDate > thisEndDate).Select(m => m.PatientId).ToList();
numerator = dNumerator.Count;
var sDenominator = string.Join(",", dDenominator.ToArray());
var sNumerator = string.Join(",", dNumerator.ToArray());
double result = denominator == 0 ? 0 : (double)numerator / (double)denominator;
_Hivqual.Cells[row + 3, col].Value = result;
_Hivqual.Cells[row + 3, col + 1].Value = denominator;
_Tracking.Cells[row + 3, col + 1].Value = sDenominator; _Tracking.Cells[row + 3, col].Value = sNumerator;
}
private void Hivqual5()
{
/*
Tỷ lệ bệnh nhân được đánh giá TTĐT trong lần khám gần nhất
* Mẫu số:
- Ngày điều trị ARV != null và < ngày cuối giai đoạn đánh giá.
- Có ngày khám trong giai đoạn đánh giá
- Tự đến khám
- Loại BN có ngày khám cuối (trong giai đoạn đánh giá) trùng ngày khởi liều ARV
Tử số: Mẫu số + có biến TreatmentFollow!=null ở lần khám cuối trong giai đoạn đánh giá.
*/
int numerator = 0; int denominator = 0;
var thisPatients = new EntityCollection<TblPatientEntity>();
var exams = new EntityCollection<TblExaminationInfoEntity>();
adapter.FetchEntityCollection(thisPatients, null);
adapter.FetchEntityCollection(exams, null);
var thisBeginDate = this.BeginDate;
var thisEndDate = this.EndDate;
List<string> arvPatients =
thisPatients.Where(q => q.DateofArv != null && q.DateofArv <= thisEndDate).Select(q => q.PatientId).ToList();
var dDenominator = (from q in exams
where (arvPatients.Contains(q.PatientId) && q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate)
group q by q.PatientId
into g
select g.OrderBy(m => m.ExamDate).Last()).ToList()
.Where(m => m.NoSelfExam != 1)
.Select(m => m.PatientId)
.ToList();
denominator = dDenominator.Count;
var dNumerator = (from q in exams where (q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate && dDenominator.Contains(q.PatientId)) group q by q.PatientId into p select p.Last()).Where(g => g.TreatmentFollow != null).Select(m => m.PatientId).ToList();
numerator = dNumerator.Count;
var sDenominator = string.Join(",", dDenominator.ToArray());
var sNumerator = string.Join(",", dNumerator.ToArray());
double result = denominator == 0 ? 0 : (double)numerator / (double)denominator;
_Hivqual.Cells[row + 4, col].Value = result;
_Hivqual.Cells[row + 4, col + 1].Value = denominator;
_Tracking.Cells[row + 4, col + 1].Value = sDenominator; _Tracking.Cells[row + 4, col].Value = sNumerator;
}
private void Hivqual6()
{
/*
Tỷ lệ BN điều trị ARV được bắt đầu điều trị ARV trong vòng 15 ngày
Mẫu số:
- Bước 1: Lọc ra các bệnh nhân có ngày khởi liều ARV nằm trong giai đoạn đánh giá.
- Bước 2: Loại ra những bệnh nhân đã điều trị ARV chuyển tới
Tử số:
- Lấy mẫu số
- Lọc ra những bệnh nhân có ngày khởi liều ARV ngày đủ tiêu chuẩn <= 15 HOẶC ngày đủ tiêu chuẩn = null.
- Ngày đủ tiêu chuẩn = min (ngày có CD4 < 350 (ngày CD4 này phải lớn hơn ngày đăng ký), ngày khám có giai đoạn lâm sang 3 hoặc 4)
*/
int numerator, denominator;
var exams = new EntityCollection<TblExaminationInfoEntity>();
var tests = new EntityCollection<TblPreClinicsInfoEntity>();
var thisPatients = new EntityCollection<TblPatientEntity>();
var thisBeginDate = this.BeginDate;
var thisEndDate = this.EndDate;
adapter.FetchEntityCollection(thisPatients, null);
adapter.FetchEntityCollection(exams, null);
adapter.FetchEntityCollection(tests, null);
var arvPatients = thisPatients.Where(p => p.DateofArv >= thisBeginDate && p.DateofArv <= thisEndDate && p.HaveArvBefore != 1).ToList<TblPatientEntity>();
var arvTests = tests.Where(p => p.Testid == "01" && p.QuantityResult <= 350).GroupBy(p => p.PatientId).Select(g => g.OrderBy(p => p.TestDate).First()).ToList();
var arvClinics = exams.Where(p => p.ClinicStage >= 3).GroupBy(p => p.PatientId).Select(g => g.OrderBy(p => p.ExamDate).First()).ToList();
var preresult = (from q in arvPatients
join p in arvTests on q.PatientId equals p.PatientId into g
from m in g.DefaultIfEmpty()
select new
{
q.PatientId,
q.DateofArv,
TestDate = (m == null) ? DateTime.Today.AddYears(100) : m.TestDate,
Cd4Criteria = (m == null) ? false : true
}).ToList();
var postresult = (from q in preresult
join p in arvClinics on q.PatientId equals p.PatientId into g
from m in g.DefaultIfEmpty()
select new
{
q.PatientId,
q.DateofArv,
q.TestDate,
q.Cd4Criteria,
ClinicDate = (m == null) ? DateTime.Today.AddYears(100) : m.ExamDate,
ClinicStageCriteria = (m == null) ? false : true
}).ToList();
var dDenominator = postresult.Where(q=>q.ClinicStageCriteria || q.Cd4Criteria).Select(m => m.PatientId).ToList();
denominator = dDenominator.Count();
var dNumerator = (from q in postresult where ((q.ClinicStageCriteria || q.Cd4Criteria) && ((DateTime)q.DateofArv - (DateTime)(q.TestDate >= q.ClinicDate ? q.ClinicDate : q.TestDate)).Days <= 15) select q.PatientId).ToList();
numerator = dNumerator.Count;
var sDenominator = string.Join(",", dDenominator.ToArray());
var sNumerator = string.Join(",", dNumerator.ToArray());
double result = denominator == 0 ? 0 : (double)numerator / (double)denominator;
_Hivqual.Cells[row + 5, col].Value = result;
_Hivqual.Cells[row + 5, col + 1].Value = denominator;
_Tracking.Cells[row + 5, col + 1].Value = sDenominator; _Tracking.Cells[row + 5, col].Value = sNumerator;
}
private void Hivqual7()
{
/* Kết quả CD4 của bệnh nhân lúc bắt đầu điều trị ARV
Mẫu số:
- Lọc ra những bệnh nhân có ngày khởi liều ARV trong giai đoạn đánh giá.
- Loại những đồng chí chuyển tới đã điều trị ARV.
- Lọc những người được làm test CD4 có ngày làm test nhỏ hơn ngày Arv (lấy bản ghi đầu tiên của từng người). Counter ở đây được lấy làm mẫu
Chia các chỉ số Arv thành 4 khoảng < 100, 100-249, 250-349, > 350, tính counter cho các nhóm để làm tử số. Và turn ra 4 tỷ lệ % tương ứng với 4 nhóm. Vậy sẽ có 4 tỷ lệ
*/
int denominator;
var tests = new EntityCollection<TblPreClinicsInfoEntity>();
var thisPatients = new EntityCollection<TblPatientEntity>();
var thisBeginDate = this.BeginDate;
var thisEndDate = this.EndDate;
adapter.FetchEntityCollection(thisPatients, null);
adapter.FetchEntityCollection(tests, null);
var arvPatients = thisPatients.Where(p => p.DateofArv >= thisBeginDate && p.DateofArv <= thisEndDate && p.HaveArvBefore != 1).ToList<TblPatientEntity>();
var arvTests = tests.Where(p => p.Testid == "01").ToList();
var preresult = (from q in arvTests
join p in arvPatients on q.PatientId equals p.PatientId
where (q.TestDate <= p.DateofArv)
select new
{
q.PatientId,
q.QuantityResult,
q.TestDate
}).GroupBy(p => p.PatientId).Select(g => g.OrderBy(p=>p.TestDate).Last()).ToList();
var postresult = preresult.GroupBy(m => m.PatientId).Select(g => g.OrderBy(m => m.TestDate).Last()).ToList();
denominator = postresult.Count;
var sDenominator = string.Join(",", postresult.Select(m => m.PatientId).ToArray());
int g1 = 100;
int g2 = 250;
int g3 = 350;
var dD1 = postresult.Where(m => m.QuantityResult < g1).Select(m => m.PatientId).ToList();
int d1 = dD1.Count();
var sD1 = string.Join(",", dD1.ToArray());
var dD2 = postresult.Where(m => m.QuantityResult >= g1).Where(m => m.QuantityResult < g2).Select(m => m.PatientId).ToList();
int d2 = dD2.Count;
var sD2 = string.Join(",", dD2.ToArray());
var dD3 = postresult.Where(m => m.QuantityResult >= g2).Where(m => m.QuantityResult < g3).Select(m => m.PatientId).ToList();
int d3 = dD3.Count;
var sD3 = string.Join(",", dD3.ToArray());
var dD4 = postresult.Where(m => m.QuantityResult >= g3).Select(m => m.PatientId).ToList();
int d4 = dD4.Count;
var sD4 = string.Join(",", dD4.ToArray());
_Hivqual.Cells[row + 6, col].Value = denominator == 0 ? 0 : (double)d1 / (double)denominator; _Hivqual.Cells[row + 6, col + 1].Value = denominator;
_Tracking.Cells[row + 6, col + 1].Value = sDenominator; _Tracking.Cells[row + 6, col].Value = sD1;
_Hivqual.Cells[row + 7, col].Value = denominator == 0 ? 0 : (double)d2 / (double)denominator; _Hivqual.Cells[row + 7, col + 1].Value = denominator;
_Tracking.Cells[row + 7, col + 1].Value = sDenominator; _Tracking.Cells[row + 7, col].Value = sD2;
_Hivqual.Cells[row + 8, col].Value = denominator == 0 ? 0 : (double)d3 / (double)denominator; _Hivqual.Cells[row + 8, col + 1].Value = denominator;
_Tracking.Cells[row + 8, col + 1].Value = sDenominator; _Tracking.Cells[row + 8, col].Value = sD3;
_Hivqual.Cells[row + 9, col].Value = denominator == 0 ? 0 : (double)d4 / (double)denominator; _Hivqual.Cells[row + 9, col + 1].Value = denominator;
_Tracking.Cells[row + 9, col + 1].Value = sDenominator; _Tracking.Cells[row + 9, col].Value = sD4;
}
private void Hivqual8()
{
/*Tỷ lệ bệnh nhân được kê đơn dự phòng CTX hoặc DAPSONE khi đủ tiêu chuẩn trong lần khám gần nhất
Mẫu số:
- Có ngày khám trong giai đooi đánh giá
- Chọn lần khám cuối cùng trong giai đoạn đánh giá
- Lần khám cuối là tự đến
- Đủ tiêu chuẩn dự phòng CTX: tại lần khám cuối cùng (ở trên) có CD4 <=350 hoặc lầ nkhám cuối cùng (chọn ở trên) có giai đoạn lâm sang 3 hoặc 4.
Tử số:
- Mẫu số được điều trị CTX trong lần khám đó.
*/
int numerator, denominator;
var exams = new EntityCollection<TblExaminationInfoEntity>();
var tests = new EntityCollection<TblPreClinicsInfoEntity>();
var treatment = new EntityCollection<TblTreatmentInfoEntity>();
var thisPatients = new EntityCollection<TblPatientEntity>();
var thisBeginDate = this.BeginDate;
var thisEndDate = this.EndDate;
adapter.FetchEntityCollection(thisPatients, null);
adapter.FetchEntityCollection(exams, null);
adapter.FetchEntityCollection(tests, null);
adapter.FetchEntityCollection(treatment, null);
var exaPatients =
exams.Where(p => p.ExamDate >= thisBeginDate && p.ExamDate <= thisEndDate && p.NoSelfExam != 1)
.GroupBy(p => p.PatientId)
.Select(g => g.OrderBy(p => p.ExamDate).Last())
.ToList();
var arvTests = tests.Where(p => p.Testid == "01" && p.QuantityResult < 350 && p.TestDate <= thisEndDate && p.TestDate >= thisBeginDate).GroupBy(p => p.PatientId).Select(g => g.OrderBy(p => p.TestDate).Last()).ToList();
var arvClinics = exams.Where(p=>p.EndExamDate >=thisBeginDate && p.ExamDate <= thisEndDate).GroupBy(p => p.PatientId).Select(g => g.OrderBy(p => p.ExamDate).Last()).Where(p=>p.ClinicStage >=3).ToList();
var preresult = (from q in exaPatients
join p in arvTests on q.PatientId equals p.PatientId into g
from m in g.DefaultIfEmpty()
select new
{
q.PatientId,
TestDate = (m == null) ? DateTime.Today.AddYears(100) : m.TestDate,
Cd4Criteria = (m == null) ? false : true
}).ToList();
var postresult = (from q in preresult
join p in arvClinics on q.PatientId equals p.PatientId into g
from m in g.DefaultIfEmpty()
select new
{
q.PatientId,
q.TestDate,
q.Cd4Criteria,
ClinicDate = (m == null) ? DateTime.Today.AddYears(100) : m.ExamDate,
ClinicStageCriteria = (m == null) ? false : true
}).ToList();
var dDenominator = postresult.Where(m => m.Cd4Criteria || m.ClinicStageCriteria).Select(m => m.PatientId).ToList();
denominator = dDenominator.Count;
var lastExams = exams.Where(q => q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate).OrderBy(q => q.ExamDate).GroupBy(p => p.PatientId).Select(p => p.Last()).Select(p => new { p.PatientId, p.ExamDate }).ToList();
var critiera = (from q in postresult where (q.ClinicStageCriteria || q.Cd4Criteria) join g in lastExams on q.PatientId equals g.PatientId select new { q.PatientId, CriteriaDate=g.ExamDate }).ToList();
var dNumerator = (from q in treatment.Where(m=>m.TreatmentId =="04").Select(m=>new{m.PatientId,m.TreatmentSdate, TreatmentEdate = m.TreatmentEdate==null?DateTime.Today.AddYears(100):m.TreatmentEdate}).ToList() join p in critiera on q.PatientId equals p.PatientId where p.CriteriaDate >= q.TreatmentSdate && p.CriteriaDate <=q.TreatmentEdate orderby q.TreatmentSdate group q by q.PatientId into g select g.First()).ToList().Select(m => m.PatientId).ToList();
numerator = dNumerator.Count;
var sDenominator = string.Join(",", dDenominator.ToArray());
var sNumerator = string.Join(",", dNumerator.ToArray());
double result = denominator == 0 ? 0 : (double)numerator / (double)denominator;
_Hivqual.Cells[row + 10, col].Value = result;
_Hivqual.Cells[row + 10, col + 1].Value = denominator;
_Tracking.Cells[row + 10, col + 2].Value = sDenominator; _Tracking.Cells[row + 10, col].Value = sNumerator;
}
private void Hivqual9()
{
/*
Tỷ lệ bệnh nhân được sàng lọc Lao trong lần khám gần nhất
Lọc những bệnh nhân đi có khám lâm sàng trong khoảng báo cáo - làm mẫ sốu, ko tính các lần người nhà tới khám.
Lọc bản ghi khám cuối cùng của những bệnh nhân này trong khoảng báo cáo thỏa mãn TbScreen==1 làm tử
*/
int numerator, denominator;
var thisPatients = new EntityCollection<TblPatientEntity>();
var Treatments = new EntityCollection<TblTreatmentInfoEntity>();
var exams = new EntityCollection<TblExaminationInfoEntity>();
adapter.FetchEntityCollection(thisPatients, null);
adapter.FetchEntityCollection(exams, null);
adapter.FetchEntityCollection(Treatments , null);
var thisBeginDate = this.BeginDate;
var thisEndDate = this.EndDate;
// loại đi những nguoi dang dieu tri lao - ngay kham cuoi nam trong khoan dieu tri lao
var Tbs = Treatments.Where(m=>m.TreatmentId == "02").Select(m=>new{ m.PatientId, m.TreatmentSdate, TreatmentEDate = m.TreatmentEdate==null?DateTime.Today.AddYears(100):m.TreatmentEdate}).ToList();
var lastExams = exams.Where(p => p.ExamDate >= thisBeginDate && p.ExamDate <= thisEndDate).GroupBy(p => p.PatientId).Select(g => g.OrderBy(m => m.ExamDate).Last()).Where(m => m.NoSelfExam != 1 && m.IsClinic == 1).Select(m => new { m.PatientId, m.ExamDate, m.TbScreen }).ToList();
List<string> Excludes = Tbs.Join(lastExams, p => p.PatientId, q => q.PatientId, (p, q) => new { p.PatientId, q.ExamDate, p.TreatmentEDate, p.TreatmentSdate }).Where(m => m.ExamDate <= m.TreatmentEDate && m.ExamDate >= m.TreatmentSdate).GroupBy(p => p.PatientId).Select(g => g.Key).ToList();
var dDenominator = lastExams.Where(p => !Excludes.Contains(p.PatientId)).Select(p=>new{p.PatientId,p.TbScreen }).ToList();
denominator = dDenominator.Count;
var dNumerator = dDenominator.Where(m => m.TbScreen == 1).Select(m => m.PatientId).ToList();
numerator = dNumerator.Count;
var sDenominator = string.Join(",", dDenominator.Select(m=>m.PatientId).ToArray());
var sNumerator = string.Join(",", dNumerator.ToArray());
double result = denominator == 0 ? 0 : (double)numerator / (double)denominator;
_Hivqual.Cells[row + 11, col].Value = result;
_Hivqual.Cells[row + 11, col + 1].Value = denominator;
_Tracking.Cells[row + 11, col + 1].Value = sDenominator; _Tracking.Cells[row + 11, col].Value = sNumerator;
}
private void Hivqual10()
{
/*
Mẫu số: Có ít nhất 1 lần khám trong giai đoạn đánh giá.
- Loại các bệnh nhân chuyển đến trong giai đoạn đánh giá
- Loại các bệnh nhân có ngày đăng kí +15 >= ngày cuối giai đoạn đánh giá
Tử số:
Từ mẫu, lọc các bênh nhân có ít nhất 1 KQ CD4 nằm trong giai đoạn đánh giá
*/
int numerator, denominator;
var thisPatients = new EntityCollection<TblPatientEntity>();
var exams = new EntityCollection<TblExaminationInfoEntity>();
var tests = new EntityCollection<TblPreClinicsInfoEntity>();
adapter.FetchEntityCollection(thisPatients, null);
adapter.FetchEntityCollection(exams, null);
adapter.FetchEntityCollection(tests, null);
var thisBeginDate = this.BeginDate;
var thisEndDate = this.EndDate;
// một lần khám trong giai đoạn đánh giá, chuyển tới == null hoặc < begindate
var denominatorset = (from q in exams join p in thisPatients on q.PatientId equals p.PatientId where (!(p.Dateofreferral!=null && p.Dateofreferral >= thisBeginDate && p.Dateofreferral<=thisEndDate) && p.DateofRegistration.Value.AddDays(15) < thisEndDate && q.ExamDate >= thisBeginDate && q.ExamDate <= thisEndDate) group q by q.PatientId into g select g.First()).ToList();
denominator = denominatorset.Count;
var numeratorset = (from q in tests join p in denominatorset on q.PatientId equals p.PatientId where q.TestDate >= thisBeginDate && q.TestDate <= thisEndDate && q.Testid == "01" group q by q.PatientId into g select g.First()).ToList();
var sDenominator = string.Join(",", denominatorset.Select(m => m.PatientId).ToArray());
var sNumerator = string.Join(",", numeratorset.Select(m => m.PatientId).ToArray());
numerator = numeratorset.Count;
double result = denominator == 0 ? 0 : (double)numerator / (double)denominator;
_Hivqual.Cells[row + 12, col].Value = result;
_Hivqual.Cells[row + 12, col + 1].Value = denominator;
_Tracking.Cells[row + 12, col + 1].Value = sDenominator; _Tracking.Cells[row + 12, col].Value = sNumerator;
}
#endregion
}
}