From 1d09f07205c0cc8a8c75ab00fdb603c64625f9d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=B4=B5=E5=BC=BA?= Date: Wed, 18 Jun 2025 18:53:03 +0800 Subject: [PATCH] =?UTF-8?q?=E7=90=86=E8=B4=A2=E6=8A=A5=E8=A1=A8=E4=BC=98?= =?UTF-8?q?=E5=8C=962.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fi/plugin/report/FinancialFormReport.java | 382 +++++++++++++++--- .../fi/plugin/report/FinancialListReport.java | 71 ++-- 2 files changed, 361 insertions(+), 92 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 7c1e2dc..3b123c3 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java @@ -6,8 +6,11 @@ import kd.bos.entity.report.ReportColumn; import kd.bos.entity.report.ReportQueryParam; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; import kd.bos.report.ReportList; import kd.bos.report.plugin.AbstractReportFormPlugin; +import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.sdk.plugin.Plugin; import shjh.jhzj7.fi.fi.plugin.report.util.ReportUtils; @@ -26,14 +29,16 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu private static final String FILTER_DATE = "shjh_filterdate"; private static final String[] REPORT_FIELDS = { - "shjh_bankname", "shjh_productname", "shjh_producttype", "shjh_productterm", - "shjh_amount", "shjh_buycopies", "shjh_iopv", "shjh_buydate", "shjh_valuedate", - "shjh_expiredate", "shjh_planrevenue", "shjh_monthiopv", "shjh_monthiopvdate" + "shjh_bankname", "shjh_productname", "shjh_producttype", "shjh_productterm", "shjh_amount", + "shjh_buycopies", "shjh_iopv", "shjh_buydate", "shjh_valuedate", "shjh_expiredate", + "shjh_planrevenue", "shjh_monthiopv", "shjh_monthiopvdate", "shjh_id","shjh_status", + "shjh_basis","shjh_startbuycopies" }; private static final String[] DYNAMICS_FIELDS = { "shjh_projectrevenueamt","shjh_date","shjh_days","shjh_revenueamt", - "shjh_monthrevenueamt","shjh_monthrate","shjh_yearrevenueamt" + "shjh_monthrevenueamt","shjh_monthrate","shjh_yearrevenueamt", + "shjh_yearrate","shjh_actualearnings","shjh_actualrate","shjh_expire" }; @Override @@ -45,8 +50,12 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu 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[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 })); } @Override @@ -70,54 +79,68 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu DynamicObject row = iterator.next(); // 基础字段获取(添加null检查) BigDecimal amount = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[4]); // 原始金额(元) - row.set(REPORT_FIELDS[4],amount.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP)); - - BigDecimal buyCopies = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[5]); // 持有份额 - BigDecimal netWorth = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[6]); // 购买时单位净值 + BigDecimal buyAmount = amount.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);//购买金额(千元) + row.set(REPORT_FIELDS[4],buyAmount); Date buyDate = row.getDate(REPORT_FIELDS[7]); // 购买日 Date valueDate = row.getDate(REPORT_FIELDS[8]); // 计息日 Date expireDate = row.getDate(REPORT_FIELDS[9]); // 到期日 BigDecimal expectedRate = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[10]); // 预计业绩比较基准(%) + String basis = row.getString(REPORT_FIELDS[15]);//计息基准 + //理财申购单估值分录处理 + Long id = row.getLong(REPORT_FIELDS[13]); + valuationEntry(accrualDate,buyDate,buyAmount,id,row); + + BigDecimal buyCopies = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[5]); // 持有份额 + BigDecimal netWorth = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[6]); // 购买时单位净值 BigDecimal monthNetWorth = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[11]); // 月末单位净值 + BigDecimal startBuyCopies = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[16]); // 购买份额 + // 1. 设置计提日 row.set(DYNAMICS_FIELDS[1], accrualDate); // 2. 计算天数 = 计提日 - 计息日 countDays(valueDate,accrualDate,row); - // 3. 计算产品期限(总天数)=到期日-购买日,若到期日为空则用计提日-购买日 - String day = countProductTerm(buyDate, expireDate, accrualDate, row); + // 3. 计算产品期限(总天数)=到期日-计息日 + String day = countProductTerm(valueDate, expireDate, accrualDate, row); // 4. 预计收益 = 产品期限 * 金额(千元) * 预计业绩比较基准 / 365 - BigDecimal proRevenue = countProRevenue(expectedRate, day, amount, row); + BigDecimal proRevenue = countProRevenue(expectedRate, day, amount, row,basis); sumProjectedEarnings=sumProjectedEarnings.add(proRevenue); - // 5. 收益计提 = 持有份额 * (月末单位净值 - 购买时单位净值) / 1000 - BigDecimal revenueAmt = countRevenueAmt(buyCopies, monthNetWorth, netWorth, row); + // 5. 收益计提 = (持有份额 *月末单位净值 - 购买份额*购买时单位净值) / 1000 + BigDecimal revenueAmt = countRevenueAmt(buyCopies, monthNetWorth, netWorth, row,startBuyCopies); sumProvisionEarnings=sumProvisionEarnings.add(revenueAmt); - // 6. 本月收益计算(严格按生效期间计算) - BigDecimal monthRevenue = countMonthRevenue(monthNetWorth, netWorth, buyCopies, valueDate, accrualDate, expireDate, row); + // 本月收益计算累计 + //BigDecimal monthRevenue = countMonthRevenue(monthNetWorth, netWorth, buyCopies, valueDate, accrualDate, expireDate, row); + BigDecimal monthRevenue = ReportUtils.getBigDecimalValue(row, DYNAMICS_FIELDS[4]); sumMonthEarnings=sumMonthEarnings.add(monthRevenue); // 7. 当月收益率 = 本月收益 / 金额(千元) * 100 * 12 - countMonthRate(amount,monthRevenue,row); - // 8. 本年累计收益 = 当年各月收益之和(按实际持有天数比例计算) - BigDecimal yearRevenue = countYearRevenue(monthNetWorth, netWorth, buyCopies, valueDate, accrualDate, expireDate, row); + //countMonthRate(amount,monthRevenue,row); + // 本年收益累计 + //BigDecimal yearRevenue = countYearRevenue(monthNetWorth, netWorth, buyCopies, valueDate, accrualDate, expireDate, row); + BigDecimal yearRevenue = ReportUtils.getBigDecimalValue(row, DYNAMICS_FIELDS[6]); sumYearEarnings=sumYearEarnings.add(yearRevenue); + //实际总收益率=实际收益/金额 + BigDecimal actualEarnings = ReportUtils.getBigDecimalValue(row, DYNAMICS_FIELDS[8]); + row.set(DYNAMICS_FIELDS[9],actualEarnings.divide(buyAmount,2, RoundingMode.HALF_UP)); + + //小计行合计 - 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; - } +// 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.changeRowData(rowData,REPORT_FIELDS[0]); //添加合计 // 需要配置求和的字段映射(目标字段,来源字段) List sumConfig = new ArrayList<>(); @@ -134,6 +157,195 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu } + /** + * 获取估值分录数据 + * @param accrualDate 计提日 + * @param buyDate 购买日期 + * @param buyAmount 购买金额 + * @param id 表单id + */ + private void valuationEntry(Date accrualDate, Date buyDate, BigDecimal buyAmount, Long id, DynamicObject row) { + // 初始化所有变量 + BigDecimal buyCopies = BigDecimal.ZERO; + BigDecimal monthIop = BigDecimal.ZERO; + Date monthIopDate = null; + BigDecimal monthAmount = BigDecimal.ZERO; + BigDecimal monthAnnualizedRate = BigDecimal.ZERO; + BigDecimal yearAmount = BigDecimal.ZERO; + BigDecimal yearAnnualizedRate = BigDecimal.ZERO; + BigDecimal yearStartAmount = buyAmount; + + DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(id, "cim_finsubscribe"); + if (dynamicObject != null) { + DynamicObjectCollection dynamicObjectCollection = dynamicObject.getDynamicObjectCollection("valuationentry"); + if (dynamicObjectCollection != null && dynamicObjectCollection.size() != 0) { + // 初始化记录变量 + DynamicObject closestRecord = null; + DynamicObject latestIopRecord = null; + DynamicObject lastMonthRecord = null; + DynamicObject lastYearRecord = null; + DynamicObject yearStartRecord = null; + long minDiff = Long.MAX_VALUE; + + // 获取日期信息 + Calendar accrualCal = Calendar.getInstance(); + accrualCal.setTime(accrualDate); + int accrualYear = accrualCal.get(Calendar.YEAR); + int accrualMonth = accrualCal.get(Calendar.MONTH); + + Calendar buyCal = Calendar.getInstance(); + buyCal.setTime(buyDate); + int buyYear = buyCal.get(Calendar.YEAR); + int buyMonth = buyCal.get(Calendar.MONTH); + + // 遍历估值记录 + for (DynamicObject object : dynamicObjectCollection) { + Date valuationdate = object.getDate("e_valuationdate"); + if (valuationdate == null) continue; + + Calendar valCal = Calendar.getInstance(); + valCal.setTime(valuationdate); + int valYear = valCal.get(Calendar.YEAR); + int valMonth = valCal.get(Calendar.MONTH); + + // 1. 寻找离计提日最近的份额记录 + long diff = Math.abs(valuationdate.getTime() - accrualDate.getTime()); + if (diff < minDiff) { + minDiff = diff; + closestRecord = object; + } + + // 2. 寻找本月最后一次估值记录 + if (!valuationdate.after(accrualDate)) { + if (latestIopRecord == null || valuationdate.after(latestIopRecord.getDate("e_valuationdate"))) { + latestIopRecord = object; + } + } + + // 3. 寻找上月最后一次估值记录 + if ((valYear == accrualYear && valMonth == accrualMonth - 1) || + (accrualMonth == 0 && valYear == accrualYear - 1 && valMonth == 11)) { + if (lastMonthRecord == null || valuationdate.after(lastMonthRecord.getDate("e_valuationdate"))) { + lastMonthRecord = object; + } + } + + // 4. 寻找上一年最后一次估值记录 + if (valYear == accrualYear - 1) { + if (lastYearRecord == null || valuationdate.after(lastYearRecord.getDate("e_valuationdate"))) { + lastYearRecord = object; + } + } + + // 5. 寻找本年第一个估值记录 + if (valYear == accrualYear) { + if (yearStartRecord == null || valuationdate.before(yearStartRecord.getDate("e_valuationdate"))) { + yearStartRecord = object; + } + } + } + + // 设置持有份额 + if (closestRecord != null) { + buyCopies = closestRecord.getBigDecimal("e_surpcopies"); + } + + // 设置月末单位净值 + if (latestIopRecord != null) { + monthIop = latestIopRecord.getBigDecimal("e_iopv"); + monthIopDate = latestIopRecord.getDate("e_valuationdate"); + } + + // 计算本月收益 + if (latestIopRecord != null) { + BigDecimal currentMarketValue = latestIopRecord.getBigDecimal("e_iopv").multiply(buyCopies); + + // 只有当上月记录存在时才计算本月收益 + if (lastMonthRecord != null) { + BigDecimal lastMonthMarketValue = lastMonthRecord.getBigDecimal("e_iopv") + .multiply(lastMonthRecord.getBigDecimal("e_surpcopies")); + monthAmount = currentMarketValue.subtract(lastMonthMarketValue) + .divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP); + + // 计算当月年化收益率 + if (lastMonthMarketValue.compareTo(BigDecimal.ZERO) != 0) { + + monthAnnualizedRate = monthAmount.divide(buyAmount).multiply(new BigDecimal(1200)).setScale(2, RoundingMode.HALF_UP); + } + } else if (accrualYear == buyYear && accrualMonth == buyMonth) { + // 特殊处理:计提月与购买月相同时,使用购买金额作为上月市值 + BigDecimal lastMonthMarketValue = buyAmount; + monthAmount = currentMarketValue.subtract(lastMonthMarketValue.multiply(new BigDecimal(1000))) + .divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP); + + if (lastMonthMarketValue.compareTo(BigDecimal.ZERO) != 0) { + + monthAnnualizedRate = monthAmount.divide(buyAmount).multiply(new BigDecimal(1200)).setScale(2, RoundingMode.HALF_UP); + + } + } + } + + // 计算本年累计收益 + if (latestIopRecord != null) { + BigDecimal currentMarketValue = latestIopRecord.getBigDecimal("e_iopv").multiply(buyCopies); + + // 只有当上年记录存在时才计算本年累计收益 + if (lastYearRecord != null) { + BigDecimal lastYearMarketValue = lastYearRecord.getBigDecimal("e_iopv") + .multiply(lastYearRecord.getBigDecimal("e_surpcopies")); + yearAmount = currentMarketValue.subtract(lastYearMarketValue) + .divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP); + +// // 计算本年累计年化收益率 +// if (yearStartRecord != null) { +// yearStartAmount = yearStartRecord.getBigDecimal("e_iopv") +// .multiply(yearStartRecord.getBigDecimal("e_surpcopies")); +// } + + if (lastYearMarketValue.compareTo(BigDecimal.ZERO) != 0) { + int monthCount = accrualMonth + 1; + yearAnnualizedRate = yearAmount.multiply(new BigDecimal(1000)) + .divide(lastYearMarketValue, 6, RoundingMode.HALF_UP) + .divide(new BigDecimal(monthCount), 6, RoundingMode.HALF_UP) + .multiply(new BigDecimal(12)) + .multiply(new BigDecimal(100)) + .setScale(2, RoundingMode.HALF_UP); + } + } else if (accrualYear == buyYear) { + // 特殊处理:计提年与购买年相同时,使用购买金额作为上年市值 + BigDecimal lastYearMarketValue = buyAmount; + + if (lastYearMarketValue.compareTo(BigDecimal.ZERO) != 0) { + yearAmount = currentMarketValue.subtract(lastYearMarketValue.multiply(new BigDecimal(1000))) + .divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP); + + int monthCount = accrualMonth -buyMonth; + if (monthCount==0){ + monthCount = 1; + } + yearAnnualizedRate = yearAmount + .divide(lastYearMarketValue, 6, RoundingMode.HALF_UP) + .divide(new BigDecimal(monthCount), 6, RoundingMode.HALF_UP) + .multiply(new BigDecimal(12)) + .multiply(new BigDecimal(100)) + .setScale(2, RoundingMode.HALF_UP); + } + } + } + } + } + + // 设置结果 + row.set(REPORT_FIELDS[5], buyCopies); + row.set(REPORT_FIELDS[11], monthIop); + row.set(REPORT_FIELDS[12], monthIopDate); + row.set(DYNAMICS_FIELDS[4], monthAmount); + row.set(DYNAMICS_FIELDS[5], monthAnnualizedRate); + row.set(DYNAMICS_FIELDS[6], yearAmount); + row.set(DYNAMICS_FIELDS[7], yearAnnualizedRate); + } + /** * 计算天数 = 计提日 - 计息日 * @param valueDate 计息日 @@ -149,26 +361,61 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu } } - /** - * 计算产品期限(总天数)=到期日-购买日,若到期日为空则用计提日-购买日 - * @param buyDate 购买日 - * @param expireDate 到期日 - * @param accrualDate 计提日 - * @param row 表格 - * @return 总天数 - */ - private String countProductTerm(Date buyDate,Date expireDate,Date accrualDate,DynamicObject row){ + private String countProductTerm(Date valueDate, Date expireDate, Date accrualDate, DynamicObject row) { String day = "0"; // 默认值设为0 - if (buyDate != null) { - Date endDate = (expireDate != null) ? expireDate : accrualDate; - // 检查计提日/到期日是否早于购买日 - if (endDate.getTime() >= buyDate.getTime()) { - long termDays = (endDate.getTime() - buyDate.getTime()) / (1000 * 60 * 60 * 24); + 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")) { + // 获取最大的redeemdate作为结束日期 + Date maxRedeemDate = null; + if (load != null && load.length > 0) { + for (DynamicObject dynamicObject : load) { + Date redeemDate = dynamicObject.getDate("redeemdate"); + if (redeemDate != null && (maxRedeemDate == null || redeemDate.after(maxRedeemDate))) { + maxRedeemDate = redeemDate; + } + } + if (maxRedeemDate != null) { + endDate = maxRedeemDate; + row.set(REPORT_FIELDS[9], endDate); // 设置到期日 + } + } + } + + // 计算产品期限天数 + if (endDate.getTime() >= valueDate.getTime()) { + long termDays = (endDate.getTime() - valueDate.getTime()) / (1000 * 60 * 60 * 24); day = String.valueOf(termDays); } - // 如果endDate早于buyDate,保持day=0 } - row.set(REPORT_FIELDS[3], day); + + // 设置是否到期状态 + String isExpired = "否"; // 默认未到期 + if (expireDate != null && accrualDate != null) { + if (accrualDate.getTime() >= expireDate.getTime()) { + isExpired = "是"; // 已到期 + } + } + row.set(DYNAMICS_FIELDS[10], isExpired); // 是否到期 + + row.set(REPORT_FIELDS[3], day); // 产品期限天数 + row.set(DYNAMICS_FIELDS[8], actualEarnings); // 实际收益 + return day; } @@ -179,31 +426,50 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu * @param amount 投资金额 * @param row 表格 */ - private BigDecimal countProRevenue(BigDecimal expectedRate,String day,BigDecimal amount,DynamicObject row) { + private BigDecimal countProRevenue(BigDecimal expectedRate,String day,BigDecimal amount,DynamicObject row,String basis) { + BigDecimal basisDay= BigDecimal.valueOf(365); + if (basis.contains("360")){ + basisDay=BigDecimal.valueOf(360); + } BigDecimal projectRevenue = BigDecimal.ZERO; 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(new BigDecimal(365), 2, RoundingMode.HALF_UP); + .divide(basisDay, 2, RoundingMode.HALF_UP); row.set(DYNAMICS_FIELDS[0], projectRevenue); } return projectRevenue; } /** - * 收益计提 = 持有份额 * (月末单位净值 - 购买时单位净值) / 1000 - * @param buyCopies 持有份额 - * @param monthNetWorth 月末单位净值 - * @param netWorth 购买时单位净值 - * @param row 表格 + * 收益计提 = (持有份额 * 月末单位净值 - 购买份额 * 购买时单位净值) / 1000 + * @param buyCopies 持有份额(当前份额) + * @param monthNetWorth 月末单位净值(当前净值) + * @param netWorth 购买时单位净值(初始净值) + * @param row 表格行数据 + * @param startBuyCopies 购买份额(初始份额) + * @return 计算后的收益金额(保留2位小数) */ - private BigDecimal countRevenueAmt(BigDecimal buyCopies,BigDecimal monthNetWorth,BigDecimal netWorth,DynamicObject row){ - BigDecimal revenue=BigDecimal.ZERO; - if (buyCopies != null && monthNetWorth != null && netWorth != null) { - revenue = buyCopies.multiply(monthNetWorth.subtract(netWorth)) + private BigDecimal countRevenueAmt( + BigDecimal buyCopies, + BigDecimal monthNetWorth, + BigDecimal netWorth, + DynamicObject row, + BigDecimal startBuyCopies + ) { + BigDecimal revenue = BigDecimal.ZERO; + + // 检查所有参数是否非空 + if (buyCopies != null && monthNetWorth != null && netWorth != null && startBuyCopies != null) { + // 计算:(持有份额 * 月末单位净值 - 购买份额 * 购买时单位净值) / 1000 + revenue = buyCopies.multiply(monthNetWorth) + .subtract(startBuyCopies.multiply(netWorth)) .divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP); + + // 设置到表格行 row.set(DYNAMICS_FIELDS[3], revenue); } + return revenue; } diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialListReport.java b/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialListReport.java index 58609d2..6c8fd3e 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialListReport.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialListReport.java @@ -26,17 +26,18 @@ import java.util.List; public class FinancialListReport extends AbstractReportListDataPlugin implements Plugin { private static final Log logger = LogFactory.getLog(FinancialListReport.class); - // 理财申购单字段 + // 理财申购单字段--固定取值 private static final String[] FINANCIAL_FIELDS = { - "finorginfo.name", "productname", "revenuetype", "term", "amount", - "buycopies", "iopv", "purchasedate", "valuedate", "expiredate", "planrevenue" + "finorginfo.name", "productname", "investvarieties", "term", "amount", + "iopv", "purchasedate", "valuedate", "expiredate", "planrevenue", + "id","finservicestatus","basis","buycopies" }; // 报表输出字段 private static final String[] REPORT_FIELDS = { - "shjh_bankname", "shjh_productname", "shjh_producttype", "shjh_productterm", - "shjh_amount", "shjh_buycopies", "shjh_iopv", "shjh_buydate", "shjh_valuedate", - "shjh_expiredate", "shjh_planrevenue", "shjh_monthiopv", "shjh_monthiopvdate" + "shjh_bankname", "shjh_productname", "shjh_producttype", "shjh_productterm", "shjh_amount", + "shjh_iopv", "shjh_buydate", "shjh_valuedate", "shjh_expiredate", "shjh_planrevenue" + ,"shjh_id","shjh_status","shjh_basis","shjh_startbuycopies" }; // 筛选条件字段名 @@ -67,16 +68,17 @@ public class FinancialListReport extends AbstractReportListDataPlugin implements ); // 3. 查询理财收益预提数据 - DataSet addDataSet = QueryServiceHelper.queryDataSet( - this.getClass().getName() + "1", - "cim_intbill_batch", - "entry.finbillno, entry.shjh_nowamount AS shjh_monthiopv, preintdate AS shjh_monthiopvdate", - null, - null - ); +// DataSet addDataSet = QueryServiceHelper.queryDataSet( +// this.getClass().getName() + "1", +// "cim_intbill_batch", +// "entry.finbillno, entry.shjh_nowamount AS shjh_monthiopv, preintdate AS shjh_monthiopvdate", +// null, +// null +// ); // 4. 合并数据并返回结果 - return processAndMergeDatasets(mainDataSet, addDataSet); +// return processAndMergeDatasets(mainDataSet, addDataSet); + return mainDataSet; } /** @@ -133,26 +135,27 @@ public class FinancialListReport extends AbstractReportListDataPlugin implements .finish(); // 生成按银行分组的小计行 - DataSet summaryDataSet = joinedDataSet.groupBy(new String[]{REPORT_FIELDS[0]}) - .sum(REPORT_FIELDS[4]) // 对金额字段求和 - .finish() - .addField("'-'", REPORT_FIELDS[1]) // 产品名称 - .addField("'-'", REPORT_FIELDS[2]) // 产品类型 - .addField("'-'", REPORT_FIELDS[3]) // 产品期限 - .addField("0L", REPORT_FIELDS[5]) // 持有份数 - .addField("0L", REPORT_FIELDS[6]) // 单位净值 - .addField("NULL", REPORT_FIELDS[7]) // 购买日 - .addField("NULL", REPORT_FIELDS[8]) // 计息日 - .addField("NULL", REPORT_FIELDS[9]) // 到期日 - .addField("0L", REPORT_FIELDS[10]) // 预计收益 - .addField("0L", REPORT_FIELDS[11]) // 月末净值 - .addField("NULL", REPORT_FIELDS[12]) // 净值报告日 - .select("concat(shjh_bankname+'-小计') as " + String.join(",", REPORT_FIELDS)) - .select(String.join(",", REPORT_FIELDS)); - - // 合并明细数据和小计数据,并按银行名称排序 - return joinedDataSet.union(summaryDataSet) - .orderBy(new String[]{REPORT_FIELDS[0]}); +// DataSet summaryDataSet = joinedDataSet.groupBy(new String[]{REPORT_FIELDS[0]}) +// .sum(REPORT_FIELDS[4]) // 对金额字段求和 +// .finish() +// .addField("'-'", REPORT_FIELDS[1]) // 产品名称 +// .addField("'-'", REPORT_FIELDS[2]) // 产品类型 +// .addField("'-'", REPORT_FIELDS[3]) // 产品期限 +// .addField("0L", REPORT_FIELDS[5]) // 持有份数 +// .addField("0L", REPORT_FIELDS[6]) // 单位净值 +// .addField("NULL", REPORT_FIELDS[7]) // 购买日 +// .addField("NULL", REPORT_FIELDS[8]) // 计息日 +// .addField("NULL", REPORT_FIELDS[9]) // 到期日 +// .addField("0L", REPORT_FIELDS[10]) // 预计收益 +// .addField("0L", REPORT_FIELDS[11]) // 月末净值 +// .addField("NULL", REPORT_FIELDS[12]) // 净值报告日 +// .select("concat(shjh_bankname+'-小计') as " + String.join(",", REPORT_FIELDS)) +// .select(String.join(",", REPORT_FIELDS)); +// +// // 合并明细数据和小计数据,并按银行名称排序 +// return joinedDataSet.union(summaryDataSet) +// .orderBy(new String[]{REPORT_FIELDS[0]}); + return joinedDataSet; } /**