259 lines
12 KiB
C#
259 lines
12 KiB
C#
using IRaCIS.Application.Contracts;
|
||
using IRaCIS.Core.Domain.Share;
|
||
using IRaCIS.Core.Infrastructure.ExpressionExtend;
|
||
using IRaCIS.Core.Application.Filter;
|
||
using IRaCIS.Core.Infra.EFCore;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using IRaCIS.Core.Application.Contracts.DTO;
|
||
using IRaCIS.Core.Application.Contracts;
|
||
using IRaCIS.Core.Application.Interfaces;
|
||
|
||
namespace IRaCIS.Core.Application.Services
|
||
{
|
||
[ApiExplorerSettings(GroupName = "Trial")]
|
||
public class TrialMaintenanceService : BaseService, ITrialSiteService
|
||
{
|
||
private readonly IRepository<TrialSite> _trialSiteRepository;
|
||
private readonly IRepository<TrialSiteUser> _trialSiteUserRepository;
|
||
private readonly IRepository<Site> _siteRepository;
|
||
|
||
public TrialMaintenanceService(IRepository<TrialSite> trialSiteRepository, IRepository<TrialSiteUser> trialSiteUserRepository
|
||
, IRepository<Site> siteRepository)
|
||
{
|
||
_trialSiteRepository = trialSiteRepository;
|
||
_trialSiteUserRepository = trialSiteUserRepository;
|
||
this._siteRepository = siteRepository;
|
||
}
|
||
|
||
/// <summary>Pannel 进去 SiteTab </summary>
|
||
[HttpPost]
|
||
public async Task<PageOutput<SiteStatDTO>> GetSiteCRCList(SiteCrcQueryDTO param)
|
||
{
|
||
|
||
var siteStatQuery = _trialSiteRepository.Where(t => t.TrialId == param.TrialId, ignoreQueryFilters: true)
|
||
.WhereIf(param.IsDeleted != null, t => t.IsDeleted == param.IsDeleted)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.SiteName), t => t.Site.SiteName.Contains(param.SiteName))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteAliasName), t => t.TrialSiteAliasName.Contains(param.TrialSiteAliasName))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteCode), t => t.TrialSiteAliasName.Contains(param.TrialSiteCode))
|
||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator, t => t.CRCUserList.Any(k => k.UserId == _userInfo.Id))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.UserKeyInfo), t => t.CRCUserList.Any(k => (k.User.LastName + " / " + k.User.FirstName).Contains(param.UserKeyInfo)
|
||
|| k.User.UserName.Contains(param.UserKeyInfo) || k.User.EMail.Contains(param.UserKeyInfo)))
|
||
|
||
.ProjectTo<SiteStatDTO>(_mapper.ConfigurationProvider);
|
||
|
||
return await siteStatQuery.ToPagedListAsync(param.PageIndex,
|
||
param.PageSize, string.IsNullOrWhiteSpace(param.SortField) ? "SiteCode" : param.SortField, param.Asc);
|
||
|
||
|
||
}
|
||
|
||
|
||
/// <summary>[new] setting页面Site列表,和getSiteCRCList对比 没有统计数据,增加了一些site信息 </summary>
|
||
[HttpPost]
|
||
public async Task<PageOutput<SiteStatSimpleDTO>> GetSiteCRCSimpleList(SiteCrcQueryDTO param)
|
||
{
|
||
|
||
var siteStatQuery = _trialSiteRepository.Where(t => t.TrialId == param.TrialId).IgnoreQueryFilters()
|
||
.WhereIf(param.IsDeleted != null, t => t.IsDeleted == param.IsDeleted)
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.SiteName), t => t.Site.SiteName.Contains(param.SiteName))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteAliasName), t => t.TrialSiteAliasName.Contains(param.TrialSiteAliasName))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.TrialSiteCode), t => t.TrialSiteAliasName.Contains(param.TrialSiteCode))
|
||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator, t => t.CRCUserList.Any(k => k.UserId == _userInfo.Id))
|
||
.WhereIf(!string.IsNullOrWhiteSpace(param.UserKeyInfo), t => t.CRCUserList.Any(k => (k.User.LastName + " / " + k.User.FirstName).Contains(param.UserKeyInfo)
|
||
|| k.User.UserName.Contains(param.UserKeyInfo) || k.User.EMail.Contains(param.UserKeyInfo)))
|
||
|
||
.ProjectTo<SiteStatSimpleDTO>(_mapper.ConfigurationProvider);
|
||
|
||
|
||
var result = await siteStatQuery.ToPagedListAsync(param.PageIndex,
|
||
param.PageSize, string.IsNullOrWhiteSpace(param.SortField) ? "Site" : param.SortField, param.Asc);
|
||
|
||
return result;
|
||
}
|
||
|
||
|
||
/// <summary>获取某一Site下面的负责的CRC列表</summary>
|
||
[HttpGet, Route("{trialId:guid}/{siteId:guid}")]
|
||
public async Task<List<UserTrialDTO>> GetTrialSiteCRCList(Guid trialId, Guid siteId)
|
||
{
|
||
var query = _trialSiteUserRepository.Where(t => t.TrialId == trialId && t.SiteId == siteId).IgnoreQueryFilters()
|
||
.ProjectTo<UserTrialDTO>(_mapper.ConfigurationProvider);
|
||
|
||
return await query.ToListAsync();
|
||
}
|
||
|
||
|
||
/// <summary>[new] Setting页面 Site勾选列表( </summary>
|
||
[HttpPost]
|
||
public async Task<PageOutput<TrialSiteScreeningDTO>> GetTrialSiteScreeningList(TrialSiteQuery trialSiteQuery)
|
||
{
|
||
// 之前选择了的不能再次出现在列表,做的时候我就不建议这样搞,搞好了 现在又要改回去。。。 瞎折腾。。。。
|
||
|
||
|
||
var siteQueryable = _siteRepository
|
||
.WhereIf(!string.IsNullOrWhiteSpace(trialSiteQuery.SiteName.Trim()), t => t.SiteName.Contains(trialSiteQuery.SiteName.Trim()))
|
||
.ProjectTo<TrialSiteScreeningDTO>(_mapper.ConfigurationProvider, new { trialId = trialSiteQuery.TrialId });
|
||
|
||
|
||
return await siteQueryable.ToPagedListAsync(trialSiteQuery.PageIndex,
|
||
trialSiteQuery.PageSize, string.IsNullOrWhiteSpace(trialSiteQuery.SortField) ? "SiteName" : trialSiteQuery.SortField, trialSiteQuery.Asc);
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
/// <summary>Setting页面 Site批量添加</summary>
|
||
[HttpPost]
|
||
[UnitOfWork]
|
||
[TrialAudit(AuditType.TrialAudit, AuditOptType.AddTrialSite)]
|
||
[TypeFilter(typeof(TrialResourceFilter))]
|
||
public async Task<IResponseOutput> AddTrialSites(List<TrialSiteCommand> trialSites)
|
||
{
|
||
var addArray = _mapper.Map<List<TrialSite>>(trialSites);
|
||
|
||
await _repository.AddRangeAsync(addArray);
|
||
|
||
|
||
return ResponseOutput.Result(await _repository.SaveChangesAsync());
|
||
}
|
||
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 项目site 编辑接口 New 可以设置为启用不启用 不启用 不会验证Code 重复
|
||
/// </summary>
|
||
/// <param name="editTrialSiteCommand"></param>
|
||
/// <returns></returns>
|
||
[HttpPut]
|
||
public async Task<IResponseOutput> EditTrialSite(EditTrialSiteCommand editTrialSiteCommand)
|
||
{
|
||
|
||
var dbEntity = await _trialSiteRepository.FirstOrDefaultAsync(t => t.Id == editTrialSiteCommand.Id, true);
|
||
|
||
if (dbEntity == null) return Null404NotFound(dbEntity);
|
||
|
||
var trialId = dbEntity.TrialId;
|
||
var siteId = dbEntity.SiteId;
|
||
|
||
if (editTrialSiteCommand.IsDeleted)
|
||
{
|
||
|
||
//if (await _repository.AnyAsync<TrialSiteUser>(t => t.TrialId == trialId && t.SiteId == siteId))
|
||
//{
|
||
// return ResponseOutput.NotOk("The site has been associated with CRC, and couldn't be deleted.");
|
||
//}
|
||
|
||
if (await _repository.AnyAsync<Subject>(t => t.SiteId == siteId && t.TrialId == trialId))
|
||
{
|
||
return ResponseOutput.NotOk("The subjects has been added to this site, and couldn't be deleted.");
|
||
}
|
||
|
||
//if (await _repository.AnyAsync<DicomStudy>(t => t.SiteId == siteId && t.TrialId == trialId))
|
||
//{
|
||
// return ResponseOutput.NotOk("The site has been uploaded study, and couldn't be deleted.");
|
||
//}
|
||
|
||
|
||
}
|
||
else
|
||
{
|
||
if (await _trialSiteRepository.AnyAsync(t => t.Id != editTrialSiteCommand.Id && t.TrialSiteCode == editTrialSiteCommand.TrialSiteCode && t.TrialId == editTrialSiteCommand.TrialId))
|
||
{
|
||
return ResponseOutput.NotOk("Code is not allowed to be repeated");
|
||
}
|
||
}
|
||
|
||
|
||
_mapper.Map(editTrialSiteCommand, dbEntity);
|
||
|
||
await _trialSiteRepository.SaveChangesAsync();
|
||
|
||
return ResponseOutput.Ok();
|
||
|
||
}
|
||
|
||
|
||
|
||
/// <summary> 批量添加Site下 CRC的负责人 </summary>
|
||
[HttpPost]
|
||
[TrialAudit(AuditType.TrialAudit, AuditOptType.AddTrialSiteCRC)]
|
||
[TypeFilter(typeof(TrialResourceFilter))]
|
||
public async Task<IResponseOutput> AssignSiteCRC(List<AssginSiteCRCCommand> trialSiteCRCList)
|
||
{
|
||
var addArray = _mapper.Map<List<TrialSiteUser>>(trialSiteCRCList);
|
||
|
||
await _repository.AddRangeAsync(addArray);
|
||
|
||
return ResponseOutput.Result(await _repository.SaveChangesAsync());
|
||
}
|
||
|
||
/// <summary> 删除CRC人员</summary>
|
||
[HttpDelete, Route("{id:guid}/{trialId:guid}/{isDelete:bool}")]
|
||
[TypeFilter(typeof(TrialResourceFilter))]
|
||
public async Task<IResponseOutput> DeleteSiteCRC(Guid id, bool isDelete)
|
||
{
|
||
|
||
|
||
var isSuccess = await _trialSiteUserRepository.UpdateFromQueryAsync(u => u.Id == id, u => new TrialSiteUser()
|
||
{ IsDeleted = isDelete, DeletedTime = isDelete ? DateTime.Now : null });
|
||
|
||
return ResponseOutput.Ok(isSuccess);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取项目下的 site 下拉框数据 CRC只看到他负责的
|
||
/// </summary>
|
||
/// <param name="trialId"></param>
|
||
/// <returns></returns>
|
||
[HttpGet("{trialId:guid}")]
|
||
public async Task<IEnumerable<TrialSiteForSelect>> GetTrialSiteSelect(Guid trialId)
|
||
{
|
||
//CRC只看到他负责的
|
||
|
||
var list = await _trialSiteRepository.Where(t => t.TrialId == trialId)
|
||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator, t => t.CRCUserList.Any(t => t.UserId == _userInfo.Id))
|
||
.ProjectTo<TrialSiteForSelect>(_mapper.ConfigurationProvider).OrderBy(t => t.TrialSiteCode).ToListAsync();
|
||
|
||
|
||
return list;
|
||
}
|
||
|
||
|
||
/// <summary>删除 项目 下某一site </summary>
|
||
[HttpDelete("{id:guid}/{trialId:guid}")]
|
||
[TrialAudit(AuditType.TrialAudit, AuditOptType.DeleteTrialSite)]
|
||
[TypeFilter(typeof(TrialResourceFilter))]
|
||
[Obsolete]
|
||
public async Task<IResponseOutput> DeleteTrialSite(Guid id)
|
||
{
|
||
var relation = await _trialSiteRepository.FirstOrDefaultAsync(t => t.Id == id);
|
||
|
||
if (relation == null) return Null404NotFound(relation);
|
||
|
||
var trialId = relation.TrialId;
|
||
var siteId = relation.SiteId;
|
||
|
||
if (await _repository.AnyAsync<TrialSiteUser>(t => t.TrialId == trialId && t.SiteId == siteId))
|
||
{
|
||
return ResponseOutput.NotOk("The site has been associated with CRC, and couldn't be deleted.");
|
||
}
|
||
|
||
if (await _repository.AnyAsync<Subject>(t => t.SiteId == siteId && t.TrialId == trialId))
|
||
{
|
||
return ResponseOutput.NotOk("The subjects has been added to this site, and couldn't be deleted.");
|
||
}
|
||
if (await _repository.AnyAsync<DicomStudy>(t => t.SiteId == siteId && t.TrialId == trialId))
|
||
{
|
||
return ResponseOutput.NotOk("The site has been uploaded study, and couldn't be deleted.");
|
||
}
|
||
|
||
await _repository.DeleteAsync(relation);
|
||
|
||
return ResponseOutput.Result(await _repository.SaveChangesAsync());
|
||
}
|
||
|
||
|
||
}
|
||
} |