using IRaCIS.Application.Interfaces; using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Application.Filter; using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Application.Service.WorkLoad.DTO; using Microsoft.AspNetCore.Authorization; using IRaCIS.Core.Application.Auth; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Share.Reading; using MassTransit; using IRaCIS.Core.Infra.EFCore.Common; namespace IRaCIS.Application.Services { /// /// 阅片期配置 /// [ApiExplorerSettings(GroupName = "Reading")] public class ReadingPeriodSetService : BaseService { public IRepository _subjectVisitRepository; private readonly IRepository _readingPeriodSetRepository; private readonly IRepository _readModuleRepository; private readonly IRepository _readingPeriodPlanRepository; private readonly IRepository _siteSetRepository; public ReadingPeriodSetService(IRepository subjectVisitRepository, IRepository ReadingPeriodSetRepository, IRepository readModuleRepository, IRepository readingPeriodPlanRepository, IRepository SiteSetRepository ) { _subjectVisitRepository = subjectVisitRepository; _readingPeriodSetRepository = ReadingPeriodSetRepository; this._readModuleRepository = readModuleRepository; this._readingPeriodPlanRepository = readingPeriodPlanRepository; _siteSetRepository = SiteSetRepository; } /// /// 新增或者修改 /// /// /// [HttpPost] public async Task AddOrUpdateReadingPeriodSet(ReadingPeriodSetAddOrEdit addOrEditReadingPeriodSet) { if (addOrEditReadingPeriodSet.Id == null) { var entity = _mapper.Map(addOrEditReadingPeriodSet); entity.ReadingPeriodSites = addOrEditReadingPeriodSet.SiteIds.Select(x => new ReadingPeriodSite() { ReadingPeriodSetId = entity.Id, TrialId =entity.TrialId, SiteId = x, }).ToList(); await _readingPeriodSetRepository.AddAsync(entity, true); return ResponseOutput.Ok(entity.Id); } else { var entity = (await _readingPeriodSetRepository.Where(t => t.Id == addOrEditReadingPeriodSet.Id, true).Include(t => t.ReadingPeriodSites).FirstOrDefaultAsync()).IfNullThrowException(); _mapper.Map(addOrEditReadingPeriodSet, entity); entity.ReadingPeriodSites = addOrEditReadingPeriodSet.SiteIds.Select(x => new ReadingPeriodSite() { ReadingPeriodSetId = entity.Id, TrialId = entity.TrialId, SiteId = x, }).ToList(); var success = await _readingPeriodSetRepository.SaveChangesAsync(); return ResponseOutput.Ok(entity.Id); } } /// /// 获取影像阅片的预览 // 需要清除之前已经选中的 /// /// public async Task> GetPreviewTheReadingList(PreviewTheReadingListInDto inDto) { if (await _readingPeriodPlanRepository.AnyAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId)) { await _readingPeriodPlanRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId); await _readingPeriodPlanRepository.SaveChangesAsync(); } var readSet = (await _readingPeriodSetRepository.Where(x => x.Id == inDto.ReadingPeriodSetId).Include(x => x.ReadingPeriodSites).FirstOrDefaultAsync()).IfNullThrowException(); var visitQuery = _subjectVisitRepository.Where(x => x.TrialId == readSet.TrialId && x.InPlan); if (readSet.ReadingScope == ReadingScopeEnum.Site) { var siteIds = readSet.ReadingPeriodSites.Select(x => x.SiteId); visitQuery = visitQuery.Where(x => siteIds.Contains(x.SiteId)); } visitQuery = visitQuery.WhereIf(readSet.ExpirationDate != null, x => x.LatestScanDate <= readSet.ExpirationDate.Value) .WhereIf(readSet.ExpirationVisitNum != null, x => x.VisitNum <= readSet.ExpirationVisitNum); var subjectVisits = await visitQuery.Include(x => x.Subject).Include(x => x.TrialSite).GroupBy(x => x.SubjectId).Select(x => new { SubjectId = x.Key, Visit = x.ToList() }).ToListAsync(); List visits = new List(); subjectVisits.ForEach(x => { var finalVisit = x.Visit.Where(x => x.IsFinalVisit).FirstOrDefault(); if (finalVisit != null) { var visit = x.Visit.Where(x => x.VisitNum < finalVisit.VisitNum).OrderByDescending(x=>x.VisitNum).FirstOrDefault(); if(visit!=null) { visits.Add(visit); } } else { var visit = x.Visit.OrderByDescending(x => x.VisitNum).FirstOrDefault(); if (visit != null) { visits.Add(visit); } } }); return visits.Where(x => _readModuleRepository.Where(y => y.ReadingSetType == readSet.ReadingSetType && x.Id == y.SubjectVisitId).Count() == 0) .Select(x => new PreviewTheReadingListOutDto { ExpirationDate= readSet.ExpirationDate, SubjectVisitId= x.Id, TrialSiteCode = x.TrialSite.TrialSiteCode, LatestScanDate=x.LatestScanDate, ReadingPeriodName= readSet.ReadingPeriodName, ReadingPeriodSetId= readSet.Id, SubjectCode=x.Subject.Code, SubjectId=x.SubjectId, SubjectVisitName=x.VisitName, //Remark= readset.Remark }).ToList(); } /// /// 添加对应的阅片 /// /// /// public async Task GenerateReadingTask(ReadingToGenerateInDto inDto) { //var readset = (await _readingPeriodSetRepository.Where(x => x.Id == inDto.ReadingPeriodSetId).Include(x => x.ReadingPeriodSites).FirstOrDefaultAsync()).IfNullThrowConvertException(); //var visits = await _subjectVisitRepository.Where(x => inDto.SubjectVisitIds.Contains(x.Id)).ToListAsync(); //List readModules = new List(); //foreach (var item in visits) //{ // readModules.Add(new ReadModule() // { // Id = NewId.NextGuid(), // SubjectId = item.SubjectId, // ModuleType = readset.ReadingSetType == ReadingSetType.ImageReading ? ModuleTypeEnum.Read : ModuleTypeEnum.Oncology, // IsUrgent = item.IsUrgent, // ModuleName = readset.ReadingPeriodName, // SubjectVisitId = item.Id, // ReadingSetType = readset.ReadingSetType, // Status = ReadingCommon.GetVisitSubmitStateEnum(item), // }); //}; //await _readModuleRepository.AddRangeAsync(readModules); //var res = await _subjectVisitRepository.SaveChangesAsync(); List plans = new List(); inDto.SubjectVisitIds.ForEach(x => { plans.Add(new ReadingPeriodPlan() { SubjectVisitId = x, ReadingPeriodSetId = inDto.ReadingPeriodSetId }); }); await _readingPeriodPlanRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId); await _readingPeriodPlanRepository.SaveChangesAsync(); await _readingPeriodPlanRepository.AddRangeAsync(plans); var result = await _readingPeriodPlanRepository.SaveChangesAsync(); return ResponseOutput.Result(result); } /// /// 获取选中的计划 /// /// /// public async Task> GetPreviewTheReadingPlanList(PreviewTheReadingListInDto inDto) { var plans =await _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId).Include(x => x.SubjectVisit).Include(x => x.SubjectVisit.TrialSite).Include(x => x.SubjectVisit.Subject) .Include(x => x.ReadingPeriodSet).ToListAsync(); return plans.Select(x => new PreviewTheReadingListOutDto { ExpirationDate = x.ReadingPeriodSet.ExpirationDate, SubjectVisitId = x.SubjectVisitId, TrialSiteCode = x.SubjectVisit.TrialSite.TrialSiteCode, LatestScanDate =x.SubjectVisit.LatestScanDate, ReadingPeriodName = x.ReadingPeriodSet.ReadingPeriodName, ReadingPeriodSetId = x.ReadingPeriodSet.Id, SubjectCode = x.SubjectVisit.Subject.Code, SubjectId = x.SubjectVisit.SubjectId, SubjectVisitName = x.SubjectVisit.VisitName, //Remark= readset.Remark }).ToList(); } /// /// 分页获取 /// /// /// [HttpPost] public async Task> GetReadingPeriodSetList(ReadingPeriodSetQuery query) { var readQuery =_readingPeriodSetRepository.AsQueryable().Include(x=>x.ReadingPeriodSites) .WhereIf(query.TrialId!=null,x=>x.TrialId==query.TrialId) .WhereIf(query.ReadingPeriodName != null, x => x.ReadingPeriodName.Contains(query.ReadingPeriodName)) .ProjectTo(_mapper.ConfigurationProvider); var pageList= await readQuery.ToPagedListAsync(query.PageIndex, query.PageSize, query.SortField == null ? "CreateTime" : query.SortField, query.SortAsc); return pageList; } /// /// 获取单条 /// /// /// [HttpPost("{id:guid}")] public async Task GetReadingPeriodSet(Guid id) { var data = await _readingPeriodSetRepository.AsQueryable().Include(x => x.ReadingPeriodSites).Where(x => x.Id == id).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); return data; } /// /// 设置阅片期配置是否生效 /// /// /// [HttpPut] public async Task SetReadingPeriodSetEffect(SetReadingPeriodSetEffect indto) { if (indto.IsTakeEffect == ReadingPeriodStatus.TakeEffect) { var plans = _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == indto.Id).Include(x=>x.SubjectVisit) .Include(x => x.ReadingPeriodSet).ToList(); var needAddVisitIds = plans.Select(x => x.SubjectVisitId).ToList(); var repeatVisitNames = _readModuleRepository.Where(x => x.ReadingSetType == ReadingSetType.ImageReading && needAddVisitIds.Contains(x.SubjectVisitId)).Select(x => x.SubjectVisit.VisitName).ToList(); if(repeatVisitNames.Count!=0) { return ResponseOutput.NotOk($"{string.Join(",", repeatVisitNames)}已经添加过阅片期,无法设置生效"); } List readModules = new List(); foreach (var item in plans) { readModules.Add(new ReadModule() { Id = NewId.NextGuid(), SubjectId = item.SubjectVisit.SubjectId, ModuleType = item.ReadingPeriodSet.ReadingSetType == ReadingSetType.ImageReading ? ModuleTypeEnum.Read : ModuleTypeEnum.Oncology, IsUrgent = item.SubjectVisit.IsUrgent, ModuleName = item.ReadingPeriodSet.ReadingPeriodName, SubjectVisitId = item.SubjectVisitId, ReadingSetType = item.ReadingPeriodSet.ReadingSetType, ReadingPeriodSetId= item.ReadingPeriodSet.Id, Status = ReadingCommon.GetVisitSubmitStateEnum(item.SubjectVisit), }); }; await _readModuleRepository.AddRangeAsync(readModules); } else { await _readModuleRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == indto.Id); } var readQuery =await _readingPeriodSetRepository.UpdatePartialFromQueryAsync(indto.Id, x => new ReadingPeriodSet() { IsTakeEffect = indto.IsTakeEffect }); var result = await _readingPeriodSetRepository.SaveChangesAsync(); return ResponseOutput.Result(result); } /// /// 删除 /// /// /// [HttpDelete("{readingPeriodSetId:guid}")] public async Task DeleteReadingPeriodSet(Guid readingPeriodSetId) { var success = await _repository.BatchDeleteAsync(t => t.Id == readingPeriodSetId); return ResponseOutput.Result(success); } } }