SPM 流程配置以及修改
continuous-integration/drone/push Build is passing Details

IRC_NewDev
hang 2024-12-18 15:14:23 +08:00
parent e73c775296
commit 3cd3315964
17 changed files with 18462 additions and 56 deletions

View File

@ -522,10 +522,10 @@ namespace IRaCIS.Core.API.Controllers
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> ConfirmReReading(DataInspectionDto<ConfirmReReadingCommand> opt, [FromServices] IVisitTaskHelpeService _visitTaskCommonService, [FromServices] IVisitTaskService _visitTaskService)
public async Task<IResponseOutput> ConfirmReReading(DataInspectionDto<ConfirmReReadingCommand> opt, [FromServices] IVisitTaskService _visitTaskService)
{
var singId = await _inspectionService.RecordSing(opt.SignInfo);
var result = await _visitTaskService.ConfirmReReading(opt.Data, _visitTaskCommonService);
var result = await _visitTaskService.ConfirmReReading(opt.Data);
await _inspectionService.CompletedSign(singId, result);
return result;
}

View File

@ -284,7 +284,7 @@
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.InspectionController.ConfirmReReading(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.ViewModel.ConfirmReReadingCommand},IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Application.Service.IVisitTaskService)">
<member name="M:IRaCIS.Core.API.Controllers.InspectionController.ConfirmReReading(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.ViewModel.ConfirmReReadingCommand},IRaCIS.Core.Application.Service.IVisitTaskService)">
<summary>
重阅同意
</summary>

View File

@ -344,7 +344,7 @@
访视读片任务
</summary>
</member>
<member name="M:IRaCIS.Core.Application.Service.Allocation.VisitTaskService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskAllocationRule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectUser},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadModule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTaskReReading},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskMedicalReview},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingClinicalData},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluationVisitFilter},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCanceDoctor},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableAnswerRowInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingCustomTag},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskInfluence},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestionAnswer},Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.Application.Service.Allocation.VisitTaskService},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluationVisitStudyFilter},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)">
<member name="M:IRaCIS.Core.Application.Service.Allocation.VisitTaskService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Trial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectVisit},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskAllocationRule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Subject},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectUser},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadModule},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTaskReReading},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskMedicalReview},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingClinicalData},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluation},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluationVisitFilter},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingQuestionCriterionTrial},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionAnswer},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCanceDoctor},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTaskQuestionMark},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingTableAnswerRowInfo},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.ReadingCustomTag},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TaskInfluence},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialQCQuestionAnswer},Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.Application.Service.Allocation.VisitTaskService},IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SubjectCriteriaEvaluationVisitStudyFilter},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)">
<summary>
访视读片任务
</summary>
@ -504,12 +504,11 @@
<param name="subjectId"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Allocation.VisitTaskService.ConfirmReReading(IRaCIS.Core.Application.ViewModel.ConfirmReReadingCommand,IRaCIS.Core.Application.Service.IVisitTaskHelpeService)">
<member name="M:IRaCIS.Core.Application.Service.Allocation.VisitTaskService.ConfirmReReading(IRaCIS.Core.Application.ViewModel.ConfirmReReadingCommand)">
<summary>
确认重阅与否 1同意 2 拒绝
</summary>
<param name="agreeReReadingCommand"></param>
<param name="_visitTaskCommonService"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.Allocation.VisitTaskService.PMSetTaskBack(System.Guid,System.Guid)">

View File

@ -14,7 +14,7 @@ namespace IRaCIS.Core.Application.Service
{
Task<IResponseOutput> ApplyReReading(ApplyReReadingCommand applyReReadingCommand);
Task<IResponseOutput> ConfirmReReading(ConfirmReReadingCommand agreeReReadingCommand, [FromServices] IVisitTaskHelpeService _visitTaskCommonService);
Task<IResponseOutput> ConfirmReReading(ConfirmReReadingCommand agreeReReadingCommand);
Task<PageOutput<IRUnReadSubjectView>> GetSubjectReadingIQueryable(GetReadingIQueryableInDto inDto);
}

View File

@ -8,6 +8,7 @@ using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Domain.Share.Reading;
using IRaCIS.Core.Infra.EFCore.Common;
@ -48,6 +49,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
IRepository<TaskInfluence> _taskInfluenceRepository,
IRepository<TrialQCQuestionAnswer> _trialQCQuestionAnswerRepository,
ILogger<VisitTaskService> _logger,
IVisitTaskHelpeService _visitTaskCommonService,
IRepository<SubjectCriteriaEvaluationVisitStudyFilter> _subjectCriteriaEvaluationVisitStudyFilterRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, IVisitTaskService
{
@ -1249,7 +1251,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
[HttpPost]
[UnitOfWork]
public async Task<IResponseOutput> AIRReReading(AIRReReadingCommand command, [FromServices] IVisitTaskHelpeService _visitTaskCommonService)
public async Task<IResponseOutput> AIRReReading(AIRReReadingCommand command)
{
var baseLineTaskList = await _visitTaskRepository.Where(t => t.TrialId == command.TrialId && t.TrialReadingCriterionId == command.TrialReadingCriterionId && t.DoctorUserId == _userInfo.Id
&& t.TaskState == TaskState.Effect && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.SourceSubjectVisit.IsBaseLine == true).ToListAsync();
@ -1294,9 +1296,8 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
{
TrialId = command.TrialId,
RequestReReadingResultEnum = RequestReReadingResult.Agree,
//ConfirmReReadingList = new List<ConfirmReReadingDTO>() { new ConfirmReReadingDTO() { Id = requestRecord.Id, OriginalReReadingTaskId = task.Id } }
ConfirmReReadingList = requestRecordList.Select(t => new ConfirmReReadingDTO() { Id = t.Id, OriginalReReadingTaskId = t.OriginalReReadingTaskId }).ToList()
}, _visitTaskCommonService);
});
return ResponseOutput.Ok();
@ -1315,7 +1316,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
public async Task<IResponseOutput> ApplyReReading(ApplyReReadingCommand applyReReadingCommand)
{
var trialId = applyReReadingCommand.TrialId;
var taskList = await _visitTaskRepository.Where(t => applyReReadingCommand.TaskIdList.Contains(t.Id), true).ToListAsync();
@ -1334,7 +1335,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
throw new BusinessValidationFailedException(_localizer["VisitTask_BackendData"]);
}
_logger.LogError("重阅申请状态"+ (int)task.ReReadingApplyState);
_logger.LogError("重阅申请状态" + (int)task.ReReadingApplyState);
if (task.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed || task.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed || task.ReReadingApplyState == ReReadingApplyState.Agree)
{
@ -1383,7 +1384,8 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
}
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer)
else if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.IndependentReviewer)
{
task.ReReadingApplyState = ReReadingApplyState.DocotorHaveApplyed;
@ -1478,7 +1480,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
}
//AIR 不加验证
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.AIR)
else if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.AIR)
{
task.ReReadingApplyState = ReReadingApplyState.DocotorHaveApplyed;
}
@ -1506,6 +1508,30 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
await _visitTaskRepository.SaveChangesAsync();
#region 处理SPM 是否参与审批流程
var isSPMJoinReReadingApproval = _trialRepository.Any(t => t.Id == trialId && t.IsSPMJoinReReadingApproval);
var hasSPMOrCPM = await _trialRepository.Where(t => t.Id == trialId).SelectMany(t => t.TrialUserList).AnyAsync(t => t.User.UserTypeEnum == UserTypeEnum.SPM || t.User.UserTypeEnum == UserTypeEnum.CPM);
var isSPMjoin = isSPMJoinReReadingApproval && hasSPMOrCPM;
if (!isSPMjoin && IsPMOrAPm())
{
var requestRecordList = await _visitTaskReReadingRepository.Where(t => applyReReadingCommand.TaskIdList.Contains(t.OriginalReReadingTaskId) && t.RequestReReadingUserId == _userInfo.Id).ToListAsync();
await ConfirmReReading(new ConfirmReReadingCommand()
{
TrialId = trialId,
RequestReReadingResultEnum = RequestReReadingResult.Agree,
ConfirmReReadingList = requestRecordList.Select(t => new ConfirmReReadingDTO() { Id = t.Id, OriginalReReadingTaskId = t.OriginalReReadingTaskId }).ToList()
});
}
#endregion
return ResponseOutput.Ok();
}
@ -1579,13 +1605,12 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
/// 确认重阅与否 1同意 2 拒绝
/// </summary>
/// <param name="agreeReReadingCommand"></param>
/// <param name="_visitTaskCommonService"></param>
/// <returns></returns>
[HttpPost]
[UnitOfWork]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> ConfirmReReading(ConfirmReReadingCommand agreeReReadingCommand, [FromServices] IVisitTaskHelpeService _visitTaskCommonService)
public async Task<IResponseOutput> ConfirmReReading(ConfirmReReadingCommand agreeReReadingCommand)
{
var trialId = agreeReReadingCommand.TrialId;
@ -1628,7 +1653,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
if (criterionConfig.CriterionType == CriterionType.RECIST1Point1 && criterionConfig.IsAdditionalAssessment)
{
// PM申请 SPM / CPM审批
if (visitTaskReReadingAppply.RequestReReadingType == RequestReReadingType.TrialGroupApply && (IsSpmOrCPM()))
if (visitTaskReReadingAppply.RequestReReadingType == RequestReReadingType.TrialGroupApply)
{
filterExpression = filterExpression.And(t => t.TrialReadingCriterionId == origenalTask.TrialReadingCriterionId || t.TrialReadingCriterion.CriterionType == CriterionType.RECIST1Pointt1_MB);
}
@ -1660,7 +1685,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
if (agreeReReadingCommand.RequestReReadingResultEnum == RequestReReadingResult.Agree)
{
//PM申请 SPM / CPM审批 回退访视,因此这里不生成访视任务 影响多个标准的任务
if (visitTaskReReadingAppply.RequestReReadingType == RequestReReadingType.TrialGroupApply && (IsSpmOrCPM()))
if (visitTaskReReadingAppply.RequestReReadingType == RequestReReadingType.TrialGroupApply)
{
// 不管有序 无序 都会 回退访视
@ -2554,6 +2579,7 @@ public class VisitTaskService(IRepository<VisitTask> _visitTaskRepository,
return _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM;
}
private bool IsSpmOrCPM()
{
return _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SPM || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CPM;

View File

@ -158,6 +158,9 @@ namespace IRaCIS.Core.Application.Contracts
public bool IsPacsConnectConfiged { get; set; }
[Comment("阅片任务产生之前 采集影像")]
public CollectImagesType CollectImagesEnum { get; set; }
}

View File

@ -25,7 +25,7 @@ namespace IRaCIS.Core.Application.Image.QA
Task<List<QCQuestionAnswerItemDto>> GetQCQuestionAnswerList(Guid subjectVisitId, Guid trialId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType);
Task<List<SubjectVisitSelectItem>> GetSubjectVisitSelectList(Guid subjectId);
Task<(List<QAStudyInfoDTO>, object)> GetSubjectVisitUploadedStudyList(Guid subjectVisitId);
Task<IResponseOutput< List<QAStudyInfoDTO>>> GetSubjectVisitUploadedStudyList(Guid subjectVisitId);
Task<UploadViewInitDto> GetUploadInitInfo(Guid subjectVisitId);
Task<TrialVisitQADTO> GetVisitQCInfo(Guid subjectVisitId, [FromRoute] TrialQCProcess trialQCProcess, [FromRoute] CurrentQC currentQCType);
Task<QAStudySeriesInfo> GetVisitQCStudyAndSeriesList(Guid subjectVisitId);

View File

@ -517,7 +517,7 @@ namespace IRaCIS.Core.Application.Image.QA
/// <param name="subjectVisitId"></param>
/// <returns></returns>
[HttpGet("{subjectVisitId:guid}")]
public async Task<(List<QAStudyInfoDTO>, object)> GetSubjectVisitUploadedStudyList(Guid subjectVisitId)
public async Task<IResponseOutput<List<QAStudyInfoDTO>>> GetSubjectVisitUploadedStudyList(Guid subjectVisitId)
{
var visit = await _subjectVisitRepository.Where(x => x.Id == subjectVisitId).FirstNotNullAsync();
@ -530,7 +530,7 @@ namespace IRaCIS.Core.Application.Image.QA
config.IsPacsConnectConfiged = await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).AnyAsync(t => t.Trial.IsPACSConnect && t.Subject.TrialSite.TrialSiteDicomAEList.Any());
return (list, config);
return ResponseOutput.Ok (list, config);
}

View File

@ -21,6 +21,7 @@ using System.Text.RegularExpressions;
using static MassTransit.ValidationResultExtensions;
using DocumentFormat.OpenXml.Vml.Spreadsheet;
using IdentityModel.OidcClient;
using IRaCIS.Core.Domain.Models;
namespace IRaCIS.Core.Application.Contracts
{
@ -90,11 +91,11 @@ namespace IRaCIS.Core.Application.Contracts
DoctorID = userinfo.DoctorId
};
}
else
else
{
Doctor doctor = new Doctor()
{
};
var info = await _doctorRepository.AddAsync(doctor, true);
@ -112,7 +113,7 @@ namespace IRaCIS.Core.Application.Contracts
};
}
}
/// <summary>
@ -125,7 +126,7 @@ namespace IRaCIS.Core.Application.Contracts
{
var dockerInfo = await _doctorRepository.Where(t => t.EMail == inDto.EmailOrPhone || t.Phone == inDto.EmailOrPhone).FirstOrDefaultAsync();
if (dockerInfo != null)
{
@ -149,7 +150,7 @@ namespace IRaCIS.Core.Application.Contracts
EMail = inDto.EmailOrPhone,
IsVirtual = isVirtual,
AcceptingNewTrial = false,
ActivelyReading =false,
ActivelyReading = false,
ResumeStatus = ResumeStatusEnum.Pass,
CooperateStatus = ContractorStatusEnum.Noncooperation,
@ -216,14 +217,14 @@ namespace IRaCIS.Core.Application.Contracts
{
EMail = inDto.EmailOrPhone,
IsVirtual = isVirtual,
AcceptingNewTrial=false,
ActivelyReading=false,
CooperateStatus= ContractorStatusEnum.Noncooperation,
ReviewStatus= ReviewerInformationConfirmStatus.ConfirmRefuse
AcceptingNewTrial = false,
ActivelyReading = false,
CooperateStatus = ContractorStatusEnum.Noncooperation,
ReviewStatus = ReviewerInformationConfirmStatus.ConfirmRefuse
};
var info=await _doctorRepository.AddAsync(doctor,true);
var info = await _doctorRepository.AddAsync(doctor, true);
//await _userRepository.BatchUpdateNoTrackingAsync(x => x.EMail == inDto.EmailOrPhone, x => new User()
//{
@ -235,7 +236,7 @@ namespace IRaCIS.Core.Application.Contracts
result.ReviewStatus = info.ReviewStatus;
}
result.Token = _tokenService.GetToken(IRaCISClaims.Create(new UserBasicInfo() { Id= Guid.NewGuid() }));
result.Token = _tokenService.GetToken(IRaCISClaims.Create(new UserBasicInfo() { Id = Guid.NewGuid() }));
}
}
@ -282,7 +283,7 @@ namespace IRaCIS.Core.Application.Contracts
[HttpPost]
[UnitOfWork]
[AllowAnonymous]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> VerifySendCode(LoginDto userInfo, [FromServices] ITokenService _tokenService)
{
@ -516,7 +517,7 @@ namespace IRaCIS.Core.Application.Contracts
/// </summary>
/// <param name="addOrEditTrialSiteSurvey"></param>
/// <returns></returns>
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> AddOrUpdateTrialSiteSurvey(TrialSiteSurveyAddOrEdit addOrEditTrialSiteSurvey)
{
@ -661,7 +662,7 @@ namespace IRaCIS.Core.Application.Contracts
/// 驳回 New
/// </summary>
/// <returns></returns>
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> SubmissionRejection(TrialSiteSubmitBackCommand trialSiteSubmitBackCommand, [FromServices] IMailVerificationService _IMailVerificationService)
{
@ -691,9 +692,12 @@ namespace IRaCIS.Core.Application.Contracts
}
else if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM)
{
var isTrialSPMJoin = await _trialRepository.AnyAsync(t => t.Id == trialSiteSubmitBackCommand.TrialId && t.IsSPMJoinSiteSurvey);
var hasSPMOrCPM = await _trialSiteSurveyRepository.AnyAsync(t => t.TrialId == trialSiteSubmitBackCommand.TrialId && t.Trial.TrialUserList.Any(u => u.User.UserTypeEnum == UserTypeEnum.SPM || u.User.UserTypeEnum == UserTypeEnum.CPM));
if (hasSPMOrCPM)
var isSPMjoin= isTrialSPMJoin && hasSPMOrCPM;
if (isSPMjoin)
{
////PM 给SPM发 (初审人)
@ -735,7 +739,7 @@ namespace IRaCIS.Core.Application.Contracts
[HttpPut("{trialId:guid}/{trialSiteSurveyId:guid}")]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> AbandonSiteSurvey(Guid trialSiteSurveyId)
{
@ -763,7 +767,7 @@ namespace IRaCIS.Core.Application.Contracts
/// <param name="siteSurvyeSubmit"></param>
/// <returns></returns>
[HttpPost]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[TrialGlobalLimit("AfterStopCannNotOpt")]
[UnitOfWork]
public async Task<IResponseOutput> TrialSurveySubmit(TrialSiteSurvyeSubmitDTO siteSurvyeSubmit)
{
@ -811,12 +815,15 @@ namespace IRaCIS.Core.Application.Contracts
}
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.Undefined || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator)
{
var hasSPMOrCPM = await _trialSiteSurveyRepository.AnyAsync(t => t.TrialId == trialId && t.Trial.TrialUserList.Any(u => u.User.UserTypeEnum == UserTypeEnum.SPM || u.User.UserTypeEnum == UserTypeEnum.CPM));
if (hasSPMOrCPM)
var isTrialSPMJoin = await _trialRepository.AnyAsync(t => t.Id == trialId && t.IsSPMJoinSiteSurvey);
var isSPMjoin = isTrialSPMJoin && hasSPMOrCPM;
if (isSPMjoin)
{
await _trialSiteSurveyRepository.UpdatePartialFromQueryAsync(t => t.Id == trialSiteSurveyId && t.State == TrialSiteSurveyEnum.ToSubmit, u => new TrialSiteSurvey() { State = TrialSiteSurveyEnum.CRCSubmitted });

View File

@ -69,9 +69,10 @@ namespace IRaCIS.Core.Application.Contracts
public List<string> ModalityList { get; set; } = new List<string>();
public List<TrialObjectNameConfig> TrialObjectNameList { get; set; }
public List<TrialObjectNameConfig> TrialObjectNameList { get; set; }
[Comment("阅片任务产生之前 采集影像")]
public CollectImagesType CollectImagesEnum { get; set; }
}
public class ConfigTrialProcessInfoVerificationInDto
@ -1011,8 +1012,33 @@ namespace IRaCIS.Core.Application.Contracts
public string SignCode { get; set; } = string.Empty;
}
public class TrialSPMConfigCommand
{
public Guid Id { get; set; }
[Comment("SPM 参与中心调研")]
public bool IsSPMJoinSiteSurvey { get; set; }
[Comment("SPM 参与阅片人筛选")]
public bool IsSPMJoinReviewerSelect { get; set; }
[Comment("SPM 参与重阅审批")]
public bool IsSPMJoinReReadingApproval { get; set; }
}
public class TrialConfigDTO : BasicTrialConfig
{
[Comment("SPM 参与中心调研")]
public bool IsSPMJoinSiteSurvey { get; set; }
[Comment("SPM 参与阅片人筛选")]
public bool IsSPMJoinReviewerSelect { get; set; }
[Comment("SPM 参与重阅审批")]
public bool IsSPMJoinReReadingApproval { get; set; }
public List<Guid> TrialCriterionIds { get; set; } = new List<Guid>();
public List<string> TrialCriterionNames { get; set; } = new List<string>();

View File

@ -1257,6 +1257,15 @@ namespace IRaCIS.Core.Application
.FirstOrDefaultAsync().IfNullThrowException();
}
[TrialGlobalLimit("BeforeOngoingCantOpt", "AfterStopCannNotOpt")]
public async Task<IResponseOutput> ConfigTrialSPMInfo(TrialSPMConfigCommand trialConfig)
{
var trialInfo = (await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialConfig.Id)).IfNullThrowException();
_mapper.Map(trialConfig, trialInfo);
return ResponseOutput.Ok(await _trialRepository.SaveChangesAsync());
}
/// <summary>
/// 配置项目任务信息

View File

@ -50,8 +50,8 @@ namespace IRaCIS.Core.Application.Service
CreateMap<DicomAEAddOrEdit, TrialDicomAE>();
CreateMap<TrialSPMConfigCommand, Trial>();
}
}

