using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infrastructure;
using MassTransit;
using Microsoft.AspNetCore.Mvc;
using Panda.DynamicWebApi.Attributes;

namespace IRaCIS.Core.Application.Service.RC
{


    [ApiExplorerSettings(GroupName = "Reading")]
    public class ReadingQuestionService(IRepository<ReadingQuestionCriterionSystem> _readingQuestionCriterionSystemRepository,
        IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
        IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository,
        IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswer,
        IRepository<ReadingCriterionPage> _readingCriterionPageRepository,
        IRepository<ReadingSystemCriterionDictionary> _readingCriterionDictionaryRepository,
        IRepository<ReadingTrialCriterionDictionary> _readingTrialCriterionDictionaryRepository,
        IRepository<VisitTask> _visitTaskRepository,
        ITrialConfigService _trialConfigService,
        IRepository<SystemCriterionDictionaryCode> _systemCriterionDictionaryCodeRepository,
        IRepository<ReadingTableQuestionAnswer> _readingTableQuestionAnswerRepository,
        IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository,
        IRepository<ReadingTableQuestionTrial> _readingTableQuestionTrialRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService
    {




        /// <summary>
        /// 删除系统标准字典Code
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> 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();
        }


        /// <summary>
        /// 添加系统标准字典Code
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> 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();
        }

        /// <summary>
        /// 重置项目标准的重置状态
        /// </summary>
        /// <param name="trialReadingCriterionId">项目标准Id</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> 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();
        }


        /// <summary>
        /// 设置系统全局阅片阅片信息
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        [UnitOfWork]
        public async Task<IResponseOutput> 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);
        }

        /// <summary>
        /// 获取系统全局阅片信息
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<GetSystemGlobalInfoOutDto> 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<CriterionDictionaryInfo>(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync()

            };

            return result;
        }

        /// <summary>
        /// 获取系统肿瘤信息
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<GetSystemOncologyInfoOutDto> 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<CriterionDictionaryInfo>(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync()

            };

            return result;
        }

        /// <summary>
        /// 设置系统肿瘤学阅片信息
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        [UnitOfWork]
        public async Task<IResponseOutput> 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 系统标准
        /// <summary>
        /// 获取获取系统阅片标准下拉
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<List<GetSystemCriterionListOutDto>> GetSystemCriterionList()
        {
            List<GetSystemCriterionListOutDto> result = await _readingQuestionCriterionSystemRepository.Select(x => new GetSystemCriterionListOutDto()
            {

                CriterionId = x.Id,
                CriterionName = x.CriterionName,

            }).ToListAsync();

            return result;
        }

        /// <summary>
        /// 获取系统问题标准
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<PageOutput<ReadingQuestionCriterionSystemView>> GetReadingQuestionCriterionSystemList(ReadingQuestionCriterionSystemViewInDto inDto)
        {
            //await AddSystemQuestionCriterion();
            var query = _readingQuestionCriterionSystemRepository.AsQueryable()
                 .WhereIf(!inDto.CriterionName.IsNullOrEmpty(), x => x.CriterionName.Contains(inDto.CriterionName))
                 .ProjectTo<ReadingQuestionCriterionSystemView>(_mapper.ConfigurationProvider);

            return await query.ToPagedListAsync(inDto, nameof(ReadingQuestionCriterionSystemView.ShowOrder));
        }

        /// <summary>
        /// 获取系统问题标准下拉
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<List<GetSystemCriterionSelectDto>> GetSystemCriterionSelectList()
        {
            var criterionList = await _readingQuestionCriterionSystemRepository.AsQueryable()
                .OrderBy(x => x.ShowOrder)
               .Select(x => new GetSystemCriterionSelectDto()
               {
                   Id = x.Id,
                   CriterionName = x.CriterionName,

               }).ToListAsync();
            return criterionList;
        }

        /// <summary>
        /// 新增修改系统问题标准
        /// </summary>
        /// <param name="indto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> 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());
        }

        /// <summary>
        /// 删除系统问题标准
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpDelete("{id:guid}")]
        public async Task<IResponseOutput> 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);
        }



        /// <summary>
        /// 设置系统问题标准是否完成配置
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        public async Task<IResponseOutput> 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().FirstNotNullAsync();

            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 项目标准

        /// <summary>
        /// 获取项目裁判信息
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<GetTrialJudgyInfoOutDto> 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;
        }

        /// <summary>
        /// 新增修改项目问题标准(项目)
        /// </summary>
        /// <param name="indto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> AddOrUpdateReadingQuestionCriterionTrial(AddOrUpdateReadingQuestionCriterionTrialInDto indto)
        {

            var entity = await _readingQuestionCriterionTrialRepository.InsertOrUpdateAsync(indto, true);
            return ResponseOutput.Ok(entity.Id.ToString());
        }



        /// <summary>
        /// 设置项目标准是否完成配置
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        public async Task<IResponseOutput> SetTrialReadingQuestionCriterionIsIsCompleteConfig(SetSystemReadingQuestionCriterionIsIsCompleteConfig inDto)
        {
            await _readingQuestionCriterionTrialRepository.UpdatePartialFromQueryAsync(inDto.Id, x => new ReadingQuestionCriterionTrial()
            {
                IsCompleteConfig = inDto.IsCompleteConfig
            });

            var result = await _readingQuestionCriterionTrialRepository.SaveChangesAsync();

            return ResponseOutput.Ok(result);
        }

        /// <summary>
        /// 获取项目问题标准(项目)
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public async Task<PageOutput<ReadingQuestionCriterionTrialView>> 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<ReadingQuestionCriterionTrialView>(_mapper.ConfigurationProvider);
            return await query.ToPagedListAsync(inDto, nameof(ReadingQuestionCriterionTrialView.ShowOrder));
        }

        /// <summary>
        /// 删除项目问题标准(项目)
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpDelete("{id:guid}")]
        public async Task<IResponseOutput> DeleteReadingQuestionCriterionTrial(Guid id)
        {
            await _readingQuestionCriterionTrialRepository.DeleteFromQueryAsync(t => t.Id == id);
            var success = await _readingQuestionCriterionTrialRepository.SaveChangesAsync();
            return ResponseOutput.Result(success);
        }

        /// <summary>
        /// 设置项目裁判信息
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> SetTrialJudgyInfo(SetTrialJudgyInfoInDto inDto)
        {

            var trialCriterion = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == inDto.TrialId && x.Id == inDto.TrialReadingCriterionId).FirstNotNullAsync();

            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 项目阅片标准问题分页

        /// <summary>
        /// 新增修改项目标准分页
        /// </summary>
        /// <param name="addOrEditReadingCriterionPage"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> AddOrUpdateReadingCriterionPage(ReadingCriterionPageAddOrEdit addOrEditReadingCriterionPage)
        {

            var entity = await _readingCriterionPageRepository.InsertOrUpdateAsync(addOrEditReadingCriterionPage, true);
            return ResponseOutput.Ok(entity.Id.ToString());

        }

        /// <summary>
        /// 删除标准分页
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        [HttpDelete("{Id:guid}")]
        public async Task<IResponseOutput> DeleteReadingCriterionPage(Guid Id)
        {
            var success = await _readingCriterionPageRepository.DeleteFromQueryAsync(t => t.Id == Id, true);
            return ResponseOutput.Ok();
        }


        #endregion



        #region 全局评估类型  肿瘤学评估类型

        /// <summary>
        /// 修改是否是随访使用
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> SetDictionaryFollowVisitUse(SetDictionaryFollowVisitUseInDto inDto)
        {
            await _readingCriterionDictionaryRepository.UpdatePartialFromQueryAsync(inDto.Id, x => new ReadingSystemCriterionDictionary()
            {
                IsFollowVisitUse = inDto.IsFollowVisitUse
            });

            await _readingCriterionDictionaryRepository.SaveChangesAsync();

            return ResponseOutput.Ok(true);
        }


        /// <summary>
        /// 修改是否是基线使用
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> SetDictionaryBaseLineUse(SetDictionaryBaseLineUseInDto inDto)
        {
            await _readingCriterionDictionaryRepository.UpdatePartialFromQueryAsync(inDto.Id, x => new ReadingSystemCriterionDictionary()
            {
                IsBaseLineUse = inDto.IsBaseLineUse
            });

            await _readingCriterionDictionaryRepository.SaveChangesAsync();

            return ResponseOutput.Ok(true);
        }

        /// <summary>
        /// 获取标准字典
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<List<CriterionDictionaryInfo>> 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<CriterionDictionaryInfo>(_mapper.ConfigurationProvider).OrderBy(x => x.ParentCode).ThenBy(x => x.ShowOrder).ToListAsync();
            }
            else
            {
                return await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.TrialCriterionId
           )
               .WhereIf(!inDto.ParentCode.IsNullOrEmpty(), x => x.ParentCode == inDto.ParentCode)
               .ProjectTo<CriterionDictionaryInfo>(_mapper.ConfigurationProvider).OrderBy(x => x.ParentCode).ThenBy(x => x.ShowOrder).ToListAsync();
            }


        }


        /// <summary>
        /// 设置标准字典分组
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<bool> EditCriterionDictionary(EditCriterionDictionaryInDto inDto)
        {
            await _readingCriterionDictionaryRepository.UpdatePartialFromQueryAsync(inDto.Id, x => new ReadingSystemCriterionDictionary()
            {
                CrterionDictionaryGroup = inDto.CrterionDictionaryGroup
            });

            return await _readingCriterionDictionaryRepository.SaveChangesAsync();
        }

        /// <summary>
        /// 设置标准字典
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> 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);
        }

        /// <summary>
        /// 设置评估类型
        /// </summary>
        /// <param name="inDto"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IResponseOutput> 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

        /// <summary>
        /// 添加系统数据到项目里面
        /// </summary>
        /// <returns></returns>  
        [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<ReadingQuestionCriterionTrial> needAddCriterionList = await _readingQuestionCriterionSystemRepository.Where(x => !trialUsrSystemIds.Contains(x.Id) && x.IsEnable && !trialCriterionNames.Contains(x.CriterionName)).ProjectTo<ReadingQuestionCriterionTrial>(_mapper.ConfigurationProvider).ToListAsync();

            List<ReadingQuestionTrial> needAddQuestionList = new List<ReadingQuestionTrial>();
            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<ReadingQuestionTrial> readingQuestionTrialList = new List<ReadingQuestionTrial>();
                //SetChildParentQuestion(criterion.Id, trialId, systemQuestionList, readingQuestionTrialList);
                //needAddQuestionList.AddRange(readingQuestionTrialList);
            });

            // 标准的默认值 标准默认值
            foreach (var criterion in needAddCriterionList)
            {



                switch (criterion.CriterionType)
                {
                    case CriterionType.IVUS:
                        criterion.IsReadingPeriod = false;
                        criterion.IsImageFilter = false;
                        criterion.IsGlobalReading = false;
                        criterion.IsArbitrationReading = true;
                        criterion.ArbitrationRule = ArbitrationRule.Visit;
                        criterion.IsReadingTaskViewInOrder = ReadingOrder.SubjectRandom;
                        criterion.ImageDownloadEnum = ReadingImageDownload.Subejct;
                        criterion.ImageUploadEnum = ReadingImageUpload.IRReadingSubejctEnable;
                        break;
                    case CriterionType.OCT:
                        criterion.IsImageFilter = false;
                        criterion.IsReadingPeriod = false;
                        criterion.IsGlobalReading = false;
                        criterion.IsArbitrationReading = true;
                        criterion.ArbitrationRule = ArbitrationRule.Visit;
                        criterion.IsReadingTaskViewInOrder = ReadingOrder.SubjectRandom;
                        criterion.ImageDownloadEnum = ReadingImageDownload.Subejct;
                        criterion.ImageUploadEnum = ReadingImageUpload.IRReadingSubejctEnable;
                        break;
                }
            }


            await _readingQuestionCriterionTrialRepository.AddRangeAsync(needAddCriterionList);
            await _readingQuestionTrialRepository.AddRangeAsync(needAddQuestionList);
            await _readingQuestionTrialRepository.SaveChangesAsync();
        }

    }
}