diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillChangeListExtendPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillChangeListExtendPlugin.java index f2ef39f..732f9e2 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillChangeListExtendPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/RecBillChangeListExtendPlugin.java @@ -153,9 +153,7 @@ public class RecBillChangeListExtendPlugin extends AbstractListPlugin implements // 是否存在付款申请 QFilter[] filters = new QFilter[]{ new QFilter("org.number", QCP.equals, companyCode), - new QFilter("shjh_vouchernum", QCP.equals, voucherNum), - new QFilter("shjh_sapfiscalyear", QCP.equals, sapFiscalYear), - new QFilter("shjh_sapline", QCP.equals, sapLineNumber) + new QFilter("shjh_vouchernum", QCP.equals, voucherNum) }; DynamicObject payApply = BusinessDataServiceHelper.loadSingle("ap_payapply", filters); if (payApply != null) { 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 ea8913c..a498010 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/FinancialFormReport.java @@ -2,7 +2,6 @@ package shjh.jhzj7.fi.fi.plugin.report; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; -import kd.bos.entity.report.FilterItemInfo; import kd.bos.entity.report.ReportColumn; import kd.bos.entity.report.ReportQueryParam; import kd.bos.logging.Log; @@ -14,10 +13,7 @@ import shjh.jhzj7.fi.fi.plugin.report.util.ReportUtils; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.Calendar; -import java.util.Date; -import java.util.Iterator; -import java.util.List; +import java.util.*; /** * 报表界面插件 @@ -64,12 +60,14 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu // 遍历每一行数据 Iterator iterator = rowData.iterator(); + //小计行合计项 + BigDecimal sumProjectedEarnings =BigDecimal.ZERO;//预计收益汇总 + BigDecimal sumProvisionEarnings =BigDecimal.ZERO;//收益计提汇总 + BigDecimal sumMonthEarnings =BigDecimal.ZERO;//本月收益汇总 + BigDecimal sumYearEarnings =BigDecimal.ZERO;//本年收益汇总 + while (iterator.hasNext()) { DynamicObject row = iterator.next(); - //跳过小计行 - if (row.getString(REPORT_FIELDS[0]).contains("-小计")){ - continue; - } // 基础字段获取(添加null检查) BigDecimal amount = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[4]); // 原始金额(元) row.set(REPORT_FIELDS[4],amount.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP)); @@ -90,16 +88,50 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu String day = countProductTerm(buyDate, expireDate, accrualDate, row); // 4. 预计收益 = 产品期限 * 金额(千元) * 预计业绩比较基准 / 365 BigDecimal proRevenue = countProRevenue(expectedRate, day, amount, row); + sumProjectedEarnings=sumProjectedEarnings.add(proRevenue); // 5. 收益计提 = 持有份额 * (月末单位净值 - 购买时单位净值) / 1000 BigDecimal revenueAmt = countRevenueAmt(buyCopies, monthNetWorth, netWorth, row); + sumProvisionEarnings=sumProvisionEarnings.add(revenueAmt); // 6. 本月收益计算(严格按生效期间计算) BigDecimal monthRevenue = countMonthRevenue(monthNetWorth, netWorth, buyCopies, valueDate, accrualDate, expireDate, row); + sumMonthEarnings=sumMonthEarnings.add(monthRevenue); // 7. 当月收益率 = 本月收益 / 金额(千元) * 100 * 12 countMonthRate(amount,monthRevenue,row); // 8. 本年累计收益 = 当年各月收益之和(按实际持有天数比例计算) BigDecimal yearRevenue = countYearRevenue(monthNetWorth, netWorth, buyCopies, valueDate, accrualDate, expireDate, row); + sumYearEarnings=sumYearEarnings.add(yearRevenue); + + //小计行合计 + 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]); + //添加合计 + // 需要配置求和的字段映射(目标字段,来源字段) + List sumConfig = new ArrayList<>(); + // 处理REPORT_FIELDS中的金额字段 + sumConfig.add(new String[]{REPORT_FIELDS[4], REPORT_FIELDS[4]}); // shjh_amount + // 处理DYNAMICS_FIELDS中的收益字段 + sumConfig.add(new String[]{DYNAMICS_FIELDS[0], DYNAMICS_FIELDS[0]}); // shjh_projectrevenueamt + sumConfig.add(new String[]{DYNAMICS_FIELDS[3], DYNAMICS_FIELDS[3]}); // shjh_revenueamt + sumConfig.add(new String[]{DYNAMICS_FIELDS[4], DYNAMICS_FIELDS[4]}); // shjh_monthrevenueamt + sumConfig.add(new String[]{DYNAMICS_FIELDS[6], DYNAMICS_FIELDS[6]}); // shjh_yearrevenueamt + + ReportUtils.addTotalRowData(rowData,REPORT_FIELDS[0],"小计","合计",sumConfig); + + } /** diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularFormReport.java b/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularFormReport.java index 4abada4..34939cc 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularFormReport.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularFormReport.java @@ -172,7 +172,7 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi rowData.removeAll(rowsToRemove); } - // 如果只有一类公司,移除所有小计行(根据你的TODO注释) + // 如果只有一类公司,移除所有小计行 if (currentCompanyName != null && rowData.stream() .filter(r -> !r.getString(FIELDS[0]).contains("小计")) .map(r -> r.getString(FIELDS[0])) diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/report/util/ReportUtils.java b/main/java/shjh/jhzj7/fi/fi/plugin/report/util/ReportUtils.java index f84a1d7..6d76a1a 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/util/ReportUtils.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/util/ReportUtils.java @@ -1,13 +1,16 @@ package shjh.jhzj7.fi.fi.plugin.report.util; import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.dataentity.entity.LocaleString; import kd.bos.entity.report.ReportColumn; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; public class ReportUtils { @@ -31,6 +34,94 @@ public class ReportUtils { return reportColumn; } + /** + * 添加合计行通用工具方法 + * @param rowData 数据集合 + * @param summaryField 用于识别小计行的字段名(如"projectName") + * @param summaryKeyword 小计行标识关键字(如"小计")-跳过该行数据 + * @param totalRowLabel 合计行显示文本(如"合计") + * @param sumFields 需要求和的字段配置(二维数组,格式:[目标字段, 来源字段]) + */ + public static void addTotalRowData(DynamicObjectCollection rowData, + String summaryField, + String summaryKeyword, + String totalRowLabel, + List sumFields) { + // 初始化合计值容器 + BigDecimal[] totals = new BigDecimal[sumFields.size()]; + for(int i=0; i rowsToRemove = new ArrayList<>(); + + for (DynamicObject row : rowData) { + String name = row.getString(keyWord); + + // 如果是"公司名称-小计"格式的行 + if (name != null && name.contains("-小计")) { + // 如果是第一次遇到该公司的小计行 + if (currentName == null || !name.startsWith(currentName)) { + currentName = name.substring(0, name.indexOf("-小计")); + // 修改为公司名称简化为"小计" + row.set(keyWord, "小计"); + } else { + // 如果是同一公司的重复小计行,标记为需要移除 + rowsToRemove.add(row); + } + } + } + + // 移除重复的小计行 + if (!rowsToRemove.isEmpty()) { + rowData.removeAll(rowsToRemove); + } + + // 如果只有一类公司,移除所有小计行 + if (currentName != null && rowData.stream() + .filter(r -> !r.getString(keyWord).contains("小计")) + .map(r -> r.getString(keyWord)) + .distinct() + .count() == 1) { + rowData.removeIf(r -> r.getString(keyWord).contains("小计")); + } + } + // 辅助方法:获取某个月的第一天 public static Date getFirstDayOfMonth(Date date) { Calendar cal = Calendar.getInstance();