View File

@ -176,12 +176,14 @@ namespace IRaCIS.Core.Application.Service
var hasSPMOrCPM = await _trialUserRepository.Where(t => t.TrialId == trialId).AnyAsync(t => t.User.UserTypeEnum == UserTypeEnum.SPM || t.User.UserTypeEnum == UserTypeEnum.CPM);
var isSPMjoin= trial.IsSPMJoinReviewerSelect && hasSPMOrCPM;
if (trial != null)
{
if (commitState == 1) //确认提交CRO
{
//更新项目状态
trial.TrialEnrollStatus = hasSPMOrCPM ? (int)TrialEnrollStatus.HasCommitCRO : (int)TrialEnrollStatus.HasConfirmedDoctorNames;
trial.TrialEnrollStatus = isSPMjoin ? (int)TrialEnrollStatus.HasCommitCRO : (int)TrialEnrollStatus.HasConfirmedDoctorNames;
//添加项目详细记录
var trialDetail = new TrialStatusDetail()
@ -198,18 +200,18 @@ namespace IRaCIS.Core.Application.Service
{
if (doctorIdArray.Contains(intoGroupItem.DoctorId))
{
intoGroupItem.EnrollStatus = hasSPMOrCPM ? EnrollStatus.HasCommittedToCRO : EnrollStatus.InviteIntoGroup;
intoGroupItem.EnrollStatus = isSPMjoin ? EnrollStatus.HasCommittedToCRO : EnrollStatus.InviteIntoGroup;
await _enrollDetailRepository.AddAsync(new EnrollDetail()
{
TrialDetailId = trialDetail.Id,
DoctorId = intoGroupItem.DoctorId,
TrialId = trialId,
EnrollStatus = hasSPMOrCPM ? EnrollStatus.HasCommittedToCRO : EnrollStatus.InviteIntoGroup,
EnrollStatus = isSPMjoin ? EnrollStatus.HasCommittedToCRO : EnrollStatus.InviteIntoGroup,
OptUserType = (int)SystemUserType.AdminUser, //后台用户
});
if (!hasSPMOrCPM)
if (!isSPMjoin)
{
await _enrollDetailRepository.AddAsync(new EnrollDetail()
{
@ -251,7 +253,7 @@ namespace IRaCIS.Core.Application.Service
}
return ResponseOutput.Result(await _enrollRepository.SaveChangesAsync(), new { IsHaveSPMOrCPM = hasSPMOrCPM });
return ResponseOutput.Result(await _enrollRepository.SaveChangesAsync(), new { IsHaveSPMOrCPM = isSPMjoin });
}
//$"Cannot find trial {trialId}"
return ResponseOutput.NotOk(_localizer["Enroll_NotFound", trialId]);

View File

@ -264,6 +264,27 @@ public partial class Trial : BaseFullDeleteAuditEntity
[StringLength(2000)]
public List<TrialObjectNameConfig> TrialObjectNameList { get; set; }
[Comment("SPM 参与中心调研")]
public bool IsSPMJoinSiteSurvey { get; set; }
[Comment("SPM 参与阅片人筛选")]
public bool IsSPMJoinReviewerSelect { get; set; }
[Comment("SPM 参与重阅审批")]
public bool IsSPMJoinReReadingApproval { get; set; }
[Comment("阅片任务产生之前 采集影像")]
public CollectImagesType CollectImagesEnum { get; set; }
}
public enum CollectImagesType
{
None = 0,
Dicom = 1,
NoneDicom = 2
}
[ComplexType]

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,90 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class SPMConfig : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_DicomInstance_DicomStudy_StudyId",
table: "DicomInstance");
migrationBuilder.AddColumn<int>(
name: "CollectImagesEnum",
table: "Trial",
type: "int",
nullable: false,
defaultValue: 0,
comment: "阅片任务产生之前 采集影像");
migrationBuilder.AddColumn<bool>(
name: "IsSPMJoinReReadingApproval",
table: "Trial",
type: "bit",
nullable: false,
defaultValue: true,
comment: "SPM 参与重阅审批");
migrationBuilder.AddColumn<bool>(
name: "IsSPMJoinReviewerSelect",
table: "Trial",
type: "bit",
nullable: false,
defaultValue: true,
comment: "SPM 参与阅片人筛选");
migrationBuilder.AddColumn<bool>(
name: "IsSPMJoinSiteSurvey",
table: "Trial",
type: "bit",
nullable: false,
defaultValue: true,
comment: "SPM 参与中心调研");
migrationBuilder.AddForeignKey(
name: "FK_DicomInstance_DicomStudy_StudyId",
table: "DicomInstance",
column: "StudyId",
principalTable: "DicomStudy",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_DicomInstance_DicomStudy_StudyId",
table: "DicomInstance");
migrationBuilder.DropColumn(
name: "CollectImagesEnum",
table: "Trial");
migrationBuilder.DropColumn(
name: "IsSPMJoinReReadingApproval",
table: "Trial");
migrationBuilder.DropColumn(
name: "IsSPMJoinReviewerSelect",
table: "Trial");
migrationBuilder.DropColumn(
name: "IsSPMJoinSiteSurvey",
table: "Trial");
migrationBuilder.AddForeignKey(
name: "FK_DicomInstance_DicomStudy_StudyId",
table: "DicomInstance",
column: "StudyId",
principalTable: "DicomStudy",
principalColumn: "SeqId",
onDelete: ReferentialAction.Cascade);
}
}
}

