551 lines
35 KiB
C#
551 lines
35 KiB
C#
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
|
||
}
|
||
|
||
|
||
|
||
}
|