//-------------------------------------------------------------------- // 此代码由T4模板自动生成 byzhouhang 20210918 // 生成时间 2021-12-06 10:54:55 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 //-------------------------------------------------------------------- using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; using Medallion.Threading; using Microsoft.AspNetCore.Mvc; using NPOI.SS.Formula.Functions; using System.ComponentModel.DataAnnotations; namespace IRaCIS.Core.Application.Contracts { /// /// NoneDicomStudyService /// [ApiExplorerSettings(GroupName = "Image")] public class NoneDicomStudyService(IRepository _noneDicomStudyRepository, IRepository _noneDicomStudyFileRepository, IRepository _trialRepository, IDistributedLockProvider _distributedLockProvider, IRepository _subjectVisitRepository, IRepository _visitTaskRepository, QCCommon _qCCommon, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, INoneDicomStudyService { [HttpGet] public async Task>> GetNoneDicomStudyList( [FromQuery, NotDefault] Guid subjectVisitId, [FromQuery] Guid? nonedicomStudyId, [FromQuery] bool isFilterZip, [FromQuery] Guid? visitTaskId, [FromQuery] bool isReading) { var qcAuditState = await _subjectVisitRepository.Where(s => s.Id == subjectVisitId).Select(t => t.AuditState).FirstOrDefaultAsync(); //质控过程中,因为会修改统计数字,但是此时其他人看,应该看到完整的影像 var isQCFinished = qcAuditState == AuditStateEnum.QCPassed; //质控过程中并且不是IQC时,可以看到删除的(不需要忽略过滤器) 质控中iqc 也需要看到删除的 var isViewDelete = !isQCFinished; IQueryable noneDicomStudyQueryable = default; if (visitTaskId == null) { //质控过程中,需要忽略过滤质控设置删除的检查,以及设置删除的文件,质控通过后才 noneDicomStudyQueryable = _noneDicomStudyRepository.Where(t => t.SubjectVisitId == subjectVisitId, ignoreQueryFilters: isViewDelete) .WhereIf(nonedicomStudyId != null, t => t.Id == nonedicomStudyId) .WhereIf(isReading, t => t.IsReading && t.IsDeleted==false) .ProjectTo(_mapper.ConfigurationProvider, new { isFilterZip = isFilterZip, isReading= isReading }); } else { var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Select(t => new { t.BlindSubjectCode, t.TrialReadingCriterionId, t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys }).FirstNotNullAsync(); noneDicomStudyQueryable = _noneDicomStudyRepository.Where(t => t.TaskNoneDicomFileList.Any(t => t.VisitTaskId == visitTaskId), ignoreQueryFilters: isViewDelete) .WhereIf(isReading, t => t.IsReading && t.IsDeleted == false) .Where(t => taskinfo.IsImageFilter ? ("|" + taskinfo.CriterionModalitys + "|").Contains("|" + t.Modality + "|") : true) .WhereIf(nonedicomStudyId != null, t => t.Id == nonedicomStudyId) .ProjectTo(_mapper.ConfigurationProvider, new { isFilterZip = isFilterZip, visiTaskId = visitTaskId, isReading = isReading }); } var list = await noneDicomStudyQueryable.OrderBy(x => x.ImageDate).ThenBy(x => x.CreateTime).ToListAsync(); var config = await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new { t.Trial.ImageFormatList, t.Trial.StudyNameList, t.Trial.IsShowStudyName, AuditState = qcAuditState }).FirstOrDefaultAsync(); return ResponseOutput.Ok(list, config); } [UnitOfWork] [TrialGlobalLimit("AfterStopCannNotOpt")] public async Task> AddOrUpdateNoneDicomStudy(NoneDicomStudyAddOrEdit addOrEditNoneDicomStudy) { await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, addOrEditNoneDicomStudy.SubjectVisitId); if (_trialRepository.Where(t => t.Id == addOrEditNoneDicomStudy.TrialId).Any(t => t.IsVerifyVisitImageDate == true)) { await _qCCommon.VerifyStudyImageDataAsync(_subjectVisitRepository, addOrEditNoneDicomStudy.SubjectId, addOrEditNoneDicomStudy.SubjectVisitId, addOrEditNoneDicomStudy.ImageDate); } NoneDicomStudy? optEntity = null; var @lock = _distributedLockProvider.CreateLock($"NoneDicomCode"); using (await @lock.AcquireAsync()) { if (addOrEditNoneDicomStudy.Id == Guid.Empty || addOrEditNoneDicomStudy.Id == null) { //默认会是0 var code = await _noneDicomStudyRepository.Where(t => t.TrialId == addOrEditNoneDicomStudy.TrialId).Select(x => x.Code).DefaultIfEmpty().MaxAsync(); optEntity = await _noneDicomStudyRepository.InsertFromDTOAsync(addOrEditNoneDicomStudy); optEntity.Code = code + 1; optEntity.StudyCode = AppSettings.GetCodeStr(optEntity.Code, nameof(NoneDicomStudy)); } else { optEntity = await _noneDicomStudyRepository.UpdateFromDTOAsync(addOrEditNoneDicomStudy); } await _noneDicomStudyRepository.SaveChangesAsync(); } NoneDicomStudyAddReturnDto noneDicom = new NoneDicomStudyAddReturnDto() { StudyCode = optEntity.StudyCode, Id = optEntity.Id }; return ResponseOutput.Ok(noneDicom); } [TrialGlobalLimit("AfterStopCannNotOpt")] [HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{noneDicomStudyId:guid}")] public async Task DeleteNoneDicomStudy(Guid noneDicomStudyId, Guid subjectVisitId) { //提交了 但是IQC同意的时候 是可以删除的 | 普通提交后也不能删除 await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, subjectVisitId); await _noneDicomStudyRepository.DeleteFromQueryAsync(noneDicomStudyId,true); await _noneDicomStudyFileRepository.DeleteFromQueryAsync(t => t.NoneDicomStudyId == noneDicomStudyId); //确认需求 不删除 //await _studyMonitorRepository.BatchDeleteNoTrackingAsync(t => t.StudyId == noneDicomStudyId); await _noneDicomStudyRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } [HttpDelete("{trialId:guid}/{subjectVisitId:guid}/{noneDicomStudyFileId:guid}")] [TrialGlobalLimit("AfterStopCannNotOpt")] public async Task DeleteNoneDicomStudyFile(Guid noneDicomStudyFileId, Guid subjectVisitId) { //提交了 但是IQC同意的时候 是可以删除的 | 普通提交后也不能删除 await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, subjectVisitId); var noneDicomStudyFile = await _noneDicomStudyFileRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyFileId, true); var success = await _noneDicomStudyFileRepository.DeleteAsync(noneDicomStudyFile, true); //维护文件数量数字 var noneDicomStudy = await _noneDicomStudyRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyFile.NoneDicomStudyId); noneDicomStudy.FileCount = await _noneDicomStudyFileRepository.CountAsync(t => t.NoneDicomStudyId == noneDicomStudyFile.NoneDicomStudyId); await _noneDicomStudyRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// /// 非Dicom检查 文件列表 /// /// /// [HttpGet("{noneDicomStudyId:guid}")] public async Task> GetNoneDicomStudyFileList(Guid noneDicomStudyId) { var qcAuditState = await _noneDicomStudyFileRepository.Where(t => t.NoneDicomStudyId == noneDicomStudyId).Select(t => t.NoneDicomStudy.SubjectVisit.AuditState).FirstOrDefaultAsync(); //质控过程中,因为会修改统计数字,但是此时其他人看,应该看到完整的影像 var isQCFinished = qcAuditState == AuditStateEnum.QCPassed; //质控过程中并且不是IQC时,可以看到删除的(不需要忽略过滤器) var isViewDelete = !isQCFinished; return await _noneDicomStudyFileRepository.Where(t => t.NoneDicomStudyId == noneDicomStudyId, ignoreQueryFilters: isViewDelete) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(t => t.CreateTime).ToListAsync(); } [HttpGet("{subjectVisitId:guid}")] public async Task> GetVisitNoneDicomStudyFileList(Guid subjectVisitId) { var qcAuditState = await _subjectVisitRepository.Where(s => s.Id == subjectVisitId).Select(t => t.AuditState).FirstOrDefaultAsync(); //质控过程中,因为会修改统计数字,但是此时其他人看,应该看到完整的影像 var isQCFinished = qcAuditState == AuditStateEnum.QCPassed; //质控过程中并且不是IQC时, 不需要忽略过滤器+质控设置删除的 var isViewDelete = !isQCFinished; return await _noneDicomStudyFileRepository.Where(t => t.NoneDicomStudy.SubjectVisitId == subjectVisitId, ignoreQueryFilters: isViewDelete) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); } } }