From df0dc5116c926260c6c85a1ae8c096d7c15a633d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=B4=B5=E5=BC=BA?= Date: Tue, 15 Jul 2025 18:20:06 +0800 Subject: [PATCH] =?UTF-8?q?=E7=90=86=E8=B4=A2=E6=8A=A5=E8=A1=A8=E4=BD=8D?= =?UTF-8?q?=E6=95=B0=E6=94=B9=E5=8A=A8=E3=80=81=E5=8D=83=E5=85=83=E5=8E=BB?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fi/plugin/report/FinancialFormReport.java | 124 ++++-------------- 1 file changed, 29 insertions(+), 95 deletions(-) diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java b/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java index 45b1ff1..984c76a 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java @@ -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) {