浏览代码

1、消费RocketMQ消息到判断触发执行动作的处理逻辑;2、定时规则触发逻辑;

james 6 小时之前
父节点
当前提交
a9c430e0a7
共有 30 个文件被更改,包括 1070 次插入681 次删除
  1. 17 0
      service-rule/service-rule-biz/pom.xml
  2. 21 0
      service-rule/service-rule-biz/src/main/java/com/usky/rule/controller/web/DmpProductCommandController.java
  3. 112 0
      service-rule/service-rule-biz/src/main/java/com/usky/rule/domain/DmpProductCommand.java
  4. 2 0
      service-rule/service-rule-biz/src/main/java/com/usky/rule/domain/RuleEngineDevice.java
  5. 2 2
      service-rule/service-rule-biz/src/main/java/com/usky/rule/domain/RuleEngineLog.java
  6. 1 1
      service-rule/service-rule-biz/src/main/java/com/usky/rule/jobs/CommonJob.java
  7. 100 31
      service-rule/service-rule-biz/src/main/java/com/usky/rule/jobs/ConsumptionJob.java
  8. 16 0
      service-rule/service-rule-biz/src/main/java/com/usky/rule/mapper/DmpProductCommandMapper.java
  9. 3 0
      service-rule/service-rule-biz/src/main/java/com/usky/rule/mapper/RuleEngineDeviceMapper.java
  10. 5 11
      service-rule/service-rule-biz/src/main/java/com/usky/rule/mq/RuleReportConsumer.java
  11. 0 84
      service-rule/service-rule-biz/src/main/java/com/usky/rule/mq/RuleTriggerContext.java
  12. 16 0
      service-rule/service-rule-biz/src/main/java/com/usky/rule/service/DmpProductCommandService.java
  13. 0 4
      service-rule/service-rule-biz/src/main/java/com/usky/rule/service/RuleEngineDeviceService.java
  14. 20 0
      service-rule/service-rule-biz/src/main/java/com/usky/rule/service/impl/DmpProductCommandServiceImpl.java
  15. 2 7
      service-rule/service-rule-biz/src/main/java/com/usky/rule/service/impl/RuleEngineDetailServiceImpl.java
  16. 1 20
      service-rule/service-rule-biz/src/main/java/com/usky/rule/service/impl/RuleEngineDeviceServiceImpl.java
  17. 9 41
      service-rule/service-rule-biz/src/main/java/com/usky/rule/service/impl/RuleEngineServiceImpl.java
  18. 39 28
      service-rule/service-rule-biz/src/main/java/com/usky/rule/subscribe/TriggerDeviceUtil.java
  19. 33 0
      service-rule/service-rule-biz/src/main/java/com/usky/rule/util/DateTimeUtil.java
  20. 137 0
      service-rule/service-rule-biz/src/main/java/com/usky/rule/util/HttpClientUtils.java
  21. 205 307
      service-rule/service-rule-biz/src/main/java/com/usky/rule/util/RuleEngineUtil.java
  22. 17 13
      service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/DeviceDataVO.java
  23. 1 0
      service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/RuleEngineConfigDTO.java
  24. 33 4
      service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/RuleEngineDeviceVO.java
  25. 138 45
      service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/action/AlarmEventAction.java
  26. 24 1
      service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/action/DeviceControlAction.java
  27. 82 0
      service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/log/AlarmActionLog.java
  28. 4 80
      service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/visualization/SimpleVO.java
  29. 4 2
      service-rule/service-rule-biz/src/main/resources/mapper/RuleEngineDeviceMapper.xml
  30. 26 0
      service-rule/service-rule-biz/src/main/resources/mapper/rule/DmpProductCommandMapper.xml

+ 17 - 0
service-rule/service-rule-biz/pom.xml

@@ -63,6 +63,23 @@
             <version>13.0</version>
             <scope>compile</scope>
         </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-tsdb-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-transfer-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+        <!-- FastJSON2(高性能 JSON 解析) -->
+        <dependency>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <artifactId>fastjson2</artifactId>
+            <version>2.0.48</version>
+        </dependency>
     </dependencies>
     <build>
         <finalName>${project.artifactId}</finalName>

+ 21 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/controller/web/DmpProductCommandController.java

@@ -0,0 +1,21 @@
+package com.usky.rule.controller.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 产品命令表 前端控制器
+ * </p>
+ *
+ * @author zyj
+ * @since 2026-03-20
+ */
+@Controller
+@RequestMapping("/dmpProductCommand")
+public class DmpProductCommandController {
+
+}
+

+ 112 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/domain/DmpProductCommand.java

@@ -0,0 +1,112 @@
+package com.usky.rule.domain;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 产品命令表
+ * </p>
+ *
+ * @author zyj
+ * @since 2026-03-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DmpProductCommand implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 命令编码
+     */
+    private String commandCode;
+
+    /**
+     * 命令名称
+     */
+    private String commandName;
+
+    /**
+     * 数据类型(1、状态量 2、模拟量)
+     */
+    private Integer dataType;
+
+    /**
+     * 单位
+     */
+    private String commandUnit;
+
+    /**
+     * 最大值
+     */
+    private BigDecimal maximum;
+
+    /**
+     * 最小值
+     */
+    private BigDecimal minimum;
+
+    /**
+     * 命令字典
+     */
+    private String commandDict;
+
+    /**
+     * 命令描述
+     */
+    private String commandDescribe;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标识;0:未删除,1:已删除
+     */
+    private Integer deleteFlag;
+
+    /**
+     * 创建人
+     */
+    private String createdBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createdTime;
+
+    /**
+     * 更新人
+     */
+    private String updatedBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updatedTime;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+
+}

+ 2 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/domain/RuleEngineDevice.java

@@ -13,6 +13,8 @@ import java.util.Date;
 public class RuleEngineDevice {
     private Long id;
     private String deviceId;
+    /** 设备 UUID(与 device_id 并存,上报/外部系统常以 UUID 标识设备) */
+    private String deviceUuid;
     private String identifier;
     private Long ruleEngineId;
     private Long productId;

+ 2 - 2
service-rule/service-rule-biz/src/main/java/com/usky/rule/domain/RuleEngineLog.java

@@ -16,7 +16,7 @@ public class RuleEngineLog {
     private Long ruleEngineId;
     private String ruleEngineName;
     /** 自动触发 0:否 1:是 */
-    private Integer autoTrigger;
+    private Byte autoTrigger;
     /** 触发类型 device/space/cron */
     private String triggerType;
     /** 执行动作 deviceControl/alarmEvent/workOrder */
@@ -25,7 +25,7 @@ public class RuleEngineLog {
     private String detail;
     private String content;
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private Date time;
+    private LocalDateTime time;
     private String updatedBy;
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime updateTime;

+ 1 - 1
service-rule/service-rule-biz/src/main/java/com/usky/rule/jobs/CommonJob.java

@@ -35,6 +35,6 @@ public class CommonJob implements Job {
             detail.setConstraints(new ArrayList());
         }
 
-//        this.ruleEngineUtil.performMultipleDevicesControl(ruleEngineId, true, TriggerTypeEnum.CRON.getType(), projectId, spaceId, actions, detail);
+        this.ruleEngineUtil.performMultipleDevicesControl(ruleEngineId, true, TriggerTypeEnum.CRON.getType(), projectId, spaceId, actions, detail);
     }
 }

+ 100 - 31
service-rule/service-rule-biz/src/main/java/com/usky/rule/jobs/ConsumptionJob.java

@@ -2,6 +2,10 @@ package com.usky.rule.jobs;
 
 
 import com.usky.common.security.utils.SecurityUtils;
+import com.usky.demo.RemoteTsdbProxyService;
+import com.usky.demo.domain.HistorysInnerRequestVO;
+import com.usky.demo.domain.HistorysInnerResultVO;
+import com.usky.demo.domain.MetricVO;
 import com.usky.rule.domain.RuleEngine;
 import com.usky.rule.vo.Result;
 import com.usky.rule.util.JsonUtil;
@@ -9,7 +13,6 @@ import com.usky.rule.enums.TimeTypeEnum;
 import com.usky.rule.enums.TriggerTypeEnum;
 import com.usky.rule.enums.TriggerValueTypeEnum;
 import com.usky.rule.vo.DataPointVO;
-//import com.leo.model.vo.DeviceFunctionDataVO;
 import com.usky.rule.vo.Condition;
 import com.usky.rule.vo.Expression;
 import com.usky.rule.vo.RuleEngineDetail;
@@ -26,10 +29,7 @@ import com.usky.rule.service.RuleEngineService;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import javax.annotation.Resource;
 import org.cache2k.Cache;
 import org.cache2k.CacheEntry;
@@ -37,6 +37,7 @@ import org.quartz.DisallowConcurrentExecution;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.Assert;
 import org.springframework.util.CollectionUtils;
 
@@ -48,8 +49,9 @@ public class ConsumptionJob implements Job {
     private TriggerDeviceUtil triggerDeviceUtil;
     @Resource
     private RuleEngineUtil ruleEngineUtil;
-//    @Resource
-//    private DeviceService deviceService;
+
+    @Autowired
+    private RemoteTsdbProxyService remoteTsdbProxyService;
     @Resource
     private RuleEngineService ruleEngineService;
 
@@ -93,33 +95,37 @@ public class ConsumptionJob implements Job {
                                 }
 
                                 initStartTimeAndEndTime(now, times, timeRange);
-//                                Result<DeviceFunctionDataVO> result = this.deviceService.getTimeRangeFunctionData(device.getId(), identifier, times[0], times[1]);
-//                                DeviceFunctionDataVO data = (DeviceFunctionDataVO)result.getData();
-//                                if (data == null) {
-//                                    boolConstraintExp.append(false);
-//                                } else {
-//                                    Map<String, List<DataPointVO>> values = data.getValues();
-//                                    List<DataPointVO> dataPointVOList = (List)values.get(device.getId());
-//                                    if (dataPointVOList != null && !dataPointVOList.isEmpty()) {
-//                                        DataPointVO first = (DataPointVO)dataPointVOList.get(0);
-//                                        DataPointVO last = (DataPointVO)dataPointVOList.get(dataPointVOList.size() - 1);
-//                                        BigDecimal currValue = last.getValue().subtract(first.getValue());
-//                                        boolean meetCondition = TriggerDeviceUtil.isMeetConsumptionCondition(currValue, valueCondition, expression.getX());
-//                                        if (meetCondition) {
-//                                            meetTriggerConditionList.add(triggerCondition);
-//                                            valueMap.put(identifier, currValue.toString());
-//                                        }
-//
-//                                        boolConstraintExp.append(meetCondition);
-//                                    } else {
-//                                        boolConstraintExp.append(false);
-//                                    }
-//                                }
+
+                                HistorysInnerRequestVO requestVO = new HistorysInnerRequestVO();
+                                requestVO.setDeviceuuid(Collections.singletonList(device.getDeviceUuid()));
+                                requestVO.setMetrics(Collections.singletonList(identifier));
+                                requestVO.setStartTime(times[0].toString());
+                                requestVO.setEndTime(times[1].toString());
+                                List<HistorysInnerResultVO> result = remoteTsdbProxyService.queryHistoryDeviceData(requestVO);
+                                List<DataPointVO> dataPointVOList = findDataPointsForMetric(result, device.getDeviceUuid(), identifier);
+                                if (dataPointVOList.isEmpty()) {
+                                    boolConstraintExp.append(false);
+                                } else {
+                                    DataPointVO first = dataPointVOList.get(0);
+                                    DataPointVO last = dataPointVOList.get(dataPointVOList.size() - 1);
+                                    if (first.getValue() == null || last.getValue() == null) {
+                                        boolConstraintExp.append(false);
+                                    } else {
+                                        BigDecimal currValue = last.getValue().subtract(first.getValue());
+                                        boolean meetCondition = TriggerDeviceUtil.isMeetConsumptionCondition(currValue, valueCondition, expression.getX());
+                                        if (meetCondition) {
+                                            meetTriggerConditionList.add(triggerCondition);
+                                            valueMap.put(identifier, currValue.toString());
+                                        }
+
+                                        boolConstraintExp.append(meetCondition);
+                                    }
+                                }
                             }
 
                             spaceTriggerAction = TriggerDeviceUtil.getBooleanExpressionValue(boolConstraintExp + ")");
                             if (spaceTriggerAction) {
-                                this.triggerDeviceUtil.setTriggerLog(now, ruleEngineDetailLog, device.getId(), TriggerValueTypeEnum.CONSUMPTION.getValue(), TriggerTypeEnum.DEVICE, meetTriggerConditionList, valueMap);
+                                this.triggerDeviceUtil.setTriggerLog(now, ruleEngineDetailLog, device.getId(), device.getName(), TriggerValueTypeEnum.CONSUMPTION.getValue(), TriggerTypeEnum.DEVICE, meetTriggerConditionList, valueMap);
                                 break label77;
                             }
                         }
