删除按照医生维度分配Subject
							parent
							
								
									0493786b36
								
							
						
					
					
						commit
						cabcf317f6
					
				| 
						 | 
				
			
			@ -41,7 +41,7 @@
 | 
			
		|||
        </member>
 | 
			
		||||
        <member name="M:IRaCIS.Core.Application.Service.TaskAllocationRuleService.GetSubjectApplyDoctorTaskStatList(IRaCIS.Core.Application.ViewModel.ApplySubjectCommand)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            获取应用Subject后  医生比率情况
 | 
			
		||||
            获取访视任务   应用Subject后  医生比率情况
 | 
			
		||||
            </summary>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -211,6 +211,8 @@ namespace IRaCIS.Core.Application.ViewModel
 | 
			
		|||
 | 
			
		||||
        public string SubjectCode { get; set; } = String.Empty;
 | 
			
		||||
 | 
			
		||||
        public bool IsJudgeDoctor { get; set; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public Guid? DoctorUserId { get; set; }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -269,6 +271,8 @@ namespace IRaCIS.Core.Application.ViewModel
 | 
			
		|||
 | 
			
		||||
        public List<Guid> SubjectIdList { get; set; }
 | 
			
		||||
 | 
			
		||||
        public bool IsJudgeDoctor { get; set; }
 | 
			
		||||
 | 
			
		||||
        public List<DoctorArm> DoctorUserIdArmList { get; set; } = new List<DoctorArm>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -283,6 +287,8 @@ namespace IRaCIS.Core.Application.ViewModel
 | 
			
		|||
    {
 | 
			
		||||
        public Guid TrialId { get; set; }
 | 
			
		||||
 | 
			
		||||
        public bool IsJudgeDoctor { get; set; }
 | 
			
		||||
 | 
			
		||||
        public List<Guid> SubjectIdList { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -322,6 +328,7 @@ namespace IRaCIS.Core.Application.ViewModel
 | 
			
		|||
    {
 | 
			
		||||
        public Guid TrialId { get; set; }
 | 
			
		||||
 | 
			
		||||
        public bool IsJudgeDoctor { get; set; }
 | 
			
		||||
 | 
			
		||||
        public List<SubjectDoctorCommand> SubjectDoctorUserList { get; set; } = new List<SubjectDoctorCommand>();
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -346,6 +353,8 @@ namespace IRaCIS.Core.Application.ViewModel
 | 
			
		|||
 | 
			
		||||
        public Guid SubjectId { get; set; }
 | 
			
		||||
 | 
			
		||||
        public bool IsJudgeDoctor { get; set; }
 | 
			
		||||
 | 
			
		||||
        public Guid? DoctorUserId { get; set; }
 | 
			
		||||
 | 
			
		||||
        public TaskOptType TaskOptType { get; set; }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -312,15 +312,27 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
        [HttpPost]
 | 
			
		||||
        public async Task<PageOutput<SubjectAssignView>> GetSubjectAssignList(SubjectAssignQuery querySubjectAssign)
 | 
			
		||||
        {
 | 
			
		||||
            var subjectQuery = _subjectRepository.Where(t => t.TrialId == querySubjectAssign.TrialId)
 | 
			
		||||
                  .Where(t => t.SubjectVisitTaskList.Any())
 | 
			
		||||
            var subjectQuery = _subjectRepository.Where(t => t.TrialId == querySubjectAssign.TrialId)                
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsJudgeDoctor == false,t=> t.SubjectVisitTaskList.Where(t => t.ArmEnum != Arm.JudgeArm).Any())
 | 
			
		||||
                   .WhereIf(querySubjectAssign.IsJudgeDoctor , t=>t.SubjectVisitTaskList.Where(t => t.ArmEnum == Arm.JudgeArm).Any())
 | 
			
		||||
 | 
			
		||||
                  .WhereIf(querySubjectAssign.SiteId != null, t => t.SiteId == querySubjectAssign.SiteId)
 | 
			
		||||
                  .WhereIf(querySubjectAssign.SubjectId != null, t => t.Id == querySubjectAssign.SubjectId)
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == true, t => t.SubjectDoctorList.Count() > 0)
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == false, t => !t.SubjectDoctorList.Any())
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsHaveApplyedTask != null && querySubjectAssign.IsHaveApplyedTask == true, t => t.SubjectDoctorList.SelectMany(t => t.Subject.SubjectVisitTaskList).All(u => u.DoctorUserId != null))
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsHaveApplyedTask != null && querySubjectAssign.IsHaveApplyedTask == false, t => t.SubjectDoctorList.SelectMany(t => t.Subject.SubjectVisitTaskList).Any(u => u.DoctorUserId == null))
 | 
			
		||||
                  .WhereIf(querySubjectAssign.DoctorUserId != null, t => t.SubjectDoctorList.Any(t => t.DoctorUserId == querySubjectAssign.DoctorUserId))
 | 
			
		||||
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == true && querySubjectAssign.IsJudgeDoctor == false, t => t.SubjectDoctorList.Where(t => t.ArmEnum != Arm.JudgeArm).Count() > 0)
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == true && querySubjectAssign.IsJudgeDoctor , t => t.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).Count() > 0)
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == false && querySubjectAssign.IsJudgeDoctor == false, t => !t.SubjectDoctorList.Where(t => t.ArmEnum != Arm.JudgeArm).Any())
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsHaveAssigned != null && querySubjectAssign.IsHaveAssigned == false && querySubjectAssign.IsJudgeDoctor , t => !t.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).Any())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsHaveApplyedTask != null && querySubjectAssign.IsHaveApplyedTask == true && querySubjectAssign.IsJudgeDoctor == false, t => t.SubjectDoctorList.Where(t => t.ArmEnum != Arm.JudgeArm).SelectMany(t => t.Subject.SubjectVisitTaskList).All(u => u.DoctorUserId != null))
 | 
			
		||||
                   .WhereIf(querySubjectAssign.IsHaveApplyedTask != null && querySubjectAssign.IsHaveApplyedTask == true && querySubjectAssign.IsJudgeDoctor, t => t.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).SelectMany(t => t.Subject.SubjectVisitTaskList).All(u => u.DoctorUserId != null))
 | 
			
		||||
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsHaveApplyedTask != null && querySubjectAssign.IsHaveApplyedTask == false && querySubjectAssign.IsJudgeDoctor == false, t => t.SubjectDoctorList.Where(t => t.ArmEnum != Arm.JudgeArm).SelectMany(t => t.Subject.SubjectVisitTaskList).Any(u => u.DoctorUserId == null))
 | 
			
		||||
                  .WhereIf(querySubjectAssign.IsHaveApplyedTask != null && querySubjectAssign.IsHaveApplyedTask == false && querySubjectAssign.IsJudgeDoctor, t => t.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).SelectMany(t => t.Subject.SubjectVisitTaskList).Any(u => u.DoctorUserId == null))
 | 
			
		||||
 | 
			
		||||
                  .WhereIf(querySubjectAssign.DoctorUserId != null && querySubjectAssign.IsJudgeDoctor == false, t => t.SubjectDoctorList.Where(t=>t.ArmEnum != Arm.JudgeArm).Any(t => t.DoctorUserId == querySubjectAssign.DoctorUserId))
 | 
			
		||||
                   .WhereIf(querySubjectAssign.DoctorUserId != null && querySubjectAssign.IsJudgeDoctor, t => t.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).Any(t => t.DoctorUserId == querySubjectAssign.DoctorUserId))
 | 
			
		||||
                  .ProjectTo<SubjectAssignView>(_mapper.ConfigurationProvider);
 | 
			
		||||
 | 
			
		||||
            var pageList = await subjectQuery.ToPagedListAsync(querySubjectAssign.PageIndex, querySubjectAssign.PageSize, string.IsNullOrWhiteSpace(querySubjectAssign.SortField) ? nameof(querySubjectAssign.SubjectId) : querySubjectAssign.SortField, querySubjectAssign.Asc);
 | 
			
		||||
