理财收益计提报表-合计小计优化
This commit is contained in:
parent
986d9ac682
commit
c1ebd242c6
|
|
@ -153,9 +153,7 @@ public class RecBillChangeListExtendPlugin extends AbstractListPlugin implements
|
||||||
// 是否存在付款申请
|
// 是否存在付款申请
|
||||||
QFilter[] filters = new QFilter[]{
|
QFilter[] filters = new QFilter[]{
|
||||||
new QFilter("org.number", QCP.equals, companyCode),
|
new QFilter("org.number", QCP.equals, companyCode),
|
||||||
new QFilter("shjh_vouchernum", QCP.equals, voucherNum),
|
new QFilter("shjh_vouchernum", QCP.equals, voucherNum)
|
||||||
new QFilter("shjh_sapfiscalyear", QCP.equals, sapFiscalYear),
|
|
||||||
new QFilter("shjh_sapline", QCP.equals, sapLineNumber)
|
|
||||||
};
|
};
|
||||||
DynamicObject payApply = BusinessDataServiceHelper.loadSingle("ap_payapply", filters);
|
DynamicObject payApply = BusinessDataServiceHelper.loadSingle("ap_payapply", filters);
|
||||||
if (payApply != null) {
|
if (payApply != null) {
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package shjh.jhzj7.fi.fi.plugin.report;
|
||||||
|
|
||||||
import kd.bos.dataentity.entity.DynamicObject;
|
import kd.bos.dataentity.entity.DynamicObject;
|
||||||
import kd.bos.dataentity.entity.DynamicObjectCollection;
|
import kd.bos.dataentity.entity.DynamicObjectCollection;
|
||||||
import kd.bos.entity.report.FilterItemInfo;
|
|
||||||
import kd.bos.entity.report.ReportColumn;
|
import kd.bos.entity.report.ReportColumn;
|
||||||
import kd.bos.entity.report.ReportQueryParam;
|
import kd.bos.entity.report.ReportQueryParam;
|
||||||
import kd.bos.logging.Log;
|
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.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.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 报表界面插件
|
* 报表界面插件
|
||||||
|
|
@ -64,12 +60,14 @@ public class FinancialFormReport extends AbstractReportFormPlugin implements Plu
|
||||||
|
|
||||||
// 遍历每一行数据
|
// 遍历每一行数据
|
||||||
Iterator<DynamicObject> iterator = rowData.iterator();
|
Iterator<DynamicObject> iterator = rowData.iterator();
|
||||||
|
//小计行合计项
|
||||||
|
BigDecimal sumProjectedEarnings =BigDecimal.ZERO;//预计收益汇总
|
||||||
|
BigDecimal sumProvisionEarnings =BigDecimal.ZERO;//收益计提汇总
|
||||||
|
BigDecimal sumMonthEarnings =BigDecimal.ZERO;//本月收益汇总
|
||||||
|
BigDecimal sumYearEarnings =BigDecimal.ZERO;//本年收益汇总
|
||||||
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
DynamicObject row = iterator.next();
|
DynamicObject row = iterator.next();
|
||||||
//跳过小计行
|
|
||||||
if (row.getString(REPORT_FIELDS[0]).contains("-小计")){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// 基础字段获取(添加null检查)
|
// 基础字段获取(添加null检查)
|
||||||
BigDecimal amount = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[4]); // 原始金额(元)
|
BigDecimal amount = ReportUtils.getBigDecimalValue(row, REPORT_FIELDS[4]); // 原始金额(元)
|
||||||
row.set(REPORT_FIELDS[4],amount.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP));
|
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);
|
String day = countProductTerm(buyDate, expireDate, accrualDate, row);
|
||||||
// 4. 预计收益 = 产品期限 * 金额(千元) * 预计业绩比较基准 / 365
|
// 4. 预计收益 = 产品期限 * 金额(千元) * 预计业绩比较基准 / 365
|
||||||
BigDecimal proRevenue = countProRevenue(expectedRate, day, amount, row);
|
BigDecimal proRevenue = countProRevenue(expectedRate, day, amount, row);
|
||||||
|
sumProjectedEarnings=sumProjectedEarnings.add(proRevenue);
|
||||||
// 5. 收益计提 = 持有份额 * (月末单位净值 - 购买时单位净值) / 1000
|
// 5. 收益计提 = 持有份额 * (月末单位净值 - 购买时单位净值) / 1000
|
||||||
BigDecimal revenueAmt = countRevenueAmt(buyCopies, monthNetWorth, netWorth, row);
|
BigDecimal revenueAmt = countRevenueAmt(buyCopies, monthNetWorth, netWorth, row);
|
||||||
|
sumProvisionEarnings=sumProvisionEarnings.add(revenueAmt);
|
||||||
// 6. 本月收益计算(严格按生效期间计算)
|
// 6. 本月收益计算(严格按生效期间计算)
|
||||||
BigDecimal monthRevenue = countMonthRevenue(monthNetWorth, netWorth, buyCopies, valueDate, accrualDate, expireDate, row);
|
BigDecimal monthRevenue = countMonthRevenue(monthNetWorth, netWorth, buyCopies, valueDate, accrualDate, expireDate, row);
|
||||||
|
sumMonthEarnings=sumMonthEarnings.add(monthRevenue);
|
||||||
// 7. 当月收益率 = 本月收益 / 金额(千元) * 100 * 12
|
// 7. 当月收益率 = 本月收益 / 金额(千元) * 100 * 12
|
||||||
countMonthRate(amount,monthRevenue,row);
|
countMonthRate(amount,monthRevenue,row);
|
||||||
// 8. 本年累计收益 = 当年各月收益之和(按实际持有天数比例计算)
|
// 8. 本年累计收益 = 当年各月收益之和(按实际持有天数比例计算)
|
||||||
BigDecimal yearRevenue = countYearRevenue(monthNetWorth, netWorth, buyCopies, valueDate, accrualDate, expireDate, row);
|
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);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -172,7 +172,7 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
|
||||||
rowData.removeAll(rowsToRemove);
|
rowData.removeAll(rowsToRemove);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果只有一类公司,移除所有小计行(根据你的TODO注释)
|
// 如果只有一类公司,移除所有小计行
|
||||||
if (currentCompanyName != null && rowData.stream()
|
if (currentCompanyName != null && rowData.stream()
|
||||||
.filter(r -> !r.getString(FIELDS[0]).contains("小计"))
|
.filter(r -> !r.getString(FIELDS[0]).contains("小计"))
|
||||||
.map(r -> r.getString(FIELDS[0]))
|
.map(r -> r.getString(FIELDS[0]))
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,16 @@
|
||||||
package shjh.jhzj7.fi.fi.plugin.report.util;
|
package shjh.jhzj7.fi.fi.plugin.report.util;
|
||||||
|
|
||||||
import kd.bos.dataentity.entity.DynamicObject;
|
import kd.bos.dataentity.entity.DynamicObject;
|
||||||
|
import kd.bos.dataentity.entity.DynamicObjectCollection;
|
||||||
import kd.bos.dataentity.entity.LocaleString;
|
import kd.bos.dataentity.entity.LocaleString;
|
||||||
import kd.bos.entity.report.ReportColumn;
|
import kd.bos.entity.report.ReportColumn;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class ReportUtils {
|
public class ReportUtils {
|
||||||
|
|
||||||
|
|
@ -31,6 +34,94 @@ public class ReportUtils {
|
||||||
return reportColumn;
|
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) {
|
public static Date getFirstDayOfMonth(Date date) {
|
||||||
Calendar cal = Calendar.getInstance();
|
Calendar cal = Calendar.getInstance();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue