组间一致性

Uat_Study
hang 2022-07-13 09:50:32 +08:00
parent 67150ba985
commit 2d6d344be7
7 changed files with 341 additions and 150 deletions

View File

@ -79,6 +79,20 @@
<param name="inCommand"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.TaskConsistentRuleService.GetGroupConsistentRuleSubjectList(IRaCIS.Core.Application.ViewModel.GroupConsistentQuery)">
<summary>
组间一致性分析 选择Subejct 列表
</summary>
<param name="inQuery"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.TaskConsistentRuleService.ConfirmGenerateGroupConsistentTask(IRaCIS.Core.Application.ViewModel.GroupConsistentConfirmGenrateCommand,IRaCIS.Core.Application.Service.IVisitTaskHelpeService)">
<summary>
确认生成组间一致性分析任务
</summary>
<param name="inCommand"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.TaskConsistentRuleService.GetIQueryableDoctorSelfConsistentSubjectView(IRaCIS.Core.Domain.Models.TaskConsistentRule,System.Guid,System.Collections.Generic.List{System.Guid})">
<summary>
仅仅组内一致性时使用(

View File

@ -152,8 +152,14 @@ namespace IRaCIS.Core.Application.ViewModel
//public ReReadingApplyGenerateTaskCommand ReReadingApplyGenerateTaskCommand { get; set; } = new ReReadingApplyGenerateTaskCommand();
//自身一致性
public List<VisitTaskSimpleDTO> GenerataConsistentTaskList { get; set; }
//组间一致性
public List<VisitTaskGroupSimpleDTO> GenerataGroupConsistentTaskList { get; set; }
}

View File

@ -65,7 +65,17 @@ namespace IRaCIS.Core.Application.ViewModel
public List<Guid> SubejctIdList { get; set; }
}
public class DoctorSelfConsistentSubjectView
public class DoctorSelfConsistentSubjectView: ConsistentCommonView
{
public string? BlindSubjectCode { get; set; }
public List<VisitTaskSimpleDTO> VisitTaskList { get; set; }
}
public class ConsistentCommonView
{
public Guid TrialId { get; set; }
public Guid SiteId { get; set; }
@ -73,27 +83,28 @@ namespace IRaCIS.Core.Application.ViewModel
public String TrialSiteCode { get; set; }
public string SubjectCode { get; set; }
public string? BlindSubjectCode { get; set; }
public Guid SubjectId { get; set; }
public bool IsHaveGeneratedTask { get; set; }
public int? ValidVisitCount { get; set; }
public List<VisitTaskSimpleDTO> VisitTaskList { get; set; }
}
public class VisitTaskSimpleDTO
public class DoctorGroupConsistentSubjectView: ConsistentCommonView
{
public List<VisitTaskGroupSimpleDTO> TaskList => VisitTaskList.GroupBy(t => new { t.SubjectId, t.VisitTaskNum }).Where(g => g.Count() == 2).SelectMany(g => g.ToList()).OrderBy(t=>t.VisitTaskNum).ToList();
public List<VisitTaskGroupSimpleDTO> VisitTaskList { get; set; } = new List<VisitTaskGroupSimpleDTO>();
}
public class VisitTaskGroupSimpleDTO
{
public Guid Id { get; set; }
public Guid TrialId { get; set; }
public Guid SubjectId { get; set; }
public Arm ArmEnum { get; set; }
public string TaskCode { get; set; }
public string TaskName { get; set; }
public string TaskBlindName { get; set; }
@ -107,7 +118,22 @@ namespace IRaCIS.Core.Application.ViewModel
public TaskState TaskState { get; set; }
public Guid? DoctorUserId { get; set; }
public Arm ArmEnum { get; set; }
[JsonIgnore]
public VisitTask GroupFirstVisitTask { get; set; }
}
public class VisitTaskSimpleDTO :VisitTaskGroupSimpleDTO
{
public Guid? Id { get; set; }
public string TaskCode { get; set; }
//可以不查询
public List<VisitTaskSimpleDTO> GlobalVisitTaskList { get; set; }
@ -118,9 +144,9 @@ namespace IRaCIS.Core.Application.ViewModel
public string BlindSubjectCode { get; set; } = string.Empty;
public string BlindTrialSiteCode { get; set; } = string.Empty;
public Guid? DoctorUserId { get; set; }
public Guid? TaskConsistentRuleId { get; set; }
//public Guid? TaskConsistentRuleId { get; set; }
}

