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) /// /// 入组流程-筛选医生 [select] /// 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}"); } /// /// 入组流程-向CRO提交医生[Submit] /// 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}"); } /// /// 入组流程-CRO确定医生名单 [ Approve] /// 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}"); } /// /// 入组流程-后台确认医生入组[Confirm] /// 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 } }