Răsfoiți Sursa

Merge remote-tracking branch 'origin/master'

luo.yibo@datuai.com 1 an în urmă
părinte
comite
9f4bbfb70c
43 a modificat fișierele cu 419 adăugiri și 184 ștergeri
  1. 9 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteSyncToLocalByKafkaService.java
  2. 33 0
      ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/MessageBo.java
  3. 22 0
      ruoyi-common/ruoyi-common-message/pom.xml
  4. 1 1
      ruoyi-common/ruoyi-common-message/src/main/java/org/dromara/common/message/kafka/aop/annotation/SyncDataToLocal.java
  5. 155 0
      ruoyi-common/ruoyi-common-message/src/main/java/org/dromara/common/message/kafka/aop/aspect/SyncDataToLocalAspect.java
  6. 5 34
      ruoyi-common/ruoyi-common-message/src/main/java/org/dromara/common/message/kafka/constant/MessageEventTypeConstants.java
  7. 1 0
      ruoyi-common/ruoyi-common-message/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  8. 0 106
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/aop/aspect/SyncDataToLocalAspect.java
  9. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtAccountController.java
  10. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtAreaController.java
  11. 1 2
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtMealtypeController.java
  12. 1 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtParameterController.java
  13. 1 5
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtRoomController.java
  14. 2 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/PtAccountBo.java
  15. 11 8
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PayOrderBusiness.java
  16. 5 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtCardController.java
  17. 6 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtSubsidyController.java
  18. 4 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtSubsidyitemController.java
  19. 5 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/bo/PtSubsidyBo.java
  20. 6 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfDiscountController.java
  21. 6 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfDiscounttermController.java
  22. 6 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfLimitedController.java
  23. 5 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfLimitedtermController.java
  24. 6 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfQuotaController.java
  25. 5 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfQuotatermController.java
  26. 7 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfTermController.java
  27. 6 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfDiscountBo.java
  28. 6 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfDiscounttermBo.java
  29. 6 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfLimitedBo.java
  30. 6 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfLimitedtermBo.java
  31. 6 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfQuotaBo.java
  32. 6 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfQuotatermBo.java
  33. 2 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfTermBo.java
  34. 1 7
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/KafkaNormalProducer.java
  35. 46 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/dubbo/RemoteSyncToLocalByKafkaServiceImpl.java
  36. 9 0
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java
  37. 1 3
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtUserAccountController.java
  38. 2 1
      ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PtUserAccountBo.java
  39. 1 1
      ruoyi-modules/ruoyi-backstage/src/test/java/org/dromara/backstage/mq/KafkaProducerTest.java
  40. 5 0
      ruoyi-modules/ruoyi-system/pom.xml
  41. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
  42. 5 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java
  43. 3 3
      ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/yktOperation/SyncRemotePtCardCenterService.java

+ 9 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/RemoteSyncToLocalByKafkaService.java

@@ -0,0 +1,9 @@
+package org.dromara.backstage.api;
+
+import org.dromara.backstage.api.domain.bo.MessageBo;
+
+public interface RemoteSyncToLocalByKafkaService {
+
+    public void sendAndInsert(String topic,Long createBy,
+                              MessageBo<?> data);
+}

+ 33 - 0
ruoyi-api/ruoyi-api-backstage/src/main/java/org/dromara/backstage/api/domain/bo/MessageBo.java

@@ -0,0 +1,33 @@
+package org.dromara.backstage.api.domain.bo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class MessageBo<T> implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 7453594002298127951L;
+
+    private T body;
+
+    private KafkaHeader header=new KafkaHeader();
+
+    @Data
+    public static class KafkaHeader implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 8057319609248473385L;
+        private String eventType;
+
+        private String sender;
+
+        private String tenantId;
+        private long timestamp;
+        private String eventId;
+
+    }
+}
+
+

+ 22 - 0
ruoyi-common/ruoyi-common-message/pom.xml

@@ -17,6 +17,28 @@
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-crypto</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-satoken</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-starter</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-backstage</artifactId>
+            <version>${revision}</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/aop/annotation/SyncDataToLocal.java → ruoyi-common/ruoyi-common-message/src/main/java/org/dromara/common/message/kafka/aop/annotation/SyncDataToLocal.java

@@ -1,4 +1,4 @@
-package org.dromara.backstage.aop.annotation;
+package org.dromara.common.message.kafka.aop.annotation;
 
 import java.lang.annotation.*;
 

+ 155 - 0
ruoyi-common/ruoyi-common-message/src/main/java/org/dromara/common/message/kafka/aop/aspect/SyncDataToLocalAspect.java

@@ -0,0 +1,155 @@
+package org.dromara.common.message.kafka.aop.aspect;
+
+import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.ReflectUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.CodeSignature;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
+import org.dromara.backstage.api.RemoteSyncToLocalByKafkaService;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.message.kafka.constant.KafkaTopicConstants;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.api.model.LoginUser;
+import org.springframework.stereotype.Component;
+import org.dromara.backstage.api.domain.bo.MessageBo;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 同步数据至本地 的 切面
+ *
+ * @author bing
+ */
+@RequiredArgsConstructor
+@Slf4j
+@Aspect
+@Component
+public class SyncDataToLocalAspect {
+
+//    private final KafkaNormalProducer kafkaProducer;
+    @DubboReference
+    private final RemoteSyncToLocalByKafkaService kafkaProducer;
+
+
+    /**
+     * 处理完请求后执行
+     *
+     * @param joinPoint 切点
+     */
+    @AfterReturning(pointcut = "@annotation(syncDataToLocal)", returning = "jsonResult")
+    public void doAfterReturning(JoinPoint joinPoint, SyncDataToLocal syncDataToLocal, Object jsonResult) {
+        if (jsonResult instanceof R<?> r) {
+            if (r.getCode() == R.SUCCESS) {
+                sendSyncMessage(joinPoint, syncDataToLocal);
+            }else{
+                log.error("同步数据消息未发送:controller 方法返回结果未失败!");
+            }
+        }else{
+            log.error("同步数据消息未发送:controller 方法返回不是R类型!");
+        }
+
+    }
+
+    private void sendSyncMessage(JoinPoint joinPoint, SyncDataToLocal controllerSyncData2Local) {
+        try {
+            MessageBo<Object> data = new MessageBo<>();
+            MessageBo.KafkaHeader header = data.getHeader();
+//            header.setTimestamp(System.currentTimeMillis());
+//            header.setEventId(UUID.randomUUID().toString());
+            header.setEventType(controllerSyncData2Local.eventType());
+            header.setSender(controllerSyncData2Local.sender());
+            String sender = header.getSender();
+            String eventType = header.getEventType();
+            if(StringUtils.isBlank(sender) && StringUtils.isNotBlank(eventType)){
+                header.setSender(eventType.substring(0, eventType.lastIndexOf("_")));
+            }
+            String tenantId = header.getTenantId();
+            if(StringUtils.isBlank(tenantId)){
+                tenantId = LoginHelper.getTenantId();
+                header.setTenantId(tenantId);
+            }
+
+            Object[] args = joinPoint.getArgs();
+            int length = args.length;
+            if(length == 1){
+                Field tenantIdFiled = null;
+                //利用反射 判断是否有 tenantId属性,如果有则设置
+                try {
+                    tenantIdFiled = ReflectUtil.getField(args[0].getClass(), "tenantId");
+                }catch (Exception e){
+                    log.error("参数对象没有tenantId属性!");
+                }
+//                Field tenantIdFiled = args[0].getClass().getDeclaredField("tenantId");
+                if(tenantIdFiled != null){
+                    tenantIdFiled.setAccessible(true);
+                    tenantIdFiled.set(args[0],tenantId);
+                }
+                data.setBody(args[0]);
+            }else if(length >1){
+                CodeSignature signature = (CodeSignature) joinPoint.getSignature();
+                String[] paramNames = signature.getParameterNames();
+                Map<String, Object> params = new HashMap<>();
+                for (int i = 0; i < length; i++) {
+//                System.out.println("参数名: " + paramNames[i] + ", 参数值: " + args[i]);
+                    params.put(paramNames[i], args[i]);
+                }
+                data.setBody(params);
+            }else{
+                data.setBody(null);
+            }
+            LoginUser loginUser = LoginHelper.getLoginUser();
+
+            kafkaProducer.sendAndInsert(KafkaTopicConstants.SYNC_DATA_TOPIC, loginUser.getUserId(),data);
+        }catch (Exception e){
+            log.error("同步数据消息未发送:发送消息异常!", e);
+        }
+    }
+
+   /* private void sendSyncMessage(JoinPoint joinPoint, SyncDataToLocal dataToLocal) {
+        try {
+            String tenantId = LoginHelper.getTenantId();
+            Object data = null;
+            Object[] args = joinPoint.getArgs();
+            int length = args.length;
+            if(length == 1){
+                Field tenantIdFiled = null;
+                //利用反射 判断是否有 tenantId属性,如果有则设置
+                try {
+                    tenantIdFiled = ReflectUtil.getField(args[0].getClass(), "tenantId");
+                }catch (Exception e){
+                    log.error("参数对象没有tenantId属性!");
+                }
+//                Field tenantIdFiled = args[0].getClass().getDeclaredField("tenantId");
+                if(tenantIdFiled != null){
+                    tenantIdFiled.setAccessible(true);
+                    tenantIdFiled.set(args[0],tenantId);
+                }
+                data = args[0];
+            }else if(length >1){
+                CodeSignature signature = (CodeSignature) joinPoint.getSignature();
+                String[] paramNames = signature.getParameterNames();
+                Map<String, Object> params = new HashMap<>();
+                for (int i = 0; i < length; i++) {
+                    params.put(paramNames[i], args[i]);
+                }
+                data = params;
+            }
+            LoginUser loginUser = LoginHelper.getLoginUser();
+
+            kafkaProducer.sendAndInsert(KafkaTopicConstants.SYNC_DATA_TOPIC, loginUser.getUserId(),dataToLocal.sender(),
+                dataToLocal.eventType(), tenantId, data);
+        }catch (Exception e){
+            log.error("同步数据消息未发送:发送消息异常!", e);
+        }
+    }*/
+
+
+}

+ 5 - 34
ruoyi-common/ruoyi-common-message/src/main/java/org/dromara/common/message/kafka/constant/MessageEventTypeConstants.java

