diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/GuaranteeContractPatchPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/GuaranteeContractPatchPlugin.java new file mode 100644 index 0000000..bceae65 --- /dev/null +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/report/GuaranteeContractPatchPlugin.java @@ -0,0 +1,240 @@ +package shkd.sys.sys.plugin.report; + +import kd.bos.algo.*; +import kd.bos.algo.input.CollectionInput; +import kd.bos.base.BaseShowParameter; +import kd.bos.bill.BillOperationStatus; +import kd.bos.bill.BillShowParameter; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection; +import kd.bos.dataentity.resource.ResManager; +import kd.bos.db.DB; +import kd.bos.db.DBRoute; +import kd.bos.entity.datamodel.AbstractFormDataModel; +import kd.bos.entity.report.AbstractReportListDataPluginExt; +import kd.bos.event.AfterQueryEvent; +import kd.bos.form.ShowType; +import kd.bos.form.events.HyperLinkClickEvent; +import kd.bos.form.plugin.AbstractFormPlugin; +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.QueryServiceHelper; +import kd.scmc.ism.common.utils.DataSetUtils; +import kd.sdk.plugin.Plugin; +import kd.tmc.fbp.common.constant.Constants; +import kd.tmc.fbp.common.enums.BillStatusEnum; +import kd.tmc.fbp.common.enums.ProductTypeEnum; +import kd.tmc.fbp.common.helper.GuaranteeUseHelper; +import kd.tmc.fbp.common.helper.TmcBusinessBaseHelper; +import kd.tmc.fbp.common.helper.TmcDataServiceHelper; +import kd.tmc.fbp.common.helper.TmcViewInputHelper; +import kd.tmc.fbp.common.util.EmptyUtil; +import kd.tmc.gm.common.helper.GuaranteeContractHelper; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; + +/** + * 动态表单插件 + */ +public class GuaranteeContractPatchPlugin extends AbstractReportListDataPluginExt{ + + private static final Log logger = LogFactory.getLog(GuaranteeContractPatchPlugin.class); + + private static final String[] gcProps = new String[]{"gcomment", "gcparty", "gsrcbillid", "gsrcbillno", "gsrcbilltype", "gdebtorg", "gdebtorgtext", "gdebtcurrency", "gdebtamount", "gdebtbalance", "gratio", "gexchrate", "gdebtstartdate", "gdebtenddate", "gcontract", "gsrcbillbizamount", "gcreditortype", "gcreditor", "gcreditortext"}; + + public void afterQuery(AfterQueryEvent event) { + DataSet dataSet = event.getDataSet(); + //1、补充查询担保额度 + StringBuilder sqlBuilder = new StringBuilder("SELECT \n" + + " a.fbillno AS guaranteedOriBillno,\n" + + " b.fentryid AS guaranteedid,\n" + + " b.fguaranteequotaid AS shkd_guaranteequotaid\n" + + "FROM \n" + + " t_gm_guarcontract AS a\n" + + " LEFT JOIN t_gm_guaranteed_entry AS b \n" + + " ON a.fid = b.fid"); + DataSet hl = DB.queryDataSet(this.getClass().getSimpleName(), DBRoute.of("fi"), sqlBuilder.toString());//系统云 + JoinDataSet join = dataSet.join(hl, JoinType.LEFT); + String[] fieldNames = dataSet.getRowMeta().getFieldNames(); + String[] fieldNames2 = hl.getRowMeta().getFieldNames(); + DataSet finish = join.on("billno", "guaranteedOriBillno").select(fieldNames, fieldNames2).finish(); + + //2、补充担保债务分录 + DataSet finish2 = null; + DataSet finishCopy = finish.copy(); + DynamicObjectCollection finishData = ORM.create().toPlainDynamicObjectCollection(finishCopy); + ArrayList billIds = new ArrayList<>(); + for (DynamicObject finishDatum : finishData) { + billIds.add(finishDatum.getLong("id")); + } + DynamicObject[] guaranteecontracts = BusinessDataServiceHelper.load("gm_guaranteecontract", + "id,billno,currency,guaranteedebt_entry.shkd_parentbillno,guaranteedebt_entry.shkd_gsrcbilltype,guaranteedebt_entry.shkd_gsrcbillno," + + "guaranteedebt_entry.shkd_gsrcbillid,guaranteedebt_entry.shkd_gcparty,guaranteedebt_entry.shkd_gdebtorgtext," + + "guaranteedebt_entry.shkd_gdebtorg,guaranteedebt_entry.shkd_gdebtcurrency,guaranteedebt_entry.shkd_gdebtamount," + + "guaranteedebt_entry.shkd_gdebtbalance,guaranteedebt_entry.shkd_gdebtstartdate,guaranteedebt_entry.shkd_gdebtenddate," + + "guaranteedebt_entry.shkd_gcomment,guaranteedebt_entry.shkd_gstatus", new QFilter("id", "in", billIds).toArray()); + if (!EmptyUtil.isEmpty(guaranteecontracts)) { + //实例化一个list,储存所有担保合同-担保债务分录 + ArrayList temps = new ArrayList<>(); + for (DynamicObject guaranteecontract : guaranteecontracts) { + DynamicObjectCollection guaranteedebt_entry = guaranteecontract.getDynamicObjectCollection("guaranteedebt_entry"); + DynamicObject entry = guaranteedebt_entry.addNew(); + QFilter gQF = new QFilter("gcontract.id", "=", guaranteecontract.getLong("id")); + gQF.and("billstatus", "=", BillStatusEnum.AUDIT.getValue()); + DynamicObjectCollection gcUseBills = QueryServiceHelper.query("gm_guaranteeuse", String.join(",", gcProps), gQF.toArray()); + if (!EmptyUtil.isEmpty(gcUseBills)) { + Map letterCreditMap = GuaranteeContractHelper.getLetterCreditMap(gcUseBills); + Map loanBillMap = GuaranteeContractHelper.getLoanBillMap(gcUseBills); + DynamicObject[] gcUseBillArr = GuaranteeUseHelper.removeExpireData((DynamicObject[])gcUseBills.toArray(new DynamicObject[gcUseBills.size()])); + DynamicObject gContractCcy = guaranteecontract.getDynamicObject("currency"); + Long gContractCcyId = (Long)gContractCcy.getPkValue(); + List creditLimitIds = new ArrayList(); + DynamicObject[] var12 = gcUseBillArr; + int var13 = gcUseBillArr.length; + + for(int var14 = 0; var14 < var13; ++var14) { + DynamicObject gcBIll = var12[var14]; + if ("cfm_creditlimit".equals(TmcBusinessBaseHelper.getBillFormId(gcBIll.getString("gsrcbilltype")))) { + creditLimitIds.add(gcBIll.getLong("gsrcbillid")); + } else { + BigDecimal debtBalance = gcBIll.getBigDecimal("gdebtbalance"); + if ("lc_lettercredit".equals(gcBIll.get("gsrcbilltype")) && EmptyUtil.isNoEmpty((BigDecimal)letterCreditMap.get(gcBIll.getLong("gsrcbillid")))) { + debtBalance = ((BigDecimal)letterCreditMap.get(gcBIll.getLong("gsrcbillid"))).multiply(gcBIll.getBigDecimal("gratio")).divide(Constants.ONE_HUNDRED, 4, RoundingMode.HALF_UP); + } else if (Arrays.asList("cfm_loanbill_b_l", "cfm_loanbill_e_l", "cfm_loanbill", "cim_invest_loanbill").contains(gcBIll.get("gsrcbilltype")) && EmptyUtil.isNoEmpty((BigDecimal)loanBillMap.get(gcBIll.getLong("gsrcbillid")))) { + debtBalance = ((BigDecimal)loanBillMap.get(gcBIll.getLong("gsrcbillid"))).multiply(gcBIll.getBigDecimal("gratio")).divide(Constants.ONE_HUNDRED, 4, RoundingMode.HALF_UP); + } + + Long debtBillOrg = gcBIll.getLong("gdebtorg"); + String debtBillOrgText = gcBIll.getString("gdebtorgtext"); + Long debtBillCcy = gcBIll.getLong("gdebtcurrency"); + if (EmptyUtil.isNoEmpty(debtBillCcy) && !gContractCcyId.equals(debtBillCcy) && debtBalance.compareTo(BigDecimal.ZERO) != 0) { + BigDecimal gExchangeRate = gcBIll.getBigDecimal("gexchrate"); + debtBalance = debtBalance.multiply(gExchangeRate); + } + + entry.set("shkd_parentbillno", guaranteecontract.get("billno")); + entry.set("shkd_gsrcbilltype", gcBIll.get("gsrcbilltype")); + entry.set("shkd_gsrcbillno", gcBIll.get("gsrcbillno")); + entry.set("shkd_gsrcbillid", gcBIll.get("gsrcbillid")); + entry.set("shkd_gcparty", EmptyUtil.isNoEmpty(gcBIll.getString("gcreditortext")) ? gcBIll.get("gcreditortext") : gcBIll.get("gcparty")); + entry.set("shkd_gdebtorg", debtBillOrg); + entry.set("shkd_gdebtorgtext", debtBillOrgText); + entry.set("shkd_gdebtcurrency", debtBillCcy); + entry.set("shkd_gdebtamount", gcBIll.get("gsrcbillbizamount")); + entry.set("shkd_gdebtbalance", debtBalance); + entry.set("shkd_gdebtstartdate", gcBIll.get("gdebtstartdate")); + entry.set("shkd_gdebtenddate", gcBIll.get("gdebtenddate")); + String billTypeEntity = this.containsEntity(gcBIll.getString("gsrcbilltype")); + if (billTypeEntity != null) { + QFilter gSrcBillIdFilter = new QFilter("id", "=", gcBIll.get("gsrcbillid")); + DynamicObject gSrcDo = TmcDataServiceHelper.loadSingle(billTypeEntity, "cfm_loanbill".equals(billTypeEntity) ? "renewalexpiredate,drawtype" : "renewalexpiredate", gSrcBillIdFilter.toArray()); + if (EmptyUtil.isNoEmpty(gSrcDo) && EmptyUtil.isNoEmpty(gSrcDo.get("renewalexpiredate"))) { + entry.set("shkd_gdebtenddate", gSrcDo.get("renewalexpiredate")); + } + + if (EmptyUtil.isNoEmpty(gSrcDo) && "cfm_loanbill".equals(billTypeEntity) && "closeout".equals(gSrcDo.getString("drawtype"))) { + debtBalance = BigDecimal.ZERO; + entry.set("shkd_gdebtbalance", debtBalance); + } + } + + entry.set("shkd_gcomment", gcBIll.get("gcomment")); + entry.set("shkd_gstatus", gcBIll.getBigDecimal("gratio").compareTo(BigDecimal.ZERO) == 0 ? "C" : (BigDecimal.ZERO.compareTo(debtBalance) != 0 ? "A" : "B")); + } + } + } + temps.add(guaranteedebt_entry); + } + //循环temps整合所有分录数据 + DynamicObjectCollection finalTemp = temps.get(0); + for (int i = 1; i < temps.size(); i++) { + finalTemp.addAll(temps.get(i)); + } + //将整合好后的finalTemp转换为dataset + finish2 = buildDataByObjCollection(finalTemp); + JoinDataSet join2 = finish.join(finish2, JoinType.LEFT); + String[] fieldNames3 = finish.getRowMeta().getFieldNames(); + String[] fieldNames4 = finish2.getRowMeta().getFieldNames(); + finish = join2.on("billno", "shkd_parentbillno").select(fieldNames3, fieldNames4).finish(); + + } + //3、注入整合后的table数据 + event.setDataSet(finish); + } + + public DataSet buildDataByObjCollection(DynamicObjectCollection finalTemp) { + DataSet finish = null; + // 创建一个空的DataSet 将DynamicObjectCollection转化为DataSet + Collection coll = new ArrayList<>();//报表展示数据 + // 遍历修改后的数据的所有字段 + List displayFields = new ArrayList<>();//列标识 + DynamicObject object = finalTemp.get(0); + DataEntityPropertyCollection properties = object.getDataEntityType().getProperties(); + // 获取所有列标识 + properties.forEach(property -> { + if (!"id".equals(property.getName())) { + displayFields.add(property.getName()); + } + }); + logger.info("displayFields列标识:{}", displayFields); + + for (DynamicObject dataRow : finalTemp) { + // 将数据放入数组 + 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构建做准备 + DataType stringType = DataType.StringType; + DataType dateType = DataType.DateType; + DataType bigDecimalType = DataType.BigDecimalType; + DataType longType = DataType.LongType; + DataType anyType = DataType.AnyType; +// DataType integerType = DataType.IntegerType; + + List dataTypes = new ArrayList<>();//列类型列表 + + for (String field : displayFields) { + if (field.contains("date")) { + dataTypes.add(dateType); + } else if (field.contains("amount") || field.contains("gdebtbalance")) { + dataTypes.add(bigDecimalType); + } else if (field.contains("gdebtcurrency")) { + dataTypes.add(anyType); + } else if (field.equals("shkd_gdebtorg") || field.contains("gsrcbillid")) { + dataTypes.add(longType); + } else { + dataTypes.add(stringType); + } + } + logger.info("dataTypes数据类型:{}", dataTypes); + + RowMeta rowMeta = RowMetaFactory.createRowMeta(displayFields.toArray(new String[0]), dataTypes.toArray(new DataType[0])); + CollectionInput inputs = new CollectionInput(rowMeta, coll); + + try { + finish = Algo.create(this.getClass().getName()).createDataSet(inputs); + } catch (Exception e) { + logger.error("数据集创建失败:{}", e.getMessage()); + } + return finish; + } + + + private String containsEntity(String gSrcBillType) { + if ("cfm_loancontractbill".equals(gSrcBillType)) { + return gSrcBillType; + } else { + return gSrcBillType != null && gSrcBillType.indexOf("_loanbill") > 0 ? "cfm_loanbill" : null; + } + } +} \ No newline at end of file