diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 83b2c8df5..2fc40ff7f 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -737,6 +737,71 @@ 是否生效 + + + 阅片期ID + + + + + 访视ID + + + + + 阅片期ID + + + + + 获取影像阅片预览的Dto + + + + + 项目中心Code + + + + + 访视Id + + + + + 受试者Id + + + + + 受试者名称 + + + + + 备注 + + + + + 最晚拍片日期 + + + + + 截止日期 + + + + + 阅片期ID + + + + + 阅片期名称 + + id @@ -2985,6 +3050,19 @@ + + + 获取影像阅片的预览 + + + + + + 添加对应的阅片 + + + + 分页获取 @@ -3023,13 +3101,6 @@ 获取读片模块 - - - 获取访视的状态 - - - - 获取单条信息 diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingPeriodSetViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingPeriodSetViewModel.cs index 020e4935d..cd9b4e66e 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingPeriodSetViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingPeriodSetViewModel.cs @@ -48,12 +48,89 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public ReadingPeriodStatus IsTakeEffect { get; set; } = ReadingPeriodStatus.NotTakeEffect; + public ReadingSetType ReadingSetType { get; set; } = ReadingSetType.ImageReading; public List SiteIds { get; set; } = new List(); } + public class ReadingToGenerateInDto + { + /// + /// 阅片期ID + /// + + public Guid ReadingPeriodSetId { get; set; } + + /// + /// 访视ID + /// + public List SubjectVisitIds { get; set; } + } + + public class PreviewTheReadingListInDto + { + /// + /// 阅片期ID + /// + + public Guid ReadingPeriodSetId { get; set; } + } + + /// + /// 获取影像阅片预览的Dto + /// + public class PreviewTheReadingListOutDto + { + /// + /// 项目中心Code + /// + public string TrialSiteCode { get; set; } + + /// + /// 访视Id + /// + public Guid SubjectVisitId { get; set; } + + /// + /// 受试者Id + /// + public Guid SubjectId { get; set; } + + /// + /// 受试者名称 + /// + public string SubjectCode { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } + + /// + /// 最晚拍片日期 + /// + public DateTime? LatestScanDate { get; set; } + + /// + /// 截止日期 + /// + public DateTime? ExpirationDate { get; set; } + + /// + /// 阅片期ID + /// + + public Guid ReadingPeriodSetId { get; set; } + + /// + /// 阅片期名称 + /// + public string ReadingPeriodName { get; set; } + + } + public class ReadingPeriodSetView { /// diff --git a/IRaCIS.Core.Application/Service/Reading/Interface/IReadModuleService.cs b/IRaCIS.Core.Application/Service/Reading/Interface/IReadModuleService.cs new file mode 100644 index 000000000..a51dd3a09 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/Interface/IReadModuleService.cs @@ -0,0 +1,16 @@ +//-------------------------------------------------------------------- +// 此代码由T4模板自动生成 byzhouhang 20210918 +// 生成时间 2021-12-23 13:20:59 +// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 +//-------------------------------------------------------------------- + + +using IRaCIS.Core.Domain.Share.Reading; + +namespace IRaCIS.Core.Application.Contracts +{ + public interface IReadModuleService + { + ReadModuleEnum GetVisitSubmitStateEnum(SubjectVisit visit); + } +} \ No newline at end of file diff --git a/IRaCIS.Core.Application/Service/Reading/ReadModuleService.cs b/IRaCIS.Core.Application/Service/Reading/ReadModuleService.cs index adca1879a..798d10ffd 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadModuleService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadModuleService.cs @@ -10,6 +10,8 @@ using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Share.Reading; using MassTransit; using Panda.DynamicWebApi.Attributes; +using IRaCIS.Core.Application.Contracts; +using IRaCIS.Core.Infra.EFCore.Common; namespace IRaCIS.Application.Services { @@ -17,7 +19,7 @@ namespace IRaCIS.Application.Services /// 生成的阅片模块(在大列表上展示的) 阅片期 /// [ApiExplorerSettings(GroupName = "Reading")] - public class ReadModuleService : BaseService + public class ReadModuleService : BaseService { public IRepository _subjectVisitRepository; @@ -50,10 +52,10 @@ namespace IRaCIS.Application.Services { 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) + .Include(x => x.SubjectVisitList).Include(x=>x.Site).Include(x => x.TrialSite) .Select(x => new GetReadModuleDtoOut { - SiteCode = x.Site.SiteCode, + SiteCode = x.TrialSite.TrialSiteCode, SiteId = x.SiteId, SubjectCode = x.Code, SubjectId = x.Id, @@ -65,10 +67,10 @@ namespace IRaCIS.Application.Services IsUrgent = x.IsUrgent, // 是否加急 SubjectVisitId = y.Id, // 访视ID SubjectVisitName=y.VisitName, // 访视名称 - Status= GetVisitSubmitStateEnum(y), // 状态 + Status= ReadingCommon.GetVisitSubmitStateEnum(y), // 状态 CreateTime = y.CreateTime, // 创建时间 SubjectCode = y.Subject.Code, // 受试者code - SiteCode = x.Site.SiteCode, // 中心Code + SiteCode = x.TrialSite.TrialSiteCode, // 中心Code IsFinalVisit=y.IsFinalVisit, // 是否为末次评估 OutPlanPreviousVisitId = y.OutPlanPreviousVisitId, // 上一访视 @@ -101,7 +103,7 @@ namespace IRaCIS.Application.Services Name=y.ModuleName, SubjectId=x.SubjectId, ModuleType=y.ModuleType, - Status= GetVisitSubmitStateEnum(y.SubjectVisit), + Status= ReadingCommon.GetVisitSubmitStateEnum(y.SubjectVisit), SubjectCode= x.SubjectCode, SiteCode=x.SiteCode, SubjectVisitId= y.SubjectVisitId, @@ -123,31 +125,7 @@ namespace IRaCIS.Application.Services }); } - /// - /// 获取访视的状态 - /// - /// - /// - [NonDynamicMethod] - public static ReadModuleEnum GetVisitSubmitStateEnum(SubjectVisit visit) - { - if (visit.SubmitState != SubmitStateEnum.Submitted) // 未提交 - { - return ReadModuleEnum.ImageUpload; - } - else if (visit.AuditState != AuditStateEnum.QCPassed) // 审核未通过 - { - return ReadModuleEnum.ImageUpload; - } - else if (visit.ForwardState != ForwardStateEnum.Forwarded) // 未通过一致性核查 - { - return ReadModuleEnum.ConsistencyCheck; - } - else { - // 暂时 - return ReadModuleEnum.ReadComplete; - } - } + ///// @@ -183,12 +161,12 @@ namespace IRaCIS.Application.Services }).FirstOrDefault(); - var visit = (await _subjectVisitRepository.Where(x => x.Id == GetReadModuleOutDto.SubjectVisitId).FirstOrDefaultAsync()).IfNullThrowConvertException(); + SubjectVisit visit = (await _subjectVisitRepository.Where(x => x.Id == GetReadModuleOutDto.SubjectVisitId).FirstOrDefaultAsync()).IfNullThrowConvertException(); //switch (GetVisitSubmitStateEnum(visit)) //{ // case ReadModuleEnum.ImageUpload: - + // case // break; //}; @@ -205,26 +183,15 @@ namespace IRaCIS.Application.Services [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(); + var visitquery = _subjectVisitRepository.Where(x => x.SubjectId == dto.SubjectId && x.InPlan); - if (dto.ExpirationDate != null) - { - visits = visits.Where(x => x.LatestScanDate <= dto.ExpirationDate.Value).ToList(); - } + visitquery = visitquery.WhereIf(dto.ExpirationDate != null,x => x.LatestScanDate <= dto.ExpirationDate.Value); - if (dto.ExpirationVisitNum != null) - { - visits = visits.Where(x => x.VisitNum <= dto.ExpirationVisitNum).ToList(); - } + visitquery = visitquery.WhereIf(dto.ExpirationVisitNum != null, x => x.VisitNum <= dto.ExpirationVisitNum.Value); - var visit = visits.OrderByDescending(x => x.VisitNum).FirstOrDefault(); + + + var visit = visitquery.OrderByDescending(x => x.VisitNum).FirstOrDefault(); if (visit != null) { @@ -236,7 +203,8 @@ namespace IRaCIS.Application.Services IsUrgent = visit.IsUrgent, ModuleName = dto.Name, SubjectVisitId = visit.Id, - Status = ReadModuleEnum.ImageRead, + ReadingSetType= ReadingSetType.ImageReading, + Status = ReadingCommon.GetVisitSubmitStateEnum(visit), }); diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingPeriodSetService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingPeriodSetService.cs index 1ace23010..eff7e4667 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingPeriodSetService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingPeriodSetService.cs @@ -8,6 +8,8 @@ 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 { @@ -20,15 +22,18 @@ namespace IRaCIS.Application.Services public IRepository _subjectVisitRepository; private readonly IRepository _readingPeriodSetRepository; + private readonly IRepository _readModuleRepository; private readonly IRepository _siteSetRepository; public ReadingPeriodSetService(IRepository subjectVisitRepository, IRepository ReadingPeriodSetRepository, + IRepository readModuleRepository, IRepository SiteSetRepository ) { _subjectVisitRepository = subjectVisitRepository; _readingPeriodSetRepository = ReadingPeriodSetRepository; + this._readModuleRepository = readModuleRepository; _siteSetRepository = SiteSetRepository; } @@ -70,6 +75,81 @@ namespace IRaCIS.Application.Services } } + /// + /// 获取影像阅片的预览 + /// + /// + public async Task> GetPreviewTheReadingList(PreviewTheReadingListInDto inDto) + { + var readset = (await _readingPeriodSetRepository.Where(x => x.Id == inDto.ReadingPeriodSetId).Include(x => x.ReadingPeriodSites).FirstOrDefaultAsync()).IfNullThrowConvertException(); + var visitquery = _subjectVisitRepository.Where(x => x.TrialId == readset.TrialId && x.LatestScanDate != null && x.InPlan); + if (readset.ReadingScope == ReadingScopeEnum.Site) + { + var siteids = readset.ReadingPeriodSites.Select(x => x.Id); + visitquery = visitquery.Where(x => siteids.Contains(x.SiteId)); + } + + visitquery = visitquery.WhereIf(readset.ExpirationDate != null, x => x.LatestScanDate <= readset.ExpirationDate.Value); + visitquery = visitquery.WhereIf(readset.ExpirationVisitNum != null, x => x.VisitNum <= readset.ExpirationVisitNum); + var visits = (await visitquery.Include(x=>x.Subject).Include(x=>x.TrialSite).GroupBy(x => x.SubjectId).Select(x => new + { + SubjectId = x.Key, + visit = x.OrderByDescending(x => x.VisitNum).FirstOrDefault() + }).ToListAsync()).Select(x => x.visit).ToList(); + + + 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, + Remark= readset.Remark + }).ToList(); + } + + /// + /// 添加对应的阅片 + /// + /// + /// + public async Task ReadingToGenerate(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(); + + + return ResponseOutput.Result(res); + } + /// /// 分页获取 /// diff --git a/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs b/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs index 402261fb2..4127e59ab 100644 --- a/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Reading/_MapConfig.cs @@ -16,7 +16,7 @@ namespace IRaCIS.Core.Application.Service CreateMap() .ForMember(d => d.SiteIds, u => u.MapFrom(s => s.ReadingPeriodSites.Select(x => x.SiteId))) - .ForMember(d => d.SiteCodes, u => u.MapFrom(s => s.ReadingPeriodSites.Select(x => x.Site.SiteCode))); + .ForMember(d => d.SiteCodes, u => u.MapFrom(s => s.ReadingPeriodSites.Select(x => x.TrialSite.TrialSiteCode))); //.ForMember(d => d.SiteNames, u => u.MapFrom(s => s.ReadingPeriodSites.SelectMany(x => x.Site.SiteName).ToList())); diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index c9ecf712a..fd8b7b4bf 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -37,6 +37,18 @@ namespace IRaCIS.Core.Domain.Share.Reading Oncology = 4, } + public enum ReadingSetType + { + /// + /// 影像阅片 + /// + ImageReading=0, + + /// + /// 肿瘤阅片 + /// + TumorReading=1, + } /// /// 阅片期范围 diff --git a/IRaCIS.Core.Domain/Reading/ReadModule.cs b/IRaCIS.Core.Domain/Reading/ReadModule.cs index 481fcd130..8416fbf8c 100644 --- a/IRaCIS.Core.Domain/Reading/ReadModule.cs +++ b/IRaCIS.Core.Domain/Reading/ReadModule.cs @@ -90,6 +90,11 @@ namespace IRaCIS.Core.Domain.Models public SubjectVisit SubjectVisit { get; set; } + /// + /// 阅片配置的类型 + /// + public ReadingSetType ReadingSetType { get; set; } + /// /// 访视 diff --git a/IRaCIS.Core.Domain/Reading/ReadingPeriodSet.cs b/IRaCIS.Core.Domain/Reading/ReadingPeriodSet.cs index f1f5733f6..25d89cf67 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingPeriodSet.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingPeriodSet.cs @@ -61,11 +61,15 @@ namespace IRaCIS.Core.Domain.Models /// public Guid CreateUserId { get; set; } - /// - /// 备注 + /// 阅片配置的类型 /// - public string Remark { get; set; } = string.Empty; + public ReadingSetType ReadingSetType { get; set; } + + /// + /// 备注 + /// + public string Remark { get; set; } = string.Empty; public List ReadingPeriodSites { get; set; } = new List(); diff --git a/IRaCIS.Core.Domain/Reading/ReadingPeriodSite.cs b/IRaCIS.Core.Domain/Reading/ReadingPeriodSite.cs index 1a0aa598a..b7e79c18f 100644 --- a/IRaCIS.Core.Domain/Reading/ReadingPeriodSite.cs +++ b/IRaCIS.Core.Domain/Reading/ReadingPeriodSite.cs @@ -49,6 +49,8 @@ namespace IRaCIS.Core.Domain.Models + public TrialSite TrialSite { get; set; } + public ReadingPeriodSet ReadingPeriodSet { get; set; } diff --git a/IRaCIS.Core.Domain/TrialSiteUser/TrialSite.cs b/IRaCIS.Core.Domain/TrialSiteUser/TrialSite.cs index 915f997e2..e0754ce8e 100644 --- a/IRaCIS.Core.Domain/TrialSiteUser/TrialSite.cs +++ b/IRaCIS.Core.Domain/TrialSiteUser/TrialSite.cs @@ -55,5 +55,8 @@ namespace IRaCIS.Core.Domain.Models public List StudyMonitorList { get; set; } + + + public List ReadingPeriodSites { get; set; } } } \ No newline at end of file diff --git a/IRaCIS.Core.Infra.EFCore/Common/ReadingCommon.cs b/IRaCIS.Core.Infra.EFCore/Common/ReadingCommon.cs new file mode 100644 index 000000000..3cfc88715 --- /dev/null +++ b/IRaCIS.Core.Infra.EFCore/Common/ReadingCommon.cs @@ -0,0 +1,41 @@ +using IRaCIS.Core.Domain.Models; +using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Domain.Share.Reading; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace IRaCIS.Core.Infra.EFCore.Common +{ + public static class ReadingCommon + { + /// + /// 获取访视的状态 + /// + /// + /// + + public static ReadModuleEnum GetVisitSubmitStateEnum(SubjectVisit visit) + { + if (visit.SubmitState != SubmitStateEnum.Submitted) // 未提交 + { + return ReadModuleEnum.ImageUpload; + } + else if (visit.AuditState != AuditStateEnum.QCPassed) // 审核未通过 + { + return ReadModuleEnum.ImageUpload; + } + else if (visit.ForwardState != ForwardStateEnum.Forwarded) // 未通过一致性核查 + { + return ReadModuleEnum.ConsistencyCheck; + } + else + { + // 暂时 + return ReadModuleEnum.ReadComplete; + } + } + } +} diff --git a/IRaCIS.Core.Infra.EFCore/EntityConfigration/ReadingPeriodSiteConfigration.cs b/IRaCIS.Core.Infra.EFCore/EntityConfigration/ReadingPeriodSiteConfigration.cs new file mode 100644 index 000000000..14fe438fe --- /dev/null +++ b/IRaCIS.Core.Infra.EFCore/EntityConfigration/ReadingPeriodSiteConfigration.cs @@ -0,0 +1,22 @@ +using IRaCIS.Core.Domain.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + + +namespace IRaCIS.Core.Infra.EFCore.EntityConfigration +{ + public class ReadingPeriodSiteConfigration : IEntityTypeConfiguration + { + + + public void Configure(EntityTypeBuilder builder) + { + + builder + .HasOne(s => s.TrialSite) + .WithMany(c => c.ReadingPeriodSites) + .HasForeignKey(s => new { s.TrialId, s.SiteId }) + .HasPrincipalKey(c => new { c.TrialId, c.SiteId }); + } + } +}