定期利息计提报表小计、合计行

This commit is contained in:
李贵强 2025-04-07 15:44:18 +08:00
parent 2e77b543c4
commit 007cac798e
2 changed files with 155 additions and 90 deletions

View File

@ -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<DynamicObject> 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);
}
}

View File

@ -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,61 +24,48 @@ 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 {
DataSet unionDataSet = null;
try {
StringBuilder selectFields = new StringBuilder();
selectFields.append(DEPOSIT[0]).append(".name").append(" as ").append(FIELDS[0]).append(",");
assembleSQL(selectFields);
List<FilterItemInfo> filterItems = param.getFilter().getFilterItems();
Long orgId=null;
String accrualDate=null;
List<QFilter> qFilters=new ArrayList<>();
for (FilterItemInfo filterItem : filterItems) {
switch (filterItem.getPropName()){
case "shjh_filterorgname":
case KEY_FILTER_ORG:
orgId=(filterItem.getValue()==null) ? null: (Long) ((DynamicObject)filterItem.getValue()).getPkValue();
break;
case "shjh_filterdate":
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<QFilter> 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做准备
@ -112,16 +94,24 @@ public class RegularListReport extends AbstractReportListDataPlugin implements P
// 应用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);
unionDataSet = dataSet.union(groupDataSet);
} catch (Exception e) {
logger.error(e.getMessage());
}
// 按组织名称排序这样底部的合计数据就会与上面的组织名称排在一起
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(",");
}
}
}