体检系统架构
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

493 lines
30 KiB

#region CopyRight
/****************************************************************
* Project:健康体检信息管理系统(PEIS)
* Author:罗绍明
* CLR Version:4.0.30319.42000
* CreateTime:2023-05-01 14:54:23
* Version:v2.0
*
* Description:
*
* History:
*
*****************************************************************
* Copyright @ 云南新八达科技有限公司 2023 All rights reserved
*****************************************************************/
#endregion CopyRight
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using PdfiumViewer;
using PEIS.Entity;
using PEIS.Utils;
namespace PEIS.Model
{
public class ReportModel : IModel<string>
{
public List<string> GetItems()
{
throw new NotImplementedException();
}
#region 个人
public EnrollmentPatient GetPatientInfo(Int64 eid)
{
return DAOHelp.GetDataBySQL<EnrollmentPatient>($@"SELECT
a.Name,
a.Age,
a.AgeClass,
a.Sex,
a.ID,
a.SignTime,
a.Marriage,
a.GroupName,
a.Type,
a.Company,
a.Photo,
a.Finisher,
a.Photo,
a.FinishTime,
b.Birthday,
a.ExamDate,
a.Contactor1,
a.Contactor2,
a.Address1,
a.Tel1,
a.CardNo,
COALESCE(a.OrgName, a.Company) AS OrgName,
COALESCE ( a.Nation, b.Nation ) AS Nation,
c.DeptName
FROM
Enrollment_Patient a
LEFT JOIN Base_Patient b ON a.pid = b.id
LEFT JOIN Base_OrgPatient c ON c.PID = b.id AND a.OID = c.OID
WHERE a.ID = {eid}")?.FirstOrDefault();
}
// 获取以完结登记列表
public List<EnrollmentPatient> GetRegItems(string begDate, string endDate, string name)
{
if (String.IsNullOrEmpty(name))
{
return DAOHelp.GetDataBySQL<EnrollmentPatient>($@"SELECT ID,Name,CreateTime,SignTime,Sex,Age,AgeClass,
CASE WHEN PrintTime IS NULL THEN '未打印'
ELSE '已打印'
END AS PrinterCode,
CASE WHEN PrintTime IS NOT NULL AND LastPrintTime IS NOT NULL THEN LastPrintTime
ELSE PrintTime
END AS PrintTime,
CASE WHEN Printer IS NOT NULL AND LastPrinter IS NOT NULL THEN LastPrinter
ELSE Printer
END AS Printer
FROM Enrollment_Patient a WHERE CreateTime BETWEEN '{begDate}' AND DATEADD(day, 1, '{endDate}') AND FinishTime is not null");
}
else
{
return DAOHelp.GetDataBySQL<EnrollmentPatient>($@"SELECT ID,Name,CreateTime,SignTime,Sex,Age,AgeClass,
CASE WHEN PrintTime IS NULL THEN '未打印'
ELSE '已打印'
END AS PrinterCode,
CASE WHEN PrintTime IS NOT NULL AND LastPrintTime IS NOT NULL THEN LastPrintTime
ELSE PrintTime
END AS PrintTime,
CASE WHEN Printer IS NOT NULL AND LastPrinter IS NOT NULL THEN LastPrinter
ELSE Printer
END AS Printer
FROM Enrollment_Patient a WHERE (name like '%{name}%' or ID like '%{name}%' or SpellCode like '{name}%') AND FinishTime is not null");
}
}
// 根据体检号获取收费列表
public List<EnrollmentFeeItem> GetEFeeItem(Int64 Eid)
{
return DAOHelp.GetDataBySQL<EnrollmentFeeItem>($@"EXEC sp_rpt_FeeItem {Eid}");
}
// 根据体检号获取总结结论词报告
public List<ExamConclusion> GetExamConclusions(Int64 Eid)
{
var data = DAOHelp.GetDataBySQL<ExamConclusion>($"SELECT Conclusion,Suggestion FROM Exam_Conclusion WHERE EID = {Eid}");
var items = data.Where(w => w.Suggestion != null).ToList();
return items;
}
// 根据体检号获取一般检查结果
public List<ExamResult> GetGeneralResult(Int64 Eid)
{
var data = DAOHelp.GetDataBySQL<ExamResult>($@"EXEC sp_Rpt_Normal {Eid}");
var items = data.Select(s => new ExamResult()
{
DeptName = s.DeptName,
FeeItemName = s.FeeItemName,
RptItemName = s.RptItemName,
Summary = s.Summary,
Checker = s.Checker,
CheckTime = s.CheckTime,
TextResult = string.Join(",", data.Where(p => p.RID == s.RID).Select(e => e.TextResult).ToList()),
}).GroupBy(g => new { g.DeptName, g.FeeItemName, g.RptItemName, g.TextResult, g.Summary, g.Checker, g.CheckTime, g.RID }).Select(s => s.FirstOrDefault()).ToList();
var newData = new List<ExamResult>();
foreach (var group in items.GroupBy(g => g.DeptName).ToList())
{
foreach (var item in group)
{
newData.Add(item);
}
if (group.Count() % 2 == 1)
newData.Add(new ExamResult()
{
DeptName = group.FirstOrDefault().DeptName,
RptItemName = "",
TextResult = "",
Summary = group.FirstOrDefault().Summary,
Checker = group.FirstOrDefault().Checker,
CheckTime = group.FirstOrDefault().CheckTime
});
}
return newData;
}
// 根据体检号获取LIS检查结果
public List<ExamResult> GetLisResult(Int64 Eid)
{
return DAOHelp.GetDataBySQL<ExamResult>($@"EXEC sp_Rpt_Lis {Eid}");
}
// 根据体检号获取PACS检查结果
public List<ExamResult> GetPacsResult(Int64 Eid)
{
var data = DAOHelp.GetDataBySQL<ExamResult>($@"EXEC sp_Rpt_Pacs {Eid}");
return data.Select(s => new ExamResult()
{
DeptName = s.DeptName,
FeeItemName = s.FeeItemName,
Summary = s.Summary,
PImage = s.PImage,
Checker = s.Checker,
Reporter = s.Reporter,
ReportTime = s.ReportTime,
TextResult = s.FeeItemName == "十二通道心电图检查" ? string.Join("、", data.Where(w => w.FeeItemName == "十二通道心电图检查").Select(a => a.TextResult).ToList()) : s.TextResult.Replace("\r", Environment.NewLine)
}).ToList();
}
// pacs原始报告
public List<Report> GetPacsPhoto(Int64 Eid)
{
var pacs = DAOHelp.GetDataBySQL<Report>($"select ReportImage from Report where EID = { Eid } AND ReportImage IS NOT NULL ORDER BY Class");
var heart = DAOHelp.GetDataBySQL<Report>($"select ReportData AS ReportImage from Report_GSEXD where PatientNo = {Eid}");
if (heart.Count == 0)
{
return pacs;
}
try
{
using (MemoryStream memoryStream = new MemoryStream(heart[0].ReportImage))
{
if (ReportHelper.IsPdf(heart[0].ReportImage))
{
// PDF格式
using (PdfDocument pdfDocument = PdfDocument.Load(memoryStream))
{
for (int pageIndex = 0; pageIndex < pdfDocument.PageCount; pageIndex++)
{
using (Image bitmap = pdfDocument.Render(pageIndex, 2480, 3508, false))
{
using (MemoryStream stream = new MemoryStream())
{
bitmap.RotateFlip(RotateFlipType.Rotate270FlipNone);
bitmap.Save(stream, ImageFormat.Jpeg);
var img = stream.ToArray();
pacs.Add(new Report { ReportImage = img });
}
}
}
}
}
else
{
// 图片格式
Image bitmap = Image.FromStream(memoryStream);
using (MemoryStream stream = new MemoryStream())
{
bitmap.RotateFlip(RotateFlipType.Rotate270FlipNone);
bitmap.Save(stream, ImageFormat.Jpeg);
var img = stream.ToArray();
pacs.Add(new Report { ReportImage = img });
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(@"Error converting PDF to images: " + ex.Message);
}
return pacs;
}
// 快速体检
public List<ExamResult> GetFastResult(Int64 Eid)
{
var items = DAOHelp.GetDataBySQL<ExamResult>(@"SELECT
c.RptItemName,
c.TextResult,
c.Rid
FROM
Enrollment_FeeItem a
LEFT JOIN Exam_Part b ON a.DeptCode = b.DeptCode AND a.EID = b.EID AND b.GiveUpTime IS NULL
LEFT JOIN Exam_Result c ON c.PID = b.ID AND a.FID = c.FID " +
$"WHERE a.EID = {Eid}");
return items.Select(s => new ExamResult()
{
RptItemName = s.RptItemName,
RID = s.RID,
TextResult = string.Join("、", items.Where(p => p.RID == s.RID).Select(e => e.TextResult).ToList())
}).ToList();
}
//第三方报告
public List<ReportExt> GetReportExt(Int64 Eid)
{
return DAOHelp.GetDataBySQL<ReportExt>($@"select * from Report_Ext where EID = {Eid}");
}
// 更新打印时间
public void UpdatePrint(Int64 Eid)
{
DAOHelp.ExecuteSql($@"UPDATE Enrollment_Patient
SET
Printer = CASE WHEN PrintTime IS NULL THEN '{Global.currentUser.Name}' ELSE Printer END,
PrinterCode = CASE WHEN PrintTime IS NULL THEN '{Global.currentUser.Code}' ELSE PrinterCode END,
PrintTime = CASE WHEN PrintTime IS NULL THEN '{DateTime.Now}' ELSE PrintTime END,
LastPrinter = CASE WHEN PrintTime IS NOT NULL THEN '{Global.currentUser.Name}' ELSE LastPrinter END,
LastPrinterCode = CASE WHEN PrintTime IS NOT NULL THEN '{Global.currentUser.Code}' ELSE LastPrinterCode END,
LastPrintTime = CASE WHEN PrintTime IS NOT NULL THEN '{DateTime.Now}' ELSE LastPrintTime END
WHERE ID = {Eid}", false);
}
#endregion 个人
#region 团体
//根据团体体检号获取收费列表
public List<EnrollmentFeeItem> GetOrgFeeItem(Int64 oEid)
{
return DAOHelp.GetDataBySQL<EnrollmentFeeItem>(@"SELECT
DISTINCT
a.FeeItemName,
a.DeptName,
CASE WHEN b.Sex = 1 THEN '男'
ELSE '女'
END AS ItemClass
FROM Enrollment_FeeItem a
LEFT JOIN Enrollment_Patient b ON a.EID = b.ID " +
$"WHERE a.OEID = {oEid} ORDER BY ItemClass");
}
//根据体检号获取异常结果
public List<ExamConclusion> GetOrgConclusions(Int64 oEid)
{
return DAOHelp.GetDataBySQL<ExamConclusion>($@"DECLARE @SumPerson FLOAT
SELECT @SumPerson = COUNT ( * ) FROM Enrollment_Patient WHERE OEID = {oEid}
SELECT
A.Conclusion,
SUM ( CASE WHEN Age < 21 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleZTT,
SUM ( CASE WHEN Age < 21 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleZTT,
SUM ( CASE WHEN Age BETWEEN 21 AND 30 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleTTT,
SUM ( CASE WHEN Age BETWEEN 21 AND 30 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleTTT,
SUM ( CASE WHEN Age BETWEEN 31 AND 40 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleTTF,
SUM ( CASE WHEN Age BETWEEN 31 AND 40 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleTTF,
SUM ( CASE WHEN Age BETWEEN 41 AND 50 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleFTF,
SUM ( CASE WHEN Age BETWEEN 41 AND 50 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleFTF,
SUM ( CASE WHEN Age BETWEEN 51 AND 60 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleFTS,
SUM ( CASE WHEN Age BETWEEN 51 AND 60 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleFTS,
SUM ( CASE WHEN Age > 60 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleOver,
SUM ( CASE WHEN Age > 60 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleOver,
ROUND( SUM ( CASE Sex WHEN 1 THEN 1 ELSE 0 END ), 2 ) AS SumMale,
ROUND( SUM ( CASE Sex WHEN 1 THEN 1 ELSE 0 END ) * 100.0 /@SumPerson, 2 ) AS SumMalePercent,
ROUND( SUM ( CASE Sex WHEN 2 THEN 1 ELSE 0 END ), 2 ) AS SumFemale,
ROUND( SUM ( CASE Sex WHEN 2 THEN 1 ELSE 0 END ) * 100.0 /@SumPerson, 2 ) AS SumFemalePercent,
COUNT ( * ) AS SumWarn,
ROUND( COUNT ( * ) * 100.0 /@SumPerson, 2 ) AS SumWarnPercent,@SumPerson AS SumPerson,
ISNULL(A.Suggestion, '') AS Suggestion,
'已检出' AS ResultFlag
FROM
Exam_Conclusion A ( NOLOCK )
JOIN Enrollment_Patient B ( NOLOCK ) ON A.EID = B.ID
WHERE
B.OEID = {oEid}
GROUP BY
A.Conclusion,
A.Suggestion
HAVING
COUNT ( * ) != 0
ORDER BY SumWarn DESC");
}
//根据体检号获取异常结果(无建议)
public List<ExamConclusion> GetOrgCon(Int64 oEid)
{
return DAOHelp.GetDataBySQL<ExamConclusion>($@"DECLARE @SumPerson FLOAT
SELECT @SumPerson = COUNT ( * ) FROM Enrollment_Patient WHERE OEID = {oEid}
SELECT
A.Conclusion,
SUM ( CASE WHEN Age < 21 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleZTT,
SUM ( CASE WHEN Age < 21 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleZTT,
SUM ( CASE WHEN Age BETWEEN 21 AND 30 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleTTT,
SUM ( CASE WHEN Age BETWEEN 21 AND 30 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleTTT,
SUM ( CASE WHEN Age BETWEEN 31 AND 40 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleTTF,
SUM ( CASE WHEN Age BETWEEN 31 AND 40 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleTTF,
SUM ( CASE WHEN Age BETWEEN 41 AND 50 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleFTF,
SUM ( CASE WHEN Age BETWEEN 41 AND 50 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleFTF,
SUM ( CASE WHEN Age BETWEEN 51 AND 60 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleFTS,
SUM ( CASE WHEN Age BETWEEN 51 AND 60 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleFTS,
SUM ( CASE WHEN Age > 60 AND Sex = 1 THEN 1 ELSE 0 END ) AS MaleOver,
SUM ( CASE WHEN Age > 60 AND Sex = 2 THEN 1 ELSE 0 END ) AS FemaleOver,
ROUND( SUM ( CASE Sex WHEN 1 THEN 1 ELSE 0 END ), 2 ) AS SumMale,
ROUND( SUM ( CASE Sex WHEN 1 THEN 1 ELSE 0 END ) * 100.0 /@SumPerson, 2 ) AS SumMalePercent,
ROUND( SUM ( CASE Sex WHEN 2 THEN 1 ELSE 0 END ), 2 ) AS SumFemale,
ROUND( SUM ( CASE Sex WHEN 2 THEN 1 ELSE 0 END ) * 100.0 /@SumPerson, 2 ) AS SumFemalePercent,
COUNT ( * ) AS SumWarn,
ROUND( COUNT ( * ) * 100.0 /@SumPerson, 2 ) AS SumWarnPercent,@SumPerson AS SumPerson,
'已检出' AS ResultFlag
FROM
Exam_Conclusion A ( NOLOCK )
JOIN Enrollment_Patient B ( NOLOCK ) ON A.EID = B.ID
WHERE
B.OEID = {oEid}
GROUP BY
A.Conclusion
HAVING
COUNT ( * ) != 0
ORDER BY SumWarn DESC");
}
// 按疾病分类人员名单
public List<ExamConclusion> GetPersonByDisease(Int64 oEid)
{
return DAOHelp.GetDataBySQL<ExamConclusion>($@"SELECT
A.Conclusion,
B.Name AS PatientName,
CASE
B.Sex
WHEN 1 THEN
'男'
WHEN 2 THEN
'女' ELSE '未知'
END AS Sex,
C.Total AS SumPerson
FROM
Exam_Conclusion A ( NOLOCK )
JOIN Enrollment_Patient B ( NOLOCK ) ON A.EID = B.ID
JOIN (
SELECT
A.Conclusion,
COUNT ( * ) AS Total
FROM
Exam_Conclusion A ( NOLOCK )
JOIN Enrollment_Patient B ( NOLOCK ) ON A.EID = B.ID
WHERE
B.OEID = {oEid}
GROUP BY
A.Conclusion
) C ON C.Conclusion = A.Conclusion
WHERE
B.OEID = {oEid}
GROUP BY
A.Conclusion,
B.Name,
B.Sex,
C.Total");
}
// 获取团体体检基础统计信息
public ExamConclusion GetOrgSumInfo(Int64 oEid)
{
var items = DAOHelp.GetDataBySQL<ExamConclusion>($@"DECLARE @SumPerson FLOAT SELECT @SumPerson = COUNT ( * ) FROM Enrollment_Patient WHERE OEID = {oEid}
DECLARE @SumExamPerson FLOAT SELECT @SumExamPerson = COUNT ( * ) FROM Enrollment_Patient WHERE OEID = {oEid} and SignTime is not null
DECLARE @SumMale FLOAT SELECT @SumMale = COUNT ( * ) FROM Enrollment_Patient WHERE OEID = {oEid} AND Sex = 1 AND SignTime is not null
DECLARE @MaxAge FLOAT SELECT @MaxAge = MAX(age) FROM Enrollment_Patient WHERE OEID = {oEid} AND SignTime is not NULL
DECLARE @MinAge FLOAT SELECT @MinAge = MIN(age) FROM Enrollment_Patient WHERE OEID = {oEid} AND SignTime is not NULL
SELECT
@SumPerson AS SumPerson,
@SumExamPerson AS SumExamPerson,
ROUND( @SumExamPerson * 100.0 /@SumPerson, 2 ) AS ExamPercent,
@SumMale AS SumMale,
@SumPerson - @SumMale AS SumFemale,
@MaxAge AS MaxAge,
@MinAge AS MinAge");
return items.Count() > 0 ? items[0] : null;
}
// 健康建议
//public List<ExamConclusion> GetExamAdvice(Int64 Eid)
//{
// var data = DAOHelp.GetDataBySQL<ExamConclusion>(@"SELECT
// B.ID
// ,B.PatientName
// ,CASE C.Gender WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '未知' END AS Sex
// ,CONVERT(VARCHAR(20),B.Age) + B.AgeUnit AS Age
// ,B.OrgName
// ,A.Name AS Conclusion
// ,A.Suggestion
// FROM his.PEIS.dbo.ExamConclusion A (NOLOCK)
// JOIN his.PEIS.dbo.Enrollment B (NOLOCK) ON A.EnrollmentId = B.Id
// JOIN his.PEIS.dbo.Patient C (NOLOCK) ON B.PatientId = C.Id " + $"WHERE B.OrgEnrollmentId = {Eid} AND B.RemoveOperDate IS NULL " + @"GROUP BY
// A.Name,
// A.Suggestion,
// B.PatientName,
// B.Id,
// B.Age,
// B.AgeUnit,
// B.OrgName,
// C.Gender
// ORDER BY B.PatientName");
// return data.Select(s => new ExamConclusion()
// {
// ID = s.ID,
// PatientName = s.PatientName,
// Sex = s.Sex,
// Age = s.Age,
// OrgName = s.OrgName,
// Conclusion = string.Join(",", data.Where(p => p.ID == s.ID).Select(e => "【" + e.Conclusion + "】").ToList()),
// Suggestion = string.Join(@" ", data.Where(p => p.ID == s.ID).Select(e => "【" + e.Conclusion + "】:" + e.Suggestion).ToList())
// }).GroupBy(a => a.ID).Select(g => g.First()).ToList();
// ;
//}
//// 异常人员名单
//public List<EnrollmentPatient> GetWarnPersonItems(Int64 Eid)
//{
// return DAOHelp.GetDataBySQL<EnrollmentPatient>(@"SELECT DISTINCT
// A.EnrollmentId AS ID
// ,B.PatientName AS NAme
// ,CASE C.Gender WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '未知' END AS Sex
// ,CONVERT(VARCHAR(20),B.Age) + B.AgeUnit AS AgeClass
// ,CASE B.Marriage WHEN 1 THEN '未婚' WHEN 2 THEN '已婚' ELSE '未知' END AS Marriage
// FROM his.PEIS.dbo.ExamConclusion A (NOLOCK)
// JOIN his.PEIS.dbo.Enrollment B (NOLOCK) ON A.EnrollmentId = B.Id
// JOIN his.PEIS.dbo.Patient C (NOLOCK) ON B.PatientId = C.Id " + $"WHERE B.OrgEnrollmentId = {Eid} AND B.RemoveOperDate IS NULL ORDER BY ID");
//}
#endregion 团体 } }