diff --git a/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterAnswerDto.cs b/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterAnswerDto.cs index 2792a3e..8857593 100644 --- a/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterAnswerDto.cs +++ b/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterAnswerDto.cs @@ -46,6 +46,16 @@ namespace Shentun.WebPeis.QuestionRegisters public char IsSelected { get; set; } = 'N'; + /// + /// 父答案ID + /// + public Guid? ParentId { get; set; } + /// + /// 编码路径 + /// + + public string? PathCode { get; set; } + public List Childs = new List(); } diff --git a/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterItemDto.cs b/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterItemDto.cs index 73e0465..b4cd63c 100644 --- a/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterItemDto.cs +++ b/src/Shentun.WebPeis.Application.Contracts/QuestionRegisters/QuestionRegisterItemDto.cs @@ -29,6 +29,16 @@ namespace Shentun.WebPeis.QuestionRegisters public char? AnswerType { get; set; } + /// + /// 父问题ID + /// + public Guid? ParentId { get; set; } + /// + /// 编码路径 + /// + + public string? PathCode { get; set; } + public virtual ICollection QuestionRegisterAnswers { get; set; } = new List(); } } diff --git a/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs b/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs index 324623f..b51d035 100644 --- a/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs +++ b/src/Shentun.WebPeis.Application/QuestionRegisters/QuestionRegisterAppService.cs @@ -1,4 +1,6 @@ -using Shentun.WebPeis.Enums; +using Microsoft.AspNetCore.Mvc; +using Org.BouncyCastle.Math.EC.Rfc7748; +using Shentun.WebPeis.Enums; using Shentun.WebPeis.Models; using Shentun.WebPeis.Persons; using System; @@ -7,6 +9,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; namespace Shentun.WebPeis.QuestionRegisters @@ -18,21 +21,148 @@ namespace Shentun.WebPeis.QuestionRegisters private readonly IRepository _questionRegisterAnswerRrepository; private readonly IRepository _questionRepository; private readonly IRepository _questionAnswerRepository; - - public QuestionRegisterAppService(IRepository repository, + private readonly QuestionRegisterManager _questionRegisterManager; + public QuestionRegisterAppService(IRepository repository, IRepository questionRegisterItemRepository, IRepository questionRegisterAnswerRrepository, IRepository questionRepository, - IRepository questionAnswerRepository) + IRepository questionAnswerRepository, + QuestionRegisterManager questionRegisterManager) { _repository = repository; _questionRegisterItemRepository = questionRegisterItemRepository; _questionRegisterAnswerRrepository = questionRegisterAnswerRrepository; _questionRepository = questionRepository; _questionAnswerRepository = questionAnswerRepository; + _questionRegisterManager = questionRegisterManager; } + /// + /// 获取人员问卷 + /// + /// + /// + [HttpPost("api/app/QuestionRegister/GetByPersonId")] + public async Task GetByPersonIdAsync(PersonIdInputDto input) + { + + var questions = await _questionRepository.GetListAsync(o => o.IsActive == 'Y'); + var questionAnswers = await _questionAnswerRepository.GetListAsync(); + var questionRegister = (await _repository.GetQueryableAsync()) + .Where(o => o.PersonId == input.PersonId) + .OrderByDescending(o => o.CreationTime) + .FirstOrDefault(); + + QuestionRegisterDto questionRegisterDto; + questionRegisterDto = await GetBasicDataAsync(input); + if (questionRegister == null) + { + var questionRegisterEntity = new QuestionRegister(); + questionRegisterEntity.PersonId = input.PersonId; + questionRegisterEntity = await _questionRegisterManager.CreateAsync(questionRegisterEntity); + questionRegisterDto.QuestionRegisterId = questionRegisterEntity.QuestionRegisterId; + return questionRegisterDto; + } + + var questionRegisterItems = (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(); + + + + + foreach (var questionRegisterItem in questionRegisterDto.QuestionRegisterItems) + { + foreach (var questionRegisterAnswer in questionRegisterItem.QuestionRegisterAnswers) + { + var answer = questionRegisterItems.Where( + o=>o.questionRegisterAnswer.QuestionRegisterAnswerId == questionRegisterAnswer.QuestionRegisterAnswerId) + .SingleOrDefault(); + if(answer != null) + { + questionRegisterAnswer.IsSelected = 'Y'; + } + } + } + return questionRegisterDto; + + } + private async Task GetBasicDataAsync(PersonIdInputDto input) + { + var questions = await _questionRepository.GetListAsync(o => o.IsActive == 'Y'); + var questionAnswers = await _questionAnswerRepository.GetListAsync(); + var questionRegisterDto = new QuestionRegisterDto() + { + QuestionRegisterId = Guid.NewGuid(), + PersonId = input.PersonId, + }; + //问卷 + foreach (var question in questions) + { + + var questionRegisterItem = new QuestionRegisterItemDto() + { + QuestionRegisterItemId = GuidGenerator.Create(), + QuestionId = question.QuestionId, + QuestionName = question.QuestionName, + AnswerType = question.AnswerType, + DisplayOrder = question.DisplayOrder, + ParentId = question.ParentId, + PathCode = question.PathCode, + + }; + //一级答案 + var firstLevelQuestionAnswers = questionAnswers.Where(o => o.QuestionId == question.QuestionId && + o.PathCode.Length == 5).ToList(); + foreach (var questionAnswer in firstLevelQuestionAnswers) + { + var questionRegisterAnswer = new QuestionRegisterAnswerDto() + { + QuestionRegisterAnswerId = GuidGenerator.Create(), + QuestionAnswerId = questionAnswer.QuestionAnswerId, + QuestionAnswerName = questionAnswer.QuestionAnswerName, + ChildAnswerType = questionAnswer.ChildAnswerType, + AnswerResultType = questionAnswer.AnswerResultType, + IsSelected = 'N', + DisplayOrder = questionAnswer.DisplayOrder, + ParentId = questionAnswer.ParentId, + PathCode = questionAnswer.PathCode, + + }; + //二级答案 + var childQuestionAnswers = questionAnswers.Where(o => o.ParentId == questionAnswer.QuestionAnswerId).ToList(); + foreach (var ChilduestionAnswer in childQuestionAnswers) + { + var childQuestionRegisterAnswer = new QuestionRegisterAnswerDto() + { + QuestionRegisterAnswerId = GuidGenerator.Create(), + QuestionAnswerId = ChilduestionAnswer.QuestionAnswerId, + QuestionAnswerName = ChilduestionAnswer.QuestionAnswerName, + ChildAnswerType = ChilduestionAnswer.ChildAnswerType, + AnswerResultType = ChilduestionAnswer.AnswerResultType, + IsSelected = 'N', + DisplayOrder = ChilduestionAnswer.DisplayOrder, + ParentId = ChilduestionAnswer.ParentId, + PathCode= ChilduestionAnswer.PathCode, - public async Task GetByPersonId(PersonIdInputDto input) + + }; + questionRegisterAnswer.Childs.Add(childQuestionRegisterAnswer); + } + questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer); + } + questionRegisterDto.QuestionRegisterItems.Add(questionRegisterItem); + + } + + return questionRegisterDto; + } + private async Task GetTest(PersonIdInputDto input) { var questionRegisterDto = new QuestionRegisterDto() { @@ -118,7 +248,7 @@ namespace Shentun.WebPeis.QuestionRegisters DisplayOrder = 1, AnswerResultType = '0', ChildAnswerType = AnswerTypeFlag.MultipleChoice, - + }; questionRegisterAnswerDto.Childs.Add(new QuestionRegisterAnswerDto() { @@ -166,8 +296,6 @@ namespace Shentun.WebPeis.QuestionRegisters AnswerResultType = '0' }; questionRegisterItemDto.QuestionRegisterAnswers.Add(questionRegisterAnswerDto); - - } } } diff --git a/src/Shentun.WebPeis.Domain/Models/QuestionAnswer.cs b/src/Shentun.WebPeis.Domain/Models/QuestionAnswer.cs index 01db6bb..840f437 100644 --- a/src/Shentun.WebPeis.Domain/Models/QuestionAnswer.cs +++ b/src/Shentun.WebPeis.Domain/Models/QuestionAnswer.cs @@ -49,15 +49,15 @@ public partial class QuestionAnswer : AuditedEntity, IHasConcurrencyStamp /// 概述 /// - public string Overview { get; set; } + public string? Overview { get; set; } /// /// 可能原因 /// - public string Reason { get; set; } + public string? Reason { get; set; } /// /// 健康指导 /// - public string HealthGuidance { get; set; } + public string? HealthGuidance { get; set; } /// /// 父答案ID diff --git a/src/Shentun.WebPeis.Domain/Models/QuestionRegister.cs b/src/Shentun.WebPeis.Domain/Models/QuestionRegister.cs index a2c4a83..9c544ad 100644 --- a/src/Shentun.WebPeis.Domain/Models/QuestionRegister.cs +++ b/src/Shentun.WebPeis.Domain/Models/QuestionRegister.cs @@ -10,6 +10,15 @@ namespace Shentun.WebPeis.Models; /// public partial class QuestionRegister: AuditedEntity, IHasConcurrencyStamp { + public QuestionRegister() + { + + } + + public QuestionRegister(Guid id) + { + QuestionRegisterId = id; + } /// /// 主键 /// diff --git a/src/Shentun.WebPeis.Domain/QuestionRegisters/QuestionRegisterManager.cs b/src/Shentun.WebPeis.Domain/QuestionRegisters/QuestionRegisterManager.cs new file mode 100644 index 0000000..3cfc8e5 --- /dev/null +++ b/src/Shentun.WebPeis.Domain/QuestionRegisters/QuestionRegisterManager.cs @@ -0,0 +1,65 @@ +using Shentun.WebPeis.Models; +using Shentun.WebPeis.Persons; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Domain.Services; + +namespace Shentun.WebPeis.QuestionRegisters +{ + public class QuestionRegisterManager : DomainService + { + private readonly IRepository _questionRegisterItemRepository; + private readonly IRepository _questionRegisterAnswerRrepository; + private readonly IRepository _questionRepository; + private readonly IRepository _questionAnswerRepository; + public QuestionRegisterManager(IRepository questionRegisterItemRepository, + IRepository questionRegisterAnswerRrepository, + IRepository questionRepository, + IRepository questionAnswerRepository) + { + _questionRegisterItemRepository = questionRegisterItemRepository; + _questionRegisterAnswerRrepository = questionRegisterAnswerRrepository; + _questionRepository = questionRepository; + _questionAnswerRepository = questionAnswerRepository; + } + + public async Task CreateAsync( + QuestionRegister entity) + { + if (entity.PersonId == Guid.Empty) + { + 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); + + //} + return entity; + } + } +} diff --git a/test/Shentun.WebPeis.Application.Tests/QuestionRegisterAppServiceTest.cs b/test/Shentun.WebPeis.Application.Tests/QuestionRegisterAppServiceTest.cs new file mode 100644 index 0000000..fa10199 --- /dev/null +++ b/test/Shentun.WebPeis.Application.Tests/QuestionRegisterAppServiceTest.cs @@ -0,0 +1,59 @@ +using Shentun.WebPeis.Asbitems; +using Shentun.WebPeis.Models; +using Shentun.WebPeis.Persons; +using Shentun.WebPeis.QuestionRegisters; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Modularity; +using Volo.Abp.Uow; +using Xunit; +using Xunit.Abstractions; + +namespace Shentun.WebPeis +{ + public class QuestionRegisterAppServiceTest : WebPeisApplicationTestBase + where TStartupModule : IAbpModule + { + private readonly IRepository _repository; + private readonly QuestionRegisterAppService _appService; + private readonly ITestOutputHelper _output; + private readonly IUnitOfWorkManager _unitOfWorkManager; + public QuestionRegisterAppServiceTest(ITestOutputHelper output) + { + _unitOfWorkManager = GetRequiredService(); + _repository = GetRequiredService>(); + _appService = GetRequiredService(); + _output = output; + } + + [Fact] + public async Task GetByPersonId() + { + using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true)) + { + + var entity = await _appService.GetByPersonIdAsync(new PersonIdInputDto() + { + PersonId = new Guid("3a12d7fa-63f1-d549-c2f8-01123e5b7a8a") + }); + foreach (var item in entity.QuestionRegisterItems) + { + _output.WriteLine("-----------" + item.QuestionName); + foreach (var answer in item.QuestionRegisterAnswers) + { + _output.WriteLine(answer.QuestionAnswerName); + foreach(var childAnswer in answer.Childs) + { + _output.WriteLine("----"+childAnswer.QuestionAnswerName); + } + } + } + await unitOfWork.CompleteAsync(); + } + } + } +} diff --git a/test/Shentun.WebPeis.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfcoreQuestionRegisterAppServiceTest.cs b/test/Shentun.WebPeis.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfcoreQuestionRegisterAppServiceTest.cs new file mode 100644 index 0000000..87ccc72 --- /dev/null +++ b/test/Shentun.WebPeis.EntityFrameworkCore.Tests/EntityFrameworkCore/Applications/EfcoreQuestionRegisterAppServiceTest.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit.Abstractions; + +namespace Shentun.WebPeis.EntityFrameworkCore.Applications +{ + public class EfcoreQuestionRegisterAppServiceTest : QuestionRegisterAppServiceTest + { + public EfcoreQuestionRegisterAppServiceTest(ITestOutputHelper output) : base(output) { } + } +}