212 lines
10 KiB
C#
212 lines
10 KiB
C#
//--------------------------------------------------------------------
|
||
// 此代码由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
|
||
{
|
||
/// <summary>
|
||
/// NoneDicomStudyService
|
||
/// </summary>
|
||
[ApiExplorerSettings(GroupName = "Image")]
|
||
public class NoneDicomStudyService(IRepository<NoneDicomStudy> _noneDicomStudyRepository,
|
||
IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository,
|
||
IRepository<Trial> _trialRepository,
|
||
IDistributedLockProvider _distributedLockProvider,
|
||
IRepository<SubjectVisit> _subjectVisitRepository,
|
||
IRepository<VisitTask> _visitTaskRepository,
|
||
QCCommon _qCCommon, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, INoneDicomStudyService
|
||
{
|
||
|
||
|
||
|
||
[HttpGet]
|
||
public async Task<IResponseOutput<List<NoneDicomStudyView>>> 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<NoneDicomStudyView> 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<NoneDicomStudyView>(_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<TaskDicomStudyView>(_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<IResponseOutput<NoneDicomStudyAddReturnDto>> 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<IResponseOutput> DeleteNoneDicomStudy(Guid noneDicomStudyId, Guid subjectVisitId)
|
||
{
|
||
//提交了 但是IQC同意的时候 是可以删除的 | 普通提交后也不能删除
|
||
|
||
|
||
await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, subjectVisitId);
|
||
|
||
await _noneDicomStudyRepository.DeleteFromQueryAsync(noneDicomStudyId,ignoreQueryFilter:true);
|
||
|
||
await _noneDicomStudyFileRepository.DeleteFromQueryAsync(t => t.NoneDicomStudyId == noneDicomStudyId, ignoreQueryFilter: true);
|
||
|
||
//确认需求 不删除
|
||
//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<IResponseOutput> 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,true);
|
||
noneDicomStudy.FileCount = await _noneDicomStudyFileRepository.CountAsync(t => t.NoneDicomStudyId == noneDicomStudyFile.NoneDicomStudyId,true);
|
||
await _noneDicomStudyRepository.SaveChangesAsync();
|
||
|
||
return ResponseOutput.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 非Dicom检查 文件列表
|
||
/// </summary>
|
||
/// <param name="noneDicomStudyId"></param>
|
||
/// <returns></returns>
|
||
[HttpGet("{noneDicomStudyId:guid}")]
|
||
public async Task<List<NoneDicomStudyFileView>> 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<NoneDicomStudyFileView>(_mapper.ConfigurationProvider).OrderBy(t => t.CreateTime).ToListAsync();
|
||
}
|
||
|
||
[HttpGet("{subjectVisitId:guid}")]
|
||
public async Task<List<NoneDicomStudyFileView>> 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<NoneDicomStudyFileView>(_mapper.ConfigurationProvider).ToListAsync();
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|
||
}
|