如何通过Api调用苍穹的下推方法,并保存关联关系原创
金蝶云社区-Lento
Lento
20人赞赏了该文章 6,014次浏览 未经作者许可,禁止转载编辑于2023年10月31日 18:35:01
summary-icon摘要由AI智能服务提供

该段代码展示了在一个业务流程中,如何通过下推方法(push)将采购请求(digi_pr)的数据转换为采购订单(digi_po)的数据,并处理下推后的结果。代码首先创建了下推所需的参数(PushArgs),包括源单和目标单的标识、是否需要检查目标单新增权等信息。随后,调用下推引擎进行下推操作,并从缓存中获取下推后的采购订单数据。若获取到的数据只有一个对象,则将其存入Redis缓存,并转换为相应的DTO格式返回。最后,简要提及了从缓存中获取数据后替换为前端修改的数据并保存的流程。此外,还提供了两个缓存操作的辅助方法:一个用于将DynamicObject存入Redis,另一个用于从Redis获取DynamicObject。

首先调用苍穹的下推方法,并获取对应的关联数据,这里面有个关键信息是lk表的数据

@Override
public PoDTO drawPrConvertPo(DrawPrConvertPoDTO drawPrConvertPoDTO) {
    List<PrLineDTO> prLines = drawPrConvertPoDTO.getPrLines();
    // 被选中的行
    List<ListSelectedRow> selectedRows = new ArrayList<>(prLines.size());


    for (PrLineDTO prLine : prLines) {
        ListSelectedRow selectedRow = new ListSelectedRow(prLine.getPrId());
        // 设置需要下推的单据体名:按分录下推时必须设置
        selectedRow.setEntryEntityKey("digi_pr_line");
        // 设置需要下推的单据体行内码:按分录下推时必须设置
        selectedRow.setEntryPrimaryKeyValue(prLine.getPrLineId());
        selectedRows.add(selectedRow);
    }

    // 生成下推参数PushArgs
    PushArgs pushArgs = new PushArgs();
    // 必选,源单标识
    pushArgs.setSourceEntityNumber("digi_pr");
    // 必选,目标单标识
    pushArgs.setTargetEntityNumber("digi_po");
    // 可选,传入true,不检查目标单新增权
    pushArgs.setHasRight(true);
    // 可选,传入目标单验权使用的应用编码
    pushArgs.setAppId("");
    // 可选,传入目标单主组织默认值
    pushArgs.setDefOrgId(0L);
    // 可选,传入本次下推使用的转换规则id;传入空值,由系统自动寻找合适的转换规则
    pushArgs.setRuleId("");
    // 是否输出详细错误报告
    pushArgs.setBuildConvReport(true);
    // 必选,设置需要下推的源单及分录内码
    pushArgs.setSelectedRows(selectedRows);

    // 调用下推引擎,下推目标单
    ConvertOperationResult pushResult = ConvertServiceHelper.push(pushArgs);

    // 这里是因为下推之后 数据没有保存 从缓存中获取我们需要的数据 
    // 这里面会有对应的关联关系 如果你是给自己的前端用的话 关联关系你可能没有返回出去 
    // 所以在后面会做对应的缓存操作
    MainEntityType mainEntityType = EntityMetadataCache.getDataEntityType("digi_po");
    List<DynamicObject> targetDos = pushResult.loadTargetDataObjects(new IRefrencedataProvider() {
        public void fillReferenceData(Object[] paramArrayOfObject, IDataEntityType paramIDataEntityType) {
            BusinessDataServiceHelper.loadRefence(paramArrayOfObject, paramIDataEntityType);
        }
    }, mainEntityType);
    if(targetDos.size() == 1){
        // 这里是对应的缓存数据
        AlmBusinessDataServiceHelper.putDyToRedisCache(targetDos.get(0));
        // 我们自己的转换苍穹dy为对应实体方法 勿管
        return dynamicObjectToDTO(targetDos.get(0));
    }
    return null;
}

然后你后续自己的界面处理完成 之后 你首先从缓存中获取对应的数据 然后再替换为你前端修改后的数据

保存方法使用

OperationResult operationResult = SaveServiceHelper.saveOperate(EntityConstants.PO, new DynamicObject[]{po}, OperateOption.create());


顺便贴下对应的代码

/**
 * 将对应的dynamicObject放入缓存中
 *
 * @param dy 动态实体
 */
public static void putDyToRedisCache(DynamicObject dy) {
    cache.put(dy.getDataEntityType().getName() + dy.getString("id"), DynamicObjectSerializeUtil.serialize(new DynamicObject[]{dy}, dy.getDynamicObjectType()),3600);
}

/**
 * 将对应的dynamicObject放入缓存中
 *
 * @param entityName 实体标识
 * @param pkValue 主键值
 * @return DynamicObject
 */
public static DynamicObject getDyFromRedisCache(String entityName,String pkValue) {
    DynamicObject dy = BusinessDataServiceHelper.newDynamicObject(entityName);
    String value = cache.get(dy.getDataEntityType().getName() + pkValue);
    if(value == null){
        return dy;
    }
    Object[] objects = DynamicObjectSerializeUtil.deserialize(value,dy.getDynamicObjectType());
    if(objects.length == 1){
        DynamicObject dyn = (DynamicObject) objects[0];
        // 此步骤必须
        DynamicObjectUtils.copy(dyn,dy);
        return dy;
    }
    return dy;
}


图标赞 20
20人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!