From 90663502f2520e8cfa7f6d8a887e46d2cf61be2f Mon Sep 17 00:00:00 2001
From: yanderong <307678080@qq.com>
Date: 星期五, 03 七月 2026 22:07:57 +0800
Subject: [PATCH] feat: 余额变更增加记录和查询

---
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/MybatisConfig.java                          |   21 +++++++
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TravelCardServiceImpl.java |    2 
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java           |    6 --
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java                 |    3 
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TravelCard.xml              |    5 -
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml          |    4 +
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java          |    6 --
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/BalanceUpdateInterceptor.java           |   81 +++++++++++++++++++-------
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TravelCardMapper.java               |    3 -
 9 files changed, 86 insertions(+), 45 deletions(-)

diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java
index 953a03a..66d442f 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/MultiDataSourceConfig.java
@@ -6,10 +6,8 @@
 import com.stylefeng.guns.core.config.properties.DruidProperties;
 import com.stylefeng.guns.core.config.properties.MutiDataSourceProperties;
 import com.stylefeng.guns.core.datascope.DataScopeInterceptor;
-import com.stylefeng.guns.core.intercept.BalanceUpdateInterceptor;
 import com.stylefeng.guns.core.mutidatasource.DynamicDataSource;
 import com.stylefeng.guns.core.mutidatasource.aop.MultiSourceExAop;
-import org.apache.ibatis.plugin.Interceptor;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -125,8 +123,4 @@
         return new DataSourceTransactionManager(mutiDataSource);
     }
 
-    @Bean
-    public Interceptor balanceUpdateInterceptor() {
-        return new BalanceUpdateInterceptor();
-    }
 }
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java
index b3f510b..6496133 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/datasource/SingleDataSourceConfig.java
@@ -5,8 +5,6 @@
 import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
 import com.stylefeng.guns.core.config.properties.DruidProperties;
 import com.stylefeng.guns.core.datascope.DataScopeInterceptor;
-import com.stylefeng.guns.core.intercept.BalanceUpdateInterceptor;
-import org.apache.ibatis.plugin.Interceptor;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
@@ -59,9 +57,5 @@
         return new OptimisticLockerInterceptor();
     }
 
-    @Bean
-    public Interceptor balanceUpdateInterceptor() {
-        return new BalanceUpdateInterceptor();
-    }
 }
 
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/MybatisConfig.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/MybatisConfig.java
new file mode 100644
index 0000000..7849d33
--- /dev/null
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/config/web/MybatisConfig.java
@@ -0,0 +1,21 @@
+package com.stylefeng.guns.config.web;
+
+import com.stylefeng.guns.core.intercept.BalanceUpdateInterceptor;
+import org.apache.ibatis.plugin.Interceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+/**
+ * @author Lux
+ * @version 1.0.0
+ * @since 2026/7/3 14:33
+ */
+@Configuration
+public class MybatisConfig {
+
+    @Bean
+    public Interceptor balanceUpdateInterceptor() {
+        return new BalanceUpdateInterceptor();
+    }
+}
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/BalanceUpdateInterceptor.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/BalanceUpdateInterceptor.java
index 1aafcfa..9c135bc 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/BalanceUpdateInterceptor.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/core/intercept/BalanceUpdateInterceptor.java
@@ -1,19 +1,18 @@
 package com.stylefeng.guns.core.intercept;
 
-import com.stylefeng.guns.modular.system.dao.TravelCardMapper;
 import com.stylefeng.guns.modular.system.dao.UserInfoMapper;
 import com.stylefeng.guns.modular.system.model.UserInfo;
 import com.stylefeng.guns.modular.system.model.vo.BalanceModifyRecordVo;
-import org.apache.ibatis.javassist.bytecode.analysis.Executor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.executor.Executor;
 import org.apache.ibatis.mapping.BoundSql;
 import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.mapping.SqlCommandType;
-import org.apache.ibatis.plugin.Interceptor;
-import org.apache.ibatis.plugin.Intercepts;
-import org.apache.ibatis.plugin.Invocation;
-import org.apache.ibatis.plugin.Signature;
+import org.apache.ibatis.plugin.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Component;
+import org.springframework.util.ReflectionUtils;
 
 import java.lang.reflect.Field;
 import java.util.Map;
@@ -26,15 +25,17 @@
  * @version 1.0.0
  * @since 2026/7/3 12:03
  */
+@Slf4j
 @Component
 @Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
 public class BalanceUpdateInterceptor implements Interceptor {
 
     @Autowired
-    private UserInfoMapper userInfoMapper;
+    private ApplicationContext context;
 
-    @Autowired
-    private TravelCardMapper travelCardMapper;
+    private UserInfoMapper getMapper() {
+        return context.getBean(UserInfoMapper.class);
+    }
 
     @Override
     public Object intercept(Invocation invocation) throws Throwable {
@@ -59,22 +60,22 @@
         // 关键:先执行前查旧值(需要拿 userId)
         Long userId = extractUserId(param);
         // 查询旧的用户
-        UserInfo oldUser = userInfoMapper.selectById(userId);
+        UserInfo oldUser = getMapper().selectById(userId);
         // 执行更新
         Object result = invocation.proceed();
         // 查新的用户
-        UserInfo newUser = userInfoMapper.selectById(userId);
+        UserInfo newUser = getMapper().selectById(userId);
 
         // 新增余额的变更记录(所有余额的变更记录都需要存)
         if(Objects.nonNull(oldUser) && Objects.nonNull(newUser)) {
-            travelCardMapper.insertBalanceModifyRecord(BalanceModifyRecordVo.convert(oldUser, newUser));
+            getMapper().insertBalanceModifyRecord(BalanceModifyRecordVo.convert(oldUser, newUser));
         }
         return result;
     }
 
     @Override
     public Object plugin(Object target) {
-        return null;
+        return Plugin.wrap(target, this);
     }
 
     @Override
@@ -86,19 +87,53 @@
      * 获取用户id
      */
     private Long extractUserId(Object param) {
-        // 兼容 Map / entity / wrapper
-        if (param instanceof Map) {
-            Object id = ((Map<?, ?>) param).get("id");
-            return id == null ? null : Long.valueOf(id.toString());
-        }
 
-        try {
-            Field f = param.getClass().getDeclaredField("id");
-            f.setAccessible(true);
-            return (Long) f.get(param);
-        } catch (Exception e) {
+        if (param == null) {
             return null;
         }
+
+        // MyBatis ParamMap
+        if (param instanceof Map) {
+
+            Map<?, ?> map = (Map<?, ?>) param;
+
+            // 第一种:直接传id
+            try{
+                Object id = map.get("id");
+                if (id != null) {
+                    return Long.valueOf(id.toString());
+                }
+            }
+            catch (Exception e){
+                log.error("sql中没有id");
+            }
+
+
+            // 第二种:MyBatis-Plus update(entity, wrapper)
+            Object entity = map.get("param1");
+            if (entity == null) {
+                entity = map.get("et");
+            }
+
+            if (entity != null) {
+                return extractId(entity);
+            }
+        }
+
+        // 直接就是实体
+        return extractId(param);
+    }
+
+    private Long extractId(Object obj) {
+        Field field = ReflectionUtils.findField(obj.getClass(), "id");
+        if (field == null) {
+            return null;
+        }
+
+        ReflectionUtils.makeAccessible(field);
+        Object value = ReflectionUtils.getField(field, obj);
+
+        return value == null ? null : Long.valueOf(value.toString());
     }
 
 }
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TravelCardMapper.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TravelCardMapper.java
index 1eb34d0..35aeef6 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TravelCardMapper.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TravelCardMapper.java
@@ -13,9 +13,6 @@
 
     TravelCard getTravelCardByCardNo(@Param("cardNo") String cardNo);
 
-    void insertBalanceModifyRecord(@Param("recordVo") BalanceModifyRecordVo recordVo);
-
-
     List<BalanceModifyRecordVo> getBalanceModifyRecord(@Param("userId") Integer userId,
                                                        @Param("type") Integer type,
                                                        @Param("startDate") String startDate,
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java
index 076e8b6..9dd6254 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/UserInfoMapper.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.mapper.BaseMapper;
 import com.stylefeng.guns.modular.system.model.UserInfo;
+import com.stylefeng.guns.modular.system.model.vo.BalanceModifyRecordVo;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -58,6 +59,6 @@
 
     Integer getDiscount();
 
-
+    void insertBalanceModifyRecord(@Param("recordVo") BalanceModifyRecordVo recordVo);
 
 }
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TravelCard.xml b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TravelCard.xml
index 1c22a2f..95aa2eb 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TravelCard.xml
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TravelCard.xml
@@ -6,11 +6,6 @@
         select * from t_travel_card where cardNo = #{cardNo}
     </select>
 
-    <select id="insertBalanceModifyRecord">
-        insert into t_balance_modify_record (recordID, userId, userName, phone, money, type, createTime)
-        values (#{recordVo.recordID}, #{recordVo.userId}, #{recordVo.userName}, #{recordVo.phone}, #{recordVo.money}, #{recordVo.type}, #{recordVo.createTime})
-    </select>
-
     <select id="getBalanceModifyRecord" resultType="com.stylefeng.guns.modular.system.model.vo.BalanceModifyRecordVo">
         select * from t_balance_modify_record
         where userId = #{userId}
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml
index 748a4b6..126bf2b 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/UserInfoMapper.xml
@@ -199,4 +199,8 @@
         select id from t_user_activity where now() between startTime and endTime and status =3 order by id limit 1
     </select>
 
+    <select id="insertBalanceModifyRecord">
+        insert into t_balance_modify_record (recordID, userId, userName, phone, money, type, createTime)
+        values (#{recordVo.recordID}, #{recordVo.userId}, #{recordVo.userName}, #{recordVo.phone}, #{recordVo.money}, #{recordVo.type}, #{recordVo.createTime})
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TravelCardServiceImpl.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TravelCardServiceImpl.java
index e36c2ae..a867e65 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TravelCardServiceImpl.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TravelCardServiceImpl.java
@@ -62,7 +62,7 @@
             travelCard.setRechargeTime(new Date());
             this.baseMapper.updateById(travelCard);
             // 新增余额变更记录(出行卡兑换类型)
-           //  this.baseMapper.insertBalanceModifyRecord(BalanceModifyRecordVo.convert(userInfo.getId(), userInfo.getNickName(), userInfo.getPhone(), travelCard.getAmount()));
+            // this.baseMapper.insertBalanceModifyRecord(BalanceModifyRecordVo.convert(userInfo.getId(), userInfo.getNickName(), userInfo.getPhone(), travelCard.getAmount()));
         }
         return travelCard.getAmount();
     }

--
Gitblit v1.7.1