Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details

Uat_IRC_Net8
he 2025-07-14 13:55:10 +08:00
commit 4417767e35
8 changed files with 49 additions and 19 deletions

View File

@ -87,7 +87,7 @@ namespace IRaCIS.Core.Application.Contracts.Dicom.DTO
public bool IsReading { get; set; } public bool IsReading { get; set; }
public bool IsDeleted { get; set; } public bool IsDeleted { get; set; }
public long? FileSize { get; set; }
public Guid? StudyId { get; set; } public Guid? StudyId { get; set; }

View File

@ -107,8 +107,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO
public string Modalities { get; set; } public string Modalities { get; set; }
public string Description { get; set; } public string Description { get; set; }
public int SeriesCount { get; set; } public int SeriesCount { get; set; }
public int InstanceCount { get; set; } public int InstanceCount { get; set; }
public int ReadingSeriesCount { get; set; }
public int ReadingInstanceCount { get; set; }
} }
public class NoneDicomStudyBasicInfo public class NoneDicomStudyBasicInfo
@ -128,6 +133,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc.DTO
public string Description { get; set; } = string.Empty; public string Description { get; set; } = string.Empty;
public int ReadingFileCount { get; set; }
} }
} }

View File

@ -884,6 +884,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
subjectCode = inQuery.SubjectCode; subjectCode = inQuery.SubjectCode;
} }
TaskState? taskState = null;
if (inQuery.VisitTaskId != null) if (inQuery.VisitTaskId != null)
{ {
//考虑到一致性分析,必须要这个编号进行过滤 //考虑到一致性分析,必须要这个编号进行过滤
@ -894,20 +895,25 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code, SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
SubjectId = t.SubjectId, SubjectId = t.SubjectId,
t.DoctorUserId, t.DoctorUserId,
t.IsAnalysisCreate t.IsAnalysisCreate,
t.TaskState
}).FirstNotNullAsync(); }).FirstNotNullAsync();
subjectId = taskInfo.SubjectId; subjectId = taskInfo.SubjectId;
subjectCode = taskInfo.SubjectCode; subjectCode = taskInfo.SubjectCode;
doctorUserId = (Guid)taskInfo.DoctorUserId!; doctorUserId = (Guid)taskInfo.DoctorUserId!;
isAnalysisCreate = taskInfo.IsAnalysisCreate; isAnalysisCreate = taskInfo.IsAnalysisCreate;
taskState = taskInfo.TaskState;
} }
var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
&& t.SourceSubjectVisitId != null && t.DoctorUserId == doctorUserId) && t.SourceSubjectVisitId != null && t.DoctorUserId == doctorUserId)
//满足 有序或者随机只看到当前任务的dicom 非dicom检查 //满足 有序或者随机只看到当前任务的dicom 非dicom检查
.WhereIf(inQuery.VisitTaskId == null, t => t.TaskState == TaskState.Effect)//从待阅列表进入,要筛选出有效的,任务可能重阅了,也要看到该任务的 .WhereIf(inQuery.VisitTaskId == null, t => t.TaskState == TaskState.Effect)//从待阅列表进入,要筛选出有效的,任务可能重阅了,也要看到该任务的
.WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId) .WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
.WhereIf(taskState == TaskState.Effect || taskState == TaskState.Freeze, t => t.TaskState == TaskState.Effect)//subject 随机可能当前阅片人有退回任务此时传递了任务Id但是要看整个subject得要只留生效的
.WhereIf(taskState != null && taskState != TaskState.Effect && taskState != TaskState.Freeze, t => t.Id == inQuery.VisitTaskId) //非生效只查当前任务
.ProjectTo<SubjectCRCImageUploadedDto>(_mapper.ConfigurationProvider); .ProjectTo<SubjectCRCImageUploadedDto>(_mapper.ConfigurationProvider);
//这里过滤是否是一致性分析的 //这里过滤是否是一致性分析的

View File

@ -1,5 +1,6 @@
using IRaCIS.Core.Application.Contracts.Dicom.DTO; using IRaCIS.Core.Application.Contracts.Dicom.DTO;
using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -19,8 +20,9 @@ namespace IRaCIS.Core.Application.Services
//医生读片那一块有耦合,关键序列 这里暂时留存 //医生读片那一块有耦合,关键序列 这里暂时留存
/// <summary> 指定资源Id获取Dicom检查所属序列信息列表 </summary> /// <summary> 指定资源Id获取Dicom检查所属序列信息列表 </summary>
/// <param name="studyId"> Dicom检查的Id </param> /// <param name="studyId"> Dicom检查的Id </param>
/// <param name="isReading"></param>
[HttpGet, Route("{studyId:guid}")] [HttpGet, Route("{studyId:guid}")]
public async Task<IResponseOutput<List<DicomSeriesDTO>>> List(Guid studyId) public async Task<IResponseOutput<List<DicomSeriesDTO>>> List(Guid studyId, bool? isReading)
{ {
//质控的时候要标记序列和instance 删除 ,所以要返回全部,但是 质控通过后pm 进去看的时候要看过滤后的 //质控的时候要标记序列和instance 删除 ,所以要返回全部,但是 质控通过后pm 进去看的时候要看过滤后的
@ -32,14 +34,16 @@ namespace IRaCIS.Core.Application.Services
//断点 //断点
var seriesList = await _seriesRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters() var seriesList = await _seriesRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters()
.WhereIf(isQCFinished, t => t.IsDeleted == false) .WhereIf(isQCFinished, t => t.IsDeleted == false)
.WhereIf(isReading == true, t => t.IsReading == true)
.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime) .OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime)
.ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync(); .ProjectTo<DicomSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
var instanceList = await _instanceRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters() var instanceList = await _instanceRepository.Where(s => s.StudyId == studyId).IgnoreQueryFilters()
.WhereIf(isQCFinished, t => t.IsDeleted == false) .WhereIf(isQCFinished, t => t.IsDeleted == false)
.WhereIf(isReading == true, t => t.IsReading == true)
.OrderBy(t => t.SeriesId).ThenBy(t => t.InstanceNumber) .OrderBy(t => t.SeriesId).ThenBy(t => t.InstanceNumber)
.ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime) .ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime)
.Select(t => new { t.SeriesId, t.Id, t.Path, t.NumberOfFrames, t.InstanceNumber, t.HtmlPath, t.IsReading, t.IsDeleted }).ToListAsync();//.GroupBy(u => u.SeriesId); .Select(t => new { t.SeriesId, t.Id, t.Path, t.NumberOfFrames, t.InstanceNumber, t.HtmlPath, t.IsReading, t.IsDeleted, t.FileSize }).ToListAsync();//.GroupBy(u => u.SeriesId);
foreach (var series in seriesList) foreach (var series in seriesList)
@ -54,7 +58,8 @@ namespace IRaCIS.Core.Application.Services
Path = k.Path, Path = k.Path,
InstanceNumber = k.InstanceNumber, InstanceNumber = k.InstanceNumber,
IsReading = k.IsReading, IsReading = k.IsReading,
IsDeleted = k.IsDeleted IsDeleted = k.IsDeleted,
FileSize = k.FileSize
}).ToList(); }).ToList();

View File

@ -130,8 +130,13 @@ namespace IRaCIS.Core.Application.Service
.ForMember(d => d.CriterionModalitys, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionModalitys)) .ForMember(d => d.CriterionModalitys, u => u.MapFrom(s => s.TrialReadingCriterion.CriterionModalitys))
.ForMember(d => d.SubjectCode, u => u.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindSubjectCode : u.Subject.Code)); .ForMember(d => d.SubjectCode, u => u.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindSubjectCode : u.Subject.Code));
CreateMap<DicomStudy, DicomStudyBasicInfo>(); CreateMap<DicomStudy, DicomStudyBasicInfo>()
CreateMap<NoneDicomStudy, NoneDicomStudyBasicInfo>(); .ForMember(d => d.ReadingSeriesCount, u => u.MapFrom(s => s.SeriesList.Where(t => t.IsReading).Count()))
.ForMember(d => d.ReadingInstanceCount, u => u.MapFrom(s => s.InstanceList.Where(t => t.IsReading && t.DicomSerie.IsReading).Count()));
CreateMap<NoneDicomStudy, NoneDicomStudyBasicInfo>()
.ForMember(d => d.ReadingFileCount, u => u.MapFrom(s => s.NoneDicomFileList.Where(t => t.IsReading).Count()));
CreateMap<VisitTask, SubjectCRCImageUploadedDto>() CreateMap<VisitTask, SubjectCRCImageUploadedDto>()
.ForMember(d => d.VisitTaskId, u => u.MapFrom(s => s.Id)) .ForMember(d => d.VisitTaskId, u => u.MapFrom(s => s.Id))
.ForMember(d => d.IsImageFilter, u => u.MapFrom(s => s.TrialReadingCriterion.IsImageFilter)) .ForMember(d => d.IsImageFilter, u => u.MapFrom(s => s.TrialReadingCriterion.IsImageFilter))

View File

@ -961,6 +961,9 @@ namespace IRaCIS.Core.Application.Image.QA
var noneDicomStudyFile = (await _noneDicomStudyFileRepository.Where(t => t.Id == noneDicomStudyFileId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException(); var noneDicomStudyFile = (await _noneDicomStudyFileRepository.Where(t => t.Id == noneDicomStudyFileId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException();
var noneDicomStudy = (await _noneDicomStudyRepository.Where(t => t.Id == noneDicomStudyFile.NoneDicomStudyId, true).IgnoreQueryFilters().FirstOrDefaultAsync()).IfNullThrowException();
if (state == 1) if (state == 1)
{ {
noneDicomStudyFile.IsReading = false; noneDicomStudyFile.IsReading = false;
@ -972,10 +975,15 @@ namespace IRaCIS.Core.Application.Image.QA
else if (state == 4) else if (state == 4)
{ {
noneDicomStudyFile.IsDeleted = true; noneDicomStudyFile.IsDeleted = true;
noneDicomStudy.FileCount = noneDicomStudy.FileCount - 1;
} }
else if (state == 5) else if (state == 5)
{ {
noneDicomStudyFile.IsDeleted = false; noneDicomStudyFile.IsDeleted = false;
noneDicomStudy.FileCount = noneDicomStudy.FileCount + 1;
} }
} }

View File

@ -125,7 +125,7 @@ namespace IRaCIS.Core.Application.Service
CreateMap<TrialSite, SiteStatDTO>() CreateMap<TrialSite, SiteStatDTO>()
.ForMember(d => d.TrialSiteId, u => u.MapFrom(s => s.Id)) .ForMember(d => d.TrialSiteId, u => u.MapFrom(s => s.Id))
.ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t=>t.IsDeleted==false))) .ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.IsDeleted == false && t.SubmitState != SubmitStateEnum.None)))
.ForMember(d => d.SubjectCount, u => u.MapFrom(s => s.SubjectList.Count(t => t.IsDeleted == false))) .ForMember(d => d.SubjectCount, u => u.MapFrom(s => s.SubjectList.Count(t => t.IsDeleted == false)))
//.ForMember(d => d.UserCount, u => u.MapFrom(s => s.CRCUserList.Count())) //.ForMember(d => d.UserCount, u => u.MapFrom(s => s.CRCUserList.Count()))
.ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.UserRole.IdentityUser.FullName))); .ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.UserRole.IdentityUser.FullName)));
@ -142,7 +142,7 @@ namespace IRaCIS.Core.Application.Service
//.ForMember(d => d.Site, u => u.MapFrom(s => isEn_Us ?s.Site.SiteName:s.Site.SiteNameCN)) //.ForMember(d => d.Site, u => u.MapFrom(s => isEn_Us ?s.Site.SiteName:s.Site.SiteNameCN))
//.ForMember(d => d.Hospital, u => u.MapFrom(s => s.Site.Hospital.HospitalName)) //.ForMember(d => d.Hospital, u => u.MapFrom(s => s.Site.Hospital.HospitalName))
//.ForMember(d => d.UserCount, u => u.MapFrom(s => s.CRCUserList.Count())) //.ForMember(d => d.UserCount, u => u.MapFrom(s => s.CRCUserList.Count()))
.ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count())) .ForMember(d => d.VisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.SubmitState != SubmitStateEnum.None)))
.ForMember(d => d.SubjectCount, u => u.MapFrom(s => s.SubjectList.Count())) .ForMember(d => d.SubjectCount, u => u.MapFrom(s => s.SubjectList.Count()))
.ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.UserRole.IdentityUser.FullName))) .ForMember(d => d.UserNameList, u => u.MapFrom(s => s.CRCUserList.Where(t => t.IsDeleted == false).Select(u => u.UserRole.IdentityUser.FullName)))
.ForMember(d => d.CallingAEList, u => u.MapFrom(s => s.TrialSiteDicomAEList.Select(u => u.CallingAE))); .ForMember(d => d.CallingAEList, u => u.MapFrom(s => s.TrialSiteDicomAEList.Select(u => u.CallingAE)));

View File

@ -60,8 +60,8 @@ namespace IRaCIS.Core.Application.Service
//.ForMember(d => d.InPlanNoneDicomStudyUploadCount, u => u.MapFrom(s => s.SubjectVisitList.Where(t => t.InPlan).SelectMany(k => k.NoneDicomStudyList).Count())) //.ForMember(d => d.InPlanNoneDicomStudyUploadCount, u => u.MapFrom(s => s.SubjectVisitList.Where(t => t.InPlan).SelectMany(k => k.NoneDicomStudyList).Count()))
//.ForMember(d => d.OutPlanNoneDicomStudyUploadCount, u => u.MapFrom(s => s.SubjectVisitList.Where(t => t.InPlan == false).SelectMany(k => k.NoneDicomStudyList).Count())) //.ForMember(d => d.OutPlanNoneDicomStudyUploadCount, u => u.MapFrom(s => s.SubjectVisitList.Where(t => t.InPlan == false).SelectMany(k => k.NoneDicomStudyList).Count()))
.ForMember(d => d.InPlanVisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.InPlan))) .ForMember(d => d.InPlanVisitCount, u => u.MapFrom(s => s.SubjectVisitList.Where(t => t.Subject.FinalSubjectVisitId != null ? t.VisitNum <= t.Subject.FinalSubjectVisit.VisitNum : true).Count(t => t.InPlan)))
.ForMember(d => d.OutPlanVisitCount, u => u.MapFrom(s => s.SubjectVisitList.Count(t => t.InPlan == false))) .ForMember(d => d.OutPlanVisitCount, u => u.MapFrom(s => s.SubjectVisitList.Where(t => t.Subject.FinalSubjectVisitId != null ? t.VisitNum <= t.Subject.FinalSubjectVisit.VisitNum : true).Count(t => t.InPlan == false)))
//执行不一定上传了 可能是失访 实际执行过了 //执行不一定上传了 可能是失访 实际执行过了