定期利息计提报表小计、合计行
This commit is contained in:
parent
2e77b543c4
commit
007cac798e
|
|
@ -9,9 +9,7 @@ import kd.sdk.plugin.Plugin;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
import java.util.Calendar;
|
import java.util.*;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -137,6 +135,83 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
|
||||||
e.printStackTrace();
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,10 +1,7 @@
|
||||||
package shjh.jhzj7.fi.fi.plugin.report;
|
package shjh.jhzj7.fi.fi.plugin.report;
|
||||||
|
|
||||||
import kd.bos.algo.DataSet;
|
import kd.bos.algo.DataSet;
|
||||||
import kd.bos.algo.DataType;
|
|
||||||
import kd.bos.dataentity.entity.DynamicObject;
|
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.AbstractReportListDataPlugin;
|
||||||
import kd.bos.entity.report.FilterItemInfo;
|
import kd.bos.entity.report.FilterItemInfo;
|
||||||
import kd.bos.entity.report.ReportQueryParam;
|
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.orm.query.QFilter;
|
||||||
import kd.bos.servicehelper.QueryServiceHelper;
|
import kd.bos.servicehelper.QueryServiceHelper;
|
||||||
import kd.sdk.plugin.Plugin;
|
import kd.sdk.plugin.Plugin;
|
||||||
import shjh.jhzj7.fi.fi.plugin.operate.LoanPushSapOperation;
|
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
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 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",
|
private static final String[] DEPOSIT={"org","finorginfo","finaccount","currency","intdate","expiredate","term","interestrate","revenueproject","amount"};
|
||||||
"intdate","expiredate","term","interestrate","revenueproject","amount"};
|
|
||||||
|
|
||||||
//定期利息计提报表字段
|
//定期利息计提报表字段
|
||||||
private static final String[] FIELDS={"shjh_orgname","shjh_bankname","shjh_bankaccount","shjh_currency",
|
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"};
|
||||||
"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
|
@Override
|
||||||
public DataSet query(ReportQueryParam param, Object obj) throws Throwable {
|
public DataSet query(ReportQueryParam param, Object obj) throws Throwable {
|
||||||
List<FilterItemInfo> filterItems = param.getFilter().getFilterItems();
|
DataSet unionDataSet = null;
|
||||||
Long orgId=null;
|
try {
|
||||||
String accrualDate=null;
|
StringBuilder selectFields = new StringBuilder();
|
||||||
for (FilterItemInfo filterItem : filterItems) {
|
selectFields.append(DEPOSIT[0]).append(".name").append(" as ").append(FIELDS[0]).append(",");
|
||||||
switch (filterItem.getPropName()){
|
assembleSQL(selectFields);
|
||||||
case "shjh_filterorgname":
|
List<FilterItemInfo> filterItems = param.getFilter().getFilterItems();
|
||||||
orgId=(filterItem.getValue()==null) ? null: (Long) ((DynamicObject)filterItem.getValue()).getPkValue();
|
Long orgId=null;
|
||||||
break;
|
String accrualDate=null;
|
||||||
case "shjh_filterdate":
|
List<QFilter> qFilters=new ArrayList<>();
|
||||||
accrualDate=(filterItem.getDate()==null) ? null:new SimpleDateFormat("yyyy-MM-dd").format(filterItem.getDate());
|
for (FilterItemInfo filterItem : filterItems) {
|
||||||
break;
|
switch (filterItem.getPropName()){
|
||||||
default:
|
case KEY_FILTER_ORG:
|
||||||
break;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
if (orgId!=null){
|
||||||
StringBuilder selectFields = new StringBuilder();
|
qFilters.add(new QFilter("org", QCP.equals,orgId));
|
||||||
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做准备
|
|
||||||
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]);
|
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 unionDataSet.orderBy(new String[]{FIELDS[0]});
|
||||||
|
|
||||||
return orderByDataSet;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 组装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(",");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue