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(); 
 | 
    } 
 | 
} 
 |