Преглед изворни кода

优化规则引擎操作日志存储详情字段生成逻辑

james пре 5 дана
родитељ
комит
d1e57ae8a2

+ 2 - 3
service-rule/service-rule-biz/src/main/java/com/usky/rule/mapper/RuleEngineMapper.java

@@ -8,12 +8,11 @@ import org.apache.ibatis.annotations.Param;
 import java.util.List;
 
 public interface RuleEngineMapper extends CrudMapper<RuleEngine> {
-    int insert(RuleEngine row);
-    int updateById(RuleEngine row);
     int deleteById(@Param("id") Long id);
     RuleEngine selectById(@Param("id") Long id, @Param("tenantId") Integer tenantId);
     int updateStatus(@Param("id") Long id, @Param("status") Integer status);
     /** 按项目启用规则,供 MQ 消费侧加载;tenantId 为空时不按租户过滤 */
     List<RuleEngine> selectEnabledByProjectId(@Param("projectId") Long projectId, @Param("tenantId") Integer tenantId);
-    List<Long> recursiveAllChildrenNodeIds(Long parentId);
+    /** 查询某空间下的直接子空间 id(用于在应用层递归求所有子孙 id,兼容 MySQL 5.7) */
+    List<Long> selectDirectChildrenSpaceIds(Long parentId);
 }

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

@@ -86,7 +86,7 @@ public class RuleEngineDetailServiceImpl implements RuleEngineDetailService {
                 if (deviceControlActions.isEmpty()) {
                     return true;
                 } else {
-//                    this.ruleEngineUtil.performMultipleDevicesControl(id, false, TriggerTypeEnum.DEVICE.getType(), ruleEngine.getProjectId(), (Long)null, actions, new RuleEngineDetailLog());
+                    this.ruleEngineUtil.performMultipleDevicesControl(id, false, TriggerTypeEnum.DEVICE.getType(), ruleEngine.getProjectId(), (Long)null, actions, new RuleEngineDetailLog());
                     return true;
                 }
             } else {

+ 51 - 33
service-rule/service-rule-biz/src/main/java/com/usky/rule/service/impl/RuleEngineServiceImpl.java

@@ -24,6 +24,7 @@ import com.usky.rule.service.*;
 import com.usky.rule.util.CronUtil;
 import com.usky.rule.util.JsonUtil;
 import com.usky.rule.vo.*;
+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.constraint.CronConstraint;
@@ -50,8 +51,8 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
     private static final Map<String, Class<?>> triggerMap = new HashMap();
     private static final Map<String, Class<?>> constraintMap = new HashMap();
     private static final Map<String, Class<?>> actionMap = new HashMap();
-    @Autowired
-    private RuleEngineLogService ruleEngineLogService;
+//    @Autowired
+//    private RuleEngineLogService ruleEngineLogService;
     @Autowired
     private RuleEngineCronMapper ruleEngineCronMapper;
     @Autowired
@@ -81,7 +82,7 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
         triggerMap.put(TriggerTypeEnum.SPACE.getType(), SpaceTrigger.class);
         constraintMap.put(ConstraintTypeEnum.CRON.getType(), CronConstraint.class);
         constraintMap.put(ConstraintTypeEnum.DEVICE.getType(), DeviceConstraint.class);
-//        actionMap.put(ActionTypeEnum.ALARM_EVENT.getType(), AlarmEventAction.class);
+        actionMap.put(ActionTypeEnum.ALARM_EVENT.getType(), AlarmEventAction.class);
 //        actionMap.put(ActionTypeEnum.WORK_ORDER.getType(), WorkOrderAction.class);
         actionMap.put(ActionTypeEnum.DEVICE_CONTROL.getType(), DeviceControlAction.class);
     }
@@ -128,12 +129,27 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
         return getBaseMapper().selectById(id, SecurityUtils.getTenantId());
     }
 
