Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api
						commit
						88975db473
					
				| 
						 | 
				
			
			@ -95,7 +95,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
            !t.VisitTaskList.Any(u => u.TrialReadingCriterionId == confirmedTrialReadingCriterionId && u.SourceSubjectVisitId == t.Id)).ToListAsync();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            var trialReadingCriterionConfig = await _trialReadingCriterionRepository.Where(t => t.Id == confirmedTrialReadingCriterionId).Select(t => new { TrialReadingCriterionId = t.Id, t.ReadingTool, t.ReadingType, t.IsReadingTaskViewInOrder, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.FollowVisitAutoAssignDefaultState, t.TaskAllocateObjEnum ,t.CriterionType}).FirstOrDefaultAsync();
 | 
			
		||||
            var trialReadingCriterionConfig = await _trialReadingCriterionRepository.Where(t => t.Id == confirmedTrialReadingCriterionId).Select(t => new { TrialReadingCriterionId = t.Id, t.ReadingTool, t.ReadingType, t.IsReadingTaskViewInOrder, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.FollowVisitAutoAssignDefaultState, t.TaskAllocateObjEnum, t.CriterionType }).FirstOrDefaultAsync();
 | 
			
		||||
 | 
			
		||||
            //获取确认的临床数据配置
 | 
			
		||||
            var clinicalDataConfirmList = _trialClinicalDataSetRepository.Where(t => t.TrialId == trialId && t.IsConfirm).ToList();
 | 
			
		||||
| 
						 | 
				
			
			@ -141,51 +141,72 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    //每个访视 根据项目配置生成任务  双审生成两个 
 | 
			
		||||
 | 
			
		||||
                    if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double)
 | 
			
		||||
                    {
 | 
			
		||||
                        //每个访视 根据项目配置生成任务  双审生成两个 
 | 
			
		||||
                        var task1 = await _visitTaskRepository.AddAsync(new VisitTask()
 | 
			
		||||
                        //未防止脏数据 这里也多判断一次  
 | 
			
		||||
                        var existCurrentVisitTaskList = _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId
 | 
			
		||||
                                    && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.TaskState == TaskState.Effect
 | 
			
		||||
                                    && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.SourceSubjectVisitId == subjectVisit.Id).ToList();
 | 
			
		||||
 | 
			
		||||
                        VisitTask? task1 = null;
 | 
			
		||||
                        VisitTask? task2 = null;
 | 
			
		||||
 | 
			
		||||
                        if (!existCurrentVisitTaskList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1))
 | 
			
		||||
                        {
 | 
			
		||||
                            TrialId = trialId,
 | 
			
		||||
                            SubjectId = subjectVisit.SubjectId,
 | 
			
		||||
                            IsUrgent = subjectVisit.IsUrgent,
 | 
			
		||||
                            TaskBlindName = blindTaskName,
 | 
			
		||||
                            TaskName = subjectVisit.VisitName,
 | 
			
		||||
                            VisitTaskNum = subjectVisit.VisitNum,
 | 
			
		||||
                            //CheckPassedTime = subjectVisit.CheckPassedTime,
 | 
			
		||||
                            ArmEnum = Arm.DoubleReadingArm1,//特殊
 | 
			
		||||
                            Code = currentMaxCodeInt + 1,
 | 
			
		||||
                            SourceSubjectVisitId = subjectVisit.Id,
 | 
			
		||||
                            TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
 | 
			
		||||
                            ReadingCategory = ReadingCategory.Visit,
 | 
			
		||||
                            currentMaxCodeInt = currentMaxCodeInt + 1;
 | 
			
		||||
 | 
			
		||||
                            TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId,
 | 
			
		||||
                            IsNeedClinicalDataSign = isNeedClinicalDataSign,
 | 
			
		||||
                            IsClinicalDataSign = isClinicalDataSign
 | 
			
		||||
                        });
 | 
			
		||||
 | 
			
		||||
                        var task2 = await _visitTaskRepository.AddAsync(new VisitTask()
 | 
			
		||||
                            task1 = await _visitTaskRepository.AddAsync(new VisitTask()
 | 
			
		||||
                            {
 | 
			
		||||
                                TrialId = trialId,
 | 
			
		||||
                                SubjectId = subjectVisit.SubjectId,
 | 
			
		||||
                                IsUrgent = subjectVisit.IsUrgent,
 | 
			
		||||
                                TaskBlindName = blindTaskName,
 | 
			
		||||
                                TaskName = subjectVisit.VisitName,
 | 
			
		||||
                                VisitTaskNum = subjectVisit.VisitNum,
 | 
			
		||||
                                //CheckPassedTime = subjectVisit.CheckPassedTime,
 | 
			
		||||
                                ArmEnum = Arm.DoubleReadingArm1,//特殊
 | 
			
		||||
                                Code = currentMaxCodeInt,
 | 
			
		||||
                                SourceSubjectVisitId = subjectVisit.Id,
 | 
			
		||||
                                TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt, nameof(VisitTask)),
 | 
			
		||||
                                ReadingCategory = ReadingCategory.Visit,
 | 
			
		||||
 | 
			
		||||
                                TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId,
 | 
			
		||||
                                IsNeedClinicalDataSign = isNeedClinicalDataSign,
 | 
			
		||||
                                IsClinicalDataSign = isClinicalDataSign
 | 
			
		||||
                            });
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (!existCurrentVisitTaskList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2))
 | 
			
		||||
                        {
 | 
			
		||||
                            TrialId = trialId,
 | 
			
		||||
                            SubjectId = subjectVisit.SubjectId,
 | 
			
		||||
                            IsUrgent = subjectVisit.IsUrgent,
 | 
			
		||||
                            TaskBlindName = blindTaskName,
 | 
			
		||||
                            TaskName = subjectVisit.VisitName,
 | 
			
		||||
                            VisitTaskNum = subjectVisit.VisitNum,
 | 
			
		||||
                            //CheckPassedTime = subjectVisit.CheckPassedTime,
 | 
			
		||||
                            ArmEnum = Arm.DoubleReadingArm2,//特殊
 | 
			
		||||
                            Code = currentMaxCodeInt + 2,
 | 
			
		||||
                            SourceSubjectVisitId = subjectVisit.Id,
 | 
			
		||||
                            TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 2, nameof(VisitTask)),
 | 
			
		||||
                            ReadingCategory = ReadingCategory.Visit,
 | 
			
		||||
                            currentMaxCodeInt = currentMaxCodeInt + 1;
 | 
			
		||||
 | 
			
		||||
                            TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId,
 | 
			
		||||
                            IsNeedClinicalDataSign = isNeedClinicalDataSign,
 | 
			
		||||
                            IsClinicalDataSign = isClinicalDataSign
 | 
			
		||||
                        });
 | 
			
		||||
 | 
			
		||||
                        currentMaxCodeInt = currentMaxCodeInt + 2;
 | 
			
		||||
                            task2 = await _visitTaskRepository.AddAsync(new VisitTask()
 | 
			
		||||
                            {
 | 
			
		||||
                                TrialId = trialId,
 | 
			
		||||
                                SubjectId = subjectVisit.SubjectId,
 | 
			
		||||
                                IsUrgent = subjectVisit.IsUrgent,
 | 
			
		||||
                                TaskBlindName = blindTaskName,
 | 
			
		||||
                                TaskName = subjectVisit.VisitName,
 | 
			
		||||
                                VisitTaskNum = subjectVisit.VisitNum,
 | 
			
		||||
                                //CheckPassedTime = subjectVisit.CheckPassedTime,
 | 
			
		||||
                                ArmEnum = Arm.DoubleReadingArm2,//特殊
 | 
			
		||||
                                Code = currentMaxCodeInt,
 | 
			
		||||
                                SourceSubjectVisitId = subjectVisit.Id,
 | 
			
		||||
                                TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt, nameof(VisitTask)),
 | 
			
		||||
                                ReadingCategory = ReadingCategory.Visit,
 | 
			
		||||
 | 
			
		||||
                                TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId,
 | 
			
		||||
                                IsNeedClinicalDataSign = isNeedClinicalDataSign,
 | 
			
		||||
                                IsClinicalDataSign = isClinicalDataSign
 | 
			
		||||
                            });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
                                      
 | 
			
		||||
                        _provider.Set<int>($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -194,7 +215,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
 | 
			
		||||
                        var defaultState = trialReadingCriterionConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated;
 | 
			
		||||
 | 
			
		||||
                        if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1))
 | 
			
		||||
                        if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1) && task1!=null)
 | 
			
		||||
                        {
 | 
			
		||||
                            task1.TaskAllocationState = defaultState;
 | 
			
		||||
                            //分配给对应Arm的人
 | 
			
		||||
| 
						 | 
				
			
			@ -204,7 +225,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
                            task1.SuggesteFinishedTime = DateTime.Now.AddDays(7);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2))
 | 
			
		||||
                        if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2) && task2!=null)
 | 
			
		||||
                        {
 | 
			
		||||
                            task2.TaskAllocationState = defaultState;
 | 
			
		||||
                            task2.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm2).DoctorUserId;
 | 
			
		||||
