326 lines
14 KiB
C#
326 lines
14 KiB
C#
using IRaCIS.Application.Interfaces;
|
|
using IRaCIS.Core.Infra.EFCore;
|
|
using IRaCIS.Core.Domain.Share;
|
|
using IRaCIS.Core.Application.Filter;
|
|
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 IRaCIS.Core.Domain.Share.Reading;
|
|
using MassTransit;
|
|
using IRaCIS.Core.Infra.EFCore.Common;
|
|
|
|
namespace IRaCIS.Application.Services
|
|
{
|
|
/// <summary>
|
|
/// 阅片期配置
|
|
/// </summary>
|
|
[ApiExplorerSettings(GroupName = "Reading")]
|
|
public class ReadingPeriodSetService : BaseService
|
|
{
|
|
|
|
public IRepository<SubjectVisit> _subjectVisitRepository;
|
|
private readonly IRepository<ReadingPeriodSet> _readingPeriodSetRepository;
|
|
private readonly IRepository<ReadModule> _readModuleRepository;
|
|
private readonly IRepository<ReadingPeriodPlan> _readingPeriodPlanRepository;
|
|
private readonly IRepository<Site> _siteSetRepository;
|
|
|
|
public ReadingPeriodSetService(IRepository<SubjectVisit> subjectVisitRepository,
|
|
IRepository<ReadingPeriodSet> ReadingPeriodSetRepository,
|
|
IRepository<ReadModule> readModuleRepository,
|
|
IRepository<ReadingPeriodPlan> readingPeriodPlanRepository,
|
|
IRepository<Site> SiteSetRepository
|
|
)
|
|
{
|
|
_subjectVisitRepository = subjectVisitRepository;
|
|
_readingPeriodSetRepository = ReadingPeriodSetRepository;
|
|
this._readModuleRepository = readModuleRepository;
|
|
this._readingPeriodPlanRepository = readingPeriodPlanRepository;
|
|
_siteSetRepository = SiteSetRepository;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 新增或者修改
|
|
/// </summary>
|
|
/// <param name="addOrEditReadingPeriodSet"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<IResponseOutput> AddOrUpdateReadingPeriodSet(ReadingPeriodSetAddOrEdit addOrEditReadingPeriodSet)
|
|
{
|
|
if (addOrEditReadingPeriodSet.Id == null)
|
|
{
|
|
var entity = _mapper.Map<ReadingPeriodSet>(addOrEditReadingPeriodSet);
|
|
entity.ReadingPeriodSites = addOrEditReadingPeriodSet.SiteIds.Select(x => new ReadingPeriodSite()
|
|
{
|
|
ReadingPeriodSetId = entity.Id,
|
|
TrialId =entity.TrialId,
|
|
SiteId = x,
|
|
}).ToList();
|
|
|
|
entity.ReadingPeriodPlanList = addOrEditReadingPeriodSet.SubjectVisitIds.Select(x => new ReadingPeriodPlan
|
|
{
|
|
ReadingPeriodSetId = entity.Id,
|
|
SubjectVisitId=x,
|
|
}).ToList();
|
|
await _readingPeriodSetRepository.AddAsync(entity, true);
|
|
return ResponseOutput.Ok(entity.Id);
|
|
}
|
|
else
|
|
{
|
|
var entity = (await _readingPeriodSetRepository.Where(t => t.Id == addOrEditReadingPeriodSet.Id, true).Include(t => t.ReadingPeriodSites).Include(x=>x.ReadingPeriodPlanList).FirstOrDefaultAsync()).IfNullThrowException();
|
|
_mapper.Map(addOrEditReadingPeriodSet, entity);
|
|
|
|
entity.ReadingPeriodSites = addOrEditReadingPeriodSet.SiteIds.Select(x => new ReadingPeriodSite()
|
|
{
|
|
ReadingPeriodSetId = entity.Id,
|
|
TrialId = entity.TrialId,
|
|
SiteId = x,
|
|
}).ToList();
|
|
|
|
entity.ReadingPeriodPlanList = addOrEditReadingPeriodSet.SubjectVisitIds.Select(x => new ReadingPeriodPlan
|
|
{
|
|
ReadingPeriodSetId = entity.Id,
|
|
SubjectVisitId = x,
|
|
}).ToList();
|
|
|
|
var success = await _readingPeriodSetRepository.SaveChangesAsync();
|
|
return ResponseOutput.Ok(entity.Id);
|
|
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取影像阅片的预览 // 需要清除之前已经选中的
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<PageOutput<PreviewTheReadingListOutDto>> GetPreviewTheReadingList(PreviewTheReadingListInDto inDto)
|
|
{
|
|
//if (await _readingPeriodPlanRepository.AnyAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId))
|
|
//{
|
|
// await _readingPeriodPlanRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == inDto.ReadingPeriodSetId);
|
|
// await _readingPeriodPlanRepository.SaveChangesAsync();
|
|
//}
|
|
|
|
|
|
//var readSet = (await _readingPeriodSetRepository.Where(x => x.Id == inDto.ReadingPeriodSetId).Include(x => x.ReadingPeriodSites).FirstOrDefaultAsync()).IfNullThrowException();
|
|
|
|
|
|
var visitQuery = _subjectVisitRepository.Where(x => x.TrialId == inDto.TrialId && x.InPlan&&x.LatestScanDate!=null);
|
|
if (inDto.SiteIds.Count!=0)
|
|
{
|
|
|
|
visitQuery = visitQuery.Where(x => inDto.SiteIds.Contains(x.SiteId));
|
|
}
|
|
visitQuery = visitQuery.WhereIf(inDto.ExpirationDate != null, x => x.LatestScanDate <= inDto.ExpirationDate.Value)
|
|
.WhereIf(inDto.ExpirationVisitNum != null, x => x.VisitNum == inDto.ExpirationVisitNum);
|
|
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,
|
|
Visit = x.ToList()
|
|
});
|
|
|
|
|
|
// 这地方用分页报错
|
|
//var visitListQuery = visitQuery.GroupBy(x => x.SubjectId).Select(x => new
|
|
//{
|
|
// SubjectId = x.Key,
|
|
// Visit = x.ToList()
|
|
//});
|
|
// var subjectVisits = await visitListQuery.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField == null ? "SubjectId" : inDto.SortField,
|
|
// inDto.Asc);
|
|
|
|
List<SubjectVisit> visits = new List<SubjectVisit>();
|
|
subjectVisits.ForEach(x =>
|
|
{
|
|
var visit = x.Visit.OrderByDescending(x => x.VisitNum).FirstOrDefault();
|
|
if (visit != null)
|
|
{
|
|
visits.Add(visit);
|
|
}
|
|
});
|
|
|
|
|
|
PageOutput<PreviewTheReadingListOutDto> result = new PageOutput<PreviewTheReadingListOutDto>()
|
|
{
|
|
CurrentPageData = visits
|
|
//Where(x => _readModuleRepository.Where(y => y.ReadingSetType == readSet.ReadingSetType && x.Id == y.SubjectVisitId).Count() == 0)
|
|
.Select(x => new PreviewTheReadingListOutDto
|
|
{
|
|
ExpirationDate = inDto.ExpirationDate,
|
|
SubjectVisitId = x.Id,
|
|
TrialSiteCode = x.TrialSite.TrialSiteCode,
|
|
LatestScanDate = x.LatestScanDate,
|
|
ReadingPeriodName = inDto.ReadingPeriodName,
|
|
//ReadingPeriodSetId = readSet.Id,
|
|
SubjectCode = x.Subject.Code,
|
|
SubjectId = x.SubjectId,
|
|
SubjectVisitName = x.VisitName,
|
|
//Remark= readset.Remark
|
|
}).ToList(),
|
|
PageSize = inDto.PageSize,
|
|
PageIndex = inDto.PageIndex,
|
|
TotalCount = totalCount,
|
|
|
|
};
|
|
return result;
|
|
}
|
|
|
|
/// <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,
|
|
});
|
|
|
|
return await plans.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField == null ? "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.AsQueryable().Include(x=>x.ReadingPeriodSites)
|
|
.WhereIf(query.TrialId!=null,x=>x.TrialId==query.TrialId)
|
|
.WhereIf(query.ReadingPeriodName != null, x => x.ReadingPeriodName.Contains(query.ReadingPeriodName))
|
|
.ProjectTo<ReadingPeriodSetView>(_mapper.ConfigurationProvider);
|
|
var pageList= await readQuery.ToPagedListAsync(query.PageIndex, query.PageSize, query.SortField == null ? "CreateTime" : query.SortField,
|
|
query.Asc);
|
|
return pageList;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 获取单条
|
|
/// </summary>
|
|
/// <param name="id"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("{id:guid}")]
|
|
public async Task<ReadingPeriodSetView> GetReadingPeriodSet(Guid id)
|
|
{
|
|
var data = await _readingPeriodSetRepository.AsQueryable().Include(x => x.ReadingPeriodSites).Where(x => x.Id == id).ProjectTo<ReadingPeriodSetView>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 设置阅片期配置是否生效
|
|
/// </summary>
|
|
/// <param name="indto"></param>
|
|
/// <returns></returns>
|
|
[HttpPut]
|
|
public async Task<IResponseOutput> SetReadingPeriodSetEffect(SetReadingPeriodSetEffect indto)
|
|
{
|
|
if (indto.IsTakeEffect == ReadingPeriodStatus.TakeEffect)
|
|
{
|
|
var plans = _readingPeriodPlanRepository.Where(x => x.ReadingPeriodSetId == indto.Id).Include(x=>x.SubjectVisit)
|
|
.Include(x => x.ReadingPeriodSet).ToList();
|
|
var needAddVisitIds = plans.Select(x => x.SubjectVisitId).ToList();
|
|
var repeatVisitNames = _readModuleRepository.Where(x => x.ReadingSetType == ReadingSetType.ImageReading && needAddVisitIds.Contains(x.SubjectVisitId)).Select(x => x.SubjectVisit.VisitName).ToList();
|
|
if(repeatVisitNames.Count!=0)
|
|
{
|
|
return ResponseOutput.NotOk($"{string.Join(",", repeatVisitNames)}已经添加过阅片期,无法设置生效");
|
|
}
|
|
|
|
List<ReadModule> readModules = new List<ReadModule>();
|
|
foreach (var item in plans)
|
|
{
|
|
readModules.Add(new ReadModule()
|
|
{
|
|
Id = NewId.NextGuid(),
|
|
SubjectId = item.SubjectVisit.SubjectId,
|
|
ModuleType = item.ReadingPeriodSet.ReadingSetType == ReadingSetType.ImageReading ? ModuleTypeEnum.Read : ModuleTypeEnum.Oncology,
|
|
IsUrgent = item.SubjectVisit.IsUrgent,
|
|
ModuleName = item.ReadingPeriodSet.ReadingPeriodName,
|
|
SubjectVisitId = item.SubjectVisitId,
|
|
ReadingSetType = item.ReadingPeriodSet.ReadingSetType,
|
|
ReadingPeriodSetId= item.ReadingPeriodSet.Id,
|
|
Status = ReadingCommon.GetVisitSubmitStateEnum(item.SubjectVisit),
|
|
});
|
|
};
|
|
|
|
await _readModuleRepository.AddRangeAsync(readModules);
|
|
}
|
|
else
|
|
{
|
|
await _readModuleRepository.DeleteFromQueryAsync(x => x.ReadingPeriodSetId == indto.Id);
|
|
}
|
|
|
|
var readQuery =await _readingPeriodSetRepository.UpdatePartialFromQueryAsync(indto.Id, x => new ReadingPeriodSet() {
|
|
IsTakeEffect = indto.IsTakeEffect
|
|
});
|
|
|
|
var result = await _readingPeriodSetRepository.SaveChangesAsync();
|
|
return ResponseOutput.Result(result);
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 删除
|
|
/// </summary>
|
|
/// <param name="readingPeriodSetId"></param>
|
|
/// <returns></returns>
|
|
[HttpDelete("{readingPeriodSetId:guid}")]
|
|
public async Task<IResponseOutput> DeleteReadingPeriodSet(Guid readingPeriodSetId)
|
|
{
|
|
|
|
var success = await _repository.BatchDeleteAsync<ReadingPeriodSet>(t => t.Id == readingPeriodSetId);
|
|
return ResponseOutput.Result(success);
|
|
}
|
|
}
|
|
}
|