添加阅片期计划
continuous-integration/drone/push Build is passing Details

Test_IRC_Net8
he 2025-11-03 14:22:41 +08:00
parent 9b59a55423
commit 510dfcac30
7 changed files with 21341 additions and 170 deletions

View File

@ -14011,6 +14011,13 @@
<param name="indto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingPeriodSetService.AddReadModule(IRaCIS.Core.Application.Service.Reading.Dto.AddReadModuleInDto)">
<summary>
生效或者新增访视的时候添加阅片期
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingPeriodSetService.GetPreviewTheReadingPlanList(IRaCIS.Core.Application.Service.Reading.Dto.PreviewTheReadingListDto)">
<summary>
获取选中的计划 (增加标准不影响 因为阅片期设置关联了标准)
@ -14052,6 +14059,13 @@
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingPeriodSetService.AddReadingPlanAndGenerateReadModule(IRaCIS.Core.Application.Service.Reading.Dto.AddReadingPlanAndGenerateReadModuleInDto)">
<summary>
添加阅片计划并生成阅片期(在阅片期已经生效的情况下添加)
</summary>
<param name="inDto"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.ReadingPeriodSetService.SetBatchAddOrRemoveReadingPlan(IRaCIS.Core.Application.Service.Reading.Dto.SetBatchAddOrRemoveReadingPlanInDto)">
<summary>
设置加入或者移除阅片计划

View File

