//--------------------------------------------------------------------
// 此代码由T4模板自动生成 byzhouhang 20210918
// 生成时间 2023-06-15 15:06:06
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
//--------------------------------------------------------------------
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Application.Service.Reading.Interface;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infrastructure;
using MassTransit;
using Microsoft.AspNetCore.Mvc;
namespace IRaCIS.Core.Application.Service
{
///
/// 临床答案
///
[ApiExplorerSettings(GroupName = "Reading")]
public class ClinicalAnswerService(
IRepository _trialClinicalQuestionRepository,
IRepository _trialClinicalTableQuestionRepository,
IRepository _clinicalDataTrialSetRepository,
IRepository _clinicalFormRepository,
IRepository _subjectRepository,
IRepository _readModuleCriterionFromRepository,
IRepository _readModuleRepository,
IRepository _dicomStudyRepository,
IRepository _clinicalQuestionAnswerRepository,
IRepository _clinicalTableAnswerRepository,
IRepository _clinicalAnswerRowInfoRepository,
IRepository _readingClinicalDataRepository,
IRepository _subjectVisitRepository,
IClinicalQuestionService _iClinicalQuestionService,
IReadingClinicalDataService _iReadingClinicalDataService) : BaseService, IClinicalAnswerService
{
///
/// CRC签名临床数据
///
///
///
[HttpPost]
public async Task CRCSignClinicalData(CRCSignClinicalDataInDto inDto)
{
await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.ReadingClinicalDataId, x => new ReadingClinicalData()
{
IsSign = true,
ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned
});
await _readingClinicalDataRepository.SaveChangesAsync();
return ResponseOutput.Ok(true);
}
///
/// 删除检查级别临床数据
///
///
///
public async Task DeleteStudyClinical(DeleteStudyClinicalInDto inDto)
{
await _readingClinicalDataRepository.BatchDeleteNoTrackingAsync(x => x.StudyId == inDto.StudyId);
}
///
/// 添加检查级别临床数据
///
///
///
public async Task AddStudyClinical(AddStudyClinicalInDto inDto)
{
var studyInfo = await _dicomStudyRepository.Where(x => x.Id == inDto.StudyId).FirstNotNullAsync();
List clinicals = await _clinicalDataTrialSetRepository.Where(x =>
x.TrialId == studyInfo.TrialId && x.IsConfirm && x.ClinicalDataLevel == ClinicalLevel.Study).ToListAsync();
List datas = new List();
clinicals.ForEach(x =>
{
datas.Add(new ReadingClinicalData()
{
ClinicalDataTrialSetId = x.Id,
IsVisit = true,
SubjectId = studyInfo.SubjectId,
ReadingId = studyInfo.SubjectVisitId,
TrialId = studyInfo.TrialId,
StudyId = studyInfo.Id
});
});
await _readingClinicalDataRepository.AddRangeAsync(datas);
await _readingClinicalDataRepository.SaveChangesAsync();
}
///
/// 自动添加CRC临床数据 (不包括检查级别)
///
///
///
public async Task AutoAddCRCClinical(AutoAddClinicalInDto inDto)
{
var dataTrialSetList = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == inDto.TrialId && x.UploadRole == UploadRole.CRC && x.IsConfirm)
.IgnoreAutoIncludes().ToListAsync();
var baseLine = await _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId)
.WhereIf(inDto.SubjectId != null, x => x.SubjectId == inDto.SubjectId)
.Select(x => new
{
x.SubjectId,
VisitId = x.Id,
x.IsBaseLine,
}).ToListAsync();
var clinicalDataList = await _readingClinicalDataRepository
.WhereIf(inDto.SubjectId != null, x => x.SubjectId == inDto.SubjectId)
.Where(x => x.TrialId == inDto.TrialId && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC)
.Select(x => new
{
ClinicalDataTrialSetId = x.ClinicalDataTrialSetId,
SubjectId = x.SubjectId,
x.ReadingId,
}).ToListAsync();
List readingClinicalDatas = new List();
baseLine.Select(x => x.SubjectId).Distinct().ForEach(n =>
{
var baseLineVisitId = baseLine.Where(x => x.IsBaseLine && x.SubjectId == n).Select(x => x.VisitId).First();
readingClinicalDatas.AddRange(
dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.Subject).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.SubjectId == n).Count() == 0)
.Select(x => new ReadingClinicalData()
{
ClinicalDataTrialSetId = x.Id,
IsVisit = true,
SubjectId = n,
ReadingId = baseLineVisitId,
TrialId = inDto.TrialId
}).ToList());
readingClinicalDatas.AddRange(
dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.ImageRead).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.SubjectId == n).Count() == 0)
.Select(x => new ReadingClinicalData()
{
ClinicalDataTrialSetId = x.Id,
IsVisit = false,
SubjectId = n,
ReadingId = default(Guid),
TrialId = inDto.TrialId
}).ToList());
readingClinicalDatas.AddRange(
dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.OncologyRead).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.SubjectId == n).Count() == 0)
.Select(x => new ReadingClinicalData()
{
ClinicalDataTrialSetId = x.Id,
IsVisit = false,
SubjectId = n,
ReadingId = default(Guid),
TrialId = inDto.TrialId
}).ToList());
});
baseLine.ForEach(n =>
{
readingClinicalDatas.AddRange(
dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.ReadingId == n.VisitId).Count() == 0)
.Select(x => new ReadingClinicalData()
{
ClinicalDataTrialSetId = x.Id,
IsVisit = true,
SubjectId = n.SubjectId,
ReadingId = n.VisitId,
TrialId = inDto.TrialId
}).ToList());
//readingClinicalDatas.AddRange(
// dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.Study).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.ReadingId == n.VisitId).Count() == 0)
// .Select(x => new ReadingClinicalData()
// {
// ClinicalDataTrialSetId = x.Id,
// IsVisit = true,
// SubjectId = n.SubjectId,
// ReadingId = n.VisitId,
// TrialId = inDto.TrialId
// }).ToList());
});
await _readingClinicalDataRepository.AddRangeAsync(readingClinicalDatas);
await _readingClinicalDataRepository.SaveChangesAsync();
}
///
/// 获取CRC受试者临床数据
///
///
///
[HttpPost]
public async Task> GetCRCSubjectClinicalList(GetCRCSubjectClinicalInDto inQuery)
{
//await AutoAddCRCClinical(new AutoAddClinicalInDto()
//{
// TrialId = inDto.TrialId
//}) ;
var subjects = await _subjectRepository.Where(x => x.TrialId == inQuery.TrialId).Select(x => new GetCRCSubjectClinicalResultDto()
{
SubjectId = x.Id,
SubjectCode = x.Code
}).ToListAsync();
var clinicalData = _readingClinicalDataRepository.Where(x => x.TrialId == inQuery.TrialId && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.SubjectVisit)
.Where(x => !x.IsSign)
.WhereIf(inQuery.SubjectId != null, x => x.SubjectId == inQuery.SubjectId)
.WhereIf(inQuery.SubjectCode != null, x => x.Subject.Code.Contains(inQuery.SubjectCode ?? string.Empty))
.Where(x => x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.Subject)
.Include(x => x.ClinicalDataTrialSet).Select(x => new GetCRCSubjectClinicalOutDto()
{
SubjectId = x.SubjectId,
SubjectCode = x.Subject.Code,
TrialId = inQuery.TrialId,
ReadingId = x.ReadingId,
ReadingClinicalDataId = x.Id,
UploadRole = x.ClinicalDataTrialSet.UploadRole,
ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel,
ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType,
BaseLineVisitId = x.Subject.SubjectVisitList.Where(x => x.IsBaseLine).Select(x => x.Id).FirstOrDefault(),
ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id,
ClinicalDataSetEnName = x.ClinicalDataTrialSet.ClinicalDataSetEnName,
ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName,
});
var pageList = await clinicalData.ToPagedListAsync(inQuery, nameof(GetCRCSubjectClinicalOutDto.SubjectCode));
// 一次查询报错 分两次写
pageList.CurrentPageData.ForEach(x =>
{
x.ClinicalDataSetEnName = x.ClinicalDataSetName.LanguageName(x.ClinicalDataSetEnName, _userInfo.IsEn_Us);
});
var clinicalFormData = await _clinicalFormRepository.Where(x => x.TrialId == inQuery.TrialId).ToListAsync();
pageList.CurrentPageData.ForEach(n =>
{
n.ClinicalCount = clinicalFormData.Where(y => y.ClinicalDataTrialSetId == n.ClinicalDataTrialSetId && y.SubjectId == n.SubjectId).Count();
});
return pageList;
}
///
/// 获取表单列表
///
///
///
[HttpPost]
public async Task GetClinicalQuestionFormList(GetClinicalQuestionAnswerListInDto inDto)
{
var result = new GetClinicalQuestionAnswerListOutDto();
result.AnswerList = new List>();
result.QuestionList = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.ClinicalDataTrialSetId
&& x.ClinicalQuestionType != ReadingQestionType.Group
&& x.ClinicalQuestionType != ReadingQestionType.Table
&& x.ClinicalQuestionType != ReadingQestionType.BasicTable
).OrderByDescending(x => x.IsCheckDate).ThenBy(x => x.ShowOrder)
.ProjectTo(_mapper.ConfigurationProvider).ToListAsync();
if (_userInfo.IsEn_Us)
{
result.QuestionList.ForEach(x =>
{
x.GroupName = x.GroupEnName;
x.QuestionName = x.QuestionEnName;
});
}
var answers = await _clinicalQuestionAnswerRepository.Where(x => x.SubjectId == inDto.SubjectId && x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId)
.Select(x => new
{
x.ClinicalFormId,
x.ClinicalForm.CheckDate,
x.QuestionId,
x.Answer
})
.ToListAsync();
var ClinicalFormIds = answers.OrderBy(x => x.CheckDate).Select(x => x.ClinicalFormId).Distinct().ToList();
ClinicalFormIds.ForEach(x =>
{
var dic = answers.Where(y => y.ClinicalFormId == x).ToDictionary(x => x.QuestionId.ToString(), x => x.Answer);
dic.Add("ClinicalFormId", x.ToString());
dic.Add("TrialId", inDto.TrialId.ToString());
dic.Add("SubjectId", inDto.SubjectId.ToString());
dic.Add("ClinicalDataTrialSetId", inDto.ClinicalDataTrialSetId.ToString());
result.AnswerList.Add(dic);
});
return result;
}
///
/// 获取临床数据表单问题
///
///
///
[HttpPost]
public async Task> GetClinicalFormInfo(GetClinicalFormInfoInDto inDto)
{
var formInfo = await _clinicalFormRepository.Where(x => x.Id == inDto.ClinicalFormId).FirstNotNullAsync();
var questionAnswer = await _clinicalQuestionAnswerRepository.Where(x => x.ClinicalFormId == inDto.ClinicalFormId).Select(x => new ClinicalFormQuestionAnswer
{
QuestionId = x.QuestionId,
Answer = x.Answer
}).ToListAsync();
var tableAnswer = await _clinicalTableAnswerRepository.Where(x => x.ClinicalFormId == inDto.ClinicalFormId).Select(x => new ClinicalFormTableQuestionAnswer
{
TableQuestionId = x.TableQuestionId,
Answer = x.Answer,
QuestionId = x.QuestionId,
RowIndex = x.ClinicalAnswerRowInfo.RowIndex
}).ToListAsync();
var questions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId)
.ProjectTo(_mapper.ConfigurationProvider).ToListAsync();
var tableQuestions = await _trialClinicalTableQuestionRepository.Where(x => x.TrialClinicalId == formInfo.ClinicalDataTrialSetId)
.ProjectTo(_mapper.ConfigurationProvider).ToListAsync();
questions.ForEach(x => x.CreateTime = formInfo.CreateTime);
var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList();
result.ForEach(x =>
{
_iClinicalQuestionService.FindChildQuestion(x, questions, tableQuestions, questionAnswer, tableAnswer);
});
return result;
}
///
/// 提交临床数据表单
///
///
///
[HttpPost]
public async Task SubmitClinicalForm(SubmitClinicalFormInDto inDto)
{
ClinicalForm clinicalForm = new ClinicalForm() { };
clinicalForm = new ClinicalForm()
{
ClinicalDataTrialSetId = inDto.ClinicalDataTrialSetId,
SubjectId = inDto.SubjectId,
PicturePath = inDto.PicturePath,
TrialId = inDto.TrialId,
Id = inDto.ClinicalFormId ?? NewId.NextGuid(),
ReadingId = inDto.ReadingId,
};
if (inDto.ClinicalFormId != null && (await _readModuleCriterionFromRepository.AnyAsync(x => x.ClinicalFormId == inDto.ClinicalFormId.Value)))
{
throw new BusinessValidationFailedException(_localizer["ClinicalAnswer_translation"]);
}
var existsClinical = await _clinicalFormRepository.Where(x =>
x.SubjectId == inDto.SubjectId
&& x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId
).WhereIf(inDto.ReadingId != null, x => x.ReadingId == inDto.ReadingId)
.Where(x => x.ClinicalDataTrialSet.UploadRole != UploadRole.CRC && !(x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.ImageRead
|| x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.OncologyRead)).AnyAsync();
if (existsClinical)
{
throw new BusinessValidationFailedException(_localizer["ClinicalAnswer_duplicateData"]);
}
try
{
var checkDateQuestionId = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.ClinicalDataTrialSetId && x.IsCheckDate).Select(x => x.Id).FirstNotNullAsync();
clinicalForm.CheckDate = DateTime.Parse(inDto.QuestionAnswers.Where(x => x.QuestionId == checkDateQuestionId).Select(x => x.Answer).First());
}
catch (Exception)
{
}
if (clinicalForm.CheckDate != null)
{
if (await _readModuleRepository.AnyAsync(x => x.SubjectId == inDto.SubjectId && x.SubjectVisit.LatestScanDate <= clinicalForm.CheckDate && x.IsCRCConfirm))
{
throw new BusinessValidationFailedException(_localizer["ClinicalAnswer_unableToAddOrUpdate", clinicalForm.CheckDate.Value.ToString("yyyy-MM-dd")]);
}
}
List clinicalQuestionAnswers = inDto.QuestionAnswers.Select(x => new ClinicalQuestionAnswer()
{
Answer = x.Answer,
ClinicalDataTrialSetId = inDto.ClinicalDataTrialSetId,
SubjectId = inDto.SubjectId,
ClinicalFormId = clinicalForm.Id,
QuestionId = x.QuestionId,
}).ToList();
List clinicalAnswerRowInfos = new List();
List clinicalTableAnswers = new List();
inDto.TableQuestionAnswerList.ForEach(x =>
{
var questionid = x.QuestionId;
for (int i = 0; i < x.TableQuestionAnswers.Count(); i++)
{
var rowInfo = new ClinicalAnswerRowInfo()
{
Id = NewId.NextGuid(),
SubjectId = inDto.SubjectId,
ClinicalFormId = clinicalForm.Id,
QuestionId = questionid,
RowIndex = i + 1,
};
clinicalAnswerRowInfos.Add(rowInfo);
x.TableQuestionAnswers[i].ForEach(y =>
{
clinicalTableAnswers.Add(new ClinicalTableAnswer()
{
Answer = y.Answer,
ClinicalFormId = clinicalForm.Id,
QuestionId = questionid,
RowId = rowInfo.Id,
TableQuestionId = y.TableQuestionId,
SubjectId = inDto.SubjectId,
});
});
}
});
if (inDto.ClinicalFormId != null)
{
await _clinicalFormRepository.BatchDeleteNoTrackingAsync(x => x.Id == inDto.ClinicalFormId);
await _clinicalQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId);
await _clinicalAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId);
await _clinicalTableAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId);
}
//if(inDto.ReadingId!=null)
//{
// await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.ReadingId == inDto.ReadingId && x.ClinicalDataTrialSetId == inDto.ClinicalDataTrialSetId, x => new ReadingClinicalData()
// {
// IsSign = true
// });
//}
await _clinicalFormRepository.AddAsync(clinicalForm);
await _clinicalQuestionAnswerRepository.AddRangeAsync(clinicalQuestionAnswers);
await _clinicalAnswerRowInfoRepository.AddRangeAsync(clinicalAnswerRowInfos);
await _clinicalTableAnswerRepository.AddRangeAsync(clinicalTableAnswers);
await _clinicalTableAnswerRepository.SaveChangesAsync();
return ResponseOutput.Ok(true);
}
///
/// 删除表单数据
///
///
///
///
[HttpPost]
public async Task DeleteClinicalForm(DeleteClinicalFormInDto inDto)
{
if (await _readModuleCriterionFromRepository.AnyAsync(x => x.ClinicalFormId == inDto.ClinicalFormId))
{
throw new BusinessValidationFailedException(_localizer["ClinicalAnswer_unableToDelete"]);
}
await _clinicalFormRepository.BatchDeleteNoTrackingAsync(x => x.Id == inDto.ClinicalFormId);
await _clinicalQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId);
await _clinicalAnswerRowInfoRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId);
await _clinicalTableAnswerRepository.BatchDeleteNoTrackingAsync(x => x.ClinicalFormId == inDto.ClinicalFormId);
return ResponseOutput.Ok(true);
}
///
/// 获取PM待确认列表
///
///
///
[HttpPost]
public async Task> GetPMConfirmList(GetPMConfirmListInDto inDto)
{
return await GetCRCConfirmList(new GetCRCConfirmListInDto()
{
TrialId = inDto.TrialId,
IsCRCConfirm = true,
IsPMConfirm = false,
PageIndex = inDto.PageIndex,
PageSize = inDto.PageSize,
Asc = inDto.Asc,
SortField = inDto.SortField,
TrialReadingCriterionId = inDto.TrialReadingCriterionId
});
}
///
/// 获取CRC确认列表
///
///
///
[HttpPost]
public async Task> GetCRCConfirmList(GetCRCConfirmListInDto inDto)
{
if (inDto.ReadModuleId != null)
{
var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync();
inDto.TrialReadingCriterionId = readModule.TrialReadingCriterionId;
}
// 有全局就查全局 有肿瘤学就查肿瘤学
var clinicalDataLevelList = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == inDto.TrialId && x.IsConfirm && x.UploadRole == UploadRole.CRC && x.ClinicalUploadType == ClinicalUploadType.Structuring).Select(x => x.ClinicalDataLevel).Distinct().ToListAsync();
var existsCRCStructuring = clinicalDataLevelList.Any(x => x == ClinicalLevel.OncologyRead || x == ClinicalLevel.ImageRead);
ReadingSetType? readingSetType = null;
if (clinicalDataLevelList.Contains(ClinicalLevel.ImageRead) && !clinicalDataLevelList.Contains(ClinicalLevel.OncologyRead))
{
readingSetType = ReadingSetType.ImageReading;
}
else if (clinicalDataLevelList.Contains(ClinicalLevel.OncologyRead) && !clinicalDataLevelList.Contains(ClinicalLevel.ImageRead))
{
readingSetType = ReadingSetType.TumorReading;
}
var query = _readModuleRepository.Where(x => x.TrialId == inDto.TrialId)
.Where(x => existsCRCStructuring)
.WhereIf(inDto.ReadModuleId == null, x => x.TrialReadingCriterion.IsConfirm)
.WhereIf(inDto.ReadModuleId != null, x => x.Id == inDto.ReadModuleId)
.WhereIf(inDto.IsCRCConfirm != null, x => x.IsCRCConfirm == inDto.IsCRCConfirm)
.WhereIf(inDto.IsPMConfirm != null, x => x.IsPMConfirm == inDto.IsPMConfirm)
.WhereIf(inDto.SubjectCode != null, x => x.Subject.Code.Contains(inDto.SubjectCode ?? string.Empty))
.WhereIf(inDto.TrialReadingCriterionId != null, x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId)
.WhereIf(inDto.SubjectId != null, x => x.SubjectId == inDto.SubjectId)
.WhereIf(inDto.StartTime != null, x => x.SubjectVisit.LatestScanDate >= inDto.StartTime)
.WhereIf(inDto.EndTime != null, x => x.SubjectVisit.LatestScanDate <= inDto.EndTime)
.WhereIf(readingSetType != null, x => x.ReadingSetType == readingSetType)
.Select(x => new GetCRCConfirmListOutDto()
{
SubjectId = x.SubjectId,
IsNotNeedPMConfirm = x.IsNotNeedPMConfirm,
IsCRCConfirm = x.IsCRCConfirm,
IsCRCApplicationRevoke = x.IsCRCApplicationRevoke,
VisitBlindName = x.SubjectVisit.BlindName,
LatestScanDate = x.SubjectVisit.LatestScanDate,
ReadingSetType = x.ReadingSetType,
IsPMConfirm = x.IsPMConfirm,
SubjectCode = x.Subject.Code,
ReadModuleId = x.Id,
ModuleName = x.ModuleName,
});
var defalutSortArray = new string[] { nameof(GetCRCConfirmListOutDto.SubjectCode) + " desc", nameof(GetCRCConfirmListOutDto.LatestScanDate) };
var result = await query.ToPagedListAsync(inDto, defalutSortArray);
var formList = await _clinicalFormRepository.Where(x => x.TrialId == inDto.TrialId)
.Where(x => x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC)
.WhereIf(inDto.TrialReadingCriterionId != null, x => x.ClinicalDataTrialSet.TrialClinicalDataSetCriteriaList.Any(y => y.TrialReadingCriterionId == inDto.TrialReadingCriterionId))
.Where(x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.ImageRead || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.OncologyRead)
.Include(x => x.ClinicalDataTrialSet)
.Select(x => new CRCClinicalForm
{
SubjectId = x.SubjectId,
CheckDate = x.CheckDate,
ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel,
ClinicalFormId = x.Id,
ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id,
ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName,
ClinicalDataSetEnName = x.ClinicalDataTrialSet.ClinicalDataSetEnName,
IsHaveTableQuestion = x.ClinicalDataTrialSet.TrialClinicalQuestionList.Any(y => y.ClinicalQuestionType == ReadingQestionType.Table || y.ClinicalQuestionType == ReadingQestionType.BasicTable),
}).ToListAsync();
var confirmList = await _readModuleCriterionFromRepository.Where(x => x.TrialId == inDto.TrialId
&& x.ClinicalForm.ClinicalDataTrialSet.UploadRole == UploadRole.CRC
&& (x.ClinicalForm.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.ImageRead || x.ClinicalForm.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.OncologyRead))
.Select(x => new GetCRCBeConfirm
{
CheckDate = x.ClinicalForm.CheckDate ?? default(DateTime),
ClinicalDataSetName = x.ClinicalForm.ClinicalDataTrialSet.ClinicalDataSetName,
ClinicalDataSetEnName = x.ClinicalForm.ClinicalDataTrialSet.ClinicalDataSetEnName,
ClinicalFormId = x.ClinicalFormId,
ClinicalDataTrialSetId = x.ClinicalForm.ClinicalDataTrialSet.Id,
ReadModuleId = x.ReadModuleId,
IsHaveTableQuestion = x.ClinicalForm.ClinicalDataTrialSet.TrialClinicalQuestionList.Any(y => y.ClinicalQuestionType == ReadingQestionType.Table || y.ClinicalQuestionType == ReadingQestionType.BasicTable)
}).ToListAsync();
result.CurrentPageData.ForEach(x =>
{
if (x.IsCRCConfirm)
{
x.ClinicalFormList = confirmList.Where(y => y.ReadModuleId == x.ReadModuleId).Select(y => new GetCRCBeConfirmListOutDto()
{
CheckDate = y.CheckDate,
ClinicalDataSetName = y.ClinicalDataSetName.LanguageName(y.ClinicalDataSetEnName, _userInfo.IsEn_Us),
ClinicalDataSetEnName = y.ClinicalDataSetEnName,
ClinicalFormId = y.ClinicalFormId,
ClinicalDataTrialSetId = y.ClinicalDataTrialSetId,
IsHaveTableQuestion = y.IsHaveTableQuestion,
}).ToList();
}
else
{
if (x.ReadingSetType == ReadingSetType.ImageReading)
{
x.ClinicalFormList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.ImageRead && y.CheckDate <= x.LatestScanDate && y.SubjectId == x.SubjectId)
.Select(y => new GetCRCBeConfirmListOutDto()
{
CheckDate = y.CheckDate ?? default(DateTime),
ClinicalDataSetName = y.ClinicalDataSetName.LanguageName(y.ClinicalDataSetEnName, _userInfo.IsEn_Us),
ClinicalDataSetEnName = y.ClinicalDataSetEnName,
ClinicalFormId = y.ClinicalFormId,
ClinicalDataTrialSetId = y.ClinicalDataTrialSetId,
IsHaveTableQuestion = y.IsHaveTableQuestion,
}).ToList();
}
else
{
x.ClinicalFormList = formList.Where(y => y.ClinicalDataLevel == ClinicalLevel.OncologyRead && y.CheckDate <= x.LatestScanDate && y.SubjectId == x.SubjectId)
.Select(y => new GetCRCBeConfirmListOutDto()
{
CheckDate = y.CheckDate ?? default(DateTime),
ClinicalDataSetName = y.ClinicalDataSetName.LanguageName(y.ClinicalDataSetEnName, _userInfo.IsEn_Us),
ClinicalDataSetEnName = y.ClinicalDataSetEnName,
ClinicalFormId = y.ClinicalFormId,
ClinicalDataTrialSetId = y.ClinicalDataTrialSetId,
IsHaveTableQuestion = y.IsHaveTableQuestion,
}).ToList();
}
}
});
return result;
}
///
/// 获取CRC待确认列表
///
///
///
[HttpPost]
public async Task> GetCRCBeConfirmList(GetCRCBeConfirmListInDto inDto)
{
var result = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto()
{
ReadModuleId = inDto.ReadModuleId,
TrialId = inDto.TrialId,
PageIndex = 1,
PageSize = 9999,
})).CurrentPageData.SelectMany(x => x.ClinicalFormList).ToList();
return result.OrderBy(x => x.ClinicalDataSetName).ThenBy(x => x.CheckDate).ToList();
}
///
/// 获取临床数据表格信息 查看没有表格问题的列表
///
///
///
[HttpPost]
public async Task<(List, object)> GetClinicalTableList(GetClinicalTableListInDto inDto)
{
var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync();
var confirmList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto()
{
ReadModuleId = inDto.ReadModuleId,
TrialId = inDto.TrialId,
PageIndex = 1,
PageSize = 9999,
})).CurrentPageData.SelectMany(x => x.ClinicalFormList).ToList();
var clinicalDataTrialSetIds = confirmList.Select(x => x.ClinicalDataTrialSetId).Distinct().ToList();
var clinicalFormIds = confirmList.Select(x => x.ClinicalFormId).ToList();
var questionList = await _trialClinicalQuestionRepository.Where(x => clinicalDataTrialSetIds.Contains(x.TrialClinicalId)
&& x.ClinicalQuestionType != ReadingQestionType.Group
&& x.ClinicalQuestionType != ReadingQestionType.Table
&& x.ClinicalQuestionType != ReadingQestionType.BasicTable
).OrderBy(x => x.TrialClinicalId).ThenBy(x => x.ShowOrder)
.ProjectTo(_mapper.ConfigurationProvider).ToListAsync();
var answers = await _clinicalQuestionAnswerRepository.Where(x => clinicalFormIds.Contains(x.ClinicalFormId))
.Select(x => new
{
x.ClinicalDataTrialSetId,
x.ClinicalFormId,
x.ClinicalForm.CheckDate,
x.QuestionId,
x.Answer
})
.ToListAsync();
List result = new List();
clinicalDataTrialSetIds.ForEach(x =>
{
GetClinicalTableListOutDto dto = new GetClinicalTableListOutDto();
dto.ModuleName = readModule.ModuleName;
dto.ClinicalDataSetName = confirmList.Where(y => y.ClinicalDataTrialSetId == x).Select(y => y.ClinicalDataSetName).First();
dto.QuestionList = questionList.Where(y => y.TrialClinicalId == x).OrderBy(y => y.ShowOrder).ToList();
dto.AnswerList = new List>();
var ClinicalFormIds = answers.Where(y => y.ClinicalDataTrialSetId == x).OrderBy(x => x.CheckDate).Select(x => x.ClinicalFormId).Distinct().ToList();
ClinicalFormIds.ForEach(z =>
{
var dic = answers.Where(y => y.ClinicalFormId == z).OrderBy(y => y.CheckDate).ToDictionary(x => x.QuestionId.ToString(), x => x.Answer);
dic.Add("ClinicalFormId", z.ToString());
dic.Add("TrialId", inDto.TrialId.ToString());
dic.Add("SubjectId", readModule.SubjectId.ToString());
dic.Add("ClinicalDataTrialSetId", x.ToString());
dto.AnswerList.Add(dic);
});
result.Add(dto);
});
return (result, new
{
readModule.ModuleName,
});
}
///
/// 获取临床数据表格信息 查看有表格问题的列表
///
///
///
[HttpPost]
public async Task<(List, object)> GetClinicalDateList(GetCRCBeConfirmListInDto inDto)
{
var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync();
var confirmList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto()
{
ReadModuleId = inDto.ReadModuleId,
TrialId = inDto.TrialId,
PageIndex = 1,
PageSize = 9999,
})).CurrentPageData.SelectMany(x => x.ClinicalFormList).ToList();
var clinicalDataTrialSetIds = confirmList.Select(x => x.ClinicalDataTrialSetId).Distinct().ToList();
List result = new List();
clinicalDataTrialSetIds.ForEach(x =>
{
result.Add(new GetClinicalDateListOutDto()
{
ClinicalDataSetName = confirmList.Where(y => y.ClinicalDataTrialSetId == x).Select(y => y.ClinicalDataSetName).First(),
DateList = confirmList.Where(y => y.ClinicalDataTrialSetId == x).ToList()
});
});
return (result, new
{
readModule.ModuleName,
});
}
///
/// CRC 确认临床数据
///
///
///
[HttpPost]
public async Task CRCConfirmClinical(CRCConfirmClinicalInDto inDto)
{
var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync();
var confirmlist = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto()
{
TrialId = inDto.TrialId,
SubjectId = readModule.SubjectId,
IsCRCConfirm = false,
TrialReadingCriterionId = readModule.TrialReadingCriterionId,
//ReadModuleId = inDto.ReadModuleId,
PageIndex = 1,
PageSize = 9999,
})).CurrentPageData.ToList();
var presentData = confirmlist.Where(x => x.ReadModuleId == inDto.ReadModuleId).First();
confirmlist = confirmlist.Where(x => x.LatestScanDate <= presentData.LatestScanDate).ToList();
await _readModuleCriterionFromRepository.BatchDeleteNoTrackingAsync(x => x.ReadModuleId == inDto.ReadModuleId);
List needAddList = new List()
{
};
confirmlist.ForEach(x =>
{
x.ClinicalFormList.ForEach(y =>
{
needAddList.Add(new ReadModuleCriterionFrom()
{
ClinicalFormId = y.ClinicalFormId,
ReadModuleId = x.ReadModuleId,
SubjectId = x.SubjectId,
TrialId = inDto.TrialId,
});
});
});
foreach (var item in confirmlist)
{
await _readModuleRepository.UpdatePartialFromQueryAsync(x => x.Id == item.ReadModuleId, x => new ReadModule()
{
IsCRCConfirm = true,
IsPMConfirm = item.ClinicalFormList.Count() == 0 ? true : false,
IsNotNeedPMConfirm = item.ClinicalFormList.Count() == 0 ? true : false,
});
}
await _readModuleCriterionFromRepository.AddRangeAsync(needAddList);
await _readModuleCriterionFromRepository.SaveChangesAsync();
await _iReadingClinicalDataService.DealVisiTaskClinicalDataSignedAsync(inDto.TrialId, inDto.SubjectId, inDto.ReadModuleId, false, readModule.TrialReadingCriterionId);
return ResponseOutput.Ok(true);
}
///
/// CRC 取消确认
///
///
///
[HttpPost]
public async Task CRCCancelConfirmClinical(CRCCancelConfirmClinicalInDto inDto)
{
var readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync();
var dataList = (await this.GetCRCConfirmList(new GetCRCConfirmListInDto()
{
TrialId = inDto.TrialId,
SubjectId = readModule.SubjectId,
TrialReadingCriterionId = readModule.TrialReadingCriterionId,
PageIndex = 1,
PageSize = 9999,
})).CurrentPageData;
var presentData = dataList.Where(x => x.ReadModuleId == inDto.ReadModuleId).First();
if (dataList.Any(x => x.IsCRCConfirm && x.LatestScanDate > presentData.LatestScanDate && x.ReadingSetType == presentData.ReadingSetType))
{
throw new BusinessValidationFailedException(_localizer["ClinicalAnswer_unableToCancel"]);
}
if (presentData.IsPMConfirm)
{
throw new BusinessValidationFailedException(_localizer["ClinicalAnswer_unableToCancelPMConfirmed"]);
}
if (presentData.IsNotNeedPMConfirm)
{
await _readModuleRepository.UpdatePartialFromQueryAsync(x => presentData.ReadModuleId == x.Id, x => new ReadModule()
{
IsPMConfirm = false,
IsCRCConfirm = false,
IsNotNeedPMConfirm = false,
});
}
else
{
await _readModuleRepository.UpdatePartialFromQueryAsync(x => presentData.ReadModuleId == x.Id, x => new ReadModule()
{
IsCRCApplicationRevoke = true,
});
}
//await _readModuleCriterionFromRepository.BatchDeleteNoTrackingAsync(x=>x.ReadModuleId== presentData.ReadModuleId);
await _readModuleCriterionFromRepository.SaveChangesAsync();
return ResponseOutput.Ok(true);
}
///
/// PM确认临床数据
///
///
///
///
[HttpPost]
public async Task PMConfirmClinical(CRCConfirmClinicalInDto inDto)
{
var readModuleData = await _readModuleRepository.Where(x => x.Id == inDto.ReadModuleId).FirstNotNullAsync();
if (!readModuleData.IsCRCConfirm)
{
throw new BusinessValidationFailedException(_localizer["ClinicalAnswer_PMUnableToOperate"]);
}
if (readModuleData.IsCRCApplicationRevoke && inDto.IsConfirm)
{
throw new BusinessValidationFailedException(_localizer["ClinicalAnswer_PMUnableToConfirm"]);
}
if (!readModuleData.IsCRCApplicationRevoke && !inDto.IsConfirm)
{
throw new BusinessValidationFailedException(_localizer["ClinicalAnswer_PMUnableToWithdraw"]);
}
if (inDto.IsConfirm)
{
await _readModuleRepository.UpdatePartialFromQueryAsync(x => inDto.ReadModuleId == x.Id, x => new ReadModule()
{
IsPMConfirm = true,
IsClinicalDataBlind = inDto.IsClinicalDataBlind,
IsClinicalDataComplete = inDto.IsClinicalDataComplete,
});
await _readModuleRepository.SaveChangesAsync();
await _iReadingClinicalDataService.DealVisiTaskClinicalDataSignedAsync(inDto.TrialId, inDto.SubjectId, inDto.ReadModuleId, false, readModuleData.TrialReadingCriterionId);
}
else
{
await _readModuleRepository.UpdatePartialFromQueryAsync(x => inDto.ReadModuleId == x.Id, x => new ReadModule()
{
IsCRCConfirm = false,
IsCRCApplicationRevoke = false,
});
await _readModuleRepository.SaveChangesAsync();
await _readModuleCriterionFromRepository.BatchDeleteNoTrackingAsync(x => x.ReadModuleId == inDto.ReadModuleId);
}
return ResponseOutput.Ok(true);
}
}
}