diff --git a/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs b/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs index bb01342af..da69b4dc2 100644 --- a/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs +++ b/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs @@ -1,16 +1,75 @@ -using IRaCIS.Core.Application.Helper; +using IRaCIS.Application.Interfaces; +using IRaCIS.Core.Application.Helper; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using MiniExcelLibs; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace IRaCIS.Core.Application.Service; public static class ExcelExportHelper { //MiniExcel_Export - public static async Task DataExportAsync(string code, object data, string exportFileNamePrefix, IRepository _commonDocumentRepository, IWebHostEnvironment _hostEnvironment) + public static async Task DataExportAsync(string code, object data, string exportFileNamePrefix, IRepository _commonDocumentRepository, IWebHostEnvironment _hostEnvironment, IDictionaryService? _dictionaryService=null, Type? translateType=null) { + //判断是否有字典翻译 + + if (_dictionaryService != null && translateType != null) + { + var needTranslatePropertyList = translateType.GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), false)) + .Select(c => new { c.Name, DicParentCode = ((DictionaryTranslateAttribute?)c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false)[0])?.DicParentCode }).ToList() + ; + + + //字典表查询出所有需要翻译的数据 + + var translateDataList = await _dictionaryService.GetBasicDataSelect(needTranslatePropertyList.Select(t => t.DicParentCode).ToArray()); + + + var dic = JsonConvert.DeserializeObject>(data.ToJsonStr()); + + foreach (var key in dic.Keys) + { + //是数组 那么找到对应的属性 进行翻译 + if (dic[key].GetType().IsAssignableFrom(typeof(JArray))) + { + + var newObjList = new List(); + var no = 1; + + foreach (var item in dic[key] as JArray) + { + var itemDic = JsonConvert.DeserializeObject>(item.ToJsonStr()); + + + foreach (var needTranslateProperty in needTranslatePropertyList) + { + var beforeValue = itemDic[needTranslateProperty.Name].ToString(); + + itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue.ToLower()).FirstOrDefault()?.ValueCN; + } + + itemDic.Add("No", no++); + newObjList.Add(itemDic); + } + + dic[key] = newObjList; + + } + } + + + data = dic; + + + } + + + + + var (physicalPath, fileNmae) = await FileStoreHelper.GetCommonDocPhysicalFilePathAsync(_hostEnvironment, _commonDocumentRepository, code); diff --git a/IRaCIS.Core.Application/Helper/SendEmailHelper.cs b/IRaCIS.Core.Application/Helper/SendEmailHelper.cs index 6243d519d..e26e72df1 100644 --- a/IRaCIS.Core.Application/Helper/SendEmailHelper.cs +++ b/IRaCIS.Core.Application/Helper/SendEmailHelper.cs @@ -56,7 +56,7 @@ public static class SendEmailHelper //抄送 foreach (var copyToMailAddress in sMTPEmailConfig.CopyToMailAddressList) { - //messageToSend.Cc.Add(copyToMailAddress); + messageToSend.Cc.Add(copyToMailAddress); } } diff --git a/IRaCIS.Core.Application/Service/Common/Interface/IDictionaryService.cs b/IRaCIS.Core.Application/Service/Common/Interface/IDictionaryService.cs index 230c729cd..6ff953c7d 100644 --- a/IRaCIS.Core.Application/Service/Common/Interface/IDictionaryService.cs +++ b/IRaCIS.Core.Application/Service/Common/Interface/IDictionaryService.cs @@ -33,6 +33,7 @@ namespace IRaCIS.Application.Interfaces /// Task GetBasicDataTranslateItem(string parentCode, T childCode); + Task>> GetBasicDataSelect(string[] searchArray); } } diff --git a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs index 43dec17d5..9f1fd2670 100644 --- a/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs +++ b/IRaCIS.Core.Application/Service/Document/TrialEmailNoticeConfigService.cs @@ -206,7 +206,7 @@ namespace IRaCIS.Core.Application.Service //测试 - sendEmailConfig.ToMailAddressList.Add(new MimeKit.MailboxAddress("ddd", "872297557@qq.com")); + //sendEmailConfig.ToMailAddressList.Add(new MimeKit.MailboxAddress("ddd", "872297557@qq.com")); } else diff --git a/IRaCIS.Core.Application/Service/QC/QCListService.cs b/IRaCIS.Core.Application/Service/QC/QCListService.cs index 2752a9e85..7a7714210 100644 --- a/IRaCIS.Core.Application/Service/QC/QCListService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCListService.cs @@ -5,6 +5,10 @@ using IRaCIS.Core.Application.Contracts.DTO; using IRaCIS.Core.Application.Service; using Microsoft.AspNetCore.Authorization; using IRaCIS.Core.Application.Helper; +using IRaCIS.Application.Interfaces; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using IRaCIS.Application.Contracts; namespace IRaCIS.Core.Application.Image.QA { @@ -12,12 +16,14 @@ namespace IRaCIS.Core.Application.Image.QA public class QCListService : BaseService, IQCListService { private readonly IRepository _subjectVisitRepository; + private readonly IRepository _trialRepository; private readonly IRepository _trialQCQuestionAnswerRepository; - private readonly IRepository _trialQCQuestionRepository; + private readonly IRepository _trialQCQuestionRepository private readonly IRepository _consistencyCheckFileRepository; public QCListService( IRepository subjectVisitRepository, + IRepository trialRepository, IRepository trialQCQuestionAnswerRepository, IRepository trialQCQuestionRepository, IRepository consistencyCheckFileRepository @@ -27,6 +33,7 @@ namespace IRaCIS.Core.Application.Image.QA this._trialQCQuestionAnswerRepository = trialQCQuestionAnswerRepository; this._trialQCQuestionRepository = trialQCQuestionRepository; this._consistencyCheckFileRepository = consistencyCheckFileRepository; + _trialRepository = trialRepository; } @@ -37,17 +44,15 @@ namespace IRaCIS.Core.Application.Image.QA //影像上传列表 [HttpPost] [AllowAnonymous] - public async Task CRCVisitListExport(CRCVisitSearchDTO visitSearchDTO, [FromServices] IRepository _commonDocumentRepository) + public async Task CRCVisitListExport(CRCVisitSearchDTO visitSearchDTO, + [FromServices] IRepository _commonDocumentRepository, + [FromServices] IDictionaryService _dictionaryService) { - //object[] objectList = typeof(CRCVisitExportDTO).GetProperties().Where(t=>t.CustomAttributes.Any(c=>c.AttributeType==typeof(DictionaryTranslateAttribute))) - // .Select(c=>new {c.Name,}) - // ; - var svExpression = QCCommon.GetSubjectVisitFilter(visitSearchDTO.VisitPlanArray); - var list = _repository.Where(x => x.TrialId == visitSearchDTO.TrialId) + var list = await _subjectVisitRepository.Where(x => x.TrialId == visitSearchDTO.TrialId) .Where(t => t.Subject.FinalSubjectVisitId != null ? t.VisitNum <= t.Subject.FinalSubjectVisit.VisitNum : true) .WhereIf(visitSearchDTO.SiteId != null, t => t.SiteId == visitSearchDTO.SiteId) .WhereIf(visitSearchDTO.SubjectId != null, t => t.Subject.Id == visitSearchDTO.SubjectId) @@ -62,14 +67,23 @@ namespace IRaCIS.Core.Application.Image.QA .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + //var needTranslatePropertyList = typeof(CRCVisitExportDTO).GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), false)) + // .Select(c => new { c.Name, DicParentCode = ((DictionaryTranslateAttribute?)c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false)[0])?.DicParentCode }).ToList() + // ; + + //var translateDataList = await _dictionaryService.GetBasicDataSelect(needTranslatePropertyList.Select(t => t.DicParentCode).ToArray()); + + //var obj = new { cc = "aa", list }; + var exportInfo = (await _trialRepository.Where(t => t.Id == visitSearchDTO.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); - //var no = 1; - //exportInfo.TrialSiteUserList.ForEach(t => t.No = no++); + dynamic obj = exportInfo; - return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserList_Export, list, "", _commonDocumentRepository, _hostEnvironment); + ((IDictionary)obj).Add("List", list); + + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialCRCUploadImageList_Export, obj, "", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CRCVisitExportDTO)); } @@ -90,7 +104,7 @@ namespace IRaCIS.Core.Application.Image.QA { var svExpression = QCCommon.GetSubjectVisitFilter(visitSearchDTO.VisitPlanArray); - var query = _repository.Where(x => x.TrialId == visitSearchDTO.TrialId) + var query = _subjectVisitRepository.Where(x => x.TrialId == visitSearchDTO.TrialId) .Where(t => t.Subject.FinalSubjectVisitId != null ? t.VisitNum <= t.Subject.FinalSubjectVisit.VisitNum : true) .WhereIf(visitSearchDTO.SiteId != null, t => t.SiteId == visitSearchDTO.SiteId) .WhereIf(visitSearchDTO.SubjectId != null, t => t.Subject.Id == visitSearchDTO.SubjectId) diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialViewModel.cs index 6985b8b8d..b99f04efc 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialViewModel.cs @@ -73,7 +73,8 @@ namespace IRaCIS.Application.Contracts public string Indication { get; set; } = string.Empty; - public string ResearchProgramNo { get; set; } = string.Empty; + public string ResearchProgramNo { get; set; } = string.Empty; + } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs index 9206d9a83..18e3801a9 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs @@ -104,17 +104,26 @@ namespace IRaCIS.Application.Contracts } - public class TrialUserExportDTO : TrialSelectDTO + public class TrialCRCUploadImageList_Export: ExcelExportTrialInfo + { + + } + + public class ExcelExportTrialInfo : TrialSelectDTO { public DateTime CurrentTime { get; set; } = DateTime.Now; + } + + public class TrialUserExportDTO : ExcelExportTrialInfo + { + public List TrialUserList { get; set; } = new List(); } - public class TrialSiteUserExportDto : TrialSelectDTO + public class TrialSiteUserExportDto : ExcelExportTrialInfo { - public DateTime CurrentTime { get; set; } = DateTime.Now; public List TrialSiteUserList { get; set; } = new List(); } @@ -127,9 +136,8 @@ namespace IRaCIS.Application.Contracts public string TrialSiteAliasName { get; set; } = String.Empty; } - public class TrialSiteUserSummaryExportDto : TrialSelectDTO + public class TrialSiteUserSummaryExportDto : ExcelExportTrialInfo { - public DateTime CurrentTime { get; set; } = DateTime.Now; public List TrialSiteUserList { get; set; } = new List(); diff --git a/IRaCIS.Core.Domain/_Config/_StaticData.cs b/IRaCIS.Core.Domain/_Config/_StaticData.cs index 7e6e7846c..6fe383cb0 100644 --- a/IRaCIS.Core.Domain/_Config/_StaticData.cs +++ b/IRaCIS.Core.Domain/_Config/_StaticData.cs @@ -122,6 +122,8 @@ public static class StaticData public const string TrialSiteUserSummary_Export = "TrialSiteUserSummary_Export"; public const string TrialUserList_Export = "TrialUserList_Export"; + + public const string TrialCRCUploadImageList_Export = "TrialCRCUploadImageList_Export"; }