diff --git a/pigx-visual/pigx-bi-platform/Dockerfile b/pigx-visual/pigx-bi-platform/Dockerfile
new file mode 100644
index 000000000..db83183b2
--- /dev/null
+++ b/pigx-visual/pigx-bi-platform/Dockerfile
@@ -0,0 +1,18 @@
+FROM pig4cloud/java:8-jre
+
+MAINTAINER wangiegie@gmail.com
+
+ENV TZ=Asia/Shanghai
+ENV JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"
+
+RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+
+RUN mkdir -p /pigx-bi-platform
+
+WORKDIR /pigx-bi-platform
+
+EXPOSE 5006
+
+ADD ./target/pigx-bi-platform.jar ./
+
+CMD sleep 60;java $JAVA_OPTS -jar pigx-bi-platform.jar
diff --git a/pigx-visual/pigx-bi-platform/pom.xml b/pigx-visual/pigx-bi-platform/pom.xml
new file mode 100755
index 000000000..2725c6a0f
--- /dev/null
+++ b/pigx-visual/pigx-bi-platform/pom.xml
@@ -0,0 +1,83 @@
+
+
+ 4.0.0
+
+ com.pig4cloud
+ pigx-visual
+ 3.10.0
+
+
+ pigx-bi-platform
+ jar
+
+ 基于 ureport 的报表系统
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+ com.pig4cloud
+ pigx-common-sentinel
+
+
+
+ com.bstek.ureport
+ ureport2-console
+ ${ureport.version}
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-undertow
+
+
+
+
+ javax.servlet
+ javax.servlet-api
+
+
+
+
+ com.pig4cloud
+ pigx-common-oss
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ io.fabric8
+ docker-maven-plugin
+
+ false
+
+
+
+
+
diff --git a/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/PigxBiApplication.java b/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/PigxBiApplication.java
new file mode 100755
index 000000000..b959114e6
--- /dev/null
+++ b/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/PigxBiApplication.java
@@ -0,0 +1,38 @@
+/*
+ * 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.pig4cloud.pigx.ureport;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.cloud.client.SpringCloudApplication;
+
+/**
+ * @author lengleng
+ * @date 2020-10-15 报表模块
+ *
+ * 此模块由于使用的是ureport 封装报表设计器,无法区分租户权限较大建议不提供具体租户使用。
+ *
+ * http://127.0.0.1:5006/ureport/designer
+ */
+@SpringCloudApplication
+public class PigxBiApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(PigxBiApplication.class, args);
+ }
+
+}
diff --git a/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/config/UreportAutoConfiguration.java b/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/config/UreportAutoConfiguration.java
new file mode 100755
index 000000000..dd8fd416b
--- /dev/null
+++ b/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/config/UreportAutoConfiguration.java
@@ -0,0 +1,26 @@
+package com.pig4cloud.pigx.ureport.config;
+
+import com.bstek.ureport.console.UReportServlet;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.ImportResource;
+
+/**
+ * @author lengleng
+ * @date 2020/7/25
+ *
+ * ureport 配置类
+ */
+@Configuration(proxyBeanMethods = false)
+@ImportResource(UreportAutoConfiguration.CONTEXT)
+public class UreportAutoConfiguration {
+
+ static final String CONTEXT = "classpath:ureport-console-context.xml";
+
+ @Bean
+ public ServletRegistrationBean buildUreportServlet() {
+ return new ServletRegistrationBean<>(new UReportServlet(), "/ureport/*");
+ }
+
+}
diff --git a/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/config/UreportExtConfig.java b/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/config/UreportExtConfig.java
new file mode 100755
index 000000000..27cf097b2
--- /dev/null
+++ b/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/config/UreportExtConfig.java
@@ -0,0 +1,52 @@
+package com.pig4cloud.pigx.ureport.config;
+
+import com.bstek.ureport.UReportPropertyPlaceholderConfigurer;
+import com.bstek.ureport.provider.report.ReportProvider;
+import com.pig4cloud.pigx.common.oss.OssProperties;
+import com.pig4cloud.pigx.common.oss.service.OssTemplate;
+import com.pig4cloud.pigx.ureport.processor.UReportPropertyPlaceholderConfigurerPlus;
+import com.pig4cloud.pigx.ureport.provider.DfsReportProvider;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.web.servlet.LocaleResolver;
+import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
+
+import java.util.Locale;
+
+/**
+ * @author lengleng
+ * @date 2020/7/25
+ *
+ * 增强默认Ureport 行为
+ */
+@ConditionalOnClass(OssTemplate.class)
+@Configuration(proxyBeanMethods = false)
+public class UreportExtConfig {
+
+ @Bean
+ public ReportProvider dfsReportProvider(OssTemplate ossTemplate, OssProperties properties) {
+ return new DfsReportProvider(ossTemplate, properties);
+ }
+
+ @Bean
+ public UReportPropertyPlaceholderConfigurer uReportPropertyPlaceholderConfigurerPlus() {
+ return new UReportPropertyPlaceholderConfigurerPlus();
+ }
+
+ @Bean
+ @Primary
+ public LocaleResolver localeResolver() {
+
+ AcceptHeaderLocaleResolver lr = new AcceptHeaderLocaleResolver();
+
+ // 设置默认区域,
+
+ lr.setDefaultLocale(Locale.CHINA);
+
+ return lr;
+
+ }
+
+}
diff --git a/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/processor/UReportPropertyPlaceholderConfigurerPlus.java b/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/processor/UReportPropertyPlaceholderConfigurerPlus.java
new file mode 100755
index 000000000..475bcb4fd
--- /dev/null
+++ b/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/processor/UReportPropertyPlaceholderConfigurerPlus.java
@@ -0,0 +1,24 @@
+package com.pig4cloud.pigx.ureport.processor;
+
+import com.bstek.ureport.UReportPropertyPlaceholderConfigurer;
+
+import java.util.Properties;
+
+/**
+ * @author lengleng
+ * @date 2020/7/25
+ *
+ * 重写默认的 PropertyPlaceholder
+ */
+public class UReportPropertyPlaceholderConfigurerPlus extends UReportPropertyPlaceholderConfigurer {
+
+ public UReportPropertyPlaceholderConfigurerPlus() {
+ Properties properties = new Properties();
+ properties.setProperty("ureport.fileStoreDir", "");
+ properties.setProperty("ureport.fileStoreDir", "");
+ properties.setProperty("ureport.debug", "false");
+ properties.setProperty("ureport.disableHttpSessionReportCache", "false");
+ this.setProperties(properties);
+ }
+
+}
diff --git a/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/provider/DfsReportProvider.java b/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/provider/DfsReportProvider.java
new file mode 100755
index 000000000..0e50f43f4
--- /dev/null
+++ b/pigx-visual/pigx-bi-platform/src/main/java/com/pig4cloud/pigx/ureport/provider/DfsReportProvider.java
@@ -0,0 +1,91 @@
+package com.pig4cloud.pigx.ureport.provider;
+
+import com.amazonaws.services.s3.model.S3Object;
+import com.amazonaws.services.s3.model.S3ObjectSummary;
+import com.bstek.ureport.provider.report.ReportFile;
+import com.bstek.ureport.provider.report.ReportProvider;
+import com.pig4cloud.pigx.common.oss.OssProperties;
+import com.pig4cloud.pigx.common.oss.service.OssTemplate;
+import lombok.Cleanup;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+
+import java.io.InputStream;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author lengleng
+ * @date 2020/7/25
+ *
+ * 基于OSS 的文件存储支持
+ */
+@Slf4j
+@RequiredArgsConstructor
+public class DfsReportProvider implements ReportProvider {
+
+ /**
+ * 保存文件增加默认前缀,方便查找
+ */
+ private static final String PREFIX = "oss_";
+
+ private final OssTemplate ossTemplate;
+
+ private final OssProperties properties;
+
+ @Override
+ public InputStream loadReport(String file) {
+ S3Object object = ossTemplate.getObject(properties.getBucketName(), file);
+ return object.getObjectContent();
+ }
+
+ @Override
+ public void deleteReport(String file) {
+ try {
+ ossTemplate.removeObject(properties.getBucketName(), file);
+ }
+ catch (Exception e) {
+ log.error("文件删除失败 ", e);
+ }
+ }
+
+ @Override
+ public List getReportFiles() {
+ List objectSummaryList = ossTemplate.getAllObjectsByPrefix(properties.getBucketName(), PREFIX,
+ true);
+
+ return objectSummaryList.stream()
+ .map(s3ObjectSummary -> new ReportFile(s3ObjectSummary.getKey().replaceAll(PREFIX, ""),
+ s3ObjectSummary.getLastModified()))
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public void saveReport(String file, String content) {
+ try {
+ @Cleanup
+ InputStream inputStream = IOUtils.toInputStream(content);
+ ossTemplate.putObject(properties.getBucketName(), file, inputStream);
+ }
+ catch (Exception e) {
+ log.error("文件上传失败", e);
+ }
+ }
+
+ @Override
+ public String getName() {
+ return "分布式文件存储";
+ }
+
+ @Override
+ public boolean disabled() {
+ return false;
+ }
+
+ @Override
+ public String getPrefix() {
+ return PREFIX;
+ }
+
+}
diff --git a/pigx-visual/pigx-bi-platform/src/main/resources/META-INF/spring-configuration-metadata.json b/pigx-visual/pigx-bi-platform/src/main/resources/META-INF/spring-configuration-metadata.json
new file mode 100755
index 000000000..dd1990d0d
--- /dev/null
+++ b/pigx-visual/pigx-bi-platform/src/main/resources/META-INF/spring-configuration-metadata.json
@@ -0,0 +1,25 @@
+{
+ "properties": [
+ {
+ "name": "ureport.disableFileProvider",
+ "type": "java.lang.String",
+ "description": "是否开启本地文件系统 true/false"
+ },
+ {
+ "name": "ureport.fileStoreDir",
+ "type": "java.lang.String",
+ "description": "本地文件保存路径"
+ },
+ {
+ "name": "ureport.debug",
+ "type": "java.lang.String",
+ "description": "DEBUG模式 true/false"
+ },
+ {
+ "name": "ureport.disableHttpSessionReportCache",
+ "type": "java.lang.String",
+ "description": "是否关闭 session cache"
+ }
+ ],
+ "hints": []
+}
diff --git a/pigx-visual/pigx-bi-platform/src/main/resources/bootstrap.yml b/pigx-visual/pigx-bi-platform/src/main/resources/bootstrap.yml
new file mode 100644
index 000000000..ee5868e1b
--- /dev/null
+++ b/pigx-visual/pigx-bi-platform/src/main/resources/bootstrap.yml
@@ -0,0 +1,18 @@
+server:
+ port: 5006
+
+spring:
+ application:
+ name: @artifactId@
+ cloud:
+ nacos:
+ discovery:
+ server-addr: ${NACOS_HOST:pigx-register}:${NACOS_PORT:8848}
+ service: @artifactId@
+ config:
+ server-addr: ${spring.cloud.nacos.discovery.server-addr}
+ file-extension: yml
+ shared-configs:
+ - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+ profiles:
+ active: @profiles.active@
\ No newline at end of file
diff --git a/pigx-visual/pigx-bi-platform/src/main/resources/logback-spring.xml b/pigx-visual/pigx-bi-platform/src/main/resources/logback-spring.xml
new file mode 100644
index 000000000..5b4213c6f
--- /dev/null
+++ b/pigx-visual/pigx-bi-platform/src/main/resources/logback-spring.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${CONSOLE_LOG_PATTERN}
+
+
+
+
+
+ ${log.path}/debug.log
+
+ ${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz
+ 50MB
+ 30
+
+
+ %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n
+
+
+
+
+
+ ${log.path}/error.log
+
+ ${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz
+ 50MB
+ 30
+
+
+ %date [%thread] %-5level [%logger{50}] %file:%line - %msg%n
+
+
+ ERROR
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pigx-visual/pom.xml b/pigx-visual/pom.xml
index 7a470ebaa..e55f81255 100644
--- a/pigx-visual/pom.xml
+++ b/pigx-visual/pom.xml
@@ -32,6 +32,7 @@
pom
+ pigx-bi-platform
pigx-codegen
pigx-daemon-elastic-job
pigx-daemon-quartz
diff --git a/pom.xml b/pom.xml
index e76ac5f26..2981028c1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,6 +51,7 @@
4.1.0
2.1.1
2.11.4
+ 2.2.9
1.11.543
2.2.0
5.22.0