539 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			539 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C#
		
	
	
//--------------------------------------------------------------------
 | 
						|
//     此代码由T4模板自动生成  byzhouhang 20210918
 | 
						|
//	   生成时间 2023-06-15 15:06:06 
 | 
						|
//     对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
 | 
						|
//--------------------------------------------------------------------
 | 
						|
 | 
						|
using Microsoft.AspNetCore.Mvc;
 | 
						|
using IRaCIS.Core.Application.Interfaces;
 | 
						|
using IRaCIS.Core.Application.ViewModel;
 | 
						|
using IRaCIS.Core.Application.Service.Reading.Dto;
 | 
						|
using IRaCIS.Core.Infra.EFCore.Common;
 | 
						|
using IRaCIS.Core.Domain.Share;
 | 
						|
using MassTransit;
 | 
						|
 | 
						|
namespace IRaCIS.Core.Application.Service
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// 临床数据问题
 | 
						|
    /// </summary>	
 | 
						|
    [ApiExplorerSettings(GroupName = "Reading")]
 | 
						|
    public class ClinicalQuestionService : BaseService, IClinicalQuestionService
 | 
						|
    {
 | 
						|
 | 
						|
        private readonly IRepository<TrialClinicalQuestion> _trialClinicalQuestionRepository;
 | 
						|
 | 
						|
        private readonly IRepository<SystemClinicalQuestion> _systemClinicalQuestionRepository;
 | 
						|
 | 
						|
 | 
						|
        private readonly IRepository<SystemClinicalTableQuestion> _systemClinicalTableQuestionRepository;
 | 
						|
 | 
						|
        private readonly IRepository<TrialClinicalTableQuestion> _trialClinicalTableQuestionRepository;
 | 
						|
 | 
						|
        public ClinicalQuestionService(IRepository<TrialClinicalQuestion> trialClinicalQuestionRepository,
 | 
						|
            IRepository<SystemClinicalTableQuestion> systemClinicalTableQuestionRepository,
 | 
						|
            IRepository<TrialClinicalTableQuestion> trialClinicalTableQuestionRepository,
 | 
						|
            IRepository<SystemClinicalQuestion> systemClinicalQuestionRepository
 | 
						|
            )
 | 
						|
        {
 | 
						|
            _systemClinicalTableQuestionRepository = systemClinicalTableQuestionRepository;
 | 
						|
            _trialClinicalQuestionRepository = trialClinicalQuestionRepository;
 | 
						|
            _trialClinicalTableQuestionRepository = trialClinicalTableQuestionRepository;
 | 
						|
            _systemClinicalQuestionRepository = systemClinicalQuestionRepository;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取系统临床数据预览
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<(List<ClinicalQuestionPreviewDto>, bool)> GetSystemClinicalQuestionPreview(GetSystemClinicalQuestionPreviewDto inDto)
 | 
						|
        {
 | 
						|
            var questions = await _systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId)
 | 
						|
                .ProjectTo<ClinicalQuestionPreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
 | 
						|
            var tableQuestions= await _systemClinicalTableQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId)
 | 
						|
                .ProjectTo<ClinicalTablePreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
 | 
						|
 | 
						|
            var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList();
 | 
						|
 | 
						|
            result.ForEach(x =>
 | 
						|
            {
 | 
						|
                this.FindChildQuestion(x, questions, tableQuestions, new List<ClinicalFormQuestionAnswer>(), new List<ClinicalFormTableQuestionAnswer>());
 | 
						|
            });
 | 
						|
 | 
						|
            return (result, true);
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取项目临床数据预览
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<(List<ClinicalQuestionPreviewDto>, bool)> GetTrialClinicalQuestionPreview(GetTrialClinicalQuestionPreviewDto inDto)
 | 
						|
        {
 | 
						|
            var questions = await _trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId)
 | 
						|
                .ProjectTo<ClinicalQuestionPreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
 | 
						|
            var tableQuestions = await _trialClinicalTableQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId)
 | 
						|
                .ProjectTo<ClinicalTablePreviewDto>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
 | 
						|
 | 
						|
            var result = questions.Where(x => x.ClinicalQuestionType == ReadingQestionType.Group).ToList();
 | 
						|
 | 
						|
            result.ForEach(x =>
 | 
						|
            {
 | 
						|
                this.FindChildQuestion(x, questions, tableQuestions,new List<ClinicalFormQuestionAnswer> (),new  List<ClinicalFormTableQuestionAnswer>());
 | 
						|
            });
 | 
						|
 | 
						|
            return (result, true);
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取子元素
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="item"></param>
 | 
						|
        /// <param name="questions"></param>
 | 
						|
        /// <param name="tableQuestions"></param>
 | 
						|
        public void FindChildQuestion(ClinicalQuestionPreviewDto item, List<ClinicalQuestionPreviewDto> questions, List<ClinicalTablePreviewDto> tableQuestions,List<ClinicalFormQuestionAnswer> answers, List<ClinicalFormTableQuestionAnswer> tableAnswers)
 | 
						|
        {
 | 
						|
            item.Childrens = questions.Where(x => (x.ParentId == item.Id)||(x.GroupId== item.Id&&x.ParentId==null)).ToList();
 | 
						|
 | 
						|
			item.RelationQuestions = questions.Where(x => x.RelevanceId == item.Id).ToList();
 | 
						|
 | 
						|
			item.Answer = answers.Where(x => x.QuestionId == item.Id).Select(x => x.Answer).FirstOrDefault()??string.Empty;
 | 
						|
 | 
						|
            var tableIndexs = tableAnswers.Where(x => x.QuestionId == item.Id).Select(x => x.RowIndex).Distinct().OrderBy(x=>x).ToList();
 | 
						|
 | 
						|
            item.TableAnswer = new List<Dictionary<Guid, string>>();
 | 
						|
 | 
						|
            tableIndexs.ForEach(x =>
 | 
						|
            {
 | 
						|
                item.TableAnswer.Add(tableAnswers.Where(y => y.RowIndex == x).ToDictionary(y => y.TableQuestionId, y => y.Answer));
 | 
						|
 | 
						|
 | 
						|
            });
 | 
						|
 | 
						|
 | 
						|
            item.TableQuestions = tableQuestions.Where(x => x.QuestionId == item.Id).OrderBy(x=>x.ShowOrder).ToList();
 | 
						|
 | 
						|
            item.RelationQuestions.ForEach(x => {
 | 
						|
                this.FindChildQuestion(x, questions, tableQuestions, answers, tableAnswers);
 | 
						|
            });
 | 
						|
 | 
						|
			item.Childrens.ForEach(x => {
 | 
						|
				this.FindChildQuestion(x, questions, tableQuestions, answers, tableAnswers);
 | 
						|
			});
 | 
						|
		}
 | 
						|
 | 
						|
        #region 项目问题
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取项目临床问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inQuery"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<PageOutput<TrialClinicalQuestionDto>> GetTrialClinicalQuestionList(TrialClinicalQuestionQuery inQuery)
 | 
						|
        {
 | 
						|
 | 
						|
            var trialClinicalQuestionQueryable = _trialClinicalQuestionRepository.Where(x=>x.TrialClinicalId==inQuery.TrialClinicalId)
 | 
						|
                .WhereIf(!inQuery.QuestionName.IsNullOrEmpty(), x => x.QuestionName.Contains(inQuery.QuestionName) || x.QuestionEnName.Contains(inQuery.QuestionName))
 | 
						|
             .ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider);
 | 
						|
            var pageList = await trialClinicalQuestionQueryable
 | 
						|
            .ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TrialClinicalQuestion.ShowOrder) : inQuery.SortField,
 | 
						|
            inQuery.Asc);
 | 
						|
            return pageList;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 新增或者修改项目临床问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<IResponseOutput> AddOrUpdateTrialClinicalQuestion(TrialClinicalQuestionDto inDto)
 | 
						|
        {
 | 
						|
            if (await _trialClinicalQuestionRepository.AnyAsync(x =>x.TrialClinicalId==inDto.TrialClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
 | 
						|
            {
 | 
						|
                return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
 | 
						|
            }
 | 
						|
 | 
						|
            var entity = await _trialClinicalQuestionRepository.InsertOrUpdateAsync(inDto, true);
 | 
						|
            return ResponseOutput.Ok(entity.Id.ToString());
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 删除项目临床数据问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="id"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost("{id:guid}")]
 | 
						|
        public async Task<IResponseOutput> DeleteTrialClinicalQuestion(Guid id)
 | 
						|
        {
 | 
						|
            var success = await _trialClinicalQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
 | 
						|
            return ResponseOutput.Ok();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取项目问题分组
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<List<TrialClinicalQuestionDto>> GetTrialClinicalGroupQuestionList(GetTrialGroupDto inDto)
 | 
						|
        {
 | 
						|
            return await this._trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId&&x.ClinicalQuestionType== "group")
 | 
						|
                .ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取项目标准其他问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<List<TrialClinicalQuestionDto>> GetTrialClinicalOtherQuestionList(GetTrialGroupDto inDto)
 | 
						|
        {
 | 
						|
            var types = new List<string>()
 | 
						|
            {
 | 
						|
                "select","radio"
 | 
						|
            };
 | 
						|
            return await this._trialClinicalQuestionRepository.Where(x => x.TrialClinicalId == inDto.TrialClinicalId && types.Contains( x.ClinicalQuestionType))
 | 
						|
              .ProjectTo<TrialClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
 | 
						|
        #region 系统问题
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取系统临床问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inQuery"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<PageOutput<SystemClinicalQuestionDto>> GetSystemClinicalQuestionList(SystemClinicalQuestionQuery inQuery)
 | 
						|
        {
 | 
						|
 | 
						|
            var systemClinicalQuestionQueryable = _systemClinicalQuestionRepository
 | 
						|
                .WhereIf(!inQuery.QuestionName.IsNullOrEmpty(), x => x.QuestionName.Contains(inQuery.QuestionName) || x.QuestionEnName.Contains(inQuery.QuestionName))
 | 
						|
             .ProjectTo<SystemClinicalQuestionDto>(_mapper.ConfigurationProvider);
 | 
						|
            var pageList = await systemClinicalQuestionQueryable
 | 
						|
            .ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(SystemClinicalQuestion.ShowOrder) : inQuery.SortField,
 | 
						|
            inQuery.Asc);
 | 
						|
            return pageList;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 新增或者修改系统临床问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<IResponseOutput> AddOrUpdateSystemClinicalQuestion(SystemClinicalQuestionDto inDto)
 | 
						|
        {
 | 
						|
 | 
						|
            if (await _systemClinicalQuestionRepository.AnyAsync(x => x.SystemClinicalId == inDto.SystemClinicalId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
 | 
						|
            {
 | 
						|
                return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
 | 
						|
            }
 | 
						|
            var entity = await _systemClinicalQuestionRepository.InsertOrUpdateAsync(inDto, true);
 | 
						|
            return ResponseOutput.Ok(entity.Id.ToString());
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 删除系统临床数据问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="id"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost("{id:guid}")]
 | 
						|
        public async Task<IResponseOutput> DeleteSystemClinicalQuestion(Guid id)
 | 
						|
        {
 | 
						|
            var success = await _systemClinicalQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
 | 
						|
            return ResponseOutput.Ok();
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取系统问题分组
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<List<SystemClinicalQuestionDto>> GetSystemClinicalGroupQuestionList(GetSystemGroupDto inDto)
 | 
						|
        {
 | 
						|
            return await this._systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId && x.ClinicalQuestionType =="group")
 | 
						|
                .ProjectTo<SystemClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取系统其他问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<List<SystemClinicalQuestionDto>> GetSystemClinicalOtherQuestionList(GetSystemGroupDto inDto)
 | 
						|
        {
 | 
						|
            var types = new List<string>()
 | 
						|
            {
 | 
						|
                "select","radio"
 | 
						|
            };
 | 
						|
            return await this._systemClinicalQuestionRepository.Where(x => x.SystemClinicalId == inDto.SystemClinicalId && types.Contains(x.ClinicalQuestionType))
 | 
						|
                .ProjectTo<SystemClinicalQuestionDto>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region 系统表格问题
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取系统表格问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inQuery"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<PageOutput<SystemClinicalTableQuestionDto>> GetSystemClinicalTableQuestionList(SystemClinicalTableQuestionQuery inQuery)
 | 
						|
        {
 | 
						|
 | 
						|
            var systemClinicalTableQuestionQueryable = this._systemClinicalTableQuestionRepository
 | 
						|
             .Where(x => x.QuestionId == inQuery.QuestionId)
 | 
						|
             .ProjectTo<SystemClinicalTableQuestionDto>(_mapper.ConfigurationProvider);
 | 
						|
 | 
						|
            var pageList = await systemClinicalTableQuestionQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(SystemClinicalTableQuestion.ShowOrder) : inQuery.SortField,
 | 
						|
            inQuery.Asc);
 | 
						|
 | 
						|
            return pageList;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 新增或修改系统表格问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<IResponseOutput> AddOrUpdateSystemClinicalTableQuestion(SystemClinicalTableQuestionDto inDto)
 | 
						|
        {
 | 
						|
            if (await _systemClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
 | 
						|
            {
 | 
						|
                return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
 | 
						|
            }
 | 
						|
 | 
						|
            var entity = await _systemClinicalTableQuestionRepository.InsertOrUpdateAsync(inDto, true);
 | 
						|
 | 
						|
            return ResponseOutput.Ok(entity.Id.ToString());
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 删除系统表格问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="id"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost("{id:guid}")]
 | 
						|
        public async Task<IResponseOutput> DeleteSystemClinicalTableQuestion(Guid id)
 | 
						|
        {
 | 
						|
            var success = await _systemClinicalTableQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
 | 
						|
            return ResponseOutput.Ok();
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
 | 
						|
        #region 项目表格问题
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 获取项目表格问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inQuery"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<PageOutput<TrialClinicalTableQuestionDto>> GetTrialClinicalTableQuestionList(TrialClinicalTableQuestionQuery inQuery)
 | 
						|
        {
 | 
						|
 | 
						|
            var trialClinicalTableQuestionQueryable = this._trialClinicalTableQuestionRepository
 | 
						|
             .Where(x => x.QuestionId == inQuery.QuestionId)
 | 
						|
             .ProjectTo<TrialClinicalTableQuestionDto>(_mapper.ConfigurationProvider);
 | 
						|
 | 
						|
            var pageList = await trialClinicalTableQuestionQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TrialClinicalTableQuestion.ShowOrder) : inQuery.SortField,
 | 
						|
            inQuery.Asc);
 | 
						|
 | 
						|
            return pageList;
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 新增或修改项目表格问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost]
 | 
						|
        public async Task<IResponseOutput> AddOrUpdateTrialClinicalTableQuestion(TrialClinicalTableQuestionDto inDto)
 | 
						|
        {
 | 
						|
            if (await _trialClinicalTableQuestionRepository.AnyAsync(x => x.QuestionId == inDto.QuestionId && x.Id != inDto.Id && x.QuestionName == inDto.QuestionName))
 | 
						|
            {
 | 
						|
                return ResponseOutput.NotOk(_localizer["ClinicalQuestion_Repeat"]);
 | 
						|
            }
 | 
						|
            var entity = await _trialClinicalTableQuestionRepository.InsertOrUpdateAsync(inDto, true);
 | 
						|
 | 
						|
            return ResponseOutput.Ok(entity.Id.ToString());
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 删除项目表格问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="id"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        [HttpPost("{id:guid}")]
 | 
						|
        public async Task<IResponseOutput> DeleteTrialClinicalTableQuestion(Guid id)
 | 
						|
        {
 | 
						|
            var success = await _trialClinicalTableQuestionRepository.DeleteFromQueryAsync(t => t.Id == id, true);
 | 
						|
            return ResponseOutput.Ok();
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
 | 
						|
        #region 同步系统问题
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 同步系统问题
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="inDto"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public async Task SynchronizationQuestion(List<SynchronizationQuestionDto> inDto)
 | 
						|
        {
 | 
						|
            var trialClinicalId = inDto.Select(x => x.TrialClinicalId).ToList();
 | 
						|
 | 
						|
            var systemClinicalId = inDto.Select(x => x.SystemClinicalId).ToList();
 | 
						|
            var questionRelationList =await _trialClinicalQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).Select(x => new QuestionDic()
 | 
						|
            {
 | 
						|
                SystemQuestionId=x.SystemClinicalQuestionId?? default(Guid),
 | 
						|
                TrialQuestionId=x.Id,
 | 
						|
                TrialClinicalId=x.TrialClinicalId,
 | 
						|
            }).ToListAsync();
 | 
						|
 | 
						|
            var tableQuestionRelationList = await _trialClinicalTableQuestionRepository.Where(x => trialClinicalId.Contains(x.TrialClinicalId)).Select(x => new QuestionDic()
 | 
						|
            {
 | 
						|
                SystemQuestionId = x.SystemTableQuestionId ?? default(Guid),
 | 
						|
                TrialQuestionId = x.Id,
 | 
						|
                TrialClinicalId = x.TrialClinicalId,
 | 
						|
            }).ToListAsync();
 | 
						|
 | 
						|
            var newTrialQuestionAll = await _systemClinicalQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId))
 | 
						|
                  .ProjectTo<TrialClinicalQuestionSynchronize>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
 | 
						|
            var newTrialTableQuestionAll = await _systemClinicalTableQuestionRepository.Where(x => systemClinicalId.Contains(x.SystemClinicalId))
 | 
						|
                .ProjectTo<TrialClinicalTableQuestionSynchronize>(_mapper.ConfigurationProvider).ToListAsync();
 | 
						|
 | 
						|
 | 
						|
            List<TrialClinicalQuestion> addTrialDataList = new List<TrialClinicalQuestion>();
 | 
						|
            List<TrialClinicalTableQuestion> addTrialTableList = new List<TrialClinicalTableQuestion>();
 | 
						|
            foreach (var item in inDto)
 | 
						|
            {
 | 
						|
                var questionRelation = questionRelationList.Where(x=>x.TrialClinicalId==item.TrialClinicalId).ToDictionary(
 | 
						|
                    x => x.SystemQuestionId,
 | 
						|
                    x => x.TrialQuestionId
 | 
						|
                    );
 | 
						|
 | 
						|
                var newTrialQuestionList = newTrialQuestionAll.Where(x => x.SystemClinicalId == item.SystemClinicalId).ToList();
 | 
						|
                newTrialQuestionList.ForEach(x =>
 | 
						|
                {
 | 
						|
                    if (questionRelation.ContainsKey(x.Id))
 | 
						|
                    {
 | 
						|
                        x.Id = questionRelation[x.Id];
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        var newid = NewId.NextGuid();
 | 
						|
                        questionRelation.Add(x.Id, newid);
 | 
						|
                        x.Id = newid;
 | 
						|
                    }
 | 
						|
 | 
						|
                    x.TrialClinicalId = item.TrialClinicalId;
 | 
						|
                });
 | 
						|
 | 
						|
                var copyNewQuestionList = newTrialQuestionList.Clone();
 | 
						|
                foreach (var x in newTrialQuestionList)
 | 
						|
                {
 | 
						|
                    var question = x.Clone();
 | 
						|
                    if (question.ParentId != null)
 | 
						|
                    {
 | 
						|
                        question.ParentId = questionRelation[question.ParentId ?? default(Guid)];
 | 
						|
                    }
 | 
						|
                    if (question.GroupId != null)
 | 
						|
                    {
 | 
						|
                        question.GroupId = questionRelation[question.GroupId ?? default(Guid)];
 | 
						|
                    }
 | 
						|
					if (question.RelevanceId != null)
 | 
						|
					{
 | 
						|
						question.RelevanceId = questionRelation[question.RelevanceId ?? default(Guid)];
 | 
						|
					}
 | 
						|
					addTrialDataList.Add(question);
 | 
						|
                };
 | 
						|
 | 
						|
 | 
						|
 | 
						|
                var tableQuestionRelation = tableQuestionRelationList.Where(x => x.TrialClinicalId == item.TrialClinicalId).ToDictionary(
 | 
						|
                 x => x.SystemQuestionId,
 | 
						|
                 x => x.TrialQuestionId
 | 
						|
                 );
 | 
						|
 | 
						|
                var newTrialTableQuestionList = newTrialTableQuestionAll.Where(x => x.SystemClinicalId == item.SystemClinicalId)
 | 
						|
                   .ToList();
 | 
						|
 | 
						|
 | 
						|
                newTrialTableQuestionList.ForEach(x =>
 | 
						|
                {
 | 
						|
                    if (tableQuestionRelation.ContainsKey(x.Id))
 | 
						|
                    {
 | 
						|
                        x.Id = tableQuestionRelation[x.Id];
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        var newid = NewId.NextGuid();
 | 
						|
                        tableQuestionRelation.Add(x.Id, newid);
 | 
						|
                        x.Id = newid;
 | 
						|
                    }
 | 
						|
                });
 | 
						|
 | 
						|
                foreach (var x in newTrialTableQuestionList)
 | 
						|
                {
 | 
						|
                    var tableQuestion = x.Clone();
 | 
						|
                    tableQuestion.TrialClinicalId = item.TrialClinicalId;
 | 
						|
 | 
						|
                    tableQuestion.QuestionId = copyNewQuestionList.Where(y => y.SystemClinicalQuestionId == x.QuestionId).Select(y => y.Id).FirstOrDefault();
 | 
						|
 | 
						|
 | 
						|
                    addTrialTableList.Add(tableQuestion);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            await _trialClinicalQuestionRepository.BatchDeleteNoTrackingAsync(x => trialClinicalId.Contains(x.TrialClinicalId));
 | 
						|
            await _trialClinicalQuestionRepository.AddRangeAsync(addTrialDataList);
 | 
						|
            await _trialClinicalTableQuestionRepository.BatchDeleteNoTrackingAsync(x => trialClinicalId.Contains(x.TrialClinicalId) );
 | 
						|
            await _trialClinicalTableQuestionRepository.AddRangeAsync(addTrialTableList);
 | 
						|
            await _trialClinicalQuestionRepository.SaveChangesAsync();
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
    }
 | 
						|
}
 |