From 886cf3245b1441f6542c7f5b008f32a9f6ceaa1e Mon Sep 17 00:00:00 2001 From: "DESKTOP-G961P6V\\Zhh" <839860190@qq.com> Date: Sun, 14 Apr 2024 23:42:58 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E5=B0=8F=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DiagnosisFunctions/DiagnosisBuilder.cs | 23 +- .../DiagnosisFunctionAppService.cs | 714 +++++++++++++++++- .../DoctorCheckDiagnosisInput.cs | 60 ++ .../PatientRegisterAppService.cs | 2 +- .../PrintReports/PrintReportAppService.cs | 12 +- .../ReferenceRanges/ReferenceRangeManager.cs | 9 +- .../SysParmValues/SysParmValueManager.cs | 11 +- .../PatientRegisterGuideReportRepository.cs | 24 +- .../DiagnosisFunctionAppServiceTest.cs | 525 +++++++++++-- 9 files changed, 1281 insertions(+), 99 deletions(-) create mode 100644 src/Shentun.Peis.Application/DiagnosisFunctions/DoctorCheckDiagnosisInput.cs diff --git a/src/Shentun.Peis.Application/DiagnosisFunctions/DiagnosisBuilder.cs b/src/Shentun.Peis.Application/DiagnosisFunctions/DiagnosisBuilder.cs index ee26726..5bfaa37 100644 --- a/src/Shentun.Peis.Application/DiagnosisFunctions/DiagnosisBuilder.cs +++ b/src/Shentun.Peis.Application/DiagnosisFunctions/DiagnosisBuilder.cs @@ -147,13 +147,9 @@ using Shentun.Peis.DiagnosisFunctions; /// public short? Age { get; set; } /// - /// 诊断项目ID + /// 项目 /// - public Guid ItemId { get; set; } - /// - /// 诊断项目名称 - /// - public List Items { get; set; } = new List(); + public ItemResultInput Item { get; set; } } /// @@ -189,4 +185,19 @@ using Shentun.Peis.DiagnosisFunctions; public string ItemName { get; set; } public string Result { get; set; } } + + public class DoctorCheckItemDiagnosisResult + { + public string ItemName { get; set;} + public List ItemDiagnosisTypeResults { get; set; } = new List(); + } + + public class ItemDiagnosisTypeResult + { + /// + /// 诊断类型0-通过计算函数,1-通过参考范围,2-通过模板 + /// + public char DiagnosisType { get; set; } + public List Diagnosis { get; set; } = new List(); + } } diff --git a/src/Shentun.Peis.Application/DiagnosisFunctions/DiagnosisFunctionAppService.cs b/src/Shentun.Peis.Application/DiagnosisFunctions/DiagnosisFunctionAppService.cs index 338636f..81ff487 100644 --- a/src/Shentun.Peis.Application/DiagnosisFunctions/DiagnosisFunctionAppService.cs +++ b/src/Shentun.Peis.Application/DiagnosisFunctions/DiagnosisFunctionAppService.cs @@ -1,19 +1,30 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.EntityFrameworkCore; using NPOI.DDF; +using NUglify.Helpers; using Shentun.Peis.Enums; using Shentun.Peis.Models; +using Shentun.Peis.Sexs; +using Shentun.Peis.SumDiagnosises; +using Shentun.Peis.SysParmValues; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; +using TencentCloud.Cdn.V20180606.Models; +using TencentCloud.Pts.V20210728.Models; using Volo.Abp; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; using Volo.Abp.Uow; +using Xceed.Document.NET; +using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace Shentun.Peis.DiagnosisFunctions @@ -34,7 +45,14 @@ namespace Shentun.Peis.DiagnosisFunctions private readonly IRepository _itemResultMatchRepository; private readonly IRepository _suggestionRepository; private readonly CacheService _cacheService; - + private SysParmValueManager _sysParmValueManager; + private string _isAddAbnormalResult; + private string _isAddReferenceRange; + private string _isAutoAddSuffix; + private string _lowerSuffix; + private string _highSuffix; + string[] _numArry = { "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩", + "⑪", "⑫", "⑬", "⑭", "⑮", "⑯", "⑰", "⑱", "⑲", "⑳" }; public DiagnosisFunctionAppService( IRepository patientRegisterRepository, IRepository registerAsbitemRepository, @@ -47,8 +65,9 @@ namespace Shentun.Peis.DiagnosisFunctions IRepository itemResultTemplateRepository, IRepository itemResultMatchRepository, IRepository suggestionRepository, - CacheService cacheService) - + CacheService cacheService, + SysParmValueManager sysParmValueManager) + { this._patientRegisterRepository = patientRegisterRepository; this._registerAsbitemRepository = registerAsbitemRepository; @@ -62,6 +81,8 @@ namespace Shentun.Peis.DiagnosisFunctions this._itemResultMatchRepository = itemResultMatchRepository; this._suggestionRepository = suggestionRepository; _cacheService = cacheService; + _sysParmValueManager = sysParmValueManager; + } @@ -228,7 +249,7 @@ namespace Shentun.Peis.DiagnosisFunctions List diagnosisTrips = new List(); //异常提示 - if (query.Count > 0) + if (query.Count() > 0) { @@ -340,7 +361,671 @@ namespace Shentun.Peis.DiagnosisFunctions } } + public async Task GetDiagnosisResultAsync2(GetDiagnosisResultRequestDto input) + { + var reslist = new List(); + var suggestionlist = new List(); + + + //根据检查单ID查询 + var query = (from registerCheck in await _registerCheckRepository.GetQueryableAsync() + join registerAsbitem in await _registerAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerAsbitem.RegisterCheckId + join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckItem.RegisterCheckId + join asbitem in await _asbitemRepository.GetQueryableAsync() on registerAsbitem.AsbitemId equals asbitem.Id + join item in (await _itemRepository.GetQueryableAsync()).Include(x => x.ReferenceRanges).Include(x => x.ItemResultMatches).Include(x => x.ItemResultTemplates) + on registerCheckItem.ItemId equals item.Id + join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on registerCheck.PatientRegisterId equals patientRegister.Id + where registerCheck.Id == input.RegisterCheckId + select new { registerCheck, registerAsbitem, registerCheckItem, asbitem, item, patientRegister }).ToList(); + + var resultDto = new GetDiagnosisResultDto + { + DiagnosisResultDetails = reslist, + DiagnosisSuggestionDetails = suggestionlist, + }; + if (query.Count() == 0) + { + return resultDto; + } + await LoadSysParm(query[0].patientRegister.MedicalCenterId); + /*处理逻辑: + * 1、处理组合项目诊断函数,如果继续处理走下一步,只处理不合并组合项目的,合并组合项目的不支持 + * 2、处理项目诊断函数,如果继续处理走下一步 + * 3、如果是数字型结果,并且有参考范围则处理数字型参考范围,处理完毕后后续几步不处理 + * 4、如果是字符型结果则从结果模板和结果匹配中去找到对应的诊断,如果都没有生成诊断,则根据结果直接生成诊断 + * 5、如果没有诊断,返回组合项目默认结果 + * */ + //设置基本参数 + var doctorCheckDiagnosisInput = new DoctorCheckDiagnosisInput() + { + SexId = query[0].patientRegister.SexId, + SexName = _cacheService.GetSexNameAsync(query[0].patientRegister.SexId).Result, + Age = query[0].patientRegister.Age + }; + foreach (var item in query) + { + if (doctorCheckDiagnosisInput.Asbitems.Where(o => o.AsbitemId == item.asbitem.Id).Count() == 0) + { + var asbitemInput = new AsbitemInput() + { + AsbitemId = item.asbitem.Id, + AsbitemName = item.asbitem.DisplayName, + IsDiagnosisFunction = item.asbitem.IsDiagnosisFunction, + DiagnosisFunction = item.asbitem.DiagnosisFunction, + IsContinueProcess = item.asbitem.IsContinueProcess, + DefaultResult = item.asbitem.DefaultResult, + }; + doctorCheckDiagnosisInput.Asbitems.Add(asbitemInput); + } + + if (doctorCheckDiagnosisInput.Items.Where(o => o.ItemId == item.item.Id).Count() == 0) + { + var inputItem = input.Items.Where(o => o.ItemId == item.item.Id).FirstOrDefault(); + var inputResult = ""; + if(inputItem != null) + { + inputResult = inputItem.Result; + } + var itemInput = new ItemInput() + { + ItemId = item.item.Id, + ItemName = item.item.DisplayName, + IsDiagnosisFunction = item.item.IsDiagnosisFunction, + DiagnosisFunction = item.item.DiagnosisFunction, + IsContinueProcess = item.item.IsContinueProcess, + IsNameIntoSummary = item.item.IsNameIntoSummary, + IsProduceSummary = item.item.IsProduceSummary, + ReferenceRangeTypeFlag = item.item.ReferenceRangeTypeFlag, + DefaultResult = item.item.DefaultResult, + Result = inputResult, + DisplayOrder = item.item.DisplayOrder, + ItemResultMatches = item.item.ItemResultMatches.ToList(), + ItemResultTemplates = item.item.ItemResultTemplates.ToList(), + ReferenceRanges = item.item.ReferenceRanges.ToList() + }; + doctorCheckDiagnosisInput.Items.Add(itemInput); + } + } + doctorCheckDiagnosisInput.Items = doctorCheckDiagnosisInput.Items.OrderBy(o=>o.DisplayOrder).ToList(); + + //处理组合项目诊断函数 + List diagnosisList = new List(); + List asbitemDiagnosisList; + var isContinueProcess = GetAsbitemDiagnosisByFunction(doctorCheckDiagnosisInput, out asbitemDiagnosisList); + diagnosisList.AddRange(asbitemDiagnosisList); + if (isContinueProcess) + { + //处理项目诊断 + var itemDiagnosisList = await GetItemDiagnosis(doctorCheckDiagnosisInput); + var itemDiagnosisStringList = GetItemDiagnosisStringList(itemDiagnosisList); + diagnosisList.AddRange(itemDiagnosisStringList); + + } + //设置返回值 + //去掉空结果数据 + diagnosisList = diagnosisList.Where(o => !string.IsNullOrWhiteSpace(o)).ToList(); + //去掉重复结果数据 + diagnosisList = diagnosisList.Distinct().ToList(); + if (!diagnosisList.Any()) + { + //设置组合项目默认小结 + diagnosisList.Add(doctorCheckDiagnosisInput.Asbitems[0].DefaultResult); + } + foreach(var diagnosis in diagnosisList) + { + var getDiagnosisResult_Detail = new GetDiagnosisResult_Detail() + { + DiagnosisResult = diagnosis + }; + resultDto.DiagnosisResultDetails.Add(getDiagnosisResult_Detail); + } + return resultDto; + + } + private List GetItemDiagnosisStringList(List itemDiagnosisList) + { + var diagnosisList = new List(); + foreach (var itemDiagnosis in itemDiagnosisList) + { + if (!itemDiagnosis.ItemDiagnosisTypeResults.Any()) + { + continue; + } + + string diagnosis = ""; + foreach (var itemDiagnosisType in itemDiagnosis.ItemDiagnosisTypeResults) + { + if (itemDiagnosisType.DiagnosisType == '1') + { + //数字型检验参考范围 + diagnosisList.AddRange(itemDiagnosisType.Diagnosis); + } + else + { + if (itemDiagnosisType.Diagnosis.Count() > _numArry.Count()) + { + throw new UserFriendlyException($"诊断数量超过{_numArry.Count()}个,不支持"); + } + if (itemDiagnosisType.Diagnosis.Count() == 0) + { + continue; + } + + for (int i = 0; i < itemDiagnosisType.Diagnosis.Count(); i++) + { + if (string.IsNullOrWhiteSpace(itemDiagnosisType.Diagnosis[i])) + { + continue; + } + diagnosis = diagnosis + _numArry[i] + itemDiagnosisType.Diagnosis[i] + ";"; + } + } + } + + if (!string.IsNullOrWhiteSpace(diagnosis)) + { + diagnosis = itemDiagnosis.ItemName + ";" + diagnosis; + diagnosisList.Add(diagnosis); + } + + } + + return diagnosisList; + } + + /// + /// 加载系统参数 + /// + /// + /// + private async Task LoadSysParm(Guid medicalCenterId) + { + _isAddAbnormalResult = await _sysParmValueManager.GetSysParmValueInMedicalCenterId( + medicalCenterId, "doctor_check_lis_summary_mode_add_abnormal_result"); + _isAddReferenceRange = await _sysParmValueManager.GetSysParmValueInMedicalCenterId( + medicalCenterId, "doctor_check_lis_summary_mode_add_reference_range"); + _isAutoAddSuffix = await _sysParmValueManager.GetSysParmValueInMedicalCenterId( + medicalCenterId, "doctor_check_lis_summary_mode_auto_add_suffix"); + _lowerSuffix = await _sysParmValueManager.GetSysParmValueInMedicalCenterId( + medicalCenterId, "doctor_check_lis_summary_mode_lower_suffix"); + _highSuffix = await _sysParmValueManager.GetSysParmValueInMedicalCenterId( + medicalCenterId, "doctor_check_lis_summary_mode_high_suffix"); + } + /// + /// 获取组合项目诊断通过诊断函数 + /// + /// + /// + /// + private bool GetAsbitemDiagnosisByFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, out List diagnosisList) + { + var patientAsbitemDiagnosisInput = new PatientAsbitemDiagnosisInput() + { + SexName = doctorCheckDiagnosisInput.SexName, + Age = doctorCheckDiagnosisInput.Age + }; + + foreach (var item in doctorCheckDiagnosisInput.Items) + { + var itemResult = new ItemResultInput() + { + ItemId = item.ItemId, + ItemName = item.ItemName, + Result = item.Result + }; + patientAsbitemDiagnosisInput.Items.Add(itemResult); + } + var diagnosisBuilder = new DiagnosisBuilder(); + diagnosisList = new List(); + bool isContinueProcess = true; + foreach (var asbitem in doctorCheckDiagnosisInput.Asbitems) + { + if (asbitem.IsDiagnosisFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.DiagnosisFunction)) + { + var diagnosis = diagnosisBuilder.GetAsbitemDiagnosisResult(patientAsbitemDiagnosisInput, asbitem.DiagnosisFunction); + diagnosisList.Add(diagnosis); + if (asbitem.IsContinueProcess != 'Y') + { + //有一个不允许继续处理,则不允许继续处理 + isContinueProcess = false; + } + } + } + return isContinueProcess; + + } + /// + /// 获取项目诊断 + /// + /// + /// + private async Task> GetItemDiagnosis(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput) + { + var patientItemDiagnosisInput = new PatientItemDiagnosisInput() + { + SexName = doctorCheckDiagnosisInput.SexName, + Age = doctorCheckDiagnosisInput.Age + }; + + var diagnosisBuilder = new DiagnosisBuilder(); + var diagnosisList = new List(); + foreach (var item in doctorCheckDiagnosisInput.Items) + { + + if (string.IsNullOrWhiteSpace(item.Result)) + { + continue; + } + if (string.IsNullOrWhiteSpace(item.DefaultResult) && item.Result == item.DefaultResult) + { + continue; + } + if (item.IsProduceSummary != 'Y') + { + continue; + } + + var doctorCheckItemDiagnosisResult = new DoctorCheckItemDiagnosisResult() + { + ItemName = item.ItemName, + }; + diagnosisList.Add(doctorCheckItemDiagnosisResult); + if (item.IsDiagnosisFunction == 'Y' && !string.IsNullOrWhiteSpace(item.DiagnosisFunction)) + { + var itemResult = new ItemResultInput() + { + ItemId = item.ItemId, + ItemName = item.ItemName, + Result = item.Result + }; + patientItemDiagnosisInput.Item = itemResult; + + //通过计算获取诊断 + var diagnosis = diagnosisBuilder.GetItemDiagnosisResult(patientItemDiagnosisInput, item.DiagnosisFunction); + + var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult() + { + DiagnosisType = '0' + }; + itemDiagnosisTypeResult.Diagnosis.Add(diagnosis); + doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult); + + + } + if (item.IsDiagnosisFunction == 'Y' && item.IsContinueProcess != 'Y') + { + continue; + } + //通过参考范围获取诊断 + if(item.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number) + { + var referenceRangeDiagnosis = await GetItemDiagnosisByReferenceRanges(doctorCheckDiagnosisInput.SexId, doctorCheckDiagnosisInput.Age, item); + if (!string.IsNullOrWhiteSpace(referenceRangeDiagnosis)) + { + var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult() + { + DiagnosisType = '1' + }; + itemDiagnosisTypeResult.Diagnosis.Add(referenceRangeDiagnosis); + doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult); + } + } + else + { + + //通过结果模板获取诊断 + var templateList = await GetItemDiagnosisByTemplate(item); + var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult() + { + DiagnosisType = '2' + }; + + itemDiagnosisTypeResult.Diagnosis.AddRange(templateList); + //通过匹配关系获取诊断 + var matcheList = await GetItemDiagnosisByMatche(item); + itemDiagnosisTypeResult.Diagnosis.AddRange(matcheList); + if (!templateList.Any() && !matcheList.Any()) + { + //获取异常结果 + itemDiagnosisTypeResult.Diagnosis.Add(item.Result); + + } + //去掉重复诊断 + itemDiagnosisTypeResult.Diagnosis = itemDiagnosisTypeResult.Diagnosis.Distinct().ToList(); + doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult); + + + } + + } + return diagnosisList; + + } + /// + /// 通过参考范围获取项目诊断列表 + /// + /// + /// + /// + /// + private async Task GetItemDiagnosisByReferenceRanges(char sexId, short? age, ItemInput itemInput) + { + var diagnosisList = new List(); + if (string.IsNullOrWhiteSpace(itemInput.Result)) + { + return null; + } + decimal resultDecimal; + if (!decimal.TryParse(itemInput.Result, out resultDecimal)) + { + return null; + } + var referenceRangeList = itemInput.ReferenceRanges.Where(o => o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).ToList(); + if (!referenceRangeList.Any()) + { + return null; + } + if (age == null) + { + age = 30; + } + var referenceRange = referenceRangeList.Where(o => o.ForSexId == sexId && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit).FirstOrDefault(); + if (referenceRange == null) + { + referenceRange = referenceRangeList.Where(o => o.ForSexId == ForSexFlag.All && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit).FirstOrDefault(); + if (referenceRange == null) + { + return null; + } + } + string lowReferenceRangeValueStr; + string hegihtReferenceRangeValueStr; + decimal lowReferenceRangeValue; + decimal hegihtReferenceRangeValue; + string diagnosis = null; + var pos = referenceRange.ReferenceRangeValue.IndexOf("-"); + if (pos > 0) + { + //参考范围形式:10-30 + lowReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(0, pos); + hegihtReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(pos + 1); + if (!decimal.TryParse(lowReferenceRangeValueStr, out lowReferenceRangeValue)) + { + return null; + } + if (!decimal.TryParse(hegihtReferenceRangeValueStr, out hegihtReferenceRangeValue)) + { + return null; + } + if (resultDecimal < lowReferenceRangeValue) + { + diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, true, referenceRange); + } + else if (resultDecimal > hegihtReferenceRangeValue) + { + diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, false, referenceRange); + } + + return diagnosis; + } + + pos = referenceRange.ReferenceRangeValue.IndexOf(">="); + var charLength = ">=".Length; + if (pos == 0) + { + pos = referenceRange.ReferenceRangeValue.IndexOf("≥"); + charLength = "≥".Length; + if (pos == 0) + { + pos = referenceRange.ReferenceRangeValue.IndexOf("≧"); + charLength = "≧".Length; + } + } + if (pos > 0) + { + //参考范围形式:>= + lowReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(pos + charLength); + + if (!decimal.TryParse(lowReferenceRangeValueStr, out lowReferenceRangeValue)) + { + return null; + } + if (resultDecimal < lowReferenceRangeValue) + { + diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, true, referenceRange); + } + return diagnosis; + } + + pos = referenceRange.ReferenceRangeValue.IndexOf(">"); + charLength = ">".Length; + if (pos > 0) + { + //参考范围形式:> + lowReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(pos + charLength); + + if (!decimal.TryParse(lowReferenceRangeValueStr, out lowReferenceRangeValue)) + { + return null; + } + if (resultDecimal <= lowReferenceRangeValue) + { + diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, true, referenceRange); + } + return diagnosis; + } + + pos = referenceRange.ReferenceRangeValue.IndexOf("<="); + charLength = "<=".Length; + if (pos == 0) + { + pos = referenceRange.ReferenceRangeValue.IndexOf("≤"); + charLength = "≤".Length; + if (pos == 0) + { + pos = referenceRange.ReferenceRangeValue.IndexOf("≦"); + charLength = "≦".Length; + } + } + if (pos > 0) + { + //参考范围形式:<= + hegihtReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(pos + charLength); + + if (!decimal.TryParse(hegihtReferenceRangeValueStr, out hegihtReferenceRangeValue)) + { + return null; + } + if (resultDecimal >= hegihtReferenceRangeValue) + { + diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, false, referenceRange); + } + return diagnosis; + } + pos = referenceRange.ReferenceRangeValue.IndexOf("<"); + charLength = "<".Length; + if (pos > 0) + { + //参考范围形式:< + hegihtReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(pos + charLength); + + if (!decimal.TryParse(hegihtReferenceRangeValueStr, out hegihtReferenceRangeValue)) + { + return null; + } + if (resultDecimal >= hegihtReferenceRangeValue) + { + diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, false, referenceRange); + } + return diagnosis; + } + return diagnosis; + } + + + private async Task GetNumberDiagnosis(string itemName, string result, bool isLower, + ReferenceRange referenceRange) + { + string diagnosis = null; + if (isLower) + { + if (referenceRange.LowerDiagnosisId != null && referenceRange.LowerDiagnosisId != Guid.Empty) + { + var diagnosisEntity = await _diagnosisRepository.FindAsync(o => o.Id == referenceRange.LowerDiagnosisId); + if (diagnosisEntity != null) + { + diagnosis = diagnosisEntity.DisplayName + "↓"; + } + else + { + if (_isAutoAddSuffix == "Y") + { + diagnosis = itemName + _lowerSuffix + "↓"; + } + } + + } + else + { + if (_isAutoAddSuffix == "Y") + { + diagnosis = itemName + _lowerSuffix + "↓"; + } + } + } + else + { + if (referenceRange.UpperDiagnosisId != null && referenceRange.UpperDiagnosisId != Guid.Empty) + { + var diagnosisEntity = await _diagnosisRepository.FindAsync(o => o.Id == referenceRange.UpperDiagnosisId); + if (diagnosisEntity != null) + { + diagnosis = diagnosisEntity.DisplayName + "↑"; + } + else + { + if (_isAutoAddSuffix == "Y") + { + diagnosis = itemName + _highSuffix + "↑"; + } + } + + } + else + { + if (_isAutoAddSuffix == "Y") + { + diagnosis = itemName + _highSuffix + "↑"; + } + } + } + if (!string.IsNullOrWhiteSpace(diagnosis)) + { + if (_isAddAbnormalResult == "Y") + { + diagnosis = diagnosis + "(结果:" + result + ",参考范围:" + referenceRange.ReferenceRangeValue + ")"; + } + } + return diagnosis; + } + + /// + /// 通过模板获取诊断 + /// + /// + /// + private async Task> GetItemDiagnosisByTemplate(ItemInput itemInput) + { + List diagnosisList = new List(); + //将结果解析到数组中 + string[] resultArry = GetResultArry(itemInput.Result); + //结果模板中的结果去掉数字,* /等符号 + foreach (var template in itemInput.ItemResultTemplates) + { + if (!string.IsNullOrWhiteSpace(template.Result)) + { + + template.Result = Regex.Replace(template.Result, @"\d+", "").Replace("*", "").Replace("/", "").Replace(" ", ""); + } + } + foreach (var resultSplit in resultArry) + { + if (string.IsNullOrWhiteSpace(resultSplit) || resultSplit.StartsWith("余未见异常")) + { + continue; + } + var templatesList = itemInput.ItemResultTemplates.Where(o => o.Result == resultSplit && o.IsResultIntoSummary == 'Y').ToList(); + foreach (var template in templatesList) + { + if (template != null && template.DiagnosisId != null && template.DiagnosisId != Guid.Empty) + { + var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == template.DiagnosisId); + if (temp_diagnosis != null) + { + diagnosisList.Add(temp_diagnosis.DisplayName); + } + } + else + { + diagnosisList.Add(resultSplit); + } + } + } + + + return diagnosisList.Distinct().ToList(); + } + /// + /// 获取项目诊断通过匹配关系 + /// + /// + /// + private async Task> GetItemDiagnosisByMatche(ItemInput itemInput) + { + List diagnosisList = new List(); + //将结果解析到数组中 + string[] resultArry = GetResultArry(itemInput.Result); + + foreach (var resultSplit in resultArry) + { + if (string.IsNullOrWhiteSpace(resultSplit) || resultSplit.StartsWith("余未见异常")) + { + continue; + } + var templatesList = itemInput.ItemResultMatches.Where(o => resultSplit.Contains(o.Result)).ToList(); + foreach (var template in templatesList) + { + if (template != null && template.DiagnosisId != Guid.Empty) + { + var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == template.DiagnosisId); + if (temp_diagnosis != null) + { + diagnosisList.Add(temp_diagnosis.DisplayName); + } + } + } + } + + + return diagnosisList.Distinct().ToList(); + } + /// + /// 去掉结果中的数字符号和分号 + /// + /// + /// + private string[] GetResultArry(string result) + { + result = result.Trim().Replace(";", ";"); + foreach (var num in _numArry) + { + result = result.Replace(num, ""); + } + //将结果通过英文;解析到数组中 + string[] resultArry = result.Split(";"); + return resultArry; + } #region 执行项目计算函数 /// @@ -351,20 +1036,20 @@ namespace Shentun.Peis.DiagnosisFunctions [HttpPost("api/app/diagnosisfunction/getcalculationfunctionresult")] public async Task GetCalculationFunctionResultAsync(GetDiagnosisResultRequestDto input) { - await GetCalculationFunctionAsync(input); + await GetItemResultByCalculationFunctionAsync(input); return input; } - private async Task GetCalculationFunctionAsync(GetDiagnosisResultRequestDto input) + private async Task GetItemResultByCalculationFunctionAsync(GetDiagnosisResultRequestDto input) { //根据检查单ID查询 var list = ( from patientRegister in await _patientRegisterRepository.GetQueryableAsync() join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId - join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync() + join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckItem.RegisterCheckId - join item in await _itemRepository.GetQueryableAsync() + join item in await _itemRepository.GetQueryableAsync() on registerCheckItem.ItemId equals item.Id where registerCheck.Id == input.RegisterCheckId select new @@ -397,11 +1082,11 @@ namespace Shentun.Peis.DiagnosisFunctions { //计算函数 //计算结果 - + string CalculationFunctionValue = diagnosisBuilder.GetItemCalculateResult(patientItemCalculateInput, item.Item.CalculationFunction); //CalculationFunctionValue = GetCodeResult(input, item.CalculationFunction, list); - input.Items.Where(m => m.ItemId == item.Id).FirstOrDefault().Result = CalculationFunctionValue; //赋值 + input.Items.Where(m => m.ItemId == item.Item.Id).FirstOrDefault().Result = CalculationFunctionValue; //赋值 } } @@ -886,12 +1571,7 @@ namespace Shentun.Peis.DiagnosisFunctions return tempcode; } - - } - - - - -} + } +} \ No newline at end of file diff --git a/src/Shentun.Peis.Application/DiagnosisFunctions/DoctorCheckDiagnosisInput.cs b/src/Shentun.Peis.Application/DiagnosisFunctions/DoctorCheckDiagnosisInput.cs new file mode 100644 index 0000000..54b2b68 --- /dev/null +++ b/src/Shentun.Peis.Application/DiagnosisFunctions/DoctorCheckDiagnosisInput.cs @@ -0,0 +1,60 @@ +using Org.BouncyCastle.Bcpg.OpenPgp; +using Shentun.Peis.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Shentun.Peis.DiagnosisFunctions +{ + public class DoctorCheckDiagnosisInput + { + public char SexId { get; set; } + public string SexName { get; set; } + public short? Age { get; set; } + public List Asbitems { get; set; } = new List(); + public List Items { get; set; } = new List { }; + } + + public class AsbitemInput + { + /// + /// 组合项目ID + /// + public Guid AsbitemId { get; set; } + /// + /// 组合项目名称 + /// + public string AsbitemName { get; set; } + public char IsDiagnosisFunction { get; set; } + public string DiagnosisFunction { get; set; } + public char IsContinueProcess { get; set; } + public string DefaultResult { get; set; } + + } + + public class ItemInput + { + /// + /// 项目ID + /// + public Guid ItemId { get; set; } + /// + /// 项目名称 + /// + public string ItemName { get; set; } + public char IsDiagnosisFunction { get; set; } + public string DiagnosisFunction { get; set; } + public char IsContinueProcess { get; set; } + public char IsNameIntoSummary { get; set; } + public char IsProduceSummary { get; set; } + public char ReferenceRangeTypeFlag { get; set; } + public string DefaultResult { get; set; } + public string Result { get; set; } + public int DisplayOrder { get; set; } + public List ItemResultMatches { get; set; } + public List ItemResultTemplates { get; set; } + public List ReferenceRanges { get; set; } + } +} diff --git a/src/Shentun.Peis.Application/PatientRegisters/PatientRegisterAppService.cs b/src/Shentun.Peis.Application/PatientRegisters/PatientRegisterAppService.cs index 6ecf9f1..d22625a 100644 --- a/src/Shentun.Peis.Application/PatientRegisters/PatientRegisterAppService.cs +++ b/src/Shentun.Peis.Application/PatientRegisters/PatientRegisterAppService.cs @@ -556,7 +556,7 @@ namespace Shentun.Peis.PatientRegisters PatientRegister ent = null; if (!string.IsNullOrWhiteSpace(input.PatientRegisterNo)) { - ent = query.Where(m => m.PatientRegisterNo == input.PatientRegisterNo).First(); + ent = query.Where(m => m.PatientRegisterNo == input.PatientRegisterNo).FirstOrDefault(); if (ent == null) { throw new UserFriendlyException("未找到人员信息"); diff --git a/src/Shentun.Peis.Application/PrintReports/PrintReportAppService.cs b/src/Shentun.Peis.Application/PrintReports/PrintReportAppService.cs index afab897..14067ad 100644 --- a/src/Shentun.Peis.Application/PrintReports/PrintReportAppService.cs +++ b/src/Shentun.Peis.Application/PrintReports/PrintReportAppService.cs @@ -140,9 +140,9 @@ namespace Shentun.Peis.PrintReports { #region 系统参数配置 - var MedicalCenterAddress = await _sysParmValueManager.GetSysParmValueInOrganizationUnitId(patientRegisterEnt.MedicalCenterId, "medical_center_address"); - var MedicalCenterFax = await _sysParmValueManager.GetSysParmValueInOrganizationUnitId(patientRegisterEnt.MedicalCenterId, "medical_center_fax"); - var MedicalCenterTelphone = await _sysParmValueManager.GetSysParmValueInOrganizationUnitId(patientRegisterEnt.MedicalCenterId, "medical_center_telphone"); + var MedicalCenterAddress = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(patientRegisterEnt.MedicalCenterId, "medical_center_address"); + var MedicalCenterFax = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(patientRegisterEnt.MedicalCenterId, "medical_center_fax"); + var MedicalCenterTelphone = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(patientRegisterEnt.MedicalCenterId, "medical_center_telphone"); #endregion msg = new PeisReportDto @@ -153,7 +153,7 @@ namespace Shentun.Peis.PrintReports MedicalCenterTelphone = MedicalCenterTelphone, detailedResultsListDtos = new List(), MedicalCenterAddress = MedicalCenterAddress, - MedicalStartDate = DataHelper.ConversionDateToString(patientRegisterEnt.MedicalStartDate), + MedicalStartDate = patientRegisterEnt.MedicalStartDate.ToString(), OrganizationUnitId = patientRegisterEnt.MedicalCenterId, OrganizationUnitName = organizationUnitList.Where(m => m.Id == patientRegisterEnt.MedicalCenterId).Select(s => s.DisplayName).FirstOrDefault(), PatientName = patientRegisterEnt.PatientName, @@ -162,7 +162,7 @@ namespace Shentun.Peis.PrintReports resultStatusDtos = new List(), sumSuggestionHeaderOrContentDtos = new List(), SexName = sexList.Where(m => m.Id == patientRegisterEnt.SexId).Select(s => s.DisplayName).FirstOrDefault(), - SummaryDate = DataHelper.ConversionDateToString(patientRegisterEnt.SummaryDate), + SummaryDate = patientRegisterEnt.SummaryDate.ToString(), sumSummaryHeaderOrContentDtos = new List() }; @@ -256,7 +256,7 @@ namespace Shentun.Peis.PrintReports { AsbitemName = string.Join(",", s.RegisterCheckAsbitems.Select(rs => rs.Asbitem.DisplayName).ToList()), ItemTypeName = string.Join(",", s.RegisterCheckAsbitems.Select(rs => rs.Asbitem.ItemType.DisplayName).ToList()), - CheckDate = DataHelper.ConversionDateToString(s.CheckDate), + CheckDate = s.CheckDate.ToString(), CheckDoctorName = EntityHelper.GetCheckDoctorName(s.CheckDoctorId, userlist), Items = s.RegisterCheckItems.Select(sa => new DetailedResultsList_Asbitem_Item { diff --git a/src/Shentun.Peis.Domain/ReferenceRanges/ReferenceRangeManager.cs b/src/Shentun.Peis.Domain/ReferenceRanges/ReferenceRangeManager.cs index f4ecd0e..9044bc1 100644 --- a/src/Shentun.Peis.Domain/ReferenceRanges/ReferenceRangeManager.cs +++ b/src/Shentun.Peis.Domain/ReferenceRanges/ReferenceRangeManager.cs @@ -142,15 +142,18 @@ namespace Shentun.Peis.ReferenceRanges { throw new ArgumentException($"适用性别参数为:{entity.ForSexId},是无效值,只能为'{ForSexFlag.All}','{ForSexFlag.Male}','{ForSexFlag.Female}'"); } - if (entity.AgeLowerLimit >= 0 && entity.AgeLowerLimit < 200) + if (entity.AgeLowerLimit < 0 || entity.AgeLowerLimit > 200) { throw new ArgumentException($"年龄下限参数为:{entity.AgeLowerLimit},是无效值,值只能为0~200之间"); } - if (entity.AgeUpperLimit >= 0 && entity.AgeUpperLimit < 200) + if (entity.AgeUpperLimit < 0 || entity.AgeUpperLimit > 200) { throw new ArgumentException($"年龄上限参数为:{entity.AgeUpperLimit},是无效值,值只能为0~200之间"); } - + if (entity.AgeLowerLimit > entity.AgeUpperLimit) + { + throw new ArgumentException($"年龄下限不能大于上限值"); + } } } diff --git a/src/Shentun.Peis.Domain/SysParmValues/SysParmValueManager.cs b/src/Shentun.Peis.Domain/SysParmValues/SysParmValueManager.cs index 0e6fdc6..e17e361 100644 --- a/src/Shentun.Peis.Domain/SysParmValues/SysParmValueManager.cs +++ b/src/Shentun.Peis.Domain/SysParmValues/SysParmValueManager.cs @@ -68,10 +68,10 @@ namespace Shentun.Peis.SysParmValues /// 根据体检中心获取系统参数值(优先找体检中心的参数,未找到获取全局参数) /// 如果is_public=Y或者只有一个体检中心,只取公共参数值,如果is_public=N并且有多个体检中心,优先取体检中心值,如果体检中心没记录行或者其中的值为空,则取公共参数 /// - /// 体检中心ID + /// 体检中心ID /// 系统参数ID /// - public async Task GetSysParmValueInOrganizationUnitId(Guid OrganizationUnitId, string SysParmId) + public async Task GetSysParmValueInMedicalCenterId(Guid medicalCenterId, string SysParmId) { string msg = ""; @@ -100,11 +100,12 @@ namespace Shentun.Peis.SysParmValues var sysParmValueList = await _sysParmValueRepository.GetListAsync(m => m.SysParmId == SysParmId); if (sysParmValueList.Any()) { - if (sysParmValueList.Where(m => m.MedicalCenterId == OrganizationUnitId).Count() > 0) + if (sysParmValueList.Where(m => m.MedicalCenterId == medicalCenterId).Count() > 0) { - msg = sysParmValueList.Where(m => m.MedicalCenterId == OrganizationUnitId).FirstOrDefault().ParmValue; + msg = sysParmValueList.Where(m => m.MedicalCenterId == medicalCenterId).FirstOrDefault().ParmValue; + } - else if (sysParmValueList.Where(m => m.MedicalCenterId == Guid.Empty).Count() > 0) + if (string.IsNullOrWhiteSpace(msg) && sysParmValueList.Where(m => m.MedicalCenterId == Guid.Empty).Count() > 0) { msg = sysParmValueList.Where(m => m.MedicalCenterId == Guid.Empty).FirstOrDefault().ParmValue; } diff --git a/src/Shentun.Peis.EntityFrameworkCore/PrintReports/PatientRegisterGuideReportRepository.cs b/src/Shentun.Peis.EntityFrameworkCore/PrintReports/PatientRegisterGuideReportRepository.cs index c6ba36b..e8cbe62 100644 --- a/src/Shentun.Peis.EntityFrameworkCore/PrintReports/PatientRegisterGuideReportRepository.cs +++ b/src/Shentun.Peis.EntityFrameworkCore/PrintReports/PatientRegisterGuideReportRepository.cs @@ -61,16 +61,16 @@ namespace Shentun.Peis.PrintReports #region 系统参数配置 - var MedicalCenterAddress = await _sysParmValueManager.GetSysParmValueInOrganizationUnitId(OrOrganizationUnitId, "medical_center_address"); - var MedicalCenterFax = await _sysParmValueManager.GetSysParmValueInOrganizationUnitId(OrOrganizationUnitId, "medical_center_fax"); - var MedicalCenterTelphone = await _sysParmValueManager.GetSysParmValueInOrganizationUnitId(OrOrganizationUnitId, "medical_center_telphone"); + var MedicalCenterAddress = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(OrOrganizationUnitId, "medical_center_address"); + var MedicalCenterFax = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(OrOrganizationUnitId, "medical_center_fax"); + var MedicalCenterTelphone = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(OrOrganizationUnitId, "medical_center_telphone"); #endregion var dbContext = await GetDbContextAsync(); - var customerOrgList = await _customerOrgRepository.GetListAsync(); + var customerOrgList =await _customerOrgRepository.GetListAsync(); var query = from a in dbContext.PatientRegisters join b in dbContext.Sexes on a.SexId equals b.Id @@ -89,9 +89,9 @@ namespace Shentun.Peis.PrintReports Age = a.Age, PatientRegisterId = a.Id, CustomerOrgGroupName = ac.DisplayName, - CustomerOrgName = EntityHelper.GetCustomerOrgParentNameNoSql(customerOrgList, a.CustomerOrgId), - CustomerOrgShortName = EntityHelper.GetCustomerOrgParentShortNameNoSql(customerOrgList, a.CustomerOrgId), - DepartmentName = EntityHelper.GetCustomerOrgNameNoSql(customerOrgList, a.CustomerOrgId), + CustomerOrgName = EntityHelper.GetCustomerOrgParentNameNoSql(customerOrgList,a.CustomerOrgId), + CustomerOrgShortName = EntityHelper.GetCustomerOrgParentShortNameNoSql(customerOrgList,a.CustomerOrgId), + DepartmentName = EntityHelper.GetCustomerOrgNameNoSql(customerOrgList,a.CustomerOrgId), IdNo = e.IdNo, JobCardNo = a.JobCardNo, MedicalCardNo = a.MedicalCardNo, @@ -108,7 +108,7 @@ namespace Shentun.Peis.PrintReports SexName = b.DisplayName, // Photo = string.IsNullOrEmpty(a.Photo) ? "" : ImageHelper.GetImageBase64StringAsync(a.Photo), Photo = string.IsNullOrEmpty(a.Photo) ? "" : ApiUrl + a.Photo, - MedicalStartDate = DataHelper.ConversionDateToString(a.MedicalStartDate), + MedicalStartDate = Convert.ToDateTime(a.MedicalStartDate.ToString()).ToString("yyyy-MM-dd"), OrganizationUnitId = a.MedicalCenterId, OrganizationUnitName = ag.DisplayName, Detail = PatientRegisterGuideAsbitem(a.Id, OrOrganizationUnitId, a.SexId) @@ -126,9 +126,9 @@ namespace Shentun.Peis.PrintReports #region 系统参数配置 - var MedicalCenterAddress = await _sysParmValueManager.GetSysParmValueInOrganizationUnitId(OrOrganizationUnitId, "medical_center_address"); - var MedicalCenterFax = await _sysParmValueManager.GetSysParmValueInOrganizationUnitId(OrOrganizationUnitId, "medical_center_fax"); - var MedicalCenterTelphone = await _sysParmValueManager.GetSysParmValueInOrganizationUnitId(OrOrganizationUnitId, "medical_center_telphone"); + var MedicalCenterAddress = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(OrOrganizationUnitId, "medical_center_address"); + var MedicalCenterFax = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(OrOrganizationUnitId, "medical_center_fax"); + var MedicalCenterTelphone = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(OrOrganizationUnitId, "medical_center_telphone"); #endregion var dbContext = await GetDbContextAsync(); @@ -171,7 +171,7 @@ namespace Shentun.Peis.PrintReports SexName = b.DisplayName, // Photo = string.IsNullOrEmpty(a.Photo) ? "" : ImageHelper.GetImageBase64StringAsync( a.Photo), Photo = string.IsNullOrEmpty(a.Photo) ? "" : ApiUrl + a.Photo, - MedicalStartDate = DataHelper.ConversionDateToString(a.MedicalStartDate), + MedicalStartDate = Convert.ToDateTime(a.MedicalStartDate.ToString()).ToString("yyyy-MM-dd"), OrganizationUnitId = a.MedicalCenterId, OrganizationUnitName = ag.DisplayName, Detail = PatientRegisterGuideAsbitem(a.Id, OrOrganizationUnitId, a.SexId) diff --git a/test/Shentun.Peis.Application.Tests/DiagnosisFunctionAppServiceTest.cs b/test/Shentun.Peis.Application.Tests/DiagnosisFunctionAppServiceTest.cs index 53e1f02..9151a72 100644 --- a/test/Shentun.Peis.Application.Tests/DiagnosisFunctionAppServiceTest.cs +++ b/test/Shentun.Peis.Application.Tests/DiagnosisFunctionAppServiceTest.cs @@ -5,6 +5,7 @@ using Shentun.Peis.Models; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.ConstrainedExecution; using System.Text; using System.Threading.Tasks; using TencentCloud.Ame.V20190916.Models; @@ -28,6 +29,172 @@ namespace Shentun.Peis _repository = GetRequiredService>(); _appService = GetRequiredService(); } + [Fact] + public async Task GetDiagnosisResultAsync2() + { + using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true)) + { + var getDiagnosisResultRequestDto = new GetDiagnosisResultRequestDto() + { + RegisterCheckId = new Guid("3a11eeb9-81e2-44bc-fd9d-72ca7d3ef9a6"), + Items = new List + { + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a11eeb8-716b-6103-9e89-dbd9df85227f"), + Result = "180/110" + }, + + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0c5186-2920-6492-c8bf-5908fe6bda56"), + Result = "肥胖;其它病" + } + } + }; + var result = await _appService.GetDiagnosisResultAsync2(getDiagnosisResultRequestDto); + foreach (var item in result.DiagnosisResultDetails) + { + _output.WriteLine(item.DiagnosisResult); + } + } + } + + [Fact] + public async Task GetDiagnosisResultAsync3() + { + using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true)) + { + var getDiagnosisResultRequestDto = new GetDiagnosisResultRequestDto() + { + RegisterCheckId = new Guid("3a11ee70-0351-8970-5bc5-dc0f72e62339"), + Items = new List + { + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0c6555-0dad-55b4-b59f-b11e8074cfdd"), + Result = "阳性" + }, + + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0c6558-e2a6-4aab-e6e9-d34957a7c3ed"), + Result = "阴性" + }, + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0c655a-1fdc-2447-6dc9-d8ec8e110d2e"), + Result = "阳性" + }, + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0c655c-1c9f-c8c5-150a-59b3cc351472"), + Result = "阴性" + }, + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0c655d-6ab7-ca7e-3920-3b493ec83192"), + Result = "阳性" + }, + } + }; + var result = await _appService.GetDiagnosisResultAsync2(getDiagnosisResultRequestDto); + foreach (var item in result.DiagnosisResultDetails) + { + _output.WriteLine(item.DiagnosisResult); + } + } + } + [Fact] + public async Task GetDiagnosisResultAsync4() + { + using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true)) + { + var getDiagnosisResultRequestDto = new GetDiagnosisResultRequestDto() + { + RegisterCheckId = new Guid("3a11ee70-034c-1ce6-40f9-7eabb02830a9"), + Items = new List + { + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0d2916-3706-a22a-69dd-bd80be509d07"), + Result = "30.5" + }, + + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0d2919-49d5-30d3-4373-b3dc1e806732"), + Result = "9" + }, + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0d2917-40e2-2f81-ebfc-267a9a98b02e"), + Result = "91.3" + }, + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0d291a-6ab5-8642-9cd3-30353ecb5d15"), + Result = "90" + }, + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0d2918-344b-0373-a53c-b4888bd6b9a6"), + Result = "13" + }, + } + }; + var result = await _appService.GetDiagnosisResultAsync2(getDiagnosisResultRequestDto); + foreach (var item in result.DiagnosisResultDetails) + { + _output.WriteLine(item.DiagnosisResult); + } + } + } + [Fact] + public async Task GetDiagnosisResultAsync5() + { + using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true)) + { + var getDiagnosisResultRequestDto = new GetDiagnosisResultRequestDto() + { + RegisterCheckId = new Guid("3a11ee70-034c-1ce6-40f9-7eabb02830a9"), + Items = new List + { + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0d2916-3706-a22a-69dd-bd80be509d07"), + Result = "30.5" + }, + + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0d2919-49d5-30d3-4373-b3dc1e806732"), + Result = "9" + }, + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0d2917-40e2-2f81-ebfc-267a9a98b02e"), + Result = "91.3" + }, + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0d291a-6ab5-8642-9cd3-30353ecb5d15"), + Result = "90" + }, + new GetDiagnosisResultRequest_Item() + { + ItemId = new Guid("3a0d2918-344b-0373-a53c-b4888bd6b9a6"), + Result = "13" + }, + } + }; + var result = await _appService.GetDiagnosisResultAsync2(getDiagnosisResultRequestDto); + foreach (var item in result.DiagnosisResultDetails) + { + _output.WriteLine(item.DiagnosisResult); + } + } + } /// /// 体重指数测试结果 /// @@ -58,7 +225,7 @@ namespace Shentun.Peis } }; var result = GetItemCalculateResultTzzs(patient); - _output.WriteLine("结果:"+result); + _output.WriteLine("结果:" + result); string code = @" string result = """"; decimal sg = 0; @@ -102,12 +269,12 @@ namespace Shentun.Peis DiagnosisBuilder diagnosisBuilder = new DiagnosisBuilder(); - result = diagnosisBuilder.GetItemCalculateResult(patient, code); + result = diagnosisBuilder.GetItemCalculateResult(patient, code); _output.WriteLine("动态结果:" + result); } - + /// /// 体重指数 /// @@ -118,10 +285,11 @@ namespace Shentun.Peis string result = ""; decimal sg = 0; decimal tz = 0; + foreach (var item in patient.Items) { if (item.ItemName == "身高") - { + { if (decimal.TryParse(item.Result, out sg)) { if (sg == 0) @@ -136,7 +304,7 @@ namespace Shentun.Peis } if (item.ItemName == "体重") - { + { if (decimal.TryParse(item.Result, out tz)) { if (tz == 0) @@ -151,7 +319,111 @@ namespace Shentun.Peis } } - result = (tz /((sg/100) * (sg / 100))).ToString("0.00"); + result = (tz / ((sg / 100) * (sg / 100))).ToString("0.00"); + return result; + } + + [Fact] + public void GetItemDiagnosisResultXYTest() + { + PatientItemDiagnosisInput patient = new PatientItemDiagnosisInput(); + patient.SexName = "男"; + patient.Age = 30; + patient.Item = new ItemResultInput() + { + ItemId = Guid.NewGuid(), + ItemName = "血压", + Result = "180/110" + }; + var result = GetItemDiagnosisResultXY(patient); + _output.WriteLine("结果:" + result); + string code = @" + string result = """"; + decimal szyDecimal = 0; + decimal ssyDecimal = 0; + var itemResult = patient.Item.Result; + if (string.IsNullOrWhiteSpace(itemResult)) + { + return null; + } + if (itemResult == ""/"") + return null; + var pos = itemResult.IndexOf(""/""); + var szy = itemResult.Substring(0, pos); + var ssy = itemResult.Substring(pos + 1); + if (!decimal.TryParse(szy, out szyDecimal)) + { + return null; + } + + if (!decimal.TryParse(ssy, out ssyDecimal)) + { + return null; + } + if (szyDecimal > 180 || ssyDecimal > 110) + { + return ""Ⅲ级高血压""; + } + if (szyDecimal > 160 || ssyDecimal > 100) + { + return ""Ⅱ级高血压""; + } + if (szyDecimal > 140 || ssyDecimal > 90) + { + return ""Ⅰ级高血压""; + } + return result; + "; + + + DiagnosisBuilder diagnosisBuilder = new DiagnosisBuilder(); + result = diagnosisBuilder.GetItemDiagnosisResult(patient, code); + _output.WriteLine("动态结果:" + result); + + + } + + /// + /// + /// + /// + /// + public string GetItemDiagnosisResultXY(PatientItemDiagnosisInput patient) + { + string result = ""; + decimal szyDecimal = 0; + decimal ssyDecimal = 0; + var itemResult = patient.Item.Result; + if (string.IsNullOrWhiteSpace(itemResult)) + { + return null; + } + if (itemResult == "/") + return null; + var pos = itemResult.IndexOf("/"); + var szy = itemResult.Substring(0, pos); + var ssy = itemResult.Substring(pos + 1); + if (!decimal.TryParse(szy, out szyDecimal)) + { + return null; + } + + if (!decimal.TryParse(ssy, out ssyDecimal)) + { + return null; + } + if (szyDecimal > 180 || ssyDecimal > 110) + { + return "Ⅲ级高血压"; + } + if (szyDecimal > 160 || ssyDecimal > 100) + { + return "Ⅱ级高血压"; + } + if (szyDecimal > 140 || ssyDecimal > 90) + { + return "Ⅰ级高血压"; + } return result; } @@ -159,7 +431,7 @@ namespace Shentun.Peis /// 乙肝五项 /// [Fact] - public void GetAsbitemDiagnosisResultTest() + public void GetAsbitemDiagnosisResultYgwxTest() { var patient = new PatientAsbitemDiagnosisInput(); patient.SexName = "男"; @@ -169,62 +441,128 @@ namespace Shentun.Peis new ItemResultInput() { ItemId = Guid.NewGuid(), - ItemName = "身高", - Result = "122" + ItemName = "乙肝表面抗原(HBsAg)", + Result = "阳性" }, new ItemResultInput() { ItemId = Guid.NewGuid(), - ItemName = "体重", - Result = "221" + ItemName = "乙肝表面抗体(抗-HBs)", + Result = "阴性" }, new ItemResultInput() { ItemId = Guid.NewGuid(), - ItemName = "体重指数", + ItemName = "乙肝e抗原(HBeAg)", + Result = "阳性" + }, + new ItemResultInput() + { + ItemId = Guid.NewGuid(), + ItemName = "乙肝e抗体(抗-HBe)", + Result = "阴性" + }, + new ItemResultInput() + { + ItemId = Guid.NewGuid(), + ItemName = "乙肝核心抗体(抗-HBc)", + Result = "阳性" } }; - var result = GetAsbitemDiagnosisResult(patient); + var result = GetAsbitemDiagnosisResultYgwx(patient); _output.WriteLine("结果:" + result); string code = @" - string result = """"; - decimal sg = 0; - decimal tz = 0; + string msg = null; + string result1 = """"; + string result2= """"; + string result3 = """"; + string result4 = """"; + string result5 = """"; foreach (var item in patient.Items) { - if (item.ItemName == ""身高"") - { - if (decimal.TryParse(item.Result, out sg)) - { - if (sg == 0) - { - return null; - } - } - else - { - return null; - } - + if(item.ItemName == ""乙肝表面抗原(HBsAg)"") + { + result1 = item.Result; } - if (item.ItemName == ""体重"") - { - if (decimal.TryParse(item.Result, out tz)) - { - if (tz == 0) - { - return null; - } - } - else - { - return null; - } - + if (item.ItemName == ""乙肝表面抗体(抗-HBs)"") + { + result2 = item.Result; + } + if (item.ItemName == ""乙肝e抗原(HBeAg)"") + { + result3 = item.Result; } + if (item.ItemName == ""乙肝e抗体(抗-HBe)"") + { + result4 = item.Result; + } + if (item.ItemName == ""乙肝核心抗体(抗-HBc)"") + { + result5 = item.Result; + } + } - result = (tz /((sg/100) * (sg / 100))).ToString(""0.00""); - return result; + switch (result1 + "","" + result2 + "","" + result3 + "","" + result4 + "","" + result5) + { + case ""阳性,阴性,阳性,阴性,阳性"": + msg = ""乙肝五项检查大三阳""; + break; + case ""阳性,阴性,阴性,阳性,阳性"": + msg = ""乙肝五项检查小三阳""; + break; + case ""阳性,阴性,阳性,阴性,阴性"": + msg = ""乙肝五项检查第一项,第三项阳性""; + break; + case ""阴性,阴性,阳性,阳性,阳性"": + msg = ""乙肝两对半三,四,五阳性""; + break; + case ""阳性,阴性,阴性,阴性,阳性"": + msg = ""乙肝五项检查第一项,第五项阳性""; + break; + case ""阴性,阴性,阴性,阳性,阳性"": + msg = ""乙肝五项检查第四项,第五项阳性""; + break; + case ""阳性,阴性,阳性,阳性,阴性"": + msg = ""乙肝两对半一,三,四阳性""; + break; + case ""阴性,阴性,阳性,阴性,阳性"": + msg = ""乙肝五项检查第三项,第五项阳性""; + break; + case ""阴性,阴性,阴性,阴性,阴性"": + msg = ""乙肝五项全阴""; + break; + case ""阴性,阳性,阴性,阴性,阴性"": + msg = ""乙肝表面抗体阳性""; + break; + case ""阳性,阴性,阴性,阴性,阴性"": + msg = ""乙肝表面抗原阳性""; + break; + case ""阴性,阳性,阴性,阳性,阳性"": + msg = ""乙肝五项检查第二,第四,第五项阳性""; + break; + case ""阴性,阴性,阴性,阳性,阴性"": + msg = ""乙肝e抗体阳性""; + break; + case ""阳性,阴性,阴性,阳性,阴性"": + msg = ""乙肝五项检查第一项,第四项阳性""; + break; + case ""阴性,阳性,阴性,阴性,阳性"": + msg = ""乙肝五项检查第二项,第五项阳性""; + break; + case ""阴性,阴性,阴性,阴性,阳性"": + msg = ""乙肝核心抗体阳性""; + break; + case ""阴性,弱阳性,阴性,阴性,阴性"": + msg = ""乙肝表面抗体弱阳性""; + break; + case ""阴性,弱阳性,阴性,阴性,阳性"": + msg = ""乙肝五项检查第二项弱阳性,第五项阳性""; + break; + default: + msg = """"; + break; + } + return msg; "; @@ -235,10 +573,99 @@ namespace Shentun.Peis } - public string GetAsbitemDiagnosisResult(PatientAsbitemDiagnosisInput patient) + public string GetAsbitemDiagnosisResultYgwx(PatientAsbitemDiagnosisInput patient) { - string result = ""; - return result; + string msg = null; + string result1 = ""; + string result2 = ""; + string result3 = ""; + string result4 = ""; + string result5 = ""; + foreach (var item in patient.Items) + { + if (item.ItemName == "乙肝表面抗原(HBsAg)") + { + result1 = item.Result; + } + if (item.ItemName == "乙肝表面抗体(抗-HBs)") + { + result2 = item.Result; + } + if (item.ItemName == "乙肝e抗原(HBeAg)") + { + result3 = item.Result; + } + if (item.ItemName == "乙肝e抗体(抗-HBe)") + { + result4 = item.Result; + } + if (item.ItemName == "乙肝核心抗体(抗-HBc)") + { + result5 = item.Result; + } + + } + switch (result1 + "," + result2 + "," + result3 + "," + result4 + "," + result5) + { + case "阳性,阴性,阳性,阴性,阳性": + msg = "乙肝五项检查大三阳"; + break; + case "阳性,阴性,阴性,阳性,阳性": + msg = "乙肝五项检查小三阳"; + break; + case "阳性,阴性,阳性,阴性,阴性": + msg = "乙肝五项检查第一项,第三项阳性"; + break; + case "阴性,阴性,阳性,阳性,阳性": + msg = "乙肝两对半三,四,五阳性"; + break; + case "阳性,阴性,阴性,阴性,阳性": + msg = "乙肝五项检查第一项,第五项阳性"; + break; + case "阴性,阴性,阴性,阳性,阳性": + msg = "乙肝五项检查第四项,第五项阳性"; + break; + case "阳性,阴性,阳性,阳性,阴性": + msg = "乙肝两对半一,三,四阳性"; + break; + case "阴性,阴性,阳性,阴性,阳性": + msg = "乙肝五项检查第三项,第五项阳性"; + break; + case "阴性,阴性,阴性,阴性,阴性": + msg = "乙肝五项全阴"; + break; + case "阴性,阳性,阴性,阴性,阴性": + msg = "乙肝表面抗体阳性"; + break; + case "阳性,阴性,阴性,阴性,阴性": + msg = "乙肝表面抗原阳性"; + break; + case "阴性,阳性,阴性,阳性,阳性": + msg = "乙肝五项检查第二,第四,第五项阳性"; + break; + case "阴性,阴性,阴性,阳性,阴性": + msg = "乙肝e抗体阳性"; + break; + case "阳性,阴性,阴性,阳性,阴性": + msg = "乙肝五项检查第一项,第四项阳性"; + break; + case "阴性,阳性,阴性,阴性,阳性": + msg = "乙肝五项检查第二项,第五项阳性"; + break; + case "阴性,阴性,阴性,阴性,阳性": + msg = "乙肝核心抗体阳性"; + break; + case "阴性,弱阳性,阴性,阴性,阴性": + msg = "乙肝表面抗体弱阳性"; + break; + case "阴性,弱阳性,阴性,阴性,阳性": + msg = "乙肝五项检查第二项弱阳性,第五项阳性"; + break; + default: + msg = ""; + break; + } + return msg; } } }