修改excel和邮件
parent
fd02bc2dd5
commit
54bbfcfab2
|
@ -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.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using MiniExcelLibs;
|
using MiniExcelLibs;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Application.Service;
|
namespace IRaCIS.Core.Application.Service;
|
||||||
|
|
||||||
public static class ExcelExportHelper
|
public static class ExcelExportHelper
|
||||||
{
|
{
|
||||||
//MiniExcel_Export
|
//MiniExcel_Export
|
||||||
public static async Task<IActionResult> DataExportAsync(string code, object data, string exportFileNamePrefix, IRepository<CommonDocument> _commonDocumentRepository, IWebHostEnvironment _hostEnvironment)
|
public static async Task<IActionResult> DataExportAsync(string code, object data, string exportFileNamePrefix, IRepository<CommonDocument> _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<IDictionary<string, object>>(data.ToJsonStr());
|
||||||
|
|
||||||
|
foreach (var key in dic.Keys)
|
||||||
|
{
|
||||||
|
//是数组 那么找到对应的属性 进行翻译
|
||||||
|
if (dic[key].GetType().IsAssignableFrom(typeof(JArray)))
|
||||||
|
{
|
||||||
|
|
||||||
|
var newObjList = new List<object>();
|
||||||
|
var no = 1;
|
||||||
|
|
||||||
|
foreach (var item in dic[key] as JArray)
|
||||||
|
{
|
||||||
|
var itemDic = JsonConvert.DeserializeObject<IDictionary<string, object>>(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);
|
var (physicalPath, fileNmae) = await FileStoreHelper.GetCommonDocPhysicalFilePathAsync(_hostEnvironment, _commonDocumentRepository, code);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ public static class SendEmailHelper
|
||||||
//抄送
|
//抄送
|
||||||
foreach (var copyToMailAddress in sMTPEmailConfig.CopyToMailAddressList)
|
foreach (var copyToMailAddress in sMTPEmailConfig.CopyToMailAddressList)
|
||||||
{
|
{
|
||||||
//messageToSend.Cc.Add(copyToMailAddress);
|
messageToSend.Cc.Add(copyToMailAddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ namespace IRaCIS.Application.Interfaces
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<string> GetBasicDataTranslateItem<T>(string parentCode, T childCode);
|
Task<string> GetBasicDataTranslateItem<T>(string parentCode, T childCode);
|
||||||
|
|
||||||
|
Task<Dictionary<string, List<BasicDicSelect>>> GetBasicDataSelect(string[] searchArray);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
else
|
||||||
|
|
|
@ -5,6 +5,10 @@ using IRaCIS.Core.Application.Contracts.DTO;
|
||||||
using IRaCIS.Core.Application.Service;
|
using IRaCIS.Core.Application.Service;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using IRaCIS.Core.Application.Helper;
|
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
|
namespace IRaCIS.Core.Application.Image.QA
|
||||||
{
|
{
|
||||||
|
@ -12,12 +16,14 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||||
public class QCListService : BaseService, IQCListService
|
public class QCListService : BaseService, IQCListService
|
||||||
{
|
{
|
||||||
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
||||||
|
private readonly IRepository<Trial> _trialRepository;
|
||||||
private readonly IRepository<TrialQCQuestionAnswer> _trialQCQuestionAnswerRepository;
|
private readonly IRepository<TrialQCQuestionAnswer> _trialQCQuestionAnswerRepository;
|
||||||
private readonly IRepository<TrialQCQuestion> _trialQCQuestionRepository;
|
private readonly IRepository<TrialQCQuestion> _trialQCQuestionRepository
|
||||||
private readonly IRepository<ConsistencyCheckFile> _consistencyCheckFileRepository;
|
private readonly IRepository<ConsistencyCheckFile> _consistencyCheckFileRepository;
|
||||||
|
|
||||||
public QCListService(
|
public QCListService(
|
||||||
IRepository<SubjectVisit> subjectVisitRepository,
|
IRepository<SubjectVisit> subjectVisitRepository,
|
||||||
|
IRepository<Trial> trialRepository,
|
||||||
IRepository<TrialQCQuestionAnswer> trialQCQuestionAnswerRepository,
|
IRepository<TrialQCQuestionAnswer> trialQCQuestionAnswerRepository,
|
||||||
IRepository<TrialQCQuestion> trialQCQuestionRepository,
|
IRepository<TrialQCQuestion> trialQCQuestionRepository,
|
||||||
IRepository<ConsistencyCheckFile> consistencyCheckFileRepository
|
IRepository<ConsistencyCheckFile> consistencyCheckFileRepository
|
||||||
|
@ -27,6 +33,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||||
this._trialQCQuestionAnswerRepository = trialQCQuestionAnswerRepository;
|
this._trialQCQuestionAnswerRepository = trialQCQuestionAnswerRepository;
|
||||||
this._trialQCQuestionRepository = trialQCQuestionRepository;
|
this._trialQCQuestionRepository = trialQCQuestionRepository;
|
||||||
this._consistencyCheckFileRepository = consistencyCheckFileRepository;
|
this._consistencyCheckFileRepository = consistencyCheckFileRepository;
|
||||||
|
_trialRepository = trialRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,17 +44,15 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||||
//影像上传列表
|
//影像上传列表
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
public async Task<IActionResult> CRCVisitListExport(CRCVisitSearchDTO visitSearchDTO, [FromServices] IRepository<CommonDocument> _commonDocumentRepository)
|
public async Task<IActionResult> CRCVisitListExport(CRCVisitSearchDTO visitSearchDTO,
|
||||||
|
[FromServices] IRepository<CommonDocument> _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 svExpression = QCCommon.GetSubjectVisitFilter(visitSearchDTO.VisitPlanArray);
|
||||||
|
|
||||||
var list = _repository.Where<SubjectVisit>(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)
|
.Where(t => t.Subject.FinalSubjectVisitId != null ? t.VisitNum <= t.Subject.FinalSubjectVisit.VisitNum : true)
|
||||||
.WhereIf(visitSearchDTO.SiteId != null, t => t.SiteId == visitSearchDTO.SiteId)
|
.WhereIf(visitSearchDTO.SiteId != null, t => t.SiteId == visitSearchDTO.SiteId)
|
||||||
.WhereIf(visitSearchDTO.SubjectId != null, t => t.Subject.Id == visitSearchDTO.SubjectId)
|
.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))
|
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id))
|
||||||
.ProjectTo<CRCVisitExportDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
.ProjectTo<CRCVisitExportDTO>(_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<TrialSelectDTO>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||||
|
|
||||||
|
|
||||||
//var no = 1;
|
dynamic obj = exportInfo;
|
||||||
//exportInfo.TrialSiteUserList.ForEach(t => t.No = no++);
|
|
||||||
|
|
||||||
return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSiteUserList_Export, list, "", _commonDocumentRepository, _hostEnvironment);
|
((IDictionary<string, object>)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 svExpression = QCCommon.GetSubjectVisitFilter(visitSearchDTO.VisitPlanArray);
|
||||||
|
|
||||||
var query = _repository.Where<SubjectVisit>(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)
|
.Where(t => t.Subject.FinalSubjectVisitId != null ? t.VisitNum <= t.Subject.FinalSubjectVisit.VisitNum : true)
|
||||||
.WhereIf(visitSearchDTO.SiteId != null, t => t.SiteId == visitSearchDTO.SiteId)
|
.WhereIf(visitSearchDTO.SiteId != null, t => t.SiteId == visitSearchDTO.SiteId)
|
||||||
.WhereIf(visitSearchDTO.SubjectId != null, t => t.Subject.Id == visitSearchDTO.SubjectId)
|
.WhereIf(visitSearchDTO.SubjectId != null, t => t.Subject.Id == visitSearchDTO.SubjectId)
|
||||||
|
|
|
@ -73,7 +73,8 @@ namespace IRaCIS.Application.Contracts
|
||||||
|
|
||||||
public string Indication { get; set; } = string.Empty;
|
public string Indication { get; set; } = string.Empty;
|
||||||
|
|
||||||
public string ResearchProgramNo { get; set; } = string.Empty;
|
public string ResearchProgramNo { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 DateTime CurrentTime { get; set; } = DateTime.Now;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TrialUserExportDTO : ExcelExportTrialInfo
|
||||||
|
{
|
||||||
|
|
||||||
public List<TrialMaintenanceDTO> TrialUserList { get; set; } = new List<TrialMaintenanceDTO>();
|
public List<TrialMaintenanceDTO> TrialUserList { get; set; } = new List<TrialMaintenanceDTO>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public class TrialSiteUserExportDto : TrialSelectDTO
|
public class TrialSiteUserExportDto : ExcelExportTrialInfo
|
||||||
{
|
{
|
||||||
public DateTime CurrentTime { get; set; } = DateTime.Now;
|
|
||||||
|
|
||||||
public List<SiteUserExportDTO> TrialSiteUserList { get; set; } = new List<SiteUserExportDTO>();
|
public List<SiteUserExportDTO> TrialSiteUserList { get; set; } = new List<SiteUserExportDTO>();
|
||||||
}
|
}
|
||||||
|
@ -127,9 +136,8 @@ namespace IRaCIS.Application.Contracts
|
||||||
public string TrialSiteAliasName { get; set; } = String.Empty;
|
public string TrialSiteAliasName { get; set; } = String.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TrialSiteUserSummaryExportDto : TrialSelectDTO
|
public class TrialSiteUserSummaryExportDto : ExcelExportTrialInfo
|
||||||
{
|
{
|
||||||
public DateTime CurrentTime { get; set; } = DateTime.Now;
|
|
||||||
|
|
||||||
public List<TrialSiteUserSummaryDto> TrialSiteUserList { get; set; } = new List<TrialSiteUserSummaryDto>();
|
public List<TrialSiteUserSummaryDto> TrialSiteUserList { get; set; } = new List<TrialSiteUserSummaryDto>();
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,8 @@ public static class StaticData
|
||||||
public const string TrialSiteUserSummary_Export = "TrialSiteUserSummary_Export";
|
public const string TrialSiteUserSummary_Export = "TrialSiteUserSummary_Export";
|
||||||
|
|
||||||
public const string TrialUserList_Export = "TrialUserList_Export";
|
public const string TrialUserList_Export = "TrialUserList_Export";
|
||||||
|
|
||||||
|
public const string TrialCRCUploadImageList_Export = "TrialCRCUploadImageList_Export";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue