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 b29fe4d..390cafc 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java @@ -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); // 实际收益 } }