1117 lines
65 KiB
C#
1117 lines
65 KiB
C#
using IRaCIS.Core.Application.Filter;
|
||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||
using IRaCIS.Core.Application.ViewModel;
|
||
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,
|
||
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"]);
|
||
}
|
||
|
||
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();
|
||
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,
|
||
}
|
||
}
|
||
});
|
||
}
|
||
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();
|
||
|
||
|
||
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"]);
|
||
}
|
||
|
||
|
||
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);
|
||
}
|
||
|
||
|
||
}
|
||
}
|