You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							574 lines
						
					
					
						
							33 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							574 lines
						
					
					
						
							33 KiB
						
					
					
				
								using Microsoft.AspNetCore.Authorization;
							 | 
						|
								using Microsoft.AspNetCore.Mvc;
							 | 
						|
								using Shentun.WebPeis.AppointRegisterAsbitems;
							 | 
						|
								using Shentun.WebPeis.CustomerOrgs;
							 | 
						|
								using Shentun.WebPeis.Enums;
							 | 
						|
								using Shentun.WebPeis.MedicalPackages;
							 | 
						|
								using Shentun.WebPeis.Models;
							 | 
						|
								using Shentun.WebPeis.OrganizationUnits;
							 | 
						|
								using Shentun.WebPeis.PatientRegisters;
							 | 
						|
								using Shentun.WebPeis.Persons;
							 | 
						|
								using System;
							 | 
						|
								using System.Collections;
							 | 
						|
								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 static Volo.Abp.Identity.Settings.IdentitySettingNames;
							 | 
						|
								
							 | 
						|
								namespace Shentun.WebPeis.AppointPatientRegisters
							 | 
						|
								{
							 | 
						|
								    /// <summary>
							 | 
						|
								    /// 微信预约
							 | 
						|
								    /// </summary>
							 | 
						|
								    [ApiExplorerSettings(GroupName = "Work")]
							 | 
						|
								    [Authorize]
							 | 
						|
								    public class AppointPatientRegisterAppService : ApplicationService
							 | 
						|
								    {
							 | 
						|
								        private readonly IRepository<AppointPatientRegister> _repository;
							 | 
						|
								        private readonly IRepository<AppointRegisterAsbitem> _appointRegisterAsbitemRepository;
							 | 
						|
								        private readonly IRepository<Person> _personRepository;
							 | 
						|
								        private readonly IRepository<CustomerOrg> _customerOrgRepository;
							 | 
						|
								        private readonly IRepository<IdentityUser> _identityUserRepository;
							 | 
						|
								        private readonly IRepository<Asbitem> _asbitemRepository;
							 | 
						|
								        private readonly IRepository<ItemType> _itemTypeRepository;
							 | 
						|
								        private readonly IRepository<MedicalPackage> _medicalPackageRepository;
							 | 
						|
								        private readonly IRepository<MedicalPackageDetail> _medicalPackageDetailRepository;
							 | 
						|
								        private readonly IRepository<CustomerOrgGroup> _customerOrgGroupRepository;
							 | 
						|
								        private readonly IRepository<CustomerOrgGroupDetail> _customerOrgGroupDetailRepository;
							 | 
						|
								        private readonly CacheService _cacheService;
							 | 
						|
								        private readonly AppointPatientRegisterManager _appointPatientRegisterManager;
							 | 
						|
								        private readonly CustomerOrgManager _customerOrgManager;
							 | 
						|
								        private readonly WebPeisOrganizationUnitManager _webPeisOrganizationUnitManager;
							 | 
						|
								        private readonly IRepository<PatientRegister> _patientRegisterRepository;
							 | 
						|
								        private readonly IRepository<Patient> _patientRepository;
							 | 
						|
								        private readonly IRepository<RegisterCheck> _registerCheckRepository;
							 | 
						|
								        private readonly IRepository<RegisterCheckAsbitem> _registerCheckAsbitemRepository;
							 | 
						|
								        public AppointPatientRegisterAppService(IRepository<AppointPatientRegister> repository,
							 | 
						|
								             CacheService cacheService,
							 | 
						|
								             IRepository<ItemType> itemTypeRepository,
							 | 
						|
								             AppointPatientRegisterManager appointPatientRegisterManager,
							 | 
						|
								             IRepository<AppointRegisterAsbitem> appointRegisterAsbitemRepository,
							 | 
						|
								             IRepository<Person> personRepository,
							 | 
						|
								             IRepository<IdentityUser> identityUserRepository,
							 | 
						|
								             CustomerOrgManager customerOrgManager,
							 | 
						|
								             IRepository<MedicalPackage> medicalPackageRepository,
							 | 
						|
								             IRepository<CustomerOrgGroup> customerOrgGroupRepository,
							 | 
						|
								             IRepository<Asbitem> asbitemRepository,
							 | 
						|
								             IRepository<CustomerOrg> customerOrgRepository,
							 | 
						|
								             IRepository<MedicalPackageDetail> medicalPackageDetailRepository,
							 | 
						|
								             IRepository<CustomerOrgGroupDetail> customerOrgGroupDetailRepository,
							 | 
						|
								             WebPeisOrganizationUnitManager webPeisOrganizationUnitManager,
							 | 
						|
								             IRepository<PatientRegister> patientRegisterRepository,
							 | 
						|
								             IRepository<Patient> patientRepository,
							 | 
						|
								             IRepository<RegisterCheck> registerCheckRepository,
							 | 
						|
								             IRepository<RegisterCheckAsbitem> registerCheckAsbitemRepository
							 | 
						|
								           )
							 | 
						|
								        {
							 | 
						|
								            _repository = repository;
							 | 
						|
								            _cacheService = cacheService;
							 | 
						|
								            _itemTypeRepository = itemTypeRepository;
							 | 
						|
								            _appointPatientRegisterManager = appointPatientRegisterManager;
							 | 
						|
								            _appointRegisterAsbitemRepository = appointRegisterAsbitemRepository;
							 | 
						|
								            _personRepository = personRepository;
							 | 
						|
								            _identityUserRepository = identityUserRepository;
							 | 
						|
								            _customerOrgManager = customerOrgManager;
							 | 
						|
								            _medicalPackageRepository = medicalPackageRepository;
							 | 
						|
								            _customerOrgGroupRepository = customerOrgGroupRepository;
							 | 
						|
								            _asbitemRepository = asbitemRepository;
							 | 
						|
								            _customerOrgRepository = customerOrgRepository;
							 | 
						|
								            _medicalPackageDetailRepository = medicalPackageDetailRepository;
							 | 
						|
								            _customerOrgGroupDetailRepository = customerOrgGroupDetailRepository;
							 | 
						|
								            _webPeisOrganizationUnitManager = webPeisOrganizationUnitManager;
							 | 
						|
								            _patientRegisterRepository = patientRegisterRepository;
							 | 
						|
								            _patientRepository = patientRepository;
							 | 
						|
								            _registerCheckAsbitemRepository = registerCheckAsbitemRepository;
							 | 
						|
								            _registerCheckRepository = registerCheckRepository;
							 | 
						|
								
							 | 
						|
								        }
							 | 
						|
								        /// <summary>
							 | 
						|
								        /// 预约,小程序使用
							 | 
						|
								        /// </summary>
							 | 
						|
								        /// <param name="input"></param>
							 | 
						|
								        /// <returns></returns>
							 | 
						|
								        /// <exception cref="UserFriendlyException"></exception>
							 | 
						|
								        [HttpPost("api/app/AppointPatientRegister/Create")]
							 | 
						|
								        public async Task<AppointPatientRegisterDto> CreateAsync(CreateAppointPatientRegisterDto input)
							 | 
						|
								        {
							 | 
						|
								            var entity = ObjectMapper.Map<CreateAppointPatientRegisterDto, AppointPatientRegister>(input);
							 | 
						|
								            var asbitems = ObjectMapper.Map<List<CreateAppointRegisterAsbitemDto>, List<AppointRegisterAsbitem>>(input.Asbitems);
							 | 
						|
								            entity.AppointRegisterAsbitems = asbitems;
							 | 
						|
								
							 | 
						|
								            Guid medicalCenterId;
							 | 
						|
								            if (input.MedicalCenterId == null || input.MedicalCenterId == Guid.Empty)
							 | 
						|
								            {
							 | 
						|
								                var webPeisOrganizationUnit = await _webPeisOrganizationUnitManager.GetMedicalCenterListAsync();
							 | 
						|
								                if (webPeisOrganizationUnit.Count > 1 || webPeisOrganizationUnit.Count == 0)
							 | 
						|
								                {
							 | 
						|
								                    throw new UserFriendlyException("体检中心参数不能为空");
							 | 
						|
								                }
							 | 
						|
								                medicalCenterId = webPeisOrganizationUnit.First().Id;
							 | 
						|
								            }
							 | 
						|
								            else
							 | 
						|
								            {
							 | 
						|
								                medicalCenterId = (Guid)input.MedicalCenterId;
							 | 
						|
								            }
							 | 
						|
								            entity.MedicalCenterId = medicalCenterId;
							 | 
						|
								
							 | 
						|
								            entity = await _appointPatientRegisterManager.CreateAsync(entity);
							 | 
						|
								            await _repository.InsertAsync(entity);
							 | 
						|
								            var result = ObjectMapper.Map<AppointPatientRegister, AppointPatientRegisterDto>(entity);
							 | 
						|
								            return result;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        /// <summary>
							 | 
						|
								        /// 通过手机号等获取预约列表信息,体检程序前台登记使用
							 | 
						|
								        /// </summary>
							 | 
						|
								        /// <param name="input"></param>
							 | 
						|
								        /// <returns></returns>
							 | 
						|
								        /// <exception cref="UserFriendlyException"></exception>
							 | 
						|
								        [AllowAnonymous]
							 | 
						|
								        [HttpPost("api/app/AppointPatientRegister/GetListByFilter")]
							 | 
						|
								        public async Task<List<AppointPatientRegisterDto>> GetListByFilterAsync(AppointPatientRegisterInputDto input)
							 | 
						|
								        {
							 | 
						|
								            if (input == null) throw new UserFriendlyException("参数不能为空");
							 | 
						|
								
							 | 
						|
								            Guid medicalCenterId;
							 | 
						|
								            if (input.MedicalCenterId == null || input.MedicalCenterId == Guid.Empty)
							 | 
						|
								            {
							 | 
						|
								                var webPeisOrganizationUnit = await _webPeisOrganizationUnitManager.GetMedicalCenterListAsync();
							 | 
						|
								                if (webPeisOrganizationUnit.Count > 1 || webPeisOrganizationUnit.Count == 0)
							 | 
						|
								                {
							 | 
						|
								                    throw new UserFriendlyException("体检中心参数不能为空");
							 | 
						|
								                }
							 | 
						|
								                medicalCenterId = webPeisOrganizationUnit.First().Id;
							 | 
						|
								            }
							 | 
						|
								            else
							 | 
						|
								            {
							 | 
						|
								                medicalCenterId = (Guid)input.MedicalCenterId;
							 | 
						|
								            }
							 | 
						|
								            if (input.AppointStartDate == null)
							 | 
						|
								            {
							 | 
						|
								                input.AppointStartDate = DateTime.Now.Date;
							 | 
						|
								            }
							 | 
						|
								            else
							 | 
						|
								            {
							 | 
						|
								                input.AppointStartDate = ((DateTime)input.AppointStartDate).Date;
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            if (input.AppointStopDate == null)
							 | 
						|
								            {
							 | 
						|
								                input.AppointStopDate = DateTime.Now.Date.AddDays(3650);
							 | 
						|
								            }
							 | 
						|
								            else
							 | 
						|
								            {
							 | 
						|
								                input.AppointStopDate = ((DateTime)input.AppointStopDate).Date.AddDays(1);
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            if (string.IsNullOrWhiteSpace(input.MobilePhone) && string.IsNullOrWhiteSpace(input.IdNo))
							 | 
						|
								            {
							 | 
						|
								                throw new UserFriendlyException("手机号和身份证必须至少填一个");
							 | 
						|
								            }
							 | 
						|
								            var query = (from user in await _identityUserRepository.GetQueryableAsync()
							 | 
						|
								                         join person in await _personRepository.GetQueryableAsync()
							 | 
						|
								                         on user.Id equals person.PersonId
							 | 
						|
								                         join appointPatientRegister in await _repository.GetQueryableAsync()
							 | 
						|
								                         on person.PersonId equals appointPatientRegister.PersonId
							 | 
						|
								                         join medicalPackage in await _medicalPackageRepository.GetQueryableAsync()
							 | 
						|
								                         on appointPatientRegister.MedicalPackageId equals medicalPackage.MedicalPackageId into canEmptyMedicalPackage
							 | 
						|
								                         from haveMedicalPackage in canEmptyMedicalPackage.DefaultIfEmpty()
							 | 
						|
								                         join customerOrgGroup in await _customerOrgGroupRepository.GetQueryableAsync()
							 | 
						|
								                         on appointPatientRegister.CustomerOrgGroupId equals customerOrgGroup.CustomerOrgGroupId into canEmptyCustomerOrgGroup
							 | 
						|
								                         from haveCustomerOrgGroup in canEmptyCustomerOrgGroup.DefaultIfEmpty()
							 | 
						|
								                         join appointRegisterAsbitem in await _appointRegisterAsbitemRepository.GetQueryableAsync()
							 | 
						|
								                         on appointPatientRegister.AppointPatientRegisterId equals appointRegisterAsbitem.AppointPatientRegisterId
							 | 
						|
								                         join asbitem in await _asbitemRepository.GetQueryableAsync()
							 | 
						|
								                         on appointRegisterAsbitem.AsbitemId equals asbitem.AsbitemId
							 | 
						|
								                         join customerOrg in await _customerOrgRepository.GetQueryableAsync()
							 | 
						|
								                         on appointPatientRegister.CustomerOrgId equals customerOrg.CustomerOrgId
							 | 
						|
								                         where appointPatientRegister.MedicalCenterId == medicalCenterId &&
							 | 
						|
								                            appointPatientRegister.AppointDate >= input.AppointStartDate &&
							 | 
						|
								                            appointPatientRegister.AppointDate < input.AppointStopDate
							 | 
						|
								                         orderby appointPatientRegister.AppointDate
							 | 
						|
								                         select new
							 | 
						|
								                         {
							 | 
						|
								                             user,
							 | 
						|
								                             person,
							 | 
						|
								                             appointPatientRegister,
							 | 
						|
								                             appointRegisterAsbitem,
							 | 
						|
								                             asbitem,
							 | 
						|
								                             haveMedicalPackage,
							 | 
						|
								                             haveCustomerOrgGroup,
							 | 
						|
								                             customerOrg
							 | 
						|
								                         }
							 | 
						|
								                         );
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            if (!string.IsNullOrWhiteSpace(input.IdNo))
							 | 
						|
								            {
							 | 
						|
								                if (input.IdNo.Length != 18)
							 | 
						|
								                {
							 | 
						|
								                    throw new UserFriendlyException("身份证长度必须是18位");
							 | 
						|
								                }
							 | 
						|
								                query = query.Where(o => o.person.IdNo == input.IdNo);
							 | 
						|
								
							 | 
						|
								            }
							 | 
						|
								            else
							 | 
						|
								            {
							 | 
						|
								                if (input.MobilePhone.Length != 11)
							 | 
						|
								                {
							 | 
						|
								                    throw new UserFriendlyException("手机号长度必须是11位");
							 | 
						|
								                }
							 | 
						|
								                query = query.Where(o => o.user.PhoneNumber == input.MobilePhone);
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            if(input.CompleteFlag != null)
							 | 
						|
								            {
							 | 
						|
								                query = query.Where(o => o.appointPatientRegister.CompleteFlag == input.CompleteFlag);
							 | 
						|
								            }
							 | 
						|
								            var appointPatientRegisterDtos = query.ToList();
							 | 
						|
								
							 | 
						|
								            var list = appointPatientRegisterDtos.GroupBy(o => o.appointPatientRegister)
							 | 
						|
								                  .Select(o => new AppointPatientRegisterDto()
							 | 
						|
								                  {
							 | 
						|
								                      AppointPatientRegisterId = o.FirstOrDefault().appointPatientRegister.AppointPatientRegisterId,
							 | 
						|
								                      PersonId = o.FirstOrDefault().appointPatientRegister.PersonId,
							 | 
						|
								                      PersonName = o.FirstOrDefault().user.Name,
							 | 
						|
								                      IdNo = o.FirstOrDefault().person.IdNo,
							 | 
						|
								                      MobileTelephone = o.FirstOrDefault().user.PhoneNumber,
							 | 
						|
								                      SexId = o.FirstOrDefault().person.SexId,
							 | 
						|
								                      MaritalStatusId = o.FirstOrDefault().person.MaritalStatusId,
							 | 
						|
								                      CustomerOrgId = o.FirstOrDefault().appointPatientRegister.CustomerOrgId,
							 | 
						|
								                      ChildCustomerOrgName = o.FirstOrDefault().customerOrg.PathCode.Length == 5 ? "" : o.FirstOrDefault().customerOrg.CustomerOrgName,
							 | 
						|
								                      CustomerOrgGroupId = o.FirstOrDefault().appointPatientRegister.CustomerOrgGroupId,
							 | 
						|
								                      CustomerOrgGroupName = o.FirstOrDefault().haveCustomerOrgGroup == null ? "" : o.FirstOrDefault().haveCustomerOrgGroup.CustomerOrgGroupName,
							 | 
						|
								                      CustomerOrgRegisterId = o.FirstOrDefault().appointPatientRegister.CustomerOrgRegisterId,
							 | 
						|
								                      MedicalPackageId = o.FirstOrDefault().appointPatientRegister.MedicalPackageId,
							 | 
						|
								                      MedicalPackageName = o.FirstOrDefault().haveMedicalPackage == null ? "" : o.FirstOrDefault().haveMedicalPackage.MedicalPackageName,
							 | 
						|
								                      MedicalCenterId = o.FirstOrDefault().appointPatientRegister.MedicalCenterId,
							 | 
						|
								                      CompleteFlag = o.FirstOrDefault().appointPatientRegister.CompleteFlag,
							 | 
						|
								                      IsCharge = o.FirstOrDefault().appointPatientRegister.IsCharge,
							 | 
						|
								                      AppointDate = o.FirstOrDefault().appointPatientRegister.AppointDate,
							 | 
						|
								                      Remark = o.FirstOrDefault().appointPatientRegister.Remark,
							 | 
						|
								                      PregnantFlag = o.FirstOrDefault().appointPatientRegister.PregnantFlag,
							 | 
						|
								                      Height = o.FirstOrDefault().appointPatientRegister.Height,
							 | 
						|
								                      Weight = o.FirstOrDefault().appointPatientRegister.Weight,
							 | 
						|
								                      SexName = _cacheService.GetSexNameAsync(o.FirstOrDefault().person.SexId).Result,
							 | 
						|
								                      MaritalStatusName = _cacheService.GetMaritalStatusNameAsync(o.FirstOrDefault().person.MaritalStatusId).Result,
							 | 
						|
								                      CustomerOrgName = _customerOrgManager.GetTopCustomerOrgAsync(o.FirstOrDefault().appointPatientRegister.CustomerOrgId).Result.CustomerOrgName
							 | 
						|
								
							 | 
						|
								                  }).ToList();
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            return list;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								        }
							 | 
						|
								        /// <summary>
							 | 
						|
								        /// 获取某人的预约列表,小程序使用
							 | 
						|
								        /// </summary>
							 | 
						|
								        /// <param name="input"></param>
							 | 
						|
								        /// <returns></returns>
							 | 
						|
								        /// <exception cref="UserFriendlyException"></exception>
							 | 
						|
								        [HttpPost("api/app/AppointPatientRegister/GetListByPersonId")]
							 | 
						|
								        public async Task<List<AppointPatientRegisterDto>> GetListByPersonIdAsync(PersonIdInputDto input)
							 | 
						|
								        {
							 | 
						|
								            if (input == null) throw new UserFriendlyException("参数不能为空");
							 | 
						|
								
							 | 
						|
								           
							 | 
						|
								            var query = (from user in await _identityUserRepository.GetQueryableAsync()
							 | 
						|
								                         join person in await _personRepository.GetQueryableAsync()
							 | 
						|
								                         on user.Id equals person.PersonId
							 | 
						|
								                         join appointPatientRegister in await _repository.GetQueryableAsync()
							 | 
						|
								                         on person.PersonId equals appointPatientRegister.PersonId
							 | 
						|
								                         join medicalPackage in await _medicalPackageRepository.GetQueryableAsync()
							 | 
						|
								                         on appointPatientRegister.MedicalPackageId equals medicalPackage.MedicalPackageId into canEmptyMedicalPackage
							 | 
						|
								                         from haveMedicalPackage in canEmptyMedicalPackage.DefaultIfEmpty()
							 | 
						|
								                         join customerOrgGroup in await _customerOrgGroupRepository.GetQueryableAsync()
							 | 
						|
								                         on appointPatientRegister.CustomerOrgGroupId equals customerOrgGroup.CustomerOrgGroupId into canEmptyCustomerOrgGroup
							 | 
						|
								                         from haveCustomerOrgGroup in canEmptyCustomerOrgGroup.DefaultIfEmpty()
							 | 
						|
								                         join appointRegisterAsbitem in await _appointRegisterAsbitemRepository.GetQueryableAsync()
							 | 
						|
								                         on appointPatientRegister.AppointPatientRegisterId equals appointRegisterAsbitem.AppointPatientRegisterId
							 | 
						|
								                         join asbitem in await _asbitemRepository.GetQueryableAsync()
							 | 
						|
								                         on appointRegisterAsbitem.AsbitemId equals asbitem.AsbitemId
							 | 
						|
								                         join customerOrg in await _customerOrgRepository.GetQueryableAsync()
							 | 
						|
								                         on appointPatientRegister.CustomerOrgId equals customerOrg.CustomerOrgId
							 | 
						|
								                         where appointPatientRegister.PersonId == input.PersonId && 
							 | 
						|
								                               appointPatientRegister.CompleteFlag != AppointPatientRegisterCompleteFlag.CancelAppoint
							 | 
						|
								                         orderby appointPatientRegister.AppointDate
							 | 
						|
								                         select new
							 | 
						|
								                         {
							 | 
						|
								                             user,
							 | 
						|
								                             person,
							 | 
						|
								                             appointPatientRegister,
							 | 
						|
								                             appointRegisterAsbitem,
							 | 
						|
								                             asbitem,
							 | 
						|
								                             haveMedicalPackage,
							 | 
						|
								                             haveCustomerOrgGroup,
							 | 
						|
								                             customerOrg
							 | 
						|
								                         }
							 | 
						|
								                         );
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            var appointPatientRegisterDtos = query.ToList();
							 | 
						|
								
							 | 
						|
								            var list = appointPatientRegisterDtos.GroupBy(o => o.appointPatientRegister)
							 | 
						|
								                  .Select(o => new AppointPatientRegisterDto()
							 | 
						|
								                  {
							 | 
						|
								                      AppointPatientRegisterId = o.FirstOrDefault().appointPatientRegister.AppointPatientRegisterId,
							 | 
						|
								                      PersonId = o.FirstOrDefault().appointPatientRegister.PersonId,
							 | 
						|
								                      PersonName = o.FirstOrDefault().user.Name,
							 | 
						|
								                      IdNo = o.FirstOrDefault().person.IdNo,
							 | 
						|
								                      SexId = o.FirstOrDefault().person.SexId,
							 | 
						|
								                      MaritalStatusId = o.FirstOrDefault().person.MaritalStatusId,
							 | 
						|
								                      CustomerOrgId = o.FirstOrDefault().appointPatientRegister.CustomerOrgId,
							 | 
						|
								                      ChildCustomerOrgName = o.FirstOrDefault().customerOrg.PathCode.Length == 5 ? "" : o.FirstOrDefault().customerOrg.CustomerOrgName,
							 | 
						|
								                      CustomerOrgGroupId = o.FirstOrDefault().appointPatientRegister.CustomerOrgGroupId,
							 | 
						|
								                      CustomerOrgGroupName = o.FirstOrDefault().haveCustomerOrgGroup == null ? "" : o.FirstOrDefault().haveCustomerOrgGroup.CustomerOrgGroupName,
							 | 
						|
								                      CustomerOrgRegisterId = o.FirstOrDefault().appointPatientRegister.CustomerOrgRegisterId,
							 | 
						|
								                      MedicalPackageId = o.FirstOrDefault().appointPatientRegister.MedicalPackageId,
							 | 
						|
								                      MedicalPackageName = o.FirstOrDefault().haveMedicalPackage == null ? "" : o.FirstOrDefault().haveMedicalPackage.MedicalPackageName,
							 | 
						|
								                      MedicalCenterId = o.FirstOrDefault().appointPatientRegister.MedicalCenterId,
							 | 
						|
								                      CompleteFlag = o.FirstOrDefault().appointPatientRegister.CompleteFlag,
							 | 
						|
								                      
							 | 
						|
								                      AppointDate = o.FirstOrDefault().appointPatientRegister.AppointDate,
							 | 
						|
								                      Remark = o.FirstOrDefault().appointPatientRegister.Remark,
							 | 
						|
								                      PregnantFlag = o.FirstOrDefault().appointPatientRegister.PregnantFlag,
							 | 
						|
								                      Height = o.FirstOrDefault().appointPatientRegister.Height,
							 | 
						|
								                      Weight = o.FirstOrDefault().appointPatientRegister.Weight,
							 | 
						|
								                      SexName = _cacheService.GetSexNameAsync(o.FirstOrDefault().person.SexId).Result,
							 | 
						|
								                      MaritalStatusName = _cacheService.GetMaritalStatusNameAsync(o.FirstOrDefault().person.MaritalStatusId).Result,
							 | 
						|
								                      CustomerOrgName = _customerOrgManager.GetTopCustomerOrgAsync(o.FirstOrDefault().appointPatientRegister.CustomerOrgId).Result.CustomerOrgName
							 | 
						|
								                      
							 | 
						|
								                  }).ToList();
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            return list;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        /// <summary>
							 | 
						|
								        /// 取消预约
							 | 
						|
								        /// </summary>
							 | 
						|
								        /// <param name="input"></param>
							 | 
						|
								        /// <returns></returns>
							 | 
						|
								        /// <exception cref="UserFriendlyException"></exception>
							 | 
						|
								        [HttpPost("api/app/AppointPatientRegister/CancelAppoint")]
							 | 
						|
								        public async Task CancelAppointAsync(AppointPatientRegisterIdInputDto input)
							 | 
						|
								        {
							 | 
						|
								           var appointPatientRegister = await _repository.GetAsync(o => o.AppointPatientRegisterId == input.AppointPatientRegisterId);
							 | 
						|
								           if(appointPatientRegister.IsCharge == 'Y')
							 | 
						|
								            {
							 | 
						|
								                throw new UserFriendlyException("已收费不能取消");
							 | 
						|
								            }
							 | 
						|
								            if (appointPatientRegister.CompleteFlag == AppointPatientRegisterCompleteFlag.Check)
							 | 
						|
								            {
							 | 
						|
								                throw new UserFriendlyException("已到检不能取消");
							 | 
						|
								            }
							 | 
						|
								            if (appointPatientRegister.CompleteFlag == AppointPatientRegisterCompleteFlag.CancelAppoint)
							 | 
						|
								            {
							 | 
						|
								                throw new UserFriendlyException("已取消预约不能重复取消");
							 | 
						|
								            }
							 | 
						|
								            appointPatientRegister.CompleteFlag = AppointPatientRegisterCompleteFlag.CancelAppoint;
							 | 
						|
								            await _repository.UpdateAsync(appointPatientRegister);
							 | 
						|
								
							 | 
						|
								        }
							 | 
						|
								        /// <summary>
							 | 
						|
								        /// 获取预约的组合项目
							 | 
						|
								        /// </summary>
							 | 
						|
								        /// <param name="input"></param>
							 | 
						|
								        /// <returns></returns>
							 | 
						|
								        [AllowAnonymous]
							 | 
						|
								        [HttpPost("api/app/AppointPatientRegister/GetAppointRegisterAsbitemListById")]
							 | 
						|
								        public async Task<List<AppointRegisterAsbitemDto>> GetAppointRegisterAsbitemListByIdAsync(AppointPatientRegisterIdInputDto input)
							 | 
						|
								        {
							 | 
						|
								            var appointPatientRegister = await _repository.GetAsync(o => o.AppointPatientRegisterId == input.AppointPatientRegisterId);
							 | 
						|
								            var appointRegisterAsbitemDtos = (
							 | 
						|
								
							 | 
						|
								              from appointRegisterAsbitem in await _appointRegisterAsbitemRepository.GetQueryableAsync()
							 | 
						|
								              join asbitem in await _asbitemRepository.GetQueryableAsync()
							 | 
						|
								              on appointRegisterAsbitem.AsbitemId equals asbitem.AsbitemId
							 | 
						|
								              join itemType in await _itemTypeRepository.GetQueryableAsync()
							 | 
						|
								              on asbitem.ItemTypeId equals itemType.ItemTypeId
							 | 
						|
								              orderby appointPatientRegister.AppointDate
							 | 
						|
								              where appointRegisterAsbitem.AppointPatientRegisterId == input.AppointPatientRegisterId
							 | 
						|
								              select new AppointRegisterAsbitemDto()
							 | 
						|
								              {
							 | 
						|
								                  AppointPatientRegisterId = input.AppointPatientRegisterId,
							 | 
						|
								                  AsbitemId = appointRegisterAsbitem.AsbitemId,
							 | 
						|
								                  AsbitemName = asbitem.AsbitemName,
							 | 
						|
								                  StandardPrice = appointRegisterAsbitem.StandardPrice,
							 | 
						|
								                  ChargePrice = appointRegisterAsbitem.ChargePrice,
							 | 
						|
								                  Amount = appointRegisterAsbitem.Amount,
							 | 
						|
								                  IsCharge = appointRegisterAsbitem.IsCharge,
							 | 
						|
								                  DisplayOrder = asbitem.DisplayOrder,
							 | 
						|
								                  ItemTypeId = itemType.ItemTypeId,
							 | 
						|
								                  ItemTypeName = itemType.ItemTypeName,
							 | 
						|
								                  ItemTypeDisplayOrder = itemType.DisplayOrder,
							 | 
						|
								                  PayTypeFlag = appointRegisterAsbitem.PayTypeFlag
							 | 
						|
								              }
							 | 
						|
								
							 | 
						|
								             ).ToList();
							 | 
						|
								
							 | 
						|
								            List<Guid> asbitems = new List<Guid>();
							 | 
						|
								            if (appointPatientRegister.MedicalPackageId != null)
							 | 
						|
								            {
							 | 
						|
								                asbitems = (await _medicalPackageDetailRepository.GetQueryableAsync())
							 | 
						|
								                    .Where(o => o.MedicalPackageId == appointPatientRegister.MedicalPackageId)
							 | 
						|
								                    .Select(x => x.AsbitemId).ToList();
							 | 
						|
								                ;
							 | 
						|
								            }
							 | 
						|
								            else if (appointPatientRegister.CustomerOrgGroupId != null)
							 | 
						|
								            {
							 | 
						|
								                asbitems = (await _customerOrgGroupDetailRepository.GetQueryableAsync())
							 | 
						|
								                   .Where(o => o.CustomerOrgGroupId == appointPatientRegister.CustomerOrgGroupId)
							 | 
						|
								                   .Select(x => x.AsbitemId).ToList();
							 | 
						|
								            }
							 | 
						|
								            var itemTypes = await _itemTypeRepository.GetListAsync();
							 | 
						|
								            appointRegisterAsbitemDtos.ForEach(o =>
							 | 
						|
								            {
							 | 
						|
								                if (asbitems.Where(x => x == o.AsbitemId).ToList().Any())
							 | 
						|
								                {
							 | 
						|
								                    o.IsBelongGroupPackage = 'Y';
							 | 
						|
								                }
							 | 
						|
								                var itemType = itemTypes.Where(o => o.ItemTypeId == o.ItemTypeId).First();
							 | 
						|
								                itemType = itemTypes.Where(o => o.PathCode == itemType.PathCode.Substring(0, 5)).First();
							 | 
						|
								                o.ItemTypeId = itemType.ItemTypeId;
							 | 
						|
								                o.ItemTypeDisplayOrder = itemType.DisplayOrder;
							 | 
						|
								            });
							 | 
						|
								            appointRegisterAsbitemDtos = appointRegisterAsbitemDtos.OrderBy(o => o.ItemTypeDisplayOrder)
							 | 
						|
								                .OrderBy(o => o.DisplayOrder).ToList();
							 | 
						|
								            return appointRegisterAsbitemDtos;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        /// <summary>
							 | 
						|
								        /// 获取单位预约病人
							 | 
						|
								        /// </summary>
							 | 
						|
								        /// <param name="input"></param>
							 | 
						|
								        /// <returns></returns>
							 | 
						|
								        [HttpPost("api/app/AppointPatientRegister/GetCustomerOrgAppointPatientRegisterByPersonId")]
							 | 
						|
								        public async Task<PatientRegisterDto> GetCustomerOrgAppointPatientRegisterByPersonIdAsync(PersonIdInputDto input)
							 | 
						|
								        {
							 | 
						|
								          
							 | 
						|
								            var patientRegisterDto = (from user in await _identityUserRepository.GetQueryableAsync()
							 | 
						|
								                                      join person in await _personRepository.GetQueryableAsync()
							 | 
						|
								                                      on user.Id equals person.PersonId
							 | 
						|
								                                      join patient in await _patientRepository.GetQueryableAsync()
							 | 
						|
								                                      on new { idNo = person.IdNo, phone = user.PhoneNumber } equals new { idNo = patient.IdNo, phone = patient.MobileTelephone }
							 | 
						|
								                                      join patientRegister in await _patientRegisterRepository.GetQueryableAsync()
							 | 
						|
								                                      on patient.PatientId equals patientRegister.PatientId
							 | 
						|
								                                      join customerOrg in await _customerOrgRepository.GetQueryableAsync()
							 | 
						|
								                                      on patientRegister.CustomerOrgId equals customerOrg.CustomerOrgId
							 | 
						|
								                                      join customerOrgGroup in await _customerOrgGroupRepository.GetQueryableAsync()
							 | 
						|
								                                      on patientRegister.CustomerOrgGroupId equals customerOrgGroup.CustomerOrgGroupId into canEmptyCustomerOrgGroup
							 | 
						|
								                                      from haveCustomerOrgGroup in canEmptyCustomerOrgGroup.DefaultIfEmpty()
							 | 
						|
								                                      where user.Id == input.PersonId &&
							 | 
						|
								                                     (patientRegister.CompleteFlag == PatientRegisterCompleteFlag.PreRegistration ||
							 | 
						|
								                                     patientRegister.CompleteFlag == PatientRegisterCompleteFlag.Registration) &&
							 | 
						|
								                                     patientRegister.MedicalStartDate >= DateTime.Now.Date.AddDays(-365)
							 | 
						|
								                                      orderby patientRegister.MedicalStartDate descending
							 | 
						|
								                                      select new PatientRegisterDto()
							 | 
						|
								                                      {
							 | 
						|
								                                          PatientRegisterId = patientRegister.PatientRegisterId,
							 | 
						|
								                                          CustomerOrgId = customerOrg.CustomerOrgId,
							 | 
						|
								                                          ChildCustomerOrgName = customerOrg.CustomerOrgName,
							 | 
						|
								                                          CustomerOrgRegisterId = patientRegister.CustomerOrgRegisterId,
							 | 
						|
								                                          CustomerOrgGroupId = patientRegister.CustomerOrgGroupId,
							 | 
						|
								                                          CustomerOrgGroupName = haveCustomerOrgGroup == null?"": haveCustomerOrgGroup.CustomerOrgGroupName,
							 | 
						|
								                                          Price = haveCustomerOrgGroup == null ? 0:haveCustomerOrgGroup.Price,
							 | 
						|
								                                          CanAddMoney = haveCustomerOrgGroup == null ? 0 : haveCustomerOrgGroup.CanAddMoney,
							 | 
						|
								                                      }).FirstOrDefault();
							 | 
						|
								            if (patientRegisterDto == null)
							 | 
						|
								            {
							 | 
						|
								                return patientRegisterDto;
							 | 
						|
								            }
							 | 
						|
								            var customerOrgEntity = await _customerOrgRepository.GetAsync(o => o.CustomerOrgId == patientRegisterDto.CustomerOrgId);
							 | 
						|
								            customerOrgEntity = await _customerOrgRepository.GetAsync(o => o.PathCode == customerOrgEntity.PathCode.Substring(0, 5));
							 | 
						|
								            patientRegisterDto.CustomerOrgName = customerOrgEntity.CustomerOrgName;
							 | 
						|
								
							 | 
						|
								            var appointPatientRegisters = await _repository.GetListAsync(o => o.PersonId == input.PersonId &&
							 | 
						|
								            o.AppointDate >= DateTime.Now.Date && o.CustomerOrgRegisterId == patientRegisterDto.CustomerOrgRegisterId
							 | 
						|
								            && o.CompleteFlag != AppointPatientRegisterCompleteFlag.CancelAppoint);
							 | 
						|
								            if (appointPatientRegisters .Any())
							 | 
						|
								            {
							 | 
						|
								                throw new UserFriendlyException("已有今天及之后的团检预约订单,必须先取消订单才能重新预约");
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            return patientRegisterDto;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        /// <summary>
							 | 
						|
								        /// 获取团检中个人备案项目
							 | 
						|
								        /// </summary>
							 | 
						|
								        /// <param name="input"></param>
							 | 
						|
								        /// <returns></returns>
							 | 
						|
								        [HttpPost("api/app/AppointPatientRegister/GetCheckTypeWithAsbitemsListByPatientRegisterId")]
							 | 
						|
								        public async Task<List<MedicalPackageCheckTypeWithAsbitemsDto>> GetCheckTypeWithAsbitemsListByPatientRegisterIdAsync(PatientRegisterIdInputDto input)
							 | 
						|
								        {
							 | 
						|
								            //获取团检个人所有组合项目
							 | 
						|
								            var asbitems = (from registerCheck in await _registerCheckRepository.GetQueryableAsync()
							 | 
						|
								                            join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync()
							 | 
						|
								                            on registerCheck.RegisterCheckId equals registerCheckAsbitem.RegisterCheckId
							 | 
						|
								                            join asbitem in await _asbitemRepository.GetQueryableAsync()
							 | 
						|
								                            on registerCheckAsbitem.AsbitemId equals asbitem.AsbitemId
							 | 
						|
								                            where registerCheck.PatientRegisterId == input.PatientRegisterId
							 | 
						|
								                            select new MedicalPackageAsbitem()
							 | 
						|
								                            {
							 | 
						|
								                                ItemTypeId = asbitem.ItemTypeId,
							 | 
						|
								                                AsbitemId = asbitem.AsbitemId,
							 | 
						|
								                                AsbitemName = asbitem.AsbitemName,
							 | 
						|
								                                ShortName = asbitem.ShortName,
							 | 
						|
								                                Price = asbitem.Price,
							 | 
						|
								                                ForSexId = asbitem.ForSexId,
							 | 
						|
								                                //ForSexName = _cacheService.GetForSexNameAsync(asbitem.ForSexId).Result,
							 | 
						|
								                                IsBeforeEat = asbitem.IsBeforeEat,
							 | 
						|
								                                ClinicalMeaning = asbitem.ClinicalMeaning,
							 | 
						|
								                                IsCheck = asbitem.IsCheck,
							 | 
						|
								                                Warn = asbitem.Warn,
							 | 
						|
								                                DiseaseScreeningTypeId = asbitem.DiseaseScreeningTypeId,
							 | 
						|
								                                SimpleCode = asbitem.SimpleCode,
							 | 
						|
								                                DisplayOrder = asbitem.DisplayOrder,
							 | 
						|
								                            }
							 | 
						|
								                             ).ToList();
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								            //获取检查分类
							 | 
						|
								            var medicalPackageAsbitemDtos = new List<MedicalPackageCheckTypeWithAsbitemsDto>()
							 | 
						|
								            {
							 | 
						|
								                new MedicalPackageCheckTypeWithAsbitemsDto(){CheckTypeFlag = CheckTypeFlag.Regular,CheckTypeFlagName = "科室检查",DisplayOrder = 1},
							 | 
						|
								                new MedicalPackageCheckTypeWithAsbitemsDto(){CheckTypeFlag = CheckTypeFlag.Laboratory,CheckTypeFlagName = "检验",DisplayOrder = 2},
							 | 
						|
								                new MedicalPackageCheckTypeWithAsbitemsDto(){CheckTypeFlag =CheckTypeFlag.SpecialInspection,CheckTypeFlagName = "特检",DisplayOrder = 3},
							 | 
						|
								                new MedicalPackageCheckTypeWithAsbitemsDto(){CheckTypeFlag = CheckTypeFlag.Radiology,CheckTypeFlagName = "放射",DisplayOrder = 4}
							 | 
						|
								            };
							 | 
						|
								
							 | 
						|
								            var itemTypes = await _itemTypeRepository.GetListAsync();
							 | 
						|
								            foreach (var asbitem in asbitems)
							 | 
						|
								            {
							 | 
						|
								                asbitem.ForSexName = await _cacheService.GetForSexNameAsync(asbitem.ForSexId);
							 | 
						|
								                var itemType = itemTypes.Where(o => o.ItemTypeId == asbitem.ItemTypeId).Single();
							 | 
						|
								                if (itemType.PathCode.Length > 5)
							 | 
						|
								                {
							 | 
						|
								                    itemType = itemTypes.Where(o => o.PathCode == itemType.PathCode.Substring(0, 5)).Single();
							 | 
						|
								                    asbitem.ItemTypeId = itemType.ItemTypeId;
							 | 
						|
								                }
							 | 
						|
								                asbitem.CheckTypeFlag = itemType.CheckTypeFlag;
							 | 
						|
								            }
							 | 
						|
								            //设置每个分类包含的组合项目
							 | 
						|
								            foreach (var medicalPackageAsbitemDto in medicalPackageAsbitemDtos)
							 | 
						|
								            {
							 | 
						|
								                medicalPackageAsbitemDto.Asbitems = asbitems.Where(o => o.CheckTypeFlag == medicalPackageAsbitemDto.CheckTypeFlag).ToList();
							 | 
						|
								
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            return medicalPackageAsbitemDtos;
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    }
							 | 
						|
								}
							 |