报表优化

This commit is contained in:
李贵强 2025-07-11 17:10:33 +08:00
parent 27a5aacbba
commit 949848a021
1 changed files with 46 additions and 30 deletions

View File

@ -38,24 +38,26 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
private static final String[] DYNAMICS_FIELDS = {
"shjh_projectrevenueamt","shjh_date","shjh_days","shjh_revenueamt",
"shjh_monthrevenueamt","shjh_monthrate","shjh_yearrevenueamt",
"shjh_yearrate","shjh_actualearnings","shjh_actualrate","shjh_expire"
"shjh_yearrate","shjh_actualearnings","shjh_actualrate","shjh_expire","shjh_nowamount"
};
@Override
public void beforeQuery(ReportQueryParam queryParam) {
super.beforeQuery(queryParam);
ReportList reportList = getControl("reportlistap");
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[0], "预计收益(千元)", ReportColumn.TYPE_DECIMAL , String.valueOf(2)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[0], "预计收益(千元)", ReportColumn.TYPE_DECIMAL , String.valueOf(8)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[1], "计提日", ReportColumn.TYPE_DATE }));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[2], "天数", ReportColumn.TYPE_BIGINT }));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[3], "收益计提(千元)", ReportColumn.TYPE_DECIMAL , String.valueOf(2)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[4], "本月收益(千元)", ReportColumn.TYPE_DECIMAL , String.valueOf(2)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[5], "当月年化收益率(%", ReportColumn.TYPE_DECIMAL , String.valueOf(2)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[6], "本年累计收益(千元)", ReportColumn.TYPE_DECIMAL , String.valueOf(2)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[7], "本年累计年化收益率(%", ReportColumn.TYPE_DECIMAL , String.valueOf(2)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[8], "实际收益", ReportColumn.TYPE_DECIMAL , String.valueOf(2)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[9], "实际总收益率(%", ReportColumn.TYPE_DECIMAL , String.valueOf(2)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[3], "收益计提(千元)", ReportColumn.TYPE_DECIMAL , String.valueOf(8)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[4], "本月收益(千元)", ReportColumn.TYPE_DECIMAL , String.valueOf(8)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[5], "当月年化收益率(%", ReportColumn.TYPE_DECIMAL , String.valueOf(8)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[6], "本年累计收益(千元)", ReportColumn.TYPE_DECIMAL , String.valueOf(8)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[7], "本年累计年化收益率(%", ReportColumn.TYPE_DECIMAL , String.valueOf(8)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[8], "实际收益", ReportColumn.TYPE_DECIMAL , String.valueOf(8)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[9], "实际总收益率(%", ReportColumn.TYPE_DECIMAL , String.valueOf(8)}));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[10], "是否已到期", ReportColumn.TYPE_TEXT }));
reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[11], "金额(千元)", ReportColumn.TYPE_DECIMAL , String.valueOf(8)}));
}
@Override
@ -81,7 +83,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
DynamicObject row = iterator.next();
//1.金额千元设置
BigDecimal amount = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[4]); // 原始金额
BigDecimal buyAmount = amount.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);//购买金额千元
BigDecimal buyAmount = amount.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);//购买金额千元
row.set(REPORT_FIELDS[4],buyAmount);
BigDecimal netWorth = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[6]); // 购买时单位净值
@ -139,7 +141,9 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
//实际总收益率=实际收益/金额
BigDecimal actualEarnings = ReportUtils.getBigDecimalValue(row, DYNAMICS_FIELDS[8]);
row.set(DYNAMICS_FIELDS[9],actualEarnings.divide(buyAmount,2, RoundingMode.HALF_UP));
row.set(DYNAMICS_FIELDS[9],actualEarnings
.divide(buyAmount,8, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100)));
sumActualEarnings=sumActualEarnings.add(actualEarnings);
//小计行合计
@ -218,6 +222,10 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
DynamicObject lastMonthRecord = null;
DynamicObject lastYearRecord = null;
DynamicObject yearStartRecord = null;
//上月赎回比之积
BigDecimal redMonthProduct = BigDecimal.ONE;
//上年赎回比之积
BigDecimal redYearProduct = BigDecimal.ONE;
long minDiff = Long.MAX_VALUE;
// 获取计提日期相关信息
@ -284,6 +292,8 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
lastMonthRecord = object;
}
}
//上月最后一次估值记录往上赎回比之积
redMonthProduct=this.getRedProductAmount(dynamicObjectCollection,lastMonthRecord.getDate("e_valuationdate"));
}
// 4. 寻找上一年最后一次估值记录相同日期取赎回日期最大的
@ -297,6 +307,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
lastYearRecord = object;
}
}
redYearProduct=this.getRedProductAmount(dynamicObjectCollection,lastYearRecord.getDate("e_valuationdate"));
}
// 5. 寻找本年第一个估值记录相同日期取赎回日期最大的
@ -323,6 +334,8 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
//计提日最近估值记录获取1-赎回份额/赎回日剩余份额* 所有赎回单
allRedProductAmount=this.getRedProductAmount(dynamicObjectCollection,closestRecord.getDate("e_valuationdate"));
//计算金额千元
row.set(DYNAMICS_FIELDS[11],allRedProductAmount.multiply(buyAmount).setScale(8, RoundingMode.HALF_UP));
}
// 设置月末单位净值
@ -363,28 +376,29 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
.multiply(lastMonthRecord.getBigDecimal("e_surpcopies")).add(lastMonthRedAmount);
monthAmount = currentMarketValue.subtract(lastMonthMarketValue)
.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);
// 计算当月年化收益率
// 本月收益/购买金额*100*12
// 本月收益/(购买金额*(赎回比之积))*100*12
if (lastMonthMarketValue.compareTo(BigDecimal.ZERO) != 0) {
monthAnnualizedRate = monthAmount
.divide(buyAmount, 6, RoundingMode.HALF_UP)
.divide(buyAmount, 8, RoundingMode.HALF_UP)
.multiply(redMonthProduct)
.multiply(new BigDecimal(1200))
.setScale(2, RoundingMode.HALF_UP);
.setScale(8, RoundingMode.HALF_UP);
}
} else if (accrualYear == buyYear && accrualMonth == buyMonth) {
// 特殊处理计提月与购买月相同时使用购买金额作为上月市值
// 如果计提日期和购买日同月"上月最后一次的市值行"取购买金额
monthAmount = currentMarketValue.subtract(buyAmount.multiply(new BigDecimal(1000)))
.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);
if (buyAmount.compareTo(BigDecimal.ZERO) != 0) {
//本月收益/购买金额*100*12
monthAnnualizedRate = monthAmount
.divide(buyAmount, 6, RoundingMode.HALF_UP)
.divide(buyAmount, 8, RoundingMode.HALF_UP)
.multiply(new BigDecimal(1200))
.setScale(2, RoundingMode.HALF_UP);
.setScale(8, RoundingMode.HALF_UP);
}
}
}
@ -404,15 +418,16 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
.multiply(lastYearRecord.getBigDecimal("e_surpcopies")).add(lastYearRedAmount);
yearAmount = currentMarketValue.subtract(lastYearMarketValue)
.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);
//本年累计年化收益率=本年累计总收益额/金额/(计提日期到-年初日期*计息基准天数
//本年累计年化收益率=本年累计总收益额/(金额*(赎回比之积))/(计提日期到-年初日期*计息基准天数
if (buyAmount.compareTo(BigDecimal.ZERO) != 0 && BigDecimal.valueOf(daysFromJan1).compareTo(BigDecimal.ZERO) != 0 ) {
yearAnnualizedRate = yearAmount
.divide(buyAmount, 6, RoundingMode.HALF_UP)
.divide(BigDecimal.valueOf(daysFromJan1), 6, RoundingMode.HALF_UP)
.divide(buyAmount.multiply(redYearProduct), 8, RoundingMode.HALF_UP)
.divide(BigDecimal.valueOf(daysFromJan1), 8, RoundingMode.HALF_UP)
.multiply(basisDays)
.setScale(2, RoundingMode.HALF_UP);
.multiply(BigDecimal.valueOf(100))
.setScale(8, RoundingMode.HALF_UP);
}
} else if (accrualYear == buyYear) {
// 特殊处理计提年与购买年相同时:本年累计年化收益率=本年累计总收益额/金额/天数*计息基准天数
@ -420,14 +435,15 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
if (buyAmount.compareTo(BigDecimal.ZERO) != 0 ) {
yearAmount = currentMarketValue.subtract(buyAmount.multiply(new BigDecimal(1000)))
.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);
if (days.compareTo(BigDecimal.ZERO) !=0 ){
yearAnnualizedRate = yearAmount
.divide(buyAmount, 6, RoundingMode.HALF_UP)
.divide(days, 6, RoundingMode.HALF_UP)
.divide(buyAmount, 8, RoundingMode.HALF_UP)
.divide(days, 8, RoundingMode.HALF_UP)
.multiply(basisDays)
.setScale(2, RoundingMode.HALF_UP);
.multiply(BigDecimal.valueOf(100))
.setScale(8, RoundingMode.HALF_UP);
}
}
}
@ -708,7 +724,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
if (expectedRate != null) {
projectRevenue = new BigDecimal(day).multiply(amount.divide(new BigDecimal(1000), 10, RoundingMode.HALF_UP))
.multiply(expectedRate.divide(new BigDecimal(100), 10, RoundingMode.HALF_UP))
.divide(basisDay, 2, RoundingMode.HALF_UP);
.divide(basisDay, 8, RoundingMode.HALF_UP);
row.set(DYNAMICS_FIELDS[0], projectRevenue);
}
return projectRevenue;
@ -742,7 +758,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
// 计算(持有份额 * 月末单位净值+(所有赎回单金额+实际收益) - 购买份额 * 购买时单位净值) / 1000
revenue = buyCopies.multiply(monthNetWorth)
.subtract(startBuyCopies.multiply(netWorth).multiply(allRedProductAmount))
.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);
// 设置到表格行
boolean isValidPeriod = !valueDate.after(accrualDate) && !accrualDate.after(expireDate);
@ -784,7 +800,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
revenue = buyCopies.multiply(monthNetWorth)
.add(redAmount)
.subtract(startBuyCopies.multiply(netWorth))
.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);
row.set(DYNAMICS_FIELDS[8], revenue); // 实际收益
}
}