diff --git a/src/Shentun.Peis.Application.Contracts/OccupationalDiseaseReports/GetCompanyOccupationalDiseaseSummaryReportDto.cs b/src/Shentun.Peis.Application.Contracts/OccupationalDiseaseReports/GetCompanyOccupationalDiseaseSummaryReportDto.cs new file mode 100644 index 0000000..89e6633 --- /dev/null +++ b/src/Shentun.Peis.Application.Contracts/OccupationalDiseaseReports/GetCompanyOccupationalDiseaseSummaryReportDto.cs @@ -0,0 +1,196 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml.Schema; + +namespace Shentun.Peis.OccupationalDiseaseReports +{ + public class GetCompanyOccupationalDiseaseSummaryReportDto + { + + + /// + /// 单位名称 + /// + public string CustomerOrgName { get; set; } + + /// + /// 证书编号 + /// + public string CertificateNo { get; set; } + + + /// + /// 体检类别 + /// + public string MedicalTypeName { get; set; } + + /// + /// 体检日期 年月日 + /// + public string MedicalStartDate { get; set; } + + /// + /// 备案号 + /// + public string RecordNumber { get; set; } + + /// + /// 体检中心名称 + /// + public string MedicalCenterName { get; set; } + + /// + /// 体检地点 + /// + public string MedicalCenterAddress { get; set; } + + + /// + /// 报告日期 年月日 + /// + public string ReportDate { get; set; } + + + /// + /// 体检总人数 + /// + public int MedicalSumCount { get; set; } + + /// + /// 离岗时人数 + /// + public int WhenLeavingWorkCount { get; set; } + + /// + /// 在岗期间人数 + /// + public int OnDutyCount { get; set; } + + /// + ///危害因素 A、B格式 + /// + public string PoisonNames { get; set; } + + + /// + ///部分结论 A、B格式 + /// + public string Conclusions { get; set; } + + /// + /// 工种 A、B格式 + /// + public string JobTypes { get; set; } + + ///// + ///// 疑似职业病人数 + ///// + //public int SuspectedOccupationalDiseaseCount { get; set; } + + ///// + ///// 疑似职业病比例 + ///// + //public decimal SuspectedOccupationalDiseaseRatio { get; set; } + + + ///// + ///// 职业禁忌症人数 + ///// + //public int OccupationalContraindicationsCount { get; set; } + + ///// + ///// 职业禁忌症比例 + ///// + //public decimal OccupationalContraindicationsRatio { get; set; } + + + ///// + ///// 复查人数 + ///// + //public int ReviewCount { get; set; } + + ///// + ///// 复查比例 + ///// + //public decimal ReviewRatio { get; set; } + + + ///// + ///// 其他疾病人数 + ///// + //public int OtherDiseasesCount { get; set; } + + ///// + ///// 其他疾病比例 + ///// + //public decimal OtherDiseasesRatio { get; set; } + + ///// + ///// 未见异常人数 + ///// + //public int NoAbnormalConditionsCount { get; set; } + + ///// + ///// 未见异常比例 + ///// + //public decimal NoAbnormalConditionsRatio { get; set; } + + /// + /// 结论 + /// + public List ConclusionDetails { get; set; } + + /// + /// 项目异常 + /// + public List AsbitemAbnormals { get; set; } + } + + public class GetCompanyOccupationalDiseaseSummaryReportAsbitemAbnormalDto + { + /// + /// 异常项目名称 + /// + public string AbnormalAsbitemName { get; set; } + + /// + /// 异常人数 + /// + public int AbnormalCount { get; set; } + + /// + /// 异常比例 + /// + public decimal AbnormalRatio { get; set; } + + /// + /// 排序值 + /// + public int DisplayOrder { get; set; } + } + + + public class GetCompanyOccupationalDiseaseSummaryReportConclusionDetailDto + { + /// + /// 异常项目名称 + /// + public string ConclusionName { get; set; } + + /// + /// 异常人数 + /// + public int ConclusionCount { get; set; } + + /// + /// 异常比例 + /// + public decimal ConclusionRatio { get; set; } + + /// + /// 排序值 + /// + public int DisplayOrder { get; set; } + } +} diff --git a/src/Shentun.Peis.Application.Contracts/OccupationalDiseaseReports/GetCompanyOccupationalDiseaseSummaryReportInputDto.cs b/src/Shentun.Peis.Application.Contracts/OccupationalDiseaseReports/GetCompanyOccupationalDiseaseSummaryReportInputDto.cs new file mode 100644 index 0000000..1c32ca9 --- /dev/null +++ b/src/Shentun.Peis.Application.Contracts/OccupationalDiseaseReports/GetCompanyOccupationalDiseaseSummaryReportInputDto.cs @@ -0,0 +1,12 @@ +using Shentun.Peis.PeisReports; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Shentun.Peis.OccupationalDiseaseReports +{ + public class GetCompanyOccupationalDiseaseSummaryReportInputDto + { + public List CustomerOrgs { get; set; } = new List() { }; + } +} diff --git a/src/Shentun.Peis.Application/OccupationalDiseaseReports/OccupationalDiseaseReportAppService.cs b/src/Shentun.Peis.Application/OccupationalDiseaseReports/OccupationalDiseaseReportAppService.cs new file mode 100644 index 0000000..c3edb09 --- /dev/null +++ b/src/Shentun.Peis.Application/OccupationalDiseaseReports/OccupationalDiseaseReportAppService.cs @@ -0,0 +1,242 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Shentun.Peis.Enums; +using Shentun.Peis.Models; +using Shentun.Peis.SysParmValues; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Identity; + +namespace Shentun.Peis.OccupationalDiseaseReports +{ + [ApiExplorerSettings(GroupName = "Work")] + [Authorize] + public class OccupationalDiseaseReportAppService : ApplicationService + { + + private readonly IRepository _patientRegisterRepository; + private readonly IRepository _registerCheckRepository; + private readonly IRepository _registerCheckAsbitemRepository; + private readonly IRepository _asbitemRepository; + private readonly IRepository _patientOccupationalDiseaseRepository; + private readonly SysParmValueManager _sysParmValueManager; + private readonly CacheService _cacheService; + private readonly IRepository _organizationUnitRepository; + private readonly IRepository _ocCheckTypeRepository; + private readonly IRepository _patientPoisonRepository; + private readonly IRepository _occupationalAbnormalRepository; + private readonly IRepository _poisonRepository; + private readonly IRepository _registerCheckSummaryRepository; + + public OccupationalDiseaseReportAppService( + IRepository patientRegisterRepository, + IRepository registerCheckRepository, + IRepository registerCheckAsbitemRepository, + IRepository asbitemRepository, + IRepository patientOccupationalDiseaseRepository, + SysParmValueManager sysParmValueManager, + CacheService cacheService, + IRepository organizationUnitRepository, + IRepository ocCheckTypeRepository, + IRepository patientPoisonRepository, + IRepository occupationalAbnormalRepository, + IRepository poisonRepository, + IRepository registerCheckSummaryRepository) + { + _patientRegisterRepository = patientRegisterRepository; + _registerCheckRepository = registerCheckRepository; + _registerCheckAsbitemRepository = registerCheckAsbitemRepository; + _asbitemRepository = asbitemRepository; + _patientOccupationalDiseaseRepository = patientOccupationalDiseaseRepository; + _sysParmValueManager = sysParmValueManager; + _cacheService = cacheService; + _organizationUnitRepository = organizationUnitRepository; + _ocCheckTypeRepository = ocCheckTypeRepository; + _patientPoisonRepository = patientPoisonRepository; + _occupationalAbnormalRepository = occupationalAbnormalRepository; + _poisonRepository = poisonRepository; + _registerCheckSummaryRepository = registerCheckSummaryRepository; + } + + + /// + /// 获取单位职业病总结报告 + /// + /// + [HttpPost("api/app/OccupationalDiseaseReport/GetCompanyOccupationalDiseaseSummaryReport")] + public async Task GetCompanyOccupationalDiseaseSummaryReportAsync(GetCompanyOccupationalDiseaseSummaryReportInputDto input) + { + + if (!input.CustomerOrgs.Any()) + throw new UserFriendlyException("单位信息不能为空"); + + var customerOrgPara = input.CustomerOrgs.First(); + if (customerOrgPara.CustomerOrgId == null || customerOrgPara.CustomerOrgId == Guid.Empty) + throw new UserFriendlyException("单位不能为空"); + if (customerOrgPara.CustomerOrgRegisterId == null || customerOrgPara.CustomerOrgRegisterId == Guid.Empty) + throw new UserFriendlyException("单位体检次数不能为空"); + + #region 人员信息 + var query = from patientRegister in await _patientRegisterRepository.GetQueryableAsync() + join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId + join patientPoison in await _patientPoisonRepository.GetQueryableAsync() on patientRegister.Id equals patientPoison.PatientRegisterId into patientPoisonTemp + from patientPoisonHaveEmpty in patientPoisonTemp.DefaultIfEmpty() + join poison in await _poisonRepository.GetQueryableAsync() on patientPoisonHaveEmpty.PoisonId equals poison.Id into poisonTemp + from posionHaveEmpty in poisonTemp.DefaultIfEmpty() + join occupationalAbnormal in await _occupationalAbnormalRepository.GetQueryableAsync() on patientPoisonHaveEmpty.OccupationalAbnormalId equals occupationalAbnormal.Id into occupationalAbnormalTemp + from occupationalAbnormalHaveEmpty in occupationalAbnormalTemp.DefaultIfEmpty() + where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId + && patientRegister.CompleteFlag == PatientRegisterCompleteFlag.SumCheck + select new + { + patientRegister, + patientOccupationalDisease, + posionHaveEmpty, + patientPoisonHaveEmpty, + occupationalAbnormalHaveEmpty + }; + + + if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate)) + { + if (customerOrgPara.DateType == '1') + { + query = query.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) && + m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1)); + } + else if (customerOrgPara.DateType == '2') + { + query = query.Where(m => m.patientRegister.MedicalStartDate != null && m.patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) && + m.patientRegister.MedicalStartDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1)); + } + else if (customerOrgPara.DateType == '3') + { + query = query.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate.Value >= Convert.ToDateTime(customerOrgPara.StartDate) && + m.patientRegister.SummaryDate.Value < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1)); + } + } + + + if (customerOrgPara.CustomerOrgGroupId.Any()) + { + query = query.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value)); + } + + #endregion + + + var patientRegisterList = query.ToList(); + + var msg = new GetCompanyOccupationalDiseaseSummaryReportDto + { + AsbitemAbnormals = new List(), + ConclusionDetails = new List(), + }; + + + if (patientRegisterList.Any()) + { + + //人员id + var patientRegisters = query.Select(m => m.patientRegister).Distinct().ToList(); + + var patientRegisterfisrt = query.First(); + + //在岗ID + Guid onDutyId = (await _ocCheckTypeRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("在岗"))).Id; + //离岗时ID + Guid whenLeavingWorkId = (await _ocCheckTypeRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("离岗时"))).Id; + + //未见异常ID + Guid noAbnormalId = (await _occupationalAbnormalRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("未见异常"))).Id; + + + msg.CertificateNo = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_qualification_certificate_number"); + msg.MedicalTypeName = await _cacheService.GetMedicalTypeNameAsync(patientRegisterfisrt.patientRegister.MedicalTypeId); + msg.CustomerOrgName = await _cacheService.GetTopCustomerOrgNameAsync(patientRegisterfisrt.patientRegister.CustomerOrgId); + msg.MedicalCenterAddress = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_address"); + msg.MedicalCenterName = (await _organizationUnitRepository.GetAsync(patientRegisterfisrt.patientRegister.MedicalCenterId)).DisplayName; + msg.MedicalStartDate = Convert.ToDateTime(customerOrgPara.StartDate).ToString("yyyy年MM月dd日"); + msg.MedicalSumCount = patientRegisters.Count; + msg.RecordNumber = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_record_number"); + msg.ReportDate = DateTime.Now.ToString("yyyy年MM月dd日"); + msg.OnDutyCount = patientRegisterList.Where(m => m.patientOccupationalDisease.OcCheckTypeId == onDutyId).Count(); + msg.WhenLeavingWorkCount = patientRegisterList.Where(m => m.patientOccupationalDisease.OcCheckTypeId == whenLeavingWorkId).Count(); + msg.PoisonNames = string.Join('、', patientRegisterList.Where(m => m.patientOccupationalDisease.OcCheckTypeId == onDutyId + || m.patientOccupationalDisease.OcCheckTypeId == whenLeavingWorkId).Select(s => s.posionHaveEmpty.DisplayName).Distinct()); + + //有结论的数据 + var conclusionList = patientRegisterList.Where(m => (m.patientOccupationalDisease.OcCheckTypeId == onDutyId + || m.patientOccupationalDisease.OcCheckTypeId == whenLeavingWorkId) + && (m.patientPoisonHaveEmpty.OccupationalAbnormalId != null || m.patientPoisonHaveEmpty.OccupationalAbnormalId != noAbnormalId)); + + msg.Conclusions = string.Join('、', conclusionList.Select(s => s.occupationalAbnormalHaveEmpty.DisplayName).Distinct()); + msg.JobTypes = string.Join('、', conclusionList.Select(s => s.patientOccupationalDisease.JobType).Distinct()); + + #region 检查结果 + + //目标疾病检出情况 + List conclusionDetails = new List(); + + var occupationalAbnormalList = (await _occupationalAbnormalRepository.GetListAsync()).OrderBy(o => o.DisplayOrder); + foreach (var item in occupationalAbnormalList) + { + var conclusionCount = patientRegisterList.Where(m => m.patientPoisonHaveEmpty.OccupationalAbnormalId == item.Id).Select(s => s.patientRegister.Id).Distinct().Count(); + var conclusionRatio = Convert.ToDecimal(conclusionCount * 100) / patientRegisters.Count; + var conclusionDetail = new GetCompanyOccupationalDiseaseSummaryReportConclusionDetailDto + { + ConclusionName = item.DisplayName, + DisplayOrder = item.DisplayOrder, + ConclusionCount = conclusionCount, + ConclusionRatio = conclusionRatio + }; + + conclusionDetails.Add(conclusionDetail); + } + + msg.ConclusionDetails = conclusionDetails; + + //相关检查情况 + + + var asbitemAbnormalList = (from patientRegister in patientRegisters + join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId + join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId + join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id into asbitemTemp + from asbitemHaveEmpty in asbitemTemp.DefaultIfEmpty() + join registerCheckSummary in await _registerCheckSummaryRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckSummary.RegisterCheckId + where !registerCheckSummary.Summary.Contains("未见异常") + select new + { + asbitemName = asbitemHaveEmpty.DisplayName, + patientRegisterId = patientRegister.Id + }).ToList(); + + //异常总人数 + var abnormalSumCount = asbitemAbnormalList.Select(s => s.patientRegisterId).Distinct().Count(); + + + var asbitemAbnormals = asbitemAbnormalList.GroupBy(g => g.asbitemName).Select((s, index) => new GetCompanyOccupationalDiseaseSummaryReportAsbitemAbnormalDto + { + AbnormalAsbitemName = s.Key, + AbnormalCount = s.Count(), + AbnormalRatio = Convert.ToDecimal(s.Count() * 100) / abnormalSumCount, + DisplayOrder = index + 1 + }).ToList(); + + + msg.AsbitemAbnormals = asbitemAbnormals; + #endregion + + } + + return msg; + } + } +} diff --git a/src/Shentun.Peis.Application/QueueRegisters/QueueRegisterAppService.cs b/src/Shentun.Peis.Application/QueueRegisters/QueueRegisterAppService.cs index 00240ec..4be045c 100644 --- a/src/Shentun.Peis.Application/QueueRegisters/QueueRegisterAppService.cs +++ b/src/Shentun.Peis.Application/QueueRegisters/QueueRegisterAppService.cs @@ -156,7 +156,7 @@ namespace Shentun.Peis.QueueRegisters join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id join itemType in await _itemTypeRepository.GetQueryableAsync() on asbitem.ItemTypeId equals itemType.Id into itemTypeTemp from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty() - where patientRegister.Id == input.PatientRegisterId + where patientRegister.Id == input.PatientRegisterId && asbitem.IsCheck == 'Y' orderby itemTypeHaveEmpty.DisplayOrder, asbitem.DisplayOrder ascending select new NotTriageAsbitemListDto { @@ -202,6 +202,7 @@ namespace Shentun.Peis.QueueRegisters from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty() where queueRegister.PatientRegisterId == input.PatientRegisterId && asbitemIds.Contains(roomDetail.AsbitemId) + && asbitem.IsCheck == 'Y' orderby queueRegister.CreationTime descending select new YesTriageAsbitemListDto { @@ -349,7 +350,8 @@ namespace Shentun.Peis.QueueRegisters queueRegisterNumber = queueRegister.DisplayOrder, patientRegisterId = queueRegister.PatientRegisterId, roomId = queueRegister.RoomId, - asbitemId = roomDetail.AsbitemId + asbitemId = roomDetail.AsbitemId, + lastModificationTime = queueRegister.LastModificationTime, }; if (input.ItemTypeIds.Any()) @@ -384,10 +386,11 @@ namespace Shentun.Peis.QueueRegisters isVip = s.FirstOrDefault().isVip, queueRegisterId = s.Key, queueRegisterNumber = s.FirstOrDefault().queueRegisterNumber, + lastModificationTime = s.FirstOrDefault().lastModificationTime }).ToList(); - entDto.WaitDetail = roomGroup.Where(m => m.completeFlag == QueueRegisterCompleteFlag.Wait) + entDto.WaitDetail = roomGroup.Where(m => m.completeFlag == QueueRegisterCompleteFlag.Wait).OrderBy(o => o.queueRegisterNumber) .Select(s => new GetQueueRegisterListByRoomIdDetailDto { IsVip = s.isVip, @@ -396,7 +399,7 @@ namespace Shentun.Peis.QueueRegisters QueueRegisterNumber = s.queueRegisterNumber }).ToList(); - entDto.AlreadyCalledDetail = roomGroup.Where(m => m.completeFlag == QueueRegisterCompleteFlag.AlreadyCalled) + entDto.AlreadyCalledDetail = roomGroup.Where(m => m.completeFlag == QueueRegisterCompleteFlag.AlreadyCalled).OrderByDescending(o => o.lastModificationTime) .Select(s => new GetQueueRegisterListByRoomIdDetailDto { IsVip = s.isVip, @@ -405,7 +408,7 @@ namespace Shentun.Peis.QueueRegisters QueueRegisterNumber = s.queueRegisterNumber }).ToList(); - entDto.OverNumberDetail = roomGroup.Where(m => m.completeFlag == QueueRegisterCompleteFlag.OverNumber) + entDto.OverNumberDetail = roomGroup.Where(m => m.completeFlag == QueueRegisterCompleteFlag.OverNumber).OrderByDescending(o => o.lastModificationTime) .Select(s => new GetQueueRegisterListByRoomIdDetailDto { IsVip = s.isVip, @@ -486,5 +489,46 @@ namespace Shentun.Peis.QueueRegisters }; return entDto; } + + + /// + /// 小程序获取当前排队信息 + /// + /// + /// + [HttpPost("api/app/QueueRegister/GetAppQueueRegisterByIdNo")] + public async Task GetAppQueueRegisterByIdNoAsync(IdNoInputDto input) + { + var msg = new GetAppQueueRegisterByIdNoDto(); + var patientRegisterEnt = (await _patientRegisterRepository.GetQueryableAsync()).Include(x => x.Patient) + .Where(m => m.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration + && m.CompleteFlag != PatientRegisterCompleteFlag.SumCheck + && m.Patient.IdNo == input.IdNo).OrderByDescending(o => o.MedicalStartDate).FirstOrDefault(); + + if (patientRegisterEnt == null) + throw new UserFriendlyException("无人员登记记录或已总检"); + //if (patientRegisterEnt.CompleteFlag == PatientRegisterCompleteFlag.PreRegistration) + // throw new UserFriendlyException("当前人员未正式登记"); + //if (patientRegisterEnt.CompleteFlag == PatientRegisterCompleteFlag.PreRegistration) + // throw new UserFriendlyException("当前人员已总检"); + + msg.PatientRegisterNo = patientRegisterEnt.PatientRegisterNo; + msg.MobileTelephone = patientRegisterEnt.Patient.MobileTelephone; + msg.IdNo = patientRegisterEnt.Patient.IdNo; + msg.MaritalStatusName = await _cacheService.GetMaritalStatusNameAsync(patientRegisterEnt.MaritalStatusId); + msg.PatientName = patientRegisterEnt.PatientName; + msg.Photo = patientRegisterEnt.Photo; + msg.SexName = await _cacheService.GetSexNameAsync(patientRegisterEnt.SexId); + + var queueRegisterInfo = await GetQueueRegisterByPatientRegisterIdAsync(new PatientRegisterIdInputDto { PatientRegisterId = patientRegisterEnt.Id }); + if (queueRegisterInfo != null) + { + msg.QueueCount = queueRegisterInfo.QueueCount; + msg.RoomName = queueRegisterInfo.RoomName; + msg.CompleteFlag = queueRegisterInfo.CompleteFlag; + } + + return msg; + } } }