fix:规则引擎
parent
983f29c4ea
commit
1ef0ac88a0
|
@ -0,0 +1,21 @@
|
|||
package cc.iotkit.model.rule;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 监听器和过滤器的过滤条件配置
|
||||
*
|
||||
* @author sjg
|
||||
*/
|
||||
@Data
|
||||
public class FilterConfig {
|
||||
/**
|
||||
* 条件类型
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 条件配置
|
||||
*/
|
||||
protected String config;
|
||||
}
|
|
@ -14,6 +14,7 @@ import lombok.AllArgsConstructor;
|
|||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
|
@ -33,9 +34,9 @@ public class RuleInfo implements Owned<String> {
|
|||
|
||||
private String type;
|
||||
|
||||
private List<Listener> listeners;
|
||||
private List<FilterConfig> listeners;
|
||||
|
||||
private List<Filter> filters;
|
||||
private List<FilterConfig> filters;
|
||||
|
||||
private List<RuleAction> actions;
|
||||
|
||||
|
@ -47,16 +48,15 @@ public class RuleInfo implements Owned<String> {
|
|||
|
||||
private Long createAt;
|
||||
|
||||
@Data
|
||||
public static class Listener {
|
||||
private String type;
|
||||
protected String config;
|
||||
public List<FilterConfig> getListeners() {
|
||||
return listeners == null ? new ArrayList<>() : listeners;
|
||||
}
|
||||
|
||||
@Data
|
||||
public static class Filter {
|
||||
private String type;
|
||||
protected String config;
|
||||
public List<FilterConfig> getFilters() {
|
||||
return filters == null ? new ArrayList<>() : filters;
|
||||
}
|
||||
|
||||
public List<RuleAction> getActions() {
|
||||
return actions == null ? new ArrayList<>() : actions;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,13 +44,11 @@ public class TbRuleInfo {
|
|||
@ApiModelProperty(value = "监听器")
|
||||
@AutoMapping(ignore = true)
|
||||
@ReverseAutoMapping(ignore = true)
|
||||
|
||||
private String listeners;
|
||||
|
||||
@Column(columnDefinition = "text")
|
||||
@AutoMapping(ignore = true)
|
||||
@ReverseAutoMapping(ignore = true)
|
||||
|
||||
@ApiModelProperty(value = "过滤器")
|
||||
private String filters;
|
||||
|
||||
|
@ -58,7 +56,6 @@ public class TbRuleInfo {
|
|||
@ApiModelProperty(value = "动作")
|
||||
@AutoMapping(ignore = true)
|
||||
@ReverseAutoMapping(ignore = true)
|
||||
|
||||
private String actions;
|
||||
|
||||
@ApiModelProperty(value = "用户id")
|
||||
|
|
|
@ -9,12 +9,15 @@
|
|||
*/
|
||||
package cc.iotkit.data.service;
|
||||
|
||||
import cc.iotkit.common.utils.JsonUtils;
|
||||
import cc.iotkit.common.utils.MapstructUtils;
|
||||
import cc.iotkit.data.dao.IJPACommData;
|
||||
import cc.iotkit.data.manager.IRuleInfoData;
|
||||
import cc.iotkit.data.dao.RuleInfoRepository;
|
||||
import cc.iotkit.data.model.TbRuleInfo;
|
||||
import cc.iotkit.common.api.Paging;
|
||||
import cc.iotkit.model.rule.FilterConfig;
|
||||
import cc.iotkit.model.rule.RuleAction;
|
||||
import cc.iotkit.model.rule.RuleInfo;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
@ -24,9 +27,11 @@ import org.springframework.data.domain.Pageable;
|
|||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Primary
|
||||
@Service
|
||||
|
@ -52,15 +57,16 @@ public class RuleInfoDataImpl implements IRuleInfoData, IJPACommData<RuleInfo, S
|
|||
|
||||
@Override
|
||||
public List<RuleInfo> findByUidAndType(String uid, String type) {
|
||||
return MapstructUtils.convert(ruleInfoRepository.findByUidAndType(uid, type), RuleInfo.class);
|
||||
return fromTb(ruleInfoRepository.findByUidAndType(uid, type));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Paging<RuleInfo> findByUidAndType(String uid, String type, int page, int size) {
|
||||
Page<TbRuleInfo> paged = ruleInfoRepository.findByUidAndType(uid, type,
|
||||
Pageable.ofSize(size).withPage(page - 1));
|
||||
|
||||
return new Paging<>(paged.getTotalElements(),
|
||||
MapstructUtils.convert(paged.getContent(), RuleInfo.class));
|
||||
fromTb(paged.getContent()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -68,20 +74,19 @@ public class RuleInfoDataImpl implements IRuleInfoData, IJPACommData<RuleInfo, S
|
|||
Page<TbRuleInfo> paged = ruleInfoRepository.findByType(type,
|
||||
Pageable.ofSize(size).withPage(page - 1));
|
||||
return new Paging<>(paged.getTotalElements(),
|
||||
MapstructUtils.convert(paged.getContent(), RuleInfo.class));
|
||||
fromTb(paged.getContent()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RuleInfo> findByUid(String uid) {
|
||||
return MapstructUtils.convert(ruleInfoRepository.findByUid(uid), RuleInfo.class);
|
||||
return fromTb(ruleInfoRepository.findByUid(uid));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Paging<RuleInfo> findByUid(String uid, int page, int size) {
|
||||
Page<TbRuleInfo> paged = ruleInfoRepository.findByUid(uid,
|
||||
Pageable.ofSize(size).withPage(page - 1));
|
||||
return new Paging<>(paged.getTotalElements(),
|
||||
MapstructUtils.convert(paged.getContent(), RuleInfo.class));
|
||||
return new Paging<>(paged.getTotalElements(), fromTb(paged.getContent()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -92,7 +97,7 @@ public class RuleInfoDataImpl implements IRuleInfoData, IJPACommData<RuleInfo, S
|
|||
|
||||
@Override
|
||||
public RuleInfo findById(String s) {
|
||||
return MapstructUtils.convert(ruleInfoRepository.findById(s).orElse(null), RuleInfo.class);
|
||||
return from(ruleInfoRepository.findById(s).orElse(null));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -106,9 +111,39 @@ public class RuleInfoDataImpl implements IRuleInfoData, IJPACommData<RuleInfo, S
|
|||
data.setId(UUID.randomUUID().toString());
|
||||
data.setCreateAt(System.currentTimeMillis());
|
||||
}
|
||||
ruleInfoRepository.save(MapstructUtils.convert(data, TbRuleInfo.class));
|
||||
ruleInfoRepository.save(from(data));
|
||||
return data;
|
||||
}
|
||||
|
||||
private static RuleInfo from(TbRuleInfo tb) {
|
||||
RuleInfo convert = MapstructUtils.convert(tb, RuleInfo.class);
|
||||
assert convert != null;
|
||||
convert.setActions(JsonUtils.parseArray(tb.getActions(), RuleAction.class));
|
||||
convert.setFilters(JsonUtils.parseArray(tb.getFilters(), FilterConfig.class));
|
||||
convert.setListeners(JsonUtils.parseArray(tb.getListeners(), FilterConfig.class));
|
||||
return convert;
|
||||
}
|
||||
|
||||
private static TbRuleInfo from(RuleInfo rule) {
|
||||
TbRuleInfo convert = MapstructUtils.convert(rule, TbRuleInfo.class);
|
||||
assert convert != null;
|
||||
convert.setActions(JsonUtils.toJsonString(rule.getActions()));
|
||||
convert.setFilters(JsonUtils.toJsonString(rule.getFilters()));
|
||||
convert.setListeners(JsonUtils.toJsonString(rule.getListeners()));
|
||||
return convert;
|
||||
}
|
||||
|
||||
private static List<RuleInfo> fromTb(List<TbRuleInfo> list) {
|
||||
if (list == null) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return list.stream().map(RuleInfoDataImpl::from).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private static List<TbRuleInfo> fromBo(List<RuleInfo> list) {
|
||||
if (list == null) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return list.stream().map(RuleInfoDataImpl::from).collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,7 +49,7 @@ public class RuleEngineController {
|
|||
return ruleEngineService.selectPageList(request);
|
||||
}
|
||||
|
||||
@ApiOperation("规则编辑")
|
||||
@ApiOperation("保存规则")
|
||||
@PostMapping("/edit")
|
||||
public boolean saveRule(@RequestBody @Validated Request<RuleInfoBo> ruleInfoBo) {
|
||||
return ruleEngineService.saveRule(ruleInfoBo.getData());
|
||||
|
@ -99,7 +99,7 @@ public class RuleEngineController {
|
|||
return ruleEngineService.selectTaskPageList(request);
|
||||
}
|
||||
|
||||
@ApiOperation("定时任务编辑")
|
||||
@ApiOperation("保存定时任务")
|
||||
@PostMapping("/task/save")
|
||||
public boolean saveTask(@Validated @RequestBody Request<TaskInfoBo> taskInfo) {
|
||||
return ruleEngineService.saveTask(taskInfo.getData());
|
||||
|
|
|
@ -1,30 +1,18 @@
|
|||
package cc.iotkit.manager.dto.bo.ruleinfo;
|
||||
|
||||
import cc.iotkit.common.api.BaseDto;
|
||||
import cc.iotkit.model.rule.FilterConfig;
|
||||
import cc.iotkit.model.rule.RuleAction;
|
||||
import cc.iotkit.model.rule.RuleInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import io.github.linpeilie.annotations.AutoMapping;
|
||||
import io.github.linpeilie.annotations.ReverseAutoMapping;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import cc.iotkit.common.api.BaseDto;
|
||||
import cc.iotkit.common.validate.AddGroup;
|
||||
import cc.iotkit.common.validate.EditGroup;
|
||||
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ApiModel(value = "RuleInfoBo")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
|
@ -37,10 +25,7 @@ public class RuleInfoBo extends BaseDto {
|
|||
private String id;
|
||||
|
||||
@ApiModelProperty(value = "动作")
|
||||
@Size(max = 65535, message = "动作长度不正确")
|
||||
@AutoMapping(ignore = true)
|
||||
@ReverseAutoMapping(ignore = true)
|
||||
private String actions;
|
||||
private List<RuleAction> actions;
|
||||
|
||||
@ApiModelProperty(value = "创建时间")
|
||||
private Long createAt;
|
||||
|
@ -50,16 +35,10 @@ public class RuleInfoBo extends BaseDto {
|
|||
private String desc;
|
||||
|
||||
@ApiModelProperty(value = "过滤器")
|
||||
@Size(max = 65535, message = "过滤器长度不正确")
|
||||
@AutoMapping(ignore = true)
|
||||
@ReverseAutoMapping(ignore = true)
|
||||
private String filters;
|
||||
private List<FilterConfig> filters;
|
||||
|
||||
@ApiModelProperty(value = "监听器")
|
||||
@Size(max = 65535, message = "监听器长度不正确")
|
||||
@AutoMapping(ignore = true)
|
||||
@ReverseAutoMapping(ignore = true)
|
||||
private String listeners;
|
||||
private List<FilterConfig> listeners;
|
||||
|
||||
@ApiModelProperty(value = "规则名称")
|
||||
@Size(max = 255, message = "规则名称长度不正确")
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package cc.iotkit.manager.dto.vo.ruleinfo;
|
||||
|
||||
import cc.iotkit.model.rule.FilterConfig;
|
||||
import cc.iotkit.model.rule.RuleAction;
|
||||
import cc.iotkit.model.rule.RuleInfo;
|
||||
import io.github.linpeilie.annotations.AutoMapping;
|
||||
import io.github.linpeilie.annotations.ReverseAutoMapping;
|
||||
|
@ -11,6 +13,7 @@ import lombok.ToString;
|
|||
import java.util.Date;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
|
@ -33,9 +36,7 @@ public class RuleInfoVo implements Serializable {
|
|||
|
||||
@ApiModelProperty(value = "动作")
|
||||
@ExcelProperty(value = "动作")
|
||||
@AutoMapping(ignore = true)
|
||||
@ReverseAutoMapping(ignore = true)
|
||||
private String actions;
|
||||
private List<RuleAction> actions;
|
||||
|
||||
@ApiModelProperty(value = "创建时间")
|
||||
@ExcelProperty(value = "创建时间")
|
||||
|
@ -47,15 +48,11 @@ public class RuleInfoVo implements Serializable {
|
|||
|
||||
@ApiModelProperty(value = "过滤器")
|
||||
@ExcelProperty(value = "过滤器")
|
||||
@AutoMapping(ignore = true)
|
||||
@ReverseAutoMapping(ignore = true)
|
||||
private String filters;
|
||||
private List<FilterConfig> filters;
|
||||
|
||||
@ApiModelProperty(value = "监听器")
|
||||
@ExcelProperty(value = "监听器")
|
||||
@AutoMapping(ignore = true)
|
||||
@ReverseAutoMapping(ignore = true)
|
||||
private String listeners;
|
||||
private List<FilterConfig> listeners;
|
||||
|
||||
@ApiModelProperty(value = "规则名称")
|
||||
@ExcelProperty(value = "规则名称")
|
||||
|
|
|
@ -83,7 +83,7 @@ public class RuleEngineServiceImpl implements IRuleEngineService {
|
|||
|
||||
@Override
|
||||
public boolean saveRule(RuleInfoBo ruleInfoBo) {
|
||||
RuleInfo rule = MapstructUtils.convert(ruleInfoBo, RuleInfo.class);
|
||||
RuleInfo rule = ruleInfoBo.to(RuleInfo.class);
|
||||
if (StringUtils.isBlank(rule.getId())) {
|
||||
rule.setId(UUID.randomUUID().toString());
|
||||
rule.setState(RuleInfo.STATE_STOPPED);
|
||||
|
|
|
@ -11,9 +11,11 @@ package cc.iotkit.ruleengine.rule;
|
|||
|
||||
import cc.iotkit.common.api.PageRequest;
|
||||
import cc.iotkit.common.utils.JsonUtils;
|
||||
import cc.iotkit.common.utils.StringUtils;
|
||||
import cc.iotkit.data.manager.IDeviceInfoData;
|
||||
import cc.iotkit.data.manager.IRuleInfoData;
|
||||
import cc.iotkit.common.api.Paging;
|
||||
import cc.iotkit.model.rule.FilterConfig;
|
||||
import cc.iotkit.model.rule.RuleAction;
|
||||
import cc.iotkit.model.rule.RuleInfo;
|
||||
import cc.iotkit.ruleengine.action.*;
|
||||
|
@ -76,11 +78,11 @@ public class RuleManager {
|
|||
int idx = 1;
|
||||
while (true) {
|
||||
PageRequest<RuleInfo> pageRequest = new PageRequest<>();
|
||||
pageRequest.setPageNum(idx+=1);
|
||||
pageRequest.setPageNum(idx += 1);
|
||||
pageRequest.setPageSize(100);
|
||||
Paging<RuleInfo> all = ruleInfoData.findAll(pageRequest);
|
||||
List<RuleInfo> rules = all.getRows();
|
||||
if(CollectionUtil.isEmpty(rules)){
|
||||
if (CollectionUtil.isEmpty(rules)) {
|
||||
return;
|
||||
}
|
||||
rules.forEach(rule -> {
|
||||
|
@ -120,15 +122,26 @@ public class RuleManager {
|
|||
|
||||
private Rule parseRule(RuleInfo ruleInfo) {
|
||||
List<Listener<?>> listeners = new ArrayList<>();
|
||||
for (RuleInfo.Listener listener : ruleInfo.getListeners()) {
|
||||
for (FilterConfig listener : ruleInfo.getListeners()) {
|
||||
if (StringUtils.isBlank(listener.getConfig())) {
|
||||
continue;
|
||||
}
|
||||
listeners.add(parseListener(listener.getType(), listener.getConfig()));
|
||||
}
|
||||
|
||||
List<Filter<?>> filters = new ArrayList<>();
|
||||
for (RuleInfo.Filter filter : ruleInfo.getFilters()) {
|
||||
for (FilterConfig filter : ruleInfo.getFilters()) {
|
||||
if (StringUtils.isBlank(filter.getConfig())) {
|
||||
continue;
|
||||
}
|
||||
filters.add(parseFilter(filter.getType(), filter.getConfig()));
|
||||
}
|
||||
|
||||
List<Action<?>> actions = new ArrayList<>();
|
||||
for (RuleAction action : ruleInfo.getActions()) {
|
||||
if (StringUtils.isBlank(action.getConfig())) {
|
||||
continue;
|
||||
}
|
||||
actions.add(parseAction(ruleInfo.getId(), action.getType(), action.getConfig()));
|
||||
}
|
||||
|
||||
|
|
|
@ -52,31 +52,8 @@
|
|||
<configuration>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
<encoding>utf8</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>single</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>cc.iotkit.test.mqtt.performance.ReportTest</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
<descriptorRefs>
|
||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||
</descriptorRefs>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* +----------------------------------------------------------------------
|
||||
* | Copyright (c) 奇特物联 2021-2022 All rights reserved.
|
||||
* +----------------------------------------------------------------------
|
||||
* | Licensed 未经许可不能去掉「奇特物联」相关版权
|
||||
* +----------------------------------------------------------------------
|
||||
* | Author: xw2sy@163.com
|
||||
* +----------------------------------------------------------------------
|
||||
*/
|
||||
package cc.iotkit.test.mqtt;
|
||||
|
||||
import cc.iotkit.test.mqtt.config.Mqtt;
|
||||
import cc.iotkit.test.mqtt.service.Gateway;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class Simulator {
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
|
||||
if (args.length == 0) {
|
||||
Mqtt.brokerHost = "127.0.0.1";
|
||||
// Mqtt.brokerHost = "120.76.96.206";
|
||||
} else {
|
||||
Mqtt.brokerHost = args[0];
|
||||
}
|
||||
|
||||
new Thread(() -> {
|
||||
Gateway gateway = new Gateway("hbtgIA0SuVw9lxjB", "AA:BB:CC:DD:22");
|
||||
gateway.addSubDevice("Rf4QSjbm65X45753", "ABC12300002", "S01");
|
||||
// gateway.addSubDevice("Rf4QSjbm65X45753", "ABC12300003", "S01");
|
||||
// gateway.addSubDevice("hdX3PCMcFrCYpesJ", "ABD12300001", "F01");
|
||||
// gateway.addSubDevice("hdX3PCMcFrCYpesJ", "ABD12300002", "F01");
|
||||
// gateway.addSubDevice("hdX3PCMcFrCYpesJ", "ABD12300002", "F01");
|
||||
gateway.start();
|
||||
//
|
||||
// Gateway gateway2 = new Gateway("N523nWsCiG3CAn6X", "AA:BB:CC:EE:01");
|
||||
// //插座
|
||||
// gateway2.addSubDevice("cGCrkK7Ex4FESAwe", "ABE12300001", "S1");
|
||||
// gateway2.addSubDevice("cGCrkK7Ex4FESAwe", "ABE12300002", "S1");
|
||||
// gateway2.addSubDevice("6kYp6jszrDns2yh4", "ABE12400001", "S1");
|
||||
// gateway2.addSubDevice("", "ABE12500001", "M1");
|
||||
// gateway2.start();
|
||||
}).start();
|
||||
|
||||
System.in.read();
|
||||
}
|
||||
}
|
|
@ -33,7 +33,7 @@ public class ConnectionTest {
|
|||
Mqtt.brokerHost = args[0];
|
||||
}
|
||||
|
||||
int total = 100;
|
||||
int total = 10;
|
||||
if (args.length > 1) {
|
||||
total = Integer.parseInt(args[1]);
|
||||
}
|
||||
|
|
|
@ -14,11 +14,10 @@
|
|||
</description>
|
||||
|
||||
<modules>
|
||||
<!-- <module>iot-test-mqtt</module>-->
|
||||
<module>iot-test-mqtt</module>
|
||||
<module>iot-virtual-device</module>
|
||||
</modules>
|
||||
|
||||
<artifactId>iot-test-tool</artifactId>
|
||||
|
||||
|
||||
</project>
|
Loading…
Reference in New Issue