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(); + } + } +}