Merge remote-tracking branch 'origin/main' into main

This commit is contained in:
陈绍鑫 2025-10-29 18:11:05 +08:00
commit 6ef97d7565
1 changed files with 240 additions and 0 deletions

View File

@ -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<Long> 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<DynamicObjectCollection> 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<Long, BigDecimal> letterCreditMap = GuaranteeContractHelper.getLetterCreditMap(gcUseBills);
Map<Long, BigDecimal> 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<Long> 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<Object[]> coll = new ArrayList<>();//报表展示数据
// 遍历修改后的数据的所有字段
List<String> 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<DataType> 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;
}
}
}