botp工具类

This commit is contained in:
龚豆豆 2025-08-12 11:52:29 +08:00
parent cb11222a65
commit 370548280e
1 changed files with 256 additions and 0 deletions

View File

@ -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<String, Object> param, List<Long> pkids) throws KDBizException {
return getPushArgs(srcEntityNumber, targetEntityNumber, param, pkids, "");
}
public static PushArgs getPushArgs(String srcEntityNumber, String targetEntityNumber, Map<String, Object> param, List<Long> 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<String, Object> obj : param.entrySet()) {
pushArgs.addCustomParam(obj.getKey(), JSON.toJSONString(obj.getValue()));
}
}
//原单单据id
List<ListSelectedRow> 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<String, String> param, HashMap<Long,Long> 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<String, String> obj : param.entrySet()) {
pushArgs.getCustomParams().put(obj.getKey(), obj.getValue());
}
}
//原单单据id
ArrayList<ListSelectedRow> auditResult = new ArrayList<ListSelectedRow>();
for (Map.Entry<Long, Long> 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<DynamicObject> getDestObject(String srcEntityNumber, String targetEntityNumber, List<Long> pkids) throws KDBizException{
PushArgs pushArgs = getPushArgs(srcEntityNumber,targetEntityNumber,null, pkids);
return getDestObject(pushArgs);
}
/**
* 根据下推参数返回目标单对象(new)
* @param pushArgs
* @return
*/
public static List<DynamicObject> 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<DynamicObject> 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<String, Object> param, List<Long> 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<ConvertRuleMetadata> ruleMetadatas = loadMetas(srcEntityNumber, targetEntityNumber, true);
Iterator<ConvertRuleMetadata> 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<ConvertRuleMetadata> loadMetas(String sourceBill, String targetBill, boolean autoCreateNew) {
List<ConvertRuleMetadata> 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;
}
}