From b9a79f0658a2473f62592ef74bd8c2dbe8b8757a Mon Sep 17 00:00:00 2001
From: hang <872297557@qq.com>
Date: Thu, 9 Jul 2026 13:48:39 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=9A=8F=E6=9C=BA=E9=98=85?=
=?UTF-8?q?=E7=89=87=E4=BB=BB=E5=8A=A1=E7=9B=B2=E6=80=81=E5=90=8D=E5=AD=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../IRaCIS.Core.Application.xml | 6 ++
.../Allocation/VisitTaskHelpeService.cs | 67 +++++++++++++++++--
.../Service/Allocation/VisitTaskService.cs | 15 +++--
.../ImageAndDoc/DownloadAndUploadService.cs | 5 +-
.../ReadingMedicalReviewService.cs | 38 ++++++-----
5 files changed, 105 insertions(+), 26 deletions(-)
diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index 4083d5c21..c7b848054 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -337,6 +337,12 @@
+
+
+ 从 NewId 的后 3 个字节(24 位)生成一个 6 位十六进制字符串
+
+
+
获取GetIsClinicalDataSignTest
diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs
index 6afca5061..2296f7b35 100644
--- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs
+++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs
@@ -124,6 +124,45 @@ namespace IRaCIS.Core.Application.Service
}
+ #region 获取随机编号
+ ///
+ /// 从 NewId 的后 3 个字节(24 位)生成一个 6 位十六进制字符串
+ ///
+ ///
+ public static string GenerateTaskNo()
+ {
+ var bytes = NewId.Next().ToByteArray();
+
+ uint value =
+ BitConverter.ToUInt32(bytes, 0)
+ ^ BitConverter.ToUInt32(bytes, 4)
+ ^ BitConverter.ToUInt32(bytes, 8)
+ ^ BitConverter.ToUInt32(bytes, 12);
+
+ return (value & 0xFFFFFF).ToString("X6");
+ }
+
+ private async Task GetRandomTaskName(Guid trialId, List existList)
+ {
+ var taskName = GenerateTaskNo();
+
+ while (existList.Any(t => t == taskName))
+ {
+ taskName = GenerateTaskNo();
+ }
+
+ while (await _visitTaskRepository.AnyAsync(t => t.TaskBlindName == taskName && t.TrialId == trialId))
+ {
+ taskName = GenerateTaskNo();
+ }
+
+ existList.Add(taskName);
+
+ return taskName;
+ }
+
+ #endregion
+
//基于标准签名 产生任务 (或者手动选择某些访视生成该标准的任务)
public async Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId, bool? isManualSelectVisit = null, List? subjectVisitIdList = null)
@@ -155,7 +194,7 @@ namespace IRaCIS.Core.Application.Service
int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode;
-
+ var randomTaskBlindNameList = new List();
foreach (var subjectGroup in needGenerateVisit.GroupBy(t => t.SubjectId).Select(g => new { SubjectId = g.Key, SubjectVisitList = g.ToList() }))
{
@@ -185,6 +224,10 @@ namespace IRaCIS.Core.Application.Service
}
}
+ else if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.Random)
+ {
+ blindTaskName = await GetRandomTaskName(trialId, randomTaskBlindNameList);
+ }
else
{
blindTaskName = "Timepoint";
@@ -594,7 +637,7 @@ namespace IRaCIS.Core.Application.Service
int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode;
-
+ var randomTaskBlindNameList = new List();
switch (generateTaskCommand.ReadingCategory)
@@ -654,6 +697,7 @@ namespace IRaCIS.Core.Application.Service
var isFrontTaskNeedSignButNotSign = await _visitTaskRepository.AnyAsync(t => t.TrialReadingCriterionId == trialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.TaskState == TaskState.Effect && t.VisitTaskNum < subjectVisit.VisitNum && t.IsNeedClinicalDataSign == true && t.IsClinicalDataSign == false);
+
var blindTaskName = string.Empty;
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.InOrder)
@@ -668,6 +712,11 @@ namespace IRaCIS.Core.Application.Service
}
}
+ else if (trialReadingCriterionConfig.IsReadingTaskViewInOrder == ReadingOrder.Random)
+ {
+ blindTaskName = await GetRandomTaskName(trialId, randomTaskBlindNameList);
+ }
+ //受试者随机
else
{
blindTaskName = "Timepoint";
@@ -1277,6 +1326,7 @@ namespace IRaCIS.Core.Application.Service
var reReadingVisitTask = generateTaskCommand.ReReadingTask;
+
Guid? subjectVisitId = Guid.Empty;
if (reReadingVisitTask.SourceSubjectVisitId == null)
@@ -1317,6 +1367,10 @@ namespace IRaCIS.Core.Application.Service
//&& t.TrialReadingCriterionId == reReadingVisitTask.TrialReadingCriterionId && t.TaskState == TaskState.Effect
// && t.SourceSubjectVisitId == reReadingVisitTask.SourceSubjectVisitId && t.ArmEnum == reReadingVisitTask.ArmEnum && t.DoctorUserId == reReadingVisitTask.DoctorUserId).FirstOrDefault();
+ var isRandomReading = trialReadingCriterionConfigList.FirstOrDefault(t => t.TrialReadingCriterionId == reReadingVisitTask.TrialReadingCriterionId)?.IsReadingTaskViewInOrder == ReadingOrder.Random;
+
+ var taskBlindName = isRandomReading ? await GetRandomTaskName(trialId, randomTaskBlindNameList) : reReadingVisitTask.TaskBlindName;
+
var newTask = await _visitTaskRepository.AddAsync(new VisitTask()
{
@@ -1325,7 +1379,7 @@ namespace IRaCIS.Core.Application.Service
SubjectId = reReadingVisitTask.SubjectId,
ArmEnum = reReadingVisitTask.ArmEnum,
TaskName = reReadingVisitTask.TaskName,
- TaskBlindName = reReadingVisitTask.TaskBlindName,
+ TaskBlindName = taskBlindName,
IsUrgent = reReadingVisitTask.IsAnalysisCreate ? false : subjectVisitUrgentInfo.IsUrgent,
TaskUrgentType = reReadingVisitTask.IsAnalysisCreate ? null : taskUrgent,
@@ -1548,6 +1602,11 @@ namespace IRaCIS.Core.Application.Service
var subjectUser = await _subjectUserRepository.Where(x => x.SubjectId == firstTask.SubjectId && x.ArmEnum == Arm.JudgeArm && x.IsConfirmed && x.TrialReadingCriterionId == firstTask.TrialReadingCriterionId).FirstOrDefaultAsync();
+
+ var isRandom = trialReadingCriterionConfigList.FirstOrDefault(t => t.TrialReadingCriterionId == firstTask.TrialReadingCriterionId)?.IsReadingTaskViewInOrder == ReadingOrder.Random;
+
+ var blindName = isRandom ? await GetRandomTaskName(trialId, randomTaskBlindNameList) : firstTask.TaskBlindName;
+
VisitTask visitTask = new VisitTask()
{
ArmEnum = Arm.JudgeArm,
@@ -1564,7 +1623,7 @@ namespace IRaCIS.Core.Application.Service
SouceReadModuleId = firstTask.SouceReadModuleId,
TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
TaskState = TaskState.Effect,
- TaskBlindName = firstTask.TaskBlindName,
+ TaskBlindName = blindName,
DoctorUserId = subjectUser == null ? null : subjectUser.DoctorUserId,
TaskAllocationState = subjectUser == null ? TaskAllocationState.NotAllocate : TaskAllocationState.Allocated,
AllocateTime = subjectUser == null ? null : DateTime.Now,
diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs
index 8195a1b53..165d7efe5 100644
--- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs
+++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs
@@ -854,7 +854,7 @@ public class VisitTaskService(IRepository _visitTaskRepository,
///
///
[HttpPost]
- public async Task> GetIRReReadingTaskList(VisitTaskQuery inQuery)
+ public async Task> > GetIRReReadingTaskList(VisitTaskQuery inQuery)
{
var visitTaskQueryable = _visitTaskReReadingRepository
@@ -889,7 +889,11 @@ public class VisitTaskService(IRepository _visitTaskRepository,
var pageList = await visitTaskQueryable.ToPagedListAsync(inQuery, defalutSortArray);
- return pageList;
+ var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
+ .Select(t => new { t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
+
+ return ResponseOutput.Ok(pageList, criterionInfo);
+
}
@@ -1242,7 +1246,7 @@ public class VisitTaskService(IRepository _visitTaskRepository,
///
///
[HttpPost]
- public async Task> GetIRHaveReadTaskList(VisitTaskQuery inQuery)
+ public async Task>> GetIRHaveReadTaskList(VisitTaskQuery inQuery)
{
@@ -1270,7 +1274,10 @@ public class VisitTaskService(IRepository _visitTaskRepository,
var pageList = await visitTaskQueryable.ToPagedListAsync(inQuery, defalutSortArray);
- return pageList;
+ var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
+ .Select(t => new { t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
+
+ return ResponseOutput.Ok(pageList, criterionInfo);
}
diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs
index a08d0240f..7bb6f15f3 100644
--- a/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs
+++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DownloadAndUploadService.cs
@@ -58,8 +58,9 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
{
//subject 随机阅片 或者无序 有上传 才处理任务编号
if (_visitTaskRepository.Any(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId &&
- (t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.SubjectRandom ||
- (t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.Random && t.TrialReadingCriterion.ImageDownloadEnum != ReadingImageDownload.None))))
+ (t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.SubjectRandom
+ //||(t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.Random && t.TrialReadingCriterion.ImageDownloadEnum != ReadingImageDownload.None)
+ )))
{
//找到 非一致性分析,未签名,状态正常的 并且任务名称是TimePoint的 任务
var needDealTaskList = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId == _userInfo.UserRoleId
diff --git a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs
index ccf72d147..3ce104226 100644
--- a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs
+++ b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicalReviewService.cs
@@ -246,9 +246,9 @@ namespace IRaCIS.Core.Application.Service
var visitTaskAnswer = await _readingTaskQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId) && x.ReadingQuestionTrial.IsJudgeQuestion).Select(x => new JudgeQuestionAnswerInfo
{
Answer = x.Answer,
- Unit=x.ReadingQuestionTrial.Unit,
- ValueType=x.ReadingQuestionTrial.ValueType,
- CustomUnit=x.ReadingQuestionTrial.CustomUnit,
+ Unit = x.ReadingQuestionTrial.Unit,
+ ValueType = x.ReadingQuestionTrial.ValueType,
+ CustomUnit = x.ReadingQuestionTrial.CustomUnit,
VisitTaskId = x.VisitTaskId,
DictionaryCode = x.ReadingQuestionTrial.DictionaryCode,
ShowOrder = x.ReadingQuestionTrial.ShowOrder,
@@ -643,8 +643,8 @@ namespace IRaCIS.Core.Application.Service
[HttpPost]
public async Task TestGetJointMedicalReviewDialog(Guid id)
{
- var dialog = await _readingMedicalReviewDialogRepository.Where(x => x.Id == id)
- .ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync();
+ var dialog = await _readingMedicalReviewDialogRepository.Where(x => x.Id == id)
+ .ProjectTo(_mapper.ConfigurationProvider).FirstNotNullAsync();
Dictionary i18NKeys = new Dictionary()
@@ -661,11 +661,11 @@ namespace IRaCIS.Core.Application.Service
};
var i18Values = i18NKeys.Select(x => x.Value).ToList();
- var i18nList=await _internationalizationRepository.Where(x => i18Values.Contains(x.Code))
- .Select(x => new
+ var i18nList = await _internationalizationRepository.Where(x => i18Values.Contains(x.Code))
+ .Select(x => new
{
- Code= x.Code,
- Value= _userInfo.IsEn_Us?x.Value:x.ValueCN
+ Code = x.Code,
+ Value = _userInfo.IsEn_Us ? x.Value : x.ValueCN
}).ToListAsync();
List dictionaryCodeList = new List()
@@ -676,16 +676,16 @@ namespace IRaCIS.Core.Application.Service
"YesOrNo",
};
- var dictionadParents=await _dictionaryRepository.Where(x=> dictionaryCodeList.Contains(x.Parent.Code))
+ var dictionadParents = await _dictionaryRepository.Where(x => dictionaryCodeList.Contains(x.Parent.Code))
.Select(x => new
{
ParentCode = x.Parent.Code,
- Code=x.Code,
+ Code = x.Code,
Value = _userInfo.IsEn_Us ? x.Value : x.ValueCN
}).ToListAsync();
JointMedicalReviewI18n i18N = new JointMedicalReviewI18n() { };
- foreach (var kv in i18NKeys)
+ foreach (var kv in i18NKeys)
{
PropertyInfo? pi = i18N.GetType().GetProperty(kv.Key);
if (pi != null && pi.CanWrite)
@@ -706,7 +706,7 @@ namespace IRaCIS.Core.Application.Service
}
}
- return await JointMedicalReviewDialog(dialog,i18N);
+ return await JointMedicalReviewDialog(dialog, i18N);
@@ -910,7 +910,7 @@ namespace IRaCIS.Core.Application.Service
[HttpPost]
public async Task GetNextIRMedicalFeedback(GetNextIRMedicalFeedbackInDto inDto)
{
- var list = await GetIRMedicalFeedbackList(new GetIRMedicalFeedbackListInDto()
+ var responseOutput = await GetIRMedicalFeedbackList(new GetIRMedicalFeedbackListInDto()
{
TrialId = inDto.TrialId,
TrialReadingCriterionId = inDto.TrialReadingCriterionId,
@@ -919,6 +919,8 @@ namespace IRaCIS.Core.Application.Service
PageSize = 99999,
});
+ var list = responseOutput.Data;
+
var index = list.CurrentPageData.ToList().FindIndex(x => x.Id == inDto.TaskMedicalReviewId);
var result = new GetIRMedicalFeedbackListOutDto() { };
@@ -949,7 +951,7 @@ namespace IRaCIS.Core.Application.Service
///
///
[HttpPost]
- public async Task> GetIRMedicalFeedbackList(GetIRMedicalFeedbackListInDto inDto)
+ public async Task>> GetIRMedicalFeedbackList(GetIRMedicalFeedbackListInDto inDto)
{
var taskMedicalReviewquery = _taskMedicalReviewRepository.Where(x => x.TrialId == inDto.TrialId).Include(x => x.VisitTask)
.Where(x => x.VisitTask.DoctorUserId == _userInfo.UserRoleId)
@@ -1004,7 +1006,11 @@ namespace IRaCIS.Core.Application.Service
var result = await taskMedicalReviewquery.ToPagedListAsync(inDto, nameof(GetIRMedicalFeedbackListOutDto.AuditState));
- return result;
+ var criterionInfo = await _taskMedicalReviewRepository.Where(t => t.Id == inDto.TrialReadingCriterionId)
+ .Select(t => new { t.VisitTask.TrialReadingCriterion.IsReadingTaskViewInOrder }).FirstNotNullAsync();
+
+ return ResponseOutput.Ok(result, criterionInfo);
+
}
}
}