From 09247f06bc59ad6b5f0768ee4772d59385c6e355 Mon Sep 17 00:00:00 2001 From: wxd <123@qq.com> Date: Wed, 22 Apr 2026 18:13:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E4=BD=93=E6=A3=80=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...isterItemByMedicalCenterIdStatisticsDto.cs | 101 +++++++++ ...ItemByMedicalCenterIdStatisticsInputDto.cs | 50 ++++ .../CustomerReportAppService.cs | 213 +++++++++++++++++- 3 files changed, 362 insertions(+), 2 deletions(-) create mode 100644 src/Shentun.Peis.Application.Contracts/CustomerReports/GetRegisterItemByMedicalCenterIdStatisticsDto.cs create mode 100644 src/Shentun.Peis.Application.Contracts/CustomerReports/GetRegisterItemByMedicalCenterIdStatisticsInputDto.cs diff --git a/src/Shentun.Peis.Application.Contracts/CustomerReports/GetRegisterItemByMedicalCenterIdStatisticsDto.cs b/src/Shentun.Peis.Application.Contracts/CustomerReports/GetRegisterItemByMedicalCenterIdStatisticsDto.cs new file mode 100644 index 00000000..8c3dfc88 --- /dev/null +++ b/src/Shentun.Peis.Application.Contracts/CustomerReports/GetRegisterItemByMedicalCenterIdStatisticsDto.cs @@ -0,0 +1,101 @@ +using Shentun.Peis.ThirdPartyPublicInterfaces; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Text; + +namespace Shentun.Peis.CustomerReports +{ + public class GetRegisterItemByMedicalCenterIdStatisticsDto + { + /// + /// 科室 一级 + /// + public string ItemTypeName { get; set; } + + public List AsbitemDetails { get; set; } = new List(); + } + + public class GetRegisterItemByMedicalCenterIdStatisticsAsbitemDto + { + public string AsbitemName { get; set; } + + + public List Details { get; set; } = new List(); + + } + + + public class GetRegisterItemByMedicalCenterIdStatisticsAsbitemDetailDto + { + public string MedicalCenterName { get; set; } + + /// + /// 登记人数 + /// + public int RegisterCount { get; set; } + + /// + /// 已检人数 + /// + public int CheckCount { get; set; } + + /// + /// 标准金额 + /// + public decimal StandardAmount { get; set; } + + /// + /// 应收金额 + /// + public decimal ReceivableAmount { get; set; } + + /// + /// 实收金额 + /// + public decimal ReceivedAmount { get; set; } + + } + + public class GetRegisterItemByMedicalCenterIdStatisticsGroupByDto + { + + public Guid ItemTypeId { get; set; } + + public string ItemTypeName { get; set; } + + public int ItemTypeDisplayOrder { get; set; } + + public string AsbitemName { get; set; } + + public int AsbitemDisplayOrder { get; set; } + + public Guid AsbitemId { get; set; } + public string MedicalCenterName { get; set; } + + public Guid PatientRegisterId { get; set; } + + public decimal StandardPrice { get; set; } + + /// + /// 实收价格 + /// + public decimal ChargePrice { get; set; } + + /// + /// 数量 + /// + public short Amount { get; set; } + + /// + /// 是否已收费 + /// + public char IsCharge { get; set; } + + /// + /// 完成标志 0(为未检), 1(已检), 2(弃检) + /// + public char CompleteFlag { get; set; } + } +} diff --git a/src/Shentun.Peis.Application.Contracts/CustomerReports/GetRegisterItemByMedicalCenterIdStatisticsInputDto.cs b/src/Shentun.Peis.Application.Contracts/CustomerReports/GetRegisterItemByMedicalCenterIdStatisticsInputDto.cs new file mode 100644 index 00000000..880db1a1 --- /dev/null +++ b/src/Shentun.Peis.Application.Contracts/CustomerReports/GetRegisterItemByMedicalCenterIdStatisticsInputDto.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Shentun.Peis.CustomerReports +{ + public class GetRegisterItemByMedicalCenterIdStatisticsInputDto + { + public List CustomerOrgIds { get; set; } = new List(); + + public List MedicalTypeIds { get; set; } = new List(); + + public List PersonnelTypeIds { get; set; } = new List(); + + public List Salesmans { get; set; } = new List(); + + /// + /// 日期类型(1、登记日期 2、体检日期 3、总检日期 6.收费日期) + /// + public char DateType { get; set; } + + /// + /// 开始日期 + /// + public string StartDate { get; set; } + + + /// + /// 结束日期 + /// + public string EndDate { get; set; } + + + /// + /// 是否需要统计预登记 默认为N 不统计 需要统计传Y + /// + public char IsPreRegistration { get; set; } = 'N'; + + public string PatientNo { get; set; } + + public string PatientRegisterNo { get; set; } + + public string PatientName { get; set; } + + /// + /// 一级科室id + /// + public List ItemTypeIds { get; set; } = new List(); + } +} diff --git a/src/Shentun.Peis.Application/CustomerReports/CustomerReportAppService.cs b/src/Shentun.Peis.Application/CustomerReports/CustomerReportAppService.cs index 8a604b9d..b9d2caf5 100644 --- a/src/Shentun.Peis.Application/CustomerReports/CustomerReportAppService.cs +++ b/src/Shentun.Peis.Application/CustomerReports/CustomerReportAppService.cs @@ -16,6 +16,7 @@ using Org.BouncyCastle.Crypto.Tls; using Shentun.Peis.CustomerOrgs; using Shentun.Peis.Enums; using Shentun.Peis.InternalReports; +using Shentun.Peis.ItemTypes; using Shentun.Peis.Models; using Shentun.Peis.PatientRegisters; using Shentun.Peis.PeisReports; @@ -78,7 +79,8 @@ namespace Shentun.Peis.CustomerReports private readonly IRepository _payModeRepository; private readonly IRepository _chargeBackRepository; private readonly IRepository _chargeBackPayRepository; - + private readonly ItemTypeManager _itemTypeManager; + private readonly IRepository _organizationUnitRepository; public CustomerReportAppService( IRepository patientRepository, @@ -111,7 +113,9 @@ namespace Shentun.Peis.CustomerReports IRepository chargePayRepository, IRepository payModeRepository, IRepository chargeBackRepository, - IRepository chargeBackPayRepository) + IRepository chargeBackPayRepository, + ItemTypeManager itemTypeManager, + IRepository organizationUnitRepository) { this._patientRepository = patientRepository; this._patientRegisterRepository = patientRegisterRepository; @@ -144,6 +148,8 @@ namespace Shentun.Peis.CustomerReports _payModeRepository = payModeRepository; _chargeBackRepository = chargeBackRepository; _chargeBackPayRepository = chargeBackPayRepository; + _itemTypeManager = itemTypeManager; + _organizationUnitRepository = organizationUnitRepository; } @@ -4870,6 +4876,209 @@ namespace Shentun.Peis.CustomerReports } + /// + /// 按体检中心统计项目数据 + /// + /// + /// + [HttpPost("api/app/CustomerReport/GetRegisterItemByMedicalCenterIdStatistics")] + public async Task> GetRegisterItemByMedicalCenterIdStatisticsAsync(GetRegisterItemByMedicalCenterIdStatisticsInputDto 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 _registerAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId + join asbitem in await _asbitemRepository.GetQueryableAsync() on registerCheckAsbitem.AsbitemId equals asbitem.Id + join itemType in await _itemTypeRepository.GetQueryableAsync() on asbitem.ItemTypeId equals itemType.Id + join organizationUnit in await _organizationUnitRepository.GetQueryableAsync() on registerCheckAsbitem.MedicalCenterId equals organizationUnit.Id into organizationUnitTemp + from medicalCenterHaveEmpty in organizationUnitTemp.DefaultIfEmpty() + select new + { + patientRegister, + patient, + registerCheck, + registerCheckAsbitem, + asbitem, + itemType, + medicalCenterHaveEmpty + }; + + #region 条件筛选 + if (input.CustomerOrgIds.Any()) + { + List CustomerOrgIds = new List(); + + foreach (var item in input.CustomerOrgIds) + { + CustomerOrgIds.AddRange(await _customerOrgManager.GetCustomerOrgChildrenId(item)); + } + + query = query.Where(m => CustomerOrgIds.Contains(m.patientRegister.CustomerOrgId)); + } + + + if (input.MedicalTypeIds.Any()) + { + query = query.Where(m => m.patientRegister.MedicalTypeId != null && input.MedicalTypeIds.Contains(m.patientRegister.MedicalTypeId.Value)); + } + + if (input.PersonnelTypeIds.Any()) + { + query = query.Where(m => m.patientRegister.PersonnelTypeId != null && input.PersonnelTypeIds.Contains(m.patientRegister.PersonnelTypeId.Value)); + } + + if (input.Salesmans.Any()) + { + query = query.Where(m => input.Salesmans.Contains(m.patientRegister.Salesman)); + } + + if (input.IsPreRegistration == 'N') + { + query = query.Where(m => m.patientRegister.CompleteFlag != PatientRegisterCompleteFlag.PreRegistration); + } + + if (!string.IsNullOrEmpty(input.StartDate) && !string.IsNullOrEmpty(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.IsMedicalStart == 'Y' && 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') + { + query = query.Where(m => m.patientRegister.SummaryDate != null && m.patientRegister.SummaryDate >= Convert.ToDateTime(input.StartDate) && + m.patientRegister.SummaryDate < Convert.ToDateTime(input.EndDate).AddDays(1)); + } + else if (input.DateType == '6') + { + + var chargedPatientRegisterIds = (await _chargeRepository.GetQueryableAsync()) + .Where(c => c.CreationTime >= Convert.ToDateTime(input.StartDate) && c.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)) + .Select(c => c.PatientRegisterId) + .Distinct() + .ToList(); + + query = query.Where(x => chargedPatientRegisterIds.Contains(x.patientRegister.Id)); + } + } + + if (!string.IsNullOrWhiteSpace(input.PatientName)) + { + query = query.Where(m => m.patientRegister.PatientName == input.PatientName); + } + if (!string.IsNullOrWhiteSpace(input.PatientNo)) + { + query = query.Where(m => m.patient.PatientNo == input.PatientNo); + } + if (!string.IsNullOrWhiteSpace(input.PatientRegisterNo)) + { + query = query.Where(m => m.patientRegister.PatientRegisterNo == input.PatientRegisterNo); + } + if (input.ItemTypeIds.Any()) + { + List ids = new List(); + + foreach (var item in input.ItemTypeIds) + { + var itemTypeIds = await _itemTypeManager.GetChildItemTypeIdsAsync(item); + ids.AddRange(itemTypeIds); + } + + query = query.Where(m => ids.Contains(m.asbitem.ItemTypeId)); + + } + #endregion + + + + var queryList = query.ToList().Select(s => new GetRegisterItemByMedicalCenterIdStatisticsGroupByDto + { + AsbitemName = s.asbitem.DisplayName, + //ItemTypeName = s.itemType.DisplayName, + ItemTypeId = s.itemType.Id, + MedicalCenterName = s.medicalCenterHaveEmpty == null ? "" : s.medicalCenterHaveEmpty.DisplayName, + Amount = s.registerCheckAsbitem.Amount, + AsbitemId = s.registerCheckAsbitem.AsbitemId, + ChargePrice = s.registerCheckAsbitem.ChargePrice, + IsCharge = s.registerCheckAsbitem.IsCharge, + StandardPrice = s.registerCheckAsbitem.StandardPrice, + CompleteFlag = s.registerCheck.CompleteFlag, + PatientRegisterId = s.patientRegister.Id, + AsbitemDisplayOrder = s.asbitem.DisplayOrder, + // ItemTypeDisplayOrder = s.itemType.DisplayOrder + }).ToList(); + + #region 科室处理 + + // 1. 先获取所有ItemType并建立层级映射 + var allItemTypes = (await _itemTypeRepository.GetQueryableAsync()) + .ToList(); + + // 3. 创建映射:子ItemTypeId -> 父ItemType完整信息 + var itemTypeParentMap = new Dictionary(); + + foreach (var itemType in allItemTypes) + { + if (itemType.PathCode.Length == 5) + { + // 自身就是父级 + itemTypeParentMap[itemType.Id] = itemType; + } + } + + foreach (var itemType in allItemTypes.Where(it => it.PathCode.Length > 5)) + { + var parentPathCode = itemType.PathCode.Substring(0, 5); + var parent = allItemTypes.FirstOrDefault(it => it.PathCode == parentPathCode); + if (parent != null) + { + itemTypeParentMap[itemType.Id] = parent; + } + } + #endregion + + + foreach (var item in queryList) + { + if (itemTypeParentMap.TryGetValue(item.ItemTypeId, out var parentItemType)) + { + item.ItemTypeId = parentItemType.Id; + item.ItemTypeName = parentItemType.DisplayName; + item.ItemTypeDisplayOrder = parentItemType.DisplayOrder; + } + } + + + var entListDto = queryList.GroupBy(g => g.ItemTypeId).Select(s => new GetRegisterItemByMedicalCenterIdStatisticsDto + { + ItemTypeName = s.FirstOrDefault().ItemTypeName, + AsbitemDetails = s.GroupBy(g => g.AsbitemId).Select(ss => new GetRegisterItemByMedicalCenterIdStatisticsAsbitemDto + { + AsbitemName = ss.FirstOrDefault().AsbitemName, + Details = ss.GroupBy(g => g.MedicalCenterName).Select(sss => new GetRegisterItemByMedicalCenterIdStatisticsAsbitemDetailDto + { + CheckCount = sss.Count(c => c.CompleteFlag == RegisterCheckCompleteFlag.Checked), + RegisterCount = sss.Count(), + MedicalCenterName = sss.Key, + StandardAmount = sss.Sum(sm => sm.StandardPrice * sm.Amount), + ReceivableAmount = sss.Sum(sm => sm.ChargePrice * sm.Amount), + ReceivedAmount = sss.Where(m => m.IsCharge == 'Y').Sum(sm => sm.ChargePrice * sm.Amount) + }).ToList() + }).ToList() + + }).ToList(); + + + return entListDto; + + } + + #region 单位个人已检统计