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