using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using NPOI.POIFS.Storage; using Shentun.Peis.DirectorManagement; using Shentun.Peis.Enums; using Shentun.Peis.InternalReports; using Shentun.Peis.Models; using Shentun.Peis.PatientRegisters; using Shentun.Peis.PrintReports; using Shentun.Peis.TransToWebPeiss; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Threading; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; namespace Shentun.Peis.DirectorManagements { /// /// 主任管理报表数据 /// [ApiExplorerSettings(GroupName = "Work")] [Authorize] public class DirectorManagementAppService : ApplicationService { private readonly IRepository _patientRegisterRepository; private readonly IRepository _patientRepository; private readonly CacheService _cacheService; private readonly IRepository _registerCheckRepository; private readonly IRepository _registerCheckAsbitemRepository; private readonly IRepository _asbitemRepository; private readonly IRepository _medicalPackageRepository; private readonly IRepository _customerOrgRepository; private readonly InternalReportAppService _internalReportAppService; private readonly IRepository _thirdInterfaceRepository; private readonly PrintReportAppService _printReportAppService; public DirectorManagementAppService( IRepository patientRegisterRepository, IRepository patientRepository, CacheService cacheService, IRepository registerCheckRepository, IRepository registerCheckAsbitemRepository, IRepository asbitemRepository, IRepository medicalPackageRepository, IRepository customerOrgRepository, InternalReportAppService internalReportAppService, IRepository thirdInterfaceRepository, PrintReportAppService printReportAppService) { _patientRegisterRepository = patientRegisterRepository; _patientRepository = patientRepository; _cacheService = cacheService; _registerCheckRepository = registerCheckRepository; _registerCheckAsbitemRepository = registerCheckAsbitemRepository; _asbitemRepository = asbitemRepository; _medicalPackageRepository = medicalPackageRepository; _customerOrgRepository = customerOrgRepository; _internalReportAppService = internalReportAppService; _thirdInterfaceRepository = thirdInterfaceRepository; _printReportAppService = printReportAppService; } /// /// 查询客户信息 /// /// [HttpPost("api/app/DirectorManagement/GetPatientList")] public async Task> GetPatientListAsync(GetPatientListInputDto input) { var query = from patientRegister in await _patientRegisterRepository.GetQueryableAsync() join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id select new { idNo = patient.IdNo, mobileTelephone = patient.MobileTelephone, nationId = patient.NationId, patientRegister }; if (!string.IsNullOrWhiteSpace(input.IdNo)) { query = query.Where(m => m.idNo == input.IdNo); } if (!string.IsNullOrWhiteSpace(input.PatientName)) { query = query.Where(m => m.patientRegister.PatientName == input.PatientName); } if (string.IsNullOrWhiteSpace(input.IdNo) && string.IsNullOrWhiteSpace(input.PatientName)) { if (input.DateType != null && !string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { if (input.DateType == '1') { query = query.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(input.StartDate) && m.patientRegister.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } else if (input.DateType == '2') { query = query.Where(m => m.patientRegister.MedicalStartDate != null && m.patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(input.StartDate) && m.patientRegister.MedicalStartDate.Value < Convert.ToDateTime(input.EndDate).AddDays(1)); } else if (input.DateType == '3') { query = query.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate.Value >= Convert.ToDateTime(input.StartDate) && m.patientRegister.SummaryDate.Value < Convert.ToDateTime(input.EndDate).AddDays(1)); } } else { throw new UserFriendlyException("日期参数不完整"); } } var entListDto = query.ToList().Select(s => new GetPatientListDto { Age = s.patientRegister.Age == null ? "" : s.patientRegister.Age.Value.ToString(), CompleteFlag = s.patientRegister.CompleteFlag.ToString(), IdNo = s.idNo, MaritalStatusName = _cacheService.GetMaritalStatusNameAsync(s.patientRegister.MaritalStatusId).GetAwaiter().GetResult(), MedicalStartDate = DataHelper.ConversionDateToString(s.patientRegister.MedicalStartDate), MedicalTimes = s.patientRegister.MedicalTimes, MobileTelephone = s.mobileTelephone, NationName = _cacheService.GetNationNameAsync(s.nationId).GetAwaiter().GetResult(), PatientName = s.patientRegister.PatientName, SexName = _cacheService.GetSexNameAsync(s.patientRegister.SexId).GetAwaiter().GetResult() }).ToList(); return entListDto; } /// /// 收入统计 查询某个时间断 /// /// /// [HttpPost("api/app/DirectorManagement/GetRevenueReport")] public async Task GetRevenueReportAsync(GetRevenueReportInputDto input) { if (string.IsNullOrWhiteSpace(input.StartDate) || string.IsNullOrWhiteSpace(input.EndDate)) { throw new UserFriendlyException("请选择查询时间段"); } 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 where patientRegister.MedicalStartDate != null && patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(input.StartDate) && patientRegister.MedicalStartDate.Value < Convert.ToDateTime(input.EndDate).AddDays(1) select new { patientRegisterId = patientRegister.Id, customerOrgId = patientRegister.CustomerOrgId, ischarge = registerCheckAsbitem.IsCharge, standardPrice = registerCheckAsbitem.StandardPrice, chargePrice = registerCheckAsbitem.ChargePrice, amount = registerCheckAsbitem.Amount }; if (input.IsCharge != null) { query = query.Where(m => m.ischarge == input.IsCharge); } var queryList = query.ToList(); if (queryList.Count == 0) { return new GetRevenueReportDto { ChargeMoney = 0, CustomerOrgCount = 0, PersonCount = 0, StandardMoney = 0, SumCount = 0 }; } var chargeMoney = queryList.Sum(s => s.chargePrice * s.amount); var standardMoney = queryList.Sum(s => s.standardPrice * s.amount); var sumCount = queryList.GroupBy(g => g.patientRegisterId).Count(); var customerOrgCount = queryList.Where(m => m.customerOrgId != GuidFlag.PersonCustomerOrgId).GroupBy(g => g.patientRegisterId).Count(); var personCount = queryList.Where(m => m.customerOrgId == GuidFlag.PersonCustomerOrgId).GroupBy(g => g.patientRegisterId).Count(); var entDto = new GetRevenueReportDto { ChargeMoney = chargeMoney, StandardMoney = standardMoney, SumCount = sumCount, CustomerOrgCount = customerOrgCount, PersonCount = personCount }; return entDto; } /// /// 收入统计 某段时间内组合项目售卖数量和金额排行榜 /// /// /// [HttpPost("api/app/DirectorManagement/GetAsbitemRevenueReport")] public async Task> GetAsbitemRevenueReportAsync(GetRevenueReportInputDto input) { if (string.IsNullOrWhiteSpace(input.StartDate) || string.IsNullOrWhiteSpace(input.EndDate)) { throw new UserFriendlyException("请选择查询时间段"); } 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 where patientRegister.MedicalStartDate != null && patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(input.StartDate) && patientRegister.MedicalStartDate.Value < Convert.ToDateTime(input.EndDate).AddDays(1) select new { patientRegisterId = patientRegister.Id, registerCheckAsbitem, asbitemName = asbitem.DisplayName }; if (input.IsCharge != null) { query = query.Where(m => m.registerCheckAsbitem.IsCharge == input.IsCharge); } var queryList = query.ToList(); var entListDto = queryList.GroupBy(g => g.registerCheckAsbitem.AsbitemId).Select(s => new GetAsbitemRevenueReportDto { AsbitemName = s.FirstOrDefault().asbitemName, SalesCount = s.Sum(sa => sa.registerCheckAsbitem.Amount), SalesChargeAmount = s.Sum(sa => sa.registerCheckAsbitem.ChargePrice * sa.registerCheckAsbitem.Amount), SalesStandardAmount = s.Sum(sa => sa.registerCheckAsbitem.StandardPrice * sa.registerCheckAsbitem.Amount) }).OrderByDescending(o => o.SalesChargeAmount).ToList(); return entListDto; } /// /// 收入统计 某段时间内套餐售卖数量和金额排行榜 /// /// /// [HttpPost("api/app/DirectorManagement/GetMedicalPackageRevenueReport")] public async Task> GetMedicalPackageRevenueReportAsync(GetMedicalPackageRevenueReportInputDto input) { if (string.IsNullOrWhiteSpace(input.StartDate) || string.IsNullOrWhiteSpace(input.EndDate)) { throw new UserFriendlyException("请选择查询时间段"); } var query = from patientRegister in await _patientRegisterRepository.GetQueryableAsync() join medicalPackage in await _medicalPackageRepository.GetQueryableAsync() on patientRegister.MedicalPackageId equals medicalPackage.Id where patientRegister.MedicalStartDate != null && patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(input.StartDate) && patientRegister.MedicalStartDate.Value < Convert.ToDateTime(input.EndDate).AddDays(1) select new { patientRegisterId = patientRegister.Id, medicalPackage }; var queryList = query.ToList(); var entListDto = queryList.GroupBy(g => g.medicalPackage).Select(s => new GetMedicalPackageRevenueReportDto { MedicalPackageName = s.Key.DisplayName, SalesCount = s.Count(), SalesAmount = s.Sum(sa => sa.medicalPackage.Price) }).OrderByDescending(o => o.SalesAmount).ToList(); return entListDto; } /// /// 单位体检人数和金额排行榜 /// /// /// [HttpPost("api/app/DirectorManagement/GetCustomerOrgPhysicalExaminationStatisticsReport")] public async Task> GetCustomerOrgPhysicalExaminationStatisticsReportAsync(GetCustomerOrgPhysicalExaminationStatisticsReportInputDto input) { if (string.IsNullOrWhiteSpace(input.StartDate) || string.IsNullOrWhiteSpace(input.EndDate)) { throw new UserFriendlyException("请选择查询时间段"); } var query = from patientRegister in await _patientRegisterRepository.GetQueryableAsync() join customerOrg in await _customerOrgRepository.GetQueryableAsync() on patientRegister.CustomerOrgId equals customerOrg.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 where patientRegister.CustomerOrgId != GuidFlag.PersonCustomerOrgId && patientRegister.MedicalStartDate != null && patientRegister.MedicalStartDate.Value >= Convert.ToDateTime(input.StartDate) && patientRegister.MedicalStartDate.Value < Convert.ToDateTime(input.EndDate).AddDays(1) select new { patientRegisterId = patientRegister.Id, customerOrg, registerCheckAsbitem }; if (input.IsCharge != null) { query = query.Where(m => m.registerCheckAsbitem.IsCharge == input.IsCharge); } var queryList = query.ToList(); var entListDto = queryList.GroupBy(g => g.customerOrg).Select(s => new GetCustomerOrgPhysicalExaminationStatisticsReportDto { CustomerOrgName = _cacheService.GetTopCustomerOrgNameAsync(s.Key.Id).GetAwaiter().GetResult(), CustomerOrgCount = s.Select(x => x.patientRegisterId).Distinct().Count(), SalesChargeAmount = s.Where(m => m.registerCheckAsbitem.PayTypeFlag == PayTypeFlag.OrgPay).Sum(sa => sa.registerCheckAsbitem.ChargePrice * sa.registerCheckAsbitem.Amount), SalesStandardAmount = s.Where(m => m.registerCheckAsbitem.PayTypeFlag == PayTypeFlag.OrgPay).Sum(sa => sa.registerCheckAsbitem.StandardPrice * sa.registerCheckAsbitem.Amount) }).OrderByDescending(o => o.SalesChargeAmount).ToList(); return entListDto; } /// /// 工作量统计 某段时间科室工作量统计 /// /// /// [HttpPost("api/app/DirectorManagement/GetItemTypeWorkLoadReport")] public async Task> GetItemTypeWorkLoadReportAsync(GetItemTypeWorkLoadReportInputDto input) { if (string.IsNullOrWhiteSpace(input.StartDate) || string.IsNullOrWhiteSpace(input.EndDate)) { throw new UserFriendlyException("请选择查询时间段"); } var entListDto = await _internalReportAppService.GetItemTypeWorkLoadInStandardAsync(new GetItemTypeWorkLoadInStandardRequestDto { StartDate = input.StartDate, EndDate = input.EndDate }); return entListDto; } /// /// 工作量统计 某段时间医生工作量统计 /// /// /// [HttpPost("api/app/DirectorManagement/GetDoctorWorkLoadReport")] public async Task> GetDoctorWorkLoadReportAsync(GetDoctorWorkLoadReportInputDto input) { if (string.IsNullOrWhiteSpace(input.StartDate) || string.IsNullOrWhiteSpace(input.EndDate)) { throw new UserFriendlyException("请选择查询时间段"); } var entListDto = await _internalReportAppService.GetDoctorPersonnelWorkLoadReportAsync(new GetDoctorPersonnelWorkLoadReportRequestDto { StartDate = input.StartDate, EndDate = input.EndDate }); return entListDto; } /// /// 套餐价格查询 /// /// /// [HttpPost("api/app/DirectorManagement/GetMedicalPackage")] public async Task> GetMedicalPackageAsync(GetMedicalPackageInputDto input) { var query = from medicalPackage in await _medicalPackageRepository.GetQueryableAsync() where medicalPackage.IsActive == 'Y' select medicalPackage; if (!string.IsNullOrWhiteSpace(input.MedicalPackageName)) { query = query.Where(m => input.MedicalPackageName.Contains(m.DisplayName)); } var entListDto = query.ToList().Select(s => new GetMedicalPackageDto { DisplayOrder = s.DisplayOrder, ForSexName = GetForSexName(s.ForSexId), MaritalStatusName = _cacheService.GetMaritalStatusNameAsync(s.MaritalStatusId).GetAwaiter().GetResult(), MedicalPackageName = s.DisplayName, Price = s.Price, Remark = s.Remark }).OrderBy(o => o.DisplayOrder).ToList(); return entListDto; } /// /// 组合项目价格查询 /// /// /// [HttpPost("api/app/DirectorManagement/GetAsbitem")] public async Task> GetAsbitemAsync(GetAsbitemInputDto input) { var query = from asbitem in await _asbitemRepository.GetQueryableAsync() where asbitem.IsActive == 'Y' select asbitem; if (!string.IsNullOrWhiteSpace(input.AsbitemName)) { query = query.Where(m => input.AsbitemName.Contains(m.DisplayName)); } var entListDto = query.ToList().Select(s => new GetAsbitemDto { DisplayOrder = s.DisplayOrder, ForSexName = GetForSexName(s.ForSexId), MaritalStatusName = _cacheService.GetMaritalStatusNameAsync(s.MaritalStatusId).GetAwaiter().GetResult(), AsbitemName = s.DisplayName, Price = s.Price }).OrderBy(o => o.DisplayOrder).ToList(); return entListDto; } /// /// 客户体检报告查询 /// /// /// [HttpPost("api/app/DirectorManagement/GetPeisReport")] public async Task> GetPeisReportAsync(GetPeisReportInputDto input) { var query = from patientRegister in await _patientRegisterRepository.GetQueryableAsync() join patient in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals patient.Id where patientRegister.CompleteFlag == PatientRegisterCompleteFlag.Audit || patientRegister.CompleteFlag == PatientRegisterCompleteFlag.SumCheck select new { patientRegister, patient }; if (!string.IsNullOrWhiteSpace(input.PatientName)) { query = query.Where(m => m.patientRegister.PatientName == input.PatientName); } if (!string.IsNullOrWhiteSpace(input.MobileTelephone)) { query = query.Where(m => m.patient.MobileTelephone == input.MobileTelephone); } if (!string.IsNullOrWhiteSpace(input.PatientNo)) { query = query.Where(m => m.patient.PatientNo == input.PatientNo); } if (!string.IsNullOrWhiteSpace(input.IdNo)) { query = query.Where(m => m.patient.IdNo == input.IdNo); } if (!string.IsNullOrWhiteSpace(input.PatientRegisterNo)) { query = query.Where(m => m.patientRegister.PatientRegisterNo == input.PatientRegisterNo); } var entListDto = query.Select(s => new GetPeisReportDto { Age = s.patientRegister.Age == null ? "" : s.patientRegister.Age.ToString(), MedicalStartDate = DataHelper.ConversionDateShortToString(s.patientRegister.MedicalStartDate), AuditDate = DataHelper.ConversionDateShortToString(s.patientRegister.AuditDate), AuditDoctorName = _cacheService.GetSurnameAsync(s.patientRegister.AuditDoctorId).GetAwaiter().GetResult(), IdNo = s.patient.IdNo, MobileTelephone = s.patient.MobileTelephone, PatientNo = s.patient.PatientNo, SexName = GetSexName(s.patientRegister.SexId), CompleteFlag = GetPatientRegisterCompleteFlag(s.patientRegister.CompleteFlag), IsUpload = s.patientRegister.IsUpload == 'Y' ? "已上传" : "未上传", PatientName = s.patientRegister.PatientName, PatientRegisterId = s.patientRegister.Id, PatientRegisterNo = s.patientRegister.PatientRegisterNo, SummaryDate = DataHelper.ConversionDateShortToString(s.patientRegister.SummaryDate), SummaryDoctorName = _cacheService.GetSurnameAsync(s.patientRegister.SummaryDoctorId).GetAwaiter().GetResult(), CustomerOrgName = _cacheService.GetTopCustomerOrgNameAsync(s.patientRegister.CustomerOrgId).GetAwaiter().GetResult(), DepartmentName = _cacheService.GetCustomerOrgNameAsync(s.patientRegister.CustomerOrgId).GetAwaiter().GetResult() }).OrderBy(o => o.PatientRegisterId).ToList(); return entListDto; } /// /// 根据体检人员Id查询报告 返回的报告base64 /// /// /// [HttpPost("api/app/DirectorManagement/GetPeisReportBase64ByPatientRegisterId")] public async Task GetPeisReportBase64ByPatientRegisterIdAsync(PatientRegisterIdInputDto input) { var entDto = new GetPeisReportBase64ByPatientRegisterIdDto(); entDto.Base64Str = await GetPeisBase64Async(input); return entDto; } /// /// 获取报告bse64 调用服务器上客户端 /// /// /// /// /// private async Task GetPeisBase64Async(PatientRegisterIdInputDto input) { var thirdInterface = await _thirdInterfaceRepository.FirstOrDefaultAsync(f => f.ThirdInterfaceType == ThirdInterfaceTypeFlag.TranToWebPeis); if (thirdInterface.IsActive != 'Y') { throw new UserFriendlyException("该接口已禁用"); } var parmValue = thirdInterface.ParmValue; var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue))); var config = configurationBuilder.Build(); var reportApiBaseAddress = config.GetSection("Interface").GetSection("ReportApiBaseAddress").Value; var reportApiUrl = config.GetSection("Interface").GetSection("ReportApiUrl").Value; string reportBase64 = ""; var printReportData = await _printReportAppService.GetMedicalReportConvertToReportAsync(input); using (var httpClientHandler = new HttpClientHandler()) { using (var httpClient = new HttpClient(httpClientHandler)) { httpClient.BaseAddress = new Uri(reportApiBaseAddress); httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json"));//设置accept标头,告诉JSON是可接受的响应类型 var sendData = JsonConvert.SerializeObject(printReportData); using (HttpContent httpContent = new StringContent(sendData)) { httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); HttpResponseMessage response = null; response = await httpClient.PostAsync(reportApiUrl, httpContent); string result; if (!response.IsSuccessStatusCode) { result = response.Content.ReadAsStringAsync().Result; throw new Exception("http通信错误:" + response.StatusCode + ",结果:" + result); } result = await response.Content.ReadAsStringAsync(); var resultDto = JsonConvert.DeserializeObject(result); if (resultDto != null) { if (resultDto.code != 1) { throw new Exception($"调用WebApi失败,返回-1,消息:" + result); } reportBase64 = resultDto.data; } } } } return reportBase64; } /// /// 转换适用性别 /// /// /// private string GetForSexName(char ForSexId) { string msg = ""; if (ForSexId == 'A') { msg = "全部"; } else if (ForSexId == 'M') { msg = "男"; } else if (ForSexId == 'F') { msg = "女"; } return msg; } /// /// 转换性别 /// /// /// private string GetSexName(char SexId) { string msg = ""; if (SexId == 'U') { msg = "未知"; } else if (SexId == 'M') { msg = "男"; } else if (SexId == 'F') { msg = "女"; } return msg; } /// /// 转换人员状态 /// /// /// private string GetPatientRegisterCompleteFlag(char completeFlag) { string msg = ""; if (completeFlag == '0') { msg = "预登记"; } else if (completeFlag == '1') { msg = "正式登记"; } else if (completeFlag == '2') { msg = "部分已检"; } else if (completeFlag == '3') { msg = "已总检"; } return msg; } } }