增加 payapi-sdk 支持多租户
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/MultiTenantAutoConfig.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/MultiTenantAutoConfig.java
new file mode 100644
index 0000000..f849cea
--- /dev/null
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/MultiTenantAutoConfig.java
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay.paysdk;
+
+import com.supwisdom.dlpay.paysdk.tenant.DefaultMultiTenantProviderFactory;
+import com.supwisdom.dlpay.paysdk.tenant.MultiTenantProviderFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MultiTenantAutoConfig {
+  @Bean
+  @ConditionalOnMissingBean(MultiTenantProviderFactory.class)
+  public MultiTenantProviderFactory defaultFactory() {
+    return new DefaultMultiTenantProviderFactory();
+  }
+}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java
index 1002d52..0a11f39 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/PayAPIRequestInterceptor.java
@@ -1,18 +1,36 @@
 package com.supwisdom.dlpay.paysdk;
 
+import com.supwisdom.dlpay.paysdk.tenant.MultiTenantProviderFactory;
 import com.supwisdom.dlpay.paysdk.utils.Constants;
 import com.supwisdom.dlpay.paysdk.utils.JwtContext;
 import feign.RequestInterceptor;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Component;
 
 @Component
 public class PayAPIRequestInterceptor {
+
+  @Value("${payapi.tenantid:}")
+  private String tenantid;
+
+  private final MultiTenantProviderFactory tenantProviderFactory;
+
+  public PayAPIRequestInterceptor(MultiTenantProviderFactory tenantProviderFactory) {
+    this.tenantProviderFactory = tenantProviderFactory;
+  }
+
   @Bean
   public RequestInterceptor headerInterceptor() {
     return requestTemplate -> {
       // 小示例,没什么卵用
-      requestTemplate.header(Constants.HEADER_TENANT_ID, "{tenantid}");
+      String tenant;
+      if (tenantid != null || "".equals(tenantid)) {
+        tenant = tenantProviderFactory.getProvider().getCurrentTenant();
+      } else {
+        tenant = tenantid;
+      }
+      requestTemplate.header(Constants.HEADER_TENANT_ID, tenant);
       String jwt = JwtContext.getJwt();
       if (jwt != null) {
         requestTemplate.header(Constants.JWT_HEADER, "Bearer " + jwt);
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/DefaultMultiTenantProvider.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/DefaultMultiTenantProvider.java
new file mode 100644
index 0000000..95dd221
--- /dev/null
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/DefaultMultiTenantProvider.java
@@ -0,0 +1,8 @@
+package com.supwisdom.dlpay.paysdk.tenant;
+
+public class DefaultMultiTenantProvider implements MultiTenantProvider {
+  @Override
+  public String getCurrentTenant() {
+    return "{tenantid}";
+  }
+}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/DefaultMultiTenantProviderFactory.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/DefaultMultiTenantProviderFactory.java
new file mode 100644
index 0000000..0b42fa3
--- /dev/null
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/DefaultMultiTenantProviderFactory.java
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.paysdk.tenant;
+
+public class DefaultMultiTenantProviderFactory implements MultiTenantProviderFactory {
+  private MultiTenantProvider provider = new DefaultMultiTenantProvider();
+
+  public MultiTenantProvider getProvider() {
+    return provider;
+  }
+}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/MultiTenantProvider.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/MultiTenantProvider.java
new file mode 100644
index 0000000..5db786c
--- /dev/null
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/MultiTenantProvider.java
@@ -0,0 +1,5 @@
+package com.supwisdom.dlpay.paysdk.tenant;
+
+public interface MultiTenantProvider {
+  String getCurrentTenant();
+}
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/MultiTenantProviderFactory.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/MultiTenantProviderFactory.java
new file mode 100644
index 0000000..bc137c7
--- /dev/null
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/tenant/MultiTenantProviderFactory.java
@@ -0,0 +1,5 @@
+package com.supwisdom.dlpay.paysdk.tenant;
+
+public interface MultiTenantProviderFactory {
+  MultiTenantProvider getProvider();
+}
diff --git a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
index 1916f7a..231a684 100644
--- a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
+++ b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
@@ -294,7 +294,4 @@
 
   }
 
-  public static void main(String[] args) {
-
-  }
 }
diff --git a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/MultiTenantProxyTest.java b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/MultiTenantProxyTest.java
new file mode 100644
index 0000000..45b1b4c
--- /dev/null
+++ b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/MultiTenantProxyTest.java
@@ -0,0 +1,56 @@
+package com.supwisdom.dlpay.paysdktest;
+
+import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
+import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
+import com.supwisdom.dlpay.paysdk.tenant.MultiTenantProvider;
+import com.supwisdom.dlpay.paysdk.tenant.MultiTenantProviderFactory;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
+import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.TestConfiguration;
+import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.cloud.openfeign.FeignAutoConfiguration;
+import org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Primary;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+//@SpringBootTest(properties = {
+//    "payapi.url=http://localhost:8080/payapi"},
+//    classes = MultiTenantProxyTest.class)
+@ImportAutoConfiguration({RibbonAutoConfiguration.class,
+    FeignRibbonClientAutoConfiguration.class, FeignAutoConfiguration.class,
+    HttpMessageConvertersAutoConfiguration.class})
+@EnableFeignClients(basePackages = "com.supwisdom.dlpay.paysdk")
+@ComponentScan(basePackages = {"com.supwisdom.dlpay.paysdk"})
+public class MultiTenantProxyTest {
+
+  @Autowired
+  private ApiLoginProxy apiLoginProxy;
+
+  private final static String appid = "700001";
+  private final static String secret = "d6dd7f0d4551419d8d11736d0f28df0d";
+
+
+  @TestConfiguration
+  static class MultiTenantTestBean {
+    @Bean
+    @Primary
+    public MultiTenantProviderFactory newProviderFactory() {
+      return () -> (MultiTenantProvider) () -> "122020";
+    }
+  }
+
+
+  @Test
+  public void testMultiTenant() {
+    ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
+    helper.login(appid, secret);
+  }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/CheckFileProviderContext.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/CheckFileProviderContext.java
index ef92fb5..e9b6c43 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/CheckFileProviderContext.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/CheckFileProviderContext.java
@@ -18,7 +18,7 @@
     try {
       return (CheckFileProvider) applicationContext.getBean(name + "CheckFileProvider");
     } catch (BeansException ex) {
-      log.error("未定义 sourcetype <$sourcetype> 对账处理 Provider");
+      log.error("未定义 sourcetype <{}> 对账处理 Provider", name);
       return null;
     }
   }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantCatalog.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantCatalog.java
new file mode 100644
index 0000000..3647664
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TTenantCatalog.java
@@ -0,0 +1,71 @@
+package com.supwisdom.dlpay.framework.domain;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "tb_tenant_catalog")
+@SequenceGenerator(name = "tenant_catalog_seq")
+public class TTenantCatalog {
+  @Id
+  @Column(name = "id")
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tenant_catalog_seq")
+  private Integer id;
+
+  @Column(name = "tenantid", length = 32)
+  @NotNull
+  private String tenantid;
+
+  @Column(name = "datecenter", length = 10)
+  @NotNull
+  private String dataCenter;
+
+  @Column(name = "expire_date")
+  @NotNull
+  private Timestamp expireDate;
+
+  @Column(name = "enabled")
+  @NotNull
+  private Boolean enabled;
+
+  public Integer getId() {
+    return id;
+  }
+
+  public void setId(Integer id) {
+    this.id = id;
+  }
+
+  public String getTenantid() {
+    return tenantid;
+  }
+
+  public void setTenantid(String tenantid) {
+    this.tenantid = tenantid;
+  }
+
+  public String getDataCenter() {
+    return dataCenter;
+  }
+
+  public void setDataCenter(String dataCenter) {
+    this.dataCenter = dataCenter;
+  }
+
+  public Timestamp getExpireDate() {
+    return expireDate;
+  }
+
+  public void setExpireDate(Timestamp expireDate) {
+    this.expireDate = expireDate;
+  }
+
+  public Boolean getEnabled() {
+    return enabled;
+  }
+
+  public void setEnabled(Boolean enabled) {
+    this.enabled = enabled;
+  }
+}