Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
commit
b031b4e971
|
@ -207,7 +207,7 @@ app.UseExceptionHandler(o => { });
|
|||
app.UseIRacisHostStaticFileStore(env);
|
||||
|
||||
//本地化
|
||||
app.UseLocalization(app.Services);
|
||||
await app.UseLocalization(app.Services);
|
||||
|
||||
app.UseForwardedHeaders();
|
||||
|
||||
|
|
|
@ -1,18 +1,24 @@
|
|||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infra.EFCore;
|
||||
using IRaCIS.Core.Infrastructure.Extention;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRaCIS.Core.API
|
||||
{
|
||||
public static class LocalizationConfig
|
||||
{
|
||||
|
||||
public static void UseLocalization(this IApplicationBuilder app,IServiceProvider serviceProvider)
|
||||
public static async Task UseLocalization(this IApplicationBuilder app,IServiceProvider serviceProvider)
|
||||
{
|
||||
var supportedCultures = new List<CultureInfo>
|
||||
{
|
||||
|
@ -38,6 +44,24 @@ namespace IRaCIS.Core.API
|
|||
//设置国际化I18n
|
||||
var localizer = serviceProvider.GetRequiredService<IStringLocalizer>();
|
||||
I18n.SetLocalizer(localizer);
|
||||
|
||||
//初始化国际化
|
||||
|
||||
var _internationalizationRepository = serviceProvider.GetRequiredService<IRepository<Internationalization>>();
|
||||
|
||||
//查询数据库的数据
|
||||
var toJsonList = await _internationalizationRepository.Where(t => t.InternationalizationType == 1).Select(t => new IRCGlobalInfoDTO()
|
||||
{
|
||||
Code = t.Code,
|
||||
Value = t.Value,
|
||||
ValueCN = t.ValueCN,
|
||||
Description = t.Description
|
||||
}).ToListAsync();
|
||||
|
||||
|
||||
await InternationalizationHelper.BatchAddJsonKeyValueAsync(toJsonList);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
using IRaCIS.Core.Domain.BaseModel;
|
||||
using MassTransit;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using System;
|
||||
|
||||
namespace IRaCIS.Core.API
|
||||
{
|
||||
|
@ -30,12 +31,13 @@ namespace IRaCIS.Core.API
|
|||
// 自动扫描程序集中的消费者并进行注册
|
||||
cfg.AddConsumers(typeof(UserSiteSurveySubmitedEventConsumer).Assembly);
|
||||
|
||||
//// 注册消费者
|
||||
//cfg.AddConsumer<AddSubjectTriggerConsumer>(); // 替换为你的消费者类
|
||||
//cfg.AddConsumer<AddSubjectTriggerConsumer2>();
|
||||
|
||||
|
||||
//Uri schedulerEndpoint = new Uri("queue:scheduler");
|
||||
//cfg.AddMessageScheduler(schedulerEndpoint);
|
||||
|
||||
cfg.AddPublishMessageScheduler();
|
||||
//cfg.AddHangfireConsumers();
|
||||
cfg.AddHangfireConsumers();
|
||||
|
||||
|
||||
|
||||
|
@ -45,8 +47,11 @@ namespace IRaCIS.Core.API
|
|||
//https://github.com/MassTransit/Sample-Hangfire/blob/master/src/Sample.Hangfire.Console/Program.cs
|
||||
cfg.UsePublishMessageScheduler();
|
||||
|
||||
//cfg.UseMessageScheduler(schedulerEndpoint);
|
||||
|
||||
|
||||
//使用 Hangfire 进行消息调度
|
||||
cfg.UseHangfireScheduler();
|
||||
//cfg.UseHangfireScheduler();
|
||||
|
||||
cfg.UseConsumeFilter(typeof(CultureInfoFilter<>), context,
|
||||
x => x.Include(type => type.IsAssignableTo(typeof(DomainEvent))));
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
using Hangfire;
|
||||
using Hangfire.Storage;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using IRaCIS.Core.Application.MassTransit.Consumer;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using MassTransit;
|
||||
using MassTransit.Mediator;
|
||||
using MassTransit.Scheduling;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
|
@ -18,7 +20,8 @@ namespace IRaCIS.Core.Application.Service.BackGroundJob
|
|||
public class IRaCISCHangfireJob(ILogger<IRaCISCHangfireJob> _logger,
|
||||
IRepository<Internationalization> _internationalizationRepository,
|
||||
IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository,
|
||||
IMessageScheduler _IMessageScheduler
|
||||
IMessageScheduler _iMessageScheduler,
|
||||
IBus _bus
|
||||
) : IIRaCISHangfireJob
|
||||
{
|
||||
public static string JsonFileFolder = Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources);
|
||||
|
@ -28,19 +31,7 @@ namespace IRaCIS.Core.Application.Service.BackGroundJob
|
|||
{
|
||||
_logger.LogInformation("项目启动 hangfire 任务初始化 执行开始~");
|
||||
|
||||
//初始化国际化
|
||||
|
||||
//查询数据库的数据
|
||||
var toJsonList = await _internationalizationRepository.Where(t => t.InternationalizationType == 1).Select(t => new IRCGlobalInfoDTO()
|
||||
{
|
||||
Code = t.Code,
|
||||
Value = t.Value,
|
||||
ValueCN = t.ValueCN,
|
||||
Description = t.Description
|
||||
}).ToListAsync();
|
||||
|
||||
|
||||
await InternationalizationHelper.BatchAddJsonKeyValueAsync(toJsonList);
|
||||
|
||||
//创建邮件定时任务
|
||||
await InitSysAndTrialCronJobAsync();
|
||||
|
@ -80,7 +71,9 @@ namespace IRaCIS.Core.Application.Service.BackGroundJob
|
|||
break;
|
||||
}
|
||||
|
||||
|
||||
//var schedulerEndpoint = await _bus.GetSendEndpoint(new Uri("queue:hangfire"));
|
||||
//await schedulerEndpoint.ScheduleRecurringSend<QCImageQuestionSchedule>(new Uri("queue:mt-message-queue"), new QCImageQuestionSchedule() { ScheduleId = jobId, CronExpression = "0 0/1 * 1/1 * ? *" }, new PollExternalSystem { });
|
||||
//await schedulerEndpoint.ScheduleRecurringSend<QCImageQuestionSchedule>(new Uri("queue:hangfire"), new QCImageQuestionSchedule() { ScheduleId = jobId + jobId, CronExpression = "0 0/1 * 1/1 * ? *" }, new PollExternalSystem { });
|
||||
|
||||
|
||||
HangfireJobHelper.AddOrUpdateTrialCronJob(jobId, task.TrialId, task.BusinessScenarioEnum, task.EmailCron);
|
||||
|
@ -88,7 +81,7 @@ namespace IRaCIS.Core.Application.Service.BackGroundJob
|
|||
|
||||
}
|
||||
|
||||
|
||||
public class PollExternalSystem { }
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -12902,14 +12902,14 @@
|
|||
加急的医学反馈任务 通知MIM
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.MassTransit.Consumer.UrgentMedicalReviewAddedEventConsumer.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.User},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskMedicalReview},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},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})">
|
||||
<member name="M:IRaCIS.Core.Application.MassTransit.Consumer.UrgentMedicalReviewAddedEventConsumer.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.User},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskMedicalReview},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},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>
|
||||
加急的医学反馈任务 通知MIM
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.MassTransit.Consumer.UrgentMedicalReviewAddedEventConsumer.Consume(MassTransit.ConsumeContext{IRaCIS.Core.Domain.UrgentMedicalReviewAddedEvent})">
|
||||
<summary>
|
||||
加急的医学反馈任务 通知MIM
|
||||
加急的医学反馈任务 通知MIM (026,027)
|
||||
</summary>
|
||||
<param name="context"></param>
|
||||
<returns></returns>
|
||||
|
@ -12985,6 +12985,11 @@
|
|||
通知PM 进行一致性核查
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.QCClaimTaskEventConsumer">
|
||||
<summary>
|
||||
QC 领取了质控任务
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.MasstransitTestConsumer">
|
||||
<summary>
|
||||
meditor send 的时候,请求流会先到消费者,返回后才会执行后续代码
|
||||
|
|
|
@ -83,3 +83,13 @@ public class CheckStateChangedToAuditEventConsumer : IConsumer<CheckStateChanged
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// QC 领取了质控任务
|
||||
/// </summary>
|
||||
public class QCClaimTaskEventConsumer : IConsumer<QCClaimTaskEvent>
|
||||
{
|
||||
public Task Consume(ConsumeContext<QCClaimTaskEvent> context)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ public class TestMasstransitService : BaseService
|
|||
await _mediatorScoped.Publish(new MasstransiTestCommand { value = "message at " + DateTime.Now.ToString() });
|
||||
|
||||
|
||||
//await _scheduler.SchedulePublish(DateTime.Now.AddSeconds(10), new MasstransitHangfireTest() { value = "message at " + DateTime.Now.ToString() });
|
||||
await _scheduler.SchedulePublish(DateTime.Now.AddSeconds(10), new MasstransiTestCommand() { value = "message at " + DateTime.Now.ToString() });
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using MassTransit;
|
||||
using IRaCIS.Core.Application.MassTransit.Command;
|
||||
using MassTransit;
|
||||
using MassTransit.Scheduling;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
@ -22,9 +23,9 @@ public abstract class IRCRecurringSchedule :
|
|||
public string TimeZoneId { get; protected set; }
|
||||
public DateTimeOffset StartTime { get; protected set; }
|
||||
public DateTimeOffset? EndTime { get; protected set; }
|
||||
public string ScheduleId { get; private set; }
|
||||
public string ScheduleId { get; set; }
|
||||
public string ScheduleGroup { get; private set; }
|
||||
public string CronExpression { get; protected set; }
|
||||
public string CronExpression { get; set; }
|
||||
public string Description { get; protected set; }
|
||||
}
|
||||
|
||||
|
@ -53,4 +54,15 @@ public class ImageQCSchedule : IRCRecurringSchedule
|
|||
}
|
||||
|
||||
|
||||
public class QCImageQuestionScheduleConsumer : IConsumer<QCImageQuestionSchedule>
|
||||
{
|
||||
public Task Consume(ConsumeContext<QCImageQuestionSchedule> context)
|
||||
{
|
||||
Console.WriteLine(DateTime.Now);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -184,6 +184,9 @@ namespace IRaCIS.Core.Application.ViewModel
|
|||
public string EmailHtmlContent { get; set; } = string.Empty;
|
||||
public string EmailHtmlContentCN { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public int? EmailDelaySeconds { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -206,7 +209,6 @@ namespace IRaCIS.Core.Application.ViewModel
|
|||
public string FromEmail { get; set; } = string.Empty;
|
||||
|
||||
public List<Guid> BlackUserIdList { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -17,12 +17,13 @@ public abstract class DomainEvent
|
|||
public Guid EventId { get; set; } = NewId.NextSequentialGuid();
|
||||
|
||||
//是不是延迟消费的事件,需要用定时任务调度
|
||||
public bool IsScheduleEvent { get; set; }=false;
|
||||
public bool IsDelayScheduleEvent => DelaySeconds!=null && DelaySeconds > 0;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 在事件产生多少s后开始消费该事件
|
||||
/// </summary>
|
||||
public int DelaySeconds{ get; set; }
|
||||
public int? DelaySeconds{ get; set; }
|
||||
|
||||
public string CultureInfoName { get; set; } = CultureInfo.CurrentCulture.Name;
|
||||
}
|
||||
|
|
|
@ -40,6 +40,10 @@ public class EmailNoticeConfig : BaseFullDeleteAuditEntity
|
|||
|
||||
[Comment("发送周期")]
|
||||
public string EmailCron { get; set; } = null!;
|
||||
|
||||
[Comment("邮件延时秒数,比如一个事件触发,延迟多少s后才发邮件")]
|
||||
public int? EmailDelaySeconds { get; set; } = null!;
|
||||
|
||||
[MaxLength]
|
||||
public string EmailHtmlContent { get; set; } = null!;
|
||||
[MaxLength]
|
||||
|
|
|
@ -82,6 +82,10 @@ public class TrialEmailNoticeConfig : BaseFullDeleteAuditEntity
|
|||
|
||||
public Guid? TrialReadingCriterionId { get; set; }
|
||||
|
||||
|
||||
[Comment("邮件延时秒数,比如一个事件触发,延迟多少s后才发邮件")]
|
||||
public int? EmailDelaySeconds { get; set; } = null!;
|
||||
|
||||
}
|
||||
|
||||
[Comment("项目 - 项目邮件用户黑名单")]
|
||||
|
|
|
@ -76,4 +76,14 @@ public class CheckStateChangedToAuditEvent : DomainEvent
|
|||
{
|
||||
public Guid SubjectVisitId { get; set; }
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// QC 领取了质控任务
|
||||
/// </summary>
|
||||
public class QCClaimTaskEvent : DomainEvent
|
||||
{
|
||||
public Guid SubjectVisitId { get; set; }
|
||||
|
||||
public Guid CurrentActionUserId { get; set; }
|
||||
}
|
|
@ -71,6 +71,7 @@ public static class DBContext_Ext
|
|||
var originSubmitState = entry.Property(p => p.SubmitState).OriginalValue;
|
||||
var originAuditState = entry.Property(p => p.AuditState).OriginalValue;
|
||||
var originCheckState = entry.Property(p => p.CheckState).OriginalValue;
|
||||
var originCurrentActionUserId = entry.Property(p => p.CurrentActionUserId).OriginalValue;
|
||||
|
||||
//入组或者PD 才执行下面的逻辑
|
||||
if ((subjectVisit.IsEnrollmentConfirm || subjectVisit.PDState == PDStateEnum.PDProgress))
|
||||
|
@ -91,6 +92,16 @@ public static class DBContext_Ext
|
|||
subjectVisit.AddDomainEvent(new CheckStateChangedToAuditEvent() { SubjectVisitId = subjectVisit.Id });
|
||||
}
|
||||
|
||||
if (originCurrentActionUserId == null && subjectVisit.CurrentActionUserId != null)
|
||||
{
|
||||
var delaySeconds = dbContext.TrialEmailNoticeConfig.Where(t => t.BusinessScenarioEnum == EmailBusinessScenario.EligibilityVerification_PendingClaim)
|
||||
.Select(t => t.EmailDelaySeconds).FirstOrDefault();
|
||||
|
||||
subjectVisit.AddDomainEvent(new QCClaimTaskEvent() { SubjectVisitId = subjectVisit.Id, DelaySeconds= delaySeconds, CurrentActionUserId = (Guid)subjectVisit.CurrentActionUserId });
|
||||
|
||||
}
|
||||
|
||||
|
||||
//添加进记录
|
||||
eventStoreList.AddRange(GetStoreEvents(subjectVisit.DomainEvents));
|
||||
}
|
||||
|
@ -180,7 +191,7 @@ public static class DBContext_Ext
|
|||
if (findSubjectVisit.IsEnrollmentConfirm || findSubjectVisit.PDState == PDStateEnum.PDProgress)
|
||||
{
|
||||
|
||||
taskMedicalReview.AddDomainEvent(new UrgentMedicalReviewAddedEvent() { IsPD= findSubjectVisit.PDState == PDStateEnum.PDProgress, MedicalReviewId = taskMedicalReview.Id, VisitTaskId = taskMedicalReview.VisitTaskId });
|
||||
taskMedicalReview.AddDomainEvent(new UrgentMedicalReviewAddedEvent() { IsPD = findSubjectVisit.PDState == PDStateEnum.PDProgress, MedicalReviewId = taskMedicalReview.Id, VisitTaskId = taskMedicalReview.VisitTaskId });
|
||||
|
||||
//添加进记录
|
||||
eventStoreList.AddRange(GetStoreEvents(taskMedicalReview.DomainEvents));
|
||||
|
@ -220,7 +231,7 @@ public static class DBContext_Ext
|
|||
}
|
||||
else if (entry.State == EntityState.Added && readingMedicalReviewDialog.UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer)
|
||||
{
|
||||
readingMedicalReviewDialog.AddDomainEvent(new UrgentIRRepliedMedicalReview() { IsPD= findSubjectVisit.PDState == PDStateEnum.PDProgress, MedicalReviewId= readingMedicalReviewDialog.TaskMedicalReviewId, ReadingMedicalReviewDialogId = readingMedicalReviewDialog.Id });
|
||||
readingMedicalReviewDialog.AddDomainEvent(new UrgentIRRepliedMedicalReview() { IsPD = findSubjectVisit.PDState == PDStateEnum.PDProgress, MedicalReviewId = readingMedicalReviewDialog.TaskMedicalReviewId, ReadingMedicalReviewDialogId = readingMedicalReviewDialog.Id });
|
||||
}
|
||||
|
||||
//添加进记录
|
||||
|
@ -259,7 +270,7 @@ public static class DBContext_Ext
|
|||
if (findSubjectVisit.IsEnrollmentConfirm || findSubjectVisit.PDState == PDStateEnum.PDProgress)
|
||||
{
|
||||
|
||||
visitTask.AddDomainEvent(new UrgentApplyedReReading() { VisitTaskId = visitTask.Id, ReReadingApplyState= visitTask.ReReadingApplyState });
|
||||
visitTask.AddDomainEvent(new UrgentApplyedReReading() { VisitTaskId = visitTask.Id, ReReadingApplyState = visitTask.ReReadingApplyState });
|
||||
|
||||
//添加进记录
|
||||
eventStoreList.AddRange(GetStoreEvents(visitTask.DomainEvents));
|
||||
|
@ -275,7 +286,7 @@ public static class DBContext_Ext
|
|||
|
||||
private static List<EventStoreRecord> GetStoreEvents(IReadOnlyCollection<DomainEvent> domainEvents)
|
||||
{
|
||||
return domainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventTypeName=t.GetType().Name, EventData = t.ToJsonStr() }).ToList();
|
||||
return domainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventTypeName = t.GetType().Name, EventData = t.ToJsonStr() }).ToList();
|
||||
}
|
||||
public class EnrollmentConfirmAndPD
|
||||
{
|
||||
|
|
|
@ -58,10 +58,10 @@ namespace IRaCIS.Core.Infra.EFCore.Interceptor
|
|||
//这种方式会导致消息没处理
|
||||
//await publishEndpoint.Publish(domainEvent);
|
||||
|
||||
if (domainEvent.IsScheduleEvent)
|
||||
if (domainEvent.IsDelayScheduleEvent)
|
||||
{
|
||||
//延迟调度的消息,比如1h后再消费
|
||||
await _scheduler.SchedulePublish(DateTime.Now.AddSeconds(domainEvent.DelaySeconds), (object)domainEvent);
|
||||
await _scheduler.SchedulePublish(DateTime.Now.AddSeconds((int)domainEvent.DelaySeconds!), (object)domainEvent);
|
||||
}
|
||||
|
||||
await _mediator.Publish(domainEvent.GetType(), domainEvent);
|
||||
|
|
|
@ -78,7 +78,7 @@ steps:
|
|||
|
||||
trigger:
|
||||
branch:
|
||||
- Test_IRC_Net8
|
||||
- Test_IRC_Net8—_SCP_Disable
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
|
|
Loading…
Reference in New Issue