From 49a83fd420798e7e0718ff36a19ec5be713b1f9e Mon Sep 17 00:00:00 2001 From: mashili Date: Tue, 11 Nov 2025 10:37:46 +0800 Subject: [PATCH] =?UTF-8?q?=E9=AA=8C=E6=94=B62-=E5=90=8C=E6=AD=A5=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E8=BF=90=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/aspectj/StrategySyncAspect.java | 243 ++++++++++++++++++ .../xzzn/ems/service/IEmsStrategyService.java | 3 + .../service/impl/EmsStrategyServiceImpl.java | 15 ++ 3 files changed, 261 insertions(+) create mode 100644 ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategySyncAspect.java diff --git a/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategySyncAspect.java b/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategySyncAspect.java new file mode 100644 index 0000000..b7eb2c7 --- /dev/null +++ b/ems-framework/src/main/java/com/xzzn/framework/aspectj/StrategySyncAspect.java @@ -0,0 +1,243 @@ +package com.xzzn.framework.aspectj; + +import com.alibaba.fastjson2.JSON; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.EmsStrategyRunning; +import com.xzzn.ems.domain.MqttSyncStrategyLog; +import com.xzzn.ems.mapper.EmsMqttTopicConfigMapper; +import com.xzzn.ems.mapper.MqttSyncStrategyLogMapper; +import com.xzzn.framework.web.service.MqttPublisher; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cglib.beans.BeanMap; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +@Aspect +@Component +public class StrategySyncAspect { + @Autowired + private MqttPublisher mqttPublisher; + @Autowired + private MqttSyncStrategyLogMapper mqttSyncStrategyLogMapper; + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final String STRATEGY_TOPIC = "EMS_STRATEGY_UP"; + @Autowired + private EmsMqttTopicConfigMapper emsMqttTopicConfigMapper; + + // 定义切点:拦截策略相关表的Mapper方法 + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsStrategyRunningMapper.stopEmsStrategyRunning(..)) && args(id)) ") + public void stopPointCut(Long id) { + System.out.println("【停止策略切面】StrategyAspect 被实例化"); + } + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsStrategyRunningMapper.insertEmsStrategyRunning(..)) && args(insertEntity)) ") + public void insertPointCut(EmsStrategyRunning insertEntity) { + System.out.println("【新增策略切面】StrategyAspect 被实例化"); + } + @Pointcut("(execution(* com.xzzn.ems.mapper.EmsStrategyRunningMapper.updateEmsStrategyRunning(..)) && args(updateEntity)) ") + public void updatePointCut(EmsStrategyRunning updateEntity) { + System.out.println("【更新策略切面】StrategyAspect 被实例化"); + } + + // 方法执行成功后发布同步消息 + @AfterReturning(pointcut = "updatePointCut(insertEntity)", returning = "result") + public void afterUpdate(JoinPoint joinPoint, EmsStrategyRunning insertEntity, Integer result) { + System.out.println("【更新策略切面进入成功】"); + if (result == 0) { + return; + } + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + String tableName = getTableNameFromMethod(methodName); // 从Mapper类名提取表名 + + // 构建日志同步消息 + MqttSyncStrategyLog message = new MqttSyncStrategyLog(); + message.setSyncId(UUID.randomUUID().toString()); + message.setOperateType(operateType); + message.setTableName(tableName); + message.setCreateTime(new Date()); + message.setTopic(STRATEGY_TOPIC); + message.setStatus("SUCCESS"); + + try { + // 数据转换 + String content = convertEntityToJson(insertEntity); + message.setContent(content); + + // 发布到MQTT主题 + String topic = emsMqttTopicConfigMapper.checkTopicIsExist(STRATEGY_TOPIC); + if (!StringUtils.isEmpty(topic)) { + mqttPublisher.publish(topic, objectMapper.writeValueAsString(message), 1); + } + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncStrategyLogMapper.insertMqttSyncStrategyLog(message); + } + + @AfterReturning(pointcut = "insertPointCut(insertEntity)", returning = "result") + public void afterInsert(JoinPoint joinPoint, EmsStrategyRunning insertEntity, Integer result) { + System.out.println("【新增策略切面进入成功】"); + if (result == 0) { + return; + } + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + String tableName = getTableNameFromMethod(methodName); // 从Mapper类名提取表名 + + // 构建日志同步消息 + MqttSyncStrategyLog message = new MqttSyncStrategyLog(); + message.setSyncId(UUID.randomUUID().toString()); + message.setOperateType(operateType); + message.setTableName(tableName); + message.setCreateTime(new Date()); + message.setTopic(STRATEGY_TOPIC); + message.setStatus("SUCCESS"); + + try { + // 数据转换 + String content = convertEntityToJson(insertEntity); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(STRATEGY_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncStrategyLogMapper.insertMqttSyncStrategyLog(message); + } + + @AfterReturning(pointcut = "stopPointCut(id)", returning = "result") + public void afterStop(JoinPoint joinPoint, Long id, Integer result) { + System.out.println("【停止策略切面进入成功】"); + if (result == 0) { + return; + } + // 解析方法名,获取操作类型(INSERT/UPDATE/DELETE)和表名 + String methodName = joinPoint.getSignature().getName(); + String operateType = getOperateType(methodName); + String tableName = getTableNameFromMethod(methodName); // 从Mapper类名提取表名 + + + // 构建日志同步消息 + MqttSyncStrategyLog message = new MqttSyncStrategyLog(); + message.setSyncId(UUID.randomUUID().toString()); + message.setOperateType(operateType); + message.setTableName(tableName); + message.setCreateTime(new Date()); + message.setTopic(STRATEGY_TOPIC); + message.setStatus("SUCCESS"); + + try { + // 数据转换 + Map idMap = new HashMap<>(); + idMap.put("id", id); // 手动将参数值映射到"id"字段 + String content = JSON.toJSONString(idMap); + message.setContent(content); + + // 发布到MQTT主题 + mqttPublisher.publish(STRATEGY_TOPIC, objectMapper.writeValueAsString(message), 1); + } catch (Exception e) { + message.setStatus("FAIL"); + message.setErrorMsg(e.getMessage()); + } + // 存储同步信息 + mqttSyncStrategyLogMapper.insertMqttSyncStrategyLog(message); + } + + // 从方法名判断操作类型(示例:insert→INSERT,update→UPDATE,delete→DELETE) + private String getOperateType(String methodName) { + if (methodName.startsWith("insert")) return "INSERT"; + if (methodName.startsWith("stop")) return "STOP"; + if (methodName.startsWith("update") || methodName.startsWith("stop")) return "UPDATE"; + if (methodName.startsWith("delete")) return "DELETE"; + return "UNKNOWN"; + } + + // 从Mapper类名提取表名(示例:StrategyMapper→strategy) + private String getTableNameFromMethod(String methodName) { + // 实际需通过JoinPoint获取Mapper类名,再转换为表名(如StrategyTemplateMapper→strategy_template) + return "strategy"; // 简化示例 + } + + // 从方法参数提取数据(示例:若参数是实体类,转成Map) + private Map extractDataFromParams(Object[] args) { + // 实际需反射获取实体类的字段和值(如id、name等) + Map data = new HashMap<>(); + if (args == null || args.length == 0) { + return data; + } + + for (int i = 0; i < args.length; i++) { + Object arg = args[i]; + if (arg == null) { + continue; // 跳过null参数 + } + + // 处理基本类型/包装类/字符串(直接作为值存入,key为"param0"、"param1"等) + if (isBasicType(arg.getClass())) { + String key = "param" + i; // 基本类型参数用"param0"、"param1"作为key + data.put(key, arg); + } else { + Map beanMap = beanToMap(arg); + data.putAll(beanMap); // 合并实体类的字段到结果Map + } + } + + return data; + } + + /** + * 判断是否为基本类型或包装类或字符串 + */ + private boolean isBasicType(Class clazz) { + return clazz.isPrimitive() // 基本类型(int、long、boolean等) + || clazz == String.class // 字符串 + || Number.class.isAssignableFrom(clazz) // 数字包装类(Integer、Long等) + || clazz == Boolean.class; // 布尔包装类 + } + + /** + * 将实体类转换为Map(字段名为key,字段值为value) + */ + private Map beanToMap(Object bean) { + Map map = new HashMap<>(); + if (bean == null) { + return map; + } + + // 方式1:使用BeanMap(简洁高效) + BeanMap beanMap = BeanMap.create(bean); + for (Object key : beanMap.keySet()) { + map.put(key.toString(), beanMap.get(key)); + } + + return map; + } + + // 在方法中转换 + public String convertEntityToJson(EmsStrategyRunning insertEntity) throws Exception { + if (insertEntity == null) { + return null; // 空对象返回空JSON + } + + // 将实体类转换为JSON字符串 + return objectMapper.writeValueAsString(insertEntity); + } + +} \ No newline at end of file diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyService.java index dfeefff..30fb174 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyService.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStrategyService.java @@ -27,4 +27,7 @@ public interface IEmsStrategyService public List getAuxStrategyList(); public int configStrategy(EmsStrategyRunning emsStrategyRunning); + + // 接收云上运行策略配置 + public void dealStrategyData(String content, String operateType); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyServiceImpl.java index 3f358a2..a7e3ad8 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStrategyServiceImpl.java @@ -1,7 +1,10 @@ package com.xzzn.ems.service.impl; import java.util.List; + +import com.alibaba.fastjson2.JSON; import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; import com.xzzn.ems.domain.EmsStrategyRunning; import com.xzzn.ems.domain.vo.StrategyRunningVo; import com.xzzn.ems.mapper.EmsStrategyRunningMapper; @@ -62,4 +65,16 @@ public class EmsStrategyServiceImpl implements IEmsStrategyService emsStrategyRunning.setCreateTime(DateUtils.getNowDate()); return emsStrategyRunningMapper.insertEmsStrategyRunning(emsStrategyRunning); } + + @Override + public void dealStrategyData(String content, String operateType) { + if (StringUtils.isEmpty(content)) { + return; + } +// switch (operateType) { +// case "INSERT": +// EmsStrategyRunning emsStrategyRunning = JSON.parseObject(content, EmsStrategyRunning.class); +// emsStrategyRunningMapper.insertEmsStrategyRunning(emsStrategyRunning); +// } + } }