using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using NPOI.POIFS.Properties;
using NUglify.Helpers;
using Shentun.Peis.AsbitemGuides;
using Shentun.Peis.DiagnosisFunctions;
using Shentun.Peis.Enums;
using Shentun.Peis.LisRequests;
using Shentun.Peis.Models;
using Shentun.Peis.OcCheckTypes;
using Shentun.Peis.OccupationalDiseases;
using Shentun.Peis.PatientRegisters;
using Shentun.Peis.SumSuggestionContents;
using Shentun.Peis.SumSuggestionHeaders;
using Shentun.Peis.SumSummaryContents;
using Shentun.Peis.SumSummaryHeaders;
using Shentun.Peis.SumSummaryReports;
using Shentun.Peis.SysParmValues;
using SqlSugar.Extensions;
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;
using Volo.Abp.ObjectMapping;
using Volo.Abp.Uow;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace Shentun.Peis.PrintReports
{
    /// 
    /// 打印报告服务
    /// 
    [ApiExplorerSettings(GroupName = "Work")]
    [Authorize]
    public class PrintReportAppService : ApplicationService
    {
        private readonly IRepository _customerOrgRepository;
        private readonly IRepository _customerOrgGroupRepository;
        private readonly IRepository _patientRepository;
        private readonly IRepository _patientRegisterRepository;
        private readonly IRepository _registerCheckAsbitemRepository;
        private static IRepository _registerCheckAsbitemStaticRepository;
        private readonly IRepository _registerCheckItemRepository;
        private readonly IRepository _registerCheckSummaryRepository;
        private readonly IRepository _registerCheckPictureRepository;
        private readonly IRepository _asbitemRepository;
        private readonly IRepository-  _itemRepository;
        private readonly IRepository _medicalPackageRepository;
        private readonly IRepository _medicalReportTypeRepository;
        private readonly IRepository _itemTypeRepository;
        private readonly IRepository _lisRequestRepository;
        private readonly IRepository _sampleGroupRepository;
        private readonly IRepository _sampleGroupDetailRepository;
        private readonly IRepository _sampleContainerRepository;
        private readonly IRepository _sampleTypeRepository;
        private readonly IRepository _sexRegisterRepository;
        private readonly IRepository _resultStatusRepository;
        private readonly IRepository _sumSummaryHeaderRepository;
        private readonly IRepository _identityUserRepository;
        private readonly IRepository _sumSuggestionHeaderRepository;
        private readonly IRepository _registerCheckRepository;
        private readonly IRepository _personnelTypeRepository;
        //private readonly IOrganizationUnitRepository _organizationUnitRepository;
        private readonly IRepository _organizationUnitRepository;
        private readonly IPatientRegisterGuideReportRepository _patientRegisterGuideReportRepository;
        private readonly ILisRequestReportRepository _lisRequestReportRepository;
        //private readonly ICheckRequestNoReportRepository _checkRequestNoReportRepository;
        private readonly IChargeReportRepository _chargeReportRepository;
        private readonly SysParmValueManager _sysParmValueManager;
        private readonly CacheService _cacheService;
        private readonly LisRequestManager _lisRequestManager;
        private readonly IUnitOfWorkManager _unitOfWorkManager;
        private static AsbitemGuideManager _asbitemGuideManager;
        private readonly IConfiguration _configuration;
        private readonly IRepository _patientOccupationalDiseaseRepository;
        private readonly IRepository _patientOccupationalHistoryRepository;
        private readonly IRepository _patientPoisonRepository;
        private readonly IRepository _patientSymptomRepository;
        private readonly IRepository _patientOccupationalMedicalHistoryRepository;
        private readonly IRepository _patientPastMedicalHistoryRepository;
        private readonly IRepository _ocCheckTypeRepository;
        private readonly IRepository _poisonRepository;
        private readonly IRepository _occupationalAbnormalRepository;
        private readonly IRepository _symptomRepository;
        public PrintReportAppService(
            IRepository patientRepository,
            IRepository customerOrgRepository,
            IRepository customerOrgGroupRepository,
            IRepository patientRegisterRepository,
            IRepository registerCheckAsbitemRepository,
            IRepository registerCheckItemRepository,
            IRepository registerCheckSummaryRepository,
            IRepository registerCheckPictureRepository,
            IRepository asbitemRepository,
            IRepository
-  itemRepository,
            IRepository medicalPackageRepository,
            IRepository medicalReportTypeRepository,
            IRepository itemTypeRepository,
            IRepository lisRequestRepository,
            IRepository sampleGroupRepository,
            IRepository sampleContainerRepository,
            IRepository sampleTypeRepository,
            IRepository sexRegisterRepository,
            IRepository personnelTypeRepository,
            IRepository resultStatusRepository,
            IRepository sumSummaryHeaderRepository,
            IRepository identityUserRepository,
            IRepository sumSuggestionHeaderRepository,
            IRepository registerCheckRepository,
            //IOrganizationUnitRepository organizationUnitRepository,
            IRepository organizationUnitRepository,
            IPatientRegisterGuideReportRepository patientRegisterGuideReportRepository,
            ILisRequestReportRepository lisRequestReportRepository,
            //ICheckRequestNoReportRepository checkRequestNoReportRepository,
            IChargeReportRepository chargeReportRepository,
           SysParmValueManager sysParmValueManager,
           CacheService cacheService,
           LisRequestManager lisRequestManager,
           IUnitOfWorkManager unitOfWorkManager,
           AsbitemGuideManager asbitemGuideManager,
           IConfiguration configuration,
           IRepository patientOccupationalDiseaseRepository,
           IRepository patientOccupationalHistoryRepository,
           IRepository patientPoisonRepository,
           IRepository patientSymptomRepository,
           IRepository patientOccupationalMedicalHistoryRepository,
           IRepository patientPastMedicalHistoryRepository
,
           IRepository ocCheckTypeRepository,
           IRepository poisonRepository,
           IRepository occupationalAbnormalRepository,
           IRepository symptomRepository,
           IRepository sampleGroupDetailRepository)
        {
            this._customerOrgRepository = customerOrgRepository;
            this._patientRegisterRepository = patientRegisterRepository;
            this._sexRegisterRepository = sexRegisterRepository;
            this._resultStatusRepository = resultStatusRepository;
            this._sumSummaryHeaderRepository = sumSummaryHeaderRepository;
            this._identityUserRepository = identityUserRepository;
            this._sumSuggestionHeaderRepository = sumSuggestionHeaderRepository;
            this._registerCheckRepository = registerCheckRepository;
            this._organizationUnitRepository = organizationUnitRepository;
            this._patientRegisterGuideReportRepository = patientRegisterGuideReportRepository;
            this._lisRequestReportRepository = lisRequestReportRepository;
            //this._checkRequestNoReportRepository = checkRequestNoReportRepository;
            this._chargeReportRepository = chargeReportRepository;
            this._sysParmValueManager = sysParmValueManager;
            _registerCheckAsbitemRepository = registerCheckAsbitemRepository;
            _registerCheckAsbitemStaticRepository = registerCheckAsbitemRepository;
            _registerCheckItemRepository = registerCheckItemRepository;
            _registerCheckSummaryRepository = registerCheckSummaryRepository;
            _registerCheckPictureRepository = registerCheckPictureRepository;
            _asbitemRepository = asbitemRepository;
            _itemRepository = itemRepository;
            _medicalReportTypeRepository = medicalReportTypeRepository;
            _itemTypeRepository = itemTypeRepository;
            _lisRequestRepository = lisRequestRepository;
            _sampleGroupRepository = sampleGroupRepository;
            _sampleContainerRepository = sampleContainerRepository;
            _sampleTypeRepository = sampleTypeRepository;
            _cacheService = cacheService;
            _lisRequestManager = lisRequestManager;
            _unitOfWorkManager = unitOfWorkManager;
            _patientRepository = patientRepository;
            _asbitemGuideManager = asbitemGuideManager;
            _customerOrgGroupRepository = customerOrgGroupRepository;
            _medicalPackageRepository = medicalPackageRepository;
            _personnelTypeRepository = personnelTypeRepository;
            _configuration = configuration;
            _organizationUnitRepository = organizationUnitRepository;
            _patientOccupationalDiseaseRepository = patientOccupationalDiseaseRepository;
            _patientOccupationalHistoryRepository = patientOccupationalHistoryRepository;
            _patientPoisonRepository = patientPoisonRepository;
            _patientSymptomRepository = patientSymptomRepository;
            _patientOccupationalMedicalHistoryRepository = patientOccupationalMedicalHistoryRepository;
            _patientPastMedicalHistoryRepository = patientPastMedicalHistoryRepository;
            _ocCheckTypeRepository = ocCheckTypeRepository;
            _poisonRepository = poisonRepository;
            _occupationalAbnormalRepository = occupationalAbnormalRepository;
            _symptomRepository = symptomRepository;
            _sampleGroupDetailRepository = sampleGroupDetailRepository;
        }
        /// 
        /// 获取体检人员指引单报告数据
        /// 
        /// 
        /// 
        [HttpPost("api/app/PrintReport/getpatientregisterguidereport")]
        public async Task GetPatientRegisterGuideReportAsync(Guid PatientRegisterId)
        {
            //return await _patientRegisterGuideReportRepository.GetPatientRegisterGuideReportAsync(PatientRegisterId);
            //_cacheService.GetMedicalTypeNameAsync
            var apiUrl = _configuration.GetValue("HostUrl:ApiUrl") + "/";
            var patientRegister = await _patientRegisterRepository.GetAsync(o => o.Id == PatientRegisterId);
            Guid medicalCenterId = patientRegister.MedicalCenterId;
            #region 系统参数配置
            var MedicalCenterAddress = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "medical_center_address");
            var MedicalCenterFax = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "medical_center_fax");
            var MedicalCenterTelphone = await _sysParmValueManager.GetSysParmValueAsync(medicalCenterId, "medical_center_telphone");
            #endregion
            //var customerOrgList = await _customerOrgRepository.GetListAsync();
            var query = from a in await _patientRegisterRepository.GetQueryableAsync()
                        join b in await _sexRegisterRepository.GetQueryableAsync()
                        on a.SexId equals b.Id
                        join c in await _customerOrgGroupRepository.GetQueryableAsync()
                        on a.CustomerOrgGroupId equals c.Id into cc
                        from ac in cc.DefaultIfEmpty()
                        join d in await _medicalPackageRepository.GetQueryableAsync()
                        on a.MedicalPackageId equals d.Id into dd
                        from ad in dd.DefaultIfEmpty()
                        join e in await _patientRepository.GetQueryableAsync()
                        on a.PatientId equals e.Id
                        join f in await _personnelTypeRepository.GetQueryableAsync()
                        on a.PersonnelTypeId equals f.Id into ff
                        from af in ff.DefaultIfEmpty()
                        join g in await _organizationUnitRepository.GetQueryableAsync()
                        on a.MedicalCenterId equals g.Id into gg
                        from ag in gg.DefaultIfEmpty()
                        where (a.Id == PatientRegisterId)
                        select new PatientRegisterGuideReportDto
                        {
                            Age = a.Age,
                            PatientRegisterId = a.Id,
                            CustomerOrgGroupName = ac.DisplayName,
                            CustomerOrgName = _cacheService.GetTopCustomerOrgNameAsync(a.CustomerOrgId).GetAwaiter().GetResult(),
                            CustomerOrgShortName = _cacheService.GetTopCustomerOrgAsync(a.CustomerOrgId).GetAwaiter().GetResult().ShortName,
                            DepartmentName = _cacheService.GetAllDepartmentNameAsync(a.CustomerOrgId).GetAwaiter().GetResult(),
                            IdNo = e.IdNo,
                            JobCardNo = a.JobCardNo,
                            MedicalCardNo = a.MedicalCardNo,
                            MedicalCenterAddress = MedicalCenterAddress,
                            MedicalCenterFax = MedicalCenterFax,
                            MedicalCenterTelphone = MedicalCenterTelphone,
                            MedicalPackageName = ad.DisplayName,
                            MedicalTimes = a.MedicalTimes,
                            MobileTelephone = e.MobileTelephone,
                            PatientName = a.PatientName,
                            PatientNo = e.PatientNo,
                            PatientRegisterNo = a.PatientRegisterNo,
                            PersonnelTypeName = af.DisplayName,
                            SexName = b.DisplayName,
                            // Photo = string.IsNullOrEmpty(a.Photo) ? "" : ImageHelper.GetImageBase64StringAsync( a.Photo),
                            Photo = string.IsNullOrEmpty(a.Photo) ? "" : apiUrl + a.Photo,
                            MedicalStartDate = Convert.ToDateTime(a.MedicalStartDate.ToString()).ToString("yyyy-MM-dd"),
                            OrganizationUnitId = a.MedicalCenterId,
                            OrganizationUnitName = ag.DisplayName,
                            Detail = PatientRegisterGuideAsbitem(a.Id, a.PatientRegisterNo, medicalCenterId, a.SexId),
                            HisPatientId = a.HisPatientId,
                            MedicalTypeName = _cacheService.GetMedicalTypeNameAsync(a.MedicalTypeId).Result,
                        };
            return query.FirstOrDefault();
        }
        /// 
        /// 批量获取体检人员指引单报告数据
        /// 
        /// 
        /// 
        [HttpPost("api/app/printreport/getpatientregisterguidereportmany")]
        public async Task