View File

@ -10168,6 +10168,10 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<int>("Code")
.HasColumnType("int");
b.Property<int>("CollectImagesEnum")
.HasColumnType("int")
.HasComment("阅片任务产生之前 采集影像");
b.Property<DateTime>("CreateTime")
.HasColumnType("datetime2");
@ -10297,6 +10301,18 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<bool>("IsQCQuestionConfirmed")
.HasColumnType("bit");
b.Property<bool>("IsSPMJoinReReadingApproval")
.HasColumnType("bit")
.HasComment("SPM 参与重阅审批");
b.Property<bool>("IsSPMJoinReviewerSelect")
.HasColumnType("bit")
.HasComment("SPM 参与阅片人筛选");
b.Property<bool>("IsSPMJoinSiteSurvey")
.HasColumnType("bit")
.HasComment("SPM 参与中心调研");
b.Property<bool>("IsSubjectExpeditedView")
.HasColumnType("bit")
.HasComment("配置Suject Edit页面 是否显示 加急");
@ -14055,6 +14071,7 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.HasOne("IRaCIS.Core.Domain.Models.DicomStudy", "DicomStudy")
.WithMany()
.HasForeignKey("StudyId")
.HasPrincipalKey("Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
@ -14312,7 +14329,7 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.TrialStatusDetail", "TrialDetail")
.WithMany("IntoGroupDetails")
.WithMany()
.HasForeignKey("TrialDetailId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
@ -18140,11 +18157,6 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Navigation("TrialSiteUserSurveyList");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.TrialStatusDetail", b =>
{
b.Navigation("IntoGroupDetails");
});
modelBuilder.Entity("IRaCIS.Core.Domain.Models.User", b =>
{
b.Navigation("SystemDocConfirmedList");