parent
b6e3f7f8cb
commit
7d9a47824f
|
@ -0,0 +1,374 @@
|
|||
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.metadata.clr.DataEntityPropertyCollection;
|
||||
import kd.bos.db.DB;
|
||||
import kd.bos.db.DBRoute;
|
||||
import kd.bos.entity.MainEntityType;
|
||||
import kd.bos.entity.report.AbstractReportListDataPlugin;
|
||||
import kd.bos.entity.report.FastFilter;
|
||||
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.ORM;
|
||||
import kd.bos.orm.query.QCP;
|
||||
import kd.bos.orm.query.QFilter;
|
||||
import kd.bos.portal.util.DateUtils;
|
||||
import kd.bos.servicehelper.BusinessDataServiceHelper;
|
||||
import kd.bos.servicehelper.MetadataServiceHelper;
|
||||
import kd.bos.servicehelper.QueryServiceHelper;
|
||||
import kd.bos.util.CollectionUtils;
|
||||
import kd.ssc.task.util.DateUtil;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 报表取数插件
|
||||
*/
|
||||
public class BankloanreportListPlugin extends AbstractReportListDataPlugin {
|
||||
private static Log log = LogFactory.getLog(BankloanreportListPlugin.class);
|
||||
|
||||
/**
|
||||
* 以银行账户为主表取查询。
|
||||
* 显示所选的核算组织下的所有银行账户的流水
|
||||
*
|
||||
* @param reportQueryParam
|
||||
* @param o
|
||||
* @return
|
||||
* @throws Throwable
|
||||
*/
|
||||
@Override
|
||||
public DataSet query(ReportQueryParam reportQueryParam, Object o) throws Throwable {
|
||||
HashMap<String, Object> listQFilter = getListQFilter(reportQueryParam);
|
||||
|
||||
//1、查询借款合同基础数据(主数据)
|
||||
MainEntityType dataEntityType = MetadataServiceHelper.getDataEntityType("cfm_loancontractbill");
|
||||
String mainDbRouteKey = dataEntityType.getDBRouteKey();
|
||||
String selectLoanContarctSql =
|
||||
"id as loancontractbillid," +
|
||||
"org.shkd_comcode shkd_comcode," +
|
||||
"org.shkd_comname shkd_comname," +
|
||||
"contractno shkd_contractno," +
|
||||
"org.number shkd_orgnum," +
|
||||
"org.name shkd_orgname," +
|
||||
"bizdate shkd_bizdate,"+
|
||||
"CASE \n" +
|
||||
" WHEN finproduct.number = 'RZPZ-0002' OR finproduct.number = 'RZPZ-0019' THEN 'F01'\n" +
|
||||
" WHEN finproduct.number = 'RZPZ-0036' THEN 'F02'\n" +
|
||||
" WHEN finproduct.number = 'RZPZ-0026' THEN 'F03'\n" +
|
||||
" ELSE 'F04'\n" +
|
||||
"END AS shkd_loankind,"+
|
||||
"CASE \n" +
|
||||
" WHEN guarantee = ',2,' THEN 'C'\n" +
|
||||
" WHEN guarantee = ',4,' THEN 'B'\n" +
|
||||
" WHEN guarantee = ',5,' THEN 'A'\n" +
|
||||
" WHEN guarantee = ',6,' THEN 'Z'\n" +
|
||||
" WHEN guarantee = ',7,' THEN 'D'\n" +
|
||||
" ELSE 'E'\n" +
|
||||
"END AS shkd_guarantee,"+
|
||||
"creditortype," +
|
||||
"loantype," + //借款类型
|
||||
"billno as loanContarctBillNo," +
|
||||
"textcreditor";
|
||||
DataSet loanContractBills = QueryServiceHelper.queryDataSet(this.getClass().getSimpleName(), "cfm_loancontractbill", selectLoanContarctSql, new QFilter[0], null);
|
||||
|
||||
//2、查询合作金融机构的数据(基础资料)
|
||||
String selectFinOrgInfoSql = "id as finorginfoid,number as finorginfonum,name as finorginfoname,finorgtype.number as finorgtypenum";
|
||||
DataSet finorginfos = QueryServiceHelper.queryDataSet(this.getClass().getSimpleName(), "bd_finorginfo", selectFinOrgInfoSql, new QFilter[0], null);
|
||||
|
||||
//3、左连接主数据和基础资料数据
|
||||
DataSet leftjoinOne = loanContractBills.join(finorginfos, JoinType.LEFT).on("textcreditor", "finorginfoname")
|
||||
.select("loancontractbillid", "shkd_comcode", "shkd_comname", "shkd_contractno", "shkd_orgnum", "shkd_orgname", "shkd_bizdate",
|
||||
"shkd_loankind", "shkd_guarantee", "creditortype", "textcreditor","loanContarctBillNo","finorgtypenum","finorginfonum","finorginfoname").finish();
|
||||
|
||||
//4、添加shkd_internalloan的字段
|
||||
DataSet addFieldOne = leftjoinOne.addField("CASE \n" +
|
||||
" WHEN (creditortype = 'finorg' and finorgtypenum = 'FI-031') or creditortype = 'innerunit' THEN 'T00'\n" +
|
||||
" ELSE 'T01' END", "shkd_internalloan");
|
||||
|
||||
//5、查询提款处理单数据(主数据的提款单分录数据)
|
||||
String selectCfmLoanBillSql =
|
||||
"id as loanbillid," +
|
||||
"loancontractbill.number as loanbillContractno," +
|
||||
"creditortype as loanbillCDtype," +
|
||||
"textcreditor as shkd_textcreditorname," +
|
||||
"billno as loanbillBillno," +
|
||||
"currency.sign as shkd_currency," +
|
||||
"drawamount as shkd_drawamount," +
|
||||
"bizdate as shkd_syncdrawdate," +
|
||||
"term as shkd_syncterm," +
|
||||
"referencerate.number as referenceratenumber," + //参考利率
|
||||
"rateadjustdate," + //首次利率确定日
|
||||
"rateadjustcycletype," + //利率重置周期
|
||||
"rateadjustcycle," + //利率重置周期值
|
||||
"ratesign," + //利率浮动基点(BP)
|
||||
"ratefloatpoint," + //利率浮动基点
|
||||
"startloanrate," + //起息日利率
|
||||
"interesttype," + //利率类型
|
||||
"convertrate"; //折合同币种汇率
|
||||
DataSet loanbills = QueryServiceHelper.queryDataSet(this.getClass().getSimpleName(), "cfm_loanbill", selectCfmLoanBillSql, new QFilter[0], null);
|
||||
|
||||
//6、左连接主数据和提款处理单数据
|
||||
RowMeta rowMeta1 = addFieldOne.getRowMeta();
|
||||
RowMeta rowMeta2 = loanbills.getRowMeta();
|
||||
String[] fieldNames1 = rowMeta1.getFieldNames();
|
||||
String[] fieldNames2 = rowMeta2.getFieldNames();
|
||||
List<String> selects1 = new ArrayList<>(Arrays.asList(fieldNames1));
|
||||
List<String> selects2 = new ArrayList<>(Arrays.asList(fieldNames2));
|
||||
selects1.addAll(selects2);
|
||||
DataSet leftjoin2 = addFieldOne.join(loanbills, JoinType.LEFT).on("shkd_contractno", "loanbillContractno")
|
||||
.select(selects1.toArray(new String[0])).finish();
|
||||
|
||||
//7、查找各种可能的债权人(主体关联在提款单)
|
||||
//a、业务单元
|
||||
String selectBosOrgSql = "id as bosorgid,number as bosorgnNum,name as bosorgName,country.name as basorgCountryName";
|
||||
DataSet entry_basorgs = QueryServiceHelper.queryDataSet(this.getClass().getSimpleName(), "bos_org", selectBosOrgSql, new QFilter[0], null);
|
||||
//b、内部金融组织
|
||||
String selectFinorginfoSql = "id as finorginfoid,number as finorginfoNum,name as finorginfoName,parent.name finorginfoParentName,country.name as finorginfoCountryName";
|
||||
DataSet entry_finorginfos = QueryServiceHelper.queryDataSet(this.getClass().getSimpleName(), "bd_finorginfo", selectFinorginfoSql, new QFilter[0], null);
|
||||
//c、商务伙伴
|
||||
String selectBizpartnerSql = "id as bizpartnerid,number as bizpartnerNum,name as bizpartnerName,country.name as bizpartnerCountryName";
|
||||
DataSet entry_bizpartners = QueryServiceHelper.queryDataSet(this.getClass().getSimpleName(), "bd_bizpartner", selectBizpartnerSql, new QFilter[0], null);
|
||||
|
||||
//8、左连接主数据和各种可能的债权人(关联在提款单上)
|
||||
RowMeta rowMeta3 = leftjoin2.getRowMeta();
|
||||
RowMeta rowMeta4 = entry_basorgs.getRowMeta();
|
||||
RowMeta rowMeta5 = entry_finorginfos.getRowMeta();
|
||||
RowMeta rowMeta6 = entry_bizpartners.getRowMeta();
|
||||
String[] fieldNames3 = rowMeta3.getFieldNames();
|
||||
String[] fieldNames4 = rowMeta4.getFieldNames();
|
||||
String[] fieldNames5 = rowMeta5.getFieldNames();
|
||||
String[] fieldNames6 = rowMeta6.getFieldNames();
|
||||
List<String> selects3 = new ArrayList<>(Arrays.asList(fieldNames3));
|
||||
List<String> selects4 = new ArrayList<>(Arrays.asList(fieldNames4));
|
||||
List<String> selects5 = new ArrayList<>(Arrays.asList(fieldNames5));
|
||||
List<String> selects6 = new ArrayList<>(Arrays.asList(fieldNames6));
|
||||
selects3.addAll(selects4);
|
||||
DataSet leftjoin3 = leftjoin2.join(entry_basorgs, JoinType.LEFT).on("shkd_textcreditorname", "bosorgName")
|
||||
.select(selects3.toArray(new String[0])).finish();
|
||||
selects3.addAll(selects5);
|
||||
DataSet leftjoin4 = leftjoin3.join(entry_finorginfos, JoinType.LEFT).on("shkd_textcreditorname", "finorginfoName")
|
||||
.select(selects3.toArray(new String[0])).finish();
|
||||
selects3.addAll(selects6);
|
||||
DataSet leftjoin5 = leftjoin4.join(entry_bizpartners, JoinType.LEFT).on("shkd_textcreditorname", "bizpartnerName")
|
||||
.select(selects3.toArray(new String[0])).finish();
|
||||
|
||||
//9、赋值债权人编码、总行字段,国家
|
||||
DataSet addField2 = leftjoin5
|
||||
.addField("CASE \n" +
|
||||
" WHEN loanbillCDtype = 'innerunit' THEN bosorgnNum\n" +
|
||||
" WHEN (loanbillCDtype = 'finorg' or loanbillCDtype = 'bank' or loanbillCDtype = 'settlecenter') THEN finorginfoNum\n" +
|
||||
" WHEN loanbillCDtype = 'custom' THEN bizpartnerNum\n" +
|
||||
" ELSE '' END", "shkd_textcreditornum")
|
||||
.addField("CASE \n" +
|
||||
" WHEN loanbillCDtype = 'innerunit' THEN bosorgName\n" +
|
||||
" WHEN (loanbillCDtype = 'finorg' or loanbillCDtype = 'bank' or loanbillCDtype = 'settlecenter') THEN finorginfoParentName\n" +
|
||||
" WHEN loanbillCDtype = 'custom' THEN bizpartnerName\n" +
|
||||
" ELSE '' END", "shkd_textcreditortrc")
|
||||
.addField("CASE \n" +
|
||||
" WHEN loanbillCDtype = 'innerunit' THEN basorgCountryName\n" +
|
||||
" WHEN (loanbillCDtype = 'finorg' or loanbillCDtype = 'bank' or loanbillCDtype = 'settlecenter') THEN finorginfoCountryName\n" +
|
||||
" WHEN loanbillCDtype = 'custom' THEN bizpartnerCountryName\n" +
|
||||
" ELSE '' END", "shkd_country")
|
||||
.addField("null", "shkd_loanrate")//利率水平
|
||||
.addField("null", "shkd_amountoricur")//贷款余额(原币)
|
||||
.addField("null", "shkd_amountbencur");//贷款余额(本币)
|
||||
|
||||
//10、赋值利率水平、贷款余额(原币)、贷款余额(本币)
|
||||
DynamicObjectCollection plainDynamicObjectCollection = ORM.create().toPlainDynamicObjectCollection(addField2);
|
||||
Date shkdSelectdate = (Date)listQFilter.get("shkd_selectdate");
|
||||
if(shkdSelectdate == null) shkdSelectdate = new Date();
|
||||
for (DynamicObject dataRow : plainDynamicObjectCollection) {
|
||||
String referenceratenumber = dataRow.getString("referenceratenumber");//参考利率
|
||||
Date rateadjustdate = dataRow.getDate("rateadjustdate");//首次利率确定日
|
||||
BigDecimal shkdDrawamount = dataRow.getBigDecimal("shkd_drawamount");//提款金额
|
||||
String loanbillBillno = dataRow.getString("loanbillBillno");//提款单编码
|
||||
String rateadjustcycletype = dataRow.getString("rateadjustcycletype");//利率重置周期
|
||||
Integer rateadjustcycle = dataRow.getInt("rateadjustcycle");//利率重置周期值
|
||||
String ratesign = dataRow.getString("ratesign");//利率浮动基点(BP)
|
||||
BigDecimal ratefloatpoint = dataRow.getBigDecimal("ratefloatpoint");//利率浮动基点
|
||||
BigDecimal startloanrate = dataRow.getBigDecimal("startloanrate");//起息日利率
|
||||
String interesttype = dataRow.getString("interesttype");//利率类型
|
||||
BigDecimal convertrate = dataRow.getBigDecimal("convertrate");//折合同币种汇率
|
||||
|
||||
//赋值利率
|
||||
if ("fixed".equals(interesttype)){
|
||||
//固定利率 直接赋值startloanrate
|
||||
dataRow.set("shkd_loanrate", startloanrate);
|
||||
}else if ("float".equals(interesttype)){
|
||||
//浮动利率
|
||||
//计算利率周期
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.setTime(rateadjustdate);
|
||||
switch (rateadjustcycletype){
|
||||
case "D": calendar.add(Calendar.DAY_OF_MONTH, rateadjustcycle);
|
||||
break;
|
||||
case "W": calendar.add(Calendar.DAY_OF_MONTH, rateadjustcycle * 7);
|
||||
break;
|
||||
case "M": calendar.add(Calendar.MONTH, rateadjustcycle);
|
||||
break;
|
||||
case "S": calendar.add(Calendar.MONTH, rateadjustcycle * 3);
|
||||
break;
|
||||
case "H": calendar.add(Calendar.MONTH, rateadjustcycle * 6);
|
||||
break;
|
||||
case "Y": calendar.add(Calendar.YEAR, rateadjustcycle);
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
Date enddate = calendar.getTime();
|
||||
|
||||
// 比较 shkdSelectdate 和 enddate
|
||||
DynamicObject dateRate = new DynamicObject();
|
||||
if (shkdSelectdate != null) {
|
||||
int comparison = shkdSelectdate.compareTo(enddate);
|
||||
if (comparison > 0) {
|
||||
// shkdSelectdate 在 enddate 之后
|
||||
QFilter qFilter = new QFilter("referrate.number","=",referenceratenumber);
|
||||
DynamicObject[] cfm_loanbill_bond = BusinessDataServiceHelper.load("md_datarate","endprice",qFilter.toArray(), "bizdate DESC");
|
||||
if (cfm_loanbill_bond.length > 0) {
|
||||
dateRate = cfm_loanbill_bond[0];
|
||||
}
|
||||
} else {
|
||||
// shkdSelectdate 在 enddate 之前 或者 shkdSelectdate 与 enddate 相等
|
||||
QFilter qFilter = new QFilter("referrate.number","=",referenceratenumber);
|
||||
qFilter.and("bizdate","<=",shkdSelectdate);
|
||||
DynamicObject[] cfm_loanbill_bond = BusinessDataServiceHelper.load("md_datarate","endprice",qFilter.toArray(), "bizdate DESC");
|
||||
if (cfm_loanbill_bond.length > 0) {
|
||||
dateRate = cfm_loanbill_bond[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//计算利率
|
||||
BigDecimal endprice = dateRate.getBigDecimal("endprice");
|
||||
BigDecimal shkd_loanrate = BigDecimal.ZERO;
|
||||
if (endprice == null){
|
||||
endprice = BigDecimal.ZERO;
|
||||
}
|
||||
if ("add".equals(ratesign)){
|
||||
shkd_loanrate = endprice.add(ratefloatpoint.multiply(BigDecimal.valueOf(0.01)));
|
||||
}else if ("subtract".equals(ratesign)){
|
||||
shkd_loanrate = endprice.subtract(ratefloatpoint.multiply(BigDecimal.valueOf(0.01)));
|
||||
}
|
||||
dataRow.set("shkd_loanrate", shkd_loanrate);
|
||||
}
|
||||
|
||||
//赋值贷款余额(原币)、贷款余额(本币)
|
||||
BigDecimal totalAmount = BigDecimal.ZERO;
|
||||
DynamicObjectCollection repaymentbill = QueryServiceHelper.query("cfm_repaymentbill", "billno,amount", new QFilter("loans.e_loanbill.number", "=", loanbillBillno).and("bizdate","<=",shkdSelectdate).and("billstatus","=","C").toArray());
|
||||
if (repaymentbill != null && repaymentbill.size() > 0) {
|
||||
// 按 billno 分组,取每组第一条记录
|
||||
Map<String, DynamicObject> groupedRepayments = new LinkedHashMap<>();
|
||||
for (DynamicObject repayment : repaymentbill) {
|
||||
String billno = repayment.getString("billno");
|
||||
// 如果该 billno 还未添加到 map 中,则添加(这样保证取的是第一条记录)
|
||||
if (!groupedRepayments.containsKey(billno)) {
|
||||
groupedRepayments.put(billno, repayment);
|
||||
}
|
||||
}
|
||||
// 计算所有分组的 amount 合计
|
||||
for (DynamicObject repayment : groupedRepayments.values()) {
|
||||
BigDecimal amount = repayment.getBigDecimal("amount");
|
||||
if (amount != null) {
|
||||
totalAmount = totalAmount.add(amount);
|
||||
}
|
||||
}
|
||||
}
|
||||
BigDecimal shkd_amountoricur = shkdDrawamount.subtract(totalAmount);
|
||||
dataRow.set("shkd_amountoricur", shkd_amountoricur);
|
||||
dataRow.set("shkd_amountbencur", shkd_amountoricur.multiply(convertrate));
|
||||
}
|
||||
|
||||
//根据已结清标识符过滤数据
|
||||
Boolean shkd_beensettled = (Boolean)listQFilter.get("shkd_beensettled");
|
||||
if (Boolean.FALSE.equals(shkd_beensettled) || shkd_beensettled == null) {
|
||||
// 执行过滤已结清数据的逻辑
|
||||
Iterator<DynamicObject> iterator = plainDynamicObjectCollection.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
DynamicObject dataRow = iterator.next();
|
||||
BigDecimal shkd_amountoricur = dataRow.getBigDecimal("shkd_amountoricur");
|
||||
if (shkd_amountoricur == null || (shkd_amountoricur != null && shkd_amountoricur.compareTo(BigDecimal.ZERO) <= 0)) {
|
||||
iterator.remove(); // 移除已结清的数据
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 创建一个空的DataSet 将DynamicObjectCollection转化为DataSet
|
||||
Collection<Object[]> coll = new ArrayList<>();//报表展示数据
|
||||
// 遍历修改后的数据的所有字段
|
||||
List<String> displayFields = new ArrayList<>();//列标识
|
||||
DynamicObject object = plainDynamicObjectCollection.get(0);
|
||||
DataEntityPropertyCollection properties = object.getDataEntityType().getProperties();
|
||||
// 获取所有字段
|
||||
properties.forEach(property -> displayFields.add(property.getName()));
|
||||
log.info("displayFields列标识:{}", displayFields);
|
||||
for (DynamicObject dataRow : plainDynamicObjectCollection) {
|
||||
// 将数据放入数组
|
||||
Object[] objects = new Object[displayFields.size()];
|
||||
for (int i = 0; i < displayFields.size(); i++) {
|
||||
objects[i] = dataRow.get(displayFields.get(i));
|
||||
}
|
||||
coll.add(objects);
|
||||
}
|
||||
|
||||
// 创建一个空的DataSet 将DynamicObjectCollection转化为DataSet
|
||||
DataType stringType = DataType.StringType;
|
||||
DataType dateType = DataType.DateType;
|
||||
DataType bigDecimalType = DataType.BigDecimalType;
|
||||
// DataType integerType = DataType.IntegerType;
|
||||
List<DataType> dataTypes = new ArrayList<>();//列标识
|
||||
|
||||
for (String field : displayFields) {
|
||||
if (field.contains("shkd_syncdrawdate") || field.contains("shkd_bizdate")) {
|
||||
dataTypes.add(dateType);
|
||||
} else if (field.contains("shkd_drawamount") || field.contains("shkd_loanrate") || "shkd_amountoricur".equals(field) || "shkd_amountbencur".equals(field)) {
|
||||
dataTypes.add(bigDecimalType);
|
||||
} else {
|
||||
dataTypes.add(stringType);
|
||||
}
|
||||
}
|
||||
log.info("dataTypes数据类型:{}", dataTypes);
|
||||
|
||||
|
||||
RowMeta rowMeta = RowMetaFactory.createRowMeta(displayFields.toArray(new String[0]), dataTypes.toArray(new DataType[0]));
|
||||
CollectionInput inputs = new CollectionInput(rowMeta, coll);
|
||||
|
||||
try {
|
||||
addField2 = Algo.create(this.getClass().getName()).createDataSet(inputs);
|
||||
} catch (Exception e) {
|
||||
log.error("数据集创建失败:{}", e.getMessage());
|
||||
}
|
||||
|
||||
return addField2;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取报表所有过滤条件
|
||||
*
|
||||
* @param reportQueryParam
|
||||
* @return
|
||||
*/
|
||||
public HashMap<String,Object> getListQFilter(ReportQueryParam reportQueryParam) {
|
||||
//过滤条件数组
|
||||
HashMap<String, Object> filterMaps = new HashMap<>();
|
||||
//初始化过滤数据
|
||||
List<FilterItemInfo> filterItems = reportQueryParam.getFilter().getFilterItems();
|
||||
if (CollectionUtils.isNotEmpty(filterItems)) {
|
||||
for (FilterItemInfo info : filterItems) {
|
||||
filterMaps.put(info.getPropName(),info.getValue());
|
||||
}
|
||||
}
|
||||
return filterMaps;
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue