| package com.dy.pipIrrGlobal.config; | 
|   | 
| import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.apache.ibatis.executor.Executor; | 
| 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 java.lang.reflect.Method; | 
|   | 
| /** | 
|  * @Author: liurunyu | 
|  * @Date: 2025/5/15 11:10 | 
|  * @Description | 
|  */ | 
| /** | 
|  * 拦截虚拟卡表的更新操作,使: | 
|  *   字段in_use意为占用状态,当为true时统一设置值为0 | 
|  *   字段money意为剩余金额,当为true时统一设置值为10000 | 
|  */ | 
| @Intercepts({ | 
|         @Signature( | 
|                 type = Executor.class, | 
|                 method = "update", | 
|                 args = { | 
|                         MappedStatement.class, | 
|                         Object.class | 
|                 } | 
|         ) | 
| }) | 
| @Slf4j | 
| public class VirtualCardSetDefaultInterceptor  implements Interceptor { | 
|   | 
|     static int MAPPED_STATEMENT_INDEX = 0; | 
|     static int PARAMETER_INDEX = 1; | 
|     static String BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETINUSE = "setInUse"; | 
|     static String BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETMONEY = "setMoney"; | 
|   | 
|     @Override | 
|     public Object intercept(Invocation invocation) throws Throwable { | 
|         Object entity = invocation.getArgs()[PARAMETER_INDEX]; | 
|         if (entity instanceof SeVirtualCard) { | 
|             MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[MAPPED_STATEMENT_INDEX]; | 
|             SqlCommandType commandType = mappedStatement.getSqlCommandType(); | 
|             if (commandType.equals(SqlCommandType.UPDATE)) { | 
|                 Class<?> entityClass = entity.getClass(); | 
|                 Method setInUse = null; | 
|                 try { | 
|                     setInUse = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETINUSE, Byte.class); | 
|                 } catch (Exception e) { | 
|                     //当entityClass没有setInUse方法时,会抛出异常 | 
|                 } | 
|                 if (setInUse != null) { | 
|                     setInUse.invoke(entity, (byte)0); | 
|                 } | 
|   | 
|                 Method setMoney = null; | 
|                 try { | 
|                     setMoney = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETMONEY, Double.class); | 
|                 } catch (Exception e) { | 
|                     //当entityClass没有setMoney方法时,会抛出异常 | 
|                 } | 
|                 if (setMoney != null) { | 
|                     setMoney.invoke(entity, 10000.00D); | 
|                 } | 
|                 invocation.getArgs()[PARAMETER_INDEX] = entity; | 
|             } | 
|         } | 
|         return invocation.proceed(); | 
|     } | 
| } |