171 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C#
		
	
	
using IRaCIS.Application.Interfaces;
 | 
						||
using IRaCIS.Application.Contracts;
 | 
						||
using IRaCIS.Core.Application.Filter;
 | 
						||
using IRaCIS.Core.Domain.Share;
 | 
						||
using Microsoft.AspNetCore.Mvc;
 | 
						||
 | 
						||
 | 
						||
namespace IRaCIS.Application.Services
 | 
						||
{
 | 
						||
    [ApiExplorerSettings(GroupName = "Trial")]
 | 
						||
    public class SubjectService : BaseService, ISubjectService
 | 
						||
    {
 | 
						||
        private readonly IRepository<Subject> _subjectRepository;
 | 
						||
        private readonly IRepository<SubjectVisit> _subjectVisitRepository;
 | 
						||
 | 
						||
        public SubjectService(IRepository<Subject> subjectRepository,IRepository<SubjectVisit> subjectVisitRepository)
 | 
						||
        {
 | 
						||
            _subjectRepository = subjectRepository;
 | 
						||
             _subjectVisitRepository = subjectVisitRepository;
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        ///  添加或更新受试者信息[New]
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="subjectCommand">state:1-访视中,2-出组。0-全部</param>
 | 
						||
        /// <returns></returns>
 | 
						||
 | 
						||
        [TrialAudit(AuditType.SubjectAudit, AuditOptType.AddOrUpdateSubject)]
 | 
						||
        [TypeFilter(typeof(TrialResourceFilter))]
 | 
						||
        public async Task<IResponseOutput<string>> AddOrUpdateSubject([FromBody] SubjectCommand subjectCommand)
 | 
						||
        {
 | 
						||
            var svlist = new List<SubjectVisit>();
 | 
						||
            if (await _repository.AnyAsync<Trial>(t => t.Id == subjectCommand.TrialId && !t.VisitPlanConfirmed))
 | 
						||
            {
 | 
						||
                return ResponseOutput.NotOk("The trial visit plan has not been confirmed yet.Please contact the project manager to confirm the visit plan before adding subject.");
 | 
						||
            }
 | 
						||
 | 
						||
            var verifyExp1 = new EntityVerifyExp<Subject>()
 | 
						||
            {
 | 
						||
                VerifyExp = u => u.Code == subjectCommand.Code && u.TrialId == subjectCommand.TrialId,
 | 
						||
                VerifyMsg = "A subjects with the same subject ID already existed in this trial."
 | 
						||
            };
 | 
						||
 | 
						||
 | 
						||
          
 | 
						||
 | 
						||
            Subject? mapedSubject = null;
 | 
						||
 | 
						||
            if (subjectCommand.Id == null) //insert
 | 
						||
            {
 | 
						||
              
 | 
						||
 | 
						||
                 mapedSubject= await _subjectRepository.InsertFromDTOAsync(subjectCommand, false, verifyExp1);
 | 
						||
 | 
						||
 | 
						||
                //添加受试者的时候,获取访视计划列表,添加到受试者访视表。
 | 
						||
                var visitPlan = await _repository.Where<VisitStage>(t => t.TrialId == subjectCommand.TrialId).ToListAsync();
 | 
						||
 | 
						||
                 svlist = _mapper.Map<List<SubjectVisit>>(visitPlan);
 | 
						||
 | 
						||
                var IsEnrollementQualificationConfirm = await _repository.Where<Trial>(t => t.Id == mapedSubject.TrialId).Select(u => u.IsEnrollementQualificationConfirm).FirstOrDefaultAsync();
 | 
						||
 | 
						||
                svlist.ForEach(t =>
 | 
						||
                {
 | 
						||
                    t.Subject = mapedSubject;
 | 
						||
                    t.SubjectId = mapedSubject.Id;
 | 
						||
                    t.TrialId = subjectCommand.TrialId;
 | 
						||
                    t.SiteId = subjectCommand.SiteId;
 | 
						||
                    t.IsEnrollmentConfirm = t.IsBaseLine ? IsEnrollementQualificationConfirm : false;
 | 
						||
                });
 | 
						||
 | 
						||
 | 
						||
              await  _subjectVisitRepository.AddRangeAsync(svlist);
 | 
						||
            }
 | 
						||
            else //update
 | 
						||
            {
 | 
						||
 | 
						||
                 mapedSubject = await _subjectRepository.UpdateFromDTOAsync(subjectCommand, false,false, verifyExp1/*, verifyExp2*/);
 | 
						||
             
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            await _repository.SaveChangesAsync();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(mapedSubject.Id.ToString());
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        [HttpPut]
 | 
						||
        [UnitOfWork]
 | 
						||
        public async Task<IResponseOutput> UpdateSubjectStatus(SubjectStatusChangeCommand subjectStatusChangeCommand)
 | 
						||
        {
 | 
						||
             await _subjectRepository.UpdateFromDTOAsync(subjectStatusChangeCommand, true);
 | 
						||
            return ResponseOutput.Ok();
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        [HttpDelete("{trialId:guid}/{id:guid}")]
 | 
						||
        [TypeFilter(typeof(TrialResourceFilter))]
 | 
						||
        public async Task<IResponseOutput> DeleteSubject(Guid id)
 | 
						||
        {
 | 
						||
 | 
						||
            if (await _subjectVisitRepository.AnyAsync(u => u.SubjectId == id && u.VisitExecuted == VisitExecutedEnum.Executed))
 | 
						||
            {
 | 
						||
                return ResponseOutput.NotOk("This subject has executed a visit with uploading study images,and couldn't be deleted.");
 | 
						||
            }
 | 
						||
 | 
						||
            await _subjectRepository.DeleteFromQueryAsync(u => u.Id == id);
 | 
						||
            await _subjectVisitRepository.DeleteFromQueryAsync(u => u.SubjectId == id);
 | 
						||
 | 
						||
            var isSuccess =  await _subjectRepository.SaveChangesAsync();
 | 
						||
 | 
						||
 | 
						||
            return ResponseOutput.Result(isSuccess);
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary> 分页获取受试者列表[New] </summary>
 | 
						||
        /// /// <param name="param">state:1-访视中,2-出组。0-全部</param>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<SubjectQueryView>, TrialSubjectConfig>> GetSubjectList(SubjectQueryParam param)
 | 
						||
        {
 | 
						||
 | 
						||
            var subjectQuery = _subjectRepository.Where(u => u.TrialId == param.TrialId)
 | 
						||
                  .WhereIf(!string.IsNullOrWhiteSpace(param.Code), t => t.Code.Contains(param.Code))
 | 
						||
                  .WhereIf(!string.IsNullOrWhiteSpace(param.Name), t => t.ShortName.Contains(param.Name))
 | 
						||
                  .WhereIf(!string.IsNullOrWhiteSpace(param.Sex), t => t.Sex.Contains(param.Sex))
 | 
						||
                  .WhereIf(param.Status != null, t => t.Status == param.Status)
 | 
						||
                  .WhereIf(param.SiteId != null, t => t.SiteId == param.SiteId)
 | 
						||
                  // CRC  只负责他管理site的受试者
 | 
						||
                  .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id))
 | 
						||
                  .ProjectTo<SubjectQueryView>(_mapper.ConfigurationProvider);
 | 
						||
 | 
						||
 | 
						||
            var pageList = await subjectQuery.ToPagedListAsync(param.PageIndex, param.PageSize, param.SortField == string.Empty ? "Code" : param.SortField, param.Asc);
 | 
						||
 | 
						||
            var trialConfig = await _repository.Where<Trial>(t => t.Id == param.TrialId).ProjectTo<TrialSubjectConfig>(_mapper.ConfigurationProvider).FirstOrDefaultAsync().IfNullThrowException();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(pageList, trialConfig);
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 计划外访视  获取受试者选择下拉框列表
 | 
						||
        /// </summary>
 | 
						||
        [HttpGet("{siteId:guid}/{trialId:guid}")]
 | 
						||
        public List<SubjectSelect> GetSubjectListBySiteId(Guid siteId, Guid trialId)
 | 
						||
        {
 | 
						||
            var query = _subjectRepository.Where(t => t.SiteId == siteId && t.TrialId == trialId && t.Status == SubjectStatus.OnVisit).Select(u => new SubjectSelect()
 | 
						||
            {
 | 
						||
                Code = u.Code,
 | 
						||
                FirstName = u.FirstName,
 | 
						||
                LastName = u.LastName,
 | 
						||
                Sex = u.Sex,
 | 
						||
                SubjectId = u.Id,
 | 
						||
                Age = u.Age,
 | 
						||
                MRN = u.MedicalNo,
 | 
						||
                Status = u.Status,
 | 
						||
 | 
						||
                FirstGiveMedicineTime = u.FirstGiveMedicineTime
 | 
						||
 | 
						||
            });
 | 
						||
            return query.ToList();
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
    }
 | 
						||
}
 |