using Azure; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.EntityFrameworkCore; using NPOI.DDF; using NPOI.POIFS.Properties; using NUglify.Helpers; using Shentun.Peis.Enums; using Shentun.Peis.FollowUps; using Shentun.Peis.ItemResultMatchs; using Shentun.Peis.Models; using Shentun.Peis.PatientRegisters; using Shentun.Peis.RegisterCheckItems; using Shentun.Peis.Sexs; using Shentun.Peis.SumDiagnosises; using Shentun.Peis.SysParmValues; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; using Volo.Abp.Uow; using Volo.Abp.Users; using Xceed.Document.NET; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace Shentun.Peis.DiagnosisFunctions { [ApiExplorerSettings(GroupName = "Work")] [Authorize] public class DiagnosisFunctionAppService : ApplicationService { private readonly IRepository _patientRegisterRepository; private readonly IRepository _registerAsbitemRepository; private readonly IRepository _asbitemRepository; private readonly IRepository _itemRepository; private readonly IRepository _unitRepository; private readonly IRepository _asbitemDetailRepository; private readonly IRepository _registerCheckRepository; private readonly IRepository _registerCheckItemRepository; private readonly IRepository _diagnosisRepository; private readonly IRepository _itemResultTemplateRepository; private readonly IRepository _itemResultMatchRepository; private readonly IRepository _suggestionRepository; private readonly CacheService _cacheService; private SysParmValueManager _sysParmValueManager; private RegisterCheckItemManager _registerCheckItemManager; private string _isAddAbnormalResult; private string _isAddReferenceRange; private string _isAutoAddSuffix; private string _lowerSuffix; private string _highSuffix; string[] _numArry = { "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩", "⑪", "⑫", "⑬", "⑭", "⑮", "⑯", "⑰", "⑱", "⑲", "⑳" }; private readonly IRepository _criticalFollowValueRepository; private readonly ICurrentUser _currentUser; private readonly IRepository _followUpRepository; private readonly FollowUpAppService _followUpAppService; public DiagnosisFunctionAppService( IRepository patientRegisterRepository, IRepository registerAsbitemRepository, IRepository asbitemRepository, IRepository itemRepository, IRepository asbitemDetailRepository, IRepository registerCheckRepository, IRepository registerCheckItemRepository, IRepository diagnosisRepository, IRepository itemResultTemplateRepository, IRepository itemResultMatchRepository, IRepository suggestionRepository, IRepository unitRepository, CacheService cacheService, SysParmValueManager sysParmValueManager, RegisterCheckItemManager registerCheckItemManager, IRepository criticalFollowValueRepository, ICurrentUser currentUser, IRepository followUpRepository, FollowUpAppService followUpAppService) { this._patientRegisterRepository = patientRegisterRepository; this._registerAsbitemRepository = registerAsbitemRepository; this._asbitemRepository = asbitemRepository; this._itemRepository = itemRepository; this._asbitemDetailRepository = asbitemDetailRepository; this._registerCheckRepository = registerCheckRepository; this._registerCheckItemRepository = registerCheckItemRepository; this._diagnosisRepository = diagnosisRepository; this._itemResultTemplateRepository = itemResultTemplateRepository; this._itemResultMatchRepository = itemResultMatchRepository; this._suggestionRepository = suggestionRepository; _cacheService = cacheService; _sysParmValueManager = sysParmValueManager; _registerCheckItemManager = registerCheckItemManager; _unitRepository = unitRepository; _criticalFollowValueRepository = criticalFollowValueRepository; _currentUser = currentUser; _followUpRepository = followUpRepository; _followUpAppService = followUpAppService; } #region hide ///// ///// 医生诊台生成小结 ///// ///// ///// //[HttpPost("api/app/diagnosisfunction/getdiagnosisresult")] //public async Task> GetDiagnosisResultAsync(GetDiagnosisResultRequestDto input) //{ // var reslist = new List(); // var registerAsbitems = from a in await _registerAsbitemRepository.GetListAsync() // join b in await _asbitemRepository.GetListAsync() on a.AsbitemId equals b.Id into bb // from ab in bb.DefaultIfEmpty() // where a.PatientRegisterId == input.PatientRegisterId // select ab; // foreach (var item in registerAsbitems) // { // if (item.IsDiagnosisFunction == 'Y' && !string.IsNullOrEmpty(item.DiagnosisFunction)) // { // if (item.DisplayName == "身高体重") // { // var res = await GetDiagnosisResultInAsbitemHeightAsync(input, item.DiagnosisFunction, item.IsContinueProcess); // if (res.Count > 0) // { // reslist.AddRange(res); // } // } // } // } // return reslist; //} ///// ///// 组合函数 身高体重 生成 ///// ///// ///// 诊断函数 ///// 处理完是否继续执行项目的诊断函数 ///// //private async Task> GetDiagnosisResultInAsbitemHeightAsync(GetDiagnosisResultRequestDto input, string DiagnosisFunction, char IsContinueProcess) //{ // var reslist = new List(); // if (input.Items.Count > 0) // { // var itemList = await _itemRepository.GetListAsync(); // string DiagnosisFunctionCode = DiagnosisFunction; // foreach (var item in input.Items) // { // if (item.ItemId != null) // { // var itement = itemList.Where(m => m.Id == item.ItemId).FirstOrDefault(); // if (itement != null) // { // DiagnosisFunctionCode = DiagnosisFunctionCode.Replace($"[{itement.DisplayName}]", item.Result); // } // } // } // ////拼接动态代码 // //string code = @" // // using System; // // namespace Shentun.Peis // // { // // public class DiagnosisResultInAsbitemHeight // // { // // public string AutoDiagnosisResultInAsbitemHeight() // // { // // var msg="""";" // // + DiagnosisFunctionCode + @" // // return msg; // // } // // } // // }"; // //拼接动态代码 // string code = @" // public class DiagnosisResultInAsbitemHeight // { // public string AutoDiagnosisResultInAsbitemHeight() // { // var msg="""";" // + DiagnosisFunctionCode + @" // return msg; // } // }"; // CompileHelper compileHelper = new CompileHelper(); // var assembly = compileHelper.GenerateAssemblyFromCode(code, Assembly.Load(new AssemblyName("System.Runtime")), typeof(object).Assembly); // if (assembly != null) // { // // 反射获取程序集中 的类 // Type type = assembly.GetType("DiagnosisResultInAsbitemHeight"); // // 创建该类的实例 // object obj = Activator.CreateInstance(type); // var msg = type.InvokeMember("AutoDiagnosisResultInAsbitemHeight", // BindingFlags.Default | BindingFlags.InvokeMethod, // null, // obj, // null); // if (!string.IsNullOrEmpty(msg.ToString())) // { // reslist.Add(new GetDiagnosisResultDto { DiagnosisResult = msg.ToString() }); // } // } // } // return reslist; //} #endregion /// /// 医生诊台生成小结 /// /// /// [HttpPost("api/app/diagnosisfunction/getdiagnosisresult")] [RemoteService(false)] public async Task GetDiagnosisResultAsync(GetDiagnosisResultRequestDto input) { throw new Exception("禁止使用"); var reslist = new List(); var suggestionlist = new List(); // await GetCalculationFunctionAsync(input); //取消计算函数计算 //根据检查单ID查询 var query = (from a in await _registerCheckRepository.GetQueryableAsync() join b in await _registerAsbitemRepository.GetQueryableAsync() on a.Id equals b.RegisterCheckId join c in await _registerCheckItemRepository.GetQueryableAsync() on a.Id equals c.RegisterCheckId join d in await _asbitemRepository.GetQueryableAsync() on b.AsbitemId equals d.Id join e in (await _itemRepository.GetQueryableAsync()).Include(x => x.ReferenceRanges) on c.ItemId equals e.Id join f in await _patientRegisterRepository.GetQueryableAsync() on b.PatientRegisterId equals f.Id where a.Id == input.RegisterCheckId select new { a, b, c, d, e, f }).ToList(); List diagnosisTrips = new List(); //异常提示 if (query.Count() > 0) { //组合项目数据 // var asbitem_Data = query.GroupBy(g => g.b.Id).Select(s=>new ) var asbitem_Group = query.GroupBy(g => g.b.Id); //正常是一个,合并过项目可能存在多个 foreach (var item in asbitem_Group) { var asbitem_data = item.Select(s => s.d).FirstOrDefault(); //组合项目信息 var item_datas = item.Select(s => s.e).ToList(); //项目信息 var patientRegister_data = item.Select(s => s.f).FirstOrDefault(); //是否开启组合项目诊断函数 if (asbitem_data.IsDiagnosisFunction == 'Y' && !string.IsNullOrEmpty(asbitem_data.DiagnosisFunction)) { var res = await GetDiagnosisResultInAsbitemAsync(input, asbitem_data, item_datas, patientRegister_data, diagnosisTrips); if (res.Count > 0) { reslist.AddRange(res); } } else { //查找项目诊断函数 var itemResult = await GetDiagnosisResultInItemAsync(input, item_datas, patientRegister_data, diagnosisTrips); //执行项目诊断函数 if (itemResult.Any()) { reslist.AddRange(itemResult); } } if (!reslist.Any()) { //未生成小结,继续根据参考范围生成 foreach (var item_data in item_datas) { if (item_data.IsProduceSummary == 'Y') { string itemResult_Request = input.Items.Where(m => m.ItemId == item_data.Id).FirstOrDefault()?.Result; //项目结果 string referenceRangesResult = await GetDiagnosisResultInReferenceRangesAsync(item_data, itemResult_Request, patientRegister_data, diagnosisTrips); if (!string.IsNullOrEmpty(referenceRangesResult)) { if (item_data.IsNameIntoSummary == 'Y') referenceRangesResult = item_data.DisplayName + referenceRangesResult; reslist.Add(new GetDiagnosisResult_Detail { DiagnosisResult = referenceRangesResult }); } } } } } } //无结果 加未见异常 if (!reslist.Any()) reslist.Add(new GetDiagnosisResult_Detail { DiagnosisResult = "未见异常" }); else { //小结内容去重 reslist = reslist.Where((x, i) => reslist.FindIndex(z => z.DiagnosisResult == x.DiagnosisResult) == i).ToList(); //生成建议 var suggestion_query = from a in await _suggestionRepository.GetQueryableAsync() join b in await _diagnosisRepository.GetQueryableAsync() on a.DiagnosisId equals b.Id where reslist.Select(s => s.DiagnosisResult).Contains(b.DisplayName) select a; if (suggestion_query.Count() > 0) { suggestionlist = suggestion_query.Select(s => new GetDiagnosisSuggestion_Detail { DiagnosisSuggestion = s.SuggestionContent }).ToList(); } } string diagnosisTrip = ""; if (diagnosisTrips.Any()) { diagnosisTrip = string.Join(",", diagnosisTrips.Distinct().ToList()); } var resdto = new GetDiagnosisResultDto { DiagnosisResultDetails = reslist, DiagnosisSuggestionDetails = suggestionlist, }; if (!string.IsNullOrEmpty(diagnosisTrip)) { return new OkObjectResult(CustomerReturnValue.CreateInstance(0, diagnosisTrip, resdto)); } else { return new OkObjectResult(CustomerReturnValue.CreateInstance(1, "Success", resdto)); } } /// /// 生成小结 /// /// /// [HttpPost("api/app/DiagnosisFunction/GetDoctorCheckDiagnosisResultAsync")] public async Task GetDoctorCheckDiagnosisResultAsync(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 unit in await _unitRepository.GetQueryableAsync() on item.UnitId equals unit.Id into unitExist from unitHaveEmpty in unitExist.DefaultIfEmpty() join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on registerCheck.PatientRegisterId equals patientRegister.Id where registerCheck.Id == input.RegisterCheckId select new { registerCheck, registerAsbitem, registerCheckItem, asbitem, item, unitHaveEmpty, patientRegister }).AsNoTracking().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() { RegisterCheckId = item.registerCheck.Id, AsbitemId = item.asbitem.Id, AsbitemName = item.asbitem.DisplayName, IsDiagnosisFunction = item.asbitem.IsDiagnosisFunction, DiagnosisFunction = item.asbitem.DiagnosisFunction, IsContinueProcess = item.asbitem.IsContinueProcess, DefaultResult = item.asbitem.DefaultResult, CriticalValueFunction = item.asbitem.CriticalValueFunction, FollowUpFunction = item.asbitem.FollowUpFunction, IsCriticalValueFunction = item.asbitem.IsCriticalValueFunction, IsFollowUpFunction = item.asbitem.IsFollowUpFunction }; 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() { RegisterCheckId = item.registerCheck.Id, ItemId = item.item.Id, ItemName = item.item.DisplayName, Unit = (item.unitHaveEmpty == null) ? "" : item.unitHaveEmpty.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(), CriticalValueFunction = item.item.CriticalValueFunction, FollowUpFunction = item.item.FollowUpFunction, IsFollowUpFunction = item.item.IsFollowUpFunction, IsCriticalValueFunction = item.item.IsCriticalValueFunction }; 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); } #region 处理危急值函数 var isCritical = await GetPatientRegisterIsCriticalAsync(doctorCheckDiagnosisInput, resultDto); var isFollowUp = false; if (!isCritical) { //随访 isFollowUp = await GetPatientRegisterIsFollowUpAsync(doctorCheckDiagnosisInput, resultDto); } else { isFollowUp = true; } if (isCritical || isFollowUp) { //await CreateFollowUpAsync(query.First().patientRegister.Id); //标记危急值 生成随访记录 await _followUpAppService.CreateAsync(new PatientRegisterIdInputDto { PatientRegisterId = query.First().patientRegister.Id }); } #endregion return resultDto; } #region 小结方法 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 { itemDiagnosisType.Diagnosis = itemDiagnosisType.Diagnosis.Where(o => !string.IsNullOrWhiteSpace(o)).ToList(); 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; } if (itemDiagnosisType.Diagnosis.Count() == 1) { diagnosis = diagnosis + itemDiagnosisType.Diagnosis[i] + ";"; } else { diagnosis = diagnosis + _numArry[i] + itemDiagnosisType.Diagnosis[i] + ";"; } } } } if (!string.IsNullOrWhiteSpace(diagnosis)) { if (itemDiagnosis.IsNameIntoSummary == 'Y' && !diagnosis.StartsWith(itemDiagnosis.ItemName)) { diagnosis = itemDiagnosis.ItemName + ":" + diagnosis; } diagnosisList.Add(diagnosis); } } return diagnosisList; } /// /// 加载系统参数 /// /// /// private async Task LoadSysParm(Guid medicalCenterId) { _isAddAbnormalResult = await _sysParmValueManager.GetSysParmValueAsync( medicalCenterId, "doctor_check_lis_summary_mode_add_abnormal_result"); _isAddReferenceRange = await _sysParmValueManager.GetSysParmValueAsync( medicalCenterId, "doctor_check_lis_summary_mode_add_reference_range"); _isAutoAddSuffix = await _sysParmValueManager.GetSysParmValueAsync( medicalCenterId, "doctor_check_lis_summary_mode_auto_add_suffix"); _lowerSuffix = await _sysParmValueManager.GetSysParmValueAsync( medicalCenterId, "doctor_check_lis_summary_mode_lower_suffix"); _highSuffix = await _sysParmValueManager.GetSysParmValueAsync( 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() { IsNameIntoSummary = item.IsNameIntoSummary, 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 diagnosis = null; // var pos = referenceRange.ReferenceRangeValue.IndexOf("-"); string resultStatusId = _registerCheckItemManager.GetNumberResultStatusId(itemInput.Result, referenceRange.ReferenceRangeValue); if (resultStatusId == ResultStatusFlag.Low) { diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, itemInput.Unit, true, referenceRange); } else if (resultStatusId == ResultStatusFlag.High) { diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, itemInput.Unit, false, referenceRange); } return diagnosis; } private async Task GetNumberDiagnosis(string itemName, string result, string unit, 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") { if (string.IsNullOrEmpty(unit)) { unit = ""; } diagnosis = diagnosis + $"(结果:{result} {unit},参考范围: {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 执行项目计算函数 /// /// 生成计算函数值 /// /// /// [HttpPost("api/app/diagnosisfunction/getcalculationfunctionresult")] public async Task GetCalculationFunctionResultAsync(GetDiagnosisResultRequestDto input) { await GetItemResultByCalculationFunctionAsync(input); return 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() on registerCheck.Id equals registerCheckItem.RegisterCheckId join item in await _itemRepository.GetQueryableAsync() on registerCheckItem.ItemId equals item.Id where registerCheck.Id == input.RegisterCheckId select new { PatientRegister = patientRegister, Item = item } ).ToList(); var diagnosisBuilder = new DiagnosisBuilder(); var patientItemCalculateInput = new PatientItemCalculateInput() { SexName = _cacheService.GetSexNameAsync(list[0].PatientRegister.SexId).Result, Age = list[0].PatientRegister.Age }; foreach (var item in input.Items) { var itemResult = new ItemResultInput() { ItemId = item.ItemId, Result = item.Result }; itemResult.ItemName = list.Where(o => o.Item.Id == item.ItemId).First().Item.DisplayName; patientItemCalculateInput.Items.Add(itemResult); } foreach (var item in list) { if (item.Item.IsCalculationItem == 'Y' && !string.IsNullOrEmpty(item.Item.CalculationFunction)) { //计算函数 //计算结果 string CalculationFunctionValue = diagnosisBuilder.GetItemCalculateResult(patientItemCalculateInput, item.Item.CalculationFunction); //CalculationFunctionValue = GetCodeResult(input, item.CalculationFunction, list); input.Items.Where(m => m.ItemId == item.Item.Id).FirstOrDefault().Result = CalculationFunctionValue; //赋值 } } } #endregion /// /// 执行组合项目 诊断函数 /// /// /// /// /// /// /// private async Task> GetDiagnosisResultInAsbitemAsync(GetDiagnosisResultRequestDto input, Asbitem asbitem_data, List item_datas, PatientRegister patientRegister_data, List diagnosisTrips) { var reslist = new List(); if (input.Items.Count > 0) { //执行函数 返回结果 string DiagnosisFunctionResult_Asbitem = GetCodeResult(input, asbitem_data.DiagnosisFunction, item_datas); if (!string.IsNullOrEmpty(DiagnosisFunctionResult_Asbitem)) { reslist.Add(new GetDiagnosisResult_Detail { DiagnosisResult = DiagnosisFunctionResult_Asbitem }); } //是否继续执行项目诊断函数 if (asbitem_data.IsContinueProcess == 'Y') { var itemResult = await GetDiagnosisResultInItemAsync(input, item_datas, patientRegister_data, diagnosisTrips); //执行项目诊断函数 if (itemResult.Any()) { reslist.AddRange(itemResult); } } } return reslist; } /// /// 执行项目 诊断函数 /// /// /// /// /// /// private async Task> GetDiagnosisResultInItemAsync(GetDiagnosisResultRequestDto input, List item_datas, PatientRegister patientRegister_data, List diagnosisTrips) { var reslist = new List(); if (input.Items.Count > 0) { foreach (var item_data in item_datas) { if (item_data.IsDiagnosisFunction == 'Y' && !string.IsNullOrEmpty(item_data.DiagnosisFunction)) { var DiagnosisFunctionResult_Item = GetCodeResult(input, item_data.DiagnosisFunction, item_datas); if (!string.IsNullOrEmpty(DiagnosisFunctionResult_Item)) { reslist.Add(new GetDiagnosisResult_Detail { DiagnosisResult = DiagnosisFunctionResult_Item }); } //是否继续执行参考范围规则 if (item_data.IsContinueProcess == 'Y' && item_data.IsProduceSummary == 'Y') { string itemResult_Request = input.Items.Where(m => m.ItemId == item_data.Id).FirstOrDefault().Result; //项目结果 //执行参考范围 string referenceRangesResult = await GetDiagnosisResultInReferenceRangesAsync(item_data, itemResult_Request, patientRegister_data, diagnosisTrips); if (!string.IsNullOrEmpty(referenceRangesResult)) { if (item_data.IsNameIntoSummary == 'Y') DiagnosisFunctionResult_Item = item_data.DisplayName + DiagnosisFunctionResult_Item; reslist.Add(new GetDiagnosisResult_Detail { DiagnosisResult = referenceRangesResult }); } } } } } return reslist; } /// /// 执行项目 参考范围获取结果 /// /// /// /// /// /// private async Task GetDiagnosisResultInReferenceRangesAsync(Item item, string itemResult, PatientRegister patientRegister_data, List diagnosisTrips) { string referenceRangesResult = ""; string diagnosisTrip = ""; //诊断提示,参考范围性别、年龄 异常时出现 var item_ReferenceRangeList = item.ReferenceRanges.Where(m => m.ReferenceRangeTypeFlag == item.ReferenceRangeTypeFlag).ToList(); if (item_ReferenceRangeList.Any() && item.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number) { //数字参考范围 List referenceRanges = new List(); if (patientRegister_data.Age != null) { referenceRanges = item_ReferenceRangeList.Where(m => m.AgeLowerLimit <= patientRegister_data.Age && m.AgeUpperLimit >= patientRegister_data.Age).ToList(); } else { //if (string.IsNullOrEmpty(DiagnosisTrip)) //{ // DiagnosisTrip += "未登记年龄"; //} //else //{ // DiagnosisTrip += ",未登记年龄"; //} diagnosisTrip = "未登记年龄"; //找出默认的0-200 referenceRanges = item_ReferenceRangeList.Where(m => m.AgeLowerLimit == 0 && m.AgeUpperLimit == 200).ToList(); } if (referenceRanges.Any()) { //比对性别 var referenceRanges2 = referenceRanges.Where(m => patientRegister_data.SexId != null && m.ForSexId == patientRegister_data.SexId).ToList(); if (!referenceRanges2.Any()) { //未找到,去匹配适用性别为A的 referenceRanges2 = referenceRanges.Where(m => m.ForSexId == ForSexFlag.All).ToList(); if (referenceRanges2.Any()) { //数字参考范围类型 referenceRangesResult = await GetDiagnosisResultInNumRangeAsync(item, itemResult, referenceRanges2[0]); } } } //////符合条件的参考范围 //var item_ReferenceRange = item_ReferenceRangeList.Where(m => //(m.ForSexId.ToString() == ForSexFlag.All || (patientRegister_data.SexId != null && m.ForSexId == patientRegister_data.SexId)) // && patientRegister_data.Age != null // && m.AgeLowerLimit <= patientRegister_data.Age // && m.AgeUpperLimit >= patientRegister_data.Age).ToList(); //if (item_ReferenceRange.Count > 0) //{ // if (item_ReferenceRange.Count == 1) // { // //数字参考范围类型 // result = await GetDiagnosisResultInNumRangeAsync(item, itemResult, item_ReferenceRange[0]); // } //} } else { //无参考范围或者字符参考范围 referenceRangesResult = await GetDiagnosisResultInItemResultTemplateAsync(item, itemResult); if (string.IsNullOrEmpty(referenceRangesResult)) { //未匹配上,继续 referenceRangesResult = await GetDiagnosisResultInItemResultMatchAsync(item, itemResult); if (string.IsNullOrEmpty(referenceRangesResult)) { //未匹配上,继续 //对比项目默认结果,如果不是默认结果则直接用结果做为小结。 if (item.DefaultResult != itemResult) { referenceRangesResult = itemResult; } } } } if (!string.IsNullOrEmpty(diagnosisTrip)) diagnosisTrips.Add(diagnosisTrip); return referenceRangesResult; } /// /// 根据项目结果模板生成 /// 检查项目结果模板,如果和项目结果模板一致,则根据对应的诊断生成小结 完全匹配 /// /// private async Task GetDiagnosisResultInItemResultTemplateAsync(Item item, string itemResult) { string result = ""; var temp_itemResultTemplate = await _itemResultTemplateRepository.FirstOrDefaultAsync(m => m.ItemId == item.Id && m.Result == itemResult); if (temp_itemResultTemplate != null && temp_itemResultTemplate.DiagnosisId != null && temp_itemResultTemplate.DiagnosisId != Guid.Empty) { var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == temp_itemResultTemplate.DiagnosisId); if (temp_diagnosis != null) { result = temp_diagnosis.DisplayName; } } return result; } /// /// 根据项目项目结果匹配(诊断匹配) 生成 /// /// private async Task GetDiagnosisResultInItemResultMatchAsync(Item item, string itemResult) { string result = ""; var temp_itemResultMatch = await _itemResultMatchRepository.FirstOrDefaultAsync(m => m.ItemId == item.Id && itemResult.Contains(m.Result)); if (temp_itemResultMatch != null && temp_itemResultMatch.DiagnosisId != Guid.Empty) { var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == temp_itemResultMatch.DiagnosisId); if (temp_diagnosis != null) { result = temp_diagnosis.DisplayName; } } return result; } /// /// 根据数字型范围值对应的诊断匹配 生成 /// 如果在范围外又没有设置诊断,则用项目名称加偏高偏低后缀生成小结(需要根据系统参数)。 /// /// /// /// 当前匹配的参考范围 /// private async Task GetDiagnosisResultInNumRangeAsync(Item item, string itemResult, ReferenceRange item_ReferenceRange) { string result = ""; string diagnosisFlag = "1"; //1=正常 2=偏高 0=偏低 #region 处理异常结果 > < = 剔除 itemResult = itemResult.Replace(">", "").Replace("<", "").Replace("=", ""); try { var tempConvert = Convert.ToDecimal(itemResult); } catch (Exception ex) { return result; } #endregion #region 匹配参考范围 string item_referenceRangeValue = item_ReferenceRange.ReferenceRangeValue; if (item_referenceRangeValue.IndexOf("-") > -1) { var value_ary = item_referenceRangeValue.Split('-'); if (value_ary.Length == 2) { decimal minvalue = Convert.ToDecimal(value_ary[0]); decimal maxvalue = Convert.ToDecimal(value_ary[1]); if (Convert.ToDecimal(itemResult) > maxvalue) { //偏高 diagnosisFlag = "2"; } else if (Convert.ToDecimal(itemResult) < minvalue) { //偏低 diagnosisFlag = "0"; } } } else if (item_referenceRangeValue.IndexOf(">=") > -1) { if (Convert.ToDecimal(itemResult) < Convert.ToDecimal(item_referenceRangeValue.Replace(">=", ""))) { //偏低 diagnosisFlag = "0"; } } else if (item_referenceRangeValue.IndexOf("<=") > -1) { if (Convert.ToDecimal(itemResult) > Convert.ToDecimal(item_referenceRangeValue.Replace("<=", ""))) { //偏高 diagnosisFlag = "2"; } } else if (item_referenceRangeValue.IndexOf(">") > -1) { if (Convert.ToDecimal(itemResult) <= Convert.ToDecimal(item_referenceRangeValue.Replace(">", ""))) { //偏低 diagnosisFlag = "0"; } } else if (item_referenceRangeValue.IndexOf("<") > -1) { if (Convert.ToDecimal(itemResult) >= Convert.ToDecimal(item_referenceRangeValue.Replace("<", ""))) { //偏高 diagnosisFlag = "2"; } } if (diagnosisFlag == "2") { //偏高 if (item_ReferenceRange.UpperDiagnosisId != null) { var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == item_ReferenceRange.UpperDiagnosisId); if (temp_diagnosis != null) { result = temp_diagnosis.DisplayName; } else { result = $"{item.DisplayName}偏高"; } } else { result = $"{item.DisplayName}偏高"; } } else if (diagnosisFlag == "0") { //偏低 if (item_ReferenceRange.LowerDiagnosisId != null) { var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == item_ReferenceRange.LowerDiagnosisId); if (temp_diagnosis != null) { result = temp_diagnosis.DisplayName; } else { result = $"{item.DisplayName}偏低"; } } else { result = $"{item.DisplayName}偏低"; } } #endregion return result; } /// /// 动态编译代码 返回string /// /// /// /// /// private string GetCodeResult(GetDiagnosisResultRequestDto input, string DiagnosisFunctionCode, List item_datas) { string result = ""; string DiagnosisFunctionCode_Replace = ReplaceFunctionLabel(input, DiagnosisFunctionCode, item_datas); //拼接动态代码 string code = @" public class DiagnosisResultInAsbitemHeight { public string AutoDiagnosisResultInAsbitemHeight() { var msg="""";" + DiagnosisFunctionCode_Replace + @" return msg; } }"; CompileHelper compileHelper = new CompileHelper(); var assembly = compileHelper.GenerateAssemblyFromCode(code, Assembly.Load(new AssemblyName("System.Runtime")), typeof(object).Assembly); if (assembly != null) { // 反射获取程序集中 的类 Type type = assembly.GetType("DiagnosisResultInAsbitemHeight"); // 创建该类的实例 object obj = Activator.CreateInstance(type); var msg = type.InvokeMember("AutoDiagnosisResultInAsbitemHeight", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null); if (!string.IsNullOrEmpty(msg.ToString())) { result = msg.ToString(); } } return result; } /// /// 替换函数中的标签 /// /// /// /// /// private string ReplaceFunctionLabel(GetDiagnosisResultRequestDto input, string DiagnosisFunctionCode, List item_datas) { string tempcode = DiagnosisFunctionCode; //替换诊断函数中的标签 foreach (var item in input.Items) { if (item.ItemId != null) { var itement = item_datas.Where(m => m.Id == item.ItemId).FirstOrDefault(); //查询项目信息 if (itement != null) { //根据项目的名称 替换对应传过来的值 tempcode = tempcode.Replace($"[{itement.DisplayName}]", item.Result); } } } if (tempcode.IndexOf('[') != -1) { throw new UserFriendlyException("函数中有未识别的语法"); } return tempcode; } #endregion #region 危急值函数 /// /// 获取人员是否有危急值项目 /// 【优先处理组合项目危急值函数 /// 未触发时执行项目危急值函数 /// 未触发项目检索危急值关键字 /// 未触发检索小结是否包含危急值关键字】 /// /// /// /// public async Task GetPatientRegisterIsCriticalAsync( DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, GetDiagnosisResultDto resultDto) { var isCritical = false; isCritical = await GetAsbitemCriticalFunction(doctorCheckDiagnosisInput); if (isCritical) { return isCritical; } var criticalFollowValueList = await _criticalFollowValueRepository.GetListAsync(m => m.CriticalFollowValueFlag == CriticalFollowValueFlag.Critical); //检索项目函数+关键字 isCritical = await GetItemCriticalFunction(doctorCheckDiagnosisInput, criticalFollowValueList); if (isCritical) { return isCritical; } //检索小结 foreach (var diagnosisResult in resultDto.DiagnosisResultDetails) { isCritical = criticalFollowValueList.Count(m => diagnosisResult.DiagnosisResult.Contains(m.DisplayName)) > 0 ? true : false; if (isCritical) break; } return isCritical; } /// /// 获取人员是否有需要随访的项目 /// 【优先处理组合项目随访函数 /// 未触发时执行项目随访函数 /// 未触发项目检索随访关键字 /// 未触发检索小结是否包含随访关键字】 /// /// /// /// public async Task GetPatientRegisterIsFollowUpAsync( DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, GetDiagnosisResultDto resultDto) { var isCritical = false; isCritical = await GetAsbitemFollowUpFunction(doctorCheckDiagnosisInput); if (isCritical) { return isCritical; } var criticalFollowValueList = await _criticalFollowValueRepository.GetListAsync(m => m.CriticalFollowValueFlag == CriticalFollowValueFlag.FollowUp); //检索项目函数+关键字 isCritical = await GetItemFollowUpFunction(doctorCheckDiagnosisInput, criticalFollowValueList); if (isCritical) { return isCritical; } //检索小结 foreach (var diagnosisResult in resultDto.DiagnosisResultDetails) { isCritical = criticalFollowValueList.Count(m => diagnosisResult.DiagnosisResult.Contains(m.DisplayName)) > 0 ? true : false; if (isCritical) break; } return isCritical; } /// /// 组合项目危急值函数 /// /// /// private async Task GetAsbitemCriticalFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput) { bool isCritical = false; 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(); foreach (var asbitem in doctorCheckDiagnosisInput.Asbitems) { if (asbitem.IsCriticalValueFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.CriticalValueFunction)) { isCritical = diagnosisBuilder.GetAsbitemCriticalResult(patientAsbitemDiagnosisInput, asbitem.DiagnosisFunction); if (isCritical) { await CreateRegisterCheckCritical(asbitem.RegisterCheckId, 'Y', ""); break; } } } return isCritical; } /// /// 项目危急值函数 /// /// /// /// private async Task GetItemCriticalFunction( DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, List criticalFollowValueList ) { bool isCritical = false; var patientItemDiagnosisInput = new PatientItemDiagnosisInput() { SexName = doctorCheckDiagnosisInput.SexName, Age = doctorCheckDiagnosisInput.Age }; var diagnosisBuilder = new DiagnosisBuilder(); foreach (var item in doctorCheckDiagnosisInput.Items) { if (string.IsNullOrWhiteSpace(item.Result)) { continue; } if (item.IsCriticalValueFunction == 'Y' && !string.IsNullOrWhiteSpace(item.CriticalValueFunction)) { var itemResult = new ItemResultInput() { ItemId = item.ItemId, ItemName = item.ItemName, Result = item.Result }; patientItemDiagnosisInput.Item = itemResult; isCritical = diagnosisBuilder.GetItemCriticalResult(patientItemDiagnosisInput, item.CriticalValueFunction); if (isCritical) { await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'Y', ""); break; } } #region 执行项目参考范围 var referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == doctorCheckDiagnosisInput.SexId && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault(); if (referenceRange == null) { referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == ForSexFlag.All && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault(); if (referenceRange != null && !string.IsNullOrWhiteSpace(referenceRange.CriticalRangeValue)) { isCritical = _registerCheckItemManager.GetNumberResultIsCritical(item.Result, referenceRange.CriticalRangeValue); if (isCritical) { await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'Y', ""); break; } } } #endregion var isCriticalFollowValue = criticalFollowValueList.FirstOrDefault(m => item.Result.Contains(m.DisplayName)); //关键字检索 if (isCriticalFollowValue != null) { isCritical = true; } if (isCritical) { await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'Y', isCriticalFollowValue.DisplayName); break; } } return isCritical; } /// /// 组合项目随访函数 /// /// /// private async Task GetAsbitemFollowUpFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput) { bool isFollowUp = false; 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(); foreach (var asbitem in doctorCheckDiagnosisInput.Asbitems) { if (asbitem.IsFollowUpFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.FollowUpFunction)) { isFollowUp = diagnosisBuilder.GetAsbitemFollowUpResult(patientAsbitemDiagnosisInput, asbitem.DiagnosisFunction); if (isFollowUp) { await CreateRegisterCheckCritical(asbitem.RegisterCheckId, 'Y', ""); break; } } } return isFollowUp; } /// /// 项目随访函数 /// /// /// /// private async Task GetItemFollowUpFunction( DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, List criticalFollowValueList ) { bool isFollowUp = false; var patientItemDiagnosisInput = new PatientItemDiagnosisInput() { SexName = doctorCheckDiagnosisInput.SexName, Age = doctorCheckDiagnosisInput.Age }; var diagnosisBuilder = new DiagnosisBuilder(); foreach (var item in doctorCheckDiagnosisInput.Items) { if (string.IsNullOrWhiteSpace(item.Result)) { continue; } if (item.IsFollowUpFunction == 'Y' && !string.IsNullOrWhiteSpace(item.FollowUpFunction)) { var itemResult = new ItemResultInput() { ItemId = item.ItemId, ItemName = item.ItemName, Result = item.Result }; patientItemDiagnosisInput.Item = itemResult; isFollowUp = diagnosisBuilder.GetItemFollowUpResult(patientItemDiagnosisInput, item.FollowUpFunction); if (isFollowUp) { await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'N', ""); break; } } #region 执行项目参考范围 var referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == doctorCheckDiagnosisInput.SexId && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault(); if (referenceRange == null) { referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == ForSexFlag.All && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault(); if (referenceRange != null && !string.IsNullOrWhiteSpace(referenceRange.FollowUpRangeValue)) { isFollowUp = _registerCheckItemManager.GetNumberResultIsFollow(item.Result, referenceRange.FollowUpRangeValue); if (isFollowUp) { await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'N', referenceRange.FollowUpRangeValue); break; } } } #endregion var isCriticalFollowValue = criticalFollowValueList.FirstOrDefault(m => item.Result.Contains(m.DisplayName)); if (isCriticalFollowValue != null) { isFollowUp = true; } if (isFollowUp) { await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'N', isCriticalFollowValue.DisplayName); break; } } return isFollowUp; } /// /// 生成危急值标记、随访记录 /// /// private async Task CreateFollowUpAsync(Guid patientRegisterId) { var isFollowUp = await _followUpRepository.FirstOrDefaultAsync(f => f.PatientRegisterId == patientRegisterId); if (isFollowUp == null) { var followUpEnt = new FollowUp { IsPhoneComplete = 'N', IsSmsComplete = 'N', PatientRegisterId = patientRegisterId }; await _followUpRepository.InsertAsync(followUpEnt); } } /// /// 生成明细表危急值相关数据 /// /// /// /// /// /// private async Task CreateRegisterCheckItemCritical(Guid registerCheckId, Guid itemId, char isCriticalValue, string CriticalRangeValue) { var registerCheckItemEnt = await _registerCheckItemRepository.FirstOrDefaultAsync(m => m.RegisterCheckId == registerCheckId && m.ItemId == itemId); if (registerCheckItemEnt != null) { registerCheckItemEnt.CriticalRangeValue = CriticalRangeValue; registerCheckItemEnt.IsCriticalValue = isCriticalValue; if (isCriticalValue == 'Y') { registerCheckItemEnt.CriticalValueCreatorId = _currentUser.Id; registerCheckItemEnt.CriticalValueCreationTime = DateTime.Now; } registerCheckItemEnt.FollowUpCreatorId = _currentUser.Id; registerCheckItemEnt.FollowUpCreationTime = DateTime.Now; registerCheckItemEnt.IsCriticalValueAudit = 'N'; registerCheckItemEnt.IsReview = 'N'; registerCheckItemEnt.IsFollowUp = 'Y'; await _registerCheckItemRepository.UpdateAsync(registerCheckItemEnt); } await CreateRegisterCheckCritical(registerCheckId, isCriticalValue, CriticalRangeValue); } /// /// 生成registerCheck表危急值相关数据 /// /// /// /// /// private async Task CreateRegisterCheckCritical(Guid registerCheckId, char isCriticalValue, string CriticalRangeValue) { var registerCheckEnt = await _registerCheckRepository.FirstOrDefaultAsync(m => m.Id == registerCheckId); if (registerCheckEnt != null) { registerCheckEnt.CriticalRangeValue = CriticalRangeValue; registerCheckEnt.IsCriticalValue = isCriticalValue; if (isCriticalValue == 'Y') { registerCheckEnt.CriticalValueCreatorId = _currentUser.Id; registerCheckEnt.CriticalValueCreationTime = DateTime.Now; } registerCheckEnt.FollowUpCreatorId = _currentUser.Id; registerCheckEnt.FollowUpCreationTime = DateTime.Now; registerCheckEnt.IsCriticalValueAudit = 'N'; registerCheckEnt.IsReview = 'N'; registerCheckEnt.IsFollowUp = 'Y'; await _registerCheckRepository.UpdateAsync(registerCheckEnt); } } #endregion } }