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

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
2 years ago
3 months ago
2 years ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
3 months ago
2 years ago
2 years ago
  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Mvc;
  3. using NPOI.SS.Formula.Functions;
  4. using Org.BouncyCastle.Math.EC.Rfc7748;
  5. using Shentun.WebPeis.AppointPatientRegisters;
  6. using Shentun.WebPeis.DiseaseRiskLevels;
  7. using Shentun.WebPeis.Enums;
  8. using Shentun.WebPeis.Models;
  9. using Shentun.WebPeis.Persons;
  10. using Shentun.WebPeis.SysParmValues;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. using Volo.Abp;
  17. using Volo.Abp.Application.Services;
  18. using Volo.Abp.Domain.Entities;
  19. using Volo.Abp.Domain.Repositories;
  20. using Volo.Abp.Uow;
  21. namespace Shentun.WebPeis.QuestionRegisters
  22. {
  23. [ApiExplorerSettings(GroupName = "Work")]
  24. [Authorize]
  25. public class QuestionRegisterAppService : ApplicationService
  26. {
  27. private readonly IRepository<QuestionRegister> _repository;
  28. private readonly IRepository<QuestionRegisterItem> _questionRegisterItemRepository;
  29. private readonly IRepository<QuestionRegisterAnswer> _questionRegisterAnswerRrepository;
  30. private readonly IRepository<Question> _questionRepository;
  31. private readonly IRepository<QuestionAnswer> _questionAnswerRepository;
  32. private readonly IRepository<QuestionSubjectType> _questionSubjectTypeRepository;
  33. private readonly IRepository<DiseaseRisk> _diseaseRiskRepository;
  34. private readonly IRepository<DiseaseRiskLevel> _diseaseRiskLevelRepository;
  35. private readonly IRepository<QuestionAnswerRiskLevel> _questionAnswerRiskLevelRepository;
  36. private readonly IRepository<QuestionAnswerAsbitem> _questionAnswerAsbitemRepository;
  37. private readonly IRepository<Asbitem> _asbitemRepository;
  38. private readonly IRepository<Person> _personRepository;
  39. private readonly QuestionRegisterManager _questionRegisterManager;
  40. private readonly IUnitOfWorkManager _unitOfWorkManager;
  41. private readonly SysParmValueManager _sysParmValueManager;
  42. private readonly PersonManager _personManager;
  43. public QuestionRegisterAppService(IRepository<QuestionRegister> repository,
  44. IRepository<QuestionRegisterItem> questionRegisterItemRepository,
  45. IRepository<QuestionRegisterAnswer> questionRegisterAnswerRrepository,
  46. IRepository<Question> questionRepository,
  47. IRepository<QuestionAnswer> questionAnswerRepository,
  48. QuestionRegisterManager questionRegisterManager,
  49. IUnitOfWorkManager unitOfWorkManager,
  50. IRepository<QuestionSubjectType> questionSubjectTypeRepository,
  51. IRepository<DiseaseRisk> diseaseRiskRepository,
  52. IRepository<DiseaseRiskLevel> diseaseRiskLevelRepository,
  53. IRepository<QuestionAnswerRiskLevel> questionAnswerRiskLevelRepository,
  54. IRepository<QuestionAnswerAsbitem> questionAnswerAsbitemRepository,
  55. IRepository<Asbitem> asbitemRepository,
  56. SysParmValueManager sysParmValueManager,
  57. IRepository<Person> personRepository,
  58. PersonManager personManager)
  59. {
  60. _repository = repository;
  61. _questionRegisterItemRepository = questionRegisterItemRepository;
  62. _questionRegisterAnswerRrepository = questionRegisterAnswerRrepository;
  63. _questionRepository = questionRepository;
  64. _questionAnswerRepository = questionAnswerRepository;
  65. _questionRegisterManager = questionRegisterManager;
  66. _unitOfWorkManager = unitOfWorkManager;
  67. _questionSubjectTypeRepository = questionSubjectTypeRepository;
  68. _diseaseRiskRepository = diseaseRiskRepository;
  69. _diseaseRiskLevelRepository = diseaseRiskLevelRepository;
  70. _questionAnswerRiskLevelRepository = questionAnswerRiskLevelRepository;
  71. _questionAnswerAsbitemRepository = questionAnswerAsbitemRepository;
  72. _asbitemRepository = asbitemRepository;
  73. _sysParmValueManager = sysParmValueManager;
  74. _personRepository = personRepository;
  75. _personManager = personManager;
  76. }
  77. /// <summary>
  78. /// 获取人员问卷
  79. /// </summary>
  80. /// <param name="input"></param>
  81. /// <returns></returns>
  82. [HttpPost("api/app/QuestionRegister/GetByPersonId")]
  83. public async Task<QuestionRegisterDto> GetByPersonIdAsync(PersonIdInputDto input)
  84. {
  85. var questions = await _questionRepository.GetListAsync(o => o.IsActive == 'Y');
  86. var questionAnswers = await _questionAnswerRepository.GetListAsync();
  87. var questionRegister = (await _repository.GetQueryableAsync())
  88. .Where(o => o.PersonId == input.PersonId)
  89. .OrderByDescending(o => o.CreationTime)
  90. .FirstOrDefault();
  91. var personEntity = await _personRepository.FirstOrDefaultAsync(f => f.PersonId == input.PersonId);
  92. if (personEntity == null)
  93. {
  94. throw new UserFriendlyException("人员不存在");
  95. }
  96. QuestionRegisterDto questionRegisterDto;
  97. questionRegisterDto = await GetBasicDataAsync(input, personEntity.SexId);
  98. if (questionRegister == null)
  99. {
  100. return questionRegisterDto;
  101. }
  102. questionRegisterDto.QuestionRegisterId = questionRegister.QuestionRegisterId;
  103. //已登记过
  104. var questionRegisterItems = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync()
  105. join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync()
  106. on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId
  107. where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId
  108. select new
  109. {
  110. questionRegisterItem,
  111. questionRegisterAnswer,
  112. }).ToList();
  113. foreach (var questionRegisterItemDto in questionRegisterDto.QuestionRegisterItems)
  114. {
  115. var questionRegisterItemEntity = questionRegisterItems.Where(o =>
  116. o.questionRegisterItem.QuestionId == questionRegisterItemDto.QuestionId).FirstOrDefault();
  117. if (questionRegisterItemEntity != null)
  118. {
  119. questionRegisterItemDto.QuestionRegisterItemId = questionRegisterItemEntity.questionRegisterItem.QuestionRegisterItemId;
  120. }
  121. foreach (var questionRegisterAnswer in questionRegisterItemDto.QuestionRegisterAnswers)
  122. {
  123. var answer = questionRegisterItems.Where(
  124. o => o.questionRegisterAnswer.QuestionAnswerId == questionRegisterAnswer.QuestionAnswerId)
  125. .SingleOrDefault();
  126. if (answer != null)
  127. {
  128. questionRegisterAnswer.IsSelected = 'Y';
  129. questionRegisterAnswer.Content = answer.questionRegisterAnswer.Content;
  130. }
  131. foreach (var childQuestionRegisterAnswer in questionRegisterAnswer.Childs)
  132. {
  133. answer = questionRegisterItems.Where(
  134. o => o.questionRegisterAnswer.QuestionAnswerId == childQuestionRegisterAnswer.QuestionAnswerId)
  135. .SingleOrDefault();
  136. if (answer != null)
  137. {
  138. childQuestionRegisterAnswer.IsSelected = 'Y';
  139. childQuestionRegisterAnswer.Content = answer.questionRegisterAnswer.Content;
  140. }
  141. }
  142. }
  143. }
  144. return questionRegisterDto;
  145. }
  146. /// <summary>
  147. /// 获取生育计划、危险因素、疾病等列表
  148. /// </summary>
  149. /// <param name="input"></param>
  150. /// <returns></returns>
  151. [HttpPost("api/app/QuestionRegister/GetSubjectTypeListByPersonId")]
  152. public async Task<List<PersonSubjectTypeDto>> GetSubjectTypeListByPersonIdAsync(PersonIdInputDto input)
  153. {
  154. var questionRegister = (await _repository.GetQueryableAsync())
  155. .Where(o => o.PersonId == input.PersonId)
  156. .OrderByDescending(o => o.CreationTime)
  157. .FirstOrDefault();
  158. if (questionRegister == null)
  159. {
  160. return null;
  161. }
  162. var questionRegisterItems = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync()
  163. join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync()
  164. on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId
  165. join questionAnswer in await _questionAnswerRepository.GetQueryableAsync()
  166. on questionRegisterAnswer.QuestionAnswerId equals questionAnswer.QuestionAnswerId
  167. join question in await _questionRepository.GetQueryableAsync()
  168. on questionRegisterItem.QuestionId equals question.QuestionId
  169. join questionSubjectType in await _questionSubjectTypeRepository.GetQueryableAsync()
  170. on question.QuestionSubjectTypeId equals questionSubjectType.QuestionSubjectTypeId
  171. where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId
  172. orderby questionSubjectType.DisplayOrder
  173. select new
  174. {
  175. questionSubjectType,
  176. questionRegisterItem,
  177. questionRegisterAnswer,
  178. questionAnswer
  179. }).ToList();
  180. var personSubjectTypeDtos = questionRegisterItems.GroupBy(o => o.questionSubjectType)
  181. .Select(o => new PersonSubjectTypeDto()
  182. {
  183. QuestionSubjectTypeId = o.Key.QuestionSubjectTypeId,
  184. QuestionSubjectTypeName = o.Key.QuestionSubjectTypeName,
  185. DisplayOrder = o.Key.DisplayOrder
  186. }).ToList();
  187. foreach (var personSubjectTypeDto in personSubjectTypeDtos)
  188. {
  189. var questionSubjectTypeItems = questionRegisterItems.Where(o =>
  190. o.questionSubjectType.QuestionSubjectTypeId == personSubjectTypeDto.QuestionSubjectTypeId)
  191. .OrderBy(o => o.questionAnswer.DisplayOrder).ToList();
  192. foreach (var questionRegisterItem in questionSubjectTypeItems)
  193. {
  194. if (questionRegisterItem.questionAnswer.IsNone == 'Y')
  195. {
  196. continue;
  197. }
  198. if (questionRegisterItems.Where(o =>
  199. (o.questionAnswer.PathCode.StartsWith(questionRegisterItem.questionAnswer.PathCode + ".") &&
  200. questionRegisterItem.questionAnswer.PathCode.Length == 5)).Any())
  201. {
  202. continue;
  203. }
  204. string answer;
  205. if (questionRegisterItem.questionAnswer.AnswerResultType == AnswerResultTypeFlag.Choice)
  206. {
  207. if (string.IsNullOrWhiteSpace(questionRegisterItem.questionAnswer.Aliases))
  208. {
  209. answer = questionRegisterItem.questionAnswer.QuestionAnswerName;
  210. }
  211. else
  212. {
  213. answer = questionRegisterItem.questionAnswer.Aliases;
  214. }
  215. }
  216. else
  217. {
  218. answer = questionRegisterItem.questionRegisterAnswer.Content;
  219. }
  220. if (string.IsNullOrWhiteSpace(answer))
  221. {
  222. continue;
  223. }
  224. personSubjectTypeDto.Answers.Add(new PersonSubjectTypeQuestionAnswer()
  225. {
  226. QuestionAnswerName = answer,
  227. DisplayOrder = questionRegisterItem.questionAnswer.DisplayOrder,
  228. });
  229. }
  230. }
  231. //超重信息
  232. var isOverweight = await _personManager.IsOverweight(input.PersonId);
  233. if (isOverweight)
  234. {
  235. //危险因素编码是03
  236. var personSubjectTypeDto = personSubjectTypeDtos.Where(o => o.QuestionSubjectTypeId == "03").Single();
  237. var questionAnswerOverweightCodeStr = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "question_answer_overweight_code");
  238. if (!Guid.TryParse(questionAnswerOverweightCodeStr, out var questionAnswerOverweightCode))
  239. {
  240. throw new UserFriendlyException("在系统参数中超重编码维护不正确");
  241. }
  242. var questionAnswer = await _questionAnswerRepository.GetAsync(o => o.QuestionAnswerId == questionAnswerOverweightCode);
  243. personSubjectTypeDto.Answers.Add(new PersonSubjectTypeQuestionAnswer()
  244. {
  245. QuestionAnswerName = questionAnswer.QuestionAnswerName,
  246. DisplayOrder = questionAnswer.DisplayOrder,
  247. });
  248. }
  249. return personSubjectTypeDtos;
  250. }
  251. /// <summary>
  252. /// 获取问卷结果列表
  253. /// </summary>
  254. /// <param name="input"></param>
  255. /// <returns></returns>
  256. [HttpPost("api/app/QuestionRegister/GetQuestionRegisterListByPersonId")]
  257. public async Task<List<QuestionRegisterItemResultDto>> GetQuestionRegisterListByPersonIdAsync(PersonIdInputDto input)
  258. {
  259. var questionRegister = (await _repository.GetQueryableAsync())
  260. .Where(o => o.PersonId == input.PersonId)
  261. .OrderByDescending(o => o.CreationTime)
  262. .FirstOrDefault();
  263. if (questionRegister == null)
  264. {
  265. return null;
  266. }
  267. var questionRegisterItems = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync()
  268. join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync()
  269. on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId
  270. join questionAnswer in await _questionAnswerRepository.GetQueryableAsync()
  271. on questionRegisterAnswer.QuestionAnswerId equals questionAnswer.QuestionAnswerId
  272. join question in await _questionRepository.GetQueryableAsync()
  273. on questionRegisterItem.QuestionId equals question.QuestionId
  274. join questionSubjectType in await _questionSubjectTypeRepository.GetQueryableAsync()
  275. on question.QuestionSubjectTypeId equals questionSubjectType.QuestionSubjectTypeId
  276. where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId
  277. orderby questionSubjectType.DisplayOrder, question.DisplayOrder
  278. select new
  279. {
  280. questionSubjectType,
  281. question,
  282. questionRegisterItem,
  283. questionRegisterAnswer,
  284. questionAnswer
  285. }).ToList();
  286. var questions = questionRegisterItems.GroupBy(o => o.question)
  287. .Select(o => new QuestionRegisterItemResultDto()
  288. {
  289. QuestionId = o.Key.QuestionId,
  290. QuestionName = o.Key.QuestionName,
  291. DisplayOrder = o.Key.DisplayOrder
  292. }).ToList();
  293. foreach (var question in questions)
  294. {
  295. var questionAnswers = questionRegisterItems.Where(o =>
  296. o.question.QuestionId == question.QuestionId)
  297. .OrderBy(o => o.questionAnswer.DisplayOrder).ToList();
  298. foreach (var questionRegisterItem in questionAnswers)
  299. {
  300. if (questionRegisterItems.Where(o =>
  301. (o.questionAnswer.PathCode.StartsWith(questionRegisterItem.questionAnswer.PathCode + ".") &&
  302. questionRegisterItem.questionAnswer.PathCode.Length == 5)).Any())
  303. {
  304. continue;
  305. }
  306. string answer;
  307. if (questionRegisterItem.questionAnswer.AnswerResultType == AnswerResultTypeFlag.Choice)
  308. {
  309. if (string.IsNullOrWhiteSpace(questionRegisterItem.questionAnswer.Aliases))
  310. {
  311. answer = questionRegisterItem.questionAnswer.QuestionAnswerName;
  312. }
  313. else
  314. {
  315. answer = questionRegisterItem.questionAnswer.Aliases;
  316. }
  317. }
  318. else
  319. {
  320. answer = questionRegisterItem.questionRegisterAnswer.Content;
  321. }
  322. if (string.IsNullOrWhiteSpace(answer))
  323. {
  324. continue;
  325. }
  326. question.Answers.Add(new QuestionRegisterItemResultAnswer()
  327. {
  328. Answer = answer,
  329. DisplayOrder = questionRegisterItem.questionAnswer.DisplayOrder,
  330. });
  331. }
  332. }
  333. return questions;
  334. }
  335. /// <summary>
  336. /// 获取疾病风险列表
  337. /// </summary>
  338. /// <param name="input"></param>
  339. /// <returns></returns>
  340. [HttpPost("api/app/QuestionRegister/GetDiseaseRiskListByPersonId")]
  341. public async Task<List<QuestionRegisterDiseaseRiskDto>> GetDiseaseRiskListByPersonIdAsync(PersonIdInputDto input)
  342. {
  343. var questionRegister = (await _repository.GetQueryableAsync())
  344. .Where(o => o.PersonId == input.PersonId)
  345. .OrderByDescending(o => o.CreationTime)
  346. .FirstOrDefault();
  347. if (questionRegister == null)
  348. {
  349. return null;
  350. }
  351. //获取人员登记问卷
  352. var questionRegisterItems = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync()
  353. join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync()
  354. on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId
  355. join questionAnswer in await _questionAnswerRepository.GetQueryableAsync()
  356. on questionRegisterAnswer.QuestionAnswerId equals questionAnswer.QuestionAnswerId
  357. join question in await _questionRepository.GetQueryableAsync()
  358. on questionRegisterItem.QuestionId equals question.QuestionId
  359. join questionSubjectType in await _questionSubjectTypeRepository.GetQueryableAsync()
  360. on question.QuestionSubjectTypeId equals questionSubjectType.QuestionSubjectTypeId
  361. where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId
  362. orderby questionSubjectType.DisplayOrder, question.DisplayOrder
  363. select new
  364. {
  365. questionSubjectType,
  366. question,
  367. questionRegisterItem,
  368. questionRegisterAnswer,
  369. questionAnswer
  370. }).ToList();
  371. //获取疾病风险基础字典信息
  372. var diseaseRisks = (from diseaseRisk in await _diseaseRiskRepository.GetQueryableAsync()
  373. join diseaseRiskLevel in await _diseaseRiskLevelRepository.GetQueryableAsync()
  374. on diseaseRisk.DiseaseRiskId equals diseaseRiskLevel.DiseaseRiskId into emptyDiseaseRiskLevel
  375. from haveDiseaseRiskLevel in emptyDiseaseRiskLevel.DefaultIfEmpty()
  376. join questionAnswerRiskLevel in await _questionAnswerRiskLevelRepository.GetQueryableAsync()
  377. on haveDiseaseRiskLevel.DiseaseRiskLevelId equals questionAnswerRiskLevel.DiseaseRiskLevelId into emptyQuestionAnswerRiskLevel
  378. from haveQuestionAnswerRiskLevel in emptyQuestionAnswerRiskLevel.DefaultIfEmpty()
  379. orderby diseaseRisk.DisplayOrder
  380. select new
  381. {
  382. diseaseRisk,
  383. haveDiseaseRiskLevel,
  384. haveQuestionAnswerRiskLevel
  385. }).ToList();
  386. var questionRegisterDiseaseRiskDtos = diseaseRisks.GroupBy(o => o.diseaseRisk)
  387. .Select(o => new QuestionRegisterDiseaseRiskDto()
  388. {
  389. DiseaseRiskId = o.Key.DiseaseRiskId,
  390. DiseaseRiskName = o.Key.DiseaseRiskName,
  391. DisplayOrder = o.Key.DisplayOrder
  392. }).ToList();
  393. //超重信息
  394. var isOverweight = await _personManager.IsOverweight(input.PersonId);
  395. QuestionAnswer overweightQuestionAnswer = null;
  396. if (isOverweight)
  397. {
  398. var questionAnswerOverweightCodeStr = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "question_answer_overweight_code");
  399. if (!Guid.TryParse(questionAnswerOverweightCodeStr, out var questionAnswerOverweightCode))
  400. {
  401. throw new UserFriendlyException("在系统参数中超重编码维护不正确");
  402. }
  403. overweightQuestionAnswer = await _questionAnswerRepository.GetAsync(o => o.QuestionAnswerId == questionAnswerOverweightCode);
  404. }
  405. foreach (var diseaseRisk in questionRegisterDiseaseRiskDtos)
  406. {
  407. //疾病级别必须按优先级别排序,取顺序最高的作为最高风险级
  408. var diseaseRiskLevels = diseaseRisks.Where(o => o.diseaseRisk.DiseaseRiskId == diseaseRisk.DiseaseRiskId
  409. && o.haveDiseaseRiskLevel != null)
  410. .OrderByDescending(o => o.haveDiseaseRiskLevel == null ? 1 : o.haveDiseaseRiskLevel.DisplayOrder).ToList();
  411. DiseaseRiskLevel matchDiseaseRiskLevel = null;
  412. foreach (var diseaseRiskLevel in diseaseRiskLevels)
  413. {
  414. if (questionRegisterItems.Where(o => diseaseRiskLevel.haveQuestionAnswerRiskLevel != null &&
  415. o.questionRegisterAnswer.QuestionAnswerId ==
  416. diseaseRiskLevel.haveQuestionAnswerRiskLevel.QuestionAnswerId).Any())
  417. {
  418. if (diseaseRiskLevel.haveDiseaseRiskLevel != null)
  419. {
  420. matchDiseaseRiskLevel = diseaseRiskLevel.haveDiseaseRiskLevel;
  421. break;
  422. }
  423. }
  424. //超重
  425. if (overweightQuestionAnswer != null && diseaseRiskLevel.haveQuestionAnswerRiskLevel != null)
  426. {
  427. if (diseaseRiskLevel.haveQuestionAnswerRiskLevel.QuestionAnswerId == overweightQuestionAnswer.QuestionAnswerId)
  428. {
  429. matchDiseaseRiskLevel = diseaseRiskLevel.haveDiseaseRiskLevel;
  430. break;
  431. }
  432. }
  433. }
  434. if (matchDiseaseRiskLevel == null)
  435. {
  436. //因为是倒叙排序,所以最后一个疾病风险就是最低级别疾病风险
  437. matchDiseaseRiskLevel = diseaseRiskLevels.LastOrDefault() == null ? null : diseaseRiskLevels.LastOrDefault().haveDiseaseRiskLevel;
  438. }
  439. if (matchDiseaseRiskLevel == null)
  440. {
  441. diseaseRisk.DiseaseRiskLevelName = "低危";
  442. }
  443. else
  444. {
  445. diseaseRisk.DiseaseRiskLevelId = matchDiseaseRiskLevel.DiseaseRiskLevelId;
  446. diseaseRisk.DiseaseRiskLevelName = matchDiseaseRiskLevel.DiseaseRiskLevelName;
  447. }
  448. }
  449. return questionRegisterDiseaseRiskDtos;
  450. }
  451. /// <summary>
  452. /// 获取人员单个疾病风险明细
  453. /// </summary>
  454. /// <param name="input"></param>
  455. /// <returns></returns>
  456. [HttpPost("api/app/QuestionRegister/GetDiseaseRiskByPersonDiseaseRiskId")]
  457. public async Task<QuestionRegisterDiseaseRiskSingleDto> GetDiseaseRiskByPersonDiseaseRiskIdAsync(PersonDiseaseRiskIdInputDto input)
  458. {
  459. if (input == null) { throw new UserFriendlyException("input参数不能为空"); }
  460. var questionRegister = (await _repository.GetQueryableAsync())
  461. .Where(o => o.PersonId == input.PersonId)
  462. .OrderByDescending(o => o.CreationTime)
  463. .FirstOrDefault();
  464. if (questionRegister == null)
  465. {
  466. return null;
  467. }
  468. var diseaseRisk = await _diseaseRiskRepository.GetAsync(o => o.DiseaseRiskId == input.DiseaseRiskId);
  469. var diseaseRiskLevels = (await _diseaseRiskLevelRepository.GetListAsync(o => o.DiseaseRiskId == input.DiseaseRiskId))
  470. .OrderBy(o => o.DisplayOrder);
  471. //获取人员疾病风险列表
  472. var diseaseRiskList = await GetDiseaseRiskListByPersonIdAsync(new PersonIdInputDto() { PersonId = input.PersonId });
  473. var personDiseaseRisk = diseaseRiskList.Where(o => o.DiseaseRiskId == input.DiseaseRiskId).First();
  474. var diseaseRiskLevel = diseaseRiskLevels.Where(o => o.DiseaseRiskLevelId == personDiseaseRisk.DiseaseRiskLevelId).FirstOrDefault();
  475. var asbitems = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync()
  476. join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync()
  477. on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId
  478. join questionAnswerAsbitem in await _questionAnswerAsbitemRepository.GetQueryableAsync()
  479. on questionRegisterAnswer.QuestionAnswerId equals questionAnswerAsbitem.QuestionAnswerId
  480. join asbitem in await _asbitemRepository.GetQueryableAsync()
  481. on questionAnswerAsbitem.AsbitemId equals asbitem.AsbitemId
  482. join questionAnswerRiskLevel in await _questionAnswerRiskLevelRepository.GetQueryableAsync()
  483. on questionAnswerAsbitem.QuestionAnswerId equals questionAnswerRiskLevel.QuestionAnswerId
  484. where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId &&
  485. questionAnswerRiskLevel.DiseaseRiskLevelId == diseaseRiskLevel.DiseaseRiskLevelId
  486. orderby asbitem.DisplayOrder
  487. select asbitem).Distinct().ToList();
  488. var questionRegisterDiseaseRiskSingleDto = new QuestionRegisterDiseaseRiskSingleDto()
  489. {
  490. DiseaseRiskId = diseaseRisk.DiseaseRiskId,
  491. DiseaseRiskName = diseaseRisk.DiseaseRiskName,
  492. DiseaseRiskLevelId = personDiseaseRisk.DiseaseRiskLevelId,
  493. DiseaseRiskLevelName = personDiseaseRisk.DiseaseRiskLevelName,
  494. Explain = diseaseRiskLevel.Explain,
  495. Suggestion = diseaseRiskLevel.Suggestion,
  496. DiseaseRiskLevels = diseaseRiskLevels.Select(o => new DiseaseRiskLevelDto()
  497. {
  498. DiseaseRiskLevelId = o.DiseaseRiskLevelId,
  499. DiseaseRiskLevelName = o.DiseaseRiskLevelName,
  500. DisplayOrder = o.DisplayOrder,
  501. }).ToList(),
  502. Asbitems = asbitems.Select(o => new QuestionRegisterDiseaseRiskAsbitem()
  503. {
  504. AsbitemId = o.AsbitemId,
  505. AsbitemName = o.AsbitemName,
  506. DisplayOrder = o.DisplayOrder
  507. }).ToList()
  508. };
  509. //超重信息
  510. var isOverweight = await _personManager.IsOverweight(input.PersonId);
  511. QuestionAnswer overweightQuestionAnswer = null;
  512. if (isOverweight)
  513. {
  514. var questionAnswerOverweightCodeStr = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "question_answer_overweight_code");
  515. if (!Guid.TryParse(questionAnswerOverweightCodeStr, out var questionAnswerOverweightCode))
  516. {
  517. throw new UserFriendlyException("在系统参数中超重编码维护不正确");
  518. }
  519. overweightQuestionAnswer = await _questionAnswerRepository.GetAsync(o => o.QuestionAnswerId == questionAnswerOverweightCode);
  520. var questionAnswerRiskLevel = await _questionAnswerRiskLevelRepository.FindAsync(o => o.QuestionAnswerId == overweightQuestionAnswer.QuestionAnswerId &&
  521. o.DiseaseRiskLevelId == diseaseRiskLevel.DiseaseRiskLevelId);
  522. if (questionAnswerRiskLevel != null)
  523. {
  524. var questionAnswerAsbitems = (from questionAnswerAsbitem in await _questionAnswerAsbitemRepository.GetQueryableAsync()
  525. join asbitem in await _asbitemRepository.GetQueryableAsync()
  526. on questionAnswerAsbitem.AsbitemId equals asbitem.AsbitemId
  527. where questionAnswerAsbitem.QuestionAnswerId == overweightQuestionAnswer.QuestionAnswerId
  528. select asbitem).ToList();
  529. foreach (var questionAnswerAsbitem in questionAnswerAsbitems)
  530. {
  531. if (!questionRegisterDiseaseRiskSingleDto.Asbitems.Where(o => o.AsbitemId == questionAnswerAsbitem.AsbitemId).Any())
  532. {
  533. questionRegisterDiseaseRiskSingleDto.Asbitems.Add(new QuestionRegisterDiseaseRiskAsbitem()
  534. {
  535. AsbitemId = questionAnswerAsbitem.AsbitemId,
  536. AsbitemName = questionAnswerAsbitem.AsbitemName,
  537. DisplayOrder = questionAnswerAsbitem.DisplayOrder
  538. });
  539. }
  540. }
  541. questionRegisterDiseaseRiskSingleDto.Answers.Add(new QuestionRegisterItemResultAnswer()
  542. {
  543. Answer = overweightQuestionAnswer.QuestionAnswerName,
  544. DisplayOrder = overweightQuestionAnswer.DisplayOrder,
  545. });
  546. }
  547. }
  548. var questionRegisterItems = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync()
  549. join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync()
  550. on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId
  551. join questionAnswer in await _questionAnswerRepository.GetQueryableAsync()
  552. on questionRegisterAnswer.QuestionAnswerId equals questionAnswer.QuestionAnswerId
  553. join question in await _questionRepository.GetQueryableAsync()
  554. on questionRegisterItem.QuestionId equals question.QuestionId
  555. join questionSubjectType in await _questionSubjectTypeRepository.GetQueryableAsync()
  556. on question.QuestionSubjectTypeId equals questionSubjectType.QuestionSubjectTypeId
  557. join questionAnswerRiskLevel in await _questionAnswerRiskLevelRepository.GetQueryableAsync()
  558. on questionAnswer.QuestionAnswerId equals questionAnswerRiskLevel.QuestionAnswerId
  559. where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId &&
  560. questionAnswerRiskLevel.DiseaseRiskLevelId == diseaseRiskLevel.DiseaseRiskLevelId &&
  561. questionAnswer.IsNone == 'N'
  562. orderby questionSubjectType.DisplayOrder
  563. select new
  564. {
  565. questionSubjectType,
  566. questionRegisterItem,
  567. questionRegisterAnswer,
  568. questionAnswer
  569. }).ToList();
  570. foreach (var questionRegisterItem in questionRegisterItems)
  571. {
  572. if (questionRegisterItems.Where(o =>
  573. (o.questionAnswer.PathCode.StartsWith(questionRegisterItem.questionAnswer.PathCode + ".") &&
  574. questionRegisterItem.questionAnswer.PathCode.Length == 5)).Any())
  575. {
  576. continue;
  577. }
  578. string answer;
  579. if (questionRegisterItem.questionAnswer.AnswerResultType == AnswerResultTypeFlag.Choice)
  580. {
  581. if (string.IsNullOrWhiteSpace(questionRegisterItem.questionAnswer.Aliases))
  582. {
  583. answer = questionRegisterItem.questionAnswer.QuestionAnswerName;
  584. }
  585. else
  586. {
  587. answer = questionRegisterItem.questionAnswer.Aliases;
  588. }
  589. }
  590. else
  591. {
  592. answer = questionRegisterItem.questionRegisterAnswer.Content;
  593. }
  594. if (string.IsNullOrWhiteSpace(answer))
  595. {
  596. continue;
  597. }
  598. questionRegisterDiseaseRiskSingleDto.Answers.Add(new QuestionRegisterItemResultAnswer()
  599. {
  600. Answer = answer,
  601. DisplayOrder = questionRegisterItem.questionAnswer.DisplayOrder,
  602. });
  603. }
  604. return questionRegisterDiseaseRiskSingleDto;
  605. }
  606. /// <summary>
  607. /// 创建问卷
  608. /// </summary>
  609. /// <param name="input"></param>
  610. /// <returns></returns>
  611. [HttpPost("api/app/QuestionRegister/Create")]
  612. public async Task CreateAsync(QuestionRegisterDto input)
  613. {
  614. var questionRegister = new QuestionRegister();
  615. questionRegister.PersonId = input.PersonId;
  616. questionRegister = await _questionRegisterManager.CreateAsync(questionRegister);
  617. questionRegister.QuestionRegisterItems = new List<QuestionRegisterItem>();
  618. foreach (var questionRegisterItemDto in input.QuestionRegisterItems)
  619. {
  620. foreach (var questionRegisterAnswerDto in questionRegisterItemDto.QuestionRegisterAnswers)
  621. {
  622. if (questionRegisterAnswerDto.IsSelected == 'Y')
  623. {
  624. var questionRegisterItem = questionRegister.QuestionRegisterItems
  625. .Where(o => o.QuestionId == questionRegisterItemDto.QuestionId).FirstOrDefault();
  626. if (questionRegisterItem == null)
  627. {
  628. questionRegisterItem = new QuestionRegisterItem()
  629. {
  630. QuestionRegisterItemId = questionRegisterItemDto.QuestionRegisterItemId,
  631. QuestionRegisterId = questionRegister.QuestionRegisterId,
  632. QuestionId = questionRegisterItemDto.QuestionId,
  633. };
  634. questionRegister.QuestionRegisterItems.Add(questionRegisterItem);
  635. // await _questionRegisterItemRepository.InsertAsync(questionRegisterItem);
  636. }
  637. var questionRegisterAnswer = new QuestionRegisterAnswer()
  638. {
  639. QuestionRegisterAnswerId = GuidGenerator.Create(),
  640. QuestionRegisterItemId = questionRegisterItem.QuestionRegisterItemId,
  641. QuestionAnswerId = questionRegisterAnswerDto.QuestionAnswerId,
  642. Content = questionRegisterAnswerDto.Content,
  643. };
  644. questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer);
  645. foreach (var childQuestionRegisterAnswer in questionRegisterAnswerDto.Childs)
  646. {
  647. if (childQuestionRegisterAnswer.IsSelected == 'Y')
  648. {
  649. questionRegisterAnswer = new QuestionRegisterAnswer()
  650. {
  651. QuestionRegisterAnswerId = GuidGenerator.Create(),
  652. QuestionRegisterItemId = questionRegisterItem.QuestionRegisterItemId,
  653. QuestionAnswerId = childQuestionRegisterAnswer.QuestionAnswerId,
  654. Content = childQuestionRegisterAnswer.Content,
  655. };
  656. questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer);
  657. }
  658. }
  659. }
  660. }
  661. }
  662. await _repository.InsertAsync(questionRegister);
  663. }
  664. /// <summary>
  665. /// 更新问卷
  666. /// </summary>
  667. /// <param name="input"></param>
  668. /// <returns></returns>
  669. [HttpPost("api/app/QuestionRegister/Update")]
  670. public async Task UpdateAsync(QuestionRegisterDto input)
  671. {
  672. var questionRegister = await _repository.GetAsync(o => o.QuestionRegisterId == input.QuestionRegisterId);
  673. var questionRegisterItemList = (from questionRegisterItem in await _questionRegisterItemRepository.GetQueryableAsync()
  674. join questionRegisterAnswer in await _questionRegisterAnswerRrepository.GetQueryableAsync()
  675. on questionRegisterItem.QuestionRegisterItemId equals questionRegisterAnswer.QuestionRegisterItemId
  676. where questionRegisterItem.QuestionRegisterId == questionRegister.QuestionRegisterId
  677. select new
  678. {
  679. questionRegisterItem,
  680. questionRegisterAnswer,
  681. }).ToList();
  682. //删除所有答案和项目
  683. var questionRegisterItems = questionRegisterItemList
  684. .GroupBy(o => o.questionRegisterItem)
  685. .Select(x => x.FirstOrDefault().questionRegisterItem)
  686. .ToList();
  687. foreach (var questionRegisterItem in questionRegisterItems)
  688. {
  689. //删除答案
  690. var questionRegisterAnswers = questionRegisterItemList.
  691. Where(o => o.questionRegisterItem.QuestionRegisterItemId == questionRegisterItem.QuestionRegisterItemId)
  692. .Select(x => x.questionRegisterAnswer)
  693. .ToList();
  694. await _questionRegisterAnswerRrepository.DeleteManyAsync(questionRegisterAnswers);
  695. }
  696. //删除问题
  697. await _questionRegisterItemRepository.DeleteManyAsync(questionRegisterItems);
  698. //重新设置
  699. questionRegister.QuestionRegisterItems = new List<QuestionRegisterItem>();
  700. foreach (var questionRegisterItemDto in input.QuestionRegisterItems)
  701. {
  702. foreach (var questionRegisterAnswerDto in questionRegisterItemDto.QuestionRegisterAnswers)
  703. {
  704. if (questionRegisterAnswerDto.IsSelected == 'Y')
  705. {
  706. var questionRegisterItem = questionRegister.QuestionRegisterItems
  707. .Where(o => o.QuestionId == questionRegisterItemDto.QuestionId).FirstOrDefault();
  708. if (questionRegisterItem == null)
  709. {
  710. questionRegisterItem = new QuestionRegisterItem()
  711. {
  712. QuestionRegisterItemId = questionRegisterItemDto.QuestionRegisterItemId,
  713. QuestionRegisterId = questionRegister.QuestionRegisterId,
  714. QuestionId = questionRegisterItemDto.QuestionId,
  715. };
  716. questionRegister.QuestionRegisterItems.Add(questionRegisterItem);
  717. // await _questionRegisterItemRepository.InsertAsync(questionRegisterItem);
  718. }
  719. var questionRegisterAnswer = new QuestionRegisterAnswer()
  720. {
  721. QuestionRegisterAnswerId = GuidGenerator.Create(),
  722. QuestionRegisterItemId = questionRegisterItem.QuestionRegisterItemId,
  723. QuestionAnswerId = questionRegisterAnswerDto.QuestionAnswerId,
  724. Content = questionRegisterAnswerDto.Content,
  725. };
  726. questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer);
  727. foreach (var childQuestionRegisterAnswer in questionRegisterAnswerDto.Childs)
  728. {
  729. if (childQuestionRegisterAnswer.IsSelected == 'Y')
  730. {
  731. questionRegisterAnswer = new QuestionRegisterAnswer()
  732. {
  733. QuestionRegisterAnswerId = GuidGenerator.Create(),
  734. QuestionRegisterItemId = questionRegisterItem.QuestionRegisterItemId,
  735. QuestionAnswerId = childQuestionRegisterAnswer.QuestionAnswerId,
  736. Content = childQuestionRegisterAnswer.Content,
  737. };
  738. questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer);
  739. }
  740. }
  741. }
  742. }
  743. }
  744. await _repository.UpdateAsync(questionRegister);
  745. }
  746. /// <summary>
  747. /// 获取问卷所有题目
  748. /// </summary>
  749. /// <param name="input"></param>
  750. /// <param name="sexId"></param>
  751. /// <returns></returns>
  752. private async Task<QuestionRegisterDto> GetBasicDataAsync(PersonIdInputDto input, char sexId)
  753. {
  754. var questions = (await _questionRepository.GetListAsync(o => o.IsActive == 'Y')).OrderBy(o => o.DisplayOrder);
  755. var questionAnswers = await _questionAnswerRepository.GetListAsync();
  756. var questionRegisterDto = new QuestionRegisterDto()
  757. {
  758. QuestionRegisterId = GuidGenerator.Create(),
  759. PersonId = input.PersonId,
  760. };
  761. //问卷
  762. foreach (var question in questions)
  763. {
  764. bool isDisplay = false;
  765. if (question.ForSexId == ForSexFlag.All)
  766. {
  767. isDisplay = true;
  768. }
  769. else
  770. {
  771. if (question.ForSexId == sexId)
  772. {
  773. isDisplay = true;
  774. }
  775. }
  776. if (isDisplay)
  777. {
  778. var questionRegisterItem = new QuestionRegisterItemDto()
  779. {
  780. QuestionRegisterItemId = GuidGenerator.Create(),
  781. QuestionId = question.QuestionId,
  782. QuestionName = question.QuestionName,
  783. AnswerType = question.AnswerType,
  784. DisplayOrder = question.DisplayOrder,
  785. ParentId = question.ParentId,
  786. PathCode = question.PathCode,
  787. };
  788. //一级答案
  789. var firstLevelQuestionAnswers = questionAnswers.Where(o => o.QuestionId == question.QuestionId &&
  790. o.PathCode.Length == 5).OrderBy(o => o.DisplayOrder).ToList();
  791. foreach (var questionAnswer in firstLevelQuestionAnswers)
  792. {
  793. var questionRegisterAnswer = new QuestionRegisterAnswerDto()
  794. {
  795. QuestionRegisterAnswerId = GuidGenerator.Create(),
  796. QuestionId = question.QuestionId,
  797. QuestionAnswerId = questionAnswer.QuestionAnswerId,
  798. QuestionAnswerName = questionAnswer.QuestionAnswerName,
  799. ChildAnswerType = questionAnswer.ChildAnswerType,
  800. AnswerResultType = questionAnswer.AnswerResultType,
  801. IsSelected = 'N',
  802. ChildAnswerTitle = questionAnswer.ChildAnswerTitle,
  803. IsNone = questionAnswer.IsNone,
  804. DisplayOrder = questionAnswer.DisplayOrder,
  805. ParentId = questionAnswer.ParentId,
  806. PathCode = questionAnswer.PathCode,
  807. };
  808. //二级答案
  809. var childQuestionAnswers = questionAnswers.Where(o =>
  810. o.ParentId == questionAnswer.QuestionAnswerId).OrderBy(o => o.DisplayOrder).ToList();
  811. foreach (var ChilduestionAnswer in childQuestionAnswers)
  812. {
  813. var childQuestionRegisterAnswer = new QuestionRegisterAnswerDto()
  814. {
  815. QuestionRegisterAnswerId = GuidGenerator.Create(),
  816. QuestionId = question.QuestionId,
  817. QuestionAnswerId = ChilduestionAnswer.QuestionAnswerId,
  818. QuestionAnswerName = ChilduestionAnswer.QuestionAnswerName,
  819. ChildAnswerType = ChilduestionAnswer.ChildAnswerType,
  820. AnswerResultType = ChilduestionAnswer.AnswerResultType,
  821. IsSelected = 'N',
  822. ChildAnswerTitle = questionAnswer.ChildAnswerTitle,
  823. IsNone = questionAnswer.IsNone,
  824. DisplayOrder = ChilduestionAnswer.DisplayOrder,
  825. ParentId = ChilduestionAnswer.ParentId,
  826. PathCode = ChilduestionAnswer.PathCode,
  827. };
  828. questionRegisterAnswer.Childs.Add(childQuestionRegisterAnswer);
  829. }
  830. questionRegisterItem.QuestionRegisterAnswers.Add(questionRegisterAnswer);
  831. }
  832. questionRegisterDto.QuestionRegisterItems.Add(questionRegisterItem);
  833. }
  834. }
  835. return questionRegisterDto;
  836. }
  837. }
  838. }