using JetBrains.Annotations; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using NPOI.SS.Formula.Functions; using Shentun.Peis.Charges; using Shentun.Peis.Enums; using Shentun.Peis.ItemTypes; using Shentun.Peis.Models; using Shentun.Peis.Patients; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using TencentCloud.Faceid.V20180301.Models; using TencentCloud.Mrs.V20200910.Models; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; using Volo.Abp.OpenIddict.Applications; using Volo.Abp.Users; namespace Shentun.Peis.ChargeReports { /// /// 收费统计报表 /// [Authorize] [ApiExplorerSettings(GroupName = "Work")] public class ChargeReportAppService : ApplicationService { private readonly IRepository _chargeRepository; private readonly IRepository _chargePayRepository; private readonly IRepository _chargeAsbitemRepository; private readonly IRepository _payModeRepository; private readonly IRepository _chargeBackRepository; private readonly IRepository _chargeBackPayRepository; private readonly IRepository _userRepository; private readonly IRepository _asbitemRepository; private readonly IRepository _invoiceItemTypeRepository; private readonly IRepository _patientRegisterRepository; private readonly IRepository _registerAsbitemRepository; private readonly IRepository _customerOrgRegisterRepository; private readonly IRepository _customerOrgRepository; private readonly IRepository _itemTypeRepository; private readonly IRepository _patientRepository; private readonly IRepository _sexRepository; private readonly ItemTypeManager _itemTypeManager; public ChargeReportAppService( IRepository chargeRepository, IRepository chargeBackRepository, IRepository chargePayRepository, IRepository payModeRepository, IRepository chargeBackPayRepository, IRepository userRepository, IRepository chargeAsbitemRepository, IRepository asbitemRepository, IRepository invoiceItemTypeRepository, IRepository patientRegisterRepository, IRepository registerAsbitemRepository, IRepository customerOrgRegisterRepository, IRepository customerOrgRepository, IRepository itemTypeRepository, ItemTypeManager itemTypeManager , IRepository patientRepository, IRepository sexRepository) { _chargeRepository = chargeRepository; _chargeBackRepository = chargeBackRepository; _chargePayRepository = chargePayRepository; _payModeRepository = payModeRepository; _chargeBackPayRepository = chargeBackPayRepository; _userRepository = userRepository; _chargeAsbitemRepository = chargeAsbitemRepository; _asbitemRepository = asbitemRepository; _invoiceItemTypeRepository = invoiceItemTypeRepository; _patientRegisterRepository = patientRegisterRepository; _registerAsbitemRepository = registerAsbitemRepository; _customerOrgRegisterRepository = customerOrgRegisterRepository; _customerOrgRepository = customerOrgRepository; _itemTypeRepository = itemTypeRepository; _itemTypeManager = itemTypeManager; _patientRepository = patientRepository; _sexRepository = sexRepository; } /// /// 收费员收费报表 按支付方式 /// /// /// [HttpPost("api/app/charge-report/get-toll-collector-fee-report-in-pay-mode")] public async Task GetTollCollectorFeeReportInPayModeAsync(GetTollCollectorFeeReportInPayModeRequestDto input) { #region 收费 var chargeQuery = from a in await _chargeRepository.GetQueryableAsync() join b in await _chargePayRepository.GetQueryableAsync() on a.Id equals b.ChargeId join c in await _payModeRepository.GetQueryableAsync() on b.PayModeId equals c.Id into cc from ac in cc.DefaultIfEmpty() join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd from ad in dd.DefaultIfEmpty() select new { a, b, PayModeName = ac != null ? ac.DisplayName : "", UserName = ad != null ? ad.UserName : "" }; if (input.UserIds.Any()) { chargeQuery = chargeQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } //收费归总 var chargeDetails = chargeQuery.GroupBy(g => g.a.CreatorId).Select(s => new GetChargeAndChargeBackSummary_ChargeDetail { UserName = s.FirstOrDefault().UserName, PayModeDetails = s.GroupBy(gg => gg.b.PayModeId).Select(ss => new GetChargeAndChargeBackSummary_PayModeDetail { PayModeName = ss.FirstOrDefault().PayModeName, Money = DataHelper.DecimalRetainDecimals(ss.Sum(sss => sss.b.ChargeMoney), 2) }).ToList() }); #endregion #region 退费 var chargeBackQuery = from a in await _chargeBackRepository.GetQueryableAsync() join b in await _chargeBackPayRepository.GetQueryableAsync() on a.Id equals b.ChargeBackId join c in await _payModeRepository.GetQueryableAsync() on b.PayModeId equals c.Id into cc from ac in cc.DefaultIfEmpty() join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd from ad in dd.DefaultIfEmpty() select new { a, b, PayModeName = ac != null ? ac.DisplayName : "", UserName = ad != null ? ad.UserName : "" }; if (input.UserIds.Any()) { chargeBackQuery = chargeBackQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { chargeBackQuery = chargeBackQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } //收费归总 var chargeBackDetails = chargeBackQuery.GroupBy(g => g.a.CreatorId).Select(s => new GetChargeAndChargeBackSummary_ChargeBackDetail { UserName = s.FirstOrDefault().UserName, PayModeDetails = s.GroupBy(gg => gg.b.PayModeId).Select(ss => new GetChargeAndChargeBackSummary_PayModeDetail { PayModeName = ss.FirstOrDefault().PayModeName, Money = DataHelper.DecimalRetainDecimals(ss.Sum(sss => sss.b.BackMoeny), 2) }).ToList() }); #endregion #region 拼接收费数据 List chargeAndChargeBackDetails = new List(); //去重所有收费员 var userNameList = chargeDetails.ToList().Select(s => s.UserName).Union(chargeBackDetails.ToList().Select(s => s.UserName)); foreach (var userName in userNameList) { //添加收费数据 foreach (var payMode in chargeDetails.Where(m => m.UserName == userName).FirstOrDefault().PayModeDetails) { chargeAndChargeBackDetails.Add(new GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail { ChargeName = userName, PayModeName = payMode.PayModeName, ChargeMoney = payMode.Money, ChargeBackMoney = 0 }); } //添加退费数据 foreach (var payMode in chargeBackDetails.Where(m => m.UserName == userName).FirstOrDefault().PayModeDetails) { //支付方式是否已存在 var isPayModeName = chargeAndChargeBackDetails.Where(m => m.ChargeName == userName && m.PayModeName == payMode.PayModeName).FirstOrDefault(); if (isPayModeName != null) { //收费处已存在 chargeAndChargeBackDetails.ForEach(m => { if (m.PayModeName == payMode.PayModeName && m.ChargeName == userName) { m.ChargeBackMoney = payMode.Money; m.TotalMoney = m.ChargeMoney - payMode.Money; } }); } else { chargeAndChargeBackDetails.Add(new GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail { ChargeName = userName, PayModeName = payMode.PayModeName, ChargeMoney = 0, ChargeBackMoney = payMode.Money, TotalMoney = 0 - payMode.Money }); } } } #endregion string chargeDate = Convert.ToDateTime(input.StartDate).ToString("yyyy年MM月dd日") + "到" + Convert.ToDateTime(input.EndDate).ToString("yyyy年MM月dd日"); var tollCollectorFeeReportInPayModeDto = new GetTollCollectorFeeReportInPayModeDto { ChargeDate = chargeDate, ChargeCount = chargeQuery.GroupBy(g => g.a.Id).Count(), ChargeBackCount = chargeBackQuery.GroupBy(g => g.a.Id).Count(), ChargeDetails = chargeAndChargeBackDetails, SumTotalMoney = chargeAndChargeBackDetails.Any() ? DataHelper.DecimalRetainDecimals(chargeAndChargeBackDetails.Sum(s => s.TotalMoney), 2) : 0 }; return tollCollectorFeeReportInPayModeDto; } /// /// 收费员收费报表 按发票类型 /// /// /// [HttpPost("api/app/charge-report/get-toll-collector-fee-report-in-invoice-type")] public async Task GetTollCollectorFeeReportInInvoiceTypeAsync(GetTollCollectorFeeReportInInvoiceTypeRequestDto input) { #region 收费 var chargeQuery = from a in await _chargeRepository.GetQueryableAsync() join b in await _chargeAsbitemRepository.GetQueryableAsync() on a.Id equals b.ChargeId join c in await _asbitemRepository.GetQueryableAsync() on b.AsbitemId equals c.Id into cc from ac in cc.DefaultIfEmpty() join e in await _invoiceItemTypeRepository.GetQueryableAsync() on ac.InvoiceItemTypeId equals e.Id into ee from ae in ee.DefaultIfEmpty() join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd from ad in dd.DefaultIfEmpty() select new { a, b, ac, InvoiceItemTypeName = ae != null ? ae.DisplayName : "", UserName = ad != null ? ad.UserName : "" }; if (input.UserIds.Any()) { chargeQuery = chargeQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } //收费归总 var chargeDetails = chargeQuery.GroupBy(g => g.ac.InvoiceItemTypeId).Select(s => new GetTollCollectorFeeReportInInvoiceType_InvoiceTypeDetail { InvoiceTypeName = s.FirstOrDefault().InvoiceItemTypeName, InvoiceTypeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.b.Amount * ss.b.ChargePrice), 2) }).ToList(); #endregion #region 退费 var chargeBackQuery = from a in await _chargeBackRepository.GetQueryableAsync() join b in await _chargeRepository.GetQueryableAsync() on a.ChargeId equals b.Id join c in await _chargeAsbitemRepository.GetQueryableAsync() on b.Id equals c.ChargeId join d in await _asbitemRepository.GetQueryableAsync() on c.AsbitemId equals d.Id into dd from ad in dd.DefaultIfEmpty() join e in await _invoiceItemTypeRepository.GetQueryableAsync() on ad.InvoiceItemTypeId equals e.Id into ee from ae in ee.DefaultIfEmpty() join f in await _userRepository.GetQueryableAsync() on a.CreatorId equals f.Id into ff from af in ff.DefaultIfEmpty() select new { a, c, ad, InvoiceItemTypeName = ae != null ? ae.DisplayName : "", UserName = af != null ? af.UserName : "" }; if (input.UserIds.Any()) { chargeBackQuery = chargeBackQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { chargeBackQuery = chargeBackQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } //收费归总 var chargeBackDetails = chargeBackQuery.GroupBy(g => g.ad.InvoiceItemTypeId).Select(s => new GetTollCollectorFeeReportInInvoiceType_InvoiceTypeDetail { InvoiceTypeName = s.FirstOrDefault().InvoiceItemTypeName, InvoiceTypeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.c.Amount * ss.c.ChargePrice), 2) }).ToList(); #endregion string chargeDate = Convert.ToDateTime(input.StartDate).ToString("yyyy年MM月dd日") + "到" + Convert.ToDateTime(input.EndDate).ToString("yyyy年MM月dd日"); //收款合计 decimal chargeTotalMoney = chargeDetails.Any() ? DataHelper.DecimalRetainDecimals(chargeDetails.Sum(s => s.InvoiceTypeMoney), 2) : 0; //退费合计 decimal chargeBackTotalMoney = chargeBackDetails.Any() ? DataHelper.DecimalRetainDecimals(chargeBackDetails.Sum(s => s.InvoiceTypeMoney), 2) : 0; var tollCollectorFeeReportInInvoiceTypeDto = new GetTollCollectorFeeReportInInvoiceTypeDto { ChargeDate = chargeDate, ChargeCount = chargeQuery.GroupBy(g => g.a.Id).Count(), ChargeBackCount = chargeBackQuery.GroupBy(g => g.a.Id).Count(), ChargeDetails = new GetTollCollectorFeeReportInInvoiceType_ChargeDetail { InvoiceTypeDetails = chargeDetails, TotalMoney = chargeTotalMoney }, ChargeBackDetails = new GetTollCollectorFeeReportInInvoiceType_ChargeBackDetail { InvoiceTypeDetails = chargeBackDetails, TotalMoney = chargeBackTotalMoney }, SumTotalMoney = chargeTotalMoney - chargeBackTotalMoney }; return tollCollectorFeeReportInInvoiceTypeDto; } /// /// 收费员收费报表 按组合项目 /// /// /// [HttpPost("api/app/charge-report/get-toll-collector-fee-report-in-asbitem")] public async Task> GetTollCollectorFeeReportInAsbitemAsync(GetTollCollectorFeeReportInAsbitemRequestDto input) { var query = from a in await _chargeRepository.GetQueryableAsync() join b in await _chargeAsbitemRepository.GetQueryableAsync() on a.Id equals b.ChargeId join c in await _asbitemRepository.GetQueryableAsync() on b.AsbitemId equals c.Id into cc from ac in cc.DefaultIfEmpty() join d in await _itemTypeRepository.GetQueryableAsync() on ac.ItemTypeId equals d.Id into dd from ad in dd.DefaultIfEmpty() select new { a, b, AsbitemName = ac != null ? ac.DisplayName : "", ItemTypeName = ad != null ? ad.DisplayName : "" }; if (input.UserIds.Any()) { query = query.Where(m => input.UserIds.Contains(m.a.CreatorId.Value)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } var asbitemGroup = query.GroupBy(g => g.b.AsbitemId).Select(s => new GetTollCollectorFeeReportInAsbitem_Detail { AsbitemName = s.FirstOrDefault().AsbitemName, ChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.b.ChargePrice * ss.b.Amount), 2), ItemTypeName = s.FirstOrDefault().ItemTypeName }).ToList(); var tollCollectorFeeReportInAsbitemDtos = asbitemGroup.GroupBy(g => g.ItemTypeName).Select(s => new GetTollCollectorFeeReportInAsbitemDto { Details = s.ToList(), ItemTypeName = s.FirstOrDefault().ItemTypeName, TotalMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.ChargeMoney), 2) }).ToList(); return tollCollectorFeeReportInAsbitemDtos; } /// /// 个人收费明细报表 按收费明细 /// /// /// [HttpPost("api/app/charge-report/get-Personal-Fee-Details-report-in-fee-details")] public async Task> GetPersonalFeeDetailsReportInFeeDetailsAsync(GetPersonalFeeDetailsReportInFeeDetailsRequestDto input) { var query = from a in await _chargeRepository.GetQueryableAsync() join b in await _chargeAsbitemRepository.GetQueryableAsync() on a.Id equals b.ChargeId join c in await _patientRegisterRepository.GetQueryableAsync() on a.PatientRegisterId equals c.Id join d in await _patientRepository.GetQueryableAsync() on c.PatientId equals d.Id into dd from ad in dd.DefaultIfEmpty() join e in await _sexRepository.GetQueryableAsync() on c.SexId equals e.Id into ee from ae in ee.DefaultIfEmpty() join f in await _registerAsbitemRepository.GetQueryableAsync() on c.Id equals f.PatientRegisterId join g in await _asbitemRepository.GetQueryableAsync() on f.AsbitemId equals g.Id into gg from ag in gg.DefaultIfEmpty() join h in await _userRepository.GetQueryableAsync() on a.CreatorId equals h.Id into hh from ah in hh.DefaultIfEmpty() where c.CustomerOrgId == GuidFlag.PersonCustomerOrgId && a.ChargeFlag == ChargeFlag.Charge select new { a, b, c, f, PatientNo = ad != null ? ad.PatientNo : "", SexName = ae != null ? ae.DisplayName : "", AsbitemName = ag != null ? ag.DisplayName : "", BookKeepingName = ah != null ? ah.UserName : "" }; if (input.UserIds.Any()) { query = query.Where(m => input.UserIds.Contains(m.a.CreatorId.Value)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } if (!string.IsNullOrWhiteSpace(input.PatientName)) { query = query.Where(m => m.c.PatientName == input.PatientName); } if (!string.IsNullOrWhiteSpace(input.PatientNo)) { query = query.Where(m => m.PatientNo == input.PatientNo); } var patientRegisterGroup = query.Select(s => new GetPersonalFeeDetailsReportInFeeDetailsDto { Age = s.c.Age, AsbitemName = s.AsbitemName, BookKeepingName = s.BookKeepingName, BookkeepingTiem = s.a.CreationTime.ToString("yyyy-MM-dd HH:mm"), CharePrice = DataHelper.DecimalRetainDecimals(s.b.ChargePrice * s.b.Amount, 2), MedicalTimes = s.c.MedicalTimes, PatientName = s.c.PatientName, PatientNo = s.PatientNo, SexName = s.SexName, StandardPrice = DataHelper.DecimalRetainDecimals(s.f.StandardPrice * s.f.Amount, 2), Discount = Math.Floor((s.b.ChargePrice * s.b.Amount) / (s.f.StandardPrice.Value * s.f.Amount.Value)) + "%" }).ToList(); return patientRegisterGroup; } /// /// 个人收费明细报表 按退费明细 /// /// /// [HttpPost("api/app/charge-report/get-Personal-Fee-Details-report-in-refund-details")] public async Task> GetPersonalFeeDetailsReportInRefundDetailsAsync(GetPersonalFeeDetailsReportInRefundDetailsRequestDto input) { var query = from a in await _chargeRepository.GetQueryableAsync() join b in await _chargeAsbitemRepository.GetQueryableAsync() on a.Id equals b.ChargeId join c in await _patientRegisterRepository.GetQueryableAsync() on a.PatientRegisterId equals c.Id join d in await _patientRepository.GetQueryableAsync() on c.PatientId equals d.Id into dd from ad in dd.DefaultIfEmpty() join e in await _sexRepository.GetQueryableAsync() on c.SexId equals e.Id into ee from ae in ee.DefaultIfEmpty() join f in await _registerAsbitemRepository.GetQueryableAsync() on c.Id equals f.PatientRegisterId join g in await _asbitemRepository.GetQueryableAsync() on f.AsbitemId equals g.Id into gg from ag in gg.DefaultIfEmpty() join h in await _userRepository.GetQueryableAsync() on a.CreatorId equals h.Id into hh from ah in hh.DefaultIfEmpty() where c.CustomerOrgId == GuidFlag.PersonCustomerOrgId && a.ChargeFlag == ChargeFlag.ChargeBack select new { a, b, c, f, PatientNo = ad != null ? ad.PatientNo : "", SexName = ae != null ? ae.DisplayName : "", AsbitemName = ag != null ? ag.DisplayName : "", BookKeepingName = ah != null ? ah.UserName : "" }; if (input.UserIds.Any()) { query = query.Where(m => input.UserIds.Contains(m.a.CreatorId.Value)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } if (!string.IsNullOrWhiteSpace(input.PatientName)) { query = query.Where(m => m.c.PatientName == input.PatientName); } if (!string.IsNullOrWhiteSpace(input.PatientNo)) { query = query.Where(m => m.PatientNo == input.PatientNo); } var patientRegisterGroup = query.Select(s => new GetPersonalFeeDetailsReportInRefundDetailsDto { Age = s.c.Age, AsbitemName = s.AsbitemName, BookKeepingName = s.BookKeepingName, BookkeepingTiem = s.a.CreationTime.ToString("yyyy-MM-dd HH:mm"), CharePrice = DataHelper.DecimalRetainDecimals(s.b.ChargePrice * s.b.Amount, 2), MedicalTimes = s.c.MedicalTimes, PatientName = s.c.PatientName, PatientNo = s.PatientNo, SexName = s.SexName, StandardPrice = DataHelper.DecimalRetainDecimals(s.f.StandardPrice * s.f.Amount, 2), Discount = Math.Floor((s.b.ChargePrice * s.b.Amount) / (s.f.StandardPrice.Value * s.f.Amount.Value)) + "%" }).ToList(); return patientRegisterGroup; } /// /// 个人收费明细报表 按收费汇总 /// /// /// [HttpPost("api/app/charge-report/get-Personal-Fee-Details-report-in-fee-summary")] public async Task GetPersonalFeeDetailsReportInFeeSummaryAsync(GetPersonalFeeDetailsReportInFeeSummaryRequestDto input) { var query = from a in await _patientRegisterRepository.GetQueryableAsync() join b in await _patientRepository.GetQueryableAsync() on a.PatientId equals b.Id into bb from ab in bb.DefaultIfEmpty() join c in await _sexRepository.GetQueryableAsync() on a.SexId equals c.Id into cc from ac in cc.DefaultIfEmpty() join d in (await _registerAsbitemRepository.GetQueryableAsync()).Where(m => m.IsCharge == 'Y') .GroupBy(g => g.PatientRegisterId) .Select(s => new { PatientRegisterId = s.Key, AsbitemChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.ChargePrice.Value * ss.Amount.Value), 2) }) on a.Id equals d.PatientRegisterId join e in await _chargeRepository.GetQueryableAsync() on a.Id equals e.PatientRegisterId join f in await _chargePayRepository.GetQueryableAsync() on e.Id equals f.ChargeId join g in await _payModeRepository.GetQueryableAsync() on f.PayModeId equals g.Id into gg from ag in gg.DefaultIfEmpty() join h in await _userRepository.GetQueryableAsync() on e.CreatorId equals h.Id into hh from ah in hh.DefaultIfEmpty() where a.CustomerOrgGroupId == GuidFlag.PersonCustomerOrgId select new { a, e, f, PatientName = a.PatientName, Age = a.Age, PatientNo = ab != null ? ab.PatientNo : "", SexName = ac != null ? ac.DisplayName : "", AsbitemChargeMoney = d.AsbitemChargeMoney, BookKeepingName = ah != null ? ah.UserName : "", PayModeName = ag != null ? ag.DisplayName : "" }; if (input.UserIds.Any()) { query = query.Where(m => input.UserIds.Contains(m.e.CreatorId.Value)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { query = query.Where(m => m.e.CreationTime >= Convert.ToDateTime(input.StartDate) && m.e.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } if (!string.IsNullOrWhiteSpace(input.PatientName)) { query = query.Where(m => m.PatientName == input.PatientName); } if (!string.IsNullOrWhiteSpace(input.PatientNo)) { query = query.Where(m => m.PatientNo == input.PatientNo); } var personalFeeDetailsReportInFeeSummary_Details = query.GroupBy(g => g.e.Id).Select(s => new GetPersonalFeeDetailsReportInFeeSummary_Detail { Age = s.FirstOrDefault().Age, BookKeepingName = s.FirstOrDefault().BookKeepingName, BookkeepingTiem = s.FirstOrDefault().e.CreationTime.ToString("yyyy-MM-dd HH:mm"), ChargeFlagName = s.FirstOrDefault().e.ChargeFlag == ChargeFlag.Charge ? "收费" : "退费", ChargeMoney = s.FirstOrDefault().AsbitemChargeMoney, PatientName = s.FirstOrDefault().PatientName, PatientNo = s.FirstOrDefault().PatientNo, ReceivedChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.f.ChargeMoney), 2), SexName = s.FirstOrDefault().SexName, DiscountMoney = s.FirstOrDefault().AsbitemChargeMoney - DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.f.ChargeMoney), 2), PayModes = s.Select(ss => new GetPersonalFeeDetailsReportInFeeSummary_PayMode { PayModeName = ss.PayModeName, ReceivedChargeMoney = ss.f.ChargeMoney }).ToList() }).ToList(); decimal sumChargeMoney = personalFeeDetailsReportInFeeSummary_Details.Any() ? DataHelper.DecimalRetainDecimals(personalFeeDetailsReportInFeeSummary_Details.Sum(s => s.ChargeMoney), 2) : 0; decimal sumDiscountMoney = personalFeeDetailsReportInFeeSummary_Details.Any() ? DataHelper.DecimalRetainDecimals(personalFeeDetailsReportInFeeSummary_Details.Sum(s => s.DiscountMoney), 2) : 0; decimal sumReceivedChargeMoney = personalFeeDetailsReportInFeeSummary_Details.Any() ? DataHelper.DecimalRetainDecimals(personalFeeDetailsReportInFeeSummary_Details.Sum(s => s.ReceivedChargeMoney), 2) : 0; var personalFeeDetailsReportInFeeSummaryDto = new GetPersonalFeeDetailsReportInFeeSummaryDto { ChargeCount = personalFeeDetailsReportInFeeSummary_Details.Count, Details = personalFeeDetailsReportInFeeSummary_Details, SumChargeMoney = sumChargeMoney, SumDiscountMoney = sumDiscountMoney, SumReceivedChargeMoney = sumReceivedChargeMoney }; return personalFeeDetailsReportInFeeSummaryDto; } /// /// 收费人收费汇总报表 /// /// /// [HttpPost("api/app/charge-report/get-toll-collector-fee-summary-report")] public async Task GetTollcollectorFeeSummaryReportAsync(GetTollcollectorFeeSummaryReportRequestDto input) { #region 收费 var chargeQuery = from a in await _chargeRepository.GetQueryableAsync() join b in await _chargePayRepository.GetQueryableAsync() on a.Id equals b.ChargeId join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd from ad in dd.DefaultIfEmpty() select new { a, b, UserName = ad != null ? ad.UserName : "" }; if (input.UserIds.Any()) { chargeQuery = chargeQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } //收费归总 var chargeDetails = chargeQuery.GroupBy(g => g.a.CreatorId).Select(s => new GetTollcollectorFeeSummaryReport_Detail { ChargeBackMoney = 0, ChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.b.ChargeMoney), 2), ChargeName = s.FirstOrDefault().UserName, TotalMoney = 0 }).ToList(); #endregion #region 退费 var chargeBackQuery = from a in await _chargeBackRepository.GetQueryableAsync() join b in await _chargeBackPayRepository.GetQueryableAsync() on a.Id equals b.ChargeBackId join d in await _userRepository.GetQueryableAsync() on a.CreatorId equals d.Id into dd from ad in dd.DefaultIfEmpty() select new { a, b, UserName = ad != null ? ad.UserName : "" }; if (input.UserIds.Any()) { chargeBackQuery = chargeBackQuery.Where(m => input.UserIds.Contains(m.a.CreatorId.Value)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { chargeBackQuery = chargeBackQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } //收费归总 var chargeBackDetails = chargeBackQuery.GroupBy(g => g.a.CreatorId).Select(s => new GetTollcollectorFeeSummaryReport_Detail { ChargeBackMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.b.BackMoeny), 2), ChargeMoney = 0, ChargeName = s.FirstOrDefault().UserName, TotalMoney = 0 }).ToList(); #endregion #region 拼接收费数据 List tollcollectorFeeSummaryReport_Detail = new List(); //去重科室Id var ChargeNameList = chargeDetails.Select(s => s.ChargeName).Union(chargeBackDetails.Select(s => s.ChargeName)); foreach (var item in ChargeNameList) { var tempData = chargeDetails.Where(m => m.ChargeName == item).FirstOrDefault(); if (tempData != null) { var chargeBackDetail = chargeBackDetails.Where(m => m.ChargeName == item).FirstOrDefault(); if (chargeBackDetail != null) { tempData.ChargeBackMoney = chargeBackDetail.ChargeBackMoney; } } else { tempData = chargeBackDetails.Where(m => m.ChargeName == item).FirstOrDefault(); } tempData.TotalMoney = tempData.ChargeMoney - tempData.ChargeBackMoney; tollcollectorFeeSummaryReport_Detail.Add(tempData); } #endregion decimal sumChargeMoney = tollcollectorFeeSummaryReport_Detail.Any() ? DataHelper.DecimalRetainDecimals(tollcollectorFeeSummaryReport_Detail.Sum(s => s.ChargeMoney), 2) : 0; decimal sumChargeBackMoney = tollcollectorFeeSummaryReport_Detail.Any() ? DataHelper.DecimalRetainDecimals(tollcollectorFeeSummaryReport_Detail.Sum(s => s.ChargeBackMoney), 2) : 0; decimal sumTotalMoney = tollcollectorFeeSummaryReport_Detail.Any() ? DataHelper.DecimalRetainDecimals(tollcollectorFeeSummaryReport_Detail.Sum(s => s.TotalMoney), 2) : 0; var tollcollectorFeeSummaryReportDto = new GetTollcollectorFeeSummaryReportDto { Details = tollcollectorFeeSummaryReport_Detail, SumChargeMoney = sumChargeMoney, SumChargeBackMoney = sumChargeBackMoney, SumTotalMoney = sumTotalMoney }; return tollcollectorFeeSummaryReportDto; } /// /// 项目收费报表 /// /// /// [HttpPost("api/app/charge-report/get-project-fees-report")] public async Task GetProjectFeesReportAsync(GetProjectFeesReportRequestDto input) { #region 查询项目类别ID List itmeTypeIds = new List(); if (input.ItemTypeId != null) { itmeTypeIds = await _itemTypeManager.GetChildItemTypeIdsAsync(input.ItemTypeId.Value); } #endregion #region 登记 var query = from a in await _registerAsbitemRepository.GetQueryableAsync() join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb from ab in bb.DefaultIfEmpty() join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc from ac in cc.DefaultIfEmpty() where a.IsCharge == 'Y' select new { a, ab, ac, AsbitemName = ab != null ? ab.DisplayName : "", ItemTypeName = ac != null ? ac.DisplayName : "" }; if (itmeTypeIds.Any()) { query = query.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId)); } if (input.Asbitems.Any()) { query = query.Where(m => input.Asbitems.Contains(m.a.AsbitemId)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } //按项目类别分组 var itemTypeGroups = query.GroupBy(g => new { g.ab.ItemTypeId, g.a.AsbitemId }).Select(s => new GetProjectFeesReport_Detail { ItemTypeId = s.Key.ItemTypeId, AsbitemId = s.Key.AsbitemId, ItemTypeName = s.FirstOrDefault().ItemTypeName, AsbitemName = s.FirstOrDefault().AsbitemName, ChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.a.Amount.Value * ss.a.ChargePrice.Value), 2), ReceivedChargeMoney = 0 }).ToList(); #endregion #region 收费金额统计 var chargeQuery = from a in await _chargeAsbitemRepository.GetQueryableAsync() join d in await _chargeRepository.GetQueryableAsync() on a.ChargeId equals d.Id join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb from ab in bb.DefaultIfEmpty() join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc from ac in cc.DefaultIfEmpty() where d.ChargeFlag == ChargeFlag.Charge select new { a, ab, AsbitemName = ab != null ? ab.DisplayName : "", ItemTypeName = ac != null ? ac.DisplayName : "" }; if (itmeTypeIds.Any()) { chargeQuery = chargeQuery.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId)); } if (input.Asbitems.Any()) { query = query.Where(m => input.Asbitems.Contains(m.a.AsbitemId)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } //按项目类别分组 收费 var itemTypeGroupCharges = chargeQuery.GroupBy(g => new { g.ab.ItemTypeId, g.a.AsbitemId }).Select(s => new GetProjectFeesReport_Detail { ItemTypeId = s.Key.ItemTypeId, AsbitemId = s.Key.AsbitemId, ItemTypeName = s.FirstOrDefault().ItemTypeName, AsbitemName = s.FirstOrDefault().AsbitemName, ReceivedChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.a.Amount * ss.a.ChargePrice), 2), ChargeMoney = 0 }).ToList(); #endregion #region 拼接收费数据 List projectFeesReport_Details = new List(); //去重科室Id var itemTypeIdList = itemTypeGroups.Select(s => new { s.ItemTypeId, s.AsbitemId }).Union(itemTypeGroupCharges.Select(s => new { s.ItemTypeId, s.AsbitemId })); foreach (var item in itemTypeIdList) { var tempData = itemTypeGroups.Where(m => m.ItemTypeId == item.ItemTypeId && m.AsbitemId == item.AsbitemId).FirstOrDefault(); if (tempData != null) { var itemTypeGroupCharge = itemTypeGroupCharges.Where(m => m.ItemTypeId == item.ItemTypeId && m.AsbitemId == item.AsbitemId).FirstOrDefault(); if (itemTypeGroupCharge != null) { tempData.ReceivedChargeMoney = itemTypeGroupCharge.ReceivedChargeMoney; } } else { tempData = itemTypeGroupCharges.Where(m => m.ItemTypeId == item.ItemTypeId && m.AsbitemId == item.AsbitemId).FirstOrDefault(); } tempData.DiscountMoney = tempData.ChargeMoney - tempData.ReceivedChargeMoney; projectFeesReport_Details.Add(tempData); } #endregion decimal sumChargeMoney = projectFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(projectFeesReport_Details.Sum(s => s.ChargeMoney), 2) : 0; decimal sumDiscountMoney = projectFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(projectFeesReport_Details.Sum(s => s.DiscountMoney), 2) : 0; decimal sumReceivedChargeMoney = projectFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(projectFeesReport_Details.Sum(s => s.ReceivedChargeMoney), 2) : 0; var projectFeesReportDto = new GetProjectFeesReportDto { Details = projectFeesReport_Details, SumChargeMoney = sumChargeMoney, SumDiscountMoney = sumDiscountMoney, SumReceivedChargeMoney = sumReceivedChargeMoney }; return projectFeesReportDto; } /// /// 科室收费汇总表 /// /// /// [HttpPost("api/app/charge-report/get-summary-of-departmental-fees-report")] public async Task GetSummaryOfDepartmentalFeesReportAsync(GetSummaryOfDepartmentalFeesReportRequestDto input) { #region 查询项目类别ID List itmeTypeIds = new List(); if (input.ItemTypeId != null) { itmeTypeIds = await _itemTypeManager.GetChildItemTypeIdsAsync(input.ItemTypeId.Value); } #endregion #region 登记 var query = from a in await _registerAsbitemRepository.GetQueryableAsync() join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb from ab in bb.DefaultIfEmpty() join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc from ac in cc.DefaultIfEmpty() where a.IsCharge == 'Y' select new { a, ab, ac, ItemTypeName = ac != null ? ac.DisplayName : "" }; if (itmeTypeIds.Any()) { query = query.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } //按项目类别分组 var itemTypeGroups = query.GroupBy(g => g.ab.ItemTypeId).Select(s => new GetSummaryOfDepartmentalFeesReport_Detail { ItemTypeId = s.Key, ItemTypeName = s.FirstOrDefault().ItemTypeName, ChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.a.Amount.Value * ss.a.ChargePrice.Value), 2), ReceivedChargeMoney = 0 }).ToList(); #endregion #region 收费金额统计 var chargeQuery = from a in await _chargeAsbitemRepository.GetQueryableAsync() join d in await _chargeRepository.GetQueryableAsync() on a.ChargeId equals d.Id join b in await _asbitemRepository.GetQueryableAsync() on a.AsbitemId equals b.Id into bb from ab in bb.DefaultIfEmpty() join c in await _itemTypeRepository.GetQueryableAsync() on ab.ItemTypeId equals c.Id into cc from ac in cc.DefaultIfEmpty() where d.ChargeFlag == ChargeFlag.Charge select new { a, ab, ItemTypeName = ac != null ? ac.DisplayName : "" }; if (itmeTypeIds.Any()) { chargeQuery = chargeQuery.Where(m => itmeTypeIds.Contains(m.ab.ItemTypeId)); } if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { chargeQuery = chargeQuery.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } //按项目类别分组 收费 var itemTypeGroupCharges = chargeQuery.GroupBy(g => g.ab.ItemTypeId).Select(s => new GetSummaryOfDepartmentalFeesReport_Detail { ItemTypeId = s.Key, ItemTypeName = s.FirstOrDefault().ItemTypeName, ReceivedChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.a.Amount * ss.a.ChargePrice), 2), ChargeMoney = 0 }).ToList(); #endregion #region 拼接收费数据 List summaryOfDepartmentalFeesReport_Details = new List(); //去重科室Id var itemTypeIdList = itemTypeGroups.Select(s => s.ItemTypeId).Union(itemTypeGroupCharges.Select(s => s.ItemTypeId)); foreach (var itemTypeId in itemTypeIdList) { var tempData = itemTypeGroups.Where(m => m.ItemTypeId == itemTypeId).FirstOrDefault(); if (tempData != null) { var itemTypeGroupCharge = itemTypeGroupCharges.Where(m => m.ItemTypeId == itemTypeId).FirstOrDefault(); if (itemTypeGroupCharge != null) { tempData.ReceivedChargeMoney = itemTypeGroupCharge.ReceivedChargeMoney; } } else { tempData = itemTypeGroupCharges.Where(m => m.ItemTypeId == itemTypeId).FirstOrDefault(); } tempData.DiscountMoney = tempData.ChargeMoney - tempData.ReceivedChargeMoney; summaryOfDepartmentalFeesReport_Details.Add(tempData); } #endregion decimal sumChargeMoney = summaryOfDepartmentalFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(summaryOfDepartmentalFeesReport_Details.Sum(s => s.ChargeMoney), 2) : 0; decimal sumDiscountMoney = summaryOfDepartmentalFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(summaryOfDepartmentalFeesReport_Details.Sum(s => s.DiscountMoney), 2) : 0; decimal sumReceivedChargeMoney = summaryOfDepartmentalFeesReport_Details.Any() ? DataHelper.DecimalRetainDecimals(summaryOfDepartmentalFeesReport_Details.Sum(s => s.ReceivedChargeMoney), 2) : 0; var summaryOfDepartmentalFeesReportDto = new GetSummaryOfDepartmentalFeesReportDto { Details = summaryOfDepartmentalFeesReport_Details, SumChargeMoney = sumChargeMoney, SumDiscountMoney = sumDiscountMoney, SumReceivedChargeMoney = sumReceivedChargeMoney }; return summaryOfDepartmentalFeesReportDto; } /// /// 体检人次汇总 /// /// /// [HttpPost("api/app/charge-report/get-summary-of-physical-examination-personnel-report")] public async Task GetSummaryOfPhysicalExaminationPersonnelReportAsync(GetSummaryOfPhysicalExaminationPersonnelReportRequestDto input) { var query = from a in await _patientRegisterRepository.GetQueryableAsync() join b in await _registerAsbitemRepository.GetQueryableAsync() on a.Id equals b.PatientRegisterId join c in await _customerOrgRegisterRepository.GetQueryableAsync() on a.CustomerOrgRegisterId equals c.Id into cc from ac in cc.DefaultIfEmpty() join d in await _customerOrgRepository.GetQueryableAsync() on ac.CustomerOrgId equals d.Id into dd from ad in dd.DefaultIfEmpty() where a.CompleteFlag == PatientRegisterCompleteFlag.GeneralInspected select new { a, b, ac, CustomerOrgName = ad != null ? ad.DisplayName : "" }; if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate)) { query = query.Where(m => m.a.CreationTime >= Convert.ToDateTime(input.StartDate) && m.a.CreationTime < Convert.ToDateTime(input.EndDate).AddDays(1)); } //按单位分组 var customerOrgGroup = query.GroupBy(g => g.ac.CustomerOrgId).Select(s => new GetSummaryOfPhysicalExaminationPersonnelReport_Detail { CustomerOrgName = s.FirstOrDefault().CustomerOrgName, SummaryCount = s.Count(), ChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.b.Amount.Value * ss.b.ChargePrice.Value), 2) }).ToList(); //个人次数 int personalCount = customerOrgGroup.Where(m => m.CustomerOrgId == GuidFlag.PersonCustomerOrgId).Count(); //单位次数 int customerOrgCount = customerOrgGroup.Count - personalCount; var summaryOfPhysicalExaminationPersonnelReportDto = new GetSummaryOfPhysicalExaminationPersonnelReportDto { CustomerOrgCount = customerOrgCount, PersonalCount = personalCount, Details = customerOrgGroup, SumCount = customerOrgCount + personalCount }; return summaryOfPhysicalExaminationPersonnelReportDto; } } }