feat(swap): 添加公司行为现金分红按登记日权益数量计算功能

- 新增 CalcBondPayment 方法支持传入公司行为权益数量参数
- 在 SwapEodPositionService 中识别现金分红类型的公司行为持仓
- 修改 CopyEodPosition 和 UpdateEodPosition 方法传递公司行为前的数量信息
- 更新 SaveCurrentEodInitalPosi 方法支持公司行为数量计算
- 在 BondPaymentService 中实现公司行为现金分红按登记日权益数量计算逻辑
- 添加单元测试验证公司行为现金分红使用除权前数量的计算功能
This commit is contained in:
张名锐
2026-08-26 10:33:51 +08:00
parent 2b8c310b89
commit 6c582ac958
3 changed files with 69 additions and 12 deletions
@@ -189,10 +189,26 @@ namespace YLErp.Modules.EodModule
decimal qty,
decimal longRatio,
decimal payDirection)
{
return CalcPayment(payments, qty, longRatio, payDirection, null);
}
/// <summary>
/// 公司行为现金分红按登记日权益数量计算;同一窗口中的原生债券付息仍按当前持仓数量计算。
/// </summary>
public decimal CalcPayment(
List<BondPayment> payments,
decimal qty,
decimal longRatio,
decimal payDirection,
decimal? corporateActionQty)
{
var actualAmount = (payments ?? new List<BondPayment>()).Sum(payment =>
{
var paymentAmount = (payment.payment_interest ?? 0m) * qty;
var paymentQty = payment.IsCorporateActionCashDividend
? corporateActionQty ?? qty
: qty;
var paymentAmount = (payment.payment_interest ?? 0m) * paymentQty;
// bond_payment_info 原生期间付息按每 100 份存储;由 ex_dividend_info 补充的
// 公司行为现金分红按每 10 份存储。Fund 标的可能同时命中两类记录,故必须逐条分流。
return payment.IsCorporateActionCashDividend