From 370548280e2c5b890007da10ebd15e90cec3afe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BE=9A=E8=B1=86=E8=B1=86?= <13356128+sunandmoon60@user.noreply.gitee.com> Date: Tue, 12 Aug 2025 11:52:29 +0800 Subject: [PATCH] =?UTF-8?q?botp=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/plugin/utils/BotpParamUtils.java | 256 ++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 lc123/cloud/app/plugin/utils/BotpParamUtils.java diff --git a/lc123/cloud/app/plugin/utils/BotpParamUtils.java b/lc123/cloud/app/plugin/utils/BotpParamUtils.java new file mode 100644 index 0000000..3415ba2 --- /dev/null +++ b/lc123/cloud/app/plugin/utils/BotpParamUtils.java @@ -0,0 +1,256 @@ +package tqq9.lc123.cloud.app.plugin.utils; + +import com.alibaba.fastjson.JSON; +import kd.bos.data.BusinessDataReader; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.LocaleString; +import kd.bos.dataentity.metadata.IDataEntityType; +import kd.bos.dataentity.resource.ResManager; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.EntityMetadataCache; +import kd.bos.entity.LinkSetElement; +import kd.bos.entity.LinkSetItemElement; +import kd.bos.entity.MainEntityType; +import kd.bos.entity.botp.LinkRecordType; +import kd.bos.entity.botp.runtime.ConvertOperationResult; +import kd.bos.entity.botp.runtime.PushArgs; +import kd.bos.entity.botp.runtime.SourceBillReport; +import kd.bos.entity.datamodel.IRefrencedataProvider; +import kd.bos.entity.datamodel.ListSelectedRow; +import kd.bos.exception.KDBizException; +import kd.bos.isv.ISVService; +import kd.bos.metadata.botp.ConvertRuleMetadata; +import kd.bos.metadata.botp.ConvertRuleTemplate; +import kd.bos.servicehelper.botp.ConvertMetaServiceHelper; +import kd.bos.servicehelper.botp.ConvertServiceHelper; + +import java.util.*; + +/** + * BOTP代码生成工具类 + */ +public class BotpParamUtils { + + public static PushArgs getPushArgs(String srcEntityNumber, String targetEntityNumber, Map param, List pkids) throws KDBizException { + return getPushArgs(srcEntityNumber, targetEntityNumber, param, pkids, ""); + } + + public static PushArgs getPushArgs(String srcEntityNumber, String targetEntityNumber, Map param, List pkids, String rule) { + PushArgs pushArgs = new PushArgs(); + pushArgs.setSourceEntityNumber(srcEntityNumber); // 必选,源单标识 + pushArgs.setTargetEntityNumber(targetEntityNumber); // 必选,目标单标识 + pushArgs.setHasRight(true); // 可选,传入true,不检查目标单新增权 + pushArgs.setAppId(""); // 可选,传入目标单验权使用的应用编码 + pushArgs.setDefOrgId(0L); // 可选,传入目标单主组织默认值 + pushArgs.setRuleId(rule); // 可选,传入本次下推使用的转换规则id;传入空值,由系统自动寻找合适的转换规则 + pushArgs.setBuildConvReport(true); // 是否输出详细错误报告 + + //传递参数 + if(param != null) { + for(Map.Entry obj : param.entrySet()) { + pushArgs.addCustomParam(obj.getKey(), JSON.toJSONString(obj.getValue())); + } + } + + //原单单据id + List selectRows = new ArrayList<>(); + for(Long pkid : pkids) { + ListSelectedRow row = new ListSelectedRow(pkid); + selectRows.add(row); + } + pushArgs.setSelectedRows(selectRows); + return pushArgs; + } + + /** + * 按分录下推 + * @param srcEntityNumber 源单标识 + * @param targetEntityNumber 目标标识 + * @param srcEntryEntity 源单分录标识 + * @param param 参数 + * @param entitypkMap 源单分录id + * @param rule 转换规则id + * @return + * @throws KDBizException + */ + public static PushArgs getPushArgs(String srcEntityNumber, String targetEntityNumber, String srcEntryEntity, + Map param, HashMap entitypkMap, String rule) throws KDBizException{ + PushArgs pushArgs = new PushArgs(); + pushArgs.setSourceEntityNumber(srcEntityNumber); // 必选,源单标识 + pushArgs.setTargetEntityNumber(targetEntityNumber); // 必选,目标单标识 + pushArgs.setHasRight(true); // 可选,传入true,不检查目标单新增权 + pushArgs.setAppId(""); // 可选,传入目标单验权使用的应用编码 + pushArgs.setDefOrgId(0L); // 可选,传入目标单主组织默认值 + pushArgs.setRuleId(rule); // 可选,传入本次下推使用的转换规则id;传入空值,由系统自动寻找合适的转换规则 + pushArgs.setBuildConvReport(true); // 是否输出详细错误报告 + + //传递参数 + if(param != null) { + for(Map.Entry obj : param.entrySet()) { + pushArgs.getCustomParams().put(obj.getKey(), obj.getValue()); + } + } + + //原单单据id + ArrayList auditResult = new ArrayList(); + for (Map.Entry entry : entitypkMap.entrySet()) { + ListSelectedRow row = new ListSelectedRow(); + row.setPrimaryKeyValue(entry.getKey()); + row.setEntryEntityKey(srcEntryEntity); + row.setEntryPrimaryKeyValue(entry.getValue()); + auditResult.add(row); } + + pushArgs.setSelectedRows(auditResult); + return pushArgs; + } + + /** + * 通过BOTP生成目标对象并返回 + * @param srcEntityNumber + * @param targetEntityNumber + * @param pkids + * @return + */ + public static List getDestObject(String srcEntityNumber, String targetEntityNumber, List pkids) throws KDBizException{ + PushArgs pushArgs = getPushArgs(srcEntityNumber,targetEntityNumber,null, pkids); + return getDestObject(pushArgs); + } + + /** + * 根据下推参数返回,目标单对象(new) + * @param pushArgs + * @return + */ + public static List getDestObject(PushArgs pushArgs){ + // 调用下推引擎,下推目标单 + ConvertOperationResult pushResult = ConvertServiceHelper.push(pushArgs); + // 判断下推是否成功,如果失败,提炼失败消息输出 + if (!pushResult.isSuccess()) { + // 错误摘要 + String errMessage = pushResult.getMessage(); + throw new KDBizException(ResManager.loadKDString("下推失败:", "SchemeEngineService_1", "node-debug-mservice_test") + errMessage); + } + + // 获取生成的目标单数据包 + MainEntityType targetMainType = EntityMetadataCache.getDataEntityType(pushArgs.getTargetEntityNumber()); + List targetBillObjs = pushResult.loadTargetDataObjects(new IRefrencedataProvider() { + @Override + public void fillReferenceData(Object[] objs, IDataEntityType dType) { + BusinessDataReader.loadRefence(objs, dType); + } + }, targetMainType); + return targetBillObjs; + } + /** + * 获取下推之后的返回结果 + * @param pushArgs + * @return + */ + public static ConvertOperationResult getPushResult(PushArgs pushArgs) throws KDBizException{ + // 调用下推引擎,下推目标单 + ConvertOperationResult pushResult = ConvertServiceHelper.push(pushArgs); + + // 判断下推是否成功,如果失败,提炼失败消息输出 + if (!pushResult.isSuccess()) { + String errMessage = pushResult.getMessage(); // 错误摘要 + for(SourceBillReport billReport : pushResult.getBillReports()) { + // 演示如何提取各单错误报告 + if (!billReport.isSuccess()) { + String billMessage = billReport.getFailMessage(); + } + } + throw new KDBizException("下推失败:" + errMessage); + } + + return pushResult; + } + + /** + * 后台下推完成,不考虑展示目标单据界面 + * @param srcEntityNumber:源单标识 + * @param targetEntityNumber:目标单表 + * @param param:参数 + * @param pkids:下推单据id + * @return + */ + public static Boolean getBotpSuccess(String srcEntityNumber, String targetEntityNumber, Map param, List pkids) throws KDBizException{ + PushArgs pushArgs = getPushArgs(srcEntityNumber, targetEntityNumber, param, pkids); + + // 调用下推引擎,下推目标单 + ConvertOperationResult pushResult = ConvertServiceHelper.push(pushArgs); + + // 判断下推是否成功,如果失败,提炼失败消息输出 + if (!pushResult.isSuccess()) { + String errMessage = pushResult.getMessage(); // 错误摘要 + for(SourceBillReport billReport : pushResult.getBillReports()) { + // 演示如何提取各单错误报告 + if (!billReport.isSuccess()) { + String billMessage = billReport.getFailMessage(); + } + } + throw new KDBizException("下推失败:" + errMessage); + } + return true; + } + + /** + * 获取指定:装换规则id + * @param srcEntityNumber:源单 + * @param targetEntityNumber:目标单 + * @param ruleName:规则名称 + * @return + */ + public static String getBotpRuleId(String srcEntityNumber,String targetEntityNumber,String ruleName) { + String ruleId = ""; + List ruleMetadatas = loadMetas(srcEntityNumber, targetEntityNumber, true); + Iterator rootRuleNode = ruleMetadatas.iterator(); + while(rootRuleNode.hasNext()) { + ConvertRuleMetadata rootNode = rootRuleNode.next(); + LocaleString name = rootNode.getRuleElement().getName(); //规则名称 + if(StringUtils.equals(name.toString(), ruleName)) { + ruleId = rootNode.getRuleElement().getId(); + } + } + return ruleId; + } + + private static ConvertRuleMetadata createBlankRule(String sourceBill, String targetBill) { + ConvertRuleTemplate template = new ConvertRuleTemplate(); + ConvertRuleMetadata newRuleMeta = template.CreateBlankRule(); + newRuleMeta.getRuleElement().setSourceEntityNumber(sourceBill); + newRuleMeta.getRuleElement().setTargetEntityNumber(targetBill); + newRuleMeta.getRuleElement().setVisibled(true); + LinkSetElement linkSet; + if(StringUtils.isNotBlank(targetBill)) { + linkSet = ConvertMetaServiceHelper.loadLinkSet(targetBill); + if(linkSet != null && linkSet.getItems().size() > 0) { + newRuleMeta.getRuleElement().getLinkEntityPolicy().setTargetEntryKey(((LinkSetItemElement)linkSet.getItems().get(0)).getParentEntityKey()); + newRuleMeta.getRuleElement().getLinkEntityPolicy().setLinkRecordType(LinkRecordType.Link); + } + } + if(StringUtils.isNotBlank(sourceBill)) { + linkSet = ConvertMetaServiceHelper.loadLinkSet(sourceBill); + if(linkSet != null && linkSet.getItems().size() > 0) { + newRuleMeta.getRuleElement().getLinkEntityPolicy().setSourceEntryKey(((LinkSetItemElement)linkSet.getItems().get(0)).getParentEntityKey()); + } + } + return newRuleMeta; + } + + private static List loadMetas(String sourceBill, String targetBill, boolean autoCreateNew) { + List ruleMetas = ConvertMetaServiceHelper.loadMetas(sourceBill, targetBill); + if(ruleMetas.isEmpty() && autoCreateNew) { + ConvertRuleMetadata newRuleMeta = createBlankRule(sourceBill, targetBill); + newRuleMeta.getRuleElement().setDefRule(true); + String currentIsv = ISVService.getISVInfo().getId(); + newRuleMeta.setIsv(currentIsv); + if(StringUtils.isNotBlank(sourceBill) && StringUtils.isNotBlank(targetBill)) { + ConvertMetaServiceHelper.save(newRuleMeta); + } + ruleMetas.add(newRuleMeta); + } + return ruleMetas; + } + + +}