diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularFormReport.java b/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularFormReport.java new file mode 100644 index 0000000..338e59e --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularFormReport.java @@ -0,0 +1,142 @@ +package shjh.jhzj7.fi.fi.plugin.report; + +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.report.ReportQueryParam; +import kd.bos.report.plugin.AbstractReportFormPlugin; +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.concurrent.TimeUnit; + +/** + * 报表界面插件 + * 定期利息计提报表界面插件 + */ +public class RegularFormReport extends AbstractReportFormPlugin implements Plugin { + + 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"}; + @Override + public void processRowData(String gridPK, DynamicObjectCollection rowData, ReportQueryParam queryParam) { + super.processRowData(gridPK, rowData, queryParam); + //小计金额 + BigDecimal subInterestAmt=BigDecimal.ZERO; + BigDecimal subMonthAmt=BigDecimal.ZERO; + BigDecimal subYearAmt=BigDecimal.ZERO; + Iterator iterator = rowData.iterator(); + while (iterator.hasNext()){ + DynamicObject row = iterator.next(); + try { + // 获取公司名称 + String companyName = row.getString(FIELDS[0]); + // 获取日期 + Date filterDate =queryParam.getFilter().getDate("shjh_filterdate"); + Date depositStartDate = row.getDate(FIELDS[4]); + Date depositEndDate = row.getDate(FIELDS[5]); // 存款到期日(保证有值) + + // 初始化计算结果 + BigDecimal accruedInterest = BigDecimal.ZERO; + BigDecimal monthlyIncome = BigDecimal.ZERO; + BigDecimal yearlyIncome = BigDecimal.ZERO; + long dayDiff = 0; + + if (filterDate != null && depositStartDate != null && depositEndDate != null) { + // 检查计提日期是否在有效区间(存款起期 <= 计提日期 <= 存款止期) + boolean isValidPeriod = !filterDate.before(depositStartDate) && + !filterDate.after(depositEndDate); + + // 计算天数差(只在有效区间计算) + if (isValidPeriod) { + dayDiff = TimeUnit.DAYS.convert( + filterDate.getTime() - depositStartDate.getTime(), + TimeUnit.MILLISECONDS); + + // 获取金额和利率(利率需要除以100) + BigDecimal amount = row.getBigDecimal(FIELDS[9]); + BigDecimal rate = new BigDecimal(row.getLong(FIELDS[7])) + .divide(new BigDecimal(100), 10, RoundingMode.HALF_UP); + + if (amount != null && amount.compareTo(BigDecimal.ZERO) != 0 && + rate.compareTo(BigDecimal.ZERO) != 0 && dayDiff > 0) { + + /* 计提利息 = (金额 × 利率 × 计提天数) / 365 */ + accruedInterest = amount.multiply(rate) + .multiply(new BigDecimal(dayDiff)) + .divide(new BigDecimal(365), 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)) + .setScale(2, RoundingMode.HALF_UP); + + /* 计算本年累计收益 = 金额 × 利率 × 当年有效天数 */ + // 当年第一天 + cal.set(Calendar.MONTH, Calendar.JANUARY); + cal.set(Calendar.DAY_OF_MONTH, 1); + Date yearStart = cal.getTime(); + + // 当年有效天数(存款起期与年初的较晚者,到期日与计提日的较早者) + Date validYearStart = depositStartDate.after(yearStart) ? + depositStartDate : yearStart; + Date validYearEnd = filterDate.before(depositEndDate) ? + filterDate : depositEndDate; + + long yearDays = TimeUnit.DAYS.convert( + validYearEnd.getTime() - validYearStart.getTime(), + TimeUnit.MILLISECONDS); + + yearlyIncome = amount.multiply(rate) + .multiply(new BigDecimal(yearDays)) + .setScale(2, RoundingMode.HALF_UP); + } + } + } + if (companyName.contains("小计")){ + row.set(FIELDS[11], ""); // 计提天数 + row.set(FIELDS[12], subInterestAmt); // 计提利息小计 + row.set(FIELDS[13], subMonthAmt); // 本月收益小计 + row.set(FIELDS[14], subYearAmt); // 本年累计收益小计 + //金额清0 + subInterestAmt=BigDecimal.ZERO; + subMonthAmt=BigDecimal.ZERO; + subYearAmt=BigDecimal.ZERO; + }else { + subInterestAmt=subInterestAmt.add(accruedInterest); + subMonthAmt=subMonthAmt.add(monthlyIncome); + subYearAmt=subYearAmt.add(yearlyIncome); + // 设置结果 + row.set(FIELDS[11], String.valueOf(dayDiff)); // 计提天数 + row.set(FIELDS[12], accruedInterest); // 计提利息(按/365计算) + row.set(FIELDS[13], monthlyIncome); // 本月收益(金额×利率×有效天数) + row.set(FIELDS[14], yearlyIncome); // 本年累计收益(金额×利率×有效天数) + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +} \ No newline at end of file diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularListReport.java b/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularListReport.java new file mode 100644 index 0000000..51136fe --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/report/RegularListReport.java @@ -0,0 +1,127 @@ +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; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +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; + +/** + * 报表取数插件 + * 定期利息计提报表取数插件 + */ +public class RegularListReport extends AbstractReportListDataPlugin implements Plugin { + + private final static Log logger = LogFactory.getLog(RegularListReport.class); + + //定期存款处理表字段 + private static 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 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 { + List filterItems = param.getFilter().getFilterItems(); + Long orgId=null; + String accrualDate=null; + for (FilterItemInfo filterItem : filterItems) { + switch (filterItem.getPropName()){ + case "shjh_filterorgname": + orgId=(filterItem.getValue()==null) ? null: (Long) ((DynamicObject)filterItem.getValue()).getPkValue(); + break; + case "shjh_filterdate": + accrualDate=(filterItem.getDate()==null) ? null:new SimpleDateFormat("yyyy-MM-dd").format(filterItem.getDate()); + 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 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]); + } + + // 应用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 orderByDataSet; + } + + +} \ No newline at end of file