From f158f092ce38914de5701fb84280f0b28a25b1db Mon Sep 17 00:00:00 2001
From: hang <872297557@qq.com>
Date: Mon, 1 Jul 2024 14:54:15 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E8=87=B4=E6=80=A7?=
=?UTF-8?q?=E5=88=86=E6=9E=90=20=E4=BB=A5=E5=8F=8A=E9=A1=B9=E7=9B=AE?=
=?UTF-8?q?=E9=83=A8=E4=BD=8D=E7=BC=96=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../IRaCIS.Core.Application.xml | 33 +++++
.../Allocation/TaskConsistentRuleService.cs | 31 ++++-
.../Allocation/VisitTaskHelpeService.cs | 14 +-
.../TrialSiteUser/DTO/TrialConfigDTO.cs | 7 +
.../TrialSiteUser/TrialConfigService.cs | 2 +-
.../Allocation/AllocationRelation.cs | 2 +-
.../ReadingConsistentClinicalData.cs | 120 ++++++++++++++++++
.../ReadingConsistentClinicalDataPDF.cs | 65 ++++++++++
IRaCIS.Core.Domain/Trial/TrialBodyPart.cs | 3 +
.../Context/IRaCISDBContext.cs | 2 +
.../Extention/RandomExtensions.cs | 37 ++++++
11 files changed, 308 insertions(+), 8 deletions(-)
create mode 100644 IRaCIS.Core.Domain/Reading/ClinicalData/ReadingConsistentClinicalData.cs
create mode 100644 IRaCIS.Core.Domain/Reading/ClinicalData/ReadingConsistentClinicalDataPDF.cs
create mode 100644 IRaCIS.Core.Infrastructure/Extention/RandomExtensions.cs
diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index 21496c38d..ed3163fab 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -5262,6 +5262,16 @@
路径
+
+
+ 大小
+
+
+
+
+ 文件类型
+
+
临床数据类型Id
@@ -5462,6 +5472,16 @@
FileName
+
+
+ 大小
+
+
+
+
+ 文件类型
+
+
上传时间
@@ -11340,6 +11360,11 @@
组件一致性和原Arm2是否有差异
+
+
+ QCChallengeId
+
+
@@ -12336,6 +12361,14 @@
+
+
+ 获取下一个crc的未关闭的质疑
+
+
+
+
+
CRC 质疑列表
diff --git a/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs b/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs
index 1a1a2bdbf..9242506ef 100644
--- a/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs
+++ b/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs
@@ -154,7 +154,7 @@ namespace IRaCIS.Core.Application.Service
{
- var filterObj = await _taskConsistentRuleRepository.FirstOrDefaultAsync(t => t.Id == inCommand.TaskConsistentRuleId);
+ var filterObj = await _taskConsistentRuleRepository.Where(t => t.Id == inCommand.TaskConsistentRuleId).Include(t=>t.TrialReadingCriterion).FirstOrDefaultAsync();
var doctorUserId = inCommand.DoctorUserId;
var trialReadingCriterionId = filterObj.TrialReadingCriterionId;
@@ -174,7 +174,7 @@ namespace IRaCIS.Core.Application.Service
throw new BusinessValidationFailedException(_localizer["TaskConsistent_NotAllowedGenerate1"]);
}
- inCommand.SubejctIdList = GetRandomSubjectIdList(subjectList.Select(t => t.SubjectId).ToList(), filterObj.PlanSubjectCount);
+ inCommand.SubejctIdList = subjectList.Select(t => t.SubjectId).ToList().GetRandomCountList(filterObj.PlanSubjectCount);
}
var list = await GetIQueryableDoctorSelfConsistentSubjectView(filterObj, doctorUserId, inCommand.SubejctIdList).ToListAsync();
@@ -212,7 +212,18 @@ namespace IRaCIS.Core.Application.Service
blindSubjectCode = filterObj.BlindTrialSiteCode + (maxCodeInt + 1).ToString($"D{filterObj.BlindSubjectNumberOfPlaces}");
}
- subject.VisitTaskList = subject.VisitTaskList.Take(filterObj.PlanVisitCount).ToList();
+ //有序阅片
+ if (filterObj.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.InOrder)
+ {
+ subject.VisitTaskList = subject.VisitTaskList.Take(filterObj.PlanVisitCount).ToList();
+
+ }
+ else
+ {
+ //完全随机 和受试者随机,都是随机挑选访视
+ subject.VisitTaskList = subject.VisitTaskList.GetRandomCountList(filterObj.PlanVisitCount);
+ }
+
subject.VisitTaskList.ForEach(t =>
{
@@ -325,10 +336,12 @@ namespace IRaCIS.Core.Application.Service
{
var trialId = inCommand.TrialId;
- var filterObj = await _taskConsistentRuleRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.TrialReadingCriterionId == inCommand.TrialReadingCriterionId && t.IsSelfAnalysis == false);
+ var filterObj = await _taskConsistentRuleRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == inCommand.TrialReadingCriterionId && t.IsSelfAnalysis == false).Include(t=>t.TrialReadingCriterion).FirstNotNullAsync();
var trialReadingCriterionId = filterObj.TrialReadingCriterionId;
+
+
//随机分配
if (inCommand.IsAutoAllocateGenerateTask)
{
@@ -345,7 +358,7 @@ namespace IRaCIS.Core.Application.Service
throw new BusinessValidationFailedException(_localizer["TaskConsistent_NotAllowedGenerate1"]);
}
- inCommand.SubejctIdList = GetRandomSubjectIdList(subjectSelectList.Select(t => t.SubjectId).ToList(), filterObj.PlanSubjectCount);
+ inCommand.SubejctIdList = subjectSelectList.Select(t => t.SubjectId).ToList().GetRandomCountList(filterObj.PlanSubjectCount) ;
}
@@ -415,6 +428,11 @@ namespace IRaCIS.Core.Application.Service
foreach (var needAddDoctorUserId in needAddDoctorUserIdList)
{
+ //if(filterObj.TrialReadingCriterion.IsReadingTaskViewInOrder== ReadingOrder.InOrder)
+ //{
+
+ //}
+
//每个医生 都生成处理的任务
foreach (var task in subject.SubjectTaskVisitList.Take(filterObj.PlanVisitCount))
{
@@ -995,5 +1013,8 @@ namespace IRaCIS.Core.Application.Service
//return matchSubjectIdList.OrderBy(g => random.Next()).Take(countToSelect).ToList();
}
+
+
+
}
}
diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs
index cdb8a02e2..c861c348d 100644
--- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs
+++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs
@@ -1411,6 +1411,18 @@ namespace IRaCIS.Core.Application.Service
break;
case GenerateTaskCategory.SelfConsistent:
+ var readingCriterionId = generateTaskCommand.GenerataConsistentTaskList.First().TrialReadingCriterionId;
+ //var trialReadingCriterion=_trialReadingCriterionRepository.Where(t=>t.Id== trialReadingCriterionId).FirstOrDefault();
+
+ //判断是否存在传输方式为Pdf得临床数据
+
+ var exsitPDF = await _trialClinicalDataSetRepository.AnyAsync(t => t.TrialId == trialId &&
+ t.TrialClinicalDataSetCriteriaList.Any(c => c.TrialReadingCriterionId == readingCriterionId)
+ && t.ClinicalUploadType == ClinicalUploadType.PDF);
+
+ var taskState = exsitPDF ? TaskState.NotEffect : TaskState.Effect;
+
+
foreach (var task in generateTaskCommand.GenerataConsistentTaskList)
{
var consistentTask = new VisitTask()
@@ -1424,7 +1436,7 @@ namespace IRaCIS.Core.Application.Service
VisitTaskNum = task.VisitTaskNum,
ReadingCategory = task.ReadingCategory,
- TaskState = TaskState.Effect,
+ TaskState = taskState,
Code = currentMaxCodeInt + 1,
TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs
index f88b288dc..dc0d0ded9 100644
--- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs
+++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/TrialConfigDTO.cs
@@ -1106,6 +1106,9 @@ namespace IRaCIS.Core.Application.Contracts
[NotDefault]
public Guid TrialId { get; set; }
+
+
+ public bool IsHandAdd { get; set; } = true;
}
public class TrialBodyPartView
@@ -1114,5 +1117,9 @@ namespace IRaCIS.Core.Application.Contracts
public string Name { get; set; }
+
+ public Guid Id { get; set; }
+
+ public bool IsHandAdd { get; set; }
}
}
diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs
index ef9c33a6d..573b0b300 100644
--- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs
+++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialConfigService.cs
@@ -1318,7 +1318,7 @@ namespace IRaCIS.Core.Application
public async Task>> GetTrialBodyPartList(Guid trialId)
{
- var list = await _trialRepository.Where(t => t.Id == trialId).SelectMany(t => t.TrialBodyPartList).Select(t => new TrialBodyPartView() { Code = t.Code, Name = _userInfo.IsEn_Us ? t.Name : t.NameCN }).ToListAsync();
+ var list = await _trialRepository.Where(t => t.Id == trialId).SelectMany(t => t.TrialBodyPartList).Select(t => new TrialBodyPartView() { Code = t.Code, Name = _userInfo.IsEn_Us ? t.Name : t.NameCN ,Id=t.Id,IsHandAdd=t.IsHandAdd}).ToListAsync();
return ResponseOutput.Ok(list);
}
diff --git a/IRaCIS.Core.Domain.Share/Allocation/AllocationRelation.cs b/IRaCIS.Core.Domain.Share/Allocation/AllocationRelation.cs
index 9948da85c..d5c6dec54 100644
--- a/IRaCIS.Core.Domain.Share/Allocation/AllocationRelation.cs
+++ b/IRaCIS.Core.Domain.Share/Allocation/AllocationRelation.cs
@@ -279,7 +279,7 @@ namespace IRaCIS.Core.Domain.Share
Effect = 0,
//未生效
- //NotEffect = 1,
+ NotEffect = 1,
// 失效
Adbandon = 3,
diff --git a/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingConsistentClinicalData.cs b/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingConsistentClinicalData.cs
new file mode 100644
index 000000000..59d28bd54
--- /dev/null
+++ b/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingConsistentClinicalData.cs
@@ -0,0 +1,120 @@
+
+
+using System;
+using IRaCIS.Core.Domain.Share;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Collections.Generic;
+
+namespace IRaCIS.Core.Domain.Models
+{
+ ///
+ /// 项目的临床数据
+ ///
+ [Table("ReadingConsistentClinicalData")]
+ public class ReadingConsistentClinicalData : Entity, IAuditAdd
+ {
+ ///
+ /// 项目ID
+ ///
+ public Guid TrialId { get; set; }
+
+ ///
+ /// 访视Id 或者模块Id
+ ///
+ public Guid ReadingId { get; set; }
+
+ public Guid? StudyId { get; set; }
+
+ ///
+ /// 受试者ID
+ ///
+ public Guid SubjectId { get; set; }
+
+ ///
+ /// 临床数据类型Id
+ ///
+ public Guid ClinicalDataTrialSetId { get; set; }
+
+ ///
+ /// 是否为访视
+ /// xiu
+ public bool IsVisit { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime CreateTime { get; set; }
+
+ ///
+ /// 是否签名
+ ///
+ public bool IsSign { get; set; }
+
+ ///
+ /// 是否盲化
+ ///
+ public bool? IsBlind { get; set; }
+
+ ///
+ /// 是否完整
+ ///
+ public bool? IsComplete { get; set; }
+
+ ///
+ /// 创建人
+ ///
+ public Guid CreateUserId { get; set; }
+
+ public int FileCount { get; set; }
+
+
+ //临床数据状态
+ public ReadingClinicalDataStatus ReadingClinicalDataState { get; set; }
+
+ [JsonIgnore]
+ [ForeignKey("ClinicalDataTrialSetId")]
+
+ public ClinicalDataTrialSet ClinicalDataTrialSet { get; set; }
+
+ [JsonIgnore]
+
+ public DicomStudy? DicomStudy { get; set; }
+
+ [JsonIgnore]
+ [ForeignKey("TrialId")]
+
+ public Trial Trial { get; set; }
+
+ [JsonIgnore]
+ [ForeignKey("ReadingId")]
+
+ public SubjectVisit SubjectVisit { get; set; }
+
+ [JsonIgnore]
+ [ForeignKey("SubjectId")]
+
+ public Subject Subject { get; set; }
+
+ [JsonIgnore]
+ [ForeignKey("ReadingId")]
+
+ public ReadModule ReadModule { get; set; }
+
+ ///
+ /// PDF文件
+ ///
+ [JsonIgnore]
+ public List ReadingClinicalDataPDFList { get; set; }
+
+
+
+
+ }
+
+
+
+
+
+
+}
diff --git a/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingConsistentClinicalDataPDF.cs b/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingConsistentClinicalDataPDF.cs
new file mode 100644
index 000000000..ce3183971
--- /dev/null
+++ b/IRaCIS.Core.Domain/Reading/ClinicalData/ReadingConsistentClinicalDataPDF.cs
@@ -0,0 +1,65 @@
+
+
+using System;
+using IRaCIS.Core.Domain.Share;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace IRaCIS.Core.Domain.Models
+{
+ ///
+ /// 项目的临床数据
+ ///
+ [Table("ReadingConsistentClinicalDataPDF")]
+ public class ReadingConsistentClinicalDataPDF : Entity, IAuditAdd
+ {
+ [JsonIgnore]
+ [ForeignKey("ReadingConsistentClinicalDataId")]
+ public ReadingConsistentClinicalData ReadingConsistentClinicalData { get; set; }
+ ///
+ /// 阅片临床数据ID
+ ///
+ public Guid ReadingConsistentClinicalDataId { get; set; }
+
+ ///
+ /// Path
+ ///
+ [Required]
+ public string Path { get; set; }
+
+ ///
+ /// FileName
+ ///
+ [Required]
+ public string FileName { get; set; }
+
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime CreateTime { get; set; }
+
+ ///
+ /// 创建人
+ ///
+ public Guid CreateUserId { get; set; }
+
+ ///
+ /// 大小
+ ///
+ public int Size { get; set; } = 0;
+
+ ///
+ /// 文件类型
+ ///
+ public string Type { get; set; }
+
+
+ }
+
+
+
+
+
+
+}
diff --git a/IRaCIS.Core.Domain/Trial/TrialBodyPart.cs b/IRaCIS.Core.Domain/Trial/TrialBodyPart.cs
index b69845dca..7dc64d2ab 100644
--- a/IRaCIS.Core.Domain/Trial/TrialBodyPart.cs
+++ b/IRaCIS.Core.Domain/Trial/TrialBodyPart.cs
@@ -35,5 +35,8 @@ namespace IRaCIS.Core.Domain.Models
[JsonIgnore]
public Trial Trial { get; set; }
+
+ public bool IsHandAdd { get; set; }
+
}
}
diff --git a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs
index c5dd471f2..913ae7a94 100644
--- a/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs
+++ b/IRaCIS.Core.Infra.EFCore/Context/IRaCISDBContext.cs
@@ -208,6 +208,8 @@ namespace IRaCIS.Core.Infra.EFCore
//public virtual DbSet ReadingClinicalDataView { get; set; }
public virtual DbSet ReadingClinicalDataPDF { get; set; }
+ public virtual DbSet ReadingConsistentClinicalData { get; set; }
+ public virtual DbSet ReadingConsistentClinicalDataPDF { get; set; }
public virtual DbSet ReadingJudgeInfo { get; set; }
diff --git a/IRaCIS.Core.Infrastructure/Extention/RandomExtensions.cs b/IRaCIS.Core.Infrastructure/Extention/RandomExtensions.cs
new file mode 100644
index 000000000..db395d9b4
--- /dev/null
+++ b/IRaCIS.Core.Infrastructure/Extention/RandomExtensions.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IRaCIS.Core.Infrastructure.Extention
+{
+ public static class RandomExtensions
+ {
+ private static Random _random = new Random();
+
+ public static List GetRandomCountList(this List list, int count)
+ {
+ if (count > list.Count)
+ {
+ throw new ArgumentException("Sample size cannot be greater than list size.");
+ }
+
+ // 使用 Fisher-Yates 洗牌算法来随机选择元素
+ List result = list.ToList(); // 复制原始列表,以避免修改原始列表
+ int n = result.Count;
+
+ while (n > 1)
+ {
+ n--;
+ int k = _random.Next(n + 1);
+ T value = result[k];
+ result[k] = result[n];
+ result[n] = value;
+ }
+
+ // 返回所需数量的元素
+ return result.Take(count).ToList();
+ }
+ }
+}