Merge remote-tracking branch 'origin/main' into main
This commit is contained in:
		
						commit
						6ef97d7565
					
				| 
						 | 
				
			
			@ -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;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue