diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/report/StrongOperateFormPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/report/StrongOperateFormPlugin.java index 0107719..c15d962 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/StrongOperateFormPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/StrongOperateFormPlugin.java @@ -10,6 +10,10 @@ import kd.sdk.plugin.Plugin; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * 报表界面插件 @@ -23,37 +27,64 @@ public class StrongOperateFormPlugin extends AbstractReportFormPlugin implements public void processRowData(String gridPK, DynamicObjectCollection rowData, ReportQueryParam queryParam) { super.processRowData(gridPK, rowData, queryParam); - //1.计算合计 - BigDecimal shjh_amountjz = new BigDecimal("0");//合计_基准日期-余额 - for (DynamicObject rowDatum : rowData) { - //合计资金合计(元) - BigDecimal amountjz = rowDatum.getBigDecimal("shjh_amountjz"); - if (null != amountjz) { - shjh_amountjz = shjh_amountjz.add(amountjz);//基准日期-余额 - } - } - DynamicObject dynamicObject = new DynamicObject(rowData.getDynamicObjectType()); - dynamicObject.set("shjh_bankname", "合计");//组织编码 - dynamicObject.set("shjh_amountjz", shjh_amountjz); - dynamicObject.set("shjh_percentage", null); - rowData.add(dynamicObject); - //2.计算每行 资金合计(元) 占比 - for (DynamicObject rowDatum : rowData) { - //合计资金合计(元) - BigDecimal amountjz = rowDatum.getBigDecimal("shjh_amountjz"); - if (null != amountjz) { - //资金合计(元)占比 - // 先乘 100 再相除并保留两位小数 - BigDecimal amountjz_zb = new BigDecimal("0"); - if (shjh_amountjz.compareTo(BigDecimal.ZERO) != 0) { - // 先乘 100 再相除并保留两位小数 - amountjz_zb = amountjz.multiply(new BigDecimal("100")).divide(shjh_amountjz, 2, RoundingMode.HALF_UP); - System.out.println("百分比结果: " + amountjz_zb + "%"); - } else { - System.out.println("除数不能为 0,无法进行计算。"); + // --- 第一步:合并相同银行名称的行(排除"合计"行) --- + Map bankNameToRowMap = new HashMap<>(); + List duplicateRowsToRemove = new ArrayList<>(); + + for (DynamicObject row : rowData) { + String bankName = row.getString("shjh_bankname"); + if ("合计".equals(bankName)) continue; + + if (bankNameToRowMap.containsKey(bankName)) { + // 合并金额 + DynamicObject existingRow = bankNameToRowMap.get(bankName); + BigDecimal existingAmount = existingRow.getBigDecimal("shjh_amountjz"); + BigDecimal currentAmount = row.getBigDecimal("shjh_amountjz"); + + if (existingAmount != null && currentAmount != null) { + existingRow.set("shjh_amountjz", existingAmount.add(currentAmount)); } - rowDatum.set("shjh_percentage", amountjz_zb); + duplicateRowsToRemove.add(row); + } else { + bankNameToRowMap.put(bankName, row); } } + rowData.removeAll(duplicateRowsToRemove); + + // --- 第二步:计算资金总和(仅非合计行) --- + BigDecimal totalAmount = BigDecimal.ZERO; + for (DynamicObject row : rowData) { + if (!"合计".equals(row.getString("shjh_bankname"))) { + BigDecimal amount = row.getBigDecimal("shjh_amountjz"); + if (amount != null) { + totalAmount = totalAmount.add(amount); + } + } + } + + // --- 第三步:计算每行占比 --- + BigDecimal percentageSum = BigDecimal.ZERO; // 用于验证占比总和 + for (DynamicObject row : rowData) { + String bankName = row.getString("shjh_bankname"); + if ("合计".equals(bankName)) continue; + + BigDecimal amount = row.getBigDecimal("shjh_amountjz"); + if (amount != null) { + BigDecimal percentage = BigDecimal.ZERO; + if (totalAmount.compareTo(BigDecimal.ZERO) != 0) { + percentage = amount.multiply(new BigDecimal("100")) + .divide(totalAmount, 2, RoundingMode.HALF_UP); + percentageSum = percentageSum.add(percentage); // 累加占比 + } + row.set("shjh_percentage", percentage); + } + } + + // --- 添加合计行(占比强制设为100%) --- + DynamicObject totalRow = new DynamicObject(rowData.getDynamicObjectType()); + totalRow.set("shjh_bankname", "合计"); + totalRow.set("shjh_amountjz", totalAmount); + totalRow.set("shjh_percentage", new BigDecimal("100")); // 关键修改点 + rowData.add(totalRow); } } diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/report/StrongOperateQueryPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/report/StrongOperateQueryPlugin.java index 8f36e17..c0d4adc 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/StrongOperateQueryPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/StrongOperateQueryPlugin.java @@ -65,7 +65,7 @@ public class StrongOperateQueryPlugin extends AbstractReportListDataPlugin imple .finish(); // 再次根据银行编码分组 求和余额 - result = result1.groupBy(new String[]{"shjh_orgnumber", "shjh_orgname", "shjh_bankname","banknumber","shjh_companyisshare"}).sum("shjh_amountjz").finish(); + result = result1.groupBy(new String[]{"shjh_bankname","banknumber","shjh_companyisshare"}).sum("shjh_amountjz").finish(); } catch (Exception e) { e.printStackTrace();