Browse Source

LIS结果导入

bjmzak
DESKTOP-G961P6V\Zhh 2 years ago
parent
commit
4e943a54f9
  1. 2
      src/Shentun.ColumnReferencePlugIns/Shentun.Peis.PlugIns.csproj
  2. 64
      src/Shentun.Peis.Application.Contracts/ImportLisResults/CreateImportLisResultDto.cs
  3. 13
      src/Shentun.Peis.Application.Contracts/ImportLisResults/IImportLisResultAppService.cs
  4. 199
      src/Shentun.Peis.Application/ImportLisResults/ImportLisResultAppService.cs
  5. 8
      src/Shentun.Peis.Application/ReferenceRanges/ReferenceRangeAppService.cs
  6. 54
      src/Shentun.Peis.Domain/ReferenceRanges/ReferenceRangeManager.cs
  7. 68
      test/Shentun.Peis.Application.Tests/ImportLisResultAppServiceTest.cs
  8. 5
      test/Shentun.Peis.Application.Tests/appsettings.json

2
src/Shentun.ColumnReferencePlugIns/Shentun.Peis.PlugIns.csproj

@ -17,6 +17,8 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shentun.Peis.Application.Contracts\Shentun.Peis.Application.Contracts.csproj" />
<ProjectReference Include="..\Shentun.Peis.HttpApi.Client\Shentun.Peis.HttpApi.Client.csproj" />
<ProjectReference Include="..\Shentun.Utilities\Shentun.Utilities.csproj" />
</ItemGroup>

64
src/Shentun.Peis.Application.Contracts/ImportLisResults/CreateImportLisResultDto.cs

@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shentun.Peis.ImportLisResults
{
public class CreateImportLisResultDto
{
public string LisRequestNo { get; set; }
/// 项目编号
/// </summary>
public Guid ItemId { get; set; }
/// <summary>
/// 项目名称
/// </summary>
public string ItemName { get; set; }
/// <summary>
/// 结果
/// </summary>
public string? Result { get; set; }
/// <summary>
/// 单位
/// </summary>
public string? Unit { get; set; }
/// <summary>
/// 参考范围
/// </summary>
public string? ReferenceRangeValue { get; set; }
/// <summary>
/// 危急值范围
/// </summary>
public string? CriticalRangeValue { get; set; }
/// <summary>
/// 危急值
/// </summary>
public string? CriticalValue { get; set; }
/// <summary>
/// 报告单状态
/// </summary>
public string? ResultStatusId { get; set; } = "01";//01-正常
/// <summary>
/// 报告单提示
/// </summary>
public string ReportPrompt { get; set; }
/// <summary>
/// 检查医生
/// </summary>
public string? CheckDoctorName { get; set; }
/// <summary>
/// 检查日期
/// </summary>
public DateTime? CheckDate { get; set; }
public Guid ExecOrganizationUnitId { get; set; }
}
}

13
src/Shentun.Peis.Application.Contracts/ImportLisResults/IImportLisResultAppService.cs

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace Shentun.Peis.ImportLisResults
{
public interface IImportLisResultAppService
{
public Task ImportResultAsync(List<CreateImportLisResultDto> input);
}
}

199
src/Shentun.Peis.Application/ImportLisResults/ImportLisResultAppService.cs

@ -1,10 +1,14 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Shentun.Peis.DiagnosisFunctions;
using Shentun.Peis.Enums;
using Shentun.Peis.Items;
using Shentun.Peis.Models;
using Shentun.Peis.PlugIns;
using Shentun.Peis.ReferenceRanges;
using Shentun.Peis.RegisterCheckItems;
using Shentun.Peis.RegisterChecks;
using Shentun.Peis.Units;
using System;
using System.Collections.Generic;
using System.Linq;
@ -18,7 +22,7 @@ using Volo.Abp.Users;
namespace Shentun.Peis.ImportLisResults
{
public class ImportLisResultAppService : ApplicationService
public class ImportLisResultAppService : ApplicationService,IImportLisResultAppService
{
private readonly IRepository<RegisterCheckItem> _registerCheckItemRepository;
private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
@ -26,9 +30,11 @@ namespace Shentun.Peis.ImportLisResults
private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;
private readonly IRepository<LisRequest, Guid> _lisRequestRepository;
private readonly IRepository<Item, Guid> _itemRepository;
private readonly IRepository<RegisterCheckSummary, Guid> _registerCheckSummaryRepository;
private readonly IRepository<RegisterCheckSuggestion, Guid> _registerCheckSuggestionRepository;
private readonly IRepository<IdentityUser, Guid> _userRepository;
private readonly IRepository<Unit, Guid> _unitRepository;
private readonly RegisterCheckManager _registerCheckManager;
private readonly RegisterCheckItemManager _registerCheckItemManager;
private readonly CacheService _cacheService;
@ -38,6 +44,11 @@ namespace Shentun.Peis.ImportLisResults
private readonly IRepository<UserItemType> _userItemTypeRepository;
private readonly IRepository<Asbitem, Guid> _asbitemRepository;
private readonly DiagnosisFunctionAppService _diagnosisFunctionAppService;
private readonly ReferenceRangeManager _referenceRangeManager;
private readonly ItemManager _itemManager;
private readonly UnitManager _unitManager;
private readonly RegisterCheckAppService _registerCheckAppService;
private List<Unit> _unitList;
public ImportLisResultAppService(IRepository<RegisterCheck, Guid> registerCheckRepository,
IRepository<RegisterCheckItem> registerCheckItemRepository,
IRepository<PatientRegister, Guid> patientRegisterRepository,
@ -55,7 +66,13 @@ namespace Shentun.Peis.ImportLisResults
IRepository<Asbitem, Guid> asbitemRepository,
IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
IRepository<LisRequest, Guid> lisRequestRepository,
DiagnosisFunctionAppService diagnosisFunctionAppService)
IRepository<Unit, Guid> unitRepository,
DiagnosisFunctionAppService diagnosisFunctionAppService,
ReferenceRangeManager referenceRangeManager,
IRepository<Item, Guid> itemRepository,
ItemManager itemManager,
UnitManager unitManager,
RegisterCheckAppService registerCheckAppService)
{
_registerCheckRepository = registerCheckRepository;
_userRepository = userRepository;
@ -75,13 +92,22 @@ namespace Shentun.Peis.ImportLisResults
_registerCheckAsbitemRepository = registerCheckAsbitemRepository;
_lisRequestRepository = lisRequestRepository;
_diagnosisFunctionAppService = diagnosisFunctionAppService;
_referenceRangeManager = referenceRangeManager;
_itemRepository = itemRepository;
_itemManager = itemManager;
_unitRepository = unitRepository;
_unitList = _unitRepository.GetListAsync().Result;
_unitManager = unitManager;
_registerCheckAppService = registerCheckAppService;
}
[HttpGet("api/app/ImportLisResult/ImportResult")]
public async Task ImportResultAsync(List<LisResult> input)
public async Task ImportResultAsync(List<CreateImportLisResultDto> input)
{
//设置结果
var list = (from registerCheck in await _registerCheckRepository.GetQueryableAsync()
var list = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
join registerCheck in await _registerCheckRepository.GetQueryableAsync()
on patientRegister.Id equals registerCheck.PatientRegisterId
join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync()
on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync()
@ -91,6 +117,7 @@ namespace Shentun.Peis.ImportLisResults
where input.Select(o => o.LisRequestNo).ToList().Contains(lisRequest.LisRequestNo)
select new
{
patientRegister,
registerCheck,
registerCheckAsbitem,
registerCheckItem,
@ -98,11 +125,12 @@ namespace Shentun.Peis.ImportLisResults
}).ToList();
var lisRequestNos = input.Select(o => o.LisRequestNo).Distinct().ToList();
foreach(var inputItem in input)
var registerChecks = new List<RegisterCheck>();
foreach (var inputItem in input)
{
var lisRequestItem = list.Where(o=>o.lisRequest.LisRequestNo == inputItem.LisRequestNo
&& o.registerCheckItem.ItemId == new Guid(inputItem.ItemId)).FirstOrDefault();
if(lisRequestItem == null)
var lisRequestItem = list.Where(o => o.lisRequest.LisRequestNo == inputItem.LisRequestNo
&& o.registerCheckItem.ItemId == inputItem.ItemId).FirstOrDefault();
if (lisRequestItem == null)
{
continue;
}
@ -113,29 +141,166 @@ namespace Shentun.Peis.ImportLisResults
Unit = inputItem.Unit,
CriticalRangeValue = inputItem.CriticalRangeValue
};
//修改参考范围
await UpdateItemReferenceRangeValueAsync(inputItem.ItemId, lisRequestItem.patientRegister.SexId,
lisRequestItem.patientRegister.Age, inputItem.ReferenceRangeValue);
//修改单位
await UpdateItemUnitAsync(inputItem.ItemId, inputItem.Unit);
await _registerCheckItemManager.UpdateRegisterCheckItemAsync(itemSource, lisRequestItem.registerCheckItem);
await _registerCheckItemRepository.UpdateAsync(lisRequestItem.registerCheckItem);
//await _registerCheckItemManager.UpdateRegisterCheckItemAsync(itemSource, lisRequestItem.registerCheckItem);
//await _registerCheckItemRepository.UpdateAsync(lisRequestItem.registerCheckItem);
if (!registerChecks.Where(o => o.Id == lisRequestItem.registerCheck.Id).ToList().Any())
{
lisRequestItem.registerCheck.CheckDoctorId = inputItem.CheckDoctorName;
lisRequestItem.registerCheck.CheckDate = inputItem.CheckDate;
registerChecks.Add(lisRequestItem.registerCheck);
}
}
//生成小结
var registerChecks = list.Select(o=>o.registerCheck).Distinct().ToList();
foreach(var registerCheck in registerChecks)
//保存结果
foreach (var registerCheck in registerChecks)
{
var updateCheckResultDto = new UpdateCheckResultDto()
{
RegisterCheckId = registerCheck.Id,
CheckDoctorId = registerCheck.CheckDoctorId,
CheckDate = registerCheck.CheckDate,
RegisterCheckItems = list.Where(o => o.registerCheck.Id == registerCheck.Id)
.Select(o => new UpdateRegisterCheckItemDetail()
{
ItemId = o.registerCheckItem.ItemId,
Result = o.registerCheckItem.Result,
}).ToList()
};
var getDiagnosisResultRequestDto = new GetDiagnosisResultRequestDto()
{
RegisterCheckId = registerCheck.Id,
Items = list.Where(o=>o.registerCheck.Id == registerCheck.Id)
.Select(o=>new GetDiagnosisResultRequest_Item()
Items = list.Where(o => o.registerCheck.Id == registerCheck.Id)
.Select(o => new GetDiagnosisResultRequest_Item()
{
ItemId = o.registerCheckItem.ItemId,
Result = o.registerCheckItem.Result,
}).ToList()
};
//生成小结
var summarry = await _diagnosisFunctionAppService.GetDoctorCheckDiagnosisResultAsync(getDiagnosisResultRequestDto);
for (var i = 0; i < summarry.DiagnosisResultDetails.Count; i++)
{
updateCheckResultDto.Summarys.Add(new UpdateRegisterCheckSummaryDetail()
{
Summary = summarry.DiagnosisResultDetails[i].DiagnosisResult,
SummaryFlag = '0'
});
}
await _registerCheckAppService.UpdateCheckResult(updateCheckResultDto);
}
//保存小结
}
private async Task UpdateItemReferenceRangeValueAsync(Guid itemId, char sexId, int? age, string referenceRangeValue)
{
var referenceRanges = (await _referenceRangeRepository.GetQueryableAsync()).Where(o => o.ItemId == itemId).ToList();
if (age == null) age = 30;
if (string.IsNullOrWhiteSpace(referenceRangeValue))
{
return;
}
var item = await _itemRepository.GetAsync(itemId);
ReferenceRange referenceRange = null;
if (_referenceRangeManager.IsNumberReferenceRange(referenceRangeValue))
{
item.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number;
await _itemRepository.UpdateAsync(item,true);
referenceRange = referenceRanges.Where(o => o.ForSexId == sexId
&& age >= o.AgeLowerLimit && age <= o.AgeUpperLimit
&& o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).FirstOrDefault();
if (referenceRange != null)
{
referenceRange.ReferenceRangeValue = referenceRangeValue;
await _referenceRangeRepository.UpdateAsync(referenceRange, true);
return;
}
referenceRange = referenceRanges.Where(o => o.ForSexId == ForSexFlag.All
&& age >= o.AgeLowerLimit && age <= o.AgeUpperLimit
&& o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).FirstOrDefault();
if (referenceRange != null)
{
referenceRange.ReferenceRangeValue = referenceRangeValue;
await _referenceRangeRepository.UpdateAsync(referenceRange, true);
return;
}
referenceRange = new ReferenceRange()
{
ItemId = itemId,
AgeLowerLimit = 0,
AgeUpperLimit = 200,
ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number,
ReferenceRangeValue = referenceRangeValue,
ForSexId = ForSexFlag.All
};
referenceRange = _referenceRangeManager.Create(referenceRange);
await _referenceRangeRepository.InsertAsync(referenceRange, true);
return;
}
item.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Character;
await _itemRepository.UpdateAsync(item, true);
referenceRange = referenceRanges.Where(o => o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Character).FirstOrDefault();
if (referenceRange != null)
{
referenceRange.ReferenceRangeValue = referenceRangeValue;
await _referenceRangeRepository.UpdateAsync(referenceRange, true);
return;
}
referenceRange = new ReferenceRange()
{
ItemId = itemId,
AgeLowerLimit = 0,
AgeUpperLimit = 200,
ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Character,
ReferenceRangeValue = referenceRangeValue,
ForSexId = ForSexFlag.All
};
referenceRange = _referenceRangeManager.Create(referenceRange);
await _referenceRangeRepository.InsertAsync(referenceRange, true);
return;
}
private async Task UpdateItemUnitAsync(Guid itemId,string unitName)
{
if (string.IsNullOrWhiteSpace(unitName))
{
return;
}
unitName = unitName.Trim();
var item = await _itemRepository.GetAsync(itemId);
var unit = _unitList.Where(o => o.DisplayName.Trim().ToLower() == unitName.ToLower()).FirstOrDefault();
if (unit != null)
{
if (item.UnitId == unit.Id)
{
return;
}
item.UnitId = unit.Id;
await _itemRepository.UpdateAsync(item, true);
return;
}
unit = new Unit()
{
DisplayName = unitName,
};
unit = await _unitManager.CreateAsync(unit);
await _unitRepository.InsertAsync(unit, true);
_unitList.Add(unit);
}
}
}

8
src/Shentun.Peis.Application/ReferenceRanges/ReferenceRangeAppService.cs

@ -152,7 +152,7 @@ namespace Shentun.Peis.ReferenceRanges
public override async Task<ReferenceRangeDto> CreateAsync(CreateReferenceRangeDto input)
{
var createEntity = ObjectMapper.Map<CreateReferenceRangeDto, ReferenceRange>(input);
var entity = _manager.CreateAsync(createEntity);
var entity = _manager.Create(createEntity);
entity = await Repository.InsertAsync(entity);
//更新项目表参考范围类型
// await _itemManager.UpdateRangeTypeAsync(input.ItemId, input.ReferenceRangeTypeFlag);
@ -172,7 +172,7 @@ namespace Shentun.Peis.ReferenceRanges
{
var entity = await Repository.GetAsync(id);
var sourceEntity = ObjectMapper.Map<UpdateReferenceRangeDto, ReferenceRange>(input);
_manager.UpdateAsync(sourceEntity, entity);
_manager.Update(sourceEntity, entity);
entity = await Repository.UpdateAsync(entity);
//更新项目表参考范围类型
@ -194,7 +194,7 @@ namespace Shentun.Peis.ReferenceRanges
////先删除字符型数据
//await Repository.DeleteAsync(m => m.ItemId == input.ItemId && m.ReferenceRangeTypeFlag == input.ReferenceRangeTypeFlag);
var entity = _manager.CreateAsync(createEntity);
var entity = _manager.Create(createEntity);
entity = await Repository.InsertAsync(entity);
//更新项目表参考范围类型
await _itemManager.UpdateRangeTypeAsync(input.ItemId, input.ReferenceRangeTypeFlag);
@ -214,7 +214,7 @@ namespace Shentun.Peis.ReferenceRanges
{
var entity = await Repository.GetAsync(id);
var sourceEntity = ObjectMapper.Map<UpdateReferenceRangeTextDto, ReferenceRange>(input);
_manager.UpdateTextAsync(sourceEntity, entity);
_manager.UpdateText(sourceEntity, entity);
entity = await Repository.UpdateAsync(entity);
//更新项目表参考范围类型

54
src/Shentun.Peis.Domain/ReferenceRanges/ReferenceRangeManager.cs

@ -6,7 +6,9 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Domain.Services;
@ -35,12 +37,12 @@ namespace Shentun.Peis.ReferenceRanges
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public ReferenceRange CreateAsync(
public ReferenceRange Create(
ReferenceRange entity
)
{
Verify(entity);
return new ReferenceRange
return new ReferenceRange(GuidGenerator.Create())
{
AgeLowerLimit = entity.AgeLowerLimit,
AgeUpperLimit = entity.AgeUpperLimit,
@ -63,7 +65,7 @@ namespace Shentun.Peis.ReferenceRanges
/// <param name="sourceEntity"></param>
/// <param name="targetEntity"></param>
/// <returns></returns>
public void UpdateAsync(
public void Update(
ReferenceRange sourceEntity,
ReferenceRange targetEntity
)
@ -88,7 +90,7 @@ namespace Shentun.Peis.ReferenceRanges
/// <param name="sourceEntity"></param>
/// <param name="targetEntity"></param>
/// <returns></returns>
public void UpdateTextAsync(
public void UpdateText(
ReferenceRange sourceEntity,
ReferenceRange targetEntity
)
@ -254,5 +256,49 @@ namespace Shentun.Peis.ReferenceRanges
}
}
public bool IsNumberReferenceRange(string referenceRangeValue)
{
if(string.IsNullOrWhiteSpace(referenceRangeValue))
{
new UserFriendlyException("调用IsNumberReferenceRange时参考范围不能为空");
}
if (Regex.Matches(referenceRangeValue, "≧").Count() == 1)
{
return true;
}
if (Regex.Matches(referenceRangeValue, ">=").Count() == 1)
{
return true;
}
if (Regex.Matches(referenceRangeValue, "≥").Count() == 1)
{
return true;
}
if (Regex.Matches(referenceRangeValue, ">=").Count() == 1)
{
return true;
}
if (Regex.Matches(referenceRangeValue, "≤").Count() == 1)
{
return true;
}
if (Regex.Matches(referenceRangeValue, "≦").Count() == 1)
{
return true;
}
if (Regex.Matches(referenceRangeValue, "<=").Count() == 1)
{
return true;
}
if (Regex.Matches(referenceRangeValue, "-").Count() == 1)
{
return true;
}
if (Regex.Matches(referenceRangeValue, "--").Count() == 1)
{
return true;
}
return false;
}
}
}

68
test/Shentun.Peis.Application.Tests/ImportLisResultAppServiceTest.cs

@ -0,0 +1,68 @@
using Shentun.Peis.ChargeRequests;
using Shentun.Peis.ImportLisResults;
using Shentun.Peis.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Uow;
using Xunit;
using Xunit.Abstractions;
namespace Shentun.Peis
{
public class ImportLisResultAppServiceTest : PeisApplicationTestBase
{
private readonly IRepository<ImportLisResult> _repository;
private readonly ImportLisResultAppService _appService;
private readonly ITestOutputHelper _output;
private readonly IUnitOfWorkManager _unitOfWorkManager;
public ImportLisResultAppServiceTest(ITestOutputHelper testOutputHelper)
{
_output = testOutputHelper;
_unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>();
_repository = GetRequiredService<IRepository<ImportLisResult>>();
_appService = GetRequiredService<ImportLisResultAppService>();
}
[Fact]
public async Task ImportResultAsync()
{
using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true))
{
var entity = new List<CreateImportLisResultDto>()
{
new CreateImportLisResultDto()
{
LisRequestNo = "T202404290063",
ItemId = new Guid("3a1203c2-c974-de89-ee07-3427f22fa8f7"),
Result = "32",
Unit = "g/l",
ReferenceRangeValue = "0-20"
},
new CreateImportLisResultDto()
{
LisRequestNo = "T202404290063",
ItemId = new Guid("3a1203c2-ccd1-e29b-84b4-26bd28bbe12e"),
Result = "51.63",
Unit = "ml",
ReferenceRangeValue = "0-20"
},
new CreateImportLisResultDto()
{
LisRequestNo = "T202404290063",
ItemId = new Guid("3a1203c2-d3b1-61fe-94e9-1210fd5555ec"),
Result = "123.001",
Unit = "次",
ReferenceRangeValue = "0-20"
}
};
await _appService.ImportResultAsync(entity);
await unitOfWork.CompleteAsync();
}
}
}
}

5
test/Shentun.Peis.Application.Tests/appsettings.json

@ -8,6 +8,11 @@
//"Default": "Host=140.143.162.39;Port=5432;Database=ShentunPeis070703;User ID=postgres;Password=shentun123;",
"Default": "Host=10.1.12.140;Port=5432;Database=ShentunPeis;User ID=postgres;Password=st123;"
},
"RemoteServices": {
"Default": {
"BaseUrl": "http://localhost:53929/"
}
},
"OpenIddict": {
"Applications": {
"Peis_Web": {

Loading…
Cancel
Save