| 
						 | 
				
			
			@ -216,7 +237,6 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
                    else if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Single)
 | 
			
		||||
                    {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                        var singleTask = await _visitTaskRepository.AddAsync(new VisitTask()
 | 
			
		||||
                        {
 | 
			
		||||
                            TrialId = trialId,
 | 
			
		||||
| 
						 | 
				
			
			@ -271,10 +291,10 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        private  bool IsNeedClinicalDataSign(ReadingCategory readingCategory, bool isbaseLine, CriterionType criterionType ,List<ClinicalDataTrialSet> trialClinicalDataSetList)
 | 
			
		||||
        private bool IsNeedClinicalDataSign(ReadingCategory readingCategory, bool isbaseLine, CriterionType criterionType, List<ClinicalDataTrialSet> trialClinicalDataSetList)
 | 
			
		||||
        {
 | 
			
		||||
            //访视
 | 
			
		||||
            if (readingCategory==ReadingCategory.Visit)
 | 
			
		||||
            if (readingCategory == ReadingCategory.Visit)
 | 
			
		||||
            {
 | 
			
		||||
                if (isbaseLine)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -284,7 +304,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    return trialClinicalDataSetList.Any(t => t.CriterionEnumList.Any(c => c == (int)criterionType) &&  t.ClinicalDataLevel == ClinicalLevel.SubjectVisit);
 | 
			
		||||
                    return trialClinicalDataSetList.Any(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.SubjectVisit);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -311,7 +331,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
        // 有可能在任务生成之前 就签名完了临床数据
 | 
			
		||||
        private bool IsClinicalDataSign(ReadingCategory readingCategory, bool isbaseLine, CriterionType criterionType, List<ClinicalDataTrialSet> trialClinicalDataSetList,Guid readingId, Guid trialId)
 | 
			
		||||
        private bool IsClinicalDataSign(ReadingCategory readingCategory, bool isbaseLine, CriterionType criterionType, List<ClinicalDataTrialSet> trialClinicalDataSetList, Guid readingId, Guid trialId)
 | 
			
		||||
        {
 | 
			
		||||
            var isClinicalDataSign = false;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -375,7 +395,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
            var trialId = generateTaskCommand.TrialId;
 | 
			
		||||
            var isAssignSubjectToDoctor = generateTaskCommand.IsAssignSubjectToDoctor;
 | 
			
		||||
 | 
			
		||||
            var trialReadingCriterionConfigList = _trialReadingCriterionRepository.Where(t => t.TrialId == trialId && t.ReadingInfoSignTime != null).Select(t => new { TrialReadingCriterionId = t.Id, t.ReadingTool, t.ReadingType, t.IsReadingTaskViewInOrder, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.FollowVisitAutoAssignDefaultState, t.TaskAllocateObjEnum,t.CriterionType }).ToList();
 | 
			
		||||
            var trialReadingCriterionConfigList = _trialReadingCriterionRepository.Where(t => t.TrialId == trialId && t.ReadingInfoSignTime != null).Select(t => new { TrialReadingCriterionId = t.Id, t.ReadingTool, t.ReadingType, t.IsReadingTaskViewInOrder, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.FollowVisitAutoAssignDefaultState, t.TaskAllocateObjEnum, t.CriterionType }).ToList();
 | 
			
		||||
 | 
			
		||||
            var visitBlindConfig = _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.BlindBaseLineName, t.BlindFollowUpPrefix }).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -434,52 +454,71 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
                                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                //每个访视 根据项目配置生成任务  双审生成两个 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                //双重 可能有一个人的任务没分配,然后影像回退不会影响未分配的任务,所以生成的时候 要进行判断 不能每次都生成两个
 | 
			
		||||
                                if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double)
 | 
			
		||||
                                {
 | 
			
		||||
                                    //每个访视 根据项目配置生成任务  双审生成两个 
 | 
			
		||||
                                    var task1 = await _visitTaskRepository.AddAsync(new VisitTask()
 | 
			
		||||
 | 
			
		||||
                                    var existCurrentVisitTaskList = _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId
 | 
			
		||||
                                    && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.TaskState == TaskState.Effect
 | 
			
		||||
                                    && t.TaskAllocationState == TaskAllocationState.NotAllocate && t.DoctorUserId == null && t.SourceSubjectVisitId == subjectVisit.Id).ToList();
 | 
			
		||||
 | 
			
		||||
                                    VisitTask? task1 = null;
 | 
			
		||||
                                    VisitTask? task2 = null;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                    if (!existCurrentVisitTaskList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1))
 | 
			
		||||
                                    {
 | 
			
		||||
                                        TrialId = trialId,
 | 
			
		||||
                                        SubjectId = subjectVisit.SubjectId,
 | 
			
		||||
                                        IsUrgent = subjectVisit.IsUrgent,
 | 
			
		||||
                                        TaskBlindName = blindTaskName,
 | 
			
		||||
                                        TaskName = subjectVisit.VisitName,
 | 
			
		||||
                                        VisitTaskNum = subjectVisit.VisitNum,
 | 
			
		||||
                                        //CheckPassedTime = subjectVisit.CheckPassedTime,
 | 
			
		||||
                                        ArmEnum = Arm.DoubleReadingArm1,//特殊
 | 
			
		||||
                                        Code = currentMaxCodeInt + 1,
 | 
			
		||||
                                        SourceSubjectVisitId = subjectVisit.Id,
 | 
			
		||||
                                        TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
 | 
			
		||||
                                        ReadingCategory = ReadingCategory.Visit,
 | 
			
		||||
                                        currentMaxCodeInt = currentMaxCodeInt + 1;
 | 
			
		||||
 | 
			
		||||
                                        TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId,
 | 
			
		||||
                                        IsNeedClinicalDataSign = isNeedClinicalDataSign,
 | 
			
		||||
                                        IsClinicalDataSign = isClinicalDataSign
 | 
			
		||||
                                    }); ;
 | 
			
		||||
                                        task1 = await _visitTaskRepository.AddAsync(new VisitTask()
 | 
			
		||||
                                        {
 | 
			
		||||
                                            TrialId = trialId,
 | 
			
		||||
                                            SubjectId = subjectVisit.SubjectId,
 | 
			
		||||
                                            IsUrgent = subjectVisit.IsUrgent,
 | 
			
		||||
                                            TaskBlindName = blindTaskName,
 | 
			
		||||
                                            TaskName = subjectVisit.VisitName,
 | 
			
		||||
                                            VisitTaskNum = subjectVisit.VisitNum,
 | 
			
		||||
                                            //CheckPassedTime = subjectVisit.CheckPassedTime,
 | 
			
		||||
                                            ArmEnum = Arm.DoubleReadingArm1,//特殊
 | 
			
		||||
                                            Code = currentMaxCodeInt,
 | 
			
		||||
                                            SourceSubjectVisitId = subjectVisit.Id,
 | 
			
		||||
                                            TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt, nameof(VisitTask)),
 | 
			
		||||
                                            ReadingCategory = ReadingCategory.Visit,
 | 
			
		||||
 | 
			
		||||
                                    var task2 = await _visitTaskRepository.AddAsync(new VisitTask()
 | 
			
		||||
                                            TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId,
 | 
			
		||||
                                            IsNeedClinicalDataSign = isNeedClinicalDataSign,
 | 
			
		||||
                                            IsClinicalDataSign = isClinicalDataSign
 | 
			
		||||
                                        });
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                                    if (!existCurrentVisitTaskList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2))
 | 
			
		||||
                                    {
 | 
			
		||||
                                        TrialId = trialId,
 | 
			
		||||
                                        SubjectId = subjectVisit.SubjectId,
 | 
			
		||||
                                        IsUrgent = subjectVisit.IsUrgent,
 | 
			
		||||
                                        TaskBlindName = blindTaskName,
 | 
			
		||||
                                        TaskName = subjectVisit.VisitName,
 | 
			
		||||
                                        VisitTaskNum = subjectVisit.VisitNum,
 | 
			
		||||
                                        //CheckPassedTime = subjectVisit.CheckPassedTime,
 | 
			
		||||
                                        ArmEnum = Arm.DoubleReadingArm2,//特殊
 | 
			
		||||
                                        Code = currentMaxCodeInt + 2,
 | 
			
		||||
                                        SourceSubjectVisitId = subjectVisit.Id,
 | 
			
		||||
                                        TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 2, nameof(VisitTask)),
 | 
			
		||||
                                        ReadingCategory = ReadingCategory.Visit,
 | 
			
		||||
                                        currentMaxCodeInt = currentMaxCodeInt + 1;
 | 
			
		||||
                                        task2 = await _visitTaskRepository.AddAsync(new VisitTask()
 | 
			
		||||
                                        {
 | 
			
		||||
                                            TrialId = trialId,
 | 
			
		||||
                                            SubjectId = subjectVisit.SubjectId,
 | 
			
		||||
                                            IsUrgent = subjectVisit.IsUrgent,
 | 
			
		||||
                                            TaskBlindName = blindTaskName,
 | 
			
		||||
                                            TaskName = subjectVisit.VisitName,
 | 
			
		||||
                                            VisitTaskNum = subjectVisit.VisitNum,
 | 
			
		||||
                                            //CheckPassedTime = subjectVisit.CheckPassedTime,
 | 
			
		||||
                                            ArmEnum = Arm.DoubleReadingArm2,//特殊
 | 
			
		||||
                                            Code = currentMaxCodeInt,
 | 
			
		||||
                                            SourceSubjectVisitId = subjectVisit.Id,
 | 
			
		||||
                                            TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt, nameof(VisitTask)),
 | 
			
		||||
                                            ReadingCategory = ReadingCategory.Visit,
 | 
			
		||||
 | 
			
		||||
                                            TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId,
 | 
			
		||||
                                            IsNeedClinicalDataSign = isNeedClinicalDataSign,
 | 
			
		||||
                                            IsClinicalDataSign = isClinicalDataSign
 | 
			
		||||
                                        });
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                        TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId,
 | 
			
		||||
                                        IsNeedClinicalDataSign = isNeedClinicalDataSign,
 | 
			
		||||
                                        IsClinicalDataSign=isClinicalDataSign
 | 
			
		||||
                                    });
 | 
			
		||||
 | 
			
		||||
                                    currentMaxCodeInt = currentMaxCodeInt + 2;
 | 
			
		||||
 | 
			
		||||
                                    _provider.Set<int>($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -527,7 +566,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
 | 
			
		||||
                                                            var defaultState = trialReadingCriterionConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated;
 | 
			
		||||
 | 
			
		||||
                                                            if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1))
 | 
			
		||||
                                                            if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1) && task1 != null)
 | 
			
		||||
                                                            {
 | 
			
		||||
                                                                task1.TaskAllocationState = defaultState;
 | 
			
		||||
                                                                //分配给对应Arm的人
 | 
			
		||||
| 
						 | 
				
			
			@ -537,7 +576,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
                                                                task1.SuggesteFinishedTime = DateTime.Now.AddDays(7);
 | 
			
		||||
                                                            }
 | 
			
		||||
 | 
			
		||||
                                                            if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2))
 | 
			
		||||
                                                            if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2) && task2 != null)
 | 
			
		||||
                                                            {
 | 
			
		||||
                                                                task2.TaskAllocationState = defaultState;
 | 
			
		||||
                                                                task2.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm2).DoctorUserId;
 | 
			
		||||