+    /** 收集某空间下所有子孙空间 id(兼容 MySQL 5.7,在应用层递归) */
+    private List<Long> collectAllDescendantSpaceIds(Long parentId) {
+        List<Long> result = new ArrayList<>();
+        List<Long> currentLevel = getBaseMapper().selectDirectChildrenSpaceIds(parentId);
+        while (!currentLevel.isEmpty()) {
+            result.addAll(currentLevel);
+            List<Long> nextLevel = new ArrayList<>();
+            for (Long id : currentLevel) {
+                nextLevel.addAll(getBaseMapper().selectDirectChildrenSpaceIds(id));
+            }
+            currentLevel = nextLevel;
+        }
+        return result;
+    }
+
     @Override
     public CommonPage<RuleEngine> pageList(RuleEnginePageRequest request) {
         List<Long> ids = new ArrayList();
         if (request.getSpaceId() != null) {
             ids.add(request.getSpaceId());
-            ids.addAll(getBaseMapper().recursiveAllChildrenNodeIds(request.getSpaceId()));
+            ids.addAll(collectAllDescendantSpaceIds(request.getSpaceId()));
         }
 
 
@@ -146,10 +162,12 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
                 .orderByDesc(RuleEngine::getId);
         page = this.page(page, queryWrapper);
 
-        List<Long> spaceIds = page.getRecords().stream().map(RuleEngine::getSpaceId).distinct().collect(Collectors.toList());
-        List<BaseSpace> spaceList = baseSpaceService.listByIds(spaceIds);
-        Map<Long, BaseSpace> spaceMap = (Map)spaceList.stream().collect(Collectors.toMap(BaseSpace::getId, (s) -> s));
-        page.getRecords().forEach((r) -> r.setSpaceName(((BaseSpace)spaceMap.get(r.getSpaceId())).getName()));
+        if(!page.getRecords().isEmpty()){
+            List<Long> spaceIds = page.getRecords().stream().map(RuleEngine::getSpaceId).distinct().collect(Collectors.toList());
+            List<BaseSpace> spaceList = baseSpaceService.listByIds(spaceIds);
+            Map<Long, BaseSpace> spaceMap = (Map)spaceList.stream().collect(Collectors.toMap(BaseSpace::getId, (s) -> s));
+            page.getRecords().forEach((r) -> r.setSpaceName(((BaseSpace)spaceMap.get(r.getSpaceId())).getName()));
+        }
 
         return new CommonPage<>(page.getRecords(), page.getTotal(), request.getPageSize(), request.getPageNum());
 
@@ -160,7 +178,7 @@ public class RuleEngineServiceImpl extends AbstractCrudService<RuleEngineMapper,
         List<Long> ids = new ArrayList();
         if (request.getSpaceId() != null) {
             ids.add(request.getSpaceId());
-            ids.addAll(getBaseMapper().recursiveAllChildrenNodeIds(request.getSpaceId()));
+            ids.addAll(collectAllDescendantSpaceIds(request.getSpaceId()));
         }
 
         LambdaQueryWrapper<RuleEngine> queryWrapper = Wrappers.lambdaQuery();
@@ -495,18 +513,18 @@ 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);
+//        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
@@ -515,18 +533,18 @@ 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);
+//        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);
     }
 
 

+ 331 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/util/RuleEngineUtil.java

@@ -1,9 +1,91 @@
 package com.usky.rule.util;
 
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.usky.rule.domain.RuleEngineLog;
+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.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.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.visualization.SimpleVO;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
 @Component
 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;
+
     public static String getJobGroup(Long ruleEngineId) {
         return "trigger-" + ruleEngineId;
     }
@@ -11,4 +93,253 @@ public class RuleEngineUtil {
     public static String getTriggerCronJobName(Integer index) {
         return "job-" + index;
     }
+
+    public void performMultipleDevicesControl(Long ruleEngineId, boolean isAuto, String triggerType, Long projectId, Long spaceId, List<RuleEngineAction> actionList, RuleEngineDetailLog ruleEngineDetail) {
+        List<BaseLog> baseLogs = new ArrayList();
+        ruleEngineDetail.setActions(baseLogs);
+//        LocalDateTime now = LocalDateTime.now();
+//        Set<String> deviceActionTypes = new HashSet(3);
+//        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);
+//        }
+//
+    }
+//
+//    @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;
+//    }
 }

+ 114 - 0
service-rule/service-rule-biz/src/main/java/com/usky/rule/vo/action/AlarmEventAction.java

