diff --git a/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterAnswerDto.cs b/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterAnswerDto.cs index 9fd66cf..3fff65f 100644 --- a/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterAnswerDto.cs +++ b/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterAnswerDto.cs @@ -14,6 +14,10 @@ namespace Shentun.WebPeis.QuestionRegisters /// public Guid QuestionRegisterAnswerId { get; set; } /// + /// 问卷ID + /// + public Guid QuestionId { get; set; } + /// /// 答案ID /// public Guid QuestionAnswerId { get; set; } @@ -36,12 +40,12 @@ namespace Shentun.WebPeis.QuestionRegisters public int DisplayOrder { get; set; } /// - /// 子答案类别 + /// 子答案类别 0-单选,1-多选 /// public char? ChildAnswerType { get; set; } /// - /// 答案结果类别 + /// 答案结果类别 0-选择,1-自填 /// public char? AnswerResultType { get; set; } @@ -51,6 +55,15 @@ namespace Shentun.WebPeis.QuestionRegisters /// public char IsSelected { get; set; } = 'N'; + /// + /// 子答案标题 + /// + public string? ChildAnswerTitle { get; set; } + + /// + /// 无类型的答案-和其它答案排斥 + /// + public char IsNone { get; set; } /// /// 父答案ID /// diff --git a/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterItemDto.cs b/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterItemDto.cs index b4cd63c..726f685 100644 --- a/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterItemDto.cs +++ b/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterItemDto.cs @@ -10,6 +10,9 @@ namespace Shentun.WebPeis.QuestionRegisters /// 主键 /// public Guid QuestionRegisterItemId { get; set; } + /// + /// 问卷ID + /// public Guid QuestionId { get; set; } /// /// 题目 @@ -24,7 +27,7 @@ namespace Shentun.WebPeis.QuestionRegisters public int DisplayOrder { get; set; } /// - /// 答案类别 + /// 答案类别 0-单选,1-多选 /// public char? AnswerType { get; set; } @@ -39,6 +42,6 @@ namespace Shentun.WebPeis.QuestionRegisters public string? PathCode { get; set; } - public virtual ICollection QuestionRegisterAnswers { get; set; } = new List(); + public List QuestionRegisterAnswers { get; set; } = new List(); } } diff --git a/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs b/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs index 95ba8b0..7879ddd 100644 --- a/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs +++ b/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs @@ -12,6 +12,7 @@ using System.Threading.Tasks; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; +using Volo.Abp.Uow; namespace Shentun.WebPeis.QuestionRegisters { @@ -25,12 +26,14 @@ namespace Shentun.WebPeis.QuestionRegisters private readonly IRepository _questionRepository; private readonly IRepository _questionAnswerRepository; private readonly QuestionRegisterManager _questionRegisterManager; + private readonly IUnitOfWorkManager _unitOfWorkManager; public QuestionRegisterAppService(IRepository repository, IRepository questionRegisterItemRepository, IRepository questionRegisterAnswerRrepository, IRepository questionRepository, IRepository questionAnswerRepository, - QuestionRegisterManager questionRegisterManager) + QuestionRegisterManager questionRegisterManager, + IUnitOfWorkManager unitOfWorkManager) { _repository = repository; _questionRegisterItemRepository = questionRegisterItemRepository; @@ -38,6 +41,7 @@ namespace Shentun.WebPeis.QuestionRegisters _questionRepository = questionRepository; _questionAnswerRepository = questionAnswerRepository; _questionRegisterManager = questionRegisterManager; + _unitOfWorkManager = unitOfWorkManager; } /// /// 获取人员问卷 @@ -59,13 +63,17 @@ namespace Shentun.WebPeis.QuestionRegisters questionRegisterDto = await GetBasicDataAsync(input); if (questionRegister == null) { + //没有登记过 var questionRegisterEntity = new QuestionRegister(); questionRegisterEntity.PersonId = input.PersonId; questionRegisterEntity = await _questionRegisterManager.CreateAsync(questionRegisterEntity); + await _repository.InsertAsync(questionRegisterEntity); questionRegisterDto.QuestionRegisterId = questionRegisterEntity.QuestionRegisterId; + await _unitOfWorkManager.Current.SaveChangesAsync(); return questionRegisterDto; } - + questionRegisterDto.QuestionRegisterId = questionRegister.QuestionRegisterId; + //已登记过 var questionRegisterItems = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync() join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync() on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId @@ -77,24 +85,128 @@ namespace Shentun.WebPeis.QuestionRegisters }).ToList(); - - - foreach (var questionRegisterItem in questionRegisterDto.QuestionRegisterItems) + foreach (var questionRegisterItemDto in questionRegisterDto.QuestionRegisterItems) { - foreach (var questionRegisterAnswer in questionRegisterItem.QuestionRegisterAnswers) + var questionRegisterItemEntity = questionRegisterItems.Where(o => + o.questionRegisterItem.QuestionId == questionRegisterItemDto.QuestionId).FirstOrDefault(); + if (questionRegisterItemEntity != null) { - var answer = questionRegisterItems.Where( - o=>o.questionRegisterAnswer.QuestionRegisterAnswerId == questionRegisterAnswer.QuestionRegisterAnswerId) - .SingleOrDefault(); - if(answer != null) + questionRegisterItemDto.QuestionRegisterItemId = questionRegisterItemEntity.questionRegisterItem.QuestionRegisterItemId; + } + foreach (var questionRegisterAnswer in questionRegisterItemDto.QuestionRegisterAnswers) + { + var answer = questionRegisterItems.Where( + o => o.questionRegisterAnswer.QuestionRegisterAnswerId == questionRegisterAnswer.QuestionRegisterAnswerId) + .SingleOrDefault(); + if (answer != null) { questionRegisterAnswer.IsSelected = 'Y'; + questionRegisterAnswer.Content = answer.questionRegisterAnswer.Content; + + } + foreach (var childQuestionRegisterAnswer in questionRegisterAnswer.Childs) + { + answer = questionRegisterItems.Where( + o => o.questionRegisterAnswer.QuestionRegisterAnswerId == childQuestionRegisterAnswer.QuestionRegisterAnswerId) + .SingleOrDefault(); + if (answer != null) + { + childQuestionRegisterAnswer.IsSelected = 'Y'; + childQuestionRegisterAnswer.Content = answer.questionRegisterAnswer.Content; + + } } } } return questionRegisterDto; } + + /// + /// 更新 + /// + /// + /// + [HttpPost("api/app/QuestionRegister/Update")] + public async Task UpdateAsync(QuestionRegisterDto input) + { + var questionRegister = await _repository.GetAsync(o => o.QuestionRegisterId == input.QuestionRegisterId); + var questionRegisterItemList = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync() + join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync() + on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId + where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId + select new + { + questionRegisterItem, + questionRegisterAnswer, + }).ToList(); + //删除所有答案和项目 + + var questionRegisterItems = questionRegisterItemList + .GroupBy(o => o.questionRegisterItem) + .Select(x => x.FirstOrDefault().questionRegisterItem) + .ToList(); + foreach (var questionRegisterItem in questionRegisterItems) + { + //删除答案 + var questionRegisterAnswers = questionRegisterItemList. + Where(o => o.questionRegisterItem.QuestionRegisterItemId == questionRegisterItem.QuestionRegisterItemId) + .Select(x => x.questionRegisterAnswer) + .ToList(); + await _questionRegisterAnswerRrepository.DeleteManyAsync(questionRegisterAnswers); + } + //删除问题 + await _questionRegisterItemRepository.DeleteManyAsync(questionRegisterItems); + //重新设置 + questionRegister.QuestionRegisterItems = new List(); + + foreach (var questionRegisterItemDto in input.QuestionRegisterItems) + { + foreach (var questionRegisterAnswerDto in questionRegisterItemDto.QuestionRegisterAnswers) + { + if (questionRegisterAnswerDto.IsSelected == 'Y') + { + var questionRegisterItem = questionRegister.QuestionRegisterItems + .Where(o => o.QuestionId == questionRegisterItemDto.QuestionId).FirstOrDefault(); + if (questionRegisterItem == null) + { + questionRegisterItem = new QuestionRegisterItem() + { + QuestionRegisterItemId = questionRegisterItemDto.QuestionRegisterItemId, + QuestionRegisterId = questionRegister.QuestionRegisterId, + QuestionId = questionRegisterItemDto.QuestionId, + }; + questionRegister.QuestionRegisterItems.Add(questionRegisterItem); + // await _questionRegisterItemRepository.InsertAsync(questionRegisterItem); + } + var questionRegisterAnswer = new QuestionRegisterAnswer() + { + QuestionRegisterAnswerId = Guid.NewGuid(), + QuestionRegisterItemId = questionRegisterItem.QuestionRegisterItemId, + QuestionAnswerId = questionRegisterAnswerDto.QuestionAnswerId, + Content = questionRegisterAnswerDto.Content, + + }; + questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer); + + foreach (var childQuestionRegisterAnswer in questionRegisterAnswerDto.Childs) + { + questionRegisterAnswer = new QuestionRegisterAnswer() + { + QuestionRegisterAnswerId = Guid.NewGuid(), + QuestionRegisterItemId = questionRegisterItem.QuestionRegisterItemId, + QuestionAnswerId = childQuestionRegisterAnswer.QuestionAnswerId, + Content = childQuestionRegisterAnswer.Content, + + }; + questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer); + } + + } + } + } + await _repository.UpdateAsync(questionRegister); + } private async Task GetBasicDataAsync(PersonIdInputDto input) { var questions = await _questionRepository.GetListAsync(o => o.IsActive == 'Y'); @@ -127,11 +239,14 @@ namespace Shentun.WebPeis.QuestionRegisters var questionRegisterAnswer = new QuestionRegisterAnswerDto() { QuestionRegisterAnswerId = GuidGenerator.Create(), + QuestionId = question.QuestionId, QuestionAnswerId = questionAnswer.QuestionAnswerId, QuestionAnswerName = questionAnswer.QuestionAnswerName, ChildAnswerType = questionAnswer.ChildAnswerType, AnswerResultType = questionAnswer.AnswerResultType, IsSelected = 'N', + ChildAnswerTitle = questionAnswer.ChildAnswerTitle, + IsNone = questionAnswer.IsNone, DisplayOrder = questionAnswer.DisplayOrder, ParentId = questionAnswer.ParentId, PathCode = questionAnswer.PathCode, @@ -144,14 +259,17 @@ namespace Shentun.WebPeis.QuestionRegisters var childQuestionRegisterAnswer = new QuestionRegisterAnswerDto() { QuestionRegisterAnswerId = GuidGenerator.Create(), + QuestionId = question.QuestionId, QuestionAnswerId = ChilduestionAnswer.QuestionAnswerId, QuestionAnswerName = ChilduestionAnswer.QuestionAnswerName, ChildAnswerType = ChilduestionAnswer.ChildAnswerType, AnswerResultType = ChilduestionAnswer.AnswerResultType, IsSelected = 'N', + ChildAnswerTitle = questionAnswer.ChildAnswerTitle, + IsNone = questionAnswer.IsNone, DisplayOrder = ChilduestionAnswer.DisplayOrder, ParentId = ChilduestionAnswer.ParentId, - PathCode= ChilduestionAnswer.PathCode, + PathCode = ChilduestionAnswer.PathCode, }; diff --git a/src/Shentun.WebPeis.Domain/QuestionRegisters/QuestionRegisterManager.cs b/src/Shentun.WebPeis.Domain/QuestionRegisters/QuestionRegisterManager.cs index 3cfc8e5..b0ae829 100644 --- a/src/Shentun.WebPeis.Domain/QuestionRegisters/QuestionRegisterManager.cs +++ b/src/Shentun.WebPeis.Domain/QuestionRegisters/QuestionRegisterManager.cs @@ -36,29 +36,29 @@ namespace Shentun.WebPeis.QuestionRegisters throw new UserFriendlyException("PersonId不能为空"); } entity.QuestionRegisterId = GuidGenerator.Create(); - //var questions = await _questionRepository.GetListAsync(o => o.IsActive == 'Y'); - //var questionAnswers = await _questionAnswerRepository.GetListAsync(); - //foreach (var question in questions) - //{ - // var questionRegisterItem = new QuestionRegisterItem() - // { - // QuestionRegisterItemId = GuidGenerator.Create(), - // QuestionRegisterId = entity.QuestionRegisterId, - // QuestionId = question.QuestionId, - // }; - // foreach (var questionAnswer in questionAnswers) - // { - // var questionRegisterAnswer = new QuestionRegisterAnswer() - // { - // QuestionRegisterAnswerId = GuidGenerator.Create(), - // QuestionRegisterItemId = questionRegisterItem.QuestionRegisterItemId, - // QuestionAnswerId = questionAnswer.QuestionAnswerId, - // }; - // questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer); - // } - // entity.QuestionRegisterItems.Add(questionRegisterItem); + var questions = await _questionRepository.GetListAsync(o => o.IsActive == 'Y'); + var questionAnswers = await _questionAnswerRepository.GetListAsync(); + foreach (var question in questions) + { + var questionRegisterItem = new QuestionRegisterItem() + { + QuestionRegisterItemId = GuidGenerator.Create(), + QuestionRegisterId = entity.QuestionRegisterId, + QuestionId = question.QuestionId, + }; + foreach (var questionAnswer in questionAnswers) + { + var questionRegisterAnswer = new QuestionRegisterAnswer() + { + QuestionRegisterAnswerId = GuidGenerator.Create(), + QuestionRegisterItemId = questionRegisterItem.QuestionRegisterItemId, + QuestionAnswerId = questionAnswer.QuestionAnswerId, + }; + questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer); + } + entity.QuestionRegisterItems.Add(questionRegisterItem); - //} + } return entity; } } diff --git a/test/Shentun.WebPeis.Application.Tests/QuestionRegisterAppServiceTest.cs b/test/Shentun.WebPeis.Application.Tests/QuestionRegisterAppServiceTest.cs index fa10199..7b71c38 100644 --- a/test/Shentun.WebPeis.Application.Tests/QuestionRegisterAppServiceTest.cs +++ b/test/Shentun.WebPeis.Application.Tests/QuestionRegisterAppServiceTest.cs @@ -42,16 +42,19 @@ namespace Shentun.WebPeis }); foreach (var item in entity.QuestionRegisterItems) { - _output.WriteLine("-----------" + item.QuestionName); + _output.WriteLine("-----------" + item.QuestionName + "-" + item.AnswerType ); foreach (var answer in item.QuestionRegisterAnswers) { - _output.WriteLine(answer.QuestionAnswerName); + _output.WriteLine(answer.QuestionAnswerName + "-" + answer.ChildAnswerType ); + answer.IsSelected = 'Y'; foreach(var childAnswer in answer.Childs) { - _output.WriteLine("----"+childAnswer.QuestionAnswerName); + _output.WriteLine("----"+childAnswer.QuestionAnswerName ); + childAnswer.IsSelected = 'Y'; } } } + await _appService.UpdateAsync( entity ); await unitOfWork.CompleteAsync(); } }