理财报表位数改动、千元去除

This commit is contained in:
李贵强 2025-07-15 18:20:06 +08:00
parent a8479c0e56
commit df0dc5116c
1 changed files with 29 additions and 95 deletions

View File

@ -45,19 +45,17 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
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(8)}));
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[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(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[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[10], "是否已到期", ReportColumn.TYPE_TEXT }));
//reportList.getColumns().add(ReportUtils.createReportColumn(new String [] { DYNAMICS_FIELDS[11], "金额(千元)", ReportColumn.TYPE_DECIMAL , String.valueOf(8)}));
}
@Override
@ -78,13 +76,14 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
BigDecimal sumYearEarnings =BigDecimal.ZERO;//本年收益汇总
BigDecimal sumActualEarnings =BigDecimal.ZERO;//实际收益汇总
while (iterator.hasNext()) {
DynamicObject row = iterator.next();
//1.金额千元设置
//1.金额设置
BigDecimal amount = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[4]); // 原始金额
BigDecimal buyAmount = amount.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);//购买金额千元
row.set(REPORT_FIELDS[4],buyAmount);
row.set(REPORT_FIELDS[4],amount.setScale(2, RoundingMode.HALF_UP));
BigDecimal newAmount = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[17]); // 金额
row.set(REPORT_FIELDS[17],newAmount.setScale(2, RoundingMode.HALF_UP));
BigDecimal netWorth = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[6]); // 购买时单位净值
Date buyDate = row.getDate(REPORT_FIELDS[7]); // 购买日
@ -110,7 +109,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
// 5.计息基准天数
BigDecimal basisDays = computeBasisDays(basis);
// 6. 预计收益 = 产品期限 * 金额(千元) * 预计业绩比较基准 / 365
// 6. 预计收益 = 产品期限 * 金额 * 预计业绩比较基准 / 365
BigDecimal proRevenue = countProRevenue(expectedRate, term, amount, row,basisDays);
sumProjectedEarnings=sumProjectedEarnings.add(proRevenue);
@ -118,10 +117,10 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
// 7. 持有份额 = 计提日期向上最近持有份额
// 8. 月末单位净值 = 计提日期向上最近一次的净值
// 9. 月末净值报告日 = 计提日期向上最近一次的估值日期
// 10. 本月收益千元当月年化收益率%
// 11. 本年累计收益千元本年累计年化收益率
// 10. 本月收益当月年化收益率%
// 11. 本年累计收益本年累计年化收益率
Long id = row.getLong(REPORT_FIELDS[13]);
BigDecimal allRedProductAmount = valuationEntry(accrualDate, buyDate, expireDate2, valueDate, buyAmount, days, basisDays, id, row,netWorth,startBuyCopies);
BigDecimal allRedProductAmount = valuationEntry(accrualDate, buyDate, expireDate2, valueDate, amount, days, basisDays, id, row,netWorth,startBuyCopies);
BigDecimal buyCopies = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[5]); // 持有份额
BigDecimal monthNetWorth = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[11]); // 月末单位净值
@ -142,27 +141,14 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
//实际总收益率=实际收益/金额
BigDecimal actualEarnings = ReportUtils.getBigDecimalValue(row, DYNAMICS_FIELDS[8]);
row.set(DYNAMICS_FIELDS[9],actualEarnings
.divide(buyAmount,4, RoundingMode.HALF_UP)
.divide(amount,4, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100)));
sumActualEarnings=sumActualEarnings.add(actualEarnings);
//小计行合计
// if (row.getString(REPORT_FIELDS[0]).contains("-小计")){
// row.set(DYNAMICS_FIELDS[0],sumProjectedEarnings);
// row.set(DYNAMICS_FIELDS[3],sumProvisionEarnings);
// row.set(DYNAMICS_FIELDS[4],sumMonthEarnings);
// row.set(DYNAMICS_FIELDS[6],sumYearEarnings);
// //赋值后归0重新参与合计
// sumProjectedEarnings=BigDecimal.ZERO;
// sumProvisionEarnings=BigDecimal.ZERO;
// sumMonthEarnings=BigDecimal.ZERO;
// sumYearEarnings=BigDecimal.ZERO;
// }
}
//小计行处理
//ReportUtils.changeRowData(rowData,REPORT_FIELDS[0]);
//过滤
ReportUtils.removeRowData(rowData,REPORT_FIELDS[9],DYNAMICS_FIELDS[1]);
//排序
@ -179,11 +165,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
sumConfig.add(new String[]{DYNAMICS_FIELDS[6], DYNAMICS_FIELDS[6]}); // shjh_yearrevenueamt
sumConfig.add(new String[]{DYNAMICS_FIELDS[8], DYNAMICS_FIELDS[8]}); // shjh_actualearnings
sumConfig.add(new String[]{REPORT_FIELDS[17], REPORT_FIELDS[17]}); // shjh_actualearnings
ReportUtils.addTotalRowData(rowData,REPORT_FIELDS[0],"小计","合计",sumConfig);
}
/**
@ -342,10 +324,10 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
//计提日最近估值记录获取赎回金额+实际收益* 所有赎回单
allRedAmount=this.getRealRevenueAmount(dynamicObjectCollection,closestRecord.getDate("e_valuationdate"));
row.set(DYNAMICS_FIELDS[8], allRedAmount.divide(BigDecimal.valueOf(1000),8, RoundingMode.HALF_UP)); // 实际收益
row.set(DYNAMICS_FIELDS[8], allRedAmount); // 实际收益
//计提日最近估值记录获取1-赎回份额/赎回日剩余份额* 所有赎回单
allRedProductAmount=this.getRedProductAmount(dynamicObjectCollection,closestRecord.getDate("e_valuationdate"));
//计算金额千元
//计算金额
row.set(REPORT_FIELDS[17],allRedProductAmount.multiply(buyAmount).setScale(8, RoundingMode.HALF_UP));
}
@ -386,8 +368,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
BigDecimal lastMonthMarketValue = lastMonthRecord.getBigDecimal("e_iopv")
.multiply(lastMonthRecord.getBigDecimal("e_surpcopies")).add(lastMonthRedAmount);
monthAmount = currentMarketValue.subtract(lastMonthMarketValue)
.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);
monthAmount = currentMarketValue.subtract(lastMonthMarketValue);
// 计算当月年化收益率
// 本月收益/(购买金额*(赎回比之积))*100*12
@ -401,8 +382,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
} else if (accrualYear == buyYear && accrualMonth == buyMonth) {
// 特殊处理计提月与购买月相同时使用购买金额作为上月市值
// 如果计提日期和购买日同月"上月最后一次的市值行"取购买金额
monthAmount = currentMarketValue.subtract(buyAmount.multiply(new BigDecimal(1000)))
.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);
monthAmount = currentMarketValue.subtract(buyAmount);
if (buyAmount.compareTo(BigDecimal.ZERO) != 0) {
//本月收益/购买金额*100*12
@ -428,8 +408,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
BigDecimal lastYearMarketValue = lastYearRecord.getBigDecimal("e_iopv")
.multiply(lastYearRecord.getBigDecimal("e_surpcopies")).add(lastYearRedAmount);
yearAmount = currentMarketValue.subtract(lastYearMarketValue)
.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);
yearAmount = currentMarketValue.subtract(lastYearMarketValue);
//本年累计年化收益率=本年累计总收益额/(金额*(赎回比之积))/(计提日期到-年初日期*计息基准天数
if (buyAmount.compareTo(BigDecimal.ZERO) != 0 && BigDecimal.valueOf(daysFromJan1).compareTo(BigDecimal.ZERO) != 0 ) {
@ -445,8 +424,7 @@ 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), 8, RoundingMode.HALF_UP);
yearAmount = currentMarketValue.subtract(buyAmount);
if (days.compareTo(BigDecimal.ZERO) !=0 ){
yearAnnualizedRate = yearAmount
@ -462,8 +440,6 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
}
}
//计算实际收益
//countActRevenueAmt(buyCopies, monthIop, netWorth, row,startBuyCopies,allRedAmount);
// 设置结果
row.set(REPORT_FIELDS[5], buyCopies);
row.set(REPORT_FIELDS[11], monthIop);
@ -712,19 +688,10 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
String day = "0"; // 默认值设为0
Date endDate = (expireDate != null) ? expireDate : accrualDate;
// BigDecimal actualEarnings = BigDecimal.ZERO;
Long id = row.getLong(REPORT_FIELDS[13]); // id
DynamicObject[] load = BusinessDataServiceHelper.load("cim_redeem", "id,redeemdate,lastmodifytime,realrevenue",
(new QFilter("sourcebillid", QCP.equals, id)).toArray());
// 计算实际收益
// if (load != null && load.length != 0) {
// for (DynamicObject dynamicObject : load) {
// BigDecimal realrevenue = dynamicObject.getBigDecimal("realrevenue");
// actualEarnings = actualEarnings.add(realrevenue);
// }
// }
if (valueDate != null) {
String status = row.getString(REPORT_FIELDS[14]); // 状态
if (status.equals("subscribe_end")) {
@ -762,7 +729,6 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
row.set(DYNAMICS_FIELDS[10], isExpired); // 是否到期
row.set(REPORT_FIELDS[3], day); // 产品期限天数
//row.set(DYNAMICS_FIELDS[8], actualEarnings); // 实际收益
return day;
}
@ -776,7 +742,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
}
/**
* 预计收益 = 产品期限 * 金额(千元) * 预计业绩比较基准 / 365
* 预计收益 = 产品期限 * 金额 * 预计业绩比较基准 / 365
* @param expectedRate 预计业绩比较基准%
* @param day 总天数
* @param amount 投资金额
@ -786,7 +752,7 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
BigDecimal projectRevenue = BigDecimal.ZERO;
if (expectedRate != null) {
projectRevenue = new BigDecimal(day).multiply(amount.divide(new BigDecimal(1000), 10, RoundingMode.HALF_UP))
projectRevenue = new BigDecimal(day).multiply(amount)
.multiply(expectedRate.divide(new BigDecimal(100), 10, RoundingMode.HALF_UP))
.divide(basisDay, 8, RoundingMode.HALF_UP);
row.set(DYNAMICS_FIELDS[0], projectRevenue);
@ -819,10 +785,9 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
// 检查所有参数是否非空
if (buyCopies != null && monthNetWorth != null && netWorth != null && startBuyCopies != null) {
// 计算(持有份额 * 月末单位净值+(所有赎回单金额+实际收益) - 购买份额 * 购买时单位净值) / 1000
// 计算持有份额 * 月末单位净值+(所有赎回单金额+实际收益) - 购买份额 * 购买时单位净值
revenue = buyCopies.multiply(monthNetWorth)
.subtract(startBuyCopies.multiply(netWorth).multiply(allRedProductAmount))
.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);
.subtract(startBuyCopies.multiply(netWorth).multiply(allRedProductAmount));
// 设置到表格行
boolean isValidPeriod = !valueDate.after(accrualDate) && !accrualDate.after(expireDate);
@ -838,37 +803,6 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
return revenue;
}
/**
* 实际收益 = (持有份额 * 月末单位净值+赎回单赎回金额实际收益之和 - 购买份额 * 购买时单位净值) / 1000
* @param buyCopies 持有份额当前份额
* @param monthNetWorth 月末单位净值当前净值
* @param netWorth 购买时单位净值初始净值
* @param row 表格行数据
* @param startBuyCopies 购买份额初始份额
* @return 计算后的收益金额保留2位小数
*/
private void countActRevenueAmt(
BigDecimal buyCopies,
BigDecimal monthNetWorth,
BigDecimal netWorth,
DynamicObject row,
BigDecimal startBuyCopies,
BigDecimal redAmount
) {
BigDecimal revenue = BigDecimal.ZERO;
// 检查所有参数是否非空
if (buyCopies != null && monthNetWorth != null && netWorth != null && startBuyCopies != null) {
// 计算(持有份额 * 月末单位净值+(所有赎回单金额+实际收益) - 购买份额 * 购买时单位净值) / 1000
revenue = buyCopies.multiply(monthNetWorth)
.add(redAmount)
.subtract(startBuyCopies.multiply(netWorth))
.divide(new BigDecimal(1000), 8, RoundingMode.HALF_UP);
row.set(DYNAMICS_FIELDS[8], revenue); // 实际收益
}
}
// 辅助方法比较赎回日期
private boolean isRedeemDateLater(Date newRedeemDate, Date existingRedeemDate) {