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、客户归属按环境配置。
