定期利息计提报表小计、合计行
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.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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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(",");
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue