257 lines
11 KiB
Java
257 lines
11 KiB
Java
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;
|
||
}
|
||
|
||
|
||
}
|