238 lines
10 KiB
C#
238 lines
10 KiB
C#
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
|
||
|
||
}
|
||
}
|