代码简单整理

Uat_Study
hang 2022-10-17 13:55:39 +08:00
parent 5e58df5114
commit 8b5753a2db
5 changed files with 387 additions and 384 deletions

View File

@ -1691,21 +1691,6 @@
是否是基线
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetReadingClinicalDataPDFListOutDto.TrialId">
<summary>
项目ID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetReadingClinicalDataPDFListOutDto.ReadingId">
<summary>
对象ID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetReadingClinicalDataPDFListOutDto.SubjectId">
<summary>
受试者ID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.GetReadingClinicalDataPDFListOutDto.ReadingClinicalDataId">
<summary>
阅片临床数据ID
@ -1726,21 +1711,6 @@
是否为访视
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingClinicalDataPDFDto.TrialId">
<summary>
项目ID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingClinicalDataPDFDto.ReadingId">
<summary>
对象ID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingClinicalDataPDFDto.SubjectId">
<summary>
受试者ID
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingClinicalDataPDFDto.ReadingClinicalDataId">
<summary>
阅片临床数据ID
@ -1761,11 +1731,6 @@
是否为访视
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.AddOrUpdateReadingClinicalDataPDFDto.ClinicalDataLevel">
<summary>
临床级别
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.PMClinicalDataConfirmCommand.IsBlind">
<summary>
是否盲化

View File

@ -190,7 +190,7 @@ namespace IRaCIS.Application.Services
#endregion
#region 系统和项目标准下拉 和临床数据关联
#region 系统和项目标准下拉 界面上配置和临床数据关联
[HttpPost]
public async Task<List<SystemCriterionSelectDto>> GetSystemCriterionSelectList(SystemCriterionSelectQuery inQuery)

View File

@ -1,15 +1,6 @@
using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Service.WorkLoad.DTO;
using Microsoft.AspNetCore.Authorization;
using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Application.Service.Reading.Dto;
using MassTransit;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Service.Inspection.DTO;
@ -65,6 +56,8 @@ namespace IRaCIS.Application.Services
}
#region 临床数据基本增删改
/// <summary>
/// 新增或者修改
/// </summary>
@ -87,10 +80,10 @@ namespace IRaCIS.Application.Services
var entity = _mapper.Map<ReadingClinicalData>(indto);
entity.ReadingClinicalDataPDFList = indto.AddFileList.Select(x => new ReadingClinicalDataPDF()
{
FileName = x.FileName,
Path = x.Path,
}).ToList();
entity.ReadingClinicalDataState = ReadingClinicalDataStatus.HaveUploaded;
@ -109,10 +102,10 @@ namespace IRaCIS.Application.Services
var addFileList = indto.AddFileList.Select(x => new ReadingClinicalDataPDF()
{
FileName = x.FileName,
Path = x.Path,
ReadingClinicalDataId = entity.Id,
}).ToList();
await _readingClinicalDataPDFRepository.AddRangeAsync(addFileList);
@ -129,6 +122,28 @@ namespace IRaCIS.Application.Services
}
/// <summary>
/// 删除
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("{id:guid}")]
public async Task<IResponseOutput> DeleteReadingClinicalData(Guid id)
{
await _readingClinicalDataRepository.DeleteFromQueryAsync(x => x.Id == id, true);
await _readingClinicalDataPDFRepository.DeleteFromQueryAsync(x => x.ReadingClinicalDataId == id, true);
return ResponseOutput.Result(true);
}
#endregion
#region 临床数据CRC 相关
/// <summary>
/// 获取CRC上传的文件
/// </summary>
@ -150,8 +165,8 @@ namespace IRaCIS.Application.Services
FileName = x.ClinicalDataTrialSet.FileName,
UploadRole = x.ClinicalDataTrialSet.UploadRole,
Path = x.ClinicalDataTrialSet.Path,
IsBlind=x.IsBlind,
IsComplete=x.IsComplete
IsBlind = x.IsBlind,
IsComplete = x.IsComplete
}).ToListAsync();
List<GetReadingClinicalDataListOutDto> clinicalData = (await this.GetReadingClinicalDataList(new GetReadingClinicalDataListIndto()
@ -180,10 +195,6 @@ namespace IRaCIS.Application.Services
}
/// <summary>
/// 添加CRC数据类型
/// </summary>
@ -209,34 +220,52 @@ namespace IRaCIS.Application.Services
}
///// <summary>
///// 设置临床数据是否盲化
///// </summary>
///// <returns></returns>
//[HttpPost]
//public async Task<IResponseOutput> SetReadingClinicalDataIsBlind(SetReadingClinicalDataIsBlind inDto)
//{
// await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(inDto.Id, x=>new ReadingClinicalData() {
// IsBlind=inDto.IsBlind,
// });
// return ResponseOutput.Ok(await _readingClinicalDataRepository.SaveChangesAsync());
//}
#endregion
#region 临床数据签名 和确认
/// <summary>
/// 删除
/// 影像阅片临床数据签名
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("{id:guid}")]
public async Task<IResponseOutput> DeleteReadingClinicalData(Guid id)
{
// [HttpPost]
await _readingClinicalDataRepository.DeleteFromQueryAsync(x => x.Id == id, true);
await _readingClinicalDataPDFRepository.DeleteFromQueryAsync(x => x.ReadingClinicalDataId == id, true);
return ResponseOutput.Result(true);
public async Task<IResponseOutput> ReadClinicalDataSign(ReadingClinicalDataSignIndto inDto)
{
await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.ReadingClinicalDataId, x => new ReadingClinicalData()
{
IsSign = true,
ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned
});
var result = await _readingClinicalDataRepository.SaveChangesAsync();
var readingId = await _readingClinicalDataRepository.Where(x => x.Id == inDto.ReadingClinicalDataId).Select(x => x.ReadingId).FirstOrDefaultAsync();
await this.iServiceProvider.GetService<IReadingImageTaskService>().AddOncologyTask(readingId);
return ResponseOutput.Result(result);
}
[HttpPut]
public async Task<IResponseOutput> PMClinicalDataConfirm(PMClinicalDataConfirmCommand command)
{
await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(t => t.Id == command.Id, u => new ReadingClinicalData()
{
IsBlind = command.IsBlind,
IsComplete = command.IsComplete,
ReadingClinicalDataState = ReadingClinicalDataStatus.HaveChecked
});
await _readingClinicalDataRepository.SaveChangesAsync();
return ResponseOutput.Ok();
}
#endregion
#region 临床数据相关查询
/// <summary>
/// 获取下拉菜单
/// </summary>
@ -262,7 +291,7 @@ namespace IRaCIS.Application.Services
ReadModule readModule = null;
if (inDto.ReadingId != null)
{
readModule = await _readModuleRepository.Where(x => x.Id ==inDto.ReadingId).FirstOrDefaultAsync();
readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId).FirstOrDefaultAsync();
}
Dictionary<ModuleTypeEnum, ClinicalLevel> keyValuePairs = new Dictionary<ModuleTypeEnum, ClinicalLevel>();
@ -274,11 +303,11 @@ namespace IRaCIS.Application.Services
List<GetTrialClinicalDataSelectOutDto> clinicalList = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == inDto.TrialId && x.IsConfirm)
.WhereIf(inDto.UploadRole != null, x => x.UploadRole == inDto.UploadRole)
.Where(x => !usedIdsQuery.Contains(x.Id))
.WhereIf(inDto.TrialReadingCriterionId != null, t => t.TrialClinicalDataCriterionList.Any(t=>t.TrialReadingCriterionId == inDto.TrialReadingCriterionId) )
.WhereIf(inDto.TrialReadingCriterionId != null, t => t.TrialClinicalDataCriterionList.Any(t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId))
.WhereIf(inDto.IsVisit && inDto.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataLevel == ClinicalLevel.SubjectVisit)
.WhereIf(inDto.IsVisit && !inDto.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit)
.WhereIf(!inDto.IsVisit, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead||x.ClinicalDataLevel==ClinicalLevel.OncologyRead)
.WhereIf(readModule!=null, x => x.ClinicalDataLevel == keyValuePairs[readModule.ModuleType])
.WhereIf(!inDto.IsVisit, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead || x.ClinicalDataLevel == ClinicalLevel.OncologyRead)
.WhereIf(readModule != null, x => x.ClinicalDataLevel == keyValuePairs[readModule.ModuleType])
.Select(x => new GetTrialClinicalDataSelectOutDto()
{
ClinicalDataLevel = x.ClinicalDataLevel,
@ -292,29 +321,6 @@ namespace IRaCIS.Application.Services
}
/// <summary>
/// 影像阅片临床数据签名
/// </summary>
// [HttpPost]
public async Task<IResponseOutput> ReadClinicalDataSign(ReadingClinicalDataSignIndto inDto)
{
await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.ReadingClinicalDataId, x => new ReadingClinicalData()
{
IsSign = true,
ReadingClinicalDataState=ReadingClinicalDataStatus.HaveSigned
});
var result = await _readingClinicalDataRepository.SaveChangesAsync();
var readingId = await _readingClinicalDataRepository.Where(x => x.Id == inDto.ReadingClinicalDataId).Select(x => x.ReadingId).FirstOrDefaultAsync();
await this.iServiceProvider.GetService<IReadingImageTaskService>().AddOncologyTask(readingId);
return ResponseOutput.Result(result);
}
/// <summary>
/// 获取访视 阅片或任务临床数据
/// </summary>
@ -364,6 +370,56 @@ namespace IRaCIS.Application.Services
});
}
/// <summary>
/// 获取阅片临床数据列表
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<(List<GetReadingClinicalDataListOutDto>, object)> GetReadingClinicalDataList(GetReadingClinicalDataListIndto inDto)
{
GetTrialClinicalDataSelectIndto getTrialClinicalDataSelectIndto = new GetTrialClinicalDataSelectIndto()
{
ReadingId = inDto.ReadingId,
TrialId = inDto.TrialId,
IsBaseLine = inDto.IsBaseLine,
SubjectId = inDto.SubjectId,
IsVisit = inDto.IsVisit,
};
var clinicalDataList = await this.GetTrialClinicalDataSelect(getTrialClinicalDataSelectIndto);
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC)
{
inDto.UploadRole = UploadRole.CRC;
}
var isBaseLine = await _subjectVisitRepository.AnyAsync(x => x.Id == inDto.ReadingId && x.IsBaseLine);
var result = await this.GetReadingClinicalList(inDto);
var previousHistoryList = await _previousHistoryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousHistoryView>(_mapper.ConfigurationProvider).ToListAsync();
var previousOtherList = await _previousOtherRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousOtherView>(_mapper.ConfigurationProvider).ToListAsync();
var previousSurgeryList = await _previousSurgeryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousSurgeryView>(_mapper.ConfigurationProvider).ToListAsync();
foreach (var item in result)
{
item.ClinicalTableData = new ClinicalDataTable()
{
PreviousHistoryList = previousHistoryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
PreviousOtherList = previousOtherList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
PreviousSurgeryList = previousSurgeryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
};
}
return (result, new
{
IsCanAddClinicalData = clinicalDataList.Count() > 0,
});
}
[NonDynamicMethod]
public async Task<List<GetReadingClinicalDataListOutDto>> GetClinicalDataList(GetReadingOrTaskClinicalDataListInDto inDto)
{
@ -403,68 +459,7 @@ namespace IRaCIS.Application.Services
return result;
}
/// <summary>
/// 获取阅片临床数据列表
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<(List<GetReadingClinicalDataListOutDto>,object)> GetReadingClinicalDataList(GetReadingClinicalDataListIndto inDto)
{
GetTrialClinicalDataSelectIndto getTrialClinicalDataSelectIndto = new GetTrialClinicalDataSelectIndto()
{
ReadingId = inDto.ReadingId,
TrialId = inDto.TrialId,
IsBaseLine = inDto.IsBaseLine,
SubjectId = inDto.SubjectId,
IsVisit = inDto.IsVisit,
};
var clinicalDataList = await this.GetTrialClinicalDataSelect(getTrialClinicalDataSelectIndto);
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC)
{
inDto.UploadRole = UploadRole.CRC;
}
var isBaseLine = await _subjectVisitRepository.AnyAsync(x => x.Id == inDto.ReadingId && x.IsBaseLine);
var result =await this.GetReadingClinicalList(inDto);
var previousHistoryList = await _previousHistoryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousHistoryView>(_mapper.ConfigurationProvider).ToListAsync();
var previousOtherList = await _previousOtherRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousOtherView>(_mapper.ConfigurationProvider).ToListAsync();
var previousSurgeryList = await _previousSurgeryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousSurgeryView>(_mapper.ConfigurationProvider).ToListAsync();
foreach (var item in result)
{
item.ClinicalTableData = new ClinicalDataTable()
{
PreviousHistoryList = previousHistoryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
PreviousOtherList = previousOtherList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
PreviousSurgeryList = previousSurgeryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
};
}
return (result, new {
IsCanAddClinicalData= clinicalDataList.Count()>0,
}) ;
}
[HttpPut]
public async Task<IResponseOutput> PMClinicalDataConfirm(PMClinicalDataConfirmCommand command)
{
await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(t => t.Id == command.Id, u => new ReadingClinicalData()
{
IsBlind=command.IsBlind,
IsComplete=command.IsComplete,
ReadingClinicalDataState=ReadingClinicalDataStatus.HaveChecked
});
await _readingClinicalDataRepository.SaveChangesAsync();
return ResponseOutput.Ok();
}
/// <summary>
/// 获取临床数据集合
/// </summary>
@ -486,11 +481,11 @@ namespace IRaCIS.Application.Services
Id = x.Id,
UploadRole = x.ClinicalDataTrialSet.UploadRole,
IsCRCUpload = x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC,
IsBlind=x.IsBlind,
IsComplete=x.IsComplete,
FileCount=x.FileCount,
IsBlind = x.IsBlind,
IsComplete = x.IsComplete,
FileCount = x.FileCount,
ReadingClinicalDataState=x.ReadingClinicalDataState,
ReadingClinicalDataState = x.ReadingClinicalDataState,
FileList = x.ReadingClinicalDataPDFList.Select(y => new GetFileDto()
{
@ -506,13 +501,19 @@ namespace IRaCIS.Application.Services
return result;
}
#endregion
#region 阅片临床数据PDF
/// <summary>
/// 获取单个阅片临床数据的所有文件
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageOutput<GetReadingClinicalDataPDFListOutDto>> GetReadingClinicalDataPDFList(GetReadingClinicalDataPDFListIndto inDto) {
public async Task<PageOutput<GetReadingClinicalDataPDFListOutDto>> GetReadingClinicalDataPDFList(GetReadingClinicalDataPDFListIndto inDto)
{
var result = await _readingClinicalDataPDFRepository.Where(x => x.ReadingClinicalDataId == inDto.ReadingClinicalDataId).ProjectTo<GetReadingClinicalDataPDFListOutDto>(_mapper.ConfigurationProvider)
.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField == null ? nameof(GetReadingClinicalDataPDFListOutDto.FileName) : inDto.SortField,
@ -532,6 +533,22 @@ namespace IRaCIS.Application.Services
return ResponseOutput.Result(true);
}
#endregion
///// <summary>
///// 设置临床数据是否盲化
///// </summary>
///// <returns></returns>
//[HttpPost]
//public async Task<IResponseOutput> SetReadingClinicalDataIsBlind(SetReadingClinicalDataIsBlind inDto)
//{
// await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(inDto.Id, x=>new ReadingClinicalData() {
// IsBlind=inDto.IsBlind,
// });
// return ResponseOutput.Ok(await _readingClinicalDataRepository.SaveChangesAsync());
//}
}
}

