如何通过Api调用苍穹的下推方法,并保存关联关系原创
金蝶云社区-Lento
Lento
18人赞赏了该文章 5146次浏览 未经作者许可,禁止转载编辑于2023年10月31日 18:35:01

首先调用苍穹的下推方法,并获取对应的关联数据,这里面有个关键信息是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;
}


赞 18