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 { [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 _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 string _isAddAbnormalResult; private string _isAddReferenceRange; private string _isAutoAddSuffix; private string _lowerSuffix; private string _highSuffix; string[] _numArry = { "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩", "⑪", "⑫", "⑬", "⑭", "⑮", "⑯", "⑰", "⑱", "⑲", "⑳" }; public DiagnosisFunctionAppService( IRepository patientRegisterRepository, IRepository registerAsbitemRepository, IRepository asbitemRepository, IRepository itemRepository, IRepository asbitemDetailRepository, IRepository registerCheckRepository, IRepository registerCheckItemRepository, IRepository diagnosisRepository, IRepository itemResultTemplateRepository, IRepository itemResultMatchRepository, IRepository suggestionRepository, CacheService cacheService, SysParmValueManager sysParmValueManager) { 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; } #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")] 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 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 执行项目计算函数 /// /// 生成计算函数值 /// /// /// [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; } } }