Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC
This commit is contained in:
@@ -13,9 +13,9 @@ using IRaCIS.Core.Domain.Share;
|
||||
using System.Linq.Expressions;
|
||||
using IRaCIS.Core.Infra.EFCore.Common;
|
||||
using System.Linq;
|
||||
using Nito.AsyncEx;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Filter;
|
||||
using Medallion.Threading;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
@@ -31,16 +31,17 @@ namespace IRaCIS.Core.Application.Service
|
||||
private readonly IRepository<SubjectUser> _subjectUserRepository;
|
||||
private readonly IRepository<Subject> _subjectRepository;
|
||||
private readonly IRepository<Enroll> _enrollRepository;
|
||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||
|
||||
private readonly AsyncLock _mutex = new AsyncLock();
|
||||
|
||||
public TaskConsistentRuleService(IRepository<VisitTask> visitTaskRepository, IRepository<Enroll> enrollRepository, IRepository<TaskConsistentRule> taskConsistentRuleRepository, IRepository<SubjectUser> subjectUserRepository, IRepository<Subject> subjectRepository)
|
||||
public TaskConsistentRuleService(IRepository<VisitTask> visitTaskRepository, IRepository<Enroll> enrollRepository, IRepository<TaskConsistentRule> taskConsistentRuleRepository, IRepository<SubjectUser> subjectUserRepository, IRepository<Subject> subjectRepository, IDistributedLockProvider distributedLockProvider)
|
||||
{
|
||||
_taskConsistentRuleRepository = taskConsistentRuleRepository;
|
||||
_visitTaskRepository = visitTaskRepository;
|
||||
_subjectUserRepository = subjectUserRepository;
|
||||
_subjectRepository = subjectRepository;
|
||||
_enrollRepository = enrollRepository;
|
||||
_distributedLockProvider = distributedLockProvider;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -142,7 +143,9 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
//var list = query.OrderByDescending(t => t.IsHaveGeneratedTask).ToList();
|
||||
|
||||
using (await _mutex.LockAsync())
|
||||
var @lock = _distributedLockProvider.CreateLock($"VisitTaskCode");
|
||||
|
||||
using (await @lock.AcquireAsync())
|
||||
{
|
||||
int maxCodeInt = 0;
|
||||
|
||||
@@ -293,7 +296,9 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
var configDoctorUserIdList = await doctorUserIdQuery.ToListAsync();
|
||||
|
||||
using (await _mutex.LockAsync())
|
||||
var @lock = _distributedLockProvider.CreateLock($"VisitTaskCode");
|
||||
|
||||
using (await @lock.AcquireAsync())
|
||||
{
|
||||
int maxCodeInt = 0;
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
{
|
||||
public CriterionType? CriterionTypeEnum { get; set; }
|
||||
public CommonDocumentFileType? FileTypeEnum { get; set; }
|
||||
public CommonDocumentBusinessScenario? BusinessScenarioEnum { get; set; }
|
||||
public EmailBusinessScenario? BusinessScenarioEnum { get; set; }
|
||||
|
||||
public string Name { get; set; } = String.Empty;
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public CriterionType? CriterionTypeEnum { get; set; }
|
||||
public CommonDocumentFileType FileTypeEnum { get; set; }
|
||||
public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
|
||||
public EmailBusinessScenario BusinessScenarioEnum { get; set; }
|
||||
|
||||
|
||||
//public Guid FileTypeId { get; set; }
|
||||
|
||||
@@ -3,10 +3,16 @@
|
||||
// 生成时间 2022-02-15 11:55:57
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
//--------------------------------------------------------------------
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Newtonsoft.Json;
|
||||
namespace IRaCIS.Core.Application.Contracts
|
||||
{
|
||||
public class TrialSelectEmailNoticeConfigView : EmailNoticeConfigView
|
||||
{
|
||||
public bool IsHaveSelected { get; set; }
|
||||
}
|
||||
|
||||
/// <summary> EmailNoticeConfigView 列表视图模型 </summary>
|
||||
public class EmailNoticeConfigView : EmailNoticeConfigAddOrEdit
|
||||
{
|
||||
@@ -19,6 +25,12 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
|
||||
|
||||
public List<EmailUserTypeDto> EmailNoticeUserList { get; set; }
|
||||
|
||||
|
||||
public new List<UserTypeEnum> ToUserTypeList => EmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.To).Select(t => t.UserType).ToList();
|
||||
public new List<UserTypeEnum> CopyUserTypeList => EmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.Copy).Select(t => t.UserType).ToList();
|
||||
|
||||
//[JsonIgnore]
|
||||
//public SystemBasicDataSelect Scenario { get; set; }
|
||||
////public Guid? ScenarioParentId => Scenario.ParentId;
|
||||
@@ -28,17 +40,29 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
}
|
||||
|
||||
public class EmailUserTypeDto
|
||||
{
|
||||
public UserTypeEnum UserType { get; set; }
|
||||
|
||||
public EmailUserType EmailUserType { get; set; }
|
||||
}
|
||||
|
||||
///<summary>EmailNoticeConfigQuery 列表查询参数模型</summary>
|
||||
public class EmailNoticeConfigQuery:PageInput
|
||||
public class EmailNoticeConfigQuery : PageInput
|
||||
{
|
||||
//public Guid? ScenarioId { get; set; }
|
||||
|
||||
public CommonDocumentBusinessScenario? BusinessScenarioEnum { get; set; }
|
||||
public EmailBusinessScenario? BusinessScenarioEnum { get; set; }
|
||||
|
||||
public bool? IsReturnRequired { get; set; }
|
||||
public bool? IsUrgent { get; set; }
|
||||
public bool? IsEnable { get; set; }
|
||||
|
||||
public CriterionType? CriterionTypeEnum { get; set; }
|
||||
|
||||
public Guid? TrialId { get; set; }
|
||||
|
||||
public bool? IsDistinguishCriteria { get; set; }
|
||||
|
||||
}
|
||||
|
||||
///<summary> EmailNoticeConfigAddOrEdit 列表查询参数模型</summary>
|
||||
@@ -47,31 +71,66 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public Guid? Id { get; set; }
|
||||
public string Code { get; set; } = String.Empty;
|
||||
|
||||
|
||||
public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
|
||||
public EmailBusinessScenario BusinessScenarioEnum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否区分标准
|
||||
/// </summary>
|
||||
public bool IsDistinguishCriteria { get; set; }
|
||||
|
||||
|
||||
//public string AuthorizationCode { get; set; } = String.Empty;
|
||||
//public Guid ScenarioId { get; set; }
|
||||
//public string Title { get; set; } = String.Empty;
|
||||
//public string Body { get; set; } = String.Empty;
|
||||
//public string FromEmail { get; set; } = String.Empty;
|
||||
//public string ReceiveEmail { get; set; } = String.Empty;
|
||||
//public string CopyEmail { get; set; } = String.Empty;
|
||||
public bool IsReturnRequired { get; set; }
|
||||
public bool IsUrgent { get; set; }
|
||||
public bool IsEnable { get; set; }
|
||||
public bool IsAutoSend { get; set; }
|
||||
|
||||
public bool IsDeleted { get; set; }
|
||||
|
||||
|
||||
|
||||
public CriterionType? CriterionTypeEnum { get; set; }
|
||||
|
||||
/// <summary> 业务模块 /// </summary>
|
||||
public int BusinessModuleEnum { get; set; }
|
||||
|
||||
/// <summary> 业务层级 /// </summary>
|
||||
public int BusinessLevelEnum { get; set; }
|
||||
|
||||
/// <summary> 邮件类型 /// </summary>
|
||||
public int EmailTypeEnum { get; set; }
|
||||
|
||||
/// <summary> 邮件加急类型 /// </summary>
|
||||
public int EmailUrgentEnum { get; set; }
|
||||
public string Description { get; set; } = string.Empty;
|
||||
|
||||
|
||||
/// <summary> 定时周期 /// </summary>
|
||||
public string EmailCron { get; set; } = string.Empty;
|
||||
|
||||
/// <summary> 邮件主题 /// </summary>
|
||||
public string EmailTopic { get; set; } = string.Empty;
|
||||
|
||||
public string EmailTopicCN { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public string AttachPath { get; set; } = string.Empty;
|
||||
|
||||
public string AttachCNPath { get; set; } = string.Empty;
|
||||
|
||||
public string EmailHtmlContent { get; set; } = string.Empty;
|
||||
|
||||
public string EmailHtmlContentCN { get; set; } = string.Empty;
|
||||
|
||||
public string AttachName { get; set; }
|
||||
public string AttachNameCN { get; set; }
|
||||
|
||||
|
||||
public List<UserTypeEnum> ToUserTypeList { get; set; }
|
||||
public List<UserTypeEnum> CopyUserTypeList { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -259,7 +259,7 @@ namespace IRaCIS.Application.Services
|
||||
public async Task<Dictionary<string, List<BasicDicSelectCopy>>> GetBasicDataSelect(string[] searchArray)
|
||||
{
|
||||
|
||||
var searchList = await _dicRepository.Where(t => searchArray.Contains(t.Parent.Code) && t.ParentId != null && t.IsEnable).ProjectTo<BasicDicSelectCopy>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
var searchList = await _dicRepository.Where(t => searchArray.Contains(t.Parent.Code) && t.ParentId != null && t.IsEnable).ProjectTo<BasicDicSelectCopy>(_mapper.ConfigurationProvider,new { isEn_Us = _userInfo.IsEn_Us}).ToListAsync();
|
||||
|
||||
return searchList.GroupBy(t => t.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
|
||||
|
||||
|
||||
@@ -17,19 +17,22 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public class EmailNoticeConfigService : BaseService, IEmailNoticeConfigService
|
||||
{
|
||||
private readonly IRepository<EmailNoticeConfig> _emailNoticeConfigrepository;
|
||||
private readonly IRepository<EmailNoticeUserType> _emailNoticeUserTypeRepository;
|
||||
|
||||
public EmailNoticeConfigService(IRepository<EmailNoticeConfig> repository)
|
||||
public EmailNoticeConfigService(IRepository<EmailNoticeConfig> repository, IRepository<EmailNoticeUserType> emailNoticeUserTypeRepository)
|
||||
{
|
||||
_emailNoticeConfigrepository = repository;
|
||||
_emailNoticeUserTypeRepository = emailNoticeUserTypeRepository;
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<EmailNoticeConfigView>> GetEmailNoticeConfigList(EmailNoticeConfigQuery queryEmailNoticeConfig)
|
||||
{
|
||||
var emailNoticeConfigQueryable = _emailNoticeConfigrepository
|
||||
.WhereIf(queryEmailNoticeConfig.IsDistinguishCriteria != null, t => t.IsDistinguishCriteria == queryEmailNoticeConfig.IsDistinguishCriteria)
|
||||
.WhereIf(queryEmailNoticeConfig.CriterionTypeEnum != null, t => t.CriterionTypeEnum == queryEmailNoticeConfig.CriterionTypeEnum)
|
||||
.WhereIf(queryEmailNoticeConfig.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == queryEmailNoticeConfig.BusinessScenarioEnum)
|
||||
.WhereIf(queryEmailNoticeConfig.IsReturnRequired != null, t => t.IsReturnRequired == queryEmailNoticeConfig.IsReturnRequired)
|
||||
.WhereIf(queryEmailNoticeConfig.IsUrgent != null, t => t.IsUrgent == queryEmailNoticeConfig.IsUrgent)
|
||||
.WhereIf(queryEmailNoticeConfig.IsEnable != null, t => t.IsEnable == queryEmailNoticeConfig.IsEnable)
|
||||
.ProjectTo<EmailNoticeConfigView>(_mapper.ConfigurationProvider);
|
||||
|
||||
@@ -39,10 +42,55 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
public async Task<IResponseOutput> AddOrUpdateEmailNoticeConfig(EmailNoticeConfigAddOrEdit addOrEditEmailNoticeConfig)
|
||||
{
|
||||
|
||||
var entity = await _emailNoticeConfigrepository.InsertOrUpdateAsync(addOrEditEmailNoticeConfig, true);
|
||||
if (addOrEditEmailNoticeConfig.Id == null)
|
||||
{
|
||||
|
||||
var entity = _mapper.Map<EmailNoticeConfig>(addOrEditEmailNoticeConfig);
|
||||
|
||||
|
||||
foreach (var item in addOrEditEmailNoticeConfig.ToUserTypeList)
|
||||
{
|
||||
entity.EmailNoticeUserTypeList.Add(new EmailNoticeUserType() { EmailUserType = EmailUserType.To, UserType = item });
|
||||
|
||||
}
|
||||
|
||||
foreach (var item in addOrEditEmailNoticeConfig.CopyUserTypeList)
|
||||
{
|
||||
entity.EmailNoticeUserTypeList.Add(new EmailNoticeUserType() { EmailUserType = EmailUserType.Copy, UserType = item });
|
||||
|
||||
}
|
||||
|
||||
|
||||
await _emailNoticeConfigrepository.AddAsync(entity, true);
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
}
|
||||
else
|
||||
{
|
||||
var emailNoticeConfigId = addOrEditEmailNoticeConfig.Id;
|
||||
await _emailNoticeUserTypeRepository.BatchDeleteNoTrackingAsync(t => t.EmailNoticeConfigId == emailNoticeConfigId);
|
||||
|
||||
|
||||
foreach (var item in addOrEditEmailNoticeConfig.ToUserTypeList)
|
||||
{
|
||||
await _emailNoticeUserTypeRepository.AddAsync(new EmailNoticeUserType() { EmailUserType = EmailUserType.To, UserType = item, EmailNoticeConfigId = (Guid)emailNoticeConfigId });
|
||||
|
||||
}
|
||||
|
||||
foreach (var item in addOrEditEmailNoticeConfig.CopyUserTypeList)
|
||||
{
|
||||
await _emailNoticeUserTypeRepository.AddAsync(new EmailNoticeUserType() { EmailUserType = EmailUserType.Copy, UserType = item, EmailNoticeConfigId = (Guid)emailNoticeConfigId });
|
||||
|
||||
}
|
||||
|
||||
|
||||
var entity = await _emailNoticeConfigrepository.UpdateFromDTOAsync(addOrEditEmailNoticeConfig, true);
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
|
||||
|
||||
}
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@ using Microsoft.AspNetCore.Hosting;
|
||||
using IRaCIS.Core.Application.Auth;
|
||||
using AutoMapper;
|
||||
using IRaCIS.Application.Contracts;
|
||||
using Nito.AsyncEx;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Medallion.Threading;
|
||||
|
||||
namespace IRaCIS.Application.Services
|
||||
{
|
||||
@@ -54,8 +54,7 @@ namespace IRaCIS.Application.Services
|
||||
private readonly IRepository<UserType> _userTypeRepository;
|
||||
|
||||
private readonly IRepository<Doctor> _doctorTypeRepository;
|
||||
|
||||
private readonly AsyncLock _mutex = new AsyncLock();
|
||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||
|
||||
private readonly SystemEmailSendConfig _systemEmailConfig;
|
||||
|
||||
@@ -69,7 +68,7 @@ namespace IRaCIS.Application.Services
|
||||
IRepository<Trial> trialRepository,
|
||||
IRepository<UserType> userTypeRepository,
|
||||
IRepository<Doctor> doctorTypeRepository,
|
||||
IMapper mapper, IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig)
|
||||
IMapper mapper, IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig, IDistributedLockProvider distributedLockProvider)
|
||||
{
|
||||
_systemEmailConfig = systemEmailConfig.CurrentValue;
|
||||
_verificationCodeRepository = verificationCodeRepository;
|
||||
@@ -85,7 +84,7 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
_userTypeRepository = userTypeRepository;
|
||||
_doctorTypeRepository = doctorTypeRepository;
|
||||
|
||||
_distributedLockProvider = distributedLockProvider;
|
||||
}
|
||||
|
||||
//重置邮箱
|
||||
@@ -606,7 +605,9 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
var userType = await _userTypeRepository.FirstAsync(t => t.UserTypeEnum == UserTypeEnum.IndependentReviewer);
|
||||
|
||||
using (await _mutex.LockAsync())
|
||||
var @lock = _distributedLockProvider.CreateLock($"UserCode");
|
||||
|
||||
using (await @lock.AcquireAsync())
|
||||
{
|
||||
var isDoctorHaveAccount = await _userRepository.AnyAsync(t => t.DoctorId == doctorId);
|
||||
|
||||
|
||||
@@ -20,7 +20,13 @@ namespace IRaCIS.Core.Application.Service
|
||||
CreateMap<FrontAuditConfig, FrontAuditConfigAddOrEdit>().ReverseMap();
|
||||
|
||||
CreateMap<EmailNoticeConfigAddOrEdit, EmailNoticeConfig>().ReverseMap();
|
||||
CreateMap<EmailNoticeConfig, EmailNoticeConfigView>();
|
||||
var trialId = Guid.Empty;
|
||||
CreateMap<EmailNoticeConfig, TrialSelectEmailNoticeConfigView>().IncludeBase<EmailNoticeConfig, EmailNoticeConfigView>()
|
||||
.ForMember(o => o.IsHaveSelected, t => t.MapFrom(u => u.TrialEmailNoticeConfigList.Any(c => c.TrialId == trialId && c.SysEmailNoticeConfigId == u.Id)))
|
||||
;
|
||||
|
||||
CreateMap<EmailNoticeConfig, EmailNoticeConfigView>()
|
||||
.ForMember(t => t.EmailNoticeUserList, u => u.MapFrom(c => c.EmailNoticeUserTypeList));
|
||||
|
||||
|
||||
CreateMap<SystemBasicData, SystemBasicDataView>();
|
||||
@@ -45,7 +51,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
CreateMap<Dictionary, BasicDicSelectCopy>()
|
||||
.ForMember(o => o.ParentChildCodeEnum, t => t.MapFrom(u => u.Parent.ChildCodeEnum))
|
||||
.ForMember(o => o.Value, t => t.MapFrom(u => u.MappedValue))
|
||||
.ForMember(o => o.Value, t => t.MapFrom(u => isEn_Us? u.Value : u.ValueCN ))
|
||||
.ForMember(o => o.ParentCode, t => t.MapFrom(u => u.Parent.Code));
|
||||
|
||||
CreateMap<Dictionary, BasicDicSelect>()
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
}
|
||||
|
||||
|
||||
public class EmailUserInfoDto
|
||||
public class EmailUserInfoDto
|
||||
{
|
||||
|
||||
public Guid TrialEmailNoticeConfigId { get; set; }
|
||||
@@ -77,7 +77,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
/// <summary>
|
||||
/// SMTP端口
|
||||
/// </summary>
|
||||
public int? EmailSMTPServerPort { get; set; }
|
||||
public int EmailSMTPServerPort { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否配置过邮箱
|
||||
@@ -87,7 +87,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public class SetTrialEmailInDto : GetTrialEmailSetOutDto
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
public class GetTrialEmailSetInDto
|
||||
{
|
||||
@@ -100,7 +100,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
[NotDefault]
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
public CommonDocumentBusinessScenario? BusinessScenarioEnum { get; set; }
|
||||
public EmailBusinessScenario? BusinessScenarioEnum { get; set; }
|
||||
|
||||
//public CriterionType? CriterionTypeEnum { get; set; }
|
||||
|
||||
@@ -117,51 +117,98 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
|
||||
public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
|
||||
public EmailBusinessScenario BusinessScenarioEnum { get; set; }
|
||||
}
|
||||
|
||||
///<summary> TrialEmailNoticeConfigAddOrEdit 列表查询参数模型</summary>
|
||||
public class TrialEmailNoticeConfigAddOrEdit
|
||||
public class BatchAddTrialEmailNoticeConfig
|
||||
{
|
||||
|
||||
|
||||
|
||||
public Guid? Id { get; set; }
|
||||
|
||||
public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
|
||||
public EmailBusinessScenario BusinessScenarioEnum { get; set; }
|
||||
|
||||
public string Code { get; set; } = string.Empty;
|
||||
|
||||
public Guid? TrialReadingCriterionId { get; set; }
|
||||
|
||||
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
public string AuthorizationCode { get; set; } = string.Empty;
|
||||
|
||||
public string SMTPServerAddress { get; set; } = string.Empty;
|
||||
|
||||
public int SMTPServerPort { get; set; }
|
||||
|
||||
public CriterionType CriterionTypeEnum { get; set; }
|
||||
|
||||
public string FromName { get; set; } = string.Empty;
|
||||
|
||||
public string FromEmail { get; set; } = string.Empty;
|
||||
public CriterionType? CriterionTypeEnum { get; set; }
|
||||
|
||||
|
||||
public List<UserTypeEnum>? ToUserTypeList { get; set; }
|
||||
public List<UserTypeEnum> ToUserTypeList { get; set; }
|
||||
public List<UserTypeEnum> CopyUserTypeList { get; set; }
|
||||
|
||||
|
||||
|
||||
public bool IsUrgent { get; set; }
|
||||
|
||||
public bool IsEnable { get; set; }
|
||||
public bool IsAutoSend { get; set; }
|
||||
|
||||
|
||||
public bool IsReturnRequired { get; set; }
|
||||
|
||||
public string FilePath { get; set; } = string.Empty;
|
||||
public string FileName { get; set; } = string.Empty;
|
||||
|
||||
|
||||
/// <summary> 业务模块 /// </summary>
|
||||
public int BusinessModuleEnum { get; set; }
|
||||
|
||||
/// <summary> 业务层级 /// </summary>
|
||||
public int BusinessLevelEnum { get; set; }
|
||||
|
||||
/// <summary> 邮件类型 /// </summary>
|
||||
public int EmailTypeEnum { get; set; }
|
||||
|
||||
/// <summary> 邮件加急类型 /// </summary>
|
||||
public int EmailUrgentEnum { get; set; }
|
||||
|
||||
/// <summary> 定时周期 /// </summary>
|
||||
public string EmailCron { get; set; } = string.Empty;
|
||||
|
||||
/// <summary> 邮件主题 /// </summary>
|
||||
public string EmailTopic { get; set; } = string.Empty;
|
||||
|
||||
public string EmailTopicCN { get; set; } = string.Empty;
|
||||
|
||||
/// <summary> 附件 /// </summary>
|
||||
public string AttachPath { get; set; } = string.Empty;
|
||||
|
||||
public string AttachCNPath { get; set; } = string.Empty;
|
||||
|
||||
public string Description { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public string AttachName { get; set; } = string.Empty;
|
||||
public string AttachNameCN { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public string EmailHtmlContent { get; set; } = string.Empty;
|
||||
public string EmailHtmlContentCN { get; set; } = string.Empty;
|
||||
|
||||
}
|
||||
|
||||
|
||||
///<summary> TrialEmailNoticeConfigAddOrEdit 列表查询参数模型</summary>
|
||||
public class TrialEmailNoticeConfigAddOrEdit : BatchAddTrialEmailNoticeConfig
|
||||
{
|
||||
|
||||
public Guid? TrialReadingCriterionId { get; set; }
|
||||
|
||||
|
||||
public string AuthorizationCode { get; set; } = string.Empty;
|
||||
|
||||
public string SMTPServerAddress { get; set; } = string.Empty;
|
||||
|
||||
public int SMTPServerPort { get; set; }
|
||||
|
||||
|
||||
public string FromName { get; set; } = string.Empty;
|
||||
|
||||
public string FromEmail { get; set; } = string.Empty;
|
||||
|
||||
public List<Guid> BlackUserIdList { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,403 @@
|
||||
using DocumentFormat.OpenXml.EMMA;
|
||||
using DocumentFormat.OpenXml.Spreadsheet;
|
||||
using IRaCIS.Application.Contracts;
|
||||
using IRaCIS.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using MailKit;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Microsoft.VisualBasic;
|
||||
using MimeKit;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Mail;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
|
||||
public interface IEmailSendService
|
||||
{
|
||||
Task SendEnrollOrPdEmail(Guid visitTaskId, bool? isEnrollment, bool? isPDConfirm);
|
||||
Task SendTrialImageQCTaskEmailAsync(Guid trialId);
|
||||
|
||||
Task SendTrialQCQuestionEmailAsync(Guid trialId);
|
||||
Task SendTrialImageQuestionAsync(Guid trialId);
|
||||
}
|
||||
|
||||
public class EmailSendService : BaseService, IEmailSendService
|
||||
{
|
||||
private readonly IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository;
|
||||
|
||||
private readonly IRepository<EmailNoticeConfig> _emailNoticeConfigRepository;
|
||||
|
||||
private readonly IRepository<Trial> _trialRepository;
|
||||
|
||||
private readonly IDictionaryService _dictionaryService;
|
||||
private readonly IOptionsMonitor<SystemEmailSendConfig> _SystemEmailSendConfig;
|
||||
|
||||
public readonly static string EmailNamePlaceholder = "EmailNamePlaceholder";
|
||||
|
||||
public EmailSendService(IRepository<TrialEmailNoticeConfig> trialEmailNoticeConfigRepository, IRepository<EmailNoticeConfig> emailNoticeConfigRepository, IRepository<Trial> trialRepository, IOptionsMonitor<SystemEmailSendConfig> systemEmailSendConfig, IDictionaryService dictionaryService)
|
||||
{
|
||||
_trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository;
|
||||
_emailNoticeConfigRepository = emailNoticeConfigRepository;
|
||||
_trialRepository = trialRepository;
|
||||
_SystemEmailSendConfig = systemEmailSendConfig;
|
||||
_dictionaryService = dictionaryService;
|
||||
}
|
||||
|
||||
//入组确认/PD确认
|
||||
|
||||
public async Task SendEnrollOrPdEmail(Guid visitTaskId, bool? isEnrollment, bool? isPDConfirm)
|
||||
{
|
||||
EmailBusinessScenario businessScenarioEnum;
|
||||
|
||||
bool? result = null;
|
||||
|
||||
if (isEnrollment != null && isPDConfirm == null)
|
||||
{
|
||||
businessScenarioEnum = EmailBusinessScenario.EnrollConfirmed;
|
||||
|
||||
result = isEnrollment;
|
||||
}
|
||||
else
|
||||
{
|
||||
businessScenarioEnum = EmailBusinessScenario.PDConfirmed;
|
||||
|
||||
result = isPDConfirm;
|
||||
}
|
||||
|
||||
var taskInfo = await _repository.Where<VisitTask>(t => t.Id == visitTaskId).Select(t => new
|
||||
{
|
||||
t.Subject.SiteId,
|
||||
t.Trial.ResearchProgramNo,
|
||||
t.Subject.TrialSite.TrialSiteCode,
|
||||
SubjectCode = t.Subject.Code,
|
||||
t.Trial.Sponsor.SponsorName,
|
||||
t.SourceSubjectVisit.VisitName,
|
||||
t.TrialId,
|
||||
|
||||
}).FirstNotNullAsync();
|
||||
|
||||
var isEn_us = _userInfo.IsEn_Us;
|
||||
|
||||
var resultStr = isEn_us ? (result == true ? "Yes" : "No") : (result == true ? "是" : "否");
|
||||
|
||||
if (isEnrollment == true)
|
||||
{
|
||||
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc = trialEmailConfig =>
|
||||
{
|
||||
var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode);
|
||||
|
||||
var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
|
||||
EmailNamePlaceholder, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, resultStr);
|
||||
return (topicStr, htmlBodyStr, isEn_us, null);
|
||||
};
|
||||
|
||||
await SendTrialEmailAsync(taskInfo.TrialId, businessScenarioEnum, topicAndHtmlFunc, taskInfo.SiteId);
|
||||
}
|
||||
else
|
||||
{
|
||||
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc = trialEmailConfig =>
|
||||
{
|
||||
var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, taskInfo.VisitName);
|
||||
|
||||
var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
|
||||
EmailNamePlaceholder, taskInfo.ResearchProgramNo, taskInfo.SubjectCode, taskInfo.VisitName, resultStr);
|
||||
|
||||
return (topicStr, htmlBodyStr, isEn_us, null);
|
||||
};
|
||||
|
||||
await SendTrialEmailAsync(taskInfo.TrialId, businessScenarioEnum, topicAndHtmlFunc, taskInfo.SiteId);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 影像质控
|
||||
/// </summary>
|
||||
/// <param name="trialId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task SendTrialImageQCTaskEmailAsync(Guid trialId)
|
||||
{
|
||||
var isEn_us = false;
|
||||
var trialInfo = await _repository.Where<Trial>(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstNotNullAsync();
|
||||
|
||||
//找到 该项目的IQC 用户Id
|
||||
var userList = await _repository.Where<TrialUser>(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.User.FullName }).ToListAsync();
|
||||
|
||||
//判断是否任务可以领取 ,可以的话 发送邮件
|
||||
var userIdList = userList.Select(t => t.UserId).ToList();
|
||||
|
||||
foreach (var user in userList)
|
||||
{
|
||||
var userId = user.UserId;
|
||||
|
||||
//过滤项目 并且 将 _userInfo.Id 换位 当前发送邮件的Id
|
||||
var query = _trialRepository.Where(t => t.Id == trialId)
|
||||
.Where(t => t.QCProcessEnum != TrialQCProcess.NotAudit)
|
||||
.Select(t => new
|
||||
{
|
||||
//待领取量
|
||||
ToBeClaimedCount = t.SubjectVisitList.Where(u => u.SubmitState == SubmitStateEnum.Submitted && u.CurrentActionUserId == null && (u.PreliminaryAuditUserId == null || (u.PreliminaryAuditUserId != userId && u.ReviewAuditUserId == null))).Count(),
|
||||
|
||||
//待审核通过,统计从已领取到QC提交之间的 已领取 待审核 审核中 (审核完成 领取人就会清理 所以只用查询当前领取人是自己的就好了)
|
||||
ToBeReviewedCount = t.SubjectVisitList.Where(u => u.CurrentActionUserId == userId).Count()
|
||||
|
||||
});
|
||||
|
||||
var sendStat = await query.FirstOrDefaultAsync();
|
||||
|
||||
//当前人 有待领取的或者有待审核的才发邮件
|
||||
if (sendStat != null && (sendStat.ToBeClaimedCount > 0 || sendStat.ToBeReviewedCount > 0))
|
||||
{
|
||||
|
||||
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc = trialEmailConfig =>
|
||||
{
|
||||
var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
|
||||
var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
|
||||
user.FullName, DateTime.Now, sendStat.ToBeClaimedCount, sendStat.ToBeReviewedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
|
||||
return (topicStr, htmlBodyStr, false, userId);
|
||||
};
|
||||
|
||||
await SendTrialEmailAsync(trialId, EmailBusinessScenario.QCTask, topicAndHtmlFunc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// QC质疑
|
||||
/// </summary>
|
||||
/// <param name="trialId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task SendTrialQCQuestionEmailAsync(Guid trialId)
|
||||
{
|
||||
var isEn_us = false;
|
||||
var trialInfo = _repository.Where<Trial>(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr, t.DeclarationTypeEnumList }).FirstOrDefault();
|
||||
|
||||
//找到 该项目的IQC 用户Id
|
||||
var userList = await _repository.Where<TrialUser>(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).Select(t => new { t.UserId, t.User.FullName }).ToListAsync();
|
||||
|
||||
//判断是否任务可以领取 ,可以的话 发送邮件
|
||||
|
||||
foreach (var user in userList)
|
||||
{
|
||||
var userId = user.UserId;
|
||||
|
||||
//过滤项目 并且 将 _userInfo.Id 换位 当前发送邮件的Id
|
||||
var query = _trialRepository
|
||||
.Where(t => t.Id == trialId)
|
||||
.Select(t => new
|
||||
{
|
||||
ReUploadTobeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
|
||||
.Where(u => u.CreateUserId == userId && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && u.ReuploadEnum == QCChanllengeReuploadEnum.CRCRequestReupload).Count(),
|
||||
|
||||
//质疑待处理 发送邮件的时候 需要减去ReUploadTobeDealedCount
|
||||
ToBeDealedCount = t.SubjectVisitList.SelectMany(c => c.QCChallengeList)
|
||||
.Where(u => u.CreateUserId == userId && u.IsClosed == false && u.LatestReplyUser.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count(),
|
||||
});
|
||||
|
||||
var sendStat = await query.FirstOrDefaultAsync();
|
||||
|
||||
//当前人
|
||||
if (sendStat != null && (sendStat.ToBeDealedCount > 0 || sendStat.ReUploadTobeDealedCount > 0))
|
||||
{
|
||||
|
||||
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc = trialEmailConfig =>
|
||||
{
|
||||
var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
|
||||
var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
|
||||
|
||||
user.FullName, DateTime.Now, sendStat.ToBeDealedCount - sendStat.ReUploadTobeDealedCount, sendStat.ReUploadTobeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
|
||||
return (topicStr, htmlBodyStr, false, userId);
|
||||
};
|
||||
|
||||
await SendTrialEmailAsync(trialId, EmailBusinessScenario.QCQuestion, topicAndHtmlFunc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 影像质疑
|
||||
/// </summary>
|
||||
/// <param name="trialId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task SendTrialImageQuestionAsync(Guid trialId)
|
||||
{
|
||||
var isEn_us = false;
|
||||
|
||||
var trialInfo = _repository.Where<Trial>(t => t.Id == trialId).Select(t => new { t.ResearchProgramNo, t.ExperimentName, t.TrialCode, t.TrialStatusStr }).FirstOrDefault();
|
||||
|
||||
//找到 该项目的CRC 用户Id
|
||||
var userList = await _repository.Where<TrialUser>(t => t.TrialId == trialId).Where(t => t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Select(t => new { t.UserId, t.User.FullName }).ToListAsync();
|
||||
|
||||
//判断是否任务可以领取 ,可以的话 发送邮件
|
||||
|
||||
foreach (var user in userList)
|
||||
{
|
||||
var userId = user.UserId;
|
||||
//过滤项目 并且 将 _userInfo.Id 换位 当前发送邮件的Id
|
||||
var query = _trialRepository.Where(t => t.Id == trialId)
|
||||
|
||||
.Select(t => new
|
||||
{
|
||||
//质疑待处理
|
||||
ToBeDealedCount = t.SubjectVisitList.Where(t => t.TrialSite.CRCUserList.Any(t => t.UserId == userId)).SelectMany(c => c.QCChallengeList)
|
||||
.Where(u => u.IsClosed == false && (u.LatestReplyUser.UserTypeEnum == UserTypeEnum.IQC || u.LatestReplyUserId == null)).Count(),
|
||||
|
||||
});
|
||||
|
||||
var sendStat = await query.FirstOrDefaultAsync();
|
||||
|
||||
//当前人
|
||||
if (sendStat != null && (sendStat.ToBeDealedCount > 0))
|
||||
{
|
||||
|
||||
Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc = trialEmailConfig =>
|
||||
{
|
||||
var topicStr = string.Format(isEn_us ? trialEmailConfig.EmailTopic : trialEmailConfig.EmailTopicCN, trialInfo.ResearchProgramNo);
|
||||
var htmlBodyStr = string.Format(isEn_us ? trialEmailConfig.EmailHtmlContent : trialEmailConfig.EmailHtmlContentCN,
|
||||
user.FullName, DateTime.Now, sendStat.ToBeDealedCount, _SystemEmailSendConfig.CurrentValue.SiteUrl);
|
||||
return (topicStr, htmlBodyStr, isEn_us, userId);
|
||||
};
|
||||
|
||||
await SendTrialEmailAsync(trialId, EmailBusinessScenario.ImageQuestion, topicAndHtmlFunc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public async Task SendTrialEmailAsync(Guid trialId, EmailBusinessScenario businessScenario, Func<TrialEmailNoticeConfig, (string topicStr, string htmlBodyStr, bool isEn_us, Guid? onlyToUserId)> topicAndHtmlFunc, Guid? siteId = null, Guid? trialReadingCriterionId = null)
|
||||
{
|
||||
//找到配置
|
||||
var trialEmailConfig = await _trialEmailNoticeConfigRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionId && t.BusinessScenarioEnum == businessScenario, ignoreQueryFilters: true)
|
||||
.Include(t => t.TrialEmailNoticeUserList).Include(t => t.TrialEmailBlackUserList).FirstOrDefaultAsync();
|
||||
|
||||
|
||||
if (trialEmailConfig == null || trialEmailConfig.IsAutoSend == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
var sendEmailConfig = new SMTPEmailConfig();
|
||||
|
||||
var (topicStr, htmlBodyStr, isEn_us, onlyToUserId) = topicAndHtmlFunc(trialEmailConfig);
|
||||
|
||||
|
||||
sendEmailConfig.TopicDescription = topicStr;
|
||||
sendEmailConfig.HtmlBodyStr = htmlBodyStr;
|
||||
|
||||
|
||||
var blackUserIdList = trialEmailConfig.TrialEmailBlackUserList.Select(t => t.UserId).ToList();
|
||||
|
||||
|
||||
var toUserTypeEnumList = trialEmailConfig.TrialEmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.To).Select(c => c.UserType).ToList();
|
||||
|
||||
var copyUserTypeEnumList = trialEmailConfig.TrialEmailNoticeUserList.Where(t => t.EmailUserType == EmailUserType.Copy).Select(c => c.UserType).ToList();
|
||||
|
||||
var allUserTypeEnumList = toUserTypeEnumList.Union(copyUserTypeEnumList).Distinct().ToList();
|
||||
|
||||
var allUserList = await _repository.Where<TrialUser>(t => t.TrialId == trialId && allUserTypeEnumList.Contains(t.User.UserTypeEnum)).Select(t => new { t.UserId, t.User.EMail, t.User.FullName, t.User.UserTypeEnum }).ToListAsync();
|
||||
|
||||
|
||||
var toUserList = allUserList.Where(t => toUserTypeEnumList.Contains(t.UserTypeEnum))
|
||||
.ToList();
|
||||
|
||||
//收件人 有CRC CRA , CRC CRA的账户要按照中心发送
|
||||
if (siteId == null && toUserTypeEnumList.Any(t => t == UserTypeEnum.ClinicalResearchCoordinator || t == UserTypeEnum.CRA) && onlyToUserId == null)
|
||||
{
|
||||
throw new BusinessValidationFailedException("当前场景收件人包含CRC CRA,但是没有siteId,请联系后端开发");
|
||||
}
|
||||
if (siteId != null && toUserTypeEnumList.Any(t => t == UserTypeEnum.ClinicalResearchCoordinator || t == UserTypeEnum.CRA))
|
||||
{
|
||||
var curentSiteUserIdList = _repository.Where<TrialSiteUser>(t => t.TrialId == trialId && t.SiteId == siteId).Select(t => t.UserId).ToList();
|
||||
|
||||
toUserList = toUserList.Where(t => (t.UserTypeEnum != UserTypeEnum.CRA && t.UserTypeEnum != UserTypeEnum.ClinicalResearchCoordinator) || curentSiteUserIdList.Contains(t.UserId)).ToList();
|
||||
}
|
||||
|
||||
|
||||
//去除黑名单
|
||||
toUserList = toUserList.Where(t => !blackUserIdList.Contains(t.UserId)).ToList();
|
||||
|
||||
var copyUserList = allUserList.Where(t => copyUserTypeEnumList.Contains(t.UserTypeEnum))
|
||||
.Where(t => !blackUserIdList.Contains(t.UserId)).ToList();
|
||||
|
||||
if (siteId != null && copyUserTypeEnumList.Any(t => t == UserTypeEnum.ClinicalResearchCoordinator || t == UserTypeEnum.CRA))
|
||||
{
|
||||
var curentSiteUserIdList = _repository.Where<TrialSiteUser>(t => t.TrialId == trialId && t.SiteId == siteId).Select(t => t.UserId).ToList();
|
||||
|
||||
copyUserList = copyUserList.Where(t => (t.UserTypeEnum != UserTypeEnum.CRA && t.UserTypeEnum != UserTypeEnum.ClinicalResearchCoordinator) || curentSiteUserIdList.Contains(t.UserId)).ToList();
|
||||
}
|
||||
|
||||
if (onlyToUserId != null)
|
||||
{
|
||||
toUserList = toUserList.Where(t => t.UserId == onlyToUserId).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
sendEmailConfig.HtmlBodyStr = htmlBodyStr.Replace(EmailNamePlaceholder, string.Join(isEn_us ? ", " : "、", toUserList.Select(t => t.FullName).ToList()));
|
||||
}
|
||||
|
||||
if (toUserList.Count() == 0)
|
||||
{
|
||||
//---没有收件人,无法发送邮件
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_NoRecipient"]);
|
||||
}
|
||||
|
||||
|
||||
if (trialEmailConfig.FromEmail.Contains("@") && !string.IsNullOrEmpty(trialEmailConfig.FromEmail))
|
||||
{
|
||||
|
||||
sendEmailConfig.FromEmailAddress = new MimeKit.MailboxAddress(trialEmailConfig.FromName, trialEmailConfig.FromEmail);
|
||||
sendEmailConfig.AuthorizationCode = trialEmailConfig.AuthorizationCode;
|
||||
sendEmailConfig.UserName = trialEmailConfig.FromEmail;
|
||||
|
||||
sendEmailConfig.Host = trialEmailConfig.SMTPServerAddress;
|
||||
sendEmailConfig.Port = trialEmailConfig.SMTPServerPort;
|
||||
}
|
||||
else
|
||||
{
|
||||
//---项目发件邮箱配置有误,请核实
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidEmailConfig"]);
|
||||
}
|
||||
|
||||
foreach (var item in toUserList)
|
||||
{
|
||||
|
||||
if (item.EMail.Contains("@") && !string.IsNullOrEmpty(item.EMail))
|
||||
{
|
||||
|
||||
sendEmailConfig.ToMailAddressList.Add(new MimeKit.MailboxAddress(item.FullName, item.EMail));
|
||||
|
||||
}
|
||||
}
|
||||
foreach (var item in copyUserList)
|
||||
{
|
||||
|
||||
if (item.EMail.Contains("@") && !string.IsNullOrEmpty(item.EMail))
|
||||
{
|
||||
|
||||
sendEmailConfig.CopyToMailAddressList.Add(new MimeKit.MailboxAddress(item.FullName, item.EMail));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
await SendEmailHelper.SendEmailAsync(sendEmailConfig);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -170,7 +170,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
SignViewMinimumMinutes = sysDoc.SignViewMinimumMinutes,
|
||||
Name = sysDoc.Name,
|
||||
Path = sysDoc.Path,
|
||||
FileType = sysDoc.FileType.MappedValue,
|
||||
FileType = _userInfo.IsEn_Us? sysDoc.FileType.Value: sysDoc.FileType.ValueCN,
|
||||
UpdateTime = sysDoc.UpdateTime,
|
||||
|
||||
FullFilePath = sysDoc.Path ,
|
||||
|
||||
@@ -60,7 +60,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
var trialDocumentQueryable = _trialDocumentRepository.AsQueryable(true).Where(t => t.TrialId == queryTrialDocument.TrialId)
|
||||
.WhereIf(!string.IsNullOrEmpty(queryTrialDocument.Name), t => t.Name.Contains(queryTrialDocument.Name))
|
||||
.WhereIf(queryTrialDocument.FileTypeId != null, t => t.FileTypeId == queryTrialDocument.FileTypeId)
|
||||
.ProjectTo<TrialDocumentView>(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken });
|
||||
.ProjectTo<TrialDocumentView>(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken, isEn_Us=_userInfo.IsEn_Us });
|
||||
|
||||
return await trialDocumentQueryable.ToPagedListAsync(queryTrialDocument.PageIndex, queryTrialDocument.PageSize, queryTrialDocument.SortField, queryTrialDocument.Asc);
|
||||
}
|
||||
@@ -187,7 +187,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
Name = needConfirmedUserType.SystemDocument.Name,
|
||||
Path = needConfirmedUserType.SystemDocument.Path,
|
||||
FileTypeId = needConfirmedUserType.SystemDocument.FileTypeId,
|
||||
FileType = needConfirmedUserType.SystemDocument.FileType.MappedValue,
|
||||
FileType = _userInfo.IsEn_Us? needConfirmedUserType.SystemDocument.FileType.Value: needConfirmedUserType.SystemDocument.FileType.ValueCN,
|
||||
UpdateTime = needConfirmedUserType.SystemDocument.UpdateTime,
|
||||
|
||||
FullFilePath = needConfirmedUserType.SystemDocument.Path ,
|
||||
@@ -219,7 +219,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
Name = trialDoc.Name,
|
||||
Path = trialDoc.Path,
|
||||
FileTypeId = trialDoc.FileTypeId,
|
||||
FileType = trialDoc.FileType.MappedValue,
|
||||
FileType = _userInfo.IsEn_Us ? trialDoc.FileType.Value: trialDoc.FileType.ValueCN,
|
||||
UpdateTime = trialDoc.UpdateTime,
|
||||
SignViewMinimumMinutes = trialDoc.SignViewMinimumMinutes,
|
||||
|
||||
@@ -333,7 +333,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
Name = trialDocumentNeedConfirmedUserType.TrialDocument.Name,
|
||||
Path = trialDocumentNeedConfirmedUserType.TrialDocument.Path,
|
||||
FileTypeId = trialDocumentNeedConfirmedUserType.TrialDocument.FileTypeId,
|
||||
FileType = trialDocumentNeedConfirmedUserType.TrialDocument.FileType.MappedValue,
|
||||
FileType = _userInfo.IsEn_Us ? trialDocumentNeedConfirmedUserType.TrialDocument.FileType.Value : trialDocumentNeedConfirmedUserType.TrialDocument.FileType.ValueCN,
|
||||
UpdateTime = trialDocumentNeedConfirmedUserType.TrialDocument.UpdateTime,
|
||||
|
||||
|
||||
@@ -367,7 +367,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
SignViewMinimumMinutes = needConfirmEdUserType.SystemDocument.SignViewMinimumMinutes,
|
||||
Name = needConfirmEdUserType.SystemDocument.Name,
|
||||
Path = needConfirmEdUserType.SystemDocument.Path,
|
||||
FileType = needConfirmEdUserType.SystemDocument.FileType.MappedValue,
|
||||
FileType = _userInfo.IsEn_Us ? needConfirmEdUserType.SystemDocument.FileType.Value : needConfirmEdUserType.SystemDocument.FileType.ValueCN,
|
||||
FileTypeId = needConfirmEdUserType.SystemDocument.FileTypeId,
|
||||
UpdateTime = needConfirmEdUserType.SystemDocument.UpdateTime,
|
||||
|
||||
|
||||
@@ -32,30 +32,41 @@ namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
|
||||
private readonly IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository;
|
||||
private readonly IRepository<TrialEmailBlackUser> _trialEmailBlackUserRepository;
|
||||
private readonly IRepository<EmailNoticeConfig> _emailNoticeConfigRepository;
|
||||
|
||||
|
||||
private readonly IRepository<Trial> _trialRepository;
|
||||
|
||||
private readonly IRepository<TaskMedicalReview> _taskMedicalReviewRepository;
|
||||
private readonly IRepository<VisitTask> _visitTaskRepository;
|
||||
private readonly IRepository<TrialUser> _trialUserRepository;
|
||||
private readonly IRepository<Subject> _subjectRepository;
|
||||
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
||||
|
||||
public IRepository<VisitTask> _visitTaskRepository { get; }
|
||||
public IRepository<TrialUser> _trialUserRepository { get; }
|
||||
|
||||
public IRepository<Subject> _subjectRepository { get; }
|
||||
|
||||
public IRepository<SubjectVisit> _subjectVisitRepository { get; }
|
||||
|
||||
public TrialEmailNoticeConfigService(IRepository<TrialEmailNoticeConfig> trialEmailNoticeConfigRepository, IRepository<VisitTask> visitTaskRepository,
|
||||
public TrialEmailNoticeConfigService(
|
||||
IRepository<TrialEmailNoticeConfig> trialEmailNoticeConfigRepository,
|
||||
IRepository<VisitTask> visitTaskRepository,
|
||||
IRepository<Trial> trialRepository,
|
||||
IRepository<TrialUser> trialUserRepository, IRepository<TaskMedicalReview> taskMedicalReviewRepository, IRepository<Subject> subjectRepository, IRepository<SubjectVisit> subjectVisitRepository)
|
||||
IRepository<TrialUser> trialUserRepository,
|
||||
IRepository<TaskMedicalReview> taskMedicalReviewRepository,
|
||||
IRepository<Subject> subjectRepository,
|
||||
IRepository<SubjectVisit> subjectVisitRepository,
|
||||
IRepository<TrialEmailBlackUser> trialEmailBlackUserRepository,
|
||||
IRepository<EmailNoticeConfig> emailNoticeConfigRepository
|
||||
)
|
||||
{
|
||||
_trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository;
|
||||
_visitTaskRepository = visitTaskRepository;
|
||||
this._trialRepository = trialRepository;
|
||||
_trialRepository = trialRepository;
|
||||
_trialUserRepository = trialUserRepository;
|
||||
_taskMedicalReviewRepository = taskMedicalReviewRepository;
|
||||
_subjectRepository = subjectRepository;
|
||||
|
||||
_subjectVisitRepository = subjectVisitRepository;
|
||||
_trialEmailBlackUserRepository = trialEmailBlackUserRepository;
|
||||
_emailNoticeConfigRepository = emailNoticeConfigRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -66,7 +77,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
[HttpPost]
|
||||
public async Task<GetTrialEmailSetOutDto> GetTrialEmail(GetTrialEmailSetInDto inDto)
|
||||
{
|
||||
return await _trialRepository.Where(x => x.Id == inDto.TrialId).Select(x => new GetTrialEmailSetOutDto()
|
||||
return await _trialRepository.Where(x => x.Id == inDto.TrialId, ignoreQueryFilters: true).Select(x => new GetTrialEmailSetOutDto()
|
||||
{
|
||||
TrialId = inDto.TrialId,
|
||||
EmailAuthorizationCode = x.EmailAuthorizationCode,
|
||||
@@ -76,7 +87,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
IsConfigureEmail = x.IsConfigureEmail,
|
||||
EmailSMTPServerPort = x.EmailSMTPServerPort
|
||||
|
||||
}).FirstNotNullAsync();
|
||||
}).FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -94,7 +105,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
FromEmail = inDto.EmailFromEmail,
|
||||
FromName = inDto.EmailFromName,
|
||||
SMTPServerAddress = inDto.EmailSMTPServerAddress,
|
||||
SMTPServerPort = inDto.EmailSMTPServerPort.Value,
|
||||
SMTPServerPort = inDto.EmailSMTPServerPort,
|
||||
TrialId = inDto.TrialId,
|
||||
});
|
||||
|
||||
@@ -117,7 +128,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
FromEmail = inDto.EmailFromEmail,
|
||||
FromName = inDto.EmailFromName,
|
||||
SMTPServerAddress = inDto.EmailSMTPServerAddress,
|
||||
SMTPServerPort = inDto.EmailSMTPServerPort.Value,
|
||||
SMTPServerPort = inDto.EmailSMTPServerPort,
|
||||
});
|
||||
|
||||
await _trialRepository.SaveChangesAsync();
|
||||
@@ -125,7 +136,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 同步系统配置的文档到想项目中
|
||||
/// 同步系统配置的文档到想项目中 ---废弃
|
||||
/// </summary>
|
||||
/// <param name="trialId"></param>
|
||||
/// <returns></returns>
|
||||
@@ -139,7 +150,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
|
||||
//只要有系统标准的文档 说明同步过了
|
||||
var trialDocCount = _trialEmailNoticeConfigRepository.Where(t =>/* t.CriterionTypeEnum == criterionTypeEnum &&*/ t.TrialId == trialId && t.TrialReadingCriterionId != null).Count();
|
||||
var trialDocCount = _trialEmailNoticeConfigRepository.Where(t => t.TrialId == trialId).Count();
|
||||
|
||||
if (trialDocCount == 0)
|
||||
{
|
||||
@@ -148,7 +159,10 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
var confirmedCriterionTypeList = list.Select(t => (CriterionType?)t.CriterionType).ToList();
|
||||
|
||||
var docmentList = _repository.Where<CommonDocument>(t => confirmedCriterionTypeList.Contains(t.CriterionTypeEnum)).Select(t => new { t.Path, t.Name, t.Code, t.BusinessScenarioEnum, t.CriterionTypeEnum }).ToList();
|
||||
var docmentList = _repository.Where<TrialEmailNoticeConfig>(t => t.BusinessScenarioEnum == EmailBusinessScenario.EnrollConfirmed || t.BusinessScenarioEnum == EmailBusinessScenario.PDConfirmed)
|
||||
//.Where(t => (confirmedCriterionTypeList.Contains(t.CriterionTypeEnum)) || t.CriterionTypeEnum == null).Select(t => new { t.Path, t.Name, t.Code, t.BusinessScenarioEnum, t.CriterionTypeEnum })
|
||||
.ToList();
|
||||
|
||||
|
||||
|
||||
foreach (var item in docmentList)
|
||||
@@ -157,8 +171,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
TrialId = trialId,
|
||||
TrialReadingCriterionId = list.Where(t => t.CriterionType == item.CriterionTypeEnum).FirstOrDefault()?.TrialReadingCriterionId,
|
||||
FileName = item.Name,
|
||||
FilePath = item.Path,
|
||||
//FileName = item.Name,
|
||||
//FilePath = item.Path,
|
||||
BusinessScenarioEnum = item.BusinessScenarioEnum,
|
||||
Code = item.Code
|
||||
});
|
||||
@@ -176,6 +190,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
|
||||
|
||||
private async Task<bool> DealMedicalReviewTasKGenerateAndIsSendAsync(Guid trialId, bool? isHandSend, string pdAnswer, List<Guid> taskIdList, List<Guid> minUserIdList)
|
||||
{
|
||||
|
||||
@@ -241,7 +256,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
public async Task<string> BaseBusinessScenarioSendEmailAsync(Guid visitTaskId, bool? isHandSend, EmailStoreSendMode emailStoreMode, string sendFileRelativePath)
|
||||
{
|
||||
|
||||
CommonDocumentBusinessScenario? businessScenarioEnum = null;
|
||||
EmailBusinessScenario? businessScenarioEnum = null;
|
||||
|
||||
#region 任务关联的项目配置 标准信息及配置,subject 信息
|
||||
var taskInfo = await _visitTaskRepository.Where(t => t.Id == visitTaskId).Select(t => new
|
||||
@@ -309,7 +324,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
//入组确认场景
|
||||
if (taskInfo.IsEnrollmentConfirm == true && taskInfo.IsEnrollementQualificationConfirm == true && taskInfo.IsBaseline == true)
|
||||
{
|
||||
businessScenarioEnum = CommonDocumentBusinessScenario.EnrollConfirmed;
|
||||
businessScenarioEnum = EmailBusinessScenario.EnrollConfirmed;
|
||||
|
||||
|
||||
}
|
||||
@@ -318,7 +333,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
(taskInfo.PDState == PDStateEnum.PDProgress && taskInfo.SourceSubjectVisitId != null) ||
|
||||
(taskInfo.SouceReadModuleId != null && taskInfo.MoudulePDState == PDStateEnum.PDProgress))
|
||||
{
|
||||
businessScenarioEnum = CommonDocumentBusinessScenario.PDConfirmed;
|
||||
businessScenarioEnum = EmailBusinessScenario.PDConfirmed;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -344,7 +359,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
.Include(t => t.TrialEmailNoticeUserList).FirstOrDefaultAsync();
|
||||
|
||||
|
||||
if (emailConfig == null || (emailConfig.IsAutoSend == false && isHandSend==null))
|
||||
if (emailConfig == null || (emailConfig.IsAutoSend == false && isHandSend == null))
|
||||
{
|
||||
//throw new BusinessValidationFailedException("找不到该项目标准场景下邮件的配置");
|
||||
|
||||
@@ -418,7 +433,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
#region 确保 邮件Html存在
|
||||
|
||||
//邮件附件
|
||||
var path = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, emailConfig.FilePath);
|
||||
var path = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, _userInfo.IsEn_Us ? emailConfig.AttachPath : emailConfig.AttachCNPath);
|
||||
|
||||
if (!File.Exists(path))
|
||||
{
|
||||
@@ -431,7 +446,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
//+ "SubjectEnrollConfirmOrPDProgress.html";
|
||||
//+ "SubjectEnrollConfirmOrPDProgress.html";
|
||||
+ (_userInfo.IsEn_Us ? "SubjectEnrollConfirmOrPDProgress_US.html" : "SubjectEnrollConfirmOrPDProgress.html");
|
||||
|
||||
#endregion
|
||||
@@ -439,7 +454,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
#region 不同场景 Tile 设置
|
||||
|
||||
if (businessScenarioEnum == CommonDocumentBusinessScenario.EnrollConfirmed)
|
||||
if (businessScenarioEnum == EmailBusinessScenario.EnrollConfirmed)
|
||||
{
|
||||
sendEmailConfig.TopicDescription = _localizer["TrialEmailN_EnrollmentConfirmation", taskInfo.ResearchProgramNo, taskInfo.SubjectCode];
|
||||
|
||||
@@ -454,7 +469,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
);
|
||||
}
|
||||
}
|
||||
else if (businessScenarioEnum == CommonDocumentBusinessScenario.PDConfirmed)
|
||||
else if (businessScenarioEnum == EmailBusinessScenario.PDConfirmed)
|
||||
{
|
||||
sendEmailConfig.TopicDescription = _localizer["TrialEmailN_PDReport", taskInfo.ResearchProgramNo, taskInfo.SubjectCode];
|
||||
|
||||
@@ -464,7 +479,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
sendEmailConfig.HtmlBodyStr = string.Format(templateInfo,
|
||||
//--- 附件为疾病进展确认报告,请查收
|
||||
//--- 附件为疾病进展确认报告,请查收
|
||||
_localizer["TrialEmailN_SubjectDiseaseProgression"]
|
||||
);
|
||||
}
|
||||
@@ -486,7 +501,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
//入组确认 根据每个标准配置的是否自动发送,发送邮件与否
|
||||
if (businessScenarioEnum == CommonDocumentBusinessScenario.EnrollConfirmed)
|
||||
if (businessScenarioEnum == EmailBusinessScenario.EnrollConfirmed)
|
||||
{
|
||||
if (await _repository.Where<ReadingTableQuestionAnswer>().AnyAsync(x => x.VisitTaskId == visitTaskId && x.Answer == TargetState.Exist.GetEnumInt() &&
|
||||
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State && x.ReadingQuestionTrial.LesionType == LesionType.TargetLesion))
|
||||
@@ -531,7 +546,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
}
|
||||
else if (businessScenarioEnum == CommonDocumentBusinessScenario.PDConfirmed)
|
||||
else if (businessScenarioEnum == EmailBusinessScenario.PDConfirmed)
|
||||
{
|
||||
|
||||
|
||||
@@ -629,7 +644,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
}
|
||||
else
|
||||
{
|
||||
//---发送PD 进展邮件中发现任务数据有问题!
|
||||
//---发送PD 进展邮件中发现任务数据有问题!
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_PDProgressEmailTask"]);
|
||||
}
|
||||
|
||||
@@ -639,13 +654,13 @@ namespace IRaCIS.Core.Application.Service
|
||||
else
|
||||
{
|
||||
|
||||
//---双重有序阅片 没有定义该仲裁规则处理逻辑,请联系业务和后台开发核查!
|
||||
//---双重有序阅片 没有定义该仲裁规则处理逻辑,请联系业务和后台开发核查!
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_DoubleBlindedError"]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
//屏蔽单重阅片添加
|
||||
else
|
||||
{
|
||||
@@ -661,7 +676,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
// if (taskInfo.ArbitrationRule != ArbitrationRule.None)
|
||||
// {
|
||||
|
||||
//---单重有序阅片配置有误(不应该有仲裁对象配置),请核查!
|
||||
//---单重有序阅片配置有误(不应该有仲裁对象配置),请核查!
|
||||
// throw new BusinessValidationFailedException(_localizer["TrialEmailN_SingleBlindedSet"]);
|
||||
// }
|
||||
|
||||
@@ -687,7 +702,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
//---单重有序阅片 该类型的任务不应进入此处逻辑,请联系后台开发核查!
|
||||
//---单重有序阅片 该类型的任务不应进入此处逻辑,请联系后台开发核查!
|
||||
// throw new BusinessValidationFailedException(_localizer["TrialEmailN_SingleBlindedSequenced"]);
|
||||
// }
|
||||
|
||||
@@ -697,7 +712,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
//---有序阅片配置有误(应为单重或者双重阅片),请核查!
|
||||
//---有序阅片配置有误(应为单重或者双重阅片),请核查!
|
||||
// throw new BusinessValidationFailedException(_localizer["TrialEmailN_BlindedSequencedReading"]);
|
||||
//}
|
||||
|
||||
@@ -788,7 +803,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
//先预先生成了邮件,发送预先生成的邮件
|
||||
sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig()
|
||||
{
|
||||
FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(emailConfig.FileName)}.pdf",
|
||||
FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(_userInfo.IsEn_Us ? emailConfig.AttachName : emailConfig.AttachNameCN)}.pdf",
|
||||
|
||||
FileStream = File.OpenRead(phyPath),
|
||||
});
|
||||
@@ -812,7 +827,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
};
|
||||
|
||||
var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetSubjectEnrollConfirmOrPDEmailPath(_hostEnvironment, Path.GetFileName(path), taskInfo.TrialId, taskInfo.SiteId, taskInfo.SubjectId,true);
|
||||
var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetSubjectEnrollConfirmOrPDEmailPath(_hostEnvironment, Path.GetFileName(path), taskInfo.TrialId, taskInfo.SiteId, taskInfo.SubjectId, true);
|
||||
|
||||
if (emailStoreMode == EmailStoreSendMode.StoreLocalSend || emailStoreMode == EmailStoreSendMode.OnlyStoreLocalNotSentEmail)
|
||||
{
|
||||
@@ -823,7 +838,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
MiniSoftware.MiniWord.SaveAsByTemplate(wordMemoryStream, path, value);
|
||||
|
||||
document.LoadFromStream(wordMemoryStream,FileFormat.Docx);
|
||||
document.LoadFromStream(wordMemoryStream, FileFormat.Docx);
|
||||
|
||||
document.SaveToFile(serverFilePath, FileFormat.PDF);
|
||||
|
||||
@@ -856,7 +871,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
sendEmailConfig.EmailAttachMentConfigList.Add(new EmailAttachMentConfig()
|
||||
{
|
||||
FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(emailConfig.FileName)}.pdf",
|
||||
FileName = $"{taskInfo.SubjectCode}_{Path.GetFileNameWithoutExtension(_userInfo.IsEn_Us ? emailConfig.AttachName : emailConfig.AttachNameCN)}.pdf",
|
||||
|
||||
FileStream = pdfMemoryStream
|
||||
});
|
||||
@@ -900,19 +915,19 @@ namespace IRaCIS.Core.Application.Service
|
||||
//找到入组确认 或者Pd 进展 已生成任务的 访视
|
||||
var subjectVisitList = await _subjectVisitRepository.Where(t => t.SubjectId == subjectId & t.CheckState == CheckStateEnum.CVPassed && (t.IsEnrollmentConfirm == true || t.PDState == PDStateEnum.PDProgress)).ToListAsync();
|
||||
|
||||
if (businessScenarioEnum == CommonDocumentBusinessScenario.EnrollConfirmed)
|
||||
if (businessScenarioEnum == EmailBusinessScenario.EnrollConfirmed)
|
||||
{
|
||||
|
||||
if (trialConfig.IsEnrollementQualificationConfirm == false)
|
||||
{
|
||||
//---项目未配置入组确认!
|
||||
//---项目未配置入组确认!
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_InCons"]);
|
||||
|
||||
}
|
||||
var exisitBaseline = subjectVisitList.FirstOrDefault(t => t.IsEnrollmentConfirm);
|
||||
if (exisitBaseline == null)
|
||||
{
|
||||
//---不存在配置了入组确认的并且生成任务的基线访视
|
||||
//---不存在配置了入组确认的并且生成任务的基线访视
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoBaseLine"]);
|
||||
}
|
||||
else
|
||||
@@ -933,7 +948,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
if (task == null)
|
||||
{
|
||||
//---做入组确认的阅片人基线任务没有阅片完!
|
||||
//---做入组确认的阅片人基线任务没有阅片完!
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_IncompBase"]);
|
||||
}
|
||||
else
|
||||
@@ -942,7 +957,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
if (string.IsNullOrEmpty(filePath))
|
||||
{
|
||||
//---邮件手动生成失败,请联系开发核实该场景失败原因
|
||||
//---邮件手动生成失败,请联系开发核实该场景失败原因
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_EmailFail"]);
|
||||
}
|
||||
else
|
||||
@@ -956,7 +971,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
}
|
||||
else
|
||||
{
|
||||
//---当前未有阅片人读完基线任务!
|
||||
//---当前未有阅片人读完基线任务!
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoReader"]);
|
||||
}
|
||||
|
||||
@@ -967,12 +982,12 @@ namespace IRaCIS.Core.Application.Service
|
||||
}
|
||||
}
|
||||
|
||||
else if (businessScenarioEnum == CommonDocumentBusinessScenario.PDConfirmed)
|
||||
else if (businessScenarioEnum == EmailBusinessScenario.PDConfirmed)
|
||||
{
|
||||
|
||||
if (trialConfig.IsPDProgressView == false)
|
||||
{
|
||||
//---项目未配置PD进展!
|
||||
//---项目未配置PD进展!
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoPDConfig"]);
|
||||
}
|
||||
|
||||
@@ -982,7 +997,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
if (pdSubjectVisitIdList.Count == 0)
|
||||
{
|
||||
//---不存在配置了PD进展的并且生成任务的访视
|
||||
//---不存在配置了PD进展的并且生成任务的访视
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoPDTasks"]);
|
||||
}
|
||||
|
||||
@@ -1027,7 +1042,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
}
|
||||
else
|
||||
{
|
||||
//---当前受试者最新PD访视阅片任务完成状态不符合发送条件
|
||||
//---当前受试者最新PD访视阅片任务完成状态不符合发送条件
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_PDNotFinished"]);
|
||||
}
|
||||
|
||||
@@ -1040,7 +1055,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
if (existReadModule == null)
|
||||
{
|
||||
//---项目配置了阅片期仲裁,但是当前受试者最新PD访视没有影像学阅片期
|
||||
//---项目配置了阅片期仲裁,但是当前受试者最新PD访视没有影像学阅片期
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_PDNoImaging"]);
|
||||
}
|
||||
else
|
||||
@@ -1075,7 +1090,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
else
|
||||
{
|
||||
//---当前受试者最新PD访视阅片期任务完成状态不符合发送条件
|
||||
//---当前受试者最新PD访视阅片期任务完成状态不符合发送条件
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_PDPhaseNotFinished"]);
|
||||
}
|
||||
}
|
||||
@@ -1084,7 +1099,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
}
|
||||
else
|
||||
{
|
||||
//---未定义该仲裁规则发送业务逻辑!
|
||||
//---未定义该仲裁规则发送业务逻辑!
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoRuleDefined"]);
|
||||
}
|
||||
}
|
||||
@@ -1143,7 +1158,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
else
|
||||
{
|
||||
//---当前项目配置,不满足双重有序阅片,不满足发送条件!
|
||||
//---当前项目配置,不满足双重有序阅片,不满足发送条件!
|
||||
return ResponseOutput.NotOk(_localizer["TrialEmailN_NoDoubleOrder"]);
|
||||
}
|
||||
|
||||
@@ -1233,7 +1248,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
//}
|
||||
else
|
||||
{
|
||||
//---不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑
|
||||
//---不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidTaskTypeForEmailSending"]);
|
||||
}
|
||||
|
||||
@@ -1273,7 +1288,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
//}
|
||||
else
|
||||
{
|
||||
//---不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑
|
||||
//---不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidTaskTypeForEmailSending"]);
|
||||
}
|
||||
|
||||
@@ -1311,7 +1326,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
case CriterionType.IMWG2016:
|
||||
default:
|
||||
|
||||
//---该标准任务还未定义PD获取逻辑,联系业务和后台开发协商后补充
|
||||
//---该标准任务还未定义PD获取逻辑,联系业务和后台开发协商后补充
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_PDLogicNotDefined"]);
|
||||
}
|
||||
|
||||
@@ -1335,19 +1350,127 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
var query = _trialUserRepository.Where(t => t.TrialId == trialId, false, true).IgnoreQueryFilters().Select(t => t.User.UserTypeRole).Distinct()
|
||||
|
||||
.ProjectTo<TrialUserType>(_mapper.ConfigurationProvider);
|
||||
.ProjectTo<TrialUserType>(_mapper.ConfigurationProvider);
|
||||
|
||||
return await query.ToListAsync();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 黑名单用户Id 列表
|
||||
/// </summary>
|
||||
/// <param name="trialEmailNoticeConfigId"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<TrialSelectUser>> GetTrialUserIdSelectList(Guid trialEmailNoticeConfigId)
|
||||
{
|
||||
|
||||
var trialEmailNoticeConfig = await _trialEmailNoticeConfigRepository.Where(t => t.Id == trialEmailNoticeConfigId).Include(t => t.TrialEmailNoticeUserList).FirstNotNullAsync();
|
||||
|
||||
var trialId = trialEmailNoticeConfig.TrialId;
|
||||
|
||||
var userTypeList = trialEmailNoticeConfig.TrialEmailNoticeUserList.Select(t => t.UserType).ToList();
|
||||
|
||||
|
||||
var query = _trialUserRepository.Where(t => t.TrialId == trialId && userTypeList.Contains(t.User.UserTypeEnum), false, true).IgnoreQueryFilters()
|
||||
.Select(t => new TrialSelectUser()
|
||||
{
|
||||
UserId = t.UserId,
|
||||
UserName = t.User.UserName,
|
||||
RealName = t.User.FullName,
|
||||
UserTypeEnum = t.User.UserTypeEnum
|
||||
}).Distinct();
|
||||
|
||||
return await query.ToListAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统 邮件配置 勾选列表
|
||||
/// </summary>
|
||||
/// <param name="queryEmailNoticeConfig"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<PageOutput<TrialSelectEmailNoticeConfigView>> GetSysEmailNoticeConfigList(EmailNoticeConfigQuery queryEmailNoticeConfig)
|
||||
{
|
||||
var emailNoticeConfigQueryable = _emailNoticeConfigRepository
|
||||
.WhereIf(queryEmailNoticeConfig.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == queryEmailNoticeConfig.BusinessScenarioEnum)
|
||||
.WhereIf(queryEmailNoticeConfig.IsReturnRequired != null, t => t.IsReturnRequired == queryEmailNoticeConfig.IsReturnRequired)
|
||||
.WhereIf(queryEmailNoticeConfig.IsEnable != null, t => t.IsEnable == queryEmailNoticeConfig.IsEnable)
|
||||
|
||||
.ProjectTo<TrialSelectEmailNoticeConfigView>(_mapper.ConfigurationProvider, new { trialId = queryEmailNoticeConfig.TrialId });
|
||||
|
||||
return await emailNoticeConfigQueryable.ToPagedListAsync(queryEmailNoticeConfig.PageIndex, queryEmailNoticeConfig.PageSize, queryEmailNoticeConfig.SortField, queryEmailNoticeConfig.Asc);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量勾选 传递列表每行数据,后台进行处理转换,建立关联关系
|
||||
/// </summary>
|
||||
/// <param name="batchAddList"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IResponseOutput> BatchAddSysEmailConfig(List<BatchAddTrialEmailNoticeConfig> batchAddList)
|
||||
{
|
||||
|
||||
var first = batchAddList.First();
|
||||
var trialId = first.TrialId;
|
||||
|
||||
var emailConfig = await _trialRepository.Where(t => t.Id == trialId).Select(x => new
|
||||
{
|
||||
TrialId = x.Id,
|
||||
EmailAuthorizationCode = x.EmailAuthorizationCode,
|
||||
EmailSMTPServerAddress = x.EmailSMTPServerAddress,
|
||||
EmailFromEmail = x.EmailFromEmail,
|
||||
EmailFromName = x.EmailFromName,
|
||||
IsConfigureEmail = x.IsConfigureEmail,
|
||||
EmailSMTPServerPort = x.EmailSMTPServerPort
|
||||
|
||||
}).FirstNotNullAsync();
|
||||
|
||||
var list = await _repository.Where<ReadingQuestionCriterionTrial>(t => t.TrialId == trialId && t.IsConfirm).Select(t => new { t.CriterionType, TrialReadingCriterionId = t.Id }).ToListAsync();
|
||||
|
||||
|
||||
var addList = _mapper.Map<List<TrialEmailNoticeConfig>>(batchAddList);
|
||||
|
||||
|
||||
foreach (var item in addList)
|
||||
{
|
||||
item.SysEmailNoticeConfigId = item.Id;
|
||||
item.Id = Guid.Empty;
|
||||
|
||||
item.AuthorizationCode = emailConfig.EmailAuthorizationCode;
|
||||
item.FromEmail = emailConfig.EmailFromEmail;
|
||||
item.SMTPServerAddress = emailConfig.EmailSMTPServerAddress;
|
||||
item.FromName = emailConfig.EmailFromName;
|
||||
item.SMTPServerPort = emailConfig.EmailSMTPServerPort;
|
||||
item.IsAutoSend = false;
|
||||
item.IsEnable = false;
|
||||
|
||||
item.TrialReadingCriterionId = list.FirstOrDefault(t => t.CriterionType == item.CriterionTypeEnum)?.TrialReadingCriterionId;
|
||||
|
||||
item.TrialEmailNoticeUserList.AddRange(batchAddList.Where(t => t.Id == item.SysEmailNoticeConfigId)
|
||||
.SelectMany(t => t.ToUserTypeList).Select(t => new TrialEmailNoticeUser() { EmailUserType = EmailUserType.To, UserType = t }));
|
||||
|
||||
item.TrialEmailNoticeUserList.AddRange(batchAddList.Where(t => t.Id == item.SysEmailNoticeConfigId)
|
||||
.SelectMany(t => t.CopyUserTypeList).Select(t => new TrialEmailNoticeUser() { EmailUserType = EmailUserType.Copy, UserType = t }));
|
||||
|
||||
|
||||
await _trialEmailNoticeConfigRepository.AddAsync(item);
|
||||
|
||||
}
|
||||
|
||||
await _trialEmailNoticeConfigRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
[HttpPost]
|
||||
public async Task<List<TrialEmailNoticeConfigView>> GetTrialEmailNoticeConfigList(TrialEmailNoticeConfigQuery inQuery)
|
||||
{
|
||||
await SyncSystemEmainCofigDocListAsync(inQuery.TrialId);
|
||||
//await SyncSystemEmainCofigDocListAsync(inQuery.TrialId);
|
||||
|
||||
var trialEmailNoticeConfigQueryable = _trialEmailNoticeConfigRepository.Where(t => t.TrialId == inQuery.TrialId)
|
||||
.WhereIf(inQuery.IsDistinguishCriteria == false, t => t.TrialReadingCriterionId == null)
|
||||
.WhereIf(inQuery.IsDistinguishCriteria == true, t => t.CriterionTypeEnum != null)
|
||||
.WhereIf(inQuery.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
|
||||
.WhereIf(inQuery.BusinessScenarioEnum != null, t => t.BusinessScenarioEnum == inQuery.BusinessScenarioEnum)
|
||||
.ProjectTo<TrialEmailNoticeConfigView>(_mapper.ConfigurationProvider);
|
||||
@@ -1355,6 +1478,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
return await trialEmailNoticeConfigQueryable.ToListAsync();
|
||||
}
|
||||
|
||||
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput> AddOrUpdateTrialEmailNoticeConfig(TrialEmailNoticeConfigAddOrEdit addOrEditTrialEmailNoticeConfig)
|
||||
{
|
||||
@@ -1379,6 +1503,10 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
}
|
||||
|
||||
foreach (var userid in addOrEditTrialEmailNoticeConfig.BlackUserIdList)
|
||||
{
|
||||
entity.TrialEmailBlackUserList.Add(new TrialEmailBlackUser() { UserId = userid });
|
||||
}
|
||||
|
||||
await _trialEmailNoticeConfigRepository.AddAsync(entity, true);
|
||||
|
||||
@@ -1387,10 +1515,10 @@ namespace IRaCIS.Core.Application.Service
|
||||
}
|
||||
else
|
||||
{
|
||||
var id = (Guid)addOrEditTrialEmailNoticeConfig.Id;
|
||||
|
||||
await _repository.BatchDeleteAsync<TrialEmailNoticeUser>(t => t.TrialEmailNoticeConfigId == addOrEditTrialEmailNoticeConfig.Id);
|
||||
|
||||
|
||||
var entity = (await _trialEmailNoticeConfigRepository.Where(t => t.Id == addOrEditTrialEmailNoticeConfig.Id, true, true).Include(t => t.TrialEmailNoticeUserList).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
await _repository.BatchDeleteAsync<TrialEmailBlackUser>(t => t.TrialEmailNoticeConfigId == addOrEditTrialEmailNoticeConfig.Id);
|
||||
|
||||
|
||||
List<TrialEmailNoticeUser> trialEmailNoticeUsers = new List<TrialEmailNoticeUser>();
|
||||
@@ -1398,31 +1526,51 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
foreach (var item in addOrEditTrialEmailNoticeConfig.ToUserTypeList)
|
||||
{
|
||||
trialEmailNoticeUsers.Add(new TrialEmailNoticeUser() { EmailUserType = EmailUserType.To, UserType = item, TrialEmailNoticeConfigId = entity.Id });
|
||||
trialEmailNoticeUsers.Add(new TrialEmailNoticeUser() { EmailUserType = EmailUserType.To, UserType = item, TrialEmailNoticeConfigId = id });
|
||||
|
||||
}
|
||||
|
||||
foreach (var item in addOrEditTrialEmailNoticeConfig.CopyUserTypeList)
|
||||
{
|
||||
trialEmailNoticeUsers.Add(new TrialEmailNoticeUser() { EmailUserType = EmailUserType.Copy, UserType = item, TrialEmailNoticeConfigId = entity.Id });
|
||||
trialEmailNoticeUsers.Add(new TrialEmailNoticeUser() { EmailUserType = EmailUserType.Copy, UserType = item, TrialEmailNoticeConfigId = id });
|
||||
|
||||
}
|
||||
await _repository.AddRangeAsync(trialEmailNoticeUsers);
|
||||
|
||||
foreach (var userid in addOrEditTrialEmailNoticeConfig.BlackUserIdList)
|
||||
{
|
||||
await _trialEmailBlackUserRepository.AddAsync(new TrialEmailBlackUser() { UserId = userid, TrialEmailNoticeConfigId = id });
|
||||
|
||||
}
|
||||
|
||||
await _trialEmailNoticeConfigRepository.UpdateFromDTOAsync(addOrEditTrialEmailNoticeConfig);
|
||||
|
||||
|
||||
await _trialEmailNoticeConfigRepository.SaveChangesAsync();
|
||||
|
||||
var jobId = $"{addOrEditTrialEmailNoticeConfig.TrialId}_{id}";
|
||||
|
||||
if (addOrEditTrialEmailNoticeConfig.IsAutoSend)
|
||||
{
|
||||
HangfireJobHelper.AddOrUpdateTrialCronJob(jobId, addOrEditTrialEmailNoticeConfig.TrialId, addOrEditTrialEmailNoticeConfig.BusinessScenarioEnum, addOrEditTrialEmailNoticeConfig.EmailCron);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
HangfireJobHelper.RemoveCronJob(jobId);
|
||||
}
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private async Task TestEmailConfigAsync(TrialEmailNoticeConfigAddOrEdit config)
|
||||
{
|
||||
|
||||
|
||||
|
||||
if (!config.FromEmail.Contains("@") || string.IsNullOrEmpty(config.FromEmail))
|
||||
{
|
||||
@@ -1449,7 +1597,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
throw new BusinessValidationFailedException(_localizer["TrialEmailN_InvalidSenderEmailConfig"] + ex.Message);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#region 人员还未加入,可以先配置邮件 历史废弃
|
||||
@@ -1522,6 +1670,11 @@ namespace IRaCIS.Core.Application.Service
|
||||
[HttpDelete("{trialEmailNoticeConfigId:guid}")]
|
||||
public async Task<IResponseOutput> DeleteTrialEmailNoticeConfig(Guid trialEmailNoticeConfigId)
|
||||
{
|
||||
var trialId = await _trialEmailNoticeConfigRepository.Where(t => t.Id == trialEmailNoticeConfigId).Select(t => t.TrialId).FirstOrDefaultAsync();
|
||||
var jobId = $"{trialId}_{trialEmailNoticeConfigId}";
|
||||
|
||||
HangfireJobHelper.RemoveCronJob(jobId);
|
||||
|
||||
var success = await _trialEmailNoticeConfigRepository.DeleteFromQueryAsync(t => t.Id == trialEmailNoticeConfigId, true);
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
|
||||
@@ -14,12 +14,13 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
var userId = Guid.Empty;
|
||||
var token = string.Empty;
|
||||
var isEn_Us = false;
|
||||
CreateMap<SystemDocument, SystemDocumentView>()
|
||||
.ForMember(d => d.FileType, u => u.MapFrom(s => s.FileType.Value))
|
||||
.ForMember(d => d.FullFilePath, u => u.MapFrom(s => s.Path));
|
||||
|
||||
CreateMap<TrialDocument, TrialDocumentView>()
|
||||
.ForMember(d => d.FileType, u => u.MapFrom(s => s.FileType.MappedValue))
|
||||
.ForMember(d => d.FileType, u => u.MapFrom(s => isEn_Us ? s.FileType.Value : s.FileType.ValueCN ))
|
||||
.ForMember(d => d.IsSomeUserSigned, u => u.MapFrom(s => s.TrialDocConfirmedUserList.Any(t=>t.ConfirmTime!=null)))
|
||||
.ForMember(d => d.FullFilePath, u => u.MapFrom(s => s.Path ));
|
||||
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
using Dicom;
|
||||
using Dicom.Imaging.Codec;
|
||||
using EasyCaching.Core;
|
||||
using EasyCaching.Core;
|
||||
using IRaCIS.Core.Application.Contracts.Dicom;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using System.Text;
|
||||
@@ -8,10 +6,13 @@ using IRaCIS.Core.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using Medallion.Threading;
|
||||
using FellowOakDicom;
|
||||
using FellowOakDicom.Imaging.Codec;
|
||||
|
||||
namespace IRaCIS.Core.Application.Services
|
||||
{
|
||||
public class DicomArchiveService :BaseService, IDicomArchiveService
|
||||
public class DicomArchiveService : BaseService, IDicomArchiveService
|
||||
{
|
||||
private readonly IRepository<DicomStudy> _studyRepository;
|
||||
private readonly IRepository<DicomSeries> _seriesRepository;
|
||||
@@ -21,7 +22,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
private readonly IWebHostEnvironment _hostEnvironment;
|
||||
|
||||
private static object lockCodeGenerate = new object();
|
||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||
|
||||
|
||||
private List<Guid> _instanceIdList = new List<Guid>();
|
||||
@@ -31,8 +32,9 @@ namespace IRaCIS.Core.Application.Services
|
||||
IRepository<DicomInstance> instanceRepository,
|
||||
IWebHostEnvironment hostEnvironment,
|
||||
IRepository<Dictionary> dictionaryRepository,
|
||||
IEasyCachingProvider provider)
|
||||
IEasyCachingProvider provider, IDistributedLockProvider distributedLockProvider)
|
||||
{
|
||||
_distributedLockProvider = distributedLockProvider;
|
||||
_hostEnvironment = hostEnvironment;
|
||||
_studyRepository = studyRepository;
|
||||
|
||||
@@ -50,7 +52,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public async Task<(Guid StudyId, string StudyCode)> ArchiveDicomStreamAsync(Stream dicomStream,
|
||||
@@ -129,7 +131,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
DicomStudy dicomStudy = CreateDicomStudy(dataset, addtionalInfo, out bool isStudyNeedAdd);
|
||||
DicomSeries dicomSeries = CreateDicomSeries(dataset, dicomStudy, out bool isSeriesNeedAdd);
|
||||
DicomInstance dicomInstance = CreateDicomInstance(dataset, dicomStudy, dicomSeries,out bool isInstanceNeedAdd);
|
||||
DicomInstance dicomInstance = CreateDicomInstance(dataset, dicomStudy, dicomSeries, out bool isInstanceNeedAdd);
|
||||
|
||||
dicomSeries.DicomStudy = dicomStudy;
|
||||
|
||||
@@ -183,7 +185,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
//正常保存 不做处理
|
||||
await dicomFile.SaveAsync(physicalPath);
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
//RLELossless 保存
|
||||
await dicomFile.Clone(DicomTransferSyntax.RLELossless).SaveAsync(physicalPath); //RLELossless
|
||||
@@ -235,7 +237,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
{
|
||||
modalityForEdit = "PET";
|
||||
}
|
||||
if(modality== "PT、CT")
|
||||
if (modality == "PT、CT")
|
||||
{
|
||||
modalityForEdit = "PET-CT";
|
||||
}
|
||||
@@ -282,9 +284,10 @@ namespace IRaCIS.Core.Application.Services
|
||||
dicomStudy.PatientBirthDate = $"{dicomStudy.PatientBirthDate[0]}{dicomStudy.PatientBirthDate[1]}{dicomStudy.PatientBirthDate[2]}{dicomStudy.PatientBirthDate[3]}-{dicomStudy.PatientBirthDate[4]}{dicomStudy.PatientBirthDate[5]}-{dicomStudy.PatientBirthDate[6]}{dicomStudy.PatientBirthDate[7]}";
|
||||
}
|
||||
|
||||
lock (lockCodeGenerate)
|
||||
{
|
||||
var @lock = _distributedLockProvider.CreateLock($"StudyCode");
|
||||
|
||||
using (@lock.Acquire())
|
||||
{
|
||||
//查询数据库获取最大的Code 没有记录则为0
|
||||
var dbStudyCodeIntMax = _studyRepository.Where(s => s.TrialId == addtionalInfo.TrialId).Select(t => t.Code).DefaultIfEmpty().Max();
|
||||
|
||||
@@ -298,9 +301,9 @@ namespace IRaCIS.Core.Application.Services
|
||||
dicomStudy.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy));
|
||||
|
||||
_provider.Set<int>($"{addtionalInfo.TrialId}_{StaticData.CacheKey.StudyMaxCode}", dicomStudy.Code, TimeSpan.FromMinutes(30));
|
||||
|
||||
}
|
||||
|
||||
|
||||
#region Setting Code old
|
||||
|
||||
//var studyCode = _studyRepository.Where(s => s.TrialId == addtionalInfo.TrialId).Select(t => t.StudyCode).OrderByDescending(c => c).FirstOrDefault();
|
||||
@@ -468,7 +471,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
_instanceIdList.Add(instanceId);
|
||||
}
|
||||
|
||||
|
||||
return dicomInstance;
|
||||
|
||||
}
|
||||
|
||||
@@ -14,16 +14,13 @@ using IRaCIS.Core.Application.MediatR.Handlers;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Newtonsoft.Json;
|
||||
using System.Threading;
|
||||
using Nito.AsyncEx;
|
||||
using Medallion.Threading;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
{
|
||||
[ApiExplorerSettings(GroupName = "Image")]
|
||||
public class StudyService : BaseService, IStudyService
|
||||
{
|
||||
private static object lockObj = new object();
|
||||
private static readonly AsyncLock _mutex = new AsyncLock();
|
||||
private static readonly AsyncLock _mutex2 = new AsyncLock();
|
||||
|
||||
private readonly IEasyCachingProvider _provider;
|
||||
|
||||
@@ -35,12 +32,12 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
private readonly IRepository<Dictionary> _dictionaryRepository;
|
||||
|
||||
private readonly IRepository<StudyMonitor> _studyMonitorRepository;
|
||||
|
||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||
|
||||
public StudyService(IEasyCachingProvider provider
|
||||
, IRepository<SubjectVisit> subjectVisitRepository,
|
||||
IRepository<DicomInstance> dicomInstanceRepository,
|
||||
IRepository<DicomSeries> dicomSeriesRepository, IRepository<DicomStudy> dicomstudyRepository, IRepository<Dictionary> dictionaryRepository, IRepository<StudyMonitor> studyMonitorRepository)
|
||||
IRepository<DicomSeries> dicomSeriesRepository, IRepository<DicomStudy> dicomstudyRepository, IRepository<Dictionary> dictionaryRepository, IRepository<StudyMonitor> studyMonitorRepository, IDistributedLockProvider distributedLockProvider)
|
||||
{
|
||||
_provider = provider;
|
||||
_subjectVisitRepository = subjectVisitRepository;
|
||||
@@ -49,6 +46,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
_dicomstudyRepository = dicomstudyRepository;
|
||||
_dictionaryRepository = dictionaryRepository;
|
||||
_studyMonitorRepository = studyMonitorRepository;
|
||||
_distributedLockProvider = distributedLockProvider;
|
||||
}
|
||||
|
||||
|
||||
@@ -160,7 +158,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
{
|
||||
var study = _mapper.Map<DicomStudy>(incommand.Study);
|
||||
|
||||
using (await _mutex.LockAsync())
|
||||
var @lock = _distributedLockProvider.CreateLock($"StudyCode");
|
||||
|
||||
using (await @lock.AcquireAsync())
|
||||
{
|
||||
//查询数据库获取最大的Code 没有记录则为0
|
||||
var dbStudyCodeIntMax = _dicomstudyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
|
||||
@@ -306,11 +306,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
|
||||
}
|
||||
|
||||
using (await _mutex2.LockAsync())
|
||||
var @lock2 = _distributedLockProvider.CreateLock($"StudyCommit");
|
||||
|
||||
using (await @lock2.AcquireAsync())
|
||||
{
|
||||
await _dicomInstanceRepository.SaveChangesAsync();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -826,22 +826,22 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||
}
|
||||
result.StudyInstanceUid = studyInstanceUid;
|
||||
|
||||
var @lock = _distributedLockProvider.CreateLock($"StudyUpload");
|
||||
|
||||
if (result.AllowReUpload || result.AllowUpload)
|
||||
using (@lock.Acquire())
|
||||
{
|
||||
lock (lockObj)
|
||||
if (result.AllowReUpload || result.AllowUpload)
|
||||
{
|
||||
_provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lock (lockObj)
|
||||
else
|
||||
{
|
||||
_provider.Remove($"StudyUid_{trialId}_{studyInstanceUid}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ using IRaCIS.Application.Contracts;
|
||||
using IRaCIS.Core.Infra.EFCore;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Nito.AsyncEx;
|
||||
using Medallion.Threading;
|
||||
|
||||
namespace IRaCIS.Application.Services
|
||||
{
|
||||
@@ -12,13 +12,13 @@ namespace IRaCIS.Application.Services
|
||||
{
|
||||
private readonly IRepository<Site> _siteRepository;
|
||||
private readonly IRepository<TrialSiteUser> _trialSiteUserRepository;
|
||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||
|
||||
private readonly AsyncLock _mutex = new AsyncLock();
|
||||
|
||||
public SiteService(IRepository<Site> siteRepository, IRepository<TrialSiteUser> trialSiteUserRepository)
|
||||
public SiteService(IRepository<Site> siteRepository, IRepository<TrialSiteUser> trialSiteUserRepository, IDistributedLockProvider distributedLockProvider)
|
||||
{
|
||||
_siteRepository = siteRepository;
|
||||
this._trialSiteUserRepository = trialSiteUserRepository;
|
||||
_trialSiteUserRepository = trialSiteUserRepository;
|
||||
_distributedLockProvider = distributedLockProvider;
|
||||
}
|
||||
|
||||
/// <summary> 分页获取研究中心列表 </summary>
|
||||
@@ -58,7 +58,9 @@ namespace IRaCIS.Application.Services
|
||||
VerifyMsg = _localizer["Site_DupName"]
|
||||
};
|
||||
|
||||
using (await _mutex.LockAsync())
|
||||
var @lock = _distributedLockProvider.CreateLock($"SiteAdd");
|
||||
|
||||
using (await @lock.AcquireAsync())
|
||||
{
|
||||
if (siteCommand.Id == null)
|
||||
{
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public UserTypeEnum UserTypeEnum { get; set; }
|
||||
public List<UserTypeGroupInfo> UserTypeGroupList { get; set; } = new List<UserTypeGroupInfo>();
|
||||
|
||||
public new List<Guid> UserTypeGroupIdList => UserTypeGroupList.Select(t=>t.DictionaryId).ToList();
|
||||
public new List<Guid> UserTypeGroupIdList => UserTypeGroupList.Select(t => t.DictionaryId).ToList();
|
||||
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
public Guid DictionaryId { get; set; }
|
||||
|
||||
public string GroupName { get; set; }=string.Empty;
|
||||
public string GroupName { get; set; } = string.Empty;
|
||||
|
||||
public string GroupNameCN { get; set; } = string.Empty;
|
||||
}
|
||||
@@ -36,7 +36,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
}
|
||||
|
||||
public class UserTypeMenuAddOrEdit: UserTypeRoleAddOrEdit
|
||||
public class UserTypeMenuAddOrEdit : UserTypeRoleAddOrEdit
|
||||
{
|
||||
public UserTypeEnum UserTypeEnum { get; set; }
|
||||
|
||||
@@ -64,6 +64,16 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
}
|
||||
|
||||
public class TrialSelectUser
|
||||
{
|
||||
public Guid UserId { get; set; }
|
||||
|
||||
public string UserName { get; set; }
|
||||
|
||||
public string RealName { get; set; }
|
||||
|
||||
public UserTypeEnum UserTypeEnum { get; set; }
|
||||
}
|
||||
|
||||
public class TrialUserType
|
||||
{
|
||||
|
||||
@@ -12,6 +12,7 @@ using IRaCIS.Core.Infra.Common.Cache;
|
||||
using Microsoft.Identity.Client;
|
||||
using static IRaCIS.Core.Domain.Share.StaticData;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using Medallion.Threading;
|
||||
|
||||
namespace IRaCIS.Application.Services
|
||||
{
|
||||
@@ -25,7 +26,7 @@ namespace IRaCIS.Application.Services
|
||||
private readonly IRepository<TrialUser> _userTrialRepository;
|
||||
private readonly IRepository<UserLog> _userLogRepository;
|
||||
|
||||
|
||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||
private readonly IMemoryCache _cache;
|
||||
|
||||
private readonly IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig;
|
||||
@@ -40,7 +41,8 @@ namespace IRaCIS.Application.Services
|
||||
IRepository<TrialUser> userTrialRepository,
|
||||
IOptionsMonitor<ServiceVerifyConfigOption> verifyConfig,
|
||||
IRepository<UserLog> userLogRepository
|
||||
)
|
||||
,
|
||||
IDistributedLockProvider distributedLockProvider)
|
||||
{
|
||||
_userLogRepository = userLogRepository;
|
||||
|
||||
@@ -52,6 +54,7 @@ namespace IRaCIS.Application.Services
|
||||
_doctorRepository = doctorRepository;
|
||||
_userTrialRepository = userTrialRepository;
|
||||
_userLogRepository = userLogRepository;
|
||||
_distributedLockProvider = distributedLockProvider;
|
||||
}
|
||||
|
||||
|
||||
@@ -504,29 +507,32 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
var saveItem = _mapper.Map<User>(userAddModel);
|
||||
|
||||
saveItem.Code = await _userRepository.Select(t => t.Code).DefaultIfEmpty().MaxAsync() + 1;
|
||||
var @lock = _distributedLockProvider.CreateLock($"UserAccount");
|
||||
|
||||
saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(User));
|
||||
|
||||
if (saveItem.IsZhiZhun)
|
||||
using (await @lock.AcquireAsync())
|
||||
{
|
||||
saveItem.OrganizationName = AppSettings.DefaultInternalOrganizationName;
|
||||
saveItem.Code = await _userRepository.Select(t => t.Code).DefaultIfEmpty().MaxAsync() + 1;
|
||||
|
||||
saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(User));
|
||||
|
||||
if (saveItem.IsZhiZhun)
|
||||
{
|
||||
saveItem.OrganizationName = AppSettings.DefaultInternalOrganizationName;
|
||||
}
|
||||
|
||||
|
||||
saveItem.Password = MD5Helper.Md5("123456");
|
||||
|
||||
await _userRepository.AddAsync(saveItem);
|
||||
|
||||
var success = await _userRepository.SaveChangesAsync();
|
||||
}
|
||||
|
||||
|
||||
saveItem.Password = MD5Helper.Md5("123456");
|
||||
|
||||
await _userRepository.AddAsync(saveItem);
|
||||
|
||||
var success = await _userRepository.SaveChangesAsync();
|
||||
|
||||
|
||||
|
||||
await _mailVerificationService.AddUserSendEmailAsync(saveItem.Id, userAddModel.BaseUrl, userAddModel.RouteUrl);
|
||||
|
||||
|
||||
|
||||
|
||||
return ResponseOutput.Result(success, new UserAddedReturnDTO { Id = saveItem.Id, UserCode = saveItem.UserCode });
|
||||
return ResponseOutput.Ok( new UserAddedReturnDTO { Id = saveItem.Id, UserCode = saveItem.UserCode });
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
//--------------------------------------------------------------------
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Application.Filter;
|
||||
using Nito.AsyncEx;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using IRaCIS.Core.Application.Service;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Medallion.Threading;
|
||||
|
||||
namespace IRaCIS.Core.Application.Contracts
|
||||
{
|
||||
@@ -20,19 +20,19 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
{
|
||||
private readonly IRepository<NoneDicomStudy> _noneDicomStudyRepository;
|
||||
private readonly IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository;
|
||||
private readonly AsyncLock _mutex = new AsyncLock();
|
||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||
private readonly QCCommon _qCCommon;
|
||||
|
||||
|
||||
public NoneDicomStudyService(IRepository<NoneDicomStudy> noneDicomStudyRepository,
|
||||
QCCommon qCCommon,
|
||||
IRepository<NoneDicomStudyFile> noneDicomStudyFileRepository)
|
||||
IRepository<NoneDicomStudyFile> noneDicomStudyFileRepository, IDistributedLockProvider distributedLockProvider)
|
||||
{
|
||||
_qCCommon = qCCommon;
|
||||
_noneDicomStudyRepository = noneDicomStudyRepository;
|
||||
|
||||
_noneDicomStudyFileRepository = noneDicomStudyFileRepository;
|
||||
|
||||
_distributedLockProvider = distributedLockProvider;
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,9 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
}
|
||||
|
||||
NoneDicomStudy? optEntity = null;
|
||||
using (await _mutex.LockAsync())
|
||||
var @lock = _distributedLockProvider.CreateLock($"NoneDicomCode");
|
||||
|
||||
using (await @lock.AcquireAsync())
|
||||
{
|
||||
if (addOrEditNoneDicomStudy.Id == Guid.Empty || addOrEditNoneDicomStudy.Id == null)
|
||||
{
|
||||
|
||||
@@ -10,13 +10,13 @@ using WinSCP;
|
||||
using Newtonsoft.Json;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using IRaCIS.Core.Application.Service.Inspection.DTO;
|
||||
using Nito.AsyncEx;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using IRaCIS.Core.Application.Auth;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using IRaCIS.Core.Application.Service;
|
||||
using Medallion.Threading;
|
||||
|
||||
namespace IRaCIS.Core.Application.Image.QA
|
||||
{
|
||||
@@ -35,8 +35,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||
private readonly IRepository<Trial> _trialRepository;
|
||||
private readonly IRepository<VisitTask> _visitTaskRepository;
|
||||
private readonly IVisitTaskHelpeService _IVisitTaskHelpeService;
|
||||
|
||||
private readonly AsyncLock _mutex = new AsyncLock();
|
||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||
|
||||
public QCOperationService(IRepository<SubjectVisit> subjectVisitRepository,
|
||||
IRepository<QCChallenge> qcChallengeRepository,
|
||||
@@ -48,7 +47,8 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||
IRepository<ReadingClinicalData> readingClinicalDataRepository,
|
||||
IRepository<QCChallengeDialog> qCChallengeDialogrepository,
|
||||
IRepository<CheckChallengeDialog> checkChallengeDialogrepository,
|
||||
IVisitTaskHelpeService visitTaskHelpeService
|
||||
IVisitTaskHelpeService visitTaskHelpeService,
|
||||
IDistributedLockProvider distributedLockProvider
|
||||
)
|
||||
{
|
||||
_subjectVisitRepository = subjectVisitRepository;
|
||||
@@ -62,6 +62,7 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||
_trialRepository = trialRepository;
|
||||
this._visitTaskRepository = visitTaskRepository;
|
||||
_IVisitTaskHelpeService = visitTaskHelpeService;
|
||||
_distributedLockProvider = distributedLockProvider;
|
||||
}
|
||||
|
||||
#region QC质疑 以及回复 关闭
|
||||
@@ -108,9 +109,9 @@ namespace IRaCIS.Core.Application.Image.QA
|
||||
|
||||
var trialConfig = (await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.QCProcessEnum, t.IsImageConsistencyVerification }).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
var @lock = _distributedLockProvider.CreateLock($"QCChallengeCode");
|
||||
|
||||
|
||||
using (await _mutex.LockAsync())
|
||||
using (await @lock.AcquireAsync())
|
||||
{
|
||||
//获取编号
|
||||
var code = _qcChallengeRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
|
||||
|
||||
@@ -262,7 +262,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
public string ImagePath { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public List<ImageInfo> FileList { get; set; } = new List<ImageInfo>();
|
||||
public List<Domain.Models.OSSImageInfo> FileList { get; set; } = new List<Domain.Models.OSSImageInfo>();
|
||||
|
||||
|
||||
}
|
||||
@@ -310,7 +310,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
|
||||
|
||||
|
||||
public List<ImageInfo> FileList { get; set; } = new List<ImageInfo>();
|
||||
public List<OSSImageInfo> FileList { get; set; } = new List<OSSImageInfo>();
|
||||
|
||||
|
||||
|
||||
@@ -451,7 +451,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
public Guid TaskMedicalReviewId { get; set; }
|
||||
|
||||
|
||||
public List<ImageInfo> FileList { get; set; } = new List<ImageInfo>();
|
||||
public List<OSSImageInfo> FileList { get; set; } = new List<OSSImageInfo>();
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -498,7 +498,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
|
||||
public string Questioning { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public List<ImageInfo> FileList { get; set; } = new List<ImageInfo>();
|
||||
public List<OSSImageInfo> FileList { get; set; } = new List<OSSImageInfo>();
|
||||
|
||||
/// <summary>
|
||||
/// 审核建议
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
using Microsoft.AspNetCore.JsonPatch.Operations;
|
||||
using Swashbuckle.AspNetCore.Filters;
|
||||
|
||||
namespace IRaCIS.Core.Application.Contracts
|
||||
{
|
||||
/// <summary>
|
||||
/// 实测 标注在服务方法上 没用
|
||||
/// </summary>
|
||||
public class JsonPatchUserRequestExample : IExamplesProvider<object>
|
||||
{
|
||||
public Operation[] GetExamples()
|
||||
{
|
||||
return new[]
|
||||
{
|
||||
new Operation
|
||||
{
|
||||
op = "replace",
|
||||
path = "/name",
|
||||
value = "Gordon"
|
||||
},
|
||||
new Operation
|
||||
{
|
||||
op = "replace",
|
||||
path = "/surname",
|
||||
value = "Freeman"
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
object IExamplesProvider<object>.GetExamples()
|
||||
{
|
||||
return new[]
|
||||
{
|
||||
new Operation
|
||||
{
|
||||
op = "replace",
|
||||
path = "/name",
|
||||
value = "Gordon"
|
||||
},
|
||||
new Operation
|
||||
{
|
||||
op = "replace",
|
||||
path = "/surname",
|
||||
value = "Freeman"
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -15,6 +15,7 @@ using MailKit.Security;
|
||||
using MimeKit;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using IRaCIS.Core.Application.Filter;
|
||||
using Medallion.Threading;
|
||||
|
||||
namespace IRaCIS.Core.Application.Contracts
|
||||
{
|
||||
@@ -32,24 +33,25 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
private readonly IRepository<TrialUser> _trialUserRepository;
|
||||
private readonly ITokenService _tokenService;
|
||||
private readonly IMailVerificationService _mailVerificationService;
|
||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||
|
||||
public TrialSiteSurveyService(IRepository<TrialSiteSurvey> trialSiteSurveyRepository, IRepository<TrialUser> trialUserRepository, IRepository<TrialSiteUserSurvey> trialSiteUserSurveyRepository,
|
||||
IRepository<User> userRepository, IRepository<TrialSite> trialSiteRepository,
|
||||
IRepository<Doctor> doctorRepository,
|
||||
ITokenService tokenService,
|
||||
IMailVerificationService mailVerificationService)
|
||||
IMailVerificationService mailVerificationService, IDistributedLockProvider distributedLockProvider)
|
||||
{
|
||||
_trialSiteSurveyRepository = trialSiteSurveyRepository;
|
||||
_trialSiteUserSurveyRepository = trialSiteUserSurveyRepository;
|
||||
_userRepository = userRepository;
|
||||
_trialUserRepository = trialUserRepository;
|
||||
_trialSiteRepository = trialSiteRepository;
|
||||
this._doctorRepository = doctorRepository;
|
||||
_doctorRepository = doctorRepository;
|
||||
_tokenService = tokenService;
|
||||
_mailVerificationService = mailVerificationService;
|
||||
_distributedLockProvider = distributedLockProvider;
|
||||
}
|
||||
|
||||
private object lockObj { get; set; } = new object();
|
||||
|
||||
/// <summary>
|
||||
/// 发送验证码
|
||||
@@ -801,7 +803,9 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
if (sysUserInfo == null)
|
||||
{
|
||||
|
||||
lock (lockObj)
|
||||
var @lock = _distributedLockProvider.CreateLock($"UserCode");
|
||||
|
||||
using (await @lock.AcquireAsync())
|
||||
{
|
||||
var saveItem = _mapper.Map<User>(item);
|
||||
|
||||
@@ -902,118 +906,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
|
||||
|
||||
#region 废弃
|
||||
//Site 调研邀请
|
||||
public async Task<IResponseOutput> SendInviteEmail(InviteEmailCommand inviteEmailCommand)
|
||||
{
|
||||
|
||||
var trialInfo = await _repository.FirstOrDefaultAsync<Trial>(t => t.Id == inviteEmailCommand.TrialId);
|
||||
|
||||
|
||||
foreach (var item in inviteEmailCommand.UserList)
|
||||
{
|
||||
|
||||
var messageToSend = new MimeMessage();
|
||||
//发件地址
|
||||
messageToSend.From.Add(new MailboxAddress("GRR", "iracis_grr@163.com"));
|
||||
//收件地址
|
||||
messageToSend.To.Add(new MailboxAddress(String.Empty, item.Email));
|
||||
//主题
|
||||
//$"[来自展影IRC] [{trialInfo.ResearchProgramNo}] 邀请信";
|
||||
messageToSend.Subject = _localizer["TrialSiteSurvey_IRCInvitation", trialInfo.ResearchProgramNo];
|
||||
|
||||
var builder = new BodyBuilder();
|
||||
|
||||
//找下系统中是否存在该用户类型的 并且邮箱 或者手机的账户
|
||||
var sysUserInfo = await _userRepository.Where(t => t.UserTypeId == item.UserTypeId && t.EMail == item.Email).Include(t => t.UserTypeRole).FirstOrDefaultAsync();
|
||||
|
||||
//int verificationCode = new Random().Next(100000, 1000000);
|
||||
|
||||
//var baseApiUrl = baseUrl.Remove(baseUrl.IndexOf("#")) + "api";
|
||||
|
||||
|
||||
if (sysUserInfo == null)
|
||||
{
|
||||
|
||||
lock (lockObj)
|
||||
{
|
||||
var saveItem = _mapper.Map<User>(item);
|
||||
|
||||
saveItem.Code = _userRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1;
|
||||
|
||||
saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(User)); ;
|
||||
|
||||
saveItem.UserName = saveItem.UserCode;
|
||||
|
||||
saveItem.UserTypeEnum = _repository.Where<UserType>(t => t.Id == saveItem.UserTypeId).Select(t => t.UserTypeEnum).First();
|
||||
|
||||
//saveItem.Password = MD5Helper.Md5(verificationCode.ToString());
|
||||
|
||||
_ = _repository.AddAsync(saveItem).Result;
|
||||
|
||||
_ = _repository.SaveChangesAsync().Result;
|
||||
|
||||
|
||||
sysUserInfo = saveItem;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
builder.HtmlBody = @$"<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
{sysUserInfo.LastName + "/" + sysUserInfo.FirstName}:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
{_localizer["TrialSiteSurvey_IRCInvitationContent", trialInfo.ResearchProgramNo]}
|
||||
</div>
|
||||
|
||||
<a href=' {inviteEmailCommand.RouteUrl + "?Id=" + item.Id + "&IsExternalUser=0"}' style='margin-left:60px;font-size:14px;text-decoration: none;display: inline-block;height: 40px;width: 140px;background: #00D1B2;color:#fff;border-radius: 5px;line-height: 40px;text-align: center;margin-bottom: 100px;'>
|
||||
查看并确认
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</body>";
|
||||
|
||||
|
||||
|
||||
messageToSend.Body = builder.ToMessageBody();
|
||||
|
||||
using (var smtp = new MailKit.Net.Smtp.SmtpClient())
|
||||
{
|
||||
|
||||
smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;
|
||||
|
||||
smtp.MessageSent += (sender, args) =>
|
||||
{
|
||||
|
||||
_ = _trialSiteUserSurveyRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Id, u => new TrialSiteUserSurvey() { IsGenerateSuccess = true, InviteState = TrialSiteUserStateEnum.HasSend, ConfirmTime = null, RejectReason = String.Empty, SystemUserId = sysUserInfo.Id, ExpireTime = DateTime.Now.AddDays(7) }).Result;
|
||||
|
||||
};
|
||||
|
||||
|
||||
await smtp.ConnectAsync("smtp.163.com", 465, SecureSocketOptions.StartTls);
|
||||
|
||||
|
||||
await smtp.AuthenticateAsync("iracis_grr@163.com", "XLWVQKZAEKLDWOAH");
|
||||
|
||||
|
||||
await smtp.SendAsync(messageToSend);
|
||||
|
||||
|
||||
await smtp.DisconnectAsync(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ using Panda.DynamicWebApi.Attributes;
|
||||
using IRaCIS.Core.Application.Auth;
|
||||
using IRaCIS.Application.Services;
|
||||
using IRaCIS.Core.Application.Filter;
|
||||
using Medallion.Threading;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
@@ -31,10 +32,11 @@ namespace IRaCIS.Core.Application.Service
|
||||
private readonly IRepository<TrialSiteUserSurvey> _trialSiteSurveyUserRepository;
|
||||
private readonly IRepository<TrialSiteUser> _trialSiteUserRepository;
|
||||
private readonly IMailVerificationService _mailVerificationService;
|
||||
private readonly IDistributedLockProvider _distributedLockProvider;
|
||||
|
||||
public TrialExternalUserService(IRepository<TrialExternalUser> trialExternalUseRepository, IRepository<User> userRepository, IRepository<TrialUser> trialUserRepository,
|
||||
IRepository<TrialSiteUserSurvey> trialSiteSurveyUserRepository, IRepository<TrialSiteUser> trialSiteUserRepository,
|
||||
IMailVerificationService mailVerificationService)
|
||||
IMailVerificationService mailVerificationService, IDistributedLockProvider distributedLockProvider)
|
||||
{
|
||||
_trialExternalUseRepository = trialExternalUseRepository;
|
||||
_userRepository = userRepository;
|
||||
@@ -43,6 +45,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
_trialSiteUserRepository = trialSiteUserRepository;
|
||||
|
||||
_mailVerificationService = mailVerificationService;
|
||||
_distributedLockProvider = distributedLockProvider;
|
||||
}
|
||||
|
||||
|
||||
@@ -75,121 +78,125 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
if (addOrEditTrialExternalUser.Id == null)
|
||||
{
|
||||
var existSysUser = await _userRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId);
|
||||
var @lock = _distributedLockProvider.CreateLock($"UserCode");
|
||||
|
||||
if (existSysUser != null)
|
||||
using (await @lock.AcquireAsync())
|
||||
{
|
||||
if (existSysUser.LastName != addOrEditTrialExternalUser.LastName || existSysUser.FirstName != addOrEditTrialExternalUser.FirstName)
|
||||
var existSysUser = await _userRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId);
|
||||
|
||||
if (existSysUser != null)
|
||||
{
|
||||
//$"该用户在系统中的用户名为:{existSysUser.LastName + " / " + existSysUser.FirstName} 电话:{existSysUser.Phone},与填写信息存在不一致项, 请将界面信息修改为与系统一致,再进行保存",
|
||||
return ResponseOutput.NotOk(_localizer["TrialExternalUser_Inconsistency", existSysUser.LastName + " / " + existSysUser.FirstName, existSysUser.Phone], new { existSysUser.LastName, existSysUser.FirstName, existSysUser.Phone, existSysUser.IsZhiZhun, existSysUser.IsTestUser }, ApiResponseCodeEnum.NeedTips);
|
||||
if (existSysUser.LastName != addOrEditTrialExternalUser.LastName || existSysUser.FirstName != addOrEditTrialExternalUser.FirstName)
|
||||
{
|
||||
//$"该用户在系统中的用户名为:{existSysUser.LastName + " / " + existSysUser.FirstName} 电话:{existSysUser.Phone},与填写信息存在不一致项, 请将界面信息修改为与系统一致,再进行保存",
|
||||
return ResponseOutput.NotOk(_localizer["TrialExternalUser_Inconsistency", existSysUser.LastName + " / " + existSysUser.FirstName, existSysUser.Phone], new { existSysUser.LastName, existSysUser.FirstName, existSysUser.Phone, existSysUser.IsZhiZhun, existSysUser.IsTestUser }, ApiResponseCodeEnum.NeedTips);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
//处理 生成账户
|
||||
|
||||
//处理 生成账户
|
||||
|
||||
if (await _trialExternalUseRepository.AnyAsync(t =>
|
||||
t.Email == addOrEditTrialExternalUser.Email &&
|
||||
t.UserTypeId == addOrEditTrialExternalUser.UserTypeId && t.TrialId == addOrEditTrialExternalUser.TrialId))
|
||||
{
|
||||
//---系统已经存在与列表中填写的邮箱和用户类型相同的账户,请确认。
|
||||
return ResponseOutput.NotOk(_localizer["TrialExternalUser_EmailTypeDuplicate"]);
|
||||
}
|
||||
if (await _trialExternalUseRepository.AnyAsync(t =>
|
||||
t.Email == addOrEditTrialExternalUser.Email &&
|
||||
t.UserTypeId == addOrEditTrialExternalUser.UserTypeId && t.TrialId == addOrEditTrialExternalUser.TrialId))
|
||||
{
|
||||
//---系统已经存在与列表中填写的邮箱和用户类型相同的账户,请确认。
|
||||
return ResponseOutput.NotOk(_localizer["TrialExternalUser_EmailTypeDuplicate"]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
var addEntity = _mapper.Map<TrialExternalUser>(addOrEditTrialExternalUser);
|
||||
var addEntity = _mapper.Map<TrialExternalUser>(addOrEditTrialExternalUser);
|
||||
|
||||
await _trialExternalUseRepository.AddAsync(addEntity);
|
||||
await _trialExternalUseRepository.AddAsync(addEntity);
|
||||
|
||||
|
||||
var existUser = await _userRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId);
|
||||
var trialType = await _repository.Where<Trial>(t => t.Id == addOrEditTrialExternalUser.TrialId).Select(t => t.TrialType).FirstOrDefaultAsync();
|
||||
var existUser = await _userRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId);
|
||||
var trialType = await _repository.Where<Trial>(t => t.Id == addOrEditTrialExternalUser.TrialId).Select(t => t.TrialType).FirstOrDefaultAsync();
|
||||
|
||||
if (existUser != null)
|
||||
{
|
||||
addEntity.IsSystemUser = true;
|
||||
addEntity.SystemUserId = existUser.Id;
|
||||
if (existUser != null)
|
||||
{
|
||||
addEntity.IsSystemUser = true;
|
||||
addEntity.SystemUserId = existUser.Id;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
//生成账户 并插入
|
||||
//生成账户 并插入
|
||||
|
||||
var generateUser = _mapper.Map<User>(addOrEditTrialExternalUser);
|
||||
var generateUser = _mapper.Map<User>(addOrEditTrialExternalUser);
|
||||
|
||||
if (trialType == TrialType.NoneOfficial)
|
||||
{
|
||||
generateUser.IsTestUser = true;
|
||||
}
|
||||
|
||||
// 外部人员生成账号 都是外部的
|
||||
generateUser.IsZhiZhun = false;
|
||||
|
||||
generateUser.Code = _userRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1;
|
||||
|
||||
|
||||
generateUser.UserCode = AppSettings.GetCodeStr(generateUser.Code, nameof(User));
|
||||
|
||||
generateUser.UserName = generateUser.UserCode;
|
||||
|
||||
generateUser.UserTypeEnum = _repository.Where<UserType>(t => t.Id == generateUser.UserTypeId).Select(t => t.UserTypeEnum).First();
|
||||
|
||||
generateUser.Password = MD5Helper.Md5("123456");
|
||||
|
||||
generateUser.Status = UserStateEnum.Disable;
|
||||
|
||||
var newAddUser = await _repository.AddAsync(generateUser);
|
||||
|
||||
|
||||
addEntity.IsSystemUser = false;
|
||||
addEntity.SystemUserId = newAddUser.Id;
|
||||
|
||||
|
||||
existUser = newAddUser;
|
||||
|
||||
}
|
||||
|
||||
#region 验证用户 能否加入
|
||||
|
||||
if (trialType == TrialType.OfficialTrial || trialType == TrialType.Training)
|
||||
{
|
||||
|
||||
if (existUser.IsTestUser)
|
||||
{
|
||||
//---正式类型 、培训类型的项目 不允许加入测试用户
|
||||
throw new BusinessValidationFailedException(_localizer["TrialExternalUser_TestUserNotAllowed"]);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (trialType == TrialType.NoneOfficial)
|
||||
{
|
||||
generateUser.IsTestUser = true;
|
||||
|
||||
if (existUser.IsTestUser == false)
|
||||
{
|
||||
//---测试项目 不允许加入正式用户
|
||||
throw new BusinessValidationFailedException(_localizer["TrialExternalUser_FormalUserNotAllowed"]);
|
||||
}
|
||||
}
|
||||
|
||||
// 外部人员生成账号 都是外部的
|
||||
generateUser.IsZhiZhun = false;
|
||||
|
||||
generateUser.Code = _userRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1;
|
||||
#endregion
|
||||
|
||||
|
||||
generateUser.UserCode = AppSettings.GetCodeStr(generateUser.Code, nameof(User));
|
||||
|
||||
generateUser.UserName = generateUser.UserCode;
|
||||
|
||||
generateUser.UserTypeEnum = _repository.Where<UserType>(t => t.Id == generateUser.UserTypeId).Select(t => t.UserTypeEnum).First();
|
||||
|
||||
generateUser.Password = MD5Helper.Md5("123456");
|
||||
|
||||
generateUser.Status = UserStateEnum.Disable;
|
||||
|
||||
var newAddUser = await _repository.AddAsync(generateUser);
|
||||
await _trialExternalUseRepository.SaveChangesAsync();
|
||||
|
||||
|
||||
addEntity.IsSystemUser = false;
|
||||
addEntity.SystemUserId = newAddUser.Id;
|
||||
|
||||
|
||||
existUser = newAddUser;
|
||||
|
||||
}
|
||||
|
||||
#region 验证用户 能否加入
|
||||
|
||||
if (trialType == TrialType.OfficialTrial || trialType == TrialType.Training)
|
||||
{
|
||||
|
||||
if (existUser.IsTestUser)
|
||||
//添加的时候就发邮件 现在省略
|
||||
if (addOrEditTrialExternalUser.IsSendEmail)
|
||||
{
|
||||
//---正式类型 、培训类型的项目 不允许加入测试用户
|
||||
throw new BusinessValidationFailedException(_localizer["TrialExternalUser_TestUserNotAllowed"]);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (trialType == TrialType.NoneOfficial)
|
||||
{
|
||||
|
||||
if (existUser.IsTestUser == false )
|
||||
{
|
||||
//---测试项目 不允许加入正式用户
|
||||
throw new BusinessValidationFailedException(_localizer["TrialExternalUser_FormalUserNotAllowed"]);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
await _trialExternalUseRepository.SaveChangesAsync();
|
||||
|
||||
|
||||
//添加的时候就发邮件 现在省略
|
||||
if (addOrEditTrialExternalUser.IsSendEmail)
|
||||
{
|
||||
await SendExternalUserJoinEmail(new TrialExternalUserSendEmail()
|
||||
{
|
||||
BaseUrl = addOrEditTrialExternalUser.BaseUrl,
|
||||
RouteUrl = addOrEditTrialExternalUser.RouteUrl,
|
||||
TrialId = addOrEditTrialExternalUser.TrialId,
|
||||
SendUsers = new List<UserEmail>()
|
||||
await SendExternalUserJoinEmail(new TrialExternalUserSendEmail()
|
||||
{
|
||||
BaseUrl = addOrEditTrialExternalUser.BaseUrl,
|
||||
RouteUrl = addOrEditTrialExternalUser.RouteUrl,
|
||||
TrialId = addOrEditTrialExternalUser.TrialId,
|
||||
SendUsers = new List<UserEmail>()
|
||||
{
|
||||
new UserEmail()
|
||||
{
|
||||
@@ -199,12 +206,13 @@ namespace IRaCIS.Core.Application.Service
|
||||
SystemUserId=addEntity.SystemUserId
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
return ResponseOutput.Ok(addEntity.Id.ToString());
|
||||
}
|
||||
|
||||
|
||||
return ResponseOutput.Ok(addEntity.Id.ToString());
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -92,7 +92,7 @@ namespace IRaCIS.Application.Services
|
||||
.WhereIf(multiCriteriaSelectCount > 0, t => t.TrialDicList.Count(t => t.KeyName == StaticData.Criterion) == multiCriteriaSelectCount)
|
||||
.WhereIf(multiReviewTypeSelectCount > 0, t => t.TrialDicList.Count(t => t.KeyName == StaticData.ReviewType) == multiReviewTypeSelectCount)
|
||||
.WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin, t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id && t.IsDeleted == false) && t.IsDeleted == false)
|
||||
.ProjectTo<TrialDetailDTO>(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id });
|
||||
.ProjectTo<TrialDetailDTO>(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id , isEn_Us= _userInfo.IsEn_Us });
|
||||
|
||||
return await query.ToPagedListAsync(searchParam.PageIndex, searchParam.PageSize, string.IsNullOrWhiteSpace(searchParam.SortField) ? "CreateTime" : searchParam.SortField, searchParam.Asc);
|
||||
|
||||
@@ -118,7 +118,7 @@ namespace IRaCIS.Application.Services
|
||||
[HttpGet("{projectId:guid}")]
|
||||
public async Task<TrialDetailDTO> GetTrialInfoAndLockState(Guid projectId)
|
||||
{
|
||||
return (await _trialRepository.Where(o => o.Id == projectId).IgnoreQueryFilters().ProjectTo<TrialDetailDTO>(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
return (await _trialRepository.Where(o => o.Id == projectId).IgnoreQueryFilters().ProjectTo<TrialDetailDTO>(_mapper.ConfigurationProvider, new {isEn_Us = _userInfo.IsEn_Us }).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
|
||||
}
|
||||
|
||||
@@ -609,7 +609,7 @@ namespace IRaCIS.Application.Services
|
||||
.WhereIf(param.Status == 8, t => t.EnrollList.Any(u => u.EnrollStatus == EnrollStatus.InviteIntoGroup))
|
||||
.WhereIf(param.Status == 10, t => t.EnrollList.Any(u => u.EnrollStatus == EnrollStatus.DoctorReading))
|
||||
.WhereIf(param.Status == 14, t => t.EnrollList.Any(u => u.EnrollStatus == EnrollStatus.Finished))
|
||||
.ProjectTo<TrialDetailDTO>(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id });
|
||||
.ProjectTo<TrialDetailDTO>(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id, isEn_Us = _userInfo.IsEn_Us });
|
||||
|
||||
return await query.ToPagedListAsync(param.PageIndex, param.PageSize, string.IsNullOrWhiteSpace(param.SortField) ? "CreateTime" : param.SortField, param.Asc);
|
||||
|
||||
@@ -644,7 +644,7 @@ namespace IRaCIS.Application.Services
|
||||
.WhereIf(!string.IsNullOrEmpty(searchModel.Code), o => o.TrialCode.Contains(searchModel.Code))
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(searchModel.Indication), o => o.Indication.Contains(searchModel.Indication))
|
||||
.WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin, t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id))
|
||||
.ProjectTo<TrialDetailDTO>(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id });
|
||||
.ProjectTo<TrialDetailDTO>(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id ,isEn_Us = _userInfo.IsEn_Us });
|
||||
|
||||
|
||||
return await query.ToPagedListAsync(searchModel.PageIndex, searchModel.PageSize, string.IsNullOrWhiteSpace(searchModel.SortField) ? "CreateTime" : searchModel.SortField, searchModel.Asc);
|
||||
|
||||
@@ -65,16 +65,17 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
var userId = Guid.Empty;
|
||||
var userTypeEnumInt = 0;
|
||||
var isEn_Us = false;
|
||||
CreateMap<Trial, TrialDetailDTO>()
|
||||
.ForMember(x=>x.CriterionList,y=>y.MapFrom(z=>z.ReadingQuestionCriterionTrialList.Where(n=>n.IsConfirm).Select(m=>m.CriterionName)))
|
||||
.ForMember(d => d.DictionaryList, u => u.MapFrom(s => s.TrialDicList.Select(t => t.Dictionary).OrderBy(t => t.ShowOrder)))
|
||||
//.ForMember(d => d.Code, u => u.MapFrom(s => s.TrialCode))
|
||||
.ForMember(d => d.Sponsor, u => u.MapFrom(s => s.Sponsor.SponsorName))
|
||||
.ForMember(d => d.Phase, u => u.MapFrom(s => s.Phase.MappedValue))
|
||||
.ForMember(d => d.Phase, u => u.MapFrom(s => isEn_Us? s.Phase.Value: s.Phase.ValueCN))
|
||||
//.ForMember(d => d.DeclarationType, u => u.MapFrom(s => s.DeclarationType.MappedValue))
|
||||
.ForMember(d => d.IndicationType, u => u.MapFrom(s => s.IndicationType.MappedValue))
|
||||
.ForMember(d => d.IndicationType, u => u.MapFrom(s => isEn_Us ? s.IndicationType.Value:s.IndicationType.ValueCN))
|
||||
.ForMember(d => d.CRO, u => u.MapFrom(s => s.CRO.CROName))
|
||||
.ForMember(d => d.ReviewMode, u => u.MapFrom(s => s.ReviewMode.MappedValue))
|
||||
.ForMember(d => d.ReviewMode, u => u.MapFrom(s => isEn_Us ? s.ReviewMode.Value:s.ReviewMode.ValueCN))
|
||||
//.ForMember(d => d.ReviewType, u => u.MapFrom(s => s.ReviewType.Value))
|
||||
.ForMember(d => d.IsLocked, u => u.MapFrom(s => s.WorkloadList.Any(u => u.DataFrom == (int)WorkLoadFromStatus.FinalConfirm)))
|
||||
//.ForMember(d => d.SiteCount, u => u.MapFrom(s => userTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator ? s.TrialSiteUserList.Count(k => k.UserId == userId) : s.TrialSiteList.Count()))
|
||||
@@ -111,7 +112,6 @@ namespace IRaCIS.Core.Application.Service
|
||||
.ForMember(d => d.HospitalName, u => u.MapFrom(s => s.Hospital.HospitalName));
|
||||
|
||||
//trial site 选择列表 subjectVisit pannel 模式添加的时候
|
||||
var isEn_Us = false;
|
||||
|
||||
CreateMap<Site, TrialSiteScreeningDTO>()
|
||||
.ForMember(d => d.IsSelect, u => u.MapFrom(s => s.TrialSiteList.Any(k => k.TrialId == trialId)))
|
||||
|
||||
Reference in New Issue
Block a user