Skip to content

ThingsBoard 自定义创建资产的规则节点 ​

正文、配图与代码来自原稿。逻辑与「创建设备」节点对称,面向资产实体。

1、定义 TbCreateAssetNodeConfiguration ​

java
package org.thingsboard.rule.engine.custom.createAsset;

import lombok.Data;
import org.thingsboard.rule.engine.api.NodeConfiguration;

@Data
public class TbCreateAssetNodeConfiguration
        implements NodeConfiguration<TbCreateAssetNodeConfiguration> {

    private String name;
    private String label;
    private String assetProfileId;
    private String customerId;
    private AdditionalInfo additionalInfo;

    @Override
    public TbCreateAssetNodeConfiguration defaultConfiguration() {
        TbCreateAssetNodeConfiguration configuration = new TbCreateAssetNodeConfiguration();
        configuration.setName("");
        configuration.setLabel("");
        configuration.setAssetProfileId("");
        configuration.setCustomerId("");
        configuration.setAdditionalInfo(new AdditionalInfo());
        return configuration;
    }
}

2、定义 TbCreateAssetNode ​

java
package org.thingsboard.rule.engine.custom.createAsset;

import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.rule.engine.api.*;
import org.thingsboard.rule.engine.api.util.TbNodeUtils;
import org.thingsboard.server.common.data.asset.Asset;
import org.thingsboard.server.common.data.id.AssetProfileId;
import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.plugin.ComponentType;
import org.thingsboard.server.common.msg.TbMsg;

import java.util.UUID;

import static org.thingsboard.common.util.DonAsynchron.withCallback;

@RuleNode(
        type = ComponentType.ACTION,
        name = "create asset",
        configClazz = TbCreateAssetNodeConfiguration.class,
        nodeDescription = "Create asset",
        nodeDetails = "Create asset",
        uiResources = {"static/rulenode/rulenode-core-config.js"},
        icon = "add_circle")
@Slf4j
public class TbCreateAssetNode implements TbNode {

    private TbCreateAssetNodeConfiguration config;

    @Override
    public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
        this.config = TbNodeUtils.convert(configuration, TbCreateAssetNodeConfiguration.class);
    }

    @Override
    public void onMsg(TbContext ctx, TbMsg msg) {
        try {
            withCallback(createAsset(ctx),
                    saveAsset -> ctx.tellSuccess(msg),
                    t -> ctx.tellFailure(msg, t), ctx.getDbCallbackExecutor());
        } catch (Exception e) {
            ctx.tellFailure(msg, e);
        }
    }

    private ListenableFuture<Asset> createAsset(TbContext ctx) {
        if (ObjectUtils.isEmpty(config.getName())) {
            throw new RuntimeException("资产名称不能为空");
        }
        if (ObjectUtils.isEmpty(config.getAssetProfileId())) {
            throw new RuntimeException("资产配置ID不能为空");
        }
        if (ObjectUtils.isEmpty(config.getCustomerId())) {
            config.setCustomerId("13814000-1dd2-11b2-8080-808080808080");
        }
        Asset oldAsset = ctx.getAssetService()
                .findAssetByTenantIdAndName(ctx.getTenantId(), config.getName());
        if (!ObjectUtils.isEmpty(oldAsset)) {
            oldAsset.setName(config.getName());
            oldAsset.setLabel(config.getLabel());
            oldAsset.setAssetProfileId(AssetProfileId.fromString(config.getAssetProfileId()));
            oldAsset.setAdditionalInfo(JacksonUtil.valueToTree(config.getAdditionalInfo()));
            oldAsset.setCustomerId(new CustomerId(UUID.fromString(config.getCustomerId())));
            return Futures.immediateFuture(ctx.getAssetService().saveAsset(oldAsset));
        }
        Asset asset = new Asset();
        asset.setName(config.getName());
        asset.setLabel(config.getLabel());
        asset.setTenantId(ctx.getTenantId());
        asset.setAssetProfileId(AssetProfileId.fromString(config.getAssetProfileId()));
        asset.setAdditionalInfo(JacksonUtil.valueToTree(config.getAdditionalInfo()));
        asset.setCustomerId(new CustomerId(UUID.fromString(config.getCustomerId())));
        return Futures.immediateFuture(ctx.getAssetService().saveAsset(asset));
    }
}

3、定义 AdditionalInfo ​

java
package org.thingsboard.rule.engine.custom.createAsset;

import lombok.Data;

@Data
public class AdditionalInfo {
    private String description = "";
}

4、项目结构与效果 ​

项目结构

页面效果

5、小结 ​

与 创建设备节点 相同模式:查重 → 更新或新建;assetProfileId、客户归属按环境配置。