@@ -6,35 +6,6 @@ package org.dromara.common.message.kafka.constant;
 public class MessageEventTypeConstants {
 
     /**
-     * ptParameter_ADD("YKT_101_ADD","系统参数新增","业务参数-系统参数"),
-     *     ptParameter_EDIT("YKT_101_EDIT","系统参数修改","业务参数-系统参数"),
-     *     ptParameter_REMOVE("YKT_101_REMOVE","系统参数删除","业务参数-系统参数"),
-     *     ptMealtype_ADD("YKT_103_ADD","营业时段新增","业务参数-营业时段"),
-     *     ptMealtype_EDIT("YKT_103_EDIT","营业时段修改","业务参数-营业时段"),
-     *     ptMealtype_REMOVE("YKT_103_REMOVE","营业时段删除","业务参数-营业时段"),
-     *     ptRoom_ADD("YKT_105_ADD","房间新增","房间信息"),
-     *     ptRoom_EDIT("YKT_105_EDIT","房间修改","房间信息"),
-     *     ptRoom_REMOVE("YKT_105_REMOVE","房间删除","房间信息"),
-     *     ptArea_ADD("YKT_106_ADD","区域新增","房间信息"),
-     *     ptArea_EDIT("YKT_106_EDIT","区域修改","房间信息"),
-     *     ptArea_REMOVE("YKT_106_REMOVE","区域删除","房间信息"),
-     *     ptAccount_ADD("YKT_120_ADD","结算账户新增","商户信息-结算账户"),
-     *     ptAccount_EDIT("YKT_120_EDIT","结算账户修改","商户信息-结算账户"),
-     *     ptAccount_REMOVE("YKT_120_REMOVE","结算账户删除","商户信息-结算账户"),
-     *     ptUserAccount_OPEN_EDIT("YKT_107_EDIT","开户","支付管理-账户管理"),
-     *     ptUserAccount_CLOSE_EDIT("YKT_107_EDIT","销户","支付管理-账户管理"),
-     *     ptUserAccount_FREEZE_EDIT("YKT_107_EDIT","冻结","支付管理-账户管理"),
-     *     ptUserAccount_UNFREEZE_EDIT("YKT_107_EDIT","解冻","支付管理-账户管理"),
-     *     ptUserAccount_RESETTIME_EDIT("YKT_108_EDIT","重置有效期","支付管理-账户管理"),
-     *     ptUserAccount_RESETTYPE_EDIT("YKT_107_EDIT","重置卡类别","支付管理-账户管理"),
-     *     user_ADD("YKT_107_ADD","用户新增","系统权限-用户管理"),
-     *     ptCard_CHARGE_EDIT("YKT_109_EDIT","充值","卡务中心-卡务操作"),
-     *     ptCard_refund_EDIT("YKT_110_EDIT","退款","卡务中心-卡务操作"),
-     *     ptCard_supply_EDIT("YKT_111_EDIT","错扣补款","卡务中心-卡务操作"),
-     *     ptCard_multicharge_EDIT("YKT_109_EDIT","批量充值","卡务中心-卡务操作"),
-     *     ptCard_multirefund_EDIT("YKT_110_EDIT","批量退款","卡务中心-卡务操作"),
-     *     ptCard_multiSet_EDIT("YKT_111_EDIT","批量设置余额","卡务中心-卡务操作"),
-     *     ptCard_card_EDIT("YKT_108_EDIT","卡片挂失/解挂","卡务中心-卡务操作"),
      *     subsidy_EDIT("YKT_109_EDIT","补助定时任务","补助管理"),
      *     xfTerm_ADD("YKT_112_ADD","设备新增","消费系统-消费设备"),
      *     xfTerm_EDIT("YKT_112_EDIT","设备修改","消费系统-消费设备"),
@@ -83,7 +54,7 @@ public class MessageEventTypeConstants {
      */
     public static final String CARD_CENTER_SENDER = "YKT_109";
     /**
-     * 卡务操作能模块标识
+     * 消费设备模块标识
      */
     public static final String XF_TERM_SENDER = "YKT_112";
     /**
@@ -91,11 +62,11 @@ public class MessageEventTypeConstants {
      */
     public static final String XF_DISCOUNT_SENDER = "YKT_114";
     /**
-     * 折扣管理能模块标识
+     * 限额管理能模块标识
      */
     public static final String XF_QUOTA_SENDER = "YKT_116";
     /**
-     * 折扣管理能模块标识
+     * 限次管理能模块标识
      */
     public static final String XF_LIMITED_SENDER = "YKT_118";
     /**
@@ -171,7 +142,7 @@ public class MessageEventTypeConstants {
     public static final String	SUBSIDY_EDIT = "YKT_102_EDIT";
     /** 补助设置删除 */
     public static final String	SUBSIDY_REMOVE = "YKT_102_REMOVE";
-    /** 补助设置审核 */
+    /** 补助设置审核 和编辑是同一个接口*/
     public static final String	SUBSIDY_AUDIT = "YKT_102_AUDIT";
     /** 补助明细人员删除 */
     public static final String	SUBSIDY_ITEM_REMOVE = "YKT_102_ITEM_REMOVE";
@@ -212,6 +183,6 @@ public class MessageEventTypeConstants {
     /** 限次设备新增 */
     public static final String	LIMITED_TERM_ADD = "YKT_118_LIMITED_TERM_ADD";
     /** 限次设备删除 */
-    public static final String	LIMITED_TERM_REMOVE = "YKT_118_LIMITED_TERM_REMOVE";
+    public static final String	 LIMITED_TERM_REMOVE = "YKT_118_LIMITED_TERM_REMOVE";
 
 }

+ 1 - 0
ruoyi-common/ruoyi-common-message/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -0,0 +1 @@
+org.dromara.common.message.kafka.aop.aspect.SyncDataToLocalAspect

+ 0 - 106
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/aop/aspect/SyncDataToLocalAspect.java

@@ -1,106 +0,0 @@
-package org.dromara.backstage.aop.aspect;
-
-import cn.hutool.core.lang.UUID;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.aspectj.lang.JoinPoint;
-import org.aspectj.lang.annotation.AfterReturning;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.reflect.CodeSignature;
-import org.dromara.backstage.aop.annotation.SyncDataToLocal;
-import org.dromara.backstage.mq.KafkaProducer;
-import org.dromara.common.core.domain.R;
-import org.dromara.common.message.kafka.constant.KafkaTopicConstants;
-import org.dromara.common.message.kafka.domain.KafkaHeader;
-import org.dromara.common.message.kafka.domain.KafkaMessage;
-import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.common.tenant.core.TenantEntity;
-import org.dromara.system.api.model.LoginUser;
-import org.springframework.boot.autoconfigure.AutoConfiguration;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 同步数据至本地 的 切面
- *
- * @author bing
- */
-@RequiredArgsConstructor
-@Slf4j
-@Aspect
-@Component
-public class SyncDataToLocalAspect {
-
-    private final KafkaProducer kafkaProducer;
-
-
-    /**
-     * 处理完请求后执行
-     *
-     * @param joinPoint 切点
-     */
-    @AfterReturning(pointcut = "@annotation(syncDataToLocal)", returning = "jsonResult")
-    public void doAfterReturning(JoinPoint joinPoint, SyncDataToLocal syncDataToLocal, Object jsonResult) {
-        if (jsonResult instanceof R<?> r) {
-            if (r.getCode() == R.SUCCESS) {
-                sendSyncMessage(joinPoint, syncDataToLocal);
-            }else{
-                log.error("同步数据消息未发送:controller 方法返回结果未失败!");
-            }
-        }else{
-            log.error("同步数据消息未发送:controller 方法返回不是R类型!");
-        }
-
-    }
-
-    private void sendSyncMessage(JoinPoint joinPoint, SyncDataToLocal controllerSyncData2Local) {
-        try {
-            KafkaMessage<Object> data = new KafkaMessage<>();
-            KafkaHeader header = data.getHeader();
-            header.setTimestamp(System.currentTimeMillis());
-            header.setEventId(UUID.randomUUID().toString());
-            header.setEventType(controllerSyncData2Local.eventType());
-            header.setSender(controllerSyncData2Local.sender());
-            String sender = header.getSender();
-            String eventType = header.getEventType();
-            if(StringUtils.isBlank(sender) && StringUtils.isNotBlank(eventType)){
-                header.setSender(eventType.substring(0, eventType.lastIndexOf("_")));
-            }
-            String tenantId = header.getTenantId();
-            if(StringUtils.isBlank(tenantId)){
-                header.setTenantId(LoginHelper.getTenantId());
-            }
-
-            Object[] args = joinPoint.getArgs();
-            int length = args.length;
-            if(length == 1){
-                if(args[0] instanceof TenantEntity r){
-                    r.setTenantId(header.getTenantId());
-                    data.setBody(r);
-                }else{
-                    data.setBody(args[0]);
-                }
-            }else if(length >1){
-                CodeSignature signature = (CodeSignature) joinPoint.getSignature();
-                String[] paramNames = signature.getParameterNames();
-                Map<String, Object> params = new HashMap<>();
-                for (int i = 0; i < length; i++) {
-//                System.out.println("参数名: " + paramNames[i] + ", 参数值: " + args[i]);
-                    params.put(paramNames[i], args[i]);
-                }
-                data.setBody(params);
-            }else{
-                data.setBody(null);
-            }
-            LoginUser loginUser = LoginHelper.getLoginUser();
-            kafkaProducer.sendKafkaMessage(KafkaTopicConstants.SYNC_DATA_TOPIC, loginUser.getUserId(),data);
-        }catch (Exception e){
-            log.error("同步数据消息未发送:发送消息异常!", e);
-        }
-    }
-
-
-}

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtAccountController.java

@@ -6,7 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.dromara.backstage.aop.annotation.SyncDataToLocal;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtAreaController.java

@@ -6,7 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.dromara.backstage.aop.annotation.SyncDataToLocal;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;

+ 1 - 2
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtMealtypeController.java

@@ -6,8 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.dromara.backstage.aop.annotation.SyncDataToLocal;
-import org.dromara.common.message.kafka.constant.MessageEventTypeConstants;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtParameterController.java

@@ -6,7 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.dromara.backstage.aop.annotation.SyncDataToLocal;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;

+ 1 - 5
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/controller/PtRoomController.java

@@ -4,20 +4,16 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.collection.CollectionUtil;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.apache.commons.collections4.CollectionUtils;
-import org.dromara.backstage.aop.annotation.SyncDataToLocal;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.dromara.backstage.basics.domain.bo.PtRoomBatchSetBo;
 import org.dromara.backstage.basics.domain.vo.PtAreaVo;
 import org.dromara.backstage.basics.domain.vo.PtRoomTempImportVo;
 import org.dromara.backstage.basics.listener.PtRoomImportListener;
 import org.dromara.common.excel.core.ExcelResult;
-import org.dromara.common.message.kafka.constant.MessageEventTypeConstants;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;

+ 2 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/basics/domain/bo/PtAccountBo.java

@@ -8,6 +8,7 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+import org.dromara.common.tenant.core.TenantEntity;
 
 /**
  * 结算账户业务对象 t_pt_account
@@ -18,7 +19,7 @@ import jakarta.validation.constraints.*;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = PtAccount.class, reverseConvertGenerate = false)
-public class PtAccountBo extends BaseEntity {
+public class PtAccountBo extends TenantEntity {
 
     /**
      * 结算账户Id,主键

+ 11 - 8
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/business/payments/PayOrderBusiness.java

@@ -204,6 +204,7 @@ public class PayOrderBusiness {
                 return R.fail(result.getMsg());
             }
         } catch (Exception e) {
+            log.error("充值失败",e);
             return R.fail(e.getMessage());
         }
     }
@@ -215,22 +216,24 @@ public class PayOrderBusiness {
     @Transactional(rollbackFor = ConsumeException.class)
     public R<PurseInOutBo>refund(PurseInOutBo bo){
         //校验钱包余额是否充足
-        PtBagVo bagVo = payBaseBusiness.checkUserBag(bo);
-        if (bagVo.getBalance().compareTo(bo.getReceiptMoney()) < 0) {
-            return R.fail(MessageFormat.format("钱包余额不足,当前余额为:{0}", bagVo.getBalance()),bo);
+        PurseInOutBo boCopy = BeanUtil.copyProperties(bo, PurseInOutBo.class);
+        PtBagVo bagVo = payBaseBusiness.checkUserBag(boCopy);
+        if (bagVo.getBalance().compareTo(boCopy.getReceiptMoney()) < 0) {
+            return R.fail(MessageFormat.format("钱包余额不足,当前余额为:{0}", bagVo.getBalance()),boCopy);
         }
-        bo.setUseType(SystemUseTypeEnum.CONSUME);
+        boCopy.setUseType(SystemUseTypeEnum.CONSUME);
         //退款是记支出,所以金额设置为负数
-        bo.setReceiptMoney(bo.getReceiptMoney().negate());
+        boCopy.setReceiptMoney(boCopy.getReceiptMoney().negate());
         try {
-            R<PurseInOutBo> result = createNormalOrder(bo);
+            R<PurseInOutBo> result = createNormalOrder(boCopy);
             if (result.getCode() == R.SUCCESS) {
                 return R.ok(result.getData());
             } else {
-                return R.fail(result.getMsg(),bo);
+                return R.fail(result.getMsg(),boCopy);
             }
         } catch (Exception e) {
-            return R.fail(e.getMessage(),bo);
+            log.error("退款失败",e);
+            return R.fail(e.getMessage(),boCopy);
         }
     }
 

+ 5 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtCardController.java

@@ -17,6 +17,7 @@ import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.web.core.BaseController;
@@ -25,6 +26,8 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+
 /**
  * 账户卡片
  * 前端访问路由地址为:/cardOperation/ptCard
@@ -113,6 +116,7 @@ public class PtCardController extends BaseController {
     @SaCheckPermission("cardOperation:ptCard:edit")
     @Log(title = "账户卡片", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = ptCard_CARD_LOCK, sender = CARD_CENTER_SENDER)
     @PutMapping("/lockCard/{cardId}")
     public R<Void> lockPtCard(@PathVariable Long cardId) {
         return toAjax(ptCardService.lockCard(cardId));
@@ -124,6 +128,7 @@ public class PtCardController extends BaseController {
     @SaCheckPermission("cardOperation:ptCard:edit")
     @Log(title = "账户卡片", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = ptCard_CARD_UNLOCK, sender = CARD_CENTER_SENDER)
     @PutMapping("/unlockCard/{cardId}")
     public R<Void> unlockPtCard(@PathVariable Long cardId) {
         return toAjax(ptCardService.unlockCard(cardId));

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtSubsidyController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -22,6 +23,8 @@ import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyBo;
 import org.dromara.backstage.cardCenter.service.IPtSubsidyService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+
 /**
  * 补助设置
  * 前端访问路由地址为:/subsidy/ptSubsidy
@@ -75,6 +78,7 @@ public class PtSubsidyController extends BaseController {
     @SaCheckPermission("subsidy:ptSubsidy:add")
     @Log(title = "补助设置", businessType = BusinessType.INSERT)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = SUBSIDY_ADD, sender = SUBSIDY_SENDER)
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody PtSubsidyBo bo) {
         return toAjax(ptSubsidyService.insertByBo(bo));
@@ -86,6 +90,7 @@ public class PtSubsidyController extends BaseController {
     @SaCheckPermission("subsidy:ptSubsidy:edit")
     @Log(title = "补助设置", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = SUBSIDY_EDIT, sender = SUBSIDY_SENDER)
     @PutMapping()
     public R<Void> edit(@Validated(EditGroup.class) @RequestBody PtSubsidyBo bo) {
         return toAjax(ptSubsidyService.updateByBo(bo));
@@ -98,6 +103,7 @@ public class PtSubsidyController extends BaseController {
      */
     @SaCheckPermission("subsidy:ptSubsidy:remove")
     @Log(title = "补助设置", businessType = BusinessType.DELETE)
+    @SyncDataToLocal(eventType = SUBSIDY_REMOVE, sender = SUBSIDY_SENDER)
     @DeleteMapping("/{mainIds}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable Long[] mainIds) {

+ 4 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtSubsidyitemController.java

@@ -8,6 +8,7 @@ import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyReportBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyReportVo;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -24,6 +25,8 @@ import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
 import org.dromara.backstage.cardCenter.service.IPtSubsidyitemService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+
 /**
  * 补助明细
  * 前端访问路由地址为:/subsidy/ptSubsidyitem
@@ -102,6 +105,7 @@ public class PtSubsidyitemController extends BaseController {
      */
     @SaCheckPermission("subsidy:ptSubsidyitem:remove")
     @Log(title = "补助明细", businessType = BusinessType.DELETE)
+    @SyncDataToLocal(eventType = SUBSIDY_ITEM_REMOVE, sender = SUBSIDY_SENDER)
     @DeleteMapping("/{itemIds}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable Long[] itemIds) {

+ 5 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/domain/bo/PtSubsidyBo.java

@@ -10,7 +10,9 @@ import org.dromara.backstage.cardCenter.domain.PtSubsidy;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.tenant.core.TenantEntity;
 
+import java.io.Serial;
 import java.util.Date;
 import java.util.List;
 
@@ -23,8 +25,10 @@ import java.util.List;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = PtSubsidy.class, reverseConvertGenerate = false)
-public class PtSubsidyBo extends BaseEntity {
+public class PtSubsidyBo extends TenantEntity {
 
+    @Serial
+    private static final long serialVersionUID = 1844034081728852725L;
     /**
      * ID
      */

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfDiscountController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -22,6 +23,8 @@ import org.dromara.backstage.consumption.domain.bo.XfDiscountBo;
 import org.dromara.backstage.consumption.service.IXfDiscountService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+
 /**
  * 折扣管理
  * 前端访问路由地址为:/consumption/xfDiscount
@@ -75,6 +78,7 @@ public class XfDiscountController extends BaseController {
     @SaCheckPermission("consumption:xfDiscount:add")
     @Log(title = "折扣管理", businessType = BusinessType.INSERT)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = xfDiscount_ADD, sender = XF_DISCOUNT_SENDER)
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody XfDiscountBo bo) {
         return toAjax(xfDiscountService.insertByBo(bo));
@@ -86,6 +90,7 @@ public class XfDiscountController extends BaseController {
     @SaCheckPermission("consumption:xfDiscount:edit")
     @Log(title = "折扣管理", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = xfDiscount_EDIT, sender = XF_DISCOUNT_SENDER)
     @PutMapping()
     public R<Void> edit(@Validated(EditGroup.class) @RequestBody XfDiscountBo bo) {
         return toAjax(xfDiscountService.updateByBo(bo));
@@ -98,6 +103,7 @@ public class XfDiscountController extends BaseController {
      */
     @SaCheckPermission("consumption:xfDiscount:remove")
     @Log(title = "折扣管理", businessType = BusinessType.DELETE)
+    @SyncDataToLocal(eventType = xfDiscount_REMOVE, sender = XF_DISCOUNT_SENDER)
     @DeleteMapping("/{discountIds}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable Long[] discountIds) {

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfDiscounttermController.java

@@ -22,6 +22,10 @@ import org.dromara.backstage.consumption.domain.bo.XfDiscounttermBo;
 import org.dromara.backstage.consumption.service.IXfDiscounttermService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
+
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+
 /**
  * 折扣设备
  * 前端访问路由地址为:/consumption/xfDiscountterm
@@ -75,6 +79,7 @@ public class XfDiscounttermController extends BaseController {
     @SaCheckPermission("consumption:xfDiscountterm:add")
     @Log(title = "折扣设备", businessType = BusinessType.INSERT)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = DISCOUNT_TERM_ADD, sender = XF_DISCOUNT_SENDER)
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody XfDiscounttermBo bo) {
         return toAjax(xfDiscounttermService.insertByBo(bo));
@@ -109,6 +114,7 @@ public class XfDiscounttermController extends BaseController {
      */
     @SaCheckPermission("consumption:xfDiscountterm:remove")
     @Log(title = "折扣设备", businessType = BusinessType.DELETE)
+    @SyncDataToLocal(eventType = DISCOUNT_TERM_REMOVE, sender = XF_DISCOUNT_SENDER)
     @DeleteMapping("/{discountTermIds}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable Long[] discountTermIds) {

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfLimitedController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -22,6 +23,8 @@ import org.dromara.backstage.consumption.domain.bo.XfLimitedBo;
 import org.dromara.backstage.consumption.service.IXfLimitedService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+
 /**
  * 限次管理
  * 前端访问路由地址为:/consumption/xfLimited
@@ -75,6 +78,7 @@ public class XfLimitedController extends BaseController {
     @SaCheckPermission("consumption:xfLimited:add")
     @Log(title = "限次管理", businessType = BusinessType.INSERT)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = xfLimited_ADD, sender = XF_LIMITED_SENDER)
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody XfLimitedBo bo) {
         return toAjax(xfLimitedService.insertByBo(bo));
@@ -86,6 +90,7 @@ public class XfLimitedController extends BaseController {
     @SaCheckPermission("consumption:xfLimited:edit")
     @Log(title = "限次管理", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = xfLimited_EDIT, sender = XF_LIMITED_SENDER)
     @PutMapping()
     public R<Void> edit(@Validated(EditGroup.class) @RequestBody XfLimitedBo bo) {
         return toAjax(xfLimitedService.updateByBo(bo));
@@ -98,6 +103,7 @@ public class XfLimitedController extends BaseController {
      */
     @SaCheckPermission("consumption:xfLimited:remove")
     @Log(title = "限次管理", businessType = BusinessType.DELETE)
+    @SyncDataToLocal(eventType = xfLimited_REMOVE, sender = XF_LIMITED_SENDER)
     @DeleteMapping("/{limitedIds}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable Long[] limitedIds) {

+ 5 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfLimitedtermController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -22,6 +23,8 @@ import org.dromara.backstage.consumption.domain.bo.XfLimitedtermBo;
 import org.dromara.backstage.consumption.service.IXfLimitedtermService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+
 /**
  * 限次设备绑定
  * 前端访问路由地址为:/consumption/xfLimitedterm
@@ -75,6 +78,7 @@ public class XfLimitedtermController extends BaseController {
     @SaCheckPermission("consumption:xfLimitedterm:add")
     @Log(title = "限次设备绑定", businessType = BusinessType.INSERT)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = LIMITED_TERM_ADD, sender = XF_LIMITED_SENDER)
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody XfLimitedtermBo bo) {
         return toAjax(xfLimitedtermService.insertByBo(bo));
@@ -109,6 +113,7 @@ public class XfLimitedtermController extends BaseController {
      */
     @SaCheckPermission("consumption:xfLimitedterm:remove")
     @Log(title = "限次设备绑定", businessType = BusinessType.DELETE)
+    @SyncDataToLocal(eventType = LIMITED_TERM_REMOVE, sender = XF_LIMITED_SENDER)
     @DeleteMapping("/{limitedTermIds}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable Long[] limitedTermIds) {

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfQuotaController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -22,6 +23,8 @@ import org.dromara.backstage.consumption.domain.bo.XfQuotaBo;
 import org.dromara.backstage.consumption.service.IXfQuotaService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+
 /**
  * 限额管理
  * 前端访问路由地址为:/consumption/xfQuota
@@ -75,6 +78,7 @@ public class XfQuotaController extends BaseController {
     @SaCheckPermission("consumption:xfQuota:add")
     @Log(title = "限额管理", businessType = BusinessType.INSERT)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = xfQuota_ADD, sender = XF_QUOTA_SENDER)
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody XfQuotaBo bo) {
         return toAjax(xfQuotaService.insertByBo(bo));
@@ -86,6 +90,7 @@ public class XfQuotaController extends BaseController {
     @SaCheckPermission("consumption:xfQuota:edit")
     @Log(title = "限额管理", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = xfQuota_EDIT, sender = XF_QUOTA_SENDER)
     @PutMapping()
     public R<Void> edit(@Validated(EditGroup.class) @RequestBody XfQuotaBo bo) {
         return toAjax(xfQuotaService.updateByBo(bo));
@@ -98,6 +103,7 @@ public class XfQuotaController extends BaseController {
      */
     @SaCheckPermission("consumption:xfQuota:remove")
     @Log(title = "限额管理", businessType = BusinessType.DELETE)
+    @SyncDataToLocal(eventType = xfQuota_REMOVE, sender = XF_QUOTA_SENDER)
     @DeleteMapping("/{quotaIds}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable Long[] quotaIds) {

+ 5 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfQuotatermController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -22,6 +23,8 @@ import org.dromara.backstage.consumption.domain.bo.XfQuotatermBo;
 import org.dromara.backstage.consumption.service.IXfQuotatermService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+
 /**
  * 限额设备绑定
  * 前端访问路由地址为:/consumption/xfQuotaterm
@@ -75,6 +78,7 @@ public class XfQuotatermController extends BaseController {
     @SaCheckPermission("consumption:xfQuotaterm:add")
     @Log(title = "限额设备绑定", businessType = BusinessType.INSERT)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = QUOTA_TERM_ADD, sender = XF_QUOTA_SENDER)
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody XfQuotatermBo bo) {
         return toAjax(xfQuotatermService.insertByBo(bo));
@@ -109,6 +113,7 @@ public class XfQuotatermController extends BaseController {
      */
     @SaCheckPermission("consumption:xfQuotaterm:remove")
     @Log(title = "限额设备绑定", businessType = BusinessType.DELETE)
+    @SyncDataToLocal(eventType = QUOTA_TERM_REMOVE, sender = XF_QUOTA_SENDER)
     @DeleteMapping("/{quotaTermIds}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable Long[] quotaTermIds) {

+ 7 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfTermController.java

@@ -14,6 +14,7 @@ import org.dromara.backstage.consumption.domain.bo.XfTermImportBo;
 import org.dromara.backstage.consumption.domain.bo.XfTermParamBo;
 import org.dromara.backstage.consumption.domain.vo.XfTermParamVo;
 import org.dromara.common.excel.core.ExcelResult;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
@@ -32,6 +33,8 @@ import org.dromara.backstage.consumption.service.IXfTermService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.springframework.web.multipart.MultipartFile;
 
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+
 /**
  * 消费设备
  * 前端访问路由地址为:/consumption/xfTerm
@@ -117,6 +120,7 @@ public class XfTermController extends BaseController {
     @SaCheckPermission("consumption:xfTerm:add")
     @Log(title = "消费设备", businessType = BusinessType.INSERT)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = xfTerm_ADD, sender = XF_TERM_SENDER)
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody XfTermBo bo) {
         return toAjax(xfTermService.insertByBo(bo));
@@ -128,6 +132,7 @@ public class XfTermController extends BaseController {
     @SaCheckPermission("consumption:xfTerm:edit")
     @Log(title = "消费设备", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = xfTerm_EDIT, sender = XF_TERM_SENDER)
     @PutMapping()
     public R<Void> edit(@Validated(EditGroup.class) @RequestBody XfTermBo bo) {
         return toAjax(xfTermService.updateByBo(bo));
@@ -139,6 +144,7 @@ public class XfTermController extends BaseController {
     @SaCheckPermission("consumption:xfTerm:edit")
     @Log(title = "消费设备参数编辑", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = xfTerm_param_EDIT, sender = XF_TERM_SENDER)
     @PostMapping("/updateParam")
     public R<Void> editParam(@Validated @RequestBody XfTermParamBo bo) {
         return toAjax(xfTermService.updateParamByBo(bo));
@@ -151,6 +157,7 @@ public class XfTermController extends BaseController {
      */
     @SaCheckPermission("consumption:xfTerm:remove")
     @Log(title = "消费设备", businessType = BusinessType.DELETE)
+    @SyncDataToLocal(eventType = xfTerm_REMOVE, sender = XF_TERM_SENDER)
     @DeleteMapping("/{termIds}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable Long[] termIds) {

+ 6 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfDiscountBo.java

@@ -8,6 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
 
 /**
  * 折扣管理业务对象 t_xf_discount
@@ -18,8 +21,10 @@ import jakarta.validation.constraints.*;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = XfDiscount.class, reverseConvertGenerate = false)
-public class XfDiscountBo extends BaseEntity {
+public class XfDiscountBo extends TenantEntity {
 
+    @Serial
+    private static final long serialVersionUID = 8266533741772394214L;
     /**
      * 折扣Id,主键
      */

+ 6 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfDiscounttermBo.java

@@ -8,6 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
 
 /**
  * 折扣设备业务对象 t_xf_discountTerm
@@ -18,8 +21,10 @@ import jakarta.validation.constraints.*;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = XfDiscountterm.class, reverseConvertGenerate = false)
-public class XfDiscounttermBo extends BaseEntity {
+public class XfDiscounttermBo extends TenantEntity {
 
+    @Serial
+    private static final long serialVersionUID = 5738441094984271180L;
     /**
      * 折扣Id,主键
      */

+ 6 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfLimitedBo.java

@@ -8,6 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
 
 /**
  * 限次管理业务对象 t_xf_limited
@@ -18,8 +21,10 @@ import jakarta.validation.constraints.*;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = XfLimited.class, reverseConvertGenerate = false)
-public class XfLimitedBo extends BaseEntity {
+public class XfLimitedBo extends TenantEntity {
 
+    @Serial
+    private static final long serialVersionUID = -4008672184060799105L;
     /**
      * 限次Id,主键
      */

+ 6 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfLimitedtermBo.java

@@ -8,6 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
 
 /**
  * 限次设备绑定业务对象 t_xf_limitedTerm
@@ -18,8 +21,10 @@ import jakarta.validation.constraints.*;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = XfLimitedterm.class, reverseConvertGenerate = false)
-public class XfLimitedtermBo extends BaseEntity {
+public class XfLimitedtermBo extends TenantEntity {
 
+    @Serial
+    private static final long serialVersionUID = -3270258400346750990L;
     /**
      * 限次Id,主键
      */

+ 6 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfQuotaBo.java

@@ -8,6 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
 
 /**
  * 限额管理业务对象 t_xf_quota
@@ -18,8 +21,10 @@ import jakarta.validation.constraints.*;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = XfQuota.class, reverseConvertGenerate = false)
-public class XfQuotaBo extends BaseEntity {
+public class XfQuotaBo extends TenantEntity {
 
+    @Serial
+    private static final long serialVersionUID = -4088318196574232331L;
     /**
      * 限额Id,主键
      */

+ 6 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfQuotatermBo.java

@@ -8,6 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+import org.dromara.common.tenant.core.TenantEntity;
+
+import java.io.Serial;
 
 /**
  * 限额设备绑定业务对象 t_xf_quotaTerm
@@ -18,8 +21,10 @@ import jakarta.validation.constraints.*;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = XfQuotaterm.class, reverseConvertGenerate = false)
-public class XfQuotatermBo extends BaseEntity {
+public class XfQuotatermBo extends TenantEntity {
 
+    @Serial
+    private static final long serialVersionUID = 1406757870540616686L;
     /**
      * 限额Id,主键
      */

+ 2 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/XfTermBo.java

@@ -8,6 +8,7 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+import org.dromara.common.tenant.core.TenantEntity;
 
 import java.io.Serial;
 import java.math.BigDecimal;
@@ -22,7 +23,7 @@ import java.util.Date;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = XfTerm.class, reverseConvertGenerate = false)
-public class XfTermBo extends BaseEntity {
+public class XfTermBo extends TenantEntity {
 
     @Serial
     private static final long serialVersionUID = 3335304346440907682L;

+ 1 - 7
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/KafkaProducer.java → ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/KafkaNormalProducer.java

@@ -1,31 +1,25 @@
 package org.dromara.backstage.mq;
 
-import cn.hutool.core.lang.UUID;
-import com.alibaba.excel.util.StringUtils;
 import com.alibaba.fastjson2.JSON;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.kafka.clients.producer.ProducerRecord;
 import org.dromara.backstage.basics.domain.bo.SendMessageRecordBo;
 import org.dromara.backstage.basics.service.ISendMessageRecordService;
-import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.message.kafka.constant.KafkaTopicConstants;
 import org.dromara.common.message.kafka.domain.KafkaHeader;
 import org.dromara.common.message.kafka.domain.KafkaMessage;
-import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.system.api.model.LoginUser;
 import org.springframework.kafka.core.KafkaTemplate;
 import org.springframework.kafka.support.SendResult;
 import org.springframework.stereotype.Component;
 
 import java.util.Date;
-import java.util.List;
 import java.util.concurrent.CompletableFuture;
 
 @RequiredArgsConstructor
 @Slf4j
 @Component
-public class KafkaProducer {
+public class KafkaNormalProducer {
 
     private final KafkaTemplate<String, String> kafkaTemplate;
 

+ 46 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/mq/dubbo/RemoteSyncToLocalByKafkaServiceImpl.java

@@ -0,0 +1,46 @@
+package org.dromara.backstage.mq.dubbo;
+
+import cn.hutool.core.lang.UUID;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.aspectj.lang.reflect.CodeSignature;
+import org.dromara.backstage.api.RemoteSyncToLocalByKafkaService;
+import org.dromara.backstage.api.domain.bo.MessageBo;
+import org.dromara.backstage.mq.KafkaNormalProducer;
+import org.dromara.common.message.kafka.domain.KafkaHeader;
+import org.dromara.common.message.kafka.domain.KafkaMessage;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.tenant.core.TenantEntity;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 发送Kafka消息并入库
+ * @author : bing
+ */
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteSyncToLocalByKafkaServiceImpl implements RemoteSyncToLocalByKafkaService {
+
+    private final KafkaNormalProducer kafkaProducer;
+
+
+    @Override
+    public void sendAndInsert(String topic, Long createBy, MessageBo<?> data) {
+        KafkaMessage<Object> message = new KafkaMessage<>();
+        KafkaHeader header = message.getHeader();
+        header.setTimestamp(System.currentTimeMillis());
+        header.setEventId(UUID.randomUUID().toString());
+        MessageBo.KafkaHeader dataHeader = data.getHeader();
+        header.setEventType(dataHeader.getEventType());
+        header.setSender(dataHeader.getSender());
+        header.setTenantId(dataHeader.getTenantId());
+        message.setBody(data.getBody());
+        kafkaProducer.sendKafkaMessage(topic,createBy,message);
+    }
+}

+ 9 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtBagController.java

@@ -22,6 +22,7 @@ import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
@@ -35,6 +36,8 @@ import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.dromara.common.message.kafka.constant.MessageEventTypeConstants.*;
+
 /**
  * 账户钱包
  * 前端访问路由地址为:/payment/ptBag
@@ -134,6 +137,7 @@ public class PtBagController extends BaseController {
     @SaCheckPermission("payment:ptBag:edit")
     @Log(title = "账户钱包", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = ptCard_CHARGE_EDIT, sender = CARD_CENTER_SENDER)
     @PostMapping("/recharge")
     public R<PurseInOutBo> recharge(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
         return payOrderBusiness.recharge(bo);
@@ -145,6 +149,7 @@ public class PtBagController extends BaseController {
     @SaCheckPermission("payment:ptBag:edit")
     @Log(title = "账户钱包", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = ptCard_refund_EDIT, sender = CARD_CENTER_SENDER)
     @PostMapping("/refund")
     public R<PurseInOutBo> refund(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo) {
         return payOrderBusiness.refund(bo);
@@ -156,6 +161,7 @@ public class PtBagController extends BaseController {
     @SaCheckPermission("cardOperation:ptCard:edit")
     @Log(title = "批量账户充值", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = ptCard_multicharge_EDIT, sender = CARD_CENTER_SENDER)
     @PostMapping("/recharge/{userIds}")
     public R<String> batchRecharge(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo, @PathVariable Long[] userIds) {
         // TODO 2024-10-30 09:49:36 luoyibo 这里最好是提前处理下工作站信息
@@ -190,6 +196,7 @@ public class PtBagController extends BaseController {
     @SaCheckPermission("cardOperation:ptCard:edit")
     @Log(title = "账户批量退款", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = ptCard_multirefund_EDIT, sender = CARD_CENTER_SENDER)
     @PostMapping("/refund/{userIds}")
     public R<Void> batchRefund(@Validated(EditGroup.class) @RequestBody PurseInOutBo bo, @PathVariable Long[] userIds) {
         List<String> resultList = new ArrayList<>();
@@ -223,6 +230,7 @@ public class PtBagController extends BaseController {
     @SaCheckPermission("cardOperation:ptCard:edit")
     @Log(title = "账户批量设置余额", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = ptCard_multiSet_EDIT, sender = CARD_CENTER_SENDER)
     @PostMapping("/recover/{userIds}")
     public R<Void> batchRecover(@Validated(EditGroup.class) @RequestBody PtBagBo bo, @PathVariable Long[] userIds) {
         bo.setUseType(SystemUseTypeEnum.CONSUME);
@@ -241,6 +249,7 @@ public class PtBagController extends BaseController {
     @SaCheckPermission("payment:ptBag:edit")
     @Log(title = "账户钱包", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
+    @SyncDataToLocal(eventType = ptCard_supply_EDIT, sender = CARD_CENTER_SENDER)
     @PostMapping("/err-fill")
     public R<PtBagVo> errFill(@Validated(EditGroup.class) @RequestBody ConsumptionBo bo) {
         bo.setUseType(SystemUseTypeEnum.CONSUME);

+ 1 - 3
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/controller/PtUserAccountController.java

@@ -1,7 +1,6 @@
 package org.dromara.backstage.payment.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.lang.UUID;
 import cn.hutool.core.lang.tree.Tree;
 import jakarta.servlet.http.HttpServletResponse;
@@ -9,7 +8,7 @@ import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboReference;
-import org.dromara.backstage.aop.annotation.SyncDataToLocal;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.dromara.backstage.cardCenter.domain.bo.PtCardBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtCardVo;
 import org.dromara.backstage.cardCenter.service.IPtCardService;
@@ -43,7 +42,6 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 

+ 2 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/domain/bo/PtUserAccountBo.java

@@ -17,6 +17,7 @@ import java.util.List;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.common.sensitive.annotation.Sensitive;
 import org.dromara.common.sensitive.core.SensitiveStrategy;
+import org.dromara.common.tenant.core.TenantEntity;
 
 /**
  * 一卡通账户业务对象 t_pt_userAccount
@@ -27,7 +28,7 @@ import org.dromara.common.sensitive.core.SensitiveStrategy;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = PtUserAccount.class, reverseConvertGenerate = false)
-public class PtUserAccountBo extends BaseEntity {
+public class PtUserAccountBo extends TenantEntity {
 
     /**
      * 账户Id,主键

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/test/java/org/dromara/backstage/mq/KafkaProducerTest.java

@@ -8,7 +8,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 public class KafkaProducerTest {
 
     @Autowired
-    private KafkaProducer kafkaProcedurer;
+    private KafkaNormalProducer kafkaProcedurer;
 
     @Test
     public void send()

+ 5 - 0
ruoyi-modules/ruoyi-system/pom.xml

@@ -136,6 +136,11 @@
             <version>2.2.0</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-message</artifactId>
+            <version>${revision}</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java

@@ -17,6 +17,8 @@ import org.dromara.common.excel.core.ExcelResult;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.message.kafka.constant.MessageEventTypeConstants;
+import org.dromara.common.message.kafka.aop.annotation.SyncDataToLocal;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
@@ -151,6 +153,7 @@ public class SysUserController extends BaseController {
      */
     @SaCheckPermission("system:user:add")
     @Log(title = "用户管理", businessType = BusinessType.INSERT)
+    @SyncDataToLocal(eventType = MessageEventTypeConstants.user_ADD,sender = MessageEventTypeConstants.USER_ACCOUNT_SENDER)
     @PostMapping
     public R<Void> add(@Validated @RequestBody SysUserBo user) {
         deptService.checkDeptDataScope(user.getDeptId());

+ 5 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java

@@ -17,8 +17,10 @@ import org.dromara.common.encrypt.enumd.AlgorithmType;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.sensitive.annotation.Sensitive;
 import org.dromara.common.sensitive.core.SensitiveStrategy;
+import org.dromara.common.tenant.core.TenantEntity;
 import org.dromara.system.domain.SysUser;
 
+import java.io.Serial;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -33,8 +35,10 @@ import java.util.List;
 @NoArgsConstructor
 @EqualsAndHashCode(callSuper = true)
 @AutoMapper(target = SysUser.class, reverseConvertGenerate = false)
-public class SysUserBo extends BaseEntity {
+public class SysUserBo extends TenantEntity {
 
+    @Serial
+    private static final long serialVersionUID = 3998379076407791877L;
     /**
      * 用户ID
      */

+ 3 - 3
ruoyi-server/ruoyi-server-base/src/main/java/org/dromara/server/base/service/yktOperation/SyncRemotePtCardCenterService.java

@@ -57,7 +57,7 @@ public class SyncRemotePtCardCenterService {
     public void batchRecharge(Object msg) throws ServiceException{
         JSONObject msgObj = JSONUtil.parseObj(msg);
         RemotePurseInOutBo bo = msgObj.getJSONObject("bo").toBean(RemotePurseInOutBo.class);
-        Long[] userIds = (Long[]) msgObj.get("userIds");
+        Long[] userIds = msgObj.getJSONArray("userIds").toArray(new Long[0]);
         boolean flag = bagService.batchRecharge(bo, userIds);
         if (!flag){
             throw new ServiceException("批量充值失败");
@@ -70,7 +70,7 @@ public class SyncRemotePtCardCenterService {
     public void batchRefund(Object msg) throws ServiceException{
         JSONObject msgObj = JSONUtil.parseObj(msg);
         RemotePurseInOutBo bo = msgObj.getJSONObject("bo").toBean(RemotePurseInOutBo.class);
-        Long[] userIds = (Long[]) msgObj.get("userIds");
+        Long[] userIds =  msgObj.getJSONArray("userIds").toArray(new Long[0]);
         boolean flag = bagService.batchRefund(bo, userIds);
         if (!flag){
             throw new ServiceException("批量退款失败");
@@ -83,7 +83,7 @@ public class SyncRemotePtCardCenterService {
     public void batchSetBalance(Object msg) throws ServiceException{
         JSONObject msgObj = JSONUtil.parseObj(msg);
         RemotePurseInOutBo bo = msgObj.getJSONObject("bo").toBean(RemotePurseInOutBo.class);
-        Long[] userIds = (Long[]) msgObj.get("userIds");
+        Long[] userIds =  msgObj.getJSONArray("userIds").toArray(new Long[0]);
         boolean flag = bagService.batchSetBalance(bo, userIds);
         if (!flag){
             throw new ServiceException("批量设置余额失败");