|
|
using JetBrains.Annotations;using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Mvc;using Microsoft.EntityFrameworkCore;using Microsoft.VisualBasic;using NPOI.OpenXmlFormats.Wordprocessing;using Shentun.Peis.Enums;using Shentun.Peis.Models;using Shentun.Peis.PatientRegisters;using SqlSugar;using System;using System.Collections.Generic;using System.Collections.Immutable;using System.Linq;using System.Text;using System.Threading.Tasks;using Volo.Abp.Account;using Volo.Abp.Application.Services;using Volo.Abp.Domain.Repositories;using Volo.Abp.Identity;
namespace Shentun.Peis.SumSummaryReports{ /// <summary>
/// 总诊台报告
/// </summary>
[ApiExplorerSettings(GroupName = "Work")] [Authorize] public class SumSummaryReportAppService : ApplicationService { private readonly IRepository<Patient, Guid> _patientRepository; private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository; private readonly IRepository<IdentityUser, Guid> _identityUserRepository; private readonly IRepository<ItemType, Guid> _itemTypeRepository; private readonly IRepository<RegisterCheckItem> _registerCheckItemRepository; private readonly IRepository<Item, Guid> _itemRepository; private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository; private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository; private readonly IRepository<ResultStatus> _resultStatusRepository; private readonly ISumSummaryReportRepository _sumSummaryReportRepository; private readonly CacheService _cacheService; private readonly IRepository<RegisterCheckSummary, Guid> _registerCheckSummaryRepository; private readonly IRepository<Asbitem, Guid> _asbitemRepository; public SumSummaryReportAppService( IRepository<Patient, Guid> patientRepository, IRepository<RegisterCheck, Guid> registerCheckRepository, IRepository<IdentityUser, Guid> identityUserRepository, IRepository<ItemType, Guid> itemTypeRepository, IRepository<PatientRegister, Guid> patientRegisterRepository, IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository, ISumSummaryReportRepository sumSummaryReportRepository, IRepository<ResultStatus> resultStatusRepository, CacheService cacheService, IRepository<RegisterCheckSummary, Guid> registerCheckSummaryRepository, IRepository<Asbitem, Guid> asbitemRepository, IRepository<Item, Guid> itemRepository, IRepository<RegisterCheckItem> registerCheckItemRepository) { this._registerCheckRepository = registerCheckRepository; this._identityUserRepository = identityUserRepository; this._itemTypeRepository = itemTypeRepository; this._patientRegisterRepository = patientRegisterRepository; this._registerCheckAsbitemRepository = registerCheckAsbitemRepository; this._sumSummaryReportRepository = sumSummaryReportRepository; _cacheService = cacheService; _resultStatusRepository = resultStatusRepository; _registerCheckSummaryRepository = registerCheckSummaryRepository; _asbitemRepository = asbitemRepository; _itemRepository = itemRepository; _registerCheckItemRepository = registerCheckItemRepository; _patientRepository = patientRepository; }
/// <summary>
/// 获取明细结果报告
/// </summary>
/// <param name="input">人员登记ID</param>
/// <returns></returns>
[HttpPost("api/app/SumSummaryReport/GetDetailResults")] public async Task<List<SumSummaryReportDetailResultDto>> GetDetailResultsAsync(PatientRegisterIdInputDto input) { List<SumSummaryReportDetailResultDto> msg = new List<SumSummaryReportDetailResultDto>();
var userlist = await _identityUserRepository.GetListAsync(); var resultStatus = await _resultStatusRepository.GetListAsync(); var list = (from patient in await _patientRepository.GetQueryableAsync() join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on patient.Id equals patientRegister.PatientId 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 registerCheckSummary in await _registerCheckSummaryRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckSummary.RegisterCheckId join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id 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 asbitem.ItemTypeId equals itemType.Id where patientRegister.Id == input.PatientRegisterId select new { patient, patientRegister, registerCheck, registerCheckSummary, registerCheckAsbitem, asbitem, registerCheckItem, item, itemType
}).AsNoTracking().ToList();
if (!list.Any()) { return null; } //获取历次结果
var histroyList = (from patient in await _patientRepository.GetQueryableAsync() join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on patient.Id equals patientRegister.PatientId 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 registerCheckSummary in await _registerCheckSummaryRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckSummary.RegisterCheckId join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id 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 asbitem.ItemTypeId equals itemType.Id where patient.Id == list.First().patient.Id && (patientRegister.CompleteFlag == PatientRegisterCompleteFlag.SumCheck || patientRegister.CompleteFlag == PatientRegisterCompleteFlag.Audit) && patientRegister.MedicalTimes < list.First().patientRegister.MedicalTimes select new { patient, patientRegister, registerCheck, registerCheckSummary, registerCheckAsbitem, asbitem, registerCheckItem, item, itemType
}).OrderByDescending(o => o.patientRegister.MedicalTimes).ToList(); //将子项目类别设置为父项目类别
var itemTypes = await _itemTypeRepository.GetListAsync(); foreach (var listItem in list) { var parentItemType = itemTypes.Where(o => o.Id == listItem.itemType.ParentId).FirstOrDefault(); if (parentItemType != null) { listItem.asbitem.DisplayOrder = listItem.itemType.DisplayOrder * 1000 + listItem.asbitem.DisplayOrder; listItem.itemType.DisplayName = parentItemType.DisplayName; listItem.itemType.DisplayOrder = parentItemType.DisplayOrder;
} } var detailedResultsList_Asbitems = new List<SumSummaryReportDetailResultWithAsbitem>(); var registerCheckIds = list.OrderBy(o => o.itemType.DisplayOrder) .OrderBy(o => o.asbitem.DisplayOrder) .Select(o => o.registerCheck.Id).Distinct().ToList(); foreach (var registerCheckId in registerCheckIds) { var listItem = list.Where(o => o.registerCheck.Id == registerCheckId).First(); var detailedResultsList_Asbitem = new SumSummaryReportDetailResultWithAsbitem() {
ItemTypeName = listItem.itemType.DisplayName, AsbitemName = string.Join(",", list.Where(o => o.registerCheck.Id == registerCheckId) .OrderBy(o => o.itemType.DisplayOrder).OrderBy(o => o.asbitem.DisplayOrder) .Select(o => o.asbitem.DisplayName).Distinct().ToList()), ItemTypeDisplayOrder = listItem.itemType.DisplayOrder, AsbitemDisplayOrder = listItem.asbitem.DisplayOrder, CheckDate = ((DateTime)listItem.registerCheck.CheckDate).Date, CheckDoctorName = EntityHelper.GetCheckDoctorName(listItem.registerCheck.CheckDoctorId, userlist), Items = list.Where(o => o.registerCheck.Id == registerCheckId) .OrderBy(o => o.itemType.DisplayOrder).OrderBy(o => o.asbitem.DisplayOrder).OrderBy(o => o.item.DisplayOrder) .Select(o => new SumSummaryReportDetailResultWithItem() { ItemId = o.registerCheckItem.ItemId, ItemName = o.item.DisplayName, ItemResult = o.registerCheckItem.Result, ReferenceRangeValue = o.registerCheckItem.ReferenceRangeValue, CriticalRangeValue = o.registerCheckItem.CriticalRangeValue, Unit = o.registerCheckItem.Unit, ResultStatusId = o.registerCheckItem.ResultStatusId, ResultStatusName = (resultStatus.Where(x => x.Id == o.registerCheckItem.ResultStatusId).FirstOrDefault() == null) ? "" : resultStatus.Where(x => x.Id == o.registerCheckItem.ResultStatusId).FirstOrDefault().ReportPrompt, ReportFontColor = (resultStatus.Where(x => x.Id == o.registerCheckItem.ResultStatusId).FirstOrDefault() == null) ? 0 : resultStatus.Where(x => x.Id == o.registerCheckItem.ResultStatusId).FirstOrDefault().ReportFontColor, ReportBackgroundColor = (resultStatus.Where(x => x.Id == o.registerCheckItem.ResultStatusId).FirstOrDefault() == null) ? 16777215 : resultStatus.Where(x => x.Id == o.registerCheckItem.ResultStatusId).FirstOrDefault().ReportBackgroundColor, }).Distinct().ToList(), Summarys = list.Where(o => o.registerCheck.Id == registerCheckId) .OrderBy(o=>o.registerCheckSummary.DisplayOrder) .GroupBy(o=>o.registerCheckSummary.Summary) .Select(o=> new SumSummaryReportDetailResultWithSummary(){ Summary = o.FirstOrDefault().registerCheckSummary.Summary }) .ToList<SumSummaryReportDetailResultWithSummary>(),
}; detailedResultsList_Asbitem.Summarys = detailedResultsList_Asbitem.Summarys.Distinct().ToList(); foreach (var registerCheckItem in detailedResultsList_Asbitem.Items) { var historyRegisterCheckItems = histroyList.GroupBy(o=>o.registerCheckItem) .Select(o => o.First().registerCheckItem ) .Where(o => o.ItemId == registerCheckItem.ItemId) .Distinct().ToList();
for (var i = 0; i < historyRegisterCheckItems.Count; i++) { if(i== 0) { registerCheckItem.PreviousItemResult = historyRegisterCheckItems[i].Result; registerCheckItem.PreviousReportFontColor = (resultStatus.Where(x => x.Id == historyRegisterCheckItems[i].ResultStatusId).FirstOrDefault() == null) ? 0 : resultStatus.Where(x => x.Id == historyRegisterCheckItems[i].ResultStatusId).FirstOrDefault().ReportFontColor; registerCheckItem.PreviousReportBackgroundColor = (resultStatus.Where(x => x.Id == historyRegisterCheckItems[i].ResultStatusId).FirstOrDefault() == null) ? 16777215 : resultStatus.Where(x => x.Id == historyRegisterCheckItems[i].ResultStatusId).FirstOrDefault().ReportBackgroundColor; } else if(i== 1) { registerCheckItem.PreviousTwoItemResult = historyRegisterCheckItems[i].Result; registerCheckItem.PreviousTwoReportFontColor = (resultStatus.Where(x => x.Id == historyRegisterCheckItems[i].ResultStatusId).FirstOrDefault() == null) ? 0 : resultStatus.Where(x => x.Id == historyRegisterCheckItems[i].ResultStatusId).FirstOrDefault().ReportFontColor; registerCheckItem.PreviousTwoReportBackgroundColor = (resultStatus.Where(x => x.Id == historyRegisterCheckItems[i].ResultStatusId).FirstOrDefault() == null) ? 16777215 : resultStatus.Where(x => x.Id == historyRegisterCheckItems[i].ResultStatusId).FirstOrDefault().ReportBackgroundColor; } } }
detailedResultsList_Asbitems.Add(detailedResultsList_Asbitem);
}
var grouplist = detailedResultsList_Asbitems.OrderBy(o=>o.ItemTypeDisplayOrder) .OrderBy(o=>o.AsbitemDisplayOrder) .GroupBy(g => g.ItemTypeName);
foreach (var g in grouplist) { var glist = g.ToList(); var resultlist = new SumSummaryReportDetailResultDto { ItemTypeName = glist.FirstOrDefault().ItemTypeName, Asbitems = glist };
msg.Add(resultlist); }
return msg; }
/// <summary>
/// 获取项目类别对比报告
/// </summary>
/// <param name="PatientId">档案ID(不是档案号)</param>
/// <returns></returns>
[HttpGet("api/app/sumsummaryreport/getitemtypecontrastlist")] public async Task<List<ItemTypeContrastListDto>> GetItemTypeContrastListAsync(Guid PatientId) { List<ItemTypeContrastListDto> msg = new List<ItemTypeContrastListDto>();
var query = from a in await _patientRegisterRepository.GetQueryableAsync() join b in await _registerCheckRepository.GetQueryableAsync() on a.Id equals b.PatientRegisterId join c in await _registerCheckAsbitemRepository.GetQueryableAsync() on b.Id equals c.RegisterCheckId join d in await _asbitemRepository.GetQueryableAsync() on c.AsbitemId equals d.Id into dd from ad in dd.DefaultIfEmpty() join e in await _itemTypeRepository.GetQueryableAsync() on ad.ItemTypeId equals e.Id join f in await _registerCheckSummaryRepository.GetQueryableAsync() on b.Id equals f.RegisterCheckId into ff from af in ff.DefaultIfEmpty() where a.PatientId == PatientId && a.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration select new { RegisterDate = a.CreationTime, PatientRegisterId = a.Id, ItemTypeName = e.DisplayName, Summary = af != null ? af.Summary : "" };
var grouplist = query.ToList().GroupBy(g => new { g.PatientRegisterId, g.ItemTypeName });
foreach (var g in grouplist) { var glist = g.ToList(); var resultlist = new ItemTypeContrastListDto {
ItemTypeName = glist.FirstOrDefault().ItemTypeName, RegisterDate = DataHelper.ConversionDateToString(glist.FirstOrDefault().RegisterDate), Summarys = string.Join("\n", glist.Select(s => s.Summary).ToList()) }; msg.Add(resultlist); }
return msg.OrderBy(o => o.ItemTypeName).ThenBy(o => o.RegisterDate).ToList(); }
/// <summary>
/// 获取历次综述
/// </summary>
/// <param name="PatientId">档案ID(不是档案号)</param>
/// <returns></returns>
[HttpGet("api/app/sumsummaryreport/gethistoricalreviewlist")] public async Task<List<HistoricalReviewListDto>> GetHistoricalReviewListAsync(Guid PatientId) { List<ItemTypeContrastListDto> msg = new List<ItemTypeContrastListDto>();
var userlist = await _identityUserRepository.GetListAsync();
var entlist = (await _patientRegisterRepository.GetDbSetAsync()) .Include(x => x.SumSummaryHeaders) .ThenInclude(x => x.SumSummaryContents) .Include(x => x.SumSuggestionHeaders) .ThenInclude(x => x.SumSuggestionContents) .Where(m => m.PatientId == PatientId && (m.SumSummaryHeaders.Count > 0 || m.SumSuggestionHeaders.Count > 0) && m.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration) .ToList();
//以registercheck表为主
var registercheckList = entlist.Select(s => new HistoricalReviewListDto { MedicalTimes = s.MedicalTimes, SummaryDate = DataHelper.ConversionDateToString(s.SummaryDate), SummaryDoctor = _cacheService.GetSurnameAsync(s.SummaryDoctorId).Result, SumSuggestions = SetSumSuggestions(s.SumSuggestionHeaders.ToList()), SumSummarys = SetSumSummarys(s.SumSummaryHeaders.ToList()) }).OrderByDescending(o => o.MedicalTimes).ToList();
return registercheckList; }
/// <summary>
/// 获取横向对比 左侧组合项目
/// </summary>
/// <param name="PatientId"></param>
/// <returns></returns>
[HttpGet("api/app/sumsummaryreport/gethorizontalcomparisonasbitemlist")] public async Task<List<HorizontalComparisonAsbitemListDto>> GetHorizontalComparisonAsbitemListAsync(Guid PatientId) {
List<HorizontalComparisonAsbitemListDto> entdto = new List<HorizontalComparisonAsbitemListDto>();
var entlist = (await _registerCheckAsbitemRepository.GetDbSetAsync()) .Include(x => x.Asbitem) .Include(x => x.RegisterCheck) .Include(x => x.PatientRegister) .Where(m => m.PatientRegister.PatientId == PatientId && m.PatientRegister.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration) .ToList();
var grouplist = entlist.GroupBy(o => o.AsbitemId);
foreach (var g in grouplist) { //var resultlist = new ItemTypeContrastListDto
//{
// ItemTypeName = glist.FirstOrDefault().ItemTypeName,
// RegisterDate = glist.FirstOrDefault().RegisterDate,
// Summarys = string.Join("\n", glist.Select(s => s.Summarys).ToList())
//};
var glist = g.ToList();
var ent = new HorizontalComparisonAsbitemListDto { AsbitemId = glist.Any() ? glist.FirstOrDefault().AsbitemId : Guid.Empty, AsbitemName = glist.Any() ? glist.FirstOrDefault().Asbitem.DisplayName : "", CompleteFlag = glist.Any() ? glist.OrderByDescending(m => m.CreationTime).FirstOrDefault().RegisterCheck.CompleteFlag : RegisterCheckCompleteFlag.UnChecked };
entdto.Add(ent); }
//var entdto = entlist.Select(s => new HorizontalComparisonAsbitemListDto
//{
// AsbitemId = s.AsbitemId,
// AsbitemName = s.Asbitem.DisplayName,
// CompleteFlag = s.RegisterChecks.FirstOrDefault(m => m.CreationTime)
//}).ToList();
return entdto; }
/// <summary>
/// 获取横向对比数据
/// </summary>
/// <param name="PatientId"></param>
/// <param name="AsbitemId"></param>
/// <returns></returns>
[HttpGet("api/app/sumsummaryreport/gethorizontalcomparisonlist")] public async Task<List<HorizontalComparisonListDto>> GetHorizontalComparisonListAsync(Guid PatientId, Guid AsbitemId) {
var entlist = await _sumSummaryReportRepository.GetHorizontalComparisonListAsync(PatientId, AsbitemId);
var entdto = ObjectMapper.Map<List<HorizontalComparisonListEntity>, List<HorizontalComparisonListDto>>(entlist);
return entdto; }
/// <summary>
/// 生成历次综述医生小结
/// </summary>
/// <param name="SumSummaryHeaders"></param>
/// <returns></returns>
private string SetSumSummarys(List<SumSummaryHeader> SumSummaryHeaders) { StringBuilder msg = new StringBuilder(); if (SumSummaryHeaders.Count > 0) { foreach (var item in SumSummaryHeaders) { msg.Append("* " + item.SummaryTitle + ":" + "<br/>"); if (item.SumSummaryContents.Count > 0) { var SumSummaryContents = item.SumSummaryContents.ToList(); foreach (var item2 in SumSummaryContents) { msg.Append("(" + SumSummaryContents.IndexOf(item2) + 1 + ")" + item2.SummaryContent + "<br/>"); } } } } return msg.ToString(); }
/// <summary>
/// 生成历次综述医生建议
/// </summary>
/// <param name="SumSuggestionHeaders"></param>
/// <returns></returns>
private string SetSumSuggestions(List<SumSuggestionHeader> SumSuggestionHeaders) { StringBuilder msg = new StringBuilder(); if (SumSuggestionHeaders.Count > 0) { foreach (var item in SumSuggestionHeaders) { msg.Append("* " + item.SuggestionTitle + ":" + "<br/>"); if (item.SumSuggestionContents.Count > 0) { var SumSuggestionContents = item.SumSuggestionContents.ToList(); foreach (var item2 in SumSuggestionContents) { msg.Append("(" + SumSuggestionContents.IndexOf(item2) + 1 + ")" + item2.SuggestionContent + "<br/>"); } } } } return msg.ToString(); } }}
|