#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 { public List GetItems() { throw new NotImplementedException(); } #region 个人 public EnrollmentPatient GetPatientInfo(Int64 eid) { return DAOHelp.GetDataBySQL($@"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.JobStatus, a.Tel1, a.CardNo, COALESCE(a.OrgName, a.Company) AS OrgName, COALESCE ( a.Nation, b.Nation ) AS Nation, c.DeptName, a.OID, a.OEID, a.PID, a.HazardFactors, a.WorkYears, a.JobTypes, a.HazardYears 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 GetRegItems(string begDate, string endDate, string name) { if (String.IsNullOrEmpty(name)) { return DAOHelp.GetDataBySQL($@"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($@"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 GetEFeeItem(Int64 Eid) { return DAOHelp.GetDataBySQL($@"EXEC sp_rpt_FeeItem {Eid}"); } // 根据体检号获取总结结论词报告 public List GetExamConclusions(Int64 Eid) { var data = DAOHelp.GetDataBySQL($"SELECT a.Conclusion, a.Suggestion, a.IsOccupational FROM Exam_Conclusion a WHERE a.EID = {Eid}"); //var data = DAOHelp.GetDataBySQL($"SELECT a.Conclusion, a.Suggestion, a.IsOccupational, b.FeeItemName FROM Exam_Conclusion a left join vi_FeeItem b on a.FID = b.ID and b.ItemClass = '检验' WHERE a.EID = {Eid}"); var items = data.Where(w => w.Suggestion != null).ToList(); //if (Global._hospital.Name == "芒市妇幼保健院") //{ // foreach (ExamConclusion item in items) // { // if (!string.IsNullOrEmpty(item.FeeItemName)) // item.FeeItemName += "(" + item.FeeItemName + ")"; // } //} return items; } // 根据体检号获取一般检查结果 public List GetGeneralResult(Int64 Eid) { var data = DAOHelp.GetDataBySQL($@"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(); 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 GetLisResult(Int64 Eid) { return DAOHelp.GetDataBySQL($@"EXEC sp_Rpt_Lis {Eid}"); } // 根据体检号获取PACS检查结果 public List GetPacsResult(Int64 Eid) { var data = DAOHelp.GetDataBySQL($@"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 GetPacsPhoto(Int64 Eid) { var pacs = DAOHelp.GetDataBySQL($"select ReportImage from Report where EID = { Eid } AND ReportImage IS NOT NULL"); var heart = DAOHelp.GetDataBySQL($"select ReportData AS ReportImage from Report_GSEXD where PatientNo = {Eid} AND ReportData IS NOT NULL"); 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 GetFastResult(Int64 Eid) { var items = DAOHelp.GetDataBySQL(@"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 GetReportExt(Int64 Eid) { return DAOHelp.GetDataBySQL($@"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); } // 科室小结 public List GetDeptSummary(Int64 EID) { return new TotalModel().GetSummary(EID); } #endregion 个人 #region 团体 //根据团体体检号获取收费列表 public List GetOrgFeeItem(Int64 oEid) { if (Global.UseGroupFeeItemsInTeamReport == "0") { return DAOHelp.GetDataBySQL(@"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"); } else { return DAOHelp.GetDataBySQL($@" SELECT DISTINCT A.FeeItemCode,FeeItemName,DeptName,CASE WHEN Sex = 1 THEN '男' ELSE '女' END AS ItemClass FROM Enrollment_OrgFeeItem A JOIN Enrollment_OrgGroup B ON A.GroupID=B.ID LEFT JOIN Dict_FeeItem C ON A.FID=C.ID WHERE OEID={oEid} and Sex<>3 and C.IsHide=0 ORDER BY ItemClass"); } } //根据体检号获取异常结果 public List GetOrgConclusions(Int64 oEid) { return DAOHelp.GetDataBySQL($@"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(LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(A.Suggestion,CHAR(09),''),CHAR(10),''),CHAR(13),''))), '') 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, LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(A.Suggestion,CHAR(09),''),CHAR(10),''),CHAR(13),''))) HAVING COUNT ( * ) != 0 ORDER BY SumWarn DESC"); } //根据体检号获取异常结果(无建议) public List GetOrgCon(Int64 oEid) { return DAOHelp.GetDataBySQL($@"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 GetPersonByDisease(Int64 oEid) { return DAOHelp.GetDataBySQL($@"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($@"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 GetExamAdvice(Int64 Eid) //{ // var data = DAOHelp.GetDataBySQL(@"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 GetWarnPersonItems(Int64 Eid) //{ // return DAOHelp.GetDataBySQL(@"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 团体 } }