|
|
|
@ -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<ItemResultMatch, Guid> _itemResultMatchRepository; |
|
|
|
private readonly IRepository<Suggestion, Guid> _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<PatientRegister, Guid> patientRegisterRepository, |
|
|
|
IRepository<RegisterCheckAsbitem, Guid> registerAsbitemRepository, |
|
|
|
@ -47,8 +65,9 @@ namespace Shentun.Peis.DiagnosisFunctions |
|
|
|
IRepository<ItemResultTemplate, Guid> itemResultTemplateRepository, |
|
|
|
IRepository<ItemResultMatch, Guid> itemResultMatchRepository, |
|
|
|
IRepository<Suggestion, Guid> 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<string> diagnosisTrips = new List<string>(); //异常提示
|
|
|
|
|
|
|
|
if (query.Count > 0) |
|
|
|
if (query.Count() > 0) |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
@ -340,7 +361,671 @@ namespace Shentun.Peis.DiagnosisFunctions |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public async Task<GetDiagnosisResultDto> GetDiagnosisResultAsync2(GetDiagnosisResultRequestDto input) |
|
|
|
{ |
|
|
|
var reslist = new List<GetDiagnosisResult_Detail>(); |
|
|
|
var suggestionlist = new List<GetDiagnosisSuggestion_Detail>(); |
|
|
|
|
|
|
|
|
|
|
|
//根据检查单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<string> diagnosisList = new List<string>(); |
|
|
|
List<string> 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<string> GetItemDiagnosisStringList(List<DoctorCheckItemDiagnosisResult> itemDiagnosisList) |
|
|
|
{ |
|
|
|
var diagnosisList = new List<string>(); |
|
|
|
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; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 加载系统参数
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="medicalCenterId"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
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"); |
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 获取组合项目诊断通过诊断函数
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="doctorCheckDiagnosisInput"></param>
|
|
|
|
/// <param name="diagnosisList"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
private bool GetAsbitemDiagnosisByFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, out List<string> 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<string>(); |
|
|
|
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; |
|
|
|
|
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 获取项目诊断
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="doctorCheckDiagnosisInput"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
private async Task<List<DoctorCheckItemDiagnosisResult>> GetItemDiagnosis(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput) |
|
|
|
{ |
|
|
|
var patientItemDiagnosisInput = new PatientItemDiagnosisInput() |
|
|
|
{ |
|
|
|
SexName = doctorCheckDiagnosisInput.SexName, |
|
|
|
Age = doctorCheckDiagnosisInput.Age |
|
|
|
}; |
|
|
|
|
|
|
|
var diagnosisBuilder = new DiagnosisBuilder(); |
|
|
|
var diagnosisList = new List<DoctorCheckItemDiagnosisResult>(); |
|
|
|
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; |
|
|
|
|
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 通过参考范围获取项目诊断列表
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="sexId"></param>
|
|
|
|
/// <param name="age"></param>
|
|
|
|
/// <param name="itemInput"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
private async Task<string> GetItemDiagnosisByReferenceRanges(char sexId, short? age, ItemInput itemInput) |
|
|
|
{ |
|
|
|
var diagnosisList = new List<string>(); |
|
|
|
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<string> 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; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 通过模板获取诊断
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="itemInput"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
private async Task<List<string>> GetItemDiagnosisByTemplate(ItemInput itemInput) |
|
|
|
{ |
|
|
|
List<string> diagnosisList = new List<string>(); |
|
|
|
//将结果解析到数组中
|
|
|
|
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(); |
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 获取项目诊断通过匹配关系
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="itemInput"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
private async Task<List<string>> GetItemDiagnosisByMatche(ItemInput itemInput) |
|
|
|
{ |
|
|
|
List<string> diagnosisList = new List<string>(); |
|
|
|
//将结果解析到数组中
|
|
|
|
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(); |
|
|
|
} |
|
|
|
/// <summary>
|
|
|
|
/// 去掉结果中的数字符号和分号
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="result"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
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 执行项目计算函数
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -351,20 +1036,20 @@ namespace Shentun.Peis.DiagnosisFunctions |
|
|
|
[HttpPost("api/app/diagnosisfunction/getcalculationfunctionresult")] |
|
|
|
public async Task<GetDiagnosisResultRequestDto> 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; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |