You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

918 lines
49 KiB

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using NPOI.SS.Formula.Functions;
using Org.BouncyCastle.Math.EC.Rfc7748;
using Shentun.WebPeis.AppointPatientRegisters;
using Shentun.WebPeis.DiseaseRiskLevels;
using Shentun.WebPeis.Enums;
using Shentun.WebPeis.Models;
using Shentun.WebPeis.Persons;
using Shentun.WebPeis.SysParmValues;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
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<QuestionRegister> _repository;
private readonly IRepository<QuestionRegisterItem> _questionRegisterItemRepository;
private readonly IRepository<QuestionRegisterAnswer> _questionRegisterAnswerRrepository;
private readonly IRepository<Question> _questionRepository;
private readonly IRepository<QuestionAnswer> _questionAnswerRepository;
private readonly IRepository<QuestionSubjectType> _questionSubjectTypeRepository;
private readonly IRepository<DiseaseRisk> _diseaseRiskRepository;
private readonly IRepository<DiseaseRiskLevel> _diseaseRiskLevelRepository;
private readonly IRepository<QuestionAnswerRiskLevel> _questionAnswerRiskLevelRepository;
private readonly IRepository<QuestionAnswerAsbitem> _questionAnswerAsbitemRepository;
private readonly IRepository<Asbitem> _asbitemRepository;
private readonly IRepository<Person> _personRepository;
private readonly QuestionRegisterManager _questionRegisterManager;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly SysParmValueManager _sysParmValueManager;
private readonly PersonManager _personManager;
public QuestionRegisterAppService(IRepository<QuestionRegister> repository,
IRepository<QuestionRegisterItem> questionRegisterItemRepository,
IRepository<QuestionRegisterAnswer> questionRegisterAnswerRrepository,
IRepository<Question> questionRepository,
IRepository<QuestionAnswer> questionAnswerRepository,
QuestionRegisterManager questionRegisterManager,
IUnitOfWorkManager unitOfWorkManager,
IRepository<QuestionSubjectType> questionSubjectTypeRepository,
IRepository<DiseaseRisk> diseaseRiskRepository,
IRepository<DiseaseRiskLevel> diseaseRiskLevelRepository,
IRepository<QuestionAnswerRiskLevel> questionAnswerRiskLevelRepository,
IRepository<QuestionAnswerAsbitem> questionAnswerAsbitemRepository,
IRepository<Asbitem> asbitemRepository,
SysParmValueManager sysParmValueManager,
IRepository<Person> personRepository,
PersonManager personManager)
{
_repository = repository;
_questionRegisterItemRepository = questionRegisterItemRepository;
_questionRegisterAnswerRrepository = questionRegisterAnswerRrepository;
_questionRepository = questionRepository;
_questionAnswerRepository = questionAnswerRepository;
_questionRegisterManager = questionRegisterManager;
_unitOfWorkManager = unitOfWorkManager;
_questionSubjectTypeRepository = questionSubjectTypeRepository;
_diseaseRiskRepository = diseaseRiskRepository;
_diseaseRiskLevelRepository = diseaseRiskLevelRepository;
_questionAnswerRiskLevelRepository = questionAnswerRiskLevelRepository;
_questionAnswerAsbitemRepository = questionAnswerAsbitemRepository;
_asbitemRepository = asbitemRepository;
_sysParmValueManager = sysParmValueManager;
_personRepository = personRepository;
_personManager = personManager;
}
/// <summary>
/// 获取人员问卷
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QuestionRegister/GetByPersonId")]
public async Task<QuestionRegisterDto> 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)
{
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;
}
/// <summary>
/// 获取生育计划、危险因素、疾病等列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QuestionRegister/GetSubjectTypeListByPersonId")]
public async Task<List<PersonSubjectTypeDto>> 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
orderby questionSubjectType.DisplayOrder
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)
{
var questionSubjectTypeItems = questionRegisterItems.Where(o =>
o.questionSubjectType.QuestionSubjectTypeId == personSubjectTypeDto.QuestionSubjectTypeId)
.OrderBy(o => o.questionAnswer.DisplayOrder).ToList();
foreach (var questionRegisterItem in questionSubjectTypeItems)
{
if (questionRegisterItem.questionAnswer.IsNone == 'Y')
{
continue;
}
if (questionRegisterItems.Where(o =>
(o.questionAnswer.PathCode.StartsWith(questionRegisterItem.questionAnswer.PathCode + ".") &&
questionRegisterItem.questionAnswer.PathCode.Length == 5)).Any())
{
continue;
}
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;
}
if (string.IsNullOrWhiteSpace(answer))
{
continue;
}
personSubjectTypeDto.Answers.Add(new PersonSubjectTypeQuestionAnswer()
{
QuestionAnswerName = answer,
DisplayOrder = questionRegisterItem.questionAnswer.DisplayOrder,
});
}
}
//超重信息
//var person = await _personRepository.GetAsync(o => o.PersonId == input.PersonId);
_personManager.IsOverweight(input.PersonId);
var isOverweight = await _personManager.IsOverweight(input.PersonId); //await IsOverweight(person.Height, person.Weight);
if (isOverweight)
{
//危险因素编码是03
var personSubjectTypeDto = personSubjectTypeDtos.Where(o => o.QuestionSubjectTypeId == "03").Single();
var questionAnswerOverweightCodeStr = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "question_answer_overweight_code");
if (!Guid.TryParse(questionAnswerOverweightCodeStr, out var questionAnswerOverweightCode))
{
throw new UserFriendlyException("在系统参数中超重编码维护不正确");
}
var questionAnswer = await _questionAnswerRepository.GetAsync(o => o.QuestionAnswerId == questionAnswerOverweightCode);
personSubjectTypeDto.Answers.Add(new PersonSubjectTypeQuestionAnswer()
{
QuestionAnswerName = questionAnswer.QuestionAnswerName,
DisplayOrder = questionAnswer.DisplayOrder,
});
}
return personSubjectTypeDtos;
}
/// <summary>
/// 获取问卷结果列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QuestionRegister/GetQuestionRegisterListByPersonId")]
public async Task<List<QuestionRegisterItemResultDto>> GetQuestionRegisterListByPersonIdAsync(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
orderby questionSubjectType.DisplayOrder, question.DisplayOrder
select new
{
questionSubjectType,
question,
questionRegisterItem,
questionRegisterAnswer,
questionAnswer
}).ToList();
var questions = questionRegisterItems.GroupBy(o => o.question)
.Select(o => new QuestionRegisterItemResultDto()
{
QuestionId = o.Key.QuestionId,
QuestionName = o.Key.QuestionName,
DisplayOrder = o.Key.DisplayOrder
}).ToList();
foreach (var question in questions)
{
var questionAnswers = questionRegisterItems.Where(o =>
o.question.QuestionId == question.QuestionId)
.OrderBy(o => o.questionAnswer.DisplayOrder).ToList();
foreach (var questionRegisterItem in questionAnswers)
{
if (questionRegisterItems.Where(o =>
(o.questionAnswer.PathCode.StartsWith(questionRegisterItem.questionAnswer.PathCode + ".") &&
questionRegisterItem.questionAnswer.PathCode.Length == 5)).Any())
{
continue;
}
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;
}
if (string.IsNullOrWhiteSpace(answer))
{
continue;
}
question.Answers.Add(new QuestionRegisterItemResultAnswer()
{
Answer = answer,
DisplayOrder = questionRegisterItem.questionAnswer.DisplayOrder,
});
}
}
return questions;
}
/// <summary>
/// 获取疾病风险列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QuestionRegister/GetDiseaseRiskListByPersonId")]
public async Task<List<QuestionRegisterDiseaseRiskDto>> GetDiseaseRiskListByPersonIdAsync(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
orderby questionSubjectType.DisplayOrder, question.DisplayOrder
select new
{
questionSubjectType,
question,
questionRegisterItem,
questionRegisterAnswer,
questionAnswer
}).ToList();
//获取疾病风险基础字典信息
var diseaseRisks = (from diseaseRisk in await _diseaseRiskRepository.GetQueryableAsync()
join diseaseRiskLevel in await _diseaseRiskLevelRepository.GetQueryableAsync()
on diseaseRisk.DiseaseRiskId equals diseaseRiskLevel.DiseaseRiskId into emptyDiseaseRiskLevel
from haveDiseaseRiskLevel in emptyDiseaseRiskLevel.DefaultIfEmpty()
join questionAnswerRiskLevel in await _questionAnswerRiskLevelRepository.GetQueryableAsync()
on haveDiseaseRiskLevel.DiseaseRiskLevelId equals questionAnswerRiskLevel.DiseaseRiskLevelId into emptyQuestionAnswerRiskLevel
from haveQuestionAnswerRiskLevel in emptyQuestionAnswerRiskLevel.DefaultIfEmpty()
orderby diseaseRisk.DisplayOrder
select new
{
diseaseRisk,
haveDiseaseRiskLevel,
haveQuestionAnswerRiskLevel
}).ToList();
var questionRegisterDiseaseRiskDtos = diseaseRisks.GroupBy(o => o.diseaseRisk)
.Select(o => new QuestionRegisterDiseaseRiskDto()
{
DiseaseRiskId = o.Key.DiseaseRiskId,
DiseaseRiskName = o.Key.DiseaseRiskName,
DisplayOrder = o.Key.DisplayOrder
}).ToList();
//超重信息
var isOverweight = await _personManager.IsOverweight(input.PersonId);
QuestionAnswer overweightQuestionAnswer = null;
if (isOverweight)
{
var questionAnswerOverweightCodeStr = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "question_answer_overweight_code");
if (!Guid.TryParse(questionAnswerOverweightCodeStr, out var questionAnswerOverweightCode))
{
throw new UserFriendlyException("在系统参数中超重编码维护不正确");
}
overweightQuestionAnswer = await _questionAnswerRepository.GetAsync(o => o.QuestionAnswerId == questionAnswerOverweightCode);
}
foreach (var diseaseRisk in questionRegisterDiseaseRiskDtos)
{
//疾病级别必须按优先级别排序,取顺序最高的作为最高风险级
var diseaseRiskLevels = diseaseRisks.Where(o => o.diseaseRisk.DiseaseRiskId == diseaseRisk.DiseaseRiskId
&& o.haveDiseaseRiskLevel != null)
.OrderByDescending(o => o.haveDiseaseRiskLevel == null ? 1 : o.haveDiseaseRiskLevel.DisplayOrder).ToList();
DiseaseRiskLevel matchDiseaseRiskLevel = null;
foreach (var diseaseRiskLevel in diseaseRiskLevels)
{
if (questionRegisterItems.Where(o => diseaseRiskLevel.haveQuestionAnswerRiskLevel != null &&
o.questionRegisterAnswer.QuestionAnswerId ==
diseaseRiskLevel.haveQuestionAnswerRiskLevel.QuestionAnswerId).Any())
{
if (diseaseRiskLevel.haveDiseaseRiskLevel != null)
{
matchDiseaseRiskLevel = diseaseRiskLevel.haveDiseaseRiskLevel;
break;
}
}
//超重
if (overweightQuestionAnswer != null && diseaseRiskLevel.haveQuestionAnswerRiskLevel != null)
{
if (diseaseRiskLevel.haveQuestionAnswerRiskLevel.QuestionAnswerId == overweightQuestionAnswer.QuestionAnswerId)
{
matchDiseaseRiskLevel = diseaseRiskLevel.haveDiseaseRiskLevel;
break;
}
}
}
if (matchDiseaseRiskLevel == null)
{
//因为是倒叙排序,所以最后一个疾病风险就是最低级别疾病风险
matchDiseaseRiskLevel = diseaseRiskLevels.LastOrDefault() == null ? null : diseaseRiskLevels.LastOrDefault().haveDiseaseRiskLevel;
}
if (matchDiseaseRiskLevel == null)
{
diseaseRisk.DiseaseRiskLevelName = "低危";
}
else
{
diseaseRisk.DiseaseRiskLevelId = matchDiseaseRiskLevel.DiseaseRiskLevelId;
diseaseRisk.DiseaseRiskLevelName = matchDiseaseRiskLevel.DiseaseRiskLevelName;
}
}
return questionRegisterDiseaseRiskDtos;
}
/// <summary>
/// 获取人员单个疾病风险明细
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/QuestionRegister/GetDiseaseRiskByPersonDiseaseRiskId")]
public async Task<QuestionRegisterDiseaseRiskSingleDto> GetDiseaseRiskByPersonDiseaseRiskIdAsync(PersonDiseaseRiskIdInputDto input)
{
if (input == null) { throw new UserFriendlyException("input参数不能为空"); }
var questionRegister = (await _repository.GetQueryableAsync())
.Where(o => o.PersonId == input.PersonId)
.OrderByDescending(o => o.CreationTime)
.FirstOrDefault();
if (questionRegister == null)
{
return null;
}
var diseaseRisk = await _diseaseRiskRepository.GetAsync(o => o.DiseaseRiskId == input.DiseaseRiskId);
var diseaseRiskLevels = (await _diseaseRiskLevelRepository.GetListAsync(o => o.DiseaseRiskId == input.DiseaseRiskId))
.OrderBy(o => o.DisplayOrder);
//获取人员疾病风险列表
var diseaseRiskList = await GetDiseaseRiskListByPersonIdAsync(new PersonIdInputDto() { PersonId = input.PersonId });
var personDiseaseRisk = diseaseRiskList.Where(o => o.DiseaseRiskId == input.DiseaseRiskId).First();
var diseaseRiskLevel = diseaseRiskLevels.Where(o => o.DiseaseRiskLevelId == personDiseaseRisk.DiseaseRiskLevelId).FirstOrDefault();
var asbitems = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync()
join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync()
on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId
join questionAnswerAsbitem in await _questionAnswerAsbitemRepository.GetQueryableAsync()
on questionRegisterAnswer.QuestionAnswerId equals questionAnswerAsbitem.QuestionAnswerId
join asbitem in await _asbitemRepository.GetQueryableAsync()
on questionAnswerAsbitem.AsbitemId equals asbitem.AsbitemId
join questionAnswerRiskLevel in await _questionAnswerRiskLevelRepository.GetQueryableAsync()
on questionAnswerAsbitem.QuestionAnswerId equals questionAnswerRiskLevel.QuestionAnswerId
where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId &&
questionAnswerRiskLevel.DiseaseRiskLevelId == diseaseRiskLevel.DiseaseRiskLevelId
orderby asbitem.DisplayOrder
select asbitem).Distinct().ToList();
var questionRegisterDiseaseRiskSingleDto = new QuestionRegisterDiseaseRiskSingleDto()
{
DiseaseRiskId = diseaseRisk.DiseaseRiskId,
DiseaseRiskName = diseaseRisk.DiseaseRiskName,
DiseaseRiskLevelId = personDiseaseRisk.DiseaseRiskLevelId,
DiseaseRiskLevelName = personDiseaseRisk.DiseaseRiskLevelName,
Explain = diseaseRiskLevel.Explain,
Suggestion = diseaseRiskLevel.Suggestion,
DiseaseRiskLevels = diseaseRiskLevels.Select(o => new DiseaseRiskLevelDto()
{
DiseaseRiskLevelId = o.DiseaseRiskLevelId,
DiseaseRiskLevelName = o.DiseaseRiskLevelName,
DisplayOrder = o.DisplayOrder,
}).ToList(),
Asbitems = asbitems.Select(o => new QuestionRegisterDiseaseRiskAsbitem()
{
AsbitemId = o.AsbitemId,
AsbitemName = o.AsbitemName,
DisplayOrder = o.DisplayOrder
}).ToList()
};
//超重信息
var isOverweight = await _personManager.IsOverweight(input.PersonId);
QuestionAnswer overweightQuestionAnswer = null;
if (isOverweight)
{
var questionAnswerOverweightCodeStr = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "question_answer_overweight_code");
if (!Guid.TryParse(questionAnswerOverweightCodeStr, out var questionAnswerOverweightCode))
{
throw new UserFriendlyException("在系统参数中超重编码维护不正确");
}
overweightQuestionAnswer = await _questionAnswerRepository.GetAsync(o => o.QuestionAnswerId == questionAnswerOverweightCode);
var questionAnswerRiskLevel = await _questionAnswerRiskLevelRepository.FindAsync(o => o.QuestionAnswerId == overweightQuestionAnswer.QuestionAnswerId &&
o.DiseaseRiskLevelId == diseaseRiskLevel.DiseaseRiskLevelId);
if (questionAnswerRiskLevel != null)
{
var questionAnswerAsbitems = (from questionAnswerAsbitem in await _questionAnswerAsbitemRepository.GetQueryableAsync()
join asbitem in await _asbitemRepository.GetQueryableAsync()
on questionAnswerAsbitem.AsbitemId equals asbitem.AsbitemId
where questionAnswerAsbitem.QuestionAnswerId == overweightQuestionAnswer.QuestionAnswerId
select asbitem).ToList();
foreach (var questionAnswerAsbitem in questionAnswerAsbitems)
{
if (!questionRegisterDiseaseRiskSingleDto.Asbitems.Where(o => o.AsbitemId == questionAnswerAsbitem.AsbitemId).Any())
{
questionRegisterDiseaseRiskSingleDto.Asbitems.Add(new QuestionRegisterDiseaseRiskAsbitem()
{
AsbitemId = questionAnswerAsbitem.AsbitemId,
AsbitemName = questionAnswerAsbitem.AsbitemName,
DisplayOrder = questionAnswerAsbitem.DisplayOrder
});
}
}
questionRegisterDiseaseRiskSingleDto.Answers.Add(new QuestionRegisterItemResultAnswer()
{
Answer = overweightQuestionAnswer.QuestionAnswerName,
DisplayOrder = overweightQuestionAnswer.DisplayOrder,
});
}
}
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
join questionAnswerRiskLevel in await _questionAnswerRiskLevelRepository.GetQueryableAsync()
on questionAnswer.QuestionAnswerId equals questionAnswerRiskLevel.QuestionAnswerId
where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId &&
questionAnswerRiskLevel.DiseaseRiskLevelId == diseaseRiskLevel.DiseaseRiskLevelId &&
questionAnswer.IsNone == 'N'
orderby questionSubjectType.DisplayOrder
select new
{
questionSubjectType,
questionRegisterItem,
questionRegisterAnswer,
questionAnswer
}).ToList();
foreach (var questionRegisterItem in questionRegisterItems)
{
if (questionRegisterItems.Where(o =>
(o.questionAnswer.PathCode.StartsWith(questionRegisterItem.questionAnswer.PathCode + ".") &&
questionRegisterItem.questionAnswer.PathCode.Length == 5)).Any())
{
continue;
}
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;
}
if (string.IsNullOrWhiteSpace(answer))
{
continue;
}
questionRegisterDiseaseRiskSingleDto.Answers.Add(new QuestionRegisterItemResultAnswer()
{
Answer = answer,
DisplayOrder = questionRegisterItem.questionAnswer.DisplayOrder,
});
}
return questionRegisterDiseaseRiskSingleDto;
}
/// <summary>
/// 创建问卷
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[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<QuestionRegisterItem>();
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);
}
/// <summary>
/// 更新问卷
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[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<QuestionRegisterItem>();
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);
}
/// <summary>
/// 获取问卷所有题目
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task<QuestionRegisterDto> GetBasicDataAsync(PersonIdInputDto input)
{
var questions = (await _questionRepository.GetListAsync(o => o.IsActive == 'Y')).OrderBy(o => o.DisplayOrder);
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).OrderBy(o => o.DisplayOrder).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).OrderBy(o => o.DisplayOrder).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;
}
/// <summary>
/// 是否超重
/// </summary>
/// <param name="height"></param>
/// <param name="weight"></param>
/// <returns></returns>
private async Task<bool> IsOverweight(decimal? height, decimal? weight)
{
if (height == null || weight == null || height <= 0 || weight <= 0)
{
return false;
}
var tzzs = (weight / ((height / 100) * (height / 100)));
var sysTzzsStr = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "question_overweight");
decimal sysTzzs;
if (!decimal.TryParse(sysTzzsStr, out sysTzzs))
{
sysTzzs = (decimal)24.5;
}
if (tzzs >= sysTzzs)
{
return true;
}
return false;
}
}
}