理财收益计提报表-合计小计优化

This commit is contained in:
李贵强 2025-04-11 15:06:03 +08:00
parent 986d9ac682
commit c1ebd242c6
4 changed files with 134 additions and 13 deletions

View File

@ -153,9 +153,7 @@ public class RecBillChangeListExtendPlugin extends AbstractListPlugin implements
// 是否存在付款申请
QFilter[] filters = new QFilter[]{
new QFilter("org.number", QCP.equals, companyCode),
new QFilter("shjh_vouchernum", QCP.equals, voucherNum),
new QFilter("shjh_sapfiscalyear", QCP.equals, sapFiscalYear),
new QFilter("shjh_sapline", QCP.equals, sapLineNumber)
new QFilter("shjh_vouchernum", QCP.equals, voucherNum)
};
DynamicObject payApply = BusinessDataServiceHelper.loadSingle("ap_payapply", filters);
if (payApply != null) {

View File

@ -2,7 +2,6 @@ package shjh.jhzj7.fi.fi.plugin.report;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.entity.report.FilterItemInfo;
import kd.bos.entity.report.ReportColumn;
import kd.bos.entity.report.ReportQueryParam;
import kd.bos.logging.Log;
@ -14,10 +13,7 @@ import shjh.jhzj7.fi.fi.plugin.report.util.ReportUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.*;
/**
* 报表界面插件
@ -64,12 +60,14 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
// 遍历每一行数据
Iterator<DynamicObject> iterator = rowData.iterator();
//小计行合计项
BigDecimal sumProjectedEarnings =BigDecimal.ZERO;//预计收益汇总
BigDecimal sumProvisionEarnings =BigDecimal.ZERO;//收益计提汇总
BigDecimal sumMonthEarnings =BigDecimal.ZERO;//本月收益汇总
BigDecimal sumYearEarnings =BigDecimal.ZERO;//本年收益汇总
while (iterator.hasNext()) {
DynamicObject row = iterator.next();
//跳过小计行
if (row.getString(REPORT_FIELDS[0]).contains("-小计")){
continue;
}
// 基础字段获取添加null检查
BigDecimal amount = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[4]); // 原始金额
row.set(REPORT_FIELDS[4],amount.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP));
@ -90,16 +88,50 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
String day = countProductTerm(buyDate, expireDate, accrualDate, row);
// 4. 预计收益 = 产品期限 * 金额(千元) * 预计业绩比较基准 / 365
BigDecimal proRevenue = countProRevenue(expectedRate, day, amount, row);
sumProjectedEarnings=sumProjectedEarnings.add(proRevenue);
// 5. 收益计提 = 持有份额 * (月末单位净值 - 购买时单位净值) / 1000
BigDecimal revenueAmt = countRevenueAmt(buyCopies, monthNetWorth, netWorth, row);
sumProvisionEarnings=sumProvisionEarnings.add(revenueAmt);
// 6. 本月收益计算严格按生效期间计算
BigDecimal monthRevenue = countMonthRevenue(monthNetWorth, netWorth, buyCopies, valueDate, accrualDate, expireDate, row);
sumMonthEarnings=sumMonthEarnings.add(monthRevenue);
// 7. 当月收益率 = 本月收益 / 金额(千元) * 100 * 12
countMonthRate(amount,monthRevenue,row);
// 8. 本年累计收益 = 当年各月收益之和按实际持有天数比例计算
BigDecimal yearRevenue = countYearRevenue(monthNetWorth, netWorth, buyCopies, valueDate, accrualDate, expireDate, row);
sumYearEarnings=sumYearEarnings.add(yearRevenue);
//小计行合计
if (row.getString(REPORT_FIELDS[0]).contains("-小计")){
row.set(DYNAMICS_FIELDS[0],sumProjectedEarnings);
row.set(DYNAMICS_FIELDS[3],sumProvisionEarnings);
row.set(DYNAMICS_FIELDS[4],sumMonthEarnings);
row.set(DYNAMICS_FIELDS[6],sumYearEarnings);
//赋值后归0重新参与合计
sumProjectedEarnings=BigDecimal.ZERO;
sumProvisionEarnings=BigDecimal.ZERO;
sumMonthEarnings=BigDecimal.ZERO;
sumYearEarnings=BigDecimal.ZERO;
}
}
//小计行处理
ReportUtils.changeRowData(rowData,REPORT_FIELDS[0]);
//添加合计
// 需要配置求和的字段映射目标字段来源字段
List<String[]> sumConfig = new ArrayList<>();
// 处理REPORT_FIELDS中的金额字段
sumConfig.add(new String[]{REPORT_FIELDS[4], REPORT_FIELDS[4]}); // shjh_amount
// 处理DYNAMICS_FIELDS中的收益字段
sumConfig.add(new String[]{DYNAMICS_FIELDS[0], DYNAMICS_FIELDS[0]}); // shjh_projectrevenueamt
sumConfig.add(new String[]{DYNAMICS_FIELDS[3], DYNAMICS_FIELDS[3]}); // shjh_revenueamt
sumConfig.add(new String[]{DYNAMICS_FIELDS[4], DYNAMICS_FIELDS[4]}); // shjh_monthrevenueamt
sumConfig.add(new String[]{DYNAMICS_FIELDS[6], DYNAMICS_FIELDS[6]}); // shjh_yearrevenueamt
ReportUtils.addTotalRowData(rowData,REPORT_FIELDS[0],"小计","合计",sumConfig);
}
/**

View File

@ -172,7 +172,7 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
rowData.removeAll(rowsToRemove);
}
// 如果只有一类公司移除所有小计行根据你的TODO注释
// 如果只有一类公司移除所有小计行
if (currentCompanyName != null && rowData.stream()
.filter(r -> !r.getString(FIELDS[0]).contains("小计"))
.map(r -> r.getString(FIELDS[0]))

View File

@ -1,13 +1,16 @@
package shjh.jhzj7.fi.fi.plugin.report.util;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.entity.LocaleString;
import kd.bos.entity.report.ReportColumn;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class ReportUtils {
@ -31,6 +34,94 @@ public class ReportUtils {
return reportColumn;
}
/**
* 添加合计行通用工具方法
* @param rowData 数据集合
* @param summaryField 用于识别小计行的字段名"projectName"
* @param summaryKeyword 小计行标识关键字"小计"-跳过该行数据
* @param totalRowLabel 合计行显示文本"合计"
* @param sumFields 需要求和的字段配置二维数组格式[目标字段, 来源字段]
*/
public static void addTotalRowData(DynamicObjectCollection rowData,
String summaryField,
String summaryKeyword,
String totalRowLabel,
List<String[]> sumFields) {
// 初始化合计值容器
BigDecimal[] totals = new BigDecimal[sumFields.size()];
for(int i=0; i<totals.length; i++){
totals[i] = BigDecimal.ZERO;
}
// 遍历数据行
for (DynamicObject row : rowData) {
if (!row.getString(summaryField).contains(summaryKeyword)) {
// 累加所有需要合计的字段
for(int i=0; i<sumFields.size(); i++){
String sourceField = sumFields.get(i)[1];
BigDecimal value = row.getBigDecimal(sourceField);
if(value != null){
totals[i] = totals[i].add(value);
}
}
}
}
// 创建合计行
DynamicObject totalRow = new DynamicObject(rowData.getDynamicObjectType());
totalRow.set(summaryField, totalRowLabel);
// 设置合计值
for(int i=0; i<sumFields.size(); i++){
String targetField = sumFields.get(i)[0];
totalRow.set(targetField, totals[i]);
}
rowData.add(totalRow);
}
/**
* 对小计行处理
* @param rowData 数据集合
* @param keyWord 需要处理的单元格标识
*/
public static void changeRowData(DynamicObjectCollection rowData,String keyWord) {
// 用于记录当前处理的"公司名称-小计"
String currentName = null;
List<DynamicObject> rowsToRemove = new ArrayList<>();
for (DynamicObject row : rowData) {
String name = row.getString(keyWord);
// 如果是"公司名称-小计"格式的行
if (name != null && name.contains("-小计")) {
// 如果是第一次遇到该公司的小计行
if (currentName == null || !name.startsWith(currentName)) {
currentName = name.substring(0, name.indexOf("-小计"));
// 修改为公司名称简化为"小计"
row.set(keyWord, "小计");
} else {
// 如果是同一公司的重复小计行标记为需要移除
rowsToRemove.add(row);
}
}
}
// 移除重复的小计行
if (!rowsToRemove.isEmpty()) {
rowData.removeAll(rowsToRemove);
}
// 如果只有一类公司移除所有小计行
if (currentName != null && rowData.stream()
.filter(r -> !r.getString(keyWord).contains("小计"))
.map(r -> r.getString(keyWord))
.distinct()
.count() == 1) {
rowData.removeIf(r -> r.getString(keyWord).contains("小计"));
}
}
// 辅助方法获取某个月的第一天
public static Date getFirstDayOfMonth(Date date) {
Calendar cal = Calendar.getInstance();