@@ -130,7 +136,7 @@ public class ConsumptionJob implements Job {
                     List<DeviceConstraint> deviceConstraints = this.ruleEngineService.getDeviceConstraints(ruleEngineDetail.getConstraints());
                     boolean constraintAction = this.triggerDeviceUtil.meetConstraintAction(deviceConstraints, ruleEngineDetailLog);
                     if (constraintAction) {
-//                        this.ruleEngineUtil.performMultipleDevicesControl(engineId, true, TriggerTypeEnum.DEVICE.getType(), ruleEngine.getProjectId(), spaceId, actions, ruleEngineDetailLog);
+                        this.ruleEngineUtil.performMultipleDevicesControl(engineId, true, TriggerTypeEnum.DEVICE.getType(), ruleEngine.getProjectId(), spaceId, actions, ruleEngineDetailLog);
                     }
                 }
             }
@@ -179,4 +185,67 @@ public class ConsumptionJob implements Job {
             return !TriggerDeviceUtil.getBooleanExpressionValue(boolConstraintExp + "true)");
         }
     }
+
+    private static List<DataPointVO> findDataPointsForMetric(List<HistorysInnerResultVO> historyList, String deviceUuid, String metricIdentifier) {
+        if (CollectionUtils.isEmpty(historyList)) {
+            return Collections.emptyList();
+        }
+        HistorysInnerResultVO row = null;
+        for (HistorysInnerResultVO vo : historyList) {
+            if (vo != null && deviceUuid != null && deviceUuid.equals(vo.getDeviceuuid())) {
+                row = vo;
+                break;
+            }
+        }
+        if (row == null) {
+            row = historyList.get(0);
+        }
+        List<MetricVO> metrics = row.getMetrics();
+        if (CollectionUtils.isEmpty(metrics)) {
+            return Collections.emptyList();
+        }
+        for (MetricVO m : metrics) {
+            if (m != null && metricIdentifier != null && metricIdentifier.equals(m.getMetric())) {
+                return metricItemsToDataPoints(m.getMetricItems());
+            }
+        }
+        return Collections.emptyList();
+    }
+
+    private static List<DataPointVO> metricItemsToDataPoints(List<Map<String, Object>> metricItems) {
+        if (CollectionUtils.isEmpty(metricItems)) {
+            return Collections.emptyList();
+        }
+        List<DataPointVO> out = new ArrayList<>(metricItems.size());
+        for (Map<String, Object> item : metricItems) {
+            if (item == null) {
+                continue;
+            }
+            Object ts = item.get("timestamp");
+            Object val = item.get("value");
+            if (ts == null || val == null) {
+                continue;
+            }
+            BigDecimal num = toBigDecimal(val);
+            if (num == null) {
+                continue;
+            }
+            out.add(new DataPointVO(ts.toString(), num));
+        }
+        return out;
+    }
+
+    private static BigDecimal toBigDecimal(Object val) {
+        if (val instanceof BigDecimal) {
+            return (BigDecimal) val;
+        }
+        if (val instanceof Number) {
+            return BigDecimal.valueOf(((Number) val).doubleValue());
+        }
+        try {
+            return new BigDecimal(val.toString().trim());
+        } catch (Exception e) {
+            return null;
+        }
+    }
 }

+ 16 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/mapper/DmpProductCommandMapper.java

@@ -0,0 +1,16 @@
+package com.usky.rule.mapper;
+
+import com.usky.rule.domain.DmpProductCommand;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 产品命令表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2026-03-20
+ */
+public interface DmpProductCommandMapper extends CrudMapper<DmpProductCommand> {
+
+}

+ 3 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/mapper/RuleEngineDeviceMapper.java

@@ -16,4 +16,7 @@ public interface RuleEngineDeviceMapper {
     List<RuleEngineDevice> selectByRuleEngineId(@Param("ruleEngineId") Long ruleEngineId);
     /** 按设备 ID 查询关联的规则绑定(供设备上报触发使用) */
     List<RuleEngineDevice> selectByDeviceId(@Param("deviceId") String deviceId);
+
+    /** 按设备 UUID 查询关联的规则绑定 */
+    List<RuleEngineDevice> selectByDeviceUuid(@Param("deviceUuid") String deviceUuid);
 }

+ 5 - 11
service-rule/service-rule-biz/src/main/java/com/usky/rule/mq/RuleReportConsumer.java

@@ -2,6 +2,7 @@ package com.usky.rule.mq;
 
 import com.alibaba.fastjson.JSON;
 import com.usky.rule.mq.vo.DeviceReportPayload;
+import com.usky.rule.subscribe.TriggerDeviceUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
 import org.apache.rocketmq.spring.core.RocketMQListener;
@@ -20,25 +21,18 @@ import org.springframework.stereotype.Component;
 )
 public class RuleReportConsumer implements RocketMQListener<String> {
 
-    private final RuleTriggerContext ruleTriggerContext;
+    private final TriggerDeviceUtil triggerDeviceUtil;
 
     @Value("${spring.application.name:service-rule}")
     private String appName;
 
-    public RuleReportConsumer(RuleTriggerContext ruleTriggerContext) {
-        this.ruleTriggerContext = ruleTriggerContext;
+    public RuleReportConsumer(TriggerDeviceUtil triggerDeviceUtil) {
+        this.triggerDeviceUtil = triggerDeviceUtil;
     }
 
     @Override
     public void onMessage(String message) {
         log.debug("[{}] RuleReportConsumer received: {}", appName, message);
-        try {
-            DeviceReportPayload payload = JSON.parseObject(message, DeviceReportPayload.class);
-            if (payload != null) {
-                ruleTriggerContext.onDeviceReport(payload);
-            }
-        } catch (Exception e) {
-            log.error("RuleReportConsumer parse/handle error: {}", e.getMessage(), e);
-        }
+        triggerDeviceUtil.processMessage(message);
     }
 }

+ 0 - 84
service-rule/service-rule-biz/src/main/java/com/usky/rule/mq/RuleTriggerContext.java

@@ -1,84 +0,0 @@
-package com.usky.rule.mq;
-
-import com.alibaba.fastjson.JSON;
-import com.usky.rule.domain.RuleEngine;
-import com.usky.rule.domain.RuleEngineDevice;
-import com.usky.rule.domain.RuleEngineLog;
-import com.usky.rule.engine.RuleConditionEvaluator;
-import com.usky.rule.mapper.RuleEngineDeviceMapper;
-import com.usky.rule.service.RuleEngineLogService;
-import com.usky.rule.service.RuleEngineService;
-import com.usky.rule.mq.vo.DeviceReportPayload;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * 对标 MQTTUtil + SimpleContext:统一入口处理上报,再按策略/规则分发。
- * 此处为 RocketMQ 收到消息后,按 project + device + identifier 找启用规则并触发写日志。
- */
-@Slf4j
-@Service
-public class RuleTriggerContext {
-    private final RuleEngineService ruleEngineService;
-    private final RuleEngineDeviceMapper ruleEngineDeviceMapper;
-    private final RuleEngineLogService ruleEngineLogService;
-
-    public RuleTriggerContext(RuleEngineService ruleEngineService,
-                              RuleEngineDeviceMapper ruleEngineDeviceMapper,
-                              RuleEngineLogService ruleEngineLogService) {
-        this.ruleEngineService = ruleEngineService;
-        this.ruleEngineDeviceMapper = ruleEngineDeviceMapper;
-        this.ruleEngineLogService = ruleEngineLogService;
-    }
-
-    /**
-     * 处理一条设备上报(与 MyConsumer.getResource 类似:解析后交给业务)
-     */
-    public void onDeviceReport(DeviceReportPayload payload) {
-        if (payload.getProjectId() == null || payload.getDeviceId() == null || payload.getIdentifier() == null) {
-            log.warn("rule skip: missing projectId/deviceId/identifier, payload={}", JSON.toJSONString(payload));
-            return;
-        }
-        List<RuleEngineDevice> bindings = ruleEngineDeviceMapper.selectByDeviceAndIdentifier(
-                payload.getDeviceId(), payload.getIdentifier(), payload.getProductId(), null);
-        if (bindings == null || bindings.isEmpty()) {
-            return;
-        }
-        for (RuleEngineDevice binding : bindings) {
-            RuleEngine rule = ruleEngineService.getById(binding.getRuleEngineId());
-            if (rule == null || rule.getStatus() == null || rule.getStatus() != 1) {
-                continue;
-            }
-            if (!RuleConditionEvaluator.evaluate(rule.getDetail(), payload.getValue())) {
-                continue;
-            }
-            RuleEngineLog logRow = new RuleEngineLog();
-            logRow.setProjectId(rule.getProjectId());
-            logRow.setRuleEngineId(rule.getId());
-            logRow.setRuleEngineName(rule.getName());
-            logRow.setAutoTrigger(1);
-            logRow.setTriggerType("device");
-            logRow.setAction(parseAction(rule.getDetail()));
-            logRow.setDetail(rule.getDetail());
-            logRow.setContent(JSON.toJSONString(payload));
-            logRow.setTime(payload.getTs() != null ? new Date(payload.getTs()) : new Date());
-            logRow.setTenantId(rule.getTenantId());
-            ruleEngineLogService.add(logRow);
-            log.info("rule triggered ruleEngineId={} name={}", rule.getId(), rule.getName());
-        }
-    }
-
-    private String parseAction(String detailJson) {
-        try {
-            if (detailJson == null) {
-                return null;
-            }
-            return JSON.parseObject(detailJson).getString("action");
-        } catch (Exception e) {
-            return null;
-        }
-    }
-}

+ 16 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/service/DmpProductCommandService.java

@@ -0,0 +1,16 @@
+package com.usky.rule.service;
+
+import com.usky.rule.domain.DmpProductCommand;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ * 产品命令表 服务类
+ * </p>
+ *
+ * @author zyj
+ * @since 2026-03-20
+ */
+public interface DmpProductCommandService extends CrudService<DmpProductCommand> {
+
+}

+ 0 - 4
service-rule/service-rule-biz/src/main/java/com/usky/rule/service/RuleEngineDeviceService.java

@@ -8,8 +8,4 @@ import java.util.List;
  * 规则引擎设备绑定服务(对应 leo RuleEngineDeviceService,供 TriggerDeviceUtil 等使用)
  */
 public interface RuleEngineDeviceService {
-    /**
-     * 按设备 ID 查询关联的规则绑定列表
-     */
-    List<RuleEngineDeviceVO> getByDeviceId(String deviceId);
 }

+ 20 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/service/impl/DmpProductCommandServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.rule.service.impl;
+
+import com.usky.rule.domain.DmpProductCommand;
+import com.usky.rule.mapper.DmpProductCommandMapper;
+import com.usky.rule.service.DmpProductCommandService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 产品命令表 服务实现类
+ * </p>
+ *
+ * @author zyj
+ * @since 2026-03-20
+ */
+@Service
+public class DmpProductCommandServiceImpl extends AbstractCrudService<DmpProductCommandMapper, DmpProductCommand> implements DmpProductCommandService {
+
+}

+ 2 - 7
service-rule/service-rule-biz/src/main/java/com/usky/rule/service/impl/RuleEngineDetailServiceImpl.java

@@ -82,13 +82,8 @@ public class RuleEngineDetailServiceImpl implements RuleEngineDetailService {
         } else {
             List<RuleEngineAction> actions = this.ruleEngineService.getActions(ruleEngineDetail.getActions());
             if (actions != null && !actions.isEmpty()) {
-                List<RuleEngineAction> deviceControlActions = (List)actions.stream().filter((ruleEngineAction) -> ActionTypeEnum.DEVICE_CONTROL.getType().equals(ruleEngineAction.getType())).collect(Collectors.toList());
-                if (deviceControlActions.isEmpty()) {
-                    return true;
-                } else {
-                    this.ruleEngineUtil.performMultipleDevicesControl(id, false, TriggerTypeEnum.DEVICE.getType(), ruleEngine.getProjectId(), (Long)null, actions, new RuleEngineDetailLog());
-                    return true;
-                }
+                this.ruleEngineUtil.performMultipleDevicesControl(id, false, TriggerTypeEnum.DEVICE.getType(), ruleEngine.getProjectId(), (Long)null, actions, new RuleEngineDetailLog());
+                return true;
             } else {
                 return true;
             }

+ 1 - 20
service-rule/service-rule-biz/src/main/java/com/usky/rule/service/impl/RuleEngineDeviceServiceImpl.java

@@ -1,38 +1,19 @@
 package com.usky.rule.service.impl;
 
 import com.usky.rule.domain.RuleEngineDevice;
-import com.usky.rule.mapper.RuleEngineDeviceMapper;
 import com.usky.rule.service.RuleEngineDeviceService;
 import com.usky.rule.vo.RuleEngineDeviceVO;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.stream.Collectors;
 
 @Service
 public class RuleEngineDeviceServiceImpl implements RuleEngineDeviceService {
-    private final RuleEngineDeviceMapper ruleEngineDeviceMapper;
-
-    public RuleEngineDeviceServiceImpl(RuleEngineDeviceMapper ruleEngineDeviceMapper) {
-        this.ruleEngineDeviceMapper = ruleEngineDeviceMapper;
-    }
-
-    @Override
-    public List<RuleEngineDeviceVO> getByDeviceId(String deviceId) {
-//        if (deviceId == null || deviceId.trim().isEmpty()) {
-//            return List.of();
-//        }
-        List<RuleEngineDevice> list = ruleEngineDeviceMapper.selectByDeviceId(deviceId.trim());
-//        if (list == null) {
-//            return List.of();
-//        }
-        return list.stream().map(this::toVO).collect(Collectors.toList());
-    }
 
     private RuleEngineDeviceVO toVO(RuleEngineDevice e) {
         RuleEngineDeviceVO vo = new RuleEngineDeviceVO();
         vo.setId(e.getId());
         vo.setDeviceId(e.getDeviceId());
+        vo.setDeviceUuid(e.getDeviceUuid());
         vo.setIdentifier(e.getIdentifier());
         vo.setRuleEngineId(e.getRuleEngineId());
         vo.setProductId(e.getProductId() != null ? e.getProductId() : null);

+ 9 - 41
service-rule/service-rule-biz/src/main/java/com/usky/rule/service/impl/RuleEngineServiceImpl.java

@@ -59,17 +59,19 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
     private RuleEngineDeviceMapper ruleEngineDeviceMapper;
     @Autowired
     private DeviceTriggerIncludeMinuteCache deviceTriggerIncludeMinuteCache;
-    @Autowired
-    private CronTaskManager cronTaskManager;
+
+    private final CronTaskManager cronTaskManager;
     @Lazy
     @Autowired
     private RuleEngineDetailService ruleEngineDetailService;
     @Autowired
     private BaseSpaceService baseSpaceService;
 
-    public RuleEngineServiceImpl(RuleEngineCronService ruleEngineCronService, RuleEngineDeviceService ruleEngineDeviceService) {
+    public RuleEngineServiceImpl(RuleEngineCronService ruleEngineCronService, RuleEngineDeviceService ruleEngineDeviceService,
+                                 @Lazy CronTaskManager cronTaskManager) {
         this.ruleEngineCronService = ruleEngineCronService;
         this.ruleEngineDeviceService = ruleEngineDeviceService;
+        this.cronTaskManager = cronTaskManager;
     }
 
 
@@ -267,6 +269,7 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
                         RuleEngineDevice dev = new RuleEngineDevice();
                         dev.setRuleEngineId(ruleEngineId);
                         dev.setDeviceId(d.getId());
+                        dev.setDeviceUuid(d.getDeviceUuid());
                         dev.setIdentifier(conditions.getIdentifier());
                         dev.setProductId(c.getProductId());
                         dev.setCreatedBy(rule.getCreatedBy());
@@ -430,16 +433,6 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
                     throw new BizException("执行动作-动作不能为空");
                 }
 
-                for(DeviceControlAction.Functions functions : functionsList) {
-                    if (functions.getDelaySeconds() == null) {
-                        throw new BizException("执行动作-延时时间不能为空");
-                    }
-
-                    if (functions.getDelaySeconds() < 1) {
-                        throw new BizException("执行动作-延时时间不能低于1秒");
-                    }
-                }
-
                 List<SimpleVO> devices = deviceControlAction.getDevices();
                 if (CollectionUtils.isEmpty(devices)) {
                     throw new BizException("执行动作-设备不能为空");
@@ -495,6 +488,7 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
         for (RuleEngineDevice dev : ruleEngineDeviceMapper.selectByRuleEngineId(ruleEngineId)) {
             RuleEngineConfigDTO.RuleEngineDeviceItem item = new RuleEngineConfigDTO.RuleEngineDeviceItem();
             item.setDeviceId(dev.getDeviceId());
+            item.setDeviceUuid(dev.getDeviceUuid());
             item.setIdentifier(dev.getIdentifier());
             item.setProductId(dev.getProductId());
             devices.add(item);
@@ -513,18 +507,6 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
         if(!ruleEngineDetailService.manualPerformDeviceControl(ruleEngineId)){
             throw new BizException("触发未成功");
         }
-//        RuleEngineLog logRow = new RuleEngineLog();
-//        logRow.setProjectId(rule.getProjectId());
-//        logRow.setRuleEngineId(rule.getId());
-//        logRow.setRuleEngineName(rule.getName());
-//        logRow.setAutoTrigger(0);
-//        logRow.setTriggerType("manual");
-//        logRow.setAction(null);
-//        logRow.setDetail(rule.getDetail());
-//        logRow.setContent("手动触发");
-//        logRow.setTime(new Date());
-//        logRow.setTenantId(rule.getTenantId());
-//        ruleEngineLogService.add(logRow);
     }
 
     @Override
@@ -533,18 +515,6 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
         if (rule == null) {
             return;
         }
-//        RuleEngineLog logRow = new RuleEngineLog();
-//        logRow.setProjectId(rule.getProjectId());
-//        logRow.setRuleEngineId(rule.getId());
-//        logRow.setRuleEngineName(rule.getName());
-//        logRow.setAutoTrigger(1);
-//        logRow.setTriggerType("cron");
-//        logRow.setAction(null);
-//        logRow.setDetail(rule.getDetail());
-//        logRow.setContent("定时触发");
-//        logRow.setTime(new Date());
-//        logRow.setTenantId(rule.getTenantId());
-//        ruleEngineLogService.add(logRow);
     }
 
 
@@ -633,10 +603,8 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
             List<RuleEngineAction> actionList = new ArrayList();
             commonVOList.forEach((commonVO) -> {
                 if (ActionTypeEnum.ALARM_EVENT.getType().equals(commonVO.getType())) {
-//                    actionList.add(JsonUtil.toObject(JsonUtil.IGNORE_UNKNOWN_PROPERTIES_JSON_MAPPER, commonVO.getDetail(), AlarmEventAction.class));
-                } else if (ActionTypeEnum.WORK_ORDER.getType().equals(commonVO.getType())) {
-//                    actionList.add(JsonUtil.toObject(JsonUtil.IGNORE_UNKNOWN_PROPERTIES_JSON_MAPPER, commonVO.getDetail(), WorkOrderAction.class));
-                } else if (ActionTypeEnum.DEVICE_CONTROL.getType().equals(commonVO.getType())) {
+                    actionList.add(JsonUtil.toObject(JsonUtil.IGNORE_UNKNOWN_PROPERTIES_JSON_MAPPER, commonVO.getDetail(), AlarmEventAction.class));
+                }  else if (ActionTypeEnum.DEVICE_CONTROL.getType().equals(commonVO.getType())) {
                     actionList.add(JsonUtil.toObject(JsonUtil.IGNORE_UNKNOWN_PROPERTIES_JSON_MAPPER, commonVO.getDetail(), DeviceControlAction.class));
                 }
 

+ 39 - 28
service-rule/service-rule-biz/src/main/java/com/usky/rule/subscribe/TriggerDeviceUtil.java

@@ -1,6 +1,10 @@
 package com.usky.rule.subscribe;
 
-import com.usky.rule.constant.DateTimeConstants;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.usky.common.core.util.JsonUtils;
+import com.usky.rule.domain.RuleEngineDevice;
+import com.usky.rule.mapper.RuleEngineDeviceMapper;
 import com.usky.rule.util.DateTimeUtil;
 import com.usky.rule.util.JsonUtil;
 import com.usky.rule.domain.RuleEngine;
@@ -22,7 +26,6 @@ import com.usky.rule.cache.DeviceTriggerIncludeMinuteCache;
 import com.usky.rule.util.RuleEngineCallBack;
 import com.usky.rule.util.RuleEngineUtil;
 import com.usky.rule.vo.ConditionExpression;
-import com.usky.rule.vo.DeviceDataVO;
 //import com.leo.service.device.DeviceFunctionService;
 //import com.leo.service.device.DeviceService;
 import com.usky.rule.service.RuleEngineDeviceService;
@@ -39,32 +42,43 @@ import java.util.stream.Collectors;
 
 import com.usky.rule.vo.log.BaseLog;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.expression.ExpressionParser;
 import org.springframework.expression.spel.standard.SpelExpressionParser;
 import org.springframework.stereotype.Component;
 
 @Component
 public class TriggerDeviceUtil {
-    private RuleEngineDeviceService ruleEngineDeviceService;
     private RuleEngineService ruleEngineService;
-//    private DeviceFunctionService deviceFunctionService;
     private RuleEngineUtil ruleEngineUtil;
     private DeviceTriggerIncludeMinuteCache historyRecordCache;
-//    private DeviceService deviceService;
+    @Autowired
+    private RuleEngineDeviceMapper ruleEngineDeviceMapper;
     private static final Integer maxNumberOfReminders = 1;
     private static final ExpressionParser parser = new SpelExpressionParser();
 
     public void processMessage(String message) {
         LocalDateTime now = LocalDateTime.now();
-        DeviceDataVO deviceDataVO = (DeviceDataVO)JsonUtil.toObject(JsonUtil.IGNORE_UNKNOWN_PROPERTIES_JSON_MAPPER, message, DeviceDataVO.class);
-        String deviceId = deviceDataVO.getDeviceId();
-        LocalDateTime currDataTime = DateTimeUtil.parse(deviceDataVO.getAcqTime(), DateTimeConstants.SIMPLE_DATE_TIME_FORMATTER);
-        Map<String, String> valueMap = deviceDataVO.getFunctions();
-        List<RuleEngineDeviceVO> ruleEngineDeviceVOList = this.ruleEngineDeviceService.getByDeviceId(deviceId);
+
+        Map<String, String> valueMap = new HashMap<>();
+        Map map_data = JsonUtils.fromJson(message, Map.class);
+        String deviceUuId = map_data.get("deviceUUId").toString();
+
+        Object met = JSONObject.toJSONString(map_data.get("metrics"));
+        JSONObject metrics = JSON.parseObject(met.toString());
+        for(String entry : metrics.keySet()){
+            valueMap.put(entry.toLowerCase(),metrics.get(entry).toString());
+        }
+
+
+        final LocalDateTime currDataTime = Optional.ofNullable(DateTimeUtil.parseMessageTimestamp(map_data.get("timestamp")))
+                .orElse(LocalDateTime.now());
+        List<RuleEngineDevice> ruleEngineDeviceVOList = ruleEngineDeviceMapper.selectByDeviceUuid(deviceUuId);
         if (!ruleEngineDeviceVOList.isEmpty()) {
             ruleEngineDeviceVOList.forEach((ruleEngineDeviceVO) -> {
                 Long ruleEngineId = ruleEngineDeviceVO.getRuleEngineId();
                 Long productId = ruleEngineDeviceVO.getProductId();
+                String deviceId = ruleEngineDeviceVO.getDeviceId();
                 RuleEngine ruleEngine = (RuleEngine)this.ruleEngineService.getById(ruleEngineId);
                 if (ruleEngine != null && ruleEngine.getStatus() != 0) {
                     if (!StringUtils.isBlank(ruleEngine.getDetail())) {
@@ -73,20 +87,20 @@ public class TriggerDeviceUtil {
                         if (!actions.isEmpty()) {
                             List<DeviceTrigger> deviceTriggers = this.ruleEngineService.getDeviceTriggers(ruleEngineDetail.getTriggers());
                             if (deviceTriggers != null) {
-                                deviceTriggers = (List)deviceTriggers.stream().filter((deviceTrigger) -> deviceTrigger.getMethod().equals("acq")).filter((deviceTrigger) -> deviceTrigger.getProductId().equals(productId)).filter((deviceTrigger) -> deviceTrigger.getDevices().stream().anyMatch((device) -> device.getId().equals(deviceId))).collect(Collectors.toList());
+                                deviceTriggers = (List)deviceTriggers.stream().filter((deviceTrigger) -> deviceTrigger.getMethod().equals("acq")).filter((deviceTrigger) -> deviceTrigger.getProductId().equals(productId)).filter((deviceTrigger) -> deviceTrigger.getDevices().stream().anyMatch((device) -> StringUtils.equals(device.getId(), deviceId) || StringUtils.isNotBlank(deviceUuId) && StringUtils.equals(device.getDeviceUuid(), deviceUuId))).collect(Collectors.toList());
                                 if (!deviceTriggers.isEmpty()) {
                                     RuleEngineDetailLog ruleEngineDetailLog = new RuleEngineDetailLog();
                                     List<Condition> meetTriggerConditionList = new ArrayList();
                                     Map<String, String> meetMinuteExpressionMap = new HashMap();
                                     boolean triggerAction = this.meetDeviceAcqTriggerAction(ruleEngineId, deviceId, currDataTime, valueMap, deviceTriggers, meetMinuteExpressionMap, meetTriggerConditionList);
                                     if (triggerAction) {
-                                        this.setTriggerLog(now, ruleEngineDetailLog, deviceId, TriggerValueTypeEnum.ACQ.getValue(), TriggerTypeEnum.DEVICE, meetTriggerConditionList, valueMap);
+                                        this.setTriggerLog(now, ruleEngineDetailLog, deviceId, null, TriggerValueTypeEnum.ACQ.getValue(), TriggerTypeEnum.DEVICE, meetTriggerConditionList, valueMap);
                                         List<DeviceConstraint> deviceConstraints = this.ruleEngineService.getDeviceConstraints(ruleEngineDetail.getConstraints());
-//                                        boolean constraintAction = this.meetConstraintAction(deviceConstraints, ruleEngineDetailLog);
-//                                        if (constraintAction) {
-//                                            this.ruleEngineUtil.performMultipleDevicesControl(ruleEngineId, true, TriggerTypeEnum.DEVICE.getType(), ruleEngine.getProjectId(), ruleEngine.getSpaceId(), actions, ruleEngineDetailLog);
-//                                            this.clearMeetConditionCache(ruleEngineId, deviceId, meetMinuteExpressionMap);
-//                                        }
+                                        boolean constraintAction = this.meetConstraintAction(deviceConstraints, ruleEngineDetailLog);
+                                        if (constraintAction) {
+                                            this.ruleEngineUtil.performMultipleDevicesControl(ruleEngineId, true, TriggerTypeEnum.DEVICE.getType(), ruleEngine.getProjectId(), ruleEngine.getSpaceId(), actions, ruleEngineDetailLog);
+                                            this.clearMeetConditionCache(ruleEngineId, deviceId, meetMinuteExpressionMap);
+                                        }
                                     }
 
                                 }
@@ -100,15 +114,15 @@ public class TriggerDeviceUtil {
 
     private void clearMeetConditionCache(Long ruleEngineId, String deviceId, Map<String, String> meetMinuteExpressionMap) {
         if (meetMinuteExpressionMap != null) {
-//            meetMinuteExpressionMap.forEach((identifier, exp) -> this.historyRecordCache.removeCondition(ruleEngineId, deviceId, identifier, exp));
+            meetMinuteExpressionMap.forEach((identifier, exp) -> this.historyRecordCache.removeCondition(ruleEngineId, deviceId, identifier, exp));
         }
 
     }
 
-    public void setTriggerLog(LocalDateTime now, RuleEngineDetailLog ruleEngineDetailLog, String deviceId, String method, TriggerTypeEnum triggerTypeEnum, List<Condition> meetTriggerConditionList, Map<String, String> valueMap) {
+    public void setTriggerLog(LocalDateTime now, RuleEngineDetailLog ruleEngineDetailLog, String deviceId, String deviceName, String method, TriggerTypeEnum triggerTypeEnum, List<Condition> meetTriggerConditionList, Map<String, String> valueMap) {
         DeviceTriggerLog deviceTriggerLog = new DeviceTriggerLog();
         deviceTriggerLog.setId(deviceId);
-//        deviceTriggerLog.setName(this.deviceService.getName(deviceId));
+        deviceTriggerLog.setName(deviceName);
         deviceTriggerLog.setMethod(method);
         deviceTriggerLog.setTime(DateTimeUtil.format(now));
         deviceTriggerLog.setConditions(meetTriggerConditionList);
@@ -444,12 +458,9 @@ public class TriggerDeviceUtil {
         return conditionExpression;
     }
 
-//    public TriggerDeviceUtil(final RuleEngineDeviceService ruleEngineDeviceService, final RuleEngineService ruleEngineService, final DeviceFunctionService deviceFunctionService, final RuleEngineUtil ruleEngineUtil, final DeviceTriggerIncludeMinuteCache historyRecordCache, final DeviceService deviceService) {
-//        this.ruleEngineDeviceService = ruleEngineDeviceService;
-//        this.ruleEngineService = ruleEngineService;
-//        this.deviceFunctionService = deviceFunctionService;
-//        this.ruleEngineUtil = ruleEngineUtil;
-//        this.historyRecordCache = historyRecordCache;
-//        this.deviceService = deviceService;
-//    }
+    public TriggerDeviceUtil(final RuleEngineService ruleEngineService, final RuleEngineUtil ruleEngineUtil, final DeviceTriggerIncludeMinuteCache historyRecordCache) {
+        this.ruleEngineService = ruleEngineService;
+        this.ruleEngineUtil = ruleEngineUtil;
+        this.historyRecordCache = historyRecordCache;
+    }
 }

+ 33 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/util/DateTimeUtil.java

@@ -44,6 +44,39 @@ public class DateTimeUtil {
         return Util.isNotBlank(dateTime) ? LocalDateTime.parse(dateTime, formatter) : null;
     }
 
+    /**
+     * 将 Unix 时间戳转为东八区 {@link LocalDateTime}。
+     * 小于 1e12 的数值按「秒」理解,否则按「毫秒」(兼容 10 位秒级与 13 位毫秒级)。
+     */
+    public static LocalDateTime fromEpochMillisOrSeconds(long epoch) {
+        long millis = epoch < 1_000_000_000_000L ? epoch * 1000L : epoch;
+        return LocalDateTime.ofInstant(Instant.ofEpochMilli(millis), getZoneId());
+    }
+
+    /**
+     * 解析 MQ/设备上报中的时间字段:支持 Number 或纯数字字符串(秒/毫秒时间戳),
+     * 也兼容原有 {@link DateTimeConstants#SIMPLE_DATE_TIME_FORMATTER}、{@link DateTimeConstants#DATE_TIME_FORMATTER} 字符串。
+     */
+    public static LocalDateTime parseMessageTimestamp(Object raw) {
+        if (raw == null) {
+            return null;
+        }
+        if (raw instanceof Number) {
+            return fromEpochMillisOrSeconds(((Number) raw).longValue());
+        }
+        String s = raw.toString().trim();
+        if (!Util.isNotBlank(s)) {
+            return null;
+        }
+        if (s.chars().allMatch(Character::isDigit)) {
+            if (s.length() == 14 && RegExpConstants.SIMPLE_DATE_TIME_PATTERN.matcher(s).matches()) {
+                return parse(s, DateTimeConstants.SIMPLE_DATE_TIME_FORMATTER);
+            }
+            return fromEpochMillisOrSeconds(Long.parseLong(s));
+        }
+        return parse(s, DateTimeConstants.DATE_TIME_FORMATTER);
+    }
+
     public static long toEpochMilli(LocalDateTime dateTime) {
         if (dateTime == null) {
             throw new IllegalArgumentException("dateTime is null");

+ 137 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/util/HttpClientUtils.java

@@ -0,0 +1,137 @@
+package com.usky.rule.util;
+
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ 1. 跨域请求工具类
+ */
+public class HttpClientUtils {
+
+    public static String doGet(String url, Map<String, String> param) {
+
+        // 创建Httpclient对象
+        CloseableHttpClient httpclient = HttpClients.createDefault();
+
+        String resultString = "";
+        CloseableHttpResponse response = null;
+        try {
+            // 创建uri
+            URIBuilder builder = new URIBuilder(url);
+            if (param != null) {
+                for (String key : param.keySet()) {
+                    builder.addParameter(key, param.get(key));
+                }
+            }
+            URI uri = builder.build();
+
+            // 创建http GET请求
+            HttpGet httpGet = new HttpGet(uri);
+
+            // 执行请求
+            response = httpclient.execute(httpGet);
+            // 判断返回状态是否为200
+            if (response.getStatusLine().getStatusCode() == 200) {
+                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                httpclient.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return resultString;
+    }
+
+    public static String doGet(String url) {
+        return doGet(url, null);
+    }
+
+    public static String doPost(String url, Map<String, Object> param) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            httpPost.setHeader("Content-Type", "charset=utf-8");
+            // 创建参数列表
+            if (param != null) {
+                List<NameValuePair> paramList = new ArrayList<>();
+                for (String key : param.keySet()) {
+                    paramList.add(new BasicNameValuePair(key, param.get(key).toString()));
+                }
+                // 模拟表单
+                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
+                httpPost.setEntity(entity);
+            }
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+
+    public static String doPost(String url) {
+        return doPost(url, null);
+    }
+
+    public static String doPostJson(String url, String json) {
+        // 创建Httpclient对象
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String resultString = "";
+        try {
+            // 创建Http Post请求
+            HttpPost httpPost = new HttpPost(url);
+            // 创建请求内容
+            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
+            httpPost.setEntity(entity);
+            // 执行http请求
+            response = httpClient.execute(httpPost);
+            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                response.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return resultString;
+    }
+}

+ 205 - 307
service-rule/service-rule-biz/src/main/java/com/usky/rule/util/RuleEngineUtil.java

@@ -1,74 +1,33 @@
 package com.usky.rule.util;
 
-//import com.fasterxml.jackson.core.type.TypeReference;
-//import com.usky.rule.vo.Result;
-//import com.leo.common.context.UserContext;
-//import com.usky.rule.util.DateTimeUtil;
-//import com.usky.rule.util.JsonUtil;
-//import com.leo.common.util.SnowflakeIdGenerator;
-//import com.leo.dao.po.AlarmEvent;
-//import com.leo.dao.po.Message;
-//import com.leo.dao.po.RuleEngineLog;
-//import com.leo.dao.po.Space;
-//import com.leo.dao.po.UserMessage;
-//import com.leo.dao.po.WorkOrder;
-//import com.leo.dao.po.WorkOrderStatusRecord;
-//import com.leo.model.dto.GatewayControlParamsDTO;
-//import com.usky.rule.enums.ActionTypeEnum;
-//import com.usky.rule.enums.AlarmEventStatusEnum;
-//import com.usky.rule.enums.WorkOrderStatusEnum;
-//import com.leo.model.vo.ruleEngine.action.AlarmEventAction;
-//import com.usky.rule.vo.action.DeviceControlAction;
-//import com.usky.rule.vo.action.RuleEngineAction;
-//import com.leo.model.vo.ruleEngine.log.vo.AlarmActionLog;
-//import com.leo.model.vo.ruleEngine.log.vo.AlarmEventLog;
-//import com.usky.rule.vo.log.BaseLog;
-//import com.usky.rule.vo.log.Control;
-//import com.usky.rule.vo.log.ControlAction;
-//import com.usky.rule.vo.log.DeviceControlResult;
-//import com.usky.rule.vo.log.RuleEngineDetailLog;
-//import com.usky.rule.vo.visualization.SimpleVO;
-//import com.usky.rule.listeners.CommonListener;
-//import com.leo.service.alarm.AlarmEventService;
-//import com.leo.service.device.DeviceFunctionService;
-//import com.leo.service.device.DeviceService;
-//import com.leo.service.device.GatewayService;
-//import com.leo.service.message.MessageService;
-//import com.leo.service.message.UserMessageService;
-//import com.leo.service.product.ProductTemplateFunctionValueService;
-//import com.usky.rule.service.RuleEngineLogService;
-//import com.usky.rule.service.RuleEngineService;
-//import com.usky.rule.service.BaseSpaceService;
-//import com.leo.service.workOrder.WorkOrderService;
-//import com.leo.service.workOrder.WorkOrderStatusRecordService;
-import java.time.LocalDateTime;
-import java.time.Year;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.rule.domain.DmpProductCommand;
 import com.usky.rule.domain.RuleEngineLog;
+import com.usky.rule.service.*;
 import com.usky.rule.enums.ActionTypeEnum;
-import com.usky.rule.listeners.CommonListener;
-import com.usky.rule.service.BaseSpaceService;
-import com.usky.rule.service.RuleEngineLogService;
-import com.usky.rule.service.RuleEngineService;
-import com.usky.rule.vo.Result;
 import com.usky.rule.vo.action.AlarmEventAction;
 import com.usky.rule.vo.action.DeviceControlAction;
 import com.usky.rule.vo.action.RuleEngineAction;
-import com.usky.rule.vo.log.BaseLog;
-import com.usky.rule.vo.log.ControlAction;
-import com.usky.rule.vo.log.DeviceControlResult;
-import com.usky.rule.vo.log.RuleEngineDetailLog;
+import com.usky.rule.vo.log.*;
 import com.usky.rule.vo.visualization.SimpleVO;
+import com.usky.rule.listeners.CommonListener;
+import java.time.LocalDateTime;
+import java.time.Year;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+import com.usky.rule.vo.Result;
+import com.usky.transfer.RemoteTransferService;
 import org.apache.commons.lang3.StringUtils;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 @Component
@@ -76,15 +35,13 @@ public class RuleEngineUtil {
     private static final Logger LOGGER = LoggerFactory.getLogger(CommonListener.class);
     private RuleEngineLogService ruleEngineLogService;
     private RuleEngineService ruleEngineService;
-//    private GatewayService gatewayService;
-//    private BaseSpaceService spaceService;
-//    private DeviceFunctionService deviceFunctionService;
-//    private DeviceService deviceService;
-//    private AlarmEventService alarmEventService;
-//    private MessageService messageService;
-//    private UserMessageService userMessageService;
-//    private WorkOrderStatusRecordService workOrderStatusRecordService;
-//    private ProductTemplateFunctionValueService productTemplateFunctionValueService;
+    @Autowired
+    private RemoteTransferService remoteTransferService;
+    @Autowired
+    private DmpProductCommandService dmpProductCommandService;
+
+    @Value("${alarm.url}")
+    private String alarmUrl;
 
     public static String getJobGroup(Long ruleEngineId) {
         return "trigger-" + ruleEngineId;
@@ -98,248 +55,189 @@ public class RuleEngineUtil {
         List<BaseLog> baseLogs = new ArrayList();
         ruleEngineDetail.setActions(baseLogs);
         LocalDateTime now = LocalDateTime.now();
-        Set<String> deviceActionTypes = new HashSet(3);
+        Set<String> deviceActionTypes = new HashSet(2);
         String ruleEngineName = this.ruleEngineService.getName(ruleEngineId);
 
-//        for(RuleEngineAction ruleEngineAction : actionList) {
-//            if (ActionTypeEnum.DEVICE_CONTROL.getType().equals(ruleEngineAction.getType())) {
-//                DeviceControlAction deviceControlAction = (DeviceControlAction)ruleEngineAction;
-//                deviceActionTypes.add("deviceControl");
-//                BaseLog baseLog = new BaseLog();
-//                baseLog.setType(ActionTypeEnum.DEVICE_CONTROL.getType());
-//                ControlAction controlAction = new ControlAction();
-//                this.performSingleDeviceControl(deviceControlAction, controlAction, now);
-//                baseLog.setDetail(controlAction);
-//                baseLogs.add(baseLog);
-//            } else if (ActionTypeEnum.ALARM_EVENT.getType().equals(ruleEngineAction.getType())) {
-//                this.generateAlarmEvent(ruleEngineId, ruleEngineName, projectId, spaceId, Collections.singletonList(ruleEngineAction), ruleEngineDetail);
-//                deviceActionTypes.add("alarmEvent");
-//                BaseLog baseLog = new BaseLog();
-//                baseLog.setType(ActionTypeEnum.ALARM_EVENT.getType());
-//                baseLog.setDetail(getAlarmActionLog(now, (AlarmEventAction)ruleEngineAction));
-//                baseLogs.add(baseLog);
-//            } else if (ActionTypeEnum.WORK_ORDER.getType().equals(ruleEngineAction.getType())) {
-//                this.generateWorkOrder(ruleEngineId, ruleEngineName, projectId, spaceId, Collections.singletonList(ruleEngineAction), ruleEngineDetail);
-//                deviceActionTypes.add("workOrder");
-//                BaseLog baseLog = new BaseLog();
-//                baseLog.setType(ActionTypeEnum.WORK_ORDER.getType());
-//                baseLog.setDetail(getAlarmActionLog(now, (AlarmEventAction)ruleEngineAction));
-//                baseLogs.add(baseLog);
-//            }
-//
-//            RuleEngineLog ruleEngineLog = new RuleEngineLog();
-//            ruleEngineLog.setDetail(JsonUtil.toJson(ruleEngineDetail));
-//            ruleEngineLog.setRuleEngineId(ruleEngineId);
-//            ruleEngineLog.setRuleEngineName(ruleEngineName);
-//            ruleEngineLog.setAutoTrigger((byte)(isAuto ? 1 : 0));
-//            ruleEngineLog.setProjectId(projectId);
-//            ruleEngineLog.setAction(String.join(",", deviceActionTypes));
-//            ruleEngineLog.setTriggerType(triggerType);
-//            ruleEngineLog.setUpdateTime(now);
-//            ruleEngineLog.setCreateTime(now);
-//            ruleEngineLog.setCreatedBy(1L);
-//            ruleEngineLog.setUpdatedBy(1L);
-//            ruleEngineLog.setTime(now);
-//            this.ruleEngineLogService.save(ruleEngineLog);
-//        }
+        for(RuleEngineAction ruleEngineAction : actionList) {
+            if (ActionTypeEnum.DEVICE_CONTROL.getType().equals(ruleEngineAction.getType())) {
+                DeviceControlAction deviceControlAction = (DeviceControlAction)ruleEngineAction;
+                deviceActionTypes.add("deviceControl");
+                BaseLog baseLog = new BaseLog();
+                baseLog.setType(ActionTypeEnum.DEVICE_CONTROL.getType());
+                ControlAction controlAction = new ControlAction();
+                this.performSingleDeviceControl(deviceControlAction, controlAction, now);
+                baseLog.setDetail(controlAction);
+                baseLogs.add(baseLog);
+            } else if (ActionTypeEnum.ALARM_EVENT.getType().equals(ruleEngineAction.getType())) {
+                this.generateAlarmEvent(ruleEngineId, ruleEngineName, projectId, spaceId, Collections.singletonList(ruleEngineAction));
+                deviceActionTypes.add("alarmEvent");
+                BaseLog baseLog = new BaseLog();
+                baseLog.setType(ActionTypeEnum.ALARM_EVENT.getType());
+                baseLog.setDetail(getAlarmActionLog(now, (AlarmEventAction)ruleEngineAction));
+                baseLogs.add(baseLog);
+            }
+
+            RuleEngineLog ruleEngineLog = new RuleEngineLog();
+            ruleEngineLog.setDetail(JsonUtil.toJson(ruleEngineDetail));
+            ruleEngineLog.setRuleEngineId(ruleEngineId);
+            ruleEngineLog.setRuleEngineName(ruleEngineName);
+            ruleEngineLog.setAutoTrigger((byte) (isAuto ? 1 : 0));
+            ruleEngineLog.setProjectId(projectId);
+            ruleEngineLog.setAction(String.join(",", deviceActionTypes));
+            ruleEngineLog.setTriggerType(triggerType);
+            ruleEngineLog.setUpdateTime(now);
+            ruleEngineLog.setCreateTime(now);
+            ruleEngineLog.setCreatedBy(SecurityUtils.getUsername());
+            ruleEngineLog.setUpdatedBy(SecurityUtils.getUsername());
+            ruleEngineLog.setTime(now);
+            this.ruleEngineLogService.save(ruleEngineLog);
+        }
+
+    }
 
+    @NotNull
+    private static AlarmActionLog getAlarmActionLog(LocalDateTime now, AlarmEventAction ruleEngineAction) {
+        AlarmActionLog alarmActionLog = new AlarmActionLog();
+        List<AlarmEventAction> alarmEventLogs = new ArrayList();
+        alarmActionLog.setAlarms(alarmEventLogs);
+        alarmActionLog.setTime(DateTimeUtil.format(now));
+        alarmEventLogs.add(ruleEngineAction);
+        return alarmActionLog;
     }
 
-//    @NotNull
-//    private static AlarmActionLog getAlarmActionLog(LocalDateTime now, AlarmEventAction ruleEngineAction) {
-//        AlarmActionLog alarmActionLog = new AlarmActionLog();
-//        List<AlarmEventLog> alarmEventLogs = new ArrayList();
-//        alarmActionLog.setAlarms(alarmEventLogs);
-//        alarmActionLog.setTime(DateTimeUtil.format(now));
-//        AlarmEventLog alarmEventLog = new AlarmEventLog();
-//        alarmEventLog.setNotifiers(ruleEngineAction.getNotifiers());
-//        alarmEventLog.setLevel(ruleEngineAction.getLevel());
-//        alarmEventLog.setMethod(ruleEngineAction.getMethod());
-//        alarmEventLogs.add(alarmEventLog);
-//        return alarmActionLog;
-//    }
-//
-//    public void generateAlarmEvent(Long ruleEngineId, String ruleEngineName, Long projectId, Long spaceId, List<RuleEngineAction> actions, RuleEngineDetailLog ruleEngineDetail) {
-//        List<AlarmEvent> events = new ArrayList();
-//        actions.forEach((action) -> {
-//            AlarmEventAction alarmEventAction = (AlarmEventAction)action;
-//            String alarmContent = this.ruleEngineLogService.getAlarmContent(ruleEngineDetail);
-//            AlarmEvent alarmEvent = new AlarmEvent();
-//            Short level = Short.parseShort(alarmEventAction.getLevel());
-//            assignValueForAlarmEvent(ruleEngineId, projectId, spaceId, level, alarmEvent);
-//            Space space = (Space)this.spaceService.getById(spaceId);
-//            alarmEvent.setSpacePathName(space != null ? space.getPathName() : "");
-//            alarmEvent.setStatus(AlarmEventStatusEnum.PENDING.getValue());
-//            alarmEvent.setContent(alarmContent);
-//            LocalDateTime now = LocalDateTime.now();
-//            alarmEvent.setCreateTime(now);
-//            alarmEvent.setCreatedBy(0L);
-//            alarmEvent.setUpdatedBy(0L);
-//            alarmEvent.setUpdateTime(now);
-//            events.add(alarmEvent);
-//            this.generateMessage(ruleEngineName, alarmEventAction.getNotifiers(), alarmContent, now);
-//        });
-//        this.alarmEventService.saveBatch(events);
-//    }
-//
-//    public void generateWorkOrder(Long ruleEngineId, String ruleEngineName, Long projectId, Long spaceId, List<RuleEngineAction> actions, RuleEngineDetailLog ruleEngineDetail) {
-//        actions.forEach((action) -> {
-//            AlarmEventAction alarmEventAction = (AlarmEventAction)action;
-//            AlarmEvent alarmEvent = new AlarmEvent();
-//            Short level = Short.parseShort(alarmEventAction.getLevel());
-//            assignValueForAlarmEvent(ruleEngineId, projectId, spaceId, level, alarmEvent);
-//            Space space = (Space)this.spaceService.getById(spaceId);
-//            String spacePathName = space != null ? space.getPathName() : "";
-//            alarmEvent.setSpacePathName(spacePathName);
-//            alarmEvent.setStatus(AlarmEventStatusEnum.PENDING.getValue());
-//            String alarmContent = this.ruleEngineLogService.getAlarmContent(ruleEngineDetail);
-//            alarmEvent.setContent(alarmContent);
-//            LocalDateTime now = LocalDateTime.now();
-//            alarmEvent.setCreateTime(now);
-//            alarmEvent.setCreatedBy(0L);
-//            alarmEvent.setUpdatedBy(0L);
-//            alarmEvent.setUpdateTime(now);
-//            this.alarmEventService.save(alarmEvent);
-//            WorkOrder workOrder = new WorkOrder();
-//            workOrder.setProjectId(projectId);
-//            workOrder.setSpaceId(spaceId);
-//            workOrder.setSpacePathName(spacePathName);
-//            workOrder.setContent(alarmContent);
-//            workOrder.setNumber(String.valueOf(Year.now().getValue()) + SnowflakeIdGenerator.getInstance().nextId());
-//            workOrder.setLevel(Short.parseShort(alarmEventAction.getLevel()));
-//            workOrder.setStatus(WorkOrderStatusEnum.NOT_ASSIGN.getValue());
-//            workOrder.setClassification(Short.valueOf((short)1));
-//            workOrder.setCreateTime(now);
-//            workOrder.setCreatedBy(0L);
-//            workOrder.setUpdatedBy(0L);
-//            workOrder.setUpdateTime(now);
-//            workOrder.setBizId(alarmEvent.getId().toString());
-//            this.workOrderService.save(workOrder);
-//            WorkOrderStatusRecord workOrderStatusRecord = new WorkOrderStatusRecord();
-//            workOrderStatusRecord.setWorkOrderId(workOrder.getId());
-//            workOrderStatusRecord.setStatus(WorkOrderStatusEnum.NOT_ASSIGN.getValue());
-//            workOrderStatusRecord.setOperatorId(UserContext.getUserId());
-//            workOrderStatusRecord.setOperator("雷优人");
-//            workOrderStatusRecord.setOperatorId(0L);
-//            workOrderStatusRecord.setBizParamDescr("雷优人 提交工单 " + DateTimeUtil.format(LocalDateTime.now()));
-//            workOrderStatusRecord.setCreateTime(now);
-//            workOrderStatusRecord.setCreatedBy(0L);
-//            workOrderStatusRecord.setUpdatedBy(0L);
-//            workOrderStatusRecord.setUpdateTime(now);
-//            this.workOrderStatusRecordService.save(workOrderStatusRecord);
-//            this.generateMessage(ruleEngineName, alarmEventAction.getNotifiers(), alarmContent, now);
-//        });
-//    }
-//
-//    private void generateMessage(String ruleEngineName, List<SimpleVO> notifiers, String alarmContent, LocalDateTime now) {
-//        Message message = new Message();
-//        message.setContent(alarmContent);
-//        message.setCreateTime(now);
-//        message.setCreatedBy(0L);
-//        message.setUpdatedBy(0L);
-//        message.setUpdateTime(now);
-//        this.messageService.save(message);
-//        if (notifiers != null) {
-//            List<UserMessage> userMessages = new ArrayList();
-//            notifiers.forEach((notifier) -> {
-//                UserMessage userMessage = new UserMessage();
-//                userMessage.setMsgId(message.getId());
-//                userMessage.setTitle(ruleEngineName);
-//                userMessage.setMsgType(Short.valueOf((short)1));
-//                userMessage.setSubMsgType(Short.valueOf((short)1));
-//                userMessage.setUserId(Long.parseLong(notifier.getId()));
-//                userMessage.setSentTime(now);
-//                userMessage.setCreateTime(now);
-//                userMessage.setCreatedBy(0L);
-//                userMessage.setUpdatedBy(0L);
-//                userMessage.setUpdateTime(now);
-//                userMessages.add(userMessage);
-//            });
-//            this.userMessageService.saveBatch(userMessages);
-//        }
-//
-//    }
-//
-//    private static void assignValueForAlarmEvent(Long ruleEngineId, Long projectId, Long spaceId, Short level, AlarmEvent alarmEvent) {
-//        alarmEvent.setProjectId(projectId);
-//        alarmEvent.setSn(String.valueOf(Year.now().getValue()) + SnowflakeIdGenerator.getInstance().nextId());
-//        alarmEvent.setLevel(level);
-//        alarmEvent.setType(Short.valueOf((short)1));
-//        alarmEvent.setBizId(ruleEngineId.toString());
-//        alarmEvent.setTime(LocalDateTime.now());
-//        alarmEvent.setSpaceId(spaceId);
-//    }
-//
-//    public void performSingleDeviceControl(DeviceControlAction deviceControlAction, ControlAction controlAction, LocalDateTime now) {
-//        List<SimpleVO> devices = deviceControlAction.getDevices();
-//        if (devices != null && !devices.isEmpty()) {
-//            String deviceId = ((SimpleVO)devices.get(0)).getId();
-//            List<DeviceControlAction.Functions> functions = deviceControlAction.getFunctions();
-//            List<Control> controls = new ArrayList();
-//            List<DeviceControlResult> deviceControlResults = new ArrayList();
-//            controlAction.setControls(controls);
-//            controlAction.setDevices(deviceControlResults);
-//            controlAction.setTime(DateTimeUtil.format(now));
-//
-//            for(DeviceControlAction.Functions function : functions) {
-//                HashMap<String, String> functionMap = new HashMap();
-//                functionMap.put(function.getIdentifier(), function.getValue());
-//                Control control = new Control();
-//                control.setDelaySeconds(function.getDelaySeconds());
-//                control.setIdentifier(function.getIdentifier());
-//                control.setName(this.deviceFunctionService.getName(deviceId, function.getIdentifier()));
-//                control.setValue(function.getValue());
-//                String valueDesc = this.productTemplateFunctionValueService.getValueDesc(deviceId, function.getIdentifier(), function.getValue());
-//                control.setValueDesc(valueDesc);
-//                controls.add(control);
-//
-//                for(SimpleVO device : devices) {
-//                    String id = device.getId();
-//                    String name = device.getName();
-//                    GatewayControlParamsDTO dto = new GatewayControlParamsDTO();
-//                    dto.setDeviceId(id);
-//                    dto.setFunctions(functionMap);
-//                    dto.setTimeout(function.getDelaySeconds());
-//                    dto.setType(Short.valueOf((short)5));
-//                    DeviceControlResult deviceControlResult = new DeviceControlResult();
-//                    deviceControlResult.setId(id);
-//                    deviceControlResult.setName(StringUtils.isBlank(name) ? this.deviceService.getName(id) : name);
-//                    ArrayList<DeviceControlResult.Result> results = new ArrayList();
-//                    deviceControlResult.setResult(results);
-//                    deviceControlResults.add(deviceControlResult);
-//                    DeviceControlResult.Result result = new DeviceControlResult.Result();
-//
-//                    try {
-//                        result.setReqTime(DateTimeUtil.format(LocalDateTime.now()));
-//                        String content = this.gatewayService.controlDevice(dto);
-//                        Result<?> reponseResult = (Result)JsonUtil.parse(content, new TypeReference<Result<?>>() {
-//                        });
-//                        result.setCode(reponseResult.getCode());
-//                    } catch (Exception e) {
-//                        result.setCode("200001");
-//                        result.setMessage(e.getMessage());
-//                    }
-//
-//                    result.setRespTime(DateTimeUtil.format(LocalDateTime.now()));
-//                    results.add(result);
-//                }
-//            }
-//
-//        }
-//    }
-//
-//    public RuleEngineUtil(final RuleEngineLogService ruleEngineLogService, final RuleEngineService ruleEngineService, final GatewayService gatewayService, final SpaceService spaceService, final DeviceFunctionService deviceFunctionService, final DeviceService deviceService, final AlarmEventService alarmEventService, final WorkOrderService workOrderService, final MessageService messageService, final UserMessageService userMessageService, final WorkOrderStatusRecordService workOrderStatusRecordService, final ProductTemplateFunctionValueService productTemplateFunctionValueService) {
-//        this.ruleEngineLogService = ruleEngineLogService;
-//        this.ruleEngineService = ruleEngineService;
-//        this.gatewayService = gatewayService;
-//        this.spaceService = spaceService;
-//        this.deviceFunctionService = deviceFunctionService;
-//        this.deviceService = deviceService;
-//        this.alarmEventService = alarmEventService;
-//        this.workOrderService = workOrderService;
-//        this.messageService = messageService;
-//        this.userMessageService = userMessageService;
-//        this.workOrderStatusRecordService = workOrderStatusRecordService;
-//        this.productTemplateFunctionValueService = productTemplateFunctionValueService;
-//    }
+    /**
+     * 推送告警
+     * @param ruleEngineId
+     * @param ruleEngineName
+     * @param projectId
+     * @param spaceId
+     * @param actions
+     */
+    public void generateAlarmEvent(Long ruleEngineId, String ruleEngineName, Long projectId, Long spaceId, List<RuleEngineAction> actions) {
+        actions.forEach((action) -> {
+            AlarmEventAction alarmEventAction = (AlarmEventAction)action;
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("deviceId",alarmEventAction.getDeviceId());
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            LocalDateTime now = LocalDateTime.now();
+            String alarmTime = now.format(formatter);
+            jsonObject.put("alarmTime",alarmTime);
+            jsonObject.put("alarmType",alarmEventAction.getAlarmType());
+            jsonObject.put("alarmObject",alarmEventAction.getDeviceName());
+            jsonObject.put("alarmData",0);
+            jsonObject.put("alarmAttribute",alarmEventAction.getAlarmAttribute());
+            jsonObject.put("alarmContent",alarmEventAction.getAlarmAttribute());
+            jsonObject.put("alarmGrade",alarmEventAction.getAlarmGrade());
+            jsonObject.put("alarmAddress",alarmEventAction.getCommAddress());
+            jsonObject.put("productCode",alarmEventAction.getProductCode());
+
+            HttpClientUtils.doPostJson(alarmUrl,jsonObject.toJSONString());
+        });
+    }
+
+    /**
+     * 从 JSON 数组字符串中,根据 value 值获取对应的 name 值
+     * @param jsonArrayStr JSON数组字符串(如:[{"name":"开","value":"1"},{"name":"关","value":"2"}])
+     * @param targetValue  要匹配的value值(如:"1")
+     * @return 匹配的name值,无匹配返回空字符串
+     */
+    public static String getNameByValue(String jsonArrayStr, String targetValue) {
+        // 1. 空值校验
+        if (StringUtils.isBlank(jsonArrayStr) || StringUtils.isBlank(targetValue)) {
+            return "";
+        }
+
+        // 2. 解析 JSON 数组
+        JSONArray jsonArray = JSONArray.parseArray(jsonArrayStr);
+
+        // 3. 遍历数组,匹配 value,返回对应 name(一行核心逻辑)
+        return jsonArray.stream()
+                .map(obj -> (JSONObject) obj)  // 转为 JSONObject
+                .filter(jsonObj -> targetValue.equals(jsonObj.getString("value")))  // 匹配 value
+                .findFirst()  // 获取第一个匹配项
+                .map(jsonObj -> jsonObj.getString("name"))  // 提取 name
+                .orElse("");  // 无匹配返回空字符串(也可改为"未知")
+    }
+
+
+
+    public void performSingleDeviceControl(DeviceControlAction deviceControlAction, ControlAction controlAction, LocalDateTime now) {
+        List<SimpleVO> devices = deviceControlAction.getDevices();
+        if (devices != null && !devices.isEmpty()) {
+            Integer productId = deviceControlAction.getProductId();
+            String productCode = deviceControlAction.getProductCode();
+            //String productCode = dmpProductService.getOne(new LambdaQueryWrapper<DmpProduct>().eq(DmpProduct::getId, productId).eq(DmpProduct::getDeleteFlag,0).eq(DmpProduct::getTenantId, SecurityUtils.getTenantId())).getProductCode();
+            List<DmpProductCommand> dmpProductCommandList = Optional.ofNullable(
+                    dmpProductCommandService.getBaseMapper().selectList(new LambdaQueryWrapper<DmpProductCommand>()
+                            .eq(DmpProductCommand::getProductCode, productCode)
+                            .eq(DmpProductCommand::getTenantId, SecurityUtils.getTenantId())))
+                    .orElse(Collections.emptyList());
+            List<DeviceControlAction.Functions> functions = deviceControlAction.getFunctions();
+            List<Control> controls = new ArrayList();
+            List<DeviceControlResult> deviceControlResults = new ArrayList();
+            controlAction.setControls(controls);
+            controlAction.setDevices(deviceControlResults);
+            controlAction.setTime(DateTimeUtil.format(now));
+
+            for(DeviceControlAction.Functions function : functions) {
+                String identifier = function.getIdentifier();
+                DmpProductCommand dmpProductCommand = dmpProductCommandList.stream()
+                        .filter(cmd -> StringUtils.equals(cmd.getCommandCode(), identifier))
+                        .findFirst()
+                        .orElse(null);
+                HashMap<String, String> functionMap = new HashMap();
+                functionMap.put(identifier, function.getValue());
+                Control control = new Control();
+                control.setDelaySeconds(function.getDelaySeconds());
+                control.setIdentifier(identifier);
+                control.setName(dmpProductCommand != null ? dmpProductCommand.getCommandName() : null);
+                control.setValue(function.getValue());
+                control.setValueDesc(getNameByValue(dmpProductCommand != null ? dmpProductCommand.getCommandDict() : null, function.getValue()));
+                controls.add(control);
+
+                for(SimpleVO device : devices) {
+                    String id = device.getId();
+                    String name = device.getName();
+                    String deviceUuid = device.getDeviceUuid();
+                    String gatewayUuid = device.getGatewayUuid();
+
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("method", "control");
+                    map.put("deviceUuid", deviceUuid);
+                    Map<String, Object> map1 = new HashMap<>();
+                    map1.put("commandCode", function.getIdentifier());
+                    map1.put("commandValue", function.getValue());
+                    map.put("params", map1);
+
+
+                    DeviceControlResult deviceControlResult = new DeviceControlResult();
+                    deviceControlResult.setId(id);
+                    deviceControlResult.setName(name);
+                    ArrayList<DeviceControlResult.Result> results = new ArrayList();
+                    deviceControlResult.setResult(results);
+                    deviceControlResults.add(deviceControlResult);
+                    DeviceControlResult.Result result = new DeviceControlResult.Result();
+
+                    try {
+                        result.setReqTime(DateTimeUtil.format(LocalDateTime.now()));
+                        Map<String,Object> responseData =  remoteTransferService.deviceControl(productCode, gatewayUuid, JSON.toJSONString(map), SecurityUtils.getTenantId(), SecurityUtils.getUserId(), SecurityUtils.getUsername());
+
+                        result.setCode(responseData.get("code").toString());
+                    } catch (Exception e) {
+                        result.setCode("200001");
+                        result.setMessage(e.getMessage());
+                    }
+
+                    result.setRespTime(DateTimeUtil.format(LocalDateTime.now()));
+                    results.add(result);
+                }
+            }
+
+        }
+    }
+
+    public RuleEngineUtil(final RuleEngineLogService ruleEngineLogService, final RuleEngineService ruleEngineService) {
+        this.ruleEngineLogService = ruleEngineLogService;
+        this.ruleEngineService = ruleEngineService;
+    }
 }

+ 17 - 13
service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/DeviceDataVO.java

@@ -1,17 +1,20 @@
 package com.usky.rule.vo;
 
+import com.fasterxml.jackson.annotation.JsonAlias;
+
 import java.util.Map;
 
 public class DeviceDataVO {
-    private String deviceId;
+    private String deviceUuid;
     private String acqTime;
     private Map<String, String> functions;
 
     public DeviceDataVO() {
     }
 
-    public String getDeviceId() {
-        return this.deviceId;
+
+    public String getDeviceUuid() {
+        return this.deviceUuid;
     }
 
     public String getAcqTime() {
@@ -22,8 +25,9 @@ public class DeviceDataVO {
         return this.functions;
     }
 
-    public void setDeviceId(final String deviceId) {
-        this.deviceId = deviceId;
+
+    public void setDeviceUuid(final String deviceUuid) {
+        this.deviceUuid = deviceUuid;
     }
 
     public void setAcqTime(final String acqTime) {
@@ -44,13 +48,13 @@ public class DeviceDataVO {
             if (!other.canEqual(this)) {
                 return false;
             } else {
-                Object this$deviceId = this.getDeviceId();
-                Object other$deviceId = other.getDeviceId();
-                if (this$deviceId == null) {
-                    if (other$deviceId != null) {
+                Object this$deviceUuid = this.getDeviceUuid();
+                Object other$deviceUuid = other.getDeviceUuid();
+                if (this$deviceUuid == null) {
+                    if (other$deviceUuid != null) {
                         return false;
                     }
-                } else if (!this$deviceId.equals(other$deviceId)) {
+                } else if (!this$deviceUuid.equals(other$deviceUuid)) {
                     return false;
                 }
 
@@ -86,8 +90,8 @@ public class DeviceDataVO {
     public int hashCode() {
         int PRIME = 59;
         int result = 1;
-        Object $deviceId = this.getDeviceId();
-        result = result * 59 + ($deviceId == null ? 43 : $deviceId.hashCode());
+        Object $deviceUuid = this.getDeviceUuid();
+        result = result * 59 + ($deviceUuid == null ? 43 : $deviceUuid.hashCode());
         Object $acqTime = this.getAcqTime();
         result = result * 59 + ($acqTime == null ? 43 : $acqTime.hashCode());
         Object $functions = this.getFunctions();
@@ -96,6 +100,6 @@ public class DeviceDataVO {
     }
 
     public String toString() {
-        return "DeviceDataVO(deviceId=" + this.getDeviceId() + ", acqTime=" + this.getAcqTime() + ", functions=" + this.getFunctions() + ")";
+        return "DeviceDataVO(deviceUuid=" + this.getDeviceUuid() + ", acqTime=" + this.getAcqTime() + ", functions=" + this.getFunctions() + ")";
     }
 }

+ 1 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/RuleEngineConfigDTO.java

@@ -31,6 +31,7 @@ public class RuleEngineConfigDTO {
     @Data
     public static class RuleEngineDeviceItem {
         private String deviceId;
+        private String deviceUuid;
         private String identifier;
         private Long productId;
     }

+ 33 - 4
service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/RuleEngineDeviceVO.java

@@ -11,6 +11,8 @@ public class RuleEngineDeviceVO implements Serializable {
     private Long id;
     @ApiModelProperty("设备ID")
     private String deviceId;
+    @ApiModelProperty("设备UUID")
+    private String deviceUuid;
     @ApiModelProperty("标识符")
     private String identifier;
     @ApiModelProperty("规则引擎ID")
@@ -38,6 +40,10 @@ public class RuleEngineDeviceVO implements Serializable {
         return this.deviceId;
     }
 
+    public String getDeviceUuid() {
+        return this.deviceUuid;
+    }
+
     public String getIdentifier() {
         return this.identifier;
     }
@@ -74,6 +80,10 @@ public class RuleEngineDeviceVO implements Serializable {
         this.deviceId = deviceId;
     }
 
+    public void setDeviceUuid(final String deviceUuid) {
+        this.deviceUuid = deviceUuid;
+    }
+
     public void setIdentifier(final String identifier) {
         this.identifier = identifier;
     }
@@ -172,6 +182,16 @@ public class RuleEngineDeviceVO implements Serializable {
                     return false;
                 }
 
+                Object this$deviceUuid = this.getDeviceUuid();
+                Object other$deviceUuid = other.getDeviceUuid();
+                if (this$deviceUuid == null) {
+                    if (other$deviceUuid != null) {
+                        return false;
+                    }
+                } else if (!this$deviceUuid.equals(other$deviceUuid)) {
+                    return false;
+                }
+
                 Object this$identifier = this.getIdentifier();
                 Object other$identifier = other.getIdentifier();
                 if (this$identifier == null) {
@@ -226,6 +246,8 @@ public class RuleEngineDeviceVO implements Serializable {
         result = result * 59 + ($createdBy == null ? 43 : $createdBy.hashCode());
         Object $deviceId = this.getDeviceId();
         result = result * 59 + ($deviceId == null ? 43 : $deviceId.hashCode());
+        Object $deviceUuid = this.getDeviceUuid();
+        result = result * 59 + ($deviceUuid == null ? 43 : $deviceUuid.hashCode());
         Object $identifier = this.getIdentifier();
         result = result * 59 + ($identifier == null ? 43 : $identifier.hashCode());
         Object $updateTime = this.getUpdateTime();
@@ -236,12 +258,13 @@ public class RuleEngineDeviceVO implements Serializable {
     }
 
     public String toString() {
-        return "RuleEngineDeviceVO(id=" + this.getId() + ", deviceId=" + this.getDeviceId() + ", identifier=" + this.getIdentifier() + ", ruleEngineId=" + this.getRuleEngineId() + ", productId=" + this.getProductId() + ", updatedBy=" + this.getUpdatedBy() + ", updateTime=" + this.getUpdateTime() + ", createdBy=" + this.getCreatedBy() + ", createTime=" + this.getCreateTime() + ")";
+        return "RuleEngineDeviceVO(id=" + this.getId() + ", deviceId=" + this.getDeviceId() + ", deviceUuid=" + this.getDeviceUuid() + ", identifier=" + this.getIdentifier() + ", ruleEngineId=" + this.getRuleEngineId() + ", productId=" + this.getProductId() + ", updatedBy=" + this.getUpdatedBy() + ", updateTime=" + this.getUpdateTime() + ", createdBy=" + this.getCreatedBy() + ", createTime=" + this.getCreateTime() + ")";
     }
 
-    public RuleEngineDeviceVO(final Long id, final String deviceId, final String identifier, final Long ruleEngineId, final Long productId, final Long updatedBy, final String updateTime, final Long createdBy, final String createTime) {
+    public RuleEngineDeviceVO(final Long id, final String deviceId, final String deviceUuid, final String identifier, final Long ruleEngineId, final Long productId, final Long updatedBy, final String updateTime, final Long createdBy, final String createTime) {
         this.id = id;
         this.deviceId = deviceId;
+        this.deviceUuid = deviceUuid;
         this.identifier = identifier;
         this.ruleEngineId = ruleEngineId;
         this.productId = productId;
@@ -257,6 +280,7 @@ public class RuleEngineDeviceVO implements Serializable {
     public static class RuleEngineDeviceVOBuilder {
         private Long id;
         private String deviceId;
+        private String deviceUuid;
         private String identifier;
         private Long ruleEngineId;
         private Long productId;
@@ -278,6 +302,11 @@ public class RuleEngineDeviceVO implements Serializable {
             return this;
         }
 
+        public RuleEngineDeviceVOBuilder deviceUuid(final String deviceUuid) {
+            this.deviceUuid = deviceUuid;
+            return this;
+        }
+
         public RuleEngineDeviceVOBuilder identifier(final String identifier) {
             this.identifier = identifier;
             return this;
@@ -314,11 +343,11 @@ public class RuleEngineDeviceVO implements Serializable {
         }
 
         public RuleEngineDeviceVO build() {
-            return new RuleEngineDeviceVO(this.id, this.deviceId, this.identifier, this.ruleEngineId, this.productId, this.updatedBy, this.updateTime, this.createdBy, this.createTime);
+            return new RuleEngineDeviceVO(this.id, this.deviceId, this.deviceUuid, this.identifier, this.ruleEngineId, this.productId, this.updatedBy, this.updateTime, this.createdBy, this.createTime);
         }
 
         public String toString() {
-            return "RuleEngineDeviceVO.RuleEngineDeviceVOBuilder(id=" + this.id + ", deviceId=" + this.deviceId + ", identifier=" + this.identifier + ", ruleEngineId=" + this.ruleEngineId + ", productId=" + this.productId + ", updatedBy=" + this.updatedBy + ", updateTime=" + this.updateTime + ", createdBy=" + this.createdBy + ", createTime=" + this.createTime + ")";
+            return "RuleEngineDeviceVO.RuleEngineDeviceVOBuilder(id=" + this.id + ", deviceId=" + this.deviceId + ", deviceUuid=" + this.deviceUuid + ", identifier=" + this.identifier + ", ruleEngineId=" + this.ruleEngineId + ", productId=" + this.productId + ", updatedBy=" + this.updatedBy + ", updateTime=" + this.updateTime + ", createdBy=" + this.createdBy + ", createTime=" + this.createTime + ")";
         }
     }
 }

+ 138 - 45
service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/action/AlarmEventAction.java

@@ -2,16 +2,22 @@ package com.usky.rule.vo.action;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.usky.rule.enums.ActionTypeEnum;
-import com.usky.rule.vo.visualization.SimpleVO;
-import java.util.List;
 
 public class AlarmEventAction implements RuleEngineAction {
-    @JsonProperty("level")
-    private String level;
-    @JsonProperty("method")
-    private String method;
-    @JsonProperty("notifiers")
-    private List<SimpleVO> notifiers;
+    @JsonProperty("alarmGrade")
+    private Integer alarmGrade;
+    @JsonProperty("productCode")
+    private String productCode;
+    @JsonProperty("deviceId")
+    private String deviceId;
+    @JsonProperty("deviceName")
+    private String deviceName;
+    @JsonProperty("alarmType")
+    private String alarmType;
+    @JsonProperty("alarmAttribute")
+    private String alarmAttribute;
+    @JsonProperty("commAddress")
+    private String commAddress;
 
     public String getType() {
         return ActionTypeEnum.ALARM_EVENT.getType();
@@ -20,31 +26,67 @@ public class AlarmEventAction implements RuleEngineAction {
     public AlarmEventAction() {
     }
 
-    public String getLevel() {
-        return this.level;
+    public Integer getAlarmGrade() {
+        return this.alarmGrade;
     }
 
-    public String getMethod() {
-        return this.method;
+    public String getProductCode() {
+        return this.productCode;
     }
 
-    public List<SimpleVO> getNotifiers() {
-        return this.notifiers;
+    public String getDeviceId() {
+        return this.deviceId;
     }
 
-    @JsonProperty("level")
-    public void setLevel(final String level) {
-        this.level = level;
+    public String getDeviceName() {
+        return this.deviceName;
     }
 
-    @JsonProperty("method")
-    public void setMethod(final String method) {
-        this.method = method;
+    public String getAlarmType() {
+        return this.alarmType;
     }
 
-    @JsonProperty("notifiers")
-    public void setNotifiers(final List<SimpleVO> notifiers) {
-        this.notifiers = notifiers;
+    public String getAlarmAttribute() {
+        return this.alarmAttribute;
+    }
+
+    public String getCommAddress() {
+        return this.commAddress;
+    }
+
+    @JsonProperty("alarmGrade")
+    public void setAlarmGrade(final Integer alarmGrade) {
+        this.alarmGrade = alarmGrade;
+    }
+
+    @JsonProperty("productCode")
+    public void setProductCode(final String productCode) {
+        this.productCode = productCode;
+    }
+
+    @JsonProperty("deviceId")
+    public void setDeviceId(final String deviceId) {
+        this.deviceId = deviceId;
+    }
+
+    @JsonProperty("deviceName")
+    public void setDeviceName(final String deviceName) {
+        this.deviceName = deviceName;
+    }
+
+    @JsonProperty("alarmType")
+    public void setAlarmType(final String alarmType) {
+        this.alarmType = alarmType;
+    }
+
+    @JsonProperty("alarmAttribute")
+    public void setAlarmAttribute(final String alarmAttribute) {
+        this.alarmAttribute = alarmAttribute;
+    }
+
+    @JsonProperty("commAddress")
+    public void setCommAddress(final String commAddress) {
+        this.commAddress = commAddress;
     }
 
     public boolean equals(final Object o) {
@@ -57,33 +99,73 @@ public class AlarmEventAction implements RuleEngineAction {
             if (!other.canEqual(this)) {
                 return false;
             } else {
-                Object this$level = this.getLevel();
-                Object other$level = other.getLevel();
-                if (this$level == null) {
-                    if (other$level != null) {
+                Object this$alarmGrade = this.getAlarmGrade();
+                Object other$alarmGrade = other.getAlarmGrade();
+                if (this$alarmGrade == null) {
+                    if (other$alarmGrade != null) {
+                        return false;
+                    }
+                } else if (!this$alarmGrade.equals(other$alarmGrade)) {
+                    return false;
+                }
+
+                Object this$productCode = this.getProductCode();
+                Object other$productCode = other.getProductCode();
+                if (this$productCode == null) {
+                    if (other$productCode != null) {
+                        return false;
+                    }
+                } else if (!this$productCode.equals(other$productCode)) {
+                    return false;
+                }
+
+                Object this$deviceId = this.getDeviceId();
+                Object other$deviceId = other.getDeviceId();
+                if (this$deviceId == null) {
+                    if (other$deviceId != null) {
+                        return false;
+                    }
+                } else if (!this$deviceId.equals(other$deviceId)) {
+                    return false;
+                }
+
+                Object this$deviceName = this.getDeviceName();
+                Object other$deviceName = other.getDeviceName();
+                if (this$deviceName == null) {
+                    if (other$deviceName != null) {
+                        return false;
+                    }
+                } else if (!this$deviceName.equals(other$deviceName)) {
+                    return false;
+                }
+
+                Object this$alarmType = this.getAlarmType();
+                Object other$alarmType = other.getAlarmType();
+                if (this$alarmType == null) {
+                    if (other$alarmType != null) {
                         return false;
                     }
-                } else if (!this$level.equals(other$level)) {
+                } else if (!this$alarmType.equals(other$alarmType)) {
                     return false;
                 }
 
-                Object this$method = this.getMethod();
-                Object other$method = other.getMethod();
-                if (this$method == null) {
-                    if (other$method != null) {
+                Object this$alarmAttribute = this.getAlarmAttribute();
+                Object other$alarmAttribute = other.getAlarmAttribute();
+                if (this$alarmAttribute == null) {
+                    if (other$alarmAttribute != null) {
                         return false;
                     }
-                } else if (!this$method.equals(other$method)) {
+                } else if (!this$alarmAttribute.equals(other$alarmAttribute)) {
                     return false;
                 }
 
-                Object this$notifiers = this.getNotifiers();
-                Object other$notifiers = other.getNotifiers();
-                if (this$notifiers == null) {
-                    if (other$notifiers != null) {
+                Object this$commAddress = this.getCommAddress();
+                Object other$commAddress = other.getCommAddress();
+                if (this$commAddress == null) {
+                    if (other$commAddress != null) {
                         return false;
                     }
-                } else if (!this$notifiers.equals(other$notifiers)) {
+                } else if (!this$commAddress.equals(other$commAddress)) {
                     return false;
                 }
 
@@ -99,16 +181,27 @@ public class AlarmEventAction implements RuleEngineAction {
     public int hashCode() {
         int PRIME = 59;
         int result = 1;
-        Object $level = this.getLevel();
-        result = result * 59 + ($level == null ? 43 : $level.hashCode());
-        Object $method = this.getMethod();
-        result = result * 59 + ($method == null ? 43 : $method.hashCode());
-        Object $notifiers = this.getNotifiers();
-        result = result * 59 + ($notifiers == null ? 43 : $notifiers.hashCode());
+        Object $alarmGrade = this.getAlarmGrade();
+        result = result * 59 + ($alarmGrade == null ? 43 : $alarmGrade.hashCode());
+        Object $productCode = this.getProductCode();
+        result = result * 59 + ($productCode == null ? 43 : $productCode.hashCode());
+        Object $deviceId = this.getDeviceId();
+        result = result * 59 + ($deviceId == null ? 43 : $deviceId.hashCode());
+        Object $deviceName = this.getDeviceName();
+        result = result * 59 + ($deviceName == null ? 43 : $deviceName.hashCode());
+        Object $alarmType = this.getAlarmType();
+        result = result * 59 + ($alarmType == null ? 43 : $alarmType.hashCode());
+        Object $alarmAttribute = this.getAlarmAttribute();
+        result = result * 59 + ($alarmAttribute == null ? 43 : $alarmAttribute.hashCode());
+        Object $commAddress = this.getCommAddress();
+        result = result * 59 + ($commAddress == null ? 43 : $commAddress.hashCode());
         return result;
     }
 
     public String toString() {
-        return "AlarmEventAction(level=" + this.getLevel() + ", method=" + this.getMethod() + ", notifiers=" + this.getNotifiers() + ")";
+        return "AlarmEventAction(alarmGrade=" + this.getAlarmGrade() + ", productCode=" + this.getProductCode()
+            + ", deviceId=" + this.getDeviceId() + ", deviceName=" + this.getDeviceName() + ", alarmType="
+            + this.getAlarmType() + ", alarmAttribute=" + this.getAlarmAttribute() + ", commAddress="
+            + this.getCommAddress() + ")";
     }
 }

+ 24 - 1
service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/action/DeviceControlAction.java

@@ -8,6 +8,8 @@ import java.util.List;
 public class DeviceControlAction implements RuleEngineAction {
     @JsonProperty("productId")
     private Integer productId;
+    @JsonProperty("productCode")
+    private String productCode;
     @JsonProperty("functions")
     private List<Functions> functions;
     @JsonProperty("devices")
@@ -24,6 +26,10 @@ public class DeviceControlAction implements RuleEngineAction {
         return this.productId;
     }
 
+    public String getProductCode() {
+        return this.productCode;
+    }
+
     public List<Functions> getFunctions() {
         return this.functions;
     }
@@ -37,6 +43,11 @@ public class DeviceControlAction implements RuleEngineAction {
         this.productId = productId;
     }
 
+    @JsonProperty("productCode")
+    public void setProductCode(final String productCode) {
+        this.productCode = productCode;
+    }
+
     @JsonProperty("functions")
     public void setFunctions(final List<Functions> functions) {
         this.functions = functions;
@@ -67,6 +78,16 @@ public class DeviceControlAction implements RuleEngineAction {
                     return false;
                 }
 
+                Object this$productCode = this.getProductCode();
+                Object other$productCode = other.getProductCode();
+                if (this$productCode == null) {
+                    if (other$productCode != null) {
+                        return false;
+                    }
+                } else if (!this$productCode.equals(other$productCode)) {
+                    return false;
+                }
+
                 Object this$functions = this.getFunctions();
                 Object other$functions = other.getFunctions();
                 if (this$functions == null) {
@@ -101,6 +122,8 @@ public class DeviceControlAction implements RuleEngineAction {
         int result = 1;
         Object $productId = this.getProductId();
         result = result * 59 + ($productId == null ? 43 : $productId.hashCode());
+        Object $productCode = this.getProductCode();
+        result = result * 59 + ($productCode == null ? 43 : $productCode.hashCode());
         Object $functions = this.getFunctions();
         result = result * 59 + ($functions == null ? 43 : $functions.hashCode());
         Object $devices = this.getDevices();
@@ -109,7 +132,7 @@ public class DeviceControlAction implements RuleEngineAction {
     }
 
     public String toString() {
-        return "DeviceControlAction(productId=" + this.getProductId() + ", functions=" + this.getFunctions() + ", devices=" + this.getDevices() + ")";
+        return "DeviceControlAction(productId=" + this.getProductId() + ", productCode=" + this.getProductCode() + ", functions=" + this.getFunctions() + ", devices=" + this.getDevices() + ")";
     }
 
     public static class Functions {

+ 82 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/log/AlarmActionLog.java

@@ -0,0 +1,82 @@
+package com.usky.rule.vo.log;
+
+import com.usky.rule.vo.action.AlarmEventAction;
+
+import java.util.List;
+
+public class AlarmActionLog {
+    private List<AlarmEventAction> alarms;
+    private String time;
+
+    public List<AlarmEventAction> getAlarms() {
+        return this.alarms;
+    }
+
+    public String getTime() {
+        return this.time;
+    }
+
+    public void setAlarms(final List<AlarmEventAction> alarms) {
+        this.alarms = alarms;
+    }
+
+    public void setTime(final String time) {
+        this.time = time;
+    }
+
+    public boolean equals(final Object o) {
+        if (o == this) {
+            return true;
+        } else if (!(o instanceof AlarmActionLog)) {
+            return false;
+        } else {
+            AlarmActionLog other = (AlarmActionLog)o;
+            if (!other.canEqual(this)) {
+                return false;
+            } else {
+                Object this$alarms = this.getAlarms();
+                Object other$alarms = other.getAlarms();
+                if (this$alarms == null) {
+                    if (other$alarms != null) {
+                        return false;
+                    }
+                } else if (!this$alarms.equals(other$alarms)) {
+                    return false;
+                }
+
+                Object this$time = this.getTime();
+                Object other$time = other.getTime();
+                if (this$time == null) {
+                    if (other$time != null) {
+                        return false;
+                    }
+                } else if (!this$time.equals(other$time)) {
+                    return false;
+                }
+
+                return true;
+            }
+        }
+    }
+
+    protected boolean canEqual(final Object other) {
+        return other instanceof AlarmActionLog;
+    }
+
+    public int hashCode() {
+        int PRIME = 59;
+        int result = 1;
+        Object $alarms = this.getAlarms();
+        result = result * 59 + ($alarms == null ? 43 : $alarms.hashCode());
+        Object $time = this.getTime();
+        result = result * 59 + ($time == null ? 43 : $time.hashCode());
+        return result;
+    }
+
+    public String toString() {
+        return "AlarmActionLog(alarms=" + this.getAlarms() + ", time=" + this.getTime() + ")";
+    }
+
+    public AlarmActionLog() {
+    }
+}

+ 4 - 80
service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/visualization/SimpleVO.java

@@ -2,88 +2,12 @@ package com.usky.rule.vo.visualization;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
-@ApiModel
+@Data
 public class SimpleVO {
-    @ApiModelProperty("ID")
     private String id;
-    @ApiModelProperty("名称")
     private String name;
-
-    public String getId() {
-        return this.id;
-    }
-
-    public String getName() {
-        return this.name;
-    }
-
-    public void setId(final String id) {
-        this.id = id;
-    }
-
-    public void setName(final String name) {
-        this.name = name;
-    }
-
-    public boolean equals(final Object o) {
-        if (o == this) {
-            return true;
-        } else if (!(o instanceof SimpleVO)) {
-            return false;
-        } else {
-            SimpleVO other = (SimpleVO)o;
-            if (!other.canEqual(this)) {
-                return false;
-            } else {
-                Object this$id = this.getId();
-                Object other$id = other.getId();
-                if (this$id == null) {
-                    if (other$id != null) {
-                        return false;
-                    }
-                } else if (!this$id.equals(other$id)) {
-                    return false;
-                }
-
-                Object this$name = this.getName();
-                Object other$name = other.getName();
-                if (this$name == null) {
-                    if (other$name != null) {
-                        return false;
-                    }
-                } else if (!this$name.equals(other$name)) {
-                    return false;
-                }
-
-                return true;
-            }
-        }
-    }
-
-    protected boolean canEqual(final Object other) {
-        return other instanceof SimpleVO;
-    }
-
-    public int hashCode() {
-        int PRIME = 59;
-        int result = 1;
-        Object $id = this.getId();
-        result = result * 59 + ($id == null ? 43 : $id.hashCode());
-        Object $name = this.getName();
-        result = result * 59 + ($name == null ? 43 : $name.hashCode());
-        return result;
-    }
-
-    public String toString() {
-        return "SimpleVO(id=" + this.getId() + ", name=" + this.getName() + ")";
-    }
-
-    public SimpleVO(final String id, final String name) {
-        this.id = id;
-        this.name = name;
-    }
-
-    public SimpleVO() {
-    }
+    private String deviceUuid;
+    private String gatewayUuid;
 }

+ 4 - 2
service-rule/service-rule-biz/src/main/resources/mapper/RuleEngineDeviceMapper.xml

@@ -4,6 +4,7 @@
     <resultMap id="Base" type="com.usky.rule.domain.RuleEngineDevice">
         <id column="id" property="id"/>
         <result column="device_id" property="deviceId"/>
+        <result column="device_uuid" property="deviceUuid"/>
         <result column="identifier" property="identifier"/>
         <result column="rule_engine_id" property="ruleEngineId"/>
         <result column="product_id" property="productId"/>
@@ -19,10 +20,11 @@
         <if test="tenantId != null">AND tenant_id = #{tenantId}</if>
     </select>
     <insert id="insert" useGeneratedKeys="true" keyProperty="id">
-        INSERT INTO rule_engine_device (device_id, identifier, rule_engine_id, product_id, created_by, create_time, updated_by, update_time, tenant_id)
-        VALUES (#{deviceId}, #{identifier}, #{ruleEngineId}, #{productId}, #{createdBy}, NOW(), #{updatedBy}, NOW(), #{tenantId})
+        INSERT INTO rule_engine_device (device_id, device_uuid, identifier, rule_engine_id, product_id, created_by, create_time, updated_by, update_time, tenant_id)
+        VALUES (#{deviceId}, #{deviceUuid}, #{identifier}, #{ruleEngineId}, #{productId}, #{createdBy}, NOW(), #{updatedBy}, NOW(), #{tenantId})
     </insert>
     <delete id="deleteByRuleEngineId">DELETE FROM rule_engine_device WHERE rule_engine_id = #{ruleEngineId}</delete>
     <select id="selectByRuleEngineId" resultMap="Base">SELECT * FROM rule_engine_device WHERE rule_engine_id = #{ruleEngineId}</select>
     <select id="selectByDeviceId" resultMap="Base">SELECT * FROM rule_engine_device WHERE device_id = #{deviceId}</select>
+    <select id="selectByDeviceUuid" resultMap="Base">SELECT * FROM rule_engine_device WHERE device_uuid = #{deviceUuid}</select>
 </mapper>

+ 26 - 0
service-rule/service-rule-biz/src/main/resources/mapper/rule/DmpProductCommandMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.rule.mapper.DmpProductCommandMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.rule.domain.DmpProductCommand">
+        <id column="id" property="id" />
+        <result column="product_code" property="productCode" />
+        <result column="command_code" property="commandCode" />
+        <result column="command_name" property="commandName" />
+        <result column="data_type" property="dataType" />
+        <result column="command_unit" property="commandUnit" />
+        <result column="maximum" property="maximum" />
+        <result column="minimum" property="minimum" />
+        <result column="command_dict" property="commandDict" />
+        <result column="command_describe" property="commandDescribe" />
+        <result column="remark" property="remark" />
+        <result column="delete_flag" property="deleteFlag" />
+        <result column="created_by" property="createdBy" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_by" property="updatedBy" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>