@ -127,6 +127,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public Guid? TrialReadingCriterionId { get; set; }
}
public class AddReadingPlanAndGenerateReadModuleInDto
{
public Guid ReadingPeriodSetId { get; set; }
public List<Guid> SubjectVisitIdList { get; set; } = new List<Guid>();
}
public class SetBatchAddOrRemoveReadingPlanInDto
{
public List<Guid> SubjectVisitIdList { get; set; } = new List<Guid>();
@ -404,6 +411,31 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public ReadingPeriodStatus IsTakeEffect { get; set; }
}
public class AddReadModuleInDto
{
public Guid TrialReadingCriterionId { get; set; }
public Guid ReadingPeriodSetId { get; set; }
public Guid TrialId { get; set; }
public string ReadingPeriodName { get; set; }
public ReadingSetType ReadingSetType { get; set; }
public List<AddReadModuleVisitInfo> VisitInfoList { get; set; } = new List<AddReadModuleVisitInfo>();
}
public class AddReadModuleVisitInfo
{
public Guid SubjectId { get; set; }
public bool IsUrgent { get; set; }
public Guid SubjectVisitId { get; set; }
}
public class ReadingPeriodSetQuery : PageInput
{

View File

@ -2,10 +2,12 @@
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
using MassTransit;
using Microsoft.AspNetCore.Mvc;
using NPOI.Util;
namespace IRaCIS.Core.Application.Service
{
@ -74,6 +76,18 @@ namespace IRaCIS.Core.Application.Service
else
{
var entity = (await _readingPeriodSetRepository.Where(t => t.Id == addOrEditReadingPeriodSet.Id, true).Include(t => t.ReadingPeriodSites).Include(x => x.ReadingPeriodPlanList).FirstOrDefaultAsync()).IfNullThrowException();
// 已生效的时候就不可能修改 只能是添加计划和生成模块
if (entity.IsTakeEffect == ReadingPeriodStatus.TakeEffect)
{
await AddReadingPlanAndGenerateReadModule(new AddReadingPlanAndGenerateReadModuleInDto()
{
ReadingPeriodSetId = addOrEditReadingPeriodSet.Id.Value,
SubjectVisitIdList = addOrEditReadingPeriodSet.SubjectVisitIds
});
}
else
{
_mapper.Map(addOrEditReadingPeriodSet, entity);
entity.ReadingPeriodSites = addOrEditReadingPeriodSet.SiteIds.Select(x => new ReadingPeriodSite()
@ -121,6 +135,8 @@ namespace IRaCIS.Core.Application.Service
var success = await _readingPeriodSetRepository.SaveChangesAsync();
}
return ResponseOutput.Ok(entity.Id);
}
@ -178,28 +194,106 @@ namespace IRaCIS.Core.Application.Service
await AddReadModule(new AddReadModuleInDto()
{
ReadingPeriodName = readingPeriodSet.ReadingPeriodName,
ReadingSetType = readingPeriodSet.ReadingSetType,
TrialId = readingPeriodSet.TrialId,
ReadingPeriodSetId= readingPeriodSet.Id,
TrialReadingCriterionId = readingPeriodSet.TrialReadingCriterionId,
VisitInfoList = plans.Select(x => new AddReadModuleVisitInfo()
{
SubjectId = x.SubjectVisit.SubjectId,
SubjectVisitId = x.SubjectVisitId,
IsUrgent = false
}).ToList()
});
}
else
{
List<Guid> readModuleIds = await _readModuleRepository.Where(x => x.ReadingPeriodSetId == indto.Id).Select(x => x.Id).ToListAsync();
if (await _visitTaskRepository.AnyAsync(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && readModuleIds.Contains(x.SouceReadModuleId ?? default(Guid))
&& x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId
&& x.ReadingTaskState == ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect))
{
//---当前标准阅片已生成任务并且阅片完成,撤销失败。
throw new BusinessValidationFailedException(_localizer["ReadingPeriodSet_TaskCompletedCannotRevoke"]);
}
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && readModuleIds.Contains(x.SouceReadModuleId ?? default(Guid)), x => new VisitTask()
{
TaskState = TaskState.Adbandon
});
await _readModuleRepository.UpdatePartialFromQueryAsync(x => x.ReadingPeriodSetId == indto.Id, x => new ReadModule()
{
IsDeleted = true
});
}
var readQuery = await _readingPeriodSetRepository.UpdatePartialFromQueryAsync(indto.Id, x => new ReadingPeriodSet()
{
IsTakeEffect = indto.IsTakeEffect,
EffectOfTime = indto.IsTakeEffect == ReadingPeriodStatus.TakeEffect ? DateTime.Now : null,
});
if (indto.IsTakeEffect == ReadingPeriodStatus.TakeEffect)
{
await _readingPeriodPlanRepository.UpdatePartialFromQueryAsync(x => x.ReadingPeriodSetId == indto.Id, x => new ReadingPeriodPlan()
{
IsGenerate = true,
GeneratedTime = DateTime.Now
});
}
var result = await _readingPeriodSetRepository.SaveChangesAsync();
return ResponseOutput.Result(result);
}
/// <summary>
/// 生效或者新增访视的时候添加阅片期
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task AddReadModule(AddReadModuleInDto inDto)
{
List<ReadModule> readModules = new List<ReadModule>();
foreach (var item in plans)
foreach (var item in inDto.VisitInfoList)
{
readModules.Add(new ReadModule()
{
Id = NewId.NextGuid(),
SubjectId = item.SubjectVisit.SubjectId,
ModuleType = item.ReadingPeriodSet.ReadingSetType == ReadingSetType.ImageReading ? ModuleTypeEnum.Global : ModuleTypeEnum.Oncology,
IsUrgent = item.SubjectVisit.IsUrgent,
SubjectId = item.SubjectId,
ModuleType = inDto.ReadingSetType == ReadingSetType.ImageReading ? ModuleTypeEnum.Global : ModuleTypeEnum.Oncology,
IsUrgent = item.IsUrgent,
ReadModuleAddTypeEnum = ReadModuleAddType.ReadingPlan,
ModuleName = item.ReadingPeriodSet.ReadingPeriodName,
ModuleName = inDto.ReadingPeriodName,
SubjectVisitId = item.SubjectVisitId,
ReadingSetType = item.ReadingPeriodSet.ReadingSetType,
ReadingPeriodSetId = item.ReadingPeriodSet.Id,
ReadingSetType = inDto.ReadingSetType,
ReadingPeriodSetId = inDto.ReadingPeriodSetId,
ReadingStatus = ReadingStatusEnum.TaskAllocate,
TrialId = readingPeriodSet.TrialId,
TrialId = inDto.TrialId,
//VisitNum = item.SubjectVisit.VisitNum,
//增加标准
TrialReadingCriterionId = readingPeriodSet.TrialReadingCriterionId
TrialReadingCriterionId = inDto.TrialReadingCriterionId
});
};
}
;
await _readModuleRepository.AddRangeAsync(readModules);
@ -207,13 +301,13 @@ namespace IRaCIS.Core.Application.Service
// 判断是否要添加肿瘤学或者全局阅片任务
var subjectVisitIds = readModules.Select(x => x.SubjectVisitId).ToList();
switch (readingPeriodSet.ReadingSetType)
switch (inDto.ReadingSetType)
{
case ReadingSetType.ImageReading:
//增加标准
var taskInfoList = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && subjectVisitIds.Contains(x.SourceSubjectVisitId ?? default(Guid)) &&
var taskInfoList = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId && subjectVisitIds.Contains(x.SourceSubjectVisitId ?? default(Guid)) &&
x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId &&
x.TrialReadingCriterionId == inDto.TrialReadingCriterionId &&
x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate).ToListAsync();
foreach (var item in taskInfoList)
@ -255,17 +349,17 @@ namespace IRaCIS.Core.Application.Service
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == readingPeriodSet.TrialReadingCriterionId).Select(x => new
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).Select(x => new
{
x.ReadingType,
}).FirstNotNullAsync();
//增加标准
var globalModuleIds = await _readModuleRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && subjectVisitIds.Contains(x.SubjectVisitId) && x.ModuleType == ModuleTypeEnum.Global).Select(x => x.Id).ToListAsync();
var globalModuleIds = await _readModuleRepository.Where(x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId && subjectVisitIds.Contains(x.SubjectVisitId) && x.ModuleType == ModuleTypeEnum.Global).Select(x => x.Id).ToListAsync();
//增加标准
var globalTaskInfo = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && globalModuleIds.Contains(x.SouceReadModuleId ?? default(Guid))
var globalTaskInfo = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == inDto.TrialReadingCriterionId && globalModuleIds.Contains(x.SouceReadModuleId ?? default(Guid))
&& x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate).GroupBy(x => new { x.SouceReadModuleId }).Select(x =>
new
@ -292,7 +386,7 @@ namespace IRaCIS.Core.Application.Service
{
OriginalVisitId = item.TaskId,
ReadingCategory = GenerateTaskCategory.Oncology,
TrialId = readingPeriodSet.TrialId,
TrialId = inDto.TrialId,
ReadingGenerataTaskList = new List<ReadingGenerataTaskDTO>() {
new ReadingGenerataTaskDTO()
{
@ -315,50 +409,7 @@ namespace IRaCIS.Core.Application.Service
break;
}
}
else
{
List<Guid> readModuleIds = await _readModuleRepository.Where(x => x.ReadingPeriodSetId == indto.Id).Select(x => x.Id).ToListAsync();
if (await _visitTaskRepository.AnyAsync(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && readModuleIds.Contains(x.SouceReadModuleId ?? default(Guid))
&& x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId
&& x.ReadingTaskState == ReadingTaskState.HaveSigned && x.TaskState == TaskState.Effect))
{
//---当前标准阅片已生成任务并且阅片完成,撤销失败。
throw new BusinessValidationFailedException(_localizer["ReadingPeriodSet_TaskCompletedCannotRevoke"]);
}
await _visitTaskRepository.BatchUpdateNoTrackingAsync(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && readModuleIds.Contains(x.SouceReadModuleId ?? default(Guid)), x => new VisitTask()
{
TaskState = TaskState.Adbandon
});
await _readModuleRepository.UpdatePartialFromQueryAsync(x => x.ReadingPeriodSetId == indto.Id, x => new ReadModule()
{
IsDeleted = true
});
}
var readQuery = await _readingPeriodSetRepository.UpdatePartialFromQueryAsync(indto.Id, x => new ReadingPeriodSet()
{
IsTakeEffect = indto.IsTakeEffect,
EffectOfTime = indto.IsTakeEffect == ReadingPeriodStatus.TakeEffect ? DateTime.Now : null,
});
var result = await _readingPeriodSetRepository.SaveChangesAsync();
return ResponseOutput.Result(result);
}
#endregion
@ -532,6 +583,51 @@ namespace IRaCIS.Core.Application.Service
}
}
/// <summary>
/// 添加阅片计划并生成阅片期(在阅片期已经生效的情况下添加)
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<IResponseOutput> AddReadingPlanAndGenerateReadModule(AddReadingPlanAndGenerateReadModuleInDto inDto)
{
var readingPeriodSet = await _readingPeriodSetRepository.Where(x => x.Id == inDto.ReadingPeriodSetId).FirstNotNullAsync();
List<ReadingPeriodPlan> plans = inDto.SubjectVisitIdList.Select(x => new ReadingPeriodPlan()
{
Id = NewId.NextGuid(),
SubjectVisitId = x,
ReadingPeriodSetId = inDto.ReadingPeriodSetId,
IsGenerate=true,
GeneratedTime=DateTime.Now
}).ToList();
await _readingPeriodPlanRepository.AddRangeAsync(plans);
await _readingPeriodPlanRepository.SaveChangesAsync();
var subejctVisits = await _subjectVisitRepository.Where(x => inDto.SubjectVisitIdList.Contains(x.Id)).ToListAsync();
await AddReadModule(new AddReadModuleInDto()
{
ReadingPeriodName = readingPeriodSet.ReadingPeriodName,
ReadingSetType = readingPeriodSet.ReadingSetType,
TrialId = readingPeriodSet.TrialId,
ReadingPeriodSetId = readingPeriodSet.Id,
TrialReadingCriterionId = readingPeriodSet.TrialReadingCriterionId,
VisitInfoList = subejctVisits.Select(x => new AddReadModuleVisitInfo()
{
SubjectId = x.SubjectId,
SubjectVisitId = x.Id,
IsUrgent = x.IsUrgent,
}).ToList()
});
return ResponseOutput.Ok();
}
/// <summary>
/// 设置加入或者移除阅片计划
/// </summary>

