using IRaCIS.Application.Interfaces; using IRaCIS.Application.Contracts; using IRaCIS.Core.Infra.EFCore; using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Domain.Share; using Nito.AsyncEx; namespace IRaCIS.Application.Services { [ApiExplorerSettings(GroupName = "Institution")] public class SiteService : BaseService, ISiteService { private readonly IRepository _siteRepository; private readonly IRepository _trialSiteUserRepository; private readonly AsyncLock _mutex = new AsyncLock(); public SiteService(IRepository siteRepository, IRepository trialSiteUserRepository) { _siteRepository = siteRepository; this._trialSiteUserRepository = trialSiteUserRepository; } /// 分页获取研究中心列表 [HttpPost] public async Task> GetSiteList(SiteQueryParam searchModel) { var siteQueryable = _siteRepository .WhereIf(!string.IsNullOrWhiteSpace(searchModel.SiteName), t => t.SiteName.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)) .ProjectTo(_mapper.ConfigurationProvider); 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 = "已经存在同名的中心,请确认。" }; using (await _mutex.LockAsync()) { if (siteCommand.Id == null) { siteCommand.Code = await _siteRepository.Select(t => t.Code).DefaultIfEmpty().MaxAsync() + 1; siteCommand.SiteCode = AppSettings.GetCodeStr(siteCommand.Code, nameof(User)); } var site = await _siteRepository.InsertOrUpdateAsync(siteCommand, true, exp); 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("该中心已经加入项目,不可以被删除。"); } var success = await _siteRepository.BatchDeleteNoTrackingAsync(x => x.Id == siteId); return ResponseOutput.Result(success); } } }