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 338e59e..4abada4 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularFormReport.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularFormReport.java @@ -9,9 +9,7 @@ import kd.sdk.plugin.Plugin; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.Calendar; -import java.util.Date; -import java.util.Iterator; +import java.util.*; import java.util.concurrent.TimeUnit; /** @@ -137,6 +135,83 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi e.printStackTrace(); } } + //对列表数据做更改 + this.changeRowData(rowData); + //添加合计行 + this.addTotalRowData(rowData); + } + + /** + * 对小计行处理 + * @param rowData + */ + private void changeRowData(DynamicObjectCollection rowData) { + // 用于记录当前处理的"公司名称-小计"行 + String currentCompanyName = null; + List rowsToRemove = new ArrayList<>(); + + for (DynamicObject row : rowData) { + String companyName = row.getString(FIELDS[0]); + + // 如果是"公司名称-小计"格式的行 + if (companyName != null && companyName.contains("-小计")) { + // 如果是第一次遇到该公司的小计行 + if (currentCompanyName == null || !companyName.startsWith(currentCompanyName)) { + currentCompanyName = companyName.substring(0, companyName.indexOf("-小计")); + // 修改为公司名称简化为"小计" + row.set(FIELDS[0], "小计"); + } else { + // 如果是同一公司的重复小计行,标记为需要移除 + rowsToRemove.add(row); + } + } + } + + // 移除重复的小计行 + if (!rowsToRemove.isEmpty()) { + rowData.removeAll(rowsToRemove); + } + + // 如果只有一类公司,移除所有小计行(根据你的TODO注释) + if (currentCompanyName != null && rowData.stream() + .filter(r -> !r.getString(FIELDS[0]).contains("小计")) + .map(r -> r.getString(FIELDS[0])) + .distinct() + .count() == 1) { + rowData.removeIf(r -> r.getString(FIELDS[0]).contains("小计")); + } + } + + /** + * 尾行固定添加合计行 + * @param rowData + */ + private void addTotalRowData(DynamicObjectCollection rowData) { + BigDecimal totalAmount = new BigDecimal("0");//合计金额 + BigDecimal totalInterestAmt = new BigDecimal("0");//合计计提利息(元) + BigDecimal totalMonthAmt = new BigDecimal("0");//合计本月收益(元) + BigDecimal totalYearAmt = new BigDecimal("0");//合计本年累计收益(元) + + for (DynamicObject rowDatum : rowData) { + //跳过小计行 + if (!rowDatum.getString(FIELDS[0]).contains("小计")){ + BigDecimal amount = rowDatum.getBigDecimal(FIELDS[9]); + totalAmount=totalAmount.add(amount); + BigDecimal interestAmt = rowDatum.getBigDecimal(FIELDS[12]); + totalInterestAmt=totalInterestAmt.add(interestAmt); + BigDecimal monthAmt = rowDatum.getBigDecimal(FIELDS[13]); + totalMonthAmt=totalMonthAmt.add(monthAmt); + BigDecimal yearAmt = rowDatum.getBigDecimal(FIELDS[14]); + totalYearAmt=totalYearAmt.add(yearAmt); + } + } + DynamicObject dynamicObject = new DynamicObject(rowData.getDynamicObjectType()); + dynamicObject.set(FIELDS[0],"合计"); + dynamicObject.set(FIELDS[9],totalAmount); + dynamicObject.set(FIELDS[12],totalInterestAmt); + dynamicObject.set(FIELDS[13],totalMonthAmt); + dynamicObject.set(FIELDS[14],totalYearAmt); + rowData.add(dynamicObject); } } \ No newline at end of file diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularListReport.java b/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularListReport.java index 51136fe..8ec157f 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularListReport.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularListReport.java @@ -1,10 +1,7 @@ package shjh.jhzj7.fi.fi.plugin.report; import kd.bos.algo.DataSet; -import kd.bos.algo.DataType; import kd.bos.dataentity.entity.DynamicObject; -import kd.bos.dataentity.entity.DynamicObjectCollection; -import kd.bos.dataentity.utils.StringUtils; import kd.bos.entity.report.AbstractReportListDataPlugin; import kd.bos.entity.report.FilterItemInfo; import kd.bos.entity.report.ReportQueryParam; @@ -14,11 +11,9 @@ import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.QueryServiceHelper; import kd.sdk.plugin.Plugin; -import shjh.jhzj7.fi.fi.plugin.operate.LoanPushSapOperation; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -29,99 +24,94 @@ public class RegularListReport extends AbstractReportListDataPlugin implements P private final static Log logger = LogFactory.getLog(RegularListReport.class); + //公司名称 + private static final String KEY_FILTER_ORG = "shjh_filterorgname"; + + //计提日期 + private static final String KEY_FILTER_DATE = "shjh_filterdate"; + //定期存款处理表字段 - private static String[] DEPOSIT={"org","finorginfo","finaccount","currency", - "intdate","expiredate","term","interestrate","revenueproject","amount"}; + private static final String[] DEPOSIT={"org","finorginfo","finaccount","currency","intdate","expiredate","term","interestrate","revenueproject","amount"}; //定期利息计提报表字段 - private static final String[] FIELDS={"shjh_orgname","shjh_bankname","shjh_bankaccount","shjh_currency", - "shjh_depositstartdate","shjh_depositstopdate","shjh_term","shjh_interestrate", - "shjh_frequency","shjh_amount","shjh_accrualdate","shjh_accrualdays", - "shjh_accrualinterest","shjh_monthearnings","shjh_yearearnings"}; + private static final String[] FIELDS={"shjh_orgname","shjh_bankname","shjh_bankaccount","shjh_currency","shjh_depositstartdate","shjh_depositstopdate","shjh_term","shjh_interestrate","shjh_frequency","shjh_amount","shjh_accrualdate","shjh_accrualdays","shjh_accrualinterest","shjh_monthearnings","shjh_yearearnings"}; + - private static final DataType[] DATATYPE={DataType.LongType,DataType.LongType,DataType.StringType,DataType.LongType, - DataType.DateType, DataType.DateType,DataType.StringType,DataType.LongType, - DataType.LongType,DataType.BigDecimalType,DataType.DateType,DataType.StringType, - DataType.BigDecimalType,DataType.BigDecimalType,DataType.BigDecimalType}; @Override public DataSet query(ReportQueryParam param, Object obj) throws Throwable { - List filterItems = param.getFilter().getFilterItems(); - Long orgId=null; - String accrualDate=null; - for (FilterItemInfo filterItem : filterItems) { - switch (filterItem.getPropName()){ - case "shjh_filterorgname": - orgId=(filterItem.getValue()==null) ? null: (Long) ((DynamicObject)filterItem.getValue()).getPkValue(); - break; - case "shjh_filterdate": - accrualDate=(filterItem.getDate()==null) ? null:new SimpleDateFormat("yyyy-MM-dd").format(filterItem.getDate()); - break; - default: - break; + DataSet unionDataSet = null; + try { + StringBuilder selectFields = new StringBuilder(); + selectFields.append(DEPOSIT[0]).append(".name").append(" as ").append(FIELDS[0]).append(","); + assembleSQL(selectFields); + List filterItems = param.getFilter().getFilterItems(); + Long orgId=null; + String accrualDate=null; + List qFilters=new ArrayList<>(); + for (FilterItemInfo filterItem : filterItems) { + switch (filterItem.getPropName()){ + case KEY_FILTER_ORG: + orgId=(filterItem.getValue()==null) ? null: (Long) ((DynamicObject)filterItem.getValue()).getPkValue(); + break; + case KEY_FILTER_DATE: + accrualDate=(filterItem.getDate()==null) ? null:new SimpleDateFormat("yyyy-MM-dd").format(filterItem.getDate()); + selectFields.append("'").append(accrualDate).append("'").append(FIELDS[10]); + break; + default: + break; + } } - } - StringBuilder selectFields = new StringBuilder(); - selectFields.append(DEPOSIT[0]).append(".name").append(" as ").append(FIELDS[0]).append(",") - .append(DEPOSIT[1]).append(" as ").append(FIELDS[1]).append(",") - .append(DEPOSIT[2]).append(" as ").append(FIELDS[2]).append(",") - .append(DEPOSIT[3]).append(" as ").append(FIELDS[3]).append(",") - .append(DEPOSIT[4]).append(" as ").append(FIELDS[4]).append(",") - .append(DEPOSIT[5]).append(" as ").append(FIELDS[5]).append(",") - .append(DEPOSIT[6]).append(" as ").append(FIELDS[6]).append(",") - .append(DEPOSIT[7]).append(" as ").append(FIELDS[7]).append(",") - .append(DEPOSIT[8]).append(" as ").append(FIELDS[8]).append(",") - .append(DEPOSIT[9]).append(" as ").append(FIELDS[9]).append(",") - .append("'").append(accrualDate).append("'").append(FIELDS[10]); - // 逻辑字段 - - - List qFilters=new ArrayList<>(); - if (orgId!=null){ - qFilters.add(new QFilter("org", QCP.equals,orgId)); - - } - DataSet dataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "cim_deposit", selectFields.toString(), qFilters.toArray(new QFilter[]{}), null); - - - //分组小计 - DataSet groupDataSet = dataSet.groupBy(new String[]{FIELDS[0]}).sum(FIELDS[9]).finish(); - // 由于分组计算之后,Dataset的字段少了一个,需要通过addField加回来,为之后union做准备 - groupDataSet = groupDataSet - .addField("0L", FIELDS[1])//银行名称-id - .addField("'-'",FIELDS[2])//银行账户 - .addField("0L",FIELDS[3])//币种 - .addField("NULL",FIELDS[4])//起款日期 - .addField("NULL",FIELDS[5])//存款止期 - .addField("'-'",FIELDS[6])//存期 - .addField("0",FIELDS[7])//利率 - .addField("0L",FIELDS[8])//频率 - .addField("NULL",FIELDS[10]);//计提日期 - - - StringBuilder selectExpression = new StringBuilder(); - selectExpression.append(FIELDS[0]); - - // 添加其他字段(直接使用原字段名) - for (int i = 1; i < FIELDS.length; i++) { - if (i==11){ - break; + if (orgId!=null){ + qFilters.add(new QFilter("org", QCP.equals,orgId)); } - selectExpression.append(", ").append(FIELDS[i]); + DataSet dataSet = QueryServiceHelper.queryDataSet(this.getClass().getName(), "cim_deposit", selectFields.toString(), qFilters.toArray(new QFilter[]{}), null); + //分组小计 + DataSet groupDataSet = dataSet.groupBy(new String[]{FIELDS[0]}).sum(FIELDS[9]).finish(); + // 由于分组计算之后,Dataset的字段少了一个,需要通过addField加回来,为之后union做准备 + groupDataSet = groupDataSet + .addField("0L", FIELDS[1])//银行名称-id + .addField("'-'",FIELDS[2])//银行账户 + .addField("0L",FIELDS[3])//币种 + .addField("NULL",FIELDS[4])//起款日期 + .addField("NULL",FIELDS[5])//存款止期 + .addField("'-'",FIELDS[6])//存期 + .addField("0",FIELDS[7])//利率 + .addField("0L",FIELDS[8])//频率 + .addField("NULL",FIELDS[10]);//计提日期 + + + StringBuilder selectExpression = new StringBuilder(); + selectExpression.append(FIELDS[0]); + + // 添加其他字段(直接使用原字段名) + for (int i = 1; i < FIELDS.length; i++) { + if (i==11){ + break; + } + selectExpression.append(", ").append(FIELDS[i]); + } + + // 应用SELECT转换 + groupDataSet = groupDataSet.select("concat(shjh_orgname+'-小计') as "+ selectExpression); + // union前,需要保证两个dataSet的字段序列一致,因此这里对sumDataSet对象重新排列字段序列 + groupDataSet = groupDataSet.select(String.valueOf(selectExpression)); + // union,此时groupDataSet会续在dataSet的底部 + unionDataSet = dataSet.union(groupDataSet); + } catch (Exception e) { + logger.error(e.getMessage()); } - - // 应用SELECT转换 - groupDataSet = groupDataSet.select("concat(shjh_orgname+'-小计') as "+ selectExpression); - - // union前,需要保证两个dataSet的字段序列一致,因此这里对sumDataSet对象重新排列字段序列 - groupDataSet = groupDataSet.select(String.valueOf(selectExpression)); - // union,此时groupDataSet会续在dataSet的底部 - DataSet unionDataSet = dataSet.union(groupDataSet); // 按组织名称排序,这样,底部的合计数据,就会与上面的组织名称排在一起 - DataSet orderByDataSet = unionDataSet.orderBy(new String[]{FIELDS[0]}); - - return orderByDataSet; + return unionDataSet.orderBy(new String[]{FIELDS[0]}); } - + /** + * 组装SQL + * @param selectFields + */ + private void assembleSQL(StringBuilder selectFields){ + for (int i = 1; i < RegularListReport.DEPOSIT.length; i++) { + selectFields.append(RegularListReport.DEPOSIT[i]).append(" as ").append(RegularListReport.FIELDS[i]).append(","); + } + } } \ No newline at end of file