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

IRC_NewDev
he 2024-09-27 14:45:56 +08:00
commit aba7dfdec9
22 changed files with 170 additions and 72 deletions

View File

@ -34,6 +34,7 @@ using Microsoft.AspNetCore.Diagnostics;
using IRaCIS.Core.Application.MassTransit.Command;
using IRaCIS.Core.Application.MassTransit.Consumer;
using DocumentFormat.OpenXml.InkML;
using IRaCIS.Core.Domain;
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
@ -149,13 +150,14 @@ builder.Services.AddJWTAuthSetup(_configuration);
builder.Services.AddMediator(cfg =>
{
cfg.AddConsumer<ConsistencyCheckConsumer>();
cfg.AddConsumer<AddUserLogTriggerConsumer>();
});
// 添加 MassTransit 和 InMemory 传输
builder.Services.AddMassTransit(cfg =>
{
// 注册消费者
cfg.AddConsumer<AddSubjectTriggerConsumer>(); // 替换为你的消费者类
//cfg.AddConsumer<AddSubjectTriggerConsumer>(); // 替换为你的消费者类
// 使用 InMemory 作为消息传递机制
cfg.UsingInMemory((context, cfg) =>

View File

@ -81,12 +81,12 @@ namespace IRaCIS.Core.API
triggerOptions.AddTrigger<AddCRCCliniaclDataTrigger>();
triggerOptions.AddTrigger<SubjectVisitCheckPassedTrigger>();
triggerOptions.AddTrigger<SubjectVisitFinalVisitTrigger>();
triggerOptions.AddTrigger<SubjectVisitTrigger>();
triggerOptions.AddTrigger<SubjectVisitScanDateTrigger>();
triggerOptions.AddTrigger<TrialCriterionSignTrigger>();
triggerOptions.AddTrigger<TableQuestionRowTrigger>();
//triggerOptions.AddTrigger<AddlTrialUserTrigger>();
triggerOptions.AddTrigger<VisitTaskIsFrontTaskNeedSignButNotSignTrigger>();
triggerOptions.AddTrigger<VisitTaskIbeforeTrigger>();
triggerOptions.AddTrigger<JudgeVisitTaskTrigger>();
triggerOptions.AddTrigger<UserLogTrigger>();

View File

@ -85,4 +85,8 @@
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="Triggers\TempAbandon\" />
</ItemGroup>
</Project>

View File

@ -12648,6 +12648,24 @@
构造函数注入
</summary>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.AddSubjectTriggerConsumer">
<summary>
添加Subject 触发添加访视 不能代替 Trigger,稽查BatchId 不一致 暂时废弃
</summary>
<param name="_subjectVisitRepository"></param>
<param name="_visitStageRepository"></param>
<param name="_trialRepository"></param>
<param name="_mapper"></param>
</member>
<member name="M:IRaCIS.Core.Application.MassTransit.Consumer.AddSubjectTriggerConsumer.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitStage},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},AutoMapper.IMapper)">
<summary>
添加Subject 触发添加访视 不能代替 Trigger,稽查BatchId 不一致 暂时废弃
</summary>
<param name="_subjectVisitRepository"></param>
<param name="_visitStageRepository"></param>
<param name="_trialRepository"></param>
<param name="_mapper"></param>
</member>
<member name="T:IRaCIS.Core.Application.ViewModel.TaskAllocationRuleView">
<summary> TaskAllocationRuleView 列表视图模型 </summary>
</member>
@ -16079,16 +16097,6 @@
<param name="trialConfig"></param>
<returns></returns>
</member>
<member name="T:IRaCIS.Core.Application.Triggers.AddSubjectTrigger">
<summary>
添加访视计划 要给改项目下的所有Subject 添加该访视
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Triggers.AddSubjectTrigger.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitStage},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},AutoMapper.IMapper)">
<summary>
添加访视计划 要给改项目下的所有Subject 添加该访视
</summary>
</member>
<member name="T:IRaCIS.Core.Application.Triggers.SubjectStateTrigger">
<summary>
@ -16099,16 +16107,6 @@
</summary>
</member>
<member name="T:IRaCIS.Core.Application.Triggers.SubjectVisitCheckPassedTrigger">
<summary>
处理 访视 末次评估 会影响Subject 状态
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitCheckPassedTrigger.#ctor(IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Application.Interfaces.ISubjectCriteriaEvaluationService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluation})">
<summary>
处理 访视 末次评估 会影响Subject 状态
</summary>
</member>
<member name="T:IRaCIS.Core.Application.Triggers.SubjectVisitFinalVisitTrigger">
<summary>
处理 访视 末次评估 会影响Subject 状态
@ -16126,21 +16124,35 @@
<param name="subjectVisit"></param>
<returns></returns>
</member>
<member name="T:IRaCIS.Core.Application.Triggers.SubjectVisitTrigger">
<member name="T:IRaCIS.Core.Application.Triggers.VisitTaskIsFrontTaskNeedSignButNotSignTrigger">
<summary>
处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期
维护 IsFrontTaskNeedSignButNotSign 字段 另外附加评估结果
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitTrigger.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Application.Service.Reading.Interface.IClinicalAnswerService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy})">
<member name="M:IRaCIS.Core.Application.Triggers.VisitTaskIsFrontTaskNeedSignButNotSignTrigger.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial})">
<summary>
处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期
维护 IsFrontTaskNeedSignButNotSign 字段 另外附加评估结果
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitTrigger.UpdateSubjectVisitSubmitStateAsync(System.Guid)">
<summary>处理提交状态</summary>
<member name="T:IRaCIS.Core.Application.Triggers.AddSubjectTrigger">
<summary>
添加访视计划 要给改项目下的所有Subject 添加该访视
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitTrigger.UpdateSubjectVisitImageDateAsync(System.Guid)">
<summary>处理拍片日期</summary>
<member name="M:IRaCIS.Core.Application.Triggers.AddSubjectTrigger.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitStage},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},AutoMapper.IMapper)">
<summary>
添加访视计划 要给改项目下的所有Subject 添加该访视
</summary>
</member>
<member name="T:IRaCIS.Core.Application.Triggers.SubjectVisitCheckPassedTrigger">
<summary>
处理 访视 末次评估 会影响Subject 状态
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitCheckPassedTrigger.#ctor(IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Application.Interfaces.ISubjectCriteriaEvaluationService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluation})">
<summary>
处理 访视 末次评估 会影响Subject 状态
</summary>
</member>
<member name="T:IRaCIS.Core.Application.Triggers.TrialCriterionSignTrigger">
<summary>
@ -16152,7 +16164,7 @@
因为可能先一致性核查通过,生成其他标准的任务了,新签名的标准也需要产生任务
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Triggers.VisitTaskIbeforeTrigger.AfterSave(EntityFrameworkCore.Triggered.ITriggerContext{IRaCIS.Core.Domain.Models.VisitTask},System.Threading.CancellationToken)">
<member name="M:IRaCIS.Core.Application.Triggers.JudgeVisitTaskTrigger.AfterSave(EntityFrameworkCore.Triggered.ITriggerContext{IRaCIS.Core.Domain.Models.VisitTask},System.Threading.CancellationToken)">
<summary>
因为维护状态先后顺序导致 裁判任务关联的 任务上的JudgeVisitTaskId==nulll 在这里需要重新设置下
@ -16162,7 +16174,7 @@
<param name="cancellationToken"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Triggers.VisitTaskIbeforeTrigger.BeforeSave(EntityFrameworkCore.Triggered.ITriggerContext{IRaCIS.Core.Domain.Models.VisitTask},System.Threading.CancellationToken)">
<member name="M:IRaCIS.Core.Application.Triggers.JudgeVisitTaskTrigger.BeforeSave(EntityFrameworkCore.Triggered.ITriggerContext{IRaCIS.Core.Domain.Models.VisitTask},System.Threading.CancellationToken)">
<summary>
比如 两个任务产生了裁判然后其中一个人申请了重阅影响了裁判需要清理之前任务的上裁判id
@ -16173,16 +16185,30 @@
<param name="cancellationToken"></param>
<returns></returns>
</member>
<member name="T:IRaCIS.Core.Application.Triggers.VisitTaskIsFrontTaskNeedSignButNotSignTrigger">
<member name="T:IRaCIS.Core.Application.Triggers.SubjectVisitScanDateTrigger">
<summary>
维护 IsFrontTaskNeedSignButNotSign 字段 另外附加评估结果
处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Triggers.VisitTaskIsFrontTaskNeedSignButNotSignTrigger.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial})">
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitScanDateTrigger.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Application.Service.Reading.Interface.IClinicalAnswerService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy})">
<summary>
维护 IsFrontTaskNeedSignButNotSign 字段 另外附加评估结果
处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitScanDateTrigger.UpdateSubjectVisitSubmitStateAsync(System.Guid)">
<summary>
处理提交状态
</summary>
<param name="subjectVisitId"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Triggers.SubjectVisitScanDateTrigger.UpdateSubjectVisitImageDateAsync(System.Guid)">
<summary>
处理访视拍片日期
</summary>
<param name="subjectVisitId"></param>
<returns></returns>
</member>
<member name="P:IRaCIS.Core.Domain.Models.ReadModuleView.Id">
<summary>
Id(阅片期Id 或者 访视ID)

View File

@ -0,0 +1,26 @@

using AutoMapper;
using IP2Region.Net.Abstractions;
using IRaCIS.Core.Domain;
using IRaCIS.Core.Domain.Models;
using MassTransit;
namespace IRaCIS.Core.Application.MassTransit.Consumer;
//国家|区域|省份|城市|ISP 缺省的地域信息默认是0
//0|0|0|内网IP|内网IP
// 中国|0|湖北省|武汉市|电信
public class AddUserLogTriggerConsumer(ISearcher _searcher) : IConsumer<AddUserLogTriggerCommand>
{
public async Task Consume(ConsumeContext<AddUserLogTriggerCommand> context)
{
var userLog = context.Message.UserLog;
var ipinfo = _searcher.Search(userLog.IP);
userLog.IPRegion = string.Join('|', ipinfo.Split('|').TakeLast(3));
}
}

View File

@ -6,6 +6,13 @@ using MassTransit;
namespace IRaCIS.Core.Application.MassTransit.Consumer;
/// <summary>
/// 添加Subject 触发添加访视 不能代替 Trigger,稽查BatchId 不一致 暂时废弃
/// </summary>
/// <param name="_subjectVisitRepository"></param>
/// <param name="_visitStageRepository"></param>
/// <param name="_trialRepository"></param>
/// <param name="_mapper"></param>
public class AddSubjectTriggerConsumer(IRepository<SubjectVisit> _subjectVisitRepository,
IRepository<VisitStage> _visitStageRepository,
@ -34,5 +41,6 @@ public class AddSubjectTriggerConsumer(IRepository<SubjectVisit> _subjectVisitRe
});
await _subjectVisitRepository.AddRangeAsync(svList);
await _subjectVisitRepository.SaveChangesAsync();
}
}

