IRC_NewDev
he 2024-10-22 14:55:39 +08:00
parent e26c9b6c1a
commit 6d98b140e1
8 changed files with 121 additions and 60 deletions

View File

@ -1276,6 +1276,13 @@
<param name="doctorId">医生Id</param> <param name="doctorId">医生Id</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.ResearchPublicationService.AddOrUpdateResearchPublicationInfo(IRaCIS.Application.Contracts.ResearchPublicationInfoDTO)">
<summary>
新增或修改ResearchPublication 传null不修改
</summary>
<param name="param"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.TrialExperienceService.GetTrialExperience(System.Guid)"> <member name="M:IRaCIS.Core.Application.Service.TrialExperienceService.GetTrialExperience(System.Guid)">
<summary> <summary>
根据医生Id获取临床试验经历 界面所有数据 根据医生Id获取临床试验经历 界面所有数据
@ -13013,7 +13020,12 @@
</member> </member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.CRCRepliedQCChallengeEventConsumer"> <member name="T:IRaCIS.Core.Application.MassTransit.Consumer.CRCRepliedQCChallengeEventConsumer">
<summary> <summary>
CRC 回复质控质疑 通知QC CRC 回复质控质疑 通知QC Code012013
</summary>
</member>
<member name="M:IRaCIS.Core.Application.MassTransit.Consumer.CRCRepliedQCChallengeEventConsumer.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.User},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialUser},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.QCChallenge},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.QCChallengeDialog},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Dictionary},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.EmailNoticeConfig},Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.SystemEmailSendConfig})">
<summary>
CRC 回复质控质疑 通知QC Code012013
</summary> </summary>
</member> </member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.QCRepliedQCChallengeEventConsumer"> <member name="T:IRaCIS.Core.Application.MassTransit.Consumer.QCRepliedQCChallengeEventConsumer">

View File

@ -115,8 +115,8 @@ public class CRCRepliedQCChallengeEventConsumer(
IRepository<TrialUser> _trialUseRepository, IRepository<TrialUser> _trialUseRepository,
IRepository<SubjectVisit> _subjectVisitRepository, IRepository<SubjectVisit> _subjectVisitRepository,
IRepository<Trial> _trialRepository, IRepository<Trial> _trialRepository,
IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository, IRepository<QCChallenge> _qCChallengeRepository,
IRepository<VisitTask> _visitTaskRepository, IRepository<QCChallengeDialog> _qCChallengeDialogRepository,
IRepository<Dictionary> _dictionaryRepository, IRepository<Dictionary> _dictionaryRepository,
IRepository<EmailNoticeConfig> _emailNoticeConfigrepository, IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<CRCRepliedQCChallengeEvent> IOptionsMonitor<SystemEmailSendConfig> systemEmailConfig) : IConsumer<CRCRepliedQCChallengeEvent>
@ -125,75 +125,73 @@ public class CRCRepliedQCChallengeEventConsumer(
private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue; private readonly SystemEmailSendConfig _systemEmailConfig = systemEmailConfig.CurrentValue;
public async Task Consume(ConsumeContext<CRCRepliedQCChallengeEvent> context) public async Task Consume(ConsumeContext<CRCRepliedQCChallengeEvent> context)
{ {
//Console.WriteLine("发送(Code012013) 【加急项目所有IQC待领取质控任务】邮件"); Console.WriteLine("发送(Code012013) 【CRC 回复质控质疑 通知QC】邮件");
//var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US; var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
//var subjectVisitId = context.Message.SubjectVisitId; var subjectVisitId = context.Message.SubjectVisitId;
//var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).FirstOrDefaultAsync(); var subjectVisit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).Include(x => x.Subject).Include(x => x.CurrentActionUser).FirstNotNullAsync();
//var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();
//var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.IQC).ToList();
//var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId); var qCChallengeDialog = await _qCChallengeDialogRepository.Where(x => x.Id == context.Message.QCChallengeDialogId).Include(x => x.QCChallenge).FirstNotNullAsync();
//var auditStateCode = "AuditStatePE";
//if (trialInfo.QCProcessEnum == TrialQCProcess.DoubleAudit)
//{
// auditStateCode = "AuditStateRC";
//}
//foreach (var userinfo in userinfoList)
//{
// var messageToSend = new MimeMessage();
// //发件地址
// messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
// messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
// var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
var trialUser = await _trialUseRepository.Where(x => x.TrialId == subjectVisit.TrialId).Include(x => x.User).Select(x => x.User).ToListAsync();
var userinfoList = trialUser.Where(x => x.UserTypeEnum == UserTypeEnum.IQC).ToList();
var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == subjectVisit.TrialId);
// var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto() var userinfo = subjectVisit.CurrentActionUser;
// {
// DictionaryRepository = _dictionaryRepository, var messageToSend = new MimeMessage();
// IsEn_US = isEn_US, //发件地址
// DictionaryList = new List<DictionaryDto>() messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
// { messageToSend.To.Add(new MailboxAddress(String.Empty, userinfo.EMail));
// new DictionaryDto (){DictionaryCode= auditStateCode,EnumValue=subjectVisit.AuditState.GetEnumInt(), }, //审核状态
// }
// });
// Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input => var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
// {
// var subjectCode = subjectVisit.Subject.Code;
// var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, subjectVisit.VisitName);
// var htmlBodyStr = string.Format(
// CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
// userinfo.FullName, // 用户名 {0}
// trialInfo.ExperimentName, // 项目 {1}
// subjectCode, // 受试者 {2}
// subjectVisit.VisitName, // 访视 {3}
// dictionValue[0], // 审核状态 {4}
// _systemEmailConfig.SiteUrl // 链接 {5}
// );
// return (topicStr, htmlBodyStr);
// };
// await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository, var dictionValue = await CommonEmailHelper.TranslationDictionary(new TranslationDictionaryDto()
{
// context.Message.IsPd ? EmailBusinessScenario.PDVerification_PendingImageQCClaim : EmailBusinessScenario.EligibilityVerification_PendingClaim, DictionaryRepository = _dictionaryRepository,
IsEn_US = isEn_US,
DictionaryList = new List<DictionaryDto>()
{
new DictionaryDto (){DictionaryCode= "YesOrNo",EnumValue=qCChallengeDialog.QCChallenge.IsClosed.ToString(), }, //是否关闭
// messageToSend, emailConfigFunc); }
});
// await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig); Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
{
var subjectCode = subjectVisit.Subject.Code;
var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo, subjectCode, subjectVisit.VisitName);
var htmlBodyStr = string.Format(
CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
userinfo.FullName, // 用户名 {0}
trialInfo.ExperimentName, // 项目 {1}
subjectCode, // 受试者 {2}
subjectVisit.VisitName, // 访视 {3}
dictionValue[0], // 是否关闭 {4}
qCChallengeDialog.TalkContent, // 质疑内容{5}
_systemEmailConfig.SiteUrl // 链接 {6}
);
return (topicStr, htmlBodyStr);
};
await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository,
context.Message.IsPd ? EmailBusinessScenario.PDVerification_UnderQCQuery : EmailBusinessScenario.EligibilityVerification_Pending,
messageToSend, emailConfigFunc);
await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
} }
} }