@@ -0,0 +1,114 @@
+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;
+
+    public String getType() {
+        return ActionTypeEnum.ALARM_EVENT.getType();
+    }
+
+    public AlarmEventAction() {
+    }
+
+    public String getLevel() {
+        return this.level;
+    }
+
+    public String getMethod() {
+        return this.method;
+    }
+
+    public List<SimpleVO> getNotifiers() {
+        return this.notifiers;
+    }
+
+    @JsonProperty("level")
+    public void setLevel(final String level) {
+        this.level = level;
+    }
+
+    @JsonProperty("method")
+    public void setMethod(final String method) {
+        this.method = method;
+    }
+
+    @JsonProperty("notifiers")
+    public void setNotifiers(final List<SimpleVO> notifiers) {
+        this.notifiers = notifiers;
+    }
+
+    public boolean equals(final Object o) {
+        if (o == this) {
+            return true;
+        } else if (!(o instanceof AlarmEventAction)) {
+            return false;
+        } else {
+            AlarmEventAction other = (AlarmEventAction)o;
+            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) {
+                        return false;
+                    }
+                } else if (!this$level.equals(other$level)) {
+                    return false;
+                }
+
+                Object this$method = this.getMethod();
+                Object other$method = other.getMethod();
+                if (this$method == null) {
+                    if (other$method != null) {
+                        return false;
+                    }
+                } else if (!this$method.equals(other$method)) {
+                    return false;
+                }
+
+                Object this$notifiers = this.getNotifiers();
+                Object other$notifiers = other.getNotifiers();
+                if (this$notifiers == null) {
+                    if (other$notifiers != null) {
+                        return false;
+                    }
+                } else if (!this$notifiers.equals(other$notifiers)) {
+                    return false;
+                }
+
+                return true;
+            }
+        }
+    }
+
+    protected boolean canEqual(final Object other) {
+        return other instanceof AlarmEventAction;
+    }
+
+    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());
+        return result;
+    }
+
+    public String toString() {
+        return "AlarmEventAction(level=" + this.getLevel() + ", method=" + this.getMethod() + ", notifiers=" + this.getNotifiers() + ")";
+    }
+}

+ 3 - 24
service-rule/service-rule-biz/src/main/resources/mapper/RuleEngineMapper.xml

@@ -16,15 +16,6 @@
         <result column="tenant_id" property="tenantId"/>
     </resultMap>
 
-    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
-        INSERT INTO rule_engine (project_id, name, space_id, status, descr, detail, created_by, create_time, updated_by, update_time, tenant_id)
-        VALUES (#{projectId}, #{name}, #{spaceId}, #{status}, #{descr}, #{detail}, #{createdBy}, NOW(), #{updatedBy}, NOW(), #{tenantId})
-    </insert>
-    <update id="updateById">
-        UPDATE rule_engine
-        SET name=#{name}, space_id=#{spaceId}, status=#{status}, descr=#{descr}, detail=#{detail}, updated_by=#{updatedBy}, update_time=NOW(), tenant_id=#{tenantId}
-        WHERE id=#{id}
-    </update>
     <delete id="deleteById">DELETE FROM rule_engine WHERE id=#{id}</delete>
     <select id="selectById" resultMap="Base">SELECT * FROM rule_engine WHERE id=#{id} and tenant_id = #{tenantId}</select>
     <update id="updateStatus">UPDATE rule_engine SET status=#{status}, update_time=NOW() WHERE id=#{id}</update>
@@ -33,20 +24,8 @@
         <if test="tenantId != null">AND tenant_id = #{tenantId}</if>
     </select>
 
-    <!--使用mysql8的递归cte 只查询id-->
-    <select id="recursiveAllChildrenNodeIds" resultType="java.lang.Long">
-        WITH RECURSIVE cte(id) AS
-                           (
-                               select s.id
-                               from space s
-                               where s.parent_id = #{parentId}
-                               union all
-                               select s.id
-                               from cte c
-                                        join space s
-                                             on c.id = s.parent_id
-                           )
-        SELECT id
-        FROM cte;
+    <!-- 查询直接子节点 id(兼容 MySQL 5.7,递归在 Service 层实现)-->
+    <select id="selectDirectChildrenSpaceIds" resultType="java.lang.Long">
+        SELECT s.id FROM base_space s WHERE s.parent_id = #{parentId}
     </select>
 </mapper>