提交人:刘森澳、陈绍鑫

日期:2025/4/24 13:33
内容:1、债券发行计划添加债券发行分录,银行借款        合同;
     2、融合动态查询明细表添加合同份额金额、剩余提款金额、本年提款金额、本年还款金额 字段
This commit is contained in:
16358 2025-04-24 13:35:53 +08:00
parent 85bf4b8545
commit bcfab6f1d5
2 changed files with 747 additions and 1 deletions

View File

@ -0,0 +1,708 @@
package shkd.sys.sys.plugin.report;
import kd.bos.algo.*;
import kd.bos.algo.input.CollectionInput;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.dataentity.resource.ResManager;
import kd.bos.db.DB;
import kd.bos.db.DBRoute;
import kd.bos.entity.MainEntityType;
import kd.bos.entity.report.ReportQueryParam;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.orm.ORM;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.MetadataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.tmc.cfm.common.enums.LoanTypeEnum;
import kd.tmc.cfm.common.helper.InterestCalcHelper;
import kd.tmc.cfm.report.data.TradeFinanceDataListPlugin;
import kd.tmc.cfm.report.helper.ReportCommonHelper;
import kd.tmc.cfm.report.helper.ReportFilterParamHelper;
import kd.tmc.cfm.report.helper.TradeFinanceFilterHelper;
import kd.tmc.cfm.report.helper.TradeFinanceRptHelper;
import kd.tmc.fbp.common.enums.BasisEnum;
import kd.tmc.fbp.common.enums.BillStatusEnum;
import kd.tmc.fbp.common.enums.FeeSourceEnum;
import kd.tmc.fbp.common.enums.RepaymentWayEnum;
import kd.tmc.fbp.common.exception.TmcBizException;
import kd.tmc.fbp.common.helper.TermHelper;
import kd.tmc.fbp.common.model.interest.IntBillExtInfo;
import kd.tmc.fbp.common.util.DateUtils;
import kd.tmc.fbp.common.util.EmptyUtil;
import kd.tmc.fbp.common.util.ListUtils;
import kd.tmc.fbp.report.data.AbstractTmcTreeReportDataPlugin;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 融资动态查询明细表添加 合同份额金额剩余提款金额本年提款金额本年还款金额 字段
*
*/
public class TradefinanceSelectPlugin extends AbstractTmcTreeReportDataPlugin {
protected static final String LOANBILL_FORM_PROPS = "id, id as loanbillid, '' as summarycol, 0 as findebtslevel,org.id as orgid, org.name as fincompanyname,startintdate as drawdate, case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno, finproduct.name as finproductname, textcreditor as fincreditorname,creditortype as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,creditortype,creditor as creditorid, currency as loancurrency, currency.name as loancurrencyname, drawamount, drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt,interesttype,loancontractbill.number as contractbillno,loancontractbill.contractno as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt, settleintmode, repaymentway,term,basis,cleardate";
protected static final String BOND_FORM_PROPS = "investor_entry.id as id, id as loanbillid, '' as summarycol, 0 as findebtslevel, org.id as orgid, org.name as fincompanyname, startintdate as drawdate,case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno,finproduct.name as finproductname,investor_entry.e_investorname as fincreditorname, investor_entry.e_investortype as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,'' as creditortype, investor_entry.id as creditorid, currency as loancurrency,currency.name as loancurrencyname,investor_entry.e_investamount as drawamount,drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt, interesttype, '' as contractbillno, '' as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt,settleintmode, repaymentway,term,basis,cleardate";
protected static final String BANK_TEAM_PROPS = "banksyndicate_entry.id as id, id as loanbillid, '' as summarycol, 0 as findebtslevel,org.id as orgid, org.name as fincompanyname,startintdate as drawdate,case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno, finproduct.name as finproductname,banksyndicate_entry.e_bank.name as fincreditorname,'bank' as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,banksyndicate_entry.e_bank.finorgtype.type as creditortype,banksyndicate_entry.e_bank.id as creditorid, currency as loancurrency, currency.name as loancurrencyname, banksyndicate_entry.e_shareamount as drawamount, drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt,interesttype, loancontractbill.number as contractbillno,loancontractbill.contractno as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt, settleintmode, repaymentway,term,basis,cleardate";
protected static final String[] COMMON_GROUP_PROPS = new String[]{"loanbillid", "summarycol", "orgid", "fincompanyname", "drawdate", "expiredate", "loanbillno", "finproductname", "loantype", "amount", "estinterestamt", "creditortype", "loancurrency", "loancurrencyname", "drawamount1", "interesttype", "contractbillno", "contractno", "concurrency", "guaranteeway", "contractamt", "settleintmode", "repaymentway", "term", "basis", "cleardate"};
private static final String FILEDS = "id loanbillid,'' as summarycol,org.id as orgid,org.name as fincompanyname,'' as fincreditortype,startintdate as drawdate, case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate,billno as loanbillno,finproduct.name as finproductname,loantype,amount,payinterestamount+calculaterateamount estinterestamt,'' as creditortype,currency as loancurrency,currency.name as loancurrencyname,drawamount as drawamount1,interesttype, '' as contractbillno, '' as contractno,loancontractbill.currency as concurrency,loancontractbill.guarantee as guaranteeway,drawamount as contractamt,settleintmode,repaymentway,0 as drawamount,term,basis,cleardate";
protected static final String[] AMOUNT_SUM_FIELDS = new String[]{"drawamount_statccy", "unpaidamt_statccy", "unpaidintamt_statccy", "paidamt_statccy", "estinterestamt_statccy", "paidintamt_statccy", "feeamt_statccy", "compamt_statccy"};
private static final String CUST_FIELD_SUFFIX = "_ek";
protected Date cutoffdate;
protected List<String> groupFields = new ArrayList(10);
private static final Log logger = LogFactory.getLog(TradeFinanceDataListPlugin.class);
public TradefinanceSelectPlugin() {
}
public DataSet queryDataSet(ReportQueryParam queryParam) {
Map<String, Object> paramMap = ReportCommonHelper.transQueryParam(queryParam);
this.initParams(paramMap);
DataSet loanBillDS = this.queryLoanBillDS(queryParam, paramMap);
DataSet rows = addNewAmountColmn(loanBillDS);
if (rows == null) {
return TradeFinanceRptHelper.createEmptyDS();
} else {
if (TradeFinanceRptHelper.isAddOther(paramMap)) {
DataSet extraLoanBillDs = this.addExtraLoanBillDs(rows.copy().filter("loantype='bond'"), queryParam, paramMap);
if (TradeFinanceRptHelper.isOnlyOther(paramMap.get("filter_creditorid"))) {
rows = extraLoanBillDs;
} else {
rows = rows.union(extraLoanBillDs);
}
}
if (rows.isEmpty()) {
return TradeFinanceRptHelper.createEmptyDS();
} else {
if (TradeFinanceRptHelper.isOther(paramMap.get("filter_creditorid"))) {
rows = rows.filter("fincreditortype='other'");
}
List<Long> loanBillIds = TradeFinanceFilterHelper.getloanBillIds(rows, "loanbillid");
Class clazz = this.getClass();
DataSet repaymentDS = TradeFinanceFilterHelper.repaymentDs(rows, this.cutoffdate);
rows = this.getLoanAndRepaymentDs(rows, repaymentDS);
DataSet interestDS = TradeFinanceFilterHelper.interestDS(loanBillIds, this.cutoffdate, clazz);
rows = this.getLoanAndInterestDs(rows, interestDS);
rows = rows.updateField("estinterestamt", "case when estinterestamt is null then 0 else estinterestamt end").updateField("estinterestamt", "case when loantype in ('sl', 'bond') then estinterestamt*(drawamount/drawamount1) else estinterestamt end");
rows = rows.addField("estinterestamt-paidintamt", "unpaidintamt").updateField("unpaidintamt", "case when unpaidintamt>=0 then unpaidintamt else 0 end");
DataSet interestRateDS = TradeFinanceFilterHelper.interestRateDS(loanBillIds, this.cutoffdate, clazz);
rows = rows.leftJoin(interestRateDS).on("loanbillid", "loanbillid").select(rows.getRowMeta().getFieldNames(), new String[]{"intrate"}).finish();
rows = this.addFeeAmtDs(rows, loanBillIds);
rows = this.addCalIntAmtDs(rows, loanBillIds);
// DynamicObjectCollection rowData = ORM.create().toPlainDynamicObjectCollection(rows);
return rows;
}
}
}
protected void initParams(Map<String, Object> paramMap) {
this.cutoffdate = ReportCommonHelper.getCutOffDate(paramMap);
String statDim = (String)paramMap.get("filter_statdim");
this.groupFields = this.getGroupFieldByDim(statDim);
}
protected String getCurrencyField() {
return "loancurrency";
}
protected Date getExChangeEffectdate() {
return DateUtils.truncateDate(this.cutoffdate == null ? DateUtils.getCurrentDate() : this.cutoffdate);
}
public List<String> orderByFields() {
List<String> orderByField = super.orderByFields();
orderByField.add("findebtslevel");
orderByField.add("drawdate");
return orderByField;
}
public String subNameField() {
return "term";
}
public String sumNameField() {
return "term";
}
public List<String> groupFields() {
return new ArrayList(this.groupFields);
}
public List<String> sumAmountFields() {
return Arrays.asList(AMOUNT_SUM_FIELDS);
}
protected List<String> orinalAmountField() {
return Arrays.asList("contractamt", "drawamount", "unpaidamt", "unpaidintamt", "paidamt", "estinterestamt", "paidintamt", "feeamt", "compamt" );
}
protected String getReportField(String field) {
return field + "_statccy";
}
protected DataSet queryLoanBillDS(ReportQueryParam queryParam, Map<String, Object> paramMap) {
List<String> extendedColumns = this.getExtendedColumnKeys(queryParam);
String extendSelectProps = this.createExtendedColumnSelectStr(extendedColumns);
List<Long> orgIds = this.getQueryOrgIds(queryParam);
QFilter loanBillQFilter = TradeFinanceFilterHelper.loanBillQFilter(paramMap, orgIds);
ReportFilterParamHelper.addExtFilter(paramMap, loanBillQFilter);
loanBillQFilter.and(new QFilter("debtortype", "not in", Arrays.asList("custom", "other")));
QFilter slQFilter = loanBillQFilter.copy();
QFilter bondQFilter = loanBillQFilter.copy();
QFilter flQFilter = loanBillQFilter.copy();
loanBillQFilter.and(TradeFinanceFilterHelper.initCriditorFilter(paramMap));
loanBillQFilter = ReportFilterParamHelper.initLenderNatureFilter(paramMap, loanBillQFilter);
QFilter loanQFilter = loanBillQFilter.copy();
String selectProps = "";
List<DataSet> dataDS = new ArrayList();
String dataSource = paramMap.get("filter_datasource").toString();
QFilter slCredFilter;
if (dataSource.contains(LoanTypeEnum.BOND.getValue())) {
String lenderNature = (String)paramMap.get("filter_lendernature");
if (lenderNature.contains("outgroup")) {
slCredFilter = TradeFinanceRptHelper.getLoanTypeFilter(LoanTypeEnum.BOND.getValue());
bondQFilter.and(slCredFilter);
QFilter bondCredFilter = TradeFinanceRptHelper.getBondCreditorFilter(paramMap);
bondQFilter.and(bondCredFilter);
selectProps = EmptyUtil.isEmpty(extendSelectProps) ? "investor_entry.id as id, id as loanbillid, '' as summarycol, 0 as findebtslevel, org.id as orgid, org.name as fincompanyname, startintdate as drawdate,case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno,finproduct.name as finproductname,investor_entry.e_investorname as fincreditorname, investor_entry.e_investortype as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,'' as creditortype, investor_entry.id as creditorid, currency as loancurrency,currency.name as loancurrencyname,investor_entry.e_investamount as drawamount,drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt, interesttype, '' as contractbillno, '' as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt,settleintmode, repaymentway,term,basis,cleardate" : "investor_entry.id as id, id as loanbillid, '' as summarycol, 0 as findebtslevel, org.id as orgid, org.name as fincompanyname, startintdate as drawdate,case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno,finproduct.name as finproductname,investor_entry.e_investorname as fincreditorname, investor_entry.e_investortype as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,'' as creditortype, investor_entry.id as creditorid, currency as loancurrency,currency.name as loancurrencyname,investor_entry.e_investamount as drawamount,drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt, interesttype, '' as contractbillno, '' as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt,settleintmode, repaymentway,term,basis,cleardate, " + extendSelectProps;
DataSet bondDS = QueryServiceHelper.queryDataSet(this.getClass().getName(), "cfm_loanbill_bond", selectProps, bondQFilter.toArray(), (String)null);
dataDS.add(bondDS);
}
}
DataSet loanBillDS;
if (dataSource.contains("fl")) {
flQFilter.and(TradeFinanceFilterHelper.initCriditorFilter(paramMap));
flQFilter.and(new QFilter("loantype", "=", LoanTypeEnum.FINLEASE.getValue()));
flQFilter = ReportFilterParamHelper.initLenderNatureFilter(paramMap, flQFilter);
selectProps = EmptyUtil.isEmpty(extendSelectProps) ? "id, id as loanbillid, '' as summarycol, 0 as findebtslevel,org.id as orgid, org.name as fincompanyname,startintdate as drawdate, case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno, finproduct.name as finproductname, textcreditor as fincreditorname,creditortype as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,creditortype,creditor as creditorid, currency as loancurrency, currency.name as loancurrencyname, drawamount, drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt,interesttype,loancontractbill.number as contractbillno,loancontractbill.contractno as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt, settleintmode, repaymentway,term,basis,cleardate" : "id, id as loanbillid, '' as summarycol, 0 as findebtslevel,org.id as orgid, org.name as fincompanyname,startintdate as drawdate, case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno, finproduct.name as finproductname, textcreditor as fincreditorname,creditortype as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,creditortype,creditor as creditorid, currency as loancurrency, currency.name as loancurrencyname, drawamount, drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt,interesttype,loancontractbill.number as contractbillno,loancontractbill.contractno as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt, settleintmode, repaymentway,term,basis,cleardate, " + extendSelectProps;
loanBillDS = QueryServiceHelper.queryDataSet(this.getClass().getName(), "cfm_loanbill", selectProps, flQFilter.toArray(), (String)null);
dataDS.add(loanBillDS);
}
if (dataSource.contains("entrustloan")) {
loanBillQFilter.and(new QFilter("loantype", "in", Arrays.asList("entrust", "ec")));
selectProps = EmptyUtil.isEmpty(extendSelectProps) ? "id, id as loanbillid, '' as summarycol, 0 as findebtslevel,org.id as orgid, org.name as fincompanyname,startintdate as drawdate, case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno, finproduct.name as finproductname, textcreditor as fincreditorname,creditortype as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,creditortype,creditor as creditorid, currency as loancurrency, currency.name as loancurrencyname, drawamount, drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt,interesttype,loancontractbill.number as contractbillno,loancontractbill.contractno as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt, settleintmode, repaymentway,term,basis,cleardate" : "id, id as loanbillid, '' as summarycol, 0 as findebtslevel,org.id as orgid, org.name as fincompanyname,startintdate as drawdate, case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno, finproduct.name as finproductname, textcreditor as fincreditorname,creditortype as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,creditortype,creditor as creditorid, currency as loancurrency, currency.name as loancurrencyname, drawamount, drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt,interesttype,loancontractbill.number as contractbillno,loancontractbill.contractno as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt, settleintmode, repaymentway,term,basis,cleardate, " + extendSelectProps;
loanBillDS = QueryServiceHelper.queryDataSet(this.getClass().getName(), "cfm_loanbill", selectProps, loanBillQFilter.toArray(), (String)null);
dataDS.add(loanBillDS);
}
if (dataSource.contains("bankloan")) {
loanQFilter.and("loantype", "=", LoanTypeEnum.BANKLOAN.getValue());
selectProps = EmptyUtil.isEmpty(extendSelectProps) ? "id, id as loanbillid, '' as summarycol, 0 as findebtslevel,org.id as orgid, org.name as fincompanyname,startintdate as drawdate, case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno, finproduct.name as finproductname, textcreditor as fincreditorname,creditortype as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,creditortype,creditor as creditorid, currency as loancurrency, currency.name as loancurrencyname, drawamount, drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt,interesttype,loancontractbill.number as contractbillno,loancontractbill.contractno as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt, settleintmode, repaymentway,term,basis,cleardate" : "id, id as loanbillid, '' as summarycol, 0 as findebtslevel,org.id as orgid, org.name as fincompanyname,startintdate as drawdate, case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno, finproduct.name as finproductname, textcreditor as fincreditorname,creditortype as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,creditortype,creditor as creditorid, currency as loancurrency, currency.name as loancurrencyname, drawamount, drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt,interesttype,loancontractbill.number as contractbillno,loancontractbill.contractno as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt, settleintmode, repaymentway,term,basis,cleardate, " + extendSelectProps;
loanBillDS = QueryServiceHelper.queryDataSet(this.getClass().getName(), "cfm_loanbill", selectProps, loanQFilter.toArray(), (String)null);
slQFilter.and((new QFilter("loantype", "=", LoanTypeEnum.BANKSLOAN.getValue())).and("banksyndicate_entry.e_shareamount", ">", 0));
slCredFilter = TradeFinanceRptHelper.getSlCreditorFilter(paramMap);
slQFilter.and(slCredFilter);
slQFilter = ReportFilterParamHelper.initLenderNatureFilter(paramMap, slQFilter);
selectProps = EmptyUtil.isEmpty(extendSelectProps) ? "banksyndicate_entry.id as id, id as loanbillid, '' as summarycol, 0 as findebtslevel,org.id as orgid, org.name as fincompanyname,startintdate as drawdate,case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno, finproduct.name as finproductname,banksyndicate_entry.e_bank.name as fincreditorname,'bank' as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,banksyndicate_entry.e_bank.finorgtype.type as creditortype,banksyndicate_entry.e_bank.id as creditorid, currency as loancurrency, currency.name as loancurrencyname, banksyndicate_entry.e_shareamount as drawamount, drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt,interesttype, loancontractbill.number as contractbillno,loancontractbill.contractno as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt, settleintmode, repaymentway,term,basis,cleardate" : "banksyndicate_entry.id as id, id as loanbillid, '' as summarycol, 0 as findebtslevel,org.id as orgid, org.name as fincompanyname,startintdate as drawdate,case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate, billno as loanbillno, finproduct.name as finproductname,banksyndicate_entry.e_bank.name as fincreditorname,'bank' as fincreditortype, loantype,amount,payinterestamount+calculaterateamount estinterestamt,banksyndicate_entry.e_bank.finorgtype.type as creditortype,banksyndicate_entry.e_bank.id as creditorid, currency as loancurrency, currency.name as loancurrencyname, banksyndicate_entry.e_shareamount as drawamount, drawamount as drawamount1,0 repayamt,0 repayamt1,0 notrepayamt,interesttype, loancontractbill.number as contractbillno,loancontractbill.contractno as contractno,loancontractbill.currency as concurrency, loancontractbill.guarantee as guaranteeway, amount as contractamt, settleintmode, repaymentway,term,basis,cleardate, " + extendSelectProps;
DataSet slDS = QueryServiceHelper.queryDataSet(this.getClass().getName(), "cfm_loanbill", selectProps, slQFilter.toArray(), (String)null);
slDS = slDS.updateField("creditortype", "case when creditortype='0' then 'bank' else 'finorg' end").updateField("fincreditortype", "creditortype");
dataDS.add(loanBillDS.union(slDS));
}
return EmptyUtil.isEmpty(dataDS) ? null : (DataSet)dataDS.stream().reduce(DataSet::union).get();
}
//添加 合同份额金额剩余提款金额本年提款金额本年还款金额 字段逻辑
public DataSet addNewAmountColmn(DataSet orginDataSet){
DataSet tempDS;
//合同份额金额
MainEntityType dataEntityType = MetadataServiceHelper.getDataEntityType("cfm_loancontractbill");
String mainDbRouteKey = dataEntityType.getDBRouteKey();
StringBuilder maiTableBuilder = new StringBuilder("SELECT \n" +
" t1.fbillno as contractno,\n" +
" CASE \n" +
" WHEN e.floantype = 'sl' THEN \n" +
" CASE WHEN EXISTS (\n" +
" SELECT 1 \n" +
" FROM t_cfm_loancontractbill_ba ba \n" +
" WHERE ba.fbankrole = 'MB' \n" +
" AND ba.fid = t1.fid\n" +
" )\n" +
" THEN (\n" +
" SELECT ba.fshareamount \n" +
" FROM t_cfm_loancontractbill_ba ba \n" +
" WHERE ba.fbankrole = 'MB' \n" +
" AND ba.fid = t1.fid\n" +
" )\n" +
" ELSE 0\n" +
" END\n" +
" ELSE \n" +
" CASE WHEN t1.famount IS NULL THEN 0 ELSE t1.famount END\n" +
" END AS shkd_contractamt\n" +
"FROM t_cfm_loancontractbill t1\n" +
"LEFT JOIN T_CFM_LOANCONTRACTBILL_E e ON e.fid = t1.fid");
tempDS = DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of(mainDbRouteKey), maiTableBuilder.toString());
JoinDataSet joinDataSet1 = orginDataSet.join(tempDS, JoinType.LEFT);
RowMeta rowMeta1 = orginDataSet.getRowMeta();
String[] fieldNames1 = rowMeta1.getFieldNames();
List<String> selects1 = new ArrayList<>(Arrays.asList(fieldNames1));
selects1.add("shkd_contractamt");
DataSet main_balanceDataSet = joinDataSet1.on("contractbillno", "contractno").select(selects1.toArray(new String[0])).finish();
//本年提款金额
MainEntityType dataEntityType2 = MetadataServiceHelper.getDataEntityType("cfm_loancontractbill");
String mainDbRouteKey2 = dataEntityType2.getDBRouteKey();
StringBuilder maiTableBuilder2 = new StringBuilder("SELECT \n" +
" t1.fbillno as sonloanbill,\n" +
" CASE \n" +
" WHEN (\n" +
" SELECT SUM(ba.fshareamount)\n" +
" FROM t_cfm_loanbill_e e \n" +
" LEFT JOIN t_cfm_loancontractbill_ba ba ON e.floancontractbillid = ba.fid\n" +
" WHERE e.fid = t1.fid\n" +
" ) IS NULL \n" +
" THEN t1.fdrawamount\n" +
" ELSE (\n" +
" SELECT SUM(ba.fshareamount)\n" +
" FROM t_cfm_loanbill_e e \n" +
" LEFT JOIN t_cfm_loancontractbill_ba ba ON e.floancontractbillid = ba.fid\n" +
" WHERE e.fid = t1.fid\n" +
" )\n" +
" END AS shkd_drawamount_statccy\n" +
"FROM t_cfm_loanbill t1\n" +
"WHERE YEAR(t1.fbizdate) = YEAR(SYSDATE)");
tempDS = DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of(mainDbRouteKey2), maiTableBuilder2.toString());
JoinDataSet joinDataSet2 = main_balanceDataSet.join(tempDS, JoinType.LEFT);
RowMeta rowMeta2 = main_balanceDataSet.getRowMeta();
String[] fieldNames2 = rowMeta2.getFieldNames();
List<String> selects2 = new ArrayList<>(Arrays.asList(fieldNames2));
selects2.add("shkd_drawamount_statccy");
DataSet main_balanceDataSet2 = joinDataSet2.on("loanbillno", "sonloanbill").select(selects2.toArray(new String[0])).finish();
//剩余提款金额合同份额金额 - 剩余提款金额
DataSet copy = main_balanceDataSet2.copy();
DataSet main_balanceDataSet3 = copy.addField("shkd_contractamt - shkd_drawamount_statccy", "shkd_drawamount");
//本年还款金额
MainEntityType dataEntityType3 = MetadataServiceHelper.getDataEntityType("cfm_loancontractbill");
String mainDbRouteKey3 = dataEntityType3.getDBRouteKey();
StringBuilder maiTableBuilder3 = new StringBuilder("SELECT \n" +
" l.fbillno as sonloanbill,\n" +
" CASE WHEN SUM(\n" +
" CASE \n" +
" WHEN YEAR(r.fbizdate) = YEAR(SYSDATE) \n" +
" THEN r.famount \n" +
" ELSE 0 \n" +
" END\n" +
" ) IS NULL THEN 0\n" +
" ELSE SUM(\n" +
" CASE \n" +
" WHEN YEAR(r.fbizdate) = YEAR(SYSDATE) \n" +
" THEN r.famount \n" +
" ELSE 0 \n" +
" END\n" +
" )\n" +
" END as shkd_paidamt\n" +
"FROM t_cfm_loanbill l\n" +
"LEFT JOIN t_cfm_loanbill_e le ON le.fid = l.fid\n" +
"LEFT JOIN t_cfm_loancontractbill c ON le.floancontractbillid = c.fid\n" +
"LEFT JOIN t_cfm_repaymentbill_e re ON re.floancontractbillid = c.fid\n" +
"LEFT JOIN t_cfm_repaymentbill r ON r.fid = re.fid\n" +
"GROUP BY l.fbillno");
tempDS = DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of(mainDbRouteKey3), maiTableBuilder3.toString());
JoinDataSet joinDataSet3 = main_balanceDataSet3.join(tempDS, JoinType.LEFT);
RowMeta rowMeta3 = main_balanceDataSet3.getRowMeta();
String[] fieldNames3 = rowMeta3.getFieldNames();
List<String> selects3 = new ArrayList<>(Arrays.asList(fieldNames3));
selects3.add("shkd_paidamt");
DataSet rows = joinDataSet3.on("loanbillno", "sonloanbill").select(selects3.toArray(new String[0])).finish();
return rows;
}
protected List<String> getGroupFieldByDim(String statdim) {
String[] groupFields = statdim.split(",");
return Arrays.asList(groupFields);
}
protected DataSet getNoInvestorBondBill(DataSet dataSet, ReportQueryParam queryParam, Map<String, Object> paramMap) {
if (!TradeFinanceRptHelper.isAddOther(paramMap)) {
return null;
} else {
List<String> extendedColumns = this.getExtendedColumnKeys(queryParam);
String extendSelectProps = this.createExtendedColumnSelectStr(extendedColumns);
List<Long> orgIds = this.getQueryOrgIds(queryParam);
QFilter loanBillQFilter = TradeFinanceFilterHelper.loanBillQFilter(paramMap, orgIds);
ReportFilterParamHelper.addExtFilter(paramMap, loanBillQFilter);
String lenderNature = (String)paramMap.get("filter_lendernature");
String dataSource = paramMap.get("filter_datasource").toString();
if (lenderNature.contains("outgroup") && dataSource.contains("bond")) {
Set<Long> bondIds = TradeFinanceRptHelper.getBondIds(dataSet);
if (bondIds.size() > 0) {
loanBillQFilter.and(new QFilter("id", "not in", bondIds));
}
loanBillQFilter.and(new QFilter("loantype", "=", LoanTypeEnum.BOND.getValue()));
String selectProps = EmptyUtil.isEmpty(extendSelectProps) ? "id loanbillid,'' as summarycol,org.id as orgid,org.name as fincompanyname,'' as fincreditortype,startintdate as drawdate, case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate,billno as loanbillno,finproduct.name as finproductname,loantype,amount,payinterestamount+calculaterateamount estinterestamt,'' as creditortype,currency as loancurrency,currency.name as loancurrencyname,drawamount as drawamount1,interesttype, '' as contractbillno, '' as contractno,loancontractbill.currency as concurrency,loancontractbill.guarantee as guaranteeway,drawamount as contractamt,settleintmode,repaymentway,0 as drawamount,term,basis,cleardate" : "id loanbillid,'' as summarycol,org.id as orgid,org.name as fincompanyname,'' as fincreditortype,startintdate as drawdate, case when renewalexpiredate is null then expiredate else renewalexpiredate end expiredate,billno as loanbillno,finproduct.name as finproductname,loantype,amount,payinterestamount+calculaterateamount estinterestamt,'' as creditortype,currency as loancurrency,currency.name as loancurrencyname,drawamount as drawamount1,interesttype, '' as contractbillno, '' as contractno,loancontractbill.currency as concurrency,loancontractbill.guarantee as guaranteeway,drawamount as contractamt,settleintmode,repaymentway,0 as drawamount,term,basis,cleardate, " + extendSelectProps;
return QueryServiceHelper.queryDataSet(this.getClass().getName(), "cfm_loanbill_bond", selectProps, loanBillQFilter.toArray(), (String)null);
} else {
return null;
}
}
}
protected DataSet addExtraLoanBillDs(DataSet loanBillDS, ReportQueryParam queryParam, Map<String, Object> paramMap) {
DataSet dsTemp = loanBillDS.copy();
String[] selectProps = COMMON_GROUP_PROPS;
List<String> extendedColumns = this.getExtendedColumnKeys(queryParam);
if (!EmptyUtil.isEmpty(extendedColumns)) {
List<String> strings = new ArrayList(Arrays.asList(COMMON_GROUP_PROPS));
strings.addAll(extendedColumns);
selectProps = (String[])strings.toArray(new String[0]);
}
GroupbyDataSet gdsTemp = dsTemp.groupBy(selectProps).sum("drawamount");
DataSet ds = gdsTemp.finish().addNullField("fincreditortype");
DataSet noInvestords = this.getNoInvestorBondBill(loanBillDS.copy(), queryParam, paramMap);
if (noInvestords != null && !noInvestords.isEmpty()) {
ds = ds.select(noInvestords.getRowMeta().getFieldNames());
ds = ds.union(noInvestords);
}
List<String> selectField = new LinkedList();
Field[] fields = loanBillDS.getRowMeta().getFields();
Field[] var12 = fields;
int var13 = fields.length;
for(int var14 = 0; var14 < var13; ++var14) {
Field field = var12[var14];
if (Arrays.asList(COMMON_GROUP_PROPS).contains(field.getName())) {
selectField.add(field.getName());
} else if ("drawamount".equals(field.getName())) {
selectField.add("drawamount1-drawamount as " + field.getName());
} else if (field.getName().equals("fincreditorname")) {
selectField.add(String.format(ResManager.loadKDString("'其它' as %s", "TradeFinancePlugin_0", "tmc-cfm-report", new Object[0]), field.getName()));
} else if (field.getName().equals("findebtslevel")) {
selectField.add("1 as findebtslevel");
} else if (field.getName().equals("id")) {
selectField.add("loanbillid as id");
} else if (field.getName().equals(this.sumField)) {
selectField.add("0 as " + this.sumField);
} else if (field.getName().endsWith("_ek")) {
selectField.add(field.getName());
} else if (field.getName().equals("fincreditortype")) {
selectField.add("'other' as fincreditortype");
} else {
selectField.add("NULL as " + field.getName());
}
}
return TradeFinanceRptHelper.genId(Arrays.asList("id", "creditorid"), ds.select(String.join(",", selectField))).where("drawamount > 0");
}
private DataSet getLoanAndRepaymentDs(DataSet loanBillDS, DataSet repaymentDS) {
if (repaymentDS == null) {
return loanBillDS;
} else {
loanBillDS = loanBillDS.updateField("notrepayamt", "drawamount");
DataSet slorbackRepayDs = repaymentDS.copy().filter("loantype='sl' or isbuyback").groupBy(new String[]{"loanid", "entryid"}).sum("repayamt").finish();
if (!slorbackRepayDs.isEmpty()) {
loanBillDS = loanBillDS.leftJoin(slorbackRepayDs.copy()).on("loanbillid", "loanid").on("creditorid", "entryid").select(loanBillDS.getRowMeta().getFieldNames(), new String[]{"repayamt vrepayamt"}).finish().updateField("repayamt", "case when vrepayamt!=null then vrepayamt else 0 end").updateField("notrepayamt", "drawamount-repayamt").removeFields(new String[]{"vrepayamt"});
}
DataSet slorbackRepayAllDs = slorbackRepayDs.groupBy(new String[]{"loanid"}).sum("repayamt").finish();
DataSet notSlorbackRepayDs = repaymentDS.copy().filter("loantype!='sl' and !isbuyback").groupBy(new String[]{"loanid"}).sum("repayamt").finish();
if (!notSlorbackRepayDs.isEmpty()) {
loanBillDS = loanBillDS.leftJoin(slorbackRepayAllDs).on("loanbillid", "loanid").select(loanBillDS.getRowMeta().getFieldNames(), new String[]{"repayamt slrepayamt"}).finish().addField("drawamount1-(case when slrepayamt!=null then slrepayamt else 0 end) ", "totaldrawamount").removeFields(new String[]{"slrepayamt"});
loanBillDS = loanBillDS.leftJoin(notSlorbackRepayDs).on("loanbillid", "loanid").select(loanBillDS.getRowMeta().getFieldNames(), new String[]{"case when repayamt!=null then repayamt*notrepayamt/totaldrawamount else 0 end repayamtrate"}).finish().updateField("repayamt1", "case when repayamtrate>notrepayamt then notrepayamt else repayamtrate end");
loanBillDS = this.getCurrencyPresion(loanBillDS, notSlorbackRepayDs);
}
loanBillDS = loanBillDS.addField("repayamt+repayamt1", "paidamt");
loanBillDS = loanBillDS.updateField("paidamt", "case when paidamt=null then 0 else paidamt end").updateField("paidamt", "case when paidamt>drawamount then drawamount else paidamt end").addField("case when drawamount-paidamt>0 then drawamount-paidamt else 0 end", "unpaidamt");
return loanBillDS;
}
}
protected DataSet addExchangeRateAndCurrencyUnit(DataSet bizDataSet, Map<String, Object> paramMap) {
DataSet resDs = super.addExchangeRateAndCurrencyUnit(bizDataSet, paramMap);
DynamicObject standCur = (DynamicObject)paramMap.get("filter_statcurrency");
int amtPrecision = EmptyUtil.isNoEmpty(standCur) ? standCur.getInt("amtprecision") : 2;
return resDs.updateFields(new String[]{
"drawamount_statccy",
"paidamt_statccy",
"unpaidamt_statccy",
"estinterestamt_statccy",
"paidintamt_statccy",
"unpaidintamt_statccy"
},
new String[]{String.format("round(drawamount_statccy, %s)", amtPrecision),
String.format("round(paidamt_statccy, %s)", amtPrecision),
String.format("round(unpaidamt_statccy, %s)", amtPrecision),
String.format("round(estinterestamt_statccy, %s)", amtPrecision),
String.format("round(paidintamt_statccy, %s)", amtPrecision),
String.format("round(unpaidintamt_statccy, %s)", amtPrecision)
});
}
private DataSet getCurrencyPresion(DataSet loanBillDS, DataSet repayDs) {
loanBillDS = loanBillDS.updateField("repayamt1", "case when repayamt1=null then 0 else repayamt1 end");
List<Long> currencyIds = TradeFinanceFilterHelper.getloanBillIds(loanBillDS, "loancurrency");
DataSet currencyPresionDs = QueryServiceHelper.queryDataSet("getCurrencyPresion", "bd_currency", "id,amtprecision", new QFilter[]{new QFilter("id", "in", currencyIds)}, (String)null);
loanBillDS = loanBillDS.leftJoin(currencyPresionDs).on("loancurrency", "id").select(loanBillDS.getRowMeta().getFieldNames(), new String[]{"case when amtprecision=null then 2 else amtprecision end amtprecision"}).finish();
loanBillDS = loanBillDS.updateField("repayamt1", "round(repayamt1, amtprecision)").removeFields(new String[]{"amtprecision"});
DataSet distinctDs = loanBillDS.copy().select(new String[]{"loanbillid", "drawamount1"}).distinct();
DataSet loanAllPaidDs = loanBillDS.copy().groupBy(new String[]{"loanbillid"}).sum("repayamt1").sum("drawamount").finish();
loanAllPaidDs = distinctDs.leftJoin(loanAllPaidDs).on("loanbillid", "loanbillid").select(new String[]{"loanbillid", "drawamount1"}, new String[]{"repayamt1", "drawamount"}).finish().filter("drawamount1=drawamount").select(new String[]{"loanbillid", "repayamt1"});
DataSet subAmtDs = loanAllPaidDs.leftJoin(repayDs).on("loanbillid", "loanid").select(new String[]{"loanbillid", "loanid", "repayamt-repayamt1 subamt"}).finish().filter("loanid!=null and subamt!=0");
if (subAmtDs.isEmpty()) {
return loanBillDS;
} else {
final Map<Long, BigDecimal> loanSubAmtMap = new HashMap();
Iterator var9 = subAmtDs.iterator();
while(var9.hasNext()) {
Row subAmtD = (Row)var9.next();
loanSubAmtMap.put(subAmtD.getLong("loanbillid"), subAmtD.getBigDecimal("subamt"));
}
Set<Long> subIds = loanSubAmtMap.keySet();
String loanIds = (String)subIds.stream().map(String::valueOf).collect(Collectors.joining(","));
DataSet notSubDs = loanBillDS.filter("loanbillid not in (" + loanIds + ")");
DataSet subDs = loanBillDS.filter("loanbillid in (" + loanIds + ")");
final RowMeta rowMeta = loanBillDS.getRowMeta();
subDs = subDs.map(new MapFunction() {
BigDecimal subAmt;
{
this.subAmt = BigDecimal.ZERO;
}
public Object[] map(Row row) {
List<Object> rowInfo = new ArrayList();
Long loanbillId = row.getLong("loanbillid");
BigDecimal notRepayAmt = row.getBigDecimal("notrepayamt");
BigDecimal repayAmt = row.getBigDecimal("repayamt1");
BigDecimal loanSubAmt = (BigDecimal)loanSubAmtMap.getOrDefault(loanbillId, BigDecimal.ZERO);
if (loanSubAmt != null) {
this.subAmt = TradefinanceSelectPlugin.this.getSubAmount(loanSubAmt, notRepayAmt, repayAmt);
loanSubAmtMap.put(loanbillId, loanSubAmt.subtract(this.subAmt));
}
String[] var7 = rowMeta.getFieldNames();
int var8 = var7.length;
for(int var9 = 0; var9 < var8; ++var9) {
String filedName = var7[var9];
if ("repayamt1".equals(filedName)) {
rowInfo.add(repayAmt.add(this.subAmt));
} else {
rowInfo.add(row.get(filedName));
}
}
return rowInfo.toArray();
}
public RowMeta getResultRowMeta() {
return rowMeta;
}
});
return notSubDs.union(subDs);
}
}
private BigDecimal getSubAmount(BigDecimal subAmt, BigDecimal notRepayAmt, BigDecimal repayAmt) {
if (EmptyUtil.isEmpty(subAmt)) {
return subAmt;
} else {
BigDecimal subAmount = notRepayAmt.subtract(repayAmt);
if (subAmt.compareTo(BigDecimal.ZERO) > 0) {
return subAmount.compareTo(subAmt) > 0 ? subAmt : subAmount;
} else {
return repayAmt.compareTo(subAmt.abs()) > 0 ? subAmt : repayAmt.negate();
}
}
}
private DataSet getLoanAndInterestDs(DataSet loanBillDS, DataSet interestDS) {
DataSet notSlRepaymentDs = interestDS.filter("loantype!='sl' and loantype!='bond'");
notSlRepaymentDs = notSlRepaymentDs.groupBy(new String[]{"loanbillid"}).sum("paidintamt").finish();
DataSet notSlloanBillDs = loanBillDS.filter("loantype!='sl' and loantype!='bond'").leftJoin(notSlRepaymentDs).on("loanbillid", "loanbillid").select(loanBillDS.getRowMeta().getFieldNames(), new String[]{"paidintamt"}).finish();
DataSet slRepaymentDs = interestDS.filter("loantype='sl'").groupBy(new String[]{"loanbillid", "bankid"}).sum("slpaidintamt").finish();
DataSet slloanBillDs = loanBillDS.filter("loantype='sl'").leftJoin(slRepaymentDs).on("loanbillid", "loanbillid").on("creditorid", "bankid").select(loanBillDS.getRowMeta().getFieldNames(), new String[]{"slpaidintamt paidintamt"}).finish();
DataSet bondInterestDs = interestDS.filter("loantype='bond'").groupBy(new String[]{"loanbillid"}).sum("paidintamt").finish();
DataSet bondloanBillDs = loanBillDS.filter("loantype='bond' and drawamount1>0").leftJoin(bondInterestDs).on("loanbillid", "loanbillid").select(loanBillDS.getRowMeta().getFieldNames(), new String[]{"drawamount*paidintamt/drawamount1 paidintamt"}).finish();
loanBillDS = notSlloanBillDs.union(slloanBillDs).union(bondloanBillDs).updateField("paidintamt", "case when paidintamt=null then 0 else paidintamt end");
return loanBillDS;
}
protected List<String> getExtendedColumnKeys(ReportQueryParam param) {
String columnkeyStr = (String)param.getCustomParam().get("columnkeys");
if (EmptyUtil.isEmpty(columnkeyStr)) {
return Collections.emptyList();
} else {
String[] columns = columnkeyStr.split(",");
List<String> keys = new ArrayList(columns.length);
String[] var5 = columns;
int var6 = columns.length;
for(int var7 = 0; var7 < var6; ++var7) {
String column = var5[var7];
if (column.endsWith("_ek")) {
keys.add(column);
}
}
return keys;
}
}
protected String createExtendedColumnSelectStr(List<String> keys) {
List<String> sel = new ArrayList(keys.size());
Iterator var3 = keys.iterator();
while(var3.hasNext()) {
String key = (String)var3.next();
String str = key.substring(0, key.lastIndexOf("_ek")) + " as " + key;
sel.add(str);
}
return String.join(",", sel);
}
protected DataSet addFeeAmtDs(DataSet loanBillDS, List<Long> loanBillIds) {
QFilter feeIdFilter = new QFilter("entry.srcbillid", "in", loanBillIds);
QFilter dataIsoRateFilter = (new QFilter("feesource", "=", FeeSourceEnum.LINKGEN.getValue())).or((new QFilter("billstatus", "=", BillStatusEnum.AUDIT.getValue())).and(new QFilter("feesource", "in", Arrays.asList(FeeSourceEnum.HAND.getValue(), FeeSourceEnum.BIZPATCH.getValue(), FeeSourceEnum.BATCHINPUT.getValue()))));
DataSet feeDs = QueryServiceHelper.queryDataSet("TradeFinanceDataListPlugin_Fee", "cfm_feebill", "entry.srcbillid as srcbillid,entry.feedetailamt as feedetailamt,entry.excrate as excrate", new QFilter[]{feeIdFilter, dataIsoRateFilter}, "");
if (!feeDs.isEmpty()) {
DataSet midFeeDs = feeDs.groupBy(new String[]{"srcbillid"}).sum("feedetailamt*excrate", "feeamt").finish().select("srcbillid,feeamt");
loanBillDS = loanBillDS.leftJoin(midFeeDs).on("loanbillid", "srcbillid").select(loanBillDS.getRowMeta().getFieldNames(), new String[]{"feeamt"}).finish().updateField("feeamt", "case when feeamt is null then 0 else feeamt end");
} else {
loanBillDS = loanBillDS.addField("0", "feeamt");
}
loanBillDS = loanBillDS.updateField("feeamt", "case when loantype in ('sl', 'bond') then feeamt*(drawamount/drawamount1) else feeamt end");
return loanBillDS.addField("estinterestamt + feeamt", "compamt");
}
protected DataSet addCalIntAmtDs(DataSet loanBillDS, List<Long> loanBillIds) {
List<Field> field = new ArrayList(2);
field.add(new Field("loanbillid", DataType.LongType));
field.add(new Field("calintamt", DataType.BigDecimalType));
RowMeta rowMeta = new RowMeta((Field[])field.toArray(new Field[0]));
DataSetBuilder datasetBuilder = Algo.create("calIntAmt").createDataSetBuilder(rowMeta);
loanBillIds = (List)loanBillIds.stream().distinct().collect(Collectors.toList());
List<List<Long>> loanBillIdLists = ListUtils.splitList(loanBillIds, 100L);
StringBuilder noRateLoanBillSB = new StringBuilder();
Iterator var8 = loanBillIdLists.iterator();
label43:
while(var8.hasNext()) {
List<Long> loanBillIdList = (List)var8.next();
List<DynamicObject> loanBills = InterestCalcHelper.getLoanBills(loanBillIdList);
Iterator var11 = loanBills.iterator();
while(true) {
while(true) {
if (!var11.hasNext()) {
continue label43;
}
DynamicObject loanBill = (DynamicObject)var11.next();
long loanBillId = loanBill.getLong("id");
if (RepaymentWayEnum.isHbfx(loanBill.getString("repaymentway"))) {
loanBill.set("repaymentway", RepaymentWayEnum.bqhblsbq.getValue());
}
DynamicObjectCollection rateadjust_entry = loanBill.getDynamicObjectCollection("rateadjust_entry");
if (rateadjust_entry.size() > 0) {
rateadjust_entry.sort(Comparator.comparing((r) -> {
return r.getDate("ra_effectdate");
}));
Date startIntDate = loanBill.getDate("startintdate");
if (startIntDate.compareTo(((DynamicObject)rateadjust_entry.get(0)).getDate("ra_effectdate")) < 0) {
noRateLoanBillSB.append(loanBill.getString("billno")).append(",");
continue;
}
}
IntBillExtInfo intBill;
try {
intBill = InterestCalcHelper.callInt(loanBill);
} catch (TmcBizException var18) {
TmcBizException e = var18;
logger.error("计算利息失败: loanBillId={}, error: {}", loanBillId, e.getMessage());
continue;
}
if (EmptyUtil.isNoEmpty(intBill) && EmptyUtil.isNoEmpty(intBill.getDetails())) {
Object[] row = new Object[]{loanBillId, intBill.getAmount()};
datasetBuilder.append(row);
}
}
}
}
String LoanBills = noRateLoanBillSB.toString();
logger.error("利息计算开始日必须要有可用利率: " + LoanBills);
DataSet calIntAmtDs = datasetBuilder.build();
loanBillDS = loanBillDS.leftJoin(calIntAmtDs).on("loanbillid", "loanbillid").select(loanBillDS.getRowMeta().getFieldNames(), new String[]{"calintamt"}).finish().updateField("calintamt", "case when calintamt is null then 0 else calintamt end");
loanBillDS = loanBillDS.updateField("calintamt", "case when loantype in ('sl', 'bond') then calintamt*(drawamount/drawamount1) + feeamt else calintamt + feeamt end");
return loanBillDS;
}
public DataSet reDealResultDataSet(DataSet dataSet, ReportQueryParam queryParam) {
if (dataSet != null && !dataSet.isEmpty()) {
dataSet = dataSet.addField("case when unpaidamt=0 and cleardate is not null then cleardate else expiredate end", "comprateenddate");
DataSet compDs = this.buildCompCalcDs(dataSet.copy());
dataSet = dataSet.leftJoin(compDs).on("loanbillid", "compid").select(dataSet.getRowMeta().getFieldNames(), new String[]{"compyearday", "compdays"}).finish();
dataSet = dataSet.addField("case when drawamount=0 or compdays=0 then 0 else calintamt * 100 * compyearday /(drawamount * compdays) end", "comprate_statccy");
DataSet totalDs = dataSet.filter("sumlevel=2");
dataSet = dataSet.filter("sumlevel!=2");
dataSet = dataSet.orderBy((String[])this.orderByFields().toArray(new String[0]));
return dataSet.union(totalDs);
} else {
return dataSet;
}
}
private DataSet buildCompCalcDs(DataSet dataSet) {
List<Field> field = new ArrayList(8);
field.add(new Field("compid", DataType.LongType));
field.add(new Field("compyearday", DataType.IntegerType));
field.add(new Field("compdays", DataType.IntegerType));
RowMeta rowMeta = new RowMeta((Field[])field.toArray(new Field[0]));
DataSetBuilder builder = Algo.create("Build_Day_Calc_Ds").createDataSetBuilder(rowMeta);
Iterator<Row> iterator = dataSet.filter("sumlevel=0").iterator();
while(iterator.hasNext()) {
Row row = (Row)iterator.next();
Date startDate = row.getDate("drawdate");
Date endDate = row.getDate("comprateenddate");
String basis = row.getString("basis");
int yearDay;
int diffDays;
if (EmptyUtil.isAnyoneEmpty(new Object[]{startDate, endDate, basis})) {
yearDay = 0;
diffDays = 1;
} else {
yearDay = TermHelper.getBasis_YearDay(startDate, endDate, BasisEnum.getEnum(basis));
diffDays = TermHelper.getBasis_BetweenDay(startDate, endDate, BasisEnum.getEnum(basis), (DynamicObject[])null);
}
Object[] rowArr = new Object[]{row.getLong("loanbillid"), yearDay, diffDays};
builder.append(rowArr);
}
return builder.build().groupBy(new String[]{"compid"}).max("compyearday").max("compdays").finish();
}
}

