You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1275 lines
61 KiB
1275 lines
61 KiB
using Castle.Components.DictionaryAdapter.Xml;
|
|
using JetBrains.Annotations;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using NPOI.SS.Formula.Functions;
|
|
using Shentun.Peis.Charges;
|
|
using Shentun.Peis.CollectItemTypes;
|
|
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 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
|
|
{
|
|
/// <summary>
|
|
/// 收费统计报表
|
|
/// </summary>
|
|
[Authorize]
|
|
[ApiExplorerSettings(GroupName = "Work")]
|
|
public class ChargeReportAppService : ApplicationService
|
|
{
|
|
|
|
private readonly IRepository<Charge, Guid> _chargeRepository;
|
|
private readonly IRepository<ChargePay> _chargePayRepository;
|
|
private readonly IRepository<ChargeAsbitem, Guid> _chargeAsbitemRepository;
|
|
private readonly IRepository<PayMode> _payModeRepository;
|
|
private readonly IRepository<ChargeBack, Guid> _chargeBackRepository;
|
|
private readonly IRepository<ChargeBackPay> _chargeBackPayRepository;
|
|
private readonly IRepository<IdentityUser, Guid> _userRepository;
|
|
private readonly IRepository<Asbitem, Guid> _asbitemRepository;
|
|
private readonly IRepository<InvoiceItemType, Guid> _invoiceItemTypeRepository;
|
|
private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
|
|
private readonly IRepository<RegisterCheckAsbitem, Guid> _registerAsbitemRepository;
|
|
private readonly IRepository<CustomerOrgRegister, Guid> _customerOrgRegisterRepository;
|
|
private readonly IRepository<CustomerOrg, Guid> _customerOrgRepository;
|
|
private readonly IRepository<ItemType, Guid> _itemTypeRepository;
|
|
private readonly IRepository<Patient, Guid> _patientRepository;
|
|
private readonly IRepository<Sex> _sexRepository;
|
|
private readonly ItemTypeManager _itemTypeManager;
|
|
private readonly IRepository<CollectItemType, Guid> _collectItemTypeRepository;
|
|
public ChargeReportAppService(
|
|
IRepository<Charge, Guid> chargeRepository,
|
|
IRepository<ChargeBack, Guid> chargeBackRepository,
|
|
IRepository<ChargePay> chargePayRepository,
|
|
IRepository<PayMode> payModeRepository,
|
|
IRepository<ChargeBackPay> chargeBackPayRepository,
|
|
IRepository<IdentityUser, Guid> userRepository,
|
|
IRepository<ChargeAsbitem, Guid> chargeAsbitemRepository,
|
|
IRepository<Asbitem, Guid> asbitemRepository,
|
|
IRepository<InvoiceItemType, Guid> invoiceItemTypeRepository,
|
|
IRepository<PatientRegister, Guid> patientRegisterRepository,
|
|
IRepository<RegisterCheckAsbitem, Guid> registerAsbitemRepository,
|
|
IRepository<CustomerOrgRegister, Guid> customerOrgRegisterRepository,
|
|
IRepository<CustomerOrg, Guid> customerOrgRepository,
|
|
IRepository<ItemType, Guid> itemTypeRepository,
|
|
ItemTypeManager itemTypeManager,
|
|
IRepository<Patient, Guid> patientRepository,
|
|
IRepository<Sex> sexRepository
|
|
,
|
|
IRepository<CollectItemType, Guid> collectItemTypeRepository
|
|
)
|
|
{
|
|
_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;
|
|
_collectItemTypeRepository = collectItemTypeRepository;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 收费员收费报表 按支付方式
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/charge-report/get-toll-collector-fee-report-in-pay-mode")]
|
|
public async Task<GetTollCollectorFeeReportInPayModeDto> 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 : "",
|
|
Surname = ad != null ? ad.Surname : ""
|
|
};
|
|
|
|
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().Surname,
|
|
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.Surname : ""
|
|
};
|
|
|
|
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<GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail> chargeAndChargeBackDetails = new List<GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail>();
|
|
|
|
//去重所有收费员
|
|
var userNameList = chargeDetails.ToList().Select(s => s.UserName).Union(chargeBackDetails.ToList().Select(s => s.UserName));
|
|
|
|
foreach (var userName in userNameList)
|
|
{
|
|
|
|
var userChargeDetail = chargeDetails.Where(m => m.UserName == userName).FirstOrDefault();
|
|
|
|
if (userChargeDetail != null)
|
|
{
|
|
//添加收费数据
|
|
foreach (var payMode in userChargeDetail.PayModeDetails)
|
|
{
|
|
chargeAndChargeBackDetails.Add(new GetTollCollectorFeeReportInPayMode_ChargeAndChargeBackDetail
|
|
{
|
|
ChargeName = userName,
|
|
PayModeName = payMode.PayModeName,
|
|
ChargeMoney = payMode.Money,
|
|
ChargeBackMoney = 0
|
|
});
|
|
}
|
|
}
|
|
|
|
var userChargeBackDetail = chargeBackDetails.Where(m => m.UserName == userName).FirstOrDefault();
|
|
if (userChargeBackDetail != null)
|
|
{
|
|
//添加退费数据
|
|
foreach (var payMode in userChargeBackDetail.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;
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 收费员收费报表 按发票类型
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/charge-report/get-toll-collector-fee-report-in-invoice-type")]
|
|
public async Task<GetTollCollectorFeeReportInInvoiceTypeDto> 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 _collectItemTypeRepository.GetQueryableAsync() on ac.CollectItemTypeId 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.Surname : ""
|
|
};
|
|
|
|
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.CollectItemTypeId).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 _collectItemTypeRepository.GetQueryableAsync() on ad.CollectItemTypeId 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.Surname : ""
|
|
};
|
|
|
|
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.CollectItemTypeId).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;
|
|
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 收费员收费报表 按组合项目
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/charge-report/get-toll-collector-fee-report-in-asbitem")]
|
|
public async Task<List<GetTollCollectorFeeReportInAsbitemDto>> 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;
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 个人收费明细报表 按收费明细
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/charge-report/get-Personal-Fee-Details-report-in-fee-details")]
|
|
public async Task<List<GetPersonalFeeDetailsReportInFeeDetailsDto>> 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
|
|
where f.PayTypeFlag == RegisterCheckAsbitemPayTypeFlag.PersonalPayment && 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.Surname : ""
|
|
};
|
|
|
|
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.ToList().GroupBy(g => g.f).Select(s => new GetPersonalFeeDetailsReportInFeeDetailsDto
|
|
{
|
|
Age = s.FirstOrDefault().c.Age,
|
|
AsbitemName = s.FirstOrDefault().AsbitemName,
|
|
BookKeepingName = s.FirstOrDefault().BookKeepingName,
|
|
BookkeepingTiem = DataHelper.ConversionDateToString(s.FirstOrDefault().a.CreationTime),
|
|
CharePrice = DataHelper.DecimalRetainDecimals(s.FirstOrDefault().b.ChargePrice * s.FirstOrDefault().b.Amount, 2),
|
|
MedicalTimes = s.FirstOrDefault().c.MedicalTimes,
|
|
PatientName = s.FirstOrDefault().c.PatientName,
|
|
PatientNo = s.FirstOrDefault().PatientNo,
|
|
SexName = s.FirstOrDefault().SexName,
|
|
StandardPrice = DataHelper.DecimalRetainDecimals(s.Key.StandardPrice * s.Key.Amount, 2),
|
|
Discount = s.Key.StandardPrice * s.Key.Amount == 0 ? "0%" : Math.Floor((s.FirstOrDefault().b.ChargePrice * s.FirstOrDefault().b.Amount) / (s.Key.StandardPrice * s.Key.Amount)) + "%"
|
|
}).ToList();
|
|
|
|
return patientRegisterGroup;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 个人收费明细报表 按退费明细
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/charge-report/get-Personal-Fee-Details-report-in-refund-details")]
|
|
public async Task<List<GetPersonalFeeDetailsReportInRefundDetailsDto>> 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
|
|
where f.PayTypeFlag == RegisterCheckAsbitemPayTypeFlag.PersonalPayment && 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.Surname : ""
|
|
};
|
|
|
|
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 = DataHelper.ConversionDateToString(s.a.CreationTime),
|
|
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 = s.f.StandardPrice * s.f.Amount == 0 ? "0%" : Math.Floor((s.b.ChargePrice * s.b.Amount) / (s.f.StandardPrice * s.f.Amount)) + "%"
|
|
}).ToList();
|
|
|
|
return patientRegisterGroup;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 个人收费明细报表 按收费汇总
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/charge-report/get-Personal-Fee-Details-report-in-fee-summary")]
|
|
public async Task<GetPersonalFeeDetailsReportInFeeSummaryDto> GetPersonalFeeDetailsReportInFeeSummaryAsync(GetPersonalFeeDetailsReportInFeeSummaryRequestDto input)
|
|
{
|
|
#region 替换
|
|
//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 * ss.Amount), 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.CustomerOrgId == 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 : ""
|
|
// };
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
var query = from charge in (await _chargeRepository.GetQueryableAsync()).Include(x => x.ChargePays).ThenInclude(x => x.PayMode)
|
|
join chargeAsbitem in await _chargeAsbitemRepository.GetQueryableAsync() on charge.Id equals chargeAsbitem.ChargeId
|
|
join registerCheckAsbitem in await _registerAsbitemRepository.GetQueryableAsync() on new { PatientRegisterId = charge.PatientRegisterId, AsbitemId = chargeAsbitem.AsbitemId }
|
|
equals new { PatientRegisterId = registerCheckAsbitem.PatientRegisterId, AsbitemId = registerCheckAsbitem.AsbitemId }
|
|
join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on charge.PatientRegisterId equals patientRegister.Id
|
|
join e in await _patientRepository.GetQueryableAsync() on patientRegister.PatientId equals e.Id into ee
|
|
from ae in ee.DefaultIfEmpty()
|
|
join f in await _sexRepository.GetQueryableAsync() on patientRegister.SexId equals f.Id into ff
|
|
from af in ff.DefaultIfEmpty()
|
|
join g in await _userRepository.GetQueryableAsync() on charge.CreatorId equals g.Id into gg
|
|
from ag in gg.DefaultIfEmpty()
|
|
// where patientRegister.CustomerOrgId == GuidFlag.PersonCustomerOrgId
|
|
where registerCheckAsbitem.PayTypeFlag == RegisterCheckAsbitemPayTypeFlag.PersonalPayment
|
|
select new
|
|
{
|
|
charge,
|
|
chargeAsbitem,
|
|
registerCheckAsbitem,
|
|
PatientName = patientRegister.PatientName,
|
|
Age = patientRegister.Age,
|
|
PatientNo = ae != null ? ae.PatientNo : "",
|
|
SexName = af != null ? af.DisplayName : "",
|
|
BookKeepingName = ag != null ? ag.Surname : ""
|
|
};
|
|
|
|
|
|
|
|
|
|
if (input.UserIds.Any())
|
|
{
|
|
query = query.Where(m => input.UserIds.Contains(m.charge.CreatorId.Value));
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.EndDate))
|
|
{
|
|
query = query.Where(m => m.charge.CreationTime >= Convert.ToDateTime(input.StartDate)
|
|
&& m.charge.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.chargeAsbitem.ChargeId).Select(s => new GetPersonalFeeDetailsReportInFeeSummary_Detail
|
|
{
|
|
ChargeId = s.Key,
|
|
Age = s.FirstOrDefault().Age,
|
|
BookKeepingName = s.FirstOrDefault().BookKeepingName,
|
|
BookkeepingTiem = DataHelper.ConversionDateToString(s.FirstOrDefault().charge.CreationTime),
|
|
ChargeFlagName = s.FirstOrDefault().charge.ChargeFlag == ChargeFlag.Charge ? "收费" : "退费",
|
|
PatientName = s.FirstOrDefault().PatientName,
|
|
PatientNo = s.FirstOrDefault().PatientNo,
|
|
SexName = s.FirstOrDefault().SexName,
|
|
ChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.registerCheckAsbitem.ChargePrice * ss.registerCheckAsbitem.Amount), 2),
|
|
TotalReceivedChargeMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.chargeAsbitem.ChargePrice * ss.chargeAsbitem.Amount), 2),
|
|
DiscountMoney = DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.registerCheckAsbitem.ChargePrice * ss.registerCheckAsbitem.Amount), 2) - DataHelper.DecimalRetainDecimals(s.Sum(ss => ss.chargeAsbitem.ChargePrice * ss.chargeAsbitem.Amount), 2),
|
|
PayModes = s.FirstOrDefault().charge.ChargePays.Select(ss => new GetPersonalFeeDetailsReportInFeeSummary_PayMode
|
|
{
|
|
PayModeName = ss.PayMode.DisplayName,
|
|
ReceivedChargeMoney = ss.ChargeMoney
|
|
}).ToList()
|
|
}).OrderBy(o => o.PatientName).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.TotalReceivedChargeMoney), 2) : 0;
|
|
|
|
|
|
|
|
//支付方式整合到上级
|
|
|
|
|
|
List<GetPersonalFeeDetailsReportInFeeSummary_Detail> personalFeeDetailsReportInFeeSummary_Details_new = new List<GetPersonalFeeDetailsReportInFeeSummary_Detail>();
|
|
|
|
|
|
|
|
foreach (var item in personalFeeDetailsReportInFeeSummary_Details)
|
|
{
|
|
var temp = new GetPersonalFeeDetailsReportInFeeSummary_Detail();
|
|
|
|
foreach (var payMode in item.PayModes)
|
|
{
|
|
temp = new GetPersonalFeeDetailsReportInFeeSummary_Detail()
|
|
{
|
|
ChargeId = item.ChargeId,
|
|
Age = item.Age,
|
|
BookKeepingName = item.BookKeepingName,
|
|
BookkeepingTiem = item.BookkeepingTiem,
|
|
ChargeFlagName = item.ChargeFlagName,
|
|
PatientName = item.PatientName,
|
|
PatientNo = item.PatientNo,
|
|
SexName = item.SexName,
|
|
ChargeMoney = item.ChargeMoney,
|
|
TotalReceivedChargeMoney = item.TotalReceivedChargeMoney,
|
|
DiscountMoney = item.DiscountMoney,
|
|
PayModeName = payMode.PayModeName,
|
|
ReceivedChargeMoney = payMode.ReceivedChargeMoney
|
|
};
|
|
|
|
personalFeeDetailsReportInFeeSummary_Details_new.Add(temp);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var personalFeeDetailsReportInFeeSummaryDto = new GetPersonalFeeDetailsReportInFeeSummaryDto
|
|
{
|
|
ChargeCount = personalFeeDetailsReportInFeeSummary_Details.Count,
|
|
Details = personalFeeDetailsReportInFeeSummary_Details_new,
|
|
SumChargeMoney = sumChargeMoney,
|
|
SumDiscountMoney = sumDiscountMoney,
|
|
SumReceivedChargeMoney = sumReceivedChargeMoney
|
|
};
|
|
|
|
return personalFeeDetailsReportInFeeSummaryDto;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 收费人收费汇总报表
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/charge-report/get-toll-collector-fee-summary-report")]
|
|
public async Task<GetTollcollectorFeeSummaryReportDto> 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.Surname : ""
|
|
};
|
|
|
|
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.Surname : ""
|
|
};
|
|
|
|
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<GetTollcollectorFeeSummaryReport_Detail> tollcollectorFeeSummaryReport_Detail = new List<GetTollcollectorFeeSummaryReport_Detail>();
|
|
|
|
//去重科室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;
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 项目收费报表
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/charge-report/get-project-fees-report")]
|
|
public async Task<GetProjectFeesReportDto> GetProjectFeesReportAsync(GetProjectFeesReportRequestDto input)
|
|
{
|
|
|
|
#region 查询项目类别ID
|
|
List<Guid> itmeTypeIds = new List<Guid>();
|
|
|
|
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 * ss.a.ChargePrice), 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<GetProjectFeesReport_Detail> projectFeesReport_Details = new List<GetProjectFeesReport_Detail>();
|
|
|
|
//去重科室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;
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 科室收费汇总表
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/charge-report/get-summary-of-departmental-fees-report")]
|
|
public async Task<GetSummaryOfDepartmentalFeesReportDto> GetSummaryOfDepartmentalFeesReportAsync(GetSummaryOfDepartmentalFeesReportRequestDto input)
|
|
{
|
|
|
|
#region 查询项目类别ID
|
|
List<Guid> itmeTypeIds = new List<Guid>();
|
|
|
|
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 * ss.a.ChargePrice), 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<GetSummaryOfDepartmentalFeesReport_Detail> summaryOfDepartmentalFeesReport_Details = new List<GetSummaryOfDepartmentalFeesReport_Detail>();
|
|
|
|
//去重科室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;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 体检人次汇总
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("api/app/charge-report/get-summary-of-physical-examination-personnel-report")]
|
|
public async Task<GetSummaryOfPhysicalExaminationPersonnelReportDto> 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.SumCheck
|
|
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 * ss.b.ChargePrice), 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;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|