| 
						 | 
						using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Mvc;using Microsoft.EntityFrameworkCore;using NPOI.SS.Formula.Functions;using NPOI.Util;using Shentun.Peis.CustomerOrgs;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<PatientRegister, Guid> _patientRegisterRepository;        private readonly IRepository<Patient, Guid> _patientRepository;        private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;        private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;        private readonly IRepository<Asbitem, Guid> _asbitemRepository;        private readonly IRepository<PatientOccupationalDisease, Guid> _patientOccupationalDiseaseRepository;        private readonly SysParmValueManager _sysParmValueManager;        private readonly CacheService _cacheService;        private readonly IRepository<OrganizationUnit, Guid> _organizationUnitRepository;        private readonly IRepository<OcCheckType, Guid> _ocCheckTypeRepository;        private readonly IRepository<PatientPoison> _patientPoisonRepository;        private readonly IRepository<OccupationalAbnormal, Guid> _occupationalAbnormalRepository;        private readonly IRepository<Poison, Guid> _poisonRepository;        private readonly IRepository<RegisterCheckSummary, Guid> _registerCheckSummaryRepository;        private readonly IRepository<SumSummaryHeader, Guid> _sumSummaryHeaderRepository;        private readonly IRepository<SumSummaryContent, Guid> _sumSummaryContentRepository;        private readonly CustomerOrgManager _customerOrgManager;        public OccupationalDiseaseReportAppService(            IRepository<PatientRegister, Guid> patientRegisterRepository,            IRepository<RegisterCheck, Guid> registerCheckRepository,            IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,            IRepository<Asbitem, Guid> asbitemRepository,            IRepository<PatientOccupationalDisease, Guid> patientOccupationalDiseaseRepository,            SysParmValueManager sysParmValueManager,            CacheService cacheService,            IRepository<OrganizationUnit, Guid> organizationUnitRepository,            IRepository<OcCheckType, Guid> ocCheckTypeRepository,            IRepository<PatientPoison> patientPoisonRepository,            IRepository<OccupationalAbnormal, Guid> occupationalAbnormalRepository,            IRepository<Poison, Guid> poisonRepository,            IRepository<RegisterCheckSummary, Guid> registerCheckSummaryRepository,            IRepository<Patient, Guid> patientRepository,            IRepository<SumSummaryHeader, Guid> sumSummaryHeaderRepository,            IRepository<SumSummaryContent, Guid> sumSummaryContentRepository,            CustomerOrgManager customerOrgManager)        {            _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;            _patientRepository = patientRepository;            _sumSummaryHeaderRepository = sumSummaryHeaderRepository;            _sumSummaryContentRepository = sumSummaryContentRepository;            _customerOrgManager = customerOrgManager;        }
        /// <summary>
        /// 获取单位职业病总结报告
        /// </summary>
        /// <returns></returns>
        [HttpPost("api/app/OccupationalDiseaseReport/GetCompanyOccupationalDiseaseSummaryReport")]        public async Task<GetCompanyOccupationalDiseaseSummaryReportDto> 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));                }            }
            List<Guid?> customerOrgIds = new List<Guid?>();
            if (customerOrgPara.CustomerOrgId != null)            {                customerOrgIds = await _customerOrgManager.GetCustomerOrgChildrenId(customerOrgPara.CustomerOrgId.Value);            }
            if (customerOrgIds.Any())            {                query = query.Where(m => customerOrgIds.Contains(m.patientRegister.CustomerOrgId));            }
            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<GetCompanyOccupationalDiseaseSummaryReportAsbitemAbnormalDto>(),                ConclusionDetails = new List<GetCompanyOccupationalDiseaseSummaryReportConclusionDetailDto>(),            };
            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).GroupBy(g => g.patientRegister).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<GetCompanyOccupationalDiseaseSummaryReportConclusionDetailDto> conclusionDetails = new List<GetCompanyOccupationalDiseaseSummaryReportConclusionDetailDto>();
                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 = Decimal.Round(Convert.ToDecimal(conclusionCount * 100) / patientRegisters.Count, 2);                    var conclusionDetail = new GetCompanyOccupationalDiseaseSummaryReportConclusionDetailDto                    {                        ConclusionName = item.DisplayName,                        DisplayOrder = item.DisplayOrder,                        ConclusionCount = conclusionCount,                        ConclusionRatio = conclusionRatio                    };
                    conclusionDetails.Add(conclusionDetail);                }
                msg.ConclusionDetails = conclusionDetails;
                //相关检查情况
                var asbitemAbnormalQuery = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()                                            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                                            join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId                                            where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId                                            && !registerCheckSummary.Summary.Contains("未见异常")                                            && patientRegister.CompleteFlag == PatientRegisterCompleteFlag.SumCheck                                            select new                                            {                                                patientRegister,                                                asbitemName = asbitemHaveEmpty.DisplayName                                            });
                if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))                {                    if (customerOrgPara.DateType == '1')                    {                        asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&                     m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));                    }                    else if (customerOrgPara.DateType == '2')                    {                        asbitemAbnormalQuery = asbitemAbnormalQuery.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')                    {                        asbitemAbnormalQuery = asbitemAbnormalQuery.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())                {                    asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));                }
                var asbitemAbnormalList = asbitemAbnormalQuery.ToList();
                //异常总人数
                var abnormalSumCount = asbitemAbnormalList.Select(s => s.patientRegister.Id).Distinct().Count();
                var asbitemAbnormals = asbitemAbnormalList.GroupBy(g => g.asbitemName).Select((s, index) => new GetCompanyOccupationalDiseaseSummaryReportAsbitemAbnormalDto                {                    AbnormalAsbitemName = s.Key,                    AbnormalCount = s.Select(ss => ss.patientRegister.Id).Distinct().Count(),                    AbnormalRatio = Decimal.Round(Convert.ToDecimal(s.Select(ss => ss.patientRegister.Id).Distinct().Count() * 100) / abnormalSumCount, 2),                    DisplayOrder = index + 1                }).ToList();
                msg.AsbitemAbnormals = asbitemAbnormals;                #endregion
            }
            return msg;        }
        /// <summary>
        /// 获取单位职业病明细报告
        /// </summary>
        /// <returns></returns>
        [HttpPost("api/app/OccupationalDiseaseReport/GetCompanyOccupationalDiseaseDetailReport")]        public async Task<GetCompanyOccupationalDiseaseDetailReportDto> GetCompanyOccupationalDiseaseDetailReportAsync(GetCompanyOccupationalDiseaseDetailReportInputDto 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 patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id                        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 ocCheckType in await _ocCheckTypeRepository.GetQueryableAsync() on patientOccupationalDisease.OcCheckTypeId equals ocCheckType.Id into ocCheckTypeTemp                        from ocCheckTypeHaveEmpty in ocCheckTypeTemp.DefaultIfEmpty()                        where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId                        select new                        {                            patientRegister,                            patient,                            patientOccupationalDisease,                            posionHaveEmpty,                            patientPoisonHaveEmpty,                            ocCheckTypeHaveEmpty                        };
            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));                }            }
            List<Guid?> customerOrgIds = new List<Guid?>();
            if (customerOrgPara.CustomerOrgId != null)            {                customerOrgIds = await _customerOrgManager.GetCustomerOrgChildrenId(customerOrgPara.CustomerOrgId.Value);            }
            if (customerOrgIds.Any())            {                query = query.Where(m => customerOrgIds.Contains(m.patientRegister.CustomerOrgId));            }
            if (customerOrgPara.CustomerOrgGroupId.Any())            {                query = query.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));            }
            #endregion
            //var ddd = query.ToQueryString();
            //var noCheckPatientRegisterList = query.ToList();
            //var sumCount = noCheckPatientRegisterList.GroupBy(g => g.patientRegister).Count();  //总人数
            //query = query.Where(m => m.patientRegister.CompleteFlag == PatientRegisterCompleteFlag.SumCheck);
            var patientRegisterList = query.ToList();            var sumCount = patientRegisterList.GroupBy(g => g.patientRegister).Count();  //总人数
            var msg = new GetCompanyOccupationalDiseaseDetailReportDto();
            if (patientRegisterList.Any())            {
                //人员
                //var patientRegisters = patientRegisterList.Select(m => m.patientRegister).Distinct().ToList();
                var patientRegisterfisrt = patientRegisterList.First();
                msg.CertificateNo = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_qualification_certificate_number");                msg.CustomerOrgName = await _cacheService.GetTopCustomerOrgNameAsync(patientRegisterfisrt.patientRegister.CustomerOrgId);                msg.MedicalCenterName = (await _organizationUnitRepository.GetAsync(patientRegisterfisrt.patientRegister.MedicalCenterId)).DisplayName;                msg.MedicalStartDate = Convert.ToDateTime(customerOrgPara.StartDate).ToString("yyyy年MM月dd日");                msg.RecordNumber = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_record_number");                msg.ReportDate = DateTime.Now.ToString("yyyy年MM月dd日");
                msg.OcCheckTypeNames = (await _ocCheckTypeRepository.GetListAsync()).Select(s => new GetCompanyOccupationalDiseaseDetailReportOcCheckTypeDetailDto                {                    OcCheckTypeName = s.DisplayName,                    IsSelected = false                }).ToList();
                #region 检查情况报告列表
                var ocCheckTypeDetails = patientRegisterList.GroupBy(g => new { g.patientRegister, g.patientOccupationalDisease.OcCheckTypeId })                    .Select(s => new                    {                        posionNames = string.Join("、", s.Where(m => m.posionHaveEmpty != null)                        .OrderBy(o => o.posionHaveEmpty.DisplayOrder).Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),                        ocCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty != null ? s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName : "",                    }).ToList()                    .GroupBy(g => new { g.ocCheckTypeName, g.posionNames })                    .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportOcCheckTypeSummaryDto                    {                        DisplayOrder = index + 1,                        OcCheckTypeName = s.Key.ocCheckTypeName,                        CheckCount = s.Count(),                        PoisonNames = s.Key.posionNames                    }).ToList();
                msg.OcCheckTypeDetails = ocCheckTypeDetails;
                #endregion
                #region 选中检查类别
                foreach (var item in msg.OcCheckTypeNames)                {                    var isSelected = ocCheckTypeDetails.Count(f => f.OcCheckTypeName == item.OcCheckTypeName) > 0 ? true : false;                    item.IsSelected = isSelected;                }                #endregion
                #region 未见异常人员一览表
                var noAbnormalConditionsDetails = patientRegisterList.Where(m => !string.IsNullOrWhiteSpace(m.patientOccupationalDisease.OccupationalAbnormal)                && m.patientOccupationalDisease.OccupationalAbnormal.Contains("未见异常"))                    .GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)                    .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto                    {                        DisplayOrder = index + 1,                        HandlingSuggestions = s.Key.OccupationalAbSuggestion,                        JobType = s.Key.JobType,                        PatientName = s.FirstOrDefault().patientRegister.PatientName,                        PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,                        PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),                        PoisonWorkTime = s.Key.PoisonWorkTime,                        MedicalConclusion = s.Key.OccupationalAbnormal,                        OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,                        Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),                        IdNo = s.FirstOrDefault().patient.IdNo,                        SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),                        MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),                        SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()                    }).ToList();                msg.NoAbnormalConditionsDetails = noAbnormalConditionsDetails;                #endregion
                #region 其他疾病或异常人员一览表
                var otherDiseasesOrAbnormalIndividualsDetails = patientRegisterList.Where(m => !string.IsNullOrWhiteSpace(m.patientOccupationalDisease.OccupationalAbnormal)              && m.patientOccupationalDisease.OccupationalAbnormal.Contains("其他疾病或异常"))                  .GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)                  .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto                  {                      DisplayOrder = index + 1,                      HandlingSuggestions = s.Key.OccupationalAbSuggestion,                      JobType = s.Key.JobType,                      PatientName = s.FirstOrDefault().patientRegister.PatientName,                      PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,                      PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),                      PoisonWorkTime = s.Key.PoisonWorkTime,                      MedicalConclusion = s.Key.OccupationalAbnormal,                      OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,                      Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),                      IdNo = s.FirstOrDefault().patient.IdNo,                      SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),                      MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),                      SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()                  }).ToList();                msg.OtherDiseasesOrAbnormalIndividualsDetails = otherDiseasesOrAbnormalIndividualsDetails;
                #endregion
                #region 复查人员一览表
                var reviewPersonnelDetails = patientRegisterList.Where(m => !string.IsNullOrWhiteSpace(m.patientOccupationalDisease.OccupationalAbnormal)            && m.patientOccupationalDisease.OccupationalAbnormal.Contains("复查"))                .GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)                .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto                {                    DisplayOrder = index + 1,                    HandlingSuggestions = s.Key.OccupationalAbSuggestion,                    JobType = s.Key.JobType,                    PatientName = s.FirstOrDefault().patientRegister.PatientName,                    PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,                    PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),                    PoisonWorkTime = s.Key.PoisonWorkTime,                    MedicalConclusion = s.Key.OccupationalAbnormal,                    OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,                    Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),                    IdNo = s.FirstOrDefault().patient.IdNo,                    SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),                    MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),                    SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()                }).ToList();                msg.ReviewPersonnelDetails = reviewPersonnelDetails;
                #endregion
                #region 职业禁忌证人员一览表
                var occupationalContraindicationDetails = patientRegisterList.Where(m => !string.IsNullOrWhiteSpace(m.patientOccupationalDisease.OccupationalAbnormal)           && m.patientOccupationalDisease.OccupationalAbnormal.Contains("职业禁忌证"))               .GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)               .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto               {                   DisplayOrder = index + 1,                   HandlingSuggestions = s.Key.OccupationalAbSuggestion,                   JobType = s.Key.JobType,                   PatientName = s.FirstOrDefault().patientRegister.PatientName,                   PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,                   PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),                   PoisonWorkTime = s.Key.PoisonWorkTime,                   MedicalConclusion = s.Key.OccupationalAbnormal,                   OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,                   Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),                   IdNo = s.FirstOrDefault().patient.IdNo,                   SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),                   MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),                   SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()               }).ToList();                msg.OccupationalContraindicationDetails = occupationalContraindicationDetails;
                #endregion
                #region 疑似职业病人员一览表
                var suspectedOccupationalDiseaseDetails = patientRegisterList.Where(m => !string.IsNullOrWhiteSpace(m.patientOccupationalDisease.OccupationalAbnormal)         && m.patientOccupationalDisease.OccupationalAbnormal.Contains("疑似职业病"))             .GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)             .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto             {                 DisplayOrder = index + 1,                 HandlingSuggestions = s.Key.OccupationalAbSuggestion,                 JobType = s.Key.JobType,                 PatientName = s.FirstOrDefault().patientRegister.PatientName,                 PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,                 PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),                 PoisonWorkTime = s.Key.PoisonWorkTime,                 MedicalConclusion = s.Key.OccupationalAbnormal,                 OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,                 Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),                 IdNo = s.FirstOrDefault().patient.IdNo,                 SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),                 MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),                 SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()             }).ToList();                msg.SuspectedOccupationalDiseaseDetails = suspectedOccupationalDiseaseDetails;
                #endregion
                #region 体检结果异常率明细
                var asbitemAbnormalQuery = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()                                            join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id                                            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 into registerCheckSummaryTemp                                            from registerCheckSummaryEmpty in registerCheckSummaryTemp.DefaultIfEmpty()                                            join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId                                            join ocCheckType in await _ocCheckTypeRepository.GetQueryableAsync() on patientOccupationalDisease.OcCheckTypeId equals ocCheckType.Id into ocCheckTypeTemp                                            from ocCheckTypeHaveEmpty in ocCheckTypeTemp.DefaultIfEmpty()                                            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()                                            where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId                                            // && !registerCheckSummaryEmpty.Summary.Contains("未见异常")
                                            // && patientRegister.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration
                                            && asbitemHaveEmpty.IsCheck == 'Y'                                            select new                                            {                                                patientRegister,                                                asbitemName = asbitemHaveEmpty.DisplayName,                                                registerCheckCompleteFlag = registerCheck.CompleteFlag,                                                idNo = patient.IdNo,                                                summary = registerCheckSummaryEmpty != null ? registerCheckSummaryEmpty.Summary : "",                                                ocCheckTypeName = ocCheckTypeHaveEmpty != null ? ocCheckTypeHaveEmpty.DisplayName : "",                                                posionName = posionHaveEmpty != null ? posionHaveEmpty.DisplayName : "",                                                jobType = patientOccupationalDisease.JobType,                                                poisonWorkTime = patientOccupationalDisease.PoisonWorkTime,                                                occupationalAbnormal = patientOccupationalDisease.OccupationalAbnormal                                            });
                if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))                {                    if (customerOrgPara.DateType == '1')                    {                        asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&                     m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));                    }                    else if (customerOrgPara.DateType == '2')                    {                        asbitemAbnormalQuery = asbitemAbnormalQuery.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')                    {                        asbitemAbnormalQuery = asbitemAbnormalQuery.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 (customerOrgIds.Any())                {                    asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => customerOrgIds.Contains(m.patientRegister.CustomerOrgId));                }
                if (customerOrgPara.CustomerOrgGroupId.Any())                {                    asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));                }
                var asbitemAbnormalList = asbitemAbnormalQuery.ToList();
                var asbitemAbnormalCount = asbitemAbnormalList.Where(m => !m.summary.Contains("未见异常")).Select(s => s.asbitemName).Distinct().Count();
                var medicalResultAbnormalRateDetails = asbitemAbnormalList.Where(m => !m.summary.Contains("未见异常")).GroupBy(g => g.asbitemName)                    .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultAbnormalRateDetailDto                    {                        AbnormalPatientNames = string.Join("、", s.Select(ss => ss.patientRegister.PatientName).Distinct()),                        AsbitemName = s.Key,                        DisplayOrder = index + 1,                        AbnormalRate = Decimal.Round(Convert.ToDecimal(s.Count() * 100) / asbitemAbnormalCount, 2)                    }).ToList();
                msg.MedicalResultAbnormalRateDetails = medicalResultAbnormalRateDetails;                #endregion
                #region 缺项人员一览表   <已经开始检查了,但是未检查完的>
                var listOfMissingItemsDetails = asbitemAbnormalList.Where(m => m.patientRegister.IsMedicalStart == 'Y' && m.registerCheckCompleteFlag == RegisterCheckCompleteFlag.UnChecked)                           .GroupBy(g => g.patientRegister).OrderBy(o => o.FirstOrDefault().occupationalAbnormal)                          .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportListOfMissingItemsDetailDto                          {                              DisplayOrder = index + 1,                              IdNo = s.FirstOrDefault().idNo,                              PatientName = s.Key.PatientName,                              PatientRegisterNo = s.Key.PatientRegisterNo,                              UnCheckAsbitemName = string.Join("、", s.Select(ss => ss.asbitemName).Distinct()),                              Age = s.Key.Age == null ? "" : s.Key.Age.ToString(),                              JobType = s.FirstOrDefault().jobType,                              MedicalStartDate = DataHelper.ConversionDateShortToString(s.Key.MedicalStartDate),                              OcCheckTypeName = s.FirstOrDefault().ocCheckTypeName,                              PoisonNames = string.Join(",", s.Where(m => !string.IsNullOrWhiteSpace(m.posionName)).Select(ss => ss.posionName).Distinct()),                              PoisonWorkTime = s.FirstOrDefault().poisonWorkTime,                              SexName = _cacheService.GetSexNameAsync(s.Key.SexId).GetAwaiter().GetResult(),                              SummaryDoctorName = _cacheService.GetSurnameAsync(s.Key.AuditDoctorId).GetAwaiter().GetResult()                          }).ToList();                msg.ListOfMissingItemsDetails = listOfMissingItemsDetails;                #endregion
                #region 未检人员一览表  <还没开始检查的>
                //
                var uninspectedPersonnelDetails = asbitemAbnormalList.Where(m => m.patientRegister.IsMedicalStart == 'N' && m.registerCheckCompleteFlag == RegisterCheckCompleteFlag.UnChecked)                    .GroupBy(g => g.patientRegister).OrderBy(o => o.FirstOrDefault().occupationalAbnormal)                   .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportUninspectedPersonnelDetailDto                   {                       DisplayOrder = index + 1,                       IdNo = s.FirstOrDefault().idNo,                       PatientName = s.Key.PatientName,                       PatientRegisterNo = s.Key.PatientRegisterNo,                       UnCheckAsbitemName = string.Join("、", s.Select(ss => ss.asbitemName).Distinct()),                       Age = s.Key.Age == null ? "" : s.Key.Age.ToString(),                       JobType = s.FirstOrDefault().jobType,                       MedicalStartDate = DataHelper.ConversionDateShortToString(s.Key.MedicalStartDate),                       OcCheckTypeName = s.FirstOrDefault().ocCheckTypeName,                       PoisonNames = string.Join(",", s.Where(m => !string.IsNullOrWhiteSpace(m.posionName)).Select(ss => ss.posionName).Distinct()),                       PoisonWorkTime = s.FirstOrDefault().poisonWorkTime,                       SexName = _cacheService.GetSexNameAsync(s.Key.SexId).GetAwaiter().GetResult(),                       SummaryDoctorName = _cacheService.GetSurnameAsync(s.Key.AuditDoctorId).GetAwaiter().GetResult()                   }).ToList();                msg.UninspectedPersonnelDetails = uninspectedPersonnelDetails;                #endregion
                #region 体检结果总结
                msg.MedicalResultDesc = $"{Convert.ToDateTime(customerOrgPara.StartDate).ToString("yyyy-MM-dd")},{msg.CustomerOrgName}组织{sumCount}名接触" +                    $"特种作业工人进行职业健康检查。";
                var occupationalAbnormalDetails = new List<GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto>();                occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto                {                    DisplayOrder = 1,                    OccupationalAbnormalName = "未见异常",                    OccupationalAbnormalCount = noAbnormalConditionsDetails.Count,                    OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(noAbnormalConditionsDetails.Count * 100) / sumCount, 2),                });                occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto                {                    DisplayOrder = 2,                    OccupationalAbnormalName = "其他疾病或异常",                    OccupationalAbnormalCount = otherDiseasesOrAbnormalIndividualsDetails.Count,                    OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(otherDiseasesOrAbnormalIndividualsDetails.Count * 100) / sumCount, 2),                });                occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto                {                    DisplayOrder = 3,                    OccupationalAbnormalName = "复查",                    OccupationalAbnormalCount = reviewPersonnelDetails.Count,                    OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(reviewPersonnelDetails.Count * 100) / sumCount, 2),                });                occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto                {                    DisplayOrder = 4,                    OccupationalAbnormalName = "职业禁忌症",                    OccupationalAbnormalCount = occupationalContraindicationDetails.Count,                    OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(occupationalContraindicationDetails.Count * 100) / sumCount, 2),                });                occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto                {                    DisplayOrder = 5,                    OccupationalAbnormalName = "疑似职业病",                    OccupationalAbnormalCount = suspectedOccupationalDiseaseDetails.Count,                    OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(suspectedOccupationalDiseaseDetails.Count * 100) / sumCount, 2),                });                occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto                {                    DisplayOrder = 6,                    OccupationalAbnormalName = "缺项",                    OccupationalAbnormalCount = listOfMissingItemsDetails.Count,                    OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(listOfMissingItemsDetails.Count * 100) / sumCount, 2),                });                occupationalAbnormalDetails.Add(new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto                {                    DisplayOrder = 7,                    OccupationalAbnormalName = "未检",                    OccupationalAbnormalCount = uninspectedPersonnelDetails.Count,                    OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(uninspectedPersonnelDetails.Count * 100) / sumCount, 2),                });
                msg.OccupationalAbnormalDetails = occupationalAbnormalDetails;
                #endregion
            }
            return msg;        }
        ///// <summary>
        ///// 获取单位职业病明细报告
        ///// </summary>
        ///// <returns></returns>
        //[HttpPost("api/app/OccupationalDiseaseReport/GetCompanyOccupationalDiseaseDetailReport")]
        //public async Task<GetCompanyOccupationalDiseaseDetailReportDto> GetCompanyOccupationalDiseaseDetailReportAsync(GetCompanyOccupationalDiseaseDetailReportInputDto 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 patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id
        //                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()
        //                join ocCheckType in await _ocCheckTypeRepository.GetQueryableAsync() on patientOccupationalDisease.OcCheckTypeId equals ocCheckType.Id into ocCheckTypeTemp
        //                from ocCheckTypeHaveEmpty in ocCheckTypeTemp.DefaultIfEmpty()
        //                join sumSummaryHeader in (await _sumSummaryHeaderRepository.GetQueryableAsync()).Include(x => x.SumSummaryContents) on patientRegister.Id equals sumSummaryHeader.PatientRegisterId into sumSummaryHeaderTemp
        //                from sumSummaryHeaderHaveEmpty in sumSummaryHeaderTemp.DefaultIfEmpty()
        //                where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId
        //                && patientRegister.CompleteFlag != PatientRegisterCompleteFlag.SumCheck
        //                select new
        //                {
        //                    patientRegister,
        //                    patient,
        //                    patientOccupationalDisease,
        //                    posionHaveEmpty,
        //                    patientPoisonHaveEmpty,
        //                    occupationalAbnormalHaveEmpty,
        //                    ocCheckTypeHaveEmpty,
        //                    sumSummaryHeaderHaveEmpty
        //                };
        //    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 GetCompanyOccupationalDiseaseDetailReportDto
        //    {
        //        DiagnosisAndTreatmentDetails = new List<GetCompanyOccupationalDiseaseDetailReportDiagnosisAndTreatmentDetailDto>(),
        //        ListOfMissingItemsDetails = new List<GetCompanyOccupationalDiseaseDetailReportListOfMissingItemsDetailDto>(),
        //        MedicalResultAbnormalRateDetails = new List<GetCompanyOccupationalDiseaseDetailReportMedicalResultAbnormalRateDetailDto>(),
        //        OccupationalContraindicationDetails = new List<GetCompanyOccupationalDiseaseDetailReportOccupationalContraindicationDetailDto>(),
        //        ReviewPersonnelDetails = new List<GetCompanyOccupationalDiseaseDetailReportReviewPersonnelDetailDto>(),
        //        SuspectedOccupationalDiseaseDetails = new List<GetCompanyOccupationalDiseaseDetailReportSuspectedOccupationalDiseaseDetailDto>()
        //    };
        //    if (patientRegisterList.Any())
        //    {
        //        //人员
        //        var patientRegisters = patientRegisterList.Select(m => m.patientRegister).Distinct().ToList();
        //        var patientRegisterfisrt = patientRegisterList.First();
        //        msg.CertificateNo = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_qualification_certificate_number");
        //        msg.CustomerOrgName = await _cacheService.GetTopCustomerOrgNameAsync(patientRegisterfisrt.patientRegister.CustomerOrgId);
        //        msg.MedicalCenterName = (await _organizationUnitRepository.GetAsync(patientRegisterfisrt.patientRegister.MedicalCenterId)).DisplayName;
        //        msg.MedicalStartDate = Convert.ToDateTime(customerOrgPara.StartDate).ToString("yyyy年MM月dd日");
        //        msg.RecordNumber = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "medical_center_record_number");
        //        msg.ReportDate = DateTime.Now.ToString("yyyy年MM月dd日");
        //        msg.OcCheckTypeNames = (await _ocCheckTypeRepository.GetListAsync()).Select(s => s.DisplayName).ToList();
        //        #region 检查情况报告列表
        //        var ocCheckTypeDetails = patientRegisterList.GroupBy(g => new { g.patientRegister, g.patientOccupationalDisease.OcCheckTypeId })
        //            .Select(s => new
        //            {
        //                posionNames = string.Join("、", s.Where(m => m.posionHaveEmpty != null)
        //                .OrderBy(o => o.posionHaveEmpty.DisplayOrder).Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),
        //                ocCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty != null ? s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName : "",
        //            }).ToList()
        //            .GroupBy(g => new { g.ocCheckTypeName, g.posionNames })
        //            .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportOcCheckTypeSummaryDto
        //            {
        //                DisplayOrder = index + 1,
        //                OcCheckTypeName = s.Key.ocCheckTypeName,
        //                CheckCount = s.Count(),
        //                PoisonNames = s.Key.posionNames
        //            }).ToList();
        //        msg.OcCheckTypeDetails = ocCheckTypeDetails;
        //        #endregion
        //        #region 体检结果总结
        //        var occupationalAbnormalDetails = patientRegisterList.Where(m => m.occupationalAbnormalHaveEmpty != null).ToList()
        //            .GroupBy(g => new { g.patientRegister, g.occupationalAbnormalHaveEmpty })
        //            .Select(s => new { occupationalAbnormalName = s.Key.occupationalAbnormalHaveEmpty.DisplayName }).ToList()
        //            .GroupBy(g => g.occupationalAbnormalName)
        //            .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportOccupationalAbnormalDetailDto
        //            {
        //                DisplayOrder = index + 1,
        //                OccupationalAbnormalCount = s.Count(),
        //                OccupationalAbnormalName = s.Key,
        //                OccupationalAbnormalRatio = Decimal.Round(Convert.ToDecimal(s.Count() * 100) / patientRegisters.Count, 2)
        //            }).ToList();
        //        string occupationalAbnormalDesc = "";
        //        foreach (var item in occupationalAbnormalDetails)
        //        {
        //            if (occupationalAbnormalDetails.IndexOf(item) == occupationalAbnormalDetails.Count - 1)
        //                occupationalAbnormalDesc += $"{item.OccupationalAbnormalName}{item.OccupationalAbnormalCount}人。";
        //            else
        //                occupationalAbnormalDesc += $"{item.OccupationalAbnormalName}{item.OccupationalAbnormalCount}人,";
        //        }
        //        msg.MedicalResultDesc = $"{Convert.ToDateTime(customerOrgPara.StartDate).ToString("yyyy-MM-dd")},{msg.CustomerOrgName}组织{patientRegisters.Count}名接触" +
        //            $"{1}作业工人进行职业健康检查,结果:{occupationalAbnormalDesc}";
        //        msg.OccupationalAbnormalDetails = occupationalAbnormalDetails;
        //        #endregion
        //        #region 体检结果一览表
        //        var medicalResultDetails = patientRegisterList.GroupBy(g => g.patientOccupationalDisease).OrderBy(o => o.Key.OccupationalAbnormal)
        //            .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultDetailDto
        //            {
        //                //AnomalyIndex = !string.IsNullOrWhiteSpace(s.Key.OccupationalAbnormal)
        //                //? $"{SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList())}\n结论:{s.Key.OccupationalAbnormal}"
        //                //: $"{SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList())}",
        //                AnomalyIndex = $"{SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList())}",
        //                DisplayOrder = index + 1,
        //                HandlingSuggestions = s.Key.OccupationalAbSuggestion,
        //                JobType = s.Key.JobType,
        //                PatientName = s.FirstOrDefault().patientRegister.PatientName,
        //                PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,
        //                PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),
        //                PoisonWorkTime = s.Key.PoisonWorkTime,
        //                MedicalConclusion = s.Key.OccupationalAbnormal,
        //                OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName,
        //                Age = s.FirstOrDefault().patientRegister.Age == null ? "" : s.FirstOrDefault().patientRegister.Age.ToString(),
        //                IdNo = s.FirstOrDefault().patient.IdNo,
        //                SexName = _cacheService.GetSexNameAsync(s.FirstOrDefault().patientRegister.SexId).GetAwaiter().GetResult(),
        //                MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),
        //                SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()
        //            }).ToList();
        //        msg.MedicalResultDetails = medicalResultDetails;
        //        #endregion
        //        #region 体检结果异常率明细
        //        var asbitemAbnormalQuery = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
        //                                    join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id
        //                                    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 into registerCheckSummaryTemp
        //                                    from registerCheckSummaryEmpty in registerCheckSummaryTemp.DefaultIfEmpty()
        //                                    join patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync() on patientRegister.Id equals patientOccupationalDisease.PatientRegisterId
        //                                    join ocCheckType in await _ocCheckTypeRepository.GetQueryableAsync() on patientOccupationalDisease.OcCheckTypeId equals ocCheckType.Id into ocCheckTypeTemp
        //                                    from ocCheckTypeHaveEmpty in ocCheckTypeTemp.DefaultIfEmpty()
        //                                    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()
        //                                    where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId
        //                                    // && !registerCheckSummaryEmpty.Summary.Contains("未见异常")
        //                                    && patientRegister.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration
        //                                    && asbitemHaveEmpty.IsCheck == 'Y'
        //                                    select new
        //                                    {
        //                                        patientRegister,
        //                                        asbitemName = asbitemHaveEmpty.DisplayName,
        //                                        registerCheckCompleteFlag = registerCheck.CompleteFlag,
        //                                        idNo = patient.IdNo,
        //                                        summary = registerCheckSummaryEmpty != null ? registerCheckSummaryEmpty.Summary : "",
        //                                        ocCheckTypeName = ocCheckTypeHaveEmpty != null ? ocCheckTypeHaveEmpty.DisplayName : "",
        //                                        posionName = posionHaveEmpty != null ? posionHaveEmpty.DisplayName : "",
        //                                        jobType = patientOccupationalDisease.JobType,
        //                                        poisonWorkTime = patientOccupationalDisease.PoisonWorkTime,
        //                                        occupationalAbnormal = patientOccupationalDisease.OccupationalAbnormal
        //                                    });
        //        if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))
        //        {
        //            if (customerOrgPara.DateType == '1')
        //            {
        //                asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&
        //             m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
        //            }
        //            else if (customerOrgPara.DateType == '2')
        //            {
        //                asbitemAbnormalQuery = asbitemAbnormalQuery.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')
        //            {
        //                asbitemAbnormalQuery = asbitemAbnormalQuery.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())
        //        {
        //            asbitemAbnormalQuery = asbitemAbnormalQuery.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));
        //        }
        //        var asbitemAbnormalList = asbitemAbnormalQuery.ToList();
        //        var asbitemAbnormalCount = asbitemAbnormalList.Where(m => !m.summary.Contains("未见异常")).Select(s => s.asbitemName).Distinct().Count();
        //        var medicalResultAbnormalRateDetails = asbitemAbnormalList.Where(m => !m.summary.Contains("未见异常")).GroupBy(g => g.asbitemName)
        //            .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportMedicalResultAbnormalRateDetailDto
        //            {
        //                AbnormalPatientNames = string.Join("、", s.Select(ss => ss.patientRegister.PatientName).Distinct()),
        //                AsbitemName = s.Key,
        //                DisplayOrder = index + 1,
        //                AbnormalRate = Decimal.Round(Convert.ToDecimal(s.Count() * 100) / asbitemAbnormalCount, 2)
        //            }).ToList();
        //        msg.MedicalResultAbnormalRateDetails = medicalResultAbnormalRateDetails;
        //        #endregion
        //        #region 职业健康检查缺项情况表明细   <已经开始检查了,但是未检查完的>
        //        var listOfMissingItemsDetails = asbitemAbnormalList.Where(m => m.patientRegister.IsMedicalStart == 'Y' && m.registerCheckCompleteFlag == RegisterCheckCompleteFlag.UnChecked)
        //                   .GroupBy(g => g.patientRegister).OrderBy(o => o.FirstOrDefault().occupationalAbnormal)
        //                  .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportListOfMissingItemsDetailDto
        //                  {
        //                      DisplayOrder = index + 1,
        //                      IdNo = s.FirstOrDefault().idNo,
        //                      PatientName = s.Key.PatientName,
        //                      PatientRegisterNo = s.Key.PatientRegisterNo,
        //                      UnCheckAsbitemName = string.Join("、", s.Select(ss => ss.asbitemName)),
        //                      Age = s.Key.Age == null ? "" : s.Key.Age.ToString(),
        //                      JobType = s.FirstOrDefault().jobType,
        //                      MedicalStartDate = DataHelper.ConversionDateShortToString(s.Key.MedicalStartDate),
        //                      OcCheckTypeName = s.FirstOrDefault().ocCheckTypeName,
        //                      PoisonNames = string.Join(",", s.Where(m => !string.IsNullOrWhiteSpace(m.posionName)).Select(ss => ss.posionName).Distinct()),
        //                      PoisonWorkTime = s.FirstOrDefault().poisonWorkTime,
        //                      SexName = _cacheService.GetSexNameAsync(s.Key.SexId).GetAwaiter().GetResult(),
        //                      SummaryDoctorName = _cacheService.GetSurnameAsync(s.Key.AuditDoctorId).GetAwaiter().GetResult()
        //                  }).ToList();
        //        msg.ListOfMissingItemsDetails = listOfMissingItemsDetails;
        //        #endregion
        //        #region 职业病未检人员一览表  <还没开始检查的>
        //        //
        //        var uninspectedPersonnelDetails = asbitemAbnormalList.Where(m => m.patientRegister.IsMedicalStart == 'N' && m.registerCheckCompleteFlag == RegisterCheckCompleteFlag.UnChecked)
        //            .GroupBy(g => g.patientRegister).OrderBy(o => o.FirstOrDefault().occupationalAbnormal)
        //           .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportUninspectedPersonnelDetailDto
        //           {
        //               DisplayOrder = index + 1,
        //               IdNo = s.FirstOrDefault().idNo,
        //               PatientName = s.Key.PatientName,
        //               PatientRegisterNo = s.Key.PatientRegisterNo,
        //               UnCheckAsbitemName = string.Join("、", s.Select(ss => ss.asbitemName)),
        //               Age = s.Key.Age == null ? "" : s.Key.Age.ToString(),
        //               JobType = s.FirstOrDefault().jobType,
        //               MedicalStartDate = DataHelper.ConversionDateShortToString(s.Key.MedicalStartDate),
        //               OcCheckTypeName = s.FirstOrDefault().ocCheckTypeName,
        //               PoisonNames = string.Join(",", s.Where(m => !string.IsNullOrWhiteSpace(m.posionName)).Select(ss => ss.posionName).Distinct()),
        //               PoisonWorkTime = s.FirstOrDefault().poisonWorkTime,
        //               SexName = _cacheService.GetSexNameAsync(s.Key.SexId).GetAwaiter().GetResult(),
        //               SummaryDoctorName = _cacheService.GetSurnameAsync(s.Key.AuditDoctorId).GetAwaiter().GetResult()
        //           }).ToList();
        //        msg.UninspectedPersonnelDetails = uninspectedPersonnelDetails;
        //        #endregion
        //        #region 职业病专科复查人员一览表明细
        //        //复查结论ID
        //        Guid reviewId = (await _occupationalAbnormalRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("复查"))).Id;
        //        var patientRegisterAbnormalQuery = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
        //                                            join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id
        //                                            join sumSummaryHeader in (await _sumSummaryHeaderRepository.GetQueryableAsync()).Include(x => x.SumSummaryContents) on patientRegister.Id equals sumSummaryHeader.PatientRegisterId into sumSummaryHeaderTemp
        //                                            from sumSummaryHeaderHaveEmpty in sumSummaryHeaderTemp.DefaultIfEmpty()
        //                                                //join sumSummaryContent in await _sumSummaryContentRepository.GetQueryableAsync() on sumSummaryHeaderHaveEmpty.Id equals sumSummaryContent.SumSummaryHeaderId into sumSummaryContentTemp
        //                                                //from sumSummaryContentHaveEmpty in sumSummaryContentTemp.DefaultIfEmpty()
        //                                            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 poisonHaveEmpty in poisonTemp.DefaultIfEmpty()
        //                                            where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId
        //                                            && patientRegister.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration
        //                                            select new
        //                                            {
        //                                                patientRegister,
        //                                                poisonName = poisonHaveEmpty.DisplayName,
        //                                                occupationalAbnormalId = patientPoisonHaveEmpty.OccupationalAbnormalId,
        //                                                patientOccupationalDisease,
        //                                                sumSummaryHeaderHaveEmpty,
        //                                                //sumSummaryContentHaveEmpty,
        //                                                idNo = patient.IdNo
        //                                            });
        //        if (!string.IsNullOrEmpty(customerOrgPara.StartDate) && !string.IsNullOrEmpty(customerOrgPara.EndDate))
        //        {
        //            if (customerOrgPara.DateType == '1')
        //            {
        //                patientRegisterAbnormalQuery = patientRegisterAbnormalQuery.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(customerOrgPara.StartDate) &&
        //             m.patientRegister.CreationTime < Convert.ToDateTime(customerOrgPara.EndDate).AddDays(1));
        //            }
        //            else if (customerOrgPara.DateType == '2')
        //            {
        //                patientRegisterAbnormalQuery = patientRegisterAbnormalQuery.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')
        //            {
        //                patientRegisterAbnormalQuery = patientRegisterAbnormalQuery.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())
        //        {
        //            patientRegisterAbnormalQuery = patientRegisterAbnormalQuery.Where(m => m.patientRegister.CustomerOrgGroupId != null && customerOrgPara.CustomerOrgGroupId.Contains(m.patientRegister.CustomerOrgGroupId.Value));
        //        }
        //        var patientRegisterAbnormalList = patientRegisterAbnormalQuery.ToList();
        //        var reviewPersonnelDetails = patientRegisterAbnormalList.Where(m => m.occupationalAbnormalId == reviewId).GroupBy(g => g.patientRegister)
        //            .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportReviewPersonnelDetailDto
        //            {
        //                IdNo = s.FirstOrDefault().idNo,
        //                DisplayOrder = index + 1,
        //                PatientName = s.Key.PatientName,
        //                PatientRegisterNo = s.Key.PatientRegisterNo,
        //                PoisonName = string.Join(",", s.Select(ss => ss.poisonName).Distinct()),
        //                CheckResult = SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList()),
        //                HandlingSuggestions = $"{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbnormal}\n{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbSuggestion}"
        //            }).ToList();
        //        msg.ReviewPersonnelDetails = reviewPersonnelDetails;
        //        #endregion
        //        #region 职业禁忌证人员一览表
        //        //职业禁忌证结论ID
        //        Guid contraindicationId = (await _occupationalAbnormalRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("禁忌"))).Id;
        //        var occupationalContraindicationDetails = patientRegisterAbnormalList.Where(m => m.occupationalAbnormalId == contraindicationId).GroupBy(g => g.patientRegister)
        //         .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportOccupationalContraindicationDetailDto
        //         {
        //             IdNo = s.FirstOrDefault().idNo,
        //             DisplayOrder = index + 1,
        //             PatientName = s.Key.PatientName,
        //             PatientRegisterNo = s.Key.PatientRegisterNo,
        //             PoisonName = string.Join(",", s.Select(ss => ss.poisonName).Distinct()),
        //             CheckResult = SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList()),
        //             HandlingSuggestions = $"{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbnormal}\n{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbSuggestion}"
        //         }).ToList();
        //        msg.OccupationalContraindicationDetails = occupationalContraindicationDetails;
        //        #endregion
        //        #region 疑似职业病人员一览表
        //        //疑似职业病结论ID
        //        Guid suspectedOccupationalDiseaseId = (await _occupationalAbnormalRepository.FirstOrDefaultAsync(f => f.DisplayName.Contains("疑似"))).Id;
        //        var suspectedOccupationalDiseaseDetails = patientRegisterAbnormalList.Where(m => m.occupationalAbnormalId == suspectedOccupationalDiseaseId).GroupBy(g => g.patientRegister)
        //         .Select((s, index) => new GetCompanyOccupationalDiseaseDetailReportSuspectedOccupationalDiseaseDetailDto
        //         {
        //             IdNo = s.FirstOrDefault().idNo,
        //             DisplayOrder = index + 1,
        //             PatientName = s.Key.PatientName,
        //             PatientRegisterNo = s.Key.PatientRegisterNo,
        //             PoisonName = string.Join(",", s.Select(ss => ss.poisonName).Distinct()),
        //             CheckResult = SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList()),
        //             HandlingSuggestions = $"{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbnormal}\n{s.FirstOrDefault().patientOccupationalDisease.OccupationalAbSuggestion}"
        //         }).ToList();
        //        msg.SuspectedOccupationalDiseaseDetails = suspectedOccupationalDiseaseDetails;
        //        #endregion
        //    }
        //    return msg;
        //}
        /// <summary>
        /// 获取单位职业病结果Excel数据
        /// </summary>
        /// <returns></returns>
        [HttpPost("api/app/OccupationalDiseaseReport/GetCompanyOccupationalDiseaseDataExcel")]        public async Task<List<GetCompanyOccupationalDiseaseDataExcelDto>> GetCompanyOccupationalDiseaseDataExcelAsync(GetCompanyOccupationalDiseaseDetailReportInputDto 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()                        join ocCheckType in await _ocCheckTypeRepository.GetQueryableAsync() on patientOccupationalDisease.OcCheckTypeId equals ocCheckType.Id into ocCheckTypeTemp                        from ocCheckTypeHaveEmpty in ocCheckTypeTemp.DefaultIfEmpty()                        join sumSummaryHeader in (await _sumSummaryHeaderRepository.GetQueryableAsync()).Include(x => x.SumSummaryContents) on patientRegister.Id equals sumSummaryHeader.PatientRegisterId into sumSummaryHeaderTemp                        from sumSummaryHeaderHaveEmpty in sumSummaryHeaderTemp.DefaultIfEmpty()                        where patientRegister.CustomerOrgRegisterId == customerOrgPara.CustomerOrgRegisterId                        && patientRegister.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration                        select new                        {                            patientRegister,                            patientOccupationalDisease,                            posionHaveEmpty,                            patientPoisonHaveEmpty,                            occupationalAbnormalHaveEmpty,                            ocCheckTypeHaveEmpty,                            sumSummaryHeaderHaveEmpty                        };
            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));                }            }
            List<Guid?> customerOrgIds = new List<Guid?>();
            if (customerOrgPara.CustomerOrgId != null)            {                customerOrgIds = await _customerOrgManager.GetCustomerOrgChildrenId(customerOrgPara.CustomerOrgId.Value);            }
            if (customerOrgIds.Any())            {                query = query.Where(m => customerOrgIds.Contains(m.patientRegister.CustomerOrgId));            }
            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 List<GetCompanyOccupationalDiseaseDataExcelDto>();
            if (patientRegisterList.Any())            {                ////人员
                //var patientRegisters = patientRegisterList.Select(m => m.patientRegister).Distinct().ToList();
                //var patientRegisterfisrt = patientRegisterList.First();
                #region 体检结果一览表
                var medicalResultDetails = patientRegisterList.GroupBy(g => g.patientOccupationalDisease)                    .Select((s, index) => new GetCompanyOccupationalDiseaseDataExcelDto                    {                        AnomalyIndex = $"{SetSumSummarys(s.Select(ss => ss.sumSummaryHeaderHaveEmpty).Distinct().ToList())}",                        MedicalConclusion = s.Key.OccupationalAbnormal,                        OcCheckTypeName = s.FirstOrDefault().ocCheckTypeHaveEmpty != null ? s.FirstOrDefault().ocCheckTypeHaveEmpty.DisplayName : "",                        HandlingSuggestions = s.Key.OccupationalAbSuggestion,                        JobType = s.Key.JobType,                        PatientName = s.FirstOrDefault().patientRegister.PatientName,                        PatientRegisterNo = s.FirstOrDefault().patientRegister.PatientRegisterNo,                        PoisonNames = string.Join(",", s.Select(ss => ss.posionHaveEmpty.DisplayName).Distinct()),                        PoisonWorkTime = s.Key.PoisonWorkTime,                        MedicalStartDate = DataHelper.ConversionDateShortToString(s.FirstOrDefault().patientRegister.MedicalStartDate),                        SummaryDoctorName = _cacheService.GetSurnameAsync(s.FirstOrDefault().patientRegister.AuditDoctorId).GetAwaiter().GetResult()                    }).OrderBy(o => o.MedicalConclusion).ToList();                msg = medicalResultDetails;                #endregion
            }
            return msg;        }
        /// <summary>
        /// 生成历次综述医生小结
        /// </summary>
        /// <param name="SumSummaryHeaders"></param>
        /// <returns></returns>
        private string SetSumSummarys(List<SumSummaryHeader> SumSummaryHeaders)        {            StringBuilder msg = new StringBuilder();            if (SumSummaryHeaders.Count > 0)            {                foreach (var item in SumSummaryHeaders)                {                    if (item != null)                    {                        msg.Append($"【{item.SummaryTitle}】\n");                        if (item.SumSummaryContents.Count > 0)                        {                            var SumSummaryContents = item.SumSummaryContents.ToList();                            foreach (var item2 in SumSummaryContents)                            {                                msg.Append($"{item2.SummaryContent}\n");                            }                        }                    }                }            }            return msg.ToString();        }
    }}
  |