using IRaCIS.Application.Interfaces; using IRaCIS.Application.Contracts; using IRaCIS.Core.Infra.EFCore; using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Domain.Share; using Medallion.Threading; using IRaCIS.Core.Domain.Models; namespace IRaCIS.Application.Services { [ApiExplorerSettings(GroupName = "Institution")] public class SiteService : BaseService, ISiteService { private readonly IRepository _siteRepository; private readonly IRepository _trialSiteUserRepository; private readonly IDistributedLockProvider _distributedLockProvider; private readonly IRepository _hospitalRepository; public SiteService(IRepository siteRepository, IRepository trialSiteUserRepository, IDistributedLockProvider distributedLockProvider, IRepository hospitalRepository) { _siteRepository = siteRepository; _trialSiteUserRepository = trialSiteUserRepository; _distributedLockProvider = distributedLockProvider; _hospitalRepository = hospitalRepository; } /// 分页获取研究中心列表 [HttpPost] public async Task> GetSiteList(SiteQueryParam searchModel) { var siteQueryable = _siteRepository .WhereIf(!string.IsNullOrWhiteSpace(searchModel.SiteName), t => t.SiteName.Contains(searchModel.SiteName) || t.SiteNameCN.Contains(searchModel.SiteName)) .WhereIf(!string.IsNullOrWhiteSpace(searchModel.AliasName), t => t.AliasName.Contains(searchModel.AliasName)) .WhereIf(!string.IsNullOrWhiteSpace(searchModel.City), t => t.City.Contains(searchModel.City)) .WhereIf(!string.IsNullOrWhiteSpace(searchModel.Country), t => t.Country.Contains(searchModel.Country)) .WhereIf(!string.IsNullOrWhiteSpace(searchModel.Province), t => t.Province.Contains(searchModel.Province)) .ProjectTo(_mapper.ConfigurationProvider, new { isEn_Us = _userInfo.IsEn_Us }); return await siteQueryable.ToPagedListAsync(searchModel.PageIndex, searchModel.PageSize, string.IsNullOrWhiteSpace(searchModel.SortField) ? "SiteName" : searchModel.SortField, searchModel.Asc); } public async Task> GetAllSiteList() { return await _siteRepository.ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } /// 添加研究中心 public async Task AddOrUpdateSite(SiteCommand siteCommand) { var exp = new EntityVerifyExp() { VerifyExp = h => h.SiteName.Equals(siteCommand.SiteName) || h.SiteCode.Equals(siteCommand.SiteCode), //---已经存在同名的中心,请确认。 VerifyMsg = _localizer["Site_DupName"] }; var @lock = _distributedLockProvider.CreateLock($"SiteAdd"); using (await @lock.AcquireAsync()) { if (siteCommand.Id == null) { siteCommand.Code = await _siteRepository.Select(t => t.Code).DefaultIfEmpty().MaxAsync() + 1; siteCommand.SiteCode = AppSettings.GetCodeStr(siteCommand.Code, nameof(Site)); } var site = await _siteRepository.InsertOrUpdateAsync(siteCommand, true, exp); //手动解绑医院与site的关系 if (siteCommand.HospitalId == null && site.HospitalId != null) { await _hospitalRepository.BatchUpdateNoTrackingAsync(t => t.Id == site.HospitalId, u => new Hospital() { SiteId = null }); } //手动绑 if (siteCommand.HospitalId != null) { await _hospitalRepository.BatchUpdateNoTrackingAsync(t => t.Id == siteCommand.HospitalId, u => new Hospital() { SiteId = site.Id }); } return ResponseOutput.Ok(site.Id.ToString()); } } /// 删除研究中心 [HttpDelete("{siteId:guid}")] public async Task DeleteSite(Guid siteId) { if (await _trialSiteUserRepository.AnyAsync(t => t.SiteId == siteId)) { //---该中心已经加入项目,不可以被删除。 return ResponseOutput.NotOk(_localizer["Site_InProject"]); } var success = await _siteRepository.BatchDeleteNoTrackingAsync(x => x.Id == siteId); return ResponseOutput.Result(success); } } }