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
}
}