using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Org.BouncyCastle.Math.EC.Rfc7748; using Shentun.WebPeis.Enums; 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.Application.Services; using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Repositories; using Volo.Abp.Uow; namespace Shentun.WebPeis.QuestionRegisters { [ApiExplorerSettings(GroupName = "Work")] [Authorize] public class QuestionRegisterAppService : ApplicationService { private readonly IRepository _repository; private readonly IRepository _questionRegisterItemRepository; private readonly IRepository _questionRegisterAnswerRrepository; private readonly IRepository _questionRepository; private readonly IRepository _questionAnswerRepository; private readonly IRepository _questionSubjectTypeRepository; private readonly QuestionRegisterManager _questionRegisterManager; private readonly IUnitOfWorkManager _unitOfWorkManager; public QuestionRegisterAppService(IRepository repository, IRepository questionRegisterItemRepository, IRepository questionRegisterAnswerRrepository, IRepository questionRepository, IRepository questionAnswerRepository, QuestionRegisterManager questionRegisterManager, IUnitOfWorkManager unitOfWorkManager, IRepository questionSubjectTypeRepository) { _repository = repository; _questionRegisterItemRepository = questionRegisterItemRepository; _questionRegisterAnswerRrepository = questionRegisterAnswerRrepository; _questionRepository = questionRepository; _questionAnswerRepository = questionAnswerRepository; _questionRegisterManager = questionRegisterManager; _unitOfWorkManager = unitOfWorkManager; _questionSubjectTypeRepository = questionSubjectTypeRepository; } /// /// 获取人员问卷 /// /// /// [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) { //没有登记过 //questionRegister = new QuestionRegister(); //questionRegister.PersonId = input.PersonId; //questionRegister = await _questionRegisterManager.CreateAsync(questionRegister); //await _repository.InsertAsync(questionRegister); //questionRegisterDto.QuestionRegisterId = questionRegister.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 where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId select new { questionRegisterItem, questionRegisterAnswer, }).ToList(); foreach (var questionRegisterItemDto in questionRegisterDto.QuestionRegisterItems) { var questionRegisterItemEntity = questionRegisterItems.Where(o => o.questionRegisterItem.QuestionId == questionRegisterItemDto.QuestionId).FirstOrDefault(); if (questionRegisterItemEntity != null) { questionRegisterItemDto.QuestionRegisterItemId = questionRegisterItemEntity.questionRegisterItem.QuestionRegisterItemId; } foreach (var questionRegisterAnswer in questionRegisterItemDto.QuestionRegisterAnswers) { var answer = questionRegisterItems.Where( o => o.questionRegisterAnswer.QuestionAnswerId == questionRegisterAnswer.QuestionAnswerId) .SingleOrDefault(); if (answer != null) { questionRegisterAnswer.IsSelected = 'Y'; questionRegisterAnswer.Content = answer.questionRegisterAnswer.Content; } foreach (var childQuestionRegisterAnswer in questionRegisterAnswer.Childs) { answer = questionRegisterItems.Where( o => o.questionRegisterAnswer.QuestionAnswerId == childQuestionRegisterAnswer.QuestionAnswerId) .SingleOrDefault(); if (answer != null) { childQuestionRegisterAnswer.IsSelected = 'Y'; childQuestionRegisterAnswer.Content = answer.questionRegisterAnswer.Content; } } } } return questionRegisterDto; } /// /// /// /// /// [HttpPost("api/app/QuestionRegister/GetSubjectTypeListByPersonId")] public async Task> GetSubjectTypeListByPersonIdAsync(PersonIdInputDto input) { var questionRegister = (await _repository.GetQueryableAsync()) .Where(o => o.PersonId == input.PersonId) .OrderByDescending(o => o.CreationTime) .FirstOrDefault(); if (questionRegister == null) { return null; } var questionRegisterItems = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync() join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync() on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId join questionAnswer in await _questionAnswerRepository.GetQueryableAsync() on questionRegisterAnswer.QuestionAnswerId equals questionAnswer.QuestionAnswerId join question in await _questionRepository.GetQueryableAsync() on questionRegisterItem.QuestionId equals question.QuestionId join questionSubjectType in await _questionSubjectTypeRepository.GetQueryableAsync() on question.QuestionSubjectTypeId equals questionSubjectType.QuestionSubjectTypeId where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId select new { questionSubjectType, questionRegisterItem, questionRegisterAnswer, questionAnswer }).ToList(); var personSubjectTypeDtos = questionRegisterItems.GroupBy(o=>o.questionSubjectType) .Select(o=>new PersonSubjectTypeDto() { QuestionSubjectTypeId = o.Key.QuestionSubjectTypeId, QuestionSubjectTypeName = o.Key.QuestionSubjectTypeName, DisplayOrder = o.Key.DisplayOrder }).ToList(); foreach (var personSubjectTypeDto in personSubjectTypeDtos) { questionRegisterItems.Where(o => o.questionSubjectType.QuestionSubjectTypeId == personSubjectTypeDto.QuestionSubjectTypeId ).ToList(); foreach(var questionRegisterItem in questionRegisterItems) { string answer; if(questionRegisterItem.questionAnswer.AnswerResultType == AnswerResultTypeFlag.Choice) { if(string.IsNullOrWhiteSpace(questionRegisterItem.questionAnswer.Aliases)) { answer = questionRegisterItem.questionAnswer.QuestionAnswerName; } else { answer = questionRegisterItem.questionAnswer.Aliases; } } else { answer = questionRegisterItem.questionRegisterAnswer.Content; } personSubjectTypeDto.Answers.Add(new PersonSubjectTypeQuestionAnswer() { QuestionAnswerName = answer, DisplayOrder = questionRegisterItem.questionAnswer.DisplayOrder, }); } } return personSubjectTypeDtos; } /// /// /// /// /// [HttpPost("api/app/QuestionRegister/Create")] public async Task CreateAsync(QuestionRegisterDto input) { var questionRegister = new QuestionRegister(); questionRegister.PersonId = input.PersonId; questionRegister = await _questionRegisterManager.CreateAsync(questionRegister); 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 = GuidGenerator.Create(), QuestionRegisterItemId = questionRegisterItem.QuestionRegisterItemId, QuestionAnswerId = questionRegisterAnswerDto.QuestionAnswerId, Content = questionRegisterAnswerDto.Content, }; questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer); foreach (var childQuestionRegisterAnswer in questionRegisterAnswerDto.Childs) { if(childQuestionRegisterAnswer.IsSelected == 'Y') { questionRegisterAnswer = new QuestionRegisterAnswer() { QuestionRegisterAnswerId = GuidGenerator.Create(), QuestionRegisterItemId = questionRegisterItem.QuestionRegisterItemId, QuestionAnswerId = childQuestionRegisterAnswer.QuestionAnswerId, Content = childQuestionRegisterAnswer.Content, }; questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer); } } } } } await _repository.InsertAsync(questionRegister); } /// /// 更新 /// /// /// [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 = GuidGenerator.Create(), QuestionRegisterItemId = questionRegisterItem.QuestionRegisterItemId, QuestionAnswerId = questionRegisterAnswerDto.QuestionAnswerId, Content = questionRegisterAnswerDto.Content, }; questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer); foreach (var childQuestionRegisterAnswer in questionRegisterAnswerDto.Childs) { if (childQuestionRegisterAnswer.IsSelected == 'Y') { questionRegisterAnswer = new QuestionRegisterAnswer() { QuestionRegisterAnswerId = GuidGenerator.Create(), 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'); var questionAnswers = await _questionAnswerRepository.GetListAsync(); var questionRegisterDto = new QuestionRegisterDto() { QuestionRegisterId = GuidGenerator.Create(), 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(), 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, }; //二级答案 var childQuestionAnswers = questionAnswers.Where(o => o.ParentId == questionAnswer.QuestionAnswerId).ToList(); foreach (var ChilduestionAnswer in childQuestionAnswers) { 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, }; questionRegisterAnswer.Childs.Add(childQuestionRegisterAnswer); } questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer); } questionRegisterDto.QuestionRegisterItems.Add(questionRegisterItem); } return questionRegisterDto; } private async Task GetTest(PersonIdInputDto input) { var questionRegisterDto = new QuestionRegisterDto() { QuestionRegisterId = Guid.NewGuid(), PersonId = input.PersonId, }; // var questionRegisterItemDto = new QuestionRegisterItemDto() { QuestionId = Guid.NewGuid(), QuestionName = "你最近3-6个月是否有生育计划", AnswerType = AnswerTypeFlag.SingleChoice, DisplayOrder = 1 }; questionRegisterDto.QuestionRegisterItems.Add(questionRegisterItemDto); var questionRegisterAnswerDto = new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "无", DisplayOrder = 1, AnswerResultType = '0' }; questionRegisterAnswerDto = new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "有", DisplayOrder = 2, AnswerResultType = '0' }; questionRegisterItemDto.QuestionRegisterAnswers.Add(questionRegisterAnswerDto); // questionRegisterItemDto = new QuestionRegisterItemDto() { QuestionId = Guid.NewGuid(), QuestionName = "您的父亲、母亲、兄弟、姐妹、目前或曾经是否有以下明确诊断的病?", AnswerType = AnswerTypeFlag.MultipleChoice, DisplayOrder = 2 }; questionRegisterDto.QuestionRegisterItems.Add(questionRegisterItemDto); questionRegisterAnswerDto = new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "恶性肿瘤", DisplayOrder = 1, AnswerResultType = '0' }; questionRegisterItemDto.QuestionRegisterAnswers.Add(questionRegisterAnswerDto); questionRegisterAnswerDto = new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "心脏病", DisplayOrder = 2, AnswerResultType = '0' }; questionRegisterItemDto.QuestionRegisterAnswers.Add(questionRegisterAnswerDto); questionRegisterAnswerDto = new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "脑血管病", DisplayOrder = 3, AnswerResultType = '0' }; questionRegisterItemDto.QuestionRegisterAnswers.Add(questionRegisterAnswerDto); // questionRegisterItemDto = new QuestionRegisterItemDto() { QuestionId = Guid.NewGuid(), QuestionName = "您目前或曾经是否有以下明确诊断的疾病", AnswerType = AnswerTypeFlag.MultipleChoice, DisplayOrder = 3 }; questionRegisterDto.QuestionRegisterItems.Add(questionRegisterItemDto); questionRegisterAnswerDto = new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "头部疾病", DisplayOrder = 1, AnswerResultType = '0', ChildAnswerType = AnswerTypeFlag.MultipleChoice, }; questionRegisterAnswerDto.Childs.Add(new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "脑中风", DisplayOrder = 1, AnswerResultType = '0', }); questionRegisterAnswerDto.Childs.Add(new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "抑郁症", DisplayOrder = 1, AnswerResultType = '0', }); questionRegisterAnswerDto.Childs.Add(new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "癫痫", DisplayOrder = 1, AnswerResultType = '0', }); questionRegisterAnswerDto.Childs.Add(new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "其它", DisplayOrder = 1, AnswerResultType = '1', }); questionRegisterItemDto.QuestionRegisterAnswers.Add(questionRegisterAnswerDto); questionRegisterAnswerDto = new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "甲状腺疾病", DisplayOrder = 2, AnswerResultType = '0' }; questionRegisterItemDto.QuestionRegisterAnswers.Add(questionRegisterAnswerDto); questionRegisterAnswerDto = new QuestionRegisterAnswerDto() { QuestionAnswerId = Guid.NewGuid(), QuestionAnswerName = "肺部疾病", DisplayOrder = 3, AnswerResultType = '0' }; questionRegisterItemDto.QuestionRegisterAnswers.Add(questionRegisterAnswerDto); } } }