计提报表本年本月收益优化

This commit is contained in:
李贵强 2025-05-23 10:42:12 +08:00
parent 68dd80d891
commit a4ab06b57d
1 changed files with 123 additions and 71 deletions

View File

@ -22,6 +22,7 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
"shjh_depositstartdate", "shjh_depositstopdate", "shjh_term", "shjh_interestrate",
"shjh_frequency", "shjh_amount", "shjh_accrualdate", "shjh_accrualdays",
"shjh_accrualinterest", "shjh_monthearnings", "shjh_yearearnings", "shjh_depositmodel", "shjh_basis"};
@Override
public void processRowData(String gridPK, DynamicObjectCollection rowData, ReportQueryParam queryParam) {
super.processRowData(gridPK, rowData, queryParam);
@ -73,10 +74,10 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
// 检查计提日期是否在有效区间(存款起期 <= 计提日期 <= 存款止期)
boolean isValidPeriod = !filterDate.before(depositStartDate) &&
!filterDate.after(depositEndDate);
if (isValidPeriod) {
//计提天数
dayDiff = this.calculationDays(row, filterDate, depositStartDate);
/* 计提利息 = (金额 × 天利率 × 计提天数) */
accruedInterest = amount.multiply(rate)
.multiply(new BigDecimal(dayDiff))
@ -84,29 +85,10 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
.setScale(2, RoundingMode.HALF_UP);
/* 计算本月收益 = 金额 × 天利率 × 当月有效天数 */
Calendar cal = Calendar.getInstance();
cal.setTime(filterDate);
// 当月第一天
cal.set(Calendar.DAY_OF_MONTH, 1);
Date monthStart = cal.getTime();
// 当月有效天数存款起期与当月首日的较晚者
Date validMonthStart = depositStartDate.after(monthStart) ?
depositStartDate : monthStart;
long monthDays = TimeUnit.DAYS.convert(
filterDate.getTime() - validMonthStart.getTime(),
TimeUnit.MILLISECONDS);
monthlyIncome = amount.multiply(rate)
.multiply(new BigDecimal(monthDays))
.divide(basisDay,10, RoundingMode.HALF_UP)
.setScale(2, RoundingMode.HALF_UP);
monthlyIncome = this.calculationMonthAmount(filterDate, depositStartDate, amount, rate, basisDay);
}
/* 计算本年累计收益 = 金额 × 利率 × 当年有效天数 */
//Date currentDate = new Date(); // 当前日期
Date validYearEnd = null; // 有效结束日期
if (filterDate.before(depositStartDate)) {
@ -115,11 +97,11 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
} else if (filterDate.after(depositEndDate)) {
// 当日期晚于存款到期日计算到 depositEndDate 的累计收益
validYearEnd = depositEndDate;
yearlyIncome = this.calculationYearAmount(validYearEnd, depositStartDate, amount, rate, basisDay);
yearlyIncome = this.calculationYearAmount(filterDate,validYearEnd, depositStartDate, amount, rate, basisDay);
} else {
// 当前日期在有效期内计算到当前日期的累计收益
validYearEnd = filterDate;
yearlyIncome = this.calculationYearAmount(validYearEnd, depositStartDate, amount, rate, basisDay);
yearlyIncome = this.calculationYearAmount(filterDate,validYearEnd, depositStartDate, amount, rate, basisDay);
}
}
@ -155,6 +137,7 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
/**
* 对小计行处理
*
* @param rowData
*/
private void changeRowData(DynamicObjectCollection rowData) {
@ -204,6 +187,7 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
/**
* 尾行固定添加合计行
*
* @param rowData
*/
private void addTotalRowData(DynamicObjectCollection rowData) {
@ -236,6 +220,7 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
/**
* 计算计提天数
*
* @param row
* @param filterDate 计提日期
* @param depositStartDate 启始日期
@ -271,7 +256,61 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
return dayDiff;
}
private BigDecimal calculationYearAmount(Date validYearEnd,Date depositStartDate, BigDecimal amount,BigDecimal rate,BigDecimal basisDay){
/**
* 计算本月累计收益
* @param filterDate 计提日期
* @param depositStartDate 起始日期
* @param amount 金额
* @param rate 利率
* @param basisDay 计息基准
* @return 本年累计收益
*/
private BigDecimal calculationMonthAmount(Date filterDate, Date depositStartDate, BigDecimal amount, BigDecimal rate, BigDecimal basisDay) {
Calendar cal = Calendar.getInstance();
cal.setTime(filterDate);
// 当月第一天
cal.set(Calendar.DAY_OF_MONTH, 1);
Date monthStart = cal.getTime();
// 当月有效天数存款起期与当月首日的较晚者
Date validMonthStart = depositStartDate.after(monthStart) ? depositStartDate : monthStart;
long monthDays = TimeUnit.DAYS.convert(
filterDate.getTime() - validMonthStart.getTime(),
TimeUnit.MILLISECONDS);
// 检查filterDate和depositStartDate是否在同年同月
Calendar filterCal = Calendar.getInstance();
filterCal.setTime(filterDate);
Calendar depositCal = Calendar.getInstance();
depositCal.setTime(depositStartDate);
boolean sameYearMonth = filterCal.get(Calendar.YEAR) == depositCal.get(Calendar.YEAR)
&& filterCal.get(Calendar.MONTH) == depositCal.get(Calendar.MONTH);
// 如果是同年同月天数加1
if (sameYearMonth) {
monthDays += 1;
}
return amount.multiply(rate)
.multiply(new BigDecimal(monthDays))
.divide(basisDay, 10, RoundingMode.HALF_UP)
.setScale(2, RoundingMode.HALF_UP);
}
/**
* 计算本年累计收益
* @param filterDate 计提日期
* @param validYearEnd 结束有效日期
* @param depositStartDate 起始日期
* @param amount 金额
* @param rate 利率
* @param basisDay 计息基准
* @return 本年累计收益
*/
private BigDecimal calculationYearAmount(Date filterDate,Date validYearEnd, Date depositStartDate, BigDecimal amount, BigDecimal rate, BigDecimal basisDay) {
// 计算当年第一天1月1日
Calendar cal = Calendar.getInstance();
cal.setTime(validYearEnd);
@ -289,6 +328,19 @@ public class RegularFormReport extends AbstractReportFormPlugin implements Plugi
TimeUnit.MILLISECONDS
);
// 检查filterDate和depositStartDate是否在同年
Calendar filterCal = Calendar.getInstance();
filterCal.setTime(filterDate);
Calendar depositCal = Calendar.getInstance();
depositCal.setTime(depositStartDate);
boolean sameYear = filterCal.get(Calendar.YEAR) == depositCal.get(Calendar.YEAR);
// 如果是同年天数加1
if (sameYear) {
yearDays += 1;
}
return amount.multiply(rate)
.multiply(new BigDecimal(yearDays))
.divide(basisDay, 10, RoundingMode.HALF_UP)