#
zhou zhou
昨天 4259deb19122a4807d50c99ed4a95405ebe4a47c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package com.vincent.rsf.server.common.config;
 
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.MybatisMapWrapperFactory;
import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal;
import com.baomidou.mybatisplus.extension.parser.cache.JdkSerialCaffeineJsqlParseCache;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.vincent.rsf.server.system.entity.User;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.transaction.annotation.EnableTransactionManagement;
 
import java.util.Arrays;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
 
/**
 * MybatisPlus配置
 *
 * @author vincent
 * @since 2018-02-22 11:29:28
 */
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
 
    private static volatile boolean jsqlParserConfigured = false;
 
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        configureJsqlParser();
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
 
        // 添加乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
 
        // 多租户插件配置
        TenantLineHandler tenantLineHandler = new TenantLineHandler() {
            @Override
            public Expression getTenantId() {
                return getLoginUserTenantId();
            }
 
            @Override
            public boolean ignoreTable(String tableName) {
                return Arrays.asList(
                        "sys_tenant",
                        "sys_host",
                        "sys_user_role",
                        "sys_role_menu",
                        "sys_menu",
                        "sys_pda_role_menu",
                        "sys_menu_pda",
                        "sys_matnr_role_menu",
                        "sys_warehouse_role_menu",
                        "man_loc_type_rela",
                        "man_qly_inspect_result",
                        "view_stock_manage",
                        "view_stock_statistic",
                        "man_transfer_order",
                        "man_wave_order_rela"
                ).contains(tableName);
            }
        };
        TenantLineInnerInterceptor tenantLineInnerInterceptor = new TenantLineInnerInterceptor(tenantLineHandler);
        interceptor.addInnerInterceptor(tenantLineInnerInterceptor);
 
        // 分页插件配置
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
 
        return interceptor;
    }
 
    private void configureJsqlParser() {
        if (jsqlParserConfigured) {
            return;
        }
        synchronized (MybatisPlusConfig.class) {
            if (jsqlParserConfigured) {
                return;
            }
            AtomicInteger threadIndex = new AtomicInteger(1);
            int parserThreads = Math.max(4, Runtime.getRuntime().availableProcessors());
            ThreadPoolExecutor parserExecutor = new ThreadPoolExecutor(
                    parserThreads,
                    parserThreads,
                    0L,
                    TimeUnit.MILLISECONDS,
                    new LinkedBlockingQueue<>(2048),
                    runnable -> {
                        Thread thread = new Thread(runnable);
                        thread.setName("jsql-parser-" + threadIndex.getAndIncrement());
                        thread.setDaemon(true);
                        return thread;
                    },
                    new ThreadPoolExecutor.CallerRunsPolicy()
            );
            JsqlParserGlobal.setExecutorService(parserExecutor, new Thread(() -> {
                if (!parserExecutor.isShutdown()) {
                    parserExecutor.shutdown();
                }
            }, "jsql-parser-shutdown"));
            JsqlParserGlobal.setJsqlParseCache(new JdkSerialCaffeineJsqlParseCache(builder ->
                    builder.maximumSize(1024).expireAfterAccess(30, TimeUnit.MINUTES)));
            jsqlParserConfigured = true;
        }
    }
 
    /**
     * 获取当前登录用户的租户id
     *
     * @return Integer
     */
    public Expression getLoginUserTenantId() {
        try {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            if (authentication != null) {
                Object object = authentication.getPrincipal();
                if (object instanceof User) {
                    return new LongValue(((User) object).getTenantId());
                }
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        //TODO 需设置一个系统调度帐号
//        return new NullValue();
        return new LongValue(1);
    }
 
 
    /**
     * 解决Map映射非驼峰
     * @return
     */
    @Bean
    public ConfigurationCustomizer mybatisConfigurationCustomizer(){
        return new ConfigurationCustomizer() {
            /**
             * Customize the given a {@link MybatisConfiguration} object.
             *
             * @param configuration the configuration object to customize
             */
            @Override
            public void customize(MybatisConfiguration configuration) {
                configuration.setObjectWrapperFactory(new MybatisMapWrapperFactory());
            }
        };
    }
}