diff --git a/src/Shentun.Peis.Application.Contracts/CustomerReports/GetCustomerOrgPhysicalExaminationStatisticsDto.cs b/src/Shentun.Peis.Application.Contracts/CustomerReports/GetCustomerOrgPhysicalExaminationStatisticsDto.cs new file mode 100644 index 0000000..3b6ec0f --- /dev/null +++ b/src/Shentun.Peis.Application.Contracts/CustomerReports/GetCustomerOrgPhysicalExaminationStatisticsDto.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Shentun.Peis.CustomerReports +{ + public class GetCustomerOrgPhysicalExaminationStatisticsDto + { + /// + /// 单位名称 + /// + public string CustomerOrgName { get; set; } + + /// + /// 单位Id + /// + public Guid CustomerOrgId { get; set; } + + /// + /// 人次 登记人数 + /// + public int RegisterCount { get; set; } + + /// + /// 已检人次 总检 + /// + public int CheckCount { get; set; } + + /// + /// 标准均价 + /// + public decimal AvgStandardPrice { get; set; } + /// + /// 实收均价 + /// + public decimal AvgChargePrice { get; set; } + + + /// + /// 标准价格总金额 + /// + public decimal SumStandardPrice { get; set; } + /// + /// 实收价格总金额 + /// + public decimal SumChargePrice { get; set; } + } + + public class GetCustomerOrgPhysicalExaminationStatisticsPatientRegisterGroupDto + { + public Guid PatientRegisterId { get; set; } + + public char CompleteFlag { get; set; } + + /// + /// 单位名称 + /// + public string CustomerOrgName { get; set; } + + /// + /// 单位Id + /// + public Guid CustomerOrgId { get; set; } + + /// + /// 标准 + /// + public decimal StandardPrice { get; set; } + /// + /// 实收 + /// + public decimal ChargePrice { get; set; } + + + + } +} diff --git a/src/Shentun.Peis.Application.Contracts/CustomerReports/GetCustomerOrgPhysicalExaminationStatisticsInputDto.cs b/src/Shentun.Peis.Application.Contracts/CustomerReports/GetCustomerOrgPhysicalExaminationStatisticsInputDto.cs new file mode 100644 index 0000000..547476a --- /dev/null +++ b/src/Shentun.Peis.Application.Contracts/CustomerReports/GetCustomerOrgPhysicalExaminationStatisticsInputDto.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace Shentun.Peis.CustomerReports +{ + public class GetCustomerOrgPhysicalExaminationStatisticsInputDto + { + public List CustomerOrgIds { get; set; } + + /// + /// 日期类型(1、登记日期 2、体检日期 3、总检日期) + /// + [Required(ErrorMessage = "日期类型不能为空")] + public char DateType { get; set; } + + /// + /// 开始日期 + /// + [Required(ErrorMessage = "开始日期不能为空")] + public string StartDate { get; set; } + + + /// + /// 结束日期 + /// + [Required(ErrorMessage = "结束日期不能为空")] + public string EndDate { get; set; } + } +} diff --git a/src/Shentun.Peis.Application/CustomerReports/CustomerReportAppService.cs b/src/Shentun.Peis.Application/CustomerReports/CustomerReportAppService.cs index b22ddc6..85c418b 100644 --- a/src/Shentun.Peis.Application/CustomerReports/CustomerReportAppService.cs +++ b/src/Shentun.Peis.Application/CustomerReports/CustomerReportAppService.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Internal; using NPOI.HPSF; +using NPOI.POIFS.Properties; using NPOI.POIFS.Storage; using NPOI.SS.Formula.Functions; using NPOI.SS.UserModel; @@ -11,6 +12,7 @@ using NPOI.XSSF.UserModel.Extensions; using Org.BouncyCastle.Crypto.Tls; using Shentun.Peis.CustomerOrgs; using Shentun.Peis.Enums; +using Shentun.Peis.InternalReports; using Shentun.Peis.Models; using Shentun.Peis.PeisReports; using Shentun.Peis.ReportTemplates; @@ -2292,6 +2294,91 @@ namespace Shentun.Peis.CustomerReports } + /// + /// 单位体检数据统计 + /// + /// + [HttpPost("api/app/CustomerReport/GetCustomerOrgPhysicalExaminationStatistics")] + public async Task> GetCustomerOrgPhysicalExaminationStatisticsAsync(GetCustomerOrgPhysicalExaminationStatisticsInputDto input) + { + + var qeruy = from patientRegister in await _patientRegisterRepository.GetQueryableAsync() + join registerCheck in await _registerCheckRepository.GetQueryableAsync() on patientRegister.Id equals registerCheck.PatientRegisterId + join registerCheckAsbitem in await _registerAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId + join customerOrg in await _customerOrgRepository.GetQueryableAsync() on patientRegister.CustomerOrgId equals customerOrg.Id + join customerOrgParent in await _customerOrgRepository.GetQueryableAsync() + on customerOrg.PathCode.Substring(0, 5) equals customerOrgParent.PathCode + select new + { + patientRegister, + registerCheckAsbitem, + customerOrgParent + }; + + + + if (input.CustomerOrgIds.Any()) + { + List CustomerOrgIds = new List(); + + foreach (var item in input.CustomerOrgIds) + { + CustomerOrgIds.AddRange(await _customerOrgManager.GetCustomerOrgChildrenId(item)); + } + + qeruy = qeruy.Where(m => CustomerOrgIds.Contains(m.patientRegister.CustomerOrgId)); + } + + if (!string.IsNullOrEmpty(input.StartDate) && !string.IsNullOrEmpty(input.EndDate)) + { + if (input.DateType == '1') + { + qeruy = qeruy.Where(m => m.patientRegister.CreationTime >= Convert.ToDateTime(input.StartDate) && + m.patientRegister.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); + } + else if (input.DateType == '2') + { + qeruy = qeruy.Where(m => m.patientRegister.MedicalStartDate != null && m.patientRegister.MedicalStartDate >= Convert.ToDateTime(input.StartDate) && + m.patientRegister.MedicalStartDate < Convert.ToDateTime(input.EndDate).AddDays(1)); + } + else if (input.DateType == '3') + { + qeruy = qeruy.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate >= Convert.ToDateTime(input.StartDate) && + m.patientRegister.SummaryDate < Convert.ToDateTime(input.EndDate).AddDays(1)); + } + } + + + var patientRegisterGroup = qeruy.ToList().GroupBy(g => g.patientRegister.Id); + var patientRegisterGroupList = patientRegisterGroup.Select(s => new GetCustomerOrgPhysicalExaminationStatisticsPatientRegisterGroupDto + { + PatientRegisterId = s.First().patientRegister.Id, + CompleteFlag = s.First().patientRegister.CompleteFlag, + StandardPrice = s.Sum(ss => ss.registerCheckAsbitem.StandardPrice * ss.registerCheckAsbitem.Amount), + ChargePrice = s.Sum(ss => ss.registerCheckAsbitem.ChargePrice * ss.registerCheckAsbitem.Amount), + CustomerOrgId = s.First().customerOrgParent.Id, + CustomerOrgName = s.First().customerOrgParent.DisplayName, + }).ToList(); + + + + var customerOrgGroup = patientRegisterGroupList.GroupBy(g => g.CustomerOrgId); + + var customerOrgGrouplist = customerOrgGroup.Select(s => new GetCustomerOrgPhysicalExaminationStatisticsDto + { + CustomerOrgName = s.First().CustomerOrgName, + CustomerOrgId = s.First().CustomerOrgId, + CheckCount = s.Where(m => m.CompleteFlag == PatientRegisterCompleteFlag.SumCheck).Count(), + RegisterCount = s.Count(), + AvgChargePrice = Math.Round(s.Average(v => v.ChargePrice), 2), + AvgStandardPrice = Math.Round(s.Average(v => v.StandardPrice), 2), + SumChargePrice = Math.Round(s.Sum(v => v.ChargePrice), 2), + SumStandardPrice = Math.Round(s.Sum(v => v.StandardPrice), 2) + }).OrderByDescending(o => o.RegisterCount).ToList(); + + return customerOrgGrouplist; + + }