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 { /// /// 第三方公开接口 /// public class ThirdPartyPublicInterfaceAppService : ApplicationService { private readonly IRepository _patientRegisterRepository; private readonly IRepository _registerCheckRepository; private readonly IRepository _registerCheckAsbitemRepository; private readonly IRepository _registerCheckItemRepository; private readonly IRepository _itemRepository; private readonly IRepository _itemTypeRepository; private readonly IRepository _asbitemRepository; private readonly IRepository _patientRepository; private readonly IRepository _sumSuggestionHeaderRepository; private readonly IRepository _sumSuggestionContentRepository; private readonly IRepository _sumSummaryHeaderRepository; private readonly IRepository _sumSummaryContentRepository; private readonly IRepository _registerCheckSummaryRepository; private readonly IRepository _resultStatusRepository; private readonly IRepository _columnReferenceRepository; private readonly IRepository _columnReferenceCodeRepository; private readonly IRepository _columnReferenceInterfaceRepository; private readonly CacheService _cacheService; public ThirdPartyPublicInterfaceAppService( IRepository patientRegisterRepository, CacheService cacheService, IRepository registerCheckRepository, IRepository registerCheckAsbitemRepository, IRepository registerCheckItemRepository, IRepository itemRepository, IRepository itemTypeRepository, IRepository asbitemRepository, IRepository patientRepository, IRepository sumSuggestionHeaderRepository, IRepository sumSuggestionContentRepository, IRepository sumSummaryHeaderRepository, IRepository sumSummaryContentRepository, IRepository registerCheckSummaryRepository, IRepository resultStatusRepository, IRepository columnReferenceRepository, IRepository columnReferenceCodeRepository, IRepository 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; } /// /// 查询体检人员基本信息 /// /// /// [Authorize(PeisPermissions.Third.Default)] [HttpPost("api/Third/ThirdPartyPublicInterface/GetBasicInformationOfMedicalExaminationPersonnel")] public async Task> GetBasicInformationOfMedicalExaminationPersonnelAsync(PublicPatientRegisterNoInputDto input) { if (input == null) { throw new UserFriendlyException($"请求参数错误"); } if (!input.PatientRegisterNos.Any()) throw new UserFriendlyException($"体检编号不能为空"); var listDto = new List(); 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 sumSummarys = new List(); 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 asbitemAbnormals = new List(); 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; } ///// ///// 查询体检明细项目信息 ///// ///// ///// //[Authorize(PeisPermissions.Third.Default)] //[HttpPost("api/Third/ThirdPartyPublicInterface/GetPhysicalExaminationDetailsItemInformation")] //public async Task> 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; //} /// /// 查询pacs条码信息 /// /// /// [HttpPost("api/Third/ThirdPartyPublicInterface/getPatientItems")] public async Task 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 }; } } }