删除按照医生维度分配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; }
|
||||
|
|
|
@ -313,14 +313,26 @@ namespace IRaCIS.Core.Application.Service
|
|||
public async Task<PageOutput<SubjectAssignView>> GetSubjectAssignList(SubjectAssignQuery querySubjectAssign)
|
||||
{
|
||||
var subjectQuery = _subjectRepository.Where(t => t.TrialId == querySubjectAssign.TrialId)
|
||||
.Where(t => t.SubjectVisitTaskList.Any())
|
||||
.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.IsJudgeDoctor)
|
||||
{
|
||||
if (assginSubjectDoctorCommand.IsReAssign)
|
||||
{
|
||||
|
||||
if (await _visitTaskRepository.AnyAsync(t => assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId) && t.DoctorUserId != null))
|
||||
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));
|
||||
await _subjectUserRepository.BatchDeleteNoTrackingAsync(t => doctorUserIdList.Contains(t.DoctorUserId) && assginSubjectDoctorCommand.SubjectIdList.Contains(t.SubjectId) && t.ArmEnum == Arm.JudgeArm);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
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组的医生,不允许继续分配,请刷新页面,确认页面数据是否过期");
|
||||
}
|
||||
//await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectId, u => new Subject() { IsAssignDoctorUser = true });
|
||||
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 _subjectUserRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
|
@ -376,18 +423,31 @@ namespace IRaCIS.Core.Application.Service
|
|||
/// <returns></returns> 数量
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> CancelSubjectAssignDoctor(CancelSubjectAssignCommand cancelSubjectAssignCommand)
|
||||
{
|
||||
if (cancelSubjectAssignCommand.IsJudgeDoctor)
|
||||
{
|
||||
foreach (var subjectId in cancelSubjectAssignCommand.SubjectIdList)
|
||||
{
|
||||
if (await _visitTaskRepository.AnyAsync(t => t.SubjectId == subjectId && t.DoctorUserId != null))
|
||||
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);
|
||||
//await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectId, u => new Subject() { IsAssignDoctorUser = false });
|
||||
await _subjectUserRepository.DeleteFromQueryAsync(t => t.SubjectId == subjectId && t.ArmEnum == Arm.JudgeArm);
|
||||
}
|
||||
}
|
||||
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