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 Panda.DynamicWebApi.Attributes; namespace IRaCIS.Application.Services { /// /// 生成的阅片模块(在大列表上展示的) 阅片期 /// [ApiExplorerSettings(GroupName = "Reading")] public class ReadModuleService : BaseService { public IRepository _subjectVisitRepository; private readonly IRepository _subjectRepository; private readonly IRepository _visitstageRepository; private readonly IRepository _readingPeriodSetRepository; private readonly IRepository _readModuleRepository; public ReadModuleService(IRepository subjectVisitRepository, IRepository subjectRepository, IRepository visitstageRepository, IRepository readingPeriodSetRepository, IRepository readModuleRepository ) { _subjectVisitRepository = subjectVisitRepository; this._subjectRepository = subjectRepository; this._visitstageRepository = visitstageRepository; this._readingPeriodSetRepository = readingPeriodSetRepository; this._readModuleRepository = readModuleRepository; } /// /// 获取读片模块 /// [HttpPost] public async Task<(PageOutput,object)> GetReadModule(GetReadModuleDto dto) { var subjectquery = _subjectRepository.WhereIf(dto.TrialId!=null, x => x.TrialId == dto.TrialId) .WhereIf(dto.SubjectId != null, x => x.Id == dto.SubjectId) .Include(x => x.SubjectVisitList).Include(x=>x.Site) .Select(x => new GetReadModuleDtoOut { SiteCode = x.Site.SiteCode, SiteId = x.SiteId, SubjectCode = x.Code, SubjectId = x.Id, Data=x.SubjectVisitList.OrderByDescending(y=>y.InPlan).Select(y=>new GetReadModuleOutDto() { Id = y.Id, //id Name=y.VisitName, ModuleType = y.InPlan ? ModuleTypeEnum.InPlanSubjectVisit : ModuleTypeEnum.OutPlanSubjectVisit, // 模块类型 IsUrgent = x.IsUrgent, // 是否加急 SubjectVisitId = y.Id, // 访视ID SubjectVisitName=y.VisitName, // 访视名称 Status= y.SubmitState== SubmitStateEnum.None|| y.SubmitState== SubmitStateEnum.ToSubmit? ReadModuleEnum.ImageUpload: ReadModuleEnum.ImageUpload, // 状态 CreateTime = y.CreateTime, // 创建时间 SubjectCode = y.Subject.Code, // 受试者code SiteCode = x.Site.SiteCode, // 中心Code IsFinalVisit=y.IsFinalVisit, // 是否为末次评估 OutPlanPreviousVisitId = y.OutPlanPreviousVisitId, // 上一访视 OutPlanPreviousVisitName = y.OutPlanPreviousVisit.VisitName, // 上一访视名称 SiteId = x.Site.Id, // 中心ID IsVisit=true, // 是否为访视 PDState = y.PDState, // PD 进展 IsEnrollmentConfirm=y.IsEnrollmentConfirm, // 入组 SubjectId = x.Id, }).ToList() }); var pageList = await subjectquery.ToPagedListAsync(dto.PageIndex, dto.PageSize, dto.SortField == null|| dto.SortField==string.Empty ? "SiteCode" : dto.SortField, dto.Asc); var subjectisd = pageList.CurrentPageData.Select(x => x.SubjectId).ToList(); var readModules =await _readModuleRepository.Where(x => subjectisd.Contains(x.SubjectId)).Include(x=>x.SubjectVisit) .Include(x => x.ReadModuleModel).ToListAsync(); pageList.CurrentPageData.ForEach(x => { x.Data.AddRange(readModules.Where(y => y.SubjectId == x.SubjectId).Select( y => new GetReadModuleOutDto() { CreateTime = y.CreateTime, Id = y.Id, Name=y.ModuleName, SubjectId=x.SubjectId, ModuleType=y.ModuleType, Status=y.Status, SubjectCode= x.SubjectCode, SiteCode=x.SiteCode, SubjectVisitId= y.SubjectVisitId, SubjectVisitName=y.SubjectVisit?.VisitName, // 截止访视名称 CutOffVisitId = y.SubjectVisitId, // 截止访视 CutOffVisitName = y.SubjectVisit?.VisitName, // 截止访视名称 ReadModuleId=y.ReadModuleId, ReadModuleName=y.ReadModuleModel?.ModuleName, IsUrgent = y.IsUrgent })); x.Data.OrderBy(y => y.ModuleType); }); return (pageList, new { MaxLength = pageList.CurrentPageData.ToList().Max(x => x.Data.Count) }); } ///// ///// 获取访视的状态 ///// ///// ///// //[NonDynamicWebApi] //public async Task GetVisitSubmitStateEnum(SubjectVisit visit) //{ // if(visit.SubmitState == SubmitStateEnum.None||) //} ///// ///// 访视阅片完成添加阅片期模块 ///// ///// //public async Task VisitFinishReadingAddReadModule(VisitFinishReadingAddReadModuleInDto inDto) //{ // var subjectVisit = await _subjectRepository.FirstOrDefaultNoTrackingAsync(x => x.Id == inDto.SubjectVisitId); // List readingPeriodSets= _readingPeriodSetRepository.Where(x=>x.TrialId==inDto.TrialId&&x.IsTakeEffect=&&(x.ReadingScope==ReadingScopeEnum.All||(x.ReadingScope==ReadingScopeEnum.Site&&x.ReadingPeriodSites.Select(y=>y.SiteId).Contains(subjectVisit.SiteId)))) //} /// /// 获取单条信息 /// /// /// [HttpPost] public async Task GetReadModuleSingle(GetReadModuleSingleIndto dto) { var data = await GetReadModule(new GetReadModuleDto() { SubjectId = dto.SubjectId, }); var GetReadModuleOutDto = data.Item1.CurrentPageData.FirstOrDefault().Data.Where(x => x.Id == dto.Id).Select(x => new GetReadModuleSingleOutdto() { Id = x.Id.Value, ModuleType = x.ModuleType, SubjectVisitId = x.SubjectVisitId, SubjectVisitName = x.SubjectVisitName, Stakeholders = string.Empty }).FirstOrDefault(); return GetReadModuleOutDto; } /// /// 添加阅片期 /// /// /// [HttpPost] public async Task AddReadModule(ReadModuleAddDto dto) { var visits =await _subjectVisitRepository.Where(x => x.SubjectId == dto.SubjectId && x.InPlan).Select(x => new { x.Id, x.LatestScanDate, x.VisitNum, x.IsUrgent, }).ToListAsync(); if (dto.ExpirationDate != null) { visits = visits.Where(x => x.LatestScanDate <= dto.ExpirationDate.Value).ToList(); } if (dto.ExpirationVisit != null) { visits = visits.Where(x => x.VisitNum <= dto.ExpirationVisit).ToList(); } var visit = visits.OrderByDescending(x => x.VisitNum).FirstOrDefault(); if (visit != null) { await _readModuleRepository.AddAsync(new ReadModule() { Id= NewId.NextGuid(), SubjectId = dto.SubjectId, ModuleType = ModuleTypeEnum.Read, IsUrgent = visit.IsUrgent, ModuleName = dto.Name, SubjectVisitId = visit.Id, Status = ReadModuleEnum.ImageRead, }); var res = await _readModuleRepository.SaveChangesAsync(); return ResponseOutput.Ok(res); } else { return ResponseOutput.NotOk("No qualified visit was found "); } } ///// ///// 新增或者修改 ///// ///// ///// //[HttpPost] //public async Task AddOrUpdateReadModuleService(ReadModuleAddOrEdit addOrEditReadModule) //{ // var entity = await _repository.InsertOrUpdateAsync(addOrEditReadModule, true); // return ResponseOutput.Ok(entity.Id.ToString()); //} /// /// 删除 /// /// /// [HttpDelete("{readModuleId:guid}")] public async Task DeleteReadModule(Guid readModuleId) { var success = await _readModuleRepository.DeleteFromQueryAsync(t => t.Id == readModuleId, true); return ResponseOutput.Result(true); } } }