diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index 5bb4d1c93..bce95b40c 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -47,6 +47,11 @@
+
+
+ 访视读片任务
+
+
访视读片任务
diff --git a/IRaCIS.Core.Application/Service/Allocation/Interface/IVisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/Interface/IVisitTaskHelpeService.cs
new file mode 100644
index 000000000..73e4aa747
--- /dev/null
+++ b/IRaCIS.Core.Application/Service/Allocation/Interface/IVisitTaskHelpeService.cs
@@ -0,0 +1,14 @@
+//--------------------------------------------------------------------
+// 此代码由T4模板自动生成 byzhouhang 20210918
+// 生成时间 2022-06-07 14:10:49
+// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
+//--------------------------------------------------------------------
+
+
+namespace IRaCIS.Core.Application.Service
+{
+ public interface IVisitTaskHelpeService
+ {
+ Task GenerateVisitTaskAsync(Guid trialId, List subjectVisitIdList, bool isAssignSubjectToDoctor = false);
+ }
+}
\ No newline at end of file
diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs
new file mode 100644
index 000000000..ab842e217
--- /dev/null
+++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs
@@ -0,0 +1,233 @@
+//--------------------------------------------------------------------
+// 此代码由T4模板自动生成 byzhouhang 20210918
+// 生成时间 2022-06-07 14:10:49
+// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
+//--------------------------------------------------------------------
+
+using IRaCIS.Core.Domain.Models;
+using Microsoft.AspNetCore.Mvc;
+using IRaCIS.Core.Application.Interfaces;
+using IRaCIS.Core.Application.ViewModel;
+using EasyCaching.Core;
+using IRaCIS.Core.Domain.Share;
+using IRaCIS.Core.Infrastructure;
+
+namespace IRaCIS.Core.Application.Service
+{
+ ///
+ /// 访视读片任务
+ ///
+ [ApiExplorerSettings(GroupName = "Trial")]
+ public class VisitTaskHelpeService : IVisitTaskHelpeService
+ {
+
+ private readonly IRepository _visitTaskRepository;
+ private readonly IRepository _trialRepository;
+ private readonly IEasyCachingProvider _provider;
+ private readonly IRepository _subjectVisitRepository;
+ private readonly IRepository _taskAllocationRuleRepository;
+
+
+ public VisitTaskHelpeService(IRepository visitTaskRepository, IRepository trialRepository, IEasyCachingProvider provider, IRepository subjectVisitRepository, IRepository taskAllocationRuleRepository)
+ {
+ _visitTaskRepository = visitTaskRepository;
+ _trialRepository = trialRepository;
+ _provider = provider;
+ _subjectVisitRepository = subjectVisitRepository;
+ _taskAllocationRuleRepository = taskAllocationRuleRepository;
+ }
+
+ //查询列表的时候,一致性核查通过未产生任务的 自动产生任务
+ public async Task GenerateVisitTaskAsync(Guid trialId, List subjectVisitIdList, bool isAssignSubjectToDoctor=false)
+ {
+
+ if (subjectVisitIdList.Count == 0)
+ {
+ return;
+ }
+
+ //以前访视未产生任务的,在查询这里要产生 后期维护到一块
+
+ var trialConfig = (await _trialRepository.Where(t => t.Id == trialId).Select(t => new { TrialId = t.Id, t.ReadingType, t.TaskAllocateDefaultState, t.TaskAllocateObjEnum }).FirstOrDefaultAsync()).IfNullThrowException();
+
+ var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
+
+ var cacheMaxCodeInt = _provider.Get($"{trialId }_{ StaticData.CacheKey.TaskMaxCode}").Value;
+
+ int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode;
+
+ var subjectVisitList = _subjectVisitRepository.Where(t => subjectVisitIdList.Contains(t.Id)).Select(t => new {t.Id, t.SubjectId, t.IsUrgent, t.BlindName, t.VisitName, t.CheckPassedTime, t.TrialId }).Distinct().ToList();
+
+
+ foreach (var subjectVisit in subjectVisitList)
+ {
+
+ if (trialConfig.ReadingType == ReadingMethod.Double)
+ {
+ //每个访视 根据项目配置生成任务 双审生成两个
+ var task1 = await _visitTaskRepository.AddAsync(new VisitTask()
+ {
+ TrialId = subjectVisit.TrialId,
+ SubjectId = subjectVisit.SubjectId,
+ IsUrgent = subjectVisit.IsUrgent,
+ TaskBlindName = subjectVisit.BlindName,
+ TaskName = subjectVisit.VisitName,
+ CheckPassedTime = subjectVisit.CheckPassedTime,
+ ArmEnum = 1,//特殊
+ Code = currentMaxCodeInt + 1,
+ TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
+ ReadingCategory = ReadingCategory.Visit
+ });
+
+ var task2 = await _visitTaskRepository.AddAsync(new VisitTask()
+ {
+ TrialId = subjectVisit.TrialId,
+ SubjectId = subjectVisit.SubjectId,
+ IsUrgent = subjectVisit.IsUrgent,
+ TaskBlindName = subjectVisit.BlindName,
+ TaskName = subjectVisit.VisitName,
+ CheckPassedTime = subjectVisit.CheckPassedTime,
+ ArmEnum = 2,//特殊
+ Code = currentMaxCodeInt + 2,
+ TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 2, nameof(VisitTask)),
+ ReadingCategory = ReadingCategory.Visit
+ });
+
+ currentMaxCodeInt = currentMaxCodeInt + 2;
+
+ _provider.Set($"{trialId }_{ StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt + 2, TimeSpan.FromMinutes(30));
+
+
+ #region 分配
+ if (isAssignSubjectToDoctor)
+ {
+ if (_taskAllocationRuleRepository.Where(t => t.TrialId == subjectVisit.TrialId && t.IsEnable).Count() < 2)
+ {
+ throw new BusinessValidationFailedException("能参与读片的医生数量必须大于2,自动分配任务中止");
+ }
+
+ if (trialConfig.TaskAllocateDefaultState == TaskAllocateDefaultState.Allocated)
+ {
+ task1.TaskState = TaskState.Allocated;
+ task2.TaskState = TaskState.Allocated;
+ }
+ else if (trialConfig.TaskAllocateDefaultState == TaskAllocateDefaultState.InitAllocated)
+ {
+ task1.TaskState = TaskState.InitAllocated;
+ task2.TaskState = TaskState.InitAllocated;
+ }
+
+ if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject)
+ {
+
+ var allocateSubjectArmList = _visitTaskRepository.Where(t => t.SubjectId == subjectVisit.SubjectId && t.TrialId == subjectVisit.TrialId && t.DoctorUserId != null).Select(t => new { t.DoctorUserId, t.ArmEnum }).Distinct().ToList();
+
+ //不是初次分配 直接分配给Subject 之前的医生
+ if (allocateSubjectArmList.Count != 0)
+ {
+
+ if (allocateSubjectArmList.GroupBy(t => t.DoctorUserId).Any(g => g.Count() == 2))
+ {
+ throw new BusinessValidationFailedException("请确认是否改了配置,导致同一受试者 分配给同一个医生 在不同的Arm,无法完成自动分配");
+ }
+
+ //手动分配的时候 如果只分配了Arm1 没有分配Arm2 就会有问题
+ if (!(allocateSubjectArmList.Any(t => t.ArmEnum == 1) && allocateSubjectArmList.Any(t => t.ArmEnum == 2)))
+ {
+ throw new BusinessValidationFailedException("请确认是否改了配置,或者手动分配时,只分配了一个Arm ");
+ }
+
+
+ //分配给对应Arm的人
+ task1.DoctorUserId = allocateSubjectArmList.FirstOrDefault(t => t.ArmEnum == 1).DoctorUserId;
+ task2.DoctorUserId = allocateSubjectArmList.FirstOrDefault(t => t.ArmEnum == 2).DoctorUserId;
+
+
+ }
+ }
+
+ task1.AllocateTime = DateTime.Now;
+ task2.AllocateTime = DateTime.Now;
+ }
+
+
+ #endregion
+
+
+
+ }
+ else if (trialConfig.ReadingType == ReadingMethod.Single)
+ {
+ if (_taskAllocationRuleRepository.Where(t => t.TrialId == subjectVisit.TrialId && t.IsEnable).Count() < 2)
+ {
+ throw new BusinessValidationFailedException("能参与读片的医生数量必须大于2,自动分配任务中止");
+ }
+
+ var singleTask = await _visitTaskRepository.AddAsync(new VisitTask()
+ {
+ TrialId = subjectVisit.TrialId,
+ SubjectId = subjectVisit.SubjectId,
+ IsUrgent = subjectVisit.IsUrgent,
+ TaskBlindName = subjectVisit.BlindName,
+ TaskName = subjectVisit.VisitName,
+ CheckPassedTime = subjectVisit.CheckPassedTime,
+ ArmEnum = 0, //特殊
+ Code = currentMaxCodeInt + 1,
+ TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
+ ReadingCategory = ReadingCategory.Visit
+ });
+
+ currentMaxCodeInt = currentMaxCodeInt + 1;
+
+ _provider.Set($"{trialId }_{ StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt + 1, TimeSpan.FromMinutes(30));
+
+ #region 分配
+ if (isAssignSubjectToDoctor)
+ {
+ if (trialConfig.TaskAllocateDefaultState == TaskAllocateDefaultState.Allocated)
+ {
+ singleTask.TaskState = TaskState.Allocated;
+ }
+ else if (trialConfig.TaskAllocateDefaultState == TaskAllocateDefaultState.InitAllocated)
+ {
+ singleTask.TaskState = TaskState.InitAllocated;
+ }
+
+ if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject)
+ {
+ //该Subject 之前是否有已分配的 如果改变配置 可能会出现 一个Subject 分配的同一个医生 有的在Arm1 有的在Arm2
+ var allocateSubjectArmList = _visitTaskRepository.Where(t => t.SubjectId == subjectVisit.SubjectId && t.TrialId == subjectVisit.TrialId && t.DoctorUserId != null).Select(t => new { t.DoctorUserId, t.ArmEnum }).Distinct().ToList();
+
+ //不是初次分配
+ if (allocateSubjectArmList.Count != 0)
+ {
+ singleTask.DoctorUserId = allocateSubjectArmList.FirstOrDefault(t => t.ArmEnum == 0).DoctorUserId;
+
+ }
+
+ }
+
+ singleTask.AllocateTime = DateTime.Now;
+ }
+ #endregion
+
+
+
+ }
+
+
+ await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.Id == subjectVisit.Id, u => new SubjectVisit() { IsVisitTaskGenerated = true });
+ await _visitTaskRepository.SaveChangesAsync();
+ }
+
+
+
+ }
+
+
+
+
+
+
+ }
+}
diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs
index bb4c9c21b..eb44430ce 100644
--- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs
+++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs
@@ -8,6 +8,8 @@ using IRaCIS.Core.Domain.Models;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.ViewModel;
+using IRaCIS.Core.Domain.Share;
+
namespace IRaCIS.Core.Application.Service
{
///
@@ -18,15 +20,26 @@ namespace IRaCIS.Core.Application.Service
{
private readonly IRepository _visitTaskRepository;
+ private readonly IRepository _trialRepository;
+ private readonly IRepository _subjectVisitRepository;
- public VisitTaskService(IRepository visitTaskRepository)
+
+ public VisitTaskService(IRepository visitTaskRepository, IRepository trialRepository, IRepository subjectVisitRepository)
{
_visitTaskRepository = visitTaskRepository;
+ _trialRepository = trialRepository;
+ _subjectVisitRepository = subjectVisitRepository;
}
[HttpPost]
- public async Task> GetVisitTaskList(VisitTaskQuery queryVisitTask)
+ public async Task> GetVisitTaskList(VisitTaskQuery queryVisitTask, [FromServices] IVisitTaskHelpeService _visitTaskCommonService)
{
+ var trialId = queryVisitTask.TrialId;
+ //以前访视未产生任务的,在查询这里要产生 后期维护到一块
+
+ var svIdList = await _subjectVisitRepository.Where(t => t.TrialId == trialId && t.CheckState == CheckStateEnum.CVPassed && t.IsVisitTaskGenerated == false).Select(t => t.Id).ToListAsync();
+ await _visitTaskCommonService.GenerateVisitTaskAsync(trialId,svIdList);
+
var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId)
.WhereIf(queryVisitTask.SiteId != null, t => t.Subject.SiteId == queryVisitTask.SiteId)
@@ -37,7 +50,7 @@ namespace IRaCIS.Core.Application.Service
.WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState)
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.TaskName.Contains(queryVisitTask.TaskName) || t.TaskBlindName.Contains(queryVisitTask.TaskName))
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => t.Subject.Code.Contains(queryVisitTask.SubjectCode))
- .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime> queryVisitTask.BeginAllocateDate)
+ .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime > queryVisitTask.BeginAllocateDate)
.WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate.Value.AddDays(1))
.ProjectTo(_mapper.ConfigurationProvider);
diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingPeriodSetService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingPeriodSetService.cs
index a49e29b3c..e237bd4fd 100644
--- a/IRaCIS.Core.Application/Service/Reading/ReadingPeriodSetService.cs
+++ b/IRaCIS.Core.Application/Service/Reading/ReadingPeriodSetService.cs
@@ -9,6 +9,7 @@ using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain.Share.Reading;
using MassTransit;
+
using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infrastructure.Extention;
@@ -115,7 +116,9 @@ namespace IRaCIS.Application.Services
[HttpPost]
public async Task> GetPreviewTheReadingList(PreviewTheReadingListInDto inDto)
{
- var visitQuery = _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId &&x.LatestScanDate!=null)
+
+
+ var visitQuery = _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId && x.InPlan&&x.LatestScanDate!=null)
.WhereIf(inDto.SiteIds.Count != 0, x => inDto.SiteIds.Contains(x.SiteId));
var existsBubjectVisitsQuery= _readModuleRepository.Where(y => y.ReadingSetType == inDto.ReadingSetType && y.TrialId == inDto.TrialId).Select(x => x.SubjectVisitId);
visitQuery = visitQuery.Where(x => !existsBubjectVisitsQuery.Contains(x.Id))
diff --git a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs
index 9a66856e7..4e2a2af08 100644
--- a/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs
+++ b/IRaCIS.Core.Application/Triggers/SubjectVisitCheckPassedTrigger.cs
@@ -1,6 +1,7 @@
using AutoMapper;
using EasyCaching.Core;
using EntityFrameworkCore.Triggered;
+using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
@@ -19,6 +20,7 @@ namespace IRaCIS.Core.Application.Triggers
private readonly IRepository _taskAllocationRuleRepository;
private readonly IEasyCachingProvider _provider;
+ private readonly IVisitTaskHelpeService _visitTaskHelpeService;
private readonly IMapper _mapper;
@@ -26,6 +28,7 @@ namespace IRaCIS.Core.Application.Triggers
IRepository trialRepository,
IRepository taskAllocationRuleRepository,
IEasyCachingProvider provider,
+ IVisitTaskHelpeService visitTaskHelpeService,
IMapper mapper)
{
_subjectVisitRepository = subjectVisitRepository;
@@ -34,6 +37,7 @@ namespace IRaCIS.Core.Application.Triggers
_mapper = mapper;
_taskAllocationRuleRepository = taskAllocationRuleRepository;
_trialRepository = trialRepository;
+ _visitTaskHelpeService = visitTaskHelpeService;
}
public async Task AfterSave(ITriggerContext context, CancellationToken cancellationToken)
@@ -49,150 +53,185 @@ namespace IRaCIS.Core.Application.Triggers
if (context.UnmodifiedEntity?.CheckState != subjectVisit.CheckState && subjectVisit.CheckState == CheckStateEnum.CVPassed)
{
- if (_taskAllocationRuleRepository.Where(t => t.TrialId == subjectVisit.TrialId && t.IsEnable).Count() < 2)
- {
- throw new BusinessValidationFailedException("能参与读片的医生数量必须大于2,自动分配任务中止");
- }
+ #region 产生任务并分配 暂时废弃
- var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == subjectVisit.TrialId).Select(t => t.Code).DefaultIfEmpty().Max();
+ //if (_taskAllocationRuleRepository.Where(t => t.TrialId == subjectVisit.TrialId && t.IsEnable).Count() < 2)
+ //{
+ // throw new BusinessValidationFailedException("能参与读片的医生数量必须大于2,自动分配任务中止");
+ //}
- var cacheMaxCodeInt = _provider.Get($"{subjectVisit.TrialId }_{ StaticData.CacheKey.TaskMaxCode}").Value;
+ //var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == subjectVisit.TrialId).Select(t => t.Code).DefaultIfEmpty().Max();
- int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode;
+ //var cacheMaxCodeInt = _provider.Get($"{subjectVisit.TrialId }_{ StaticData.CacheKey.TaskMaxCode}").Value;
- _provider.Set($"{subjectVisit.TrialId }_{ StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt + 2, TimeSpan.FromMinutes(30));
+ //int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode;
- var trialConfig = (await _trialRepository.Where(t => t.Id == subjectVisit.TrialId).Select(t => new { TrialId = t.Id, t.ReadingType, t.TaskAllocateDefaultState, t.TaskAllocateObjEnum }).FirstOrDefaultAsync()).IfNullThrowException();
+ //_provider.Set($"{subjectVisit.TrialId }_{ StaticData.CacheKey.TaskMaxCode}", currentMaxCodeInt + 2, TimeSpan.FromMinutes(30));
- //统计当前医生分配信息 有效医生数量必须大于2 已做验证
- var allocateStat = _taskAllocationRuleRepository.Where(t => t.TrialId == subjectVisit.TrialId && t.IsEnable).ProjectTo(_mapper.ConfigurationProvider).ToList();
+ //var trialConfig = (await _trialRepository.Where(t => t.Id == subjectVisit.TrialId).Select(t => new { TrialId = t.Id, t.ReadingType, t.TaskAllocateDefaultState, t.TaskAllocateObjEnum }).FirstOrDefaultAsync()).IfNullThrowException();
- if (trialConfig.ReadingType == ReadingMethod.Double)
- {
+ ////统计当前医生分配信息 有效医生数量必须大于2 已做验证
+ //var allocateStat = _taskAllocationRuleRepository.Where(t => t.TrialId == subjectVisit.TrialId && t.IsEnable).ProjectTo(_mapper.ConfigurationProvider).ToList();
- //每个访视 根据项目配置生成任务 双审生成两个
- var task1 = await _visitTaskRepository.AddAsync(new VisitTask()
- {
- TrialId = subjectVisit.TrialId,
- SubjectId = subjectVisit.SubjectId,
- IsUrgent = subjectVisit.IsUrgent,
- TaskBlindName = subjectVisit.BlindName,
- TaskName = subjectVisit.VisitName,
- CheckPassedTime = subjectVisit.CheckPassedTime,
- ArmEnum = 1,//特殊
- Code = currentMaxCodeInt + 1,
- TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
- ReadingCategory = ReadingCategory.Visit
- });
+ //if (trialConfig.ReadingType == ReadingMethod.Double)
+ //{
- var task2 = await _visitTaskRepository.AddAsync(new VisitTask()
- {
- TrialId = subjectVisit.TrialId,
- SubjectId = subjectVisit.SubjectId,
- IsUrgent = subjectVisit.IsUrgent,
- TaskBlindName = subjectVisit.BlindName,
- TaskName = subjectVisit.VisitName,
- CheckPassedTime = subjectVisit.CheckPassedTime,
- ArmEnum = 2,//特殊
- Code = currentMaxCodeInt + 2,
- TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 2, nameof(VisitTask)),
- ReadingCategory = ReadingCategory.Visit
- });
+ // //每个访视 根据项目配置生成任务 双审生成两个
+ // var task1 = await _visitTaskRepository.AddAsync(new VisitTask()
+ // {
+ // TrialId = subjectVisit.TrialId,
+ // SubjectId = subjectVisit.SubjectId,
+ // IsUrgent = subjectVisit.IsUrgent,
+ // TaskBlindName = subjectVisit.BlindName,
+ // TaskName = subjectVisit.VisitName,
+ // CheckPassedTime = subjectVisit.CheckPassedTime,
+ // ArmEnum = 1,//特殊
+ // Code = currentMaxCodeInt + 1,
+ // TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
+ // ReadingCategory = ReadingCategory.Visit
+ // });
+
+ // var task2 = await _visitTaskRepository.AddAsync(new VisitTask()
+ // {
+ // TrialId = subjectVisit.TrialId,
+ // SubjectId = subjectVisit.SubjectId,
+ // IsUrgent = subjectVisit.IsUrgent,
+ // TaskBlindName = subjectVisit.BlindName,
+ // TaskName = subjectVisit.VisitName,
+ // CheckPassedTime = subjectVisit.CheckPassedTime,
+ // ArmEnum = 2,//特殊
+ // Code = currentMaxCodeInt + 2,
+ // TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 2, nameof(VisitTask)),
+ // ReadingCategory = ReadingCategory.Visit
+ // });
- if (trialConfig.TaskAllocateDefaultState == TaskAllocateDefaultState.Allocated)
- {
- task1.TaskState =TaskState.Allocated;
- task2.TaskState = TaskState.Allocated;
- }
- else if (trialConfig.TaskAllocateDefaultState == TaskAllocateDefaultState.InitAllocated)
- {
- task1.TaskState = TaskState.InitAllocated;
- task2.TaskState = TaskState.InitAllocated;
- }
+ // if (trialConfig.TaskAllocateDefaultState == TaskAllocateDefaultState.Allocated)
+ // {
+ // task1.TaskState = TaskState.Allocated;
+ // task2.TaskState = TaskState.Allocated;
+ // }
+ // else if (trialConfig.TaskAllocateDefaultState == TaskAllocateDefaultState.InitAllocated)
+ // {
+ // task1.TaskState = TaskState.InitAllocated;
+ // task2.TaskState = TaskState.InitAllocated;
+ // }
- if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject)
- {
+ // if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject)
+ // {
- //该Subject 之前是否有已分配的 如果改变配置 可能会出现 一个Subject 分配的同一个医生 有的在Arm1 有的在Arm2
- var allocateSubjectArmList = _visitTaskRepository.Where(t => t.SubjectId == subjectVisit.SubjectId && t.TrialId == subjectVisit.TrialId && t.DoctorUserId != null).Select(t => new { t.DoctorUserId, t.ArmEnum }).Distinct().ToList();
+ // //该Subject 之前是否有已分配的 如果改变配置 可能会出现 一个Subject 分配的同一个医生 有的在Arm1 有的在Arm2
+ // var allocateSubjectArmList = _visitTaskRepository.Where(t => t.SubjectId == subjectVisit.SubjectId && t.TrialId == subjectVisit.TrialId && t.DoctorUserId != null).Select(t => new { t.DoctorUserId, t.ArmEnum }).Distinct().ToList();
- //初次自动分配
- if (allocateSubjectArmList.Count == 0)
- {
- //排除已经入选其他Arm的阅片人
+ // //初次自动分配
+ // if (allocateSubjectArmList.Count == 0)
+ // {
+ // //排除已经入选其他Arm的阅片人
- //是否有做过Arm1的医生 有新的医生未分配 按照最优法找
- if (allocateStat.Any(t => t.ArmList.Any(t => t == 1)) && !allocateStat.Any(t=>t.ArmList.Count==0))
- {
+ // //是否有做过Arm1的医生 没有新的医生未分配
+ // if (allocateStat.Any(t => t.ArmList.Any(t => t == 1)) && !allocateStat.Any(t => t.ArmList.Count == 0))
+ // {
- task1.DoctorUserId = allocateStat.Where(t => t.ArmList.Any(t => t == 1)).OrderByDescending(t => t.TotalTaskCount * t.PlanReadingRatio * 0.01 - t.SelfTaskCount).ThenByDescending(t => t.PlanReadingRatio).FirstOrDefault().DoctorUserId;
+ // task1.DoctorUserId = allocateStat.Where(t => t.ArmList.Any(t => t == 1)).OrderByDescending(t => t.TotalTaskCount * t.PlanReadingRatio * 0.01 - t.SelfTaskCount).ThenByDescending(t => t.PlanReadingRatio).FirstOrDefault().DoctorUserId;
- }
- else
- {
- //找到最优的需要分配任务的医生
- task1.DoctorUserId = allocateStat.OrderByDescending(t => t.TotalTaskCount * t.PlanReadingRatio * 0.01 - t.SelfTaskCount).ThenByDescending(t => t.PlanReadingRatio).FirstOrDefault().DoctorUserId;
+ // }
+ // else
+ // {
+ // //找到最优的需要分配任务的医生
+ // task1.DoctorUserId = allocateStat.OrderByDescending(t => t.TotalTaskCount * t.PlanReadingRatio * 0.01 - t.SelfTaskCount).ThenByDescending(t => t.PlanReadingRatio).FirstOrDefault().DoctorUserId;
- allocateStat.FirstOrDefault(t => t.DoctorUserId == task1.DoctorUserId).ArmList.Add(1);
- }
-
- //是否有做过Arm2的医生 有新的医生未分配 按照最优法找
- if (allocateStat.Any(t => t.ArmList.Any(t => t == 2)) && !allocateStat.Any(t => t.ArmList.Count == 0))
- {
-
- task2.DoctorUserId = allocateStat.Where(t => t.ArmList.Any(t => t == 2)).OrderByDescending(t => t.TotalTaskCount * t.PlanReadingRatio * 0.01 - t.SelfTaskCount).ThenByDescending(t => t.PlanReadingRatio).FirstOrDefault().DoctorUserId;
- }
- else
- {
- //找到最优的需要分配任务的医生
- task2.DoctorUserId = allocateStat.OrderByDescending(t => t.TotalTaskCount * t.PlanReadingRatio * 0.01 - t.SelfTaskCount).ThenByDescending(t => t.PlanReadingRatio).Skip(1).FirstOrDefault().DoctorUserId;
- }
-
- }
- else
- {
- if (allocateSubjectArmList.GroupBy(t => t.DoctorUserId).Any(g => g.Count() == 2))
- {
- throw new BusinessValidationFailedException("请确认是否改了配置,导致同一受试者 分配给同一个医生 在不同的Arm,无法完成自动分配");
- }
-
- //手动分配的时候 如果只分配了Arm1 没有分配Arm2 就会有问题
- if (!(allocateSubjectArmList.Any(t => t.ArmEnum == 1) && allocateSubjectArmList.Any(t => t.ArmEnum == 2)))
- {
- throw new BusinessValidationFailedException("请确认是否改了配置,或者手动分配时,只分配了一个Arm ");
- }
-
- //分配给对应Arm的人
- task1.DoctorUserId = allocateSubjectArmList.FirstOrDefault(t => t.ArmEnum == 1).DoctorUserId;
- task2.DoctorUserId = allocateSubjectArmList.FirstOrDefault(t => t.ArmEnum == 2).DoctorUserId;
- }
-
- task1.AllocateTime = DateTime.Now;
- task2.AllocateTime = DateTime.Now;
- }
-
- }
- else if (trialConfig.ReadingType == ReadingMethod.Single)
- {
- await _visitTaskRepository.AddAsync(new VisitTask()
- {
- TrialId = subjectVisit.TrialId,
- SubjectId = subjectVisit.SubjectId,
- IsUrgent = subjectVisit.IsUrgent,
- TaskBlindName = subjectVisit.BlindName,
- TaskName = subjectVisit.VisitName,
- CheckPassedTime = subjectVisit.CheckPassedTime,
- ArmEnum = 0, //特殊
- Code = currentMaxCodeInt + 1,
- TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
- ReadingCategory = ReadingCategory.Visit
- });
-
- }
+ // //分配之后,加入进去
+ // allocateStat.FirstOrDefault(t => t.DoctorUserId == task1.DoctorUserId).ArmList.Add(1);
+ // }
- await _visitTaskRepository.SaveChangesAsync();
+ // //是否有做过Arm2的医生 有新的医生未分配 按照最优法找
+ // if (allocateStat.Any(t => t.ArmList.Any(t => t == 2)) && !allocateStat.Any(t => t.ArmList.Count == 0))
+ // {
+
+ // task2.DoctorUserId = allocateStat.Where(t => t.ArmList.Any(t => t == 2)).OrderByDescending(t => t.TotalTaskCount * t.PlanReadingRatio * 0.01 - t.SelfTaskCount).ThenByDescending(t => t.PlanReadingRatio).FirstOrDefault().DoctorUserId;
+ // }
+ // else
+ // {
+ // //找到最优的需要分配任务的医生
+ // task2.DoctorUserId = allocateStat.OrderByDescending(t => t.TotalTaskCount * t.PlanReadingRatio * 0.01 - t.SelfTaskCount).ThenByDescending(t => t.PlanReadingRatio).Skip(1).FirstOrDefault().DoctorUserId;
+ // }
+
+ // }
+ // else
+ // {
+ // if (allocateSubjectArmList.GroupBy(t => t.DoctorUserId).Any(g => g.Count() == 2))
+ // {
+ // throw new BusinessValidationFailedException("请确认是否改了配置,导致同一受试者 分配给同一个医生 在不同的Arm,无法完成自动分配");
+ // }
+
+ // //手动分配的时候 如果只分配了Arm1 没有分配Arm2 就会有问题
+ // if (!(allocateSubjectArmList.Any(t => t.ArmEnum == 1) && allocateSubjectArmList.Any(t => t.ArmEnum == 2)))
+ // {
+ // throw new BusinessValidationFailedException("请确认是否改了配置,或者手动分配时,只分配了一个Arm ");
+ // }
+
+ // //分配给对应Arm的人
+ // task1.DoctorUserId = allocateSubjectArmList.FirstOrDefault(t => t.ArmEnum == 1).DoctorUserId;
+ // task2.DoctorUserId = allocateSubjectArmList.FirstOrDefault(t => t.ArmEnum == 2).DoctorUserId;
+ // }
+
+ // task1.AllocateTime = DateTime.Now;
+ // task2.AllocateTime = DateTime.Now;
+ // }
+
+ //}
+ //else if (trialConfig.ReadingType == ReadingMethod.Single)
+ //{
+ // var singleTask = await _visitTaskRepository.AddAsync(new VisitTask()
+ // {
+ // TrialId = subjectVisit.TrialId,
+ // SubjectId = subjectVisit.SubjectId,
+ // IsUrgent = subjectVisit.IsUrgent,
+ // TaskBlindName = subjectVisit.BlindName,
+ // TaskName = subjectVisit.VisitName,
+ // CheckPassedTime = subjectVisit.CheckPassedTime,
+ // ArmEnum = 0, //特殊
+ // Code = currentMaxCodeInt + 1,
+ // TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
+ // ReadingCategory = ReadingCategory.Visit
+ // });
+
+ // if (trialConfig.TaskAllocateDefaultState == TaskAllocateDefaultState.Allocated)
+ // {
+ // singleTask.TaskState = TaskState.Allocated;
+ // }
+ // else if (trialConfig.TaskAllocateDefaultState == TaskAllocateDefaultState.InitAllocated)
+ // {
+ // singleTask.TaskState = TaskState.InitAllocated;
+ // }
+
+ // if (trialConfig.TaskAllocateObjEnum == TaskAllocateObj.Subject)
+ // {
+ // //该Subject 之前是否有已分配的 如果改变配置 可能会出现 一个Subject 分配的同一个医生 有的在Arm1 有的在Arm2
+ // var allocateSubjectArmList = _visitTaskRepository.Where(t => t.SubjectId == subjectVisit.SubjectId && t.TrialId == subjectVisit.TrialId && t.DoctorUserId != null).Select(t => new { t.DoctorUserId, t.ArmEnum }).Distinct().ToList();
+
+ // //初次自动分配
+ // if (allocateSubjectArmList.Count == 0)
+ // {
+ // singleTask.DoctorUserId = allocateStat.OrderByDescending(t => t.TotalTaskCount * t.PlanReadingRatio * 0.01 - t.SelfTaskCount).ThenByDescending(t => t.PlanReadingRatio).FirstOrDefault().DoctorUserId;
+ // }
+ // else
+ // {
+ // singleTask.DoctorUserId = allocateSubjectArmList.FirstOrDefault(t => t.ArmEnum == 0).DoctorUserId;
+ // }
+
+
+ // }
+
+ //}
+
+
+ //await _visitTaskRepository.SaveChangesAsync();
+
+ #endregion
+
+ await _visitTaskHelpeService.GenerateVisitTaskAsync(subjectVisit.TrialId, new List() { subjectVisit.Id }, true);
}
}
diff --git a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs
index a2fb73c33..eee6ee9aa 100644
--- a/IRaCIS.Core.Domain/Visit/SubjectVisit.cs
+++ b/IRaCIS.Core.Domain/Visit/SubjectVisit.cs
@@ -155,6 +155,8 @@ namespace IRaCIS.Core.Domain.Models
public bool IsEnrollmentConfirm { get; set; }
+ public bool IsVisitTaskGenerated { get; set; }
+
///
/// 关闭一致性质疑原因
///
diff --git a/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs b/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs
index 133ad3ae2..c4dca2468 100644
--- a/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs
+++ b/IRaCIS.Core.Infra.EFCore/Common/AuditingData.cs
@@ -825,8 +825,6 @@ namespace IRaCIS.Core.Infra.EFCore.Common
entityTypeName = "New/" + "UserSigned";
}
-
-
dynamic entity;
switch (entityobj.GetType().Name)
{