You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1579 lines
66 KiB

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<PatientRegister, Guid> _patientRegisterRepository;
private readonly IRepository<RegisterCheckAsbitem, Guid> _registerAsbitemRepository;
private readonly IRepository<Asbitem, Guid> _asbitemRepository;
private readonly IRepository<Item, Guid> _itemRepository;
private readonly IRepository<AsbitemDetail> _asbitemDetailRepository;
private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
private readonly IRepository<RegisterCheckItem> _registerCheckItemRepository;
private readonly IRepository<Diagnosis, Guid> _diagnosisRepository;
private readonly IRepository<ItemResultTemplate, Guid> _itemResultTemplateRepository;
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,
IRepository<Asbitem, Guid> asbitemRepository,
IRepository<Item, Guid> itemRepository,
IRepository<AsbitemDetail> asbitemDetailRepository,
IRepository<RegisterCheck, Guid> registerCheckRepository,
IRepository<RegisterCheckItem> registerCheckItemRepository,
IRepository<Diagnosis, Guid> diagnosisRepository,
IRepository<ItemResultTemplate, Guid> itemResultTemplateRepository,
IRepository<ItemResultMatch, Guid> itemResultMatchRepository,
IRepository<Suggestion, Guid> 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
///// <summary>
///// 医生诊台生成小结
///// </summary>
///// <param name="input"></param>
///// <returns></returns>
//[HttpPost("api/app/diagnosisfunction/getdiagnosisresult")]
//public async Task<List<GetDiagnosisResultDto>> GetDiagnosisResultAsync(GetDiagnosisResultRequestDto input)
//{
// var reslist = new List<GetDiagnosisResultDto>();
// 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;
//}
///// <summary>
///// 组合函数 身高体重 生成
///// </summary>
///// <param name="input"></param>
///// <param name="DiagnosisFunction">诊断函数</param>
///// <param name="IsContinueProcess">处理完是否继续执行项目的诊断函数</param>
///// <returns></returns>
//private async Task<List<GetDiagnosisResultDto>> GetDiagnosisResultInAsbitemHeightAsync(GetDiagnosisResultRequestDto input, string DiagnosisFunction, char IsContinueProcess)
//{
// var reslist = new List<GetDiagnosisResultDto>();
// 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
/// <summary>
/// 医生诊台生成小结
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/diagnosisfunction/getdiagnosisresult")]
public async Task<OkObjectResult> GetDiagnosisResultAsync(GetDiagnosisResultRequestDto input)
{
throw new Exception("禁止使用");
var reslist = new List<GetDiagnosisResult_Detail>();
var suggestionlist = new List<GetDiagnosisSuggestion_Detail>();
// 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<string> diagnosisTrips = new List<string>(); //异常提示
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<GetDiagnosisResultDto> GetDoctorCheckDiagnosisResultAsync(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>
/// 生成计算函数值
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/diagnosisfunction/getcalculationfunctionresult")]
public async Task<GetDiagnosisResultRequestDto> 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
/// <summary>
/// 执行组合项目 诊断函数
/// </summary>
/// <param name="input"></param>
/// <param name="asbitem_data"></param>
/// <param name="item_datas"></param>
/// <param name="patientRegister_data"></param>
/// <param name="diagnosisTrips"></param>
/// <returns></returns>
private async Task<List<GetDiagnosisResult_Detail>> GetDiagnosisResultInAsbitemAsync(GetDiagnosisResultRequestDto input, Asbitem asbitem_data, List<Item> item_datas, PatientRegister patientRegister_data, List<string> diagnosisTrips)
{
var reslist = new List<GetDiagnosisResult_Detail>();
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;
}
/// <summary>
/// 执行项目 诊断函数
/// </summary>
/// <param name="input"></param>
/// <param name="item_datas"></param>
/// <param name="patientRegister_data"></param>
/// <param name="diagnosisTrips"></param>
/// <returns></returns>
private async Task<List<GetDiagnosisResult_Detail>> GetDiagnosisResultInItemAsync(GetDiagnosisResultRequestDto input, List<Item> item_datas, PatientRegister patientRegister_data, List<string> diagnosisTrips)
{
var reslist = new List<GetDiagnosisResult_Detail>();
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;
}
/// <summary>
/// 执行项目 参考范围获取结果
/// </summary>
/// <param name="item"></param>
/// <param name="itemResult"></param>
/// <param name="patientRegister_data"></param>
/// <param name="diagnosisTrips"></param>
/// <returns></returns>
private async Task<string> GetDiagnosisResultInReferenceRangesAsync(Item item, string itemResult, PatientRegister patientRegister_data, List<string> 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<ReferenceRange> referenceRanges = new List<ReferenceRange>();
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;
}
/// <summary>
/// 根据项目结果模板生成
/// 检查项目结果模板,如果和项目结果模板一致,则根据对应的诊断生成小结 完全匹配
/// </summary>
/// <returns></returns>
private async Task<string> 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;
}
/// <summary>
/// 根据项目项目结果匹配(诊断匹配) 生成
/// </summary>
/// <returns></returns>
private async Task<string> 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;
}
/// <summary>
/// 根据数字型范围值对应的诊断匹配 生成
/// 如果在范围外又没有设置诊断,则用项目名称加偏高偏低后缀生成小结(需要根据系统参数)。
/// </summary>
/// <param name="item"></param>
/// <param name="itemResult"></param>
/// <param name="item_ReferenceRange">当前匹配的参考范围</param>
/// <returns></returns>
private async Task<string> 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;
}
/// <summary>
/// 动态编译代码 返回string
/// </summary>
/// <param name="input"></param>
/// <param name="DiagnosisFunctionCode"></param>
/// <param name="item_datas"></param>
/// <returns></returns>
private string GetCodeResult(GetDiagnosisResultRequestDto input, string DiagnosisFunctionCode, List<Item> 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;
}
/// <summary>
/// 替换函数中的标签
/// </summary>
/// <param name="input"></param>
/// <param name="DiagnosisFunctionCode"></param>
/// <param name="item_datas"></param>
/// <returns></returns>
private string ReplaceFunctionLabel(GetDiagnosisResultRequestDto input, string DiagnosisFunctionCode, List<Item> 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;
}
}
}