package com.ruoyi.framework.handler;

import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;

/**
 * 按年份参数，组成动态表名
 */
public class YearTableNameHandler implements TableNameHandler {

    //用于记录哪些表可以使用该年份动态表名处理器（即哪些表按年分表）
    private List<String> tableNames;
    //构造函数，构造动态表名处理器的时候，传递tableNames参数
    public YearTableNameHandler(String tableNames) {
        this.tableNames = Arrays.asList(tableNames.split(","));
    }

    //每个请求线程维护一个年份数据，避免多线程数据冲突。所以使用ThreadLocal
    private static final ThreadLocal<String> YEAR_DATA = new ThreadLocal<>();
    //设置请求线程的年份数据
    public static void setData(String month) {
        YEAR_DATA.set(month);
    }
    //删除当前请求线程的年份数据
    public static void removeData() {
        YEAR_DATA.remove();
    }

    //动态表名接口实现方法
    @Override
    public String dynamicTableName(String sql, String tableName) {
        if (this.tableNames.contains(tableName)){
            if (YEAR_DATA.get()==null)
            {
                LocalDate date = LocalDate.now();
                return tableName + "_" + date.format(DateTimeFormatter.ofPattern("yyyy"));  //表名增加年份后缀
            }
            return tableName + "_" + YEAR_DATA.get();  //表名增加年份后缀
        }else{
            return tableName;   //表名原样返回
        }
    }
}
