CostCalculationItem/IRaCIS.Core.Application/Trial/Enrollment/TrialEnrollmentService.cs

238 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Application.Contracts.RequestAndResponse;
using IRaCIS.Core.Domain.Interfaces;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using System;
using System.Linq;
namespace IRaCIS.Application.Services
{
public class TrialEnrollmentService: ITrialEnrollmentService
{
private readonly ITrialRepository _trialRepository;
private readonly ITrialDetailRepository _trialDetailRepository;
private readonly IEnrollRepository _enrollRepository;
private readonly IEnrollDetailRepository _enrollDetailRepository;
public TrialEnrollmentService(ITrialRepository clinicalTrialProjectRepository,
ITrialDetailRepository clinicalProjectDetailRepository,
IEnrollRepository intoGroupRepository,
IEnrollDetailRepository intoGroupDetailRepository)
{
_trialRepository = clinicalTrialProjectRepository;
_trialDetailRepository = clinicalProjectDetailRepository;
_enrollRepository = intoGroupRepository;
_enrollDetailRepository = intoGroupDetailRepository;
}
#region Reviewer 入组审核流程select-submit-approve-confirm
/// <summary>
/// 入组流程-筛选医生 [select]
/// </summary>
public IResponseOutput SelectReviewer(Guid userId, Guid trialId, Guid[] doctorIdArray)
{
var trial = _trialRepository.GetAll().FirstOrDefault(t => t.Id == trialId);
if (trial != null)
{
//更新项目状态
trial.TrialStatus = (int)TrialEnrollStatus.HasApplyDownLoadResume;
_trialRepository.Update(trial);
//添加项目状态变化记录
var trialDetail = new TrialStatusDetail()
{
TrialId = trial.Id,
TrialStatus = (int)TrialEnrollStatus.HasApplyDownLoadResume,
};
_trialDetailRepository.Add(trialDetail);
// 入组表 入组状态跟踪表
foreach (var doctorId in doctorIdArray)
{
_enrollRepository.Add(new Enroll()
{
DoctorId = doctorId,
TrialId = trialId,
EnrollStatus = (int)EnrollStatus.HasApplyDownloadResume,
});
_enrollDetailRepository.Add(new EnrollDetail()
{
DoctorId = doctorId,
TrialId = trialId,
EnrollStatus = (int)EnrollStatus.HasApplyDownloadResume,
OptUserType = (int)UserType.AdminUser,
});
}
return ResponseOutput.Result(_enrollRepository.SaveChanges());
}
return ResponseOutput.NotOk($"Cannot find trial {trialId}");
}
/// <summary>
/// 入组流程-向CRO提交医生[Submit]
/// </summary>
public IResponseOutput SubmitReviewer(Guid userId, Guid trialId, Guid[] doctorIdArray, int commitState)
{
var trial = _trialRepository.GetAll().FirstOrDefault(t => t.Id == trialId);
if (trial != null)
{
if (commitState == 1) //确认提交CRO
{
//先判断项目状态
var existItem = _trialRepository.FindSingleOrDefault(u => u.Id == trialId && u.TrialStatus >= (int)TrialEnrollStatus.HasCommitCRO);
if (existItem == null)
{
trial.TrialStatus = (int)TrialEnrollStatus.HasCommitCRO;
trial.TrialStatusStr = "Pending";
}
//trial.TrialStatus = (int)TrialStatus.HasCommitCRO;
//trial.TrialStatusStr = "Pending";
_trialRepository.Update(trial);
//添加项目详细记录
var trialDetail = new TrialStatusDetail()
{
TrialId = trial.Id,
TrialStatus = (int)TrialEnrollStatus.HasCommitCRO
};
_trialDetailRepository.Add(trialDetail);
//更新入组表
var intoGroupList = _enrollRepository.Find(t => t.TrialId == trialId).ToList();
intoGroupList.ForEach(intoGroupItem =>
{
if (doctorIdArray.Contains(intoGroupItem.DoctorId))
{
intoGroupItem.EnrollStatus = (int)EnrollStatus.HasCommittedToCRO;
_enrollRepository.Update(intoGroupItem);
_enrollDetailRepository.Add(new EnrollDetail()
{
TrialDetailId = trialDetail.Id,
DoctorId = intoGroupItem.DoctorId,
TrialId = trialId,
EnrollStatus = (int)EnrollStatus.HasCommittedToCRO,
CreateTime = DateTime.Now,
CreateUserId = userId,
OptUserType = (int)UserType.AdminUser, //后台用户
});
}
});
}
return ResponseOutput.Result(_enrollRepository.SaveChanges());
}
return ResponseOutput.NotOk($"Cannot find trial {trialId}");
}
/// <summary>
/// 入组流程-CRO确定医生名单 [ Approve]
/// </summary>
public IResponseOutput ApproveReviewer(Guid userId, Guid trialId, Guid[] doctorIdArray, int auditState)
{
var trial = _trialRepository.GetAll().FirstOrDefault(t => t.Id == trialId);
if (trial != null)
{
if (auditState == 1) //确认入组
{
var existItem = _trialRepository.FindSingleOrDefault(u => u.Id == trialId && u.TrialStatus >= (int)TrialEnrollStatus.HasConfirmedDoctorNames);
if (existItem == null)
{
trial.TrialStatus = (int)TrialEnrollStatus.HasConfirmedDoctorNames;
trial.TrialStatusStr = "Approved";
}
_trialRepository.Update(trial);
//添加项目详细记录
var trialDetail = new TrialStatusDetail()
{
TrialId = trial.Id,
TrialStatus = (int)TrialEnrollStatus.HasConfirmedDoctorNames
};
_trialDetailRepository.Add(trialDetail);
//更新入组表
var intoGroupList = _enrollRepository.Find(t => t.TrialId == trialId).ToList();
intoGroupList.ForEach(intoGroupItem =>
{
if (doctorIdArray.Contains(intoGroupItem.DoctorId))
{
intoGroupItem.EnrollStatus = (int)EnrollStatus.InviteIntoGroup;
_enrollRepository.Update(intoGroupItem);
_enrollDetailRepository.Add(new EnrollDetail()
{
DoctorId = intoGroupItem.DoctorId,
TrialId = trialId,
EnrollStatus = (int)EnrollStatus.InviteIntoGroup,
CreateTime = DateTime.Now,
CreateUserId = userId,
OptUserType = (int)UserType.AdminUser, //后台用户
});
}
});
}
return ResponseOutput.Result(_enrollRepository.SaveChanges());
}
return ResponseOutput.NotOk($"Cannot find trial {trialId}");
}
/// <summary>
/// 入组流程-后台确认医生入组[Confirm]
/// </summary>
public IResponseOutput ConfirmReviewer(Guid userId, Guid trialId, Guid[] doctorIdArray, int confirmState)
{
var trial = _trialRepository.GetAll().FirstOrDefault(t => t.Id == trialId);
var existItem = _trialRepository.FindSingleOrDefault(u => u.Id == trialId && u.TrialStatus >= (int)TrialEnrollStatus.HasConfirmedDoctorNames);
trial.TrialStatusStr = "Reading";
//trial.TrialStatus = (int)TrialStatus.HasConfirmedDoctorNames;
_trialRepository.Update(trial);
if (trial != null)
{
if (confirmState == 1) //确认入组
{
//更新入组表
var intoGroupList = _enrollRepository.Find(t => t.TrialId == trialId).ToList();
intoGroupList.ForEach(intoGroupItem =>
{
if (doctorIdArray.Contains(intoGroupItem.DoctorId))
{
intoGroupItem.EnrollStatus = (int)EnrollStatus.ConfirmIntoGroup;
intoGroupItem.EnrollTime = DateTime.Now;
_enrollRepository.Update(intoGroupItem);
_enrollDetailRepository.Add(new EnrollDetail()
{
DoctorId = intoGroupItem.DoctorId,
TrialId = trialId,
EnrollStatus = (int)EnrollStatus.ConfirmIntoGroup,
CreateTime = DateTime.Now,
CreateUserId = userId,
OptUserType = (int)UserType.AdminUser, //后台用户
});
}
});
}
return ResponseOutput.Result(_enrollRepository.SaveChanges());
}
return ResponseOutput.NotOk($"Cannot find trial {trialId}");
}
#endregion
}
}