diff --git a/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs b/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs index 227258d79..a0305fc0b 100644 --- a/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs +++ b/IRaCIS.Core.Application/Helper/FileDocProcess/ExcelExportHelper.cs @@ -261,7 +261,7 @@ public static class ExcelExportHelper /// public int TempalteLastColumnIndex { get; set; } - public bool IsCDISCExport { get; set; }=false; + public bool IsCDISCExport { get; set; } = false; //public List CDISCList { get; set; } = new List(); @@ -661,7 +661,7 @@ public static class ExcelExportHelper var iteObjDic = itemObj.ToDictionary(); - var itemDicName = iteObjDic[dynamicColumnConfig.DynamicItemDicName]?.ToString(); + var itemDicName = iteObjDic.ContainsKey(dynamicColumnConfig.DynamicItemDicName) ? iteObjDic[dynamicColumnConfig.DynamicItemDicName]?.ToString() : ""; var itemValue = iteObjDic[dynamicColumnConfig.DynamicItemValueName]?.ToString(); //var writeIndex = itemList.IndexOf(itemObj) + dynamicColumnConfig.AutoColumnStartIndex; diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index c3502151e..637a651f7 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -3573,5 +3573,127 @@ namespace IRaCIS.Core.Application.Service.Common } #endregion + + /// + /// 质控问题答案导出 + /// + /// + /// + /// + /// + /// + [HttpPost] + public async Task GetTrialQCQuestionAnserList_Export(Guid trialId, + [FromServices] IRepository _trialQCQuestionAnswerRepository, + [FromServices] IRepository _trialRepository, + [FromServices] IRepository _userRoleRepository, + [FromServices] IRepository _trialQCQuestionRepository, + [FromServices] IDictionaryService _dictionaryService) + { + //var query = from sv in _subjectVisitRepository.Where(t => t.TrialId == trialId && t.AuditState == AuditStateEnum.QCPassed) + + // join u in _userRoleRepository.AsQueryable() on sv.UpdateUserId equals u.Id + // select new QCQuestionReusult_export() + // { + // TrialSiteCode = sv.TrialSite.TrialSiteCode, + // SubjectCode = sv.Subject.Code, + // VisitName = sv.VisitName, + // SubjectVisitId = sv.Id, + + // CurrentQCEnum = qa.CurrentQCEnum, + // AuditTime = qa.UpdateTime, + // SecondReviewTime = qa.SecondReviewTime, + // AuditUserName = u.UserName, + // AuditUserFullName = u.FullName, + // QuesitonName = qa.TrialQCQuestionConfigure.QuestionName, + + // ShowOrder = qa.TrialQCQuestionConfigure.ShowOrder, + // Answer = qa.Answer + + // } + + + var query = from qa in _trialQCQuestionAnswerRepository.Where(t => t.SubjectVisit.TrialId == trialId && + (t.SubjectVisit.AuditState == AuditStateEnum.QCPassed || + (t.SubjectVisit.SecondReviewState == SecondReviewState.AuditPassed && t.SecondReviewTime <= t.SubjectVisit.Trial.QCQuestionConfirmedTime) || + (t.SubjectVisit.SecondReviewState == SecondReviewState.WaitAudit && t.SecondReviewTime < t.SubjectVisit.Trial.QCQuestionConfirmedTime))) + join u in _userRoleRepository.AsQueryable() on qa.UpdateUserId equals u.Id + select new QCQuestionAnswerResult_export() + { + SubjectVisitId = qa.SubjectVisitId, + SecondReviewTime = qa.SecondReviewTime, + + VisitNum = qa.SubjectVisit.VisitNum, + + TrialSiteCode = qa.SubjectVisit.TrialSite.TrialSiteCode, + SubjectCode = qa.SubjectVisit.Subject.Code, + VisitName = qa.SubjectVisit.VisitName, + CurrentQCEnum = qa.CurrentQCEnum, + + AuditTime = qa.CurrentQCEnum==CurrentQC.First?qa.SubjectVisit.PreliminaryAuditTime: (qa.CurrentQCEnum == CurrentQC.Second ? qa.SubjectVisit.ReviewAuditTime: qa.UpdateTime) , + AuditUserName = qa.CurrentQCEnum == CurrentQC.First ? qa.SubjectVisit.PreliminaryAuditUser.UserName : (qa.CurrentQCEnum == CurrentQC.Second ? qa.SubjectVisit.ReviewAuditUser.UserName : u.UserName) , + AuditUserFullName = qa.CurrentQCEnum == CurrentQC.First ? qa.SubjectVisit.PreliminaryAuditUser.FullName : (qa.CurrentQCEnum == CurrentQC.Second ? qa.SubjectVisit.ReviewAuditUser.FullName : u.FullName),, + + QuestionId=qa.TrialQCQuestionConfigure.Id, + QuesitonName = qa.TrialQCQuestionConfigure.QuestionName, + ShowOrder = qa.TrialQCQuestionConfigure.ShowOrder, + Answer = qa.Answer, + + + }; + + var result = query.OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.VisitNum).ToList(); + + var list = result.GroupBy(t => new { t.SubjectVisitId, t.SecondReviewTime, t.TrialSiteCode, t.VisitNum, t.SubjectCode, t.VisitName, t.CurrentQCEnum }) + .Select(g => new QCQuestionResult_Export() + { + TrialSiteCode = g.Key.TrialSiteCode, + SubjectCode = g.Key.SubjectCode, + VisitName = g.Key.VisitName, + CurrentQCEnum = g.Key.CurrentQCEnum, + VisitNum = g.Key.VisitNum, + + AuditTime = g.Select(t => t.AuditTime).First(), + AuditUserName = g.Select(t => t.AuditUserName).First(), + AuditUserFullName = g.Select(t => t.AuditUserFullName).First(), + + QuestionAnswerList = g.Select(t => new QCQuestionAnswerExport() { Answer = t.Answer, QuestionName = t.QuesitonName, ShowOrder = t.ShowOrder ,QuestionId=t.QuestionId}).OrderBy(t => t.ShowOrder).ToList() + + + }).OrderBy(t => t.TrialSiteCode).ThenBy(t => t.SubjectCode).ThenBy(t => t.VisitNum).ToList(); + + + var exportInfo = new ExcelExportInfo(); + + exportInfo.List = ExportExcelConverterDate.ConvertToClientTimeInObject(list, _userInfo.TimeZoneId); + exportInfo.CurrentTime = ExportExcelConverterDate.DateTimeInternationalToString(DateTime.Now, _userInfo.TimeZoneId); + + + var columNameList = _trialQCQuestionRepository.Where(t=>t.TrialId==trialId).OrderBy(t=>t.ShowOrder).Select(t=>new {t.QuestionName,t.Id}).ToList(); + + + var dynamicColumnConfig = new DynamicColumnConfig() + { + AutoColumnTitleRowIndex = 2, + AutoColumnStartIndex = 7, + TempalteLastColumnIndex = 6, + DynamicItemDicName = "TranslateDicName", + DynamicItemValueName = "Answer", + DynamicItemTitleName = "QuestionName", + DynamicListName = "QuestionAnswerList", + DynamicItemTitleId = "QuestionId", + RemoveColunmIndexList = new List() { }, + ColumnIdNameList = columNameList.Select(t => new DynamicColumnConfig.ColumItem() { Id = t.Id, Name = t.QuestionName }).ToList(), + TranslateDicNameList = new List() + }; + + + var (memoryStream, fileName) = await ExcelExportHelper.DataExport_NpoiTestAsync(StaticData.Export.TrialQCResult_Export, exportInfo, _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(QCQuestionResult_Export), dynamicColumnConfig: dynamicColumnConfig); + + return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + { + FileDownloadName = $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}_{fileName}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx" + }; + } } } diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index 41d37d552..38c023066 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -2235,5 +2235,67 @@ namespace IRaCIS.Core.Application.Contracts } + public class QCQuestionAnswerResult_export + { + public Guid SubjectVisitId { get; set; } + public string TrialSiteCode { get; set; } + public string SubjectCode { get; set; } + + public string VisitName { get; set; } + + public decimal VisitNum { get; set; } + + public CurrentQC CurrentQCEnum { get; set; } + + public string AuditUserName { get; set; } + + public string AuditUserFullName { get; set; } + + public string AuditUser => $"{AuditUserName}({AuditUserFullName})"; + + public DateTime? AuditTime { get; set; } + + public DateTime? SecondReviewTime { get; set; } + + public Guid QuestionId { get; set; } + public string QuesitonName { get; set; } + + public string Answer { get; set; } + + public int ShowOrder { get; set; } + + } + + public class QCQuestionResult_Export + { + public string TrialSiteCode { get; set; } + + public string SubjectCode { get; set; } + + public string VisitName { get; set; } + public decimal VisitNum { get; set; } + public CurrentQC CurrentQCEnum { get; set; } + + public string AuditUserName { get; set; } + + public string AuditUserFullName { get; set; } + + public string AuditUser => $"{AuditUserName}({AuditUserFullName})"; + + public DateTime? AuditTime { get; set; } + + public List QuestionAnswerList { get; set; } + + } + + public class QCQuestionAnswerExport + { + public Guid QuestionId { get; set; } + public string QuestionName { get; set; } + + public string Answer { get; set; } + + public int ShowOrder { get; set; } + } } diff --git a/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs b/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs index 5bf0e6d00..3cb388af0 100644 --- a/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs +++ b/IRaCIS.Core.Infrastructure/_IRaCIS/_Config/_StaticData.cs @@ -300,6 +300,8 @@ public static class StaticData public const string TriaVisitImageStat_Export = "TriaVisitImageStat_Export"; + public const string TrialQCResult_Export = "TrialQCResult_Export"; + }