View File

@ -13,6 +13,7 @@ using IRaCIS.Core.Domain.Share;
using System.Linq.Expressions;
using IRaCIS.Core.Infra.EFCore.Common;
using System.Linq;
using Nito.AsyncEx;
namespace IRaCIS.Core.Application.Service
{
@ -29,6 +30,8 @@ namespace IRaCIS.Core.Application.Service
private readonly IRepository<Subject> _subjectRepository;
private readonly IRepository<Enroll> _enrollRepository;
private readonly AsyncLock _mutex = new AsyncLock();
public TaskConsistentRuleService(IRepository<VisitTask> visitTaskRepository, IRepository<Enroll> enrollRepository, IRepository<TaskConsistentRule> taskConsistentRuleRepository, IRepository<SubjectUser> subjectUserRepository, IRepository<Subject> subjectRepository)
{
_taskConsistentRuleRepository = taskConsistentRuleRepository;
@ -88,14 +91,13 @@ namespace IRaCIS.Core.Application.Service
/// <summary>
/// 确认生成自身一致性分析任务
/// </summary>
/// <param name="inCommand"></param>
/// <returns></returns>
[HttpPost]
[UnitOfWork]
public async Task<IResponseOutput> ConfirmGenerateSelfConsistentTask(ConsistentConfirmGenerateCommand inCommand, [FromServices] IVisitTaskHelpeService _visitTaskCommonService)
{
var filterObj = await _taskConsistentRuleRepository.FirstOrDefaultAsync(t => t.Id == inCommand.TaskConsistentRuleId);
@ -107,54 +109,243 @@ namespace IRaCIS.Core.Application.Service
//var list = query.OrderByDescending(t => t.IsHaveGeneratedTask).ToList();
foreach (var subject in list)
using (await _mutex.LockAsync())
{
//处理 Subject 编号
var blindSubjectCode = string.Empty;
var subjectTask = _visitTaskRepository.Where(t => t.SubjectId == subject.SubjectId).OrderByDescending(t => t.BlindSubjectCode).FirstOrDefault().IfNullThrowException();
if (subjectTask.BlindSubjectCode != String.Empty)
foreach (var subject in list)
{
blindSubjectCode = subjectTask.BlindSubjectCode;
//处理 Subject 编号
var blindSubjectCode = string.Empty;
var subjectTask = _visitTaskRepository.Where(t => t.SubjectId == subject.SubjectId).OrderByDescending(t => t.BlindSubjectCode).FirstOrDefault().IfNullThrowException();
if (subjectTask.BlindSubjectCode != String.Empty)
{
blindSubjectCode = subjectTask.BlindSubjectCode;
}
else
{
var maxCodeStr = _visitTaskRepository.Where(t => t.TrialId == subject.TrialId).OrderByDescending(t => t.BlindSubjectCode).Select(t => t.BlindSubjectCode).FirstOrDefault();
int maxCodeInt = 0;
int.TryParse(maxCodeStr, out maxCodeInt);
blindSubjectCode = (maxCodeInt + 1).ToString($"D{filterObj.BlindSubjectNumberOfPlaces}");
}
subject.VisitTaskList = subject.VisitTaskList.Take(filterObj.PlanVisitCount).ToList();
subject.VisitTaskList.ForEach(t =>
{
t.DoctorUserId = doctorUserId;
//t.TaskConsistentRuleId = filterObj.Id;
t.BlindTrialSiteCode = filterObj.BlindTrialSiteCode;
t.BlindSubjectCode = blindSubjectCode;
});
//最后一个访视添加全局
var globalTask = (subject.VisitTaskList.Last()).Clone();
globalTask.ReadingCategory = ReadingCategory.Global;
globalTask.VisitTaskNum += ReadingCommon.TaskNumDic[ReadingCategory.Global];
subject.VisitTaskList.Add(globalTask);
await _visitTaskCommonService.AddTaskAsync(new GenerateTaskCommand()
{
TrialId = filterObj.TrialId,
ReadingCategory = GenerateTaskCategory.SelfConsistent,
//产生的过滤掉已经生成的
GenerataConsistentTaskList = subject.VisitTaskList.Where(t => t.IsHaveGeneratedTask == false).ToList()
});
}
else
}
return ResponseOutput.Ok();
}
private async Task<IQueryable<DoctorGroupConsistentSubjectView>> GetGroupConsistentQueryAsync(TaskConsistentRule filterObj, List<Guid>? subejctIdList = null)
{
var trialId = filterObj.TrialId;
var trialConfig = (await _repository.Where<Trial>(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.ReadingType, t.IsReadingTaskViewInOrder }).FirstOrDefaultAsync()).IfNullThrowException();
Expression<Func<VisitTask, bool>> comonTaskFilter = u => u.TrialId == trialId && u.IsAnalysisCreate == false && u.TaskState == TaskState.Effect && u.ReadingTaskState == ReadingTaskState.HaveSigned
&& (u.ReReadingApplyState == ReReadingApplyState.Default || u.ReReadingApplyState == ReReadingApplyState.Reject);
Expression<Func<VisitTask, bool>> visitTaskFilter = comonTaskFilter.And(t => t.ReadingCategory == ReadingCategory.Visit);
if (subejctIdList != null && subejctIdList?.Count > 0)
{
visitTaskFilter = visitTaskFilter.And(t => subejctIdList.Contains(t.SubjectId));
}
//所选访视数量 的访视 其中必有一个访视后有全局任务
if (filterObj.IsHaveReadingPeriod == true)
{
visitTaskFilter = visitTaskFilter.And(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(comonTaskFilter).Any(u => u.VisitTaskNum == t.VisitTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Global] && u.ReadingCategory == ReadingCategory.Global));
}
IQueryable<Subject> subjectQuery = default;
//单重阅片没有组件一致性
subjectQuery = _subjectRepository.Where(t => t.TrialId == trialId && t.SubjectVisitTaskList.AsQueryable().Where(visitTaskFilter).Select(t=>t.DoctorUserId).Distinct().Count()==2
&& t.SubjectVisitTaskList.AsQueryable().Where(visitTaskFilter).GroupBy(t => new { t.SubjectId, t.VisitTaskNum }).Where(g => g.Count() == 2).Count() >= filterObj.PlanVisitCount);
var query = subjectQuery.Select(t => new DoctorGroupConsistentSubjectView()
{
TrialId = t.TrialId,
SiteId = t.SiteId,
SubjectCode = t.Code,
TrialSiteCode = t.TrialSite.TrialSiteCode,
SubjectId = t.Id,
IsHaveGeneratedTask = t.SubjectVisitTaskList.Any(c => c.IsSelfAnalysis == false),
ValidVisitCount = t.SubjectVisitTaskList.AsQueryable().Where(visitTaskFilter).GroupBy(t => new { t.SubjectId, t.VisitTaskNum }).Where(g => g.Count() == 2).Count(),
VisitTaskList = t.SubjectVisitTaskList.AsQueryable().Where(visitTaskFilter)
.Select(c => new VisitTaskGroupSimpleDTO()
{
var maxCodeStr = _visitTaskRepository.Where(t => t.TrialId == subject.TrialId).OrderByDescending(t => t.BlindSubjectCode).Select(t => t.BlindSubjectCode).FirstOrDefault();
ReadingCategory = c.ReadingCategory,
ReadingTaskState = c.ReadingTaskState,
TaskBlindName = c.TaskBlindName,
TaskName = c.TaskName,
TaskState = c.TaskState,
SubjectId = c.SubjectId,
VisitTaskNum = c.VisitTaskNum,
TrialId = c.TrialId,
DoctorUserId = c.DoctorUserId
}).ToList()
int maxCodeInt = 0;
int.TryParse(maxCodeStr,out maxCodeInt);
//
});
blindSubjectCode = (maxCodeInt + 1).ToString($"D{filterObj.BlindSubjectNumberOfPlaces}");
query = query.OrderByDescending(t => t.IsHaveGeneratedTask);
return query;
}
/// <summary>
/// 组间一致性分析 选择Subejct 列表
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageOutput<DoctorGroupConsistentSubjectView>> GetGroupConsistentRuleSubjectList(GroupConsistentQuery inQuery)
{
var trialId = inQuery.TrialId;
var filterObj = await _taskConsistentRuleRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.IsSelfAnalysis == false);
if (filterObj == null)
{
throw new BusinessValidationFailedException("请先配置后,再进行数据查询");
}
var query = await GetGroupConsistentQueryAsync(filterObj);
var pagedList = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(DoctorSelfConsistentSubjectView.SubjectCode) : inQuery.SortField, inQuery.Asc);
return pagedList;
}
/// <summary>
/// 确认生成组间一致性分析任务
/// </summary>
/// <param name="inCommand"></param>
/// <returns></returns>
[HttpPost]
[UnitOfWork]
public async Task<IResponseOutput> ConfirmGenerateGroupConsistentTask(GroupConsistentConfirmGenrateCommand inCommand, [FromServices] IVisitTaskHelpeService _visitTaskCommonService)
{
var trialId = inCommand.TrialId;
var filterObj = await _taskConsistentRuleRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.IsSelfAnalysis == false);
var query = await GetGroupConsistentQueryAsync(filterObj, inCommand.SubejctIdList);
var subjectList = query.ToList();
var doctorUserIdQuery = from enroll in _repository.Where<Enroll>(t => t.TrialId == trialId).Where(t => t.EnrollReadingCategoryList.Any(c => c.ReadingCategory == ReadingCategory.Global || c.ReadingCategory == ReadingCategory.Visit))
join user in _repository.Where<User>() on enroll.DoctorId equals user.DoctorId
select user.Id;
var configDoctorUserIdList = await doctorUserIdQuery.ToListAsync();
foreach (var subject in subjectList.Where(t => t.IsHaveGeneratedTask == false))
{
var subjectAddTaskList = new List<VisitTaskGroupSimpleDTO>();
//需要处理的医生
var needAddDoctorUserIdList = configDoctorUserIdList.Except(subject.VisitTaskList.Select(t => (Guid)t.DoctorUserId)).ToList();
foreach (var needAddDoctorUserId in needAddDoctorUserIdList)
{
//每个医生 都生成处理的任务
foreach (var task in subject.TaskList.Take(filterObj.PlanVisitCount))
{
subjectAddTaskList.Add( new VisitTaskGroupSimpleDTO()
{
ReadingCategory = task.ReadingCategory,
ReadingTaskState = task.ReadingTaskState,
TaskBlindName = task.TaskBlindName,
TaskName = task.TaskName,
TaskState = task.TaskState,
SubjectId = task.SubjectId,
VisitTaskNum = task.VisitTaskNum,
TrialId = task.TrialId,
DoctorUserId = needAddDoctorUserId,
ArmEnum=Arm.GroupConsistentArm
});
}
//最后一个访视添加全局
var globalTask = (subject.TaskList.Last()).Clone();
globalTask.ReadingCategory = ReadingCategory.Global;
globalTask.VisitTaskNum += ReadingCommon.TaskNumDic[ReadingCategory.Global];
subjectAddTaskList.Add(globalTask);
}
subject.VisitTaskList= subject.VisitTaskList.Take(filterObj.PlanVisitCount).ToList();
subject.VisitTaskList.ForEach(t =>
{
t.DoctorUserId = doctorUserId;
t.TaskConsistentRuleId = filterObj.Id;
t.BlindTrialSiteCode = filterObj.BlindTrialSiteCode;
t.BlindSubjectCode = blindSubjectCode;
});
//最后一个访视添加全局
var globalTask = (subject.VisitTaskList.Last()).Clone();
globalTask.ReadingCategory = ReadingCategory.Global;
globalTask.VisitTaskNum += ReadingCommon.TaskNumDic[ReadingCategory.Global];
subject.VisitTaskList.Add(globalTask);
await _visitTaskCommonService.AddTaskAsync(new GenerateTaskCommand()
{
TrialId = filterObj.TrialId,
ReadingCategory = GenerateTaskCategory.SelfConsistent,
ReadingCategory = GenerateTaskCategory.GroupConsistent,
//产生的过滤掉已经生成的
GenerataConsistentTaskList = subject.VisitTaskList.Where(t => t.IsHaveGeneratedTask == false).ToList()
GenerataGroupConsistentTaskList = subjectAddTaskList
});
}
@ -167,81 +358,6 @@ namespace IRaCIS.Core.Application.Service
///// <summary>
///// 组间一致性分析 选择Subejct 列表
///// </summary>
///// <param name="inQuery"></param>
///// <returns></returns>
//[HttpPost]
//public async Task<PageOutput<DoctorSelfConsistentSubjectView>> GetGroupConsistentRuleSubjectList(GroupConsistentQuery inQuery)
//{
// var filterObj = await _taskConsistentRuleRepository.FirstOrDefaultAsync(t => t.TrialId == inQuery.TrialId && t.IsSelfAnalysis == false);
// var pagedList = await GetIQueryableDoctorSelfConsistentSubjectView(filterObj).ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(DoctorSelfConsistentSubjectView.SubjectCode) : inQuery.SortField, inQuery.Asc);
// return pagedList;
//}
///// <summary>
///// 确认生成组间一致性分析任务
///// </summary>
///// <param name="inCommand"></param>
///// <returns></returns>
//[HttpPost]
//public async Task<IResponseOutput> ConfirmGenerateGroupConsistentTask(GroupConsistentConfirmGenrateCommand inCommand, [FromServices] IVisitTaskHelpeService _visitTaskCommonService)
//{
// throw new BusinessValidationFailedException("正在更新开发ing,不允许操作");
// var filterObj = await _taskConsistentRuleRepository.FirstOrDefaultAsync(t => t.TrialId == inCommand.TrialId && t.IsSelfAnalysis==false);
// var list = await GetIQueryableDoctorSelfConsistentSubjectView(filterObj, null, inCommand.SubejctIdList).ToListAsync();
// foreach (var subject in list)
// {
// //subject.VisitTaskList.Take(filterObj.PlanVisitCount).ForEach(t =>
// //{
// // t.DoctorUserId = doctorUserId;
// // t.TaskConsistentRuleId = filterObj.Id;
// //});
// //最后一个访视添加全局
// //var globalTask = (subject.VisitTaskList[filterObj.PlanVisitCount - 1]).Clone();
// //globalTask.ReadingCategory = ReadingCategory.Global;
// //globalTask.VisitTaskNum += ReadingCommon.TaskNumDic[ReadingCategory.Global];
// //subject.VisitTaskList.Add(globalTask);
// await _visitTaskCommonService.AddTaskAsync(new GenerateTaskCommand()
// {
// TrialId = filterObj.TrialId,
// ReadingCategory = GenerateTaskCategory.SelfConsistent,
// //产生的过滤掉已经生成的
// GenerataConsistentTaskList = subject.VisitTaskList.Where(t => t.IsHaveGeneratedTask == false).ToList()
// });
// }
// return ResponseOutput.Ok();
//}
/// <summary>
/// 仅仅组内一致性时使用(
@ -256,38 +372,25 @@ namespace IRaCIS.Core.Application.Service
#region Subejct 维度
Expression<Func<VisitTask, bool>> visitTaskFilter = t => t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.DoctorUserId == doctorUserId &&
t.ReadingTaskState == ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect &&
t.SignTime!.Value.AddDays(filterObj.IntervalWeeks * 7) < DateTime.Now &&
(t.ReReadingApplyState == ReReadingApplyState.Default || t.ReReadingApplyState == ReReadingApplyState.Reject);
Expression<Func<VisitTask, bool>> comonTaskFilter = u => u.TrialId == trialId && u.IsAnalysisCreate == false && u.TaskState == TaskState.Effect && u.ReadingTaskState == ReadingTaskState.HaveSigned &&
u.SignTime!.Value.AddDays(filterObj.IntervalWeeks * 7) < DateTime.Now && (u.ReReadingApplyState == ReReadingApplyState.Default || u.ReReadingApplyState == ReReadingApplyState.Reject);
Expression<Func<VisitTask, bool>> subjectIsHaveGeneratedTaskFilter = c => c.IsAnalysisCreate;
Expression<Func<VisitTask, bool>> visitTaskFilter = comonTaskFilter.And(t => t.ReadingCategory == ReadingCategory.Visit && t.DoctorUserId == doctorUserId);
////组间一致性
//if (doctorUserId == null)
//{
// subjectIsHaveGeneratedTaskFilter = subjectIsHaveGeneratedTaskFilter.And(c => c.IsSelfAnalysis == false);
//}
////组内
//else
//{
// subjectIsHaveGeneratedTaskFilter = subjectIsHaveGeneratedTaskFilter.And(c => c.DoctorUserId == doctorUserId && c.IsSelfAnalysis == true);
//}
if (subejctIdList != null && subejctIdList?.Count > 0)
{
visitTaskFilter= visitTaskFilter.And(t => subejctIdList.Contains(t.SubjectId));
visitTaskFilter = visitTaskFilter.And(t => subejctIdList.Contains(t.SubjectId));
}
//所选访视数量 的访视 其中必有一个访视后有全局任务
if (filterObj.IsHaveReadingPeriod == true)
{
visitTaskFilter = visitTaskFilter.And(t => t.Subject.SubjectVisitTaskList.Any(u => u.VisitTaskNum == t.VisitTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Global]
&& t.TaskState == TaskState.Effect && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.SignTime!.Value.AddDays(filterObj.IntervalWeeks * 7) < DateTime.Now));
visitTaskFilter = visitTaskFilter.And(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(comonTaskFilter).Any(u => u.VisitTaskNum == t.VisitTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Global] && u.ReadingCategory == ReadingCategory.Global));
}
//var globalWithVisitFilter = visitTaskFilter.And(t => t.VisitTaskNum <=)
var subjectQuery = _subjectRepository.Where(t => t.TrialId == trialId && t.SubjectVisitTaskList.AsQueryable().Where(visitTaskFilter).Count() >= filterObj.PlanVisitCount);
@ -300,9 +403,9 @@ namespace IRaCIS.Core.Application.Service
TrialSiteCode = t.TrialSite.TrialSiteCode,
SubjectId = t.Id,
BlindSubjectCode=t.SubjectVisitTaskList.Where(t=>t.IsAnalysisCreate).OrderByDescending(t=>t.BlindSubjectCode).Select(t=>t.BlindSubjectCode).FirstOrDefault(),
BlindSubjectCode = t.SubjectVisitTaskList.Where(t => t.IsAnalysisCreate).OrderByDescending(t => t.BlindSubjectCode).Select(t => t.BlindSubjectCode).FirstOrDefault(),
IsHaveGeneratedTask = t.SubjectVisitTaskList.Any(c => c.DoctorUserId == doctorUserId && c.IsSelfAnalysis == true),
IsHaveGeneratedTask = t.SubjectVisitTaskList.Any(c => c.DoctorUserId == doctorUserId && c.IsSelfAnalysis == true),
ValidVisitCount = t.SubjectVisitTaskList.AsQueryable().Where(visitTaskFilter).Count(),
@ -324,7 +427,7 @@ namespace IRaCIS.Core.Application.Service
//自身一致性才有意义
//IsHaveGeneratedTask = c.Subject.SubjectVisitTaskList.Any(t => t.ConsistentAnalysisOriginalTaskId == c.Id),
GlobalVisitTaskList = c.Subject.SubjectVisitTaskList.Where(t => t.VisitTaskNum == c.VisitTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Global] && t.TaskState == TaskState.Effect && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.SignTime!.Value.AddDays(filterObj.IntervalWeeks * 7) < DateTime.Now).Select(c => new VisitTaskSimpleDTO()
GlobalVisitTaskList = c.Subject.SubjectVisitTaskList.AsQueryable().Where(comonTaskFilter).Where(t => t.VisitTaskNum == c.VisitTaskNum + ReadingCommon.TaskNumDic[ReadingCategory.Global]).Select(c => new VisitTaskSimpleDTO()
{
Id = c.Id,
ReadingCategory = c.ReadingCategory,
@ -387,7 +490,7 @@ namespace IRaCIS.Core.Application.Service
IsHaveReadingPeriod = taskConsistentRule.IsHaveReadingPeriod,
PlanVisitCount = taskConsistentRule.PlanVisitCount,
GeneratedSubjectCount = taskConsistentRule.Trial.VisitTaskList.Where(t => t.IsAnalysisCreate && t.IsSelfAnalysis == true && t.DoctorUserId==user.Id).Select(t => t.SubjectId).Distinct().Count(),
GeneratedSubjectCount = taskConsistentRule.Trial.VisitTaskList.Where(t => t.IsAnalysisCreate && t.IsSelfAnalysis == true && t.DoctorUserId == user.Id).Select(t => t.SubjectId).Distinct().Count(),
AnalysisDoctorUser = new UserSimpleInfo()
{
@ -492,7 +595,7 @@ namespace IRaCIS.Core.Application.Service
VerifyMsg = "已有该项目配置,不允许继续增加"
};
if( await _visitTaskRepository.AnyAsync(t=>t.IsSelfAnalysis==addOrEditTaskConsistentRule.IsSelfAnalysis && t.TrialId == addOrEditTaskConsistentRule.TrialId))
if (await _visitTaskRepository.AnyAsync(t => t.IsSelfAnalysis == addOrEditTaskConsistentRule.IsSelfAnalysis && t.TrialId == addOrEditTaskConsistentRule.TrialId))
{
return ResponseOutput.NotOk("已有Subject 生成了任务,不允许修改配置");
}

View File

@ -356,7 +356,6 @@ namespace IRaCIS.Core.Application.Service
break;
case GenerateTaskCategory.SelfConsistent:
case GenerateTaskCategory.GroupConsistent:
foreach (var task in generateTaskCommand.GenerataConsistentTaskList)
{
@ -368,11 +367,52 @@ namespace IRaCIS.Core.Application.Service
TaskName = task.TaskName,
TaskBlindName = task.TaskBlindName,
VisitTaskNum = task.VisitTaskNum,
ReadingCategory = task.ReadingCategory,
IsAnalysisCreate = true,
//TaskConsistentRuleId=task.TaskConsistentRuleId,
TaskState = TaskState.Effect,
Code = currentMaxCodeInt + 1,
TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
DoctorUserId = task.DoctorUserId,
TaskAllocationState = TaskAllocationState.Allocated,
AllocateTime = DateTime.Now,
BlindTrialSiteCode = task.BlindTrialSiteCode,
BlindSubjectCode = task.BlindSubjectCode,
ConsistentAnalysisOriginalTaskId = task.Id ,
IsSelfAnalysis = true,
};
await _visitTaskRepository.AddAsync(consistentTask);
currentMaxCodeInt = currentMaxCodeInt + 1;
_provider.Set<int>($"{trialId}_{StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt, TimeSpan.FromMinutes(30));
}
break;
case GenerateTaskCategory.GroupConsistent:
foreach (var task in generateTaskCommand.GenerataGroupConsistentTaskList)
{
var consistentTask = new VisitTask()
{
TrialId = task.TrialId,
SubjectId = task.SubjectId,
ArmEnum = task.ArmEnum,
TaskName = task.TaskName,
TaskBlindName = task.TaskBlindName,
VisitTaskNum = task.VisitTaskNum,
ReadingCategory = task.ReadingCategory,
IsAnalysisCreate = true,
TaskConsistentRuleId=task.TaskConsistentRuleId,
TaskState = TaskState.Effect,
Code = currentMaxCodeInt + 1,
TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
@ -383,9 +423,9 @@ namespace IRaCIS.Core.Application.Service
BlindTrialSiteCode=task.BlindTrialSiteCode,
BlindSubjectCode=task.BlindSubjectCode,
ConsistentAnalysisOriginalTaskId=task.Id,
ConsistentAnalysisOriginalTaskId= null,
IsSelfAnalysis= generateTaskCommand.ReadingCategory== GenerateTaskCategory.SelfConsistent,
IsSelfAnalysis= false,
};

View File

@ -157,6 +157,8 @@ namespace IRaCIS.Core.Domain.Share
JudgeArm = 3,
TumorArm = 4,
GroupConsistentArm=8
}
/// <summary>

View File

@ -176,7 +176,7 @@ namespace IRaCIS.Core.Domain.Models
public string BlindTrialSiteCode { get; set; } = string.Empty;
//一致性分析规则Id 用于最后统计
public Guid? TaskConsistentRuleId { get; set; }
//public Guid? TaskConsistentRuleId { get; set; }
/// <summary>
/// 针对产生的一致性任务而言,这个字段存储的是原始任务