package com.fs.erp.utils;

import com.fs.erp.constant.ErpTypeConstant;

/**
 * ERP上下文管理工具类
 * 用于管理当前线程的ERP类型信息，供多个服务共享使用
 */
public class ErpContextHolder {

    /**
     * 存储当前线程的ERP类型
     */
    private static final ThreadLocal<String> ERP_TYPE_CONTEXT = new ThreadLocal<>();

    /**
     * 设置当前线程的ERP类型
     * @param erpType ERP类型代码
     */
    public static void setErpType(String erpType) {
        ERP_TYPE_CONTEXT.set(erpType);
    }

    /**
     * 获取当前线程的ERP类型
     * @return 当前ERP类型
     */
    public static String getErpType() {
        String erpType = ERP_TYPE_CONTEXT.get();
        return erpType != null ? erpType : ErpTypeConstant.GY_ERP; // 默认返回GY类型
    }

    /**
     * 清除当前线程的ERP类型
     */
    public static void clear() {
        ERP_TYPE_CONTEXT.remove();
    }

    /**
     * 使用指定的ERP类型执行操作，并自动清理上下文
     * @param erpType ERP类型
     * @param operation 要执行的操作
     * @param <T> 返回值类型
     * @return 操作的返回值
     */
    public static <T> T executeWithErpType(String erpType, ErpOperation<T> operation) {
        try {
            setErpType(erpType);
            return operation.execute();
        } finally {
            clear();
        }
    }

    /**
     * 用于定义在ERP上下文中执行的操作
     * @param <T> 操作返回值类型
     */
    @FunctionalInterface
    public interface ErpOperation<T> {
        T execute();
    }
}