> GetPatientRegisterGuideReportManyAsync(List PatientRegisterIds)
        {
            return await _patientRegisterGuideReportRepository.GetPatientRegisterGuideReportManyAsync(PatientRegisterIds);
        }
        /// 
        /// 打印检验申请单
        /// 
        /// 
        [HttpPost("api/app/PrintReport/GetLisRequestReportByPatientRegisterId")]
        public async Task> GetLisRequestReportByPatientRegisterIdAsync(PatientRegisterIdInputDto input)
        {
            //生成LIS条码
            var lisRequests = await _lisRequestManager.SetLisRequestAsync(input.PatientRegisterId);
            await _unitOfWorkManager.Current.SaveChangesAsync();
            await _unitOfWorkManager.Current.CompleteAsync();
            //检索条码数据
            using (var uow = _unitOfWorkManager.Begin(
                requiresNew: false, isTransactional: false
            ))
            {
                var query = (from patient in await _patientRepository.GetQueryableAsync()
                             join patientRegister in await _patientRegisterRepository.GetQueryableAsync()
                             on patient.Id equals patientRegister.PatientId
                             join sex in await _sexRegisterRepository.GetQueryableAsync() on patientRegister.SexId equals sex.Id
                             join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on patientRegister.Id equals registerCheckAsbitem.PatientRegisterId
                             join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id
                             join lisRequest in await _lisRequestRepository.GetQueryableAsync() on registerCheckAsbitem.LisRequestId equals lisRequest.Id
                             join sampleContainer in await _sampleContainerRepository.GetQueryableAsync() on lisRequest.SampleContainerId equals sampleContainer.Id into dd
                             from sampleContainerHaveEmpty in dd.DefaultIfEmpty()
                             join sampleType in await _sampleTypeRepository.GetQueryableAsync() on lisRequest.SampleTypeId equals sampleType.Id into ee
                             from sampleTypeHaveEmpty in ee.DefaultIfEmpty()
                             join sampleGroupDetail in await _sampleGroupDetailRepository.GetQueryableAsync() on asbitem.Id equals sampleGroupDetail.AsbitemId into sampleGroupDetailTemp
                             from sampleTypeHaveEmptyHaveEmpty in sampleGroupDetailTemp.DefaultIfEmpty()
                             join sampleGroup in await _sampleGroupRepository.GetQueryableAsync()
                             on sampleTypeHaveEmptyHaveEmpty.SampleGroupId equals sampleGroup.Id into sampleGroupTemp
                             from sampleGroupHaveEmpty in sampleGroupTemp.DefaultIfEmpty()
                             where (patientRegister.Id == input.PatientRegisterId && registerCheckAsbitem.LisRequestId != null)
                             select new
                             {
                                 patient,
                                 patientRegister,
                                 sex,
                                 registerCheckAsbitem,
                                 asbitem,
                                 lisRequest,
                                 sampleContainerHaveEmpty,
                                 sampleTypeHaveEmpty,
                                 sampleGroupName = sampleGroupHaveEmpty != null ? sampleGroupHaveEmpty.DisplayName : "",
                                 samplePrintCount = sampleGroupHaveEmpty != null ? sampleGroupHaveEmpty.SamplePrintCount : 0
                             }
                          ).ToList();
                if (query.Count == 0)
                {
                    return new List();
                }
                lisRequests = query.Select(o => o.lisRequest).Distinct().ToList();
                //发送第三方LIS申请
                if (lisRequests != null)
                {
                    foreach (var lisRequest in lisRequests)
                    {
                        await _lisRequestManager.SendThirdLisRequestAsync(lisRequest.Id);
                    }
                }
                var lisRequestReportDtoList = query.Select(o => new LisRequestReportDto
                {
                    LisRequestId = o.lisRequest.Id,
                    PatientNo = o.patient.PatientNo,
                    Age = o.patientRegister.Age,
                    AsbitemNames = string.IsNullOrEmpty(o.asbitem.ShortName) ? o.asbitem.DisplayName : o.asbitem.ShortName,
                    LisRequestNo = o.lisRequest.LisRequestNo,
                    PatientName = o.patientRegister.PatientName,
                    PatientRegisterNo = o.patientRegister.PatientRegisterNo,
                    SampleContainerName = (o.sampleContainerHaveEmpty == null) ? "" : o.sampleContainerHaveEmpty.DisplayName,
                    ContainerColor = (o.sampleContainerHaveEmpty == null) ? 16777215 : o.sampleContainerHaveEmpty.ContainerColor,
                    SampleContainerRemark = (o.sampleContainerHaveEmpty == null) ? "" : o.sampleContainerHaveEmpty.ContainerRemark,
                    SampleTypeName = (o.sampleTypeHaveEmpty == null) ? "" : o.sampleTypeHaveEmpty.DisplayName,
                    SexName = o.sex.DisplayName,
                    CustomerOrgName = _cacheService.GetTopCustomerOrgShortNameAsync(o.patientRegister.CustomerOrgId).Result,
                    DepartmentName = _cacheService.GetAllDepartmentNameAsync(o.patientRegister.CustomerOrgId).Result,
                    IsPrint = o.lisRequest.IsPrint,
                    IsSignIn = o.lisRequest.IsSignIn,
                    SamplingTime = o.lisRequest.SamplingTime,
                    SignInOrder = o.lisRequest.SignInOrder,
                    SignInPerson = o.lisRequest.SignInPerson,
                    SignInTime = o.lisRequest.SignInTime,
                    SampleGroupName = o.sampleGroupName,
                    MobileTelephone = o.patient.MobileTelephone,
                    SamplePrintCount = o.samplePrintCount
                }).ToList();
                var lisRequestNoPrintMode = await _sysParmValueManager.GetSysParmValueAsync(query.FirstOrDefault().patientRegister.MedicalCenterId, "lis_request_no_print_mode");
                if (string.IsNullOrWhiteSpace(lisRequestNoPrintMode))
                    lisRequestNoPrintMode = "0";
                //var entlist = lisRequestReportDtoList.GroupBy(g => new
                //{
                //    g.LisRequestNo,
                //    g.SampleGroupName
                //})
                //  .Select(s => new LisRequestReportDto
                //  {
                //      PatientNo = s.FirstOrDefault().PatientNo,
                //      LisRequestId = s.FirstOrDefault().LisRequestId,
                //      SexName = s.FirstOrDefault().SexName,
                //      SampleTypeName = s.FirstOrDefault().SampleTypeName,
                //      SampleContainerRemark = s.FirstOrDefault().SampleContainerRemark,
                //      SampleContainerName = s.FirstOrDefault().SampleContainerName,
                //      ContainerColor = s.FirstOrDefault().ContainerColor,
                //      PatientRegisterNo = s.FirstOrDefault().PatientRegisterNo,
                //      PatientName = s.FirstOrDefault().PatientName,
                //      Age = s.FirstOrDefault().Age,
                //      LisRequestNo = lisRequestNoPrintMode == "0" ? s.Key.LisRequestNo : s.FirstOrDefault().PatientRegisterNo,
                //      CustomerOrgName = s.FirstOrDefault().CustomerOrgName,
                //      DepartmentName = s.FirstOrDefault().DepartmentName,
                //      AsbitemNames = string.Join(",", s.Select(d => d.AsbitemNames)),
                //      IsPrint = s.FirstOrDefault().IsPrint,
                //      IsSignIn = s.FirstOrDefault().IsSignIn,
                //      SamplingTime = s.FirstOrDefault().SamplingTime,
                //      SignInOrder = s.FirstOrDefault().SignInOrder,
                //      SignInPerson = s.FirstOrDefault().SignInPerson,
                //      SignInTime = s.FirstOrDefault().SignInTime,
                //      SampleGroupName = s.Key.SampleGroupName,
                //      MobileTelephone = s.FirstOrDefault().MobileTelephone,
                //      SamplePrintCount = s.FirstOrDefault().SamplePrintCount
                //  }).ToList();
                var entlist = lisRequestReportDtoList.GroupBy(g => new
                {
                    g.PatientNo,
                    g.LisRequestId,
                    g.LisRequestNo,
                    g.Age,
                    g.PatientName,
                    g.PatientRegisterNo,
                    g.SampleContainerName,
                    g.ContainerColor,
                    g.SampleContainerRemark,
                    g.SampleTypeName,
                    g.SexName,
                    g.CustomerOrgName,
                    g.DepartmentName,
                    g.IsPrint,
                    g.IsSignIn,
                    g.SamplingTime,
                    g.SignInOrder,
                    g.SignInPerson,
                    g.SignInTime,
                    g.MobileTelephone,
                    g.SampleGroupName
                })
                    .Select(s => new LisRequestReportDto
                    {
                        PatientNo = s.Key.PatientNo,
                        LisRequestId = s.Key.LisRequestId,
                        SexName = s.Key.SexName,
                        SampleTypeName = s.Key.SampleTypeName,
                        SampleContainerRemark = s.Key.SampleContainerRemark,
                        SampleContainerName = s.Key.SampleContainerName,
                        ContainerColor = s.Key.ContainerColor,
                        PatientRegisterNo = s.Key.PatientRegisterNo,
                        PatientName = s.Key.PatientName,
                        Age = s.Key.Age,
                        LisRequestNo = lisRequestNoPrintMode == "0" ? s.Key.LisRequestNo : s.Key.PatientRegisterNo,
                        CustomerOrgName = s.Key.CustomerOrgName,
                        DepartmentName = s.Key.DepartmentName,
                        AsbitemNames = string.Join(",", s.Select(d => d.AsbitemNames)),
                        IsPrint = s.Key.IsPrint,
                        IsSignIn = s.Key.IsSignIn,
                        SamplingTime = s.Key.SamplingTime,
                        SignInOrder = s.Key.SignInOrder,
                        SignInPerson = s.Key.SignInPerson,
                        SignInTime = s.Key.SignInTime,
                        SampleGroupName = s.Key.SampleGroupName,
                        MobileTelephone = s.Key.MobileTelephone,
                        SamplePrintCount = s.FirstOrDefault().SamplePrintCount
                    }).ToList();
                await uow.CompleteAsync();
                return entlist;
            }
        }
        /// 
        /// 单个打印检验条码
        /// 
        /// 
        /// 
        [HttpPost("api/app/PrintReport/GetLisRequestReportByLisRequestId")]
        public async Task GetLisRequestReportByLisRequestIdAsync(LisRequestIdInputDto input)
        {
            var lisRequestNoPrintMode = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "lis_request_no_print_mode");
            if (string.IsNullOrWhiteSpace(lisRequestNoPrintMode))
                lisRequestNoPrintMode = "0";
            var list = (from patient in await _patientRepository.GetQueryableAsync()
                        join patientRegister in await _patientRegisterRepository.GetQueryableAsync()
                        on patient.Id equals patientRegister.PatientId
                        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
                        join lisRequest in await _lisRequestReportRepository.GetQueryableAsync()
                        on registerCheckAsbitem.LisRequestId equals lisRequest.Id
                        join sampleContainer in await _sampleContainerRepository.GetQueryableAsync()
                        on lisRequest.SampleContainerId equals sampleContainer.Id
                        join sampleType in await _sampleTypeRepository.GetQueryableAsync()
                        on lisRequest.SampleTypeId equals sampleType.Id
                        join sampleGroupDetail in await _sampleGroupDetailRepository.GetQueryableAsync() on asbitem.Id equals sampleGroupDetail.AsbitemId into sampleGroupDetailTemp
                        from sampleTypeHaveEmptyHaveEmpty in sampleGroupDetailTemp.DefaultIfEmpty()
                        join sampleGroup in await _sampleGroupRepository.GetQueryableAsync() on sampleTypeHaveEmptyHaveEmpty.SampleGroupId equals sampleGroup.Id into sampleGroupTemp
                        from sampleGroupHaveEmpty in sampleGroupTemp.DefaultIfEmpty()
                        where lisRequest.Id == input.LisRequestId
                        select new
                        {
                            patient,
                            patientRegister,
                            asbitem,
                            lisRequest,
                            sampleContainer,
                            sampleType,
                            sampleGroupName = sampleGroupHaveEmpty != null ? sampleGroupHaveEmpty.DisplayName : "",
                            samplePrintCount = sampleGroupHaveEmpty != null ? sampleGroupHaveEmpty.SamplePrintCount : 1
                        }).Distinct().ToList();
            if (!list.Any())
            {
                return null;
            }
            var lisRequestDtoList = new List();
            var lisRequestInfo = list.First();
            var lisRequestDto = new LisRequestReportDto()
            {
                LisRequestId = input.LisRequestId,
                LisRequestNo = lisRequestNoPrintMode == "0" ? lisRequestInfo.lisRequest.LisRequestNo : lisRequestInfo.patientRegister.PatientRegisterNo,
                PatientNo = lisRequestInfo.patient.PatientNo,
                PatientRegisterNo = lisRequestInfo.patientRegister.PatientRegisterNo,
                PatientName = lisRequestInfo.patientRegister.PatientName,
                SexName = _cacheService.GetSexNameAsync(lisRequestInfo.patientRegister.SexId).Result,
                Age = lisRequestInfo.patientRegister.Age,
                IsPrint = lisRequestInfo.lisRequest.IsPrint,
                IsSignIn = lisRequestInfo.lisRequest.IsSignIn,
                SamplingTime = lisRequestInfo.lisRequest.SamplingTime,
                SignInOrder = lisRequestInfo.lisRequest.SignInOrder,
                SignInPerson = lisRequestInfo.lisRequest.SignInPerson,
                SignInTime = lisRequestInfo.lisRequest.SignInTime,
                SampleTypeName = lisRequestInfo.sampleType.DisplayName,
                SampleContainerName = lisRequestInfo.sampleContainer.DisplayName,
                ContainerColor = lisRequestInfo.sampleContainer.ContainerColor,
                SampleContainerRemark = lisRequestInfo.sampleContainer.ContainerRemark,
                AsbitemNames = string.Join(",", list.OrderBy(o => o.asbitem.DisplayOrder).Select(o => o.asbitem.DisplayName).Distinct()),
                CustomerOrgName = _cacheService.GetTopCustomerOrgShortNameAsync(lisRequestInfo.patientRegister.CustomerOrgId).Result,
                DepartmentName = _cacheService.GetAllDepartmentNameAsync(lisRequestInfo.patientRegister.CustomerOrgId).Result,
                SampleGroupName = lisRequestInfo.sampleGroupName,
                MobileTelephone = lisRequestInfo.patient.MobileTelephone,
                SamplePrintCount = lisRequestInfo.samplePrintCount
            };
            return lisRequestDto;
        }
        /// 
        /// 打印体检报告
        /// 
        /// 
        [HttpPost("api/app/PrintReport/GetMedicalReport")]
        public async Task GetMedicalReportAsync(PatientRegisterIdInputDto input)
        {
            var patientRegister = (await _patientRegisterRepository.GetQueryableAsync())
               .Include(x => x.Patient)
               .Where(m => m.Id == input.PatientRegisterId).FirstOrDefault();
            if (patientRegister == null)
            {
                throw new UserFriendlyException("人员登记信息不存在");
            }
            var medicalReportDto = await GetMedicalReportDto(patientRegister);
            //获取综述
            medicalReportDto.SumSummarys = await GetMedicalReportSummaryDtos(patientRegister);
            //获取建议
            medicalReportDto.SumSuggestions = await GetMedicalReportSuggestinoDtos(patientRegister);
            //设置明细结果
            await SetMedicalReportRegisterChecks(patientRegister, medicalReportDto);
            //项目对比结果
            medicalReportDto.ItemContrasts = await GetMedicalReportItemContrastListAsync(patientRegister);
            return medicalReportDto;
        }
        /// 
        /// 获取职业病体检报告
        /// 
        /// 
        /// 
        [HttpPost("api/app/PrintReport/GetOccupationalDiseaseMedicalReport")]
        public async Task GetOccupationalDiseaseMedicalReportAsync(PatientRegisterIdInputDto input)
        {
            var result = new OccupationalDiseaseMedicalReportDto();
            var patientOccupationalDiseaseEnt = (from patientOccupationalDisease in await _patientOccupationalDiseaseRepository.GetQueryableAsync()
                                                 join ocCheckType in await _ocCheckTypeRepository.GetQueryableAsync() on patientOccupationalDisease.OcCheckTypeId equals ocCheckType.Id
                                                 where patientOccupationalDisease.PatientRegisterId == input.PatientRegisterId
                                                 select new
                                                 {
                                                     ocCheckTypeName = ocCheckType.DisplayName,
                                                     patientOccupationalDisease
                                                 }).FirstOrDefault();
            if (patientOccupationalDiseaseEnt == null)
            {
                throw new UserFriendlyException("当前人员无职业病信息");
            }
            //基础报告信息
            var medicalReportDto = await GetMedicalReportAsync(input);
            result = ObjectMapper.Map(medicalReportDto);
            #region 检查类别
            var ocCheckTypeList = (await _ocCheckTypeRepository.GetQueryableAsync()).OrderBy(o => o.DisplayOrder);
            if (ocCheckTypeList.Any())
            {
                result.OcCheckTypeDtos = ocCheckTypeList.Select(s => new OccupationalDiseaseMedicalReport_OcCheckTypeDto
                {
                    DisplayName = s.DisplayName,
                    DisplayOrder = s.DisplayOrder,
                    OcCheckTypeId = s.Id,
                    SimpleCode = s.SimpleCode
                }).ToList();
            }
            #endregion
            #region 职业病基本信息
            result.PatientOccupationalDisease = new OccupationalDiseaseMedicalReport_PatientOccupationalDiseaseDto
            {
                OcCheckTypeName = patientOccupationalDiseaseEnt.ocCheckTypeName,
                AbnormalTimes = patientOccupationalDiseaseEnt.patientOccupationalDisease.AbnormalTimes,
                AbortionTimes = patientOccupationalDiseaseEnt.patientOccupationalDisease.AbortionTimes,
                ChildrenNum = patientOccupationalDiseaseEnt.patientOccupationalDisease.ChildrenNum,
                DrinkFlag = patientOccupationalDiseaseEnt.patientOccupationalDisease.DrinkFlag,
                DrinkNum = patientOccupationalDiseaseEnt.patientOccupationalDisease.DrinkNum,
                DrinkNumMax = patientOccupationalDiseaseEnt.patientOccupationalDisease.DrinkNum != null ? patientOccupationalDiseaseEnt.patientOccupationalDisease.DrinkNum.Value + 50 : null,
                DrinkYears = patientOccupationalDiseaseEnt.patientOccupationalDisease.DrinkYears,
                FirstMenstruation = patientOccupationalDiseaseEnt.patientOccupationalDisease.FirstMenstruation,
                HandleSuggestion = patientOccupationalDiseaseEnt.patientOccupationalDisease.HandleSuggestion,
                JobType = patientOccupationalDiseaseEnt.patientOccupationalDisease.JobType,
                LastMenstrualPeriodDate = DataHelper.ConversionDateShortToString(patientOccupationalDiseaseEnt.patientOccupationalDisease.LastMenstrualPeriodDate),
                MenstruationCycle = patientOccupationalDiseaseEnt.patientOccupationalDisease.MenstruationCycle,
                MenstruationEndAge = patientOccupationalDiseaseEnt.patientOccupationalDisease.MenstruationEndAge,
                MenstruationFlag = patientOccupationalDiseaseEnt.patientOccupationalDisease.MenstruationFlag,
                MenstruationTimeLength = patientOccupationalDiseaseEnt.patientOccupationalDisease.MenstruationTimeLength,
                NoOccupAbSuggestion = patientOccupationalDiseaseEnt.patientOccupationalDisease.NoOccupAbSuggestion,
                NoOccupationalAbnormal = patientOccupationalDiseaseEnt.patientOccupationalDisease.NoOccupationalAbnormal,
                OcCheckTypeId = patientOccupationalDiseaseEnt.patientOccupationalDisease.OcCheckTypeId,
                OccupationalAbnormal = patientOccupationalDiseaseEnt.patientOccupationalDisease.OccupationalAbnormal,
                OccupationalAbSuggestion = patientOccupationalDiseaseEnt.patientOccupationalDisease.OccupationalAbSuggestion,
                Other = patientOccupationalDiseaseEnt.patientOccupationalDisease.Other,
                PoisonWorkTime = patientOccupationalDiseaseEnt.patientOccupationalDisease.PoisonWorkTime,
                PrematureBirthTimes = patientOccupationalDiseaseEnt.patientOccupationalDisease.PrematureBirthTimes,
                FamilyGeneticHistory = patientOccupationalDiseaseEnt.patientOccupationalDisease.FamilyGeneticHistory,
                RiskFactors = patientOccupationalDiseaseEnt.patientOccupationalDisease.RiskFactors,
                SmokeFlag = patientOccupationalDiseaseEnt.patientOccupationalDisease.SmokeFlag,
                SmokeNum = patientOccupationalDiseaseEnt.patientOccupationalDisease.SmokeNum,
                SmokeNumMax = patientOccupationalDiseaseEnt.patientOccupationalDisease.SmokeNum != null ? patientOccupationalDiseaseEnt.patientOccupationalDisease.SmokeNum + 5 : null,
                SmokeYears = patientOccupationalDiseaseEnt.patientOccupationalDisease.SmokeYears,
                StillbirthTimes = patientOccupationalDiseaseEnt.patientOccupationalDisease.StillbirthTimes,
                TotalWorkTime = patientOccupationalDiseaseEnt.patientOccupationalDisease.TotalWorkTime
            };
            #endregion
            #region 职业史
            var patientOccupationalHistoryList = (await _patientOccupationalHistoryRepository.GetQueryableAsync()).Where(m => m.PatientRegisterId == input.PatientRegisterId)
                .OrderBy(o => o.CreationTime).ToList();
            result.PatientOccupationalHistoryDtos = patientOccupationalHistoryList.Select(s => new OccupationalDiseaseMedicalReport_PatientOccupationalHistoryDto
            {
                BeginDate = DataHelper.ConversionDateShortToString(s.BeginDate),
                EndDate = DataHelper.ConversionDateShortToString(s.EndDate),
                Org = s.Org,
                Poison = s.Poison,
                ProtectiveMeasures = s.ProtectiveMeasures,
                WorkShop = s.WorkShop,
                WorkType = s.WorkType,
                DisplayOrder = patientOccupationalHistoryList.IndexOf(s) + 1
            }).ToList();
            #endregion
            #region 毒害因素
            var patientPoisonDtoList = (from patientPoison in await _patientPoisonRepository.GetQueryableAsync()
                                        join poison in await _poisonRepository.GetQueryableAsync() on patientPoison.PoisonId equals poison.Id into poisonTemp
                                        from poisonHaveEmpty in poisonTemp.DefaultIfEmpty()
                                        join occupationalAbnormal in await _occupationalAbnormalRepository.GetQueryableAsync() on patientPoison.OccupationalAbnormalId equals occupationalAbnormal.Id into occupationalAbnormalTemp
                                        from occupationalAbnormalHaveEmpty in occupationalAbnormalTemp.DefaultIfEmpty()
                                        where patientPoison.PatientRegisterId == input.PatientRegisterId
                                        orderby patientPoison.CreationTime ascending
                                        select new
                                        {
                                            OccupationalAbnormalName = occupationalAbnormalHaveEmpty != null ? occupationalAbnormalHaveEmpty.DisplayName : "",
                                            PoisonName = poisonHaveEmpty != null ? poisonHaveEmpty.DisplayName : ""
                                        }).ToList();
            result.PatientPoisonDtos = patientPoisonDtoList.Select(s => new OccupationalDiseaseMedicalReport_PatientPoisonDto
            {
                OccupationalAbnormalName = s.OccupationalAbnormalName,
                PoisonName = s.PoisonName,
                DisplayOrder = patientPoisonDtoList.IndexOf(s) + 1
            }).ToList();
            #endregion
            #region 职业病症状
            var patientSymptomList = (from patientSymptom in await _patientSymptomRepository.GetQueryableAsync()
                                      join symptom in await _symptomRepository.GetQueryableAsync() on patientSymptom.SymptomId equals symptom.Id into symptomTemp
                                      from symptomHaveEmpty in symptomTemp.DefaultIfEmpty()
                                      where patientSymptom.PatientRegisterId == input.PatientRegisterId
                                      orderby patientSymptom.CreationTime ascending
                                      select new
                                      {
                                          patientSymptom,
                                          SymptomName = symptomHaveEmpty != null ? symptomHaveEmpty.DisplayName : ""
                                      }).ToList();
            result.PatientSymptomDtos = patientSymptomList.Select(s => new OccupationalDiseaseMedicalReport_PatientSymptomDto
            {
                Degree = s.patientSymptom.Degree,
                SymptomName = s.SymptomName,
                TimeLength = s.patientSymptom.TimeLength,
                DisplayOrder = patientSymptomList.IndexOf(s) + 1
            }).ToList();
            #endregion
            #region 职业病史
            var patientOccupationalMedicalHistoryList = (await _patientOccupationalMedicalHistoryRepository.GetQueryableAsync())
                .Where(m => m.PatientRegisterId == input.PatientRegisterId).OrderBy(o => o.CreationTime).ToList();
            result.PatientOccupationalMedicalHistoryDtos = patientOccupationalMedicalHistoryList.Select(s => new OccupationalDiseaseMedicalReport_PatientOccupationalMedicalHistoryDto
            {
                DiagnosisDate = DataHelper.ConversionDateShortToString(s.DiagnosisDate),
                DiagnosisHospital = s.DiagnosisHospital,
                IsRecovery = s.IsRecovery == 'Y' ? "治愈" : "未愈",
                OccupationalDisease = s.OccupationalDisease,
                TreatmentMethods = s.TreatmentMethods,
                DisplayOrder = patientOccupationalMedicalHistoryList.IndexOf(s) + 1
            }).ToList();
            #endregion
            #region 既往病史
            var patientPastMedicalHistoryList = (await _patientPastMedicalHistoryRepository.GetQueryableAsync())
                .Where(m => m.PatientRegisterId == input.PatientRegisterId).OrderBy(o => o.CreationTime).ToList();
            result.PatientPastMedicalHistoryDtos = patientPastMedicalHistoryList.Select(s => new OccupationalDiseaseMedicalReport_PatientOccupationalMedicalHistoryDto
            {
                DiagnosisDate = DataHelper.ConversionDateShortToString(s.DiagnosisDate),
                DiagnosisHospital = s.DiagnosisHospital,
                IsRecovery = s.IsRecovery == 'Y' ? "治愈" : "未愈",
                OccupationalDisease = s.OccupationalDisease,
                TreatmentMethods = s.TreatmentMethods,
                DisplayOrder = patientPastMedicalHistoryList.IndexOf(s) + 1
            }).ToList();
            #endregion
            return result;
        }
        /// 
        /// 打印Pacs条码数据
        /// 
        /// 
        /// 
        [HttpPost("api/app/PrintReport/getpacsnoreport")]
        public async Task> GetPacsNoReportAsync(PatientRegisterIdInputDto input)
        {
            var query = (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 itemType in await _itemTypeRepository.GetQueryableAsync() on asbitemHaveEmpty.ItemTypeId equals itemType.Id into itemTypeTemp
                         from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty()
                         where (patientRegister.Id == input.PatientRegisterId
                         && !string.IsNullOrEmpty(registerCheck.CheckRequestNo)
                         && asbitemHaveEmpty.BarcodeMode != BarcodeModeFlag.NoPrint
                         )
                         select new
                         {
                             Age = patientRegister.Age,
                             AsbitemName = asbitemHaveEmpty.DisplayName,
                             CheckRequestNo = registerCheck.CheckRequestNo,
                             RegisterCheckId = registerCheck.Id,
                             PatientName = patientRegister.PatientName,
                             PatientRegisterNo = patientRegister.PatientRegisterNo,
                             SexName = _cacheService.GetSexNameAsync(patientRegister.SexId).Result,
                             IsCheckRequest = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.IsCheckRequest : 'N',
                             BarcodeMode = asbitemHaveEmpty != null ? asbitemHaveEmpty.BarcodeMode : '0',
                             CustomerOrgId = patientRegister.CustomerOrgId,
                             MobileTelephone = patient.MobileTelephone
                         }).ToList();
            var queryGroup = query.GroupBy(g => g.CheckRequestNo);
            List pacsNoReportDtos = new List();
            foreach (var s in queryGroup)
            {
                if (s.Where(m => m.BarcodeMode == '0' && m.IsCheckRequest == 'Y').Count() > 0)
                {
                    pacsNoReportDtos.Add(new PacsNoReportDto
                    {
                        Age = s.FirstOrDefault().Age,
                        AsbitemName = string.Join(',', s.Select(s => s.AsbitemName)),
                        CheckRequestNo = s.FirstOrDefault().CheckRequestNo,
                        RegisterCheckId = s.FirstOrDefault().RegisterCheckId,
                        PatientName = s.FirstOrDefault().PatientName,
                        PatientRegisterNo = s.FirstOrDefault().PatientRegisterNo,
                        SexName = s.FirstOrDefault().SexName,
                        CustomerOrgName = _cacheService.GetTopCustomerOrgShortNameAsync(s.FirstOrDefault().CustomerOrgId).Result,
                        DepartmentName = _cacheService.GetAllDepartmentNameAsync(s.FirstOrDefault().CustomerOrgId).Result,
                        MobileTelephone = s.FirstOrDefault().MobileTelephone
                    });
                }
                else if (s.Where(m => m.BarcodeMode == '1').Count() > 0)
                {
                    pacsNoReportDtos.Add(new PacsNoReportDto
                    {
                        Age = s.FirstOrDefault().Age,
                        AsbitemName = string.Join(',', s.Select(s => s.AsbitemName)),
                        CheckRequestNo = s.FirstOrDefault().PatientRegisterNo,
                        RegisterCheckId = s.FirstOrDefault().RegisterCheckId,
                        PatientName = s.FirstOrDefault().PatientName,
                        PatientRegisterNo = s.FirstOrDefault().PatientRegisterNo,
                        SexName = s.FirstOrDefault().SexName,
                        CustomerOrgName = _cacheService.GetTopCustomerOrgShortNameAsync(s.FirstOrDefault().CustomerOrgId).Result,
                        DepartmentName = _cacheService.GetAllDepartmentNameAsync(s.FirstOrDefault().CustomerOrgId).Result,
                        MobileTelephone = s.FirstOrDefault().MobileTelephone
                    });
                }
            }
            return pacsNoReportDtos;
        }
        /// 
        ///  打印Pacs条码数据 单个条码打印
        /// 
        /// 
        /// 
        [HttpPost("api/app/PrintReport/GetPacsNoReportByCheckRequestNo")]
        public async Task GetPacsNoReportByCheckRequestNoAsync(RegisterCheckIdInputDto input)
        {
            PacsNoReportDto pacsNoReportDto = new PacsNoReportDto();
            if (input.RegisterCheckId != Guid.Empty)
            {
                var query = (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 itemType in await _itemTypeRepository.GetQueryableAsync() on asbitemHaveEmpty.ItemTypeId equals itemType.Id into itemTypeTemp
                             from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty()
                             where registerCheck.Id == input.RegisterCheckId
                             && !string.IsNullOrEmpty(registerCheck.CheckRequestNo)
                             && asbitemHaveEmpty.BarcodeMode != '2'
                             select new
                             {
                                 Age = patientRegister.Age,
                                 AsbitemName = asbitemHaveEmpty.DisplayName,
                                 CheckRequestNo = registerCheck.CheckRequestNo,
                                 PatientName = patientRegister.PatientName,
                                 PatientRegisterNo = patientRegister.PatientRegisterNo,
                                 SexName = _cacheService.GetSexNameAsync(patientRegister.SexId).Result,
                                 IsCheckRequest = itemTypeHaveEmpty != null ? itemTypeHaveEmpty.IsCheckRequest : 'N',
                                 BarcodeMode = asbitemHaveEmpty != null ? asbitemHaveEmpty.BarcodeMode : '0',
                                 CustomerOrgId = patientRegister.CustomerOrgId,
                             }).ToList();
                if (query.Count > 0)
                {
                    var queryGroup = query.GroupBy(g => g.CheckRequestNo).FirstOrDefault();
                    if (queryGroup.Where(m => m.BarcodeMode == '0' && m.IsCheckRequest == 'Y').Count() > 0)
                    {
                        pacsNoReportDto = new PacsNoReportDto
                        {
                            Age = queryGroup.FirstOrDefault().Age,
                            AsbitemName = string.Join(',', queryGroup.Select(s => s.AsbitemName)),
                            CheckRequestNo = queryGroup.FirstOrDefault().CheckRequestNo,
                            PatientName = queryGroup.FirstOrDefault().PatientName,
                            PatientRegisterNo = queryGroup.FirstOrDefault().PatientRegisterNo,
                            SexName = queryGroup.FirstOrDefault().SexName,
                            CustomerOrgName = _cacheService.GetTopCustomerOrgShortNameAsync(queryGroup.FirstOrDefault().CustomerOrgId).Result,
                            DepartmentName = _cacheService.GetAllDepartmentNameAsync(queryGroup.FirstOrDefault().CustomerOrgId).Result
                        };
                    }
                    else if (queryGroup.Where(m => m.BarcodeMode == '1').Count() > 0)
                    {
                        pacsNoReportDto = new PacsNoReportDto
                        {
                            Age = queryGroup.FirstOrDefault().Age,
                            AsbitemName = string.Join(',', queryGroup.Select(s => s.AsbitemName)),
                            CheckRequestNo = queryGroup.FirstOrDefault().PatientRegisterNo,
                            PatientName = queryGroup.FirstOrDefault().PatientName,
                            PatientRegisterNo = queryGroup.FirstOrDefault().PatientRegisterNo,
                            SexName = queryGroup.FirstOrDefault().SexName,
                            CustomerOrgName = _cacheService.GetTopCustomerOrgShortNameAsync(queryGroup.FirstOrDefault().CustomerOrgId).Result,
                            DepartmentName = _cacheService.GetAllDepartmentNameAsync(queryGroup.FirstOrDefault().CustomerOrgId).Result
                        };
                    }
                }
            }
            return pacsNoReportDto;
        }
        ///// 
        ///// 打印Pacs条码数据
        ///// 
        ///// 
        ///// 
        //[HttpPost("api/app/PrintReport/getpacsnoreport")]
        //public async Task> GetPacsNoReportAsync(Guid PatientRegisterId)
        //{
        //    var query = (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 itemType in await _itemTypeRepository.GetQueryableAsync() on asbitemHaveEmpty.ItemTypeId equals itemType.Id into itemTypeTemp
        //                 from itemTypeHaveEmpty in itemTypeTemp.DefaultIfEmpty()
        //                 where (patientRegister.Id == PatientRegisterId && itemTypeHaveEmpty.IsCheckRequest == 'Y')
        //                 select new PacsNoReportDto
        //                 {
        //                     Age = patientRegister.Age,
        //                     AsbitemName = asbitemHaveEmpty.DisplayName,
        //                     CheckRequestNo = registerCheck.CheckRequestNo,
        //                     PatientName = patientRegister.PatientName,
        //                     PatientRegisterNo = patientRegister.PatientRegisterNo,
        //                     SexName = _cacheService.GetSexNameAsync(patientRegister.SexId).Result,
        //                     CustomerOrgName = _cacheService.GetTopCustomerOrgNameAsync(patientRegister.CustomerOrgId).Result,
        //                     DepartmentName = _cacheService.GetCustomerOrgNameAsync(patientRegister.CustomerOrgId).Result
        //                 }).ToList();
        //    var entList = query.GroupBy(g => g.CheckRequestNo).Select(s => new PacsNoReportDto
        //    {
        //        Age = s.FirstOrDefault().Age,
        //        AsbitemName = string.Join(',', s.Select(s => s.AsbitemName)),
        //        CheckRequestNo = s.FirstOrDefault().CheckRequestNo,
        //        PatientName = s.FirstOrDefault().PatientName,
        //        PatientRegisterNo = s.FirstOrDefault().PatientRegisterNo,
        //        SexName = s.FirstOrDefault().SexName,
        //        CustomerOrgName = s.FirstOrDefault().CustomerOrgName,
        //        DepartmentName = s.FirstOrDefault().DepartmentName
        //    }).ToList();
        //    return entList;
        //}
        /// 
        /// 打印收费单
        /// 
        /// 收费主表ID
        /// 
        [HttpPost("api/app/PrintReport/getchargereport")]
        public async Task GetChargeReportAsync(Guid ChargeId)
        {
            return await _chargeReportRepository.GetChargeReportAsync(ChargeId);
        }
        /// 
        /// 获取体检报告人员信息
        /// 
        /// 
        /// 
        private async Task GetMedicalReportDto(PatientRegister patientRegister)
        {
            #region 系统参数配置
            var medicalCenterAddress = await _sysParmValueManager.GetSysParmValueAsync(patientRegister.MedicalCenterId, "medical_center_address");
            var medicalCenterFax = await _sysParmValueManager.GetSysParmValueAsync(patientRegister.MedicalCenterId, "medical_center_fax");
            var medicalCenterTelphone = await _sysParmValueManager.GetSysParmValueAsync(patientRegister.MedicalCenterId, "medical_center_telphone");
            #endregion
            #region 人员信息
            var medicalReportDto = new MedicalReportDto
            {
                //个人信息
                PatientRegisterId = patientRegister.Id,
                IsPersonal = 'N',
                CustomerOrgName = _cacheService.GetTopCustomerOrgAsync(patientRegister.CustomerOrgId).Result.DisplayName,
                DepartmentName = _cacheService.GetCustomerOrgAsync(patientRegister.CustomerOrgId).Result.DisplayName,
                PatientRegisterNo = patientRegister.PatientRegisterNo,
                PatientNo = patientRegister.Patient.PatientNo,
                PatientName = patientRegister.PatientName,
                IdNo = patientRegister.Patient.IdNo,
                MedicalTimes = patientRegister.MedicalTimes,
                SexName = _cacheService.GetSexNameAsync(patientRegister.SexId).Result,
                BirthDate = patientRegister.BirthDate,
                Age = patientRegister.Age,
                MaritalStatusName = _cacheService.GetMaritalStatusNameAsync(patientRegister.MaritalStatusId).Result,
                NationName = _cacheService.GetNationNameAsync(patientRegister.Patient.NationId).Result,
                MobileTelephone = patientRegister.Patient.MobileTelephone,
                IsVip = patientRegister.IsVip,
                MedicalTypeName = _cacheService.GetMedicalTypeNameAsync(patientRegister.MedicalTypeId).Result,
                PersonnelTypeName = _cacheService.GetPersonnelTypeNameAsync(patientRegister.PersonnelTypeId).Result,
                MedicalStartDate = patientRegister.MedicalStartDate,
                SummaryDoctorName = _cacheService.GetSurnameAsync(patientRegister.SummaryDoctorId).Result,
                SummaryDoctorSignUrl = _cacheService.GetUserSignAsync(patientRegister.SummaryDoctorId).GetAwaiter().GetResult(),
                SummaryDate = patientRegister.SummaryDate,
                AuditDoctorName = _cacheService.GetSurnameAsync(patientRegister.AuditDoctorId).Result,
                AuditDoctorSignUrl = _cacheService.GetUserSignAsync(patientRegister.AuditDoctorId).GetAwaiter().GetResult(),
                AuditDate = patientRegister.AuditDate,
                //体检中心信息
                MedicalCenterTelphone = medicalCenterTelphone,
                MedicalCenterAddress = medicalCenterAddress,
                MedicalCenterId = patientRegister.MedicalCenterId,
                MedicalCenterName = (await _organizationUnitRepository.GetAsync(patientRegister.MedicalCenterId)).DisplayName,
            };
            if (patientRegister.CustomerOrgId == GuidFlag.PersonCustomerOrgId)
            {
                medicalReportDto.IsPersonal = 'Y';
            }
            if (patientRegister.MedicalPackageId != null)
            {
                var medicalPackageEnt = await _medicalPackageRepository.FirstOrDefaultAsync(f => f.Id == patientRegister.MedicalPackageId);
                if (medicalPackageEnt != null)
                {
                    medicalReportDto.MedicalPackageOrCustomerOrgGroupName = medicalPackageEnt.DisplayName;
                }
            }
            else
            {
                var customerOrgGroupEnt = await _customerOrgGroupRepository.FirstOrDefaultAsync(f => f.Id == patientRegister.CustomerOrgGroupId);
                if (customerOrgGroupEnt != null)
                {
                    medicalReportDto.MedicalPackageOrCustomerOrgGroupName = customerOrgGroupEnt.DisplayName;
                }
            }
            #endregion
            return medicalReportDto;
        }
        /// 
        /// 获取体检报告综述
        /// 
        /// 
        /// 
        private async Task> GetMedicalReportSummaryDtos(PatientRegister patientRegister)
        {
            var sumSummarylist = (await _sumSummaryHeaderRepository.GetQueryableAsync())
          .Include(x => x.SumSummaryContents)
          .Where(m => m.PatientRegisterId == patientRegister.Id).OrderBy(o => o.DisplayOrder).ToList();
            var medicalReportSumSummaryDtos = new List();
            if (sumSummarylist.Any())
            {
                medicalReportSumSummaryDtos = sumSummarylist.Select(s => new MedicalReportSumSummaryDto
                {
                    SummaryTitle = s.SummaryTitle,
                    SummaryFlag = s.SummaryFlag,
                    DisplayOrder = s.DisplayOrder,
                    SummaryContents = s.SumSummaryContents.OrderBy(o => o.DisplayOrder).Select(sa => new MedicalReportSumSummaryContentDto
                    {
                        SummaryContent = sa.SummaryContent,
                        DisplayOrder = sa.DisplayOrder,
                    }).OrderBy(o => o.DisplayOrder).ToList()
                }).OrderBy(o => o.DisplayOrder).ToList();
            }
            return medicalReportSumSummaryDtos;
        }
        /// 
        /// 获取体检报告建议
        /// 
        /// 
        /// 
        private async Task> GetMedicalReportSuggestinoDtos(PatientRegister patientRegister)
        {
            var sumSuggestionlist = (await _sumSuggestionHeaderRepository.GetQueryableAsync())
          .Include(x => x.SumSuggestionContents)
          .Where(m => m.PatientRegisterId == patientRegister.Id).OrderBy(o => o.DisplayOrder).ToList();
            var medicalReportSumSuggestionDtos = new List();
            if (sumSuggestionlist.Any())
            {
                medicalReportSumSuggestionDtos = sumSuggestionlist.Select(s => new MedicalReportSumSuggestionDto
                {
                    SuggestionTitle = s.SuggestionTitle,
                    SuggestionFlag = s.SuggestionFlag,
                    DisplayOrder = s.DisplayOrder,
                    MedicalInterpretations = s.SumSuggestionContents.
                    Where(o => o.SuggestionType == SuggestionTypeFlag.MedicalInterpretation && !string.IsNullOrWhiteSpace(o.SuggestionContent))
                    .OrderBy(o => o.DisplayOrder)
                    .Select(sa => new MedicalReportSumSuggestionContentDto
                    {
                        SuggestionContent = sa.SuggestionContent,
                        DisplayOrder = sa.DisplayOrder,
                    }).OrderBy(o => o.DisplayOrder).ToList(),
                    CommonReasons = s.SumSuggestionContents.
                    Where(o => o.SuggestionType == SuggestionTypeFlag.CommonReasons && !string.IsNullOrWhiteSpace(o.SuggestionContent))
                    .OrderBy(o => o.DisplayOrder)
                    .Select(sa => new MedicalReportSumSuggestionContentDto
                    {
                        SuggestionContent = sa.SuggestionContent,
                        DisplayOrder = sa.DisplayOrder,
                    }).OrderBy(o => o.DisplayOrder).ToList(),
                    HealthGuidances = s.SumSuggestionContents.
                    Where(o => o.SuggestionType == SuggestionTypeFlag.HealthGuidance && !string.IsNullOrWhiteSpace(o.SuggestionContent))
                    .OrderBy(o => o.DisplayOrder)
                    .Select(sa => new MedicalReportSumSuggestionContentDto
                    {
                        SuggestionContent = sa.SuggestionContent,
                        DisplayOrder = sa.DisplayOrder,
                    }).OrderBy(o => o.DisplayOrder).ToList()
                })
                .OrderBy(o => o.DisplayOrder).ToList();
            }
            return medicalReportSumSuggestionDtos;
        }
        /// 
        ///  获取体检报告明细结果
        /// 
        /// 
        /// 
        /// 
        private async Task SetMedicalReportRegisterChecks(PatientRegister patientRegister, MedicalReportDto medicalReportDto)
        {
            var resultStatusList = (await _resultStatusRepository.GetListAsync());
            //获取体检报告类别
            medicalReportDto.MedicalReportTypes = await GetMedicalReportTypeList();
            //获取项目类别
            medicalReportDto.ItemTypes = await GetItemTypeList();
            var registerChecklist = (from registerCheck in await _registerCheckRepository.GetQueryableAsync()
                                     join registerAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync()
                                     on registerCheck.Id equals registerAsbitem.RegisterCheckId
                                     join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync()
                                     on registerCheck.Id equals registerCheckItem.RegisterCheckId
                                     join registerCheckPicture in await _registerCheckPictureRepository.GetQueryableAsync()
                                     on registerCheck.Id equals registerCheckPicture.RegisterCheckId into registerCheckPictureExist
                                     from registerCheckPictureHaveEmpty in registerCheckPictureExist.DefaultIfEmpty()
                                     join registerCheckSummary in await _registerCheckSummaryRepository.GetQueryableAsync()
                                     on registerCheck.Id equals registerCheckSummary.RegisterCheckId into registerCheckSummaryExist
                                     from registerCheckSummaryHaveEmpty in registerCheckSummaryExist.DefaultIfEmpty()
                                     join asbitem in await _asbitemRepository.GetQueryableAsync()
                                      on registerAsbitem.AsbitemId equals asbitem.Id
                                     join item in await _itemRepository.GetQueryableAsync()
                                     on registerCheckItem.ItemId equals item.Id
                                     join itemType in await _itemTypeRepository.GetQueryableAsync()
                                     on asbitem.ItemTypeId equals itemType.Id
                                     join medicalReportType in await _medicalReportTypeRepository.GetQueryableAsync()
                                     on itemType.MedicalReportTypeId equals medicalReportType.Id
                                     where (registerCheck.PatientRegisterId == patientRegister.Id
                                           && registerCheck.CompleteFlag == RegisterCheckCompleteFlag.Checked)
                                     select new
                                     {
                                         registerCheck,
                                         registerAsbitem,
                                         registerCheckItem,
                                         registerCheckPictureHaveEmpty,
                                         registerCheckSummaryHaveEmpty,
                                         asbitem,
                                         item,
                                         itemType,
                                         medicalReportType
                                     })
                                      .OrderBy(o => o.registerCheck.Id)
                                      .ToList();
            var registerCheckIds = registerChecklist.Select(o => o.registerCheck.Id).Distinct().ToList();
            #region 获取采样时间
            var samplerList = (from registerCheck in await _registerCheckRepository.GetQueryableAsync()
                               join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
                               join lisRequest in await _lisRequestRepository.GetQueryableAsync() on registerCheckAsbitem.LisRequestId equals lisRequest.Id
                               where registerCheckIds.Contains(registerCheck.Id)
                               select new
                               {
                                   registerCheckId = registerCheck.Id,
                                   samplerId = lisRequest.SamplerId,
                                   samplingTime = lisRequest.SamplingTime
                               }).ToList();
            #endregion
            foreach (var registerCheckId in registerCheckIds)
            {
                var registerCheckRows = registerChecklist.Where(o => o.registerCheck.Id == registerCheckId).ToList();
                //隐藏隐私项目
                if (registerCheckRows.Where(m => m.asbitem.IsPrivacy == 'Y').Count() > 0)
                {
                    continue;
                }
                var registerCheckRow = registerCheckRows.First();
                var medicalReportRegisterCheckDto = new MedicalReportRegisterCheckDto()
                {
                    ItemTypeId = registerCheckRow.itemType.Id,
                    AsbitemNames = string.Join(",", registerCheckRows.
                                     GroupBy(o => o.asbitem.Id).
                                     Select(d => d.First().asbitem.DisplayName
                                     )
                                     .ToList()
                                     ),
                    CheckDate = (DateTime)registerCheckRow.registerCheck.CheckDate,
                };
                #region 采样信息
                var sampler = samplerList.FirstOrDefault(f => f.registerCheckId == registerCheckId);
                if (sampler != null)
                {
                    medicalReportRegisterCheckDto.SamplerName = _cacheService.GetSurnameAsync(sampler.samplerId).Result;
                    medicalReportRegisterCheckDto.SamplingTime = DataHelper.ConversionDateShortToString(sampler.samplingTime);
                }
                #endregion
                //检查医生
                var checkDoctorId = registerCheckRow.registerCheck.CheckDoctorId;
                if (!string.IsNullOrWhiteSpace(checkDoctorId))
                {
                    if (Guid.TryParse(checkDoctorId, out var checkDoctorIdGuid))
                    {
                        medicalReportRegisterCheckDto.CheckDoctorName = _cacheService.GetSurnameAsync(checkDoctorIdGuid).Result;
                        medicalReportRegisterCheckDto.CheckDoctorSignUrl = _cacheService.GetUserSignAsync(checkDoctorIdGuid).Result;
                    }
                    else
                    {
                        medicalReportRegisterCheckDto.CheckDoctorName = checkDoctorId;
                        medicalReportRegisterCheckDto.CheckDoctorSignUrl = "";
                    }
                }
                //lis审核医生+标本号
                medicalReportRegisterCheckDto.LisSampleNo = registerCheckRow.registerCheck.LisSampleNo;
                // medicalReportRegisterCheckDto.LisAuditorDoctorName = registerCheckRow.registerCheck.LisAuditorDoctorName;
                //lis审核医生
                var auditorNameId = registerCheckRow.registerCheck.AuditorName;
                if (!string.IsNullOrWhiteSpace(auditorNameId))
                {
                    if (Guid.TryParse(auditorNameId, out var auditorNameIdGuid))
                    {
                        medicalReportRegisterCheckDto.AuditorName = _cacheService.GetSurnameAsync(auditorNameIdGuid).Result;
                        medicalReportRegisterCheckDto.AuditorNameSignUrl = _cacheService.GetUserSignAsync(auditorNameIdGuid).Result;
                    }
                    else
                    {
                        medicalReportRegisterCheckDto.AuditorName = auditorNameId;
                        medicalReportRegisterCheckDto.AuditorNameSignUrl = "";
                    }
                }
                //显示顺序
                medicalReportRegisterCheckDto.DisplayOrder = registerCheckRow.asbitem.DisplayOrder;
                //明细结果
                foreach (var registerCheckItemRow in registerCheckRows)
                {
                    if (medicalReportRegisterCheckDto.Items.
                        Where(o => o.ItemId == registerCheckItemRow.registerCheckItem.ItemId).Count() > 0)
                    {
                        continue;
                    }
                    var resultStatus = resultStatusList.Where(o => o.Id == registerCheckItemRow.registerCheckItem.ResultStatusId).FirstOrDefault();
                    var medicalReportCheckItemDto = new MedicalReportCheckItemDto()
                    {
                        ItemId = registerCheckItemRow.registerCheckItem.ItemId,
                        ItemName = registerCheckItemRow.item.DisplayName,
                        Result = registerCheckItemRow.registerCheckItem.Result,
                        ReferenceRangeValue = registerCheckItemRow.registerCheckItem.ReferenceRangeValue,
                        CriticalRangeValue = registerCheckItemRow.registerCheckItem.CriticalRangeValue,
                        Unit = registerCheckItemRow.registerCheckItem.Unit,
                        ReportFontColor = (resultStatus == null) ? 0 : resultStatus.ReportFontColor,
                        ReportBackgroundColor = (resultStatus == null) ? 16579836 : resultStatus.ReportBackgroundColor,
                        ReportPrompt = (resultStatus == null) ? null : resultStatus.ReportPrompt,
                        DisplayOrder = registerCheckItemRow.item.DisplayOrder,
                    };
                    medicalReportRegisterCheckDto.Items.Add(medicalReportCheckItemDto);
                }
                //小结
                //medicalReportRegisterCheckDto.Summarys = registerCheckRows.Select(o => new MedicalReportCheckAsbitemSummaryDto()
                //{
                //    Summary = o.registerCheckSummaryHaveEmpty.Summary,
                //    DisplayOrder = o.registerCheckSummaryHaveEmpty.DisplayOrder
                //}).OrderBy(o => o.DisplayOrder).Distinct().ToList();
                medicalReportRegisterCheckDto.Summarys = registerCheckRows.Where(o => o.registerCheckSummaryHaveEmpty != null)
                    .GroupBy(g => g.registerCheckSummaryHaveEmpty.Id)
                    .Select(o => new MedicalReportCheckAsbitemSummaryDto()
                    {
                        Summary = o.FirstOrDefault().registerCheckSummaryHaveEmpty.Summary,
                        DisplayOrder = o.FirstOrDefault().registerCheckSummaryHaveEmpty.DisplayOrder
                    }).OrderBy(o => o.DisplayOrder).Distinct().ToList();
                //图片
                var registerCheckPictures = registerCheckRows.Where(o => o.registerCheckPictureHaveEmpty != null &&
                           o.registerCheckPictureHaveEmpty.IsPrint == 'Y')
                    .Select(o => new
                    {
                        PictureFilename = o.registerCheckPictureHaveEmpty.PictureFilename,
                        DisplayOrder = o.registerCheckPictureHaveEmpty.DisplayOrder,
                        PictureFileType = o.registerCheckPictureHaveEmpty.PictureFileType,
                        ItemTypeName = o.itemType.DisplayName
                    }).OrderBy(o => o.DisplayOrder).Distinct().ToList();
                foreach (var registerCheckPicture in registerCheckPictures)
                {
                    var medicalReportCheckPictureDto = new MedicalReportCheckPictureDto();
                    medicalReportCheckPictureDto.PictureFileName = registerCheckPicture.PictureFilename;
                    //medicalReportCheckPictureDto.PictureBase64 =
                    //    Shentun.Utilities.FileHelper.ToBase64(registerCheckPicture.PictureFilename);
                    medicalReportCheckPictureDto.DisplayOrder = registerCheckPicture.DisplayOrder;
                    medicalReportCheckPictureDto.PictureFileType = registerCheckPicture.PictureFileType;
                    medicalReportCheckPictureDto.ItemTypeName = registerCheckPicture.ItemTypeName;
                    medicalReportRegisterCheckDto.Pictures.Add(medicalReportCheckPictureDto);
                }
                medicalReportDto.RegisterChecks.Add(medicalReportRegisterCheckDto);
            }
        }
        /// 
        /// 获取项目类别
        /// 
        /// 
        private async Task> GetItemTypeList()
        {
            var itemTypes = await _itemTypeRepository.GetListAsync();
            var medicalReportItemTypeDtos = new List();
            foreach (var itemType in itemTypes)
            {
                var medicalReportItemTypeDto = new MedicalReportItemTypeDto()
                {
                    MedicalReportTypeId = itemType.MedicalReportTypeId,
                    ItemTypeId = itemType.Id,
                    ItemTypeName = itemType.DisplayName,
                    ItemTypePathCode = itemType.PathCode,
                    DisplayOrder = itemType.DisplayOrder,
                };
                medicalReportItemTypeDtos.Add(medicalReportItemTypeDto);
            }
            return medicalReportItemTypeDtos;
        }
        /// 
        /// 获取体检报告类别
        /// 
        /// 
        private async Task> GetMedicalReportTypeList()
        {
            var medicalReportTypes = (await _medicalReportTypeRepository.GetListAsync()).OrderBy(o => o.DisplayOrder);
            var MedicalReportMedicalReportTypeDtos = new List();
            foreach (var medicalReportType in medicalReportTypes)
            {
                MedicalReportMedicalReportTypeDtos.Add(new MedicalReportMedicalReportTypeDto()
                {
                    MedicalReportTypeId = medicalReportType.Id,
                    MedicalReportTypeName = medicalReportType.DisplayName,
                    DisplayOrder = medicalReportType.DisplayOrder,
                });
            }
            return MedicalReportMedicalReportTypeDtos;
        }
        private static List PatientRegisterGuideAsbitem(Guid PatientRegisterId, string PatientRegisterNo, Guid medicalCenterId, char SexId)
        {
            var entlist = _registerCheckAsbitemStaticRepository.GetQueryableAsync().Result
            .Include(x => x.Asbitem.ItemType)
            .Include(x => x.Asbitem.ItemType.GuidType)
            .Include(x => x.RegisterCheck)
            .Where(m => m.PatientRegisterId == PatientRegisterId && m.Asbitem.IsCheck == 'Y')
            .Select(s => new PatientRegisterGuideReport_Asbitem_Temp
            {
                AsbitemName = s.Asbitem.DisplayName,
                AsbitemGuide = _asbitemGuideManager.GetAsbitemGuideConvertSexId(medicalCenterId, s.AsbitemId, SexId),
                AsbitemDisplayOrder = s.Asbitem.DisplayOrder,
                ItemTypeDisplayOrder = s.Asbitem.ItemType.DisplayOrder,
                GuideDisplayOrder = s.Asbitem.ItemType.GuidType.DisplayOrder,
                GuideName = s.Asbitem.ItemType.GuidType.DisplayName,
                CheckRequestNo = GetCheckRequestNobyAsbitem(s.Asbitem, PatientRegisterNo, s.RegisterCheck.CheckRequestNo, s.Asbitem.ItemType.IsCheckRequest)
            })
            .OrderBy(o => o.GuideDisplayOrder)
            .GroupBy(g => new { g.GuideName, g.GuideDisplayOrder })
            .Select(s => new PatientRegisterGuideReport_Detail
            {
                GuideName = s.Key.GuideName,
                AsbitemCount = s.Count(),
                DisplayOrder = s.Key.GuideDisplayOrder,
                Detail_Name = s.ToList().Select(ss => new PatientRegisterGuideReport_Detail_Asbitem
                {
                    AsbitemName = ss.AsbitemName,
                    AsbitemGuide = ss.AsbitemGuide,
                    DisplayOrder = (ss.ItemTypeDisplayOrder * 3000) + ss.AsbitemDisplayOrder,
                    CheckRequestNo = ss.CheckRequestNo
                }).OrderBy(o => o.DisplayOrder).ToList()
            }).OrderBy(o => o.DisplayOrder).ToList();
            return entlist;
        }
        /// 
        /// 获取检查单号
        /// 
        /// 
        private static string GetCheckRequestNobyAsbitem(Asbitem asbitem, string PatientRegisterNo, string CheckRequestNo, char IsCheckRequest)
        {
            string result = "";
            if (asbitem.BarcodeMode == BarcodeModeFlag.UsingItemType && IsCheckRequest == 'Y')
            {
                result = CheckRequestNo;
            }
            else if (asbitem.BarcodeMode == BarcodeModeFlag.PrintPatientRegisterNumber)
            {
                result = PatientRegisterNo;
            }
            return result;
        }
        /// 
        /// 获取项目结果对比
        /// 
        /// 
        /// 
        private async Task> GetMedicalReportItemContrastListAsync(PatientRegister newPatientRegister)
        {
            var query = (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
                         join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckItem.RegisterCheckId
                         join item in await _itemRepository.GetQueryableAsync() on registerCheckItem.ItemId equals item.Id
                         where patientRegister.PatientId == newPatientRegister.PatientId
                         && item.IsReportContrast == 'Y'
                         && patientRegister.MedicalStartDate != null
                         && patientRegister.MedicalStartDate >= newPatientRegister.MedicalStartDate.Value.AddYears(-3)
                         select new
                         {
                             registerCheckItem,
                             itemName = item.DisplayName,
                             medicalStartDate = patientRegister.MedicalStartDate,
                             asbitemName = asbitem.DisplayName
                         }).ToList();
            var entListDto = query.GroupBy(g => g.registerCheckItem)
                .Select(s => new MedicalReportItemContrastDto
                {
                    AsbitemName = string.Join(",", s.Select(s => s.asbitemName).Distinct()),
                    ItemName = s.FirstOrDefault().itemName,
                    ItemReferenceRange = s.Key.ReferenceRangeValue,
                    ItemResult = s.Key.Result,
                    MedicalStartDate = DataHelper.ConversionDateShortNoSymbolToString(s.FirstOrDefault().medicalStartDate)
                }).ToList();
            foreach (var item in entListDto)
            {
                decimal resultDecimal;
                if (!decimal.TryParse(item.ItemResult, out resultDecimal))
                {
                    item.ItemResult = "0";
                }
            }
            return entListDto;
        }
    }
}