| 
						 | 
				
			
			@ -608,7 +647,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
                                                                        SuggesteFinishedTime = DateTime.Now.AddDays(7),
 | 
			
		||||
                                                                        TrialReadingCriterionId = latestTask.TrialReadingCriterionId,
 | 
			
		||||
                                                                        IsNeedClinicalDataSign = latestTask.IsNeedClinicalDataSign,
 | 
			
		||||
                                                                        IsClinicalDataSign=latestTask.IsClinicalDataSign
 | 
			
		||||
                                                                        IsClinicalDataSign = latestTask.IsClinicalDataSign
 | 
			
		||||
                                                                    });
 | 
			
		||||
 | 
			
		||||
                                                                    currentMaxCodeInt = currentMaxCodeInt + 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -683,7 +722,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
                                                    {
 | 
			
		||||
                                                        var defaultState = trialReadingCriterionConfig.FollowVisitAutoAssignDefaultState == TaskAllocateDefaultState.InitAllocated ? TaskAllocationState.InitAllocated : TaskAllocationState.Allocated;
 | 
			
		||||
 | 
			
		||||
                                                        if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1))
 | 
			
		||||
                                                        if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1) && task1 != null)
 | 
			
		||||
                                                        {
 | 
			
		||||
                                                            task1.TaskAllocationState = defaultState;
 | 
			
		||||
                                                            //分配给对应Arm的人
 | 
			
		||||
| 
						 | 
				
			
			@ -693,7 +732,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
                                                            task1.SuggesteFinishedTime = DateTime.Now.AddDays(7);
 | 
			
		||||
                                                        }
 | 
			
		||||
 | 
			
		||||
                                                        if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2))
 | 
			
		||||
                                                        if (assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2) && task2 != null)
 | 
			
		||||
                                                        {
 | 
			
		||||
                                                            task2.TaskAllocationState = defaultState;
 | 
			
		||||
                                                            task2.DoctorUserId = assignConfigList.FirstOrDefault(t => t.ArmEnum == Arm.DoubleReadingArm2).DoctorUserId;
 | 
			
		||||
| 
						 | 
				
			
			@ -987,8 +1026,8 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
                        TrialReadingCriterionId = reReadingVisitTask.TrialReadingCriterionId,
 | 
			
		||||
                        IsNeedClinicalDataSign=reReadingVisitTask.IsNeedClinicalDataSign,
 | 
			
		||||
                        IsClinicalDataSign= reReadingVisitTask.IsClinicalDataSign,
 | 
			
		||||
                        IsNeedClinicalDataSign = reReadingVisitTask.IsNeedClinicalDataSign,
 | 
			
		||||
                        IsClinicalDataSign = reReadingVisitTask.IsClinicalDataSign,
 | 
			
		||||
 | 
			
		||||
                        // TaskAllocationState = reReadingVisitTask.TaskAllocationState,
 | 
			
		||||
                        // AllocateTime = DateTime.Now,
 | 
			
		||||
| 
						 | 
				
			
			@ -1064,8 +1103,8 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
                            TrialReadingCriterionId = task.TrialReadingCriterionId,
 | 
			
		||||
                            BlindTrialSiteCode = task.BlindTrialSiteCode,
 | 
			
		||||
                            BlindSubjectCode = task.BlindSubjectCode,
 | 
			
		||||
                            IsNeedClinicalDataSign =task.IsNeedClinicalDataSign,
 | 
			
		||||
                            IsClinicalDataSign=task.IsClinicalDataSign
 | 
			
		||||
                            IsNeedClinicalDataSign = task.IsNeedClinicalDataSign,
 | 
			
		||||
                            IsClinicalDataSign = task.IsClinicalDataSign
 | 
			
		||||
                        };
 | 
			
		||||
 | 
			
		||||
                        await _visitTaskRepository.AddAsync(consistentTask);
 | 
			
		||||
