///*
// *    Copyright (c) 2018-2025, lengleng All rights reserved.
// *
// * Redistribution and use in source and binary forms, with or without
// * modification, are permitted provided that the following conditions are met:
// *
// * Redistributions of source code must retain the above copyright notice,
// * this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// * notice, this list of conditions and the following disclaimer in the
// * documentation and/or other materials provided with the distribution.
// * Neither the name of the pig4cloud.com developer nor the names of its
// * contributors may be used to endorse or promote products derived from
// * this software without specific prior written permission.
// * Author: lengleng (wangiegie@gmail.com)
// */
//
//package com.dsk.common.tenant.helper;
//
//import cn.dev33.satoken.context.SaHolder;
//import cn.dev33.satoken.spring.SpringMVCUtil;
//import cn.hutool.core.convert.Convert;
//import com.alibaba.ttl.TransmittableThreadLocal;
//import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
//import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
//import com.dsk.common.constant.GlobalConstants;
//import com.dsk.common.helper.LoginHelper;
//import com.dsk.common.utils.StringUtils;
//import com.dsk.common.utils.redis.RedisUtils;
//import com.dsk.common.utils.spring.SpringUtils;
//import lombok.experimental.UtilityClass;
//
//import java.util.function.Supplier;
//
///**
// * @author lengleng
// * @date 2022/10/4 租户工具类
// */
//@UtilityClass
//public class TenantContextHolder {
//
//    private static final String DYNAMIC_TENANT_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicTenant";
//
//
//	private final ThreadLocal<String> THREAD_LOCAL_TENANT = new TransmittableThreadLocal<>();
//
//	private final ThreadLocal<Boolean> THREAD_LOCAL_TENANT_SKIP_FLAG = new TransmittableThreadLocal<>();
//
//    /**
//     * 租户功能是否启用
//     */
//    public static boolean isEnable() {
//        return Convert.toBool(SpringUtils.getProperty("tenant.enable"), false);
//    }
//
//    /**
//     * 开启忽略租户(开启后需手动调用 {@link #disableIgnore()} 关闭)
//     */
//    public static void enableIgnore() {
//        InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build());
//    }
//
//    /**
//     * 关闭忽略租户
//     */
//    public static void disableIgnore() {
//        InterceptorIgnoreHelper.clearIgnoreStrategy();
//    }
//
//    /**
//     * 在忽略租户中执行
//     *
//     * @param handle 处理执行方法
//     */
//    public static void ignore(Runnable handle) {
//        enableIgnore();
//        try {
//            handle.run();
//        } finally {
//            disableIgnore();
//        }
//    }
//
//    /**
//     * 在忽略租户中执行
//     *
//     * @param handle 处理执行方法
//     */
//    public static <T> T ignore(Supplier<T> handle) {
//        enableIgnore();
//        try {
//            return handle.get();
//        } finally {
//            disableIgnore();
//        }
//    }
//
//    /**
//     * 设置动态租户(一直有效 需要手动清理)
//     * <p>
//     * 如果为非web环境 那么只在当前线程内生效
//     */
//    public static void setDynamic(String tenantId) {
//        if (!SpringMVCUtil.isWeb()) {
//            THREAD_LOCAL_TENANT.set(tenantId);
//            return;
//        }
//        String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
//        RedisUtils.setCacheObject(cacheKey, tenantId);
//        SaHolder.getStorage().set(cacheKey, tenantId);
//    }
//
//    /**
//     * 获取动态租户(一直有效 需要手动清理)
//     * <p>
//     * 如果为非web环境 那么只在当前线程内生效
//     */
//    public static String getDynamic() {
//        if (!SpringMVCUtil.isWeb()) {
//            return THREAD_LOCAL_TENANT.get();
//        }
//        String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
//        String tenantId = (String) SaHolder.getStorage().get(cacheKey);
//        if (StringUtils.isNotBlank(tenantId)) {
//            return tenantId;
//        }
//        tenantId = RedisUtils.getCacheObject(cacheKey);
//        SaHolder.getStorage().set(cacheKey, tenantId);
//        return tenantId;
//    }
//
//    /**
//     * 清除动态租户
//     */
//    public static void clearDynamic() {
//        if (!SpringMVCUtil.isWeb()) {
//            THREAD_LOCAL_TENANT.remove();
//            return;
//        }
//        String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
//        RedisUtils.deleteObject(cacheKey);
//        SaHolder.getStorage().delete(cacheKey);
//    }
//
//    /**
//     * 获取当前租户id(动态租户优先)
//     */
//    public static String getTenantId() {
//        String tenantId = TenantHelper.getDynamic();
//        if (StringUtils.isBlank(tenantId)) {
//            tenantId = LoginHelper.getTenantId();
//        }
//        return tenantId;
//    }
//
//
//
//
//    /**
//	 * TTL 设置租户ID<br/>
//	 * <b>谨慎使用此方法,避免嵌套调用。尽量使用 {@code TenantBroker} </b>
//	 * @param tenantId
//	 * @see TenantBroker
//	 */
//	public void setTenantId(String tenantId) {
//		THREAD_LOCAL_TENANT.set(tenantId);
//	}
//
//	/**
//	 * 设置是否过滤的标识
//	 */
//	public void setTenantSkip() {
//		THREAD_LOCAL_TENANT_SKIP_FLAG.set(Boolean.TRUE);
//	}
//
////	/**
////	 * 获取TTL中的租户ID
////	 * @return
////	 */
////	public String getTenantId() {
////		return THREAD_LOCAL_TENANT.get();
////	}
//
//	/**
//	 * 获取是否跳过租户过滤的标识
//	 * @return
//	 */
//	public Boolean getTenantSkip() {
//		return THREAD_LOCAL_TENANT_SKIP_FLAG.get() != null && THREAD_LOCAL_TENANT_SKIP_FLAG.get();
//	}
//
//	public void clear() {
//		THREAD_LOCAL_TENANT.remove();
//		THREAD_LOCAL_TENANT_SKIP_FLAG.remove();
//	}
//
//}