View File

@ -16,4 +16,20 @@
} }
public class ResearchPublicationInfoDTO
{
public Guid? Id { get; set; }
public Guid DoctorId { get; set; }
public string? Research { get; set; }
public string? Grants { get; set; }
public string? Publications { get; set; }
public string? AwardsHonors { get; set; }
public string? ResearchCN { get; set; }
public string? GrantsCN { get; set; }
public string? PublicationsCN { get; set; }
public string? AwardsHonorsCN { get; set; }
}
} }

View File

@ -31,5 +31,18 @@ namespace IRaCIS.Core.Application.Service
return ResponseOutput.Ok(entity.Id); return ResponseOutput.Ok(entity.Id);
} }
/// <summary>
/// 新增或修改ResearchPublication 传null不修改
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
[HttpPost]
public async Task<IResponseOutput> AddOrUpdateResearchPublicationInfo(ResearchPublicationInfoDTO param)
{
var entity = await _researchPublicationRepository.InsertOrUpdateAsync(param, true);
return ResponseOutput.Ok(entity.Id);
}
} }
} }

View File

@ -2,6 +2,7 @@
using AutoMapper.EquivalencyExpression; using AutoMapper.EquivalencyExpression;
using IRaCIS.Application.Contracts; using IRaCIS.Application.Contracts;
using IRaCIS.Application.Contracts.Pay; using IRaCIS.Application.Contracts.Pay;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
namespace IRaCIS.Core.Application.Service namespace IRaCIS.Core.Application.Service
@ -38,6 +39,10 @@ namespace IRaCIS.Core.Application.Service
CreateMap<ResearchPublicationDTO, ResearchPublication>().EqualityComparison((odto, o) => odto.Id == o.Id); CreateMap<ResearchPublicationDTO, ResearchPublication>().EqualityComparison((odto, o) => odto.Id == o.Id);
CreateMap<TrialExperienceCommand, TrialExperience>().EqualityComparison((odto, o) => odto.Id == o.Id); CreateMap<TrialExperienceCommand, TrialExperience>().EqualityComparison((odto, o) => odto.Id == o.Id);
CreateMap<ResearchPublicationInfoDTO, ResearchPublication>()
.ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));
//医生账户 //医生账户
CreateMap<DoctorAccountLoginDTO, Doctor>(); CreateMap<DoctorAccountLoginDTO, Doctor>();
CreateMap<DoctorAccountRegisterModel, Doctor>(); CreateMap<DoctorAccountRegisterModel, Doctor>();

View File

@ -15,10 +15,17 @@ public class SubjectVisit : BaseFullDeleteAuditEntity
public SubjectVisit OutPlanPreviousVisit { get; set; } public SubjectVisit OutPlanPreviousVisit { get; set; }
[ForeignKey("ForwardUserId")] [ForeignKey("ForwardUserId")]
public User ForwardUser { get; set; } public User ForwardUser { get; set; }
/// <summary>
/// 初审
/// </summary>
[JsonIgnore] [JsonIgnore]
[ForeignKey("PreliminaryAuditUserId")] [ForeignKey("PreliminaryAuditUserId")]
public User PreliminaryAuditUser { get; set; } public User PreliminaryAuditUser { get; set; }
/// <summary>
/// 复审
/// </summary>
[JsonIgnore] [JsonIgnore]
[ForeignKey("ReviewAuditUserId")] [ForeignKey("ReviewAuditUserId")]
public User ReviewAuditUser { get; set; } public User ReviewAuditUser { get; set; }
@ -105,6 +112,7 @@ public class SubjectVisit : BaseFullDeleteAuditEntity
[Comment("审核状态")] [Comment("审核状态")]
public AuditStateEnum AuditState { get; set; } public AuditStateEnum AuditState { get; set; }
public ForwardStateEnum ForwardState { get; set; } public ForwardStateEnum ForwardState { get; set; }
[Comment("单审通过人")] [Comment("单审通过人")]
public Guid? PreliminaryAuditUserId { get; set; } public Guid? PreliminaryAuditUserId { get; set; }
@ -119,6 +127,9 @@ public class SubjectVisit : BaseFullDeleteAuditEntity
public Guid? ForwardUserId { get; set; } public Guid? ForwardUserId { get; set; }
public DateTime? ForwardTime { get; set; } public DateTime? ForwardTime { get; set; }
/// <summary>
/// 当前领取
/// </summary>
[Comment("当前质控领取人")] [Comment("当前质控领取人")]
public Guid? CurrentActionUserId { get; set; } public Guid? CurrentActionUserId { get; set; }
public DateTime? CurrentActionUserExpireTime { get; set; } public DateTime? CurrentActionUserExpireTime { get; set; }

View File

@ -24,6 +24,9 @@ public class CRCSubmitedAndQCToAuditEvent : DomainEvent
/// </summary> /// </summary>
public class CRCRepliedQCChallengeEvent : DomainEvent public class CRCRepliedQCChallengeEvent : DomainEvent
{ {
public bool IsPd { get; set; }
public Guid QCChallengeDialogId { get; set; } public Guid QCChallengeDialogId { get; set; }
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
@ -37,6 +40,9 @@ public class CRCRepliedQCChallengeEvent : DomainEvent
/// </summary> /// </summary>
public class QCRepliedQCChallengeEvent : DomainEvent public class QCRepliedQCChallengeEvent : DomainEvent
{ {
public bool IsPd { get; set; }
public Guid QCChallengeDialogId { get; set; } public Guid QCChallengeDialogId { get; set; }
public Guid TrialId { get; set; } public Guid TrialId { get; set; }

View File

@ -121,12 +121,12 @@ public static class DBContext_Ext
//CRC 针对质控质疑进行回复 //CRC 针对质控质疑进行回复
if (entry.State == EntityState.Added && qCChallengeDialog.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator) if (entry.State == EntityState.Added && qCChallengeDialog.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator)
{ {
qCChallengeDialog.AddDomainEvent(new CRCRepliedQCChallengeEvent() { QCChallengeDialogId = qCChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId }); qCChallengeDialog.AddDomainEvent(new CRCRepliedQCChallengeEvent() { IsPd = findSubjectVisit.PDState == PDStateEnum.PDProgress, QCChallengeDialogId = qCChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId });
} }
//QC 针对质控质疑进行回复 //QC 针对质控质疑进行回复
else if (entry.State == EntityState.Added && qCChallengeDialog.UserTypeEnum == UserTypeEnum.IQC) else if (entry.State == EntityState.Added && qCChallengeDialog.UserTypeEnum == UserTypeEnum.IQC)
{ {
qCChallengeDialog.AddDomainEvent(new QCRepliedQCChallengeEvent() { QCChallengeDialogId = qCChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId }); qCChallengeDialog.AddDomainEvent(new QCRepliedQCChallengeEvent() { IsPd = findSubjectVisit.PDState == PDStateEnum.PDProgress, QCChallengeDialogId = qCChallengeDialog.Id, SubjectVisitId = findSubjectVisit.Id, TrialId = findSubjectVisit.TrialId });
} }