View File

@ -9,7 +9,6 @@ namespace IRaCIS.Core.Application.Triggers
/// </summary>
public class AddSubjectTrigger(
IRepository<SubjectVisit> _subjectVisitRepository,
IRepository<VisitStage> _visitStageRepository,
IRepository<Trial> _trialRepository,
IMapper _mapper) : IBeforeSaveTrigger<Subject>

View File

@ -4,7 +4,7 @@ using IRaCIS.Core.Domain.Share;
namespace IRaCIS.Core.Application.Triggers
{
public class VisitTaskIbeforeTrigger(
public class JudgeVisitTaskTrigger(
IRepository<VisitTask> _visitTaskRepository,
IRepository<ReadingJudgeInfo> _readingJudgeInfoRepository) : IBeforeSaveTrigger<VisitTask>, IAfterSaveTrigger<VisitTask>
{

View File

@ -7,7 +7,7 @@ namespace IRaCIS.Core.Application.Triggers
/// <summary>
/// 处理 访视 1、提交状态 2、执行状态 3、最早最晚 拍片日期
/// </summary>
public class SubjectVisitTrigger(
public class SubjectVisitScanDateTrigger(
IRepository<SubjectVisit> _subjectVisitRepository,
IClinicalAnswerService _iClinicalAnswerService,
IRepository<DicomSeries> _dicomSeriesRepository,
@ -106,7 +106,11 @@ namespace IRaCIS.Core.Application.Triggers
}
/// <summary>处理提交状态</summary>
/// <summary>
/// 处理提交状态
/// </summary>
/// <param name="subjectVisitId"></param>
/// <returns></returns>
public async Task UpdateSubjectVisitSubmitStateAsync(Guid subjectVisitId)
{
@ -127,7 +131,11 @@ namespace IRaCIS.Core.Application.Triggers
}
}
/// <summary>处理拍片日期</summary>
/// <summary>
/// 处理访视拍片日期
/// </summary>
/// <param name="subjectVisitId"></param>
/// <returns></returns>
private async Task UpdateSubjectVisitImageDateAsync(Guid subjectVisitId)
{
var svTime = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new

View File

@ -0,0 +1,11 @@

using IRaCIS.Core.Domain.BaseModel;
using IRaCIS.Core.Domain.Models;
namespace IRaCIS.Core.Domain;
public class AddUserLogTriggerCommand : DomainCommand
{
public UserLog UserLog { get; set; }
}

View File

@ -23,19 +23,32 @@ public static class DBContext_Ext
{
var changeTracker = context.ChangeTracker;
// 遍历 ChangeTracker 中的实体
foreach (var entry in changeTracker.Entries<Subject>())
{
var subject = entry.Entity;
//遍历 ChangeTracker 中的实体
//foreach (var entry in changeTracker.Entries<UserLog>())
//{
// var userLog = entry.Entity;
if (entry.State == EntityState.Added)
{
// 受试者添加 触发访视自动添加
var addedEvent = new AddSubjectTriggerCommand { SubjectId = subject.Id, TrialId = subject.TrialId, TrialSiteId = subject.TrialSiteId };
// if (entry.State == EntityState.Added)
// {
// // 受试者添加 触发访视自动添加
// var addCommand = new AddUserLogTriggerCommand { UserLog=userLog };
subject.AddDomainCommand(addedEvent);
}
}
// userLog.AddDomainCommand(addCommand);
// }
//}
//foreach (var entry in changeTracker.Entries<Subject>())
//{
// var subject = entry.Entity;
// if (entry.State == EntityState.Added)
// {
// // 受试者添加 触发访视自动添加
// var addedEvent = new AddSubjectTriggerCommand { SubjectId = subject.Id, TrialId = subject.TrialId, TrialSiteId = subject.TrialSiteId };
// subject.AddDomainCommand(addedEvent);
// }
//}
}

View File

@ -3,6 +3,7 @@ using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore.Common;
using MassTransit;
using MassTransit.Mediator;
using MassTransit.Transports;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Logging;
@ -13,7 +14,7 @@ namespace IRaCIS.Core.Infra.EFCore;
public class AuditEntityInterceptor(IUserInfo _userInfo,
ILogger<AuditEntityInterceptor> _logger
//, IBus _bus
, IMediator _mediator
) : SaveChangesInterceptor
{
@ -30,7 +31,7 @@ public class AuditEntityInterceptor(IUserInfo _userInfo,
//领域命令 同一个事务提交的一些逻辑类似Trigger 保存事务之前执行的一些逻辑)
eventData.Context.AddDomainCommands();
//DispatchDomainCommands(eventData.Context).GetAwaiter().GetResult();
DispatchDomainCommands(eventData.Context).GetAwaiter().GetResult();
//领域事件
eventData.Context.AddDomainEvents();
@ -230,26 +231,26 @@ public class AuditEntityInterceptor(IUserInfo _userInfo,
#region 领域命令分发
//private async Task DispatchDomainCommands(DbContext? context)
//{
// if (context == null) return;
private async Task DispatchDomainCommands(DbContext? context)
{
if (context == null) return;
// var entities = context.ChangeTracker
// .Entries<Entity>()
// .Where(e => e.Entity.DomainCommands.Any())
// .Select(e => e.Entity)
// .ToList();
var entities = context.ChangeTracker
.Entries<Entity>()
.Where(e => e.Entity.DomainCommands.Any())
.Select(e => e.Entity)
.ToList();
// var domainCommands = entities
// .SelectMany(e => e.DomainCommands)
// .ToList();
var domainCommands = entities
.SelectMany(e => e.DomainCommands)
.ToList();
// entities.ForEach(e => e.ClearDomainCommands());
entities.ForEach(e => e.ClearDomainCommands());
// foreach (var domainCommand in domainCommands)
// {
// await _bus.Send(domainCommand.GetType(), domainCommand);
// }
//}
foreach (var domainCommand in domainCommands)
{
await _mediator.Send(domainCommand.GetType(), domainCommand);
}
}
#endregion
}