View File

@ -19,4 +19,14 @@ public class ReadingPeriodPlan : BaseFullDeleteAuditEntity
[Comment("访视")]
public Guid SubjectVisitId { get; set; }
/// <summary>
/// 是否生成
/// </summary>
public bool IsGenerate { get; set; } = false;
/// <summary>
/// 生效时间
/// </summary>
public DateTime? GeneratedTime { get; set; }
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,40 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class ReadingPeriodPlan : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<DateTime>(
name: "GeneratedTime",
table: "ReadingPeriodPlan",
type: "datetime2",
nullable: true);
migrationBuilder.AddColumn<bool>(
name: "IsGenerate",
table: "ReadingPeriodPlan",
type: "bit",
nullable: false,
defaultValue: false);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "GeneratedTime",
table: "ReadingPeriodPlan");
migrationBuilder.DropColumn(
name: "IsGenerate",
table: "ReadingPeriodPlan");
}
}
}

View File

@ -5948,9 +5948,15 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<DateTime?>("DeletedTime")
.HasColumnType("datetime2");
b.Property<DateTime?>("GeneratedTime")
.HasColumnType("datetime2");
b.Property<bool>("IsDeleted")
.HasColumnType("bit");
b.Property<bool>("IsGenerate")
.HasColumnType("bit");
b.Property<Guid>("ReadingPeriodSetId")
.HasColumnType("uniqueidentifier")
.HasComment("阅片期配置ID");