| 
						 | 
				
			
			@ -1210,7 +1249,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
 | 
			
		||||
                                TrialReadingCriterionId = originalTaskInfo.TrialReadingCriterionId,
 | 
			
		||||
                                IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Global, false, criterionType, clinicalDataConfirmList),
 | 
			
		||||
                                IsClinicalDataSign=IsClinicalDataSign(ReadingCategory.Global, false, criterionType, clinicalDataConfirmList,item.ReadModuleId,trialId)
 | 
			
		||||
                                IsClinicalDataSign = IsClinicalDataSign(ReadingCategory.Global, false, criterionType, clinicalDataConfirmList, item.ReadModuleId, trialId)
 | 
			
		||||
                            });
 | 
			
		||||
 | 
			
		||||
                            currentMaxCodeInt = currentMaxCodeInt + 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -1224,7 +1263,7 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
 | 
			
		||||
                    originalTaskInfo = await _visitTaskRepository.Where(x => x.Id == generateTaskCommand.OriginalVisitId).FirstNotNullAsync();
 | 
			
		||||
 | 
			
		||||
                     criterionType = await _trialReadingCriterionRepository.Where(t => t.Id == originalTaskInfo.TrialReadingCriterionId).Select(t => t.CriterionType).FirstOrDefaultAsync();
 | 
			
		||||
                    criterionType = await _trialReadingCriterionRepository.Where(t => t.Id == originalTaskInfo.TrialReadingCriterionId).Select(t => t.CriterionType).FirstOrDefaultAsync();
 | 
			
		||||
 | 
			
		||||
                    foreach (var item in generateTaskCommand.ReadingGenerataTaskList)
 | 
			
		||||
                    {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1084,6 +1084,7 @@ namespace IRaCIS.Core.Application.Image.QA
 | 
			
		|||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //同时要根据项目有没有配置Subject 级别临床数据
 | 
			
		||||
            if (dbSubjectVisitList.Any(t => t.IsBaseLine && !t.IsHaveClinicalData))
 | 
			
		||||
            {
 | 
			
		||||
                return ResponseOutput.NotOk($"基线没有临床数据,确认提交?", 0, ApiResponseCodeEnum.NeedTips);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -112,7 +112,6 @@ namespace IRaCIS.Application.Services
 | 
			
		|||
            else
 | 
			
		||||
            {
 | 
			
		||||
                var entity = (await _readingClinicalDataRepository.Where(t => t.Id == indto.Id, true).FirstOrDefaultAsync()).IfNullThrowException();
 | 
			
		||||
                _mapper.Map(indto, entity);
 | 
			
		||||
                await _readingClinicalDataPDFRepository.BatchDeleteNoTrackingAsync(x => indto.DeleteFileIds.Contains(x.Id));
 | 
			
		||||
 | 
			
		||||
                var addFileList = indto.AddFileList.Select(x => new ReadingClinicalDataPDF()
 | 
			
		||||
| 
						 | 
				
			
			@ -123,6 +122,19 @@ namespace IRaCIS.Application.Services
 | 
			
		|||
 | 
			
		||||
                    ReadingClinicalDataId = entity.Id,
 | 
			
		||||
                }).ToList();
 | 
			
		||||
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                _mapper.Map(indto, entity);
 | 
			
		||||
 | 
			
		||||
                //上传  或者删除了文件 核查状态需要重新确认
 | 
			
		||||
 | 
			
		||||
                if (indto.AddFileList.Count > 0 || indto.AddFileList.Count > 0)
 | 
			
		||||
                {
 | 
			
		||||
                    entity.IsComplete = null;
 | 
			
		||||
                    entity.IsBlind = null;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                await _readingClinicalDataPDFRepository.AddRangeAsync(addFileList);
 | 
			
		||||
 | 
			
		||||
                await _readingClinicalDataPDFRepository.SaveChangesAsync();
 | 
			
		||||
| 
						 | 
				
			
			@ -266,7 +278,7 @@ namespace IRaCIS.Application.Services
 | 
			
		|||
 | 
			
		||||
            var data = await _readingClinicalDataRepository.FirstOrDefaultAsync(t => t.Id == inDto.ReadingClinicalDataId);
 | 
			
		||||
 | 
			
		||||
            if (data.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveChecked)
 | 
			
		||||
            if (data.ReadingClinicalDataState != ReadingClinicalDataStatus.HaveChecked)
 | 
			
		||||
            {
 | 
			
		||||
                 throw new BusinessValidationFailedException("当前临床数据状态不是已核查状态,不允许签名!");
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -381,6 +393,8 @@ namespace IRaCIS.Application.Services
 | 
			
		|||
                IsFrontTaskNeedSignButNotSign = true
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            var visitTaskIdQueryable2= _visitTaskRepository.Where(visitTaskLambda) //该Subject  该标准的任务
 | 
			
		||||
                                                                                   //小于自己任务号的任务  存在需要签名  但是没签名
 | 
			
		||||
                      .Where(t =>! t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum && t.IsFrontTaskNeedSignButNotSign == true))
 | 
			
		||||
| 
						 | 
				
			
			@ -728,6 +742,7 @@ namespace IRaCIS.Application.Services
 | 
			
		|||
            var fileCount = await _readingClinicalDataPDFRepository.Where(t => t.ReadingClinicalDataId == pdf.ReadingClinicalDataId).CountAsync();
 | 
			
		||||
 | 
			
		||||
            await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(pdf.ReadingClinicalDataId, c => new ReadingClinicalData() { FileCount = fileCount }, true);
 | 
			
		||||
 | 
			
		||||
            return ResponseOutput.Result(true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -214,12 +214,26 @@ update VisitTask set IsNeedClinicalDataSign =1 from VisitTask
 | 
			
		|||
inner join ReadingQuestionCriterionTrial on   ReadingQuestionCriterionTrial.Id=VisitTask.TrialReadingCriterionId  
 | 
			
		||||
inner join SubjectVisit on   VisitTask.SourceSubjectVisitId=SubjectVisit.Id  
 | 
			
		||||
 | 
			
		||||
 where VisitTask.ReadingCategory=1  and SubjectVisit.IsBaseLine=1  and EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%' and (ClinicalDataLevel=0 or ClinicalDataLevel=1))
 | 
			
		||||
 where VisitTask.ReadingCategory=1  and SubjectVisit.IsBaseLine=1  and EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%' and (ClinicalDataLevel=0 or ClinicalDataLevel=1) and IsConfirm=1)  and IsNeedClinicalDataSign=0
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
 update VisitTask set IsNeedClinicalDataSign =0 from VisitTask 
 | 
			
		||||
inner join ReadingQuestionCriterionTrial on   ReadingQuestionCriterionTrial.Id=VisitTask.TrialReadingCriterionId  
 | 
			
		||||
inner join SubjectVisit on   VisitTask.SourceSubjectVisitId=SubjectVisit.Id  
 | 
			
		||||
 | 
			
		||||
 where VisitTask.ReadingCategory=1  and SubjectVisit.IsBaseLine=1  and not EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%' and (ClinicalDataLevel=0 or ClinicalDataLevel=1) and IsConfirm=1)  and IsNeedClinicalDataSign=1
 | 
			
		||||
 | 
			
		||||
    --非基线
 | 
			
		||||
update VisitTask set IsNeedClinicalDataSign =1 from VisitTask 
 | 
			
		||||
inner join ReadingQuestionCriterionTrial on   ReadingQuestionCriterionTrial.Id=VisitTask.TrialReadingCriterionId  
 | 
			
		||||
inner join SubjectVisit on   VisitTask.SourceSubjectVisitId=SubjectVisit.Id  
 | 
			
		||||
 where VisitTask.ReadingCategory=1  and SubjectVisit.IsBaseLine=0 and EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%' and ClinicalDataLevel=1)
 | 
			
		||||
 where VisitTask.ReadingCategory=1  and SubjectVisit.IsBaseLine=0 and EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%' and ClinicalDataLevel=1 and IsConfirm=1) and IsNeedClinicalDataSign =0
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
 update VisitTask set IsNeedClinicalDataSign =0 from VisitTask 
 | 
			
		||||
inner join ReadingQuestionCriterionTrial on   ReadingQuestionCriterionTrial.Id=VisitTask.TrialReadingCriterionId  
 | 
			
		||||
inner join SubjectVisit on   VisitTask.SourceSubjectVisitId=SubjectVisit.Id  
 | 
			
		||||
 where VisitTask.ReadingCategory=1  and SubjectVisit.IsBaseLine=0 and not EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%' and ClinicalDataLevel=1 and IsConfirm=1)  and IsNeedClinicalDataSign =1
 | 
			
		||||
	 
 | 
			
		||||
--处理裁判
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -230,14 +244,20 @@ update VisitTask set IsNeedClinicalDataSign =0,IsClinicalDataSign=0    where Vis
 | 
			
		|||
update VisitTask set IsNeedClinicalDataSign =1 from VisitTask 
 | 
			
		||||
inner join ReadingQuestionCriterionTrial on   ReadingQuestionCriterionTrial.Id=VisitTask.TrialReadingCriterionId  
 | 
			
		||||
inner join ReadModule on   VisitTask.SouceReadModuleId=ReadModule.Id  
 | 
			
		||||
 where VisitTask.ReadingCategory=5   and EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%'   and ClinicalDataLevel=3)
 | 
			
		||||
 where VisitTask.ReadingCategory=5   and EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%'   and ClinicalDataLevel=3 and IsConfirm=1)
 | 
			
		||||
 
 | 
			
		||||
--处理全局
 | 
			
		||||
 | 
			
		||||
update VisitTask set IsNeedClinicalDataSign =1 from VisitTask 
 | 
			
		||||
inner join ReadingQuestionCriterionTrial on   ReadingQuestionCriterionTrial.Id=VisitTask.TrialReadingCriterionId  
 | 
			
		||||
inner join ReadModule on   VisitTask.SouceReadModuleId=ReadModule.Id  
 | 
			
		||||
 where VisitTask.ReadingCategory=2  and  EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%'   and ClinicalDataLevel=2)
 | 
			
		||||
 where VisitTask.ReadingCategory=2  and  EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%'   and ClinicalDataLevel=2 and IsConfirm=1)
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
update VisitTask set IsNeedClinicalDataSign =0 from VisitTask 
 | 
			
		||||
inner join ReadingQuestionCriterionTrial on   ReadingQuestionCriterionTrial.Id=VisitTask.TrialReadingCriterionId  
 | 
			
		||||
inner join ReadModule on   VisitTask.SouceReadModuleId=ReadModule.Id  
 | 
			
		||||
 where VisitTask.ReadingCategory=2  and not EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%'   and ClinicalDataLevel=2  and IsConfirm=1 ) and IsNeedClinicalDataSign=1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 -----处理  是否所有临床数据都签名的字段
 | 
			
		||||
| 
						 | 
				
			
			@ -287,13 +307,25 @@ inner join ReadModule on   VisitTask.SouceReadModuleId=ReadModule.Id
 | 
			
		|||
update VisitTask set IsClinicalDataSign =1 from VisitTask 
 | 
			
		||||
inner join ReadingQuestionCriterionTrial on   ReadingQuestionCriterionTrial.Id=VisitTask.TrialReadingCriterionId  
 | 
			
		||||
inner join ReadModule on   VisitTask.SouceReadModuleId=ReadModule.Id  
 | 
			
		||||
 where VisitTask.ReadingCategory=2  
 | 
			
		||||
 where VisitTask.ReadingCategory=2  	and  VisitTask.IsClinicalDataSign =1
 | 
			
		||||
 and  EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%' and  ClinicalDataLevel=2)
 | 
			
		||||
 
 | 
			
		||||
 and     (select  count(*) from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%' and  ClinicalDataLevel=2)
 | 
			
		||||
 =(select count(*) from ReadingClinicalData  inner join ClinicalDataTrialSet  on ReadingClinicalData.ClinicalDataTrialSetId =ClinicalDataTrialSet.Id
 | 
			
		||||
    	where ReadingClinicalData.TrialId=VisitTask.TrialId and IsSign=1 and ReadingClinicalDataState=3 and ReadingId=VisitTask.SourceSubjectVisitId and ClinicalDataTrialSet.UploadRole=1)
 | 
			
		||||
 | 
			
		||||
			update VisitTask set IsClinicalDataSign =0 from VisitTask 
 | 
			
		||||
inner join ReadingQuestionCriterionTrial on   ReadingQuestionCriterionTrial.Id=VisitTask.TrialReadingCriterionId  
 | 
			
		||||
inner join ReadModule on   VisitTask.SouceReadModuleId=ReadModule.Id  
 | 
			
		||||
 where VisitTask.ReadingCategory=2  			and  VisitTask.IsClinicalDataSign =1
 | 
			
		||||
 and
 | 
			
		||||
 ( not EXISTS (select * from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%' and  ClinicalDataLevel=2)
 | 
			
		||||
 
 | 
			
		||||
 or     (select  count(*) from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%' and  ClinicalDataLevel=2)
 | 
			
		||||
 !=(select count(*) from ReadingClinicalData  inner join ClinicalDataTrialSet  on ReadingClinicalData.ClinicalDataTrialSetId =ClinicalDataTrialSet.Id
 | 
			
		||||
    	where ReadingClinicalData.TrialId=VisitTask.TrialId and IsSign=1 and ReadingClinicalDataState=3 and ReadingId=VisitTask.SourceSubjectVisitId and ClinicalDataTrialSet.UploadRole=1)
 | 
			
		||||
			)
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
 --处理字段  IsFrontTaskNeedSignButNotSign
 | 
			
		||||
				
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue