using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Infra.EFCore.Common; using MassTransit; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Application.Service.Reading.Dto; using Panda.DynamicWebApi.Attributes; namespace IRaCIS.Core.Application.Service.RC { [ApiExplorerSettings(GroupName = "Reading")] public class ReadingQuestionService : BaseService { private readonly IRepository _readingQuestionCriterionSystemRepository; private readonly IRepository _readingQuestionCriterionTrialRepository; private readonly IRepository _readingQuestionTrialRepository; private readonly IRepository _readingTaskQuestionAnswer; private readonly IRepository _readingCriterionPageRepository; private readonly IRepository _readingCriterionDictionaryRepository; private readonly IRepository _readingTrialCriterionDictionaryRepository; private readonly IRepository _visitTaskRepository; private readonly IRepository _systemCriterionDictionaryCodeRepository; private readonly IRepository _readingTableQuestionAnswerRepository; private readonly IRepository _readingTableAnswerRowInfoRepository; private readonly IRepository _readingTableQuestionTrialRepository; public ReadingQuestionService( IRepository readingQuestionCriterionSystemRepository, IRepository readingQuestionCriterionTrialRepository, IRepository readingQuestionTrialRepository, IRepository readingCriterionDictionaryRepository, IRepository readingTrialCriterionDictionaryRepository, IRepository visitTaskRepository, IRepository systemCriterionDictionaryCodeRepository, IRepository readingTableQuestionTrialRepository, IRepository readingTableQuestionAnswerRepository, IRepository readingTableAnswerRowInfoRepository, IRepository readingTaskQuestionAnswer, IRepository readingCriterionPageRepository) { this._readingQuestionCriterionSystemRepository = readingQuestionCriterionSystemRepository; this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository; this._readingQuestionTrialRepository = readingQuestionTrialRepository; this._readingTableQuestionTrialRepository = readingTableQuestionTrialRepository; this._readingCriterionPageRepository = readingCriterionPageRepository; this._readingCriterionDictionaryRepository = readingCriterionDictionaryRepository; this._readingTrialCriterionDictionaryRepository = readingTrialCriterionDictionaryRepository; this._visitTaskRepository = visitTaskRepository; this._systemCriterionDictionaryCodeRepository = systemCriterionDictionaryCodeRepository; this._readingTableQuestionAnswerRepository = readingTableQuestionAnswerRepository; this._readingTableAnswerRowInfoRepository = readingTableAnswerRowInfoRepository; this._readingTaskQuestionAnswer = readingTaskQuestionAnswer; } /// /// 删除系统标准字典Code /// /// /// [HttpPost] public async Task DeleteSystemCriterionDictionary(DeleteSystemCriterionDictionaryIndto inDto) { var criterionDictionaryCode= await _systemCriterionDictionaryCodeRepository.Where(x => x.Id == inDto.Id).FirstNotNullAsync(); await _readingCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(x => x.ParentCode == criterionDictionaryCode.Code && x.CriterionId == criterionDictionaryCode.SystemCriterionId); await _systemCriterionDictionaryCodeRepository.DeleteFromQueryAsync(inDto.Id); await _systemCriterionDictionaryCodeRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// /// 添加系统标准字典Code /// /// /// [HttpPost] public async Task AddSystemCriterionDictionaryCode(AddSystemCriterionDictionaryCodeInDto inDto) { //var codes= await _systemCriterionDictionaryCodeRepository.Where(x => x.SystemCriterionId == inDto.SystemCriterionId).Select(x => x.Code).ToListAsync(); //inDto.CodeList= inDto.CodeList.Except(codes).ToList(); await _systemCriterionDictionaryCodeRepository.BatchDeleteNoTrackingAsync(x => x.SystemCriterionId == inDto.SystemCriterionId); await _systemCriterionDictionaryCodeRepository.AddRangeAsync(inDto.CodeList.Select(x=> new SystemCriterionDictionaryCode() { SystemCriterionId = inDto.SystemCriterionId, Code = x }).ToList()); await _systemCriterionDictionaryCodeRepository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// /// 重置项目标准的重置状态 /// /// 项目标准Id /// [HttpPost] public async Task ResetTrialCriterionAsyncState(Guid trialReadingCriterionId) { await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(x => x.Id == trialReadingCriterionId, x => new ReadingQuestionCriterionTrial { SynchronizeOriginalTime = null, SynchronizeTime = DateTime.Now.AddYears(-20), IsSigned=false, ReadingInfoSignTime=null, }); return ResponseOutput.Ok(); } /// /// 设置系统全局阅片阅片信息 /// /// /// [HttpPost] [UnitOfWork] public async Task SetSystemGlobalInfo(SetSystemGlobalInfoInDto inDto) { await _readingCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(x => x.CriterionId == inDto.SystemCriterionId && x.ParentCode == ReadingCommon.CriterionDictionary.GlobalAssess); await _readingCriterionDictionaryRepository.AddRangeAsync(inDto.DictionaryList.Select(x => new ReadingSystemCriterionDictionary { CriterionId = inDto.SystemCriterionId, DictionaryId = x.DictionaryId, IsSystemCriterion = true, ParentCode = ReadingCommon.CriterionDictionary.GlobalAssess, IsBaseLineUse=x.IsBaseLineUse, IsFollowVisitUse=x.IsFollowVisitUse, })); await _readingQuestionCriterionSystemRepository.UpdatePartialFromQueryAsync(inDto.SystemCriterionId, x => new ReadingQuestionCriterionSystem() { IsMustGlobalReading = inDto.IsMustGlobalReading }); var result = await _readingQuestionCriterionTrialRepository.SaveChangesAsync(); return ResponseOutput.Ok(result); } /// /// 获取系统全局阅片信息 /// /// /// [HttpPost] public async Task GetSystemGlobalInfo(GetSystemOncologyInfoInDto inDto) { GetSystemGlobalInfoOutDto result = new GetSystemGlobalInfoOutDto() { IsMustGlobalReading = await _readingQuestionCriterionSystemRepository.Where(x => x.Id == inDto.SystemCriterionId).Select(x => x.IsMustGlobalReading).FirstOrDefaultAsync(), DictionaryList = await _readingCriterionDictionaryRepository.AsQueryable().Where(x => x.CriterionId == inDto.SystemCriterionId && x.ParentCode == ReadingCommon.CriterionDictionary.GlobalAssess) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync() }; return result; } /// /// 获取系统肿瘤信息 /// /// /// [HttpPost] public async Task GetSystemOncologyInfo(GetSystemOncologyInfoInDto inDto) { GetSystemOncologyInfoOutDto result = new GetSystemOncologyInfoOutDto() { IsOncologyReading = await _readingQuestionCriterionSystemRepository.Where(x => x.Id == inDto.SystemCriterionId).Select(x => x.IsOncologyReading).FirstOrDefaultAsync(), DictionaryList = await _readingCriterionDictionaryRepository.AsQueryable().Where(x => x.CriterionId == inDto.SystemCriterionId && x.ParentCode == ReadingCommon.CriterionDictionary.OncologyAssess) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync() }; return result; } /// /// 设置系统肿瘤学阅片信息 /// /// /// [HttpPost] [UnitOfWork] public async Task SetSystemOncologyInfo(SetSystemOncologyInfoInDto inDto) { await _readingCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(x => x.CriterionId == inDto.SystemCriterionId && x.ParentCode == ReadingCommon.CriterionDictionary.OncologyAssess); await _readingCriterionDictionaryRepository.AddRangeAsync(inDto.DictionaryIds.Select(x => new ReadingSystemCriterionDictionary { CriterionId = inDto.SystemCriterionId, DictionaryId = x, IsSystemCriterion = true, ParentCode = ReadingCommon.CriterionDictionary.OncologyAssess })); await _readingQuestionCriterionSystemRepository.UpdatePartialFromQueryAsync(inDto.SystemCriterionId, x => new ReadingQuestionCriterionSystem() { IsOncologyReading = inDto.IsOncologyReading }); var result = await _readingQuestionCriterionTrialRepository.SaveChangesAsync(); return ResponseOutput.Ok(result); } #region 系统标准 /// /// 获取获取系统阅片标准下拉 /// /// [HttpPost] public async Task> GetSystemCriterionList() { List result = await _readingQuestionCriterionSystemRepository.Select(x => new GetSystemCriterionListOutDto() { CriterionId = x.Id, CriterionName = x.CriterionName, }).ToListAsync(); return result; } /// /// 获取系统问题标准 /// /// [HttpPost] public async Task> GetReadingQuestionCriterionSystemList(ReadingQuestionCriterionSystemViewInDto inDto) { //await AddSystemQuestionCriterion(); var query = _readingQuestionCriterionSystemRepository.AsQueryable() .WhereIf(!inDto.CriterionName.IsNullOrEmpty(), x => x.CriterionName.Contains(inDto.CriterionName)) .ProjectTo(_mapper.ConfigurationProvider); return await query.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField.IsNullOrEmpty() ? nameof(ReadingQuestionCriterionSystemView.ShowOrder) : inDto.SortField, inDto.Asc); } /// /// 获取系统问题标准下拉 /// /// [HttpPost] public async Task> GetSystemCriterionSelectList() { var criterionList = await _readingQuestionCriterionSystemRepository.AsQueryable() .OrderBy(x => x.ShowOrder) .Select(x => new GetSystemCriterionSelectDto() { Id = x.Id, CriterionName = x.CriterionName, }).ToListAsync(); return criterionList; } /// /// 新增修改系统问题标准 /// /// /// [HttpPost] public async Task AddOrUpdateReadingQuestionCriterionSystem(AddOrUpdateReadingQuestionCriterionSystemInDto indto) { var entity = await _readingQuestionCriterionSystemRepository.InsertOrUpdateAsync(indto, true); if (indto.Id != null) { await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(x => x.ReadingQuestionCriterionSystemId == indto.Id, x => new ReadingQuestionCriterionTrial() { CriterionName = indto.CriterionName, CriterionType = indto.CriterionType, }); } return ResponseOutput.Ok(entity.Id.ToString()); } /// /// 删除系统问题标准 /// /// /// [HttpDelete("{id:guid}")] public async Task DeleteReadingQuestionCriterionSystem(Guid id) { if (await _readingQuestionCriterionTrialRepository.AnyAsync(x => x.IsConfirm && x.ReadingQuestionCriterionSystemId == id)) { //---当前标准被引用过了,不可以删除 throw new BusinessValidationFailedException(_localizer["ReadingCriterion_Referenced"]); } await _readingQuestionCriterionSystemRepository.DeleteFromQueryAsync(t => t.Id == id); var success = await _readingQuestionCriterionSystemRepository.SaveChangesAsync(); return ResponseOutput.Result(success); } /// /// 设置系统问题标准是否完成配置 /// /// /// public async Task SetSystemReadingQuestionCriterionIsCompleteConfig(SetSystemReadingQuestionCriterionIsIsCompleteConfig inDto) { if (!inDto.IsCompleteConfig) { var trialCriterionIds = await _readingQuestionCriterionTrialRepository.Where(x => x.ReadingQuestionCriterionSystemId == inDto.Id).Select(x => x.Id).ToListAsync(); if (await _readingTaskQuestionAnswer.AnyAsync(x => trialCriterionIds.Contains(x.ReadingQuestionCriterionTrialId))) { //---此标准在项目里面已被使用,操作失败 return ResponseOutput.NotOk(_localizer["ReadingCriterion_InUse"]); } } var systemCriterion = await _readingQuestionCriterionSystemRepository.Where(x => x.Id == inDto.Id).AsNoTracking().FirstOrDefaultAsync(); var confirmTime = systemCriterion.ConfirmTime; if (inDto.IsCompleteConfig) { confirmTime = DateTime.Now; } await _readingQuestionCriterionSystemRepository.UpdatePartialFromQueryAsync(inDto.Id, x => new ReadingQuestionCriterionSystem() { IsCompleteConfig = inDto.IsCompleteConfig, ConfirmTime = confirmTime, }); if (inDto.IsCompleteConfig) { //await SynchronizeSystemCriterion(inDto.Id); } else { await _readingQuestionCriterionTrialRepository.BatchUpdateNoTrackingAsync(x => x.ReadingQuestionCriterionSystemId == inDto.Id, x => new ReadingQuestionCriterionTrial() { IsCompleteConfig = inDto.IsCompleteConfig }); } var result = await _readingQuestionCriterionSystemRepository.SaveChangesAsync(); return ResponseOutput.Ok(result); } #endregion #region 项目标准 /// /// 获取项目裁判信息 /// /// /// [HttpPost] public async Task GetTrialJudgyInfo(GetTrialJudgyInfoInDto inDto) { GetTrialJudgyInfoOutDto result = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).Select(x => new GetTrialJudgyInfoOutDto { TrialId = x.TrialId, IsReadingTaskViewInOrder = x.IsReadingTaskViewInOrder, ArbitrationRule = x.ArbitrationRule, IsArbitrationReading = x.IsArbitrationReading }).FirstNotNullAsync(); return result; } /// /// 新增修改项目问题标准(项目) /// /// /// [HttpPost] public async Task AddOrUpdateReadingQuestionCriterionTrial(AddOrUpdateReadingQuestionCriterionTrialInDto indto) { var entity = await _readingQuestionCriterionTrialRepository.InsertOrUpdateAsync(indto, true); return ResponseOutput.Ok(entity.Id.ToString()); } /// /// 设置项目标准是否完成配置 /// /// /// public async Task SetTrialReadingQuestionCriterionIsIsCompleteConfig(SetSystemReadingQuestionCriterionIsIsCompleteConfig inDto) { await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.Id, x => new ReadingQuestionCriterionTrial() { IsCompleteConfig = inDto.IsCompleteConfig }); var result = await _readingQuestionCriterionTrialRepository.SaveChangesAsync(); return ResponseOutput.Ok(result); } /// /// 获取项目问题标准(项目) /// /// [HttpPost] public async Task> GetReadingQuestionCriterionTrialList(ReadingQuestionCriterionTrialViewInDto inDto) { await AddSystemDataToTrila(inDto.TrialId); var query = _readingQuestionCriterionTrialRepository.AsQueryable() .Where(x => x.TrialId == inDto.TrialId) .Where(x => (x.ReadingQuestionCriterionSystemId != null && x.IsEnable) || x.ReadingQuestionCriterionSystemId == null) .WhereIf(!inDto.CriterionName.IsNullOrEmpty(), x => x.CriterionName.Contains(inDto.CriterionName)) .ProjectTo(_mapper.ConfigurationProvider); return await query.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField.IsNullOrEmpty() ? nameof(ReadingQuestionCriterionTrialView.ShowOrder) : inDto.SortField, inDto.Asc); } /// /// 删除项目问题标准(项目) /// /// /// [HttpDelete("{id:guid}")] public async Task DeleteReadingQuestionCriterionTrial(Guid id) { await _readingQuestionCriterionTrialRepository.DeleteFromQueryAsync(t => t.Id == id); var success = await _readingQuestionCriterionTrialRepository.SaveChangesAsync(); return ResponseOutput.Result(success); } /// /// 设置项目裁判信息 /// /// /// [HttpPost] public async Task SetTrialJudgyInfo(SetTrialJudgyInfoInDto inDto) { var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == inDto.TrialId && x.Id == inDto.TrialReadingCriterionId).FirstOrDefaultAsync(); var judgeCount = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == trialCriterion.Id && x.IsJudgeQuestion) .WhereIf(trialCriterion.FormType == FormType.SinglePage, x => x.ReadingCriterionPageId == null) .WhereIf(trialCriterion.FormType == FormType.MultiplePage, x => x.ReadingCriterionPageId != null).CountAsync(); if (judgeCount == 0 && (inDto.ArbitrationRule == ArbitrationRule.Visit || inDto.ArbitrationRule == ArbitrationRule.Reading)) { //---无裁判问题却有仲裁对象,操作失败 throw new BusinessValidationFailedException(_localizer["ReadingCriterion_ArbitratorWithoutJudgment"]); } await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.TrialReadingCriterionId, x => new ReadingQuestionCriterionTrial() { ArbitrationRule = inDto.ArbitrationRule, //IsArbitrationReading = inDto.IsArbitrationReading, }); var result = await _readingQuestionCriterionTrialRepository.SaveChangesAsync(); return ResponseOutput.Ok(result); } #endregion #region 项目阅片标准问题分页 /// /// 新增修改项目标准分页 /// /// /// [HttpPost] public async Task AddOrUpdateReadingCriterionPage(ReadingCriterionPageAddOrEdit addOrEditReadingCriterionPage) { var entity = await _readingCriterionPageRepository.InsertOrUpdateAsync(addOrEditReadingCriterionPage, true); return ResponseOutput.Ok(entity.Id.ToString()); } /// /// 删除标准分页 /// /// /// [HttpDelete("{Id:guid}")] public async Task DeleteReadingCriterionPage(Guid Id) { var success = await _readingCriterionPageRepository.DeleteFromQueryAsync(t => t.Id == Id, true); return ResponseOutput.Ok(); } #endregion #region 全局评估类型 肿瘤学评估类型 /// /// 修改是否是随访使用 /// /// /// [HttpPost] public async Task SetDictionaryFollowVisitUse(SetDictionaryFollowVisitUseInDto inDto) { await _readingCriterionDictionaryRepository.UpdatePartialFromQueryAsync(inDto.Id, x => new ReadingSystemCriterionDictionary() { IsFollowVisitUse = inDto.IsFollowVisitUse }); await _readingCriterionDictionaryRepository.SaveChangesAsync(); return ResponseOutput.Ok(true); } /// /// 修改是否是基线使用 /// /// /// [HttpPost] public async Task SetDictionaryBaseLineUse(SetDictionaryBaseLineUseInDto inDto) { await _readingCriterionDictionaryRepository.UpdatePartialFromQueryAsync(inDto.Id, x => new ReadingSystemCriterionDictionary() { IsBaseLineUse = inDto.IsBaseLineUse }); await _readingCriterionDictionaryRepository.SaveChangesAsync(); return ResponseOutput.Ok(true); } /// /// 获取标准字典 /// /// /// [HttpPost] public async Task> GetAssessType(GetAssessTypeInDto inDto) { if (inDto.SystemCriterionId != null) { return await _readingCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.SystemCriterionId ) .WhereIf(!inDto.ParentCode.IsNullOrEmpty(), x => x.ParentCode == inDto.ParentCode) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ParentCode).ThenBy(x => x.ShowOrder).ToListAsync(); } else { return await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.SystemCriterionId ) .WhereIf(!inDto.ParentCode.IsNullOrEmpty(), x => x.ParentCode == inDto.ParentCode) .ProjectTo(_mapper.ConfigurationProvider).OrderBy(x => x.ParentCode).ThenBy(x => x.ShowOrder).ToListAsync(); } } /// /// 设置标准字典分组 /// /// /// [HttpPost] public async Task EditCriterionDictionary(EditCriterionDictionaryInDto inDto) { await _readingCriterionDictionaryRepository.UpdatePartialFromQueryAsync(inDto.Id,x=>new ReadingSystemCriterionDictionary() { CrterionDictionaryGroup=inDto.CrterionDictionaryGroup }); return await _readingCriterionDictionaryRepository.SaveChangesAsync(); } /// /// 设置标准字典 /// /// /// [HttpPost] public async Task SetCriterionDictionary(SetCriterionDictionaryInDto inDto) { await _readingCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(x => x.CriterionId == inDto.CriterionId && x.ParentCode == inDto.ParentCode); await _readingCriterionDictionaryRepository.AddRangeAsync(inDto.DictionaryIds.Select(x => new ReadingSystemCriterionDictionary() { CriterionId = inDto.CriterionId, DictionaryId = x, IsSystemCriterion = true, ParentCode = inDto.ParentCode })); await _readingCriterionDictionaryRepository.SaveChangesAsync(); return ResponseOutput.Ok(true); } /// /// 设置评估类型 /// /// /// [HttpPost] public async Task SetAssessType(SetAssessTypeInDto inDto) { await _readingCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(x => x.CriterionId == inDto.CriterionId && x.ParentCode == inDto.ParentCode); await _readingCriterionDictionaryRepository.AddRangeAsync(inDto.DictionaryList.Select(x => new ReadingSystemCriterionDictionary() { CriterionId = inDto.CriterionId, DictionaryId = x.DictionaryId, IsBaseLineUse = x.IsBaseLineUse, IsFollowVisitUse = x.IsFollowVisitUse, IsSystemCriterion = true, ParentCode = inDto.ParentCode })); await _readingCriterionDictionaryRepository.SaveChangesAsync(); return ResponseOutput.Ok(true); } #endregion /// /// 添加系统数据到项目里面 /// /// [NonDynamicMethod] private async Task AddSystemDataToTrila(Guid trialId) { var trialUsrSystemIds = _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialId && x.ReadingQuestionCriterionSystemId != null) .Select(x => x.ReadingQuestionCriterionSystemId); var trialCriterionNames = _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == trialId) .Select(x => x.CriterionName); List needAddCriterionList = await _readingQuestionCriterionSystemRepository.Where(x => !trialUsrSystemIds.Contains(x.Id) && x.IsEnable && !trialCriterionNames.Contains(x.CriterionName)).ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); List needAddQuestionList = new List(); needAddCriterionList.ForEach(x => { //x.IsEnable = false; x.TrialId = trialId; x.ReadingQuestionCriterionSystemId = x.Id; x.Id = NewId.NextGuid(); x.IsAutoCreate=x.CriterionType==CriterionType.RECIST1Pointt1_MB?false:true; // 同步问题暂时注释 //List readingQuestionTrialList = new List(); //SetChildParentQuestion(criterion.Id, trialId, systemQuestionList, readingQuestionTrialList); //needAddQuestionList.AddRange(readingQuestionTrialList); }); await _readingQuestionCriterionTrialRepository.AddRangeAsync(needAddCriterionList); await _readingQuestionTrialRepository.AddRangeAsync(needAddQuestionList); await _readingQuestionTrialRepository.SaveChangesAsync(); } } }