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.

1382 lines
90 KiB

1 year ago
12 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
11 months ago
1 year ago
1 year ago
12 months ago
1 year ago
1 year ago
  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.EntityFrameworkCore;
  4. using NPOI.SS.Formula.Functions;
  5. using NPOI.Util;
  6. using Shentun.Peis.CustomerOrgs;
  7. using Shentun.Peis.Enums;
  8. using Shentun.Peis.Models;
  9. using Shentun.Peis.SysParmValues;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using Volo.Abp;
  16. using Volo.Abp.Application.Services;
  17. using Volo.Abp.Domain.Repositories;
  18. using Volo.Abp.Identity;
  19. namespace Shentun.Peis.OccupationalDiseaseReports
  20. {
  21. [ApiExplorerSettings(GroupName = "Work")]
  22. //[Authorize]
  23. public class OccupationalDiseaseReportAppService : ApplicationService
  24. {
  25. private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
  26. private readonly IRepository<Patient, Guid> _patientRepository;
  27. private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
  28. private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;
  29. private readonly IRepository<Asbitem, Guid> _asbitemRepository;
  30. private readonly IRepository<PatientOccupationalDisease, Guid> _patientOccupationalDiseaseRepository;
  31. private readonly SysParmValueManager _sysParmValueManager;
  32. private readonly CacheService _cacheService;
  33. private readonly IRepository<OrganizationUnit, Guid> _organizationUnitRepository;
  34. private readonly IRepository<OcCheckType, Guid> _ocCheckTypeRepository;
  35. private readonly IRepository<PatientPoison> _patientPoisonRepository;
  36. private readonly IRepository<OccupationalAbnormal, Guid> _occupationalAbnormalRepository;
  37. private readonly IRepository<Poison, Guid> _poisonRepository;
  38. private readonly IRepository<RegisterCheckSummary, Guid> _registerCheckSummaryRepository;
  39. private readonly IRepository<SumSummaryHeader, Guid> _sumSummaryHeaderRepository;
  40. private readonly IRepository<SumSummaryContent, Guid> _sumSummaryContentRepository;
  41. private readonly CustomerOrgManager _customerOrgManager;
  42. public OccupationalDiseaseReportAppService(
  43. IRepository<PatientRegister, Guid> patientRegisterRepository,
  44. IRepository<RegisterCheck, Guid> registerCheckRepository,
  45. IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
  46. IRepository<Asbitem, Guid> asbitemRepository,
  47. IRepository<PatientOccupationalDisease, Guid> patientOccupationalDiseaseRepository,
  48. SysParmValueManager sysParmValueManager,
  49. CacheService cacheService,
  50. IRepository<OrganizationUnit, Guid> organizationUnitRepository,
  51. IRepository<OcCheckType, Guid> ocCheckTypeRepository,
  52. IRepository<PatientPoison> patientPoisonRepository,
  53. IRepository<OccupationalAbnormal, Guid> occupationalAbnormalRepository,
  54. IRepository<Poison, Guid> poisonRepository,
  55. IRepository<RegisterCheckSummary, Guid> registerCheckSummaryRepository,
  56. IRepository<Patient, Guid> patientRepository,
  57. IRepository<SumSummaryHeader, Guid> sumSummaryHeaderRepository,
  58. IRepository<SumSummaryContent, Guid> sumSummaryContentRepository,
  59. CustomerOrgManager customerOrgManager)
  60. {
  61. _patientRegisterRepository = patientRegisterRepository;
  62. _registerCheckRepository = registerCheckRepository;
  63. _registerCheckAsbitemRepository = registerCheckAsbitemRepository;
  64. _asbitemRepository = asbitemRepository;
  65. _patientOccupationalDiseaseRepository = patientOccupationalDiseaseRepository;
  66. _sysParmValueManager = sysParmValueManager;
  67. _cacheService = cacheService;
  68. _organizationUnitRepository = organizationUnitRepository;
  69. _ocCheckTypeRepository = ocCheckTypeRepository;
  70. _patientPoisonRepository = patientPoisonRepository;
  71. _occupationalAbnormalRepository = occupationalAbnormalRepository;
  72. _poisonRepository = poisonRepository;
  73. _registerCheckSummaryRepository = registerCheckSummaryRepository;
  74. _patientRepository = patientRepository;
  75. _sumSummaryHeaderRepository = sumSummaryHeaderRepository;
  76. _sumSummaryContentRepository = sumSummaryContentRepository;
  77. _customerOrgManager = customerOrgManager;
  78. }
  79. /// <summary>
  80. /// 获取单位职业病总结报告
  81. /// </summary>
  82. /// <returns></returns>
  83. [HttpPost("api/app/OccupationalDiseaseReport/GetCompanyOccupationalDiseaseSummaryReport")]
  84. public async Task<GetCompanyOccupationalDiseaseSummaryReportDto> GetCompanyOccupationalDiseaseSummaryReportAsync(GetCompanyOccupationalDiseaseSummaryReportInputDto input)
  85. {
  86. if (!input.CustomerOrgs.Any())
  87. throw new UserFriendlyException("单位信息不能为空");
  88. var customerOrgPara = input.CustomerOrgs.First();
  89. if (customerOrgPara.CustomerOrgId == null || customerOrgPara.CustomerOrgId == Guid.Empty)
  90. throw new UserFriendlyException("单位不能为空");
  91. if (customerOrgPara.CustomerOrgRegisterId == null || customerOrgPara.CustomerOrgRegisterId == Guid.Empty)
  92. throw new UserFriendlyException("单位体检次数不能为空");
  93. #region 人员信息
  94. var query = from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  95. join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId
  96. join patientPoison in await _patientPoisonRepository.GetQueryableAsync() on patientRegister.Id equals patientPoison.PatientRegisterId into patientPoisonTemp
  97. from patientPoisonHaveEmpty in patientPoisonTemp.DefaultIfEmpty()
  98. join poison in await _poisonRepository.GetQueryableAsync() on patientPoisonHaveEmpty.PoisonId equals poison.Id into poisonTemp
  99. from posionHaveEmpty in poisonTemp.DefaultIfEmpty()
  100. join occupationalAbnormal in await _occupationalAbnormalRepository.GetQueryableAsync() on patientPoisonHaveEmpty.OccupationalAbnormalId equals occupationalAbnormal.Id into occupationalAbnormalTemp
  101. from occupationalAbnormalHaveEmpty in occupationalAbnormalTemp.DefaultIfEmpty()
  102. where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId
  103. && patientRegister.CompleteFlag == PatientRegisterCompleteFlag.SumCheck
  104. select new
  105. {
  106. patientRegister,
  107. patientOccupationalDisease,
  108. posionHaveEmpty,
  109. patientPoisonHaveEmpty,
  110. occupationalAbnormalHaveEmpty
  111. };
  112. if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))
  113. {
  114. if (customerOrgPara.DateType == '1')
  115. {
  116. query = query.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  117. m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  118. }
  119. else if (customerOrgPara.DateType == '2')
  120. {
  121. query = query.Where(m => m.patientRegister.MedicalStartDate != null && m.patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  122. m.patientRegister.MedicalStartDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  123. }
  124. else if (customerOrgPara.DateType == '3')
  125. {
  126. query = query.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  127. m.patientRegister.SummaryDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  128. }
  129. }
  130. List<Guid?> customerOrgIds = new List<Guid?>();
  131. if (customerOrgPara.CustomerOrgId != null)
  132. {
  133. customerOrgIds = await _customerOrgManager.GetCustomerOrgChildrenId(customerOrgPara.CustomerOrgId.Value);
  134. }
  135. if (customerOrgIds.Any())
  136. {
  137. query = query.Where(m => customerOrgIds.Contains(m.patientRegister.CustomerOrgId));
  138. }
  139. if (customerOrgPara.CustomerOrgGroupId.Any())
  140. {
  141. query = query.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));
  142. }
  143. #endregion
  144. var patientRegisterList = query.ToList();
  145. var msg = new GetCompanyOccupationalDiseaseSummaryReportDto
  146. {
  147. AsbitemAbnormals = new List<GetCompanyOccupationalDiseaseSummaryReportAsbitemAbnormalDto>(),
  148. ConclusionDetails = new List<GetCompanyOccupationalDiseaseSummaryReportConclusionDetailDto>(),
  149. };
  150. if (patientRegisterList.Any())
  151. {
  152. //人员id
  153. var patientRegisters = query.Select(m => m.patientRegister).Distinct().ToList();
  154. var patientRegisterfisrt = query.First();
  155. //在岗ID
  156. Guid onDutyId = (await _ocCheckTypeRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("在岗"))).Id;
  157. //离岗时ID
  158. Guid whenLeavingWorkId = (await _ocCheckTypeRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("离岗时"))).Id;
  159. //未见异常ID
  160. Guid noAbnormalId = (await _occupationalAbnormalRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("未见异常"))).Id;
  161. msg.CertificateNo = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_qualification_certificate_number");
  162. msg.MedicalTypeName = await _cacheService.GetMedicalTypeNameAsync(patientRegisterfisrt.patientRegister.MedicalTypeId);
  163. msg.CustomerOrgName = await _cacheService.GetTopCustomerOrgNameAsync(patientRegisterfisrt.patientRegister.CustomerOrgId);
  164. msg.MedicalCenterAddress = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_address");
  165. msg.MedicalCenterName = (await _organizationUnitRepository.GetAsync(patientRegisterfisrt.patientRegister.MedicalCenterId)).DisplayName;
  166. msg.MedicalStartDate = Convert.ToDateTime(customerOrgPara.StartDate).ToString("yyyy年MM月dd日");
  167. msg.MedicalSumCount = patientRegisters.Count;
  168. msg.RecordNumber = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_record_number");
  169. msg.ReportDate = DateTime.Now.ToString("yyyy年MM月dd日");
  170. msg.OnDutyCount = patientRegisterList.Where(m => m.patientOccupationalDisease.OcCheckTypeId == onDutyId).GroupBy(g => g.patientRegister).Count();
  171. msg.WhenLeavingWorkCount = patientRegisterList.Where(m => m.patientOccupationalDisease.OcCheckTypeId == whenLeavingWorkId).Count();
  172. msg.PoisonNames = string.Join('、', patientRegisterList.Where(m => m.patientOccupationalDisease.OcCheckTypeId == onDutyId
  173. || m.patientOccupationalDisease.OcCheckTypeId == whenLeavingWorkId).Select(s => s.posionHaveEmpty.DisplayName).Distinct());
  174. //有结论的数据
  175. var conclusionList = patientRegisterList.Where(m => (m.patientOccupationalDisease.OcCheckTypeId == onDutyId
  176. || m.patientOccupationalDisease.OcCheckTypeId == whenLeavingWorkId)
  177. && m.patientPoisonHaveEmpty.OccupationalAbnormalId != null && m.patientPoisonHaveEmpty.OccupationalAbnormalId != noAbnormalId);
  178. msg.Conclusions = string.Join('、', conclusionList.Select(s => s.occupationalAbnormalHaveEmpty.DisplayName).Distinct());
  179. msg.JobTypes = string.Join('、', conclusionList.Select(s => s.patientOccupationalDisease.JobType).Distinct());
  180. #region 检查结果
  181. //目标疾病检出情况
  182. List<GetCompanyOccupationalDiseaseSummaryReportConclusionDetailDto> conclusionDetails = new List<GetCompanyOccupationalDiseaseSummaryReportConclusionDetailDto>();
  183. var occupationalAbnormalList = (await _occupationalAbnormalRepository.GetListAsync()).OrderBy(o => o.DisplayOrder);
  184. foreach (var item in occupationalAbnormalList)
  185. {
  186. var conclusionCount = patientRegisterList.Where(m => m.patientPoisonHaveEmpty.OccupationalAbnormalId == item.Id).Select(s => s.patientRegister.Id).Distinct().Count();
  187. var conclusionRatio = Decimal.Round(Convert.ToDecimal(conclusionCount * 100) / patientRegisters.Count, 2);
  188. var conclusionDetail = new GetCompanyOccupationalDiseaseSummaryReportConclusionDetailDto
  189. {
  190. ConclusionName = item.DisplayName,
  191. DisplayOrder = item.DisplayOrder,
  192. ConclusionCount = conclusionCount,
  193. ConclusionRatio = conclusionRatio
  194. };
  195. conclusionDetails.Add(conclusionDetail);
  196. }
  197. msg.ConclusionDetails = conclusionDetails;
  198. //相关检查情况
  199. var asbitemAbnormalQuery = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  200. join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId
  201. join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
  202. join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id into asbitemTemp
  203. from asbitemHaveEmpty in asbitemTemp.DefaultIfEmpty()
  204. join registerCheckSummary in await _registerCheckSummaryRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckSummary.RegisterCheckId
  205. join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId
  206. where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId
  207. && !registerCheckSummary.Summary.Contains("未见异常")
  208. && patientRegister.CompleteFlag == PatientRegisterCompleteFlag.SumCheck
  209. select new
  210. {
  211. patientRegister,
  212. asbitemName = asbitemHaveEmpty.DisplayName
  213. });
  214. if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))
  215. {
  216. if (customerOrgPara.DateType == '1')
  217. {
  218. asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  219. m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  220. }
  221. else if (customerOrgPara.DateType == '2')
  222. {
  223. asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.MedicalStartDate != null && m.patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  224. m.patientRegister.MedicalStartDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  225. }
  226. else if (customerOrgPara.DateType == '3')
  227. {
  228. asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  229. m.patientRegister.SummaryDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  230. }
  231. }
  232. if (customerOrgPara.CustomerOrgGroupId.Any())
  233. {
  234. asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));
  235. }
  236. var asbitemAbnormalList = asbitemAbnormalQuery.ToList();
  237. //异常总人数
  238. var abnormalSumCount = asbitemAbnormalList.Select(s => s.patientRegister.Id).Distinct().Count();
  239. var asbitemAbnormals = asbitemAbnormalList.GroupBy(g => g.asbitemName).Select((s, index) => new GetCompanyOccupationalDiseaseSummaryReportAsbitemAbnormalDto
  240. {
  241. AbnormalAsbitemName = s.Key,
  242. AbnormalCount = s.Select(ss => ss.patientRegister.Id).Distinct().Count(),
  243. AbnormalRatio = Decimal.Round(Convert.ToDecimal(s.Select(ss => ss.patientRegister.Id).Distinct().Count() * 100) / abnormalSumCount, 2),
  244. DisplayOrder = index + 1
  245. }).ToList();
  246. msg.AsbitemAbnormals = asbitemAbnormals;
  247. #endregion
  248. }
  249. return msg;
  250. }
  251. /// <summary>
  252. /// 获取单位职业病明细报告
  253. /// </summary>
  254. /// <returns></returns>
  255. [HttpPost("api/app/OccupationalDiseaseReport/GetCompanyOccupationalDiseaseDetailReport")]
  256. public async Task<GetCompanyOccupationalDiseaseDetailReportDto> GetCompanyOccupationalDiseaseDetailReportAsync(GetCompanyOccupationalDiseaseDetailReportInputDto input)
  257. {
  258. if (!input.CustomerOrgs.Any())
  259. throw new UserFriendlyException("单位信息不能为空");
  260. var customerOrgPara = input.CustomerOrgs.First();
  261. if (customerOrgPara.CustomerOrgId == null || customerOrgPara.CustomerOrgId == Guid.Empty)
  262. throw new UserFriendlyException("单位不能为空");
  263. if (customerOrgPara.CustomerOrgRegisterId == null || customerOrgPara.CustomerOrgRegisterId == Guid.Empty)
  264. throw new UserFriendlyException("单位体检次数不能为空");
  265. #region 人员信息
  266. var query = from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  267. join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id
  268. join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId
  269. join patientPoison in await _patientPoisonRepository.GetQueryableAsync() on patientRegister.Id equals patientPoison.PatientRegisterId into patientPoisonTemp
  270. from patientPoisonHaveEmpty in patientPoisonTemp.DefaultIfEmpty()
  271. join poison in await _poisonRepository.GetQueryableAsync() on patientPoisonHaveEmpty.PoisonId equals poison.Id into poisonTemp
  272. from posionHaveEmpty in poisonTemp.DefaultIfEmpty()
  273. join ocCheckType in await _ocCheckTypeRepository.GetQueryableAsync() on patientOccupationalDisease.OcCheckTypeId equals ocCheckType.Id into ocCheckTypeTemp
  274. from ocCheckTypeHaveEmpty in ocCheckTypeTemp.DefaultIfEmpty()
  275. where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId
  276. select new
  277. {
  278. patientRegister,
  279. patient,
  280. patientOccupationalDisease,
  281. posionHaveEmpty,
  282. patientPoisonHaveEmpty,
  283. ocCheckTypeHaveEmpty
  284. };
  285. if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))
  286. {
  287. if (customerOrgPara.DateType == '1')
  288. {
  289. query = query.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  290. m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  291. }
  292. else if (customerOrgPara.DateType == '2')
  293. {
  294. query = query.Where(m => m.patientRegister.MedicalStartDate != null && m.patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  295. m.patientRegister.MedicalStartDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  296. }
  297. else if (customerOrgPara.DateType == '3')
  298. {
  299. query = query.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  300. m.patientRegister.SummaryDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  301. }
  302. }
  303. List<Guid?> customerOrgIds = new List<Guid?>();
  304. if (customerOrgPara.CustomerOrgId != null)
  305. {
  306. customerOrgIds = await _customerOrgManager.GetCustomerOrgChildrenId(customerOrgPara.CustomerOrgId.Value);
  307. }
  308. if (customerOrgIds.Any())
  309. {
  310. query = query.Where(m => customerOrgIds.Contains(m.patientRegister.CustomerOrgId));
  311. }
  312. if (customerOrgPara.CustomerOrgGroupId.Any())
  313. {
  314. query = query.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));
  315. }
  316. #endregion
  317. //var ddd = query.ToQueryString();
  318. //var noCheckPatientRegisterList = query.ToList();
  319. //var sumCount = noCheckPatientRegisterList.GroupBy(g => g.patientRegister).Count(); //总人数
  320. //query = query.Where(m => m.patientRegister.CompleteFlag == PatientRegisterCompleteFlag.SumCheck);
  321. var patientRegisterList = query.ToList();
  322. var sumCount = patientRegisterList.GroupBy(g => g.patientRegister).Count(); //总人数
  323. var msg = new GetCompanyOccupationalDiseaseDetailReportDto();
  324. if (patientRegisterList.Any())
  325. {
  326. //人员
  327. //var patientRegisters = patientRegisterList.Select(m => m.patientRegister).Distinct().ToList();
  328. var patientRegisterfisrt = patientRegisterList.First();
  329. msg.CertificateNo = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_qualification_certificate_number");
  330. msg.CustomerOrgName = await _cacheService.GetTopCustomerOrgNameAsync(patientRegisterfisrt.patientRegister.CustomerOrgId);
  331. msg.MedicalCenterName = (await _organizationUnitRepository.GetAsync(patientRegisterfisrt.patientRegister.MedicalCenterId)).DisplayName;
  332. msg.MedicalStartDate = Convert.ToDateTime(customerOrgPara.StartDate).ToString("yyyy年MM月dd日");
  333. msg.RecordNumber = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_record_number");
  334. msg.ReportDate = DateTime.Now.ToString("yyyy年MM月dd日");
  335. msg.OcCheckTypeNames = (await _ocCheckTypeRepository.GetListAsync()).Select(s => new GetCompanyOccupationalDiseaseDetailReportOcCheckTypeDetailDto
  336. {
  337. OcCheckTypeName = s.DisplayName,
  338. IsSelected = false
  339. }).ToList();
  340. #region 检查情况报告列表
  341. var ocCheckTypeDetails = patientRegisterList.GroupBy(g => new { g.patientRegister, g.patientOccupationalDisease.OcCheckTypeId })
  342. .Select(s => new
  343. {
  344. posionNames = string.Join("、", s.Where(m => m.posionHaveEmpty != null)
  345. .OrderBy(o => o.posionHaveEmpty.DisplayOrder).Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),
  346. ocCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty != null ? s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName : "",
  347. }).ToList()
  348. .GroupBy(g => new { g.ocCheckTypeName, g.posionNames })
  349. .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportOcCheckTypeSummaryDto
  350. {
  351. DisplayOrder = index + 1,
  352. OcCheckTypeName = s.Key.ocCheckTypeName,
  353. CheckCount = s.Count(),
  354. PoisonNames = s.Key.posionNames
  355. }).ToList();
  356. msg.OcCheckTypeDetails = ocCheckTypeDetails;
  357. #endregion
  358. #region 选中检查类别
  359. foreach (var item in msg.OcCheckTypeNames)
  360. {
  361. var isSelected = ocCheckTypeDetails.Count(f => f.OcCheckTypeName == item.OcCheckTypeName) > 0 ? true : false;
  362. item.IsSelected = isSelected;
  363. }
  364. #endregion
  365. #region 未见异常人员一览表
  366. var noAbnormalConditionsDetails = patientRegisterList.Where(m => !string.IsNullOrWhiteSpace(m.patientOccupationalDisease.OccupationalAbnormal)
  367. && m.patientOccupationalDisease.OccupationalAbnormal.Contains("未见异常"))
  368. .GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)
  369. .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto
  370. {
  371. DisplayOrder = index + 1,
  372. HandlingSuggestions = s.Key.OccupationalAbSuggestion,
  373. JobType = s.Key.JobType,
  374. PatientName = s.FirstOrDefault().patientRegister.PatientName,
  375. PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,
  376. PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),
  377. PoisonWorkTime = s.Key.PoisonWorkTime,
  378. MedicalConclusion = s.Key.OccupationalAbnormal,
  379. OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,
  380. Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),
  381. IdNo = s.FirstOrDefault().patient.IdNo,
  382. SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),
  383. MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),
  384. SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()
  385. }).ToList();
  386. msg.NoAbnormalConditionsDetails = noAbnormalConditionsDetails;
  387. #endregion
  388. #region 其他疾病或异常人员一览表
  389. var otherDiseasesOrAbnormalIndividualsDetails = patientRegisterList.Where(m => !string.IsNullOrWhiteSpace(m.patientOccupationalDisease.OccupationalAbnormal)
  390. && m.patientOccupationalDisease.OccupationalAbnormal.Contains("其他疾病或异常"))
  391. .GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)
  392. .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto
  393. {
  394. DisplayOrder = index + 1,
  395. HandlingSuggestions = s.Key.OccupationalAbSuggestion,
  396. JobType = s.Key.JobType,
  397. PatientName = s.FirstOrDefault().patientRegister.PatientName,
  398. PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,
  399. PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),
  400. PoisonWorkTime = s.Key.PoisonWorkTime,
  401. MedicalConclusion = s.Key.OccupationalAbnormal,
  402. OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,
  403. Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),
  404. IdNo = s.FirstOrDefault().patient.IdNo,
  405. SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),
  406. MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),
  407. SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()
  408. }).ToList();
  409. msg.OtherDiseasesOrAbnormalIndividualsDetails = otherDiseasesOrAbnormalIndividualsDetails;
  410. #endregion
  411. #region 复查人员一览表
  412. var reviewPersonnelDetails = patientRegisterList.Where(m => !string.IsNullOrWhiteSpace(m.patientOccupationalDisease.OccupationalAbnormal)
  413. && m.patientOccupationalDisease.OccupationalAbnormal.Contains("复查"))
  414. .GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)
  415. .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto
  416. {
  417. DisplayOrder = index + 1,
  418. HandlingSuggestions = s.Key.OccupationalAbSuggestion,
  419. JobType = s.Key.JobType,
  420. PatientName = s.FirstOrDefault().patientRegister.PatientName,
  421. PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,
  422. PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),
  423. PoisonWorkTime = s.Key.PoisonWorkTime,
  424. MedicalConclusion = s.Key.OccupationalAbnormal,
  425. OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,
  426. Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),
  427. IdNo = s.FirstOrDefault().patient.IdNo,
  428. SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),
  429. MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),
  430. SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()
  431. }).ToList();
  432. msg.ReviewPersonnelDetails = reviewPersonnelDetails;
  433. #endregion
  434. #region 职业禁忌证人员一览表
  435. var occupationalContraindicationDetails = patientRegisterList.Where(m => !string.IsNullOrWhiteSpace(m.patientOccupationalDisease.OccupationalAbnormal)
  436. && m.patientOccupationalDisease.OccupationalAbnormal.Contains("职业禁忌证"))
  437. .GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)
  438. .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto
  439. {
  440. DisplayOrder = index + 1,
  441. HandlingSuggestions = s.Key.OccupationalAbSuggestion,
  442. JobType = s.Key.JobType,
  443. PatientName = s.FirstOrDefault().patientRegister.PatientName,
  444. PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,
  445. PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),
  446. PoisonWorkTime = s.Key.PoisonWorkTime,
  447. MedicalConclusion = s.Key.OccupationalAbnormal,
  448. OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,
  449. Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),
  450. IdNo = s.FirstOrDefault().patient.IdNo,
  451. SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),
  452. MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),
  453. SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()
  454. }).ToList();
  455. msg.OccupationalContraindicationDetails = occupationalContraindicationDetails;
  456. #endregion
  457. #region 疑似职业病人员一览表
  458. var suspectedOccupationalDiseaseDetails = patientRegisterList.Where(m => !string.IsNullOrWhiteSpace(m.patientOccupationalDisease.OccupationalAbnormal)
  459. && m.patientOccupationalDisease.OccupationalAbnormal.Contains("疑似职业病"))
  460. .GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)
  461. .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto
  462. {
  463. DisplayOrder = index + 1,
  464. HandlingSuggestions = s.Key.OccupationalAbSuggestion,
  465. JobType = s.Key.JobType,
  466. PatientName = s.FirstOrDefault().patientRegister.PatientName,
  467. PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,
  468. PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),
  469. PoisonWorkTime = s.Key.PoisonWorkTime,
  470. MedicalConclusion = s.Key.OccupationalAbnormal,
  471. OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,
  472. Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),
  473. IdNo = s.FirstOrDefault().patient.IdNo,
  474. SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),
  475. MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),
  476. SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()
  477. }).ToList();
  478. msg.SuspectedOccupationalDiseaseDetails = suspectedOccupationalDiseaseDetails;
  479. #endregion
  480. #region 体检结果异常率明细
  481. var asbitemAbnormalQuery = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  482. join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id
  483. join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId
  484. join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
  485. join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id into asbitemTemp
  486. from asbitemHaveEmpty in asbitemTemp.DefaultIfEmpty()
  487. join registerCheckSummary in await _registerCheckSummaryRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckSummary.RegisterCheckId into registerCheckSummaryTemp
  488. from registerCheckSummaryEmpty in registerCheckSummaryTemp.DefaultIfEmpty()
  489. join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId
  490. join ocCheckType in await _ocCheckTypeRepository.GetQueryableAsync() on patientOccupationalDisease.OcCheckTypeId equals ocCheckType.Id into ocCheckTypeTemp
  491. from ocCheckTypeHaveEmpty in ocCheckTypeTemp.DefaultIfEmpty()
  492. join patientPoison in await _patientPoisonRepository.GetQueryableAsync() on patientRegister.Id equals patientPoison.PatientRegisterId into patientPoisonTemp
  493. from patientPoisonHaveEmpty in patientPoisonTemp.DefaultIfEmpty()
  494. join poison in await _poisonRepository.GetQueryableAsync() on patientPoisonHaveEmpty.PoisonId equals poison.Id into poisonTemp
  495. from posionHaveEmpty in poisonTemp.DefaultIfEmpty()
  496. where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId
  497. // && !registerCheckSummaryEmpty.Summary.Contains("未见异常")
  498. // && patientRegister.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration
  499. && asbitemHaveEmpty.IsCheck == 'Y'
  500. select new
  501. {
  502. patientRegister,
  503. asbitemName = asbitemHaveEmpty.DisplayName,
  504. registerCheckCompleteFlag = registerCheck.CompleteFlag,
  505. idNo = patient.IdNo,
  506. summary = registerCheckSummaryEmpty != null ? registerCheckSummaryEmpty.Summary : "",
  507. ocCheckTypeName = ocCheckTypeHaveEmpty != null ? ocCheckTypeHaveEmpty.DisplayName : "",
  508. posionName = posionHaveEmpty != null ? posionHaveEmpty.DisplayName : "",
  509. jobType = patientOccupationalDisease.JobType,
  510. poisonWorkTime = patientOccupationalDisease.PoisonWorkTime,
  511. occupationalAbnormal = patientOccupationalDisease.OccupationalAbnormal
  512. });
  513. if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))
  514. {
  515. if (customerOrgPara.DateType == '1')
  516. {
  517. asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  518. m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  519. }
  520. else if (customerOrgPara.DateType == '2')
  521. {
  522. asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.MedicalStartDate != null && m.patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  523. m.patientRegister.MedicalStartDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  524. }
  525. else if (customerOrgPara.DateType == '3')
  526. {
  527. asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  528. m.patientRegister.SummaryDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  529. }
  530. }
  531. if (customerOrgIds.Any())
  532. {
  533. asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => customerOrgIds.Contains(m.patientRegister.CustomerOrgId));
  534. }
  535. if (customerOrgPara.CustomerOrgGroupId.Any())
  536. {
  537. asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));
  538. }
  539. var asbitemAbnormalList = asbitemAbnormalQuery.ToList();
  540. var asbitemAbnormalCount = asbitemAbnormalList.Where(m => !m.summary.Contains("未见异常")).Select(s => s.asbitemName).Distinct().Count();
  541. var medicalResultAbnormalRateDetails = asbitemAbnormalList.Where(m => !m.summary.Contains("未见异常")).GroupBy(g => g.asbitemName)
  542. .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultAbnormalRateDetailDto
  543. {
  544. AbnormalPatientNames = string.Join("、", s.Select(ss => ss.patientRegister.PatientName).Distinct()),
  545. AsbitemName = s.Key,
  546. DisplayOrder = index + 1,
  547. AbnormalRate = Decimal.Round(Convert.ToDecimal(s.Count() * 100) / asbitemAbnormalCount, 2)
  548. }).ToList();
  549. msg.MedicalResultAbnormalRateDetails = medicalResultAbnormalRateDetails;
  550. #endregion
  551. #region 缺项人员一览表 <已经开始检查了,但是未检查完的>
  552. var listOfMissingItemsDetails = asbitemAbnormalList.Where(m => m.patientRegister.IsMedicalStart == 'Y' && m.registerCheckCompleteFlag == RegisterCheckCompleteFlag.UnChecked)
  553. .GroupBy(g => g.patientRegister).OrderBy(o => o.FirstOrDefault().occupationalAbnormal)
  554. .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportListOfMissingItemsDetailDto
  555. {
  556. DisplayOrder = index + 1,
  557. IdNo = s.FirstOrDefault().idNo,
  558. PatientName = s.Key.PatientName,
  559. PatientRegisterNo = s.Key.PatientRegisterNo,
  560. UnCheckAsbitemName = string.Join("、", s.Select(ss => ss.asbitemName).Distinct()),
  561. Age = s.Key.Age == null ? "" : s.Key.Age.ToString(),
  562. JobType = s.FirstOrDefault().jobType,
  563. MedicalStartDate = DataHelper.ConversionDateShortToString(s.Key.MedicalStartDate),
  564. OcCheckTypeName = s.FirstOrDefault().ocCheckTypeName,
  565. PoisonNames = string.Join(",", s.Where(m => !string.IsNullOrWhiteSpace(m.posionName)).Select(ss => ss.posionName).Distinct()),
  566. PoisonWorkTime = s.FirstOrDefault().poisonWorkTime,
  567. SexName = _cacheService.GetSexNameAsync(s.Key.SexId).GetAwaiter().GetResult(),
  568. SummaryDoctorName = _cacheService.GetSurnameAsync(s.Key.AuditDoctorId).GetAwaiter().GetResult()
  569. }).ToList();
  570. msg.ListOfMissingItemsDetails = listOfMissingItemsDetails;
  571. #endregion
  572. #region 未检人员一览表 <还没开始检查的>
  573. //
  574. var uninspectedPersonnelDetails = asbitemAbnormalList.Where(m => m.patientRegister.IsMedicalStart == 'N' && m.registerCheckCompleteFlag == RegisterCheckCompleteFlag.UnChecked)
  575. .GroupBy(g => g.patientRegister).OrderBy(o => o.FirstOrDefault().occupationalAbnormal)
  576. .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportUninspectedPersonnelDetailDto
  577. {
  578. DisplayOrder = index + 1,
  579. IdNo = s.FirstOrDefault().idNo,
  580. PatientName = s.Key.PatientName,
  581. PatientRegisterNo = s.Key.PatientRegisterNo,
  582. UnCheckAsbitemName = string.Join("、", s.Select(ss => ss.asbitemName).Distinct()),
  583. Age = s.Key.Age == null ? "" : s.Key.Age.ToString(),
  584. JobType = s.FirstOrDefault().jobType,
  585. MedicalStartDate = DataHelper.ConversionDateShortToString(s.Key.MedicalStartDate),
  586. OcCheckTypeName = s.FirstOrDefault().ocCheckTypeName,
  587. PoisonNames = string.Join(",", s.Where(m => !string.IsNullOrWhiteSpace(m.posionName)).Select(ss => ss.posionName).Distinct()),
  588. PoisonWorkTime = s.FirstOrDefault().poisonWorkTime,
  589. SexName = _cacheService.GetSexNameAsync(s.Key.SexId).GetAwaiter().GetResult(),
  590. SummaryDoctorName = _cacheService.GetSurnameAsync(s.Key.AuditDoctorId).GetAwaiter().GetResult()
  591. }).ToList();
  592. msg.UninspectedPersonnelDetails = uninspectedPersonnelDetails;
  593. #endregion
  594. #region 体检结果总结
  595. msg.MedicalResultDesc = $"{Convert.ToDateTime(customerOrgPara.StartDate).ToString("yyyy-MM-dd")},{msg.CustomerOrgName}组织{sumCount}名接触" +
  596. $"特种作业工人进行职业健康检查。";
  597. var occupationalAbnormalDetails = new List<GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto>();
  598. occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto
  599. {
  600. DisplayOrder = 1,
  601. OccupationalAbnormalName = "未见异常",
  602. OccupationalAbnormalCount = noAbnormalConditionsDetails.Count,
  603. OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(noAbnormalConditionsDetails.Count * 100) / sumCount, 2),
  604. });
  605. occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto
  606. {
  607. DisplayOrder = 2,
  608. OccupationalAbnormalName = "其他疾病或异常",
  609. OccupationalAbnormalCount = otherDiseasesOrAbnormalIndividualsDetails.Count,
  610. OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(otherDiseasesOrAbnormalIndividualsDetails.Count * 100) / sumCount, 2),
  611. });
  612. occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto
  613. {
  614. DisplayOrder = 3,
  615. OccupationalAbnormalName = "复查",
  616. OccupationalAbnormalCount = reviewPersonnelDetails.Count,
  617. OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(reviewPersonnelDetails.Count * 100) / sumCount, 2),
  618. });
  619. occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto
  620. {
  621. DisplayOrder = 4,
  622. OccupationalAbnormalName = "职业禁忌症",
  623. OccupationalAbnormalCount = occupationalContraindicationDetails.Count,
  624. OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(occupationalContraindicationDetails.Count * 100) / sumCount, 2),
  625. });
  626. occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto
  627. {
  628. DisplayOrder = 5,
  629. OccupationalAbnormalName = "疑似职业病",
  630. OccupationalAbnormalCount = suspectedOccupationalDiseaseDetails.Count,
  631. OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(suspectedOccupationalDiseaseDetails.Count * 100) / sumCount, 2),
  632. });
  633. occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto
  634. {
  635. DisplayOrder = 6,
  636. OccupationalAbnormalName = "缺项",
  637. OccupationalAbnormalCount = listOfMissingItemsDetails.Count,
  638. OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(listOfMissingItemsDetails.Count * 100) / sumCount, 2),
  639. });
  640. occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto
  641. {
  642. DisplayOrder = 7,
  643. OccupationalAbnormalName = "未检",
  644. OccupationalAbnormalCount = uninspectedPersonnelDetails.Count,
  645. OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(uninspectedPersonnelDetails.Count * 100) / sumCount, 2),
  646. });
  647. msg.OccupationalAbnormalDetails = occupationalAbnormalDetails;
  648. #endregion
  649. }
  650. return msg;
  651. }
  652. ///// <summary>
  653. ///// 获取单位职业病明细报告
  654. ///// </summary>
  655. ///// <returns></returns>
  656. //[HttpPost("api/app/OccupationalDiseaseReport/GetCompanyOccupationalDiseaseDetailReport")]
  657. //public async Task<GetCompanyOccupationalDiseaseDetailReportDto> GetCompanyOccupationalDiseaseDetailReportAsync(GetCompanyOccupationalDiseaseDetailReportInputDto input)
  658. //{
  659. // if (!input.CustomerOrgs.Any())
  660. // throw new UserFriendlyException("单位信息不能为空");
  661. // var customerOrgPara = input.CustomerOrgs.First();
  662. // if (customerOrgPara.CustomerOrgId == null || customerOrgPara.CustomerOrgId == Guid.Empty)
  663. // throw new UserFriendlyException("单位不能为空");
  664. // if (customerOrgPara.CustomerOrgRegisterId == null || customerOrgPara.CustomerOrgRegisterId == Guid.Empty)
  665. // throw new UserFriendlyException("单位体检次数不能为空");
  666. // #region 人员信息
  667. // var query = from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  668. // join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id
  669. // join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId
  670. // join patientPoison in await _patientPoisonRepository.GetQueryableAsync() on patientRegister.Id equals patientPoison.PatientRegisterId into patientPoisonTemp
  671. // from patientPoisonHaveEmpty in patientPoisonTemp.DefaultIfEmpty()
  672. // join poison in await _poisonRepository.GetQueryableAsync() on patientPoisonHaveEmpty.PoisonId equals poison.Id into poisonTemp
  673. // from posionHaveEmpty in poisonTemp.DefaultIfEmpty()
  674. // join occupationalAbnormal in await _occupationalAbnormalRepository.GetQueryableAsync() on patientPoisonHaveEmpty.OccupationalAbnormalId equals occupationalAbnormal.Id into occupationalAbnormalTemp
  675. // from occupationalAbnormalHaveEmpty in occupationalAbnormalTemp.DefaultIfEmpty()
  676. // join ocCheckType in await _ocCheckTypeRepository.GetQueryableAsync() on patientOccupationalDisease.OcCheckTypeId equals ocCheckType.Id into ocCheckTypeTemp
  677. // from ocCheckTypeHaveEmpty in ocCheckTypeTemp.DefaultIfEmpty()
  678. // join sumSummaryHeader in (await _sumSummaryHeaderRepository.GetQueryableAsync()).Include(x => x.SumSummaryContents) on patientRegister.Id equals sumSummaryHeader.PatientRegisterId into sumSummaryHeaderTemp
  679. // from sumSummaryHeaderHaveEmpty in sumSummaryHeaderTemp.DefaultIfEmpty()
  680. // where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId
  681. // && patientRegister.CompleteFlag != PatientRegisterCompleteFlag.SumCheck
  682. // select new
  683. // {
  684. // patientRegister,
  685. // patient,
  686. // patientOccupationalDisease,
  687. // posionHaveEmpty,
  688. // patientPoisonHaveEmpty,
  689. // occupationalAbnormalHaveEmpty,
  690. // ocCheckTypeHaveEmpty,
  691. // sumSummaryHeaderHaveEmpty
  692. // };
  693. // if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))
  694. // {
  695. // if (customerOrgPara.DateType == '1')
  696. // {
  697. // query = query.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  698. // m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  699. // }
  700. // else if (customerOrgPara.DateType == '2')
  701. // {
  702. // query = query.Where(m => m.patientRegister.MedicalStartDate != null && m.patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  703. // m.patientRegister.MedicalStartDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  704. // }
  705. // else if (customerOrgPara.DateType == '3')
  706. // {
  707. // query = query.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  708. // m.patientRegister.SummaryDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  709. // }
  710. // }
  711. // if (customerOrgPara.CustomerOrgGroupId.Any())
  712. // {
  713. // query = query.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));
  714. // }
  715. // #endregion
  716. // var patientRegisterList = query.ToList();
  717. // var msg = new GetCompanyOccupationalDiseaseDetailReportDto
  718. // {
  719. // DiagnosisAndTreatmentDetails = new List<GetCompanyOccupationalDiseaseDetailReportDiagnosisAndTreatmentDetailDto>(),
  720. // ListOfMissingItemsDetails = new List<GetCompanyOccupationalDiseaseDetailReportListOfMissingItemsDetailDto>(),
  721. // MedicalResultAbnormalRateDetails = new List<GetCompanyOccupationalDiseaseDetailReportMedicalResultAbnormalRateDetailDto>(),
  722. // OccupationalContraindicationDetails = new List<GetCompanyOccupationalDiseaseDetailReportOccupationalContraindicationDetailDto>(),
  723. // ReviewPersonnelDetails = new List<GetCompanyOccupationalDiseaseDetailReportReviewPersonnelDetailDto>(),
  724. // SuspectedOccupationalDiseaseDetails = new List<GetCompanyOccupationalDiseaseDetailReportSuspectedOccupationalDiseaseDetailDto>()
  725. // };
  726. // if (patientRegisterList.Any())
  727. // {
  728. // //人员
  729. // var patientRegisters = patientRegisterList.Select(m => m.patientRegister).Distinct().ToList();
  730. // var patientRegisterfisrt = patientRegisterList.First();
  731. // msg.CertificateNo = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_qualification_certificate_number");
  732. // msg.CustomerOrgName = await _cacheService.GetTopCustomerOrgNameAsync(patientRegisterfisrt.patientRegister.CustomerOrgId);
  733. // msg.MedicalCenterName = (await _organizationUnitRepository.GetAsync(patientRegisterfisrt.patientRegister.MedicalCenterId)).DisplayName;
  734. // msg.MedicalStartDate = Convert.ToDateTime(customerOrgPara.StartDate).ToString("yyyy年MM月dd日");
  735. // msg.RecordNumber = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_record_number");
  736. // msg.ReportDate = DateTime.Now.ToString("yyyy年MM月dd日");
  737. // msg.OcCheckTypeNames = (await _ocCheckTypeRepository.GetListAsync()).Select(s => s.DisplayName).ToList();
  738. // #region 检查情况报告列表
  739. // var ocCheckTypeDetails = patientRegisterList.GroupBy(g => new { g.patientRegister, g.patientOccupationalDisease.OcCheckTypeId })
  740. // .Select(s => new
  741. // {
  742. // posionNames = string.Join("、", s.Where(m => m.posionHaveEmpty != null)
  743. // .OrderBy(o => o.posionHaveEmpty.DisplayOrder).Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),
  744. // ocCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty != null ? s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName : "",
  745. // }).ToList()
  746. // .GroupBy(g => new { g.ocCheckTypeName, g.posionNames })
  747. // .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportOcCheckTypeSummaryDto
  748. // {
  749. // DisplayOrder = index + 1,
  750. // OcCheckTypeName = s.Key.ocCheckTypeName,
  751. // CheckCount = s.Count(),
  752. // PoisonNames = s.Key.posionNames
  753. // }).ToList();
  754. // msg.OcCheckTypeDetails = ocCheckTypeDetails;
  755. // #endregion
  756. // #region 体检结果总结
  757. // var occupationalAbnormalDetails = patientRegisterList.Where(m => m.occupationalAbnormalHaveEmpty != null).ToList()
  758. // .GroupBy(g => new { g.patientRegister, g.occupationalAbnormalHaveEmpty })
  759. // .Select(s => new { occupationalAbnormalName = s.Key.occupationalAbnormalHaveEmpty.DisplayName }).ToList()
  760. // .GroupBy(g => g.occupationalAbnormalName)
  761. // .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto
  762. // {
  763. // DisplayOrder = index + 1,
  764. // OccupationalAbnormalCount = s.Count(),
  765. // OccupationalAbnormalName = s.Key,
  766. // OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(s.Count() * 100) / patientRegisters.Count, 2)
  767. // }).ToList();
  768. // string occupationalAbnormalDesc = "";
  769. // foreach (var item in occupationalAbnormalDetails)
  770. // {
  771. // if (occupationalAbnormalDetails.IndexOf(item) == occupationalAbnormalDetails.Count - 1)
  772. // occupationalAbnormalDesc += $"{item.OccupationalAbnormalName}{item.OccupationalAbnormalCount}人。";
  773. // else
  774. // occupationalAbnormalDesc += $"{item.OccupationalAbnormalName}{item.OccupationalAbnormalCount}人,";
  775. // }
  776. // msg.MedicalResultDesc = $"{Convert.ToDateTime(customerOrgPara.StartDate).ToString("yyyy-MM-dd")},{msg.CustomerOrgName}组织{patientRegisters.Count}名接触" +
  777. // $"{1}作业工人进行职业健康检查,结果:{occupationalAbnormalDesc}";
  778. // msg.OccupationalAbnormalDetails = occupationalAbnormalDetails;
  779. // #endregion
  780. // #region 体检结果一览表
  781. // var medicalResultDetails = patientRegisterList.GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)
  782. // .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto
  783. // {
  784. // //AnomalyIndex = !string.IsNullOrWhiteSpace(s.Key.OccupationalAbnormal)
  785. // //? $"{SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList())}\n结论:{s.Key.OccupationalAbnormal}"
  786. // //: $"{SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList())}",
  787. // AnomalyIndex = $"{SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList())}",
  788. // DisplayOrder = index + 1,
  789. // HandlingSuggestions = s.Key.OccupationalAbSuggestion,
  790. // JobType = s.Key.JobType,
  791. // PatientName = s.FirstOrDefault().patientRegister.PatientName,
  792. // PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,
  793. // PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),
  794. // PoisonWorkTime = s.Key.PoisonWorkTime,
  795. // MedicalConclusion = s.Key.OccupationalAbnormal,
  796. // OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,
  797. // Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),
  798. // IdNo = s.FirstOrDefault().patient.IdNo,
  799. // SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),
  800. // MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),
  801. // SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()
  802. // }).ToList();
  803. // msg.MedicalResultDetails = medicalResultDetails;
  804. // #endregion
  805. // #region 体检结果异常率明细
  806. // var asbitemAbnormalQuery = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  807. // join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id
  808. // join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId
  809. // join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
  810. // join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id into asbitemTemp
  811. // from asbitemHaveEmpty in asbitemTemp.DefaultIfEmpty()
  812. // join registerCheckSummary in await _registerCheckSummaryRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckSummary.RegisterCheckId into registerCheckSummaryTemp
  813. // from registerCheckSummaryEmpty in registerCheckSummaryTemp.DefaultIfEmpty()
  814. // join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId
  815. // join ocCheckType in await _ocCheckTypeRepository.GetQueryableAsync() on patientOccupationalDisease.OcCheckTypeId equals ocCheckType.Id into ocCheckTypeTemp
  816. // from ocCheckTypeHaveEmpty in ocCheckTypeTemp.DefaultIfEmpty()
  817. // join patientPoison in await _patientPoisonRepository.GetQueryableAsync() on patientRegister.Id equals patientPoison.PatientRegisterId into patientPoisonTemp
  818. // from patientPoisonHaveEmpty in patientPoisonTemp.DefaultIfEmpty()
  819. // join poison in await _poisonRepository.GetQueryableAsync() on patientPoisonHaveEmpty.PoisonId equals poison.Id into poisonTemp
  820. // from posionHaveEmpty in poisonTemp.DefaultIfEmpty()
  821. // where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId
  822. // // && !registerCheckSummaryEmpty.Summary.Contains("未见异常")
  823. // && patientRegister.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration
  824. // && asbitemHaveEmpty.IsCheck == 'Y'
  825. // select new
  826. // {
  827. // patientRegister,
  828. // asbitemName = asbitemHaveEmpty.DisplayName,
  829. // registerCheckCompleteFlag = registerCheck.CompleteFlag,
  830. // idNo = patient.IdNo,
  831. // summary = registerCheckSummaryEmpty != null ? registerCheckSummaryEmpty.Summary : "",
  832. // ocCheckTypeName = ocCheckTypeHaveEmpty != null ? ocCheckTypeHaveEmpty.DisplayName : "",
  833. // posionName = posionHaveEmpty != null ? posionHaveEmpty.DisplayName : "",
  834. // jobType = patientOccupationalDisease.JobType,
  835. // poisonWorkTime = patientOccupationalDisease.PoisonWorkTime,
  836. // occupationalAbnormal = patientOccupationalDisease.OccupationalAbnormal
  837. // });
  838. // if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))
  839. // {
  840. // if (customerOrgPara.DateType == '1')
  841. // {
  842. // asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  843. // m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  844. // }
  845. // else if (customerOrgPara.DateType == '2')
  846. // {
  847. // asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.MedicalStartDate != null && m.patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  848. // m.patientRegister.MedicalStartDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  849. // }
  850. // else if (customerOrgPara.DateType == '3')
  851. // {
  852. // asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  853. // m.patientRegister.SummaryDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  854. // }
  855. // }
  856. // if (customerOrgPara.CustomerOrgGroupId.Any())
  857. // {
  858. // asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));
  859. // }
  860. // var asbitemAbnormalList = asbitemAbnormalQuery.ToList();
  861. // var asbitemAbnormalCount = asbitemAbnormalList.Where(m => !m.summary.Contains("未见异常")).Select(s => s.asbitemName).Distinct().Count();
  862. // var medicalResultAbnormalRateDetails = asbitemAbnormalList.Where(m => !m.summary.Contains("未见异常")).GroupBy(g => g.asbitemName)
  863. // .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultAbnormalRateDetailDto
  864. // {
  865. // AbnormalPatientNames = string.Join("、", s.Select(ss => ss.patientRegister.PatientName).Distinct()),
  866. // AsbitemName = s.Key,
  867. // DisplayOrder = index + 1,
  868. // AbnormalRate = Decimal.Round(Convert.ToDecimal(s.Count() * 100) / asbitemAbnormalCount, 2)
  869. // }).ToList();
  870. // msg.MedicalResultAbnormalRateDetails = medicalResultAbnormalRateDetails;
  871. // #endregion
  872. // #region 职业健康检查缺项情况表明细 <已经开始检查了,但是未检查完的>
  873. // var listOfMissingItemsDetails = asbitemAbnormalList.Where(m => m.patientRegister.IsMedicalStart == 'Y' && m.registerCheckCompleteFlag == RegisterCheckCompleteFlag.UnChecked)
  874. // .GroupBy(g => g.patientRegister).OrderBy(o => o.FirstOrDefault().occupationalAbnormal)
  875. // .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportListOfMissingItemsDetailDto
  876. // {
  877. // DisplayOrder = index + 1,
  878. // IdNo = s.FirstOrDefault().idNo,
  879. // PatientName = s.Key.PatientName,
  880. // PatientRegisterNo = s.Key.PatientRegisterNo,
  881. // UnCheckAsbitemName = string.Join("、", s.Select(ss => ss.asbitemName)),
  882. // Age = s.Key.Age == null ? "" : s.Key.Age.ToString(),
  883. // JobType = s.FirstOrDefault().jobType,
  884. // MedicalStartDate = DataHelper.ConversionDateShortToString(s.Key.MedicalStartDate),
  885. // OcCheckTypeName = s.FirstOrDefault().ocCheckTypeName,
  886. // PoisonNames = string.Join(",", s.Where(m => !string.IsNullOrWhiteSpace(m.posionName)).Select(ss => ss.posionName).Distinct()),
  887. // PoisonWorkTime = s.FirstOrDefault().poisonWorkTime,
  888. // SexName = _cacheService.GetSexNameAsync(s.Key.SexId).GetAwaiter().GetResult(),
  889. // SummaryDoctorName = _cacheService.GetSurnameAsync(s.Key.AuditDoctorId).GetAwaiter().GetResult()
  890. // }).ToList();
  891. // msg.ListOfMissingItemsDetails = listOfMissingItemsDetails;
  892. // #endregion
  893. // #region 职业病未检人员一览表 <还没开始检查的>
  894. // //
  895. // var uninspectedPersonnelDetails = asbitemAbnormalList.Where(m => m.patientRegister.IsMedicalStart == 'N' && m.registerCheckCompleteFlag == RegisterCheckCompleteFlag.UnChecked)
  896. // .GroupBy(g => g.patientRegister).OrderBy(o => o.FirstOrDefault().occupationalAbnormal)
  897. // .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportUninspectedPersonnelDetailDto
  898. // {
  899. // DisplayOrder = index + 1,
  900. // IdNo = s.FirstOrDefault().idNo,
  901. // PatientName = s.Key.PatientName,
  902. // PatientRegisterNo = s.Key.PatientRegisterNo,
  903. // UnCheckAsbitemName = string.Join("、", s.Select(ss => ss.asbitemName)),
  904. // Age = s.Key.Age == null ? "" : s.Key.Age.ToString(),
  905. // JobType = s.FirstOrDefault().jobType,
  906. // MedicalStartDate = DataHelper.ConversionDateShortToString(s.Key.MedicalStartDate),
  907. // OcCheckTypeName = s.FirstOrDefault().ocCheckTypeName,
  908. // PoisonNames = string.Join(",", s.Where(m => !string.IsNullOrWhiteSpace(m.posionName)).Select(ss => ss.posionName).Distinct()),
  909. // PoisonWorkTime = s.FirstOrDefault().poisonWorkTime,
  910. // SexName = _cacheService.GetSexNameAsync(s.Key.SexId).GetAwaiter().GetResult(),
  911. // SummaryDoctorName = _cacheService.GetSurnameAsync(s.Key.AuditDoctorId).GetAwaiter().GetResult()
  912. // }).ToList();
  913. // msg.UninspectedPersonnelDetails = uninspectedPersonnelDetails;
  914. // #endregion
  915. // #region 职业病专科复查人员一览表明细
  916. // //复查结论ID
  917. // Guid reviewId = (await _occupationalAbnormalRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("复查"))).Id;
  918. // var patientRegisterAbnormalQuery = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  919. // join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id
  920. // join sumSummaryHeader in (await _sumSummaryHeaderRepository.GetQueryableAsync()).Include(x => x.SumSummaryContents) on patientRegister.Id equals sumSummaryHeader.PatientRegisterId into sumSummaryHeaderTemp
  921. // from sumSummaryHeaderHaveEmpty in sumSummaryHeaderTemp.DefaultIfEmpty()
  922. // //join sumSummaryContent in await _sumSummaryContentRepository.GetQueryableAsync() on sumSummaryHeaderHaveEmpty.Id equals sumSummaryContent.SumSummaryHeaderId into sumSummaryContentTemp
  923. // //from sumSummaryContentHaveEmpty in sumSummaryContentTemp.DefaultIfEmpty()
  924. // join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId
  925. // join patientPoison in await _patientPoisonRepository.GetQueryableAsync() on patientRegister.Id equals patientPoison.PatientRegisterId into patientPoisonTemp
  926. // from patientPoisonHaveEmpty in patientPoisonTemp.DefaultIfEmpty()
  927. // join poison in await _poisonRepository.GetQueryableAsync() on patientPoisonHaveEmpty.PoisonId equals poison.Id into poisonTemp
  928. // from poisonHaveEmpty in poisonTemp.DefaultIfEmpty()
  929. // where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId
  930. // && patientRegister.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration
  931. // select new
  932. // {
  933. // patientRegister,
  934. // poisonName = poisonHaveEmpty.DisplayName,
  935. // occupationalAbnormalId = patientPoisonHaveEmpty.OccupationalAbnormalId,
  936. // patientOccupationalDisease,
  937. // sumSummaryHeaderHaveEmpty,
  938. // //sumSummaryContentHaveEmpty,
  939. // idNo = patient.IdNo
  940. // });
  941. // if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))
  942. // {
  943. // if (customerOrgPara.DateType == '1')
  944. // {
  945. // patientRegisterAbnormalQuery = patientRegisterAbnormalQuery.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  946. // m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  947. // }
  948. // else if (customerOrgPara.DateType == '2')
  949. // {
  950. // patientRegisterAbnormalQuery = patientRegisterAbnormalQuery.Where(m => m.patientRegister.MedicalStartDate != null && m.patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  951. // m.patientRegister.MedicalStartDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  952. // }
  953. // else if (customerOrgPara.DateType == '3')
  954. // {
  955. // patientRegisterAbnormalQuery = patientRegisterAbnormalQuery.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  956. // m.patientRegister.SummaryDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  957. // }
  958. // }
  959. // if (customerOrgPara.CustomerOrgGroupId.Any())
  960. // {
  961. // patientRegisterAbnormalQuery = patientRegisterAbnormalQuery.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));
  962. // }
  963. // var patientRegisterAbnormalList = patientRegisterAbnormalQuery.ToList();
  964. // var reviewPersonnelDetails = patientRegisterAbnormalList.Where(m => m.occupationalAbnormalId == reviewId).GroupBy(g => g.patientRegister)
  965. // .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportReviewPersonnelDetailDto
  966. // {
  967. // IdNo = s.FirstOrDefault().idNo,
  968. // DisplayOrder = index + 1,
  969. // PatientName = s.Key.PatientName,
  970. // PatientRegisterNo = s.Key.PatientRegisterNo,
  971. // PoisonName = string.Join(",", s.Select(ss => ss.poisonName).Distinct()),
  972. // CheckResult = SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList()),
  973. // HandlingSuggestions = $"{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbnormal}\n{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbSuggestion}"
  974. // }).ToList();
  975. // msg.ReviewPersonnelDetails = reviewPersonnelDetails;
  976. // #endregion
  977. // #region 职业禁忌证人员一览表
  978. // //职业禁忌证结论ID
  979. // Guid contraindicationId = (await _occupationalAbnormalRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("禁忌"))).Id;
  980. // var occupationalContraindicationDetails = patientRegisterAbnormalList.Where(m => m.occupationalAbnormalId == contraindicationId).GroupBy(g => g.patientRegister)
  981. // .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportOccupationalContraindicationDetailDto
  982. // {
  983. // IdNo = s.FirstOrDefault().idNo,
  984. // DisplayOrder = index + 1,
  985. // PatientName = s.Key.PatientName,
  986. // PatientRegisterNo = s.Key.PatientRegisterNo,
  987. // PoisonName = string.Join(",", s.Select(ss => ss.poisonName).Distinct()),
  988. // CheckResult = SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList()),
  989. // HandlingSuggestions = $"{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbnormal}\n{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbSuggestion}"
  990. // }).ToList();
  991. // msg.OccupationalContraindicationDetails = occupationalContraindicationDetails;
  992. // #endregion
  993. // #region 疑似职业病人员一览表
  994. // //疑似职业病结论ID
  995. // Guid suspectedOccupationalDiseaseId = (await _occupationalAbnormalRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("疑似"))).Id;
  996. // var suspectedOccupationalDiseaseDetails = patientRegisterAbnormalList.Where(m => m.occupationalAbnormalId == suspectedOccupationalDiseaseId).GroupBy(g => g.patientRegister)
  997. // .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportSuspectedOccupationalDiseaseDetailDto
  998. // {
  999. // IdNo = s.FirstOrDefault().idNo,
  1000. // DisplayOrder = index + 1,
  1001. // PatientName = s.Key.PatientName,
  1002. // PatientRegisterNo = s.Key.PatientRegisterNo,
  1003. // PoisonName = string.Join(",", s.Select(ss => ss.poisonName).Distinct()),
  1004. // CheckResult = SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList()),
  1005. // HandlingSuggestions = $"{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbnormal}\n{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbSuggestion}"
  1006. // }).ToList();
  1007. // msg.SuspectedOccupationalDiseaseDetails = suspectedOccupationalDiseaseDetails;
  1008. // #endregion
  1009. // }
  1010. // return msg;
  1011. //}
  1012. /// <summary>
  1013. /// 获取单位职业病结果Excel数据
  1014. /// </summary>
  1015. /// <returns></returns>
  1016. [HttpPost("api/app/OccupationalDiseaseReport/GetCompanyOccupationalDiseaseDataExcel")]
  1017. public async Task<List<GetCompanyOccupationalDiseaseDataExcelDto>> GetCompanyOccupationalDiseaseDataExcelAsync(GetCompanyOccupationalDiseaseDetailReportInputDto input)
  1018. {
  1019. if (!input.CustomerOrgs.Any())
  1020. throw new UserFriendlyException("单位信息不能为空");
  1021. var customerOrgPara = input.CustomerOrgs.First();
  1022. if (customerOrgPara.CustomerOrgId == null || customerOrgPara.CustomerOrgId == Guid.Empty)
  1023. throw new UserFriendlyException("单位不能为空");
  1024. if (customerOrgPara.CustomerOrgRegisterId == null || customerOrgPara.CustomerOrgRegisterId == Guid.Empty)
  1025. throw new UserFriendlyException("单位体检次数不能为空");
  1026. #region 人员信息
  1027. var query = from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  1028. join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId
  1029. join patientPoison in await _patientPoisonRepository.GetQueryableAsync() on patientRegister.Id equals patientPoison.PatientRegisterId into patientPoisonTemp
  1030. from patientPoisonHaveEmpty in patientPoisonTemp.DefaultIfEmpty()
  1031. join poison in await _poisonRepository.GetQueryableAsync() on patientPoisonHaveEmpty.PoisonId equals poison.Id into poisonTemp
  1032. from posionHaveEmpty in poisonTemp.DefaultIfEmpty()
  1033. join occupationalAbnormal in await _occupationalAbnormalRepository.GetQueryableAsync() on patientPoisonHaveEmpty.OccupationalAbnormalId equals occupationalAbnormal.Id into occupationalAbnormalTemp
  1034. from occupationalAbnormalHaveEmpty in occupationalAbnormalTemp.DefaultIfEmpty()
  1035. join ocCheckType in await _ocCheckTypeRepository.GetQueryableAsync() on patientOccupationalDisease.OcCheckTypeId equals ocCheckType.Id into ocCheckTypeTemp
  1036. from ocCheckTypeHaveEmpty in ocCheckTypeTemp.DefaultIfEmpty()
  1037. join sumSummaryHeader in (await _sumSummaryHeaderRepository.GetQueryableAsync()).Include(x => x.SumSummaryContents) on patientRegister.Id equals sumSummaryHeader.PatientRegisterId into sumSummaryHeaderTemp
  1038. from sumSummaryHeaderHaveEmpty in sumSummaryHeaderTemp.DefaultIfEmpty()
  1039. where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId
  1040. && patientRegister.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration
  1041. select new
  1042. {
  1043. patientRegister,
  1044. patientOccupationalDisease,
  1045. posionHaveEmpty,
  1046. patientPoisonHaveEmpty,
  1047. occupationalAbnormalHaveEmpty,
  1048. ocCheckTypeHaveEmpty,
  1049. sumSummaryHeaderHaveEmpty
  1050. };
  1051. if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))
  1052. {
  1053. if (customerOrgPara.DateType == '1')
  1054. {
  1055. query = query.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  1056. m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  1057. }
  1058. else if (customerOrgPara.DateType == '2')
  1059. {
  1060. query = query.Where(m => m.patientRegister.MedicalStartDate != null && m.patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  1061. m.patientRegister.MedicalStartDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  1062. }
  1063. else if (customerOrgPara.DateType == '3')
  1064. {
  1065. query = query.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) &&
  1066. m.patientRegister.SummaryDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
  1067. }
  1068. }
  1069. List<Guid?> customerOrgIds = new List<Guid?>();
  1070. if (customerOrgPara.CustomerOrgId != null)
  1071. {
  1072. customerOrgIds = await _customerOrgManager.GetCustomerOrgChildrenId(customerOrgPara.CustomerOrgId.Value);
  1073. }
  1074. if (customerOrgIds.Any())
  1075. {
  1076. query = query.Where(m => customerOrgIds.Contains(m.patientRegister.CustomerOrgId));
  1077. }
  1078. if (customerOrgPara.CustomerOrgGroupId.Any())
  1079. {
  1080. query = query.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));
  1081. }
  1082. #endregion
  1083. var patientRegisterList = query.ToList();
  1084. var msg = new List<GetCompanyOccupationalDiseaseDataExcelDto>();
  1085. if (patientRegisterList.Any())
  1086. {
  1087. ////人员
  1088. //var patientRegisters = patientRegisterList.Select(m => m.patientRegister).Distinct().ToList();
  1089. //var patientRegisterfisrt = patientRegisterList.First();
  1090. #region 体检结果一览表
  1091. var medicalResultDetails = patientRegisterList.GroupBy(g => g.patientOccupationalDisease)
  1092. .Select((s, index) => new GetCompanyOccupationalDiseaseDataExcelDto
  1093. {
  1094. AnomalyIndex = $"{SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList())}",
  1095. MedicalConclusion = s.Key.OccupationalAbnormal,
  1096. OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty != null ? s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName : "",
  1097. HandlingSuggestions = s.Key.OccupationalAbSuggestion,
  1098. JobType = s.Key.JobType,
  1099. PatientName = s.FirstOrDefault().patientRegister.PatientName,
  1100. PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,
  1101. PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),
  1102. PoisonWorkTime = s.Key.PoisonWorkTime,
  1103. MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),
  1104. SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()
  1105. }).OrderBy(o => o.MedicalConclusion).ToList();
  1106. msg = medicalResultDetails;
  1107. #endregion
  1108. }
  1109. return msg;
  1110. }
  1111. /// <summary>
  1112. /// 生成历次综述医生小结
  1113. /// </summary>
  1114. /// <param name="SumSummaryHeaders"></param>
  1115. /// <returns></returns>
  1116. private string SetSumSummarys(List<SumSummaryHeader> SumSummaryHeaders)
  1117. {
  1118. StringBuilder msg = new StringBuilder();
  1119. if (SumSummaryHeaders.Count > 0)
  1120. {
  1121. foreach (var item in SumSummaryHeaders)
  1122. {
  1123. if (item != null)
  1124. {
  1125. msg.Append($"【{item.SummaryTitle}】\n");
  1126. if (item.SumSummaryContents.Count > 0)
  1127. {
  1128. var SumSummaryContents = item.SumSummaryContents.ToList();
  1129. foreach (var item2 in SumSummaryContents)
  1130. {
  1131. msg.Append($"{item2.SummaryContent}\n");
  1132. }
  1133. }
  1134. }
  1135. }
  1136. }
  1137. return msg.ToString();
  1138. }
  1139. }
  1140. }