Browse Source

统计体检中心项目

master
wxd 19 hours ago
parent
commit
09247f06bc
  1. 101
      src/Shentun.Peis.Application.Contracts/CustomerReports/GetRegisterItemByMedicalCenterIdStatisticsDto.cs
  2. 50
      src/Shentun.Peis.Application.Contracts/CustomerReports/GetRegisterItemByMedicalCenterIdStatisticsInputDto.cs
  3. 213
      src/Shentun.Peis.Application/CustomerReports/CustomerReportAppService.cs

101
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
{
/// <summary>
/// 科室 一级
/// </summary>
public string ItemTypeName { get; set; }
public List<GetRegisterItemByMedicalCenterIdStatisticsAsbitemDto> AsbitemDetails { get; set; } = new List<GetRegisterItemByMedicalCenterIdStatisticsAsbitemDto>();
}
public class GetRegisterItemByMedicalCenterIdStatisticsAsbitemDto
{
public string AsbitemName { get; set; }
public List<GetRegisterItemByMedicalCenterIdStatisticsAsbitemDetailDto> Details { get; set; } = new List<GetRegisterItemByMedicalCenterIdStatisticsAsbitemDetailDto>();
}
public class GetRegisterItemByMedicalCenterIdStatisticsAsbitemDetailDto
{
public string MedicalCenterName { get; set; }
/// <summary>
/// 登记人数
/// </summary>
public int RegisterCount { get; set; }
/// <summary>
/// 已检人数
/// </summary>
public int CheckCount { get; set; }
/// <summary>
/// 标准金额
/// </summary>
public decimal StandardAmount { get; set; }
/// <summary>
/// 应收金额
/// </summary>
public decimal ReceivableAmount { get; set; }
/// <summary>
/// 实收金额
/// </summary>
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; }
/// <summary>
/// 实收价格
/// </summary>
public decimal ChargePrice { get; set; }
/// <summary>
/// 数量
/// </summary>
public short Amount { get; set; }
/// <summary>
/// 是否已收费
/// </summary>
public char IsCharge { get; set; }
/// <summary>
/// 完成标志 0(为未检), 1(已检), 2(弃检)
/// </summary>
public char CompleteFlag { get; set; }
}
}

50
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<Guid> CustomerOrgIds { get; set; } = new List<Guid>();
public List<Guid> MedicalTypeIds { get; set; } = new List<Guid>();
public List<Guid> PersonnelTypeIds { get; set; } = new List<Guid>();
public List<string> Salesmans { get; set; } = new List<string>();
/// <summary>
/// 日期类型(1、登记日期 2、体检日期 3、总检日期 6.收费日期)
/// </summary>
public char DateType { get; set; }
/// <summary>
/// 开始日期
/// </summary>
public string StartDate { get; set; }
/// <summary>
/// 结束日期
/// </summary>
public string EndDate { get; set; }
/// <summary>
/// 是否需要统计预登记 默认为N 不统计 需要统计传Y
/// </summary>
public char IsPreRegistration { get; set; } = 'N';
public string PatientNo { get; set; }
public string PatientRegisterNo { get; set; }
public string PatientName { get; set; }
/// <summary>
/// 一级科室id
/// </summary>
public List<Guid> ItemTypeIds { get; set; } = new List<Guid>();
}
}

213
src/Shentun.Peis.Application/CustomerReports/CustomerReportAppService.cs

@ -16,6 +16,7 @@ using Org.BouncyCastle.Crypto.Tls;
using Shentun.Peis.CustomerOrgs; using Shentun.Peis.CustomerOrgs;
using Shentun.Peis.Enums; using Shentun.Peis.Enums;
using Shentun.Peis.InternalReports; using Shentun.Peis.InternalReports;
using Shentun.Peis.ItemTypes;
using Shentun.Peis.Models; using Shentun.Peis.Models;
using Shentun.Peis.PatientRegisters; using Shentun.Peis.PatientRegisters;
using Shentun.Peis.PeisReports; using Shentun.Peis.PeisReports;
@ -78,7 +79,8 @@ namespace Shentun.Peis.CustomerReports
private readonly IRepository<PayMode> _payModeRepository; private readonly IRepository<PayMode> _payModeRepository;
private readonly IRepository<ChargeBack, Guid> _chargeBackRepository; private readonly IRepository<ChargeBack, Guid> _chargeBackRepository;
private readonly IRepository<ChargeBackPay, Guid> _chargeBackPayRepository; private readonly IRepository<ChargeBackPay, Guid> _chargeBackPayRepository;
private readonly ItemTypeManager _itemTypeManager;
private readonly IRepository<Volo.Abp.Identity.OrganizationUnit> _organizationUnitRepository;
public CustomerReportAppService( public CustomerReportAppService(
IRepository<Patient, Guid> patientRepository, IRepository<Patient, Guid> patientRepository,
@ -111,7 +113,9 @@ namespace Shentun.Peis.CustomerReports
IRepository<ChargePay, Guid> chargePayRepository, IRepository<ChargePay, Guid> chargePayRepository,
IRepository<PayMode> payModeRepository, IRepository<PayMode> payModeRepository,
IRepository<ChargeBack, Guid> chargeBackRepository, IRepository<ChargeBack, Guid> chargeBackRepository,
IRepository<ChargeBackPay, Guid> chargeBackPayRepository)
IRepository<ChargeBackPay, Guid> chargeBackPayRepository,
ItemTypeManager itemTypeManager,
IRepository<Volo.Abp.Identity.OrganizationUnit> organizationUnitRepository)
{ {
this._patientRepository = patientRepository; this._patientRepository = patientRepository;
this._patientRegisterRepository = patientRegisterRepository; this._patientRegisterRepository = patientRegisterRepository;
@ -144,6 +148,8 @@ namespace Shentun.Peis.CustomerReports
_payModeRepository = payModeRepository; _payModeRepository = payModeRepository;
_chargeBackRepository = chargeBackRepository; _chargeBackRepository = chargeBackRepository;
_chargeBackPayRepository = chargeBackPayRepository; _chargeBackPayRepository = chargeBackPayRepository;
_itemTypeManager = itemTypeManager;
_organizationUnitRepository = organizationUnitRepository;
} }
@ -4870,6 +4876,209 @@ namespace Shentun.Peis.CustomerReports
} }
/// <summary>
/// 按体检中心统计项目数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("api/app/CustomerReport/GetRegisterItemByMedicalCenterIdStatistics")]
public async Task<List<GetRegisterItemByMedicalCenterIdStatisticsDto>> 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<Guid?> CustomerOrgIds = new List<Guid?>();
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<Guid> ids = new List<Guid>();
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<Guid, ItemType>();
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 单位个人已检统计 #region 单位个人已检统计

Loading…
Cancel
Save