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 单位个人已检统计