public async Task <IActionResult> CreateQuestionnaireQuestionAsync([FromBody] CreateQuestionnaireQuestionRequestDto requestDto) { QuestionnaireQuestionModel model = null; var answers = new List <QuestionnaireAnswerModel>(); var questionBiz = new QuestionnaireQuestionBiz(); var cancelDependQuestionModels = new List <QuestionnaireQuestionModel>(); //由于问题类型变化或答案选项被删除,需要删除依赖关系的问题列表 var isCreate = true; //是否是创建问题 //新增 if (string.IsNullOrWhiteSpace(requestDto.QuestionGuid)) { model = new QuestionnaireQuestionModel { QuestionGuid = Guid.NewGuid().ToString("N"), CreatedBy = UserID, LastUpdatedBy = UserID }; } else//编辑 { model = await questionBiz.GetAsync(requestDto.QuestionGuid); if (model == null) { return(Failed(ErrorCode.UserData, $"未找到编辑的问题")); } if (model.QuestionnaireGuid != requestDto.QuestionnaireGuid) { return(Failed(ErrorCode.UserData, $"传入的问卷guid和待编辑问题的问卷guid不一致")); } //由于问题类型变化或答案选项被删除,需要删除依赖关系的问题列表 if (model.QuestionType != requestDto.QuestionType.ToString()) { //获取依赖此问题的问题列表 var dependonQuestionModel = await questionBiz.GetModelsByDependQuestionGuidAsync(model.QuestionGuid); dependonQuestionModel.ForEach(a => { a.DependAnswer = string.Empty; a.DependQuestion = string.Empty; a.IsDepend = false; }); cancelDependQuestionModels.AddRange(dependonQuestionModel); } else if (model.QuestionType == QuestionnaireQuestionTypeEnum.Bool.ToString() || model.QuestionType == QuestionnaireQuestionTypeEnum.Enum.ToString()) { var answerModels = await new QuestionnaireAnswerBiz().GetModelsByQuestionGuidAsync(model.QuestionGuid); //获取被删除的选项id集合 var exceptAnswerIds = answerModels.Select(a => a.AnswerGuid) .Except(requestDto.Answers .Where(a => !string.IsNullOrWhiteSpace(a.AnswerGuid)) .Select(a => a.AnswerGuid)); //获取依赖此问题的问题列表 var dependonQuestionModel = await questionBiz.GetModelsByDependQuestionGuidAsync(model.QuestionGuid); //获取依赖此问题中被删除选项的问题列表,这些问题的对此问题的依赖将被取消 var cancelDependQuestionModelList = dependonQuestionModel.Join(exceptAnswerIds, d => d.DependAnswer, a => a, (d, a) => d).ToList(); cancelDependQuestionModelList.ForEach(a => { a.DependAnswer = string.Empty; a.DependQuestion = string.Empty; a.IsDepend = false; }); cancelDependQuestionModels.AddRange(cancelDependQuestionModelList); } model.LastUpdatedBy = UserID; model.LastUpdatedDate = DateTime.Now; isCreate = false; } model.QuestionnaireGuid = requestDto.QuestionnaireGuid; model.QuestionName = requestDto.QuestionName; model.QuestionType = requestDto.QuestionType.ToString(); model.Unit = requestDto.Unit; model.Sort = requestDto.Sort;//判断有无重复的sort model.PromptText = requestDto.PromptText; if (!string.IsNullOrWhiteSpace(requestDto.DependAnswer)) { var dependAnswerModel = await new QuestionnaireAnswerBiz().GetAsync(requestDto.DependAnswer); if (dependAnswerModel == null) { return(Failed(ErrorCode.UserData, $"依赖的答案未找到")); } model.DependAnswer = requestDto.DependAnswer; model.DependQuestion = dependAnswerModel.QuestionGuid; model.IsDepend = true; } else { model.DependAnswer = string.Empty; model.DependQuestion = string.Empty; model.IsDepend = false; } if (requestDto.Answers != null) { answers = requestDto.Answers.Select((item, index) => new QuestionnaireAnswerModel { AnswerGuid = Guid.NewGuid().ToString("N"), QuestionnaireGuid = model.QuestionnaireGuid, QuestionGuid = model.QuestionGuid, AnswerLabel = item.AnswerLabel, IsDefault = item.IsDefault, Sort = index + 1, CreatedBy = UserID, LastUpdatedBy = UserID }).ToList(); } var result = await questionBiz.CreateQuestionnaireQuestionAsync(model, answers, isCreate, cancelDependQuestionModels); if (!result) { return(Failed(ErrorCode.UserData, $"保存问题失败")); } var dependQuestions = await questionBiz.GetQuestionWithDependAsync(requestDto.QuestionnaireGuid); var questionnaireModel = await new QuestionnaireBiz().GetAsync(requestDto.QuestionnaireGuid); if (questionnaireModel.HasDepend != dependQuestions.Any()) { questionnaireModel.HasDepend = dependQuestions.Any(); await new QuestionnaireBiz().UpdateAsync(questionnaireModel); } #region 将提交的数据返回(携带问题guid) var response = new CreateQuestionnaireQuestionResponseDto { QuestionnaireGuid = model.QuestionnaireGuid, QuestionGuid = model.QuestionGuid, QuestionName = model.QuestionName, QuestionType = requestDto.QuestionType, IsDepend = model.IsDepend, DependAnswer = model.DependAnswer, Sort = model.Sort, Answers = requestDto.Answers }; if (model.IsDepend) { var dependAnswerModel = await new QuestionnaireAnswerBiz().GetAsync(model.DependAnswer); var dependQuestionModel = await questionBiz.GetAsync(model.DependQuestion); response.DependDescription = $"*依赖于第{dependQuestionModel?.Sort}题的第{dependAnswerModel?.Sort}个选项,当题目{dependQuestionModel?.Sort}选择[{dependAnswerModel?.AnswerLabel}]时,此题才显示。"; } #endregion return(Success(response)); }