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.

428 lines
25 KiB

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.VisualBasic;
using NPOI.SS.Formula.Functions;
using Shentun.Peis.Enums;
using Shentun.Peis.Models;
using Shentun.Peis.PatientRegisters;
using Shentun.Peis.Permissions;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
namespace Shentun.Peis.ThirdPartyPublicInterfaces
{
/// <summary>
/// 第三方公开接口
/// </summary>
public class ThirdPartyPublicInterfaceAppService : ApplicationService
{
private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;
private readonly IRepository<RegisterCheckItem> _registerCheckItemRepository;
private readonly IRepository<Item, Guid> _itemRepository;
private readonly IRepository<ItemType, Guid> _itemTypeRepository;
private readonly IRepository<Asbitem, Guid> _asbitemRepository;
private readonly IRepository<Patient, Guid> _patientRepository;
private readonly IRepository<SumSuggestionHeader, Guid> _sumSuggestionHeaderRepository;
private readonly IRepository<SumSuggestionContent, Guid> _sumSuggestionContentRepository;
private readonly IRepository<SumSummaryHeader, Guid> _sumSummaryHeaderRepository;
private readonly IRepository<SumSummaryContent, Guid> _sumSummaryContentRepository;
private readonly IRepository<RegisterCheckSummary, Guid> _registerCheckSummaryRepository;
private readonly IRepository<ResultStatus> _resultStatusRepository;
private readonly IRepository<ColumnReference, Guid> _columnReferenceRepository;
private readonly IRepository<ColumnReferenceCode, Guid> _columnReferenceCodeRepository;
private readonly IRepository<ColumnReferenceInterface, Guid> _columnReferenceInterfaceRepository;
private readonly CacheService _cacheService;
public ThirdPartyPublicInterfaceAppService(
IRepository<PatientRegister, Guid> patientRegisterRepository,
CacheService cacheService,
IRepository<RegisterCheck, Guid> registerCheckRepository,
IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
IRepository<RegisterCheckItem> registerCheckItemRepository,
IRepository<Item, Guid> itemRepository,
IRepository<ItemType, Guid> itemTypeRepository,
IRepository<Asbitem, Guid> asbitemRepository,
IRepository<Patient, Guid> patientRepository,
IRepository<SumSuggestionHeader, Guid> sumSuggestionHeaderRepository,
IRepository<SumSuggestionContent, Guid> sumSuggestionContentRepository,
IRepository<SumSummaryHeader, Guid> sumSummaryHeaderRepository,
IRepository<SumSummaryContent, Guid> sumSummaryContentRepository,
IRepository<RegisterCheckSummary, Guid> registerCheckSummaryRepository,
IRepository<ResultStatus> resultStatusRepository,
IRepository<ColumnReference, Guid> columnReferenceRepository,
IRepository<ColumnReferenceCode, Guid> columnReferenceCodeRepository,
IRepository<ColumnReferenceInterface, Guid> columnReferenceInterfaceRepository)
{
_patientRegisterRepository = patientRegisterRepository;
_cacheService = cacheService;
_registerCheckRepository = registerCheckRepository;
_registerCheckAsbitemRepository = registerCheckAsbitemRepository;
_registerCheckItemRepository = registerCheckItemRepository;
_itemRepository = itemRepository;
_itemTypeRepository = itemTypeRepository;
_asbitemRepository = asbitemRepository;
_patientRepository = patientRepository;
_sumSuggestionHeaderRepository = sumSuggestionHeaderRepository;
_sumSuggestionContentRepository = sumSuggestionContentRepository;
_sumSummaryHeaderRepository = sumSummaryHeaderRepository;
_sumSummaryContentRepository = sumSummaryContentRepository;
_registerCheckSummaryRepository = registerCheckSummaryRepository;
_resultStatusRepository = resultStatusRepository;
_columnReferenceRepository = columnReferenceRepository;
_columnReferenceCodeRepository = columnReferenceCodeRepository;
_columnReferenceInterfaceRepository = columnReferenceInterfaceRepository;
}
/// <summary>
/// 查询体检人员基本信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[Authorize(PeisPermissions.Third.Default)]
[HttpPost("api/Third/ThirdPartyPublicInterface/GetBasicInformationOfMedicalExaminationPersonnel")]
public async Task<List<BasicInformationOfMedicalExaminationPersonnelDto>> GetBasicInformationOfMedicalExaminationPersonnelAsync(PublicPatientRegisterNoInputDto input)
{
if (input == null)
{
throw new UserFriendlyException($"请求参数错误");
}
if (!input.PatientRegisterNos.Any())
throw new UserFriendlyException($"体检编号不能为空");
var listDto = new List<BasicInformationOfMedicalExaminationPersonnelDto>();
var patientRegisterList = (await _patientRegisterRepository.GetQueryableAsync()).Include(x => x.Patient)
.Where(m => input.PatientRegisterNos.Contains(m.PatientRegisterNo)
&& m.CompleteFlag == PatientRegisterCompleteFlag.SumCheck).ToList();
if (patientRegisterList.Any())
{
foreach (var patientRegisterEnt in patientRegisterList)
{
//基础信息
var result = new BasicInformationOfMedicalExaminationPersonnelDto
{
BirthDate = patientRegisterEnt.BirthDate != null ? patientRegisterEnt.BirthDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
PatientRegisterNo = patientRegisterEnt.PatientRegisterNo,
CompleteFlag = patientRegisterEnt.CompleteFlag,
IsMedicalStart = patientRegisterEnt.IsMedicalStart,
MedicalStartDate = patientRegisterEnt.MedicalStartDate != null ? patientRegisterEnt.MedicalStartDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
PatientName = patientRegisterEnt.PatientName,
SexName = _cacheService.GetSexNameAsync(patientRegisterEnt.SexId).Result,
SummaryDoctorName = _cacheService.GetSurnameAsync(patientRegisterEnt.SummaryDoctorId).Result,
SummaryDate = patientRegisterEnt.SummaryDate != null ? patientRegisterEnt.SummaryDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
CustomerOrgName = _cacheService.GetTopCustomerOrgNameAsync(patientRegisterEnt.CustomerOrgId).Result,
IdNo = patientRegisterEnt.Patient.IdNo,
MobileTelephone = patientRegisterEnt.Patient.MobileTelephone
};
var registerCheckItemList = 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
join itemType in await _itemTypeRepository.GetQueryableAsync() on item.ItemTypeId equals itemType.Id into itemTypeTemp
from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty()
join resultStatus in await _resultStatusRepository.GetQueryableAsync() on registerCheckItem.ResultStatusId equals resultStatus.Id into resultStatusTemp
from resultStatusHaveEmpty in resultStatusTemp.DefaultIfEmpty()
where patientRegister.Id == patientRegisterEnt.Id
select new
{
registerCheckItem,
ItemName = item.DisplayName,
DepartmentName = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.DisplayName : "",
ResultStatusName = resultStatusHaveEmpty != null ? resultStatusHaveEmpty.DisplayName : "正常"
};
//明细项目
result.Items = registerCheckItemList.Select(s => new BasicInformationOfMedicalExaminationPersonnelItemDto
{
DepartmentName = s.DepartmentName,
ItemName = s.ItemName,
ReferenceRangeValue = s.registerCheckItem.ReferenceRangeValue,
Result = s.registerCheckItem.Result,
Unit = s.registerCheckItem.Unit,
ResultStatusName = s.ResultStatusName
}).ToList();
//组合项目情况
#region 组合项目情况
var sumSummaryList = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
join sumSummaryHeader in await _sumSummaryHeaderRepository.GetQueryableAsync() on patientRegister.Id equals sumSummaryHeader.PatientRegisterId
join sumSummaryContent in await _sumSummaryContentRepository.GetQueryableAsync() on sumSummaryHeader.Id equals sumSummaryContent.SumSummaryHeaderId
where patientRegister.Id == patientRegisterEnt.Id
orderby sumSummaryHeader.DisplayOrder, sumSummaryContent.DisplayOrder
select new
{
sumSummaryHeaderId = sumSummaryHeader.Id,
SummaryTitle = sumSummaryHeader.SummaryTitle,
SummaryContent = sumSummaryContent.SummaryContent
}).ToList();
var sumSummaryGroup = sumSummaryList.GroupBy(g => g.sumSummaryHeaderId);
List<BasicInformationOfMedicalExaminationPersonnelSumSummaryDto> sumSummarys = new List<BasicInformationOfMedicalExaminationPersonnelSumSummaryDto>();
foreach (var item in sumSummaryGroup)
{
sumSummarys.Add(new BasicInformationOfMedicalExaminationPersonnelSumSummaryDto
{
SumSummaryTitle = item.FirstOrDefault().SummaryTitle,
SumSummaryContent = string.Join(',', item.Select(s => s.SummaryContent.Trim().Replace("\n", "")).ToList())
});
}
result.SumSummarys = sumSummarys;
#endregion
#region 组合项目异常
var registerCheckSummaryList = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
join registerCheck in (await _registerCheckRepository.GetQueryableAsync())
.Include(x => x.RegisterCheckAsbitems).ThenInclude(x => x.Asbitem).AsQueryable()
on patientRegister.Id equals registerCheck.PatientRegisterId
join registerCheckSummary in await _registerCheckSummaryRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckSummary.RegisterCheckId
where patientRegister.Id == patientRegisterEnt.Id
select new
{
registerCheck,
registerCheckSummary
}).ToList();
var registerCheckSummaryGroup = registerCheckSummaryList.GroupBy(g => g.registerCheck.Id);
List<BasicInformationOfMedicalExaminationPersonnelAsbitemAbnormalDto> asbitemAbnormals = new List<BasicInformationOfMedicalExaminationPersonnelAsbitemAbnormalDto>();
foreach (var item in registerCheckSummaryGroup)
{
//默认结果集合
var defaultResultList = item.FirstOrDefault().registerCheck.RegisterCheckAsbitems.Select(s => s.Asbitem.DefaultResult.Trim().Replace("\n", "")).ToList();
var summaryList = item.Where(m => !defaultResultList.Contains(m.registerCheckSummary.Summary.Trim().Replace("\n", ""))).Select(s => s.registerCheckSummary.Summary).ToList();
if (summaryList.Any())
{
asbitemAbnormals.Add(new BasicInformationOfMedicalExaminationPersonnelAsbitemAbnormalDto
{
AsbitemName = string.Join(',', item.FirstOrDefault().registerCheck.RegisterCheckAsbitems.Select(s => s.Asbitem.DisplayName).ToList()),
AsbitemAbnormalResult = string.Join(',', summaryList),
});
}
}
result.AsbitemAbnormals = asbitemAbnormals;
#endregion
#region 总检建议
//总检建议
var sumSuggestionsList = from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
join sumSuggestionHeader in await _sumSuggestionHeaderRepository.GetQueryableAsync() on patientRegister.Id equals sumSuggestionHeader.PatientRegisterId
join sumSuggestionContent in await _sumSuggestionContentRepository.GetQueryableAsync() on sumSuggestionHeader.Id equals sumSuggestionContent.SumSuggestionHeaderId
where patientRegister.Id == patientRegisterEnt.Id
orderby sumSuggestionHeader.DisplayOrder, sumSuggestionContent.DisplayOrder
select new
{
SuggestionTitle = sumSuggestionHeader.SuggestionTitle,
SuggestionFlag = sumSuggestionHeader.SuggestionFlag,
SuggestionContent = sumSuggestionContent.SuggestionContent
};
result.SumSuggestions = sumSuggestionsList.Select(s => new BasicInformationOfMedicalExaminationPersonnelSumSuggestionDto
{
DiagnosisName = s.SuggestionTitle,
CommonReasons = sumSuggestionsList.Where(m => m.SuggestionFlag == SuggestionTypeFlag.CommonReasons)
.Select(ss => new BasicInformationOfMedicalExaminationPersonnelSumSuggestionDetailDto
{
SumSuggestionContent = ss.SuggestionContent
}).ToList(),
HealthGuidances = sumSuggestionsList.Where(m => m.SuggestionFlag == SuggestionTypeFlag.HealthGuidance)
.Select(ss => new BasicInformationOfMedicalExaminationPersonnelSumSuggestionDetailDto
{
SumSuggestionContent = ss.SuggestionContent
}).ToList(),
MedicalInterpretations = sumSuggestionsList.Where(m => m.SuggestionFlag == SuggestionTypeFlag.MedicalInterpretation)
.Select(ss => new BasicInformationOfMedicalExaminationPersonnelSumSuggestionDetailDto
{
SumSuggestionContent = ss.SuggestionContent
}).ToList()
}).ToList();
#endregion
listDto.Add(result);
}
}
else
{
throw new UserFriendlyException($"体检编号不正确");
}
return listDto;
}
///// <summary>
///// 查询体检明细项目信息
///// </summary>
///// <param name="input"></param>
///// <returns></returns>
//[Authorize(PeisPermissions.Third.Default)]
//[HttpPost("api/Third/ThirdPartyPublicInterface/GetPhysicalExaminationDetailsItemInformation")]
//public async Task<List<PhysicalExaminationDetailsItemInformationDto>> GetPhysicalExaminationDetailsItemInformationAsync(PublicPatientRegisterNoInputDto input)
//{
// if (input == null)
// {
// throw new UserFriendlyException($"请求参数错误");
// }
// var query = 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
// join itemType in await _itemTypeRepository.GetQueryableAsync() on item.ItemTypeId equals itemType.Id into itemTypeTemp
// from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty()
// where patientRegister.PatientRegisterNo == input.PatientRegisterNo
// select new
// {
// PatientRegisterNo = patientRegister.PatientRegisterNo,
// registerCheckItem,
// ItemName = item.DisplayName,
// ItemTypeName = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.DisplayName : ""
// };
// if (query.Count() == 0)
// {
// throw new UserFriendlyException($"条码号不正确");
// }
// var entList = query.Select(s => new PhysicalExaminationDetailsItemInformationDto
// {
// ItemName = s.ItemName,
// ItemResult = s.registerCheckItem.Result,
// ItemTypeName = s.ItemTypeName,
// PatientRegisterNo = s.PatientRegisterNo,
// ReferenceRangeValue = s.registerCheckItem.ReferenceRangeValue,
// Unit = s.registerCheckItem.Unit
// }).ToList();
// return entList;
//}
/// <summary>
/// 查询pacs条码信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/Third/ThirdPartyPublicInterface/getPatientItems")]
public async Task<PatientPacsInfoDto> GetPatientPacsInfoAsync(PatientPacsInfoInputDto input)
{
if (input == null)
{
throw new UserFriendlyException($"请求参数错误");
}
if (string.IsNullOrEmpty(input.tjbh))
throw new UserFriendlyException($"体检编号不能为空");
var query = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id into patientTemp
from patientHaveEmpty in patientTemp.DefaultIfEmpty()
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 asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id
join itemType in await _itemTypeRepository.GetQueryableAsync() on asbitem.ItemTypeId equals itemType.Id into itemTypeTemp
from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty()
where registerCheck.CheckRequestNo == input.tjbh
orderby asbitem.DisplayOrder ascending
select new
{
patientRegister,
IdNo = patientHaveEmpty != null ? patientHaveEmpty.IdNo : "",
MobileTelephone = patientHaveEmpty != null ? patientHaveEmpty.MobileTelephone : "",
CheckRequestNo = registerCheck.CheckRequestNo,
asbitem,
ItemTypeName = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.DisplayName : "",
ItemTypeId = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.Id.ToString() : ""
});
var NoSetupDeviceType = query.Where(m => m.asbitem.DeviceTypeId == null || m.asbitem.DeviceTypeId == Guid.Empty).Select(s => s.asbitem.DisplayName).ToList();
if (NoSetupDeviceType.Any())
throw new UserFriendlyException($"检查项目{string.Join(',', NoSetupDeviceType)}未设置仪器类别");
if (!string.IsNullOrEmpty(input.xmlx))
{
//检查类型检索
//仪器类别ID
var deviceTypeId = (from columnReference in await _columnReferenceRepository.GetQueryableAsync()
join columnReferenceCode in await _columnReferenceCodeRepository.GetQueryableAsync() on columnReference.Id equals columnReferenceCode.ColumnReferenceId
join columnReferenceInterface in await _columnReferenceInterfaceRepository.GetQueryableAsync() on columnReferenceCode.Id equals columnReferenceInterface.ColumnReferenceCodeId
where columnReference.DisplayName == "仪器类别" && columnReferenceInterface.InterfaceCodeValue == input.xmlx
select columnReferenceCode.CodeValue).FirstOrDefault();
query = query.Where(m => m.asbitem.DeviceTypeId == Guid.Parse(deviceTypeId));
}
var queryList = query.ToList();
if (queryList.Count() == 0)
throw new UserFriendlyException($"体检编号不存在");
var patientInfo = new PatientPacsInfo_PatientInfoDto
{
addr = "",
tjbh = queryList.FirstOrDefault().CheckRequestNo,
csrq = queryList.FirstOrDefault().patientRegister.BirthDate != null ? queryList.FirstOrDefault().patientRegister.BirthDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
djr = _cacheService.GetSurnameAsync(queryList.FirstOrDefault().patientRegister.CreatorId).Result,
djrq = queryList.FirstOrDefault().patientRegister.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"),
lxdh = queryList.FirstOrDefault().MobileTelephone,
nl = queryList.FirstOrDefault().patientRegister.Age.ToString(),
sfzh = queryList.FirstOrDefault().IdNo,
tjrq = queryList.FirstOrDefault().patientRegister.MedicalStartDate != null ? queryList.FirstOrDefault().patientRegister.MedicalStartDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
xb = queryList.FirstOrDefault().patientRegister.SexId == 'M' ? "1" : (queryList.FirstOrDefault().patientRegister.SexId == 'F' ? "2" : "9"),
xm = queryList.FirstOrDefault().patientRegister.PatientName
};
var items = queryList.Select(s => new PatientPacsInfo_ItemsDto
{
ksbm = s.ItemTypeId,
ksmc = s.ItemTypeName,
sqdh = s.CheckRequestNo + "-" + (queryList.IndexOf(s) + 1),
xmbh = s.asbitem.Id.ToString(),
xmlx = "1",
xmmc = s.asbitem.DisplayName,
}).ToList();
return new PatientPacsInfoDto
{
PatientInfo = patientInfo,
Items = items
};
}
}
}