View File

@ -1,16 +1,7 @@
using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Application.Service.WorkLoad.DTO;
using Microsoft.AspNetCore.Authorization;
using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Application.Service.Reading.Dto;
using MassTransit;
using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infrastructure.Extention;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Infrastructure;
@ -65,6 +56,9 @@ namespace IRaCIS.Application.Services
}
#region 阅片期配置 基本信息维护 以及生效
/// <summary>
/// 新增或者修改 (增加标准搜索,已修改)
/// </summary>
@ -73,8 +67,8 @@ namespace IRaCIS.Application.Services
[HttpPost]
public async Task<IResponseOutput> AddOrUpdateReadingPeriodSet(ReadingPeriodSetAddOrEdit addOrEditReadingPeriodSet)
{
if (await _readingPeriodSetRepository.AnyAsync(x => x.Id != addOrEditReadingPeriodSet.Id&&x.IsTakeEffect!= ReadingPeriodStatus.Revocation
&& x.TrialId == addOrEditReadingPeriodSet.TrialId && x.ReadingPeriodName == addOrEditReadingPeriodSet.ReadingPeriodName && x.TrialReadingCriterionId==addOrEditReadingPeriodSet.TrialReadingCriterionId))
if (await _readingPeriodSetRepository.AnyAsync(x => x.Id != addOrEditReadingPeriodSet.Id && x.IsTakeEffect != ReadingPeriodStatus.Revocation
&& x.TrialId == addOrEditReadingPeriodSet.TrialId && x.ReadingPeriodName == addOrEditReadingPeriodSet.ReadingPeriodName && x.TrialReadingCriterionId == addOrEditReadingPeriodSet.TrialReadingCriterionId))
{
return ResponseOutput.NotOk("阅片期名称重复,操作失败");
}
@ -124,192 +118,22 @@ namespace IRaCIS.Application.Services
}
}
/// <summary>
/// 获取影像阅片的预览 // 需要清除之前已经选中的 (增加标准搜索,已修改)
/// 删除
/// </summary>
/// <param name="readingPeriodSetId"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageOutput<PreviewTheReadingListOutDto>> GetPreviewTheReadingList(PreviewTheReadingListInDto inDto)
[HttpDelete("{readingPeriodSetId:guid}")]
public async Task<IResponseOutput> DeleteReadingPeriodSet(Guid readingPeriodSetId)
{
var readModulequery = _readModuleRepository.AsQueryable();
await _readingPeriodSetRepository.DeleteFromQueryAsync(t => t.Id == readingPeriodSetId, true);
await _readingPeriodPlanRepository.DeleteFromQueryAsync(t => t.ReadingPeriodSetId == readingPeriodSetId, true);
// 当前项目 最晚拍片日期不为null 中心筛选
var visitQuery = _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId &&x.LatestScanDate!=null&&!x.IsLostVisit)
.WhereIf(inDto.ReadingScope== ReadingScopeEnum.Site, x => inDto.SiteIds.Contains(x.SiteId));
// 已经存在的访视 需要排除
var existsBubjectVisitsQuery= _readModuleRepository.Where(y => y.ReadingSetType == inDto.ReadingSetType && y.TrialId == inDto.TrialId && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId).Select(x => x.SubjectVisitId);
visitQuery = visitQuery.Where(x => !existsBubjectVisitsQuery.Contains(x.Id))
.WhereIf(inDto.ExpirationDate != null, x => x.LatestScanDate <= inDto.ExpirationDate.Value)
.WhereIf(inDto.ExpirationVisitNum != null, x => x.VisitNum == inDto.ExpirationVisitNum)
.WhereIf(inDto.ReadingSetType==ReadingSetType.TumorReading,x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.ReadingSetType == ReadingSetType.ImageReading).Count() > 0);
var subjectIdlist = await visitQuery.OrderBy(x => x.SubjectId).Select(x => x.SubjectId).Distinct().Skip((inDto.PageIndex - 1) * inDto.PageSize).Take(inDto.PageSize).ToListAsync();
var totalCount = visitQuery.Select(x => x.SubjectId).Distinct().Count();
var visitlist = await visitQuery.Include(x => x.Subject).Include(x => x.TrialSite).Where(x => subjectIdlist.Contains(x.SubjectId)).ToListAsync();
var subjectVisits = visitlist.GroupBy(x => x.SubjectId).Select(x => new
{
SubjectId = x.Key,
Visits = x.ToList()
});
List<SubjectVisit> visits = new List<SubjectVisit>();
subjectVisits.ForEach(x =>
{
var visit = x.Visits.OrderByDescending(x => x.VisitNum).FirstOrDefault();
if (visit != null)
{
visits.Add(visit);
}
});
PageOutput<PreviewTheReadingListOutDto> result = new PageOutput<PreviewTheReadingListOutDto>()
{
CurrentPageData = visits
.Select(x => new PreviewTheReadingListOutDto
{
ExpirationDate = inDto.ExpirationDate,
SubjectVisitId = x.Id,
TrialSiteCode = x.TrialSite.TrialSiteCode,
LatestScanDate = x.LatestScanDate,
ReadingPeriodName = inDto.ReadingPeriodName,
SubjectCode = x.Subject.Code,
SubjectId = x.SubjectId,
SubjectVisitName = x.VisitName,
}).ToList(),
PageSize = inDto.PageSize,
PageIndex = inDto.PageIndex,
TotalCount = totalCount,
};
return result;
return ResponseOutput.Ok();
}
/// <summary>
/// 添加对应的阅片 (增加标准不影响 因为阅片期设置关联了标准)
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<IResponseOutput> GenerateReadingTask(ReadingToGenerateInDto inDto)
{
List<ReadingPeriodPlan> plans = new List<ReadingPeriodPlan>();
inDto.SubjectVisitIds.ForEach(x =>
{
plans.Add(new ReadingPeriodPlan()
{
SubjectVisitId = x,
ReadingPeriodSetId = inDto.ReadingPeriodSetId
});
});
await _readingPeriodPlanRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId);
await _readingPeriodPlanRepository.SaveChangesAsync();
await _readingPeriodPlanRepository.AddRangeAsync(plans);
var result = await _readingPeriodPlanRepository.SaveChangesAsync();
return ResponseOutput.Result(result);
}
/// <summary>
/// 获取选中的计划 (增加标准不影响 因为阅片期设置关联了标准)
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageOutput<PreviewTheReadingListOutDto>> GetPreviewTheReadingPlanList(PreviewTheReadingListDto inDto)
{
var plans = _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId).Include(x => x.SubjectVisit).Include(x => x.SubjectVisit.TrialSite).Include(x => x.SubjectVisit.Subject)
.Include(x => x.ReadingPeriodSet).Select(x => new PreviewTheReadingListOutDto
{
Id = x.Id,
ExpirationDate = x.ReadingPeriodSet.ExpirationDate,
SubjectVisitId = x.SubjectVisitId,
TrialSiteCode = x.SubjectVisit.TrialSite.TrialSiteCode,
LatestScanDate = x.SubjectVisit.LatestScanDate,
ReadingPeriodName = x.ReadingPeriodSet.ReadingPeriodName,
ReadingPeriodSetId = x.ReadingPeriodSetId,
SubjectCode = x.SubjectVisit.Subject.Code,
SubjectId = x.SubjectVisit.SubjectId,
SubjectVisitName = x.SubjectVisit.VisitName,
EffectOfTime = x.ReadingPeriodSet.EffectOfTime,
});
return await plans.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField == null ? nameof(PreviewTheReadingListOutDto.SubjectId) : inDto.SortField,
inDto.Asc);
}
/// <summary>
/// 分页获取 (增加标准搜索,已修改)
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageOutput<ReadingPeriodSetView>> GetReadingPeriodSetList(ReadingPeriodSetQuery query)
{
var readQuery =_readingPeriodSetRepository.Where(t=>t.TrialId==query.TrialId).Include(x=>x.ReadingPeriodSites)
.WhereIf(query.ReadingPeriodName != null, x => x.ReadingPeriodName.Contains(query.ReadingPeriodName!))
.WhereIf(query.TrialReadingCriterionId != null, x => x.TrialReadingCriterionId==query.TrialReadingCriterionId)
.ProjectTo<ReadingPeriodSetView>(_mapper.ConfigurationProvider);
var pageList= await readQuery.ToPagedListAsync(query.PageIndex, query.PageSize, query.SortField == null ? nameof(ReadingPeriodSetView.CreateTime) : query.SortField,
query.Asc);
pageList.CurrentPageData.ForEach(x =>
{
x.SubjectVisitName = x.IsGlobal ? "末次访视" : x.SubjectVisitName;
});
return pageList;
}
/// <summary>
/// 获取单条
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("{id:guid}")]
public async Task<ReadingPeriodSetView> GetReadingPeriodSet(Guid id)
{
return await _readingPeriodSetRepository.AsQueryable().Include(x => x.ReadingPeriodSites).Where(x => x.Id == id).ProjectTo<ReadingPeriodSetView>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
}
/// <summary>
/// 获取阅片期配置的截至访视的下拉框 (增加标准搜索,已修改)
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<GetReadingVisitListOutDto>> GetReadingVisitList(GetReadingVisitListInDto inDto)
{
var maxVisitNum = await _readingPeriodSetRepository
.WhereIf(inDto.TrialReadingCriterionId!=null,t=>t.TrialReadingCriterionId==inDto.TrialReadingCriterionId)
.Where(x => x.TrialId == inDto.TrialId && x.ReadingSetType == inDto.ReadingSetType&&x.IsTakeEffect== ReadingPeriodStatus.TakeEffect )
.MaxAsync(x => x.ExpirationVisitNum)??0;
var thisVisitNum = await _readingPeriodSetRepository.Where(x => x.Id == inDto.ReadingPeriodSetId).Select(x => x.ExpirationVisitNum).FirstOrDefaultAsync() ?? -1;
var globalVisitNum = new List<decimal>();
if (inDto.ReadingSetType == ReadingSetType.TumorReading)
{
globalVisitNum = await _readModuleRepository
.WhereIf(inDto.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId)
.Where(x => x.ReadingSetType == ReadingSetType.ImageReading && x.TrialId == inDto.TrialId).Select(x => x.VisitNum).Distinct().ToListAsync();
}
List <GetReadingVisitListOutDto> result = await _visitStageRepository.Where(x => x.TrialId == inDto.TrialId )
.WhereIf(inDto.ReadingSetType == ReadingSetType.TumorReading,x=> globalVisitNum.Contains(x.VisitNum))
.Where(x=>x.VisitNum== thisVisitNum || x.VisitNum >= maxVisitNum).Select(x => new GetReadingVisitListOutDto()
{
VisitName = x.VisitName,
VisitNum = x.VisitNum,
VisitStageId = x.Id,
}).ToListAsync();
return result;
}
/// <summary>
/// 设置阅片期配置是否生效 (增加标准搜索,已修改)
@ -327,8 +151,8 @@ namespace IRaCIS.Application.Services
.Include(x => x.ReadingPeriodSet).Include(x => x.SubjectVisit).ToList();
var needAddVisitIds = plans.Select(x => x.SubjectVisitId).ToList();
var repeatVisitNames = _readModuleRepository.Where(x => x.TrialReadingCriterionId== readingPeriodSet.TrialReadingCriterionId && x.ReadingSetType == readingPeriodSet.ReadingSetType && needAddVisitIds.Contains(x.SubjectVisitId)).Select(x =>x.Subject.Code+"的"+ x.SubjectVisit.VisitName).ToList();
if(repeatVisitNames.Count!=0)
var repeatVisitNames = _readModuleRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && x.ReadingSetType == readingPeriodSet.ReadingSetType && needAddVisitIds.Contains(x.SubjectVisitId)).Select(x => x.Subject.Code + "的" + x.SubjectVisit.VisitName).ToList();
if (repeatVisitNames.Count != 0)
{
return ResponseOutput.NotOk($"{string.Join(",", repeatVisitNames)}已经添加过阅片期,无法设置生效");
}
@ -350,7 +174,7 @@ namespace IRaCIS.Application.Services
VisitNum = item.SubjectVisit.VisitNum,
//增加标准
TrialReadingCriterionId=readingPeriodSet.TrialReadingCriterionId
TrialReadingCriterionId = readingPeriodSet.TrialReadingCriterionId
});
};
@ -361,8 +185,8 @@ namespace IRaCIS.Application.Services
{
case ReadingSetType.ImageReading:
//增加标准
var taskInfoList = await _visitTaskRepository.Where(x =>x.TrialReadingCriterionId==readingPeriodSet.TrialReadingCriterionId && subjectVisitIds.Contains(x.SourceSubjectVisitId ?? default(Guid)) &&
x.TaskState==TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate).ToListAsync();
var taskInfoList = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && subjectVisitIds.Contains(x.SourceSubjectVisitId ?? default(Guid)) &&
x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate).ToListAsync();
foreach (var item in taskInfoList)
{
@ -394,23 +218,23 @@ namespace IRaCIS.Application.Services
case ReadingSetType.TumorReading:
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == readingPeriodSet.TrialReadingCriterionId).Select(x => new
{
x.ReadingType,
}).FirstNotNullAsync();
//增加标准
var globalModuleIds = await _readModuleRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && subjectVisitIds.Contains(x.SubjectVisitId) && x.ModuleType == ModuleTypeEnum.Global).Select(x => x.Id).ToListAsync();
//增加标准
var globalTaskInfo = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && globalModuleIds.Contains(x.SouceReadModuleId ?? default(Guid)) && x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned&&!x.IsAnalysisCreate).GroupBy(x=> new { x.SouceReadModuleId }).Select(x =>
new {
SouceReadModuleId=x.Key.SouceReadModuleId,
Count=x.ToList().Count,
TaskId = x.Select(x=>x.Id).FirstOrDefault(),
var globalTaskInfo = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId == readingPeriodSet.TrialReadingCriterionId && globalModuleIds.Contains(x.SouceReadModuleId ?? default(Guid)) && x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && !x.IsAnalysisCreate).GroupBy(x => new { x.SouceReadModuleId }).Select(x =>
new {
SouceReadModuleId = x.Key.SouceReadModuleId,
Count = x.ToList().Count,
TaskId = x.Select(x => x.Id).FirstOrDefault(),
ReadModuleId = x.Select(x => x.SouceReadModuleId).FirstOrDefault(),
JudgeTaskId = x.Select(x => x.JudgeVisitTaskId).FirstOrDefault(),
JudgeTaskResultId = x.Select(x => x.JudgeVisitTask.JudgeResultTaskId).FirstOrDefault(),
@ -490,18 +314,215 @@ namespace IRaCIS.Application.Services
/// <summary>
/// 删除
/// </summary>
/// <param name="readingPeriodSetId"></param>
/// <returns></returns>
[HttpDelete("{readingPeriodSetId:guid}")]
public async Task<IResponseOutput> DeleteReadingPeriodSet(Guid readingPeriodSetId)
{
await _readingPeriodSetRepository.DeleteFromQueryAsync(t => t.Id == readingPeriodSetId,true);
await _readingPeriodPlanRepository.DeleteFromQueryAsync(t => t.ReadingPeriodSetId == readingPeriodSetId, true);
#endregion
return ResponseOutput.Ok();
#region 阅片计划 相关
/// <summary>
/// 获取选中的计划 (增加标准不影响 因为阅片期设置关联了标准)
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageOutput<PreviewTheReadingListOutDto>> GetPreviewTheReadingPlanList(PreviewTheReadingListDto inDto)
{
var plans = _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId).Include(x => x.SubjectVisit).Include(x => x.SubjectVisit.TrialSite).Include(x => x.SubjectVisit.Subject)
.Include(x => x.ReadingPeriodSet).Select(x => new PreviewTheReadingListOutDto
{
Id = x.Id,
ExpirationDate = x.ReadingPeriodSet.ExpirationDate,
SubjectVisitId = x.SubjectVisitId,
TrialSiteCode = x.SubjectVisit.TrialSite.TrialSiteCode,
LatestScanDate = x.SubjectVisit.LatestScanDate,
ReadingPeriodName = x.ReadingPeriodSet.ReadingPeriodName,
ReadingPeriodSetId = x.ReadingPeriodSetId,
SubjectCode = x.SubjectVisit.Subject.Code,
SubjectId = x.SubjectVisit.SubjectId,
SubjectVisitName = x.SubjectVisit.VisitName,
EffectOfTime = x.ReadingPeriodSet.EffectOfTime,
});
return await plans.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField == null ? nameof(PreviewTheReadingListOutDto.SubjectId) : inDto.SortField,
inDto.Asc);
}
/// <summary>
/// 添加对应的阅片计划 (后续生效将计划变为模块) (增加标准不影响 因为阅片期设置关联了标准)
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<IResponseOutput> GenerateReadingTask(ReadingToGenerateInDto inDto)
{
List<ReadingPeriodPlan> plans = new List<ReadingPeriodPlan>();
inDto.SubjectVisitIds.ForEach(x =>
{
plans.Add(new ReadingPeriodPlan()
{
SubjectVisitId = x,
ReadingPeriodSetId = inDto.ReadingPeriodSetId
});
});
await _readingPeriodPlanRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId);
await _readingPeriodPlanRepository.SaveChangesAsync();
await _readingPeriodPlanRepository.AddRangeAsync(plans);
var result = await _readingPeriodPlanRepository.SaveChangesAsync();
return ResponseOutput.Result(result);
}
#endregion
#region 阅片期相关查询
/// <summary>
/// 分页获取 (增加标准搜索,已修改)
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageOutput<ReadingPeriodSetView>> GetReadingPeriodSetList(ReadingPeriodSetQuery query)
{
var readQuery = _readingPeriodSetRepository.Where(t => t.TrialId == query.TrialId).Include(x => x.ReadingPeriodSites)
.WhereIf(query.ReadingPeriodName != null, x => x.ReadingPeriodName.Contains(query.ReadingPeriodName!))
.WhereIf(query.TrialReadingCriterionId != null, x => x.TrialReadingCriterionId == query.TrialReadingCriterionId)
.ProjectTo<ReadingPeriodSetView>(_mapper.ConfigurationProvider);
var pageList = await readQuery.ToPagedListAsync(query.PageIndex, query.PageSize, query.SortField == null ? nameof(ReadingPeriodSetView.CreateTime) : query.SortField,
query.Asc);
pageList.CurrentPageData.ForEach(x =>
{
x.SubjectVisitName = x.IsGlobal ? "末次访视" : x.SubjectVisitName;
});
return pageList;
}
/// <summary>
/// 获取单条
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost("{id:guid}")]
public async Task<ReadingPeriodSetView> GetReadingPeriodSet(Guid id)
{
return await _readingPeriodSetRepository.AsQueryable().Include(x => x.ReadingPeriodSites).Where(x => x.Id == id).ProjectTo<ReadingPeriodSetView>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
}
/// <summary>
/// 获取阅片期配置的截至访视的下拉框 (增加标准搜索,已修改)
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<GetReadingVisitListOutDto>> GetReadingVisitList(GetReadingVisitListInDto inDto)
{
var maxVisitNum = await _readingPeriodSetRepository
.WhereIf(inDto.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId)
.Where(x => x.TrialId == inDto.TrialId && x.ReadingSetType == inDto.ReadingSetType && x.IsTakeEffect == ReadingPeriodStatus.TakeEffect)
.MaxAsync(x => x.ExpirationVisitNum) ?? 0;
var thisVisitNum = await _readingPeriodSetRepository.Where(x => x.Id == inDto.ReadingPeriodSetId).Select(x => x.ExpirationVisitNum).FirstOrDefaultAsync() ?? -1;
var globalVisitNum = new List<decimal>();
if (inDto.ReadingSetType == ReadingSetType.TumorReading)
{
globalVisitNum = await _readModuleRepository
.WhereIf(inDto.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId)
.Where(x => x.ReadingSetType == ReadingSetType.ImageReading && x.TrialId == inDto.TrialId).Select(x => x.VisitNum).Distinct().ToListAsync();
}
List<GetReadingVisitListOutDto> result = await _visitStageRepository.Where(x => x.TrialId == inDto.TrialId)
.WhereIf(inDto.ReadingSetType == ReadingSetType.TumorReading, x => globalVisitNum.Contains(x.VisitNum))
.Where(x => x.VisitNum == thisVisitNum || x.VisitNum >= maxVisitNum).Select(x => new GetReadingVisitListOutDto()
{
VisitName = x.VisitName,
VisitNum = x.VisitNum,
VisitStageId = x.Id,
}).ToListAsync();
return result;
}
/// <summary>
/// 获取影像阅片的预览 // 需要清除之前已经选中的 (增加标准搜索,已修改)
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<PageOutput<PreviewTheReadingListOutDto>> GetPreviewTheReadingList(PreviewTheReadingListInDto inDto)
{
var readModulequery = _readModuleRepository.AsQueryable();
// 当前项目 最晚拍片日期不为null 中心筛选
var visitQuery = _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId && x.LatestScanDate != null && !x.IsLostVisit)
.WhereIf(inDto.ReadingScope == ReadingScopeEnum.Site, x => inDto.SiteIds.Contains(x.SiteId));
// 已经存在的访视 需要排除
var existsBubjectVisitsQuery = _readModuleRepository.Where(y => y.ReadingSetType == inDto.ReadingSetType && y.TrialId == inDto.TrialId && y.TrialReadingCriterionId == inDto.TrialReadingCriterionId).Select(x => x.SubjectVisitId);
visitQuery = visitQuery.Where(x => !existsBubjectVisitsQuery.Contains(x.Id))
.WhereIf(inDto.ExpirationDate != null, x => x.LatestScanDate <= inDto.ExpirationDate.Value)
.WhereIf(inDto.ExpirationVisitNum != null, x => x.VisitNum == inDto.ExpirationVisitNum)
.WhereIf(inDto.ReadingSetType == ReadingSetType.TumorReading, x => readModulequery.Where(y => y.SubjectVisitId == x.Id && y.ReadingSetType == ReadingSetType.ImageReading).Count() > 0);
var subjectIdlist = await visitQuery.OrderBy(x => x.SubjectId).Select(x => x.SubjectId).Distinct().Skip((inDto.PageIndex - 1) * inDto.PageSize).Take(inDto.PageSize).ToListAsync();
var totalCount = visitQuery.Select(x => x.SubjectId).Distinct().Count();
var visitlist = await visitQuery.Include(x => x.Subject).Include(x => x.TrialSite).Where(x => subjectIdlist.Contains(x.SubjectId)).ToListAsync();
var subjectVisits = visitlist.GroupBy(x => x.SubjectId).Select(x => new
{
SubjectId = x.Key,
Visits = x.ToList()
});
List<SubjectVisit> visits = new List<SubjectVisit>();
subjectVisits.ForEach(x =>
{
var visit = x.Visits.OrderByDescending(x => x.VisitNum).FirstOrDefault();
if (visit != null)
{
visits.Add(visit);
}
});
PageOutput<PreviewTheReadingListOutDto> result = new PageOutput<PreviewTheReadingListOutDto>()
{
CurrentPageData = visits
.Select(x => new PreviewTheReadingListOutDto
{
ExpirationDate = inDto.ExpirationDate,
SubjectVisitId = x.Id,
TrialSiteCode = x.TrialSite.TrialSiteCode,
LatestScanDate = x.LatestScanDate,
ReadingPeriodName = inDto.ReadingPeriodName,
SubjectCode = x.Subject.Code,
SubjectId = x.SubjectId,
SubjectVisitName = x.VisitName,
}).ToList(),
PageSize = inDto.PageSize,
PageIndex = inDto.PageIndex,
TotalCount = totalCount,
};
return result;
}
#endregion
}
}