View File

@ -53,6 +53,44 @@ public class BdimbondBuildEntryPlugin extends AbstractFormPlugin implements Plug
}
}
}
// if("org".equals(name)) {
// DynamicObject org = (DynamicObject)this.getModel().getValue("org");
// Long orgId = (Long)org.getPkValue();
// IDataModel model = this.getModel();
// //债券发行分录
// DynamicObjectCollection shkdBondissueEntry = (DynamicObjectCollection)this.getModel().getValue("shkd_bondissue_entry");
// //银行贷款合同分录
// DynamicObjectCollection shkdBankcontractEntry = (DynamicObjectCollection)this.getModel().getValue("shkd_bankcontract_entry");
//
// shkdBondissueEntry.clear();
// shkdBankcontractEntry.clear();
//
// //查询范围内的债券发行
// QFilter orgidfilter = new QFilter("org","=",orgId);
// DynamicObject[] loanbillBonList = BusinessDataServiceHelper.load("cfm_loanbill_bond","id,org.id,amount,drawamount,bizdate,expiredate", orgidfilter.toArray());
// for (DynamicObject demo : loanbillBonList) {
// int index = model.createNewEntryRow("shkd_bankcontract_entry");
// model.setValue("shkd_entrybillno",demo.getPkValue(), index);
// model.setValue("shkd_entryorg",demo.get("org.id"), index);
// model.setValue("shkd_entrytotalmount",demo.get("amount"), index);
// model.setValue("shkd_entryamount",demo.get("drawamount"), index);
// model.setValue("shkd_entrystartdate",demo.get("bizdate"), index);
// model.setValue("shkd_entryexpiredate",demo.get("expiredate"), index);
// }
//
// //查询范围内的银行贷款合同
// List<Long> allSubordinateOrgs = OrgUnitServiceHelper.getAllSubordinateOrgs(OrgViewType.BDControl, Collections.singletonList(orgId), true);
// QFilter orgidfilter2 = new QFilter("org","in",allSubordinateOrgs);
// DynamicObject[] loanconTractbillList = BusinessDataServiceHelper.load("cfm_loancontractbill","id,org.id,amount,startdate,enddate", orgidfilter2.toArray());
// for (DynamicObject demo : loanconTractbillList) {
// int index = model.createNewEntryRow("shkd_bankcontract_entry");
// model.setValue("shkd_entrycontractnum",demo.getPkValue(), index);
// model.setValue("shkd_enryborrower",demo.get("org.id"), index);
// model.setValue("shkd_borrowamount",demo.get("amount"), index);
// model.setValue("shkd_contractstartdate",demo.get("startdate"), index);
// model.setValue("shkd_contractenddate",demo.get("enddate"), index);
// }
// }
}
//组装组装债券发行 银行借款合同分录数据
@ -71,7 +109,7 @@ public class BdimbondBuildEntryPlugin extends AbstractFormPlugin implements Plug
QFilter orgidfilter = new QFilter("org","=",orgId);
DynamicObject[] loanbillBonList = BusinessDataServiceHelper.load("cfm_loanbill_bond","id,org.id,amount,drawamount,bizdate,expiredate", orgidfilter.toArray());
for (DynamicObject demo : loanbillBonList) {
int index = model.createNewEntryRow("shkd_bankcontract_entry");
int index = model.createNewEntryRow("shkd_bondissue_entry");
model.setValue("shkd_entrybillno",demo.getPkValue(), index);
model.setValue("shkd_entryorg",demo.get("org.id"), index);
model.setValue("shkd_entrytotalmount",demo.get("amount"), index);