irc-netcore-api/IRaCIS.Core.Application/Service/Reading/ReadingPeriod/ReadModuleService.cs

1172 lines
68 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
using MassTransit;
using Microsoft.AspNetCore.Mvc;
using System.Linq.Dynamic.Core;
namespace IRaCIS.Core.Application.Service
{
/// <summary>
/// 生成的阅片模块(在大列表上展示的) 阅片期
/// </summary>
[ApiExplorerSettings(GroupName = "Reading")]
public class ReadModuleService(IRepository<SubjectVisit> _subjectVisitRepository,
IRepository<Subject> _subjectRepository,
IRepository<UserRole> _userRoleRepository,
IRepository<Trial> _trialRepository,
IVisitTaskHelpeService _visitTaskHelpeService,
IRepository<VisitTask> _visitTaskRepository,
IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository,
IRepository<ReadModuleView> _readModuleViewRepository,
IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
IRepository<DicomInstance> _dicomInstanceRepository,
IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository,
IRepository<ReadingClinicalData> _readingClinicalDataRepository,
IReadingImageTaskService _readingImageTaskService,
IRepository<ReadingPeriodSet> _readingPeriodSetRepository,
IRepository<ReadModule> _readModuleRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService
{
#region 获取修改时可选择的阅片期截止访视
/// <summary>
/// 获取修改截止访视下拉
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<GetSubjectReadVisitsOutDto>> GetCanChangeReadVisitList(GetCanChangeReadVisitListInDto inDto)
{
//增加标准
var mixReadVisitNum = await _visitTaskRepository.Where(x =>
x.TrialReadingCriterionId == inDto.TrialReadingCriterionId
&& x.ReadingTaskState == ReadingTaskState.HaveSigned
&& x.ReadingCategory == ReadingCategory.Visit
&& x.SubjectId == inDto.SubjectId
&& x.TaskState == TaskState.Effect).OrderByDescending(x => x.VisitTaskNum).Select(x => x.VisitTaskNum).FirstOrDefaultAsync();
decimal thisVisitNum = 0;
var readModule = await _readModuleRepository.Where(x => x.Id == inDto.Id).Include(x=>x.SubjectVisit).FirstOrDefaultAsync();
if(readModule!=null)
{
thisVisitNum = readModule.SubjectVisit.VisitNum;
}
var visitQuery = _subjectVisitRepository.Where(x => x.SubjectId == inDto.SubjectId && x.LatestScanDate != null && !x.IsLostVisit);
var finalVisitNum = await visitQuery.Where(x => x.IsFinalVisit).Select(x => x.VisitNum).FirstOrDefaultAsync();
//增加标准
var readModulequery = _readModuleRepository.AsQueryable().Where(x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId);
var resultlist = await visitQuery.WhereIf(finalVisitNum != null && finalVisitNum != 0, x => x.VisitNum <= finalVisitNum)
.Where(x => x.VisitNum > mixReadVisitNum|| x.VisitNum==thisVisitNum)
//.Where(x => !x.IsBaseLine) // 排除基线
.WhereIf(inDto.ReadingSetType == ReadingSetType.TumorReading, x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId && y.ReadingSetType == ReadingSetType.ImageReading).Count() > 0)
.WhereIf(inDto.ReadingSetType == ReadingSetType.ImageReading, x => readModulequery.Where(y => y.Id != inDto.Id && y.SubjectVisitId == x.Id && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId && y.ReadingSetType == ReadingSetType.ImageReading).Count() == 0)
.Select(x => new GetSubjectReadVisitsOutDto()
{
SubjectVisitId = x.Id,
VisitName = x.VisitName,
VisitNum = x.VisitNum,
}).OrderBy(x => x.VisitNum).ToListAsync();
return resultlist;
}
#endregion
/// <summary>
/// 修改全局阅片截止访视
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<bool> ChangeCutOffVisit(ChangeCutOffVisitInDto inDto)
{
if (await _readModuleRepository.AnyAsync(x => x.Id == inDto.Id && x.IsCRCConfirm))
{
//---CRC已经确认临床数据 不允许编辑
throw new BusinessValidationFailedException(_localizer["ReadModule_CRCConfirmCanNtoEdit"]);
}
var readModule = await _readModuleRepository.Where(x => x.Id == inDto.Id).FirstNotNullAsync();
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == readModule.TrialReadingCriterionId).Select(x => new
{
x.ReadingType,
x.IsArbitrationReading,
x.IsReadingPeriod,
x.ArbitrationRule,
x.IsGlobalReading,
x.IsOncologyReading,
}).FirstNotNullAsync();
// 如果生成了 访视级别的阅片期裁判 不让修改
if (criterionInfo.IsArbitrationReading && criterionInfo.IsReadingPeriod && !criterionInfo.IsGlobalReading && criterionInfo.ArbitrationRule == ArbitrationRule.Reading)
{
if (await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == readModule.SubjectVisitId && x.ReadingCategory == ReadingCategory.Judge))
{
//---当前阅片已生成裁判任务,操作失败。
throw new BusinessValidationFailedException(_localizer["ReadModule_JudgeTaskGenerated"]);
}
}
await _readModuleRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.Id, x => new ReadModule()
{
SubjectVisitId = inDto.SubjectVisitIdId,
ModuleName = inDto.Name,
});
return await _readModuleRepository.SaveChangesAsync();
}
/// <summary>
/// 用ef 实现之前视图的功能
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput<PageOutput<GetReadModuleDtoOut>>> GetReadModuleList(GetReadModuleDto inQuery)
{
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(x => new
{
x.CriterionName,
x.ReadingType,
x.IsReadingTaskViewInOrder,
x.IsOncologyReading,
x.IsGlobalReading,
x.IsReadingPeriod,
x.ReadingInfoSignTime,
}).FirstNotNullAsync();
var readingType = (int)criterionInfo.ReadingType;
var isFilterModuleType = inQuery.ModuleType != null;
var isFilterCompleteClinicalData = inQuery.CompleteClinicalData != null;
var isFilterReadingStatus = inQuery.ReadingStatus != null;
var isFilterName = !string.IsNullOrWhiteSpace(inQuery.Name);
#region 方式一
//var query = _subjectRepository.Where(t => t.TrialId == inQuery.TrialId)
// .WhereIf(inQuery.SubjectId != null, x => x.Id == inQuery.SubjectId)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteCode), x => x.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), x => x.Code.Contains(inQuery.SubjectCode))
// .Select(t => new GetReadModuleDtoOut()
// {
// SubjectCode = t.Code,
// SubjectId = t.Id,
// TrialSiteCode = t.TrialSite.TrialSiteCode,
// TrialSiteId = t.TrialSiteId,
// #region 分开不用union 在属性里面union
// //访视要查询不失访的其次要查在 <= 截止访视的,截止访视没有就查这个受试者所有的
// VisitData = t.SubjectVisitList.Where(t => t.IsLostVisit == false)
// .Where(sv => t.FinalSubjectVisitId == null ? true : sv.VisitNum < t.LatestSubjectVisit.VisitNum).Select(sv => new ReadModuleView()
// {
// Id = sv.Id,
// CreateTime = sv.CreateTime,
// PDState = sv.PDState,
// IsBaseLine = sv.IsBaseLine,
// SubjectCode = sv.Subject.Code,
// IsEnrollmentConfirm = sv.IsEnrollmentConfirm,
// IsFinalVisit = sv.IsFinalVisit,
// SubjectId = sv.SubjectId,
// SubjectVisitId = sv.Id,
// IsUrgent = sv.IsUrgent,
// SubjectVisitName = sv.VisitName,
// IsVisit = true,
// Name = sv.VisitName,
// TrialSiteId = sv.TrialSiteId,
// TrialSiteCode = sv.TrialSite.TrialSiteCode,
// TrialId = sv.TrialId,
// VisitNum = sv.VisitNum,
// TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
// OutPlanPreviousVisitId = sv.OutPlanPreviousVisitId,
// OutPlanPreviousVisitName = sv.OutPlanPreviousVisit.VisitName,
// ModuleType = sv.InPlan ? ModuleTypeEnum.InPlanSubjectVisit : ModuleTypeEnum.OutPlanSubjectVisit,
// //只有阅片期有
// CutOffVisitId = null,
// CutOffVisitName = null,
// ReadingSetType = null,
// ReadModuleId = null,
// ReadModuleName = "",
// ///阅片状态 0 1 2 保持访视的任务全做完了就是5 没完成就是4 否则就是3
// ReadingStatus = sv.ReadingStatus < ReadingStatusEnum.TaskAllocate ? sv.ReadingStatus :
// (sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
// && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
// (sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
// && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate)),
// //是否是截止访视?
// IsCanChangeCutOffVisit = false,
// //需要签名数量计算 基线包含subject+访视级别的
// NeedSignClinicalDataCount = sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(t => t.TrialClinicalDataSet)).Where(t => t.IsConfirm == true).
// Where(t => sv.IsBaseLine ? t.ClinicalDataLevel <= ClinicalLevel.SubjectVisit : t.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Count()
// + (sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(t => t.TrialClinicalDataSet)).Where(t => t.IsConfirm == true)
// .Any(t => t.ClinicalDataLevel == ClinicalLevel.Study) ? 1 : 0),
// //签名的数量
// SignClinicalDataCount = sv.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.Study &&
// t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
// +
// (sv.SubmitState == SubmitStateEnum.Submitted && sv.Trial.ClinicalDataTrialSetList
// .Any(t => t.ClinicalDataLevel == ClinicalLevel.Study && t.TrialClinicalDataSetCriteriaList.Any(u => u.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)) ? 1 : 0),
// //标准名 应该是可以不查询的,只要保证逻辑正确
// CriterionName = criterionInfo.CriterionName
// })
// .Where(t => isFilterModuleType ? t.ModuleType == inQuery.ModuleType : true)
// .Where(t => isFilterName ? t.Name == inQuery.Name : true)
// .Where(t => isFilterReadingStatus ? t.ReadingStatus == inQuery.ReadingStatus : true)
// .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NA ? t.NeedSignClinicalDataCount == 0 : true)
// .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NotComplete ? t.NeedSignClinicalDataCount != t.SignClinicalDataCount : true)
// .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.Complete ? t.NeedSignClinicalDataCount == t.SignClinicalDataCount : true)
// //搜索条件报错
// //.WhereIf(inQuery.ModuleType != null, t => t.ModuleType == inQuery.ModuleType)
// //.WhereIf(inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NA, x => x.NeedSignClinicalDataCount == 0)
// //.WhereIf(inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NotComplete, x => x.NeedSignClinicalDataCount != x.SignClinicalDataCount)
// //.WhereIf(inQuery.CompleteClinicalData == CompleteClinicalDataEnum.Complete, x => x.NeedSignClinicalDataCount != 0 && x.NeedSignClinicalDataCount == x.SignClinicalDataCount)
// //.WhereIf(inQuery.ReadingStatus != null, x => x.ReadingStatus == inQuery.ReadingStatus)
// .ToList(),
// //阅片期
// ReadMouduleData = t.ReadModuleList.Select(rm => new ReadModuleView()
// {
// Id = rm.Id,
// CreateTime = rm.CreateTime,
// PDState = PDStateEnum.None,
// IsBaseLine = false,
// SubjectCode = rm.SubjectVisit.Subject.Code,
// IsEnrollmentConfirm = false,
// IsFinalVisit = false,
// SubjectId = rm.SubjectId,
// SubjectVisitId = rm.SubjectVisitId,
// IsUrgent = rm.SubjectVisit.IsUrgent,
// SubjectVisitName = rm.SubjectVisit.VisitName,
// IsVisit = false,
// Name = rm.ModuleName,
// TrialSiteId = rm.Subject.TrialSiteId,
// TrialSiteCode = rm.Subject.TrialSite.TrialSiteCode,
// TrialId = rm.TrialId,
// VisitNum = rm.SubjectVisit.VisitNum,
// TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
// OutPlanPreviousVisitId = null,
// OutPlanPreviousVisitName = null,
// ModuleType = rm.ModuleType,
// //只有阅片期有
// CutOffVisitId = rm.SubjectVisit.Id,
// CutOffVisitName = rm.SubjectVisit.VisitName,
// ReadingSetType = null,
// //之前视图返回的null 应该是没用的?
// ReadModuleId = rm.Id,
// ReadModuleName = rm.ModuleName,
// //是否是截止访视?
// IsCanChangeCutOffVisit = false,
// ///阅片状态 0 1 2 保持访视的任务全做完了就是5 没完成就是4 否则就是3
// ReadingStatus = rm.ReadingStatus < ReadingStatusEnum.TaskAllocate ? rm.ReadingStatus :
// (rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
// && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
// (rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
// && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate
// )
// ),
// ////需要签名数量计算 基线包含subject+访视级别的
// NeedSignClinicalDataCount = rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
// .Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.PM && (t.ClinicalDataLevel == ClinicalLevel.SubjectVisit || t.ClinicalDataLevel == ClinicalLevel.ImageRead || t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Count()
// +
// (rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
// .Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.CRC &&
// (t.ClinicalDataLevel == ClinicalLevel.SubjectVisit || t.ClinicalDataLevel == ClinicalLevel.ImageRead || t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Any() ? 1 : 0)
// ,
// //签名的数量
// SignClinicalDataCount = rm.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM &&
// t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
// +
// (rm.IsPMConfirm ? 1 : 0),
// //标准名 应该是可以不查询的,只要保证逻辑正确
// CriterionName = criterionInfo.CriterionName
// })
// .Where(t => isFilterModuleType ? t.ModuleType == inQuery.ModuleType : true)
// .Where(t => isFilterName ? t.Name == inQuery.Name : true)
// .Where(t => isFilterReadingStatus ? t.ReadingStatus == inQuery.ReadingStatus : true)
// .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NA ? t.NeedSignClinicalDataCount == 0 : true)
// .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NotComplete ? t.NeedSignClinicalDataCount != t.SignClinicalDataCount : true)
// .Where(t => isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.Complete ? t.NeedSignClinicalDataCount == t.SignClinicalDataCount : true)
// .ToList()
// #endregion
// #region 用union 报错不行的
// ////访视要查询不失访的其次要查在 <= 截止访视的,截止访视没有就查这个受试者所有的
// //Data = t.SubjectVisitList.Where(t => t.IsLostVisit == false)
// //.Where(sv => t.FinalSubjectVisitId == null ? true : sv.VisitNum < t.LatestSubjectVisit.VisitNum).Select(sv => new ReadModuleView()
// //{
// // Id = sv.Id,
// // CreateTime = sv.CreateTime,
// // PDState = sv.PDState,
// // IsBaseLine = sv.IsBaseLine,
// // SubjectCode = sv.Subject.Code,
// // IsEnrollmentConfirm = sv.IsEnrollmentConfirm,
// // IsFinalVisit = sv.IsFinalVisit,
// // SubjectId = sv.SubjectId,
// // SubjectVisitId = sv.Id,
// // IsUrgent = sv.IsUrgent,
// // SubjectVisitName = sv.VisitName,
// // IsVisit = true,
// // Name = sv.VisitName,
// // TrialSiteId = sv.TrialSiteId,
// // TrialSiteCode = sv.TrialSite.TrialSiteCode,
// // TrialId = sv.TrialId,
// // VisitNum = sv.VisitNum,
// // TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
// // OutPlanPreviousVisitId = sv.OutPlanPreviousVisitId,
// // OutPlanPreviousVisitName = sv.OutPlanPreviousVisit.VisitName,
// // ModuleType = sv.InPlan ? ModuleTypeEnum.InPlanSubjectVisit : ModuleTypeEnum.OutPlanSubjectVisit,
// // //只有阅片期有
// // CutOffVisitId = null,
// // CutOffVisitName = null,
// // ReadingSetType = null,
// // ReadModuleId = null,
// // ReadModuleName = "",
// // ///阅片状态 0 1 2 保持访视的任务全做完了就是5 没完成就是4 否则就是3
// // ReadingStatus = sv.ReadingStatus < ReadingStatusEnum.TaskAllocate ? sv.ReadingStatus :
// // (sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
// // && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
// // (sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
// // && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate)),
// // //是否是截止访视?
// // IsCanChangeCutOffVisit = false,
// // //需要签名数量计算 基线包含subject+访视级别的
// // NeedSignClinicalDataCount = sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList).Where(t => t.TrialClinicalDataSet.IsConfirm == true).
// // Where(t => sv.IsBaseLine ? t.TrialClinicalDataSet.ClinicalDataLevel <= ClinicalLevel.SubjectVisit : t.TrialClinicalDataSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Count()
// // + (sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList).Where(t => t.TrialClinicalDataSet.IsConfirm == true)
// // .Any(t => t.TrialClinicalDataSet.ClinicalDataLevel == ClinicalLevel.Study) ? 1 : 0),
// // //签名的数量
// // SignClinicalDataCount = sv.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.Study &&
// // t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
// // +
// // (sv.SubmitState == SubmitStateEnum.Submitted && sv.Trial.ClinicalDataTrialSetList
// // .Any(t => t.ClinicalDataLevel == ClinicalLevel.Study && t.TrialClinicalDataSetCriteriaList.Any(u => u.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)) ? 1 : 0),
// // //标准名 应该是可以不查询的,只要保证逻辑正确
// // CriterionName = criterionInfo.CriterionName
// //})
// //.Union(t.ReadModuleList.AsQueryable().Select(rm => new ReadModuleView()
// //{
// // Id = rm.Id,
// // CreateTime = rm.CreateTime,
// // PDState = PDStateEnum.None,
// // IsBaseLine = false,
// // SubjectCode = rm.SubjectVisit.Subject.Code,
// // IsEnrollmentConfirm = false,
// // IsFinalVisit = false,
// // SubjectId = rm.SubjectId,
// // SubjectVisitId = rm.SubjectVisitId,
// // IsUrgent = rm.SubjectVisit.IsUrgent,
// // SubjectVisitName = rm.SubjectVisit.VisitName,
// // IsVisit = false,
// // Name = rm.ModuleName,
// // TrialSiteId = rm.Subject.TrialSiteId,
// // TrialSiteCode = rm.Subject.TrialSite.TrialSiteCode,
// // TrialId = rm.TrialId,
// // VisitNum = rm.SubjectVisit.VisitNum,
// // TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
// // OutPlanPreviousVisitId = null,
// // OutPlanPreviousVisitName = null,
// // ModuleType = rm.ModuleType,
// // //只有阅片期有
// // CutOffVisitId = rm.SubjectVisit.Id,
// // CutOffVisitName = rm.SubjectVisit.VisitName,
// // ReadingSetType = null,
// // //之前视图返回的null 应该是没用的?
// // ReadModuleId = rm.Id,
// // ReadModuleName = rm.ModuleName,
// // //是否是截止访视?
// // IsCanChangeCutOffVisit = false,
// // ///阅片状态 0 1 2 保持访视的任务全做完了就是5 没完成就是4 否则就是3
// // ReadingStatus = rm.ReadingStatus < ReadingStatusEnum.TaskAllocate ? rm.ReadingStatus :
// // (rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
// // && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
// // (rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
// // && t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate
// // )
// // ),
// // //需要签名数量计算 基线包含subject+访视级别的
// // NeedSignClinicalDataCount = rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
// // .Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.PM && (t.ClinicalDataLevel == ClinicalLevel.SubjectVisit || t.ClinicalDataLevel == ClinicalLevel.ImageRead || t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Count()
// // +
// // (rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
// // .Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.CRC &&
// // (t.ClinicalDataLevel == ClinicalLevel.SubjectVisit || t.ClinicalDataLevel == ClinicalLevel.ImageRead || t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Any() ? 1 : 0)
// // ,
// // //签名的数量
// // SignClinicalDataCount = rm.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM &&
// // t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
// // +
// // (rm.IsPMConfirm ? 1 : 0),
// // //标准名 应该是可以不查询的,只要保证逻辑正确
// // CriterionName = criterionInfo.CriterionName
// //})).ToList()
// #endregion
// });
//var pageList = await query/*.Where(t=> (t.VisitData.Count + t.ReadMouduleData.Count)>0)*//*.AsSplitQuery()*/
// .ToPagedListAsync(inQuery, nameof(GetReadModuleDtoOut.SubjectCode));
#endregion
#region 方式二
var subjectVisitQuery = _subjectVisitRepository.Where(t => t.TrialId == inQuery.TrialId)/*.Where(t => t.IsLostVisit == false)*/
.Where(sv => sv.Subject.FinalSubjectVisitId == null ? true : sv.VisitNum <= sv.Subject.LatestSubjectVisit.VisitNum).Select(sv => new ReadModuleView()
{
Id = sv.Id,
CreateTime = sv.CreateTime,
PDState = sv.PDState,
IsBaseLine = sv.IsBaseLine,
SubjectCode = sv.Subject.Code,
IsEnrollmentConfirm = sv.IsEnrollmentConfirm,
IsFinalVisit = sv.IsFinalVisit,
SubjectId = sv.SubjectId,
SubjectVisitId = sv.Id,
IsUrgent = sv.IsUrgent,
SubjectVisitName = sv.VisitName,
IsVisit = true,
Name = sv.VisitName,
TrialSiteId = sv.TrialSiteId,
TrialSiteCode = sv.TrialSite.TrialSiteCode,
TrialId = sv.TrialId,
VisitNum = sv.VisitNum,
TrialReadingCriterionId = inQuery.TrialReadingCriterionId,
OutPlanPreviousVisitId = sv.OutPlanPreviousVisitId,
OutPlanPreviousVisitName = sv.OutPlanPreviousVisit.VisitName,
ModuleType = sv.InPlan ? ModuleTypeEnum.InPlanSubjectVisit : ModuleTypeEnum.OutPlanSubjectVisit,
//只有阅片期有
CutOffVisitId = null,
CutOffVisitName = null,
ReadingSetType = null,
ReadModuleId = null,
ReadModuleName = "",
///阅片状态 0 1 2 保持访视的任务全做完了就是5 没完成就是4 否则就是3
ReadingStatus = sv.ReadingStatus < ReadingStatusEnum.TaskAllocate ? sv.ReadingStatus :
(sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
&& t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
(sv.VisitTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
&& t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate)),
//是否是截止访视?
IsCanChangeCutOffVisit = false,
//需要签名数量计算 基线包含subject+访视级别的
NeedSignClinicalDataCount = sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(t => t.TrialClinicalDataSet)).Where(t => t.IsConfirm == true).
Where(t => sv.IsBaseLine ? t.ClinicalDataLevel <= ClinicalLevel.SubjectVisit : t.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Count()
+ (sv.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(t => t.TrialClinicalDataSet)).Where(t => t.IsConfirm == true)
.Any(t => t.ClinicalDataLevel == ClinicalLevel.Study) ? 1 : 0),
//签名的数量
SignClinicalDataCount = sv.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.Study &&
t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
+
(sv.SubmitState == SubmitStateEnum.Submitted && sv.Trial.ClinicalDataTrialSetList
.Any(t => t.ClinicalDataLevel == ClinicalLevel.Study && t.TrialClinicalDataSetCriteriaList.Any(u => u.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)) ? 1 : 0),
//标准名 应该是可以不查询的,只要保证逻辑正确
CriterionName = criterionInfo.CriterionName
});
var readMouduleQuery = _readModuleRepository.Where(t => t.TrialId == inQuery.TrialId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
.Select(rm => new ReadModuleView()
{
Id = rm.Id,
CreateTime = rm.CreateTime,
PDState = PDStateEnum.None,
IsBaseLine = false,
SubjectCode = rm.SubjectVisit.Subject.Code,
IsEnrollmentConfirm = false,
IsFinalVisit = false,
SubjectId = rm.SubjectId,
SubjectVisitId = rm.SubjectVisitId,
IsUrgent = rm.SubjectVisit.IsUrgent,
SubjectVisitName = rm.SubjectVisit.VisitName,
IsVisit = false,
Name = rm.ModuleName,
TrialSiteId = rm.Subject.TrialSiteId,
TrialSiteCode = rm.Subject.TrialSite.TrialSiteCode,
TrialId = rm.TrialId,
VisitNum = rm.SubjectVisit.VisitNum,
TrialReadingCriterionId = rm.TrialReadingCriterionId,
OutPlanPreviousVisitId = null,
OutPlanPreviousVisitName = null,
ModuleType = rm.ModuleType,
//只有阅片期有
CutOffVisitId = rm.SubjectVisit.Id,
CutOffVisitName = rm.SubjectVisit.VisitName,
ReadingSetType = rm.ReadingSetType,
//之前视图返回的null 应该是没用的?
ReadModuleId = rm.Id,
ReadModuleName = rm.ModuleName,
//阅片期切换访视 限制1、阅片期访视已完成了任务不能如果本身是肿瘤学不能或者本身是全局后续有肿瘤学
IsCanChangeCutOffVisit = !(rm.ModuleTaskList.Any(t => t.TaskState == TaskState.Effect) && rm.ReadingSetType == ReadingSetType.TumorReading &&
rm.SubjectVisit.ReadModuleList.Any(t => t.ReadingSetType == ReadingSetType.TumorReading)),
///阅片状态 0 1 2 保持访视的任务全做完了就是5 没完成就是4 否则就是3
ReadingStatus = rm.ReadingStatus < ReadingStatusEnum.TaskAllocate ? rm.ReadingStatus :
(rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned
&& t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ReadCompleted :
(rm.ModuleTaskList.Count(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.TaskAllocationState == TaskAllocationState.Allocated
&& t.ReadingCategory != ReadingCategory.Judge && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId) == readingType ? ReadingStatusEnum.ImageReading : ReadingStatusEnum.TaskAllocate
)
),
////需要签名数量计算 基线包含subject+访视级别的
NeedSignClinicalDataCount = rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
.Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.PM && (rm.ReadingSetType == ReadingSetType.ImageReading ? t.ClinicalDataLevel == ClinicalLevel.ImageRead : t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Count()
+
(rm.Trial.TrialReadingCriterionList.Where(t => t.Id == inQuery.TrialReadingCriterionId).SelectMany(u => u.TrialClinicalDataSetCriterionList.Select(z => z.TrialClinicalDataSet))
.Where(t => t.IsConfirm == true && t.UploadRole == UploadRole.CRC &&
(rm.ReadingSetType == ReadingSetType.ImageReading ? t.ClinicalDataLevel == ClinicalLevel.ImageRead : t.ClinicalDataLevel == ClinicalLevel.OncologyRead)).Any() ? 1 : 0)
,
//签名的数量
SignClinicalDataCount = rm.ReadingClinicalDataList.Where(t => t.IsSign == true && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM &&
t.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)).Count()
+
(rm.IsPMConfirm ? 1 : 0),
//标准名 应该是可以不查询的,只要保证逻辑正确
CriterionName = criterionInfo.CriterionName
});
var query = subjectVisitQuery.Union(readMouduleQuery)
.WhereIf(inQuery.SubjectId != null, x => x.SubjectId == inQuery.SubjectId)
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.TrialSiteCode), x => x.TrialSiteCode.Contains(inQuery.TrialSiteCode))
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), x => x.SubjectCode.Contains(inQuery.SubjectCode))
.WhereIf(isFilterModuleType, t => t.ModuleType == inQuery.ModuleType)
.WhereIf(isFilterName, t => t.Name == inQuery.Name)
.WhereIf(isFilterReadingStatus, t => t.ReadingStatus == inQuery.ReadingStatus)
.WhereIf(isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NA, t => t.NeedSignClinicalDataCount == 0)
.WhereIf(isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.NotComplete, t => t.NeedSignClinicalDataCount != t.SignClinicalDataCount)
.WhereIf(isFilterCompleteClinicalData && inQuery.CompleteClinicalData == CompleteClinicalDataEnum.Complete, t => t.NeedSignClinicalDataCount == t.SignClinicalDataCount);
inQuery.SortField = string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(ReadModuleView.SubjectCode) : inQuery.SortField;
var subjectIdQuery = query.OrderBy(inQuery.SortField).Select(x => x.SubjectId).Distinct();
var subjectIds = await subjectIdQuery.Skip((inQuery.PageIndex - 1) * inQuery.PageSize).Take(inQuery.PageSize).ToListAsync();
var subjectCount = subjectIdQuery.Count();
var viewList = await query.Where(x => subjectIds.Contains(x.SubjectId)).SortToListAsync(inQuery);
var list = viewList.GroupBy(x => new { x.SubjectId, x.TrialSiteId, x.TrialSiteCode, x.SubjectCode })
.Select(x => new GetReadModuleDtoOut()
{
TrialSiteCode = x.Key.TrialSiteCode,
TrialSiteId = x.Key.TrialSiteId,
SubjectCode = x.Key.SubjectCode,
SubjectId = x.Key.SubjectId,
Data = x.OrderBy(x => x.ModuleType).ThenBy(x => x.VisitNum).ToList(),
}).ToList();
var pageOutput = new PageOutput<GetReadModuleDtoOut>()
{
PageSize = inQuery.PageSize,
CurrentPageData = list,
PageIndex = inQuery.PageIndex,
TotalCount = subjectCount,
};
#endregion
return ResponseOutput.Ok(pageOutput, new
{
MaxLength = pageOutput.CurrentPageData.MaxOrDefault(t => t.Data.Count(), 0),
IsReadingTaskViewInOrder = criterionInfo.IsReadingTaskViewInOrder,
IsClinicalReading = criterionInfo.IsOncologyReading,
// OnlyExistsMedicalHistory = !(await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataSetName != "既往局部治疗史" && x.IsConfirm)),
IsExistsSubjectClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == inQuery.TrialId && x.ClinicalDataLevel == ClinicalLevel.Subject && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
IsExistsVisitClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == inQuery.TrialId && x.ClinicalDataLevel == ClinicalLevel.SubjectVisit && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
IsExistsStudyClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == inQuery.TrialId && x.ClinicalDataLevel == ClinicalLevel.Study && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
IsExistsReadingClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == inQuery.TrialId && x.ClinicalDataLevel == ClinicalLevel.ImageRead && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
IsExistsOncologyReadClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == inQuery.TrialId && x.ClinicalDataLevel == ClinicalLevel.OncologyRead && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
IsGlobalReading = criterionInfo.IsGlobalReading,
IsReadingPeriod = criterionInfo.IsReadingPeriod,
ReadingInfoSignTime = criterionInfo.ReadingInfoSignTime,
ExistClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)),
});
}
///// <summary>
///// 获取读片模块 //加了标准参数
///// </summary>
//[HttpPost]
//public async Task<IResponseOutput<PageOutput<GetReadModuleDtoOut>>> GetReadModuleList(GetReadModuleDto dto)
//{
// #region MyRegion
// if (dto.SortField.IsNullOrEmpty())
// {
// dto.SortField = nameof(ReadModuleView.SubjectCode);
// dto.Asc = true;
// }
// dto.SortField = dto.Asc ? dto.SortField : dto.SortField + " desc";
// var subjectQuery = _readModuleViewRepository.Where(x => x.TrialReadingCriterionId == dto.TrialReadingCriterionId)
// .WhereIf(dto.TrialId != null, x => x.TrialId == dto.TrialId)
// .WhereIf(dto.SubjectId != null, x => x.SubjectId == dto.SubjectId)
// .WhereIf(dto.TrialSiteCode != null && dto.TrialSiteCode != string.Empty, x => x.TrialSiteCode.Contains(dto.TrialSiteCode))
// .WhereIf(dto.SubjectCode != null && dto.SubjectCode != string.Empty, x => x.SubjectCode.Contains(dto.SubjectCode))
// .WhereIf(dto.ModuleType != null, x => x.ModuleType == dto.ModuleType)
// .WhereIf(dto.CompleteClinicalData == CompleteClinicalDataEnum.NA, x => x.NeedSignClinicalDataCount == 0)
// .WhereIf(dto.CompleteClinicalData == CompleteClinicalDataEnum.NotComplete, x => x.NeedSignClinicalDataCount != x.SignClinicalDataCount)
// .WhereIf(dto.CompleteClinicalData == CompleteClinicalDataEnum.Complete, x => x.NeedSignClinicalDataCount != 0 && x.NeedSignClinicalDataCount == x.SignClinicalDataCount)
// .WhereIf(dto.ReadingStatus != null, x => x.ReadingStatus == dto.ReadingStatus);
// //.WhereIf(dto.Name != null, x => x.Name.Contains(dto.Name!)).OrderBy(x => x.SiteCode);
// var subjectIds = await subjectQuery.OrderBy(dto.SortField).Select(x => x.SubjectId).Distinct().Skip((dto.PageIndex - 1) * dto.PageSize).Take(dto.PageSize).ToListAsync();
// List<ReadModuleView> ReadModuleViewList = await subjectQuery.Where(x => subjectIds.Contains(x.SubjectId)).OrderBy(dto.SortField).ToListAsync();
// List<GetReadModuleDtoOut> getReadList = ReadModuleViewList.GroupBy(x => new { x.SubjectId, x.TrialSiteId, x.TrialSiteCode, x.SubjectCode })
// .Select(x => new GetReadModuleDtoOut()
// {
// TrialSiteCode = x.Key.TrialSiteCode,
// TrialSiteId = x.Key.TrialSiteId,
// SubjectCode = x.Key.SubjectCode,
// SubjectId = x.Key.SubjectId,
// Data = x.OrderBy(x => x.ModuleType).ThenBy(x => x.VisitNum).ToList(),
// }).ToList();
// PageOutput<GetReadModuleDtoOut> pageOutput = new PageOutput<GetReadModuleDtoOut>()
// {
// PageSize = dto.PageSize,
// CurrentPageData = getReadList,
// PageIndex = dto.PageIndex,
// TotalCount = await subjectQuery.Select(x => x.SubjectId).Distinct().CountAsync(),
// };
// var maxcount = 0;
// pageOutput.CurrentPageData.ForEach(x =>
// {
// maxcount = maxcount < x.Data.Count ? x.Data.Count : maxcount;
// });
// var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == dto.TrialReadingCriterionId).Select(x => new
// {
// x.IsReadingTaskViewInOrder,
// x.IsOncologyReading,
// x.IsGlobalReading,
// x.IsReadingPeriod,
// x.ReadingInfoSignTime,
// }).FirstNotNullAsync();
// return ResponseOutput.Ok(pageOutput, new
// {
// MaxLength = maxcount,
// IsReadingTaskViewInOrder = criterionInfo.IsReadingTaskViewInOrder,
// IsClinicalReading = criterionInfo.IsOncologyReading,
// // OnlyExistsMedicalHistory = !(await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataSetName != "既往局部治疗史" && x.IsConfirm)),
// IsExistsSubjectClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataLevel == ClinicalLevel.Subject && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
// IsExistsVisitClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataLevel == ClinicalLevel.SubjectVisit && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
// IsExistsStudyClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataLevel == ClinicalLevel.Study && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
// IsExistsReadingClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataLevel == ClinicalLevel.ImageRead && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
// IsExistsOncologyReadClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.TrialId == dto.TrialId && x.ClinicalDataLevel == ClinicalLevel.OncologyRead && x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
// IsGlobalReading = criterionInfo.IsGlobalReading,
// IsReadingPeriod = criterionInfo.IsReadingPeriod,
// ReadingInfoSignTime = criterionInfo.ReadingInfoSignTime,
// ExistClinicalData = await _clinicalDataTrialSetRepository.AnyAsync(x => x.IsConfirm && x.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == dto.TrialReadingCriterionId)),
// });
// #endregion
//}
/// <summary>
/// 获取单条详情信息
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
public async Task<GetReadModuleSingleOutdto> GetReadModule(GetReadModuleSingleIndto dto)
{
var data = await GetReadModuleList(new GetReadModuleDto()
{
SubjectId = dto.SubjectId,
TrialId = dto.TrialId,
TrialReadingCriterionId = dto.TrialReadingCriterionId,
});
GetReadModuleSingleOutdto? readModule = data.Data.CurrentPageData.FirstOrDefault().Data.Where(x => x.Id == dto.Id).Select(x => new GetReadModuleSingleOutdto()
{
Id = x.Id,
ModuleType = x.ModuleType,
SubjectVisitId = x.SubjectVisitId,
SubjectVisitName = x.SubjectVisitName,
Status = x.ReadingStatus,
}).FirstOrDefault();
var stakeholderIds = new List<Guid>();
var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(x => x.Id == readModule.SubjectVisitId);
switch (readModule.Status)
{
case ReadingStatusEnum.ImageNotSubmit:
stakeholderIds.AddRange(await _dicomInstanceRepository.Where(x => x.SubjectVisitId == readModule.SubjectVisitId).Select(x => x.CreateUserId).Distinct().ToListAsync());
stakeholderIds.AddRange(await _noneDicomStudyFileRepository.Where(x => x.NoneDicomStudy.SubjectVisitId == readModule.SubjectVisitId).Select(x => x.CreateUserId).Distinct().ToListAsync());
break;
case ReadingStatusEnum.ImageQuality:
if (subjectVisit.PreliminaryAuditUserId != null)
{
stakeholderIds.Add(subjectVisit.PreliminaryAuditUserId.Value);
}
if (subjectVisit.ReviewAuditUserId != null)
{
stakeholderIds.Add(subjectVisit.ReviewAuditUserId.Value);
}
break;
case ReadingStatusEnum.TaskAllocate:
if (subjectVisit.CheckUserId != null)
{
stakeholderIds.Add(subjectVisit.CheckUserId.Value);
}
break;
case ReadingStatusEnum.ImageReading:
case ReadingStatusEnum.ReadCompleted:
var doctorUserId = await _visitTaskRepository.Where(x => (x.SouceReadModuleId == dto.Id || x.SourceSubjectVisitId == dto.Id) && x.TaskState == TaskState.Effect)
.Where(x => x.DoctorUserId != null).Select(x => x.DoctorUserId.Value).ToListAsync();
stakeholderIds.AddRange(doctorUserId);
break;
};
readModule.StakeholderIds = stakeholderIds.Distinct().ToList();
readModule.StakeholderNames = await _userRoleRepository.Where(x => readModule.StakeholderIds.Contains(x.Id)).Select(x => x.IdentityUser.FullName).ToListAsync();
return readModule;
}
/// <summary>
/// 添加阅片的时候 获取访视 //标准参数必传
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<List<GetSubjectReadVisitsOutDto>> GetSubjectReadVisitList(GetSubjectReadVisitsInDto inDto)
{
//增加标准
var maxReadVisit = await _readModuleRepository.Where(x => x.SubjectId == inDto.SubjectId && x.ReadingSetType == inDto.ReadingSetType && x.TrialReadingCriterionId == inDto.TrialReadingCriterionId).Include(x => x.SubjectVisit).OrderByDescending(x => x.SubjectVisit.VisitNum).FirstOrDefaultAsync();
var maxReadVisitNum = maxReadVisit == null ? -1 : maxReadVisit.SubjectVisit.VisitNum;
var visitQuery = _subjectVisitRepository.Where(x => x.SubjectId == inDto.SubjectId && x.LatestScanDate != null && !x.IsLostVisit);
var finalVisitNum = await visitQuery.Where(x => x.IsFinalVisit).Select(x => x.VisitNum).FirstOrDefaultAsync();
//增加标准
var readModulequery = _readModuleRepository.AsQueryable().Where(x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId);
var resultlist = await visitQuery.WhereIf(finalVisitNum != 0, x => x.VisitNum <= finalVisitNum)
.WhereIf(inDto.ReadingSetType == ReadingSetType.TumorReading, x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId && y.ReadingSetType == ReadingSetType.ImageReading).Count() > 0)
.Where(x => x.VisitNum > maxReadVisitNum)
//.Where(x => !x.IsBaseLine) // 排除基线
.Where(x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId && y.ReadingSetType == inDto.ReadingSetType).Count() == 0).OrderBy(x => finalVisitNum)
.Select(x => new GetSubjectReadVisitsOutDto()
{
SubjectVisitId = x.Id,
VisitName = x.VisitName,
VisitNum = x.VisitNum,
}).OrderBy(x => x.VisitNum).ToListAsync();
return resultlist;
}
/// <summary>
/// 添加阅片期
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
[HttpPost]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
public async Task<IResponseOutput> AddReadModule(ReadModuleAddDto dto)
{
var visitQuery = _subjectVisitRepository.Where(x => x.SubjectId == dto.SubjectId);
visitQuery = visitQuery
//.WhereIf(dto.ExpirationDate != null, x => x.LatestScanDate <= dto.ExpirationDate.Value)
.WhereIf(dto.ExpirationVisitNum != null, x => x.VisitNum == dto.ExpirationVisitNum!);
var visit = visitQuery.OrderByDescending(x => x.VisitNum).FirstOrDefault();
var moduleType = dto.ReadingSetType == ReadingSetType.ImageReading ? ModuleTypeEnum.Global : ModuleTypeEnum.Oncology;
if (visit != null)
{
if (await _readModuleRepository.AnyAsync(x => x.SubjectVisitId == visit.Id && x.ModuleType == moduleType && x.TrialReadingCriterionId == dto.TrialReadingCriterionId))
{
//---当前访视已经添加过阅片期
throw new BusinessValidationFailedException(_localizer["ReadModule_AlreadyAdded"]);
}
var readModuleData = new ReadModule()
{
Id = NewId.NextGuid(),
SubjectId = dto.SubjectId,
ModuleType = moduleType,
IsUrgent = visit.IsUrgent,
ModuleName = dto.Name,
SubjectVisitId = visit.Id,
ReadingSetType = dto.ReadingSetType,
TrialId = dto.TrialId,
ReadingStatus = ReadingStatusEnum.TaskAllocate,
//增加标准
TrialReadingCriterionId = dto.TrialReadingCriterionId,
};
await _readModuleRepository.AddAsync(readModuleData);
// 判断是否要添加肿瘤学或者全局阅片任务
switch (readModuleData.ModuleType)
{
case ModuleTypeEnum.Global:
//增加标准
var taskListInfo = await _visitTaskRepository.Where(x => x.SourceSubjectVisitId == readModuleData.SubjectVisitId && x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned
&& !x.IsAnalysisCreate && x.TrialReadingCriterionId == dto.TrialReadingCriterionId
).ToListAsync();
// 生成全局阅片任务 具体是否需要生成在_visitTaskHelpeService里面有逻辑判断
foreach (var taskInfo in taskListInfo)
{
await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
{
OriginalVisitId = taskInfo.Id,
ReadingCategory = GenerateTaskCategory.Global,
TrialId = dto.TrialId,
ReadingGenerataTaskList = new List<ReadingGenerataTaskDTO>() {
new ReadingGenerataTaskDTO()
{
IsUrgent = readModuleData.IsUrgent ?? false,
SubjectId = readModuleData.SubjectId,
ReadingName = readModuleData.ModuleName,
ReadModuleId =readModuleData.Id,
ReadingCategory = ReadingCategory.Global,
}
}
});
}
// 生成裁判任务 是否需要生成函数里面有逻辑判断
if (taskListInfo.Count() > 0)
{
await _readingImageTaskService.TriggerJudgeQuestion(taskListInfo[0].Id);
}
break;
case ModuleTypeEnum.Oncology:
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == dto.TrialReadingCriterionId).Select(x => new
{
x.ReadingType,
}).FirstNotNullAsync();
//增加标准
var globalModule = await _readModuleRepository.Where(x => x.SubjectId == readModuleData.SubjectId && x.SubjectVisitId == readModuleData.SubjectVisitId && x.ModuleType == ModuleTypeEnum.Global && x.TrialReadingCriterionId == dto.TrialReadingCriterionId).FirstOrDefaultAsync();
if (globalModule != null)
{
var globalTaskInfoList = await _visitTaskRepository.Where(x => x.SouceReadModuleId == globalModule.Id
&& x.TrialReadingCriterionId == dto.TrialReadingCriterionId
&& x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate).ToListAsync();
if (globalTaskInfoList.Count() > 0 && globalTaskInfoList.Count == (int)criterionInfo.ReadingType)
{
var isAdd = false;
if (globalTaskInfoList[0].JudgeVisitTaskId == null)
{
isAdd = true;
}
else
{
isAdd = await _visitTaskRepository.AnyAsync(x => x.Id == globalTaskInfoList[0].JudgeVisitTaskId && x.ReadingTaskState == ReadingTaskState.HaveSigned);
}
if (isAdd)
{
await _visitTaskHelpeService.AddTaskAsync(new GenerateTaskCommand()
{
OriginalVisitId = globalTaskInfoList[0].Id,
ReadingCategory = GenerateTaskCategory.Oncology,
TrialId = dto.TrialId,
ReadingGenerataTaskList = new List<ReadingGenerataTaskDTO>() {
new ReadingGenerataTaskDTO()
{
IsUrgent = readModuleData.IsUrgent ?? false,
SubjectId = readModuleData.SubjectId,
VisitNum=visit.VisitNum,
ReadingName = readModuleData.ModuleName,
ReadModuleId =readModuleData.Id,
ReadingCategory = ReadingCategory.Oncology,
}
}
});
}
}
}
else
{
//---请先添加全局阅片
return ResponseOutput.NotOk(_localizer["ReadModule_AddGlobalFirst"]);
}
break;
}
var res = await _readModuleRepository.SaveChangesAsync();
return ResponseOutput.Ok(res);
}
else
{
//---未找到符合要求的访视
return ResponseOutput.NotOk(_localizer["ReadModule_VisitNotFound"]);
}
}
/// <summary>
/// 删除
/// </summary>
/// <param name="readModuleId"></param>
/// <returns></returns>
[HttpDelete("{readModuleId:guid}")]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
public async Task<IResponseOutput> DeleteReadModule(Guid readModuleId)
{
var readModule = await _readModuleRepository.Where(x => x.Id == readModuleId).FirstNotNullAsync();
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == readModule.TrialReadingCriterionId).Select(x => new
{
x.ReadingType,
x.IsArbitrationReading,
x.IsReadingPeriod,
x.ArbitrationRule,
x.IsGlobalReading,
x.IsOncologyReading,
}).FirstNotNullAsync();
if (await _readingClinicalDataRepository.Where(t => t.ReadingId == readModuleId).AnyAsync(t => t.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveSigned))
{
//---临床资料已签名,不允许删除
return ResponseOutput.NotOk(_localizer["ReadModule_SignedDataCannotDelete"]);
}
if (await _readModuleRepository.AnyAsync(x => x.Id == readModuleId && x.IsCRCConfirm))
{
//---CRC已经确认临床数据 不允许删除
return ResponseOutput.NotOk(_localizer["ReadModule_CRCConfirmClinicalData"]);
}
//增加标准
if (readModule.ModuleType == ModuleTypeEnum.Global && (await _readModuleRepository.AnyAsync(x => x.ModuleType == ModuleTypeEnum.Oncology && x.SubjectVisitId == readModule.SubjectVisitId && x.TrialReadingCriterionId == readModule.TrialReadingCriterionId)))
{
//---当前访视存在肿瘤学阅片,请先删除肿瘤学阅片
throw new BusinessValidationFailedException(_localizer["ReadModule_TumorExists"]);
}
if (await _visitTaskRepository.AnyAsync(x => readModuleId == x.SouceReadModuleId))
{
//---当前阅片已生成任务,操作失败。
throw new BusinessValidationFailedException(_localizer["ReadModule_TaskGenerated"]);
}
// 如果生成了 访视级别的阅片期裁判 不让删除
if (criterionInfo.IsArbitrationReading && criterionInfo.IsReadingPeriod && !criterionInfo.IsGlobalReading && criterionInfo.ArbitrationRule == ArbitrationRule.Reading)
{
if (await _visitTaskRepository.AnyAsync(x => x.SourceSubjectVisitId == readModule.SubjectVisitId && x.ReadingCategory == ReadingCategory.Judge))
{
//---当前阅片已生成裁判任务,操作失败。
throw new BusinessValidationFailedException(_localizer["ReadModule_JudgeTaskGenerated"]);
}
}
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => readModuleId == x.SouceReadModuleId, x => new VisitTask()
{
TaskState = TaskState.Adbandon
});
await _readModuleRepository.UpdatePartialFromQueryAsync(t => t.Id == readModuleId, x => new ReadModule()
{
IsDeleted = true
});
await _readModuleRepository.SaveChangesAsync();
return ResponseOutput.Result(true);
}
}
}