| 
						 | 
				
			
			@ -337,21 +349,42 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
        [HttpPost]
 | 
			
		||||
        public async Task<IResponseOutput> AssignSubjectDoctor(AssginSubjectDoctorCommand assginSubjectDoctorCommand)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            var trialId = assginSubjectDoctorCommand.TrialId;
 | 
			
		||||
            var doctorUserIdList = assginSubjectDoctorCommand.DoctorUserIdArmList.Select(t => t.DoctorUserId).ToList();
 | 
			
		||||
 | 
			
		||||
            if (assginSubjectDoctorCommand.IsReAssign)
 | 
			
		||||
            if (assginSubjectDoctorCommand.IsJudgeDoctor)
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
                if (await _visitTaskRepository.AnyAsync(t => assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId) && t.DoctorUserId != null))
 | 
			
		||||
                if (assginSubjectDoctorCommand.IsReAssign)
 | 
			
		||||
                {
 | 
			
		||||
                    throw new BusinessValidationFailedException("有Subject任务已应用,不允许重新分配");
 | 
			
		||||
 | 
			
		||||
                    if (await _visitTaskRepository.AnyAsync(t => assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId) && t.DoctorUserId != null && t.ArmEnum == Arm.JudgeArm))
 | 
			
		||||
                    {
 | 
			
		||||
                        throw new BusinessValidationFailedException("有Subject任务已应用,不允许重新分配");
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    await _subjectUserRepository.BatchDeleteNoTrackingAsync(t => doctorUserIdList.Contains(t.DoctorUserId) && assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId) && t.ArmEnum == Arm.JudgeArm);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                await _subjectUserRepository.BatchDeleteNoTrackingAsync(t => doctorUserIdList.Contains(t.DoctorUserId) && assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId));
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                if (assginSubjectDoctorCommand.IsReAssign)
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
                    if (await _visitTaskRepository.AnyAsync(t => assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId) && t.DoctorUserId != null && t.ArmEnum != Arm.JudgeArm))
 | 
			
		||||
                    {
 | 
			
		||||
                        throw new BusinessValidationFailedException("有Subject任务已应用,不允许重新分配");
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                    await _subjectUserRepository.BatchDeleteNoTrackingAsync(t => doctorUserIdList.Contains(t.DoctorUserId) && assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId) && t.ArmEnum != Arm.JudgeArm);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
               
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var subjectId in assginSubjectDoctorCommand.SubjectIdList)
 | 
			
		||||
            {
 | 
			
		||||
                foreach (var doctorUserId in doctorUserIdList)
 | 
			
		||||
| 
						 | 
				
			
			@ -359,12 +392,26 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
 | 
			
		||||
                    var armEnum = assginSubjectDoctorCommand.DoctorUserIdArmList.Where(t => t.DoctorUserId == doctorUserId).First().ArmEnum;
 | 
			
		||||
 | 
			
		||||
                    await _subjectUserRepository.AddAsync(new SubjectUser() { TrialId = assginSubjectDoctorCommand.TrialId, SubjectId = subjectId, DoctorUserId = doctorUserId, ArmEnum = armEnum, AssignTime = DateTime.Now });
 | 
			
		||||
 | 
			
		||||
                    if (await _subjectUserRepository.AnyAsync(t => t.TrialId == trialId && t.SubjectId == subjectId && t.DoctorUserId == doctorUserId && t.ArmEnum == armEnum))
 | 
			
		||||
                    {
 | 
			
		||||
                        throw new BusinessValidationFailedException("有Subject 已有该Arm组的医生,不允许继续分配,请刷新页面,确认页面数据是否过期");
 | 
			
		||||
                    }
 | 
			
		||||
                    if (await _subjectUserRepository.AnyAsync(t => t.TrialId == trialId && t.SubjectId == subjectId && t.DoctorUserId == doctorUserId && t.ArmEnum != armEnum))
 | 
			
		||||
                    {
 | 
			
		||||
                        throw new BusinessValidationFailedException("有Subject 在其他Arm组已有该医生,不允许在新的组添加该医生");
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        await _subjectUserRepository.AddAsync(new SubjectUser() { TrialId = trialId, SubjectId = subjectId, DoctorUserId = doctorUserId, ArmEnum = armEnum, AssignTime = DateTime.Now });
 | 
			
		||||
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
                //await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectId, u => new Subject() { IsAssignDoctorUser = true });
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            await _subjectUserRepository.SaveChangesAsync();
 | 
			
		||||
 | 
			
		||||
            return ResponseOutput.Ok();
 | 
			
		||||
| 
						 | 
				
			
			@ -377,17 +424,30 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
        [HttpPost]
 | 
			
		||||
        public async Task<IResponseOutput> CancelSubjectAssignDoctor(CancelSubjectAssignCommand cancelSubjectAssignCommand)
 | 
			
		||||
        {
 | 
			
		||||
            foreach (var subjectId in cancelSubjectAssignCommand.SubjectIdList)
 | 
			
		||||
            if (cancelSubjectAssignCommand.IsJudgeDoctor)
 | 
			
		||||
            {
 | 
			
		||||
                if (await _visitTaskRepository.AnyAsync(t => t.SubjectId == subjectId && t.DoctorUserId != null))
 | 
			
		||||
                foreach (var subjectId in cancelSubjectAssignCommand.SubjectIdList)
 | 
			
		||||
                {
 | 
			
		||||
                    throw new BusinessValidationFailedException("有Subject任务已应用,不允许取消分配");
 | 
			
		||||
                    if (await _visitTaskRepository.AnyAsync(t => t.SubjectId == subjectId && t.DoctorUserId != null && t.ArmEnum == Arm.JudgeArm))
 | 
			
		||||
                    {
 | 
			
		||||
                        throw new BusinessValidationFailedException("有Subject任务已应用,不允许取消分配");
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    await _subjectUserRepository.DeleteFromQueryAsync(t => t.SubjectId == subjectId && t.ArmEnum == Arm.JudgeArm);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                await _subjectUserRepository.DeleteFromQueryAsync(t => t.SubjectId == subjectId);
 | 
			
		||||
                //await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectId, u => new Subject() { IsAssignDoctorUser = false });
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                foreach (var subjectId in cancelSubjectAssignCommand.SubjectIdList)
 | 
			
		||||
                {
 | 
			
		||||
                    if (await _visitTaskRepository.AnyAsync(t => t.SubjectId == subjectId && t.DoctorUserId != null && t.ArmEnum != Arm.JudgeArm))
 | 
			
		||||
                    {
 | 
			
		||||
                        throw new BusinessValidationFailedException("有Subject任务已应用,不允许取消分配");
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    await _subjectUserRepository.DeleteFromQueryAsync(t => t.SubjectId == subjectId && t.ArmEnum != Arm.JudgeArm);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            await _subjectUserRepository.SaveChangesAsync();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -414,7 +474,8 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
            var subjectIdList = assignConfirmCommand.SubjectDoctorUserList.Select(t => t.SubjectId).ToList();
 | 
			
		||||
 | 
			
		||||
            var taskList = _visitTaskRepository.Where(t => t.TrialId == assignConfirmCommand.TrialId && t.DoctorUserId == null, true)
 | 
			
		||||
                    .WhereIf(subjectIdList.Count() > 0, t => subjectIdList.Contains(t.SubjectId) && t.Subject.SubjectDoctorList.Any())
 | 
			
		||||
                    .WhereIf(subjectIdList.Count() > 0 && assignConfirmCommand.IsJudgeDoctor==false, t => subjectIdList.Contains(t.SubjectId) && t.Subject.SubjectDoctorList.Where(t => t.ArmEnum != Arm.JudgeArm).Any())
 | 
			
		||||
                    .WhereIf(subjectIdList.Count() > 0 && assignConfirmCommand.IsJudgeDoctor, t => subjectIdList.Contains(t.SubjectId) && t.Subject.SubjectDoctorList.Where(t => t.ArmEnum == Arm.JudgeArm).Any())
 | 
			
		||||
                   .ToList();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -496,243 +557,6 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
            var trialConfig = (await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.ReadingType, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.TaskAllocateObjEnum }).FirstOrDefaultAsync()).IfNullThrowException();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            #region 按照医生维度分配Subject
 | 
			
		||||
 | 
			
		||||
            ////受试者总数
 | 
			
		||||
            //var subjectCount = subjectList.Count();
 | 
			
		||||
 | 
			
		||||
            ////获取待分配的医生列表  指导分配医生的数量
 | 
			
		||||
            //var waitAllocationDoctorList = _taskAllocationRuleRepository.Where(t => t.TrialId == trialId && t.IsEnable)
 | 
			
		||||
            //    .Select(t => new { t.DoctorUserId, t.PlanReadingRatio, Weight = (subjectCount * t.PlanReadingRatio) % 100 })
 | 
			
		||||
            //    .OrderByDescending(t => t.PlanReadingRatio).ThenByDescending(t => t.Weight).ToList();
 | 
			
		||||
 | 
			
		||||
            ////给医生分配Subject 前验证  已经分配的数据是否符合分配的规范 
 | 
			
		||||
            //foreach (var subject in subjectList)
 | 
			
		||||
            //{
 | 
			
		||||
            //    var doctorCount = subject.DoctorUserList.Count();
 | 
			
		||||
            //    //分配两个医生
 | 
			
		||||
            //    if (trialConfig.ReadingType == ReadingMethod.Double)
 | 
			
		||||
            //    {
 | 
			
		||||
 | 
			
		||||
            //        if (doctorCount > 2)
 | 
			
		||||
            //        {
 | 
			
		||||
            //            throw new BusinessValidationFailedException("双重阅片当前有Subject绑定医生数量大于2");
 | 
			
		||||
            //        }
 | 
			
		||||
 | 
			
		||||
            //    }
 | 
			
		||||
            //    else if (trialConfig.ReadingType == ReadingMethod.Single)
 | 
			
		||||
            //    {
 | 
			
		||||
            //        if (doctorCount > 1)
 | 
			
		||||
            //        {
 | 
			
		||||
            //            throw new BusinessValidationFailedException("单重阅片当前有Subject绑定医生数量大于1");
 | 
			
		||||
            //        }
 | 
			
		||||
            //    }
 | 
			
		||||
            //}
 | 
			
		||||
 | 
			
		||||
            ////存放分配后Subject 医生的情况
 | 
			
		||||
            //var assignedSubjectDoctorList = subjectList.Clone().SelectMany(t => t.DoctorUserList.Select(c => new { t.SubjectId, DoctorUserId = c.DoctorUserId, c.ArmEnum })).ToList();
 | 
			
		||||
 | 
			
		||||
            //if (trialConfig.ReadingType == ReadingMethod.Single)
 | 
			
		||||
            //{
 | 
			
		||||
            //    //eg : 10个Sujbect  都是1/4     先分配整数  再分配  10%4=2个
 | 
			
		||||
 | 
			
		||||
            //    //特殊: 不够分的subject数量    适用于 2个Subject  4个医生 这种
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //    var integerPlan = 0;
 | 
			
		||||
 | 
			
		||||
            //    waitAllocationDoctorList.ForEach(doctor =>
 | 
			
		||||
            //    {
 | 
			
		||||
 | 
			
		||||
            //        integerPlan += (int)Math.Floor((double)(subjectCount * doctor.PlanReadingRatio) / 100);
 | 
			
		||||
 | 
			
		||||
            //    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //    var specialSubjectCount = subjectCount - integerPlan;
 | 
			
		||||
 | 
			
		||||
            //    //按照医生维度 分配Subject  
 | 
			
		||||
            //    foreach (var doctor in waitAllocationDoctorList)
 | 
			
		||||
            //    {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //        //该医生的目前已分配到的受试者
 | 
			
		||||
            //        var hasAssignedSubjectIdList = assignedSubjectDoctorList.Where(t => t.DoctorUserId == doctor.DoctorUserId).Select(t => t.SubjectId).Distinct().ToList();
 | 
			
		||||
 | 
			
		||||
            //        //已分配的Subject 数量
 | 
			
		||||
            //        var hasAssignedSubjectCount = hasAssignedSubjectIdList.Count();
 | 
			
		||||
 | 
			
		||||
            //        //该医生计划分配到的Subject  最接近的整数数量
 | 
			
		||||
            //        var planSubjectCount = (int)Math.Ceiling((double)(subjectCount * doctor.PlanReadingRatio) / 100);
 | 
			
		||||
 | 
			
		||||
            //        //权重大的,将特殊的分配
 | 
			
		||||
            //        if (doctor.Weight != 50)
 | 
			
		||||
            //        {
 | 
			
		||||
            //            if (specialSubjectCount > 0)
 | 
			
		||||
            //            {
 | 
			
		||||
            //                specialSubjectCount--;
 | 
			
		||||
 | 
			
		||||
            //                planSubjectCount++;
 | 
			
		||||
            //            }
 | 
			
		||||
 | 
			
		||||
            //        }
 | 
			
		||||
 | 
			
		||||
            //        //如果计划的数量 大于已经分配的数量 那么该医生 可以分配新的Subject
 | 
			
		||||
            //        if (planSubjectCount > hasAssignedSubjectCount)
 | 
			
		||||
            //        {
 | 
			
		||||
 | 
			
		||||
            //            //从未分配的Subjct找到可以分配的分配给该医生
 | 
			
		||||
 | 
			
		||||
            //            var allAssignedSubjectIdList = assignedSubjectDoctorList.Select(t => t.SubjectId).Distinct().ToList();
 | 
			
		||||
 | 
			
		||||
            //            //取需要分配的数量  并且没有分配给其他医生的包括自己
 | 
			
		||||
            //            var assignSubjectIdList = subjectList.Where(t => !allAssignedSubjectIdList.Contains(t.SubjectId)).Select(t => t.SubjectId).Take(planSubjectCount - hasAssignedSubjectCount).ToList();
 | 
			
		||||
 | 
			
		||||
            //            foreach (var assignSubjectId in assignSubjectIdList)
 | 
			
		||||
            //            {
 | 
			
		||||
            //                //将分配结果记录
 | 
			
		||||
            //                assignedSubjectDoctorList.Add(new { SubjectId = assignSubjectId, DoctorUserId = doctor.DoctorUserId, ArmEnum = 0 });
 | 
			
		||||
 | 
			
		||||
            //                await _subjectUserRepository.AddAsync(new SubjectUser() { TrialId = trialId, SubjectId = assignSubjectId, DoctorUserId = doctor.DoctorUserId, AssignTime = DateTime.Now });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //            }
 | 
			
		||||
            //        }
 | 
			
		||||
            //        else
 | 
			
		||||
            //        {
 | 
			
		||||
            //            throw new BusinessValidationFailedException("当前有医生已分配的Subject 数量,超过了计划分配Subject数量,不支持自动分配");
 | 
			
		||||
            //        }
 | 
			
		||||
 | 
			
		||||
            //    }
 | 
			
		||||
 | 
			
		||||
            //}
 | 
			
		||||
            //if (trialConfig.ReadingType == ReadingMethod.Double)
 | 
			
		||||
            //{
 | 
			
		||||
            //    var integerPlan = 0;
 | 
			
		||||
 | 
			
		||||
            //    waitAllocationDoctorList.ForEach(doctor =>
 | 
			
		||||
            //    {
 | 
			
		||||
 | 
			
		||||
            //        integerPlan += (int)Math.Floor((double)(subjectCount * doctor.PlanReadingRatio * 2) / 100);
 | 
			
		||||
 | 
			
		||||
            //    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //    var specialSubjectCount = (subjectCount * 2) - integerPlan;
 | 
			
		||||
 | 
			
		||||
            //    //按照医生维度 分配Subject  
 | 
			
		||||
            //    foreach (var doctor in waitAllocationDoctorList)
 | 
			
		||||
            //    {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //        //该医生的目前已分配到的受试者
 | 
			
		||||
            //        var hasAssignedSubjectIdList = assignedSubjectDoctorList.Where(t => t.DoctorUserId == doctor.DoctorUserId).Select(t => t.SubjectId).ToList();
 | 
			
		||||
 | 
			
		||||
            //        //已分配的Subject 数量
 | 
			
		||||
            //        var hasAssignedSubjectCount = hasAssignedSubjectIdList.Count();
 | 
			
		||||
 | 
			
		||||
            //        //该医生计划分配到的Subject  最接近的整数数量
 | 
			
		||||
            //        var planSubjectCount = (int)Math.Floor((double)(subjectCount * doctor.PlanReadingRatio * 2) / 100);
 | 
			
		||||
 | 
			
		||||
            //        //判断是否能整除
 | 
			
		||||
 | 
			
		||||
            //        var yuShu = (subjectCount * doctor.PlanReadingRatio * 2) % 100;
 | 
			
		||||
 | 
			
		||||
            //        if (yuShu != 0)
 | 
			
		||||
            //        {
 | 
			
		||||
            //            if (specialSubjectCount > 0)
 | 
			
		||||
            //            {
 | 
			
		||||
            //                specialSubjectCount--;
 | 
			
		||||
            //                planSubjectCount++;
 | 
			
		||||
 | 
			
		||||
            //            }
 | 
			
		||||
            //        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //        //如果计划的数量 大于已经分配的数量 那么该医生 可以分配新的Subject
 | 
			
		||||
            //        if (planSubjectCount > hasAssignedSubjectCount)
 | 
			
		||||
            //        {
 | 
			
		||||
 | 
			
		||||
            //            //分配给其他医生  已经满了的
 | 
			
		||||
            //            var otherExceptDoctorIdList = assignedSubjectDoctorList.Where(t => t.DoctorUserId != doctor.DoctorUserId).GroupBy(t => t.SubjectId)
 | 
			
		||||
            //                .Select(g => new { SubjectId = g.Key, DoctorCount = g.Count() }).Where(c => c.DoctorCount == 2).Select(t => t.SubjectId).ToList();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //            //取需要分配的数量  并且没有分配给其他医生的包括自己
 | 
			
		||||
            //            var assignSubjectIdList = subjectList.Where(t => !hasAssignedSubjectIdList.Contains(t.SubjectId) && !otherExceptDoctorIdList.Contains(t.SubjectId))
 | 
			
		||||
            //                .Select(t => t.SubjectId).Take((planSubjectCount - hasAssignedSubjectCount)).ToList();
 | 
			
		||||
 | 
			
		||||
            //            foreach (var assignSubjectId in assignSubjectIdList)
 | 
			
		||||
            //            {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //                var otherHaveAssignedSubject = assignedSubjectDoctorList.Where(t => t.SubjectId == assignSubjectId).FirstOrDefault();
 | 
			
		||||
 | 
			
		||||
            //                if (otherHaveAssignedSubject != null)
 | 
			
		||||
            //                {
 | 
			
		||||
 | 
			
		||||
            //                    if (otherHaveAssignedSubject.ArmEnum == 1)
 | 
			
		||||
            //                    {
 | 
			
		||||
            //                        assignedSubjectDoctorList.Add(new { SubjectId = assignSubjectId, DoctorUserId = doctor.DoctorUserId, ArmEnum = 2 });
 | 
			
		||||
 | 
			
		||||
            //                        await _subjectUserRepository.AddAsync(new SubjectUser() { TrialId = trialId, SubjectId = assignSubjectId, DoctorUserId = doctor.DoctorUserId, ArmEnum = 2, AssignTime = DateTime.Now });
 | 
			
		||||
 | 
			
		||||
            //                    }
 | 
			
		||||
            //                    else if (otherHaveAssignedSubject.ArmEnum == 2)
 | 
			
		||||
            //                    {
 | 
			
		||||
            //                        assignedSubjectDoctorList.Add(new { SubjectId = assignSubjectId, DoctorUserId = doctor.DoctorUserId, ArmEnum = 1 });
 | 
			
		||||
 | 
			
		||||
            //                        await _subjectUserRepository.AddAsync(new SubjectUser() { TrialId = trialId, SubjectId = assignSubjectId, DoctorUserId = doctor.DoctorUserId, ArmEnum = 1, AssignTime = DateTime.Now });
 | 
			
		||||
 | 
			
		||||
            //                    }
 | 
			
		||||
            //                }
 | 
			
		||||
            //                else
 | 
			
		||||
            //                {
 | 
			
		||||
            //                    assignedSubjectDoctorList.Add(new { SubjectId = assignSubjectId, DoctorUserId = doctor.DoctorUserId, ArmEnum = 1 });
 | 
			
		||||
 | 
			
		||||
            //                    await _subjectUserRepository.AddAsync(new SubjectUser() { TrialId = trialId, SubjectId = assignSubjectId, DoctorUserId = doctor.DoctorUserId, ArmEnum = 1, AssignTime = DateTime.Now });
 | 
			
		||||
 | 
			
		||||
            //                }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //            }
 | 
			
		||||
            //        }
 | 
			
		||||
            //        else
 | 
			
		||||
            //        {
 | 
			
		||||
            //            throw new BusinessValidationFailedException("当前有医生已分配的Subject 数量,超过了计划分配Subject数量,不支持自动分配");
 | 
			
		||||
            //        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //    //如果是2个Subject 3个医生 这种 都是百分之33的比率
 | 
			
		||||
            //    //     10         3 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            //}
 | 
			
		||||
 | 
			
		||||
            ////验证是否所有Subject  是否分配好
 | 
			
		||||
 | 
			
		||||
            //if (assignedSubjectDoctorList.Select(t => t.SubjectId).Distinct().Count() != subjectCount)
 | 
			
		||||
            //{
 | 
			
		||||
            //    throw new BusinessValidationFailedException("分配算法有问题,有Subject 未分配");
 | 
			
		||||
            //}
 | 
			
		||||
 | 
			
		||||
            #endregion
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            #region 完全按照Subject 遍历去分
 | 
			
		||||
 | 
			
		||||
            var subjectCount = subjectList.Count;
 | 
			
		||||
| 
						 | 
				
			
			@ -895,10 +719,30 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
 | 
			
		||||
            if (assignSubjectTaskToDoctorCommand.TaskOptType == TaskOptType.Assign || assignSubjectTaskToDoctorCommand.TaskOptType == TaskOptType.ReAssign)
 | 
			
		||||
            {
 | 
			
		||||
                //手动分配验证规则
 | 
			
		||||
 | 
			
		||||
                if (visitTask.SourceSubjectVisitId != null)
 | 
			
		||||
                {
 | 
			
		||||
                   
 | 
			
		||||
                }
 | 
			
		||||
                else if(visitTask.SouceReadModuleId != null)
 | 
			
		||||
                {
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    throw new BusinessValidationFailedException("出现脏数据  任务来源字段没有值");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              
 | 
			
		||||
 | 
			
		||||
                visitTask.AllocateTime = DateTime.Now;
 | 
			
		||||
                visitTask.DoctorUserId = assignSubjectTaskToDoctorCommand.DoctorUserId;
 | 
			
		||||
                visitTask.TaskState = TaskState.Allocated;
 | 
			
		||||
 | 
			
		||||
                await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTask.SourceSubjectVisitId, u => new SubjectVisit() { ReadingStatus = ReadingStatusEnum.ImageReading });
 | 
			
		||||
 | 
			
		||||
                await _readModuleRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTask.SouceReadModuleId, u => new ReadModule() { ReadingStatus = ReadingStatusEnum.ImageReading });
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            else if (assignSubjectTaskToDoctorCommand.TaskOptType == TaskOptType.ReAssign)
 | 
			
		||||
| 
						 | 
				
			
			@ -923,6 +767,10 @@ namespace IRaCIS.Core.Application.Service
 | 
			
		|||
                visitTask.AllocateTime = null;
 | 
			
		||||
                visitTask.DoctorUserId = null;
 | 
			
		||||
                visitTask.TaskState = TaskState.NotAllocate;
 | 
			
		||||
 | 
			
		||||
                await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTask.SourceSubjectVisitId, u => new SubjectVisit() { ReadingStatus = ReadingStatusEnum.TaskAllocate });
 | 
			
		||||
 | 
			
		||||
                await _readModuleRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTask.SouceReadModuleId, u => new ReadModule() { ReadingStatus = ReadingStatusEnum.TaskAllocate });
 | 
			
		||||
            }
 | 
			
		||||
            await _visitTaskRepository.SaveChangesAsync();
 | 
			
		||||
            return ResponseOutput.Ok();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue