2285 lines
128 KiB
C#
2285 lines
128 KiB
C#
using DocumentFormat.OpenXml.Spreadsheet;
|
||
using IRaCIS.Application.Contracts;
|
||
using IRaCIS.Application.Interfaces;
|
||
using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson;
|
||
using IRaCIS.Core.Application.Contracts;
|
||
using IRaCIS.Core.Application.Contracts.DTO;
|
||
using IRaCIS.Core.Application.ViewModel;
|
||
using IRaCIS.Core.Domain.Models;
|
||
using IRaCIS.Core.Domain.Share;
|
||
using IRaCIS.Core.Infra.EFCore.Common;
|
||
using Microsoft.AspNetCore.Authorization;
|
||
using Microsoft.AspNetCore.Hosting;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using NPOI.POIFS.Properties;
|
||
using NPOI.XSSF.UserModel;
|
||
using System.ComponentModel.Design;
|
||
using System.Globalization;
|
||
using static IRaCIS.Core.Application.Service.ExcelExportHelper;
|
||
using IDictionaryService = IRaCIS.Application.Interfaces.IDictionaryService;
|
||
|
||
namespace IRaCIS.Core.Application.Service.Common
|
||
{
|
||
|
||
[ApiExplorerSettings(GroupName = "Common")]
|
||
public class ExcelExportService(IRepository<TrialUserRole> _trialUserRepository,
|
||
IRepository<VisitTask> _visitTaskRepository,
|
||
IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
|
||
IRepository<DicomStudy> _dicomStudyRepository,
|
||
IRepository<QCChallenge> _qcChallengeRepository,
|
||
IRepository<ReadModule> _readModuleRepository,
|
||
IRepository<NoneDicomStudy> _noneDicomStudyRepository,
|
||
IRepository<StudyMonitor> _studyMonitorRepository,
|
||
IRepository<CommonDocument> _commonDocumentRepository,
|
||
IRepository<Subject> _subjectRepository,
|
||
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IWebHostEnvironment _hostEnvironment) : BaseService
|
||
{
|
||
|
||
|
||
#region 后续需要移动过来
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 项目参与人员导出
|
||
/// </summary>
|
||
/// <param name="param"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <param name="_trialUseRoleRepository"></param>
|
||
/// <returns></returns>
|
||
/// <exception cref="Exception"></exception>
|
||
[HttpPost]
|
||
[AllowAnonymous]
|
||
public async Task<IActionResult> TrialUserListExport(TrialMaintenanceExportQuery param,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository,
|
||
[FromServices] IRepository<TrialUserRole> _trialUseRoleRepository
|
||
|
||
)
|
||
{
|
||
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
var list = await _trialUseRoleRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters()
|
||
.WhereIf(param.UserTypeId != null, t => t.UserRole.UserTypeId == param.UserTypeId)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.UserName), t => t.UserRole.UserName.Contains(param.UserName))
|
||
|
||
.WhereIf(param.IsDeleted != null, t => t.IsDeleted == param.IsDeleted)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.OrganizationName),
|
||
t => t.UserRole.OrganizationName.Contains(param.OrganizationName))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.UserRealName),
|
||
t => (t.UserRole.FullName).Contains(param.UserRealName))
|
||
.ProjectTo<TrialMaintenanceDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialMaintenanceDTO));
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// Site用户列表导出
|
||
/// </summary>
|
||
/// <param name="param"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <param name="_trialSiteUserRepository"></param>
|
||
/// <returns></returns>
|
||
/// <exception cref="Exception"></exception>
|
||
[HttpPost]
|
||
[AllowAnonymous]
|
||
public async Task<IActionResult> TrialSiteUserListExport(SiteCRCExportQueryDTO param,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository,
|
||
[FromServices] IRepository<TrialSiteUser> _trialSiteUserRepository
|
||
)
|
||
{
|
||
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
var list = await _trialSiteUserRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters()
|
||
.WhereIf(param.IsDeleted != null, t => t.IsDeleted == param.IsDeleted)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.SiteName), t => t.TrialSite.TrialSiteName.Contains(param.SiteName) || t.TrialSite.TrialSiteAliasName.Contains(param.SiteName))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteAliasName),
|
||
t => t.TrialSite.TrialSiteAliasName.Contains(param.TrialSiteAliasName))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteCode),
|
||
t => t.TrialSite.TrialSiteCode.Contains(param.TrialSiteCode))
|
||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator,
|
||
t => t.UserId == _userInfo.UserRoleId)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.UserKeyInfo), t => (t.User.FullName).Contains(param.UserKeyInfo)
|
||
|| t.User.UserName.Contains(param.UserKeyInfo) || t.User.EMail.Contains(param.UserKeyInfo))
|
||
|
||
.ProjectTo<SiteUserExportDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SiteUserExportDTO));
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 项目列表导出---new
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[AllowAnonymous]
|
||
public async Task<IActionResult> GetTrialList_Export(TrialToBeDoneQuery inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository
|
||
)
|
||
{
|
||
var isPM = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM;
|
||
var isCRC = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator;
|
||
var isIQC = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC;
|
||
var isMIM = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.MIM;
|
||
var isSPMOrCPM = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM;
|
||
var isIR = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer;
|
||
|
||
|
||
var query = _trialRepository.AsQueryable()
|
||
.WhereIf(inQuery.TrialIdList.Count() > 0, o => inQuery.TrialIdList.Contains(o.Id))
|
||
|
||
.WhereIf(inQuery.SponsorId != null, o => o.SponsorId == inQuery.SponsorId)
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.Code), o => o.TrialCode.Contains(inQuery.Code))
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.ResearchProgramNo), o => o.ResearchProgramNo.Contains(inQuery.ResearchProgramNo))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.ExperimentName), o => o.ExperimentName.Contains(inQuery.ExperimentName))
|
||
.WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.Admin && _userInfo.UserTypeEnumInt != (int)UserTypeEnum.OP, t => t.TrialUserRoleList.Any(t => t.UserId == _userInfo.UserRoleId && t.IsDeleted == false) && t.IsDeleted == false)
|
||
.WhereIf(inQuery.CriterionType != null, o => o.TrialReadingCriterionList.Any(t => t.CriterionType == inQuery.CriterionType && t.IsSigned && t.IsConfirm))
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.PM_EMail), o => o.TrialUserRoleList.Any(t => t.UserRole.EMail.Contains(inQuery.PM_EMail) && (t.UserRole.UserTypeEnum == UserTypeEnum.ProjectManager || t.UserRole.UserTypeEnum == UserTypeEnum.APM)))
|
||
.Select(t => new TrialToBeDoneDto()
|
||
{
|
||
TrialId = t.Id,
|
||
ResearchProgramNo = t.ResearchProgramNo,
|
||
ExperimentName = t.ExperimentName,
|
||
TrialCode = t.TrialCode,
|
||
CreateTime = t.CreateTime,
|
||
Sponsor = _userInfo.IsEn_Us ? t.Sponsor : t.Sponsor,
|
||
TrialStatusStr = t.TrialStatusStr,
|
||
|
||
ExpetiedTaskCount = isPM ? t.VisitTaskList.Where(t => t.IsUrgent).Count() : 0,
|
||
|
||
ReReadingApprovalCount = isPM ? t.VisitTaskReReadingList.Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed).Count() : 0,
|
||
|
||
PendingReconciliationCount = isPM ? t.SubjectVisitList.Where(t => t.CheckState == CheckStateEnum.ToCheck).Count() : 0,
|
||
|
||
PendingResponseCount = isPM ? t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.CVIng &&
|
||
u.CheckChallengeDialogList.OrderByDescending(t => t.CreateTime).First().UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count() : 0,
|
||
|
||
|
||
SPM_ReReadingApprovalCount = isSPMOrCPM ? t.VisitTaskReReadingList.Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed).Count() : 0,
|
||
|
||
SPM_ReviewerSelectApprovalCount = isSPMOrCPM ? t.EnrollList.Where(u => u.EnrollStatus == EnrollStatus.HasCommittedToCRO).Count() : 0,
|
||
|
||
MIM_UrgentCount = isMIM ? t.TaskMedicalReviewList.Where(t => t.IsClosedDialog == false && t.VisitTask.TaskState == TaskState.Effect && t.IsInvalid == false && t.MedicalManagerUserId == _userInfo.UserRoleId)
|
||
.Where(u => u.VisitTask.IsUrgent &&
|
||
u.AuditState != MedicalReviewAuditState.HaveSigned).Count() : 0,
|
||
|
||
MIM_PendingResponseCount = isMIM ? t.TaskMedicalReviewList.Where(t => t.IsClosedDialog == false && t.VisitTask.TaskState == TaskState.Effect && t.IsInvalid == false && t.MedicalManagerUserId == _userInfo.UserRoleId)
|
||
.Where(u => u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IndependentReviewer && u.AuditState == MedicalReviewAuditState.Auditing).Count() : 0,
|
||
|
||
MIM_PendingReviewCount = isMIM ? t.TaskMedicalReviewList.Where(t => t.IsClosedDialog == false && t.VisitTask.TaskState == TaskState.Effect && t.IsInvalid == false && t.MedicalManagerUserId == _userInfo.UserRoleId)
|
||
.Where(u => u.AuditState != MedicalReviewAuditState.HaveSigned && u.LatestReplyUser.UserTypeEnum != UserTypeEnum.IndependentReviewer).Count() : 0,
|
||
|
||
CRC_UrgentCount = isCRC ? t.SubjectVisitList.Where(c => c.TrialSite.CRCUserList.Any(u => u.UserId == _userInfo.UserRoleId) && t.IsUrgent).Count() : 0,
|
||
|
||
CRC_CheckQuestionCount = isCRC ? t.SubjectVisitList.Where(c => c.TrialSite.CRCUserList.Any(u => u.UserId == _userInfo.UserRoleId))
|
||
.Where(u => u.CheckState == CheckStateEnum.CVIng && u.CheckChallengeState == CheckChanllengeTypeEnum.PMWaitCRCReply).Count() : 0,
|
||
|
||
CRC_QCQuestionCount = isCRC ? t.SubjectVisitList.Where(c => c.TrialSite.CRCUserList.Any(u => u.UserId == _userInfo.UserRoleId)).SelectMany(c => c.QCChallengeList)
|
||
.Where(u => u.IsClosed == false && (u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC || u.LatestReplyUserId == null)).Count() : 0,
|
||
|
||
|
||
//待审核 审核中 加急的数量
|
||
IQC_UrgentCount = isIQC ? t.SubjectVisitList.Where(u => u.CurrentActionUserId == _userInfo.UserRoleId && t.QCProcessEnum != TrialQCProcess.NotAudit && t.IsUrgent).Count() : 0,
|
||
|
||
//审核未完成
|
||
IQC_AuditToBeDealedCount = isIQC ? t.SubjectVisitList.Where(u => u.CurrentActionUserId == _userInfo.UserRoleId && t.QCProcessEnum != TrialQCProcess.NotAudit).Count() : 0,
|
||
|
||
//质疑待处理
|
||
IQC_QuestionToBeDealedCount = isIQC ? t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
|
||
.Where(u => u.CreateUserId == _userInfo.UserRoleId && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count() : 0,
|
||
|
||
//待领取
|
||
IQC_ToBeClaimedCount = isIQC ? t.SubjectVisitList.Where(t => t.SubmitState == SubmitStateEnum.Submitted && t.AuditState != AuditStateEnum.QCPassed)
|
||
.Where(u => u.CurrentActionUserId == null && (u.PreliminaryAuditUserId == null || (u.PreliminaryAuditUserId != _userInfo.UserRoleId && u.ReviewAuditUserId == null))).Count() : 0,
|
||
|
||
|
||
IR_ReadingCriterionList = isIR ? t.TrialReadingCriterionList.Where(t => t.IsConfirm && t.IsSigned).OrderBy(t => t.CriterionName).Select(t => t.CriterionName).ToList() : null,
|
||
|
||
IR_PMEmailList = isIR ? t.TrialUserRoleList.Where(t => t.UserRole.UserTypeEnum == UserTypeEnum.ProjectManager || t.UserRole.UserTypeEnum == UserTypeEnum.APM).OrderBy(t => t.UserRole.EMail).Select(t => t.UserRole.EMail).ToList() : null,
|
||
|
||
IR_TotalReadCount = isIR ? t.VisitTaskList.Where(t => t.DoctorUserId == _userInfo.UserRoleId && t.TaskState == TaskState.Effect && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() : 0,
|
||
|
||
|
||
IR_UnReadCount = isIR ? t.VisitTaskList
|
||
.Where(c => c.DoctorUserId == _userInfo.UserRoleId && c.ReadingTaskState != ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect && c.TrialReadingCriterion.IsSigned)
|
||
// 前序 不存在 未一致性核查未通过的
|
||
.Where(t => !t.Subject.SubjectVisitList.Any(sv => sv.CheckState != CheckStateEnum.CVPassed && t.VisitTaskNum > sv.VisitNum))
|
||
//前序 不存在 未生成任务的访视
|
||
.Where(t => t.TrialReadingCriterion.IsAutoCreate == false ? !t.Subject.SubjectCriteriaEvaluationVisitFilterList.Where(d => d.TrialReadingCriterionId == t.TrialReadingCriterionId).Any(f => f.IsGeneratedTask == false && t.VisitTaskNum > f.SubjectVisit.VisitNum) : true)
|
||
|
||
.Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true)).Count() : 0,
|
||
|
||
IR_UrgentCount = isIR ? t.VisitTaskList.Where(t => t.SourceSubjectVisit.IsUrgent).Count() : 0,
|
||
|
||
});
|
||
|
||
|
||
var list = query.ToList();
|
||
|
||
var exportInfo = new ExcelExportInfo();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialList_Export, exportInfo, exportInfo.TrialCode, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialToBeDoneDto));
|
||
|
||
}
|
||
|
||
|
||
#endregion
|
||
|
||
|
||
|
||
|
||
|
||
#region 导表查询
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 影像上传列表 只导出已上传状态的访视记录
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_subjectVisitRepository"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[AllowAnonymous]
|
||
public async Task<IActionResult> CRCVisitList_Export(CRCVisitSearchDTO inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<SubjectVisit> _subjectVisitRepository,
|
||
[FromServices] IRepository<Trial> _trialRepository
|
||
)
|
||
{
|
||
|
||
var svExpression = QCCommon.GetSubjectVisitFilter(inQuery.VisitPlanArray);
|
||
|
||
var query = _subjectVisitRepository.Where(x => x.TrialId == inQuery.TrialId)
|
||
.Where(t => t.Subject.FinalSubjectVisitId != null ? t.VisitNum <= t.Subject.FinalSubjectVisit.VisitNum : true)
|
||
.WhereIf(inQuery.TrialSiteId != null, t => t.TrialSiteId == inQuery.TrialSiteId)
|
||
.WhereIf(inQuery.SubjectId != null, t => t.Subject.Id == inQuery.SubjectId)
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectInfo), t => t.Subject.Code.Contains(inQuery.SubjectInfo))
|
||
|
||
.WhereIf(inQuery.VisitPlanArray != null && inQuery.VisitPlanArray?.Length > 0, svExpression)
|
||
//.WhereIf(!string.IsNullOrEmpty(visitSearchDTO.VisitPlanInfo), visitSearchDTO.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(visitSearchDTO.VisitPlanInfo))
|
||
.WhereIf(inQuery.AuditStateArray != null && inQuery.AuditStateArray?.Length > 0, t => inQuery.AuditStateArray!.Contains(t.AuditState))
|
||
.WhereIf(inQuery.SubmitState != null, t => t.SubmitState == inQuery.SubmitState)
|
||
.WhereIf(inQuery.ChallengeState != null, t => t.ChallengeState == inQuery.ChallengeState)
|
||
.WhereIf(inQuery.IsUrgent != null, t => t.IsUrgent == inQuery.IsUrgent)
|
||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.UserRoleId))
|
||
.ProjectTo<CRCVisitExportDTO>(_mapper.ConfigurationProvider);
|
||
|
||
var list = query.OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.BlindName).ToList();
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialCRCUploadImageList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CRCVisitExportDTO));
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 影像质控导出---new
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_subjectVisitRepository"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[AllowAnonymous]
|
||
public async Task<IActionResult> QCVisitList_Export(QCVisitSearchDTO inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<SubjectVisit> _subjectVisitRepository,
|
||
[FromServices] IRepository<Trial> _trialRepository
|
||
)
|
||
{
|
||
var svExpression = QCCommon.GetSubjectVisitFilter(inQuery.VisitPlanArray);
|
||
var query = _subjectVisitRepository.Where(x => x.TrialId == inQuery.TrialId)
|
||
.WhereIf(inQuery.VisitId != null, t => t.Id == inQuery.VisitId)
|
||
.WhereIf(inQuery.CurrentActionUserId != null, t => t.CurrentActionUserId == inQuery.CurrentActionUserId)
|
||
.WhereIf(inQuery.ChallengeState != null, t => t.ChallengeState == inQuery.ChallengeState)
|
||
.WhereIf(inQuery.TrialSiteId != null, t => t.TrialSiteId == inQuery.TrialSiteId)
|
||
.WhereIf(inQuery.SubjectId != null, t => t.Subject.Id == inQuery.SubjectId)
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectInfo), t => /*t.Subject.FirstName.Contains(subjectInfo) || t.Subject.LastName.Contains(subjectInfo) ||*/ t.Subject.Code.Contains(inQuery.SubjectInfo))
|
||
.WhereIf(inQuery.VisitPlanArray != null && inQuery.VisitPlanArray?.Length > 0, svExpression)
|
||
//.WhereIf(!string.IsNullOrEmpty(visitSearchDTO.VisitPlanInfo), visitSearchDTO.VisitPlanInfo.Contains('.') ? t => t.VisitNum.ToString().Contains(".") : t => t.VisitNum == decimal.Parse(visitSearchDTO.VisitPlanInfo))
|
||
//.WhereIf(visitSearchDTO.AuditState != null, t => t.AuditState == visitSearchDTO.AuditState)
|
||
.WhereIf(inQuery.AuditStateArray != null && inQuery.AuditStateArray?.Length > 0, t => inQuery.AuditStateArray!.Contains(t.AuditState))
|
||
|
||
.WhereIf(inQuery.HandleUserId != null, t => t.PreliminaryAuditUserId == inQuery.HandleUserId || t.CurrentActionUserId == inQuery.HandleUserId
|
||
|| t.ReviewAuditUserId == inQuery.HandleUserId
|
||
|| t.QCChallengeList.Any(t => t.CreateUserId == inQuery.HandleUserId)
|
||
|| t.QCChallengeDialogList.Any(t => t.CreateUserId == inQuery.HandleUserId))
|
||
.WhereIf(inQuery.IsUrgent != null, t => t.IsUrgent == inQuery.IsUrgent)
|
||
.Where(t => t.SubmitState != SubmitStateEnum.None)
|
||
.WhereIf(inQuery.BeginAuditTime != null, t => t.Trial.QCProcessEnum == TrialQCProcess.SingleAudit ? t.PreliminaryAuditTime >= inQuery.BeginAuditTime :
|
||
(t.Trial.QCProcessEnum == TrialQCProcess.DoubleAudit ? t.ReviewAuditTime >= inQuery.BeginAuditTime : true))
|
||
|
||
.WhereIf(inQuery.EndAuditTime != null, t => t.Trial.QCProcessEnum == TrialQCProcess.SingleAudit ? t.PreliminaryAuditTime <= inQuery.EndAuditTime :
|
||
(t.Trial.QCProcessEnum == TrialQCProcess.DoubleAudit ? t.ReviewAuditTime <= inQuery.EndAuditTime : true))
|
||
|
||
.ProjectTo<QCVisitExportDTO>(_mapper.ConfigurationProvider);
|
||
|
||
|
||
var list = query.ToList();
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialQCVisitImageList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CRCVisitExportDTO));
|
||
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 质疑列表
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[AllowAnonymous]
|
||
public async Task<IActionResult> GetQCChallengeList_Export(ChallengeQuery inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository
|
||
)
|
||
|
||
{
|
||
var svExpression = QCCommon.GetQCChallengeFilter(inQuery.VisitPlanArray);
|
||
|
||
var query = _qcChallengeRepository.Where(x => x.TrialId == inQuery.TrialId)
|
||
//.WhereIf(challengeQuery.ChallengeState != null, t => t.SubjectVisit.ChallengeState == challengeQuery.ChallengeState)
|
||
.WhereIf(inQuery.ReuploadEnum != null, t => t.ReuploadEnum == inQuery.ReuploadEnum)
|
||
.WhereIf(inQuery.IsClosed != null, t => t.IsClosed == inQuery.IsClosed)
|
||
.WhereIf(inQuery.TrialSiteId != null, t => t.SubjectVisit.TrialSiteId == inQuery.TrialSiteId)
|
||
.WhereIf(inQuery.SubjectId != null, t => t.SubjectVisit.SubjectId == inQuery.SubjectId)
|
||
.WhereIf(inQuery.CreateUserId != null, t => t.CreateUserId == inQuery.CreateUserId)
|
||
.WhereIf(inQuery.SubjectCode != null, t => t.SubjectVisit.Subject.Code.Contains(inQuery.SubjectCode!))
|
||
.WhereIf(inQuery.VisitPlanArray != null && inQuery.VisitPlanArray?.Length > 0, svExpression)
|
||
//.WhereIf(!string.IsNullOrEmpty(challengeQuery.VisitPlanInfo), challengeQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(challengeQuery.VisitPlanInfo))
|
||
.WhereIf(inQuery.IsOverTime != null && inQuery.IsOverTime == true, t => t.IsClosed ? t.ClosedTime > t.DeadlineTime : DateTime.Now > t.DeadlineTime)
|
||
.WhereIf(inQuery.IsOverTime != null && inQuery.IsOverTime == false, t => t.IsClosed ? t.ClosedTime < t.DeadlineTime : DateTime.Now < t.DeadlineTime)
|
||
.WhereIf(inQuery.IsUrgent != null, t => t.SubjectVisit.IsUrgent == inQuery.IsUrgent)
|
||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.SubjectVisit.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.UserRoleId))
|
||
|
||
.ProjectTo<QCChanllengeExportDto>(_mapper.ConfigurationProvider);
|
||
|
||
var list = query.OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.ChallengeCode).ToList();
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialQCImageChanllengeList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(QCChanllengeExportDto));
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 受试者信息导出表
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_subjectRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetSubjectList_Export(SubjectQueryParam inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IRepository<Subject> _subjectRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository)
|
||
{
|
||
|
||
var subjectQuery = _subjectRepository.Where(u => u.TrialId == inQuery.TrialId)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.Code), t => t.Code.Contains(inQuery.Code))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.Name), t => t.ShortName.Contains(inQuery.Name))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.Sex), t => t.Sex.Contains(inQuery.Sex))
|
||
.WhereIf(inQuery.Status != null, t => t.Status == inQuery.Status)
|
||
|
||
.WhereIf(inQuery.TrialSiteId != null, t => t.TrialSiteId == inQuery.TrialSiteId)
|
||
// CRC 只负责他管理site的受试者
|
||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.UserRoleId))
|
||
.ProjectTo<SubjectExportDTO>(_mapper.ConfigurationProvider)
|
||
.WhereIf(inQuery.IsMissingImages == true, t => t.MissingSubmmitCount > 0)
|
||
.WhereIf(inQuery.IsMissingImages == false, t => t.MissingSubmmitCount == 0)
|
||
;
|
||
|
||
|
||
var list = subjectQuery.OrderBy(t => t.TrialSiteCode).ThenBy(t => t.Code).ToList();
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectExportDTO));
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// Subject 进展表 --new
|
||
/// </summary>
|
||
/// <param name="dto"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetSubjectProgress_Export(SubjectProgressQuery dto,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository)
|
||
{
|
||
|
||
|
||
var query = from subject in _subjectRepository.Where(u => u.TrialId == dto.TrialId)
|
||
join trialReadingCriterion in _readingQuestionCriterionTrialRepository.Where(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId) on subject.TrialId equals trialReadingCriterion.TrialId
|
||
|
||
select new SubjectProgressDto()
|
||
{
|
||
TrialSiteCode = subject.TrialSite.TrialSiteCode,
|
||
SubjectCode = subject.Code,
|
||
SubjectStatus = subject.Status,
|
||
|
||
|
||
VisitList = subject.SubjectVisitList.Where(t => t.VisitExecuted != VisitExecutedEnum.Unavailable).Select(t => new SubjectProgressDto.MouduleProgress()
|
||
{
|
||
TaskName = t.VisitName,
|
||
VisitTaskNum = t.VisitNum,
|
||
Inplan = t.InPlan,
|
||
IsFinalVisit = t.IsFinalVisit,
|
||
IsLostVisit = t.IsLostVisit,
|
||
ReadingStatus =
|
||
t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId == dto.TrialReadingCriterionId && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == (int)trialReadingCriterion.ReadingType ?
|
||
ReadingStatusEnum.ReadCompleted : t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId == dto.TrialReadingCriterionId && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.TaskAllocationState == TaskAllocationState.Allocated).Count() == (int)trialReadingCriterion.ReadingType ? ReadingStatusEnum.ImageReading :
|
||
t.ReadingStatus
|
||
}).ToList(),
|
||
|
||
ModuleList = subject.ReadModuleList.Where(t => t.TrialReadingCriterionId == dto.TrialReadingCriterionId).Select(t => new SubjectProgressDto.MouduleProgress()
|
||
{
|
||
TaskName = t.ModuleName,
|
||
VisitTaskNum = (t.ReadingSetType == ReadingSetType.ImageReading ? ReadingCommon.TaskNumDic[ReadingCategory.Global] : ReadingCommon.TaskNumDic[ReadingCategory.Oncology]) + t.SubjectVisit.VisitNum,
|
||
ReadingSetType = t.ReadingSetType,
|
||
ReadingStatus = t.ModuleTaskList.Where(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && (t.ReadingCategory == ReadingCategory.Oncology || t.ReadingCategory == ReadingCategory.Global) && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == (int)trialReadingCriterion.ReadingType ?
|
||
ReadingStatusEnum.ReadCompleted : t.ModuleTaskList.Where(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && (t.ReadingCategory == ReadingCategory.Oncology || t.ReadingCategory == ReadingCategory.Global) && t.TaskAllocationState == TaskAllocationState.Allocated).Count() == (int)trialReadingCriterion.ReadingType ?
|
||
ReadingStatusEnum.ImageReading : t.ReadingStatus
|
||
}).ToList()
|
||
|
||
|
||
}
|
||
;
|
||
|
||
|
||
var list = query.ToList();
|
||
//.ProjectTo<SubjectProgressDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||
|
||
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == dto.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.CriterionName = await _readingQuestionCriterionTrialRepository.Where(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.TrialSubjectProgressList_Export, exportInfo, /*"", */_commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectProgressDto));
|
||
|
||
|
||
// 使用NPOI 进行二次处理
|
||
|
||
var wb = new XSSFWorkbook(memoryStream);
|
||
|
||
var sheet = wb.GetSheetAt(0);
|
||
|
||
foreach (var subject in list)
|
||
{
|
||
var index = list.IndexOf(subject);
|
||
var row = sheet.GetRow(index + 4);
|
||
|
||
|
||
foreach (var item in subject.TotalList)
|
||
{
|
||
//从第五列开始动态写
|
||
var visitIndex = subject.TotalList.IndexOf(item) + 4;
|
||
|
||
var cell = row.CreateCell(visitIndex);
|
||
|
||
if (item.IsLostVisit == true)
|
||
{
|
||
cell.CellStyle = sheet.GetRow(1).GetCell(7).CellStyle;
|
||
}
|
||
else
|
||
{
|
||
switch (item.ReadingStatus)
|
||
{
|
||
case ReadingStatusEnum.ImageNotSubmit:
|
||
|
||
cell.CellStyle = sheet.GetRow(1).GetCell(1).CellStyle;
|
||
|
||
break;
|
||
case ReadingStatusEnum.ImageQuality:
|
||
cell.CellStyle = sheet.GetRow(1).GetCell(2).CellStyle;
|
||
break;
|
||
case ReadingStatusEnum.ConsistencyCheck:
|
||
cell.CellStyle = sheet.GetRow(1).GetCell(3).CellStyle;
|
||
break;
|
||
case ReadingStatusEnum.TaskAllocate:
|
||
cell.CellStyle = sheet.GetRow(1).GetCell(4).CellStyle;
|
||
break;
|
||
case ReadingStatusEnum.ImageReading:
|
||
cell.CellStyle = sheet.GetRow(1).GetCell(5).CellStyle;
|
||
break;
|
||
case ReadingStatusEnum.ReadCompleted:
|
||
cell.CellStyle = sheet.GetRow(1).GetCell(6).CellStyle;
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
cell.SetCellValue(item.TaskName);
|
||
}
|
||
}
|
||
|
||
var memoryStream2 = new MemoryStream();
|
||
wb.Write(memoryStream2, true);
|
||
memoryStream2.Seek(0, SeekOrigin.Begin);
|
||
|
||
return new FileStreamResult(memoryStream2, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||
{
|
||
FileDownloadName = $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}_{fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"
|
||
};
|
||
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 影像上传监控表
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetStudyUploadMonitor_Export(StudyQuery inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository)
|
||
{
|
||
|
||
var svExpression = QCCommon.GetStudyMonitorSubjectVisitFilter(inQuery.VisitPlanArray);
|
||
var StudyMonitorQuery = _studyMonitorRepository.Where(t => t.TrialId == inQuery.TrialId, ignoreQueryFilters: true)
|
||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.Subject.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.UserRoleId))
|
||
//.WhereIf(!string.IsNullOrEmpty(studyQuery.VisitPlanInfo), studyQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(studyQuery.VisitPlanInfo))
|
||
.WhereIf(inQuery.VisitPlanArray != null && inQuery.VisitPlanArray?.Length > 0, svExpression)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectInfo), t => t.Subject.Code.Contains(inQuery.SubjectInfo))
|
||
.WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId)
|
||
.WhereIf(inQuery.SubjectVisitId != null, t => t.SubjectId == inQuery.SubjectVisitId)
|
||
.WhereIf(inQuery.TrialSiteId != null, t => t.Subject.TrialSiteId == inQuery.TrialSiteId)
|
||
.WhereIf(inQuery.IsDicom != null, t => t.IsDicom == inQuery.IsDicom)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.Uploader), t => t.CreateUserRole.UserName.Contains(inQuery.Uploader))
|
||
.WhereIf(inQuery.IsSuccess != null, t => t.IsSuccess == inQuery.IsSuccess)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(inQuery.StudyCode), t => t.StudyCode.Contains(inQuery.StudyCode))
|
||
.Select(t => new UnionStudyMonitorExportDto()
|
||
{
|
||
TrialSiteCode = t.Subject.TrialSite.TrialSiteCode,
|
||
TrialSiteAliasName = t.Subject.TrialSite.TrialSiteAliasName,
|
||
|
||
SubjectCode = t.Subject.Code,
|
||
|
||
|
||
VisitName = t.SubjectVisit.VisitName,
|
||
|
||
StudyCode = t.StudyCode,
|
||
|
||
IsDicom = t.IsDicom,
|
||
|
||
Uploader = t.CreateUserRole.UserName,
|
||
|
||
IP = t.IP,
|
||
|
||
UploadStartTime = t.UploadStartTime,
|
||
|
||
UploadFinishedTime = t.UploadFinishedTime,
|
||
|
||
ArchiveFinishedTime = t.ArchiveFinishedTime,
|
||
|
||
|
||
UploadTime = t.CreateTime,
|
||
|
||
FileCount = t.FileCount,
|
||
FileSize = t.FileSize,
|
||
|
||
IsDicomReUpload = t.IsDicomReUpload,
|
||
|
||
IsSuccess = t.IsSuccess,
|
||
Note = t.Note,
|
||
});
|
||
|
||
var list = await StudyMonitorQuery.ToListAsync();
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialStudyUploadMonitor_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(UnionStudyMonitorExportDto));
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 阅片期信息表
|
||
/// </summary>
|
||
/// <param name="param"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetReadingPeriodList_Export(ReadPeriodQuery param,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository)
|
||
{
|
||
|
||
var list = await _readModuleRepository.Where(u => u.TrialId == param.TrialId)
|
||
|
||
.ProjectTo<ReadPeriodExportDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||
|
||
list = list.OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ToList();
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == param.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectReadingPeriodList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReadPeriodExportDto));
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 一致性核查 检查信息表
|
||
/// </summary>
|
||
/// <param name="studyQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetDicomAndNoneDicomStudyList_Export(StudyQuery studyQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository)
|
||
{
|
||
|
||
var svExpression = QCCommon.GetDicomStudySubjectVisitFilter(studyQuery.VisitPlanArray);
|
||
|
||
var dicomStudyQuery = _dicomStudyRepository.Where(t => t.TrialId == studyQuery.TrialId)
|
||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.Subject.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.UserRoleId))
|
||
.WhereIf(studyQuery.VisitPlanArray != null && studyQuery.VisitPlanArray?.Length > 0, svExpression)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(studyQuery.SubjectInfo), t => t.Subject.Code.Contains(studyQuery.SubjectInfo))
|
||
.Where(x => x.SubjectVisit.AuditState == AuditStateEnum.QCPassed)
|
||
.Select(t => new UnionStudyExportDTO()
|
||
{
|
||
VisitName = t.SubjectVisit.VisitName,
|
||
VisitNum = t.SubjectVisit.VisitNum,
|
||
IsDicom = true,
|
||
SubjectCode = t.Subject.Code,
|
||
Modality = t.Modalities,
|
||
StudyCode = t.StudyCode,
|
||
StudyTime = t.StudyTime,
|
||
|
||
TrialSiteAliasName = t.Subject.TrialSite.TrialSiteAliasName,
|
||
|
||
TrialSiteCode = t.Subject.TrialSite.TrialSiteCode,
|
||
|
||
CheckState = t.SubjectVisit.CheckState,
|
||
//Uploader = t.Uploader.UserName,
|
||
//UploadTime = t.CreateTime
|
||
|
||
});
|
||
|
||
var svExpression2 = QCCommon.GetNoneDicomStudySubjectVisitFilter(studyQuery.VisitPlanArray);
|
||
|
||
|
||
var nodeDicomStudyQuery = _noneDicomStudyRepository.Where(t => t.TrialId == studyQuery.TrialId)
|
||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.Subject.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.UserRoleId))
|
||
.WhereIf(studyQuery.VisitPlanArray != null && studyQuery.VisitPlanArray?.Length > 0, svExpression2)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(studyQuery.SubjectInfo), t => t.Subject.Code.Contains(studyQuery.SubjectInfo))
|
||
.Where(x => x.SubjectVisit.AuditState == AuditStateEnum.QCPassed)
|
||
.Select(t => new UnionStudyExportDTO()
|
||
{
|
||
|
||
VisitName = t.SubjectVisit.VisitName,
|
||
VisitNum = t.SubjectVisit.VisitNum,
|
||
IsDicom = false,
|
||
SubjectCode = t.Subject.Code,
|
||
Modality = t.Modality,
|
||
StudyCode = t.StudyCode,
|
||
StudyTime = t.ImageDate,
|
||
|
||
TrialSiteAliasName = t.Subject.TrialSite.TrialSiteAliasName,
|
||
|
||
TrialSiteCode = t.Subject.TrialSite.TrialSiteCode,
|
||
|
||
CheckState = t.SubjectVisit.CheckState,
|
||
|
||
//Uploader = t.CreateUser.UserName,
|
||
//UploadTime = t.CreateTime
|
||
|
||
});
|
||
|
||
|
||
|
||
var list = await dicomStudyQuery.Union(nodeDicomStudyQuery)
|
||
.ToListAsync();
|
||
|
||
list = list.OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.VisitNum).ToList();
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == studyQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialStudyList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(UnionStudyExportDTO));
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 一致性核查记录表
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <param name="_subjectVisitRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetConsistencyVerificationList_Export(CheckQuery inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository,
|
||
[FromServices] IRepository<SubjectVisit> _subjectVisitRepository)
|
||
{
|
||
|
||
var svExpression = QCCommon.GetSubjectVisitFilter(inQuery.VisitPlanArray);
|
||
|
||
var query = _subjectVisitRepository.Where(x => x.TrialId == inQuery.TrialId)
|
||
.Where(x => x.AuditState == AuditStateEnum.QCPassed) //一致性核查中的,或者还没一致性核查的
|
||
.WhereIf(inQuery.CheckState != null, t => t.CheckState == inQuery.CheckState)
|
||
.WhereIf(inQuery.TrialSiteId != null, t => t.TrialSiteId == inQuery.TrialSiteId)
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectInfo), t => t.Subject.Code.Contains(inQuery.SubjectInfo))
|
||
.WhereIf(inQuery.VisitPlanArray != null && inQuery.VisitPlanArray?.Length > 0, svExpression)
|
||
//.WhereIf(!string.IsNullOrEmpty(checkQuery.VisitPlanInfo), checkQuery.VisitPlanInfo.Contains('.') ? t => t.InPlan == false : t => t.VisitNum == decimal.Parse(checkQuery.VisitPlanInfo))
|
||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.UserRoleId))//CRC 过滤负责的site
|
||
.ProjectTo<PMKCheckEXportDTO>(_mapper.ConfigurationProvider);
|
||
|
||
var list = query.OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.VisitNum).ToList();
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectVisitCheckList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(PMKCheckEXportDTO));
|
||
}
|
||
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// PM阅片跟踪
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetReadingTaskList_Export(VisitTaskQuery inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository)
|
||
{
|
||
var list = await _visitTaskRepository.Where(t => t.TrialId == inQuery.TrialId && t.IsAnalysisCreate == false)
|
||
//.Where(t => t.IsAnalysisCreate == false && t.DoctorUserId != null)
|
||
|
||
.WhereIf(inQuery.TaskState != null, t => t.TaskState == inQuery.TaskState)
|
||
.WhereIf(inQuery.ArmEnum != null, t => t.ArmEnum == inQuery.ArmEnum)
|
||
.WhereIf(inQuery.TrialSiteId != null, t => t.Subject.TrialSiteId == inQuery.TrialSiteId)
|
||
.WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId)
|
||
.WhereIf(inQuery.IsUrgent != null, t => t.IsUrgent == inQuery.IsUrgent)
|
||
.WhereIf(inQuery.DoctorUserId != null, t => t.DoctorUserId == inQuery.DoctorUserId)
|
||
.WhereIf(inQuery.ReadingCategory != null, t => t.ReadingCategory == inQuery.ReadingCategory)
|
||
.WhereIf(inQuery.ReadingTaskState != null, t => t.ReadingTaskState == inQuery.ReadingTaskState)
|
||
.WhereIf(inQuery.TaskAllocationState != null, t => t.TaskAllocationState == inQuery.TaskAllocationState)
|
||
.WhereIf(inQuery.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
|
||
|
||
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.IsAnalysisCreate == false))
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.TaskName.Contains(inQuery.TaskName) || t.TaskBlindName.Contains(inQuery.TaskName))
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => t.Subject.Code.Contains(inQuery.SubjectCode) || t.BlindSubjectCode.Contains(inQuery.SubjectCode))
|
||
.WhereIf(inQuery.BeginAllocateDate != null, t => t.AllocateTime > inQuery.BeginAllocateDate)
|
||
.WhereIf(inQuery.EndAllocateDate != null, t => t.AllocateTime < inQuery.EndAllocateDate!.Value.AddDays(1))
|
||
.ProjectTo<ReadingTaskExportDto>(_mapper.ConfigurationProvider).ToListAsync();
|
||
|
||
//var defalutSortArray = new string[] { nameof(VisitTask.IsUrgent) + " desc", nameof(VisitTask.SubjectId), nameof(VisitTask.VisitTaskNum) };
|
||
|
||
list = list.OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.VisitTaskNum).ToList();
|
||
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialReadingTaskList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReadingTaskExportDto));
|
||
}
|
||
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// PM 重阅追踪
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_visitTaskReReadingRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetReReadingTaskList_Export(VisitTaskQuery inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IRepository<VisitTaskReReading> _visitTaskReReadingRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository)
|
||
{
|
||
|
||
|
||
var visitTaskQueryable = _visitTaskReReadingRepository
|
||
.Where(t => t.OriginalReReadingTask.TrialId == inQuery.TrialId /*&& t.OriginalReReadingTask.IsAnalysisCreate == false*/)
|
||
.WhereIf(inQuery.RootReReadingTaskId != null, t => t.RootReReadingTaskId == inQuery.RootReReadingTaskId || t.OriginalReReadingTaskId == inQuery.RootReReadingTaskId)
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.TaskCode), t => t.OriginalReReadingTask.TaskCode.Contains(inQuery.TaskCode!) || t.RootReReadingTask.TaskCode.Contains(inQuery.TaskCode!))
|
||
.WhereIf(inQuery.TrialSiteId != null, t => t.OriginalReReadingTask.Subject.TrialSiteId == inQuery.TrialSiteId)
|
||
.WhereIf(inQuery.TaskState != null, t => t.OriginalReReadingTask.TaskState == inQuery.TaskState)
|
||
.WhereIf(inQuery.ReReadingApplyState != null, t => t.OriginalReReadingTask.ReReadingApplyState == inQuery.ReReadingApplyState)
|
||
.WhereIf(inQuery.RequestReReadingType != null, t => t.RequestReReadingType == inQuery.RequestReReadingType)
|
||
.WhereIf(inQuery.SubjectId != null, t => t.OriginalReReadingTask.SubjectId == inQuery.SubjectId)
|
||
.WhereIf(inQuery.IsUrgent != null, t => t.OriginalReReadingTask.IsUrgent == inQuery.IsUrgent)
|
||
.WhereIf(inQuery.DoctorUserId != null, t => t.OriginalReReadingTask.DoctorUserId == inQuery.DoctorUserId)
|
||
.WhereIf(inQuery.ArmEnum != null, t => t.OriginalReReadingTask.ArmEnum == inQuery.ArmEnum)
|
||
.WhereIf(inQuery.ReadingTaskState != null, t => t.OriginalReReadingTask.ReadingTaskState == inQuery.ReadingTaskState)
|
||
.WhereIf(inQuery.TaskAllocationState != null, t => t.OriginalReReadingTask.TaskAllocationState == inQuery.TaskAllocationState)
|
||
.WhereIf(inQuery.TrialReadingCriterionId != null, t => t.OriginalReReadingTask.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
|
||
.WhereIf(inQuery.ReadingCategory != null, t => t.OriginalReReadingTask.ReadingCategory == inQuery.ReadingCategory)
|
||
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.RequestReReadingReason), t => t.RequestReReadingReason.Contains(inQuery.RequestReReadingReason))
|
||
|
||
.WhereIf(inQuery.RequestReReadingResultEnum != null, t => t.RequestReReadingResultEnum == inQuery.RequestReReadingResultEnum)
|
||
|
||
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.TrialSiteCode), t => (t.OriginalReReadingTask.BlindTrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate) || (t.OriginalReReadingTask.Subject.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate == false))
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.OriginalReReadingTask.TaskName.Contains(inQuery.TaskName) || t.OriginalReReadingTask.TaskBlindName.Contains(inQuery.TaskName))
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => ((t.OriginalReReadingTask.Subject.Code.Contains(inQuery.SubjectCode) || t.OriginalReReadingTask.Subject.MedicalNo.Contains(inQuery.SubjectCode)) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(inQuery.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate))
|
||
.WhereIf(inQuery.BeginAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime > inQuery.BeginAllocateDate)
|
||
.WhereIf(inQuery.EndAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime < inQuery.EndAllocateDate!.Value.AddDays(1))
|
||
|
||
.WhereIf(inQuery.BeginRequestReReadingTime != null, t => t.RequestReReadingTime >= inQuery.BeginRequestReReadingTime)
|
||
.WhereIf(inQuery.EndRequestReReadingTime != null, t => t.RequestReReadingTime <= inQuery.EndRequestReReadingTime!.Value.AddDays(1))
|
||
.ProjectTo<ReReadingTaskExportDto>(_mapper.ConfigurationProvider);
|
||
|
||
//var defalutSortArray = new string[] { nameof(ReReadingTaskView.OriginalReReadingTask) + "." + nameof(ReReadingTaskView.OriginalReReadingTask.IsUrgent) + " desc", nameof(ReReadingTaskView.OriginalReReadingTask) + "." + nameof(ReReadingTaskView.OriginalReReadingTask.SubjectId), nameof(ReReadingTaskView.OriginalReReadingTask) + "." + nameof(ReReadingTaskView.OriginalReReadingTask.VisitTaskNum) };
|
||
|
||
var list = visitTaskQueryable.OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.VisitTaskNum).ToList();
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialReReadingTaskList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(ReReadingTaskExportDto));
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// PM 医学审核(挑选任务生成后的列表)
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_taskMedicalReviewRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetMedicalReviewTaskList_Export(TaskMedicalReviewQuery inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IRepository<TaskMedicalReview> _taskMedicalReviewRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository)
|
||
{
|
||
|
||
var taskMedicalReviewQueryable = _taskMedicalReviewRepository.Where(t => t.VisitTask.TrialId == inQuery.TrialId)
|
||
|
||
.WhereIf(inQuery.TrialSiteId != null, t => t.VisitTask.Subject.TrialSiteId == inQuery.TrialSiteId)
|
||
.WhereIf(inQuery.SubjectId != null, t => t.VisitTask.SubjectId == inQuery.SubjectId)
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => t.VisitTask.Subject.Code.Contains(inQuery.SubjectCode) || t.VisitTask.Subject.MedicalNo.Contains(inQuery.SubjectCode))
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.VisitTask.TaskName.Contains(inQuery.TaskName) || t.VisitTask.TaskBlindName.Contains(inQuery.TaskName))
|
||
.WhereIf(inQuery.IsUrgent != null, t => t.VisitTask.IsUrgent == inQuery.IsUrgent)
|
||
.WhereIf(inQuery.DoctorUserId != null, t => t.VisitTask.DoctorUserId == inQuery.DoctorUserId)
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.TrialSiteCode), t => (t.VisitTask.BlindTrialSiteCode.Contains(inQuery.TrialSiteCode) && t.VisitTask.IsAnalysisCreate) || (t.VisitTask.Subject.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode) && t.VisitTask.IsAnalysisCreate == false))
|
||
.WhereIf(inQuery.ReadingCategory != null, t => t.VisitTask.ReadingCategory == inQuery.ReadingCategory)
|
||
.WhereIf(inQuery.TaskState != null, t => t.VisitTask.TaskState == inQuery.TaskState)
|
||
.WhereIf(inQuery.ArmEnum != null, t => t.VisitTask.ArmEnum == inQuery.ArmEnum)
|
||
.WhereIf(inQuery.AuditState != null, t => t.AuditState == inQuery.AuditState)
|
||
.WhereIf(inQuery.MedicalManagerUserId != null, t => t.MedicalManagerUserId == inQuery.MedicalManagerUserId)
|
||
.WhereIf(inQuery.BeginSignTime != null, t => t.VisitTask.SignTime > inQuery.BeginSignTime)
|
||
.WhereIf(inQuery.EndSignTime != null, t => t.VisitTask.SignTime < inQuery.EndSignTime)
|
||
.WhereIf(inQuery.AuditAdviceEnum != null, t => t.AuditAdviceEnum == inQuery.AuditAdviceEnum)
|
||
|
||
.WhereIf(inQuery.DoctorUserIdeaEnum != null, t => t.DoctorUserIdeaEnum == inQuery.DoctorUserIdeaEnum)
|
||
.WhereIf(inQuery.TrialReadingCriterionId != null, t => t.VisitTask.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
|
||
.WhereIf(inQuery.IsInvalid != null, t => t.IsInvalid == inQuery.IsInvalid)
|
||
.WhereIf(inQuery.IsHaveQuestion != null, t => t.IsHaveQuestion == inQuery.IsHaveQuestion)
|
||
|
||
.WhereIf(inQuery.BeginAllocateDate != null, t => t.AllocateTime >= inQuery.BeginAllocateDate)
|
||
.WhereIf(inQuery.EndAllocateDate != null, t => t.AllocateTime <= inQuery.EndAllocateDate)
|
||
.WhereIf(inQuery.BeginAuditSignTime != null, t => t.AuditSignTime >= inQuery.BeginAuditSignTime)
|
||
.WhereIf(inQuery.EndAuditSignTime != null, t => t.AuditSignTime <= inQuery.EndAuditSignTime)
|
||
.ProjectTo<TaskMedicalReviewExportDto>(_mapper.ConfigurationProvider);
|
||
|
||
var list = taskMedicalReviewQueryable.OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.VisitTaskNum).ToList();
|
||
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialMedicalReviewList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TaskMedicalReviewExportDto));
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 影像下载记录表
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_trialImageDownloadRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetTrialDownloadList_Export(TrialIamgeDownQuery inQuery,
|
||
[FromServices] IRepository<TrialImageDownload> _trialImageDownloadRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository)
|
||
{
|
||
var query = _trialImageDownloadRepository.Where(t => t.TrialId == inQuery.TrialId)
|
||
.WhereIf(inQuery.SubjectCode.IsNotNullOrEmpty(), t => t.SubjectCode.Contains(inQuery.SubjectCode))
|
||
.WhereIf(inQuery.IP.IsNotNullOrEmpty(), t => t.IP.Contains(inQuery.IP))
|
||
.WhereIf(inQuery.Name.IsNotNullOrEmpty(), t => t.CreateUserRole.UserName.Contains(inQuery.Name) || t.CreateUserRole.FullName.Contains(inQuery.Name))
|
||
.WhereIf(inQuery.ImageType != null, t => t.ImageType == inQuery.ImageType)
|
||
.WhereIf(inQuery.UserType != null, t => t.CreateUserRole.UserTypeEnum == inQuery.UserType)
|
||
.WhereIf(inQuery.IsSuccess != null, t => t.IsSuccess == inQuery.IsSuccess)
|
||
.WhereIf(inQuery.DownloadStartTime != null, t => t.DownloadStartTime >= inQuery.DownloadStartTime)
|
||
.WhereIf(inQuery.DownloadEndTime != null, t => t.DownloadEndTime <= inQuery.DownloadEndTime)
|
||
|
||
.ProjectTo<TrialImageDownloadExportDto>(_mapper.ConfigurationProvider);
|
||
|
||
var list = await query.SortToListAsync(inQuery);
|
||
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialImageDownloadList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(TrialImageDownloadExportDto));
|
||
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 国际化导出
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetInternationalizationList_Export(InternationalizationQuery inQuery,
|
||
[FromServices] IRepository<Internationalization> _internationalizationRepository,
|
||
[FromServices] IDictionaryService _dictionaryService)
|
||
{
|
||
|
||
var internationalizationQueryable = _internationalizationRepository
|
||
.WhereIf(inQuery.Description != null, t => t.Description.Contains(inQuery.Description))
|
||
.WhereIf(inQuery.Module != null, t => t.Module.Contains(inQuery.Module))
|
||
.WhereIf(inQuery.PublishLogId != null, t => t.PublishLogId == inQuery.PublishLogId)
|
||
.WhereIf(inQuery.Code != null, t => t.Code.Contains(inQuery.Code))
|
||
.WhereIf(inQuery.State != null, t => t.State == inQuery.State)
|
||
.WhereIf(inQuery.InternationalizationType != null, t => t.InternationalizationType == inQuery.InternationalizationType)
|
||
.WhereIf(inQuery.Value != null, t => t.Value.Contains(inQuery.Value))
|
||
.WhereIf(inQuery.ValueCN != null, t => t.ValueCN.Contains(inQuery.ValueCN))
|
||
.WhereIf(inQuery.BeginCreateTime != null, t => t.CreateTime >= inQuery.BeginCreateTime)
|
||
.WhereIf(inQuery.EndCreatTime != null, t => t.CreateTime <= inQuery.EndCreatTime)
|
||
.WhereIf(inQuery.BeginUpdateTime != null, t => t.UpdateTime >= inQuery.BeginUpdateTime)
|
||
.WhereIf(inQuery.EndUpdateTime != null, t => t.UpdateTime <= inQuery.EndUpdateTime)
|
||
.ProjectTo<InternationExportDTO>(_mapper.ConfigurationProvider);
|
||
|
||
var list = await internationalizationQueryable.SortToListAsync(inQuery);
|
||
|
||
var exportInfo = new ExcelExportInfo();
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.Internationalization_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(InternationExportDTO));
|
||
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 邮件导出
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_emailNoticeConfigrepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetEmailNoticeConfigList_Export(EmailNoticeConfigQuery inQuery,
|
||
[FromServices] IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
|
||
[FromServices] IDictionaryService _dictionaryService)
|
||
{
|
||
var emailNoticeConfigQueryable = _emailNoticeConfigrepository
|
||
//.WhereIf(inQuery.SystemLevel == null, t => t.SystemLevel == SysEmailLevel.not_sys)
|
||
.WhereIf(inQuery.SystemLevel != null, t => t.SystemLevel == inQuery.SystemLevel)
|
||
.WhereIf(inQuery.IsDistinguishCriteria != null, t => t.IsDistinguishCriteria == inQuery.IsDistinguishCriteria)
|
||
.WhereIf(inQuery.CriterionTypeEnum != null, t => t.CriterionTypeList.Any(c => c == inQuery.CriterionTypeEnum))
|
||
.WhereIf(inQuery.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == inQuery.BusinessScenarioEnum)
|
||
.WhereIf(inQuery.IsReturnRequired != null, t => t.IsReturnRequired == inQuery.IsReturnRequired)
|
||
.WhereIf(inQuery.IsEnable != null, t => t.IsEnable == inQuery.IsEnable)
|
||
.ProjectTo<EmailNoticeConfigExportDto>(_mapper.ConfigurationProvider);
|
||
|
||
var list = await emailNoticeConfigQueryable.SortToListAsync(inQuery);
|
||
|
||
var exportInfo = new ExcelExportInfo();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId);
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.EmailNoticeConfig_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(EmailNoticeConfigExportDto));
|
||
|
||
}
|
||
|
||
|
||
#region 导表公用
|
||
|
||
public class ExportDocumentDes
|
||
{
|
||
public string Code { get; set; }
|
||
|
||
public string FileName { get; set; }
|
||
|
||
public ExportResult ExportCatogory { get; set; }
|
||
}
|
||
|
||
|
||
public enum ExportCatogory
|
||
{
|
||
//// 整体肿瘤评估
|
||
//OverallTumorEvaluation = 1,
|
||
|
||
////肿瘤疗效评估
|
||
//EvaluationOfTumorEfficacy = 2,
|
||
|
||
////评估病灶明细
|
||
//DetailedOfEvaluatedLesion = 3,
|
||
|
||
//阅片结果
|
||
CommonReading_Export = 1,
|
||
|
||
//阅片结果明细
|
||
CommonReadingDetail_Export = 2,
|
||
|
||
//评估病灶明细
|
||
DetailedOfEvaluatedLesion = 3,
|
||
|
||
//裁判阅片明细
|
||
CommonJudgeReadingDetail_Export = 4,
|
||
|
||
//访视一致率
|
||
VisitJudgeRatio_Export = 5,
|
||
|
||
//阅片期一致率
|
||
ReadingPeriodJudgeRatio_Export = 6,
|
||
|
||
}
|
||
|
||
|
||
public List<T> DealOncologyResult<T>(IRepository<ReadingOncologyTaskInfo> _oncologyRepository, bool isOncology, List<T> list) where T : CommonEvaluationExport
|
||
{
|
||
if (isOncology)
|
||
{
|
||
|
||
var subjectIdList = list.Select(t => t.SubjectId).Distinct().ToList();
|
||
|
||
//已阅片完的肿瘤学结果
|
||
var oncologyResultList = _oncologyRepository.Where(t => subjectIdList.Contains(t.OncologyVisitTask.SubjectId)
|
||
&& t.OncologyVisitTask.IsAnalysisCreate == false && t.OncologyVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned && t.OncologyVisitTask.TaskState == TaskState.Effect)
|
||
|
||
.Select(t => new { t.OncologyVisitTask.SubjectId, OncologyVisitTaskNum = t.OncologyVisitTask.VisitTaskNum, OncologyUserName = t.OncologyVisitTask.DoctorUser.UserName, t.VisitTask.VisitTaskNum, t.VisitTaskId, t.EvaluationReason, t.EvaluationResult })
|
||
.ToList();
|
||
|
||
foreach (var subjectOncologyResult in oncologyResultList.GroupBy(t => t.SubjectId))
|
||
{
|
||
//最后已完成的肿瘤学任务号
|
||
var lastOncologyVisitTaskNum = subjectOncologyResult.OrderByDescending(t => t.OncologyVisitTaskNum).FirstOrDefault().OncologyVisitTaskNum;
|
||
|
||
//需要填充的肿瘤学结果
|
||
var subjectOncologyList = subjectOncologyResult.Where(t => t.OncologyVisitTaskNum == lastOncologyVisitTaskNum).ToList();
|
||
|
||
|
||
foreach (var subjectOncology in subjectOncologyList)
|
||
{
|
||
|
||
foreach (var item in list)
|
||
{
|
||
if (item.SubjectId == subjectOncology.SubjectId && item.VisitTaskNum == subjectOncology.VisitTaskNum)
|
||
{
|
||
item.OncologyReason = subjectOncology.EvaluationReason;
|
||
item.OncologyResult = subjectOncology.EvaluationResult;
|
||
item.OncologyUserName = subjectOncology.OncologyUserName;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
}
|
||
|
||
return list;
|
||
}
|
||
public List<T> DealJudgeMark<T>(ArbitrationRule arbitrationRule, bool isGlobalReading, IEnumerable<T> list) where T : CommonEvaluationExport
|
||
{
|
||
//处理访视任务的裁判标记
|
||
var resultExceptJudgeList = list.Where(t => t.ReadingCategory != ReadingCategory.Judge).ToList();
|
||
|
||
var judegeList = list.Where(t => t.ReadingCategory == ReadingCategory.Judge).ToList();
|
||
|
||
if (arbitrationRule == ArbitrationRule.Visit)
|
||
{
|
||
|
||
foreach (var item in resultExceptJudgeList)
|
||
{
|
||
var findJudge = judegeList.FirstOrDefault(t => t.SubjectCode == item.SubjectCode
|
||
&& (t.VisitTaskNum - ReadingCommon.TaskNumDic[ReadingCategory.Judge]) == item.VisitTaskNum);
|
||
|
||
if (findJudge != null)
|
||
{
|
||
if (findJudge.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||
{
|
||
item.IsJudgeSelect = findJudge.JudgeArmEnum == item.ArmEnum ? true : false;
|
||
|
||
item.JudgeNote = findJudge.JudgeArmEnum == item.ArmEnum ? findJudge.JudgeNote : string.Empty;
|
||
}
|
||
else
|
||
{
|
||
//默认也是null 其实不用赋值
|
||
item.IsJudgeSelect = null;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
|
||
//两个人都做了
|
||
if (resultExceptJudgeList.Where(t => t.VisitTaskNum == item.VisitTaskNum && t.SubjectCode == item.SubjectCode).Select(t => t.ArmEnum).Distinct().Count() == 2)
|
||
{
|
||
//如果没有产生裁判,默认选择R1
|
||
if (item.ArmEnum == Arm.DoubleReadingArm1)
|
||
{
|
||
item.IsJudgeSelect = true;
|
||
}
|
||
else
|
||
{
|
||
item.IsJudgeSelect = false;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
item.IsJudgeSelect = null;
|
||
item.IsTrigerJudge = null;
|
||
}
|
||
|
||
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
else if (arbitrationRule == ArbitrationRule.Reading)
|
||
{
|
||
//处理访视裁判标记
|
||
foreach (var visitItem in resultExceptJudgeList.Where(t => t.ReadingCategory == ReadingCategory.Visit))
|
||
{
|
||
////默认设置为false 只处理为true 和 空的情况
|
||
//visitItem.IsJudgeSelect = false;
|
||
|
||
var subjectJudgeList = judegeList.Where(t => t.SubjectCode == visitItem.SubjectCode).ToList();
|
||
|
||
//阅片期访视号
|
||
var subjectReadingPeriondVisitNumList = resultExceptJudgeList.Where(t => t.SubjectCode == visitItem.SubjectCode).FirstOrDefault()?.SubjectCriterionReadingPeriodVisitNumList;
|
||
|
||
//两个人完成最大得任务号(访视+全局)
|
||
var subjectMaxFinishedTaskNum = resultExceptJudgeList.Where(t => t.SubjectCode == visitItem.SubjectCode)
|
||
.GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).DefaultIfEmpty().Max();
|
||
|
||
var addReadingPeriodNum = isGlobalReading ? ReadingCommon.TaskNumDic[ReadingCategory.Global] : 0;
|
||
|
||
var finishedGlobalCount = 0;
|
||
|
||
//没有配置阅片期
|
||
if (subjectReadingPeriondVisitNumList == null)
|
||
{
|
||
finishedGlobalCount = 0;
|
||
}
|
||
else
|
||
{
|
||
//已完成的全局数量
|
||
finishedGlobalCount = resultExceptJudgeList.Where(t => t.SubjectCode == visitItem.SubjectCode && subjectReadingPeriondVisitNumList.Any(c => (c + addReadingPeriodNum) == t.VisitTaskNum)
|
||
/*&& t.ReadingCategory == ReadingCategory.Global*/)
|
||
.Select(t => new { t.VisitTaskNum, t.ArmEnum }).Distinct()
|
||
.GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).Count();
|
||
}
|
||
|
||
|
||
visitItem.IsJudgeSelect = null;
|
||
visitItem.IsTrigerJudge = null;
|
||
|
||
if (finishedGlobalCount != 0)
|
||
{
|
||
//最大的全局是否产生裁判
|
||
|
||
var subjectMaxFinishedGlobalTaskNum = resultExceptJudgeList.Where(t => t.SubjectCode == visitItem.SubjectCode && subjectReadingPeriondVisitNumList.Any(c => (c + addReadingPeriodNum) == t.VisitTaskNum)
|
||
/*&& t.ReadingCategory == ReadingCategory.Global*/)
|
||
.Select(t => new { t.VisitTaskNum, t.ArmEnum }).Distinct()
|
||
.GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).DefaultIfEmpty().Max();
|
||
|
||
//最大的完成的全局是否产生裁判
|
||
if (subjectJudgeList.Any(t => t.VisitTaskNum == (subjectMaxFinishedGlobalTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge])))
|
||
{
|
||
|
||
var maxJudge = subjectJudgeList.FirstOrDefault(t => t.VisitTaskNum == (subjectMaxFinishedGlobalTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge]));
|
||
|
||
//最大裁判完成了
|
||
if (maxJudge.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||
{
|
||
if (visitItem.VisitTaskNum < maxJudge.VisitTaskNum)
|
||
{
|
||
//触发裁判
|
||
visitItem.IsTrigerJudge = true;
|
||
|
||
if (visitItem.ArmEnum == maxJudge.JudgeArmEnum)
|
||
{
|
||
visitItem.IsJudgeSelect = true;
|
||
visitItem.JudgeNote = maxJudge.JudgeNote;
|
||
}
|
||
//裁判没选择的人设置为false
|
||
else
|
||
{
|
||
visitItem.IsJudgeSelect = false;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//后续访视 未知 默认都是null
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//找到当前未阅最大裁判之前的已完成的最大裁判任务
|
||
var maxFinishedJudge = subjectJudgeList.Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned).OrderByDescending(t => t.VisitTaskNum).FirstOrDefault();
|
||
|
||
if (maxFinishedJudge == null)
|
||
{
|
||
// 为空 裁判选择标记默认就是null 不用处理
|
||
|
||
if (visitItem.VisitTaskNum < maxJudge.VisitTaskNum)
|
||
{
|
||
visitItem.IsTrigerJudge = true;
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
if (visitItem.VisitTaskNum < maxFinishedJudge.VisitTaskNum)
|
||
{
|
||
visitItem.IsTrigerJudge = true;
|
||
|
||
if (visitItem.ArmEnum == maxFinishedJudge.JudgeArmEnum)
|
||
{
|
||
visitItem.IsJudgeSelect = true;
|
||
visitItem.JudgeNote = maxFinishedJudge.JudgeNote;
|
||
}
|
||
//裁判没选择的人设置为false
|
||
else
|
||
{
|
||
visitItem.IsJudgeSelect = false;
|
||
}
|
||
}
|
||
else if (visitItem.VisitTaskNum > maxFinishedJudge.VisitTaskNum && visitItem.VisitTaskNum < maxJudge.VisitTaskNum)
|
||
{
|
||
//完成裁判 和未完成裁判之间的 裁判选择标记默认是null
|
||
|
||
visitItem.IsTrigerJudge = true;
|
||
}
|
||
else
|
||
{
|
||
//在未完成全局裁判之后的访视 未知 默认都是null
|
||
|
||
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
}
|
||
else
|
||
{
|
||
//最大的完成的全局未产生裁判
|
||
|
||
if (visitItem.VisitTaskNum <= subjectMaxFinishedGlobalTaskNum)
|
||
{
|
||
visitItem.IsTrigerJudge = false;
|
||
|
||
if (visitItem.ArmEnum == Arm.DoubleReadingArm1)
|
||
{
|
||
visitItem.IsJudgeSelect = true;
|
||
|
||
}
|
||
else
|
||
{
|
||
visitItem.IsJudgeSelect = false;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//未产生裁判的全局之后的访视 两个标记都是null (后续可能还有全局,但是全局两个人没做完)
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
foreach (var visitItem in resultExceptJudgeList.Where(t => t.ReadingCategory == ReadingCategory.Visit))
|
||
{
|
||
visitItem.IsJudgeSelect = null;
|
||
visitItem.IsTrigerJudge = null;
|
||
}
|
||
|
||
}
|
||
return resultExceptJudgeList;
|
||
}
|
||
|
||
#endregion
|
||
|
||
|
||
#endregion
|
||
|
||
#region 通用阅片结果导出
|
||
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 获取阅片标准可以导出的列表
|
||
/// </summary>
|
||
/// <param name="trialReadingCriterionId"></param>
|
||
/// <returns></returns>
|
||
public async Task<List<ExportDocumentDes>> GetTrialReadingCriterionCanExportDocumentList(Guid trialReadingCriterionId)
|
||
{
|
||
|
||
var list = new List<ExportDocumentDes>();
|
||
|
||
var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionGroup, t.CriterionName, t.ArbitrationRule, t.IsArbitrationReading }).FirstNotNullAsync();
|
||
|
||
list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReading_Export, ExportCatogory = ExportResult.TableOfAssessmentResults });
|
||
|
||
list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonReadingDetail_Export, ExportCatogory = ExportResult.DetailedTableOfAssessmentResults });
|
||
|
||
if (criterion.IsArbitrationReading)
|
||
{
|
||
//仲裁阅片 才有裁判阅片明细表 同时要把模板里面的三列给去掉
|
||
list.Add(new ExportDocumentDes() { Code = StaticData.Export.CommonJudgeReadingDetail_Export, ExportCatogory = ExportResult.DetailedTableOfAdjudicationResults });
|
||
|
||
}
|
||
|
||
if (criterion.CriterionGroup == CriterionGroup.Tumor)
|
||
{
|
||
list.Add(new ExportDocumentDes() { Code = StaticData.Export.ReadingLession_Export, ExportCatogory = ExportResult.DetailedTableOfLesions });
|
||
}
|
||
|
||
if (criterion.CriterionType == CriterionType.OCT)
|
||
{
|
||
list.Add(new ExportDocumentDes() { Code = StaticData.Export.OCT_ReadingLession_Export, ExportCatogory = ExportResult.OCT_ReadingLession_Export });
|
||
}
|
||
//else if (criterion.CriterionType == CriterionType.SelfDefine)
|
||
//{
|
||
// list.Add(new ExportDocumentDes() { Code = StaticData.Export.CDISC_Reading_Export, ExportCatogory = ExportResult.CDISC });
|
||
//}
|
||
|
||
switch (criterion.ArbitrationRule)
|
||
{
|
||
case ArbitrationRule.None:
|
||
break;
|
||
|
||
case ArbitrationRule.Visit:
|
||
list.Add(new ExportDocumentDes() { Code = StaticData.Export.VisitJudgeRatio_Export, ExportCatogory = ExportResult.VisitJudgeRatio_Export });
|
||
|
||
break;
|
||
case ArbitrationRule.Reading:
|
||
list.Add(new ExportDocumentDes() { Code = StaticData.Export.ReadingPeriodJudgeRatio_Export, ExportCatogory = ExportResult.ReadingPeriodJudgeRatio_Export });
|
||
|
||
break;
|
||
case ArbitrationRule.NA:
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
|
||
var result = _commonDocumentRepository.Where(t => list.Select(c => c.Code).Contains(t.Code)).Select(c => new ExportDocumentDes() { Code = c.Code, FileName = _userInfo.IsEn_Us ? c.Name : c.NameCN }).ToList();
|
||
|
||
foreach (var item in list)
|
||
{
|
||
item.FileName = result.Where(t => t.Code == item.Code).FirstOrDefault()?.FileName;
|
||
}
|
||
return list;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 阅片结果表、阅片结果明细,评估病灶明细表, 裁判明细表导出,条件通过 ReadingExportType ( 1,2,3,4)区分
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetCommonEvaluationList_Export(VisitTaskQuery inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IRepository<ReadingQuestionTrial> _trialReadingQuestionRepository,
|
||
[FromServices] IRepository<ReadingTableQuestionTrial> _trialReadingTableQuestionRepository,
|
||
[FromServices] IRepository<ReadingOncologyTaskInfo> _oncologyRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository)
|
||
{
|
||
var trialId = inQuery.TrialId;
|
||
var trialReadingCriterionId = inQuery.TrialReadingCriterionId;
|
||
//每次查询必须是单标准的
|
||
var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionGroup, t.IsGlobalReading, t.IsArbitrationReading, t.IsOncologyReading, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync();
|
||
|
||
|
||
var query = _visitTaskRepository.Where(t => t.TrialId == inQuery.TrialId && t.IsAnalysisCreate == false && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze))
|
||
|
||
//访视和全局查询已签名完成的,裁判可以是未签名,未完成的
|
||
.Where(t => (t.ReadingTaskState == ReadingTaskState.HaveSigned && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global)) || t.ReadingCategory == ReadingCategory.Judge)
|
||
.WhereIf(inQuery.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
|
||
.WhereIf(inQuery.TrialSiteId != null, t => t.Subject.TrialSiteId == inQuery.TrialSiteId)
|
||
|
||
.WhereIf(inQuery.IsUrgent != null, t => t.IsUrgent == inQuery.IsUrgent)
|
||
.WhereIf(inQuery.DoctorUserId != null, t => t.DoctorUserId == inQuery.DoctorUserId)
|
||
.WhereIf(inQuery.ReadingCategory != null, t => t.ReadingCategory == inQuery.ReadingCategory)
|
||
//.WhereIf(inQuery.ReadingTaskState != null, t => t.ReadingTaskState == inQuery.ReadingTaskState)
|
||
.WhereIf(inQuery.TaskAllocationState != null, t => t.TaskAllocationState == inQuery.TaskAllocationState)
|
||
.WhereIf(inQuery.ArmEnum != null, t => t.ArmEnum == inQuery.ArmEnum)
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(inQuery.TrialSiteCode!) && t.IsAnalysisCreate == false))
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.TaskName.Contains(inQuery.TaskName) || t.TaskBlindName.Contains(inQuery.TaskName))
|
||
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => t.Subject.Code.Contains(inQuery.SubjectCode))
|
||
.WhereIf(inQuery.BeginAllocateDate != null, t => t.AllocateTime > inQuery.BeginAllocateDate)
|
||
.WhereIf(inQuery.EndAllocateDate != null, t => t.AllocateTime < inQuery.EndAllocateDate);
|
||
|
||
|
||
|
||
var list = new List<CommonEvaluationExport>();
|
||
|
||
var taskList = new List<CommonLessionExport>();
|
||
|
||
#region 区分导表类型
|
||
|
||
var removeColumnIndexList = new List<int>() { };
|
||
|
||
if (inQuery.ReadingExportType == ExportResult.DetailedTableOfAdjudicationResults ||
|
||
inQuery.ReadingExportType == ExportResult.DetailedTableOfAssessmentResults ||
|
||
inQuery.ReadingExportType == ExportResult.DetailedTableOfLesions ||
|
||
inQuery.ReadingExportType == ExportResult.TableOfAssessmentResults)
|
||
{
|
||
if (!criterion.IsArbitrationReading)
|
||
{
|
||
//仲裁阅片 才有裁判阅片明细表 同时要把模板里面的三列给去掉
|
||
//removeColumnIndexList = new List<int>() { 6, 7, 8 };
|
||
|
||
// HIR模板直接没有 不用去掉
|
||
}
|
||
|
||
//阅片结果表 和阅片结果明细表 没有肿瘤学的时候需要移除肿瘤学三个字段
|
||
|
||
if (!criterion.IsOncologyReading)
|
||
{
|
||
if (inQuery.ReadingExportType == ExportResult.TableOfAssessmentResults || inQuery.ReadingExportType == ExportResult.DetailedTableOfAssessmentResults)
|
||
{
|
||
//HIR 这边是 5 6 7 替换 9, 10, 11
|
||
removeColumnIndexList = removeColumnIndexList.Union(new List<int>() { 5, 6, 7 }).ToList();
|
||
}
|
||
}
|
||
}
|
||
|
||
var export_Template = StaticData.Export.CommonReading_Export;
|
||
|
||
if (inQuery.ReadingExportType == ExportResult.DetailedTableOfAdjudicationResults)
|
||
{
|
||
//裁判明表
|
||
export_Template = StaticData.Export.CommonJudgeReadingDetail_Export;
|
||
}
|
||
else if (inQuery.ReadingExportType == ExportResult.DetailedTableOfAssessmentResults)
|
||
{
|
||
//阅片明细表
|
||
export_Template = StaticData.Export.CommonReadingDetail_Export;
|
||
}
|
||
else if (inQuery.ReadingExportType == ExportResult.DetailedTableOfLesions)
|
||
{
|
||
//病灶明细表
|
||
export_Template = StaticData.Export.ReadingLession_Export;
|
||
}
|
||
else if (inQuery.ReadingExportType == ExportResult.TableOfAssessmentResults)
|
||
{
|
||
//阅片结果表
|
||
export_Template = StaticData.Export.CommonReading_Export;
|
||
}
|
||
|
||
else if (inQuery.ReadingExportType == ExportResult.OCT_ReadingLession_Export)
|
||
{
|
||
//OCT
|
||
export_Template = StaticData.Export.OCT_ReadingLession_Export;
|
||
}
|
||
|
||
|
||
|
||
// 肿瘤标准 按照任务级别
|
||
if ((inQuery.ReadingExportType == ExportResult.TableOfAssessmentResults ||
|
||
inQuery.ReadingExportType == ExportResult.DetailedTableOfAssessmentResults ||
|
||
inQuery.ReadingExportType == ExportResult.DetailedTableOfAdjudicationResults) &&
|
||
(criterion.CriterionGroup == CriterionGroup.Tumor)
|
||
)
|
||
|
||
{
|
||
//其他可以统一处理
|
||
list = await query.ProjectTo<CommonEvaluationExport>(_mapper.ConfigurationProvider,
|
||
new
|
||
{
|
||
readingExportType = inQuery.ReadingExportType,
|
||
criterionType = criterion.CriterionType,
|
||
arbitrationRule = criterion.ArbitrationRule,
|
||
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
||
isEn_Us = _userInfo.IsEn_Us
|
||
}).ToListAsync();
|
||
|
||
}
|
||
//肿瘤标准 病灶明细表 按照病灶级别 (OCT 暂时不删除,先看是否能覆盖)
|
||
else if (
|
||
(inQuery.ReadingExportType == ExportResult.DetailedTableOfLesions &&
|
||
criterion.CriterionGroup == CriterionGroup.Tumor
|
||
) || inQuery.ReadingExportType == ExportResult.OCT_ReadingLession_Export
|
||
)
|
||
{
|
||
|
||
taskList = await query.ProjectTo<CommonLessionExport>(_mapper.ConfigurationProvider,
|
||
new
|
||
{
|
||
readingExportType = inQuery.ReadingExportType,
|
||
criterionType = criterion.CriterionType,
|
||
arbitrationRule = criterion.ArbitrationRule,
|
||
trialReadingCriterionId = inQuery.TrialReadingCriterionId,
|
||
isEn_Us = _userInfo.IsEn_Us
|
||
}).ToListAsync();
|
||
|
||
}
|
||
|
||
|
||
|
||
#endregion
|
||
|
||
|
||
|
||
|
||
|
||
var dynamicColumnConfig = new DynamicColumnConfig();
|
||
|
||
//查询配置的问题名称,不是从答案表中连接取问题名称,因为目前有些保存,有些问题,虽然配置了,但是没填,导致导表有些配置的列没出来
|
||
var trialConfigQuestionList = _trialReadingQuestionRepository.Where(t => t.TrialId == trialId && t.ReadingQuestionCriterionTrialId == trialReadingCriterionId).Where(t => t.ExportResultStr.Contains(((int)inQuery.ReadingExportType).ToString())).OrderBy(t => t.ShowOrder).Select(t => new ExportQuestionBasicInfo()
|
||
{
|
||
QuestionId = t.Id,
|
||
QuestionType = t.QuestionType,
|
||
TableName = "",
|
||
QuestionName = _userInfo.IsEn_Us ? t.QuestionEnName : t.QuestionName,
|
||
TranslateDicName = t.DictionaryCode,
|
||
GroupName = _userInfo.IsEn_Us ? t.GroupInfo.GroupEnName : t.GroupInfo.GroupName
|
||
}).ToList();
|
||
|
||
|
||
|
||
|
||
|
||
//最终EXCEL 列
|
||
var configCoumNameList = new List<DynamicColumnConfig.ColumItem>();
|
||
|
||
//最终翻译字典
|
||
var translateDicNameList = new List<string>();
|
||
|
||
|
||
//表格全问题名
|
||
var trialConfigTableQuestionList = _trialReadingTableQuestionRepository.Where(t => t.TrialId == trialId && t.TrialCriterionId == trialReadingCriterionId).Where(t => t.ExportResultStr.Contains(((int)inQuery.ReadingExportType).ToString()))
|
||
.OrderBy(t => t.ShowOrder).Select(t => new ExportQuestionBasicInfo()
|
||
{
|
||
QuestionId = t.Id,
|
||
TableName = _userInfo.IsEn_Us ? t.ReadingQuestionTrial.QuestionEnName : t.ReadingQuestionTrial.QuestionName,
|
||
QuestionName = _userInfo.IsEn_Us ? t.QuestionEnName : t.QuestionName,
|
||
TranslateDicName = t.DictionaryCode
|
||
}).ToList();
|
||
|
||
|
||
|
||
var fistLeveLNameList = new List<DynamicColumnConfig.ColumItem>();
|
||
|
||
//肿瘤评估,非CDISC 导出
|
||
if (criterion.CriterionGroup == CriterionGroup.Tumor)
|
||
{
|
||
#region 外层问题处理
|
||
|
||
if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB
|
||
|| criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC)
|
||
{
|
||
|
||
fistLeveLNameList = trialConfigQuestionList.Select(t => new DynamicColumnConfig.ColumItem()
|
||
{
|
||
Id = Guid.Empty,
|
||
Name = (t.QuestionType == QuestionType.ExistDisease || t.QuestionType == QuestionType.Tumor) ? (_userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估") : t.QuestionName
|
||
}).Distinct().ToList();
|
||
|
||
|
||
|
||
|
||
}
|
||
else if (criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET)
|
||
{
|
||
|
||
fistLeveLNameList = trialConfigQuestionList.Select(t => new DynamicColumnConfig.ColumItem()
|
||
{
|
||
Id = Guid.Empty,
|
||
Name = (t.QuestionType == QuestionType.ExistDisease || t.QuestionType == QuestionType.ImgOncology) ? (_userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估") : t.QuestionName
|
||
}).Distinct().ToList();
|
||
|
||
}
|
||
else if (criterion.CriterionType == CriterionType.PCWG3)
|
||
{
|
||
fistLeveLNameList = trialConfigQuestionList.Select(t => new DynamicColumnConfig.ColumItem()
|
||
{
|
||
Id = Guid.Empty,
|
||
Name = t.QuestionName
|
||
}).Distinct().ToList();
|
||
|
||
}
|
||
|
||
#endregion
|
||
|
||
var exTralDicNameList = new List<string>() { "LesionType" };
|
||
|
||
translateDicNameList = trialConfigQuestionList.Union(trialConfigTableQuestionList).Where(t => t.TranslateDicName.IsNotNullOrEmpty()).Select(t => t.TranslateDicName).Union(exTralDicNameList).Distinct().ToList();
|
||
|
||
#region 表格问题处理 肿瘤 表格问题直接去重、同时添加一些列
|
||
var extralNameList = new List<DynamicColumnConfig.ColumItem>();
|
||
|
||
if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB
|
||
|| criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC
|
||
|| criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET)
|
||
{
|
||
|
||
//if(inQuery.ReadingExportType == ExportResult.DetailedTableOfLesions)
|
||
{
|
||
extralNameList.Add(new DynamicColumnConfig.ColumItem() { Id = Guid.Empty, Name = _userInfo.IsEn_Us ? "Lesion ID" : "病灶编号" });
|
||
extralNameList.Add(new DynamicColumnConfig.ColumItem() { Id = Guid.Empty, Name = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型" });
|
||
}
|
||
|
||
}
|
||
else if (criterion.CriterionType == CriterionType.PCWG3)
|
||
{
|
||
//if (inQuery.ReadingExportType == ExportResult.DetailedTableOfLesions)
|
||
{
|
||
extralNameList.Add(new DynamicColumnConfig.ColumItem() { Id = Guid.Empty, Name = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型" });
|
||
|
||
}
|
||
}
|
||
|
||
//肿瘤评估标准目前是去重 按照问题名称填充 不是Id
|
||
var tableQuestionNameList = trialConfigTableQuestionList.Select(t => t.QuestionName).Distinct().Select(t => new DynamicColumnConfig.ColumItem() { Id = Guid.Empty, Name = t }).Distinct().ToList();
|
||
|
||
//有表格问题 那么就是三部分,否则就是外层问题
|
||
configCoumNameList = tableQuestionNameList.Count == 0 ? fistLeveLNameList : fistLeveLNameList.Union(extralNameList).Union(tableQuestionNameList).ToList();
|
||
|
||
|
||
#region 扩展病灶
|
||
|
||
|
||
//最终的病灶列表 要把裁判的也要加进去,需要处理裁判标记
|
||
|
||
foreach (var item in taskList.OrderBy(t => t.SubjectCode).ThenBy(t => t.ArmEnum).ThenBy(t => t.VisitTaskNum))
|
||
{
|
||
if (item.LesionList.Count > 0)
|
||
{
|
||
foreach (var lession in item.LesionList.OrderBy(t => t.LessionType).ThenBy(t => t.LessionCode))
|
||
{
|
||
|
||
var addLessionInfoList = new List<CommonQuesionInfo>();
|
||
|
||
if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB
|
||
|| criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC
|
||
|| criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET)
|
||
{
|
||
//病灶编号 和病灶类型没有配置,但是需要有的
|
||
addLessionInfoList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion ID" : "病灶编号", QuestionValue = lession.LessionCode });
|
||
addLessionInfoList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型", QuestionValue = lession.LessionType, TranslateDicName = "LesionType" });
|
||
|
||
}
|
||
else if (criterion.CriterionType == CriterionType.PCWG3)
|
||
{
|
||
addLessionInfoList.Add(new CommonQuesionInfo() { QuestionName = _userInfo.IsEn_Us ? "Lesion Type" : "病灶类型", QuestionValue = lession.LessionType, TranslateDicName = "LesionType" });
|
||
}
|
||
|
||
var dynamicPartialLessionInfoList = lession.LessionAnswerList.Select(t => new CommonQuesionInfo() { QuestionName = t.QuestionName, QuestionValue = t.QuestionValue, TranslateDicName = t.TranslateDicName });
|
||
|
||
//有三部分组成 外层问题+ 没有配置病灶编号和类型+ 动态的表格问题
|
||
var dynamicLessionInfoList = item.QuestionAnswerList.Union(addLessionInfoList).Union(dynamicPartialLessionInfoList).ToList();
|
||
|
||
//OCT 多个表格,但是只导出一个表格,有的问题答案就是空的
|
||
if (dynamicLessionInfoList.Count > 0)
|
||
{
|
||
|
||
var cloneItem = item.Clone();
|
||
cloneItem.QuestionAnswerList = dynamicLessionInfoList;
|
||
|
||
list.Add(cloneItem);
|
||
}
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//要把裁判任务加进去 裁判任务上没有病灶
|
||
|
||
list.Add(item);
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 不管是list 还是taskList 最终处理的数据都是list 处理好数据后合并
|
||
if (criterion.CriterionType == CriterionType.RECIST1Point1 || criterion.CriterionType == CriterionType.RECIST1Pointt1_MB
|
||
|| criterion.CriterionType == CriterionType.IRECIST1Point1 || criterion.CriterionType == CriterionType.mRECISTHCC)
|
||
{
|
||
//针对1.1 整体肿瘤评估 有的两列要合并一列
|
||
foreach (var item in list)
|
||
{
|
||
//处理合并表头
|
||
|
||
var questionType = item.IsBaseline == true ? QuestionType.ExistDisease : QuestionType.Tumor;
|
||
|
||
var findItem = item.QuestionAnswerList.Where(t => t.QuestionType == questionType).FirstOrDefault();
|
||
|
||
if (findItem != null)
|
||
{
|
||
findItem.QuestionName = _userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估";
|
||
}
|
||
|
||
|
||
if (item.IsBaseline == true)
|
||
{
|
||
item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.Tumor).ToList();
|
||
}
|
||
else
|
||
{
|
||
item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ExistDisease).ToList();
|
||
}
|
||
}
|
||
}
|
||
else if (criterion.CriterionType == CriterionType.Lugano2014 || criterion.CriterionType == CriterionType.Lugano2014WithoutPET)
|
||
{
|
||
foreach (var item in list)
|
||
{
|
||
//处理合并表头
|
||
|
||
var questionType = item.IsBaseline == true ? QuestionType.ExistDisease : QuestionType.ImgOncology;
|
||
|
||
var findItem = item.QuestionAnswerList.Where(t => t.QuestionType == questionType).FirstOrDefault();
|
||
|
||
if (findItem != null)
|
||
{
|
||
findItem.QuestionName = _userInfo.IsEn_Us ? "Overall Response" : "整体肿瘤评估";
|
||
}
|
||
|
||
if (item.IsBaseline == true)
|
||
{
|
||
item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ImgOncology).ToList();
|
||
}
|
||
else
|
||
{
|
||
item.QuestionAnswerList = item.QuestionAnswerList.Where(t => t.QuestionType != QuestionType.ExistDisease).ToList();
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
#endregion
|
||
}
|
||
else
|
||
//非肿瘤评估,非CDISC 导出
|
||
{
|
||
//外层问题处理
|
||
fistLeveLNameList = trialConfigQuestionList.Select(t => new DynamicColumnConfig.ColumItem()
|
||
{
|
||
Id = t.QuestionId,
|
||
Name = t.QuestionName
|
||
}).ToList();
|
||
|
||
translateDicNameList = trialConfigQuestionList.Union(trialConfigTableQuestionList).Where(t => t.TranslateDicName.IsNotNullOrEmpty()).Select(t => t.TranslateDicName).Distinct().ToList();
|
||
|
||
#region 表格问题处理 问题名称是 表格名称_表格子问题名
|
||
|
||
var isMutiTable = trialConfigTableQuestionList.Select(t => t.TableName).Distinct().Count() > 1;
|
||
|
||
//多表格问题
|
||
if (isMutiTable)
|
||
{
|
||
//多表格,增加的一列,就用Guid.Empty 标识
|
||
var extralNameList = new List<DynamicColumnConfig.ColumItem>() { new DynamicColumnConfig.ColumItem() { Id = Guid.Empty, Name = _userInfo.IsEn_Us ? "Table Name" : "表格名称" } };
|
||
|
||
var tableQuestionNameList = trialConfigTableQuestionList.OrderBy(t => t.TableName).Select(t => new DynamicColumnConfig.ColumItem() { Id = t.QuestionId, Name = t.TableName + "_" + t.QuestionName }).ToList();
|
||
|
||
configCoumNameList = fistLeveLNameList.Union(extralNameList).Union(tableQuestionNameList).ToList();
|
||
}
|
||
else
|
||
{
|
||
//单表格问题(直接用表格问题名称) 或者没有表格问题
|
||
|
||
var tableNameList = trialConfigTableQuestionList.Select(t => new DynamicColumnConfig.ColumItem() { Id = t.QuestionId, Name = t.QuestionName }).ToList();
|
||
|
||
configCoumNameList = fistLeveLNameList.Union(tableNameList).ToList();
|
||
}
|
||
|
||
|
||
|
||
|
||
#region 扩展表格问题
|
||
|
||
|
||
//最终的病灶列表 要把裁判的也要加进去,需要处理裁判标记
|
||
foreach (var item in taskList.OrderBy(t => t.SubjectCode).ThenBy(t => t.ArmEnum).ThenBy(t => t.VisitTaskNum))
|
||
{
|
||
//有病灶,并且至少配置了一个病灶问题
|
||
if (item.LesionList.Count > 0 && item.LesionList.SelectMany(t => t.LessionAnswerList).Any())
|
||
{
|
||
foreach (var lession in item.LesionList.OrderBy(t => t.LessionType).ThenBy(t => t.LessionCode))
|
||
{
|
||
//病灶配置了问题 才进行导出
|
||
if (lession.LessionAnswerList.Count > 0)
|
||
{
|
||
var firstLessionAnser = lession.LessionAnswerList.FirstOrDefault();
|
||
|
||
var dynamicLessionInfoList = new List<CommonQuesionInfo>();
|
||
|
||
if (isMutiTable)
|
||
{
|
||
var addLessionInfoList = new List<CommonQuesionInfo>();
|
||
|
||
addLessionInfoList.Add(new CommonQuesionInfo() { QuestionId = Guid.Empty, QuestionName = _userInfo.IsEn_Us ? "Table Name" : "表格名称", QuestionValue = firstLessionAnser.TableName });
|
||
|
||
var dynamicPartialLessionInfoList = lession.LessionAnswerList.Select(t => new CommonQuesionInfo() { QuestionId = t.TableQuesionId, QuestionName = t.TableName + "_" + t.QuestionName, QuestionValue = t.QuestionValue, TranslateDicName = t.TranslateDicName });
|
||
|
||
//有三部分组成 外层问题+ 固定列表格名称 + 动态的表格问题
|
||
dynamicLessionInfoList = item.QuestionAnswerList.Union(addLessionInfoList).Union(dynamicPartialLessionInfoList).ToList();
|
||
}
|
||
else
|
||
{
|
||
var dynamicPartialLessionInfoList = lession.LessionAnswerList.Select(t => new CommonQuesionInfo() { QuestionId = t.TableQuesionId, QuestionName = t.QuestionName, QuestionValue = t.QuestionValue, TranslateDicName = t.TranslateDicName });
|
||
|
||
//两部分组成 外层问题+ 动态的表格问题
|
||
dynamicLessionInfoList = item.QuestionAnswerList.Union(dynamicPartialLessionInfoList).ToList();
|
||
}
|
||
|
||
|
||
|
||
var cloneItem = item.Clone();
|
||
cloneItem.QuestionAnswerList = dynamicLessionInfoList;
|
||
list.Add(cloneItem);
|
||
}
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//要把裁判任务加进去 裁判任务上没有病灶
|
||
|
||
list.Add(item);
|
||
}
|
||
|
||
}
|
||
|
||
#endregion
|
||
|
||
#endregion
|
||
}
|
||
|
||
|
||
|
||
dynamicColumnConfig = new DynamicColumnConfig()
|
||
{
|
||
AutoColumnTitleRowIndex = 2,
|
||
AutoColumnStartIndex = 5,
|
||
TempalteLastColumnIndex = 7,
|
||
DynamicItemDicName = "TranslateDicName",
|
||
DynamicItemValueName = "QuestionValue",
|
||
DynamicItemTitleName = "QuestionName",
|
||
DynamicItemTitleId = "QuestionId",
|
||
DynamicListName = "QuestionAnswerList",
|
||
RemoveColunmIndexList = removeColumnIndexList,
|
||
ColumnIdNameList = configCoumNameList,
|
||
//CDISCList = new List<string>(),
|
||
TranslateDicNameList = translateDicNameList
|
||
};
|
||
|
||
if (export_Template == StaticData.Export.ReadingLession_Export || export_Template == StaticData.Export.CommonJudgeReadingDetail_Export)
|
||
{
|
||
//HIR 这边是4 没有裁判的3个字段 和中心编号
|
||
dynamicColumnConfig.TempalteLastColumnIndex = 4;
|
||
}
|
||
|
||
|
||
|
||
|
||
#region 最终导出参数处理
|
||
|
||
//裁判阅片明细表
|
||
if (export_Template == StaticData.Export.CommonJudgeReadingDetail_Export)
|
||
{
|
||
//R1 R2 两个人的访视都阅片完成了才可以,去除只有一个人阅片完成的访视
|
||
//找到只有一个人阅片的受试者 和访视
|
||
var exceptVisit = list.Where(t => t.ReadingCategory == ReadingCategory.Visit)
|
||
.GroupBy(t => new { t.SubjectCode, t.TaskName }).Where(g => g.Count() == 1).Select(g => new { g.Key.SubjectCode, g.Key.TaskName }).ToList();
|
||
|
||
list = list.Where(t => !exceptVisit.Any(ev => ev.SubjectCode == t.SubjectCode && ev.TaskName == t.TaskName)).ToList();
|
||
|
||
}
|
||
|
||
list = list.OrderBy(t => t.SubjectCode).ThenBy(t => t.ArmEnum).ThenBy(t => t.VisitTaskNum).ThenBy(t=>t.SignTime).ToList();
|
||
|
||
//处理裁判标记
|
||
list = DealJudgeMark(criterion.ArbitrationRule, criterion.IsGlobalReading, list);
|
||
|
||
//处理肿瘤学结果
|
||
list = DealOncologyResult(_oncologyRepository, criterion.IsOncologyReading, list);
|
||
|
||
//裁判阅片明细表 处理完标记后处理
|
||
if (export_Template == StaticData.Export.CommonJudgeReadingDetail_Export)
|
||
{
|
||
//裁判产生标记为空的数据过滤掉
|
||
list = list.Where(t => t.IsTrigerJudge != null).ToList();
|
||
}
|
||
|
||
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ExcelExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
exportInfo.CriterionName = criterion.CriterionName;
|
||
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list.Where(t => t.ReadingCategory != ReadingCategory.Global).ToList(), _userInfo.TimeZoneId);
|
||
|
||
|
||
MemoryStream? memoryStream = null;
|
||
|
||
string fileName = "";
|
||
|
||
|
||
(memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(export_Template, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CommonEvaluationExport), criterion.CriterionType, dynamicColumnConfig);
|
||
|
||
|
||
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||
{
|
||
FileDownloadName = $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}_{fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx"
|
||
};
|
||
|
||
#endregion
|
||
}
|
||
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 裁判一致率导出
|
||
/// </summary>
|
||
/// <param name="inQuery"></param>
|
||
/// <param name="_commonDocumentRepository"></param>
|
||
/// <param name="_dictionaryService"></param>
|
||
/// <param name="_trialRepository"></param>
|
||
/// <returns></returns>
|
||
/// <exception cref="Exception"></exception>
|
||
[HttpPost]
|
||
public async Task<IActionResult> GetCommonJudgeRatioList_Export(VisitTaskQuery inQuery,
|
||
[FromServices] IRepository<CommonDocument> _commonDocumentRepository,
|
||
[FromServices] IDictionaryService _dictionaryService,
|
||
[FromServices] IRepository<Trial> _trialRepository)
|
||
{
|
||
//每次查询必须是单标准的
|
||
var criterion = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync();
|
||
|
||
|
||
|
||
var trialReadingCriterionId = inQuery.TrialReadingCriterionId;
|
||
Expression<Func<VisitTask, bool>> comonTaskFilter = u => u.TrialId == inQuery.TrialId && u.IsAnalysisCreate == false && u.TaskState == TaskState.Effect && u.TrialReadingCriterionId == trialReadingCriterionId;
|
||
|
||
if (criterion.ArbitrationRule == ArbitrationRule.Visit)
|
||
{
|
||
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<VisitJudgeExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
exportInfo.CriterionName = criterion.CriterionName;
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
//按照访视维度统计
|
||
// 1、裁判量J:所有完成阅片的访视里面触发裁判的访视数;
|
||
//2、完成阅片的病例数Q:R1,R2均完成阅片的访视数;
|
||
|
||
exportInfo.VisitCount = _visitTaskRepository.Where(comonTaskFilter).Where(t => t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||
.GroupBy(t => new { t.SubjectId, t.SourceSubjectVisitId })
|
||
.Where(g => g.Count() == 2).Select(g => g.Key.SourceSubjectVisitId).Distinct().Count();
|
||
|
||
exportInfo.JudgeVisitCount = _visitTaskRepository.Where(comonTaskFilter).Where(t => t.ReadingCategory == ReadingCategory.Judge).Count();
|
||
|
||
//3、裁判认同数M:触发裁判的受试者访视中,阅片人被裁判认同的访视数量;
|
||
//4、总裁判数N:阅片人所阅的受试者访视中,触发裁判的访视数量;
|
||
|
||
var doctorList = _visitTaskRepository.Where(comonTaskFilter).Where(t => t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||
.GroupBy(t => new { t.DoctorUserId, t.DoctorUser.UserName, t.DoctorUser.FullName })
|
||
.Select(g => new DoctorJudgeRatio()
|
||
{
|
||
DoctorUserId = g.Key.DoctorUserId,
|
||
UserName = g.Key.UserName,
|
||
FullName = g.Key.FullName,
|
||
|
||
//访视产生裁判的访视数量
|
||
TotalJudgeCount = g.Where(t => t.JudgeVisitTaskId != null && t.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned).Count(),
|
||
|
||
JudgeAgreeCount = g.Where(t => t.JudgeVisitTaskId != null && t.JudgeVisitTask.JudgeResultTaskId == t.Id).Count(),
|
||
|
||
|
||
}).ToList();
|
||
|
||
exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(doctorList, _userInfo.TimeZoneId);
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.VisitJudgeRatio_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment);
|
||
|
||
|
||
}
|
||
else if (criterion.ArbitrationRule == ArbitrationRule.Reading)
|
||
{
|
||
var exportInfo = (await _trialRepository.Where(t => t.Id == inQuery.TrialId).IgnoreQueryFilters().ProjectTo<ReadingPeriodJudgeExportInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||
exportInfo.CriterionName = criterion.CriterionName;
|
||
exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId);
|
||
|
||
|
||
#region 按照受试者维度统计
|
||
//1、裁判量M:所有完成阅片病例(至少一个阅片期)里面触发裁判的受试者数量;
|
||
//2、总样本量N:R1,R2均完成阅片(至少一个阅片期)的受试者数量;
|
||
|
||
exportInfo.SubjectCount = _subjectRepository.Where(t => t.TrialId == inQuery.TrialId).Where(t =>
|
||
t.SubjectVisitTaskList.AsQueryable().Where(comonTaskFilter).Any(t => t.ReadingCategory == ReadingCategory.Global && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||
).Count();
|
||
|
||
exportInfo.judgeSubjectCount = _subjectRepository.Where(t => t.TrialId == inQuery.TrialId).Where(t =>
|
||
t.SubjectVisitTaskList.AsQueryable().Where(comonTaskFilter).Any(t => t.ReadingCategory == ReadingCategory.Global && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||
&& t.SubjectVisitTaskList.AsQueryable().Where(comonTaskFilter).Any(t => t.ReadingCategory == ReadingCategory.Judge)
|
||
).Count();
|
||
|
||
var doctorList = _visitTaskRepository.Where(comonTaskFilter).Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||
.GroupBy(t => new { t.DoctorUserId, t.DoctorUser.UserName, t.DoctorUser.FullName })
|
||
.Select(g => new DoctorJudgeRatio()
|
||
{
|
||
DoctorUserId = g.Key.DoctorUserId,
|
||
UserName = g.Key.UserName,
|
||
FullName = g.Key.FullName,
|
||
|
||
//触发裁判的受试者数量
|
||
TotalJudgeCount = g.Where(t => t.ReadingCategory == ReadingCategory.Global && t.JudgeVisitTaskId != null).Select(t => t.SubjectId).Distinct().Count(),
|
||
|
||
JudgeAgreeCount = g.Where(t => t.ReadingCategory == ReadingCategory.Global && t.JudgeVisitTaskId != null && t.JudgeVisitTask.JudgeResultTaskId == t.Id).Select(t => t.SubjectId).Distinct().Count(),
|
||
|
||
}).ToList();
|
||
|
||
#endregion
|
||
|
||
#region 按照阅片期维度统计
|
||
//、裁判量J:所有完成阅片(R1和R2均完成)的阅片期里面触发裁判的阅片期数量;
|
||
//2、总样本量Q:R1,R2均完成阅片的阅片期数量;
|
||
|
||
exportInfo.ReadingPeriodCount = _visitTaskRepository.Where(comonTaskFilter).Where(t => t.ReadingCategory == ReadingCategory.Global && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||
.GroupBy(t => new { t.SubjectId, t.SouceReadModuleId })
|
||
.Where(g => g.Count() == 2).Select(g => g.Key.SouceReadModuleId).Distinct().Count();
|
||
|
||
exportInfo.judgeReadingPeriodCount = _visitTaskRepository.Where(comonTaskFilter).Where(t => t.ReadingCategory == ReadingCategory.Global && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||
.GroupBy(t => new { t.SubjectId, t.SouceReadModuleId })
|
||
.Where(g => g.Count() == 2 && g.Any(c => c.JudgeVisitTaskId != null)).Select(g => g.Key.SouceReadModuleId).Distinct().Count();
|
||
|
||
//3、裁判认同数J:触发裁判的阅片期中,阅片人被裁判认同的阅片期数量;
|
||
//4、总裁判数Q:阅片人完成阅片的阅片期中,触发裁判的阅片期数量;
|
||
|
||
var doctor2List = _visitTaskRepository.Where(comonTaskFilter).Where(t => t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||
.GroupBy(t => new { t.DoctorUserId, t.DoctorUser.UserName, t.DoctorUser.FullName })
|
||
//有全局裁判
|
||
//.Where(g => g.Any(t => t.ReadingCategory == ReadingCategory.Global && t.JudgeVisitTaskId != null))
|
||
.Select(g => new DoctorJudgeRatio()
|
||
{
|
||
DoctorUserId = g.Key.DoctorUserId,
|
||
UserName = g.Key.UserName,
|
||
FullName = g.Key.FullName,
|
||
|
||
//触发裁判的阅片期的数量
|
||
TotalJudgeCount = g.Where(t => t.ReadingCategory == ReadingCategory.Global && t.SouceReadModuleId != null && t.JudgeVisitTaskId != null && t.JudgeVisitTask.ReadingTaskState == ReadingTaskState.HaveSigned).Select(t => t.SouceReadModuleId).Distinct().Count(),
|
||
|
||
JudgeAgreeCount = g.Where(t => t.ReadingCategory == ReadingCategory.Global && t.JudgeVisitTaskId != null && t.JudgeVisitTask.JudgeResultTaskId == t.Id)
|
||
.Select(t => t.SouceReadModuleId).Distinct().Count(),
|
||
|
||
}).ToList();
|
||
|
||
#endregion
|
||
|
||
exportInfo.DoctorSubjectStatList = doctorList;
|
||
|
||
exportInfo.DoctorPeriodStatList = doctor2List;
|
||
|
||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.ReadingPeriodJudgeRatio_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment);
|
||
|
||
|
||
|
||
}
|
||
else
|
||
{
|
||
throw new Exception("不支持该配置的导出");
|
||
}
|
||
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
}
|