修改并提交了后端文件

This commit is contained in:
root 2025-06-23 10:34:29 +08:00
parent 2bcb606319
commit adabf1e604
116 changed files with 4759 additions and 2173 deletions

View File

@ -3,33 +3,40 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<artifactId>gisbi</artifactId> <artifactId>core</artifactId>
<groupId>io.gisbi</groupId> <groupId>io.gisbi</groupId>
<version>1.0.0</version> <version>2.0.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging> <packaging>jar</packaging>
<artifactId>core-backend</artifactId> <artifactId>core-backend</artifactId>
<dependencies> <dependencies>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.8.0</version>
</dependency>
<dependency> <dependency>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
<version>${guava.version}</version> <version>33.0.0-jre</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.gisbi</groupId> <groupId>io.gisbi</groupId>
<artifactId>api-base</artifactId> <artifactId>api-base</artifactId>
<version>1.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.gisbi</groupId> <groupId>io.gisbi</groupId>
<artifactId>common</artifactId> <artifactId>common</artifactId>
<version>1.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.gisbi</groupId> <groupId>io.gisbi</groupId>
<artifactId>api-sync</artifactId> <artifactId>api-sync</artifactId>
<version>1.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.mysql</groupId> <groupId>com.mysql</groupId>
@ -38,18 +45,18 @@
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId> <artifactId>commons-dbcp2</artifactId>
<version>${commons-dbcp2.version}</version> <version>2.6.0</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.antlr/antlr --> <!-- https://mvnrepository.com/artifact/org.antlr/antlr -->
<dependency> <dependency>
<groupId>org.antlr</groupId> <groupId>org.antlr</groupId>
<artifactId>antlr</artifactId> <artifactId>antlr</artifactId>
<version>${antlr.version}</version> <version>3.5.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>${junit.version}</version> <version>4.13.2</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -73,7 +80,6 @@
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
<version>5.8.8</version> <version>5.8.8</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId> <artifactId>spring-boot-starter-websocket</artifactId>
@ -93,15 +99,10 @@
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.38</version>
</dependency>
<dependency> <dependency>
<groupId>io.gisbi</groupId> <groupId>io.gisbi</groupId>
<artifactId>api-permissions</artifactId> <artifactId>api-permissions</artifactId>
<version>1.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
</dependencies> </dependencies>
@ -125,12 +126,12 @@
<dependency> <dependency>
<groupId>org.seleniumhq.selenium</groupId> <groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId> <artifactId>selenium-java</artifactId>
<version>${selenium-java.version}</version> <version>4.19.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.eclipse.angus</groupId> <groupId>org.eclipse.angus</groupId>
<artifactId>angus-mail</artifactId> <artifactId>angus-mail</artifactId>
<version>${angus-mail.version}</version> <version>2.0.3</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<groupId>org.eclipse.angus</groupId> <groupId>org.eclipse.angus</groupId>
@ -141,13 +142,13 @@
<dependency> <dependency>
<groupId>com.itextpdf</groupId> <groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId> <artifactId>itext7-core</artifactId>
<version>${itextpdf.version}</version> <version>8.0.4</version>
<type>pom</type> <type>pom</type>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.vladsch.flexmark</groupId> <groupId>com.vladsch.flexmark</groupId>
<artifactId>flexmark-all</artifactId> <artifactId>flexmark-all</artifactId>
<version>${flexmark.version}</version> <version>0.62.2</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -14,7 +14,7 @@ public class MybatisPlusGenerator {
* 第一 我嫌麻烦 * 第一 我嫌麻烦
* 第二 后面配置会放到nacos读起来更麻烦了 * 第二 后面配置会放到nacos读起来更麻烦了
*/ */
private static final String url = "jdbc:mysql://localhost:3306/dataease?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false"; private static final String url = "jdbc:mysql://localhost:3306/gisbi?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false";
private static final String username = "root"; private static final String username = "root";
private static final String password = "123456"; private static final String password = "123456";

View File

@ -1,12 +1,14 @@
package io.gisbi.chart.charts.impl; package io.gisbi.chart.charts.impl;
import com.beust.jcommander.Strings;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.ChartHandlerManager; import io.gisbi.chart.charts.ChartHandlerManager;
import io.gisbi.chart.constant.ChartConstants; import io.gisbi.chart.constant.ChartConstants;
import io.gisbi.chart.manage.ChartDataManage; import io.gisbi.chart.manage.ChartDataManage;
import io.gisbi.chart.manage.ChartViewManege; import io.gisbi.chart.manage.ChartViewManege;
import io.gisbi.chart.utils.ChartDataBuild; import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.dataset.manage.DatasetTableFieldManage;
import io.gisbi.constant.SQLConstants; import io.gisbi.constant.SQLConstants;
import io.gisbi.dataset.manage.DatasetTableFieldManage;
import io.gisbi.engine.sql.SQLProvider; import io.gisbi.engine.sql.SQLProvider;
import io.gisbi.engine.trans.Dimension2SQLObj; import io.gisbi.engine.trans.Dimension2SQLObj;
import io.gisbi.engine.trans.Quota2SQLObj; import io.gisbi.engine.trans.Quota2SQLObj;
@ -82,7 +84,7 @@ public class DefaultChartHandler extends AbstractChartPlugin {
var desensitizationList = (Map<String, ColumnPermissionItem>) formatResult.getContext().get("desensitizationList"); var desensitizationList = (Map<String, ColumnPermissionItem>) formatResult.getContext().get("desensitizationList");
if (MapUtils.isNotEmpty(desensitizationList)) { if (MapUtils.isNotEmpty(desensitizationList)) {
formatResult.getAxisMap().forEach((axis, fields) -> { formatResult.getAxisMap().forEach((axis, fields) -> {
fields.removeIf(f -> desensitizationList.containsKey(f.getDataeaseName())); fields.removeIf(f -> desensitizationList.containsKey(f.getGisbiName()));
}); });
} }
return (T) new CustomFilterResult(filterList, formatResult.getContext()); return (T) new CustomFilterResult(filterList, formatResult.getContext());
@ -107,8 +109,9 @@ public class DefaultChartHandler extends AbstractChartPlugin {
dsList.add(next.getValue().getType()); dsList.add(next.getValue().getType());
} }
boolean needOrder = Utils.isNeedOrder(dsList); boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setIsCross(crossDs);
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
@ -168,8 +171,8 @@ public class DefaultChartHandler extends AbstractChartPlugin {
dataMap.putAll(calcResult.getData()); dataMap.putAll(calcResult.getData());
dataMap.putAll(mapTableNormal); dataMap.putAll(mapTableNormal);
dataMap.put("sourceFields", allFields); dataMap.put("sourceFields", allFields);
mergeAssistField(calcResult.getDynamicAssistFields(), calcResult.getAssistData()); List<ChartSeniorAssistDTO> chartSeniorAssistDTOS = mergeAssistField(calcResult.getDynamicAssistFields(), calcResult.getAssistData(), calcResult.getDynamicAssistFieldsOriginList(), calcResult.getAssistDataOriginList());
dataMap.put("dynamicAssistLines", calcResult.getDynamicAssistFields()); dataMap.put("dynamicAssistLines", chartSeniorAssistDTOS);
view.setData(dataMap); view.setData(dataMap);
view.setSql(Base64.getEncoder().encodeToString(calcResult.getQuerySql().getBytes())); view.setSql(Base64.getEncoder().encodeToString(calcResult.getQuerySql().getBytes()));
view.setDrill(isDrill); view.setDrill(isDrill);
@ -177,20 +180,32 @@ public class DefaultChartHandler extends AbstractChartPlugin {
return view; return view;
} }
protected List<ChartSeniorAssistDTO> mergeAssistField(List<ChartSeniorAssistDTO> dynamicAssistFields, List<String[]> assistData, List<ChartSeniorAssistDTO> dynamicAssistFieldsOriginList, List<String[]> assistDataOriginList) {
protected void mergeAssistField(List<ChartSeniorAssistDTO> dynamicAssistFields, List<String[]> assistData) { List<ChartSeniorAssistDTO> list = new ArrayList<>();
if (ObjectUtils.isEmpty(assistData)) { if (ObjectUtils.isNotEmpty(assistData)) {
return; String[] strings = assistData.getFirst();
}
String[] strings = assistData.get(0);
for (int i = 0; i < dynamicAssistFields.size(); i++) { for (int i = 0; i < dynamicAssistFields.size(); i++) {
if (i < strings.length) { if (i < strings.length) {
ChartSeniorAssistDTO chartSeniorAssistDTO = dynamicAssistFields.get(i); ChartSeniorAssistDTO chartSeniorAssistDTO = dynamicAssistFields.get(i);
chartSeniorAssistDTO.setValue(strings[i]); chartSeniorAssistDTO.setValue(strings[i]);
list.add(chartSeniorAssistDTO);
} }
} }
} }
if (ObjectUtils.isNotEmpty(assistDataOriginList)) {
String[] stringsOriginList = assistDataOriginList.getLast();// 取最后一项如果有其他运算逻辑需要取明细数据可增加逻辑
for (int i = 0; i < dynamicAssistFieldsOriginList.size(); i++) {
if (i < stringsOriginList.length) {
ChartSeniorAssistDTO chartSeniorAssistDTO = dynamicAssistFieldsOriginList.get(i);
chartSeniorAssistDTO.setValue(stringsOriginList[i]);
list.add(chartSeniorAssistDTO);
}
}
}
return list;
}
protected List<ChartSeniorAssistDTO> getDynamicAssistFields(ChartViewDTO view) { protected List<ChartSeniorAssistDTO> getDynamicAssistFields(ChartViewDTO view) {
List<ChartSeniorAssistDTO> list = new ArrayList<>(); List<ChartSeniorAssistDTO> list = new ArrayList<>();
@ -370,7 +385,7 @@ public class DefaultChartHandler extends AbstractChartPlugin {
return conditionField; return conditionField;
} }
protected String assistSQL(String sql, List<ChartViewFieldDTO> assistFields, Map<Long, DatasourceSchemaDTO> dsMap) { protected String assistSQL(String sql, List<ChartViewFieldDTO> assistFields, Map<Long, DatasourceSchemaDTO> dsMap, boolean crossDs) {
// get datasource prefix and suffix // get datasource prefix and suffix
String dsType = dsMap.entrySet().iterator().next().getValue().getType(); String dsType = dsMap.entrySet().iterator().next().getValue().getType();
String prefix = ""; String prefix = "";
@ -391,25 +406,54 @@ public class DefaultChartHandler extends AbstractChartPlugin {
} }
} }
boolean crossDs = Utils.isCrossDs(dsMap); List<String> fieldList = new ArrayList<>();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < assistFields.size(); i++) { for (int i = 0; i < assistFields.size(); i++) {
ChartViewFieldDTO dto = assistFields.get(i); ChartViewFieldDTO dto = assistFields.get(i);
if (StringUtils.equalsIgnoreCase(dto.getSummary(), "last_item")) {
continue;
}
if (crossDs) { if (crossDs) {
if (i == (assistFields.size() - 1)) { fieldList.add(dto.getSummary() + "(" + dto.getOriginName() + ")");
stringBuilder.append(dto.getSummary() + "(" + dto.getOriginName() + ")");
} else { } else {
stringBuilder.append(dto.getSummary() + "(" + dto.getOriginName() + "),"); fieldList.add(dto.getSummary() + "(" + prefix + dto.getOriginName() + suffix + ")");
} }
}
return "SELECT " + Strings.join(",", fieldList) + " FROM (" + sql + ") tmp";
}
protected String assistSQLOriginList(String sql, List<ChartViewFieldDTO> assistFields, Map<Long, DatasourceSchemaDTO> dsMap, boolean crossDs) {
// get datasource prefix and suffix
String dsType = dsMap.entrySet().iterator().next().getValue().getType();
String prefix = "";
String suffix = "";
if (Arrays.stream(DatasourceConfiguration.DatasourceType.values()).map(DatasourceConfiguration.DatasourceType::getType).toList().contains(dsType)) {
DatasourceConfiguration.DatasourceType datasourceType = DatasourceConfiguration.DatasourceType.valueOf(dsType);
prefix = datasourceType.getPrefix();
suffix = datasourceType.getSuffix();
} else { } else {
if (i == (assistFields.size() - 1)) { List<XpackPluginsDatasourceVO> xpackPluginsDatasourceVOS = pluginManage.queryPluginDs();
stringBuilder.append(dto.getSummary() + "(" + prefix + dto.getOriginName() + suffix + ")"); List<XpackPluginsDatasourceVO> list = xpackPluginsDatasourceVOS.stream().filter(ele -> StringUtils.equals(ele.getType(), dsType)).toList();
if (ObjectUtils.isNotEmpty(list)) {
XpackPluginsDatasourceVO first = list.getFirst();
prefix = first.getPrefix();
suffix = first.getSuffix();
} else { } else {
stringBuilder.append(dto.getSummary() + "(" + prefix + dto.getOriginName() + suffix + "),"); DEException.throwException("当前数据源插件不存在");
}
}
List<String> fieldList = new ArrayList<>();
for (int i = 0; i < assistFields.size(); i++) {
ChartViewFieldDTO dto = assistFields.get(i);
if (StringUtils.equalsIgnoreCase(dto.getSummary(), "last_item")) {
if (crossDs) {
fieldList.add(dto.getOriginName());
} else {
fieldList.add(prefix + dto.getOriginName() + suffix);
} }
} }
} }
return "SELECT " + stringBuilder + " FROM (" + sql + ") tmp"; return "SELECT " + Strings.join(",", fieldList) + " FROM (" + sql + ") tmp";
} }
protected List<String> mergeIds(List<ChartViewFieldDTO> xAxisExt, List<ChartViewFieldDTO> extStack) { protected List<String> mergeIds(List<ChartViewFieldDTO> xAxisExt, List<ChartViewFieldDTO> extStack) {
@ -522,26 +566,29 @@ public class DefaultChartHandler extends AbstractChartPlugin {
if (CollectionUtils.isEmpty(data)) { if (CollectionUtils.isEmpty(data)) {
break; break;
} }
if (StringUtils.containsAny(chartType, "group", "stack")) { if (Objects.isNull(extStack)) {
extStack = Arrays.asList();
}
if (Objects.isNull(xAxisExt)) {
xAxisExt = Arrays.asList();
}
boolean isStack = StringUtils.containsIgnoreCase(chartType, "stack") && CollectionUtils.isNotEmpty(extStack);
boolean isGroup = StringUtils.containsIgnoreCase(chartType, "group")
|| (CollectionUtils.isNotEmpty(xAxisExt));
if (isStack || isGroup) {
if (CollectionUtils.isEmpty(xAxis)) { if (CollectionUtils.isEmpty(xAxis)) {
break; break;
} }
if (StringUtils.containsIgnoreCase(chartType, "stack") && extStack.isEmpty()) {
break;
}
if (StringUtils.containsIgnoreCase(chartType, "group") && xAxisExt.isEmpty()) {
break;
}
final Map<String, Integer> mainIndexMap = new HashMap<>(); final Map<String, Integer> mainIndexMap = new HashMap<>();
final List<List<String[]>> mainMatrix = new ArrayList<>(); final List<List<String[]>> mainMatrix = new ArrayList<>();
// 排除group和stack的字段 // 排除group和stack的字段
List<String> groupStackAxisIds = mergeIds(xAxisExt, extStack); List<String> groupStackAxisIds = mergeIds(xAxisExt, extStack);
List<ChartViewFieldDTO> finalXAxisBase = xAxis.stream().filter(ele->!groupStackAxisIds.contains(String.valueOf(ele.getId()))).toList(); List<ChartViewFieldDTO> xAxisBase = xAxis.stream().filter(ele -> !groupStackAxisIds.contains(String.valueOf(ele.getId()))).collect(Collectors.toList());
if (CollectionUtils.isEmpty(finalXAxisBase) && CollectionUtils.isNotEmpty(xAxis)) { if (CollectionUtils.isEmpty(xAxisBase) && CollectionUtils.isNotEmpty(xAxis)) {
finalXAxisBase.add(xAxis.get(0)); xAxisBase.add(xAxis.get(0));
} }
data.forEach(item -> { data.forEach(item -> {
String[] mainAxisArr = Arrays.copyOfRange(item, 0, finalXAxisBase.size()); String[] mainAxisArr = Arrays.copyOfRange(item, 0, xAxisBase.size());
String mainAxis = StringUtils.join(mainAxisArr, '-'); String mainAxis = StringUtils.join(mainAxisArr, '-');
Integer index = mainIndexMap.get(mainAxis); Integer index = mainIndexMap.get(mainAxis);
if (index == null) { if (index == null) {
@ -555,21 +602,24 @@ public class DefaultChartHandler extends AbstractChartPlugin {
} }
}); });
int finalDataIndex = dataIndex; int finalDataIndex = dataIndex;
int subEndIndex = finalXAxisBase.size(); int subEndIndex = xAxisBase.size();
if (StringUtils.containsIgnoreCase(chartType, "group")) { if (CollectionUtils.isNotEmpty(xAxisExt)
|| StringUtils.containsIgnoreCase(chartType, "group")
|| StringUtils.containsIgnoreCase(chartType, "-mix")) {
subEndIndex += xAxisExt.size(); subEndIndex += xAxisExt.size();
} }
if (StringUtils.containsIgnoreCase(chartType, "stack")) { if (StringUtils.containsIgnoreCase(chartType, "stack")) {
subEndIndex += extStack.size(); subEndIndex += extStack.size();
} }
int finalSubEndIndex = subEndIndex; int finalSubEndIndex = subEndIndex;
// 存储上次的值
Map<String, BigDecimal> preDataMap = new HashMap<>();
//滑动累加 //滑动累加
for (int k = 1; k < mainMatrix.size(); k++) { for (int k = 1; k < mainMatrix.size(); k++) {
List<String[]> preDataItems = mainMatrix.get(k - 1); List<String[]> preDataItems = mainMatrix.get(k - 1);
List<String[]> curDataItems = mainMatrix.get(k); List<String[]> curDataItems = mainMatrix.get(k);
Map<String, BigDecimal> preDataMap = new HashMap<>();
preDataItems.forEach(preDataItem -> { preDataItems.forEach(preDataItem -> {
String[] groupStackAxisArr = Arrays.copyOfRange(preDataItem, finalXAxisBase.size(), finalSubEndIndex); String[] groupStackAxisArr = Arrays.copyOfRange(preDataItem, xAxisBase.size(), finalSubEndIndex);
String groupStackAxis = StringUtils.join(groupStackAxisArr, '-'); String groupStackAxis = StringUtils.join(groupStackAxisArr, '-');
String preVal = preDataItem[finalDataIndex]; String preVal = preDataItem[finalDataIndex];
if (StringUtils.isBlank(preVal)) { if (StringUtils.isBlank(preVal)) {
@ -578,13 +628,19 @@ public class DefaultChartHandler extends AbstractChartPlugin {
preDataMap.put(groupStackAxis, new BigDecimal(preVal)); preDataMap.put(groupStackAxis, new BigDecimal(preVal));
}); });
curDataItems.forEach(curDataItem -> { curDataItems.forEach(curDataItem -> {
String[] groupStackAxisArr = Arrays.copyOfRange(curDataItem, finalXAxisBase.size(), finalSubEndIndex); String[] groupStackAxisArr = Arrays.copyOfRange(curDataItem, xAxisBase.size(), finalSubEndIndex);
String groupStackAxis = StringUtils.join(groupStackAxisArr, '-'); String groupStackAxis = StringUtils.join(groupStackAxisArr, '-');
BigDecimal preValue = preDataMap.get(groupStackAxis); BigDecimal preValue = preDataMap.get(groupStackAxis);
if (preValue != null) { if (preValue != null) {
curDataItem[finalDataIndex] = new BigDecimal(curDataItem[finalDataIndex]) curDataItem[finalDataIndex] = new BigDecimal(curDataItem[finalDataIndex])
.add(preValue) .add(preValue)
.toString(); .toString();
} else {
if (preDataMap.containsKey(groupStackAxis)) {
curDataItem[finalDataIndex] = new BigDecimal(curDataItem[finalDataIndex])
.add(preDataMap.get(groupStackAxis))
.toString();
}
} }
}); });
} }

View File

@ -2,6 +2,7 @@ package io.gisbi.chart.charts.impl;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.engine.sql.SQLProvider; import io.gisbi.engine.sql.SQLProvider;
import io.gisbi.engine.trans.ExtWhere2Str; import io.gisbi.engine.trans.ExtWhere2Str;
import io.gisbi.engine.utils.Utils; import io.gisbi.engine.utils.Utils;
@ -74,7 +75,7 @@ public class YoyChartHandler extends DefaultChartHandler {
dsList.add(next.getValue().getType()); dsList.add(next.getValue().getType());
} }
boolean needOrder = Utils.isNeedOrder(dsList); boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
// 这里拿到的可能有一年前的数据 // 这里拿到的可能有一年前的数据
var expandedResult = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); var expandedResult = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
// 检查同环比过滤拿到实际数据 // 检查同环比过滤拿到实际数据
@ -86,6 +87,7 @@ public class YoyChartHandler extends DefaultChartHandler {
var originSql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); var originSql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
originSql = provider.rebuildSQL(originSql, sqlMeta, crossDs, dsMap); originSql = provider.rebuildSQL(originSql, sqlMeta, crossDs, dsMap);
var request = new DatasourceRequest(); var request = new DatasourceRequest();
request.setIsCross(crossDs);
request.setDsList(dsMap); request.setDsList(dsMap);
request.setQuery(originSql); request.setQuery(originSql);
logger.debug("calcite yoy sql: " + originSql); logger.debug("calcite yoy sql: " + originSql);

View File

@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.bar; package io.gisbi.chart.charts.impl.bar;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.YoyChartHandler; import io.gisbi.chart.charts.impl.YoyChartHandler;
import io.gisbi.engine.utils.Utils; import io.gisbi.engine.utils.Utils;
import io.gisbi.extensions.datasource.dto.DatasourceRequest; import io.gisbi.extensions.datasource.dto.DatasourceRequest;
@ -8,6 +9,8 @@ import io.gisbi.extensions.datasource.model.SQLMeta;
import io.gisbi.extensions.datasource.provider.Provider; import io.gisbi.extensions.datasource.provider.Provider;
import io.gisbi.extensions.view.dto.*; import io.gisbi.extensions.view.dto.*;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList; import java.util.ArrayList;
@ -42,7 +45,7 @@ public class BarHandler extends YoyChartHandler {
dsList.add(next.getValue().getType()); dsList.add(next.getValue().getType());
} }
boolean needOrder = Utils.isNeedOrder(dsList); boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
try { try {
//如果有同环比过滤,应该用原始sql //如果有同环比过滤,应该用原始sql
@ -52,13 +55,28 @@ public class BarHandler extends YoyChartHandler {
var assistFields = getAssistFields(dynamicAssistFields, yAxis); var assistFields = getAssistFields(dynamicAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) { if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest(); var req = new DatasourceRequest();
req.setIsCross(crossDs);
req.setDsList(dsMap); req.setDsList(dsMap);
var assistSql = assistSQL(originSql, assistFields, dsMap);
List<ChartSeniorAssistDTO> assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assists)) {
var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSql); req.setQuery(assistSql);
logger.debug("calcite assistSql sql: " + assistSql); logger.debug("calcite assistSql sql: " + assistSql);
var assistData = (List<String[]>) provider.fetchResultField(req).get("data"); var assistData = (List<String[]>) provider.fetchResultField(req).get("data");
result.setAssistData(assistData); result.setAssistData(assistData);
result.setDynamicAssistFields(dynamicAssistFields); result.setDynamicAssistFields(assists);
}
List<ChartSeniorAssistDTO> assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assistsOriginList)) {
var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSqlOriginList);
logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
var assistDataOriginList = (List<String[]>) provider.fetchResultField(req).get("data");
result.setAssistDataOriginList(assistDataOriginList);
result.setDynamicAssistFieldsOriginList(assistsOriginList);
}
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.line; package io.gisbi.chart.charts.impl.line;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.YoyChartHandler; import io.gisbi.chart.charts.impl.YoyChartHandler;
import io.gisbi.chart.utils.ChartDataBuild; import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.extensions.datasource.dto.DatasourceRequest; import io.gisbi.extensions.datasource.dto.DatasourceRequest;
@ -9,6 +10,8 @@ import io.gisbi.extensions.datasource.provider.Provider;
import io.gisbi.extensions.view.dto.*; import io.gisbi.extensions.view.dto.*;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList; import java.util.ArrayList;
@ -55,6 +58,7 @@ public class LineHandler extends YoyChartHandler {
for (Map.Entry<Long, DatasourceSchemaDTO> next : dsMap.entrySet()) { for (Map.Entry<Long, DatasourceSchemaDTO> next : dsMap.entrySet()) {
dsList.add(next.getValue().getType()); dsList.add(next.getValue().getType());
} }
boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
try { try {
//如果有同环比过滤,应该用原始sql //如果有同环比过滤,应该用原始sql
@ -64,13 +68,28 @@ public class LineHandler extends YoyChartHandler {
var assistFields = getAssistFields(dynamicAssistFields, yAxis); var assistFields = getAssistFields(dynamicAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) { if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest(); var req = new DatasourceRequest();
req.setIsCross(crossDs);
req.setDsList(dsMap); req.setDsList(dsMap);
var assistSql = assistSQL(originSql, assistFields, dsMap);
List<ChartSeniorAssistDTO> assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assists)) {
var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSql); req.setQuery(assistSql);
logger.debug("calcite assistSql sql: " + assistSql); logger.debug("calcite assistSql sql: " + assistSql);
var assistData = (List<String[]>) provider.fetchResultField(req).get("data"); var assistData = (List<String[]>) provider.fetchResultField(req).get("data");
result.setAssistData(assistData); result.setAssistData(assistData);
result.setDynamicAssistFields(dynamicAssistFields); result.setDynamicAssistFields(assists);
}
List<ChartSeniorAssistDTO> assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assistsOriginList)) {
var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSqlOriginList);
logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
var assistDataOriginList = (List<String[]>) provider.fetchResultField(req).get("data");
result.setAssistDataOriginList(assistDataOriginList);
result.setDynamicAssistFieldsOriginList(assistsOriginList);
}
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.line; package io.gisbi.chart.charts.impl.line;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.YoyChartHandler; import io.gisbi.chart.charts.impl.YoyChartHandler;
import io.gisbi.chart.utils.ChartDataBuild; import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.engine.utils.Utils; import io.gisbi.engine.utils.Utils;
@ -11,6 +12,7 @@ import io.gisbi.extensions.view.dto.*;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList; import java.util.ArrayList;
@ -89,7 +91,7 @@ public class StackAreaHandler extends YoyChartHandler {
dsList.add(next.getValue().getType()); dsList.add(next.getValue().getType());
} }
boolean needOrder = Utils.isNeedOrder(dsList); boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
try { try {
//如果有同环比过滤,应该用原始sql //如果有同环比过滤,应该用原始sql
@ -99,13 +101,28 @@ public class StackAreaHandler extends YoyChartHandler {
var assistFields = getAssistFields(dynamicAssistFields, yAxis); var assistFields = getAssistFields(dynamicAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) { if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest(); var req = new DatasourceRequest();
req.setIsCross(crossDs);
req.setDsList(dsMap); req.setDsList(dsMap);
var assistSql = assistSQL(originSql, assistFields, dsMap);
List<ChartSeniorAssistDTO> assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assists)) {
var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSql); req.setQuery(assistSql);
logger.debug("calcite assist sql: " + assistSql); logger.debug("calcite assistSql sql: " + assistSql);
var assistData = (List<String[]>) provider.fetchResultField(req).get("data"); var assistData = (List<String[]>) provider.fetchResultField(req).get("data");
result.setAssistData(assistData); result.setAssistData(assistData);
result.setDynamicAssistFields(dynamicAssistFields); result.setDynamicAssistFields(assists);
}
List<ChartSeniorAssistDTO> assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assistsOriginList)) {
var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSqlOriginList);
logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
var assistDataOriginList = (List<String[]>) provider.fetchResultField(req).get("data");
result.setAssistDataOriginList(assistDataOriginList);
result.setDynamicAssistFieldsOriginList(assistsOriginList);
}
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.map; package io.gisbi.chart.charts.impl.map;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.GroupChartHandler; import io.gisbi.chart.charts.impl.GroupChartHandler;
import io.gisbi.chart.utils.ChartDataBuild; import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.dataset.manage.DatasetDataManage; import io.gisbi.dataset.manage.DatasetDataManage;
@ -60,22 +61,23 @@ public class SymbolicMapHandler extends GroupChartHandler {
boolean needOrder = Utils.isNeedOrder(dsList); boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = Utils.isCrossDs(dsMap);
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setIsCross(((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross());
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var extBubble = formatResult.getAxisMap().get(ChartAxis.extBubble); var extBubble = formatResult.getAxisMap().get(ChartAxis.extBubble);
var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields"); var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
List<ChartViewFieldDTO> countField =chartViewManege.transFieldDTO(Collections.singletonList(chartViewManege.createCountField(view.getTableId()))); List<ChartViewFieldDTO> countField = chartViewManege.transFieldDTO(Collections.singletonList(chartViewManege.createCountField(view.getTableId())));
List<DatasetTableFieldDTO> datasetTableFieldDTOList = FieldUtil.transFields(allFields); List<DatasetTableFieldDTO> datasetTableFieldDTOList = FieldUtil.transFields(allFields);
SQLMeta sqlMeta1 = new SQLMeta(); SQLMeta sqlMeta1 = new SQLMeta();
BeanUtils.copyBean(sqlMeta1, sqlMeta); BeanUtils.copyBean(sqlMeta1, sqlMeta);
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, datasetTableFieldDTOList, crossDs, dsMap, Utils.getParams(datasetTableFieldDTOList), view.getCalParams(), pluginManage); Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, datasetTableFieldDTOList, crossDs, dsMap, Utils.getParams(datasetTableFieldDTOList), view.getCalParams(), pluginManage);
List<ChartViewFieldDTO> yAxis = new ArrayList<>(); List<ChartViewFieldDTO> yAxis = new ArrayList<>();
if(!extBubble.isEmpty() && !"*".equals(extBubble.get(0).getDataeaseName())){ if (!extBubble.isEmpty() && !"*".equals(extBubble.get(0).getGisbiName())) {
yAxis.addAll(extBubble); yAxis.addAll(extBubble);
} }
yAxis.addAll(countField); yAxis.addAll(countField);
datasetTableFieldDTOList.addAll(FieldUtil.transFields(countField)); datasetTableFieldDTOList.addAll(FieldUtil.transFields(countField));
formatResult.getAxisMap().put(ChartAxis.yAxis,countField); formatResult.getAxisMap().put(ChartAxis.yAxis, countField);
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, datasetTableFieldDTOList, crossDs, dsMap, Utils.getParams(datasetTableFieldDTOList), view.getCalParams(), pluginManage); Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, datasetTableFieldDTOList, crossDs, dsMap, Utils.getParams(datasetTableFieldDTOList), view.getCalParams(), pluginManage);
String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap); querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap);
@ -102,6 +104,7 @@ public class SymbolicMapHandler extends GroupChartHandler {
logger.debug("calcite data preview sql: " + querySQL); logger.debug("calcite data preview sql: " + querySQL);
// 调用数据源的calcite获得data // 调用数据源的calcite获得data
DatasourceRequest datasourceRequest1 = new DatasourceRequest(); DatasourceRequest datasourceRequest1 = new DatasourceRequest();
datasourceRequest1.setIsCross(((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross());
datasourceRequest1.setQuery(querySQL); datasourceRequest1.setQuery(querySQL);
datasourceRequest1.setDsList(dsMap); datasourceRequest1.setDsList(dsMap);
detailData = (List<String[]>) provider.fetchResultField(datasourceRequest1).get("data"); detailData = (List<String[]>) provider.fetchResultField(datasourceRequest1).get("data");
@ -115,7 +118,7 @@ public class SymbolicMapHandler extends GroupChartHandler {
calcResult.setContext(filterResult.getContext()); calcResult.setContext(filterResult.getContext());
calcResult.setQuerySql(querySql); calcResult.setQuerySql(querySql);
calcResult.setOriginData(data); calcResult.setOriginData(data);
formatResult.getAxisMap().put(ChartAxis.yAxis,new ArrayList<>()); formatResult.getAxisMap().put(ChartAxis.yAxis, new ArrayList<>());
return calcResult; return calcResult;
} }
@ -142,8 +145,8 @@ public class SymbolicMapHandler extends GroupChartHandler {
dataMap.putAll(calcResult.getData()); dataMap.putAll(calcResult.getData());
dataMap.putAll(mapTableNormal); dataMap.putAll(mapTableNormal);
dataMap.put("sourceFields", allFields); dataMap.put("sourceFields", allFields);
mergeAssistField(calcResult.getDynamicAssistFields(), calcResult.getAssistData()); List<ChartSeniorAssistDTO> chartSeniorAssistDTOS = mergeAssistField(calcResult.getDynamicAssistFields(), calcResult.getAssistData(), calcResult.getDynamicAssistFieldsOriginList(), calcResult.getAssistDataOriginList());
dataMap.put("dynamicAssistLines", calcResult.getDynamicAssistFields()); dataMap.put("dynamicAssistLines", chartSeniorAssistDTOS);
view.setData(dataMap); view.setData(dataMap);
view.setSql(Base64.getEncoder().encodeToString(calcResult.getQuerySql().getBytes())); view.setSql(Base64.getEncoder().encodeToString(calcResult.getQuerySql().getBytes()));
view.setDrill(isDrill); view.setDrill(isDrill);

View File

@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.mix; package io.gisbi.chart.charts.impl.mix;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.YoyChartHandler; import io.gisbi.chart.charts.impl.YoyChartHandler;
import io.gisbi.chart.utils.ChartDataBuild; import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.engine.utils.Utils; import io.gisbi.engine.utils.Utils;
@ -10,6 +11,7 @@ import io.gisbi.extensions.datasource.provider.Provider;
import io.gisbi.extensions.view.dto.*; import io.gisbi.extensions.view.dto.*;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -80,7 +82,7 @@ public class MixHandler extends YoyChartHandler {
dsList.add(next.getValue().getType()); dsList.add(next.getValue().getType());
} }
boolean needOrder = Utils.isNeedOrder(dsList); boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
var leftResult = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); var leftResult = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
var dynamicAssistFields = getDynamicAssistFields(view); var dynamicAssistFields = getDynamicAssistFields(view);
try { try {
@ -91,13 +93,28 @@ public class MixHandler extends YoyChartHandler {
var assistFields = getAssistFields(leftAssistFields, yAxis); var assistFields = getAssistFields(leftAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) { if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest(); var req = new DatasourceRequest();
req.setIsCross(crossDs);
req.setDsList(dsMap); req.setDsList(dsMap);
var assistSql = assistSQL(originSql, assistFields, dsMap);
List<ChartSeniorAssistDTO> assists = leftAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assists)) {
var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSql); req.setQuery(assistSql);
logger.debug("calcite assistSql sql: " + assistSql); logger.debug("calcite assistSql sql: " + assistSql);
var assistData = (List<String[]>) provider.fetchResultField(req).get("data"); var assistData = (List<String[]>) provider.fetchResultField(req).get("data");
leftResult.setAssistData(assistData); leftResult.setAssistData(assistData);
leftResult.setDynamicAssistFields(leftAssistFields); leftResult.setDynamicAssistFields(assists);
}
List<ChartSeniorAssistDTO> assistsOriginList = leftAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assistsOriginList)) {
var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSqlOriginList);
logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
var assistDataOriginList = (List<String[]>) provider.fetchResultField(req).get("data");
leftResult.setAssistDataOriginList(assistDataOriginList);
leftResult.setDynamicAssistFieldsOriginList(assistsOriginList);
}
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -143,12 +160,28 @@ public class MixHandler extends YoyChartHandler {
var assistFields = getAssistFields(rightAssistFields, yAxis); var assistFields = getAssistFields(rightAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) { if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest(); var req = new DatasourceRequest();
req.setIsCross(crossDs);
req.setDsList(dsMap); req.setDsList(dsMap);
var assistSql = assistSQL(originSql, assistFields, dsMap);
List<ChartSeniorAssistDTO> assists = rightAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assists)) {
var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSql); req.setQuery(assistSql);
logger.debug("calcite assistSql sql: " + assistSql);
var assistData = (List<String[]>) provider.fetchResultField(req).get("data"); var assistData = (List<String[]>) provider.fetchResultField(req).get("data");
rightResult.setAssistData(assistData); rightResult.setAssistData(assistData);
rightResult.setDynamicAssistFields(rightAssistFields); rightResult.setDynamicAssistFields(assists);
}
List<ChartSeniorAssistDTO> assistsOriginList = rightAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assistsOriginList)) {
var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSqlOriginList);
logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
var assistDataOriginList = (List<String[]>) provider.fetchResultField(req).get("data");
rightResult.setAssistDataOriginList(assistDataOriginList);
rightResult.setDynamicAssistFieldsOriginList(assistsOriginList);
}
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -169,12 +202,12 @@ public class MixHandler extends YoyChartHandler {
var leftFields = new ArrayList<ChartViewFieldDTO>(); var leftFields = new ArrayList<ChartViewFieldDTO>();
leftFields.addAll(formatResult.getAxisMap().get(ChartAxis.xAxis)); leftFields.addAll(formatResult.getAxisMap().get(ChartAxis.xAxis));
leftFields.addAll(formatResult.getAxisMap().get(ChartAxis.yAxis)); leftFields.addAll(formatResult.getAxisMap().get(ChartAxis.yAxis));
mergeAssistField(leftCalcResult.getDynamicAssistFields(), leftCalcResult.getAssistData()); List<ChartSeniorAssistDTO> chartSeniorAssistDTOSLeft = mergeAssistField(leftCalcResult.getDynamicAssistFields(), leftCalcResult.getAssistData(), leftCalcResult.getDynamicAssistFieldsOriginList(), leftCalcResult.getAssistDataOriginList());
var leftOriginData = leftCalcResult.getOriginData(); var leftOriginData = leftCalcResult.getOriginData();
var leftTable = ChartDataBuild.transTableNormal(leftFields, view, leftOriginData, desensitizationList); var leftTable = ChartDataBuild.transTableNormal(leftFields, view, leftOriginData, desensitizationList);
var leftData = new HashMap<String, Object>(leftTable); var leftData = new HashMap<String, Object>(leftTable);
leftData.putAll(leftCalcResult.getData()); leftData.putAll(leftCalcResult.getData());
leftData.put("dynamicAssistLines", leftCalcResult.getDynamicAssistFields()); leftData.put("dynamicAssistLines", chartSeniorAssistDTOSLeft);
var rightCalcResult = (ChartCalcDataResult) calcResult.getData().get("right"); var rightCalcResult = (ChartCalcDataResult) calcResult.getData().get("right");
var rightFields = new ArrayList<ChartViewFieldDTO>(); var rightFields = new ArrayList<ChartViewFieldDTO>();
@ -183,12 +216,12 @@ public class MixHandler extends YoyChartHandler {
rightFields.addAll(subAxisMap.get(ChartAxis.xAxis)); rightFields.addAll(subAxisMap.get(ChartAxis.xAxis));
rightFields.addAll(subAxisMap.get(ChartAxis.yAxis)); rightFields.addAll(subAxisMap.get(ChartAxis.yAxis));
mergeAssistField(rightCalcResult.getDynamicAssistFields(), rightCalcResult.getAssistData()); List<ChartSeniorAssistDTO> chartSeniorAssistDTOSRight = mergeAssistField(rightCalcResult.getDynamicAssistFields(), rightCalcResult.getAssistData(), rightCalcResult.getDynamicAssistFieldsOriginList(), rightCalcResult.getAssistDataOriginList());
var rightOriginData = rightCalcResult.getOriginData(); var rightOriginData = rightCalcResult.getOriginData();
var rightTable = ChartDataBuild.transTableNormal(rightFields, view, rightOriginData, desensitizationList); var rightTable = ChartDataBuild.transTableNormal(rightFields, view, rightOriginData, desensitizationList);
var rightData = new HashMap<String, Object>(rightTable); var rightData = new HashMap<String, Object>(rightTable);
rightData.putAll(rightCalcResult.getData()); rightData.putAll(rightCalcResult.getData());
rightData.put("dynamicAssistLines", rightCalcResult.getDynamicAssistFields()); rightData.put("dynamicAssistLines", chartSeniorAssistDTOSRight);
// 构建结果 // 构建结果
Map<String, Object> chartData = new TreeMap<>(); Map<String, Object> chartData = new TreeMap<>();
@ -205,7 +238,7 @@ public class MixHandler extends YoyChartHandler {
var isDrill = CollectionUtils.isNotEmpty(drillFilters); var isDrill = CollectionUtils.isNotEmpty(drillFilters);
view.setDrillFilters(drillFilters); view.setDrillFilters(drillFilters);
view.setDrill(isDrill); view.setDrill(isDrill);
view.setSql(leftCalcResult.getQuerySql()); view.setSql(Base64.getEncoder().encodeToString(leftCalcResult.getQuerySql().getBytes()));
view.setData(chartData); view.setData(chartData);
return view; return view;
} }

View File

@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.numeric; package io.gisbi.chart.charts.impl.numeric;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.DefaultChartHandler; import io.gisbi.chart.charts.impl.DefaultChartHandler;
import io.gisbi.chart.utils.ChartDataBuild; import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.engine.sql.SQLProvider; import io.gisbi.engine.sql.SQLProvider;
@ -33,6 +34,7 @@ public class NumericalChartHandler extends DefaultChartHandler {
boolean needOrder = Utils.isNeedOrder(dsList); boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = Utils.isCrossDs(dsMap);
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setIsCross(((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross());
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
@ -67,14 +69,11 @@ public class NumericalChartHandler extends DefaultChartHandler {
String summary = (String) maxField.get("summary"); String summary = (String) maxField.get("summary");
DatasetTableFieldDTO datasetTableField = datasetTableFieldManage.selectById(id); DatasetTableFieldDTO datasetTableField = datasetTableFieldManage.selectById(id);
if (ObjectUtils.isNotEmpty(datasetTableField)) { if (ObjectUtils.isNotEmpty(datasetTableField)) {
if (datasetTableField.getDeType() == 0 || datasetTableField.getDeType() == 1 || datasetTableField.getDeType() == 5) {
if (!StringUtils.containsIgnoreCase(summary, "count")) {
DEException.throwException(Translator.get("i18n_gauge_field_change"));
}
}
ChartViewFieldDTO dto = new ChartViewFieldDTO(); ChartViewFieldDTO dto = new ChartViewFieldDTO();
BeanUtils.copyBean(dto, datasetTableField); BeanUtils.copyBean(dto, datasetTableField);
if (StringUtils.isEmpty(dto.getSummary())) {
dto.setSummary(summary); dto.setSummary(summary);
}
return dto; return dto;
} else { } else {
DEException.throwException(Translator.get("i18n_gauge_field_delete")); DEException.throwException(Translator.get("i18n_gauge_field_delete"));

View File

@ -1,11 +1,15 @@
package io.gisbi.chart.charts.impl.pie; package io.gisbi.chart.charts.impl.pie;
import io.gisbi.chart.charts.impl.YoyChartHandler; import io.gisbi.chart.charts.impl.YoyChartHandler;
import io.gisbi.extensions.view.dto.AxisFormatResult; import io.gisbi.extensions.view.dto.*;
import io.gisbi.extensions.view.dto.ChartAxis;
import io.gisbi.extensions.view.dto.ChartViewDTO;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Component @Component
public class PieHandler extends YoyChartHandler { public class PieHandler extends YoyChartHandler {
@Override @Override
@ -26,4 +30,74 @@ public class PieHandler extends YoyChartHandler {
result.getAxisMap().put(ChartAxis.extTooltip, view.getExtTooltip()); result.getAxisMap().put(ChartAxis.extTooltip, view.getExtTooltip());
return result; return result;
} }
@Override
public ChartViewDTO buildChart(ChartViewDTO view, ChartCalcDataResult calcResult, AxisFormatResult formatResult, CustomFilterResult filterResult) {
ChartViewDTO result = super.buildChart(view, calcResult, formatResult, filterResult);
filterPositiveData(result, "data", AxisChartDataAntVDTO.class);
filterPositiveData(result, "tableRow", Map.class, view.getYAxis().get(0).getGisbiName());
return result;
}
/**
* 过滤正数数据根据data
* @param result
* @param key
* @param clazz
* @param <T>
*/
private <T> void filterPositiveData(ChartViewDTO result, String key, Class<T> clazz) {
if (result.getData().containsKey(key)) {
List<T> list = ((List<T>) result.getData().get(key))
.stream()
.filter(item -> {
if (clazz == AxisChartDataAntVDTO.class) {
if (Objects.isNull(((AxisChartDataAntVDTO) item).getValue())) return false;
return ((AxisChartDataAntVDTO) item).getValue().compareTo(BigDecimal.ZERO) >= 0;
} else if (clazz == Map.class) {
return isPositive(((Map<String, Object>) item).get("value"));
}
return false;
})
.collect(Collectors.toList());
result.getData().put(key, list);
}
}
/**
* 过滤正数数据根据tableRow
* @param result
* @param key
* @param clazz
* @param yAxisName
* @param <T>
*/
private <T> void filterPositiveData(ChartViewDTO result, String key, Class<T> clazz, String yAxisName) {
if (result.getData().containsKey(key)) {
List<T> list = ((List<T>) result.getData().get(key))
.stream()
.filter(item -> {
if (clazz == Map.class) {
Object value = ((Map<String, Object>) item).get(yAxisName);
return isPositive(value);
}
return false;
})
.collect(Collectors.toList());
result.getData().put(key, list);
}
}
private boolean isPositive(Object value) {
if (value instanceof String) {
try {
return new BigDecimal((String) value).compareTo(BigDecimal.ZERO) >= 0;
} catch (NumberFormatException e) {
return false;
}
} else if (value instanceof BigDecimal) {
return ((BigDecimal) value).compareTo(BigDecimal.ZERO) >= 0;
}
return false;
}
} }

View File

@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.table; package io.gisbi.chart.charts.impl.table;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.DefaultChartHandler; import io.gisbi.chart.charts.impl.DefaultChartHandler;
import io.gisbi.chart.utils.ChartDataBuild; import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.engine.sql.SQLProvider; import io.gisbi.engine.sql.SQLProvider;
@ -55,6 +56,7 @@ public class TableHeatmapHandler extends DefaultChartHandler {
boolean needOrder = Utils.isNeedOrder(dsList); boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = Utils.isCrossDs(dsMap);
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setIsCross(((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross());
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);

View File

@ -1,6 +1,7 @@
package io.gisbi.chart.charts.impl.table; package io.gisbi.chart.charts.impl.table;
import io.gisbi.api.chart.dto.PageInfo; import io.gisbi.api.chart.dto.PageInfo;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.DefaultChartHandler; import io.gisbi.chart.charts.impl.DefaultChartHandler;
import io.gisbi.engine.sql.SQLProvider; import io.gisbi.engine.sql.SQLProvider;
import io.gisbi.engine.trans.Dimension2SQLObj; import io.gisbi.engine.trans.Dimension2SQLObj;
@ -65,6 +66,11 @@ public class TableInfoHandler extends DefaultChartHandler {
return (T) new CustomFilterResult(filterList, formatResult.getContext()); return (T) new CustomFilterResult(filterList, formatResult.getContext());
} }
@Override
public Map<String, Object> buildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List<String[]> data) {
return new HashMap<>();
}
@Override @Override
public <T extends ChartCalcDataResult> T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, Provider provider) { public <T extends ChartCalcDataResult> T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, Provider provider) {
var chartExtRequest = view.getChartExtRequest(); var chartExtRequest = view.getChartExtRequest();
@ -73,8 +79,9 @@ public class TableInfoHandler extends DefaultChartHandler {
for (Map.Entry<Long, DatasourceSchemaDTO> next : dsMap.entrySet()) { for (Map.Entry<Long, DatasourceSchemaDTO> next : dsMap.entrySet()) {
dsList.add(next.getValue().getType()); dsList.add(next.getValue().getType());
} }
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setIsCross(crossDs);
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields"); var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
@ -150,12 +157,28 @@ public class TableInfoHandler extends DefaultChartHandler {
if (CollectionUtils.isNotEmpty(assistFields)) { if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest(); var req = new DatasourceRequest();
req.setDsList(dsMap); req.setDsList(dsMap);
var assistSql = assistSQL(querySql, assistFields, dsMap);
req.setQuery(assistSql); List<ChartSeniorAssistDTO> assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
logger.debug("calcite assistSql sql: " + assistSql); if (ObjectUtils.isNotEmpty(assists)) {
var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
var tmpSql = provider.rebuildSQL(assistSql, sqlMeta, crossDs, dsMap);
req.setQuery(tmpSql);
logger.debug("calcite assistSql sql: " + tmpSql);
var assistData = (List<String[]>) provider.fetchResultField(req).get("data"); var assistData = (List<String[]>) provider.fetchResultField(req).get("data");
calcResult.setAssistData(assistData); calcResult.setAssistData(assistData);
calcResult.setDynamicAssistFields(dynamicAssistFields); calcResult.setDynamicAssistFields(assists);
}
List<ChartSeniorAssistDTO> assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assistsOriginList)) {
var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
var tmpSql = provider.rebuildSQL(assistSqlOriginList, sqlMeta, crossDs, dsMap);
req.setQuery(tmpSql);
logger.debug("calcite assistSql sql origin list: " + tmpSql);
var assistDataOriginList = (List<String[]>) provider.fetchResultField(req).get("data");
calcResult.setAssistDataOriginList(assistDataOriginList);
calcResult.setDynamicAssistFieldsOriginList(assistsOriginList);
}
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -1,49 +1,213 @@
package io.gisbi.chart.charts.impl.table; package io.gisbi.chart.charts.impl.table;
import io.gisbi.chart.charts.impl.YoyChartHandler; import com.fasterxml.jackson.core.type.TypeReference;
import io.gisbi.api.chart.dto.PageInfo;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.DefaultChartHandler;
import io.gisbi.engine.sql.SQLProvider;
import io.gisbi.engine.trans.Dimension2SQLObj;
import io.gisbi.engine.trans.ExtWhere2Str;
import io.gisbi.engine.trans.Quota2SQLObj;
import io.gisbi.engine.utils.Utils;
import io.gisbi.extensions.datasource.dto.DatasourceRequest; import io.gisbi.extensions.datasource.dto.DatasourceRequest;
import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO; import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO;
import io.gisbi.extensions.datasource.model.SQLMeta; import io.gisbi.extensions.datasource.model.SQLMeta;
import io.gisbi.extensions.datasource.provider.Provider; import io.gisbi.extensions.datasource.provider.Provider;
import io.gisbi.extensions.view.dto.*; import io.gisbi.extensions.view.dto.*;
import io.gisbi.extensions.view.util.ChartDataUtil;
import io.gisbi.extensions.view.util.FieldUtil;
import io.gisbi.utils.JsonUtil;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List; import java.util.*;
import java.util.Map;
/** /**
* @author jianneng * @author jianneng
* @date 2024/9/11 11:37 * @date 2024/9/11 11:37
**/ **/
@Component @Component
public class TableNormalHandler extends YoyChartHandler { public class TableNormalHandler extends DefaultChartHandler {
@Getter @Getter
private String type = "table-normal"; private final String type = "table-normal";
@Override
public <T extends CustomFilterResult> T customFilter(ChartViewDTO view, List<ChartExtFilterDTO> filterList, AxisFormatResult formatResult) {
var chartExtRequest = view.getChartExtRequest();
Map<String, Object> mapAttr = view.getCustomAttr();
Map<String, Object> basicStyle = (Map<String, Object>) mapAttr.get("basicStyle");
var tablePageMode = (String) basicStyle.get("tablePageMode");
formatResult.getContext().put("tablePageMode", tablePageMode);
if (StringUtils.equalsIgnoreCase(tablePageMode, "page")) {
if (chartExtRequest.getGoPage() == null) {
chartExtRequest.setGoPage(1L);
}
if (chartExtRequest.getPageSize() == null) {
int pageSize = (int) basicStyle.get("tablePageSize");
if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
chartExtRequest.setPageSize(Math.min(pageSize, view.getResultCount().longValue()));
} else {
chartExtRequest.setPageSize((long) pageSize);
}
}
} else {
if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
chartExtRequest.setGoPage(1L);
chartExtRequest.setPageSize(view.getResultCount().longValue());
} else if (!view.getIsExcelExport()) {
chartExtRequest.setGoPage(null);
chartExtRequest.setPageSize(null);
}
}
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
String originFilterJson = (String) JsonUtil.toJSONString(filterList);
List<ChartExtFilterDTO> originFilter = JsonUtil.parseList(originFilterJson, new TypeReference<>() {
});
boolean yoyFiltered = checkYoyFilter(originFilter, yAxis);
if (yoyFiltered) {
formatResult.getContext().put("expandedFilter", originFilter);
formatResult.getContext().put("yoyFiltered", true);
}
return (T) new CustomFilterResult(filterList, formatResult.getContext());
}
@Override
public Map<String, Object> buildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List<String[]> data) {
return new HashMap<>();
}
@Override @Override
public <T extends ChartCalcDataResult> T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, Provider provider) { public <T extends ChartCalcDataResult> T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, Provider provider) {
var chartExtRequest = view.getChartExtRequest();
var dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap"); var dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); List<String> dsList = new ArrayList<>();
try { for (Map.Entry<Long, DatasourceSchemaDTO> next : dsMap.entrySet()) {
var originSql = result.getQuerySql(); dsList.add(next.getValue().getType());
var dynamicAssistFields = getDynamicThresholdFields(view); }
boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setIsCross(crossDs);
datasourceRequest.setDsList(dsMap);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
var assistFields = getAssistFields(dynamicAssistFields, yAxis);
var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
PageInfo pageInfo = new PageInfo();
pageInfo.setGoPage(chartExtRequest.getGoPage());
if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
pageInfo.setPageSize(Math.min(view.getResultCount() - (chartExtRequest.getGoPage() - 1) * chartExtRequest.getPageSize(), chartExtRequest.getPageSize()));
} else {
pageInfo.setPageSize(chartExtRequest.getPageSize());
}
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
String originSql = SQLProvider.createQuerySQL(sqlMeta, true, !StringUtils.equalsIgnoreCase(dsMap.values().iterator().next().getType(), "es"), view);// 分页强制加排序
String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " OFFSET " + (pageInfo.getGoPage() - 1) * chartExtRequest.getPageSize() : "");
var querySql = originSql + limit;
var tablePageMode = (String) filterResult.getContext().get("tablePageMode");
var totalPageSql = "SELECT COUNT(*) FROM (" + SQLProvider.createQuerySQLNoSort(sqlMeta, true, view) + ") COUNT_TEMP";
if (StringUtils.isNotEmpty(totalPageSql) && StringUtils.equalsIgnoreCase(tablePageMode, "page")) {
totalPageSql = provider.rebuildSQL(totalPageSql, sqlMeta, crossDs, dsMap);
datasourceRequest.setQuery(totalPageSql);
datasourceRequest.setTotalPageFlag(true);
logger.debug("calcite total sql: " + totalPageSql);
List<String[]> tmpData = (List<String[]>) provider.fetchResultField(datasourceRequest).get("data");
var totalItems = ObjectUtils.isEmpty(tmpData) ? 0 : Long.valueOf(tmpData.get(0)[0]);
if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
totalItems = totalItems <= view.getResultCount() ? totalItems : view.getResultCount();
}
var totalPage = (totalItems / pageInfo.getPageSize()) + (totalItems % pageInfo.getPageSize() > 0 ? 1 : 0);
view.setTotalItems(totalItems);
view.setTotalPage(totalPage);
}
querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap);
datasourceRequest.setQuery(querySql);
logger.debug("calcite chart sql: " + querySql);
List<String[]> data = (List<String[]>) provider.fetchResultField(datasourceRequest).get("data");
//自定义排序
data = ChartDataUtil.resultCustomSort(xAxis, yAxis, view.getSortPriority(), data);
var yoyFiltered = filterResult.getContext().get("yoyFiltered") != null;
if (yoyFiltered) {
// 这里没加分页因为加了分页参数可能会把原始数据挤出去
var expandedFilter = (List<ChartExtFilterDTO>) filterResult.getContext().get("expandedFilter");
ExtWhere2Str.extWhere2sqlOjb(sqlMeta, expandedFilter, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
var expandedSql = SQLProvider.createQuerySQL(sqlMeta, true, !StringUtils.equalsIgnoreCase(dsMap.values().iterator().next().getType(), "es"), view);
expandedSql = provider.rebuildSQL(expandedSql, sqlMeta, crossDs, dsMap);
var expandedReq = new DatasourceRequest();
expandedReq.setIsCross(crossDs);
expandedReq.setDsList(dsMap);
expandedReq.setQuery(expandedSql);
logger.debug("expanded sql: " + expandedSql);
var expandedData = (List<String[]>) provider.fetchResultField(expandedReq).get("data");
logger.debug("expanded data: " + expandedData);
quickCalc(xAxis, yAxis, Collections.emptyList(), Collections.emptyList(), view.getType(), expandedData);
var resultData = new ArrayList<String[]>();
for (String[] originDataLine : data) {
var originDim = new StringBuilder();
for (int i = 0; i < xAxis.size(); i++) {
originDim.append(originDataLine[i]);
}
for (String[] expandedDataLine : expandedData) {
var expandedDim = new StringBuilder();
for (int i = 0; i < xAxis.size(); i++) {
expandedDim.append(expandedDataLine[i]);
}
if (StringUtils.equals(originDim, expandedDim)) {
resultData.add(expandedDataLine);
break;
}
}
}
data = resultData;
} else {
quickCalc(xAxis, yAxis, Collections.emptyList(), Collections.emptyList(), view.getType(), data);
}
//数据重组逻辑可重载
var result = this.buildResult(view, formatResult, filterResult, data);
T calcResult = (T) new ChartCalcDataResult();
calcResult.setData(result);
calcResult.setContext(filterResult.getContext());
calcResult.setQuerySql(querySql);
calcResult.setOriginData(data);
try {
var dynamicAssistFields = getDynamicThresholdFields(view);
var assistFields = getAssistFields(dynamicAssistFields, yAxis, xAxis);
if (CollectionUtils.isNotEmpty(assistFields)) { if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest(); var req = new DatasourceRequest();
req.setIsCross(crossDs);
req.setDsList(dsMap); req.setDsList(dsMap);
var assistSql = assistSQL(originSql, assistFields, dsMap);
req.setQuery(assistSql); List<ChartSeniorAssistDTO> assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
logger.debug("calcite assistSql sql: " + assistSql); if (ObjectUtils.isNotEmpty(assists)) {
var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
var tmpSql = provider.rebuildSQL(assistSql, sqlMeta, crossDs, dsMap);
req.setQuery(tmpSql);
logger.debug("calcite assistSql sql: " + tmpSql);
var assistData = (List<String[]>) provider.fetchResultField(req).get("data"); var assistData = (List<String[]>) provider.fetchResultField(req).get("data");
result.setAssistData(assistData); calcResult.setAssistData(assistData);
result.setDynamicAssistFields(dynamicAssistFields); calcResult.setDynamicAssistFields(assists);
}
List<ChartSeniorAssistDTO> assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assistsOriginList)) {
var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
var tmpSql = provider.rebuildSQL(assistSqlOriginList, sqlMeta, crossDs, dsMap);
req.setQuery(tmpSql);
logger.debug("calcite assistSql sql origin list: " + tmpSql);
var assistDataOriginList = (List<String[]>) provider.fetchResultField(req).get("data");
calcResult.setAssistDataOriginList(assistDataOriginList);
calcResult.setDynamicAssistFieldsOriginList(assistsOriginList);
}
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
return result; return calcResult;
} }
} }

View File

@ -1,5 +1,6 @@
package io.gisbi.chart.charts.impl.table; package io.gisbi.chart.charts.impl.table;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.chart.charts.impl.GroupChartHandler; import io.gisbi.chart.charts.impl.GroupChartHandler;
import io.gisbi.constant.DeTypeConstants; import io.gisbi.constant.DeTypeConstants;
import io.gisbi.engine.constant.ExtFieldConstant; import io.gisbi.engine.constant.ExtFieldConstant;
@ -18,6 +19,7 @@ import io.gisbi.utils.IDUtils;
import io.gisbi.utils.JsonUtil; import io.gisbi.utils.JsonUtil;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import reactor.util.function.Tuple2; import reactor.util.function.Tuple2;
@ -34,7 +36,8 @@ public class TablePivotHandler extends GroupChartHandler {
@Override @Override
public <T extends ChartCalcDataResult> T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, Provider provider) { public <T extends ChartCalcDataResult> T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, Provider provider) {
T result = super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); T result = super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
Map<String, Object> customCalc = calcCustomExpr(view, filterResult, sqlMap, sqlMeta, provider); Map<String, Object> customCalc = calcCustomExpr(view, formatResult, filterResult, sqlMap, sqlMeta, provider);
boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
result.getData().put("customCalc", customCalc); result.getData().put("customCalc", customCalc);
try { try {
var dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap"); var dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
@ -44,13 +47,28 @@ public class TablePivotHandler extends GroupChartHandler {
var assistFields = getAssistFields(dynamicAssistFields, yAxis); var assistFields = getAssistFields(dynamicAssistFields, yAxis);
if (CollectionUtils.isNotEmpty(assistFields)) { if (CollectionUtils.isNotEmpty(assistFields)) {
var req = new DatasourceRequest(); var req = new DatasourceRequest();
req.setIsCross(crossDs);
req.setDsList(dsMap); req.setDsList(dsMap);
var assistSql = assistSQL(originSql, assistFields, dsMap);
List<ChartSeniorAssistDTO> assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assists)) {
var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSql); req.setQuery(assistSql);
logger.debug("calcite assistSql sql: " + assistSql); logger.debug("calcite assistSql sql: " + assistSql);
var assistData = (List<String[]>) provider.fetchResultField(req).get("data"); var assistData = (List<String[]>) provider.fetchResultField(req).get("data");
result.setAssistData(assistData); result.setAssistData(assistData);
result.setDynamicAssistFields(dynamicAssistFields); result.setDynamicAssistFields(assists);
}
List<ChartSeniorAssistDTO> assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
if (ObjectUtils.isNotEmpty(assistsOriginList)) {
var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
req.setQuery(assistSqlOriginList);
logger.debug("calcite assistSql sql origin list: " + assistSqlOriginList);
var assistDataOriginList = (List<String[]>) provider.fetchResultField(req).get("data");
result.setAssistDataOriginList(assistDataOriginList);
result.setDynamicAssistFieldsOriginList(assistsOriginList);
}
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
@ -58,7 +76,18 @@ public class TablePivotHandler extends GroupChartHandler {
return result; return result;
} }
private Map<String, Object> calcCustomExpr(ChartViewDTO view, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, Provider provider) { @Override
public Map<String, Object> buildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List<String[]> data) {
var result = new HashMap<String, Object>();
var yoyFiltered = filterResult.getContext().get("yoyFiltered") != null;
// 带过滤同环比直接返回原始数据,再由视图重新组装
if (yoyFiltered) {
result.put("data", data);
}
return result;
}
private Map<String, Object> calcCustomExpr(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, Provider provider) {
Object totalStr = JsonUtil.toJSONString(view.getCustomAttr().get("tableTotal")); Object totalStr = JsonUtil.toJSONString(view.getCustomAttr().get("tableTotal"));
TableTotal tableTotal = JsonUtil.parseObject((String) totalStr, TableTotal.class); TableTotal tableTotal = JsonUtil.parseObject((String) totalStr, TableTotal.class);
var dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap"); var dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
@ -67,7 +96,7 @@ public class TablePivotHandler extends GroupChartHandler {
dsList.add(next.getValue().getType()); dsList.add(next.getValue().getType());
} }
boolean needOrder = Utils.isNeedOrder(dsList); boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross();
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields"); var allFields = (List<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
@ -178,7 +207,7 @@ public class TablePivotHandler extends GroupChartHandler {
var tmpData = new HashMap<String, String>(); var tmpData = new HashMap<String, String>();
for (int i = 0; i < yAxis.size(); i++) { for (int i = 0; i < yAxis.size(); i++) {
var a = yAxis.get(i); var a = yAxis.get(i);
tmpData.put(a.getDataeaseName(), data.getFirst()[i]); tmpData.put(a.getGisbiName(), data.getFirst()[i]);
} }
tmp.put("data", tmpData); tmp.put("data", tmpData);
tmp.put("sql", Base64.getEncoder().encodeToString(querySql.getBytes())); tmp.put("sql", Base64.getEncoder().encodeToString(querySql.getBytes()));
@ -208,8 +237,8 @@ public class TablePivotHandler extends GroupChartHandler {
} }
} }
// 列总计里面的行小计 // 列总计里面的行小计
if (col.isShowGrandTotals() && row.isShowGrandTotals() && rowAxis.size() >= 2) { if (col.isShowGrandTotals() && row.isShowSubTotals() && rowAxis.size() >= 2) {
var yAxis = getCustomFields(view, row.getCalcTotals().getCfg()); var yAxis = getCustomFields(view, row.getCalcSubTotals().getCfg());
if (!yAxis.isEmpty()) { if (!yAxis.isEmpty()) {
var tmpData = new ArrayList<Map<String, Object>>(); var tmpData = new ArrayList<Map<String, Object>>();
dataMap.put("rowSubInColTotal", tmpData); dataMap.put("rowSubInColTotal", tmpData);
@ -243,11 +272,11 @@ public class TablePivotHandler extends GroupChartHandler {
var tmpList = new ArrayList<Map<String, Object>>(); var tmpList = new ArrayList<Map<String, Object>>();
tmpData.add(tmpList); tmpData.add(tmpList);
var subRow = rowAxis.subList(0, i + 1); var subRow = rowAxis.subList(0, i + 1);
var xAxis = new ArrayList<>(subRow);
for (int j = 0; j < colAxis.size(); j++) { for (int j = 0; j < colAxis.size(); j++) {
if (j == colAxis.size() - 1) { if (j == colAxis.size() - 1) {
break; break;
} }
var xAxis = new ArrayList<>(subRow);
var subCol = colAxis.subList(0, j + 1); var subCol = colAxis.subList(0, j + 1);
xAxis.addAll(subCol); xAxis.addAll(subCol);
var tmpAllList = new ArrayList<>(allFields); var tmpAllList = new ArrayList<>(allFields);
@ -272,7 +301,7 @@ public class TablePivotHandler extends GroupChartHandler {
var rowData = data.getFirst(); var rowData = data.getFirst();
for (int i = 0; i < rowData.length; i++) { for (int i = 0; i < rowData.length; i++) {
var qAxis = quotaAxis.get(i); var qAxis = quotaAxis.get(i);
rootResult.put(qAxis.getDataeaseName(), rowData[i]); rootResult.put(qAxis.getGisbiName(), rowData[i]);
} }
return rootResult; return rootResult;
} }
@ -291,7 +320,7 @@ public class TablePivotHandler extends GroupChartHandler {
if (j == dimAxis.size() - 1) { if (j == dimAxis.size() - 1) {
for (int k = 0; k < quotaAxis.size(); k++) { for (int k = 0; k < quotaAxis.size(); k++) {
var qAxis = quotaAxis.get(k); var qAxis = quotaAxis.get(k);
curSubMap.put(qAxis.getDataeaseName(), rowData[j + k + 1]); curSubMap.put(qAxis.getGisbiName(), rowData[j + k + 1]);
} }
} }
} }
@ -303,6 +332,7 @@ public class TablePivotHandler extends GroupChartHandler {
List<ChartViewFieldDTO> allFields, boolean crossDs, Map<Long, DatasourceSchemaDTO> dsMap, List<ChartViewFieldDTO> allFields, boolean crossDs, Map<Long, DatasourceSchemaDTO> dsMap,
ChartViewDTO view, Provider provider, boolean needOrder) { ChartViewDTO view, Provider provider, boolean needOrder) {
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setIsCross(crossDs);
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage); Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage); Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
@ -326,10 +356,10 @@ public class TablePivotHandler extends GroupChartHandler {
} }
private List<ChartViewFieldDTO> getCustomFields(ChartViewDTO view, List<TableCalcTotalCfg> cfgList) { private List<ChartViewFieldDTO> getCustomFields(ChartViewDTO view, List<TableCalcTotalCfg> cfgList) {
var quotaIds = view.getYAxis().stream().map(ChartViewFieldDTO::getDataeaseName).collect(Collectors.toSet()); var quotaIds = view.getYAxis().stream().map(ChartViewFieldDTO::getGisbiName).collect(Collectors.toSet());
var customFields = new ArrayList<ChartViewFieldDTO>(); var customFields = new ArrayList<ChartViewFieldDTO>();
for (TableCalcTotalCfg totalCfg : cfgList) { for (TableCalcTotalCfg totalCfg : cfgList) {
if (!quotaIds.contains(totalCfg.getDataeaseName())) { if (!quotaIds.contains(totalCfg.getGisbiName())) {
continue; continue;
} }
if (StringUtils.equalsIgnoreCase(totalCfg.getAggregation(), "CUSTOM")) { if (StringUtils.equalsIgnoreCase(totalCfg.getAggregation(), "CUSTOM")) {

View File

@ -1,7 +1,9 @@
package io.gisbi.chart.dao.ext.mapper; package io.gisbi.chart.dao.ext.mapper;
import io.gisbi.api.chart.vo.ViewSelectorVO; import io.gisbi.api.chart.vo.ViewSelectorVO;
import io.gisbi.chart.dao.auto.entity.CoreChartView;
import io.gisbi.chart.dao.ext.entity.ChartBasePO; import io.gisbi.chart.dao.ext.entity.ChartBasePO;
import io.gisbi.extensions.view.dto.ChartViewDTO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
@ -16,29 +18,21 @@ public interface ExtChartViewMapper {
""") """)
List<ViewSelectorVO> queryViewOption(@Param("resourceId") Long resourceId); List<ViewSelectorVO> queryViewOption(@Param("resourceId") Long resourceId);
ChartBasePO queryChart(@Param("id") Long id, @Param("resourceTable")String resourceTable);
List<CoreChartView> selectListCustom(@Param("sceneId") Long sceneId, @Param("resourceTable") String resourceTable);
void deleteViewsBySceneId(@Param("sceneId") Long sceneId, @Param("resourceTable") String resourceTable);
@Select(""" @Select("""
select SELECT id, scene_id as pid, title, type FROM (
ccv.id as chart_id, SELECT id, scene_id, title, type FROM core_chart_view
ccv.title as chart_name, WHERE id = #{viewId}
ccv.type as chart_type, UNION ALL
ccv.table_id, SELECT id, scene_id, title, type FROM snapshot_core_chart_view
dvi.id as resource_id, WHERE id = #{viewId}
dvi.name as resource_name, ) combined_views
dvi.type as resource_type, LIMIT 1
ccv.x_axis,
ccv.x_axis_ext,
ccv.y_axis,
ccv.y_axis_ext,
ccv.ext_stack,
ccv.ext_bubble,
ccv.ext_label,
ccv.ext_tooltip,
ccv.flow_map_start_name,
ccv.flow_map_end_name,
ccv.ext_color
from core_chart_view ccv
left join data_visualization_info dvi on dvi.id = ccv.scene_id
where ccv.id = #{id}
""") """)
ChartBasePO queryChart(@Param("id") Long id); ChartViewDTO findChartViewAround(@Param("viewId") String viewId);
} }

View File

@ -1,14 +1,16 @@
package io.gisbi.chart.manage; package io.gisbi.chart.manage;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO; import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.api.permissions.auth.dto.BusiPerCheckDTO;
import io.gisbi.api.permissions.dataset.dto.DataSetRowPermissionsTreeDTO; import io.gisbi.api.permissions.dataset.dto.DataSetRowPermissionsTreeDTO;
import io.gisbi.chart.charts.ChartHandlerManager; import io.gisbi.chart.charts.ChartHandlerManager;
import io.gisbi.chart.constant.ChartConstants; import io.gisbi.chart.constant.ChartConstants;
import io.gisbi.constant.AuthEnum;
import io.gisbi.dataset.manage.DatasetGroupManage; import io.gisbi.dataset.manage.DatasetGroupManage;
import io.gisbi.dataset.manage.DatasetSQLManage; import io.gisbi.dataset.manage.DatasetSQLManage;
import io.gisbi.dataset.manage.DatasetTableFieldManage; import io.gisbi.dataset.manage.DatasetTableFieldManage;
import io.gisbi.dataset.manage.PermissionManage; import io.gisbi.dataset.manage.PermissionManage;
import io.gisbi.dataset.utils.DatasetUtils;
import io.gisbi.engine.sql.SQLProvider; import io.gisbi.engine.sql.SQLProvider;
import io.gisbi.engine.trans.*; import io.gisbi.engine.trans.*;
import io.gisbi.engine.utils.SQLUtils; import io.gisbi.engine.utils.SQLUtils;
@ -28,6 +30,7 @@ import io.gisbi.extensions.view.plugin.AbstractChartPlugin;
import io.gisbi.extensions.view.util.FieldUtil; import io.gisbi.extensions.view.util.FieldUtil;
import io.gisbi.i18n.Translator; import io.gisbi.i18n.Translator;
import io.gisbi.result.ResultCode; import io.gisbi.result.ResultCode;
import io.gisbi.system.manage.CorePermissionManage;
import io.gisbi.utils.AuthUtils; import io.gisbi.utils.AuthUtils;
import io.gisbi.utils.BeanUtils; import io.gisbi.utils.BeanUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -58,12 +61,14 @@ public class ChartDataManage {
@Resource @Resource
private ChartViewManege chartViewManege; private ChartViewManege chartViewManege;
@Resource @Resource
private PermissionManage permissionManage;
@Resource
private ChartFilterTreeService chartFilterTreeService; private ChartFilterTreeService chartFilterTreeService;
@Resource @Resource
private ChartHandlerManager chartHandlerManager; private ChartHandlerManager chartHandlerManager;
@Resource
private PermissionManage permissionManage;
@Resource
private CorePermissionManage corePermissionManage;
@Autowired(required = false) @Autowired(required = false)
private PluginManageApi pluginManage; private PluginManageApi pluginManage;
@ -132,17 +137,18 @@ public class ChartDataManage {
// row permission // row permission
List<DataSetRowPermissionsTreeDTO> rowPermissionsTree = permissionManage.getRowPermissionsTree(table.getId(), chartExtRequest.getUser()); List<DataSetRowPermissionsTreeDTO> rowPermissionsTree = permissionManage.getRowPermissionsTree(table.getId(), chartExtRequest.getUser());
//将没有权限的列删掉 //将没有权限的列删掉
List<String> dataeaseNames = columnPermissionFields.stream().map(DatasetTableFieldDTO::getDataeaseName).collect(Collectors.toList()); List<String> gisbiNames = columnPermissionFields.stream().map(DatasetTableFieldDTO::getGisbiName).collect(Collectors.toList());
//计数字段 //计数字段
dataeaseNames.add("*"); gisbiNames.add("*");
AxisFormatResult formatResult = chartHandler.formatAxis(view); AxisFormatResult formatResult = chartHandler.formatAxis(view);
formatResult.getContext().put("dataset", table);
formatResult.getContext().put("desensitizationList", desensitizationList); formatResult.getContext().put("desensitizationList", desensitizationList);
var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis);
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
formatResult.getContext().put("allFields", allFields); formatResult.getContext().put("allFields", allFields);
var axisMap = formatResult.getAxisMap(); var axisMap = formatResult.getAxisMap();
axisMap.forEach((axis, fields) -> { axisMap.forEach((axis, fields) -> {
fields.removeIf(fieldDTO -> !dataeaseNames.contains(fieldDTO.getDataeaseName())); fields.removeIf(fieldDTO -> !gisbiNames.contains(fieldDTO.getGisbiName()));
}); });
// 过滤来自仪表板的条件 // 过滤来自仪表板的条件
@ -225,11 +231,17 @@ public class ChartDataManage {
} }
List<ChartExtFilterDTO> filters = new ArrayList<>(); List<ChartExtFilterDTO> filters = new ArrayList<>();
FilterTreeObj customLinkageFilter = null;
// 联动条件 // 联动条件
if (ObjectUtils.isNotEmpty(chartExtRequest.getLinkageFilters())) { if (ObjectUtils.isNotEmpty(chartExtRequest.getLinkageFilters())) {
filters.addAll(chartExtRequest.getLinkageFilters()); for (ChartExtFilterDTO linkageFilter : chartExtRequest.getLinkageFilters()) {
if (3 == linkageFilter.getFilterType()) {
customLinkageFilter = linkageFilter.getCustomFilter();
} else {
filters.add(linkageFilter);
}
}
} }
// 外部参数条件 // 外部参数条件
if (ObjectUtils.isNotEmpty(chartExtRequest.getOuterParamsFilters())) { if (ObjectUtils.isNotEmpty(chartExtRequest.getOuterParamsFilters())) {
filters.addAll(chartExtRequest.getOuterParamsFilters()); filters.addAll(chartExtRequest.getOuterParamsFilters());
@ -357,13 +369,17 @@ public class ChartDataManage {
} }
// 字段过滤器 // 字段过滤器
FilterTreeObj fieldCustomFilter = view.getCustomFilter(); FilterTreeObj fieldCustomFilter = view.getCustomFilter();
// 指标表联动时 使用的CustomFilter
if (customLinkageFilter != null) {
fieldCustomFilter = customLinkageFilter;
}
chartFilterTreeService.searchFieldAndSet(fieldCustomFilter); chartFilterTreeService.searchFieldAndSet(fieldCustomFilter);
fieldCustomFilter = chartFilterTreeService.charReplace(fieldCustomFilter); fieldCustomFilter = chartFilterTreeService.charReplace(fieldCustomFilter);
// 获取dsMap,union sql // 获取dsMap,union sql
Map<String, Object> sqlMap = datasetSQLManage.getUnionSQLForEdit(table, chartExtRequest); Map<String, Object> sqlMap = datasetSQLManage.getUnionSQLForEdit(table, chartExtRequest);
String sql = (String) sqlMap.get("sql"); String sql = (String) sqlMap.get("sql");
Map<Long, DatasourceSchemaDTO> dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap"); Map<Long, DatasourceSchemaDTO> dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = table.getIsCross();
if (!crossDs) { if (!crossDs) {
sql = Utils.replaceSchemaAlias(sql, dsMap); sql = Utils.replaceSchemaAlias(sql, dsMap);
} }
@ -592,11 +608,11 @@ public class ChartDataManage {
int getIndex = 0; int getIndex = 0;
for (int i = 0; i < fieldList.size(); i++) { for (int i = 0; i < fieldList.size(); i++) {
ChartViewFieldDTO item = fieldList.get(i); ChartViewFieldDTO item = fieldList.get(i);
if (StringUtils.equalsIgnoreCase(item.getSort(), "custom_sort")) { if (StringUtils.equalsIgnoreCase(item.getSort(), "custom_sort")) {// 此处与已有的自定义字段对比
chartViewFieldDTO = item; chartViewFieldDTO = item;
index = i; index = i;
} }
if (Objects.equals(item.getId(), field.getId())) { if (Objects.equals(item.getId(), field.getId())) {// 获得当前自定义的字段
getIndex = i; getIndex = i;
} }
} }
@ -648,7 +664,7 @@ public class ChartDataManage {
// 获取图表所有字段配置 // 获取图表所有字段配置
List<ChartViewFieldDTO> allFields = getAllChartFields(view); List<ChartViewFieldDTO> allFields = getAllChartFields(view);
// 处理堆叠/分组图表的特殊x轴配置 // 针对分组切换堆叠时会遇到的问题
if (StringUtils.equalsIgnoreCase(view.getType(), "bar-stack") || StringUtils.equalsIgnoreCase(view.getType(), "chart-mix-stack")) { if (StringUtils.equalsIgnoreCase(view.getType(), "bar-stack") || StringUtils.equalsIgnoreCase(view.getType(), "chart-mix-stack")) {
view.setXAxisExt(new ArrayList<>()); view.setXAxisExt(new ArrayList<>());
} }
@ -668,7 +684,6 @@ public class ChartDataManage {
xAxis.addAll(xAxisExt); xAxis.addAll(xAxisExt);
} }
List<ChartViewFieldDTO> yAxis = new ArrayList<>(view.getYAxis()); List<ChartViewFieldDTO> yAxis = new ArrayList<>(view.getYAxis());
// 合并扩展y轴配置针对混合图表类型
if (StringUtils.containsIgnoreCase(view.getType(), "chart-mix")) { if (StringUtils.containsIgnoreCase(view.getType(), "chart-mix")) {
List<ChartViewFieldDTO> yAxisExt = new ArrayList<>(view.getYAxisExt()); List<ChartViewFieldDTO> yAxisExt = new ArrayList<>(view.getYAxisExt());
yAxis.addAll(yAxisExt); yAxis.addAll(yAxisExt);
@ -678,6 +693,10 @@ public class ChartDataManage {
List<ChartViewFieldDTO> sizeField = getSizeField(view); List<ChartViewFieldDTO> sizeField = getSizeField(view);
yAxis.addAll(sizeField); yAxis.addAll(sizeField);
} }
List<ChartViewFieldDTO> extStack = new ArrayList<>(view.getExtStack());
List<ChartViewFieldDTO> extBubble = new ArrayList<>(view.getExtBubble());
FilterTreeObj fieldCustomFilter = view.getCustomFilter();
List<ChartViewFieldDTO> drill = new ArrayList<>(view.getDrillFields());
// 获取数据集权限信息 // 获取数据集权限信息
DatasetGroupInfoDTO table = datasetGroupManage.getDatasetGroupInfoDTO(view.getTableId(), null); DatasetGroupInfoDTO table = datasetGroupManage.getDatasetGroupInfoDTO(view.getTableId(), null);
@ -715,6 +734,7 @@ public class ChartDataManage {
} }
break; break;
case "table-normal": case "table-normal":
break;
case "bar-group": case "bar-group":
case "bar-group-stack": case "bar-group-stack":
case "flow-map": case "flow-map":
@ -739,6 +759,7 @@ public class ChartDataManage {
// 初始化数据源请求对象 // 初始化数据源请求对象
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
datasourceRequest.setIsCross(crossDs);
// 根据数据源类型选择查询提供器 // 根据数据源类型选择查询提供器
Provider provider; Provider provider;
@ -750,8 +771,10 @@ public class ChartDataManage {
// 执行数据查询 // 执行数据查询
List<String[]> data = new ArrayList<>(); List<String[]> data = new ArrayList<>();
String querySql = null; String querySql = null;
if (table.getMode() == 0) { // 直连模式处理 //如果不是插件图表 走原生逻辑
if (table.getMode() == 0) {// 直连
if (ObjectUtils.isEmpty(dsMap)) { if (ObjectUtils.isEmpty(dsMap)) {
DEException.throwException(Translator.get("i18n_datasource_delete")); DEException.throwException(Translator.get("i18n_datasource_delete"));
} }
@ -768,21 +791,20 @@ public class ChartDataManage {
Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs); Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs);
WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage); WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage);
// 根据图表类型生成不同SQL逻辑
if (StringUtils.equalsAnyIgnoreCase(view.getType(), "indicator", "gauge", "liquid")) { if (StringUtils.equalsAnyIgnoreCase(view.getType(), "indicator", "gauge", "liquid")) {
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage); Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage);
querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
} else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) {
List<ChartViewFieldDTO> xFields = new ArrayList<>(); List<ChartViewFieldDTO> xFields = new ArrayList<>();
xFields.addAll(xAxis); xFields.addAll(xAxis);
xFields.addAll(view.getExtStack()); xFields.addAll(extStack);
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xFields, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage); Dimension2SQLObj.dimension2sqlObj(sqlMeta, xFields, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage);
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage); Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage);
querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
} else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) {
List<ChartViewFieldDTO> yFields = new ArrayList<>(); List<ChartViewFieldDTO> yFields = new ArrayList<>();
yFields.addAll(yAxis); yFields.addAll(yAxis);
yFields.addAll(view.getExtBubble()); yFields.addAll(extBubble);
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage); Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage);
Quota2SQLObj.quota2sqlObj(sqlMeta, yFields, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage); Quota2SQLObj.quota2sqlObj(sqlMeta, yFields, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams(), pluginManage);
querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view);
@ -804,7 +826,6 @@ public class ChartDataManage {
return data; return data;
} }
private List<ChartViewFieldDTO> getAllChartFields(ChartViewDTO view) { private List<ChartViewFieldDTO> getAllChartFields(ChartViewDTO view) {
// get all fields // get all fields
Map<String, List<ChartViewFieldDTO>> stringListMap = chartViewManege.listByDQ(view.getTableId(), view.getId(), view); Map<String, List<ChartViewFieldDTO>> stringListMap = chartViewManege.listByDQ(view.getTableId(), view.getId(), view);
@ -837,14 +858,13 @@ public class ChartDataManage {
DEException.throwException(e); DEException.throwException(e);
} }
} else { } else {
// 如果当前图表ID未存在于检查数据中则记录为废弃ID
disuseChartIdList.add(chartViewDTO.getId()); disuseChartIdList.add(chartViewDTO.getId());
} }
}); });
// 如果存在需要废弃的图表ID列表则批量标记为废弃 // 阈值告警处理 统一在发布时处理
if (CollectionUtils.isNotEmpty(disuseChartIdList)) { // if (CollectionUtils.isNotEmpty(disuseChartIdList)) {
chartViewManege.disuse(disuseChartIdList); // chartViewManege.disuse(disuseChartIdList);
} // }
} }
} }
@ -879,19 +899,18 @@ public class ChartDataManage {
// 执行SQL查询获取原始数据 // 执行SQL查询获取原始数据
List<String[]> sqlData = sqlData(view, view.getChartExtRequest(), fieldId); List<String[]> sqlData = sqlData(view, view.getChartExtRequest(), fieldId);
List<String[]> result = customSort(Optional.ofNullable(targetField.getCustomSort()).orElse(new ArrayList<>()), sqlData, 0);
// 根据自定义排序规则对数据进行排序 return result.stream().map(i -> i[0]).distinct().collect(Collectors.toList());
List<String[]> result = customSort(
Optional.ofNullable(targetField.getCustomSort()).orElse(new ArrayList<>()),
sqlData,
0
);
// 提取第一列数据并去重生成最终结果列表
return result.stream()
.map(i -> i[0])
.distinct()
.collect(Collectors.toList());
} }
public void encodeData(ChartViewDTO chartViewDTO) {
if (chartViewDTO.getData() != null) {
if (chartViewDTO.getType().startsWith("chart-mix")) {
DatasetUtils.listEncode((List<ChartViewFieldDTO>) ((Map<String, Object>) chartViewDTO.getData().get("left")).get("sourceFields"));
DatasetUtils.listEncode((List<ChartViewFieldDTO>) ((Map<String, Object>) chartViewDTO.getData().get("right")).get("sourceFields"));
} else {
DatasetUtils.listEncode((List<ChartViewFieldDTO>) chartViewDTO.getData().get("sourceFields"));
}
}
}
} }

View File

@ -10,6 +10,7 @@ import io.gisbi.chart.dao.auto.entity.CoreChartView;
import io.gisbi.chart.dao.auto.mapper.CoreChartViewMapper; import io.gisbi.chart.dao.auto.mapper.CoreChartViewMapper;
import io.gisbi.chart.dao.ext.entity.ChartBasePO; import io.gisbi.chart.dao.ext.entity.ChartBasePO;
import io.gisbi.chart.dao.ext.mapper.ExtChartViewMapper; import io.gisbi.chart.dao.ext.mapper.ExtChartViewMapper;
import io.gisbi.constant.CommonConstants;
import io.gisbi.dataset.dao.auto.entity.CoreDatasetTableField; import io.gisbi.dataset.dao.auto.entity.CoreDatasetTableField;
import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper; import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper;
import io.gisbi.dataset.manage.DatasetTableFieldManage; import io.gisbi.dataset.manage.DatasetTableFieldManage;
@ -25,13 +26,16 @@ import io.gisbi.extensions.datasource.dto.FieldGroupDTO;
import io.gisbi.extensions.datasource.model.SQLObj; import io.gisbi.extensions.datasource.model.SQLObj;
import io.gisbi.extensions.view.dto.*; import io.gisbi.extensions.view.dto.*;
import io.gisbi.extensions.view.filter.FilterTreeObj; import io.gisbi.extensions.view.filter.FilterTreeObj;
import io.gisbi.i18n.Lang;
import io.gisbi.i18n.Translator; import io.gisbi.i18n.Translator;
import io.gisbi.utils.BeanUtils; import io.gisbi.utils.BeanUtils;
import io.gisbi.utils.IDUtils; import io.gisbi.utils.IDUtils;
import io.gisbi.utils.JsonUtil; import io.gisbi.utils.JsonUtil;
import io.gisbi.utils.LogUtil; import io.gisbi.utils.LogUtil;
import io.gisbi.visualization.dao.auto.entity.DataVisualizationInfo; import io.gisbi.visualization.dao.auto.entity.DataVisualizationInfo;
import io.gisbi.visualization.dao.auto.entity.SnapshotCoreChartView;
import io.gisbi.visualization.dao.auto.mapper.DataVisualizationInfoMapper; import io.gisbi.visualization.dao.auto.mapper.DataVisualizationInfoMapper;
import io.gisbi.visualization.dao.auto.mapper.SnapshotCoreChartViewMapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -55,6 +59,8 @@ public class ChartViewManege {
@Resource @Resource
private CoreChartViewMapper coreChartViewMapper; private CoreChartViewMapper coreChartViewMapper;
@Resource @Resource
private SnapshotCoreChartViewMapper snapshotCoreChartViewMapper;
@Resource
private ChartDataManage chartDataManage; private ChartDataManage chartDataManage;
@Resource @Resource
private CoreDatasetTableFieldMapper coreDatasetTableFieldMapper; private CoreDatasetTableFieldMapper coreDatasetTableFieldMapper;
@ -82,18 +88,19 @@ public class ChartViewManege {
if (id == null) { if (id == null) {
DEException.throwException(Translator.get("i18n_no_id")); DEException.throwException(Translator.get("i18n_no_id"));
} }
CoreChartView coreChartView = coreChartViewMapper.selectById(id); SnapshotCoreChartView coreChartView = snapshotCoreChartViewMapper.selectById(id);
CoreChartView record = transDTO2Record(chartViewDTO); SnapshotCoreChartView record = transDTO2Record(chartViewDTO);
if (ObjectUtils.isEmpty(coreChartView)) { if (ObjectUtils.isEmpty(coreChartView)) {
coreChartViewMapper.insert(record); snapshotCoreChartViewMapper.deleteById(record.getId());
snapshotCoreChartViewMapper.insert(record);
} else { } else {
UpdateWrapper<CoreChartView> updateWrapper = new UpdateWrapper<>(); UpdateWrapper<SnapshotCoreChartView> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", record.getId()); updateWrapper.eq("id", record.getId());
//富文本允许设置空的tableId 这里额外更新一下 //富文本允许设置空的tableId 这里额外更新一下
if (record.getTableId() == null) { if (record.getTableId() == null) {
updateWrapper.set("table_id", null); updateWrapper.set("table_id", null);
} }
coreChartViewMapper.update(record, updateWrapper); snapshotCoreChartViewMapper.update(record, updateWrapper);
} }
return chartViewDTO; return chartViewDTO;
} }
@ -113,11 +120,21 @@ public class ChartViewManege {
coreChartViewMapper.delete(wrapper); coreChartViewMapper.delete(wrapper);
} }
public ChartViewDTO getDetails(Long id) { public ChartViewDTO getDetails(Long id, String resourceTable) {
CoreChartView coreChartView = coreChartViewMapper.selectById(id); CoreChartView coreChartView = null;
if (CommonConstants.RESOURCE_TABLE.SNAPSHOT.equals(resourceTable)) {
SnapshotCoreChartView snapshotCoreChartView = snapshotCoreChartViewMapper.selectById(id);
if (ObjectUtils.isEmpty(snapshotCoreChartView)) {
return null;
}
coreChartView = new CoreChartView();
BeanUtils.copyBean(coreChartView, snapshotCoreChartView);
} else {
coreChartView = coreChartViewMapper.selectById(id);
if (ObjectUtils.isEmpty(coreChartView)) { if (ObjectUtils.isEmpty(coreChartView)) {
return null; return null;
} }
}
ChartViewDTO dto = transRecord2DTO(coreChartView); ChartViewDTO dto = transRecord2DTO(coreChartView);
return dto; return dto;
} }
@ -125,10 +142,10 @@ public class ChartViewManege {
/** /**
* sceneId 为仪表板或者数据大屏id * sceneId 为仪表板或者数据大屏id
*/ */
public List<ChartViewDTO> listBySceneId(Long sceneId) { public List<ChartViewDTO> listBySceneId(Long sceneId, String resourceTable) {
QueryWrapper<CoreChartView> wrapper = new QueryWrapper<>(); QueryWrapper<CoreChartView> wrapper = new QueryWrapper<>();
wrapper.eq("scene_id", sceneId); wrapper.eq("scene_id", sceneId);
List<ChartViewDTO> chartViewDTOS = transChart(coreChartViewMapper.selectList(wrapper)); List<ChartViewDTO> chartViewDTOS = transChart(extChartViewMapper.selectListCustom(sceneId, resourceTable));
if (!CollectionUtils.isEmpty(chartViewDTOS)) { if (!CollectionUtils.isEmpty(chartViewDTOS)) {
List<Long> tableIds = chartViewDTOS.stream() List<Long> tableIds = chartViewDTOS.stream()
.map(ChartViewDTO::getTableId) .map(ChartViewDTO::getTableId)
@ -192,8 +209,8 @@ public class ChartViewManege {
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
public ChartViewDTO getChart(Long id) throws Exception { public ChartViewDTO getChart(Long id, String resourceTable) throws Exception {
ChartViewDTO details = getDetails(id); ChartViewDTO details = getDetails(id, resourceTable);
if (details == null) { if (details == null) {
return null; return null;
} }
@ -220,9 +237,8 @@ public class ChartViewManege {
}).collect(Collectors.toList()); }).collect(Collectors.toList());
// filter column disable field // filter column disable field
Map<String, ColumnPermissionItem> desensitizationList = new HashMap<>(); Map<String, ColumnPermissionItem> desensitizationList = new HashMap<>();
// List<DatasetTableFieldDTO> datasetTableFieldDTOS = permissionManage.filterColumnPermissions(collect, desensitizationList, id, null);
List<DatasetTableFieldDTO> datasetTableFieldDTOS = collect; List<DatasetTableFieldDTO> datasetTableFieldDTOS = collect;
datasetTableFieldDTOS.forEach(ele -> ele.setDesensitized(desensitizationList.containsKey(ele.getDataeaseName()))); datasetTableFieldDTOS.forEach(ele -> ele.setDesensitized(desensitizationList.containsKey(ele.getGisbiName())));
datasetTableFieldDTOS.add(createCountField(id)); datasetTableFieldDTOS.add(createCountField(id));
List<ChartViewFieldDTO> list = transFieldDTO(datasetTableFieldDTOS); List<ChartViewFieldDTO> list = transFieldDTO(datasetTableFieldDTOS);
@ -282,8 +298,8 @@ public class ChartViewManege {
coreDatasetTableField.setExtField(2); coreDatasetTableField.setExtField(2);
coreDatasetTableField.setOriginName("[" + id + "]"); coreDatasetTableField.setOriginName("[" + id + "]");
coreDatasetTableField.setId(IDUtils.snowID()); coreDatasetTableField.setId(IDUtils.snowID());
coreDatasetTableField.setDataeaseName(TableUtils.fieldNameShort(coreDatasetTableField.getId() + "_" + coreDatasetTableField.getOriginName())); coreDatasetTableField.setGisbiName(TableUtils.fieldNameShort(coreDatasetTableField.getId() + "_" + coreDatasetTableField.getOriginName()));
coreDatasetTableField.setFieldShortName(coreDatasetTableField.getDataeaseName()); coreDatasetTableField.setFieldShortName(coreDatasetTableField.getGisbiName());
coreDatasetTableFieldMapper.insert(coreDatasetTableField); coreDatasetTableFieldMapper.insert(coreDatasetTableField);
} }
@ -306,8 +322,8 @@ public class ChartViewManege {
coreDatasetTableFieldMapper.delete(queryWrapper); coreDatasetTableFieldMapper.delete(queryWrapper);
} }
public ChartBaseVO chartBaseInfo(Long id) { public ChartBaseVO chartBaseInfo(Long id, String resourceTable) {
ChartBasePO po = extChartViewMapper.queryChart(id); ChartBasePO po = extChartViewMapper.queryChart(id, resourceTable);
if (ObjectUtils.isEmpty(po)) return null; if (ObjectUtils.isEmpty(po)) return null;
ChartBaseVO vo = BeanUtils.copyBean(new ChartBaseVO(), po); ChartBaseVO vo = BeanUtils.copyBean(new ChartBaseVO(), po);
TypeReference<List<ChartViewFieldDTO>> tokenType = new TypeReference<>() { TypeReference<List<ChartViewFieldDTO>> tokenType = new TypeReference<>() {
@ -336,7 +352,7 @@ public class ChartViewManege {
dto.setDatasetGroupId(id); dto.setDatasetGroupId(id);
dto.setOriginName("*"); dto.setOriginName("*");
dto.setName("记录数*"); dto.setName("记录数*");
dto.setDataeaseName("*"); dto.setGisbiName("*");
dto.setType("INT"); dto.setType("INT");
dto.setChecked(true); dto.setChecked(true);
dto.setColumnIndex(999); dto.setColumnIndex(999);
@ -353,6 +369,7 @@ public class ChartViewManege {
BeanUtils.copyBean(dto, ele); BeanUtils.copyBean(dto, ele);
dto.setDateStyle("y_M_d"); dto.setDateStyle("y_M_d");
dto.setDatePattern("date_sub"); dto.setDatePattern("date_sub");
dto.setDateShowFormat("y_M_d");
dto.setChartType("bar"); dto.setChartType("bar");
if (dto.getId() == -1L || dto.getDeType() == 0 || dto.getDeType() == 1 || dto.getDeType() == 7) { if (dto.getId() == -1L || dto.getDeType() == 0 || dto.getDeType() == 1 || dto.getDeType() == 7) {
@ -365,7 +382,7 @@ public class ChartViewManege {
chartFieldCompareDTO.setType("none"); chartFieldCompareDTO.setType("none");
dto.setCompareCalc(chartFieldCompareDTO); dto.setCompareCalc(chartFieldCompareDTO);
dto.setFormatterCfg(new FormatterCfgDTO()); dto.setFormatterCfg(new FormatterCfgDTO().setUnitLanguage(Lang.isChinese() ? "ch" : "en"));
dto.setSort("none"); dto.setSort("none");
dto.setFilter(Collections.emptyList()); dto.setFilter(Collections.emptyList());
@ -373,8 +390,8 @@ public class ChartViewManege {
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
public CoreChartView transDTO2Record(ChartViewDTO dto) throws Exception { public SnapshotCoreChartView transDTO2Record(ChartViewDTO dto) throws Exception {
CoreChartView record = new CoreChartView(); SnapshotCoreChartView record = new SnapshotCoreChartView();
BeanUtils.copyBean(record, dto); BeanUtils.copyBean(record, dto);
record.setxAxis(objectMapper.writeValueAsString(dto.getXAxis())); record.setxAxis(objectMapper.writeValueAsString(dto.getXAxis()));
@ -400,7 +417,7 @@ public class ChartViewManege {
record.setFlowMapStartName(objectMapper.writeValueAsString(dto.getFlowMapStartName())); record.setFlowMapStartName(objectMapper.writeValueAsString(dto.getFlowMapStartName()));
record.setFlowMapEndName(objectMapper.writeValueAsString(dto.getFlowMapEndName())); record.setFlowMapEndName(objectMapper.writeValueAsString(dto.getFlowMapEndName()));
record.setExtColor(objectMapper.writeValueAsString(dto.getExtColor())); record.setExtColor(objectMapper.writeValueAsString(dto.getExtColor()));
record.setSortPriority(objectMapper.writeValueAsString(dto.getSortPriority()));
return record; return record;
} }
@ -434,6 +451,8 @@ public class ChartViewManege {
dto.setFlowMapStartName(JsonUtil.parseList(record.getFlowMapStartName(), tokenType)); dto.setFlowMapStartName(JsonUtil.parseList(record.getFlowMapStartName(), tokenType));
dto.setFlowMapEndName(JsonUtil.parseList(record.getFlowMapEndName(), tokenType)); dto.setFlowMapEndName(JsonUtil.parseList(record.getFlowMapEndName(), tokenType));
dto.setExtColor(JsonUtil.parseList(record.getExtColor(), tokenType)); dto.setExtColor(JsonUtil.parseList(record.getExtColor(), tokenType));
dto.setSortPriority(JsonUtil.parseList(record.getSortPriority(), new TypeReference<List<SortAxis>>() {
}));
return dto; return dto;
@ -462,4 +481,8 @@ public class ChartViewManege {
return result; return result;
} }
} }
public ChartViewDTO findChartViewAround(String viewId) {
return extChartViewMapper.findChartViewAround(viewId);
}
} }

View File

@ -20,6 +20,7 @@ import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
@ -34,8 +35,8 @@ public class ChartViewThresholdManage {
@Resource @Resource
private ChartViewManege chartViewManege; private ChartViewManege chartViewManege;
public String convertThresholdRules(Long chartId, String thresholdRules) { public String convertThresholdRules(Long chartId, String thresholdRules, String resourceTable) {
ChartViewDTO details = chartViewManege.getDetails(chartId); ChartViewDTO details = chartViewManege.getDetails(chartId, resourceTable);
return convertThresholdRules(details, thresholdRules); return convertThresholdRules(details, thresholdRules);
} }
@ -251,7 +252,7 @@ public class ChartViewThresholdManage {
String thresholdRules = request.getThresholdRules(); String thresholdRules = request.getThresholdRules();
Long chartId = request.getChartId(); Long chartId = request.getChartId();
try { try {
ChartViewDTO chart = chartViewManege.getChart(chartId); ChartViewDTO chart = chartViewManege.getChart(chartId, request.getResourceTable());
Map<String, Object> data = null; Map<String, Object> data = null;
if (ObjectUtils.isEmpty(chart) || MapUtils.isEmpty(data = chart.getData())) { if (ObjectUtils.isEmpty(chart) || MapUtils.isEmpty(data = chart.getData())) {
return new ThresholdCheckVO(false, null, "查询图表异常!", null); return new ThresholdCheckVO(false, null, "查询图表异常!", null);
@ -280,9 +281,16 @@ public class ChartViewThresholdManage {
DatasetTableFieldDTO fieldDTO = fieldMap.get(id); DatasetTableFieldDTO fieldDTO = fieldMap.get(id);
if (ObjectUtils.isEmpty(fieldDTO)) continue; if (ObjectUtils.isEmpty(fieldDTO)) continue;
String fieldDTOName = fieldDTO.getName(); String fieldDTOName = fieldDTO.getName();
String dataeaseName = fieldDTO.getDataeaseName(); String gisbiName = fieldDTO.getGisbiName();
List<String> valueList = rows.stream().map(row -> ObjectUtils.isEmpty(row.get(dataeaseName)) ? null : row.get(dataeaseName).toString()).collect(Collectors.toList()); String replacement = null;
String replacement = fieldDTOName + ": " + JsonUtil.toJSONString(valueList); if (fieldDTO.getDeType().equals(DeTypeConstants.DE_FLOAT) || fieldDTO.getDeType().equals(DeTypeConstants.DE_INT)) {
List<String> valueList = rows.stream().map(row -> ObjectUtils.isEmpty(row.get(gisbiName)) ? null : stripTrailingZeros2String(row.get(gisbiName))).collect(Collectors.toList());
replacement = fieldDTOName + ": " + JsonUtil.toJSONString(valueList);
} else {
List<String> valueList = rows.stream().map(row -> ObjectUtils.isEmpty(row.get(gisbiName)) ? null : row.get(gisbiName).toString()).collect(Collectors.toList());
replacement = fieldDTOName + ": " + JsonUtil.toJSONString(valueList);
}
// 替换文本 // 替换文本
matcher.appendReplacement(sb, replacement); matcher.appendReplacement(sb, replacement);
} }
@ -297,6 +305,14 @@ public class ChartViewThresholdManage {
} }
} }
private String stripTrailingZeros2String(Object value) {
if (ObjectUtils.isEmpty(value)) {
return null;
}
if (!(value instanceof BigDecimal)) return value.toString();
return ((BigDecimal) value).stripTrailingZeros().toPlainString();
}
private void chartDynamicMap(List<Map<String, Object>> rows, FilterTreeObj conditionTree, Map<Long, DatasetTableFieldDTO> fieldMap) { private void chartDynamicMap(List<Map<String, Object>> rows, FilterTreeObj conditionTree, Map<Long, DatasetTableFieldDTO> fieldMap) {
List<FilterTreeItem> items = conditionTree.getItems(); List<FilterTreeItem> items = conditionTree.getItems();
items.forEach(item -> { items.forEach(item -> {
@ -404,13 +420,13 @@ public class ChartViewThresholdManage {
private String formatValue(List<Map<String, Object>> rows, FilterTreeItem item) { private String formatValue(List<Map<String, Object>> rows, FilterTreeItem item) {
DatasetTableFieldDTO field = item.getField(); DatasetTableFieldDTO field = item.getField();
String dataeaseName = field.getDataeaseName(); String gisbiName = field.getGisbiName();
String value = item.getValue(); String value = item.getValue();
Float tempFVal = StringUtils.equalsAny(value, "min", "max") ? null : 0f; Float tempFVal = StringUtils.equalsAny(value, "min", "max") ? null : 0f;
int validLen = 0; int validLen = 0;
for (Map<String, Object> row : rows) { for (Map<String, Object> row : rows) {
Object o = row.get(dataeaseName); Object o = row.get(gisbiName);
if (ObjectUtils.isEmpty(o)) continue; if (ObjectUtils.isEmpty(o)) continue;
float fvalue = Float.parseFloat(o.toString()); float fvalue = Float.parseFloat(o.toString());
if (StringUtils.equals("min", value)) { if (StringUtils.equals("min", value)) {
@ -487,10 +503,10 @@ public class ChartViewThresholdManage {
} }
private boolean rowMatch(Map<String, Object> row, FilterTreeItem item, DatasetTableFieldDTO fieldDTO) { private boolean rowMatch(Map<String, Object> row, FilterTreeItem item, DatasetTableFieldDTO fieldDTO) {
String dataeaseName = fieldDTO.getDataeaseName(); String gisbiName = fieldDTO.getGisbiName();
String filterType = item.getFilterType(); String filterType = item.getFilterType();
Integer deType = fieldDTO.getDeType(); Integer deType = fieldDTO.getDeType();
Object valueObj = row.get(dataeaseName); Object valueObj = row.get(gisbiName);
if (StringUtils.equals(filterType, "enum")) { if (StringUtils.equals(filterType, "enum")) {
List<String> enumValue = item.getEnumValue(); List<String> enumValue = item.getEnumValue();
return ObjectUtils.isNotEmpty(valueObj) && enumValue.contains(valueObj); return ObjectUtils.isNotEmpty(valueObj) && enumValue.contains(valueObj);

View File

@ -5,7 +5,6 @@ import io.gisbi.api.chart.ChartDataApi;
import io.gisbi.api.chart.dto.ViewDetailField; import io.gisbi.api.chart.dto.ViewDetailField;
import io.gisbi.api.chart.request.ChartExcelRequest; import io.gisbi.api.chart.request.ChartExcelRequest;
import io.gisbi.api.chart.request.ChartExcelRequestInner; import io.gisbi.api.chart.request.ChartExcelRequestInner;
import io.gisbi.auth.DeLinkPermit;
import io.gisbi.chart.constant.ChartConstants; import io.gisbi.chart.constant.ChartConstants;
import io.gisbi.chart.manage.ChartDataManage; import io.gisbi.chart.manage.ChartDataManage;
import io.gisbi.constant.AuthConstant; import io.gisbi.constant.AuthConstant;
@ -14,11 +13,13 @@ import io.gisbi.constant.CommonConstants;
import io.gisbi.dataset.server.DatasetFieldServer; import io.gisbi.dataset.server.DatasetFieldServer;
import io.gisbi.dataset.manage.PermissionManage; import io.gisbi.dataset.manage.PermissionManage;
import io.gisbi.constant.DeTypeConstants; import io.gisbi.constant.DeTypeConstants;
import io.gisbi.dataset.utils.DatasetUtils;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.exportCenter.manage.ExportCenterManage; import io.gisbi.exportCenter.manage.ExportCenterManage;
import io.gisbi.exportCenter.util.ExportCenterUtils; import io.gisbi.exportCenter.util.ExportCenterUtils;
import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO; import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO;
import io.gisbi.extensions.view.dto.*; import io.gisbi.extensions.view.dto.*;
import io.gisbi.i18n.Lang;
import io.gisbi.result.ResultCode; import io.gisbi.result.ResultCode;
import io.gisbi.utils.JsonUtil; import io.gisbi.utils.JsonUtil;
import io.gisbi.utils.LogUtil; import io.gisbi.utils.LogUtil;
@ -69,12 +70,12 @@ public class ChartDataServer implements ChartDataApi {
@Resource @Resource
private DatasetFieldServer datasetFieldServer; private DatasetFieldServer datasetFieldServer;
@Value("${dataease.export.page.size:50000}") @Value("${gisbi.export.page.size:50000}")
private Integer extractPageSize; private Integer extractPageSize;
private final Long sheetLimit = 1000000L; private final Long sheetLimit = 1000000L;
@DeLinkPermit("#p0.sceneId")
@Override @Override
public ChartViewDTO getData(ChartViewDTO chartViewDTO) throws Exception { public ChartViewDTO getData(ChartViewDTO chartViewDTO) throws Exception {
try { try {
@ -82,7 +83,11 @@ public class ChartDataServer implements ChartDataApi {
if (CommonConstants.VIEW_DATA_FROM.TEMPLATE.equalsIgnoreCase(chartViewDTO.getDataFrom())) { if (CommonConstants.VIEW_DATA_FROM.TEMPLATE.equalsIgnoreCase(chartViewDTO.getDataFrom())) {
return extendDataManage.getChartDataInfo(chartViewDTO.getId(), chartViewDTO); return extendDataManage.getChartDataInfo(chartViewDTO.getId(), chartViewDTO);
} else { } else {
return chartDataManage.calcData(chartViewDTO); DatasetUtils.viewDecode(chartViewDTO);
ChartViewDTO dto = chartDataManage.calcData(chartViewDTO);
DatasetUtils.viewEncode(dto);
chartDataManage.encodeData(dto);
return dto;
} }
} catch (Exception e) { } catch (Exception e) {
DEException.throwException(ResultCode.DATA_IS_WRONG.code(), e.getMessage() + "\n\n" + ExceptionUtils.getStackTrace(e)); DEException.throwException(ResultCode.DATA_IS_WRONG.code(), e.getMessage() + "\n\n" + ExceptionUtils.getStackTrace(e));
@ -103,8 +108,8 @@ public class ChartDataServer implements ChartDataApi {
viewDTO.setType("table-info"); viewDTO.setType("table-info");
viewDTO.setRender("antv"); viewDTO.setRender("antv");
List<DatasetTableFieldDTO> sourceFields = datasetFieldServer.listByDatasetGroup(viewDTO.getTableId()); List<DatasetTableFieldDTO> sourceFields = datasetFieldServer.listByDatasetGroup(viewDTO.getTableId());
List<String> fileNames = permissionManage.filterColumnPermissions(sourceFields, new HashMap<>(), viewDTO.getTableId(), null).stream().map(DatasetTableFieldDTO::getDataeaseName).collect(Collectors.toList()); List<String> fileNames = permissionManage.filterColumnPermissions(sourceFields, new HashMap<>(), viewDTO.getTableId(), null).stream().map(DatasetTableFieldDTO::getGisbiName).collect(Collectors.toList());
sourceFields = sourceFields.stream().filter(datasetTableFieldDTO -> fileNames.contains(datasetTableFieldDTO.getDataeaseName())).collect(Collectors.toList()); sourceFields = sourceFields.stream().filter(datasetTableFieldDTO -> fileNames.contains(datasetTableFieldDTO.getGisbiName())).collect(Collectors.toList());
dsHeader = sourceFields.stream().map(DatasetTableFieldDTO::getName).toArray(String[]::new); dsHeader = sourceFields.stream().map(DatasetTableFieldDTO::getName).toArray(String[]::new);
dsTypes = sourceFields.stream().map(DatasetTableFieldDTO::getDeType).toArray(Integer[]::new); dsTypes = sourceFields.stream().map(DatasetTableFieldDTO::getDeType).toArray(Integer[]::new);
TypeReference<List<ChartViewFieldDTO>> listTypeReference = new TypeReference<List<ChartViewFieldDTO>>() { TypeReference<List<ChartViewFieldDTO>> listTypeReference = new TypeReference<List<ChartViewFieldDTO>>() {
@ -120,7 +125,11 @@ public class ChartDataServer implements ChartDataApi {
} else { } else {
viewDTO.setResultCount(viewLimit); viewDTO.setResultCount(viewLimit);
} }
chartViewInfo = getData(viewDTO); if (CommonConstants.VIEW_DATA_FROM.TEMPLATE.equalsIgnoreCase(viewDTO.getDataFrom())) {
chartViewInfo = extendDataManage.getChartDataInfo(viewDTO.getId(), viewDTO);
} else {
chartViewInfo = chartDataManage.calcData(viewDTO);
}
List<Object[]> tableRow = (List) chartViewInfo.getData().get("sourceData"); List<Object[]> tableRow = (List) chartViewInfo.getData().get("sourceData");
if ("dataset".equals(request.getDownloadType())) { if ("dataset".equals(request.getDownloadType())) {
request.setHeader(dsHeader); request.setHeader(dsHeader);
@ -214,13 +223,12 @@ public class ChartDataServer implements ChartDataApi {
} }
@DeLinkPermit("#p0.dvId")
@Override @Override
public void innerExportDetails(ChartExcelRequest request, HttpServletResponse response) throws Exception { public void innerExportDetails(ChartExcelRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletRequest httpServletRequest = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String linkToken = httpServletRequest.getHeader(AuthConstant.LINK_TOKEN_KEY); String linkToken = httpServletRequest.getHeader(AuthConstant.LINK_TOKEN_KEY);
LogUtil.info(request.getViewInfo().getId() + " " + StringUtils.isNotEmpty(linkToken) + " " + request.isDataEaseBi()); LogUtil.info(request.getViewInfo().getId() + " " + StringUtils.isNotEmpty(linkToken) + " " + request.isGisbiBi());
if ((StringUtils.isNotEmpty(linkToken) && !request.isDataEaseBi()) || (request.isDataEaseBi() && StringUtils.isEmpty(linkToken))) { if ((StringUtils.isNotEmpty(linkToken) && !request.isGisbiBi()) || (request.isGisbiBi() && StringUtils.isEmpty(linkToken))) {
OutputStream outputStream = response.getOutputStream(); OutputStream outputStream = response.getOutputStream();
try { try {
Workbook wb = new SXSSFWorkbook(); Workbook wb = new SXSSFWorkbook();
@ -238,7 +246,7 @@ public class ChartDataServer implements ChartDataApi {
//设置单元格填充样式(使用纯色背景颜色填充) //设置单元格填充样式(使用纯色背景颜色填充)
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
if ("dataset".equals(request.getDownloadType()) || request.getViewInfo().getType().equalsIgnoreCase("table-info")) { if ("dataset".equals(request.getDownloadType()) || request.getViewInfo().getType().equalsIgnoreCase("table-info") || request.getViewInfo().getType().equalsIgnoreCase("table-normal")) {
List<Object[]> details = new ArrayList<>(); List<Object[]> details = new ArrayList<>();
Sheet detailsSheet; Sheet detailsSheet;
Integer sheetIndex = 1; Integer sheetIndex = 1;
@ -251,9 +259,21 @@ public class ChartDataServer implements ChartDataApi {
if ((details.size() + extractPageSize) > sheetLimit || i == chartViewDTO.getTotalPage()) { if ((details.size() + extractPageSize) > sheetLimit || i == chartViewDTO.getTotalPage()) {
detailsSheet = wb.createSheet("数据" + sheetIndex); detailsSheet = wb.createSheet("数据" + sheetIndex);
Integer[] excelTypes = request.getExcelTypes(); Integer[] excelTypes = request.getExcelTypes();
details.add(0, request.getHeader());
ViewDetailField[] detailFields = request.getDetailFields();
Object[] header = request.getHeader(); Object[] header = request.getHeader();
request.getViewInfo().setXAxis(request.getViewInfo().getXAxis().stream().filter(ele -> !ele.isHide()).collect(Collectors.toList()));
request.getViewInfo().setYAxis(request.getViewInfo().getYAxis().stream().filter(ele -> !ele.isHide()).collect(Collectors.toList()));
request.getViewInfo().setXAxisExt(request.getViewInfo().getXAxisExt().stream().filter(ele -> !ele.isHide()).collect(Collectors.toList()));
request.getViewInfo().setYAxisExt(request.getViewInfo().getYAxisExt().stream().filter(ele -> !ele.isHide()).collect(Collectors.toList()));
request.getViewInfo().setExtStack(request.getViewInfo().getExtStack().stream().filter(ele -> !ele.isHide()).collect(Collectors.toList()));
List<ChartViewFieldDTO> xAxis = new ArrayList<>();
xAxis.addAll(request.getViewInfo().getXAxis());
xAxis.addAll(request.getViewInfo().getYAxis());
xAxis.addAll(request.getViewInfo().getXAxisExt());
xAxis.addAll(request.getViewInfo().getYAxisExt());
xAxis.addAll(request.getViewInfo().getExtStack());
header = Arrays.stream(request.getHeader()).filter(item -> xAxis.stream().map(DatasetTableFieldDTO::getName).collect(Collectors.toList()).contains(item)).collect(Collectors.toList()).toArray();
details.add(0, header);
ViewDetailField[] detailFields = request.getDetailFields();
ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), wb); ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), wb);
sheetIndex++; sheetIndex++;
details.clear(); details.clear();
@ -268,7 +288,11 @@ public class ChartDataServer implements ChartDataApi {
ViewDetailField[] detailFields = request.getDetailFields(); ViewDetailField[] detailFields = request.getDetailFields();
Object[] header = request.getHeader(); Object[] header = request.getHeader();
Sheet detailsSheet = wb.createSheet("数据"); Sheet detailsSheet = wb.createSheet("数据");
if (request.getViewInfo().getType().equalsIgnoreCase("table-normal")) {
setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), wb);
} else {
setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), null); setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), null);
}
} else { } else {
for (int i = 0; i < request.getMultiInfo().size(); i++) { for (int i = 0; i < request.getMultiInfo().size(); i++) {
ChartExcelRequestInner requestInner = request.getMultiInfo().get(i); ChartExcelRequestInner requestInner = request.getMultiInfo().get(i);
@ -293,12 +317,10 @@ public class ChartDataServer implements ChartDataApi {
DEException.throwException(e); DEException.throwException(e);
} }
} else { } else {
exportCenterManage.addTask(request.getViewId(), "chart", request); exportCenterManage.addTask(request.getViewId(), "chart", request, request.getBusiFlag());
return;
} }
} }
@DeLinkPermit("#p0.dvId")
@Override @Override
public void innerExportDataSetDetails(ChartExcelRequest request, HttpServletResponse response) throws Exception { public void innerExportDataSetDetails(ChartExcelRequest request, HttpServletResponse response) throws Exception {
this.innerExportDetails(request, response); this.innerExportDetails(request, response);
@ -318,7 +340,9 @@ public class ChartDataServer implements ChartDataApi {
xAxis.addAll(viewInfo.getXAxisExt()); xAxis.addAll(viewInfo.getXAxisExt());
xAxis.addAll(viewInfo.getYAxisExt()); xAxis.addAll(viewInfo.getYAxisExt());
xAxis.addAll(viewInfo.getExtStack()); xAxis.addAll(viewInfo.getExtStack());
xAxis.addAll(viewInfo.getDrillFields());
TableHeader tableHeader = null;
Integer totalDepth = 0;
if (viewInfo.getType().equalsIgnoreCase("table-normal") || viewInfo.getType().equalsIgnoreCase("table-info")) { if (viewInfo.getType().equalsIgnoreCase("table-normal") || viewInfo.getType().equalsIgnoreCase("table-info")) {
for (ChartViewFieldDTO xAxi : xAxis) { for (ChartViewFieldDTO xAxi : xAxis) {
if (xAxi.getDeType().equals(DeTypeConstants.DE_INT) || xAxi.getDeType().equals(DeTypeConstants.DE_FLOAT)) { if (xAxi.getDeType().equals(DeTypeConstants.DE_INT) || xAxi.getDeType().equals(DeTypeConstants.DE_FLOAT)) {
@ -328,6 +352,22 @@ public class ChartDataServer implements ChartDataApi {
styles.add(null); styles.add(null);
} }
} }
Map<String, Object> customAttr = viewInfo.getCustomAttr();
Map<String, Object> tableHeaderMap = (Map<String, Object>) customAttr.get("tableHeader");
if (tableHeaderMap.get("headerGroup") != null && Boolean.parseBoolean(tableHeaderMap.get("headerGroup").toString())) {
var tmpHeader = JsonUtil.parseObject((String) JsonUtil.toJSONString(customAttr.get("tableHeader")), TableHeader.class);
// 校验字段数量和顺序
if (validateHeaderGroup(tmpHeader, viewInfo.getXAxis())) {
tableHeader = tmpHeader;
for (TableHeader.ColumnInfo column : tableHeader.getHeaderGroupConfig().getColumns()) {
totalDepth = Math.max(totalDepth, getDepth(column, 1));
}
for (TableHeader.ColumnInfo column : tableHeader.getHeaderGroupConfig().getColumns()) {
setWidth(column, 1);
}
}
}
} }
boolean mergeHead = false; boolean mergeHead = false;
@ -374,9 +414,31 @@ public class ChartDataServer implements ChartDataApi {
mergeHead = true; mergeHead = true;
} }
if (CollectionUtils.isNotEmpty(details) && (!mergeHead || details.size() > 2)) { if (CollectionUtils.isNotEmpty(details) && (!mergeHead || details.size() > 2)) {
int realDetailRowIndex = 2; int realDetailRowIndex = tableHeader == null ? 2 : totalDepth;
if (tableHeader != null) {
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderLeft(BorderStyle.THIN);
Map<String, Row> rowMap = new HashMap<>();
for (Integer i = 0; i < totalDepth; i++) {
rowMap.put("row" + i, detailsSheet.createRow(i));
}
int width = 0;
Integer depth = 0;
for (TableHeader.ColumnInfo column : tableHeader.getHeaderGroupConfig().getColumns()) {
createCell(tableHeader, column, width, depth, detailsSheet, cellStyle, totalDepth, rowMap, xAxis);
width = width + column.getWidth();
}
}
for (int i = (mergeHead ? 2 : 0); i < details.size(); i++) { for (int i = (mergeHead ? 2 : 0); i < details.size(); i++) {
Row row = detailsSheet.createRow(realDetailRowIndex > 2 ? realDetailRowIndex : i); int rowIndex = i;
if (tableHeader != null) {
rowIndex = realDetailRowIndex - 1 + i;
} else {
rowIndex = realDetailRowIndex > 2 ? realDetailRowIndex : i;
}
Row row = detailsSheet.createRow(rowIndex);
Object[] rowData = details.get(i); Object[] rowData = details.get(i);
if (rowData != null) { if (rowData != null) {
for (int j = 0; j < rowData.length; j++) { for (int j = 0; j < rowData.length; j++) {
@ -417,7 +479,7 @@ public class ChartDataServer implements ChartDataApi {
try { try {
if ((viewInfo.getType().equalsIgnoreCase("table-normal") || viewInfo.getType().equalsIgnoreCase("table-info")) && (xAxis.get(j).getDeType().equals(DeTypeConstants.DE_INT) || xAxis.get(j).getDeType().equals(DeTypeConstants.DE_FLOAT))) { if ((viewInfo.getType().equalsIgnoreCase("table-normal") || viewInfo.getType().equalsIgnoreCase("table-info")) && (xAxis.get(j).getDeType().equals(DeTypeConstants.DE_INT) || xAxis.get(j).getDeType().equals(DeTypeConstants.DE_FLOAT))) {
try { try {
FormatterCfgDTO formatterCfgDTO = xAxis.get(j).getFormatterCfg() == null ? new FormatterCfgDTO() : xAxis.get(j).getFormatterCfg(); FormatterCfgDTO formatterCfgDTO = xAxis.get(j).getFormatterCfg() == null ? new FormatterCfgDTO().setUnitLanguage(Lang.isChinese() ? "ch" : "en") : xAxis.get(j).getFormatterCfg();
row.getCell(j).setCellStyle(styles.get(j)); row.getCell(j).setCellStyle(styles.get(j));
row.getCell(j).setCellValue(Double.valueOf(cellValue(formatterCfgDTO, new BigDecimal(cellValObj.toString())))); row.getCell(j).setCellValue(Double.valueOf(cellValue(formatterCfgDTO, new BigDecimal(cellValObj.toString()))));
} catch (Exception e) { } catch (Exception e) {
@ -436,10 +498,11 @@ public class ChartDataServer implements ChartDataApi {
} else { } else {
if (!viewInfo.getType().equalsIgnoreCase("circle-packing")) { if (!viewInfo.getType().equalsIgnoreCase("circle-packing")) {
Map<String, Object> senior = viewInfo.getSenior(); Map<String, Object> senior = viewInfo.getSenior();
viewInfo.getCustomAttr().get("");
ChartSeniorFunctionCfgDTO functionCfgDTO = JsonUtil.parseObject((String) JsonUtil.toJSONString(senior.get("functionCfg")), ChartSeniorFunctionCfgDTO.class); ChartSeniorFunctionCfgDTO functionCfgDTO = JsonUtil.parseObject((String) JsonUtil.toJSONString(senior.get("functionCfg")), ChartSeniorFunctionCfgDTO.class);
if (functionCfgDTO != null && StringUtils.isNotEmpty(functionCfgDTO.getEmptyDataStrategy()) && functionCfgDTO.getEmptyDataStrategy().equalsIgnoreCase("setZero")) { if (functionCfgDTO != null && StringUtils.isNotEmpty(functionCfgDTO.getEmptyDataStrategy()) && functionCfgDTO.getEmptyDataStrategy().equalsIgnoreCase("setZero")) {
if ((viewInfo.getType().equalsIgnoreCase("table-normal") || viewInfo.getType().equalsIgnoreCase("table-info"))) { if ((viewInfo.getType().equalsIgnoreCase("table-normal") || viewInfo.getType().equalsIgnoreCase("table-info"))) {
if (functionCfgDTO.getEmptyDataFieldCtrl().contains(xAxis.get(j).getDataeaseName())) { if (functionCfgDTO.getEmptyDataFieldCtrl().contains(xAxis.get(j).getGisbiName())) {
cell.setCellValue(0); cell.setCellValue(0);
} }
} else { } else {
@ -454,6 +517,123 @@ public class ChartDataServer implements ChartDataApi {
} }
} }
private static boolean validateHeaderGroup(TableHeader header, List<ChartViewFieldDTO> fields) {
if (header == null) {
return false;
}
var columns = header.getHeaderGroupConfig().getColumns();
if (CollectionUtils.isEmpty(columns)) {
return false;
}
var leafColumn = getHeaderLeafColumn(columns);
if (CollectionUtils.isEmpty(leafColumn) || leafColumn.size() != fields.size()) {
return false;
}
for (int i = 0; i < leafColumn.size(); i++) {
var a = leafColumn.get(i);
var b = fields.get(i).getGisbiName();
if (!StringUtils.equals(a, b)) {
return false;
}
}
return true;
}
private static List<String> getHeaderLeafColumn(List<TableHeader.ColumnInfo> columns) {
var result = new ArrayList<String>();
for (TableHeader.ColumnInfo column : columns) {
if (CollectionUtils.isEmpty(column.getChildren())) {
result.add(column.getKey());
} else {
result.addAll(getHeaderLeafColumn(column.getChildren()));
}
}
return result;
}
private static Integer getDepth(TableHeader.ColumnInfo column, Integer parentDepth) {
if (org.springframework.util.CollectionUtils.isEmpty(column.getChildren())) {
return parentDepth;
} else {
Integer depth = 0;
for (TableHeader.ColumnInfo child : column.getChildren()) {
depth = Math.max(depth, getDepth(child, parentDepth + 1));
}
return depth;
}
}
private static void createCell(TableHeader tableHeader, TableHeader.ColumnInfo column, Integer width, Integer depth, Sheet sheet, CellStyle cellStyle, Integer totaalDepth, Map<String, Row> rowMap, List<ChartViewFieldDTO> xAxis) {
if (org.springframework.util.CollectionUtils.isEmpty(column.getChildren())) {
Integer toDepth = totaalDepth - 1 > depth ? totaalDepth - 1 : depth;
if (depth.equals(toDepth)) {
Cell cell = rowMap.get("row" + depth).createCell(width);
cell.setCellStyle(cellStyle);
cell.setCellValue(getDeFieldName(xAxis, column.getKey()));
} else {
for (int i = depth; i <= toDepth; i++) {
Cell cell1 = rowMap.get("row" + i).createCell(width);
cell1.setCellValue(getDeFieldName(xAxis, column.getKey()));
cell1.setCellStyle(cellStyle);
}
CellRangeAddress region = new CellRangeAddress(depth, toDepth, width, width);
sheet.addMergedRegion(region);
Cell mergedCell = rowMap.get("row" + depth).getCell(width);
mergedCell.setCellStyle(cellStyle);
}
} else {
Cell cell1 = rowMap.get("row" + depth).createCell(width);
cell1.setCellValue(getGroupName(tableHeader, column.getKey()));
cell1.setCellStyle(cellStyle);
Cell cell2 = rowMap.get("row" + depth).createCell(width + column.getWidth() - 1);
cell2.setCellValue(getGroupName(tableHeader, column.getKey()));
cell2.setCellStyle(cellStyle);
CellRangeAddress region = new CellRangeAddress(depth, depth, width, width + column.getWidth() - 1);
sheet.addMergedRegion(region);
Cell mergedCell = rowMap.get("row" + depth).getCell(width);
mergedCell.setCellStyle(cellStyle);
int subWith = width;
for (TableHeader.ColumnInfo child : column.getChildren()) {
createCell(tableHeader, child, subWith, depth + 1, sheet, cellStyle, totaalDepth, rowMap, xAxis);
subWith = subWith + child.getWidth();
}
}
}
private static String getGroupName(TableHeader tableHeader, String key) {
for (TableHeader.MetaInfo metaInfo : tableHeader.getHeaderGroupConfig().getMeta()) {
if (metaInfo.getField().equals(key)) {
return metaInfo.getName();
}
}
return "";
}
private static String getDeFieldName(List<ChartViewFieldDTO> xAxis, String key) {
for (ChartViewFieldDTO xAxi : xAxis) {
if (xAxi.getGisbiName().equals(key)) {
return StringUtils.isNotBlank(xAxi.getChartShowName()) ? xAxi.getChartShowName() : xAxi.getName();
}
}
return "";
}
private static Integer setWidth(TableHeader.ColumnInfo column, Integer parentWidth) {
if (org.springframework.util.CollectionUtils.isEmpty(column.getChildren())) {
column.setWidth(parentWidth);
return parentWidth;
} else {
Integer depth = 0;
for (TableHeader.ColumnInfo child : column.getChildren()) {
depth = depth + setWidth(child, 1);
}
column.setWidth(depth);
return depth;
}
}
private static String cellValue(FormatterCfgDTO formatterCfgDTO, BigDecimal value) { private static String cellValue(FormatterCfgDTO formatterCfgDTO, BigDecimal value) {
if (formatterCfgDTO.getType().equalsIgnoreCase("percent")) { if (formatterCfgDTO.getType().equalsIgnoreCase("percent")) {
return value.toString(); return value.toString();
@ -474,22 +654,22 @@ public class ChartDataServer implements ChartDataApi {
if (formatter.getType().equals("auto")) { if (formatter.getType().equals("auto")) {
String[] valueSplit = String.valueOf(value).split("."); String[] valueSplit = String.valueOf(value).split(".");
if (StringUtils.isEmpty(value) || !value.contains(".")) { if (StringUtils.isEmpty(value) || !value.contains(".")) {
formatStr = "0"; formatStr = "General";
} else { } else {
formatStr = "0." + new String(new char[valueSplit.length]).replace('\0', '0'); formatStr = "0." + new String(new char[valueSplit.length]).replace('\0', '0');
} }
switch (formatter.getUnit()) { switch (formatter.getUnit()) {
case 1000: case 1000:
formatStr = formatStr + ""; formatStr = formatStr + "\"\"";
break; break;
case 10000: case 10000:
formatStr = formatStr + ""; formatStr = formatStr + "\"\"";
break; break;
case 1000000: case 1000000:
formatStr = formatStr + "百万"; formatStr = formatStr + "\"百万\"";
break; break;
case 100000000: case 100000000:
formatStr = formatStr + "'亿'"; formatStr = formatStr + "\"亿\"";
break; break;
default: default:
break; break;
@ -501,7 +681,7 @@ public class ChartDataServer implements ChartDataApi {
if (formatter.getSuffix().equals("%")) { if (formatter.getSuffix().equals("%")) {
formatStr = formatStr + "\"%\""; formatStr = formatStr + "\"%\"";
} else { } else {
formatStr = formatStr + formatter.getSuffix(); formatStr = formatStr + "\"" + formatter.getSuffix() + "\"";
} }
} }
} }
@ -513,16 +693,16 @@ public class ChartDataServer implements ChartDataApi {
} }
switch (formatter.getUnit()) { switch (formatter.getUnit()) {
case 1000: case 1000:
formatStr = formatStr + ""; formatStr = formatStr + "\"\"";
break; break;
case 10000: case 10000:
formatStr = formatStr + ""; formatStr = formatStr + "\"\"";
break; break;
case 1000000: case 1000000:
formatStr = formatStr + "百万"; formatStr = formatStr + "\"百万\"";
break; break;
case 100000000: case 100000000:
formatStr = formatStr + "'亿'"; formatStr = formatStr + "\"亿\"";
break; break;
default: default:
break; break;
@ -534,7 +714,7 @@ public class ChartDataServer implements ChartDataApi {
if (formatter.getSuffix().equals("%")) { if (formatter.getSuffix().equals("%")) {
formatStr = formatStr + "\"%\""; formatStr = formatStr + "\"%\"";
} else { } else {
formatStr = formatStr + formatter.getSuffix(); formatStr = formatStr + "\"" + formatter.getSuffix() + "\"";
} }
} }
} else if (formatter.getType().equals("percent")) { } else if (formatter.getType().equals("percent")) {

View File

@ -2,11 +2,13 @@ package io.gisbi.chart.server;
import io.gisbi.api.chart.ChartViewApi; import io.gisbi.api.chart.ChartViewApi;
import io.gisbi.api.chart.vo.ChartBaseVO; import io.gisbi.api.chart.vo.ChartBaseVO;
import io.gisbi.extensions.view.dto.ChartViewDTO;
import io.gisbi.extensions.view.dto.ChartViewFieldDTO;
import io.gisbi.api.chart.vo.ViewSelectorVO; import io.gisbi.api.chart.vo.ViewSelectorVO;
import io.gisbi.chart.manage.ChartViewManege; import io.gisbi.chart.manage.ChartViewManege;
import io.gisbi.constant.CommonConstants;
import io.gisbi.dataset.utils.DatasetUtils;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.extensions.view.dto.ChartViewDTO;
import io.gisbi.extensions.view.dto.ChartViewFieldDTO;
import io.gisbi.result.ResultCode; import io.gisbi.result.ResultCode;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
@ -27,7 +29,7 @@ public class ChartViewServer implements ChartViewApi {
@Override @Override
public ChartViewDTO getData(Long id) throws Exception { public ChartViewDTO getData(Long id) throws Exception {
try { try {
return chartViewManege.getChart(id); return chartViewManege.getChart(id, CommonConstants.RESOURCE_TABLE.CORE);
} catch (Exception e) { } catch (Exception e) {
DEException.throwException(ResultCode.DATA_IS_WRONG.code(), e.getMessage()); DEException.throwException(ResultCode.DATA_IS_WRONG.code(), e.getMessage());
} }
@ -36,7 +38,10 @@ public class ChartViewServer implements ChartViewApi {
@Override @Override
public Map<String, List<ChartViewFieldDTO>> listByDQ(Long id, Long chartId, ChartViewDTO dto) { public Map<String, List<ChartViewFieldDTO>> listByDQ(Long id, Long chartId, ChartViewDTO dto) {
return chartViewManege.listByDQ(id, chartId, dto); Map<String, List<ChartViewFieldDTO>> stringListMap = chartViewManege.listByDQ(id, chartId, dto);
DatasetUtils.listEncode(stringListMap.get("dimensionList"));
DatasetUtils.listEncode(stringListMap.get("quotaList"));
return stringListMap;
} }
@Override @Override
@ -50,8 +55,8 @@ public class ChartViewServer implements ChartViewApi {
} }
@Override @Override
public ChartViewDTO getDetail(Long id) { public ChartViewDTO getDetail(Long id, String resourceTable) {
return chartViewManege.getDetails(id); return chartViewManege.getDetails(id, resourceTable);
} }
@Override @Override
@ -75,7 +80,7 @@ public class ChartViewServer implements ChartViewApi {
} }
@Override @Override
public ChartBaseVO chartBaseInfo(Long id) { public ChartBaseVO chartBaseInfo(Long id, String resourceTable) {
return chartViewManege.chartBaseInfo(id); return chartViewManege.chartBaseInfo(id, resourceTable);
} }
} }

View File

@ -1180,13 +1180,13 @@ public class ChartDataBuild {
Map<String, List<String[]>> groupDataList = detailData.stream().collect(Collectors.groupingBy(item -> "(" + StringUtils.join(ArrayUtils.subarray(item, 0, xEndIndex), ")-de-(") + ")")); Map<String, List<String[]>> groupDataList = detailData.stream().collect(Collectors.groupingBy(item -> "(" + StringUtils.join(ArrayUtils.subarray(item, 0, xEndIndex), ")-de-(") + ")"));
tableRow.forEach(row -> { tableRow.forEach(row -> {
String key = xAxis.stream().map(x -> String.format(format, row.get(x.getDataeaseName()).toString())).collect(Collectors.joining("-de-")); String key = xAxis.stream().map(x -> String.format(format, row.get(x.getGisbiName()).toString())).collect(Collectors.joining("-de-"));
List<String[]> detailFieldValueList = groupDataList.get(key); List<String[]> detailFieldValueList = groupDataList.get(key);
List<Map<String, Object>> detailValueMapList = detailFieldValueList.stream().map((detailArr -> { List<Map<String, Object>> detailValueMapList = detailFieldValueList.stream().map((detailArr -> {
Map<String, Object> temp = new HashMap<>(); Map<String, Object> temp = new HashMap<>();
for (int i = 0; i < realDetailFields.size(); i++) { for (int i = 0; i < realDetailFields.size(); i++) {
ChartViewFieldDTO realDetailField = realDetailFields.get(i); ChartViewFieldDTO realDetailField = realDetailFields.get(i);
temp.put(realDetailField.getDataeaseName(), detailArr[detailIndex + i]); temp.put(realDetailField.getGisbiName(), detailArr[detailIndex + i]);
} }
return temp; return temp;
})).collect(Collectors.toList()); })).collect(Collectors.toList());
@ -1196,7 +1196,7 @@ public class ChartDataBuild {
ChartViewFieldDTO detailFieldDTO = new ChartViewFieldDTO(); ChartViewFieldDTO detailFieldDTO = new ChartViewFieldDTO();
detailFieldDTO.setId(IDUtils.snowID()); detailFieldDTO.setId(IDUtils.snowID());
detailFieldDTO.setName("detail"); detailFieldDTO.setName("detail");
detailFieldDTO.setDataeaseName("detail"); detailFieldDTO.setGisbiName("detail");
fields.add(detailFieldDTO); fields.add(detailFieldDTO);
map.put("fields", fields); map.put("fields", fields);
map.put("detailFields", realDetailFields); map.put("detailFields", realDetailFields);
@ -1299,21 +1299,21 @@ public class ChartDataBuild {
data.forEach(ele -> { data.forEach(ele -> {
Map<String, Object> d = new HashMap<>(); Map<String, Object> d = new HashMap<>();
for (int i = 0; i < fields.size(); i++) { for (int i = 0; i < fields.size(); i++) {
if (ObjectUtils.isNotEmpty(desensitizationList.keySet()) && desensitizationList.containsKey(fields.get(i).getDataeaseName())) { if (ObjectUtils.isNotEmpty(desensitizationList.keySet()) && desensitizationList.containsKey(fields.get(i).getGisbiName())) {
String desensitizationValue = desensitizationValue(desensitizationList.get(fields.get(i).getDataeaseName()), String.valueOf(ele[i])); String desensitizationValue = desensitizationValue(desensitizationList.get(fields.get(i).getGisbiName()), String.valueOf(ele[i]));
ele[i] = desensitizationValue; ele[i] = desensitizationValue;
d.put(fields.get(i).getDataeaseName(), desensitizationValue); d.put(fields.get(i).getGisbiName(), desensitizationValue);
continue; continue;
} }
if (i == ele.length) break; if (i == ele.length) break;
ChartViewFieldDTO chartViewFieldDTO = fields.get(i); ChartViewFieldDTO chartViewFieldDTO = fields.get(i);
if (chartViewFieldDTO.getDeType() == 0 || chartViewFieldDTO.getDeType() == 1 || chartViewFieldDTO.getDeType() == 5 || chartViewFieldDTO.getDeType() == 7) { if (chartViewFieldDTO.getDeType() == 0 || chartViewFieldDTO.getDeType() == 1 || chartViewFieldDTO.getDeType() == 5 || chartViewFieldDTO.getDeType() == 7) {
d.put(fields.get(i).getDataeaseName(), StringUtils.isEmpty(ele[i]) ? "" : ele[i]); d.put(fields.get(i).getGisbiName(), StringUtils.isEmpty(ele[i]) ? "" : ele[i]);
} else if (chartViewFieldDTO.getDeType() == 2 || chartViewFieldDTO.getDeType() == 3 || chartViewFieldDTO.getDeType() == 4) { } else if (chartViewFieldDTO.getDeType() == 2 || chartViewFieldDTO.getDeType() == 3 || chartViewFieldDTO.getDeType() == 4) {
if (view.getIsExcelExport()) { if (view.getIsExcelExport()) {
d.put(fields.get(i).getDataeaseName(), StringUtils.isEmpty(ele[i]) ? "" : ele[i]); d.put(fields.get(i).getGisbiName(), StringUtils.isEmpty(ele[i]) ? "" : ele[i]);
} else { } else {
d.put(fields.get(i).getDataeaseName(), StringUtils.isEmpty(ele[i]) ? null : new BigDecimal(ele[i]).setScale(8, RoundingMode.HALF_UP)); d.put(fields.get(i).getGisbiName(), StringUtils.isEmpty(ele[i]) ? null : new BigDecimal(ele[i]).setScale(8, RoundingMode.HALF_UP));
} }
} }
} }
@ -1383,10 +1383,7 @@ public class ChartDataBuild {
chartDimensionDTO.setValue(row[j]); chartDimensionDTO.setValue(row[j]);
dimensionList.add(chartDimensionDTO); dimensionList.add(chartDimensionDTO);
} }
ChartDimensionDTO chartDimensionDTO = new ChartDimensionDTO();
chartDimensionDTO.setId(extStack.get(0).getId());
chartDimensionDTO.setValue(row[xAxis.size()]);
dimensionList.add(chartDimensionDTO);
axisChartDataDTO.setDimensionList(dimensionList); axisChartDataDTO.setDimensionList(dimensionList);
if (ObjectUtils.isNotEmpty(yAxis)) { if (ObjectUtils.isNotEmpty(yAxis)) {
@ -1785,19 +1782,19 @@ public class ChartDataBuild {
List<Map<String, Object>> tableRow = (List<Map<String, Object>>) map.get("tableRow"); List<Map<String, Object>> tableRow = (List<Map<String, Object>>) map.get("tableRow");
final int xEndIndex = detailIndex; final int xEndIndex = detailIndex;
Map<String, List<String[]>> groupDataList = detailData.stream().collect(Collectors.groupingBy(item -> "(" + StringUtils.join(ArrayUtils.subarray(item, 0, xEndIndex), ")-de-(") + ")")); Map<String, List<String[]>> groupDataList = detailData.stream().collect(Collectors.groupingBy(item -> "(" + StringUtils.join(ArrayUtils.subarray(item, 0, xEndIndex), ")-de-(") + ")"));
String extBubbleDataeaseName = ObjectUtils.isNotEmpty(extBubble) ? extBubble.get(0).getDataeaseName() : ""; String extBubblegisbiName = ObjectUtils.isNotEmpty(extBubble) ? extBubble.get(0).getGisbiName() : "";
tableRow.forEach(row -> { tableRow.forEach(row -> {
BigDecimal rowValue = row.get(extBubbleDataeaseName) == null ? BigDecimal.ZERO : new BigDecimal(row.get(extBubbleDataeaseName).toString()); BigDecimal rowValue = row.get(extBubblegisbiName) == null ? BigDecimal.ZERO : new BigDecimal(row.get(extBubblegisbiName).toString());
String key = xAxis.stream().map(x -> String.format(format, row.get(x.getDataeaseName()).toString())).collect(Collectors.joining("-de-")); String key = xAxis.stream().map(x -> String.format(format, row.get(x.getGisbiName()).toString())).collect(Collectors.joining("-de-"));
List<String[]> detailFieldValueList = groupDataList.get(key); List<String[]> detailFieldValueList = groupDataList.get(key);
List<Map<String, Object>> detailValueMapList = Optional.ofNullable(detailFieldValueList).orElse(new ArrayList<>()).stream().map((detailArr -> { List<Map<String, Object>> detailValueMapList = Optional.ofNullable(detailFieldValueList).orElse(new ArrayList<>()).stream().map((detailArr -> {
Map<String, Object> temp = new HashMap<>(); Map<String, Object> temp = new HashMap<>();
for (int i = 0; i < realDetailFields.size(); i++) { for (int i = 0; i < realDetailFields.size(); i++) {
ChartViewFieldDTO realDetailField = realDetailFields.get(i); ChartViewFieldDTO realDetailField = realDetailFields.get(i);
if (StringUtils.equalsIgnoreCase(extBubbleDataeaseName, realDetailField.getDataeaseName())) { if (StringUtils.equalsIgnoreCase(extBubblegisbiName, realDetailField.getGisbiName())) {
temp.put(realDetailField.getDataeaseName(), rowValue); temp.put(realDetailField.getGisbiName(), rowValue);
} else { } else {
temp.put(realDetailField.getDataeaseName(), detailArr[detailIndex + i]); temp.put(realDetailField.getGisbiName(), detailArr[detailIndex + i]);
} }
} }
return temp; return temp;
@ -1807,10 +1804,10 @@ public class ChartDataBuild {
}); });
// 先过滤掉所有记录数字段 // 先过滤掉所有记录数字段
List<ChartViewFieldDTO> filterCountAxis = fields.stream() List<ChartViewFieldDTO> filterCountAxis = fields.stream()
.filter(item -> !StringUtils.equalsIgnoreCase(item.getDataeaseName(), "*")) .filter(item -> !StringUtils.equalsIgnoreCase(item.getGisbiName(), "*"))
.collect(Collectors.toList()); .collect(Collectors.toList());
// 如果气泡大小是记录数添加到字段列表中 // 如果气泡大小是记录数添加到字段列表中
if (ObjectUtils.isNotEmpty(extBubble) && "*".equals(extBubble.get(0).getDataeaseName())) { if (ObjectUtils.isNotEmpty(extBubble) && "*".equals(extBubble.get(0).getGisbiName())) {
filterCountAxis.addAll(yAxis); filterCountAxis.addAll(yAxis);
} }
map.put("fields", filterCountAxis); map.put("fields", filterCountAxis);

View File

@ -10,6 +10,9 @@ public class DataVisualizationConstants {
// 主工程 // 主工程
public static final String MAIN = "main"; public static final String MAIN = "main";
// 主工程编辑区
public static final String MAIN_EDIT = "main-edit";
} }
//新建仪表板来源 //新建仪表板来源

View File

@ -10,6 +10,7 @@ public class EncryptUtils extends CodingUtil {
private static final String secretKey = "www.fit2cloud.co"; private static final String secretKey = "www.fit2cloud.co";
private static final String iv = "1234567890123456"; private static final String iv = "1234567890123456";
public static Object aesEncrypt(Object o) { public static Object aesEncrypt(Object o) {
if (o == null) { if (o == null) {
return null; return null;

View File

@ -1,5 +1,6 @@
package io.gisbi.commons.utils; package io.gisbi.commons.utils;
import io.gisbi.api.permissions.user.vo.UserFormVO;
import io.gisbi.i18n.Translator; import io.gisbi.i18n.Translator;
import io.gisbi.utils.IPUtils; import io.gisbi.utils.IPUtils;
import io.gisbi.visualization.dto.WatermarkContentDTO; import io.gisbi.visualization.dto.WatermarkContentDTO;
@ -20,31 +21,31 @@ public class ExcelWatermarkUtils {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// public static String transContent(WatermarkContentDTO watermarkContent, UserFormVO userInfo) { public static String transContent(WatermarkContentDTO watermarkContent, UserFormVO userInfo) {
// String content = ""; String content = "";
// switch (watermarkContent.getType()) { switch (watermarkContent.getType()) {
// case "custom" -> content = watermarkContent.getContent(); case "custom" -> content = watermarkContent.getContent();
// case "nickName" -> content = "${nickName}"; case "nickName" -> content = "${nickName}";
// case "ip" -> content = "${ip}"; case "ip" -> content = "${ip}";
// case "time" -> content = "${time}"; case "time" -> content = "${time}";
// default -> content = "${username}"; default -> content = "${username}";
// } }
// String nickName = userInfo.getName().contains("i18n_") ?Translator.get(userInfo.getName()):userInfo.getName(); String nickName = userInfo.getName().contains("i18n_") ?Translator.get(userInfo.getName()):userInfo.getName();
// content = content.replaceAll("\\$\\{ip}", IPUtils.get() == null ? "127.0.0.1" : IPUtils.get()); content = content.replaceAll("\\$\\{ip}", IPUtils.get() == null ? "127.0.0.1" : IPUtils.get());
// content = content.replaceAll("\\$\\{username}", userInfo.getAccount()); content = content.replaceAll("\\$\\{username}", userInfo.getAccount());
// content = content.replaceAll("\\$\\{nickName}", nickName); content = content.replaceAll("\\$\\{nickName}", nickName);
// content = content.replaceAll("\\$\\{time}", sdf.format(new Date())); content = content.replaceAll("\\$\\{time}", sdf.format(new Date()));
// return content; return content;
// } }
/** /**
* 添加水印图片到工作簿并返回图片 ID * 添加水印图片到工作簿并返回图片 ID
*/ */
// public static int addWatermarkImage(Workbook wb, WatermarkContentDTO watermarkContent, UserFormVO userInfo) { public static int addWatermarkImage(Workbook wb, WatermarkContentDTO watermarkContent, UserFormVO userInfo) {
// byte[] imageBytes = createTextImage(transContent(watermarkContent, userInfo), watermarkContent); // 生成文字水印图片 byte[] imageBytes = createTextImage(transContent(watermarkContent, userInfo), watermarkContent); // 生成文字水印图片
// return wb.addPicture(imageBytes, Workbook.PICTURE_TYPE_PNG); // 添加到工作簿并返回 ID return wb.addPicture(imageBytes, Workbook.PICTURE_TYPE_PNG); // 添加到工作簿并返回 ID
// } }
public static void addWatermarkToSheet(Sheet sheet, Integer pictureIdx) { public static void addWatermarkToSheet(Sheet sheet, Integer pictureIdx) {
Drawing<?> drawing = sheet.createDrawingPatriarch(); Drawing<?> drawing = sheet.createDrawingPatriarch();

View File

@ -1,6 +1,9 @@
package io.gisbi.commons.utils; package io.gisbi.commons.utils;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import io.gisbi.api.permissions.user.vo.UserFormVO;
import io.gisbi.api.permissions.variable.dto.SysVariableValueDto;
import io.gisbi.api.permissions.variable.dto.SysVariableValueItem;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.extensions.datasource.api.PluginManageApi; import io.gisbi.extensions.datasource.api.PluginManageApi;
import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO; import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO;
@ -18,7 +21,6 @@ import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.*; import net.sf.jsqlparser.statement.select.*;
import net.sf.jsqlparser.util.deparser.ExpressionDeParser; import net.sf.jsqlparser.util.deparser.ExpressionDeParser;
import net.sf.jsqlparser.util.deparser.SelectDeParser;
import org.apache.calcite.sql.*; import org.apache.calcite.sql.*;
import org.apache.calcite.sql.parser.SqlParser; import org.apache.calcite.sql.parser.SqlParser;
import org.apache.calcite.sql.util.SqlShuttle; import org.apache.calcite.sql.util.SqlShuttle;
@ -37,24 +39,29 @@ import static org.apache.calcite.sql.SqlKind.*;
public class SqlparserUtils { public class SqlparserUtils {
public static final String regex = "\\$\\{(.*?)\\}"; public static final String regex = "\\$\\{(.*?)\\}";
public static final String regex2 = "\\[(.*?)\\]"; public static final String regex2 = "\\$f2cde\\[(.*?)\\]";
private static final String SubstitutedParams = "DATAEASE_PATAMS_BI"; private static final String SubstitutedParams = "gisbi_PATAMS_BI";
private static final String SysParamsSubstitutedParams = "DeSysParams_"; private static final String SysParamsSubstitutedParams = "DeSysParams_";
private static final String SubstitutedSql = " 'DE-BI' = 'DE-BI' "; private static final String SubstitutedSql = " 'DE-BI' = 'DE-BI' ";
private boolean removeSysParams; private boolean removeSysParams;
boolean hasVariables = false;
private UserFormVO userEntity;
private final List<Map<String, String>> sysParams = new ArrayList<>(); private final List<Map<String, String>> sysParams = new ArrayList<>();
private static final String deVariablePattern = "\\$DE_PARAM\\{(.*?)\\}";
public String handleVariableDefaultValue(String sql, String sqlVariableDetails, boolean isEdit, boolean isFromDataSet, List<SqlVariableDetails> parameters, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, PluginManageApi pluginManage, UserFormVO userEntity) {
Pattern r = Pattern.compile(deVariablePattern);
Matcher m = r.matcher(sql);
if (m.find()) {
return new DeSqlparserUtils().handleVariableDefaultValue(sql, sqlVariableDetails, isEdit, isFromDataSet, parameters, isCross, dsMap, pluginManage, userEntity);
}
public String handleVariableDefaultValue(String sql, String sqlVariableDetails, boolean isEdit, boolean isFromDataSet, List<SqlVariableDetails> parameters, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, PluginManageApi pluginManage) {
DatasourceSchemaDTO ds = dsMap.entrySet().iterator().next().getValue(); DatasourceSchemaDTO ds = dsMap.entrySet().iterator().next().getValue();
if (StringUtils.isEmpty(sql)) { if (StringUtils.isEmpty(sql)) {
DEException.throwException(Translator.get("i18n_sql_not_empty")); DEException.throwException(Translator.get("i18n_sql_not_empty"));
} }
try { this.userEntity = userEntity;
this.removeSysParams = true; hasVariables = false;
removeVariables(sql, ds.getType());
} catch (Exception e) {
DEException.throwException(e);
}
sql = sql.trim(); sql = sql.trim();
if (sql.endsWith(";")) { if (sql.endsWith(";")) {
sql = sql.substring(0, sql.length() - 1); sql = sql.substring(0, sql.length() - 1);
@ -139,40 +146,62 @@ public class SqlparserUtils {
return sql; return sql;
} }
private static boolean isParams(String paramId) {
if (Arrays.asList("sysParams.userId", "sysParams.userEmail", "sysParams.userName").contains(paramId)) {
return true;
}
boolean isLong = false;
try {
Long.valueOf(paramId);
isLong = true;
} catch (Exception e) {
isLong = false;
}
if (paramId.length() >= 18 && isLong) {
return true;
}
return false;
}
private String removeVariables(final String sql, String dsType) throws Exception { private String removeVariables(final String sql, String dsType) throws Exception {
String tmpSql = sql.replaceAll("(?m)^\\s*$[\n\r]{0,}", ""); String tmpSql = sql.replaceAll("(?m)^\\s*$[\n\r]{0,}", "");
Pattern pattern = Pattern.compile(regex); Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(tmpSql); Matcher matcher = pattern.matcher(tmpSql);
boolean hasVariables = false;
while (matcher.find()) { while (matcher.find()) {
hasVariables = true; hasVariables = true;
tmpSql = tmpSql.replace(matcher.group(), SubstitutedParams); tmpSql = tmpSql.replace(matcher.group(), SubstitutedParams);
} }
if (removeSysParams) { if (removeSysParams) {
for (Map<String, String> sysParam : sysParams) { for (Map<String, String> sysParam : sysParams) {
tmpSql = tmpSql.replaceAll(sysParam.get("replace"), sysParam.get("origin")); tmpSql = tmpSql.replace(sysParam.get("replace"), sysParam.get("origin"));
} }
pattern = Pattern.compile(regex2); pattern = Pattern.compile(regex2);
matcher = pattern.matcher(tmpSql); matcher = pattern.matcher(tmpSql);
while (matcher.find()) { while (matcher.find()) {
String paramId = matcher.group().substring(7, matcher.group().length() - 1);
if (!isParams(paramId)) {
continue;
}
hasVariables = true; hasVariables = true;
tmpSql = tmpSql.replace(matcher.group(), SubstitutedParams); tmpSql = tmpSql.replace(matcher.group(), SubstitutedParams);
} }
} else { } else {
pattern = Pattern.compile(regex2); pattern = Pattern.compile(regex2);
matcher = pattern.matcher(tmpSql); matcher = pattern.matcher(tmpSql);
sysParams.clear();
while (matcher.find()) { while (matcher.find()) {
String paramId = matcher.group().substring(7, matcher.group().length() - 1);
if (!isParams(paramId)) {
continue;
}
hasVariables = true; hasVariables = true;
tmpSql = tmpSql.replace(matcher.group(), SysParamsSubstitutedParams + matcher.group().substring(1, matcher.group().length() - 1)); tmpSql = tmpSql.replace(matcher.group(), SysParamsSubstitutedParams + matcher.group().substring(7, matcher.group().length() - 1));
Map<String, String> sysParam = new HashMap<>(); Map<String, String> sysParam = new HashMap<>();
sysParam.put("origin", matcher.group()); sysParam.put("origin", matcher.group());
sysParam.put("replace", SysParamsSubstitutedParams + matcher.group().substring(1, matcher.group().length() - 1)); sysParam.put("replace", SysParamsSubstitutedParams + matcher.group().substring(7, matcher.group().length() - 1));
sysParams.add(sysParam); sysParams.add(sysParam);
} }
} }
if(!hasVariables && !sql.contains(SubstitutedParams)){ if (!hasVariables && !sql.contains(SubstitutedParams)) {
return sql; return sql;
} }
Statement statement = CCJSqlParserUtil.parse(tmpSql); Statement statement = CCJSqlParserUtil.parse(tmpSql);

View File

@ -25,20 +25,20 @@ public class DeMvcConfig implements WebMvcConfigurer {
@Override @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) { public void addResourceHandlers(ResourceHandlerRegistry registry) {
String workDir = FILE_PROTOCOL + ensureSuffix(WORK_DIR, FILE_SEPARATOR); String workDir = FILE_PROTOCOL + ensureSuffix(WORK_DIR, FILE_SEPARATOR);
String uploadUrlPattern = ensureBoth(URL_SEPARATOR + UPLOAD_URL_PREFIX, URL_SEPARATOR) + "**"; String uploadUrlPattern = ensureBoth(URL_SEPARATOR + UPLOAD_URL_PREFIX, AuthConstant.DE_API_PREFIX, URL_SEPARATOR) + "**";
registry.addResourceHandler(uploadUrlPattern).addResourceLocations(workDir); registry.addResourceHandler(uploadUrlPattern).addResourceLocations(workDir);
// map // map
String mapDir = FILE_PROTOCOL + ensureSuffix(MAP_DIR, FILE_SEPARATOR); String mapDir = FILE_PROTOCOL + ensureSuffix(MAP_DIR, FILE_SEPARATOR);
String mapUrlPattern = ensureBoth(MAP_URL, URL_SEPARATOR) + "**"; String mapUrlPattern = ensureBoth(MAP_URL, AuthConstant.DE_API_PREFIX, URL_SEPARATOR) + "**";
registry.addResourceHandler(mapUrlPattern).addResourceLocations(mapDir); registry.addResourceHandler(mapUrlPattern).addResourceLocations(mapDir);
String geoDir = FILE_PROTOCOL + ensureSuffix(CUSTOM_MAP_DIR, FILE_SEPARATOR); String geoDir = FILE_PROTOCOL + ensureSuffix(CUSTOM_MAP_DIR, FILE_SEPARATOR);
String geoUrlPattern = ensureBoth(GEO_URL, URL_SEPARATOR) + "**"; String geoUrlPattern = ensureBoth(GEO_URL, AuthConstant.DE_API_PREFIX, URL_SEPARATOR) + "**";
registry.addResourceHandler(geoUrlPattern).addResourceLocations(geoDir); registry.addResourceHandler(geoUrlPattern).addResourceLocations(geoDir);
String i18nDir = FILE_PROTOCOL + ensureSuffix(I18N_DIR, FILE_SEPARATOR); String i18nDir = FILE_PROTOCOL + ensureSuffix(I18N_DIR, FILE_SEPARATOR);
String i18nUrlPattern = ensureBoth(I18N_URL, URL_SEPARATOR) + "**"; String i18nUrlPattern = ensureBoth(I18N_URL, AuthConstant.DE_API_PREFIX, URL_SEPARATOR) + "**";
registry.addResourceHandler(i18nUrlPattern).addResourceLocations(i18nDir); registry.addResourceHandler(i18nUrlPattern).addResourceLocations(i18nDir);
} }

View File

@ -5,7 +5,7 @@ import java.io.Serializable;
/** /**
* <p> * <p>
* * 数据集分组表
* </p> * </p>
* *
* @Author bi-coder * @Author bi-coder
@ -71,6 +71,9 @@ public class CoreDatasetGroup implements Serializable {
*/ */
private Long createTime; private Long createTime;
/**
* Quartz 实例 ID
*/
private String qrtzInstance; private String qrtzInstance;
/** /**
@ -93,6 +96,11 @@ public class CoreDatasetGroup implements Serializable {
*/ */
private String unionSql; private String unionSql;
/**
* 是否跨源
*/
private Boolean isCross;
public Long getId() { public Long getId() {
return id; return id;
} }
@ -213,11 +221,18 @@ public class CoreDatasetGroup implements Serializable {
this.unionSql = unionSql; this.unionSql = unionSql;
} }
public Boolean getIsCross() {
return isCross;
}
public void setIsCross(Boolean isCross) {
this.isCross = isCross;
}
@Override @Override
public String toString() { public String toString() {
return "CoreDatasetGroup{" + return "CoreDatasetGroup{" +
"id = " + id + "id = " + id +
", appId = " + appId +
", name = " + name + ", name = " + name +
", pid = " + pid + ", pid = " + pid +
", level = " + level + ", level = " + level +
@ -232,14 +247,7 @@ public class CoreDatasetGroup implements Serializable {
", updateBy = " + updateBy + ", updateBy = " + updateBy +
", lastUpdateTime = " + lastUpdateTime + ", lastUpdateTime = " + lastUpdateTime +
", unionSql = " + unionSql + ", unionSql = " + unionSql +
", isCross = " + isCross +
"}"; "}";
} }
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
} }

View File

@ -57,9 +57,9 @@ public class CoreDatasetTableField implements Serializable {
private String description; private String description;
/** /**
* de字段名用作唯一标识 * 字段名用作唯一标识
*/ */
private String dataeaseName; private String gisbiName;
/** /**
* de字段别名 * de字段别名
@ -92,7 +92,7 @@ public class CoreDatasetTableField implements Serializable {
private Integer size; private Integer size;
/** /**
* dataease字段类型0-文本1-时间2-整型数值3-浮点数值4-布尔5-地理位置6-二进制 * gisbi字段类型0-文本1-时间2-整型数值3-浮点数值4-布尔5-地理位置6-二进制
*/ */
private Integer deType; private Integer deType;
@ -205,12 +205,12 @@ public class CoreDatasetTableField implements Serializable {
this.description = description; this.description = description;
} }
public String getDataeaseName() { public String getGisbiName() {
return dataeaseName; return gisbiName;
} }
public void setDataeaseName(String dataeaseName) { public void setGisbiName(String gisbiName) {
this.dataeaseName = dataeaseName; this.gisbiName = gisbiName;
} }
public String getFieldShortName() { public String getFieldShortName() {
@ -352,7 +352,7 @@ public class CoreDatasetTableField implements Serializable {
", originName = " + originName + ", originName = " + originName +
", name = " + name + ", name = " + name +
", description = " + description + ", description = " + description +
", dataeaseName = " + dataeaseName + ", gisbiName = " + gisbiName +
", fieldShortName = " + fieldShortName + ", fieldShortName = " + fieldShortName +
", groupList = " + groupList + ", groupList = " + groupList +
", otherGroup = " + otherGroup + ", otherGroup = " + otherGroup +

View File

@ -1,10 +1,8 @@
package io.gisbi.dataset.dao.auto.mapper; package io.gisbi.dataset.dao.auto.mapper;
import io.gisbi.application.system.domain.Role;
import io.gisbi.dataset.dao.auto.entity.CoreDatasetTable;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import io.gisbi.dataset.dao.auto.entity.CoreDatasetTable;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
import java.util.List; import java.util.List;

View File

@ -19,6 +19,6 @@ public interface CoreDataSetExtMapper {
""") """)
List<DataSetNodePO> query(@Param("ew") QueryWrapper queryWrapper); List<DataSetNodePO> query(@Param("ew") QueryWrapper queryWrapper);
@Select("select id, name, node_type, create_by, create_time, update_by, last_update_time from core_dataset_group where id = #{id}") @Select("select id, name, node_type, create_by, create_time, update_by, last_update_time, is_cross from core_dataset_group where id = #{id}")
DataSetBarVO queryBarInfo(@Param("id") Long id); DataSetBarVO queryBarInfo(@Param("id") Long id);
} }

View File

@ -1,20 +1,23 @@
package io.gisbi.dataset.manage; package io.gisbi.dataset.manage;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.gisbi.api.chart.dto.DeSortField; import io.gisbi.api.chart.dto.DeSortField;
import io.gisbi.api.dataset.dto.*; import io.gisbi.api.dataset.dto.*;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO; import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.api.dataset.union.DatasetTableInfoDTO; import io.gisbi.api.dataset.union.DatasetTableInfoDTO;
import io.gisbi.api.permissions.auth.dto.BusiPerCheckDTO;
import io.gisbi.api.permissions.dataset.api.RowPermissionsApi;
import io.gisbi.api.permissions.user.vo.UserFormVO;
import io.gisbi.chart.utils.ChartDataBuild; import io.gisbi.chart.utils.ChartDataBuild;
import io.gisbi.commons.utils.SqlparserUtils; import io.gisbi.commons.utils.SqlparserUtils;
import io.gisbi.constant.AuthEnum;
import io.gisbi.constant.SQLConstants;
import io.gisbi.dataset.constant.DatasetTableType; import io.gisbi.dataset.constant.DatasetTableType;
import io.gisbi.dataset.dao.auto.entity.CoreDatasetTable;
import io.gisbi.dataset.dao.auto.entity.CoreDatasetTableField;
import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper; import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper;
import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableMapper; import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableMapper;
import io.gisbi.dataset.utils.DatasetUtils; import io.gisbi.dataset.utils.DatasetUtils;
import io.gisbi.dataset.utils.FieldUtils; import io.gisbi.dataset.utils.FieldUtils;
import io.gisbi.dataset.utils.SqlUtils;
import io.gisbi.dataset.utils.TableUtils; import io.gisbi.dataset.utils.TableUtils;
import io.gisbi.datasource.dao.auto.entity.CoreDatasource; import io.gisbi.datasource.dao.auto.entity.CoreDatasource;
import io.gisbi.datasource.dao.auto.mapper.CoreDatasourceMapper; import io.gisbi.datasource.dao.auto.mapper.CoreDatasourceMapper;
@ -22,7 +25,6 @@ import io.gisbi.datasource.manage.DataSourceManage;
import io.gisbi.datasource.manage.EngineManage; import io.gisbi.datasource.manage.EngineManage;
import io.gisbi.datasource.utils.DatasourceUtils; import io.gisbi.datasource.utils.DatasourceUtils;
import io.gisbi.engine.constant.ExtFieldConstant; import io.gisbi.engine.constant.ExtFieldConstant;
import io.gisbi.constant.SQLConstants;
import io.gisbi.engine.sql.SQLProvider; import io.gisbi.engine.sql.SQLProvider;
import io.gisbi.engine.trans.*; import io.gisbi.engine.trans.*;
import io.gisbi.engine.utils.SQLUtils; import io.gisbi.engine.utils.SQLUtils;
@ -40,10 +42,8 @@ import io.gisbi.extensions.view.dto.ChartExtRequest;
import io.gisbi.extensions.view.dto.ColumnPermissionItem; import io.gisbi.extensions.view.dto.ColumnPermissionItem;
import io.gisbi.extensions.view.dto.SqlVariableDetails; import io.gisbi.extensions.view.dto.SqlVariableDetails;
import io.gisbi.i18n.Translator; import io.gisbi.i18n.Translator;
import io.gisbi.utils.BeanUtils; import io.gisbi.system.manage.CorePermissionManage;
import io.gisbi.utils.IDUtils; import io.gisbi.utils.*;
import io.gisbi.utils.JsonUtil;
import io.gisbi.utils.TreeUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -58,6 +58,7 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static io.gisbi.chart.manage.ChartDataManage.START_END_SEPARATOR; import static io.gisbi.chart.manage.ChartDataManage.START_END_SEPARATOR;
import static io.gisbi.dataset.utils.TableUtils.format;
/** /**
* @Author bi-coder * @Author bi-coder
@ -79,6 +80,10 @@ public class DatasetDataManage {
@Autowired(required = false) @Autowired(required = false)
private PluginManageApi pluginManage; private PluginManageApi pluginManage;
@Resource @Resource
private CorePermissionManage corePermissionManage;
@Autowired(required = false)
private RowPermissionsApi rowPermissionsApi;
@Resource
private CoreDatasetTableFieldMapper coreDatasetTableFieldMapper; private CoreDatasetTableFieldMapper coreDatasetTableFieldMapper;
@Resource @Resource
private CoreDatasetTableMapper coreDatasetTableMapper; private CoreDatasetTableMapper coreDatasetTableMapper;
@ -87,7 +92,11 @@ public class DatasetDataManage {
private static Logger logger = LoggerFactory.getLogger(DatasetDataManage.class); private static Logger logger = LoggerFactory.getLogger(DatasetDataManage.class);
public static final List<String> notFullDs = List.of("mysql", "mariadb", "Excel", "API"); private RowPermissionsApi getRowPermissionsApi() {
return rowPermissionsApi;
}
public static final List<String> notFullDs = List.of("mysql", "mariadb", "Excel", "API", "H2", "h2");
public List<DatasetTableFieldDTO> getTableFields(DatasetTableDTO datasetTableDTO) throws Exception { public List<DatasetTableFieldDTO> getTableFields(DatasetTableDTO datasetTableDTO) throws Exception {
List<DatasetTableFieldDTO> list = null; List<DatasetTableFieldDTO> list = null;
@ -97,7 +106,7 @@ public class DatasetDataManage {
if (StringUtils.equalsIgnoreCase(type, DatasetTableType.DB) || StringUtils.equalsIgnoreCase(type, DatasetTableType.SQL)) { if (StringUtils.equalsIgnoreCase(type, DatasetTableType.DB) || StringUtils.equalsIgnoreCase(type, DatasetTableType.SQL)) {
CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(datasetTableDTO.getDatasourceId()); CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(datasetTableDTO.getDatasourceId());
DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO(); DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO();
if (StringUtils.equalsIgnoreCase("excel", coreDatasource.getType()) || coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.Excel.name()) || coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
coreDatasource = engineManage.getDeEngine(); coreDatasource = engineManage.getDeEngine();
} }
if (StringUtils.isNotEmpty(coreDatasource.getStatus()) && "Error".equalsIgnoreCase(coreDatasource.getStatus())) { if (StringUtils.isNotEmpty(coreDatasource.getStatus()) && "Error".equalsIgnoreCase(coreDatasource.getStatus())) {
@ -108,6 +117,7 @@ public class DatasetDataManage {
Provider provider = ProviderFactory.getProvider(coreDatasource.getType()); Provider provider = ProviderFactory.getProvider(coreDatasource.getType());
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setIsCross(datasetTableDTO.getIsCross());
datasourceRequest.setDsList(Map.of(datasourceSchemaDTO.getId(), datasourceSchemaDTO)); datasourceRequest.setDsList(Map.of(datasourceSchemaDTO.getId(), datasourceSchemaDTO));
String sql; String sql;
if (StringUtils.equalsIgnoreCase(type, DatasetTableType.DB)) { if (StringUtils.equalsIgnoreCase(type, DatasetTableType.DB)) {
@ -115,23 +125,34 @@ public class DatasetDataManage {
sql = TableUtils.tableName2Sql(datasourceSchemaDTO, tableInfoDTO.getTable()) + " LIMIT 0 OFFSET 0"; sql = TableUtils.tableName2Sql(datasourceSchemaDTO, tableInfoDTO.getTable()) + " LIMIT 0 OFFSET 0";
// replace schema alias, trans dialect // replace schema alias, trans dialect
Map map = JsonUtil.parseObject(datasourceSchemaDTO.getConfiguration(), Map.class); Map map = JsonUtil.parseObject(datasourceSchemaDTO.getConfiguration(), Map.class);
if (!datasourceRequest.getIsCross()) {
if (ObjectUtils.isNotEmpty(map.get("schema"))) { if (ObjectUtils.isNotEmpty(map.get("schema"))) {
sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX, map.get("schema").toString()); sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX, String.format(format, map.get("schema").toString()) );
} else { } else {
sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX + "\\.", ""); sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX + "\\.", "");
} }
sql = provider.transSqlDialect(sql, datasourceRequest.getDsList()); sql = provider.transSqlDialect(sql, datasourceRequest.getDsList());
} else {
sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX + "\\.", "");
String tableSchema = datasetSQLManage.putObj2Map(datasourceRequest.getDsList(), datasetTableDTO, datasourceRequest.getIsCross());
sql = SqlUtils.addSchema(sql, tableSchema);
}
} else { } else {
// parser sql params and replace default value // parser sql params and replace default value
String s = new String(Base64.getDecoder().decode(tableInfoDTO.getSql())); String s = new String(Base64.getDecoder().decode(tableInfoDTO.getSql()));
String originSql = new SqlparserUtils().handleVariableDefaultValue(s, datasetTableDTO.getSqlVariableDetails(), false, false, null, false, datasourceRequest.getDsList(), pluginManage); String originSql = new SqlparserUtils().handleVariableDefaultValue(s, datasetTableDTO.getSqlVariableDetails(), true, false, null, datasourceRequest.getIsCross(), datasourceRequest.getDsList(), pluginManage, getUserEntity());
originSql = provider.replaceComment(originSql); originSql = provider.replaceComment(originSql);
// add sql table schema // add sql table schema
if (!datasourceRequest.getIsCross()) {
sql = SQLUtils.buildOriginPreviewSql(SqlPlaceholderConstants.TABLE_PLACEHOLDER, 0, 0); sql = SQLUtils.buildOriginPreviewSql(SqlPlaceholderConstants.TABLE_PLACEHOLDER, 0, 0);
sql = provider.transSqlDialect(sql, datasourceRequest.getDsList()); sql = provider.transSqlDialect(sql, datasourceRequest.getDsList());
// replace placeholder // replace placeholder
sql = provider.replaceTablePlaceHolder(sql, originSql); sql = provider.replaceTablePlaceHolder(sql, originSql);
} else {
String tableSchema = datasetSQLManage.putObj2Map(datasourceRequest.getDsList(), datasetTableDTO, datasourceRequest.getIsCross());
sql = SqlUtils.addSchema(originSql, tableSchema);
}
} }
datasourceRequest.setQuery(sql.replaceAll("\r\n", " ") datasourceRequest.setQuery(sql.replaceAll("\r\n", " ")
.replaceAll("\n", " ")); .replaceAll("\n", " "));
@ -189,7 +210,11 @@ public class DatasetDataManage {
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
public Map<String, Object> previewDataWithLimit(DatasetGroupInfoDTO datasetGroupInfoDTO, Integer start, Integer count, boolean checkPermission) throws Exception { public Map<String, Object> previewDataWithLimit(DatasetGroupInfoDTO datasetGroupInfoDTO, Integer start, Integer count, boolean checkPermission, boolean encode) throws Exception {
if (encode) {
DatasetUtils.dsDecode(datasetGroupInfoDTO);
}
Map<String, Object> sqlMap = datasetSQLManage.getUnionSQLForEdit(datasetGroupInfoDTO, null); Map<String, Object> sqlMap = datasetSQLManage.getUnionSQLForEdit(datasetGroupInfoDTO, null);
String sql = (String) sqlMap.get("sql"); String sql = (String) sqlMap.get("sql");
@ -214,7 +239,7 @@ public class DatasetDataManage {
dsList.add(next.getValue().getType()); dsList.add(next.getValue().getType());
} }
boolean needOrder = Utils.isNeedOrder(dsList); boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = datasetGroupInfoDTO.getIsCross();
if (!crossDs) { if (!crossDs) {
if (notFullDs.contains(dsMap.entrySet().iterator().next().getValue().getType()) && (boolean) sqlMap.get("isFullJoin")) { if (notFullDs.contains(dsMap.entrySet().iterator().next().getValue().getType()) && (boolean) sqlMap.get("isFullJoin")) {
DEException.throwException(Translator.get("i18n_not_full")); DEException.throwException(Translator.get("i18n_not_full"));
@ -253,16 +278,20 @@ public class DatasetDataManage {
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setQuery(querySQL); datasourceRequest.setQuery(querySQL);
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
datasourceRequest.setIsCross(crossDs);
Map<String, Object> data = provider.fetchResultField(datasourceRequest); Map<String, Object> data = provider.fetchResultField(datasourceRequest);
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
// 重新构造data // 重新构造data
Map<String, Object> previewData = buildPreviewData(data, fields, desensitizationList); Map<String, Object> previewData = buildPreviewData(data, fields, desensitizationList, encode);
map.put("data", previewData); map.put("data", previewData);
if (ObjectUtils.isEmpty(datasetGroupInfoDTO.getId())) { if (ObjectUtils.isEmpty(datasetGroupInfoDTO.getId())) {
map.put("allFields", fields); map.put("allFields", fields);
} else { } else {
List<DatasetTableFieldDTO> fieldList = datasetTableFieldManage.selectByDatasetGroupId(datasetGroupInfoDTO.getId()); List<DatasetTableFieldDTO> fieldList = datasetTableFieldManage.selectByDatasetGroupId(datasetGroupInfoDTO.getId());
if (encode) {
DatasetUtils.listEncode(fieldList);
}
map.put("allFields", fieldList); map.put("allFields", fieldList);
} }
map.put("sql", Base64.getEncoder().encodeToString(querySQL.getBytes())); map.put("sql", Base64.getEncoder().encodeToString(querySQL.getBytes()));
@ -278,7 +307,8 @@ public class DatasetDataManage {
return 0L; return 0L;
} }
public Long getDatasetCountWithWhere(Long datasetGroupId) throws Exception { public Long getDatasetCountWithWhere(Long datasetGroupId) {
try {
DatasetGroupInfoDTO datasetGroupInfoDTO = datasetGroupManage.getForCount(datasetGroupId); DatasetGroupInfoDTO datasetGroupInfoDTO = datasetGroupManage.getForCount(datasetGroupId);
Map<String, Object> sqlMap = datasetSQLManage.getUnionSQLForEdit(datasetGroupInfoDTO, null); Map<String, Object> sqlMap = datasetSQLManage.getUnionSQLForEdit(datasetGroupInfoDTO, null);
String sql = (String) sqlMap.get("sql"); String sql = (String) sqlMap.get("sql");
@ -297,7 +327,7 @@ public class DatasetDataManage {
for (Map.Entry<Long, DatasourceSchemaDTO> next : dsMap.entrySet()) { for (Map.Entry<Long, DatasourceSchemaDTO> next : dsMap.entrySet()) {
dsList.add(next.getValue().getType()); dsList.add(next.getValue().getType());
} }
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = datasetGroupInfoDTO.getIsCross();
if (!crossDs) { if (!crossDs) {
if (notFullDs.contains(dsMap.entrySet().iterator().next().getValue().getType()) && (boolean) sqlMap.get("isFullJoin")) { if (notFullDs.contains(dsMap.entrySet().iterator().next().getValue().getType()) && (boolean) sqlMap.get("isFullJoin")) {
DEException.throwException(Translator.get("i18n_not_full")); DEException.throwException(Translator.get("i18n_not_full"));
@ -326,12 +356,15 @@ public class DatasetDataManage {
Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), fields, crossDs, dsMap, Utils.getParams(fields), null, pluginManage); Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), fields, crossDs, dsMap, Utils.getParams(fields), null, pluginManage);
String replaceSql = provider.rebuildSQL(SQLProvider.createQuerySQL(sqlMeta, false, false, false), sqlMeta, crossDs, dsMap); String replaceSql = provider.rebuildSQL(SQLProvider.createQuerySQL(sqlMeta, false, false, false), sqlMeta, crossDs, dsMap);
return getDatasetTotal(datasetGroupInfoDTO, replaceSql, null); return getDatasetTotal(datasetGroupInfoDTO, replaceSql, null);
} catch (Exception e) {
return null;
}
} }
public Long getDatasetTotal(DatasetGroupInfoDTO datasetGroupInfoDTO, String s, ChartExtRequest request) throws Exception { public Long getDatasetTotal(DatasetGroupInfoDTO datasetGroupInfoDTO, String s, ChartExtRequest request) throws Exception {
Map<String, Object> sqlMap = datasetSQLManage.getUnionSQLForEdit(datasetGroupInfoDTO, request); Map<String, Object> sqlMap = datasetSQLManage.getUnionSQLForEdit(datasetGroupInfoDTO, request);
Map<Long, DatasourceSchemaDTO> dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap"); Map<Long, DatasourceSchemaDTO> dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = datasetGroupInfoDTO.getIsCross();
String sql; String sql;
if (StringUtils.isEmpty(s)) { if (StringUtils.isEmpty(s)) {
sql = (String) sqlMap.get("sql"); sql = (String) sqlMap.get("sql");
@ -349,6 +382,7 @@ public class DatasetDataManage {
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setQuery(querySQL); datasourceRequest.setQuery(querySQL);
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
datasourceRequest.setIsCross(crossDs);
Provider provider; Provider provider;
if (crossDs) { if (crossDs) {
@ -390,17 +424,17 @@ public class DatasetDataManage {
return map; return map;
} }
// private UserFormVO getUserEntity() { private UserFormVO getUserEntity() {
// if (getRowPermissionsApi() == null) { if (getRowPermissionsApi() == null) {
// return null; return null;
// } }
// return getRowPermissionsApi().getUserById(AuthUtils.getUser().getUserId()); return getRowPermissionsApi().getUserById(AuthUtils.getUser().getUserId());
// } }
public Map<String, Object> previewSql(PreviewSqlDTO dto) throws DEException { public Map<String, Object> previewSql(PreviewSqlDTO dto) throws DEException {
CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(dto.getDatasourceId()); CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(dto.getDatasourceId());
DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO(); DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO();
if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) || coreDatasource.getType().equalsIgnoreCase("Excel")) { if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) || coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.Excel.name())) {
BeanUtils.copyBean(datasourceSchemaDTO, engineManage.getDeEngine()); BeanUtils.copyBean(datasourceSchemaDTO, engineManage.getDeEngine());
} else { } else {
BeanUtils.copyBean(datasourceSchemaDTO, coreDatasource); BeanUtils.copyBean(datasourceSchemaDTO, coreDatasource);
@ -417,17 +451,38 @@ public class DatasetDataManage {
dsMap.put(datasourceSchemaDTO.getId(), datasourceSchemaDTO); dsMap.put(datasourceSchemaDTO.getId(), datasourceSchemaDTO);
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
datasourceRequest.setIsCross(dto.getIsCross());
Provider provider = ProviderFactory.getProvider(datasourceSchemaDTO.getType()); Provider provider = ProviderFactory.getProvider(datasourceSchemaDTO.getType());
// parser sql params and replace default value // parser sql params and replace default value
String s = new String(Base64.getDecoder().decode(dto.getSql())); String s = new String(Base64.getDecoder().decode(dto.getSql()));
String originSql = new SqlparserUtils().handleVariableDefaultValue(datasetSQLManage.subPrefixSuffixChar(s), dto.getSqlVariableDetails(), true, true, null, false, dsMap, pluginManage); String originSql = new SqlparserUtils().handleVariableDefaultValue(datasetSQLManage.subPrefixSuffixChar(s), dto.getSqlVariableDetails(), true, true, null, dto.getIsCross(), dsMap, pluginManage, getUserEntity());
originSql = provider.replaceComment(originSql); originSql = provider.replaceComment(originSql);
// sql 作为临时表外层加上limit // sql 作为临时表外层加上limit
String sql; String sql;
if (dto.getIsCross()) {
DatasetTableDTO currentDs = new DatasetTableDTO();
BeanUtils.copyBean(currentDs, dto);
currentDs.setType("sql");
String tableSchema = datasetSQLManage.putObj2Map(dsMap, currentDs, dto.getIsCross());
sql = SqlUtils.addSchema(originSql, tableSchema);
if (Utils.isNeedOrder(List.of(datasourceSchemaDTO.getType()))) {
// 先根据sql获取表字段
String sqlField = SQLUtils.buildOriginPreviewSql(sql, 0, 0);
datasourceRequest.setQuery(sqlField);
// 获取数据源表的原始字段
List<TableField> list = provider.fetchTableField(datasourceRequest);
if (ObjectUtils.isEmpty(list)) {
return null;
}
sql = SQLUtils.buildOriginPreviewSqlWithOrderBy(sql, 100, 0, String.format(SQLConstants.FIELD_DOT_FIX, list.get(0).getOriginName()) + " ASC ");
} else {
sql = SQLUtils.buildOriginPreviewSql(sql, 100, 0);
}
} else {
if (Utils.isNeedOrder(List.of(datasourceSchemaDTO.getType()))) { if (Utils.isNeedOrder(List.of(datasourceSchemaDTO.getType()))) {
// 先根据sql获取表字段 // 先根据sql获取表字段
String sqlField = SQLUtils.buildOriginPreviewSql(SqlPlaceholderConstants.TABLE_PLACEHOLDER, 0, 0); String sqlField = SQLUtils.buildOriginPreviewSql(SqlPlaceholderConstants.TABLE_PLACEHOLDER, 0, 0);
@ -449,6 +504,7 @@ public class DatasetDataManage {
sql = provider.transSqlDialect(sql, datasourceRequest.getDsList()); sql = provider.transSqlDialect(sql, datasourceRequest.getDsList());
// replace placeholder // replace placeholder
sql = provider.replaceTablePlaceHolder(sql, originSql); sql = provider.replaceTablePlaceHolder(sql, originSql);
}
logger.debug("calcite data preview sql: " + sql); logger.debug("calcite data preview sql: " + sql);
datasourceRequest.setQuery(sql); datasourceRequest.setQuery(sql);
@ -456,14 +512,14 @@ public class DatasetDataManage {
// 重新构造data // 重新构造data
List<TableField> fList = (List<TableField>) data.get("fields"); List<TableField> fList = (List<TableField>) data.get("fields");
List<DatasetTableFieldDTO> fields = transFields(fList, false); List<DatasetTableFieldDTO> fields = transFields(fList, false);
Map<String, Object> previewData = buildPreviewData(data, fields, new HashMap<>()); Map<String, Object> previewData = buildPreviewData(data, fields, new HashMap<>(), false);
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
map.put("data", previewData); map.put("data", previewData);
map.put("sql", Base64.getEncoder().encodeToString(sql.getBytes())); map.put("sql", Base64.getEncoder().encodeToString(sql.getBytes()));
return map; return map;
} }
public Map<String, Object> buildPreviewData(Map<String, Object> data, List<DatasetTableFieldDTO> fields, Map<String, ColumnPermissionItem> desensitizationList) { public Map<String, Object> buildPreviewData(Map<String, Object> data, List<DatasetTableFieldDTO> fields, Map<String, ColumnPermissionItem> desensitizationList, boolean isEncode) {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
List<String[]> dataList = (List<String[]>) data.get("data"); List<String[]> dataList = (List<String[]>) data.get("data");
List<LinkedHashMap<String, Object>> dataObjectList = new ArrayList<>(); List<LinkedHashMap<String, Object>> dataObjectList = new ArrayList<>();
@ -479,11 +535,11 @@ public class DatasetDataManage {
BigDecimal bigDecimal = new BigDecimal(res); BigDecimal bigDecimal = new BigDecimal(res);
res = String.format("%.8f", bigDecimal); res = String.format("%.8f", bigDecimal);
} }
if (desensitizationList.keySet().contains(fields.get(j).getDataeaseName())) { if (desensitizationList.keySet().contains(fields.get(j).getGisbiName())) {
obj.put(fields.get(j).getDataeaseName(), ChartDataBuild.desensitizationValue(desensitizationList.get(fields.get(j).getDataeaseName()), String.valueOf(res))); obj.put(fields.get(j).getGisbiName(), ChartDataBuild.desensitizationValue(desensitizationList.get(fields.get(j).getGisbiName()), String.valueOf(res)));
} else { } else {
obj.put(ObjectUtils.isNotEmpty(fields.get(j).getDataeaseName()) ? obj.put(ObjectUtils.isNotEmpty(fields.get(j).getGisbiName()) ?
fields.get(j).getDataeaseName() : fields.get(j).getOriginName(), res); fields.get(j).getGisbiName() : fields.get(j).getOriginName(), res);
} }
} }
} }
@ -491,6 +547,10 @@ public class DatasetDataManage {
} }
} }
if (isEncode) {
DatasetUtils.listEncode(fields);
}
map.put("fields", fields); map.put("fields", fields);
map.put("data", dataObjectList); map.put("data", dataObjectList);
return map; return map;
@ -506,27 +566,27 @@ public class DatasetDataManage {
for (DatasetTableFieldDTO fieldDTO : unionFields) { for (DatasetTableFieldDTO fieldDTO : unionFields) {
if (Objects.equals(datasetTableFieldDTO.getDatasetTableId(), fieldDTO.getDatasetTableId()) if (Objects.equals(datasetTableFieldDTO.getDatasetTableId(), fieldDTO.getDatasetTableId())
&& Objects.equals(datasetTableFieldDTO.getOriginName(), fieldDTO.getOriginName())) { && Objects.equals(datasetTableFieldDTO.getOriginName(), fieldDTO.getOriginName())) {
datasetTableFieldDTO.setDataeaseName(fieldDTO.getDataeaseName()); datasetTableFieldDTO.setGisbiName(fieldDTO.getGisbiName());
datasetTableFieldDTO.setFieldShortName(fieldDTO.getFieldShortName()); datasetTableFieldDTO.setFieldShortName(fieldDTO.getFieldShortName());
} }
} }
} }
if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_CALC)) { if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_CALC)) {
String dataeaseName = TableUtils.fieldNameShort(datasetTableFieldDTO.getId() + "_" + datasetTableFieldDTO.getOriginName()); String gisbiName = TableUtils.fieldNameShort(datasetTableFieldDTO.getId() + "_" + datasetTableFieldDTO.getOriginName());
datasetTableFieldDTO.setDataeaseName(dataeaseName); datasetTableFieldDTO.setGisbiName(gisbiName);
datasetTableFieldDTO.setFieldShortName(dataeaseName); datasetTableFieldDTO.setFieldShortName(gisbiName);
datasetTableFieldDTO.setDeExtractType(datasetTableFieldDTO.getDeType()); datasetTableFieldDTO.setDeExtractType(datasetTableFieldDTO.getDeType());
} }
if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_GROUP)) { if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_GROUP)) {
String dataeaseName = TableUtils.fieldNameShort(datasetTableFieldDTO.getId() + "_" + datasetTableFieldDTO.getOriginName()); String gisbiName = TableUtils.fieldNameShort(datasetTableFieldDTO.getId() + "_" + datasetTableFieldDTO.getOriginName());
datasetTableFieldDTO.setDataeaseName(dataeaseName); datasetTableFieldDTO.setGisbiName(gisbiName);
datasetTableFieldDTO.setFieldShortName(dataeaseName); datasetTableFieldDTO.setFieldShortName(gisbiName);
datasetTableFieldDTO.setDeExtractType(0); datasetTableFieldDTO.setDeExtractType(0);
datasetTableFieldDTO.setDeType(0); datasetTableFieldDTO.setDeType(0);
datasetTableFieldDTO.setGroupType("d"); datasetTableFieldDTO.setGroupType("d");
} }
} else { } else {
datasetTableFieldDTO.setDataeaseName(dto.getDataeaseName()); datasetTableFieldDTO.setGisbiName(dto.getGisbiName());
datasetTableFieldDTO.setFieldShortName(dto.getFieldShortName()); datasetTableFieldDTO.setFieldShortName(dto.getFieldShortName());
} }
} }
@ -546,7 +606,7 @@ public class DatasetDataManage {
allFields.addAll(datasetGroupInfoDTO.getAllFields()); allFields.addAll(datasetGroupInfoDTO.getAllFields());
Map<Long, DatasourceSchemaDTO> dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap"); Map<Long, DatasourceSchemaDTO> dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = datasetGroupInfoDTO.getIsCross();
if (!crossDs) { if (!crossDs) {
sql = Utils.replaceSchemaAlias(sql, dsMap); sql = Utils.replaceSchemaAlias(sql, dsMap);
} }
@ -579,7 +639,7 @@ public class DatasetDataManage {
} }
Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage); Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage);
// WhereTree2Str.transFilterTrees(sqlMeta, null, allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage); WhereTree2Str.transFilterTrees(sqlMeta, null, allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage);
Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage); Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage);
String querySQL; String querySQL;
querySQL = SQLProvider.createQuerySQL(sqlMeta, false, needOrder, !StringUtils.equalsIgnoreCase(dsType, "es")); querySQL = SQLProvider.createQuerySQL(sqlMeta, false, needOrder, !StringUtils.equalsIgnoreCase(dsType, "es"));
@ -591,6 +651,7 @@ public class DatasetDataManage {
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setQuery(querySQL); datasourceRequest.setQuery(querySQL);
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
datasourceRequest.setIsCross(crossDs);
Map<String, Object> data = provider.fetchResultField(datasourceRequest); Map<String, Object> data = provider.fetchResultField(datasourceRequest);
List<String[]> dataList = (List<String[]>) data.get("data"); List<String[]> dataList = (List<String[]>) data.get("data");
@ -635,13 +696,13 @@ public class DatasetDataManage {
Long datasetGroupId = field.getDatasetGroupId(); Long datasetGroupId = field.getDatasetGroupId();
// check permission // check permission
// BusiPerCheckDTO dto = new BusiPerCheckDTO(); BusiPerCheckDTO dto = new BusiPerCheckDTO();
// dto.setId(datasetGroupId); dto.setId(datasetGroupId);
// dto.setAuthEnum(AuthEnum.READ); dto.setAuthEnum(AuthEnum.READ);
// boolean checked = corePermissionManage.checkAuth(dto); boolean checked = corePermissionManage.checkAuth(dto);
// if (!checked) { if (!checked) {
// DEException.throwException(Translator.get("i18n_no_dataset_permission")); DEException.throwException(Translator.get("i18n_no_dataset_permission"));
// } }
if (field.getChartId() != null) { if (field.getChartId() != null) {
allFields.addAll(datasetTableFieldManage.getChartCalcFields(field.getChartId())); allFields.addAll(datasetTableFieldManage.getChartCalcFields(field.getChartId()));
} }
@ -653,7 +714,7 @@ public class DatasetDataManage {
allFields.addAll(datasetGroupInfoDTO.getAllFields()); allFields.addAll(datasetGroupInfoDTO.getAllFields());
Map<Long, DatasourceSchemaDTO> dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap"); Map<Long, DatasourceSchemaDTO> dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = datasetGroupInfoDTO.getIsCross();
if (!crossDs) { if (!crossDs) {
sql = Utils.replaceSchemaAlias(sql, dsMap); sql = Utils.replaceSchemaAlias(sql, dsMap);
} }
@ -713,6 +774,7 @@ public class DatasetDataManage {
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setQuery(querySQL); datasourceRequest.setQuery(querySQL);
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
datasourceRequest.setIsCross(crossDs);
Map<String, Object> data = provider.fetchResultField(datasourceRequest); Map<String, Object> data = provider.fetchResultField(datasourceRequest);
List<String[]> dataList = (List<String[]>) data.get("data"); List<String[]> dataList = (List<String[]>) data.get("data");
@ -738,9 +800,9 @@ public class DatasetDataManage {
tmpData.set(i, val); tmpData.set(i, val);
} }
} }
if (desensitizationList.keySet().contains(field.getDataeaseName())) { if (desensitizationList.keySet().contains(field.getGisbiName())) {
for (int i = 0; i < tmpData.size(); i++) { for (int i = 0; i < tmpData.size(); i++) {
previewData.add(ChartDataBuild.desensitizationValue(desensitizationList.get(field.getDataeaseName()), tmpData.get(i))); previewData.add(ChartDataBuild.desensitizationValue(desensitizationList.get(field.getGisbiName()), tmpData.get(i)));
} }
} else { } else {
previewData = tmpData; previewData = tmpData;
@ -819,7 +881,7 @@ public class DatasetDataManage {
allFields.addAll(datasetGroupInfoDTO.getAllFields()); allFields.addAll(datasetGroupInfoDTO.getAllFields());
dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap"); dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
crossDs = Utils.isCrossDs(dsMap); crossDs = datasetGroupInfoDTO.getIsCross();
if (!crossDs) { if (!crossDs) {
sql = Utils.replaceSchemaAlias(sql, dsMap); sql = Utils.replaceSchemaAlias(sql, dsMap);
} }
@ -975,6 +1037,7 @@ public class DatasetDataManage {
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setQuery(querySQL); datasourceRequest.setQuery(querySQL);
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
datasourceRequest.setIsCross(crossDs);
Map<String, Object> data = provider.fetchResultField(datasourceRequest); Map<String, Object> data = provider.fetchResultField(datasourceRequest);
List<String[]> dataList = (List<String[]>) data.get("data"); List<String[]> dataList = (List<String[]>) data.get("data");
@ -1012,8 +1075,8 @@ public class DatasetDataManage {
BigDecimal bigDecimal = new BigDecimal(val); BigDecimal bigDecimal = new BigDecimal(val);
val = String.format("%.8f", bigDecimal); val = String.format("%.8f", bigDecimal);
} }
if (desensitizationList.containsKey(field.getDataeaseName())) { if (desensitizationList.containsKey(field.getGisbiName())) {
String str = ChartDataBuild.desensitizationValue(desensitizationList.get(field.getDataeaseName()), val); String str = ChartDataBuild.desensitizationValue(desensitizationList.get(field.getGisbiName()), val);
map.put(field.getId() + "", str); map.put(field.getId() + "", str);
} else { } else {
map.put(field.getId() + "", val); map.put(field.getId() + "", val);
@ -1049,7 +1112,7 @@ public class DatasetDataManage {
allFields.addAll(datasetGroupInfoDTO.getAllFields()); allFields.addAll(datasetGroupInfoDTO.getAllFields());
Map<Long, DatasourceSchemaDTO> dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap"); Map<Long, DatasourceSchemaDTO> dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
boolean crossDs = Utils.isCrossDs(dsMap); boolean crossDs = datasetGroupInfoDTO.getIsCross();
if (!crossDs) { if (!crossDs) {
sql = Utils.replaceSchemaAlias(sql, dsMap); sql = Utils.replaceSchemaAlias(sql, dsMap);
} }
@ -1110,6 +1173,7 @@ public class DatasetDataManage {
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setQuery(querySQL); datasourceRequest.setQuery(querySQL);
datasourceRequest.setDsList(dsMap); datasourceRequest.setDsList(dsMap);
datasourceRequest.setIsCross(crossDs);
Map<String, Object> data = provider.fetchResultField(datasourceRequest); Map<String, Object> data = provider.fetchResultField(datasourceRequest);
List<String[]> rows = (List<String[]>) data.get("data"); List<String[]> rows = (List<String[]>) data.get("data");
@ -1118,13 +1182,16 @@ public class DatasetDataManage {
Set<String> pkSet = new HashSet<>(); Set<String> pkSet = new HashSet<>();
rows = rows.stream().filter(row -> { rows = rows.stream().filter(row -> {
boolean hasEmpty = false; boolean hasEmpty = false;
int emptyCount = 0;
for (String s : row) { for (String s : row) {
if (StringUtils.isBlank(s)) { if (StringUtils.isBlank(s)) {
hasEmpty = true; emptyCount++;
break; hasEmpty = true; // 标记已遇到第一个null
} else if (hasEmpty) {
return false; // 在null后出现非null元素不符合要求
} }
} }
return !hasEmpty; return emptyCount != row.length;
}).toList(); }).toList();
List<BaseTreeNodeDTO> treeNodes = rows.stream().map(row -> buildTreeNode(row, pkSet)).flatMap(Collection::stream).collect(Collectors.toList()); List<BaseTreeNodeDTO> treeNodes = rows.stream().map(row -> buildTreeNode(row, pkSet)).flatMap(Collection::stream).collect(Collectors.toList());
List<BaseTreeNodeDTO> tree = DatasetUtils.mergeDuplicateTree(treeNodes, "root"); List<BaseTreeNodeDTO> tree = DatasetUtils.mergeDuplicateTree(treeNodes, "root");
@ -1136,7 +1203,9 @@ public class DatasetDataManage {
List<String> parentPkList = new ArrayList<>(); List<String> parentPkList = new ArrayList<>();
for (int i = 0; i < row.length; i++) { for (int i = 0; i < row.length; i++) {
String text = row[i]; String text = row[i];
if (StringUtils.isEmpty(text)) {
continue;
}
parentPkList.add(text); parentPkList.add(text);
String val = String.join(TreeUtils.SEPARATOR, parentPkList); String val = String.join(TreeUtils.SEPARATOR, parentPkList);
String parentVal = i == 0 ? TreeUtils.DEFAULT_ROOT : row[i - 1]; String parentVal = i == 0 ? TreeUtils.DEFAULT_ROOT : row[i - 1];
@ -1358,7 +1427,7 @@ private String buildPrimaryKeyQuerySQL(String dbType, String tablename) {
logger.debug("执行插入数据的SQL: {}", sql); logger.debug("执行插入数据的SQL: {}", sql);
// 执行插入操作 // 执行插入操作
int result= provider.executeUpdate(datasourceRequest); int result= provider.executeUpdate(datasourceRequest,null).getCount();
if (result==1) { if (result==1) {
return true; return true;
// process result set // process result set
@ -1501,7 +1570,7 @@ private String buildPrimaryKeyQuerySQL(String dbType, String tablename) {
logger.debug("执行更新数据的SQL: {}", sql); logger.debug("执行更新数据的SQL: {}", sql);
// 执行更新操作 // 执行更新操作
int result= provider.executeUpdate(datasourceRequest); int result= provider.executeUpdate(datasourceRequest,null).getCount();
if (result==1) { if (result==1) {
return true; return true;
// process result set // process result set
@ -1540,7 +1609,7 @@ private String buildPrimaryKeyQuerySQL(String dbType, String tablename) {
logger.debug("执行删除数据的SQL: {}", sql); logger.debug("执行删除数据的SQL: {}", sql);
// 执行删除操作 // 执行删除操作
int result= provider.executeUpdate(datasourceRequest); int result= provider.executeUpdate(datasourceRequest,null).getCount();
if (result==1) { if (result==1) {
return true; return true;
// process result set // process result set

View File

@ -33,10 +33,9 @@ import jakarta.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import io.gisbi.dataset.utils.DatasetUtils;
import java.util.*; import java.util.*;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
@ -80,8 +79,7 @@ public class DatasetGroupManage {
@Transactional @Transactional
public DatasetGroupInfoDTO save(DatasetGroupInfoDTO datasetGroupInfoDTO, boolean rename) throws Exception { public DatasetGroupInfoDTO save(DatasetGroupInfoDTO datasetGroupInfoDTO, boolean rename, boolean encode) throws Exception {
lock.lock();
try { try {
boolean isCreate; boolean isCreate;
// 用于重命名获取pid // 用于重命名获取pid
@ -123,6 +121,9 @@ public class DatasetGroupManage {
} }
// node_type=dataset需要创建dataset_table和field // node_type=dataset需要创建dataset_table和field
if (StringUtils.equalsIgnoreCase(datasetGroupInfoDTO.getNodeType(), "dataset")) { if (StringUtils.equalsIgnoreCase(datasetGroupInfoDTO.getNodeType(), "dataset")) {
if (encode) {
DatasetUtils.dsDecode(datasetGroupInfoDTO);
}
List<Long> tableIds = new ArrayList<>(); List<Long> tableIds = new ArrayList<>();
List<Long> fieldIds = new ArrayList<>(); List<Long> fieldIds = new ArrayList<>();
// 解析tree保存 // 解析tree保存
@ -131,12 +132,16 @@ public class DatasetGroupManage {
// 删除不要的table和field // 删除不要的table和field
datasetTableManage.deleteByDatasetGroupUpdate(datasetGroupInfoDTO.getId(), tableIds); datasetTableManage.deleteByDatasetGroupUpdate(datasetGroupInfoDTO.getId(), tableIds);
datasetTableFieldManage.deleteByDatasetGroupUpdate(datasetGroupInfoDTO.getId(), fieldIds); datasetTableFieldManage.deleteByDatasetGroupUpdate(datasetGroupInfoDTO.getId(), fieldIds);
if (encode) {
DatasetUtils.dsEncode(datasetGroupInfoDTO);
}
}
if (StringUtils.isNotEmpty(datasetGroupInfoDTO.getUnionSql())) {
datasetGroupInfoDTO.setUnionSql(DatasetUtils.getEncode(datasetGroupInfoDTO.getUnionSql()));
} }
return datasetGroupInfoDTO; return datasetGroupInfoDTO;
} catch (Exception e) { } catch (Exception e) {
DEException.throwException(e.getMessage()); DEException.throwException(e.getMessage());
} finally {
lock.unlock();
} }
return null; return null;
} }
@ -214,6 +219,7 @@ public class DatasetGroupManage {
public List<BusiNodeVO> tree(BusiNodeRequest request) { public List<BusiNodeVO> tree(BusiNodeRequest request) {
QueryWrapper<Object> queryWrapper = new QueryWrapper<>(); QueryWrapper<Object> queryWrapper = new QueryWrapper<>();
if (ObjectUtils.isNotEmpty(request.getLeaf())) { if (ObjectUtils.isNotEmpty(request.getLeaf())) {
queryWrapper.eq("node_type", request.getLeaf() ? "dataset" : "folder"); queryWrapper.eq("node_type", request.getLeaf() ? "dataset" : "folder");
@ -329,7 +335,7 @@ public class DatasetGroupManage {
if (ObjectUtils.isEmpty(datasetGroupInfoDTO.getUnion())) { if (ObjectUtils.isEmpty(datasetGroupInfoDTO.getUnion())) {
return; return;
} }
datasetDataManage.previewDataWithLimit(datasetGroupInfoDTO, 0, 1, false); datasetDataManage.previewDataWithLimit(datasetGroupInfoDTO, 0, 1, false, false);
// table和field均由前端生成id如果没有id // table和field均由前端生成id如果没有id
Long datasetGroupId = datasetGroupInfoDTO.getId(); Long datasetGroupId = datasetGroupInfoDTO.getId();
List<DatasetTableFieldDTO> allFields = datasetGroupInfoDTO.getAllFields(); List<DatasetTableFieldDTO> allFields = datasetGroupInfoDTO.getAllFields();
@ -345,28 +351,28 @@ public class DatasetGroupManage {
for (DatasetTableFieldDTO fieldDTO : unionFields) { for (DatasetTableFieldDTO fieldDTO : unionFields) {
if (Objects.equals(datasetTableFieldDTO.getDatasetTableId(), fieldDTO.getDatasetTableId()) if (Objects.equals(datasetTableFieldDTO.getDatasetTableId(), fieldDTO.getDatasetTableId())
&& Objects.equals(datasetTableFieldDTO.getOriginName(), fieldDTO.getOriginName())) { && Objects.equals(datasetTableFieldDTO.getOriginName(), fieldDTO.getOriginName())) {
datasetTableFieldDTO.setDataeaseName(fieldDTO.getDataeaseName()); datasetTableFieldDTO.setGisbiName(fieldDTO.getGisbiName());
datasetTableFieldDTO.setFieldShortName(fieldDTO.getFieldShortName()); datasetTableFieldDTO.setFieldShortName(fieldDTO.getFieldShortName());
} }
} }
} }
if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_CALC)) { if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_CALC)) {
String dataeaseName = TableUtils.fieldNameShort(datasetTableFieldDTO.getId() + "_" + datasetTableFieldDTO.getOriginName()); String gisbiName = TableUtils.fieldNameShort(datasetTableFieldDTO.getId() + "_" + datasetTableFieldDTO.getOriginName());
datasetTableFieldDTO.setDataeaseName(dataeaseName); datasetTableFieldDTO.setGisbiName(gisbiName);
datasetTableFieldDTO.setFieldShortName(dataeaseName); datasetTableFieldDTO.setFieldShortName(gisbiName);
datasetTableFieldDTO.setDeExtractType(datasetTableFieldDTO.getDeType()); datasetTableFieldDTO.setDeExtractType(datasetTableFieldDTO.getDeType());
} }
if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_GROUP)) { if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_GROUP)) {
String dataeaseName = TableUtils.fieldNameShort(datasetTableFieldDTO.getId() + "_" + datasetTableFieldDTO.getOriginName()); String gisbiName = TableUtils.fieldNameShort(datasetTableFieldDTO.getId() + "_" + datasetTableFieldDTO.getOriginName());
datasetTableFieldDTO.setDataeaseName(dataeaseName); datasetTableFieldDTO.setGisbiName(gisbiName);
datasetTableFieldDTO.setFieldShortName(dataeaseName); datasetTableFieldDTO.setFieldShortName(gisbiName);
datasetTableFieldDTO.setDeExtractType(0); datasetTableFieldDTO.setDeExtractType(0);
datasetTableFieldDTO.setDeType(0); datasetTableFieldDTO.setDeType(0);
datasetTableFieldDTO.setGroupType("d"); datasetTableFieldDTO.setGroupType("d");
} }
datasetTableFieldDTO.setDatasetGroupId(datasetGroupId); datasetTableFieldDTO.setDatasetGroupId(datasetGroupId);
} else { } else {
datasetTableFieldDTO.setDataeaseName(dto.getDataeaseName()); datasetTableFieldDTO.setGisbiName(dto.getGisbiName());
datasetTableFieldDTO.setFieldShortName(dto.getFieldShortName()); datasetTableFieldDTO.setFieldShortName(dto.getFieldShortName());
} }
datasetTableFieldDTO = datasetTableFieldManage.save(datasetTableFieldDTO); datasetTableFieldDTO = datasetTableFieldManage.save(datasetTableFieldDTO);
@ -390,7 +396,7 @@ public class DatasetGroupManage {
List<DatasetTableFieldDTO> allFields = dsFields.stream().map(ele -> { List<DatasetTableFieldDTO> allFields = dsFields.stream().map(ele -> {
DatasetTableFieldDTO datasetTableFieldDTO = new DatasetTableFieldDTO(); DatasetTableFieldDTO datasetTableFieldDTO = new DatasetTableFieldDTO();
BeanUtils.copyBean(datasetTableFieldDTO, ele); BeanUtils.copyBean(datasetTableFieldDTO, ele);
datasetTableFieldDTO.setFieldShortName(ele.getDataeaseName()); datasetTableFieldDTO.setFieldShortName(ele.getGisbiName());
return datasetTableFieldDTO; return datasetTableFieldDTO;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
@ -426,10 +432,12 @@ public class DatasetGroupManage {
List<DatasetTableFieldDTO> allFields = dsFields.stream().map(ele -> { List<DatasetTableFieldDTO> allFields = dsFields.stream().map(ele -> {
DatasetTableFieldDTO datasetTableFieldDTO = new DatasetTableFieldDTO(); DatasetTableFieldDTO datasetTableFieldDTO = new DatasetTableFieldDTO();
BeanUtils.copyBean(datasetTableFieldDTO, ele); BeanUtils.copyBean(datasetTableFieldDTO, ele);
datasetTableFieldDTO.setFieldShortName(ele.getDataeaseName()); datasetTableFieldDTO.setFieldShortName(ele.getGisbiName());
return datasetTableFieldDTO; return datasetTableFieldDTO;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
DatasetUtils.listEncode(allFields);
dto.setAllFields(allFields); dto.setAllFields(allFields);
} }
return dto; return dto;
@ -462,7 +470,7 @@ public class DatasetGroupManage {
List<DatasetTableFieldDTO> allFields = dsFields.stream().map(ele -> { List<DatasetTableFieldDTO> allFields = dsFields.stream().map(ele -> {
DatasetTableFieldDTO datasetTableFieldDTO = new DatasetTableFieldDTO(); DatasetTableFieldDTO datasetTableFieldDTO = new DatasetTableFieldDTO();
BeanUtils.copyBean(datasetTableFieldDTO, ele); BeanUtils.copyBean(datasetTableFieldDTO, ele);
datasetTableFieldDTO.setFieldShortName(ele.getDataeaseName()); datasetTableFieldDTO.setFieldShortName(ele.getGisbiName());
return datasetTableFieldDTO; return datasetTableFieldDTO;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
@ -470,7 +478,7 @@ public class DatasetGroupManage {
if ("preview".equalsIgnoreCase(type)) { if ("preview".equalsIgnoreCase(type)) {
// 请求数据 // 请求数据
Map<String, Object> map = datasetDataManage.previewDataWithLimit(dto, 0, 100, true); Map<String, Object> map = datasetDataManage.previewDataWithLimit(dto, 0, 100, true, false);
// 获取data,sql // 获取data,sql
Map<String, List> data = (Map<String, List>) map.get("data"); Map<String, List> data = (Map<String, List>) map.get("data");
String sql = (String) map.get("sql"); String sql = (String) map.get("sql");
@ -583,6 +591,8 @@ public class DatasetGroupManage {
List<DatasetTableFieldDTO> dimensionList = fields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "d")).toList(); List<DatasetTableFieldDTO> dimensionList = fields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "d")).toList();
List<DatasetTableFieldDTO> quotaList = fields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "q")).toList(); List<DatasetTableFieldDTO> quotaList = fields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "q")).toList();
Map<String, List<DatasetTableFieldDTO>> map = new LinkedHashMap<>(); Map<String, List<DatasetTableFieldDTO>> map = new LinkedHashMap<>();
DatasetUtils.listEncode(dimensionList);
DatasetUtils.listEncode(quotaList);
map.put("dimensionList", dimensionList); map.put("dimensionList", dimensionList);
map.put("quotaList", quotaList); map.put("quotaList", quotaList);
dto.setFields(map); dto.setFields(map);
@ -592,4 +602,38 @@ public class DatasetGroupManage {
} }
return result; return result;
} }
public List<DatasetGroupInfoDTO> getAllList() {
List<CoreDatasetGroup> coreDatasetGroupList = coreDatasetGroupMapper.selectList(new QueryWrapper<>());
if (CollectionUtils.isEmpty(coreDatasetGroupList)) {
return new ArrayList<>();
}
List<DatasetGroupInfoDTO> list = new ArrayList<>();
for (CoreDatasetGroup coreDatasetGroup : coreDatasetGroupList) {
DatasetGroupInfoDTO dto = new DatasetGroupInfoDTO();
BeanUtils.copyBean(dto, coreDatasetGroup);
dto.setUnionSql(null);
if (StringUtils.equalsIgnoreCase(dto.getNodeType(), "dataset")) {
List<UnionDTO> unionDTOList = JsonUtil.parseList(coreDatasetGroup.getInfo(), new TypeReference<>() {
});
dto.setUnion(unionDTOList);
// 获取field
List<DatasetTableFieldDTO> dsFields = datasetTableFieldManage.selectByDatasetGroupId(coreDatasetGroup.getId());
List<DatasetTableFieldDTO> allFields = dsFields.stream().map(ele -> {
DatasetTableFieldDTO datasetTableFieldDTO = new DatasetTableFieldDTO();
BeanUtils.copyBean(datasetTableFieldDTO, ele);
datasetTableFieldDTO.setFieldShortName(ele.getGisbiName());
return datasetTableFieldDTO;
}).collect(Collectors.toList());
DatasetUtils.listEncode(allFields);
dto.setAllFields(allFields);
list.add(dto);
}
}
return list;
}
} }

View File

@ -1,8 +1,14 @@
package io.gisbi.dataset.manage; package io.gisbi.dataset.manage;
import io.gisbi.api.dataset.union.*; import io.gisbi.api.dataset.union.*;
import io.gisbi.api.permissions.auth.dto.BusiPerCheckDTO;
import io.gisbi.api.permissions.dataset.api.RowPermissionsApi;
import io.gisbi.api.permissions.user.vo.UserFormVO;
import io.gisbi.commons.utils.SqlparserUtils; import io.gisbi.commons.utils.SqlparserUtils;
import io.gisbi.constant.AuthEnum;
import io.gisbi.dataset.constant.DatasetTableType; import io.gisbi.dataset.constant.DatasetTableType;
import io.gisbi.dataset.dao.auto.entity.CoreDatasetGroup;
import io.gisbi.dataset.dao.auto.mapper.CoreDatasetGroupMapper;
import io.gisbi.dataset.utils.DatasetTableTypeConstants; import io.gisbi.dataset.utils.DatasetTableTypeConstants;
import io.gisbi.dataset.utils.SqlUtils; import io.gisbi.dataset.utils.SqlUtils;
import io.gisbi.dataset.utils.TableUtils; import io.gisbi.dataset.utils.TableUtils;
@ -27,6 +33,9 @@ import io.gisbi.extensions.view.dto.ChartExtFilterDTO;
import io.gisbi.extensions.view.dto.ChartExtRequest; import io.gisbi.extensions.view.dto.ChartExtRequest;
import io.gisbi.extensions.view.dto.SqlVariableDetails; import io.gisbi.extensions.view.dto.SqlVariableDetails;
import io.gisbi.i18n.Translator; import io.gisbi.i18n.Translator;
import io.gisbi.license.utils.LicenseUtil;
import io.gisbi.system.manage.CorePermissionManage;
import io.gisbi.utils.AuthUtils;
import io.gisbi.utils.BeanUtils; import io.gisbi.utils.BeanUtils;
import io.gisbi.utils.JsonUtil; import io.gisbi.utils.JsonUtil;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -53,10 +62,23 @@ public class DatasetSQLManage {
@Resource @Resource
private EngineManage engineManage; private EngineManage engineManage;
@Resource
private CorePermissionManage corePermissionManage;
@Autowired(required = false) @Autowired(required = false)
private PluginManageApi pluginManage; private PluginManageApi pluginManage;
@Autowired(required = false)
private RowPermissionsApi rowPermissionsApi;
@Resource @Resource
private DataSourceManage dataSourceManage; private DataSourceManage dataSourceManage;
@Resource
private DatasetGroupManage datasetGroupManage;
@Resource
private CoreDatasetGroupMapper coreDatasetGroupMapper;
private RowPermissionsApi getRowPermissionsApi() {
return rowPermissionsApi;
}
private static Logger logger = LoggerFactory.getLogger(DatasetSQLManage.class); private static Logger logger = LoggerFactory.getLogger(DatasetSQLManage.class);
@ -109,22 +131,12 @@ public class DatasetSQLManage {
List<UnionParamDTO> unionList = new ArrayList<>(); List<UnionParamDTO> unionList = new ArrayList<>();
List<DatasetTableFieldDTO> checkedFields = new ArrayList<>(); List<DatasetTableFieldDTO> checkedFields = new ArrayList<>();
String sql = ""; String sql = "";
if (ObjectUtils.isEmpty(union)) { if (ObjectUtils.isEmpty(union)) {
return null; return null;
} }
Set<Long> allDs = getAllDs(union); boolean isCross = dataTableInfoDTO.getIsCross();
boolean isCross = allDs.size() > 1;
DatasetTableDTO currentDs = union.get(0).getCurrentDs(); DatasetTableDTO currentDs = union.get(0).getCurrentDs();
SQLObj tableName = null;
// get datasource and schema,put map
String tableSchema = putObj2Map(dsMap, currentDs, isCross);
// get table
DatasetTableInfoDTO infoDTO = JsonUtil.parseObject(currentDs.getInfo(), DatasetTableInfoDTO.class);
SQLObj tableName = getUnionTable(currentDs, infoDTO, tableSchema, 0, filterParameters(chartExtRequest, currentDs.getId()), chartExtRequest == null, isCross, dsMap);
for (int i = 0; i < union.size(); i++) { for (int i = 0; i < union.size(); i++) {
UnionDTO unionDTO = union.get(i); UnionDTO unionDTO = union.get(i);
DatasetTableDTO datasetTable = unionDTO.getCurrentDs(); DatasetTableDTO datasetTable = unionDTO.getCurrentDs();
@ -137,7 +149,9 @@ public class DatasetSQLManage {
schema = putObj2Map(dsMap, datasetTable, isCross); schema = putObj2Map(dsMap, datasetTable, isCross);
} }
SQLObj table = getUnionTable(datasetTable, tableInfo, schema, i, filterParameters(chartExtRequest, currentDs.getId()), chartExtRequest == null, isCross, dsMap); SQLObj table = getUnionTable(datasetTable, tableInfo, schema, i, filterParameters(chartExtRequest, currentDs.getId()), chartExtRequest == null, isCross, dsMap);
if (i == 0) {
tableName = table;
}
// 获取前端传过来选中的字段 // 获取前端传过来选中的字段
List<DatasetTableFieldDTO> fields = unionDTO.getCurrentDsFields(); List<DatasetTableFieldDTO> fields = unionDTO.getCurrentDsFields();
fields = fields.stream().filter(DatasetTableFieldDTO::getChecked).collect(Collectors.toList()); fields = fields.stream().filter(DatasetTableFieldDTO::getChecked).collect(Collectors.toList());
@ -145,14 +159,13 @@ public class DatasetSQLManage {
String[] array = fields.stream() String[] array = fields.stream()
.map(f -> { .map(f -> {
String alias; String alias;
if (StringUtils.isEmpty(f.getDataeaseName())) { if (StringUtils.isEmpty(f.getGisbiName())) {
alias = TableUtils.fieldNameShort(table.getTableAlias() + "_" + f.getOriginName()); alias = TableUtils.fieldNameShort(table.getTableAlias() + "_" + f.getOriginName());
} else { } else {
alias = f.getDataeaseName(); alias = f.getGisbiName();
} }
f.setFieldShortName(alias); f.setFieldShortName(alias);
f.setDataeaseName(f.getFieldShortName()); f.setgisbiName(f.getFieldShortName());
f.setDatasetTableId(datasetTable.getId()); f.setDatasetTableId(datasetTable.getId());
String prefix = ""; String prefix = "";
String suffix = ""; String suffix = "";
@ -320,14 +333,14 @@ public class DatasetSQLManage {
String[] array = fields.stream() String[] array = fields.stream()
.map(f -> { .map(f -> {
String alias; String alias;
if (StringUtils.isEmpty(f.getDataeaseName())) { if (StringUtils.isEmpty(f.getGisbiName())) {
alias = TableUtils.fieldNameShort(table.getTableAlias() + "_" + f.getOriginName()); alias = TableUtils.fieldNameShort(table.getTableAlias() + "_" + f.getOriginName());
} else { } else {
alias = f.getDataeaseName(); alias = f.getGisbiName();
} }
f.setFieldShortName(alias); f.setFieldShortName(alias);
f.setDataeaseName(f.getFieldShortName()); f.setgisbiName(f.getFieldShortName());
f.setDatasetTableId(datasetTable.getId()); f.setDatasetTableId(datasetTable.getId());
String prefix = ""; String prefix = "";
String suffix = ""; String suffix = "";
@ -398,6 +411,7 @@ public class DatasetSQLManage {
BeanUtils.copyBean(dto, datasourceType); BeanUtils.copyBean(dto, datasourceType);
return dto; return dto;
} else { } else {
if (LicenseUtil.licenseValid()) {
List<XpackPluginsDatasourceVO> xpackPluginsDatasourceVOS = pluginManage.queryPluginDs(); List<XpackPluginsDatasourceVO> xpackPluginsDatasourceVOS = pluginManage.queryPluginDs();
List<XpackPluginsDatasourceVO> list = xpackPluginsDatasourceVOS.stream().filter(ele -> StringUtils.equals(ele.getType(), type)).toList(); List<XpackPluginsDatasourceVO> list = xpackPluginsDatasourceVOS.stream().filter(ele -> StringUtils.equals(ele.getType(), type)).toList();
if (ObjectUtils.isNotEmpty(list)) { if (ObjectUtils.isNotEmpty(list)) {
@ -412,6 +426,7 @@ public class DatasetSQLManage {
} else { } else {
DEException.throwException(Translator.get("i18n_dataset_plugin_error")); DEException.throwException(Translator.get("i18n_dataset_plugin_error"));
} }
}
return null; return null;
} }
} }
@ -445,6 +460,12 @@ public class DatasetSQLManage {
} }
} }
private UserFormVO getUserEntity() {
if (getRowPermissionsApi() == null) {
return null;
}
return getRowPermissionsApi().getUserById(AuthUtils.getUser().getUserId());
}
private SQLObj getUnionTable(DatasetTableDTO currentDs, DatasetTableInfoDTO infoDTO, String tableSchema, int index, List<SqlVariableDetails> parameters, boolean isFromDataSet, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) { private SQLObj getUnionTable(DatasetTableDTO currentDs, DatasetTableInfoDTO infoDTO, String tableSchema, int index, List<SqlVariableDetails> parameters, boolean isFromDataSet, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap) {
SQLObj tableObj; SQLObj tableObj;
@ -455,7 +476,7 @@ public class DatasetSQLManage {
Provider provider = ProviderFactory.getProvider(dsMap.entrySet().iterator().next().getValue().getType()); Provider provider = ProviderFactory.getProvider(dsMap.entrySet().iterator().next().getValue().getType());
// parser sql params and replace default value // parser sql params and replace default value
String s = new String(Base64.getDecoder().decode(infoDTO.getSql())); String s = new String(Base64.getDecoder().decode(infoDTO.getSql()));
String sql = new SqlparserUtils().handleVariableDefaultValue(s, currentDs.getSqlVariableDetails(), false, isFromDataSet, parameters, isCross, dsMap, pluginManage); String sql = new SqlparserUtils().handleVariableDefaultValue(s, currentDs.getSqlVariableDetails(), false, isFromDataSet, parameters, isCross, dsMap, pluginManage, getUserEntity());
sql = provider.replaceComment(sql); sql = provider.replaceComment(sql);
// add table schema // add table schema
if (isCross) { if (isCross) {
@ -469,22 +490,24 @@ public class DatasetSQLManage {
return tableObj; return tableObj;
} }
private String putObj2Map(Map<Long, DatasourceSchemaDTO> dsMap, DatasetTableDTO ds, boolean isCross) throws Exception { public String putObj2Map(Map<Long, DatasourceSchemaDTO> dsMap, DatasetTableDTO ds, boolean isCross) {
// 通过datasource id校验数据源权限 // 通过datasource id校验数据源权限
// BusiPerCheckDTO dto = new BusiPerCheckDTO(); BusiPerCheckDTO dto = new BusiPerCheckDTO();
// dto.setId(ds.getDatasourceId()); dto.setId(ds.getDatasourceId());
// dto.setAuthEnum(AuthEnum.READ); dto.setAuthEnum(AuthEnum.READ);
// boolean checked = corePermissionManage.checkAuth(dto); boolean checked = corePermissionManage.checkAuth(dto);
// if (!checked) { if (!checked) {
// DEException.throwException(Translator.get("i18n_no_datasource_permission")); DEException.throwException(Translator.get("i18n_no_datasource_permission"));
// } }
String schemaAlias; String schemaAlias;
if (StringUtils.equalsIgnoreCase(ds.getType(), DatasetTableType.DB) || StringUtils.equalsIgnoreCase(ds.getType(), DatasetTableType.SQL)) { if (StringUtils.equalsIgnoreCase(ds.getType(), DatasetTableType.DB) || StringUtils.equalsIgnoreCase(ds.getType(), DatasetTableType.SQL)) {
CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(ds.getDatasourceId()); CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(ds.getDatasourceId());
if (coreDatasource == null) { if (coreDatasource == null) {
DEException.throwException(Translator.get("i18n_dataset_ds_error") + ",ID:" + ds.getDatasourceId()); DEException.throwException(Translator.get("i18n_dataset_ds_error") + ",ID:" + ds.getDatasourceId());
} }
if (StringUtils.equalsIgnoreCase("excel", coreDatasource.getType()) || coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.Excel.name()) || coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
coreDatasource = engineManage.getDeEngine(); coreDatasource = engineManage.getDeEngine();
} }
@ -522,4 +545,20 @@ public class DatasetSQLManage {
} }
return schemaAlias; return schemaAlias;
} }
public void datasetCrossDefault() {
List<DatasetGroupInfoDTO> allList = datasetGroupManage.getAllList();
for (DatasetGroupInfoDTO ele : allList) {
mergeDatasetCrossDefault(ele);
CoreDatasetGroup record = new CoreDatasetGroup();
BeanUtils.copyBean(record, ele);
coreDatasetGroupMapper.updateById(record);
}
}
public void mergeDatasetCrossDefault(DatasetGroupInfoDTO ele) {
Set<Long> allDs = getAllDs(ele.getUnion());
boolean isCross = allDs.size() > 1;
ele.setIsCross(isCross);
}
} }

View File

@ -5,6 +5,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO; import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.dataset.dao.auto.entity.CoreDatasetTableField; import io.gisbi.dataset.dao.auto.entity.CoreDatasetTableField;
import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper; import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper;
import io.gisbi.dataset.utils.DatasetUtils;
import io.gisbi.dataset.utils.TableUtils; import io.gisbi.dataset.utils.TableUtils;
import io.gisbi.engine.constant.ExtFieldConstant; import io.gisbi.engine.constant.ExtFieldConstant;
import io.gisbi.engine.func.FunctionConstant; import io.gisbi.engine.func.FunctionConstant;
@ -41,7 +42,8 @@ import java.util.stream.Collectors;
public class DatasetTableFieldManage { public class DatasetTableFieldManage {
@Resource @Resource
private CoreDatasetTableFieldMapper coreDatasetTableFieldMapper; private CoreDatasetTableFieldMapper coreDatasetTableFieldMapper;
@Resource
private PermissionManage permissionManage;
@Resource @Resource
private DatasetSQLManage datasetSQLManage; private DatasetSQLManage datasetSQLManage;
@Resource @Resource
@ -86,10 +88,10 @@ public class DatasetTableFieldManage {
checkNameLength(datasetTableFieldDTO.getName()); checkNameLength(datasetTableFieldDTO.getName());
CoreDatasetTableField coreDatasetTableField = coreDatasetTableFieldMapper.selectById(datasetTableFieldDTO.getId()); CoreDatasetTableField coreDatasetTableField = coreDatasetTableFieldMapper.selectById(datasetTableFieldDTO.getId());
CoreDatasetTableField record = transDTO2Record(datasetTableFieldDTO); CoreDatasetTableField record = transDTO2Record(datasetTableFieldDTO);
if (ObjectUtils.isEmpty(record.getDataeaseName())) { if (ObjectUtils.isEmpty(record.getGisbiName())) {
String n = TableUtils.fieldNameShort(record.getId() + ""); String n = TableUtils.fieldNameShort(record.getId() + "");
record.setFieldShortName(n); record.setFieldShortName(n);
record.setDataeaseName(n); record.setgisbiName(n);
} }
if (ObjectUtils.isEmpty(coreDatasetTableField)) { if (ObjectUtils.isEmpty(coreDatasetTableField)) {
coreDatasetTableFieldMapper.insert(record); coreDatasetTableFieldMapper.insert(record);
@ -228,7 +230,7 @@ public class DatasetTableFieldManage {
List<DatasetTableFieldDTO> list = transDTO(coreDatasetTableFieldMapper.selectList(wrapper)); List<DatasetTableFieldDTO> list = transDTO(coreDatasetTableFieldMapper.selectList(wrapper));
Map<String, ColumnPermissionItem> desensitizationList = new HashMap<>(); Map<String, ColumnPermissionItem> desensitizationList = new HashMap<>();
// list = permissionManage.filterColumnPermissions(list, desensitizationList, id, null); list = permissionManage.filterColumnPermissions(list, desensitizationList, id, null);
List<DatasetTableFieldDTO> dimensionList = list.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "d")).collect(Collectors.toList()); List<DatasetTableFieldDTO> dimensionList = list.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "d")).collect(Collectors.toList());
List<DatasetTableFieldDTO> quotaList = list.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "q")).collect(Collectors.toList()); List<DatasetTableFieldDTO> quotaList = list.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getGroupType(), "q")).collect(Collectors.toList());
@ -240,43 +242,44 @@ public class DatasetTableFieldManage {
public List<DatasetTableFieldDTO> listFieldsWithPermissions(Long id) { public List<DatasetTableFieldDTO> listFieldsWithPermissions(Long id) {
List<DatasetTableFieldDTO> fields = selectByDatasetGroupId(id); List<DatasetTableFieldDTO> fields = selectByDatasetGroupId(id);
// Map<String, ColumnPermissionItem> desensitizationList = new HashMap<>(); Map<String, ColumnPermissionItem> desensitizationList = new HashMap<>();
// Long userId = AuthUtils.getUser() == null ? null : AuthUtils.getUser().getUserId(); Long userId = AuthUtils.getUser() == null ? null : AuthUtils.getUser().getUserId();
// List<DatasetTableFieldDTO> tmp = permissionManage List<DatasetTableFieldDTO> tmp = permissionManage
// .filterColumnPermissions(fields, desensitizationList, id, userId) .filterColumnPermissions(fields, desensitizationList, id, userId)
// .stream() .stream()
// .sorted(Comparator.comparing(DatasetTableFieldDTO::getGroupType)) .sorted(Comparator.comparing(DatasetTableFieldDTO::getGroupType))
// .toList(); .toList();
// tmp.forEach(ele -> ele.setDesensitized(desensitizationList.containsKey(ele.getDataeaseName()))); tmp.forEach(ele -> ele.setDesensitized(desensitizationList.containsKey(ele.getGisbiName())));
return fields; return tmp;
} }
public List<DatasetTableFieldDTO> listFieldsWithPermissionsRemoveAgg(Long id) { public List<DatasetTableFieldDTO> listFieldsWithPermissionsRemoveAgg(Long id) {
List<DatasetTableFieldDTO> fields = selectByDatasetGroupId(id); List<DatasetTableFieldDTO> fields = selectByDatasetGroupId(id);
// Map<String, ColumnPermissionItem> desensitizationList = new HashMap<>(); Map<String, ColumnPermissionItem> desensitizationList = new HashMap<>();
// Long userId = AuthUtils.getUser() == null ? null : AuthUtils.getUser().getUserId(); Long userId = AuthUtils.getUser() == null ? null : AuthUtils.getUser().getUserId();
// SQLObj tableObj = new SQLObj(); SQLObj tableObj = new SQLObj();
// tableObj.setTableAlias(""); tableObj.setTableAlias("");
// List<DatasetTableFieldDTO> tmp = permissionManage List<DatasetTableFieldDTO> tmp = permissionManage
// .filterColumnPermissions(fields, desensitizationList, id, userId) .filterColumnPermissions(fields, desensitizationList, id, userId)
// .stream() .stream()
// .filter(ele -> { .filter(ele -> {
// boolean flag = true; boolean flag = true;
// if (Objects.equals(ele.getExtField(), ExtFieldConstant.EXT_CALC)) { if (Objects.equals(ele.getExtField(), ExtFieldConstant.EXT_CALC)) {
// String originField = Utils.calcFieldRegex(ele, tableObj, fields, true, null, Utils.mergeParam(Utils.getParams(fields), null), pluginManage); String originField = Utils.calcFieldRegex(ele, tableObj, fields, true, null, Utils.mergeParam(Utils.getParams(fields), null), pluginManage);
// for (String func : FunctionConstant.AGG_FUNC) { for (String func : FunctionConstant.AGG_FUNC) {
// if (Utils.matchFunction(func, originField)) { if (Utils.matchFunction(func, originField)) {
// flag = false; flag = false;
// break; break;
// } }
// } }
// } }
// return flag; return flag;
// }) })
// .sorted(Comparator.comparing(DatasetTableFieldDTO::getGroupType)) .sorted(Comparator.comparing(DatasetTableFieldDTO::getGroupType))
// .toList(); .toList();
// tmp.forEach(ele -> ele.setDesensitized(desensitizationList.containsKey(ele.getDataeaseName()))); tmp.forEach(ele -> ele.setDesensitized(desensitizationList.containsKey(ele.getGisbiName())));
return fields; DatasetUtils.listEncode(tmp);
return tmp;
} }
public DatasetTableFieldDTO transObj(CoreDatasetTableField ele) { public DatasetTableFieldDTO transObj(CoreDatasetTableField ele) {

View File

@ -29,8 +29,10 @@ import java.util.stream.Collectors;
@Service @Service
public class PermissionManage { public class PermissionManage {
@Autowired(required = false) @Autowired(required = false)
private RowPermissionsApi rowPermissionsApi; private RowPermissionsApi rowPermissionsApi;
@Autowired(required = false) @Autowired(required = false)
private ColumnPermissionsApi columnPermissionsApi = null; private ColumnPermissionsApi columnPermissionsApi = null;
@Resource @Resource
@ -71,14 +73,14 @@ public class PermissionManage {
if (CollectionUtils.isNotEmpty(fieldUserColumnPermissionItems)) { if (CollectionUtils.isNotEmpty(fieldUserColumnPermissionItems)) {
if (fieldUserColumnPermissionItems.stream().map(ColumnPermissionItem::getOpt).collect(Collectors.toList()).contains(ColumnPermissionConstants.Desensitization)) { if (fieldUserColumnPermissionItems.stream().map(ColumnPermissionItem::getOpt).collect(Collectors.toList()).contains(ColumnPermissionConstants.Desensitization)) {
desensitizationList.put(field.getDataeaseName(), fieldUserColumnPermissionItems.get(0)); desensitizationList.put(field.getGisbiName(), fieldUserColumnPermissionItems.get(0));
result.add(field); result.add(field);
} }
return; return;
} }
if (CollectionUtils.isNotEmpty(fieldRoleColumnPermissionItems)) { if (CollectionUtils.isNotEmpty(fieldRoleColumnPermissionItems)) {
if (fieldRoleColumnPermissionItems.stream().map(ColumnPermissionItem::getOpt).collect(Collectors.toList()).contains(ColumnPermissionConstants.Desensitization)) { if (fieldRoleColumnPermissionItems.stream().map(ColumnPermissionItem::getOpt).collect(Collectors.toList()).contains(ColumnPermissionConstants.Desensitization)) {
desensitizationList.put(field.getDataeaseName(), fieldRoleColumnPermissionItems.get(0)); desensitizationList.put(field.getGisbiName(), fieldRoleColumnPermissionItems.get(0));
result.add(field); result.add(field);
} }
return; return;

View File

@ -1,21 +1,15 @@
package io.gisbi.dataset.server; package io.gisbi.dataset.server;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.gisbi.api.dataset.DatasetDataApi; import io.gisbi.api.dataset.DatasetDataApi;
import io.gisbi.api.dataset.dto.BaseTreeNodeDTO; import io.gisbi.api.dataset.dto.*;
import io.gisbi.api.dataset.dto.EnumValueRequest;
import io.gisbi.api.dataset.dto.MultFieldValuesRequest;
import io.gisbi.api.dataset.dto.PreviewSqlDTO;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO; import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.api.dataset.dto.EnumObj;
import io.gisbi.dataset.dao.auto.entity.CoreDatasetTable;
import io.gisbi.dataset.dao.auto.entity.CoreDatasetTableField;
import io.gisbi.dataset.manage.DatasetDataManage; import io.gisbi.dataset.manage.DatasetDataManage;
import io.gisbi.extensions.datasource.dto.DatasetTableDTO; import io.gisbi.extensions.datasource.dto.DatasetTableDTO;
import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO; import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO;
import io.gisbi.utils.LogUtil; import io.gisbi.utils.LogUtil;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -31,10 +25,9 @@ public class DatasetDataServer implements DatasetDataApi {
@Override @Override
public Map<String, Object> previewData(DatasetGroupInfoDTO datasetGroupInfoDTO) throws Exception { public Map<String, Object> previewData(DatasetGroupInfoDTO datasetGroupInfoDTO) throws Exception {
return datasetDataManage.previewDataWithLimit(datasetGroupInfoDTO, 0, 100, false); return datasetDataManage.previewDataWithLimit(datasetGroupInfoDTO, 0, 100, false, true);
} }
@Override @Override
public List<DatasetTableFieldDTO> tableField(DatasetTableDTO datasetTableDTO) throws Exception { public List<DatasetTableFieldDTO> tableField(DatasetTableDTO datasetTableDTO) throws Exception {
return datasetDataManage.getTableFields(datasetTableDTO); return datasetDataManage.getTableFields(datasetTableDTO);
@ -103,62 +96,4 @@ public class DatasetDataServer implements DatasetDataApi {
return null; return null;
} }
} }
// @GetMapping("getTablesByAppId")
// public List<Map<String,Object>> getTablesByAppId(String appid) throws Exception {
// List<Map<String,Object>> result = datasetDataManage.getTablesByAppId(appid);
// return result;
// }
@GetMapping("getTablesByAppId")
public List<Map<String,Object>> getTablesByAppId(String appid) throws Exception {
List<Map<String,Object>> result = datasetDataManage.getTablesByAppId(appid);
return result;
}
@GetMapping("getFieldsByTableId")
public Map<String, Object> getFieldsByTableId(Long datasourceId,String tablename) throws Exception {
Map<String, Object> result = datasetDataManage.getFieldsByTableId(datasourceId,tablename);
return result;
}
@PostMapping("addTableData")
public boolean addTableData(Long datasourceId, @RequestParam("tableData") String tableData) throws Exception {
boolean result = datasetDataManage.addTableData(
datasourceId,
tableData
);
return result;
}
@PostMapping("getTableDataByPk")
public Map<String, Object> getTableDataByPk(Long datasourceId,@RequestParam("whereJson") String whereJson) throws Exception {
Map<String, Object> result=datasetDataManage.getTableDataByPk(
datasourceId,
whereJson
);
return result;
}
@PostMapping("updateTableData")
public boolean updateTableData(Long datasourceId, @RequestParam("tableData") String tableData) throws Exception {
boolean result = datasetDataManage.updateTableData(
datasourceId,
tableData
);
return result;
}
@PostMapping("deleteTableData")
public boolean deleteTableData(Long datasourceId, @RequestParam("whereJson") String whereJson) throws Exception {
boolean result = datasetDataManage.deleteTableData(
datasourceId,
whereJson
);
return result;
}
@PostMapping("queryTableDataPaged")
public Page<Map<String, Object>> queryTableDataPaged(Long datasourceId, @RequestParam("queryJson") String queryJson) throws Exception {
Page<Map<String, Object>> result = datasetDataManage.queryTableDataPaged(
datasourceId,
queryJson
);
return result;
}
} }

View File

@ -6,6 +6,7 @@ import io.gisbi.api.dataset.engine.SQLFunctionDTO;
import io.gisbi.api.dataset.engine.SQLFunctionsEnum; import io.gisbi.api.dataset.engine.SQLFunctionsEnum;
import io.gisbi.dataset.manage.DatasetDataManage; import io.gisbi.dataset.manage.DatasetDataManage;
import io.gisbi.dataset.manage.DatasetTableFieldManage; import io.gisbi.dataset.manage.DatasetTableFieldManage;
import io.gisbi.dataset.utils.DatasetUtils;
import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO; import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
@ -40,7 +41,9 @@ public class DatasetFieldServer implements DatasetTableApi {
@Override @Override
public List<DatasetTableFieldDTO> listByDatasetGroup(Long id) { public List<DatasetTableFieldDTO> listByDatasetGroup(Long id) {
return datasetTableFieldManage.selectByDatasetGroupId(id); List<DatasetTableFieldDTO> datasetTableFieldDTOS = datasetTableFieldManage.selectByDatasetGroupId(id);
DatasetUtils.listEncode(datasetTableFieldDTOS);
return datasetTableFieldDTOS;
} }
@Override @Override

View File

@ -1,5 +1,6 @@
package io.gisbi.dataset.server; package io.gisbi.dataset.server;
import io.gisbi.api.dataset.DatasetTreeApi; import io.gisbi.api.dataset.DatasetTreeApi;
import io.gisbi.api.dataset.dto.DataSetExportRequest; import io.gisbi.api.dataset.dto.DataSetExportRequest;
import io.gisbi.api.dataset.dto.DatasetNodeDTO; import io.gisbi.api.dataset.dto.DatasetNodeDTO;
@ -8,17 +9,21 @@ import io.gisbi.api.dataset.vo.DataSetBarVO;
import io.gisbi.constant.LogOT; import io.gisbi.constant.LogOT;
import io.gisbi.constant.LogST; import io.gisbi.constant.LogST;
import io.gisbi.dataset.manage.DatasetGroupManage; import io.gisbi.dataset.manage.DatasetGroupManage;
import io.gisbi.exportCenter.manage.ExportCenterDownLoadManage;
import io.gisbi.exportCenter.manage.ExportCenterManage; import io.gisbi.exportCenter.manage.ExportCenterManage;
import io.gisbi.extensions.datasource.dto.DatasetTableDTO; import io.gisbi.extensions.datasource.dto.DatasetTableDTO;
import io.gisbi.extensions.view.dto.SqlVariableDetails; import io.gisbi.extensions.view.dto.*;
import io.gisbi.log.DeLog; import io.gisbi.log.DeLog;
import io.gisbi.model.BusiNodeRequest; import io.gisbi.model.BusiNodeRequest;
import io.gisbi.model.BusiNodeVO; import io.gisbi.model.BusiNodeVO;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.*;
@RestController @RestController
@RequestMapping("datasetTree") @RequestMapping("datasetTree")
@ -27,24 +32,26 @@ public class DatasetTreeServer implements DatasetTreeApi {
private DatasetGroupManage datasetGroupManage; private DatasetGroupManage datasetGroupManage;
@Resource @Resource
private ExportCenterManage exportCenterManage; private ExportCenterManage exportCenterManage;
@Resource
private ExportCenterDownLoadManage exportCenterDownLoadManage;
@DeLog(id = "#p0.id", ot = LogOT.MODIFY, st = LogST.DATASET) @DeLog(id = "#p0.id", ot = LogOT.MODIFY, st = LogST.DATASET)
@Override @Override
public DatasetGroupInfoDTO save(DatasetGroupInfoDTO datasetNodeDTO) throws Exception { public DatasetGroupInfoDTO save(DatasetGroupInfoDTO datasetNodeDTO) throws Exception {
return datasetGroupManage.save(datasetNodeDTO, false); return datasetGroupManage.save(datasetNodeDTO, false, true);
} }
@DeLog(id = "#p0.id", ot = LogOT.MODIFY, st = LogST.DATASET) @DeLog(id = "#p0.id", ot = LogOT.MODIFY, st = LogST.DATASET)
@Override @Override
public DatasetNodeDTO rename(DatasetGroupInfoDTO dto) throws Exception { public DatasetNodeDTO rename(DatasetGroupInfoDTO dto) throws Exception {
return datasetGroupManage.save(dto, true); return datasetGroupManage.save(dto, true, false);
} }
@DeLog(id = "#p0.id", pid = "#p0.pid", ot = LogOT.CREATE, st = LogST.DATASET) @DeLog(id = "#p0.id", pid = "#p0.pid", ot = LogOT.CREATE, st = LogST.DATASET)
@Override @Override
public DatasetNodeDTO create(DatasetGroupInfoDTO dto) throws Exception { public DatasetNodeDTO create(DatasetGroupInfoDTO dto) throws Exception {
return datasetGroupManage.save(dto, false); return datasetGroupManage.save(dto, false, true);
} }
@DeLog(id = "#p0.id", ot = LogOT.MODIFY, st = LogST.DATASET) @DeLog(id = "#p0.id", ot = LogOT.MODIFY, st = LogST.DATASET)
@ -100,8 +107,12 @@ public class DatasetTreeServer implements DatasetTreeApi {
} }
@Override @Override
public void exportDataset(DataSetExportRequest request) throws Exception { public void exportDataset(DataSetExportRequest request, HttpServletResponse response) throws Exception {
if (request.isGisbiBi()) {
exportCenterDownLoadManage.downloadDataset(request, response);
} else {
exportCenterManage.addTask(request.getId(), "dataset", request); exportCenterManage.addTask(request.getId(), "dataset", request);
} }
}
} }

View File

@ -1,15 +1,16 @@
package io.gisbi.dataset.utils; package io.gisbi.dataset.utils;
import io.gisbi.api.dataset.dto.BaseTreeNodeDTO; import io.gisbi.api.dataset.dto.BaseTreeNodeDTO;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.engine.constant.ExtFieldConstant;
import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO;
import io.gisbi.extensions.view.dto.ChartViewDTO;
import io.gisbi.utils.TreeUtils; import io.gisbi.utils.TreeUtils;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -53,4 +54,94 @@ public class DatasetUtils {
}); });
return result; return result;
} }
public static String getEncode(String str) {
return Base64.getEncoder().encodeToString(str.getBytes());
}
public static String getDecode(String str) {
return new String(Base64.getDecoder().decode(str));
}
/**
* 计算字段表达式base64加密
*
* @param obj
*/
public static void dsEncode(DatasetGroupInfoDTO obj) {
for (DatasetTableFieldDTO dto : obj.getAllFields()) {
if (dto.getExtField().equals(ExtFieldConstant.EXT_CALC)) {
dto.setOriginName(getEncode(dto.getOriginName()));
}
}
}
/**
* 计算字段表达式base64解密
*
* @param obj
*/
public static void dsDecode(DatasetGroupInfoDTO obj) {
for (DatasetTableFieldDTO dto : obj.getAllFields()) {
if (dto.getExtField().equals(ExtFieldConstant.EXT_CALC)) {
dto.setOriginName(getDecode(dto.getOriginName()));
}
}
}
/**
* 计算字段表达式base64加密
*
* @param fields
*/
public static void listEncode(List<? extends DatasetTableFieldDTO> fields) {
if (CollectionUtils.isEmpty(fields)) {
return;
}
for (DatasetTableFieldDTO dto : fields) {
if (dto.getExtField().equals(ExtFieldConstant.EXT_CALC)) {
dto.setOriginName(getEncode(dto.getOriginName()));
}
}
}
/**
* 计算字段表达式base64解密
*
* @param fields
*/
public static void listDecode(List<? extends DatasetTableFieldDTO> fields) {
if (CollectionUtils.isEmpty(fields)) {
return;
}
for (DatasetTableFieldDTO dto : fields) {
if (dto.getExtField().equals(ExtFieldConstant.EXT_CALC)) {
dto.setOriginName(getDecode(dto.getOriginName()));
}
}
}
public static void viewDecode(ChartViewDTO view) {
DatasetUtils.listDecode(view.getXAxis());
DatasetUtils.listDecode(view.getXAxisExt());
DatasetUtils.listDecode(view.getYAxis());
DatasetUtils.listDecode(view.getYAxisExt());
DatasetUtils.listDecode(view.getExtStack());
DatasetUtils.listDecode(view.getExtBubble());
DatasetUtils.listDecode(view.getExtLabel());
DatasetUtils.listDecode(view.getExtTooltip());
DatasetUtils.listDecode(view.getExtColor());
}
public static void viewEncode(ChartViewDTO view) {
DatasetUtils.listEncode(view.getXAxis());
DatasetUtils.listEncode(view.getXAxisExt());
DatasetUtils.listEncode(view.getYAxis());
DatasetUtils.listEncode(view.getYAxisExt());
DatasetUtils.listEncode(view.getExtStack());
DatasetUtils.listEncode(view.getExtBubble());
DatasetUtils.listEncode(view.getExtLabel());
DatasetUtils.listEncode(view.getExtTooltip());
DatasetUtils.listEncode(view.getExtColor());
}
} }

View File

@ -6,11 +6,14 @@ import io.gisbi.commons.constants.OptConstants;
import io.gisbi.commons.constants.TaskStatus; import io.gisbi.commons.constants.TaskStatus;
import io.gisbi.constant.DataSourceType; import io.gisbi.constant.DataSourceType;
import io.gisbi.datasource.dao.auto.entity.CoreDatasource; import io.gisbi.datasource.dao.auto.entity.CoreDatasource;
import io.gisbi.datasource.dao.auto.mapper.CoreDatasourceMapper;
import io.gisbi.datasource.dao.ext.mapper.CoreDatasourceExtMapper; import io.gisbi.datasource.dao.ext.mapper.CoreDatasourceExtMapper;
import io.gisbi.datasource.dao.ext.mapper.DataSourceExtMapper;
import io.gisbi.datasource.dao.ext.po.DataSourceNodePO; import io.gisbi.datasource.dao.ext.po.DataSourceNodePO;
import io.gisbi.datasource.dao.ext.po.DsItem; import io.gisbi.datasource.dao.ext.po.DsItem;
import io.gisbi.datasource.dto.DatasourceNodeBO; import io.gisbi.datasource.dto.DatasourceNodeBO;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.extensions.datasource.api.PluginManageApi;
import io.gisbi.extensions.datasource.dto.DatasourceDTO; import io.gisbi.extensions.datasource.dto.DatasourceDTO;
import io.gisbi.i18n.Translator; import io.gisbi.i18n.Translator;
import io.gisbi.model.BusiNodeRequest; import io.gisbi.model.BusiNodeRequest;
@ -24,23 +27,34 @@ import jakarta.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import io.gisbi.datasource.dao.ext.mapper.DataSourceExtMapper;
import io.gisbi.datasource.dao.auto.mapper.CoreDatasourceMapper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Stack; import java.util.Stack;
@Component @Component
public class DataSourceManage { public class DataSourceManage {
@Resource @Resource
private DataSourceExtMapper dataSourceExtMapper; private DataSourceExtMapper dataSourceExtMapper;
@Resource @Resource
private CoreDatasourceMapper coreDatasourceMapper; private CoreDatasourceMapper coreDatasourceMapper;
@Resource
private CoreDatasourceExtMapper coreDatasourceExtMapper;
@Resource @Resource
private CoreOptRecentManage coreOptRecentManage; private CoreOptRecentManage coreOptRecentManage;
@Resource
private CoreDatasourceExtMapper coreDatasourceExtMapper;
@Resource
private EngineManage engineManage;
@Autowired(required = false)
private PluginManageApi pluginManage;
private DatasourceNodeBO rootNode(String appId) { private DatasourceNodeBO rootNode(String appId) {
return new DatasourceNodeBO(0L,appId, "root", false, 7, -1L, 0, "mysql"); return new DatasourceNodeBO(0L,appId, "root", false, 7, -1L, 0, "mysql");
} }
@ -178,9 +192,9 @@ public class DataSourceManage {
public CoreDatasource getCoreDatasource(Long id) { public CoreDatasource getCoreDatasource(Long id) {
// if (id == -1L) { if (id == -1L) {
// return engineManage.getDeEngine(); return engineManage.getDeEngine();
// } }
return coreDatasourceMapper.selectById(id); return coreDatasourceMapper.selectById(id);
} }

View File

@ -127,7 +127,11 @@ public class DatasourceSyncManage {
record.setQrtzInstance(context.getFireInstanceId()); record.setQrtzInstance(context.getFireInstanceId());
datasourceMapper.update(record, updateWrapper); datasourceMapper.update(record, updateWrapper);
} }
if (coreDatasource.getType().equalsIgnoreCase("ExcelRemote")) {
extractedExcelData(taskId, coreDatasource, updateType, coreDatasourceTask.getSyncRate());
} else {
extractedData(taskId, coreDatasource, updateType, coreDatasourceTask.getSyncRate()); extractedData(taskId, coreDatasource, updateType, coreDatasourceTask.getSyncRate());
}
} catch (Exception e) { } catch (Exception e) {
LogUtil.error(e); LogUtil.error(e);
} finally { } finally {
@ -173,6 +177,46 @@ public class DatasourceSyncManage {
} }
} }
public void extractedExcelData(Long taskId, CoreDatasource coreDatasource, DatasourceServer.UpdateType updateType, String scheduleType) {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource));
List<DatasetTableDTO> tables = ExcelUtils.getTables(datasourceRequest);
for (DatasetTableDTO tableDTO : tables) {
CoreDatasourceTaskLog datasetTableTaskLog = datasourceTaskServer.initTaskLog(coreDatasource.getId(), taskId, tableDTO.getTableName(), scheduleType);
datasourceRequest.setTable(tableDTO.getTableName());
ExcelUtils.getTableFields(datasourceRequest);
List<TableField> tableFields = ExcelUtils.getTableFields(datasourceRequest);
try {
datasetTableTaskLog.setInfo(datasetTableTaskLog.getInfo() + "/n Begin to sync datatable: " + datasourceRequest.getTable());
createEngineTable(datasourceRequest.getTable(), tableFields);
if (updateType.equals(DatasourceServer.UpdateType.all_scope)) {
createEngineTable(TableUtils.tmpName(datasourceRequest.getTable()), tableFields);
}
extractExcelData(datasourceRequest, updateType, tableFields);
if (updateType.equals(DatasourceServer.UpdateType.all_scope)) {
replaceTable(datasourceRequest.getTable());
}
datasetTableTaskLog.setInfo(datasetTableTaskLog.getInfo() + "/n End to sync datatable: " + datasourceRequest.getTable());
datasetTableTaskLog.setTaskStatus(TaskStatus.Completed.toString());
datasetTableTaskLog.setEndTime(System.currentTimeMillis());
} catch (Exception e) {
try {
if (updateType.equals(DatasourceServer.UpdateType.all_scope)) {
dropEngineTable(TableUtils.tmpName(datasourceRequest.getTable()));
}
} catch (Exception ignore) {
}
datasetTableTaskLog.setInfo(datasetTableTaskLog.getInfo() + "/n Failed to sync datatable: " + datasourceRequest.getTable() + ", " + e.getMessage());
datasetTableTaskLog.setTaskStatus(TaskStatus.Error.toString());
datasetTableTaskLog.setEndTime(System.currentTimeMillis());
e.printStackTrace();
} finally {
datasourceTaskServer.saveLog(datasetTableTaskLog);
}
}
}
private void updateDsTaskStatus(Long datasourceId) { private void updateDsTaskStatus(Long datasourceId) {
UpdateWrapper<CoreDatasource> updateWrapper = new UpdateWrapper<>(); UpdateWrapper<CoreDatasource> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", datasourceId); updateWrapper.eq("id", datasourceId);

View File

@ -12,6 +12,8 @@ import io.gisbi.extensions.datasource.dto.DatasourceDTO;
import io.gisbi.extensions.datasource.dto.DatasourceRequest; import io.gisbi.extensions.datasource.dto.DatasourceRequest;
import io.gisbi.extensions.datasource.factory.ProviderFactory; import io.gisbi.extensions.datasource.factory.ProviderFactory;
import io.gisbi.result.ResultMessage; import io.gisbi.result.ResultMessage;
import io.gisbi.template.dao.auto.entity.DeTemplateVersion;
import io.gisbi.template.dao.auto.mapper.DeTemplateVersionMapper;
import io.gisbi.utils.BeanUtils; import io.gisbi.utils.BeanUtils;
import io.gisbi.utils.JsonUtil; import io.gisbi.utils.JsonUtil;
import io.gisbi.utils.ModelUtils; import io.gisbi.utils.ModelUtils;
@ -23,6 +25,8 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -40,9 +44,12 @@ public class EngineManage {
@Resource @Resource
private CoreDatasourceMapper datasourceMapper; private CoreDatasourceMapper datasourceMapper;
@Value("${gisbi.path.engine:jdbc:h2:/opt/gisbi/desktop_data;AUTO_SERVER=TRUE;AUTO_RECONNECT=TRUE;MODE=MySQL;CASE_INSENSITIVE_IDENTIFIERS=TRUE;DATABASE_TO_UPPER=FALSE}") @Value("${gisbi.path.engine:jdbc:h2:/opt/gisbi2.0/desktop_data;AUTO_SERVER=TRUE;AUTO_RECONNECT=TRUE;MODE=MySQL;CASE_INSENSITIVE_IDENTIFIERS=TRUE;DATABASE_TO_UPPER=FALSE}")
private String engineUrl; private String engineUrl;
@Resource
private DeTemplateVersionMapper deTemplateVersionMapper;
public CoreDeEngine info() throws DEException { public CoreDeEngine info() throws DEException {
List<CoreDeEngine> deEngines = deEngineMapper.selectList(null); List<CoreDeEngine> deEngines = deEngineMapper.selectList(null);
@ -163,7 +170,10 @@ public class EngineManage {
QueryWrapper<CoreDatasource> queryWrapper = new QueryWrapper<>(); QueryWrapper<CoreDatasource> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", 985188400292302848L); queryWrapper.eq("id", 985188400292302848L);
queryWrapper.ne("create_time", 1715053684176L); queryWrapper.ne("create_time", 1715053684176L);
if (!datasourceMapper.exists(queryWrapper) && !ModelUtils.isDesktop()) { // 版本检查
QueryWrapper<DeTemplateVersion> queryVersionWrapper = new QueryWrapper<>();
queryVersionWrapper.eq("version", "985188400292302848");
if (!datasourceMapper.exists(queryWrapper) && !deTemplateVersionMapper.exists(queryVersionWrapper) && !ModelUtils.isDesktop()) {
Pattern WITH_SQL_FRAGMENT = Pattern.compile("jdbc:mysql://(.*):(\\d+)/(.*)\\?(.*)"); Pattern WITH_SQL_FRAGMENT = Pattern.compile("jdbc:mysql://(.*):(\\d+)/(.*)\\?(.*)");
Matcher matcher = WITH_SQL_FRAGMENT.matcher(env.getProperty("spring.datasource.url")); Matcher matcher = WITH_SQL_FRAGMENT.matcher(env.getProperty("spring.datasource.url"));
if (!matcher.find()) { if (!matcher.find()) {
@ -191,6 +201,13 @@ public class EngineManage {
initDatasource.setTaskStatus("WaitingForExecution"); initDatasource.setTaskStatus("WaitingForExecution");
datasourceMapper.deleteById(985188400292302848L); datasourceMapper.deleteById(985188400292302848L);
datasourceMapper.insert(initDatasource); datasourceMapper.insert(initDatasource);
DeTemplateVersion version = new DeTemplateVersion();
version.setVersion("985188400292302848");
version.setScript("Demo");
version.setInstalledOn(LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES));
version.setSuccess(true);
deTemplateVersionMapper.insert(version);
} }
} }

View File

@ -5,7 +5,9 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Option;
import io.gisbi.extensions.datasource.dto.ApiDefinition; import io.gisbi.extensions.datasource.dto.ApiDefinition;
import io.gisbi.extensions.datasource.dto.ApiDefinitionRequest; import io.gisbi.extensions.datasource.dto.ApiDefinitionRequest;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
@ -26,7 +28,9 @@ import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class ApiUtils { public class ApiUtils {
private static Configuration jsonPathConf = Configuration.builder()
.options(Option.DEFAULT_PATH_LEAF_TO_NULL, Option.ALWAYS_RETURN_LIST)
.build();
private static String path = "['%s']"; private static String path = "['%s']";
public static ObjectMapper objectMapper = CommonBeanFactory.getBean(ObjectMapper.class); public static ObjectMapper objectMapper = CommonBeanFactory.getBean(ObjectMapper.class);
@ -35,32 +39,18 @@ public class ApiUtils {
private static TypeReference<List<Map<String, Object>>> listForMapTypeReference = new TypeReference<List<Map<String, Object>>>() { private static TypeReference<List<Map<String, Object>>> listForMapTypeReference = new TypeReference<List<Map<String, Object>>>() {
}; };
/**
* 从数据源配置中解析并获取API数据表信息列表
*
* @param datasourceRequest 数据源请求对象包含数据源配置信息
* @return 数据集表DTO列表包含表名称显示名称及所属数据源ID
* @throws DEException 当数据处理过程中出现异常时抛出
*/
public static List<DatasetTableDTO> getApiTables(DatasourceRequest datasourceRequest) throws DEException { public static List<DatasetTableDTO> getApiTables(DatasourceRequest datasourceRequest) throws DEException {
List<DatasetTableDTO> tableDescs = new ArrayList<>(); List<DatasetTableDTO> tableDescs = new ArrayList<>();
// 定义API配置的反序列化类型引用
TypeReference<List<ApiDefinition>> listTypeReference = new TypeReference<List<ApiDefinition>>() { TypeReference<List<ApiDefinition>> listTypeReference = new TypeReference<List<ApiDefinition>>() {
}; };
// 从数据源配置中解析API定义列表
List<ApiDefinition> apiDefinitionList = JsonUtil.parseList(datasourceRequest.getDatasource().getConfiguration(), listTypeReference); List<ApiDefinition> apiDefinitionList = JsonUtil.parseList(datasourceRequest.getDatasource().getConfiguration(), listTypeReference);
for (ApiDefinition apiDefinition : apiDefinitionList) { for (ApiDefinition apiDefinition : apiDefinitionList) {
// 过滤空对象和参数类型配置
if (apiDefinition == null) { if (apiDefinition == null) {
continue; continue;
} }
if (StringUtils.isNotEmpty(apiDefinition.getType()) && apiDefinition.getType().equalsIgnoreCase("params")) { if (StringUtils.isNotEmpty(apiDefinition.getType()) && apiDefinition.getType().equalsIgnoreCase("params")) {
continue; continue;
} }
// 构建数据集表信息对象
DatasetTableDTO datasetTableDTO = new DatasetTableDTO(); DatasetTableDTO datasetTableDTO = new DatasetTableDTO();
datasetTableDTO.setTableName(apiDefinition.getDeTableName()); datasetTableDTO.setTableName(apiDefinition.getDeTableName());
datasetTableDTO.setName(apiDefinition.getName()); datasetTableDTO.setName(apiDefinition.getName());
@ -70,25 +60,14 @@ public class ApiUtils {
return tableDescs; return tableDescs;
} }
/**
* 将JSON配置字符串解析为表名映射关系
*
* @param configration 输入的JSON配置字符串应包含包含"name""deTableName"字段的数组对象
* @return 返回键值对映射key为配置中的name字段值value为对应的deTableName字段值
* @throws DEException 当JSON解析失败时抛出异常
*/
public static Map<String, String> getTableNamesMap(String configration) throws DEException { public static Map<String, String> getTableNamesMap(String configration) throws DEException {
Map<String, String> result = new HashMap<>(); Map<String, String> result = new HashMap<>();
try { try {
// 解析JSON根节点并遍历数组元素
JsonNode rootNode = objectMapper.readTree(configration); JsonNode rootNode = objectMapper.readTree(configration);
for (int i = 0; i < rootNode.size(); i++) { for (int i = 0; i < rootNode.size(); i++) {
// 提取每个元素的name和deTableName字段构建映射关系
result.put(rootNode.get(i).get("name").asText(), rootNode.get(i).get("deTableName").asText()); result.put(rootNode.get(i).get("name").asText(), rootNode.get(i).get("deTableName").asText());
} }
} catch (Exception e) { } catch (Exception e) {
// 统一将底层异常转换为领域异常抛出
DEException.throwException(e); DEException.throwException(e);
} }
@ -96,7 +75,6 @@ public class ApiUtils {
} }
public static Map<String, Object> fetchApiResultField(DatasourceRequest datasourceRequest) throws DEException { public static Map<String, Object> fetchApiResultField(DatasourceRequest datasourceRequest) throws DEException {
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
List<String[]> dataList = new ArrayList<>(); List<String[]> dataList = new ArrayList<>();
@ -468,23 +446,34 @@ public class ApiUtils {
return response; return response;
} }
private static void previewNum(List<Map<String, Object>> field) { private static void previewNum(List<Map<String, Object>> fields, String response) {
for (Map<String, Object> stringObjectMap : field) { int previewNum = 100;
for (Map<String, Object> field : fields) {
JSONArray newArray = new JSONArray(); JSONArray newArray = new JSONArray();
if (stringObjectMap.get("value") != null) { if (field.get("value") != null) {
try { Object object = JsonPath.using(jsonPathConf).parse(response).read(field.get("jsonPath").toString());
TypeReference<JSONArray> listTypeReference = new TypeReference<JSONArray>() { int i = 0;
}; if (object instanceof List) {
JSONArray array = objectMapper.readValue(stringObjectMap.get("value").toString(), listTypeReference); for (Object o : (List<String>) object) {
if (array.size() > 100) { if (Objects.isNull(o)) {
for (int i = 0; i < Math.min(100, array.size()); i++) { newArray.add("");
newArray.add(array.get(i)); } else {
newArray.add(o.toString());
} }
stringObjectMap.put("value", newArray); i++;
if (i >= previewNum) {
break;
} }
} catch (Exception e) {
} }
} else {
if (object != null) {
newArray.add(object.toString());
}
}
field.put("value", newArray);
} else {
List<Map<String, Object>> childrenFields = (List<Map<String, Object>>) field.get("children");
previewNum(childrenFields, response);
} }
} }
} }
@ -527,7 +516,7 @@ public class ApiUtils {
rootPath = "$"; rootPath = "$";
handleStr(apiDefinition, response, fields, rootPath); handleStr(apiDefinition, response, fields, rootPath);
} }
previewNum(fields); previewNum(fields, response);
apiDefinition.setJsonFields(fields); apiDefinition.setJsonFields(fields);
return apiDefinition; return apiDefinition;
} else { } else {
@ -574,7 +563,6 @@ public class ApiUtils {
}; };
array = objectMapper.readValue(field.get("value").toString(), listTypeReference); array = objectMapper.readValue(field.get("value").toString(), listTypeReference);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
DEException.throwException(e); DEException.throwException(e);
} }
array.add(Optional.ofNullable(data.get(field.get("originName"))).orElse("").toString().replaceAll("\n", " ").replaceAll("\r", " ")); array.add(Optional.ofNullable(data.get(field.get("originName"))).orElse("").toString().replaceAll("\n", " ").replaceAll("\r", " "));
@ -745,6 +733,7 @@ public class ApiUtils {
fieldChildren.add(itemChild); fieldChildren.add(itemChild);
} }
} }
field.put("children", fieldChildren);
} }
} }
@ -807,9 +796,15 @@ public class ApiUtils {
List<List<String>> columnDataList = new ArrayList<>(); List<List<String>> columnDataList = new ArrayList<>();
for (int i = 0; i < jsonPaths.size(); i++) { for (int i = 0; i < jsonPaths.size(); i++) {
List<String> data = new ArrayList<>(); List<String> data = new ArrayList<>();
Object object = JsonPath.read(result, jsonPaths.get(i)); Object object = JsonPath.using(jsonPathConf).parse(result).read(jsonPaths.get(i));
if (object instanceof List && jsonPaths.get(i).contains("[*]")) { if (object instanceof List) {
data = (List<String>) object; for (Object o : (List<String>) object) {
if (Objects.isNull(o)) {
data.add("");
} else {
data.add(o.toString());
}
}
} else { } else {
if (object != null) { if (object != null) {
data.add(object.toString()); data.add(object.toString());

View File

@ -2,6 +2,7 @@ package io.gisbi.datasource.provider;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jcraft.jsch.Session; import com.jcraft.jsch.Session;
import io.gisbi.constant.SQLConstants;
import io.gisbi.dataset.utils.FieldUtils; import io.gisbi.dataset.utils.FieldUtils;
import io.gisbi.datasource.dao.auto.entity.CoreDatasource; import io.gisbi.datasource.dao.auto.entity.CoreDatasource;
import io.gisbi.datasource.dao.auto.entity.CoreDriver; import io.gisbi.datasource.dao.auto.entity.CoreDriver;
@ -9,7 +10,6 @@ import io.gisbi.datasource.dao.auto.mapper.CoreDatasourceMapper;
import io.gisbi.datasource.manage.EngineManage; import io.gisbi.datasource.manage.EngineManage;
import io.gisbi.datasource.request.EngineRequest; import io.gisbi.datasource.request.EngineRequest;
import io.gisbi.datasource.type.*; import io.gisbi.datasource.type.*;
import io.gisbi.constant.SQLConstants;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.extensions.datasource.dto.*; import io.gisbi.extensions.datasource.dto.*;
import io.gisbi.extensions.datasource.provider.DriverShim; import io.gisbi.extensions.datasource.provider.DriverShim;
@ -31,12 +31,15 @@ import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.parser.SqlParser; import org.apache.calcite.sql.parser.SqlParser;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.net.URL; import java.net.URL;
import java.sql.*; import java.sql.*;
@ -55,9 +58,9 @@ public class CalciteProvider extends Provider {
private EngineManage engineManage; private EngineManage engineManage;
protected ExtendedJdbcClassLoader extendedJdbcClassLoader; protected ExtendedJdbcClassLoader extendedJdbcClassLoader;
private Map<Long, ExtendedJdbcClassLoader> customJdbcClassLoaders = new HashMap<>(); private Map<Long, ExtendedJdbcClassLoader> customJdbcClassLoaders = new HashMap<>();
@Value("${gisbi.path.driver:/opt/gisbi/drivers}") @Value("${gisbi.path.driver:/opt/gisbi2.0/drivers}")
private String FILE_PATH; private String FILE_PATH;
@Value("${gisbi.path.custom-drivers:/opt/gisbi/custom-drivers/}") @Value("${gisbi.path.custom-drivers:/opt/gisbi2.0/custom-drivers/}")
private String CUSTOM_PATH; private String CUSTOM_PATH;
private static String split = "DE"; private static String split = "DE";
@ -155,7 +158,7 @@ public class CalciteProvider extends Provider {
@Override @Override
public Map<String, Object> fetchResultField(DatasourceRequest datasourceRequest) throws DEException { public Map<String, Object> fetchResultField(DatasourceRequest datasourceRequest) throws DEException {
// 不跨数据源 // 不跨数据源
if (datasourceRequest.getDsList().size() == 1) { if (datasourceRequest.getIsCross() == null || !datasourceRequest.getIsCross()) {
return jdbcFetchResultField(datasourceRequest); return jdbcFetchResultField(datasourceRequest);
} }
@ -240,8 +243,65 @@ public class CalciteProvider extends Provider {
return fieldList; return fieldList;
} }
private Map<String, Integer> getTableTypeMap(DatasourceRequest datasourceRequest, DatasourceConfiguration datasourceConfiguration, String tableName) throws DEException {
Map<String, Integer> map = new HashMap<>();
String schemaTable = (ObjectUtils.isNotEmpty(datasourceConfiguration.getSchema()) ? (datasourceConfiguration.getSchema() + "`.`") : "") + tableName;
String sql = "SELECT * FROM `$TABLE_NAME$` LIMIT 0 OFFSET 0".replace("$TABLE_NAME$", schemaTable);
sql = transSqlDialect(sql, datasourceRequest.getDsList());
ResultSet resultSet = null;
try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId()); Statement statement = getStatement(con, 30)) {
resultSet = statement.executeQuery(sql);
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
for (int j = 0; j < columnCount; j++) {
String name = StringUtils.lowerCase(metaData.getColumnName(j + 1));
Integer type = metaData.getColumnType(j + 1);
map.put(name, type);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return map;
}
@Override @Override
public List<TableField> fetchTableField(DatasourceRequest datasourceRequest) throws DEException { public List<TableField> fetchTableField(DatasourceRequest datasourceRequest) throws DEException {
if (datasourceRequest.getIsCross() != null && datasourceRequest.getIsCross()) {
List<TableField> datasetTableFields = new ArrayList<>();
PreparedStatement statement = null;
ResultSet resultSet = null;
Connection connection = take();
try {
CalciteConnection calciteConnection = connection.unwrap(CalciteConnection.class);
statement = calciteConnection.prepareStatement(datasourceRequest.getQuery());
resultSet = statement.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
TableField tableField = new TableField();
tableField.setOriginName(metaData.getColumnLabel(i));
tableField.setType(metaData.getColumnTypeName(i));
tableField.setPrecision(metaData.getPrecision(i));
int deType = FieldUtils.transType2DeType(tableField.getType());
tableField.setDeExtractType(deType);
tableField.setDeType(deType);
tableField.setScale(metaData.getScale(i));
datasetTableFields.add(tableField);
}
} catch (Exception e) {
throw DEException.getException(e.getMessage());
}
return datasetTableFields;
}
List<TableField> datasetTableFields = new ArrayList<>(); List<TableField> datasetTableFields = new ArrayList<>();
DatasourceSchemaDTO datasourceSchemaDTO = datasourceRequest.getDsList().entrySet().iterator().next().getValue(); DatasourceSchemaDTO datasourceSchemaDTO = datasourceRequest.getDsList().entrySet().iterator().next().getValue();
datasourceRequest.setDatasource(datasourceSchemaDTO); datasourceRequest.setDatasource(datasourceSchemaDTO);
@ -281,8 +341,11 @@ public class CalciteProvider extends Provider {
} else { } else {
resultSet = statement.executeQuery(getTableFiledSql(datasourceRequest)); resultSet = statement.executeQuery(getTableFiledSql(datasourceRequest));
} }
Map<String, Integer> tableTypeMap = getTableTypeMap(datasourceRequest, datasourceConfiguration, table);
while (resultSet.next()) { while (resultSet.next()) {
TableField tableFieldDesc = getTableFieldDesc(datasourceRequest, resultSet, 3); TableField tableFieldDesc = getTableFieldDesc(datasourceRequest, resultSet, 3, tableTypeMap);
boolean repeat = false; boolean repeat = false;
for (TableField ele : datasetTableFields) { for (TableField ele : datasetTableFields) {
if (StringUtils.equalsIgnoreCase(ele.getOriginName(), tableFieldDesc.getOriginName())) { if (StringUtils.equalsIgnoreCase(ele.getOriginName(), tableFieldDesc.getOriginName())) {
@ -423,16 +486,36 @@ public class CalciteProvider extends Provider {
// schema // schema
ResultSet resultSet = null; ResultSet resultSet = null;
try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId()); Statement statement = getPreparedStatement(con, datasourceConfiguration.getQueryTimeout(), datasourceRequest.getQuery(), datasourceRequest.getTableFieldWithValues())) {
if (DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) { try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId())) {
statement.executeUpdate("ALTER SESSION SET CURRENT_SCHEMA = " + datasourceConfiguration.getSchema());
} Statement statement = getStatement(value, con, datasourceRequest, datasourceConfiguration, null);
if (CollectionUtils.isNotEmpty(datasourceRequest.getTableFieldWithValues())) { if (CollectionUtils.isNotEmpty(datasourceRequest.getTableFieldWithValues())) {
LogUtil.info("execWithPreparedStatement sql: " + datasourceRequest.getQuery()); LogUtil.info("execWithPreparedStatement sql: " + datasourceRequest.getQuery());
for (int i = 0; i < datasourceRequest.getTableFieldWithValues().size(); i++) { for (int i = 0; i < datasourceRequest.getTableFieldWithValues().size(); i++) {
((PreparedStatement) statement).setObject(i + 1, datasourceRequest.getTableFieldWithValues().get(i).getValue(), datasourceRequest.getTableFieldWithValues().get(i).getType()); try {
LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "]: " + datasourceRequest.getTableFieldWithValues().get(i).getValue()); Object valueObject = datasourceRequest.getTableFieldWithValues().get(i).getValue();
if (valueObject instanceof String
&& DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) {
if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) {
//转换为数据库的字符集
valueObject = new String(((String) valueObject).getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset());
}
if (datasourceRequest.getTableFieldWithValues().get(i).getType().equals(Types.CLOB)) {
Reader reader = new StringReader((String) valueObject);
((PreparedStatement) statement).setCharacterStream(i + 1, reader, ((String) valueObject).length());
} else {
((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType());
}
} else {
((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType());
}
LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "](" + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName() + "): " + datasourceRequest.getTableFieldWithValues().get(i).getValue());
} catch (SQLException e) {
throw new SQLException(e.getMessage() + ". VALUE: " + datasourceRequest.getTableFieldWithValues().get(i).getValue().toString() + " , TARGET TYPE: " + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName());
}
} }
resultSet = ((PreparedStatement) statement).executeQuery(); resultSet = ((PreparedStatement) statement).executeQuery();
} else { } else {
@ -466,15 +549,35 @@ public class CalciteProvider extends Provider {
DatasourceConfiguration datasourceConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), DatasourceConfiguration.class); DatasourceConfiguration datasourceConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), DatasourceConfiguration.class);
// schema // schema
ResultSet resultSet = null; ResultSet resultSet = null;
try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId()); Statement statement = getPreparedStatement(con, datasourceConfiguration.getQueryTimeout(), datasourceRequest.getQuery(), datasourceRequest.getTableFieldWithValues())) {
if (DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) { try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId())) {
statement.executeUpdate("ALTER SESSION SET CURRENT_SCHEMA = " + datasourceConfiguration.getSchema());
} Statement statement = getStatement(value, con, datasourceRequest, datasourceConfiguration, null);
if (CollectionUtils.isNotEmpty(datasourceRequest.getTableFieldWithValues())) { if (CollectionUtils.isNotEmpty(datasourceRequest.getTableFieldWithValues())) {
LogUtil.info("execWithPreparedStatement sql: " + datasourceRequest.getQuery()); LogUtil.info("execWithPreparedStatement sql: " + datasourceRequest.getQuery());
for (int i = 0; i < datasourceRequest.getTableFieldWithValues().size(); i++) { for (int i = 0; i < datasourceRequest.getTableFieldWithValues().size(); i++) {
((PreparedStatement) statement).setObject(i + 1, datasourceRequest.getTableFieldWithValues().get(i).getValue(), datasourceRequest.getTableFieldWithValues().get(i).getType()); try {
LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "]: " + datasourceRequest.getTableFieldWithValues().get(i).getValue()); Object valueObject = datasourceRequest.getTableFieldWithValues().get(i).getValue();
if (valueObject instanceof String
&& DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) {
if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) {
//转换为数据库的字符集
valueObject = new String(((String) valueObject).getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset());
}
if (datasourceRequest.getTableFieldWithValues().get(i).getType().equals(Types.CLOB)) {
Reader reader = new StringReader((String) valueObject);
((PreparedStatement) statement).setCharacterStream(i + 1, reader, ((String) valueObject).length());
} else {
((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType());
}
} else {
((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType());
}
LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "](" + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName() + "): " + datasourceRequest.getTableFieldWithValues().get(i).getValue());
} catch (SQLException e) {
throw new SQLException(e.getMessage() + ". VALUE: " + datasourceRequest.getTableFieldWithValues().get(i).getValue().toString() + " , TARGET TYPE: " + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName());
}
} }
((PreparedStatement) statement).execute(); ((PreparedStatement) statement).execute();
} else { } else {
@ -496,29 +599,80 @@ public class CalciteProvider extends Provider {
} }
} }
/**
* 针对Oracle特殊处理
*/
private Statement getStatement(DatasourceSchemaDTO value, Connection con, DatasourceRequest datasourceRequest, DatasourceConfiguration datasourceConfiguration, String autoIncrementPkName) throws Exception {
Statement statement;
if (DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) {
statement = getStatement(con, datasourceConfiguration.getQueryTimeout());
statement.executeUpdate("ALTER SESSION SET CURRENT_SCHEMA = " + datasourceConfiguration.getSchema());
statement.executeUpdate("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS'");
//调整字符集
if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) {
datasourceRequest.setQuery(new String(datasourceRequest.getQuery().getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset()));
}
}
statement = getPreparedStatement(con, datasourceConfiguration.getQueryTimeout(), datasourceRequest.getQuery(), datasourceRequest.getTableFieldWithValues(), autoIncrementPkName, datasourceConfiguration);
return statement;
}
@Override @Override
public int executeUpdate(DatasourceRequest datasourceRequest) throws DEException { public ExecuteResult executeUpdate(DatasourceRequest datasourceRequest, String autoIncrementPkName) throws DEException {
DatasourceSchemaDTO value = datasourceRequest.getDsList().entrySet().iterator().next().getValue(); DatasourceSchemaDTO value = datasourceRequest.getDsList().entrySet().iterator().next().getValue();
datasourceRequest.setDatasource(value); datasourceRequest.setDatasource(value);
DatasourceConfiguration datasourceConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), DatasourceConfiguration.class); DatasourceConfiguration datasourceConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), DatasourceConfiguration.class);
// schema // schema
ResultSet resultSet = null; ResultSet resultSet = null;
try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId()); Statement statement = getPreparedStatement(con, datasourceConfiguration.getQueryTimeout(), datasourceRequest.getQuery(), datasourceRequest.getTableFieldWithValues())) { try (Connection con = getConnectionFromPool(datasourceRequest.getDatasource().getId())) {
if (DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) {
statement.executeUpdate("ALTER SESSION SET CURRENT_SCHEMA = " + datasourceConfiguration.getSchema());
}
Statement statement = getStatement(value, con, datasourceRequest, datasourceConfiguration, autoIncrementPkName);
int count = 0;
if (CollectionUtils.isNotEmpty(datasourceRequest.getTableFieldWithValues())) { if (CollectionUtils.isNotEmpty(datasourceRequest.getTableFieldWithValues())) {
LogUtil.info("execWithPreparedStatement sql: " + datasourceRequest.getQuery()); LogUtil.info("execWithPreparedStatement sql: " + datasourceRequest.getQuery());
for (int i = 0; i < datasourceRequest.getTableFieldWithValues().size(); i++) { for (int i = 0; i < datasourceRequest.getTableFieldWithValues().size(); i++) {
((PreparedStatement) statement).setObject(i + 1, datasourceRequest.getTableFieldWithValues().get(i).getValue(), datasourceRequest.getTableFieldWithValues().get(i).getType()); try {
LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "]: " + datasourceRequest.getTableFieldWithValues().get(i).getValue()); Object valueObject = datasourceRequest.getTableFieldWithValues().get(i).getValue();
if (valueObject instanceof String
&& DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) {
if (StringUtils.isNotEmpty(datasourceConfiguration.getCharset()) && StringUtils.isNotEmpty(datasourceConfiguration.getTargetCharset())) {
//转换为数据库的字符集
valueObject = new String(((String) valueObject).getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset());
} }
return ((PreparedStatement) statement).executeUpdate(); if (datasourceRequest.getTableFieldWithValues().get(i).getType().equals(Types.CLOB)) {
Reader reader = new StringReader((String) valueObject);
((PreparedStatement) statement).setCharacterStream(i + 1, reader, ((String) valueObject).length());
} else { } else {
return statement.executeUpdate(datasourceRequest.getQuery()); ((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType());
}
} else {
((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType());
}
LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "](" + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName() + "): " + datasourceRequest.getTableFieldWithValues().get(i).getValue());
} catch (SQLException e) {
throw new SQLException(e.getMessage() + ". VALUE: " + datasourceRequest.getTableFieldWithValues().get(i).getValue().toString() + " , TARGET TYPE: " + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName());
}
}
count = ((PreparedStatement) statement).executeUpdate();
} else {
count = statement.executeUpdate(datasourceRequest.getQuery());
} }
ExecuteResult result = new ExecuteResult();
result.setCount(count);
if (StringUtils.isNotBlank(autoIncrementPkName)) {
List<String> generatedKeys = new ArrayList<>();
ResultSet keys = statement.getGeneratedKeys();
while (keys.next()) {
generatedKeys.add(keys.getObject(1).toString());
}
result.setGeneratedKeys(generatedKeys);
}
return result;
} catch (SQLException e) { } catch (SQLException e) {
DEException.throwException("SQL ERROR: " + e.getMessage()); DEException.throwException("SQL ERROR: " + e.getMessage());
} catch (Exception e) { } catch (Exception e) {
@ -533,7 +687,7 @@ public class CalciteProvider extends Provider {
} }
} }
return 0; return new ExecuteResult();
} }
private List<TableField> getField(ResultSet rs, DatasourceRequest datasourceRequest) throws Exception { private List<TableField> getField(ResultSet rs, DatasourceRequest datasourceRequest) throws Exception {
@ -542,7 +696,7 @@ public class CalciteProvider extends Provider {
int columnCount = metaData.getColumnCount(); int columnCount = metaData.getColumnCount();
for (int j = 0; j < columnCount; j++) { for (int j = 0; j < columnCount; j++) {
String f = metaData.getColumnName(j + 1); String f = metaData.getColumnName(j + 1);
if (StringUtils.equalsIgnoreCase(f, "DE_ROWNUM")) { if (StringUtils.containsIgnoreCase(f, "ROWNUM")) {
continue; continue;
} }
String l = StringUtils.isNotEmpty(metaData.getColumnLabel(j + 1)) ? metaData.getColumnLabel(j + 1) : f; String l = StringUtils.isNotEmpty(metaData.getColumnLabel(j + 1)) ? metaData.getColumnLabel(j + 1) : f;
@ -558,15 +712,15 @@ public class CalciteProvider extends Provider {
} }
private List<String[]> getData(ResultSet rs, DatasourceRequest datasourceRequest) throws Exception { private List<String[]> getData(ResultSet rs, DatasourceRequest datasourceRequest) throws Exception {
String charset = null; String targetCharset = null;
String targetCharset = "UTF-8"; String originCharset = null;
if (datasourceRequest != null && datasourceRequest.getDatasource().getType().equalsIgnoreCase("oracle")) { if (datasourceRequest != null && datasourceRequest.getDatasource().getType().equalsIgnoreCase("oracle")) {
DatasourceConfiguration jdbcConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), DatasourceConfiguration.class); DatasourceConfiguration jdbcConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), DatasourceConfiguration.class);
if (StringUtils.isNotEmpty(jdbcConfiguration.getCharset()) && !jdbcConfiguration.getCharset().equalsIgnoreCase("Default")) { if (StringUtils.isNotEmpty(jdbcConfiguration.getCharset())) {
charset = jdbcConfiguration.getCharset(); originCharset = jdbcConfiguration.getCharset();
} }
if (StringUtils.isNotEmpty(jdbcConfiguration.getTargetCharset()) && !jdbcConfiguration.getTargetCharset().equalsIgnoreCase("Default")) { if (StringUtils.isNotEmpty(jdbcConfiguration.getTargetCharset())) {
targetCharset = jdbcConfiguration.getTargetCharset(); targetCharset = jdbcConfiguration.getTargetCharset();
} }
} }
@ -583,6 +737,11 @@ public class CalciteProvider extends Provider {
row[j] = rs.getDate(j + 1).toString(); row[j] = rs.getDate(j + 1).toString();
} }
break; break;
case Types.TIMESTAMP:
if (rs.getTimestamp(j + 1) != null) {
row[j] = rs.getTimestamp(j + 1).toString();
}
break;
case Types.BOOLEAN: case Types.BOOLEAN:
row[j] = rs.getBoolean(j + 1) ? "1" : "0"; row[j] = rs.getBoolean(j + 1) ? "1" : "0";
break; break;
@ -593,14 +752,18 @@ public class CalciteProvider extends Provider {
default: default:
if (metaData.getColumnTypeName(j + 1).toLowerCase().equalsIgnoreCase("blob")) { if (metaData.getColumnTypeName(j + 1).toLowerCase().equalsIgnoreCase("blob")) {
row[j] = rs.getBlob(j + 1) == null ? "" : rs.getBlob(j + 1).toString(); row[j] = rs.getBlob(j + 1) == null ? "" : rs.getBlob(j + 1).toString();
}
if (targetCharset != null && StringUtils.isNotEmpty(rs.getString(j + 1)) && columnType == Types.CLOB) {
if (originCharset == null) {
row[j] = new String(rs.getString(j + 1).getBytes(), targetCharset);
} else { } else {
if (charset != null && StringUtils.isNotEmpty(rs.getString(j + 1))) { row[j] = new String(rs.getString(j + 1).getBytes(originCharset), targetCharset);
String originStr = new String(rs.getString(j + 1).getBytes(charset), targetCharset); }
row[j] = new String(originStr.getBytes("UTF-8"), "UTF-8"); } else if (targetCharset != null && StringUtils.isNotEmpty(rs.getString(j + 1)) && (columnType != Types.NVARCHAR && columnType != Types.NCHAR)) {
row[j] = new String(rs.getBytes(j + 1), targetCharset);
} else { } else {
row[j] = rs.getString(j + 1); row[j] = rs.getString(j + 1);
} }
}
break; break;
} }
@ -705,7 +868,7 @@ public class CalciteProvider extends Provider {
} }
} }
private TableField getTableFieldDesc(DatasourceRequest datasourceRequest, ResultSet resultSet, int commentIndex) throws SQLException { private TableField getTableFieldDesc(DatasourceRequest datasourceRequest, ResultSet resultSet, int commentIndex, Map<String, Integer> tableTypeMap) throws SQLException {
TableField tableField = new TableField(); TableField tableField = new TableField();
tableField.setOriginName(resultSet.getString(1)); tableField.setOriginName(resultSet.getString(1));
tableField.setType(resultSet.getString(2).toUpperCase()); tableField.setType(resultSet.getString(2).toUpperCase());
@ -718,6 +881,20 @@ public class CalciteProvider extends Provider {
tableField.setPrimary(resultSet.getInt(4) > 0); tableField.setPrimary(resultSet.getInt(4) > 0);
} catch (Exception e) { } catch (Exception e) {
} }
try {
if (StringUtils.endsWithIgnoreCase(datasourceRequest.getDatasource().getType(), "oracle")) {
if (StringUtils.contains(resultSet.getString(5), "nextval") || StringUtils.equalsIgnoreCase(resultSet.getString(5), "GENERATED ALWAYS AS IDENTITY")) {
tableField.setAutoIncrement(true);
}
} else {
tableField.setAutoIncrement(resultSet.getInt(5) > 0);
}
} catch (Exception e) {
}
try {
tableField.setTypeNumber(tableTypeMap.get(StringUtils.lowerCase(tableField.getOriginName())));
} catch (Exception e) {
}
return tableField; return tableField;
} }
@ -770,6 +947,13 @@ public class CalciteProvider extends Provider {
commonThreadPool.addTask(() -> { commonThreadPool.addTask(() -> {
try { try {
BasicDataSource dataSource = new BasicDataSource(); BasicDataSource dataSource = new BasicDataSource();
dataSource.setMaxWaitMillis(5 * 1000);
dataSource.setTestWhileIdle(true);
dataSource.setTestOnBorrow(true);
dataSource.setTestOnReturn(true);
dataSource.setTimeBetweenEvictionRunsMillis(60 * 1000);
dataSource.setValidationQuery("select 1");
dataSource.setValidationQueryTimeout(5);
Schema schema = null; Schema schema = null;
DatasourceConfiguration configuration = null; DatasourceConfiguration configuration = null;
DatasourceConfiguration.DatasourceType datasourceType = DatasourceConfiguration.DatasourceType.valueOf(ds.getType()); DatasourceConfiguration.DatasourceType datasourceType = DatasourceConfiguration.DatasourceType.valueOf(ds.getType());
@ -838,6 +1022,7 @@ public class CalciteProvider extends Provider {
rootSchema.add(ds.getSchemaAlias(), schema); rootSchema.add(ds.getSchemaAlias(), schema);
break; break;
case oracle: case oracle:
dataSource.setValidationQuery("SELECT 1 FROM DUAL");
configuration = JsonUtil.parseObject(ds.getConfiguration(), Oracle.class); configuration = JsonUtil.parseObject(ds.getConfiguration(), Oracle.class);
if (StringUtils.isNotBlank(configuration.getUsername())) { if (StringUtils.isNotBlank(configuration.getUsername())) {
dataSource.setUsername(configuration.getUsername()); dataSource.setUsername(configuration.getUsername());
@ -856,6 +1041,7 @@ public class CalciteProvider extends Provider {
break; break;
case db2: case db2:
configuration = JsonUtil.parseObject(ds.getConfiguration(), Db2.class); configuration = JsonUtil.parseObject(ds.getConfiguration(), Db2.class);
dataSource.setValidationQuery("select 1 from syscat.tables WHERE TABSCHEMA ='DE_SCHEMA' AND \"TYPE\" = 'T'".replace("DE_SCHEMA", configuration.getSchema()));
if (StringUtils.isNotBlank(configuration.getUsername())) { if (StringUtils.isNotBlank(configuration.getUsername())) {
dataSource.setUsername(configuration.getUsername()); dataSource.setUsername(configuration.getUsername());
} }
@ -1022,7 +1208,7 @@ public class CalciteProvider extends Provider {
if (database.contains(".")) { if (database.contains(".")) {
sql = "select * from " + datasourceRequest.getTable() + " limit 0 offset 0 "; sql = "select * from " + datasourceRequest.getTable() + " limit 0 offset 0 ";
} else { } else {
sql = String.format("SELECT COLUMN_NAME,DATA_TYPE,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s'", database, datasourceRequest.getTable()); sql = String.format("SELECT COLUMN_NAME,DATA_TYPE,COLUMN_COMMENT,IF(COLUMN_KEY='PRI',1,0),IF(EXTRA LIKE '%%auto_increment%%',1,0) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s'", database, datasourceRequest.getTable());
} }
break; break;
case mysql: case mysql:
@ -1039,21 +1225,49 @@ public class CalciteProvider extends Provider {
String[] databasePrams = matcher.group(3).split("\\?"); String[] databasePrams = matcher.group(3).split("\\?");
database = databasePrams[0]; database = databasePrams[0];
} }
sql = String.format("SELECT COLUMN_NAME,DATA_TYPE,COLUMN_COMMENT,IF(COLUMN_KEY='PRI',1,0) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s'", database, datasourceRequest.getTable()); sql = String.format("SELECT COLUMN_NAME,DATA_TYPE,COLUMN_COMMENT,IF(COLUMN_KEY='PRI',1,0),IF(EXTRA LIKE '%%auto_increment%%',1,0) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s'", database, datasourceRequest.getTable());
break; break;
case oracle: case oracle:
configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Oracle.class); configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Oracle.class);
if (StringUtils.isEmpty(configuration.getSchema())) { if (StringUtils.isEmpty(configuration.getSchema())) {
DEException.throwException(Translator.get("i18n_schema_is_empty")); DEException.throwException(Translator.get("i18n_schema_is_empty"));
} }
sql = String.format("SELECT a.COLUMN_NAME , a.DATA_TYPE , b.COMMENTS ,0 FROM all_tab_columns a LEFT JOIN all_col_comments b ON a.owner = b.owner AND a.table_name = b.table_name AND a.column_name = b.column_name WHERE a.owner = '%s' AND a.table_name = '%s' ORDER BY a.table_name, a.column_id", configuration.getSchema(), datasourceRequest.getTable()); sql = String.format("""
SELECT tc.COLUMN_NAME AS ColumnName,
tc.DATA_TYPE,
cc.COMMENTS,
CASE
WHEN ac.COLUMN_NAME IS NOT NULL THEN 1
ELSE 0
END,
tc.DATA_DEFAULT
FROM ALL_TAB_COLUMNS tc
LEFT JOIN (SELECT cols.OWNER,
cols.TABLE_NAME,
cols.COLUMN_NAME
FROM ALL_CONSTRAINTS cons
JOIN
ALL_CONS_COLUMNS cols
ON cons.OWNER = cols.OWNER
AND cons.CONSTRAINT_NAME = cols.CONSTRAINT_NAME
WHERE cons.TABLE_NAME = '%s'
AND cons.CONSTRAINT_TYPE = 'P') ac
ON tc.OWNER = ac.OWNER
AND tc.TABLE_NAME = ac.TABLE_NAME
AND tc.COLUMN_NAME = ac.COLUMN_NAME
LEFT JOIN ALL_COL_COMMENTS cc
ON tc.owner = cc.owner AND tc.table_name = cc.table_name AND tc.column_name = cc.column_name
WHERE tc.TABLE_NAME = '%s'
AND tc.OWNER = '%s'
ORDER BY tc.TABLE_NAME, tc.COLUMN_ID
""", datasourceRequest.getTable(), datasourceRequest.getTable(), configuration.getSchema());
break; break;
case db2: case db2:
configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Db2.class); configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Db2.class);
if (StringUtils.isEmpty(configuration.getSchema())) { if (StringUtils.isEmpty(configuration.getSchema())) {
DEException.throwException(Translator.get("i18n_schema_is_empty")); DEException.throwException(Translator.get("i18n_schema_is_empty"));
} }
sql = String.format("SELECT COLNAME , TYPENAME , REMARKS FROM SYSCAT.COLUMNS WHERE TABSCHEMA = '%s' AND TABNAME = '%s' ", configuration.getSchema(), datasourceRequest.getTable()); sql = String.format("SELECT COLNAME, TYPENAME, REMARKS, 0, 0 FROM SYSCAT.COLUMNS WHERE TABSCHEMA = '%s' AND TABNAME = '%s' ", configuration.getSchema(), datasourceRequest.getTable());
break; break;
case sqlServer: case sqlServer:
configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Sqlserver.class); configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Sqlserver.class);
@ -1061,38 +1275,46 @@ public class CalciteProvider extends Provider {
DEException.throwException(Translator.get("i18n_schema_is_empty")); DEException.throwException(Translator.get("i18n_schema_is_empty"));
} }
sql = String.format("SELECT \n" + " c.name ,t.name ,ep.value, 0 \n" + "FROM \n" + " sys.columns AS c\n" + "LEFT JOIN sys.extended_properties AS ep ON c.object_id = ep.major_id AND c.column_id = ep.minor_id\n" + "LEFT JOIN sys.types AS t ON c.user_type_id = t.user_type_id\n" + "LEFT JOIN sys.objects AS o ON c.object_id = o.object_id\n" + "WHERE o.name = '%s'", datasourceRequest.getTable()); sql = String.format("SELECT \n" + " c.name ,t.name ,ep.value, 0, 0 \n" + "FROM \n" + " sys.columns AS c\n" + "LEFT JOIN sys.extended_properties AS ep ON c.object_id = ep.major_id AND c.column_id = ep.minor_id\n" + "LEFT JOIN sys.types AS t ON c.user_type_id = t.user_type_id\n" + "LEFT JOIN sys.objects AS o ON c.object_id = o.object_id\n" + "WHERE o.name = '%s'", datasourceRequest.getTable());
break; break;
case pg: case pg:
configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Pg.class); configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Pg.class);
if (StringUtils.isEmpty(configuration.getSchema())) { if (StringUtils.isEmpty(configuration.getSchema())) {
DEException.throwException(Translator.get("i18n_schema_is_empty")); DEException.throwException(Translator.get("i18n_schema_is_empty"));
} }
sql = String.format("SELECT\n" + sql = String.format("""
" a.attname AS ColumnName,\n" + SELECT a.attname AS ColumnName,
" t.typname,\n" + t.typname,
" b.description AS ColumnDescription,\n" + b.description AS ColumnDescription,
" CASE\n" + CASE
" WHEN d.indisprimary THEN 1\n" + WHEN d.indisprimary THEN 1
" ELSE 0\n" + ELSE 0
" END\n" + END,
"FROM\n" + CASE
" pg_class c\n" + WHEN pg_get_expr(ad.adbin, ad.adrelid) LIKE 'nextval%%' THEN 1
" JOIN pg_attribute a ON a.attrelid = c.oid\n" + """ + (
" LEFT JOIN pg_description b ON a.attrelid = b.objoid AND a.attnum = b.objsubid\n" + datasourceRequest.getDsVersion() > 9 ? """
" JOIN pg_type t ON a.atttypid = t.oid\n" + WHEN a.attidentity = 'd' THEN 1
" LEFT JOIN pg_index d ON d.indrelid = a.attrelid AND d.indisprimary AND a.attnum = ANY(d.indkey)\n" + WHEN a.attidentity = 'a' THEN 1
"where\n" + """ : "") + """
" c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = '%s')\n" + ELSE 0
" AND c.relname = '%s'\n" + END
" AND a.attnum > 0\n" + FROM pg_class c
" AND NOT a.attisdropped\n" + JOIN pg_attribute a ON a.attrelid = c.oid
"ORDER BY\n" + LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum
" a.attnum;", configuration.getSchema(), datasourceRequest.getTable()); LEFT JOIN pg_description b ON a.attrelid = b.objoid AND a.attnum = b.objsubid
JOIN pg_type t ON a.atttypid = t.oid
LEFT JOIN pg_index d ON d.indrelid = a.attrelid AND d.indisprimary AND a.attnum = ANY (d.indkey)
where c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = '%s')
AND c.relname = '%s'
AND a.attnum > 0
AND NOT a.attisdropped
ORDER BY a.attnum;
""", configuration.getSchema(), datasourceRequest.getTable());
break; break;
case redshift: case redshift:
configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), CK.class); configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), CK.class);
sql = String.format("SELECT\n" + " a.attname AS ColumnName,\n" + " t.typname,\n" + " b.description AS ColumnDescription,\n" + " 0\n" + "FROM\n" + " pg_class c\n" + " JOIN pg_attribute a ON a.attrelid = c.oid\n" + " LEFT JOIN pg_description b ON a.attrelid = b.objoid AND a.attnum = b.objsubid\n" + " JOIN pg_type t ON a.atttypid = t.oid\n" + "WHERE\n" + " c.relname = '%s'\n" + " AND a.attnum > 0\n" + " AND NOT a.attisdropped\n" + "ORDER BY\n" + " a.attnum\n" + " ", datasourceRequest.getTable()); sql = String.format("SELECT\n" + " a.attname AS ColumnName,\n" + " t.typname,\n" + " b.description AS ColumnDescription,\n" + " 0, 0\n" + "FROM\n" + " pg_class c\n" + " JOIN pg_attribute a ON a.attrelid = c.oid\n" + " LEFT JOIN pg_description b ON a.attrelid = b.objoid AND a.attnum = b.objsubid\n" + " JOIN pg_type t ON a.atttypid = t.oid\n" + "WHERE\n" + " c.relname = '%s'\n" + " AND a.attnum > 0\n" + " AND NOT a.attisdropped\n" + "ORDER BY\n" + " a.attnum\n" + " ", datasourceRequest.getTable());
break; break;
case ck: case ck:
configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), CK.class); configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), CK.class);
@ -1106,13 +1328,13 @@ public class CalciteProvider extends Provider {
String[] databasePrams = matcher.group(3).split("\\?"); String[] databasePrams = matcher.group(3).split("\\?");
database = databasePrams[0]; database = databasePrams[0];
} }
sql = String.format(" SELECT\n" + " name,\n" + " type,\n" + " comment,\n" + " 0\n" + "FROM\n" + " system.columns\n" + "WHERE\n" + " database = '%s' \n" + " AND table = '%s' ", database, datasourceRequest.getTable()); sql = String.format(" SELECT\n" + " name,\n" + " type,\n" + " comment,\n" + " 0, 0\n" + "FROM\n" + " system.columns\n" + "WHERE\n" + " database = '%s' \n" + " AND table = '%s' ", database, datasourceRequest.getTable());
break; break;
case impala: case impala:
sql = String.format("DESCRIBE `%s`", datasourceRequest.getTable()); sql = String.format("DESCRIBE `%s`", datasourceRequest.getTable());
break; break;
case h2: case h2:
sql = String.format("SELECT COLUMN_NAME, DATA_TYPE, REMARKS FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '%s'", datasourceRequest.getTable()); sql = String.format("SELECT COLUMN_NAME, DATA_TYPE, REMARKS, 0, 0 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '%s'", datasourceRequest.getTable());
break; break;
default: default:
break; break;
@ -1170,6 +1392,18 @@ public class CalciteProvider extends Provider {
} }
tableSqls.add("select table_name, comments, owner from all_tab_comments where owner='" + configuration.getSchema() + "' AND table_type = 'TABLE'"); tableSqls.add("select table_name, comments, owner from all_tab_comments where owner='" + configuration.getSchema() + "' AND table_type = 'TABLE'");
tableSqls.add("select table_name, comments, owner from all_tab_comments where owner='" + configuration.getSchema() + "' AND table_type = 'VIEW'"); tableSqls.add("select table_name, comments, owner from all_tab_comments where owner='" + configuration.getSchema() + "' AND table_type = 'VIEW'");
tableSqls.add("SELECT \n" +
" m.mview_name,\n" +
" c.comments\n" +
"FROM \n" +
" ALL_MVIEWS m\n" +
"LEFT JOIN \n" +
" ALL_TAB_COMMENTS c \n" +
"ON \n" +
" m.owner = c.owner \n" +
" AND m.mview_name = c.table_name\n" +
" AND c.table_type = 'MATERIALIZED VIEW'\n" +
"WHERE m.OWNER ='DE_SCHEMA'".replace("DE_SCHEMA", configuration.getSchema()));
break; break;
case db2: case db2:
configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Db2.class); configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), Db2.class);
@ -1192,6 +1426,29 @@ public class CalciteProvider extends Provider {
DEException.throwException(Translator.get("i18n_schema_is_empty")); DEException.throwException(Translator.get("i18n_schema_is_empty"));
} }
tableSqls.add("SELECT \n" + " relname AS TableName, \n" + " obj_description(relfilenode::regclass, 'pg_class') AS TableDescription \n" + "FROM \n" + " pg_class \n" + "WHERE \n" + " relkind in ('r','p', 'f') \n" + " AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'SCHEMA') ".replace("SCHEMA", configuration.getSchema())); tableSqls.add("SELECT \n" + " relname AS TableName, \n" + " obj_description(relfilenode::regclass, 'pg_class') AS TableDescription \n" + "FROM \n" + " pg_class \n" + "WHERE \n" + " relkind in ('r','p', 'f') \n" + " AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'SCHEMA') ".replace("SCHEMA", configuration.getSchema()));
tableSqls.add("SELECT \n" +
" c.relname AS view_name,\n" +
" COALESCE(d.description, 'No description provided') AS view_description\n" +
"FROM \n" +
" pg_class c\n" +
"JOIN \n" +
" pg_namespace n ON c.relnamespace = n.oid\n" +
"LEFT JOIN \n" +
" pg_description d ON c.oid = d.objoid\n" +
"WHERE \n" +
" c.relkind = 'v' \n" +
" AND n.nspname = 'SCHEMA'".replace("SCHEMA", configuration.getSchema()));
tableSqls.add("SELECT \n" +
" c.relname AS materialized_view_name,\n" +
" COALESCE(d.description, '') AS view_description\n" +
"FROM \n" +
" pg_class c\n" +
"JOIN \n" +
" pg_namespace n ON c.relnamespace = n.oid\n" +
"LEFT JOIN \n" +
" pg_description d ON c.oid = d.objoid\n" +
"WHERE \n" +
" c.relkind = 'm' and n.nspname ='SCHEMA'; ".replace("SCHEMA", configuration.getSchema()));
break; break;
case redshift: case redshift:
configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), CK.class); configuration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), CK.class);
@ -1257,13 +1514,23 @@ public class CalciteProvider extends Provider {
} }
public Statement getPreparedStatement(Connection connection, int queryTimeout, String sql, List<TableFieldWithValue> values) throws Exception { public Statement getPreparedStatement(Connection connection, int queryTimeout, String sql, List<TableFieldWithValue> values) throws Exception {
return getPreparedStatement(connection, queryTimeout, sql, values, null, null);
}
public Statement getPreparedStatement(Connection connection, int queryTimeout, String sql, List<TableFieldWithValue> values, String autoIncrementPkName, DatasourceConfiguration datasourceConfiguration) throws Exception {
if (connection == null) { if (connection == null) {
throw new Exception("Failed to get connection!"); throw new Exception("Failed to get connection!");
} }
if (CollectionUtils.isNotEmpty(values)) { if (CollectionUtils.isNotEmpty(values)) {
PreparedStatement stat = null; PreparedStatement stat = null;
String pkName = autoIncrementPkName;
try { try {
if (StringUtils.isNotBlank(autoIncrementPkName)) {
String[] generatedColumns = {pkName};
stat = connection.prepareStatement(sql, generatedColumns);
} else {
stat = connection.prepareStatement(sql); stat = connection.prepareStatement(sql);
}
stat.setQueryTimeout(queryTimeout); stat.setQueryTimeout(queryTimeout);
} catch (Exception e) { } catch (Exception e) {
DEException.throwException(e.getMessage()); DEException.throwException(e.getMessage());
@ -1332,7 +1599,7 @@ public class CalciteProvider extends Provider {
public void initConnectionPool() { public void initConnectionPool() {
LogUtil.info("Begin to init datasource pool..."); LogUtil.info("Begin to init datasource pool...");
QueryWrapper<CoreDatasource> datasourceQueryWrapper = new QueryWrapper(); QueryWrapper<CoreDatasource> datasourceQueryWrapper = new QueryWrapper();
List<CoreDatasource> coreDatasources = coreDatasourceMapper.selectList(datasourceQueryWrapper).stream().filter(coreDatasource -> !Arrays.asList("folder", "API", "Excel").contains(coreDatasource.getType())).collect(Collectors.toList()); List<CoreDatasource> coreDatasources = coreDatasourceMapper.selectList(datasourceQueryWrapper).stream().filter(coreDatasource -> !Arrays.asList("folder", "API", "Excel", "ExcelRemote").contains(coreDatasource.getType())).collect(Collectors.toList());
CoreDatasource engine = engineManage.deEngine(); CoreDatasource engine = engineManage.deEngine();
if (engine != null) { if (engine != null) {
coreDatasources.add(engine); coreDatasources.add(engine);
@ -1382,8 +1649,8 @@ public class CalciteProvider extends Provider {
buildSchema(datasourceRequest, calciteConnection); buildSchema(datasourceRequest, calciteConnection);
} }
DatasourceConfiguration configuration = JsonUtil.parseObject(datasourceDTO.getConfiguration(), DatasourceConfiguration.class); DatasourceConfiguration configuration = JsonUtil.parseObject(datasourceDTO.getConfiguration(), DatasourceConfiguration.class);
if(configuration.isUseSSH()){ if (configuration.isUseSSH()) {
Session session =Provider.getSessions().get(datasourceDTO.getId()); Session session = Provider.getSessions().get(datasourceDTO.getId());
session.disconnect(); session.disconnect();
Provider.getSessions().remove(datasourceDTO.getId()); Provider.getSessions().remove(datasourceDTO.getId());
startSshSession(configuration, null, datasourceDTO.getId()); startSshSession(configuration, null, datasourceDTO.getId());
@ -1437,6 +1704,7 @@ public class CalciteProvider extends Provider {
} }
JdbcSchema jdbcSchema = rootSchema.getSubSchema(String.format(SQLConstants.SCHEMA, dsId)).unwrap(JdbcSchema.class); JdbcSchema jdbcSchema = rootSchema.getSubSchema(String.format(SQLConstants.SCHEMA, dsId)).unwrap(JdbcSchema.class);
BasicDataSource basicDataSource = (BasicDataSource) jdbcSchema.getDataSource(); BasicDataSource basicDataSource = (BasicDataSource) jdbcSchema.getDataSource();
basicDataSource.setMaxWaitMillis(5 * 1000);
return basicDataSource.getConnection(); return basicDataSource.getConnection();
} catch (Exception e) { } catch (Exception e) {
DEException.throwException(Translator.get("i18n_invalid_connection") + e.getMessage()); DEException.throwException(Translator.get("i18n_invalid_connection") + e.getMessage());

View File

@ -4,6 +4,7 @@ package io.gisbi.datasource.provider;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader; import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.data.ReadCellData; import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.excel.read.metadata.ReadSheet;
@ -12,6 +13,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import io.gisbi.api.ds.vo.ExcelFileData; import io.gisbi.api.ds.vo.ExcelFileData;
import io.gisbi.api.ds.vo.ExcelSheetData; import io.gisbi.api.ds.vo.ExcelSheetData;
import io.gisbi.api.ds.vo.RemoteExcelRequest;
import io.gisbi.commons.utils.EncryptUtils; import io.gisbi.commons.utils.EncryptUtils;
import io.gisbi.datasource.dao.auto.entity.CoreDatasource; import io.gisbi.datasource.dao.auto.entity.CoreDatasource;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
@ -19,6 +21,8 @@ import io.gisbi.extensions.datasource.dto.DatasetTableDTO;
import io.gisbi.extensions.datasource.dto.DatasourceDTO; import io.gisbi.extensions.datasource.dto.DatasourceDTO;
import io.gisbi.extensions.datasource.dto.DatasourceRequest; import io.gisbi.extensions.datasource.dto.DatasourceRequest;
import io.gisbi.extensions.datasource.dto.TableField; import io.gisbi.extensions.datasource.dto.TableField;
import io.gisbi.api.ds.vo.ExcelConfiguration;
import io.gisbi.i18n.Translator;
import io.gisbi.utils.*; import io.gisbi.utils.*;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -26,6 +30,9 @@ import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.*; import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -40,9 +47,9 @@ public class ExcelUtils {
public static String getExcelPath() { public static String getExcelPath() {
if (ModelUtils.isDesktop()) { if (ModelUtils.isDesktop()) {
return ConfigUtils.getConfig("gisbi.path.excel", "/opt/gisbi/data/excel/"); return ConfigUtils.getConfig("gisbi.path.excel", "/opt/gisbi2.0/data/excel/");
} else { } else {
return "/opt/gisbi/data/excel/"; return "/opt/gisbi2.0/data/excel/";
} }
} }
@ -53,6 +60,7 @@ public class ExcelUtils {
}; };
public static void mergeSheets(CoreDatasource requestDatasource, DatasourceDTO sourceData) { public static void mergeSheets(CoreDatasource requestDatasource, DatasourceDTO sourceData) {
if (requestDatasource.getType().equalsIgnoreCase("Excel")) {
List<ExcelSheetData> newSheets = JsonUtil.parseList(requestDatasource.getConfiguration(), sheets); List<ExcelSheetData> newSheets = JsonUtil.parseList(requestDatasource.getConfiguration(), sheets);
List<String> tableNames = newSheets.stream().map(ExcelSheetData::getDeTableName).collect(Collectors.toList()); List<String> tableNames = newSheets.stream().map(ExcelSheetData::getDeTableName).collect(Collectors.toList());
List<ExcelSheetData> oldSheets = JsonUtil.parseList(sourceData.getConfiguration(), sheets); List<ExcelSheetData> oldSheets = JsonUtil.parseList(sourceData.getConfiguration(), sheets);
@ -62,12 +70,32 @@ public class ExcelUtils {
} }
} }
requestDatasource.setConfiguration(JsonUtil.toJSONString(newSheets).toString()); requestDatasource.setConfiguration(JsonUtil.toJSONString(newSheets).toString());
} else {
ExcelConfiguration excelConfiguration = JsonUtil.parseObject(requestDatasource.getConfiguration(), ExcelConfiguration.class);
List<ExcelSheetData> newSheets = excelConfiguration.getSheets();
List<String> tableNames = newSheets.stream().map(ExcelSheetData::getDeTableName).collect(Collectors.toList());
List<ExcelSheetData> oldSheets = JsonUtil.parseObject(sourceData.getConfiguration(), ExcelConfiguration.class).getSheets();
for (ExcelSheetData oldSheet : oldSheets) {
if (!tableNames.contains(oldSheet.getDeTableName())) {
newSheets.add(oldSheet);
}
}
excelConfiguration.setSheets(newSheets);
requestDatasource.setConfiguration(JsonUtil.toJSONString(excelConfiguration).toString());
}
} }
public static List<DatasetTableDTO> getTables(DatasourceRequest datasourceRequest) throws DEException { public static List<DatasetTableDTO> getTables(DatasourceRequest datasourceRequest) throws DEException {
List<DatasetTableDTO> tableDescs = new ArrayList<>(); List<DatasetTableDTO> tableDescs = new ArrayList<>();
try { try {
JsonNode rootNode = objectMapper.readTree(datasourceRequest.getDatasource().getConfiguration()); String sheets = "";
if (datasourceRequest.getDatasource().getType().equalsIgnoreCase("Excel")) {
sheets = datasourceRequest.getDatasource().getConfiguration();
} else {
sheets = objectMapper.readTree(datasourceRequest.getDatasource().getConfiguration()).get("sheets").toString();
}
JsonNode rootNode = objectMapper.readTree(sheets);
for (int i = 0; i < rootNode.size(); i++) { for (int i = 0; i < rootNode.size(); i++) {
DatasetTableDTO datasetTableDTO = new DatasetTableDTO(); DatasetTableDTO datasetTableDTO = new DatasetTableDTO();
datasetTableDTO.setTableName(rootNode.get(i).get("deTableName").asText()); datasetTableDTO.setTableName(rootNode.get(i).get("deTableName").asText());
@ -83,20 +111,24 @@ public class ExcelUtils {
return tableDescs; return tableDescs;
} }
public static Map<String, String> getTableNamesMap(String configration) throws DEException { public static Map<String, String> getTableNamesMap(String type, String configuration) throws DEException {
Map<String, String> result = new HashMap<>(); Map<String, String> result = new HashMap<>();
JsonNode rootNode = null; JsonNode rootNode = null;
// 兼容历史未加密信息 // 兼容历史未加密信息
String sheets = configuration;
try { try {
rootNode = objectMapper.readTree((String) EncryptUtils.aesDecrypt(configration)); if (type.equalsIgnoreCase("ExcelRemote")) {
sheets = objectMapper.readTree(configuration).get("sheets").toString();
}
rootNode = objectMapper.readTree((String) EncryptUtils.aesDecrypt(sheets));
} catch (Exception e) { } catch (Exception e) {
try { try {
rootNode = objectMapper.readTree(configration); rootNode = objectMapper.readTree(sheets);
} catch (Exception ex) { } catch (Exception ex) {
DEException.throwException(ex); DEException.throwException(ex);
} }
} }
if(rootNode != null) { if (rootNode != null) {
for (int i = 0; i < rootNode.size(); i++) { for (int i = 0; i < rootNode.size(); i++) {
result.put(rootNode.get(i).get("tableName").asText(), rootNode.get(i).get("deTableName").asText()); result.put(rootNode.get(i).get("tableName").asText(), rootNode.get(i).get("deTableName").asText());
} }
@ -105,6 +137,12 @@ public class ExcelUtils {
} }
public static String getFileName(CoreDatasource datasource) throws DEException { public static String getFileName(CoreDatasource datasource) throws DEException {
if (datasource.getType().equalsIgnoreCase("ExcelRemote")) {
ExcelConfiguration excelConfiguration = JsonUtil.parseObject(datasource.getConfiguration(), ExcelConfiguration.class);
for (ExcelSheetData sheet : excelConfiguration.getSheets()) {
return sheet.getFileName();
}
}
JsonNode rootNode = null; JsonNode rootNode = null;
try { try {
rootNode = objectMapper.readTree((String) EncryptUtils.aesDecrypt(datasource.getConfiguration())); rootNode = objectMapper.readTree((String) EncryptUtils.aesDecrypt(datasource.getConfiguration()));
@ -120,12 +158,16 @@ public class ExcelUtils {
return rootNode.get(i).get("fileName").asText(); return rootNode.get(i).get("fileName").asText();
} }
} }
return ""; return "";
} }
public static String getSize(CoreDatasource datasource) throws DEException { public static String getSize(CoreDatasource datasource) throws DEException {
if (datasource.getType().equalsIgnoreCase("ExcelRemote")) {
ExcelConfiguration excelConfiguration = JsonUtil.parseObject(datasource.getConfiguration(), ExcelConfiguration.class);
for (ExcelSheetData sheet : excelConfiguration.getSheets()) {
return sheet.getSize();
}
}
try { try {
JsonNode rootNode = objectMapper.readTree(datasource.getConfiguration()); JsonNode rootNode = objectMapper.readTree(datasource.getConfiguration());
for (int i = 0; i < rootNode.size(); i++) { for (int i = 0; i < rootNode.size(); i++) {
@ -134,12 +176,32 @@ public class ExcelUtils {
} catch (Exception e) { } catch (Exception e) {
DEException.throwException(e); DEException.throwException(e);
} }
return "0 B"; return "0 B";
} }
public List<String[]> fetchDataList(DatasourceRequest datasourceRequest) throws DEException { public List<String[]> fetchDataList(DatasourceRequest datasourceRequest) throws DEException, IOException {
List<String[]> dataList = new ArrayList<>(); List<String[]> dataList = new ArrayList<>();
if (datasourceRequest.getDatasource().getType().equalsIgnoreCase("ExcelRemote")) {
ExcelConfiguration excelConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), ExcelConfiguration.class);
Map<String, String> fileNames = downLoadRemoteExcel(excelConfiguration);
for (ExcelSheetData sheet : excelConfiguration.getSheets()) {
if (sheet.getDeTableName().equalsIgnoreCase(datasourceRequest.getTable())) {
List<TableField> tableFields = sheet.getFields();
String suffix = fileNames.get("fileName").substring(fileNames.get("fileName").lastIndexOf(".") + 1);
InputStream inputStream = new FileInputStream(path + fileNames.get("tranName"));
if (StringUtils.equalsIgnoreCase(suffix, "csv")) {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
reader.readLine();//去掉表头
dataList = csvData(reader, false, tableFields.size());
} else {
dataList = fetchExcelDataList(sheet.getTableName(), inputStream);
}
}
}
if (StringUtils.isNotEmpty(fileNames.get("tranName"))) {
FileUtils.deleteFile(path + fileNames.get("tranName"));
}
} else {
try { try {
JsonNode rootNode = objectMapper.readTree(datasourceRequest.getDatasource().getConfiguration()); JsonNode rootNode = objectMapper.readTree(datasourceRequest.getDatasource().getConfiguration());
for (int i = 0; i < rootNode.size(); i++) { for (int i = 0; i < rootNode.size(); i++) {
@ -159,10 +221,11 @@ public class ExcelUtils {
} catch (Exception e) { } catch (Exception e) {
DEException.throwException(e); DEException.throwException(e);
} }
}
return dataList; return dataList;
} }
public List<String[]> fetchExcelDataList(String sheetName, InputStream inputStream) { private List<String[]> fetchExcelDataList(String sheetName, InputStream inputStream) {
NoModelDataListener noModelDataListener = new NoModelDataListener(); NoModelDataListener noModelDataListener = new NoModelDataListener();
ExcelReader excelReader = EasyExcel.read(inputStream, noModelDataListener).build(); ExcelReader excelReader = EasyExcel.read(inputStream, noModelDataListener).build();
List<ReadSheet> sheets = excelReader.excelExecutor().sheetList(); List<ReadSheet> sheets = excelReader.excelExecutor().sheetList();
@ -189,7 +252,13 @@ public class ExcelUtils {
TypeReference<List<TableField>> listTypeReference = new TypeReference<List<TableField>>() { TypeReference<List<TableField>> listTypeReference = new TypeReference<List<TableField>>() {
}; };
try { try {
JsonNode rootNode = objectMapper.readTree(datasourceRequest.getDatasource().getConfiguration()); String sheets = "";
if (datasourceRequest.getDatasource().getType().equalsIgnoreCase("Excel")) {
sheets = datasourceRequest.getDatasource().getConfiguration();
} else {
sheets = objectMapper.readTree(datasourceRequest.getDatasource().getConfiguration()).get("sheets").toString();
}
JsonNode rootNode = objectMapper.readTree(sheets);
for (int i = 0; i < rootNode.size(); i++) { for (int i = 0; i < rootNode.size(); i++) {
if (rootNode.get(i).get("deTableName").asText().equalsIgnoreCase(datasourceRequest.getTable())) { if (rootNode.get(i).get("deTableName").asText().equalsIgnoreCase(datasourceRequest.getTable())) {
tableFields = JsonUtil.parseList(rootNode.get(i).get("fields").toString(), listTypeReference); tableFields = JsonUtil.parseList(rootNode.get(i).get("fields").toString(), listTypeReference);
@ -201,19 +270,17 @@ public class ExcelUtils {
return tableFields; return tableFields;
} }
public ExcelFileData excelSaveAndParse(MultipartFile file) throws DEException { public ExcelFileData excelSaveAndParse(MultipartFile file, String createBy) throws DEException {
String filename = file.getOriginalFilename(); String filename = file.getOriginalFilename();
List<ExcelSheetData> excelSheetDataList = null; List<ExcelSheetData> excelSheetDataList = null;
try { try {
excelSheetDataList = parseExcel(filename, file.getInputStream(), true); excelSheetDataList = parseExcel(filename, file.getInputStream(), true, filename);
} catch (Exception e) { } catch (Exception e) {
DEException.throwException(e); DEException.throwException(e);
} }
List<ExcelSheetData> returnSheetDataList = new ArrayList<>(); List<ExcelSheetData> returnSheetDataList = new ArrayList<>();
returnSheetDataList = excelSheetDataList; returnSheetDataList = excelSheetDataList;
returnSheetDataList = returnSheetDataList.stream() returnSheetDataList = returnSheetDataList.stream().filter(excelSheetData -> !CollectionUtils.isEmpty(excelSheetData.getFields())).collect(Collectors.toList());
.filter(excelSheetData -> !CollectionUtils.isEmpty(excelSheetData.getFields()))
.collect(Collectors.toList());
// save file // save file
String excelId = UUID.randomUUID().toString(); String excelId = UUID.randomUUID().toString();
String filePath = saveFile(file, excelId); String filePath = saveFile(file, excelId);
@ -227,7 +294,7 @@ public class ExcelUtils {
excelSheetData.setSheetExcelId(excelId); excelSheetData.setSheetExcelId(excelId);
excelSheetData.setFileName(filename); excelSheetData.setFileName(filename);
/** /**
* dataease字段类型0-文本1-时间2-整型数值3-浮点数值4-布尔5-地理位置6-二进制 * gisbi字段类型0-文本1-时间2-整型数值3-浮点数值4-布尔5-地理位置6-二进制
*/ */
for (TableField field : excelSheetData.getFields()) { for (TableField field : excelSheetData.getFields()) {
//TEXT LONG DATETIME DOUBLE //TEXT LONG DATETIME DOUBLE
@ -272,17 +339,119 @@ public class ExcelUtils {
return excelFileData; return excelFileData;
} }
public static String checkStatus(DatasourceRequest datasourceRequest) throws FileNotFoundException {
ExcelConfiguration excelConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), ExcelConfiguration.class);
Map<String, String> fileNames = new HashMap<>();
try {
fileNames = downLoadRemoteExcel(excelConfiguration);
return "Success";
} catch (Exception e) {
throw e;
} finally {
if (StringUtils.isNotEmpty(fileNames.get("tranName"))) {
FileUtils.deleteFile(path + fileNames.get("tranName"));
}
}
}
public ExcelFileData parseRemoteExcel(RemoteExcelRequest remoteExcelRequest) throws DEException, FileNotFoundException {
Map<String, String> fileNames = downLoadRemoteExcel(remoteExcelRequest);
FileInputStream fileInputStream = new FileInputStream(path + fileNames.get("tranName"));
List<ExcelSheetData> returnSheetDataList = new ArrayList<>();
try {
returnSheetDataList = parseExcel(fileNames.get("tranName"), fileInputStream, true, fileNames.get("fileName")).stream().filter(excelSheetData -> !CollectionUtils.isEmpty(excelSheetData.getFields())).collect(Collectors.toList());
} catch (Exception e) {
DEException.throwException(e);
}
for (ExcelSheetData excelSheetData : returnSheetDataList) {
excelSheetData.setLastUpdateTime(System.currentTimeMillis());
excelSheetData.setTableName(excelSheetData.getExcelLabel());
excelSheetData.setDeTableName("excel_" + excelSheetData.getExcelLabel() + "_" + UUID.randomUUID().toString().replace("-", "").substring(0, 10));
excelSheetData.setPath(path + fileNames.get("tranName"));
excelSheetData.setSheetId(UUID.randomUUID().toString());
excelSheetData.setSheetExcelId(fileNames.get("tranName").split("\\.")[0]);
excelSheetData.setFileName(fileNames.get("fileName"));
/**
* gisbi字段类型0-文本1-时间2-整型数值3-浮点数值4-布尔5-地理位置6-二进制
*/
for (TableField field : excelSheetData.getFields()) {
//TEXT LONG DATETIME DOUBLE
if (field.getFieldType().equalsIgnoreCase("TEXT")) {
field.setDeType(0);
field.setDeExtractType(0);
}
if (field.getFieldType().equalsIgnoreCase("DATETIME")) {
field.setDeType(1);
field.setDeExtractType(1);
}
if (field.getFieldType().equalsIgnoreCase("LONG")) {
field.setDeType(2);
field.setDeExtractType(2);
}
if (field.getFieldType().equalsIgnoreCase("DOUBLE")) {
field.setDeType(3);
field.setDeExtractType(3);
}
}
long size = 0;
File file = new File(path + fileNames.get("tranName"));
String unit = "B";
if (file.length() / 1024 == 0) {
size = file.length();
}
if (0 < file.length() / 1024 && file.length() / 1024 < 1024) {
size = file.length() / 1024;
unit = "KB";
}
if (1024 <= file.length() / 1024) {
size = file.length() / 1024 / 1024;
unit = "MB";
}
excelSheetData.setSize(size + " " + unit);
}
ExcelFileData excelFileData = new ExcelFileData();
excelFileData.setExcelLabel(fileNames.get("fileName").split("\\.")[0]);
excelFileData.setId(fileNames.get("tranName").split("\\.")[0]);
excelFileData.setPath(path + fileNames.get("tranName"));
excelFileData.setSheets(returnSheetDataList);
if (StringUtils.isNotEmpty(fileNames.get("tranName"))) {
FileUtils.deleteFile(path + fileNames.get("tranName"));
}
return excelFileData;
}
private static Map<String, String> downLoadRemoteExcel(ExcelConfiguration remoteExcelRequest) throws DEException, FileNotFoundException {
Map<String, String> fileNames = new HashMap<>();
if (remoteExcelRequest.getUrl().trim().startsWith("http")) {
HttpClientConfig httpClientConfig = new HttpClientConfig();
if (StringUtils.isNotEmpty(remoteExcelRequest.getUserName()) && StringUtils.isNotEmpty(remoteExcelRequest.getPasswd())) {
String authValue = "Basic " + Base64.getUrlEncoder().encodeToString((remoteExcelRequest.getUserName() + ":" + remoteExcelRequest.getPasswd()).getBytes());
httpClientConfig.addHeader("Authorization", authValue);
}
File p = new File(path);
if (!p.exists()) {
p.mkdirs();
}
fileNames = HttpClientUtil.downloadFile(remoteExcelRequest.getUrl(), httpClientConfig, path);
} else if (remoteExcelRequest.getUrl().trim().startsWith("ftp")) {
fileNames = downLoadFromFtp(remoteExcelRequest);
} else {
DEException.throwException(Translator.get("i18n_unsupported_protocol"));
}
return fileNames;
}
private static String saveFile(MultipartFile file, String fileNameUUID) throws DEException { private static String saveFile(MultipartFile file, String fileNameUUID) throws DEException {
String filePath = null; String filePath = null;
try { try {
String filename = file.getOriginalFilename(); String filename = file.getOriginalFilename();
String suffix = filename.substring(filename.lastIndexOf(".") + 1); String suffix = filename.substring(filename.lastIndexOf(".") + 1);
String dirPath = path + AuthUtils.getUser().getUserId() + "/"; File p = new File(path);
File p = new File(dirPath);
if (!p.exists()) { if (!p.exists()) {
p.mkdirs(); p.mkdirs();
} }
filePath = dirPath + fileNameUUID + "." + suffix; filePath = path + fileNameUUID + "." + suffix;
File f = new File(filePath); File f = new File(filePath);
FileOutputStream fileOutputStream = new FileOutputStream(f); FileOutputStream fileOutputStream = new FileOutputStream(f);
fileOutputStream.write(file.getBytes()); fileOutputStream.write(file.getBytes());
@ -398,7 +567,13 @@ public class ExcelUtils {
super.invokeHead(headMap, context); super.invokeHead(headMap, context);
for (Integer key : headMap.keySet()) { for (Integer key : headMap.keySet()) {
ReadCellData<?> cellData = headMap.get(key); ReadCellData<?> cellData = headMap.get(key);
String value = cellData.getStringValue(); String value = null;
if (cellData.getType().equals(CellDataTypeEnum.STRING)) {
value = cellData.getStringValue();
}
if (cellData.getType().equals(CellDataTypeEnum.NUMBER)) {
value = cellData.getNumberValue().toString();
}
if (StringUtils.isEmpty(value)) { if (StringUtils.isEmpty(value)) {
continue; continue;
} }
@ -439,7 +614,7 @@ public class ExcelUtils {
} }
public List<ExcelSheetData> parseExcel(String filename, InputStream inputStream, boolean isPreview) throws IOException { private List<ExcelSheetData> parseExcel(String filename, InputStream inputStream, boolean isPreview, String originFilename) throws IOException {
List<ExcelSheetData> excelSheetDataList = new ArrayList<>(); List<ExcelSheetData> excelSheetDataList = new ArrayList<>();
String suffix = filename.substring(filename.lastIndexOf(".") + 1); String suffix = filename.substring(filename.lastIndexOf(".") + 1);
if (StringUtils.equalsIgnoreCase(suffix, "xlsx") || StringUtils.equalsIgnoreCase(suffix, "xls")) { if (StringUtils.equalsIgnoreCase(suffix, "xlsx") || StringUtils.equalsIgnoreCase(suffix, "xls")) {
@ -494,11 +669,12 @@ public class ExcelUtils {
List<TableField> fields = new ArrayList<>(); List<TableField> fields = new ArrayList<>();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String s = reader.readLine();// first line String s = reader.readLine();// first line
if (StringUtils.isNotEmpty(s)) {
String[] split = s.split(","); String[] split = s.split(",");
for (int i = 0; i < split.length; i++) { for (int i = 0; i < split.length; i++) {
String filedName = split[i]; String filedName = split[i];
if (StringUtils.isEmpty(filedName)) { if (StringUtils.isEmpty(filedName)) {
DEException.throwException("首行行中不允许有空单元格!"); DEException.throwException(Translator.get("i18n_excel_error_first_row"));
} }
if (filedName.startsWith(UFEFF)) { if (filedName.startsWith(UFEFF)) {
filedName = filedName.replace(UFEFF, ""); filedName = filedName.replace(UFEFF, "");
@ -510,6 +686,7 @@ public class ExcelUtils {
tableFiled.setChecked(true); tableFiled.setChecked(true);
fields.add(tableFiled); fields.add(tableFiled);
} }
}
List<String[]> data = csvData(reader, isPreview, fields.size()); List<String[]> data = csvData(reader, isPreview, fields.size());
if (isPreview) { if (isPreview) {
@ -535,7 +712,7 @@ public class ExcelUtils {
excelSheetData.setFields(fields); excelSheetData.setFields(fields);
excelSheetData.setData(data); excelSheetData.setData(data);
excelSheetData.setFileName(filename); excelSheetData.setFileName(filename);
excelSheetData.setExcelLabel(filename.substring(0, filename.lastIndexOf('.'))); excelSheetData.setExcelLabel(originFilename.substring(0, originFilename.lastIndexOf('.')));
excelSheetDataList.add(excelSheetData); excelSheetDataList.add(excelSheetData);
} }
inputStream.close(); inputStream.close();
@ -560,5 +737,74 @@ public class ExcelUtils {
return excelSheetDataList; return excelSheetDataList;
} }
public static Map<String, String> downLoadFromFtp(ExcelConfiguration remoteExcelRequest) {
Map<String, String> fileNames = new HashMap<>();
String username = "";
String password = "";
String serverAddress = "";
String filePath = "";
if (remoteExcelRequest.getUrl().contains("@")) {
String regex = "ftp://([^:]+):([^@]+)@([^/]+)(.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(remoteExcelRequest.getUrl());
if (matcher.find()) {
username = matcher.group(1);
password = matcher.group(2);
serverAddress = matcher.group(3);
filePath = matcher.group(4);
} else {
DEException.throwException(Translator.get("i18n_invalid_address"));
}
} else {
String regex = "ftp://([^/]+)(.*)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(remoteExcelRequest.getUrl());
if (matcher.find()) {
serverAddress = matcher.group(1);
filePath = matcher.group(2);
} else {
DEException.throwException(Translator.get("i18n_invalid_address"));
}
}
if (StringUtils.isNotEmpty(remoteExcelRequest.getUserName())) {
username = remoteExcelRequest.getUserName();
}
if (StringUtils.isNotEmpty(remoteExcelRequest.getPasswd())) {
password = remoteExcelRequest.getPasswd();
}
filePath = filePath.startsWith("/") ? filePath.substring(1) : filePath;
String suffix = filePath.substring(filePath.lastIndexOf(".") + 1);
if (!Arrays.asList("csv", "xlsx", "xls").contains(suffix)) {
DEException.throwException(Translator.get("i18n_unsupported_file_format"));
}
String tranName = UUID.randomUUID().toString() + "." + suffix;
String localFilePath = path + tranName;
fileNames.put("fileName", filePath);
fileNames.put("tranName", tranName);
try {
URL url;
if (StringUtils.isNotEmpty(username) && StringUtils.isNotEmpty(password)) {
url = new URL("ftp://" + username + ":" + URLEncoder.encode(password, StandardCharsets.UTF_8) + "@" + serverAddress + "/" + filePath);
} else {
url = new URL("ftp://" + serverAddress + "/" + filePath);
}
URLConnection conn = url.openConnection();
InputStream inputStream = conn.getInputStream();
FileOutputStream outputStream = new FileOutputStream(localFilePath);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
inputStream.close();
outputStream.close();
} catch (IOException e) {
DEException.throwException(Translator.get("i18n_file_download_failed") + ", " + e.getMessage());
}
return fileNames;
}
} }

View File

@ -46,12 +46,7 @@ public class H2EngineProvider extends EngineProvider {
if (tableFields.get(i).isChecked()) { if (tableFields.get(i).isChecked()) {
if (StringUtils.isEmpty(strings[i])) { if (StringUtils.isEmpty(strings[i])) {
String type = tableFields.get(i).getType() == null ? tableFields.get(i).getFieldType() : tableFields.get(i).getType(); String type = tableFields.get(i).getType() == null ? tableFields.get(i).getFieldType() : tableFields.get(i).getType();
if (type.equals("LONG") || type.equals("DOUBLE")) {
strings1[length] = "0";
} else {
strings1[length] = null; strings1[length] = null;
}
} else { } else {
strings1[length] = strings[i].replace("\\", "\\\\").replace("'", "''"); strings1[length] = strings[i].replace("\\", "\\\\").replace("'", "''");
} }
@ -61,7 +56,7 @@ public class H2EngineProvider extends EngineProvider {
values.append("('").append(String.join("','", Arrays.asList(strings1))) values.append("('").append(String.join("','", Arrays.asList(strings1)))
.append("'),"); .append("'),");
} }
return (insertSql + values.substring(0, values.length() - 1)); return (insertSql + values.substring(0, values.length() - 1)).replaceAll("'null'", "null");
} }

View File

@ -54,11 +54,7 @@ public class MysqlEngineProvider extends EngineProvider {
if (tableFields.get(i).isChecked()) { if (tableFields.get(i).isChecked()) {
if (StringUtils.isEmpty(strings[i])) { if (StringUtils.isEmpty(strings[i])) {
String type = tableFields.get(i).getType() == null ? tableFields.get(i).getFieldType() : tableFields.get(i).getType(); String type = tableFields.get(i).getType() == null ? tableFields.get(i).getFieldType() : tableFields.get(i).getType();
if (type.equals("LONG") || type.equals("DOUBLE")) {
strings1[length] = "0";
} else {
strings1[length] = null; strings1[length] = null;
}
} else { } else {
strings1[length] = strings[i].replace("\\", "\\\\").replace("'", "\\'"); strings1[length] = strings[i].replace("\\", "\\\\").replace("'", "\\'");
} }

View File

@ -33,7 +33,7 @@ import java.util.Map;
@RequestMapping("/datasourceDriver") @RequestMapping("/datasourceDriver")
public class DatasourceDriverServer implements DatasourceDriverApi { public class DatasourceDriverServer implements DatasourceDriverApi {
@Value("${gisbi.path.custom-drivers:/opt/gisbi/custom-drivers/}") @Value("${gisbi.path.custom-drivers:/opt/gisbi2.0/custom-drivers/}")
private String DRIVER_PATH; private String DRIVER_PATH;
@Resource @Resource

View File

@ -10,8 +10,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import io.gisbi.api.dataset.dto.PreviewSqlDTO; import io.gisbi.api.dataset.dto.PreviewSqlDTO;
import io.gisbi.api.ds.DatasourceApi; import io.gisbi.api.ds.DatasourceApi;
import io.gisbi.api.ds.vo.*; import io.gisbi.api.ds.vo.*;
import io.gisbi.api.permissions.relation.api.RelationApi;
import io.gisbi.commons.constants.TaskStatus; import io.gisbi.commons.constants.TaskStatus;
import io.gisbi.constant.DataSourceType;
import io.gisbi.constant.LogOT; import io.gisbi.constant.LogOT;
import io.gisbi.constant.LogST; import io.gisbi.constant.LogST;
import io.gisbi.constant.SQLConstants; import io.gisbi.constant.SQLConstants;
@ -59,10 +59,8 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream; import java.io.*;
import java.io.ByteArrayOutputStream; import java.lang.reflect.InvocationTargetException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -103,11 +101,15 @@ public class DatasourceServer implements DatasourceApi {
private CoreUserManage coreUserManage; private CoreUserManage coreUserManage;
@Autowired(required = false) @Autowired(required = false)
private PluginManageApi pluginManage; private PluginManageApi pluginManage;
@Autowired(required = false)
private RelationApi relationManage;
public enum UpdateType { public enum UpdateType {
all_scope, add_scope all_scope, add_scope
} }
public static final List<String> notFullDs = List.of("folder", "Excel", "API");
private TypeReference<List<ApiDefinition>> listTypeReference = new TypeReference<List<ApiDefinition>>() { private TypeReference<List<ApiDefinition>> listTypeReference = new TypeReference<List<ApiDefinition>>() {
}; };
@Resource @Resource
@ -122,7 +124,7 @@ public class DatasourceServer implements DatasourceApi {
} }
public boolean checkRepeat(@RequestBody BusiDsRequest dataSourceDTO) { public boolean checkRepeat(@RequestBody BusiDsRequest dataSourceDTO) {
if (Arrays.asList("Excel", "folder", "es").contains(dataSourceDTO.getType()) || dataSourceDTO.getType().contains("API")) { if (Arrays.asList("folder", "es").contains(dataSourceDTO.getType()) || dataSourceDTO.getType().contains("API") || dataSourceDTO.getType().contains("Excel")) {
return false; return false;
} }
BusiNodeRequest request = new BusiNodeRequest(); BusiNodeRequest request = new BusiNodeRequest();
@ -145,7 +147,7 @@ public class DatasourceServer implements DatasourceApi {
DatasourceConfiguration configuration = JsonUtil.parseObject(dataSourceDTO.getConfiguration(), DatasourceConfiguration.class); DatasourceConfiguration configuration = JsonUtil.parseObject(dataSourceDTO.getConfiguration(), DatasourceConfiguration.class);
boolean hasRepeat = false; boolean hasRepeat = false;
for (CoreDatasource datasource : datasources) { for (CoreDatasource datasource : datasources) {
if (Arrays.asList("API", "Excel", "folder").contains(datasource.getType())) { if (notFullDs.stream().anyMatch(e -> datasource.getType().contains(e))) {
continue; continue;
} }
if (StringUtils.isEmpty(datasource.getConfiguration())) { if (StringUtils.isEmpty(datasource.getConfiguration())) {
@ -207,7 +209,7 @@ public class DatasourceServer implements DatasourceApi {
if (StringUtils.isEmpty(dataSourceDTO.getName())) { if (StringUtils.isEmpty(dataSourceDTO.getName())) {
DEException.throwException("名称不能为空!"); DEException.throwException("名称不能为空!");
} }
CoreDatasource datasource = dataSourceManage.getCoreDatasource(dataSourceDTO.getId()); CoreDatasource datasource = dataSourceManage.getDatasource(dataSourceDTO.getId());
datasource.setName(dataSourceDTO.getName()); datasource.setName(dataSourceDTO.getName());
dataSourceDTO.setPid(datasource.getPid()); dataSourceDTO.setPid(datasource.getPid());
dataSourceManage.checkName(dataSourceDTO); dataSourceManage.checkName(dataSourceDTO);
@ -243,7 +245,6 @@ public class DatasourceServer implements DatasourceApi {
} }
preCheckDs(dataSourceDTO); preCheckDs(dataSourceDTO);
dataSourceDTO.setId(IDUtils.snowID()); dataSourceDTO.setId(IDUtils.snowID());
dataSourceDTO.setAppId(busiDsRequest.getAppId()); //补充了项目ID
dataSourceDTO.setCreateTime(System.currentTimeMillis()); dataSourceDTO.setCreateTime(System.currentTimeMillis());
dataSourceDTO.setUpdateTime(System.currentTimeMillis()); dataSourceDTO.setUpdateTime(System.currentTimeMillis());
try { try {
@ -278,6 +279,20 @@ public class DatasourceServer implements DatasourceApi {
} }
datasourceSyncManage.extractExcelData(coreDatasource, "all_scope"); datasourceSyncManage.extractExcelData(coreDatasource, "all_scope");
} else if (dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { } else if (dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(dataSourceDTO);
List<DatasetTableDTO> tables = (List<DatasetTableDTO>) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest);
checkName(tables.stream().map(DatasetTableDTO::getName).collect(Collectors.toList()));
for (DatasetTableDTO api : tables) {
datasourceRequest.setTable(api.getTableName());
List<TableField> tableFields = (List<TableField>) invokeMethod(coreDatasource.getType(), "getTableFields", DatasourceRequest.class, datasourceRequest);
try {
datasourceSyncManage.createEngineTable(datasourceRequest.getTable(), tableFields);
} catch (Exception e) {
DEException.throwException("Failed to create table " + datasourceRequest.getTable() + ": " + e.getMessage());
}
}
CoreDatasourceTask coreDatasourceTask = new CoreDatasourceTask(); CoreDatasourceTask coreDatasourceTask = new CoreDatasourceTask();
BeanUtils.copyBean(coreDatasourceTask, dataSourceDTO.getSyncSetting()); BeanUtils.copyBean(coreDatasourceTask, dataSourceDTO.getSyncSetting());
coreDatasourceTask.setName(coreDatasource.getName() + "-task"); coreDatasourceTask.setName(coreDatasource.getName() + "-task");
@ -295,19 +310,40 @@ public class DatasourceServer implements DatasourceApi {
coreDatasourceTask.setTaskStatus(TaskStatus.WaitingForExecution.name()); coreDatasourceTask.setTaskStatus(TaskStatus.WaitingForExecution.name());
datasourceTaskServer.insert(coreDatasourceTask); datasourceTaskServer.insert(coreDatasourceTask);
datasourceSyncManage.addSchedule(coreDatasourceTask); datasourceSyncManage.addSchedule(coreDatasourceTask);
} else if (dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.ExcelRemote.name())) {
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(dataSourceDTO); datasourceRequest.setDatasource(dataSourceDTO);
List<DatasetTableDTO> tables = (List<DatasetTableDTO>) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest); List<DatasetTableDTO> tables = ExcelUtils.getTables(datasourceRequest);
checkName(tables.stream().map(DatasetTableDTO::getName).collect(Collectors.toList())); for (DatasetTableDTO table : tables) {
for (DatasetTableDTO api : tables) { datasourceRequest.setTable(table.getTableName());
datasourceRequest.setTable(api.getTableName()); List<TableField> tableFields = ExcelUtils.getTableFields(datasourceRequest);
List<TableField> tableFields = (List<TableField>) invokeMethod(coreDatasource.getType(), "getTableFields", DatasourceRequest.class, datasourceRequest);
try { try {
datasourceSyncManage.createEngineTable(datasourceRequest.getTable(), tableFields); datasourceSyncManage.createEngineTable(datasourceRequest.getTable(), tableFields);
} catch (Exception e) { } catch (Exception e) {
DEException.throwException("Failed to create table " + datasourceRequest.getTable() + ": " + e.getMessage()); if (e.getMessage().toLowerCase().contains("Row size too large".toLowerCase())) {
DEException.throwException("文本内容超出最大支持范围: " + datasourceRequest.getTable() + ", " + e.getMessage());
} else {
DEException.throwException("Failed to create table " + datasourceRequest.getTable() + ", " + e.getMessage());
} }
} }
}
CoreDatasourceTask coreDatasourceTask = new CoreDatasourceTask();
BeanUtils.copyBean(coreDatasourceTask, dataSourceDTO.getSyncSetting());
coreDatasourceTask.setName(coreDatasource.getName() + "-task");
coreDatasourceTask.setDsId(coreDatasource.getId());
if (coreDatasourceTask.getStartTime() == null) {
coreDatasourceTask.setStartTime(System.currentTimeMillis() - 20 * 1000);
}
if (StringUtils.equalsIgnoreCase(coreDatasourceTask.getSyncRate(), RIGHTNOW.toString())) {
coreDatasourceTask.setCron(null);
} else {
if (coreDatasourceTask.getEndTime() != null && coreDatasourceTask.getEndTime() > 0 && coreDatasourceTask.getStartTime() > coreDatasourceTask.getEndTime()) {
DEException.throwException("结束时间不能小于开始时间!");
}
}
coreDatasourceTask.setTaskStatus(TaskStatus.WaitingForExecution.name());
datasourceTaskServer.insert(coreDatasourceTask);
datasourceSyncManage.addSchedule(coreDatasourceTask);
} else { } else {
checkParams(dataSourceDTO.getConfiguration()); checkParams(dataSourceDTO.getConfiguration());
calciteProvider.update(dataSourceDTO); calciteProvider.update(dataSourceDTO);
@ -347,13 +383,14 @@ public class DatasourceServer implements DatasourceApi {
datasourceRequest.setDatasource(dataSourceDTO); datasourceRequest.setDatasource(dataSourceDTO);
List<String> toCreateTables = new ArrayList<>(); List<String> toCreateTables = new ArrayList<>();
List<String> toDeleteTables = new ArrayList<>(); List<String> toDeleteTables = new ArrayList<>();
if (dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { if (dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) || dataSourceDTO.getType().equals(DatasourceConfiguration.DatasourceType.ExcelRemote.name())) {
requestDatasource.setEnableDataFill(null); requestDatasource.setEnableDataFill(null);
List<DatasetTableDTO> sourceTableDTOs = (List<DatasetTableDTO>) invokeMethod(sourceData.getType(), "getApiTables", DatasourceRequest.class, sourceTableRequest); List<DatasetTableDTO> sourceTableDTOs = dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) ? (List<DatasetTableDTO>) invokeMethod(sourceData.getType(), "getApiTables", DatasourceRequest.class, sourceTableRequest) : ExcelUtils.getTables(sourceTableRequest);
List<String> sourceTables = sourceTableDTOs.stream().map(DatasetTableDTO::getTableName).toList(); List<String> sourceTables = sourceTableDTOs.stream().map(DatasetTableDTO::getTableName).toList();
List<DatasetTableDTO> datasetTableDTOS = (List<DatasetTableDTO>) invokeMethod(sourceData.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest); List<DatasetTableDTO> datasetTableDTOS = dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) ? (List<DatasetTableDTO>) invokeMethod(sourceData.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest) : ExcelUtils.getTables(datasourceRequest);
List<String> tables = datasetTableDTOS.stream().map(DatasetTableDTO::getTableName).collect(Collectors.toList()); List<String> tables = datasetTableDTOS.stream().map(DatasetTableDTO::getTableName).collect(Collectors.toList());
checkName(datasetTableDTOS.stream().map(DatasetTableDTO::getName).collect(Collectors.toList())); checkName(datasetTableDTOS.stream().map(DatasetTableDTO::getName).collect(Collectors.toList()));
toCreateTables = tables.stream().filter(table -> !sourceTables.contains(table)).collect(Collectors.toList()); toCreateTables = tables.stream().filter(table -> !sourceTables.contains(table)).collect(Collectors.toList());
toDeleteTables = sourceTables.stream().filter(table -> !tables.contains(table)).collect(Collectors.toList()); toDeleteTables = sourceTables.stream().filter(table -> !tables.contains(table)).collect(Collectors.toList());
@ -361,10 +398,10 @@ public class DatasourceServer implements DatasourceApi {
for (String sourceTable : sourceTables) { for (String sourceTable : sourceTables) {
if (table.equals(sourceTable)) { if (table.equals(sourceTable)) {
datasourceRequest.setTable(table); datasourceRequest.setTable(table);
List<TableField> tableFieldList = (List<TableField>) invokeMethod(datasourceRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, datasourceRequest); List<TableField> tableFieldList = dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) ? (List<TableField>) invokeMethod(datasourceRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, datasourceRequest) : ExcelUtils.getTableFields(datasourceRequest);
List<String> tableFields = tableFieldList.stream().map(TableField::getName).sorted().collect(Collectors.toList()); List<String> tableFields = tableFieldList.stream().map(TableField::getName).sorted().collect(Collectors.toList());
sourceTableRequest.setTable(sourceTable); sourceTableRequest.setTable(sourceTable);
List<TableField> sourceTableFieldList = (List<TableField>) invokeMethod(sourceTableRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, sourceTableRequest); List<TableField> sourceTableFieldList = dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) ? (List<TableField>) invokeMethod(sourceTableRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, sourceTableRequest) : ExcelUtils.getTableFields(sourceTableRequest);
List<String> sourceTableFields = sourceTableFieldList.stream().map(TableField::getName).sorted().collect(Collectors.toList()); List<String> sourceTableFields = sourceTableFieldList.stream().map(TableField::getName).sorted().collect(Collectors.toList());
if (!String.join(",", tableFields).equals(String.join(",", sourceTableFields))) { if (!String.join(",", tableFields).equals(String.join(",", sourceTableFields))) {
toDeleteTables.add(table); toDeleteTables.add(table);
@ -397,7 +434,7 @@ public class DatasourceServer implements DatasourceApi {
for (String toCreateTable : toCreateTables) { for (String toCreateTable : toCreateTables) {
datasourceRequest.setTable(toCreateTable); datasourceRequest.setTable(toCreateTable);
try { try {
datasourceSyncManage.createEngineTable(toCreateTable, (List<TableField>) invokeMethod(sourceTableRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, datasourceRequest)); datasourceSyncManage.createEngineTable(toCreateTable, dataSourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) ? (List<TableField>) invokeMethod(sourceTableRequest.getDatasource().getType(), "getTableFields", DatasourceRequest.class, datasourceRequest) : ExcelUtils.getTableFields(datasourceRequest));
} catch (Exception e) { } catch (Exception e) {
DEException.throwException("Failed to create table " + toCreateTable + ", " + e.getMessage()); DEException.throwException("Failed to create table " + toCreateTable + ", " + e.getMessage());
} }
@ -539,13 +576,46 @@ public class DatasourceServer implements DatasourceApi {
} }
} }
List<CoreDatasource> dsList = datasourceMapper.selectList(queryWrapper); List<CoreDatasource> dsList = datasourceMapper.selectList(queryWrapper);
for (CoreDatasource datasource : dsList) { for (CoreDatasource datasource : dsList) {
DatasourceDTO datasourceDTO = new DatasourceDTO();
BeanUtils.copyBean(datasourceDTO, datasource);
if (datasourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.toString())) {
List<ApiDefinition> apiDefinitionList = JsonUtil.parseList(datasourceDTO.getConfiguration(), listTypeReference);
int success = 0;
for (ApiDefinition apiDefinition : apiDefinitionList) {
String status = null;
if (StringUtils.isNotEmpty(datasourceDTO.getStatus())) {
JsonNode jsonNode = null;
try { try {
list.add(convertCoreDatasource(datasource.getId(), false, datasource)); jsonNode = objectMapper.readTree(datasourceDTO.getStatus());
} catch (Exception e) { for (JsonNode node : jsonNode) {
e.printStackTrace(); if (node.get("name").asText().equals(apiDefinition.getName())) {
status = node.get("status").asText();
} }
} }
apiDefinition.setStatus(status);
} catch (Exception ignore) {
}
}
if (StringUtils.isNotEmpty(status) && status.equalsIgnoreCase("Success")) {
success++;
}
}
if (success == apiDefinitionList.size()) {
datasourceDTO.setStatus("Success");
} else {
if (success > 0 && success < apiDefinitionList.size()) {
datasourceDTO.setStatus("Warning");
} else {
datasourceDTO.setStatus("Error");
}
}
}
list.add(datasourceDTO);
}
return list; return list;
} }
@ -558,7 +628,7 @@ public class DatasourceServer implements DatasourceApi {
@DeLog(id = "#p0", ot = LogOT.DELETE, st = LogST.DATASOURCE) @DeLog(id = "#p0", ot = LogOT.DELETE, st = LogST.DATASOURCE)
@Override @Override
public void delete(Long datasourceId) throws DEException { public void delete(Long datasourceId) throws DEException {
Objects.requireNonNull(CommonBeanFactory.getBean(DatasourceServer.class)).recursionDel(datasourceId); Objects.requireNonNull(io.gisbi.utils.CommonBeanFactory.getBean(DatasourceServer.class)).recursionDel(datasourceId);
} }
public void recursionDel(Long datasourceId) throws DEException { public void recursionDel(Long datasourceId) throws DEException {
@ -597,9 +667,8 @@ public class DatasourceServer implements DatasourceApi {
datasourceTaskServer.deleteByDSId(datasourceId); datasourceTaskServer.deleteByDSId(datasourceId);
} }
datasourceMapper.deleteById(datasourceId); datasourceMapper.deleteById(datasourceId);
if (!Arrays.asList("API", "Excel", "folder").contains(coreDatasource.getType())) { if (notFullDs.stream().allMatch(e -> !coreDatasource.getType().contains(e))) {
calciteProvider.delete(coreDatasource); calciteProvider.delete(coreDatasource);
} }
@ -665,6 +734,32 @@ public class DatasourceServer implements DatasourceApi {
datasourceRequest.setDatasource(datasourceDTO); datasourceRequest.setDatasource(datasourceDTO);
if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
List<DatasetTableDTO> datasetTableDTOS = (List<DatasetTableDTO>) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest); List<DatasetTableDTO> datasetTableDTOS = (List<DatasetTableDTO>) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest);
return datasetTableDTOS;
}
if (coreDatasource.getType().contains("Excel")) {
return ExcelUtils.getTables(datasourceRequest);
}
Provider provider = ProviderFactory.getProvider(datasourceDTO.getType());
return provider.getTables(datasourceRequest);
}
@Override
public List<DatasetTableDTO> getTableStatus(DatasetTableDTO datasetTableDTO) throws DEException {
CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(datasetTableDTO.getDatasourceId());
if (coreDatasource == null) {
DEException.throwException("无效数据源!");
}
List<DatasetTableDTO> datasetTableDTOS = new ArrayList<>();
DatasourceDTO datasourceDTO = new DatasourceDTO();
BeanUtils.copyBean(datasourceDTO, coreDatasource);
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(datasourceDTO);
if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
datasetTableDTOS = (List<DatasetTableDTO>) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest);
}
if (coreDatasource.getType().equalsIgnoreCase(DatasourceConfiguration.DatasourceType.ExcelRemote.name())) {
datasetTableDTOS = ExcelUtils.getTables(datasourceRequest);
}
datasetTableDTOS.forEach(datasetTableDTO1 -> { datasetTableDTOS.forEach(datasetTableDTO1 -> {
CoreDatasourceTaskLog log = datasourceTaskServer.lastSyncLogForTable(datasetTableDTO.getDatasourceId(), datasetTableDTO1.getTableName()); CoreDatasourceTaskLog log = datasourceTaskServer.lastSyncLogForTable(datasetTableDTO.getDatasourceId(), datasetTableDTO1.getTableName());
if (log != null) { if (log != null) {
@ -674,12 +769,6 @@ public class DatasourceServer implements DatasourceApi {
}); });
return datasetTableDTOS; return datasetTableDTOS;
} }
if (coreDatasource.getType().equals("Excel")) {
return ExcelUtils.getTables(datasourceRequest);
}
Provider provider = ProviderFactory.getProvider(datasourceDTO.getType());
return provider.getTables(datasourceRequest);
}
@Override @Override
public List<TableField> getTableField(Map<String, String> req) throws DEException { public List<TableField> getTableField(Map<String, String> req) throws DEException {
@ -693,7 +782,7 @@ public class DatasourceServer implements DatasourceApi {
CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(Long.parseLong(datasourceId)); CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(Long.parseLong(datasourceId));
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource)); datasourceRequest.setDatasource(transDTO(coreDatasource));
if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) || coreDatasource.getType().equals("Excel")) { if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) || coreDatasource.getType().contains("Excel")) {
datasourceRequest.setDatasource(transDTO(engineManage.getDeEngine())); datasourceRequest.setDatasource(transDTO(engineManage.getDeEngine()));
DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO(); DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO();
BeanUtils.copyBean(datasourceSchemaDTO, engineManage.getDeEngine()); BeanUtils.copyBean(datasourceSchemaDTO, engineManage.getDeEngine());
@ -704,7 +793,7 @@ public class DatasourceServer implements DatasourceApi {
Provider provider = ProviderFactory.getProvider(datasourceSchemaDTO.getType()); Provider provider = ProviderFactory.getProvider(datasourceSchemaDTO.getType());
List<TableField> tableFields = (List<TableField>) provider.fetchTableField(datasourceRequest); List<TableField> tableFields = (List<TableField>) provider.fetchTableField(datasourceRequest);
return tableFields.stream().filter(tableField -> { return tableFields.stream().filter(tableField -> {
return !tableField.getOriginName().equalsIgnoreCase("dataease_uuid"); return !tableField.getOriginName().equalsIgnoreCase("gisbi_uuid");
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
@ -757,13 +846,13 @@ public class DatasourceServer implements DatasourceApi {
private static final Integer replace = 0; private static final Integer replace = 0;
private static final Integer append = 1; private static final Integer append = 1;
public ExcelFileData excelUpload(@RequestParam("file") MultipartFile file, @RequestParam("id") long datasourceId, @RequestParam("editType") Integer editType) throws DEException { public ExcelFileData uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("id") long datasourceId, @RequestParam("editType") Integer editType) throws DEException {
CoreDatasource coreDatasource = null; CoreDatasource coreDatasource = null;
if (ObjectUtils.isNotEmpty(datasourceId) && 0L != datasourceId) { if (ObjectUtils.isNotEmpty(datasourceId) && 0L != datasourceId) {
coreDatasource = dataSourceManage.getCoreDatasource(datasourceId); coreDatasource = dataSourceManage.getCoreDatasource(datasourceId);
} }
ExcelUtils excelUtils = new ExcelUtils(); ExcelUtils excelUtils = new ExcelUtils();
ExcelFileData excelFileData = excelUtils.excelSaveAndParse(file); ExcelFileData excelFileData = excelUtils.excelSaveAndParse(file, String.valueOf(AuthUtils.getUser().getUserId()));
if (Objects.equals(editType, append)) { //按照excel sheet 名称匹配替换0追加1 if (Objects.equals(editType, append)) { //按照excel sheet 名称匹配替换0追加1
if (coreDatasource != null) { if (coreDatasource != null) {
@ -814,6 +903,39 @@ public class DatasourceServer implements DatasourceApi {
return excelFileData; return excelFileData;
} }
public ExcelFileData loadRemoteFile(RemoteExcelRequest remoteExcelRequest) throws DEException, IOException {
remoteExcelRequest.setUserName(new String(Base64.getDecoder().decode(remoteExcelRequest.getUserName())));
remoteExcelRequest.setPasswd(new String(Base64.getDecoder().decode(remoteExcelRequest.getPasswd())));
ExcelFileData excelFileData = new ExcelUtils().parseRemoteExcel(remoteExcelRequest);
CoreDatasource coreDatasource = null;
if (ObjectUtils.isNotEmpty(remoteExcelRequest.getDatasourceId()) && 0L != remoteExcelRequest.getDatasourceId()) {
coreDatasource = dataSourceManage.getCoreDatasource(remoteExcelRequest.getDatasourceId());
}
if (coreDatasource != null) {
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource));
List<DatasetTableDTO> datasetTableDTOS = ExcelUtils.getTables(datasourceRequest);
for (ExcelSheetData sheet : excelFileData.getSheets()) {
for (DatasetTableDTO datasetTableDTO : datasetTableDTOS) {
if (excelDataTableName(datasetTableDTO.getTableName()).equals(sheet.getTableName())) {
sheet.setDeTableName(datasetTableDTO.getTableName());
}
}
}
}
for (ExcelSheetData sheet : excelFileData.getSheets()) {
for (int i = 0; i < sheet.getFields().size() - 1; i++) {
for (int j = i + 1; j < sheet.getFields().size(); j++) {
if (sheet.getFields().get(i).getName().equalsIgnoreCase(sheet.getFields().get(j).getName())) {
DEException.throwException(sheet.getExcelLabel() + Translator.get("i18n_field_name_repeat") + sheet.getFields().get(i).getName());
}
}
}
}
return excelFileData;
}
private boolean isEqual(List<TableField> newTableFields, List<TableField> oldTableFields) { private boolean isEqual(List<TableField> newTableFields, List<TableField> oldTableFields) {
if (CollectionUtils.isEmpty(newTableFields) || CollectionUtils.isEmpty(oldTableFields)) { if (CollectionUtils.isEmpty(newTableFields) || CollectionUtils.isEmpty(oldTableFields)) {
return false; return false;
@ -868,6 +990,7 @@ public class DatasourceServer implements DatasourceApi {
public ApiDefinition checkApiDatasource(Map<String, String> request) throws DEException { public ApiDefinition checkApiDatasource(Map<String, String> request) throws DEException {
ApiDefinition apiDefinition = JsonUtil.parseObject(new String(java.util.Base64.getDecoder().decode(request.get("data"))), ApiDefinition.class); ApiDefinition apiDefinition = JsonUtil.parseObject(new String(java.util.Base64.getDecoder().decode(request.get("data"))), ApiDefinition.class);
apiDefinition.setType("table");
if (request.keySet().contains("type") && request.get("type").equals("apiStructure")) { if (request.keySet().contains("type") && request.get("type").equals("apiStructure")) {
apiDefinition.setShowApiStructure(true); apiDefinition.setShowApiStructure(true);
} }
@ -923,6 +1046,8 @@ public class DatasourceServer implements DatasourceApi {
String status = null; String status = null;
if (coreDatasource.getType().startsWith("API")) { if (coreDatasource.getType().startsWith("API")) {
status = (String) invokeMethod(coreDatasource.getType(), "checkAPIStatus", DatasourceRequest.class, datasourceRequest); status = (String) invokeMethod(coreDatasource.getType(), "checkAPIStatus", DatasourceRequest.class, datasourceRequest);
} else if (coreDatasource.getType().startsWith("Excel")) {
status = ExcelUtils.checkStatus(datasourceRequest);
} else { } else {
Provider provider = ProviderFactory.getProvider(coreDatasource.getType()); Provider provider = ProviderFactory.getProvider(coreDatasource.getType());
status = provider.checkStatus(datasourceRequest); status = provider.checkStatus(datasourceRequest);
@ -949,6 +1074,7 @@ public class DatasourceServer implements DatasourceApi {
PreviewSqlDTO previewSqlDTO = new PreviewSqlDTO(); PreviewSqlDTO previewSqlDTO = new PreviewSqlDTO();
previewSqlDTO.setSql(sql); previewSqlDTO.setSql(sql);
previewSqlDTO.setDatasourceId(id); previewSqlDTO.setDatasourceId(id);
previewSqlDTO.setIsCross(false);
return datasetDataManage.previewSql(previewSqlDTO); return datasetDataManage.previewSql(previewSqlDTO);
} }
@ -980,7 +1106,12 @@ public class DatasourceServer implements DatasourceApi {
CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(dsId); CoreDatasource coreDatasource = dataSourceManage.getCoreDatasource(dsId);
DatasourceRequest datasourceRequest = new DatasourceRequest(); DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setDatasource(transDTO(coreDatasource)); datasourceRequest.setDatasource(transDTO(coreDatasource));
List<DatasetTableDTO> datasetTableDTOS = (List<DatasetTableDTO>) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest); List<DatasetTableDTO> datasetTableDTOS = new ArrayList<>();
if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.toString())) {
datasetTableDTOS = (List<DatasetTableDTO>) invokeMethod(coreDatasource.getType(), "getApiTables", DatasourceRequest.class, datasourceRequest);
} else {
datasetTableDTOS = ExcelUtils.getTables(datasourceRequest);
}
for (int i = 0; i < pager.getRecords().size(); i++) { for (int i = 0; i < pager.getRecords().size(); i++) {
for (int i1 = 0; i1 < datasetTableDTOS.size(); i1++) { for (int i1 = 0; i1 < datasetTableDTOS.size(); i1++) {
if (pager.getRecords().get(i).getTableName().equalsIgnoreCase(datasetTableDTOS.get(i1).getTableName())) { if (pager.getRecords().get(i).getTableName().equalsIgnoreCase(datasetTableDTOS.get(i1).getTableName())) {
@ -1186,6 +1317,17 @@ public class DatasourceServer implements DatasourceApi {
datasourceDTO.setStatus("Error"); datasourceDTO.setStatus("Error");
} }
} }
} else {
if (hidePw) {
Provider provider = ProviderFactory.getProvider(datasourceDTO.getType());
provider.hidePW(datasourceDTO);
}
}
if (datasourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.Excel.toString())) {
datasourceDTO.setFileName(ExcelUtils.getFileName(datasource));
datasourceDTO.setSize(ExcelUtils.getSize(datasource));
}
if (datasourceDTO.getType().equalsIgnoreCase(DatasourceConfiguration.DatasourceType.ExcelRemote.name()) || datasourceDTO.getType().contains(DatasourceConfiguration.DatasourceType.API.toString())) {
CoreDatasourceTask coreDatasourceTask = datasourceTaskServer.selectByDSId(datasourceDTO.getId()); CoreDatasourceTask coreDatasourceTask = datasourceTaskServer.selectByDSId(datasourceDTO.getId());
TaskDTO taskDTO = new TaskDTO(); TaskDTO taskDTO = new TaskDTO();
BeanUtils.copyBean(taskDTO, coreDatasourceTask); BeanUtils.copyBean(taskDTO, coreDatasourceTask);
@ -1194,15 +1336,6 @@ public class DatasourceServer implements DatasourceApi {
if (task != null) { if (task != null) {
datasourceDTO.setLastSyncTime(task.getStartTime()); datasourceDTO.setLastSyncTime(task.getStartTime());
} }
} else {
if (hidePw) {
Provider provider = ProviderFactory.getProvider(datasourceDTO.getType());
provider.hidePW(datasourceDTO);
}
}
if (datasourceDTO.getType().equalsIgnoreCase(DatasourceConfiguration.DatasourceType.Excel.toString())) {
datasourceDTO.setFileName(ExcelUtils.getFileName(datasource));
datasourceDTO.setSize(ExcelUtils.getSize(datasource));
} }
datasourceDTO.setConfiguration(RsaUtils.symmetricEncrypt(datasourceDTO.getConfiguration())); datasourceDTO.setConfiguration(RsaUtils.symmetricEncrypt(datasourceDTO.getConfiguration()));
datasourceDTO.setCreator(coreUserManage.getUserName(Long.valueOf(datasourceDTO.getCreateBy()))); datasourceDTO.setCreator(coreUserManage.getUserName(Long.valueOf(datasourceDTO.getCreateBy())));
@ -1214,7 +1347,7 @@ public class DatasourceServer implements DatasourceApi {
BeanUtils.copyBean(datasourceDTO, coreDatasource); BeanUtils.copyBean(datasourceDTO, coreDatasource);
try { try {
checkDatasourceStatus(datasourceDTO); checkDatasourceStatus(datasourceDTO);
if (!Arrays.asList("API", "Excel", "folder").contains(coreDatasource.getType()) && !coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { if (!Arrays.asList("API", "Excel", "folder").contains(coreDatasource.getType()) && !coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name()) && !coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.ExcelRemote.name())) {
calciteProvider.updateDsPoolAfterCheckStatus(datasourceDTO); calciteProvider.updateDsPoolAfterCheckStatus(datasourceDTO);
} }
} catch (DEException e) { } catch (DEException e) {
@ -1294,11 +1427,6 @@ public class DatasourceServer implements DatasourceApi {
Object resObj = null; Object resObj = null;
try { try {
Method method = getMethod(dsType, methodName, classes); Method method = getMethod(dsType, methodName, classes);
if (object instanceof DatasourceRequest && dsType.equals(DataSourceType.APILark.name())) {
Class<?> clazz = Class.forName(DatasourceRequest.class.getName());
Method setToken = clazz.getMethod("setToken", String.class);
setToken.invoke(object, dataSourceManage.getTenantAccessToken());
}
resObj = method.invoke(null, object); resObj = method.invoke(null, object);
} catch (Exception e) { } catch (Exception e) {
DEException.throwException(msg(e)); DEException.throwException(msg(e));
@ -1312,7 +1440,7 @@ public class DatasourceServer implements DatasourceApi {
if (exception.getCause() == null) { if (exception.getCause() == null) {
return exception.getMessage(); return exception.getMessage();
} }
if (exception instanceof DEException && !(exception.getCause() instanceof DEException)) { if (exception instanceof DEException && (!(exception.getCause() instanceof DEException) && !(exception.getCause() instanceof InvocationTargetException))) {
return exception.getMessage(); return exception.getMessage();
} }
exception = exception.getCause(); exception = exception.getCause();

View File

@ -1,11 +1,29 @@
package io.gisbi.datasource.type; package io.gisbi.datasource.type;
import io.gisbi.exception.DEException;
import io.gisbi.extensions.datasource.vo.DatasourceConfiguration; import io.gisbi.extensions.datasource.vo.DatasourceConfiguration;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data @Data
@Component("h2") @Component("h2")
public class H2 extends DatasourceConfiguration { public class H2 extends DatasourceConfiguration {
private String driver = "org.h2.Driver"; private String driver = "org.h2.Driver";
private List<String> illegalParameters = Arrays.asList("INIT", "RUNSCRIPT");
public String getJdbc() {
for (String illegalParameter : illegalParameters) {
if (jdbc.toUpperCase().replace("\\", "").contains(illegalParameter)) {
DEException.throwException("Has illegal parameter: " + jdbc);
}
}
return jdbc;
}
} }

View File

@ -27,22 +27,24 @@ public class Mysql extends DatasourceConfiguration {
} }
return getJdbcUrl(); return getJdbcUrl();
} }
String jdbcUrl = "";
if (StringUtils.isEmpty(extraParams.trim())) { if (StringUtils.isEmpty(extraParams.trim())) {
return "jdbc:mysql://HOSTNAME:PORT/DATABASE" jdbcUrl = "jdbc:mysql://HOSTNAME:PORT/DATABASE"
.replace("HOSTNAME", getLHost().trim()) .replace("HOSTNAME", getLHost().trim())
.replace("PORT", getLPort().toString().trim()) .replace("PORT", getLPort().toString().trim())
.replace("DATABASE", getDataBase().trim()); .replace("DATABASE", getDataBase().trim());
} else { } else {
for (String illegalParameter : illegalParameters) { jdbcUrl = "jdbc:mysql://HOSTNAME:PORT/DATABASE?EXTRA_PARAMS"
if (URLDecoder.decode(getExtraParams()).toLowerCase().contains(illegalParameter.toLowerCase()) || URLDecoder.decode(getExtraParams()).contains(illegalParameter.toLowerCase())) {
DEException.throwException("Illegal parameter: " + illegalParameter);
}
}
return "jdbc:mysql://HOSTNAME:PORT/DATABASE?EXTRA_PARAMS"
.replace("HOSTNAME", getLHost().trim()) .replace("HOSTNAME", getLHost().trim())
.replace("PORT", getLPort().toString().trim()) .replace("PORT", getLPort().toString().trim())
.replace("DATABASE", getDataBase().trim()) .replace("DATABASE", getDataBase().trim())
.replace("EXTRA_PARAMS", getExtraParams().trim()); .replace("EXTRA_PARAMS", getExtraParams().trim());
} }
for (String illegalParameter : illegalParameters) {
if (URLDecoder.decode(jdbcUrl).toLowerCase().contains(illegalParameter.toLowerCase()) || URLDecoder.decode(jdbcUrl).contains(illegalParameter.toLowerCase())) {
DEException.throwException("Illegal parameter: " + illegalParameter);
}
}
return jdbcUrl;
} }
} }

View File

@ -1,40 +1,58 @@
package io.gisbi.datasource.type; package io.gisbi.datasource.type;
import io.gisbi.exception.DEException;
import io.gisbi.extensions.datasource.vo.DatasourceConfiguration; import io.gisbi.extensions.datasource.vo.DatasourceConfiguration;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.net.URLDecoder;
import java.util.Arrays;
import java.util.List;
@Data @Data
@Component("pg") @Component("pg")
public class Pg extends DatasourceConfiguration { public class Pg extends DatasourceConfiguration {
private String driver = "org.postgresql.Driver"; private String driver = "org.postgresql.Driver";
private String extraParams = ""; private String extraParams = "";
private List<String> illegalParameters = Arrays.asList("socketFactory", "socketFactoryArg", "sslfactory", "sslhostnameverifier", "sslpasswordcallback", "authenticationPluginClassName");
public String getJdbc() { public String getJdbc() {
if(StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")){ if (StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")) {
for (String illegalParameter : illegalParameters) {
if (URLDecoder.decode(getJdbcUrl()).contains(illegalParameter)) {
DEException.throwException("Illegal parameter: " + illegalParameter);
}
}
return getJdbcUrl(); return getJdbcUrl();
} }
if(StringUtils.isEmpty(extraParams.trim())){ String jdbcUrl = "";
if (StringUtils.isEmpty(extraParams.trim())) {
if (StringUtils.isEmpty(getSchema())) { if (StringUtils.isEmpty(getSchema())) {
return "jdbc:postgresql://HOSTNAME:PORT/DATABASE" jdbcUrl = "jdbc:postgresql://HOSTNAME:PORT/DATABASE"
.replace("HOSTNAME", getLHost().trim()) .replace("HOSTNAME", getLHost().trim())
.replace("PORT", getLPort().toString().trim()) .replace("PORT", getLPort().toString().trim())
.replace("DATABASE", getDataBase().trim()); .replace("DATABASE", getDataBase().trim());
} else { } else {
return "jdbc:postgresql://HOSTNAME:PORT/DATABASE?currentSchema=SCHEMA" jdbcUrl = "jdbc:postgresql://HOSTNAME:PORT/DATABASE?currentSchema=SCHEMA"
.replace("HOSTNAME", getLHost().trim()) .replace("HOSTNAME", getLHost().trim())
.replace("PORT", getLPort().toString().trim()) .replace("PORT", getLPort().toString().trim())
.replace("DATABASE", getDataBase().trim()) .replace("DATABASE", getDataBase().trim())
.replace("SCHEMA", getSchema().trim()); .replace("SCHEMA", getSchema().trim());
} }
}else { } else {
return "jdbc:postgresql://HOSTNAME:PORT/DATABASE?EXTRA_PARAMS" jdbcUrl = "jdbc:postgresql://HOSTNAME:PORT/DATABASE?EXTRA_PARAMS"
.replace("HOSTNAME", getLHost().trim()) .replace("HOSTNAME", getLHost().trim())
.replace("PORT", getLPort().toString().trim()) .replace("PORT", getLPort().toString().trim())
.replace("DATABASE", getDataBase().trim()) .replace("DATABASE", getDataBase().trim())
.replace("EXTRA_PARAMS", getExtraParams().trim()); .replace("EXTRA_PARAMS", getExtraParams().trim());
} }
for (String illegalParameter : illegalParameters) {
if (URLDecoder.decode(jdbcUrl).toLowerCase().contains(illegalParameter.toLowerCase()) || URLDecoder.decode(jdbcUrl).contains(illegalParameter.toLowerCase())) {
DEException.throwException("Illegal parameter: " + illegalParameter);
}
}
return jdbcUrl;
} }
} }

View File

@ -1,23 +1,40 @@
package io.gisbi.datasource.type; package io.gisbi.datasource.type;
import io.gisbi.exception.DEException;
import io.gisbi.extensions.datasource.vo.DatasourceConfiguration; import io.gisbi.extensions.datasource.vo.DatasourceConfiguration;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.net.URLDecoder;
import java.util.Arrays;
import java.util.List;
@Data @Data
@Component("redshift") @Component("redshift")
public class Redshift extends DatasourceConfiguration { public class Redshift extends DatasourceConfiguration {
private String driver = "com.amazon.redshift.jdbc42.Driver"; private String driver = "com.amazon.redshift.jdbc42.Driver";
private String extraParams = ""; private String extraParams = "";
private List<String> illegalParameters = Arrays.asList("socketFactory", "socketFactoryArg", "sslfactory", "sslhostnameverifier", "sslpasswordcallback", "authenticationPluginClassName");
public String getJdbc() { public String getJdbc() {
if(StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")){ if (StringUtils.isNoneEmpty(getUrlType()) && !getUrlType().equalsIgnoreCase("hostName")) {
for (String illegalParameter : illegalParameters) {
if (URLDecoder.decode(getJdbcUrl()).contains(illegalParameter)) {
DEException.throwException("Illegal parameter: " + illegalParameter);
}
}
return getJdbcUrl(); return getJdbcUrl();
} }
return "jdbc:redshift://HOSTNAME:PORT/DATABASE" String jdbcUrl = "jdbc:redshift://HOSTNAME:PORT/DATABASE"
.replace("HOSTNAME", getLHost().trim()) .replace("HOSTNAME", getLHost().trim())
.replace("PORT", getLPort().toString().trim()) .replace("PORT", getLPort().toString().trim())
.replace("DATABASE", getDataBase().trim()); .replace("DATABASE", getDataBase().trim());
for (String illegalParameter : illegalParameters) {
if (URLDecoder.decode(jdbcUrl).contains(illegalParameter)) {
DEException.throwException("Illegal parameter: " + illegalParameter);
}
}
return jdbcUrl;
} }
} }

View File

@ -197,7 +197,7 @@ public class SQLProvider {
} }
public static String sqlLimit(String sql, ChartViewDTO view) { public static String sqlLimit(String sql, ChartViewDTO view) {
if (StringUtils.equalsIgnoreCase(view.getType(), "table-info")) { if (StringUtils.equalsAnyIgnoreCase(view.getType(), "table-info", "table-normal")) {
return sql; return sql;
} }
if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) { if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {

View File

@ -9,6 +9,7 @@ import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO;
import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO; import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO;
import io.gisbi.extensions.datasource.model.SQLMeta; import io.gisbi.extensions.datasource.model.SQLMeta;
import io.gisbi.extensions.datasource.model.SQLObj; import io.gisbi.extensions.datasource.model.SQLObj;
import io.gisbi.extensions.datasource.vo.DatasourceConfiguration;
import io.gisbi.extensions.view.filter.DynamicTimeSetting; import io.gisbi.extensions.view.filter.DynamicTimeSetting;
import io.gisbi.extensions.view.filter.FilterTreeItem; import io.gisbi.extensions.view.filter.FilterTreeItem;
import io.gisbi.extensions.view.filter.FilterTreeObj; import io.gisbi.extensions.view.filter.FilterTreeObj;
@ -101,10 +102,10 @@ public class CustomWhere2Str {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName());
} else { } else {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getDataeaseName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getGisbiName());
} }
} else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 3) { } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 3) {
String groupFieldExp = Utils.transGroupFieldToSql(field, originFields); String groupFieldExp = Utils.transGroupFieldToSql(field, originFields, isCross, dsMap, pluginManage);
// 给计算字段处加一个占位符后续SQL方言转换后再替换 // 给计算字段处加一个占位符后续SQL方言转换后再替换
originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId());
fieldsDialect.put(originName, groupFieldExp); fieldsDialect.put(originName, groupFieldExp);
@ -115,7 +116,7 @@ public class CustomWhere2Str {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName());
} else { } else {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getDataeaseName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getGisbiName());
} }
} }
if (field.getDeType() == 1) { if (field.getDeType() == 1) {
@ -167,7 +168,9 @@ public class CustomWhere2Str {
if (StringUtils.equalsIgnoreCase(item.getFilterType(), "enum")) { if (StringUtils.equalsIgnoreCase(item.getFilterType(), "enum")) {
if (ObjectUtils.isNotEmpty(item.getEnumValue())) { if (ObjectUtils.isNotEmpty(item.getEnumValue())) {
if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) && !isCross) { || StringUtils.containsIgnoreCase(field.getType(), "NCHAR"))
&& !isCross
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
res = "(" + whereName + " IN (" + item.getEnumValue().stream().map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + "))"; res = "(" + whereName + " IN (" + item.getEnumValue().stream().map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + "))";
} else { } else {
res = "(" + whereName + " IN ('" + String.join("','", item.getEnumValue()) + "'))"; res = "(" + whereName + " IN ('" + String.join("','", item.getEnumValue()) + "'))";
@ -193,14 +196,18 @@ public class CustomWhere2Str {
whereValue = "''"; whereValue = "''";
} else if (StringUtils.containsIgnoreCase(item.getTerm(), "in") || StringUtils.containsIgnoreCase(item.getTerm(), "not in")) { } else if (StringUtils.containsIgnoreCase(item.getTerm(), "in") || StringUtils.containsIgnoreCase(item.getTerm(), "not in")) {
if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) && !isCross) { || StringUtils.containsIgnoreCase(field.getType(), "NCHAR"))
&& !isCross
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
whereValue = "(" + Arrays.stream(value.split(",")).map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + ")"; whereValue = "(" + Arrays.stream(value.split(",")).map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + ")";
} else { } else {
whereValue = "('" + String.join("','", value.split(",")) + "')"; whereValue = "('" + String.join("','", value.split(",")) + "')";
} }
} else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) { } else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) {
if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) && !isCross) { || StringUtils.containsIgnoreCase(field.getType(), "NCHAR"))
&& !isCross
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
whereValue = "'" + SQLConstants.MSSQL_N_PREFIX + "%" + value + "%'"; whereValue = "'" + SQLConstants.MSSQL_N_PREFIX + "%" + value + "%'";
} else { } else {
whereValue = "'%" + value + "%'"; whereValue = "'%" + value + "%'";
@ -246,7 +253,9 @@ public class CustomWhere2Str {
} }
} else { } else {
if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) && !isCross) { || StringUtils.containsIgnoreCase(field.getType(), "NCHAR"))
&& !isCross
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE_CH, value); whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE_CH, value);
} else { } else {
whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value); whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value);

View File

@ -57,10 +57,10 @@ public class Dimension2SQLObj {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getOriginName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getOriginName());
} else { } else {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getDataeaseName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getGisbiName());
} }
} else if (ObjectUtils.isNotEmpty(x.getExtField()) && Objects.equals(x.getExtField(), ExtFieldConstant.EXT_GROUP)) { } else if (ObjectUtils.isNotEmpty(x.getExtField()) && Objects.equals(x.getExtField(), ExtFieldConstant.EXT_GROUP)) {
String groupFieldExp = Utils.transGroupFieldToSql(x, originFields); String groupFieldExp = Utils.transGroupFieldToSql(x, originFields, isCross, dsMap, pluginManage);
// 给计算字段处加一个占位符后续SQL方言转换后再替换 // 给计算字段处加一个占位符后续SQL方言转换后再替换
originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId()); originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId());
fieldsDialect.put(originField, groupFieldExp); fieldsDialect.put(originField, groupFieldExp);
@ -71,7 +71,7 @@ public class Dimension2SQLObj {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getOriginName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getOriginName());
} else { } else {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getDataeaseName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getGisbiName());
} }
} }
String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i);

View File

@ -9,6 +9,7 @@ import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO;
import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO; import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO;
import io.gisbi.extensions.datasource.model.SQLMeta; import io.gisbi.extensions.datasource.model.SQLMeta;
import io.gisbi.extensions.datasource.model.SQLObj; import io.gisbi.extensions.datasource.model.SQLObj;
import io.gisbi.extensions.datasource.vo.DatasourceConfiguration;
import io.gisbi.extensions.view.dto.ChartExtFilterDTO; import io.gisbi.extensions.view.dto.ChartExtFilterDTO;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -71,10 +72,10 @@ public class ExtWhere2Str {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName());
} else { } else {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getDataeaseName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getGisbiName());
} }
} else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 3) { } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 3) {
String groupFieldExp = Utils.transGroupFieldToSql(field, originFields); String groupFieldExp = Utils.transGroupFieldToSql(field, originFields, isCross, dsMap, pluginManage);
// 给计算字段处加一个占位符后续SQL方言转换后再替换 // 给计算字段处加一个占位符后续SQL方言转换后再替换
originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId());
fieldsDialect.put(originName, groupFieldExp); fieldsDialect.put(originName, groupFieldExp);
@ -85,7 +86,7 @@ public class ExtWhere2Str {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName());
} else { } else {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getDataeaseName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getGisbiName());
} }
} }
@ -166,14 +167,16 @@ public class ExtWhere2Str {
break; break;
} }
} }
if (hasN && !isCross) { if (hasN && !isCross && StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
whereValue = "(" + value.stream().map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + ")"; whereValue = "(" + value.stream().map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + ")";
} else { } else {
whereValue = "('" + StringUtils.join(value, "','") + "')"; whereValue = "('" + StringUtils.join(value, "','") + "')";
} }
} else { } else {
if ((StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NCHAR")) && !isCross) { || StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NCHAR"))
&& !isCross
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
whereValue = "(" + value.stream().map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + ")"; whereValue = "(" + value.stream().map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + ")";
} else { } else {
if (request.getDatasetTableField().getDeType() == 2 || request.getDatasetTableField().getDeType() == 3) { if (request.getDatasetTableField().getDeType() == 2 || request.getDatasetTableField().getDeType() == 3) {
@ -196,14 +199,16 @@ public class ExtWhere2Str {
break; break;
} }
} }
if (hasN && !isCross) { if (hasN && !isCross && StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
whereValue = "'" + SQLConstants.MSSQL_N_PREFIX + "%" + value.get(0) + "%'"; whereValue = "'" + SQLConstants.MSSQL_N_PREFIX + "%" + value.get(0) + "%'";
} else { } else {
whereValue = "'%" + value.get(0) + "%'"; whereValue = "'%" + value.get(0) + "%'";
} }
} else { } else {
if ((StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NCHAR")) && !isCross) { || StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NCHAR"))
&& !isCross
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
whereValue = "'" + SQLConstants.MSSQL_N_PREFIX + "%" + value.get(0) + "%'"; whereValue = "'" + SQLConstants.MSSQL_N_PREFIX + "%" + value.get(0) + "%'";
} else { } else {
whereValue = "'%" + value.get(0) + "%'"; whereValue = "'%" + value.get(0) + "%'";
@ -248,8 +253,9 @@ public class ExtWhere2Str {
List<DatasetTableFieldDTO> datasetTableFieldList = request.getDatasetTableFieldList(); List<DatasetTableFieldDTO> datasetTableFieldList = request.getDatasetTableFieldList();
boolean hasN = false; boolean hasN = false;
for (DatasetTableFieldDTO dto : datasetTableFieldList) { for (DatasetTableFieldDTO dto : datasetTableFieldList) {
if (StringUtils.containsIgnoreCase(dto.getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(dto.getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(dto.getType(), "NCHAR")) { || StringUtils.containsIgnoreCase(dto.getType(), "NCHAR"))
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
hasN = true; hasN = true;
break; break;
} }
@ -261,7 +267,9 @@ public class ExtWhere2Str {
} }
} else { } else {
if ((StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NCHAR")) && !isCross) { || StringUtils.containsIgnoreCase(request.getDatasetTableField().getType(), "NCHAR"))
&& !isCross
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE_CH, value.get(0)); whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE_CH, value.get(0));
} else { } else {
whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value.get(0)); whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value.get(0));

View File

@ -61,10 +61,10 @@ public class Field2SQLObj {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getOriginName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getOriginName());
} else { } else {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getDataeaseName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getGisbiName());
} }
} else if (ObjectUtils.isNotEmpty(x.getExtField()) && Objects.equals(x.getExtField(), ExtFieldConstant.EXT_GROUP)) { } else if (ObjectUtils.isNotEmpty(x.getExtField()) && Objects.equals(x.getExtField(), ExtFieldConstant.EXT_GROUP)) {
String groupFieldExp = Utils.transGroupFieldToSql(x, originFields); String groupFieldExp = Utils.transGroupFieldToSql(x, originFields, isCross, dsMap, pluginManage);
// 给计算字段处加一个占位符后续SQL方言转换后再替换 // 给计算字段处加一个占位符后续SQL方言转换后再替换
originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId()); originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId());
fieldsDialect.put(originField, groupFieldExp); fieldsDialect.put(originField, groupFieldExp);
@ -75,7 +75,7 @@ public class Field2SQLObj {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getOriginName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getOriginName());
} else { } else {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getDataeaseName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), x.getGisbiName());
} }
} }
String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i);

View File

@ -63,10 +63,10 @@ public class Order2SQLObj {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getOriginName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getOriginName());
} else { } else {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getDataeaseName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getGisbiName());
} }
} else if (ObjectUtils.isNotEmpty(f.getExtField()) && Objects.equals(f.getExtField(), ExtFieldConstant.EXT_GROUP)) { } else if (ObjectUtils.isNotEmpty(f.getExtField()) && Objects.equals(f.getExtField(), ExtFieldConstant.EXT_GROUP)) {
String groupFieldExp = Utils.transGroupFieldToSql(f, originFields); String groupFieldExp = Utils.transGroupFieldToSql(f, originFields, isCross, dsMap, pluginManage);
// 给计算字段处加一个占位符后续SQL方言转换后再替换 // 给计算字段处加一个占位符后续SQL方言转换后再替换
originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, f.getId()); originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, f.getId());
fieldsDialect.put(originField, groupFieldExp); fieldsDialect.put(originField, groupFieldExp);
@ -77,7 +77,7 @@ public class Order2SQLObj {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getOriginName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getOriginName());
} else { } else {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getDataeaseName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getGisbiName());
} }
} }
String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i);

View File

@ -57,10 +57,10 @@ public class Quota2SQLObj {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), y.getOriginName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), y.getOriginName());
} else { } else {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), y.getDataeaseName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), y.getGisbiName());
} }
} else if (ObjectUtils.isNotEmpty(y.getExtField()) && Objects.equals(y.getExtField(), ExtFieldConstant.EXT_GROUP)) { } else if (ObjectUtils.isNotEmpty(y.getExtField()) && Objects.equals(y.getExtField(), ExtFieldConstant.EXT_GROUP)) {
String groupFieldExp = Utils.transGroupFieldToSql(y, originFields); String groupFieldExp = Utils.transGroupFieldToSql(y, originFields, isCross, dsMap, pluginManage);
// 给计算字段处加一个占位符后续SQL方言转换后再替换 // 给计算字段处加一个占位符后续SQL方言转换后再替换
originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, y.getId()); originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, y.getId());
fieldsDialect.put(originField, groupFieldExp); fieldsDialect.put(originField, groupFieldExp);
@ -71,7 +71,7 @@ public class Quota2SQLObj {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), y.getOriginName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), y.getOriginName());
} else { } else {
originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), y.getDataeaseName()); originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), y.getGisbiName());
} }
} }
String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i);

View File

@ -1,8 +1,8 @@
package io.gisbi.engine.trans; package io.gisbi.engine.trans;
import io.gisbi.api.permissions.dataset.dto.DataSetRowPermissionsTreeDTO; import io.gisbi.api.permissions.dataset.dto.DataSetRowPermissionsTreeDTO;
import io.gisbi.engine.constant.ExtFieldConstant;
import io.gisbi.constant.SQLConstants; import io.gisbi.constant.SQLConstants;
import io.gisbi.engine.constant.ExtFieldConstant;
import io.gisbi.engine.utils.Utils; import io.gisbi.engine.utils.Utils;
import io.gisbi.extensions.datasource.api.PluginManageApi; import io.gisbi.extensions.datasource.api.PluginManageApi;
import io.gisbi.extensions.datasource.constant.SqlPlaceholderConstants; import io.gisbi.extensions.datasource.constant.SqlPlaceholderConstants;
@ -11,6 +11,7 @@ import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO;
import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO; import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO;
import io.gisbi.extensions.datasource.model.SQLMeta; import io.gisbi.extensions.datasource.model.SQLMeta;
import io.gisbi.extensions.datasource.model.SQLObj; import io.gisbi.extensions.datasource.model.SQLObj;
import io.gisbi.extensions.datasource.vo.DatasourceConfiguration;
import io.gisbi.extensions.view.dto.DatasetRowPermissionsTreeItem; import io.gisbi.extensions.view.dto.DatasetRowPermissionsTreeItem;
import io.gisbi.extensions.view.dto.DatasetRowPermissionsTreeObj; import io.gisbi.extensions.view.dto.DatasetRowPermissionsTreeObj;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
@ -117,10 +118,10 @@ public class WhereTree2Str {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName());
} else { } else {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getDataeaseName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getGisbiName());
} }
} else if (ObjectUtils.isNotEmpty(field.getExtField()) && Objects.equals(field.getExtField(), ExtFieldConstant.EXT_GROUP)) { } else if (ObjectUtils.isNotEmpty(field.getExtField()) && Objects.equals(field.getExtField(), ExtFieldConstant.EXT_GROUP)) {
String groupFieldExp = Utils.transGroupFieldToSql(field, originFields); String groupFieldExp = Utils.transGroupFieldToSql(field, originFields, isCross, dsMap, pluginManage);
// 给计算字段处加一个占位符后续SQL方言转换后再替换 // 给计算字段处加一个占位符后续SQL方言转换后再替换
originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId());
fieldsDialect.put(originName, groupFieldExp); fieldsDialect.put(originName, groupFieldExp);
@ -131,7 +132,7 @@ public class WhereTree2Str {
if (StringUtils.equalsIgnoreCase(dsType, "es")) { if (StringUtils.equalsIgnoreCase(dsType, "es")) {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getOriginName());
} else { } else {
originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getDataeaseName()); originName = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), field.getGisbiName());
} }
} }
if (field.getDeType() == 1) { if (field.getDeType() == 1) {
@ -180,7 +181,9 @@ public class WhereTree2Str {
if (StringUtils.equalsIgnoreCase(item.getFilterType(), "enum")) { if (StringUtils.equalsIgnoreCase(item.getFilterType(), "enum")) {
if (CollectionUtils.isNotEmpty(item.getEnumValue())) { if (CollectionUtils.isNotEmpty(item.getEnumValue())) {
if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) && !isCross) { || StringUtils.containsIgnoreCase(field.getType(), "NCHAR"))
&& !isCross
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
res = "(" + whereName + " IN (" + item.getEnumValue().stream().map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + "))"; res = "(" + whereName + " IN (" + item.getEnumValue().stream().map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + "))";
} else { } else {
res = "(" + whereName + " IN ('" + String.join("','", item.getEnumValue()) + "'))"; res = "(" + whereName + " IN ('" + String.join("','", item.getEnumValue()) + "'))";
@ -205,14 +208,18 @@ public class WhereTree2Str {
whereValue = "''"; whereValue = "''";
} else if (StringUtils.containsIgnoreCase(item.getTerm(), "in") || StringUtils.containsIgnoreCase(item.getTerm(), "not in")) { } else if (StringUtils.containsIgnoreCase(item.getTerm(), "in") || StringUtils.containsIgnoreCase(item.getTerm(), "not in")) {
if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) && !isCross) { || StringUtils.containsIgnoreCase(field.getType(), "NCHAR"))
&& !isCross
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
whereValue = "(" + Arrays.stream(value.split(",")).map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + ")"; whereValue = "(" + Arrays.stream(value.split(",")).map(str -> "'" + SQLConstants.MSSQL_N_PREFIX + str + "'").collect(Collectors.joining(",")) + ")";
} else { } else {
whereValue = "('" + String.join("','", value.split(",")) + "')"; whereValue = "('" + String.join("','", value.split(",")) + "')";
} }
} else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) { } else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) {
if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) && !isCross) { || StringUtils.containsIgnoreCase(field.getType(), "NCHAR"))
&& !isCross
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
whereValue = "'" + SQLConstants.MSSQL_N_PREFIX + "%" + value + "%'"; whereValue = "'" + SQLConstants.MSSQL_N_PREFIX + "%" + value + "%'";
} else { } else {
whereValue = "'%" + value + "%'"; whereValue = "'%" + value + "%'";
@ -256,7 +263,9 @@ public class WhereTree2Str {
} }
} else { } else {
if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR") if ((StringUtils.containsIgnoreCase(field.getType(), "NVARCHAR")
|| StringUtils.containsIgnoreCase(field.getType(), "NCHAR")) && !isCross) { || StringUtils.containsIgnoreCase(field.getType(), "NCHAR"))
&& !isCross
&& StringUtils.equalsIgnoreCase(dsType, DatasourceConfiguration.DatasourceType.sqlServer.getType())) {
whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE_CH, value); whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE_CH, value);
} else { } else {
whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value); whereValue = String.format(SQLConstants.WHERE_VALUE_VALUE, value);

View File

@ -1,7 +1,7 @@
package io.gisbi.engine.utils; package io.gisbi.engine.utils;
import io.gisbi.engine.constant.ExtFieldConstant;
import io.gisbi.constant.SQLConstants; import io.gisbi.constant.SQLConstants;
import io.gisbi.engine.constant.ExtFieldConstant;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.extensions.datasource.api.PluginManageApi; import io.gisbi.extensions.datasource.api.PluginManageApi;
import io.gisbi.extensions.datasource.constant.SqlPlaceholderConstants; import io.gisbi.extensions.datasource.constant.SqlPlaceholderConstants;
@ -90,9 +90,9 @@ public class Utils {
// 计算字段允许二次引用这里递归查询完整引用链 // 计算字段允许二次引用这里递归查询完整引用链
if (Objects.equals(ele.getExtField(), ExtFieldConstant.EXT_NORMAL)) { if (Objects.equals(ele.getExtField(), ExtFieldConstant.EXT_NORMAL)) {
if (isCross) { if (isCross) {
originField = originField.replaceAll("\\[" + ele.getId() + "]", String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), ele.getDataeaseName())); originField = originField.replaceAll("\\[" + ele.getId() + "]", String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), ele.getGisbiName()));
} else { } else {
originField = originField.replaceAll("\\[" + ele.getId() + "]", datasourceType.getPrefix() + tableObj.getTableAlias() + datasourceType.getSuffix() + "." + datasourceType.getPrefix() + ele.getDataeaseName() + datasourceType.getSuffix()); originField = originField.replaceAll("\\[" + ele.getId() + "]", datasourceType.getPrefix() + tableObj.getTableAlias() + datasourceType.getSuffix() + "." + datasourceType.getPrefix() + ele.getGisbiName() + datasourceType.getSuffix());
} }
} else { } else {
originField = originField.replaceAll("\\[" + ele.getId() + "]", "(" + ele.getOriginName() + ")"); originField = originField.replaceAll("\\[" + ele.getId() + "]", "(" + ele.getOriginName() + ")");
@ -161,6 +161,8 @@ public class Utils {
return "MM" + split + "dd"; return "MM" + split + "dd";
case "H_m_s": case "H_m_s":
return "HH:mm:ss"; return "HH:mm:ss";
case "y_M_d_H":
return "yyyy" + split + "MM" + split + "dd" + " HH";
case "y_M_d_H_m": case "y_M_d_H_m":
return "yyyy" + split + "MM" + split + "dd" + " HH:mm"; return "yyyy" + split + "MM" + split + "dd" + " HH:mm";
case "y_M_d_H_m_s": case "y_M_d_H_m_s":
@ -496,7 +498,15 @@ public class Utils {
return null; return null;
} }
public static String transGroupFieldToSql(DatasetTableFieldDTO dto, List<DatasetTableFieldDTO> fields) { public static String transGroupFieldToSql(DatasetTableFieldDTO dto, List<DatasetTableFieldDTO> fields, boolean isCross, Map<Long, DatasourceSchemaDTO> dsMap, PluginManageApi pluginManage) {
// 从fields里取最新的dto
for (DatasetTableFieldDTO fieldDTO : fields) {
if (Objects.equals(dto.getId(), fieldDTO.getId())) {
dto.setGroupList(fieldDTO.getGroupList());
dto.setOtherGroup(fieldDTO.getOtherGroup());
break;
}
}
// get origin field // get origin field
DatasetTableFieldDTO originField = null; DatasetTableFieldDTO originField = null;
for (DatasetTableFieldDTO ele : fields) { for (DatasetTableFieldDTO ele : fields) {
@ -509,6 +519,22 @@ public class Utils {
DEException.throwException("Field not exists"); DEException.throwException("Field not exists");
} }
DsTypeDTO datasourceType = null;
if (dsMap != null && dsMap.entrySet().iterator().hasNext()) {
Map.Entry<Long, DatasourceSchemaDTO> next = dsMap.entrySet().iterator().next();
datasourceType = getDs(pluginManage, next.getValue().getType());
}
if (datasourceType == null) {
DEException.throwException("Datasource not exists");
}
String fieldName;
if (isCross) {
fieldName = originField.getGisbiName();
} else {
fieldName = datasourceType.getPrefix() + originField.getGisbiName() + datasourceType.getSuffix();
}
StringBuilder exp = new StringBuilder(); StringBuilder exp = new StringBuilder();
exp.append(" (CASE "); exp.append(" (CASE ");
if (originField.getDeType() == 0) { if (originField.getDeType() == 0) {
@ -516,7 +542,7 @@ public class Utils {
exp.append(" WHEN "); exp.append(" WHEN ");
for (int i = 0; i < fieldGroupDTO.getText().size(); i++) { for (int i = 0; i < fieldGroupDTO.getText().size(); i++) {
String value = fieldGroupDTO.getText().get(i); String value = fieldGroupDTO.getText().get(i);
exp.append(originField.getDataeaseName()).append(" = ").append("'").append(transValue(value)).append("'"); exp.append(fieldName).append(" = ").append("'").append(transValue(value)).append("'");
if (i < fieldGroupDTO.getText().size() - 1) { if (i < fieldGroupDTO.getText().size() - 1) {
exp.append(" OR "); exp.append(" OR ");
} }
@ -526,17 +552,17 @@ public class Utils {
} else if (originField.getDeType() == 1) { } else if (originField.getDeType() == 1) {
for (FieldGroupDTO fieldGroupDTO : dto.getGroupList()) { for (FieldGroupDTO fieldGroupDTO : dto.getGroupList()) {
exp.append(" WHEN "); exp.append(" WHEN ");
exp.append(originField.getDataeaseName()).append(" >= ").append("'").append(fieldGroupDTO.getStartTime()).append("'"); exp.append(fieldName).append(" >= ").append("'").append(fieldGroupDTO.getStartTime()).append("'");
exp.append(" AND "); exp.append(" AND ");
exp.append(originField.getDataeaseName()).append(" <= ").append("'").append(fieldGroupDTO.getEndTime()).append("'"); exp.append(fieldName).append(" <= ").append("'").append(fieldGroupDTO.getEndTime()).append("'");
exp.append(" THEN '").append(transValue(fieldGroupDTO.getName())).append("'"); exp.append(" THEN '").append(transValue(fieldGroupDTO.getName())).append("'");
} }
} else if (originField.getDeType() == 2 || originField.getDeType() == 3 || originField.getDeType() == 4) { } else if (originField.getDeType() == 2 || originField.getDeType() == 3 || originField.getDeType() == 4) {
for (FieldGroupDTO fieldGroupDTO : dto.getGroupList()) { for (FieldGroupDTO fieldGroupDTO : dto.getGroupList()) {
exp.append(" WHEN "); exp.append(" WHEN ");
exp.append(originField.getDataeaseName()).append(StringUtils.equalsIgnoreCase(fieldGroupDTO.getMinTerm(), "le") ? " >= " : " > ").append(fieldGroupDTO.getMin()); exp.append(fieldName).append(StringUtils.equalsIgnoreCase(fieldGroupDTO.getMinTerm(), "le") ? " >= " : " > ").append(fieldGroupDTO.getMin());
exp.append(" AND "); exp.append(" AND ");
exp.append(originField.getDataeaseName()).append(StringUtils.equalsIgnoreCase(fieldGroupDTO.getMaxTerm(), "le") ? " <= " : " < ").append(fieldGroupDTO.getMax()); exp.append(fieldName).append(StringUtils.equalsIgnoreCase(fieldGroupDTO.getMaxTerm(), "le") ? " <= " : " < ").append(fieldGroupDTO.getMax());
exp.append(" THEN '").append(transValue(fieldGroupDTO.getName())).append("'"); exp.append(" THEN '").append(transValue(fieldGroupDTO.getName())).append("'");
} }
} }

View File

@ -26,7 +26,7 @@ public class CoreExportTask implements Serializable {
private String fileSizeUnit; private String fileSizeUnit;
private String exportFrom; private Long exportFrom;
private String exportStatus; private String exportStatus;
@ -88,11 +88,11 @@ public class CoreExportTask implements Serializable {
this.fileSizeUnit = fileSizeUnit; this.fileSizeUnit = fileSizeUnit;
} }
public String getExportFrom() { public Long getExportFrom() {
return exportFrom; return exportFrom;
} }
public void setExportFrom(String exportFrom) { public void setExportFrom(Long exportFrom) {
this.exportFrom = exportFrom; this.exportFrom = exportFrom;
} }

View File

@ -7,10 +7,10 @@ import org.springframework.stereotype.Component;
@Component("exportCenterLimitManage") @Component("exportCenterLimitManage")
public class ExportCenterLimitManage { public class ExportCenterLimitManage {
@Value("${dataease.export.dataset.limit:100000}") @Value("${gisbi.export.dataset.limit:100000}")
private Long datasetLimit; private Long datasetLimit;
@Value("${dataease.export.views.limit:100000}") @Value("${gisbi.export.views.limit:100000}")
private Long viewLimit; private Long viewLimit;
public Long getExportLimit(String type) { public Long getExportLimit(String type) {

View File

@ -1,81 +1,46 @@
package io.gisbi.exportCenter.manage; package io.gisbi.exportCenter.manage;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.core.type.TypeReference; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.google.gson.Gson; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.gisbi.api.chart.dto.ViewDetailField;
import io.gisbi.api.chart.request.ChartExcelRequest; import io.gisbi.api.chart.request.ChartExcelRequest;
import io.gisbi.api.chart.request.ChartExcelRequestInner;
import io.gisbi.api.dataset.dto.DataSetExportRequest; import io.gisbi.api.dataset.dto.DataSetExportRequest;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.api.dataset.union.UnionDTO;
import io.gisbi.api.export.BaseExportApi; import io.gisbi.api.export.BaseExportApi;
import io.gisbi.api.xpack.dataFilling.DataFillingApi; import io.gisbi.api.xpack.dataFilling.DataFillingApi;
import io.gisbi.api.xpack.dataFilling.dto.DataFillFormTableDataRequest;
import io.gisbi.auth.bo.TokenUserBO;
import io.gisbi.chart.dao.auto.mapper.CoreChartViewMapper;
import io.gisbi.chart.server.ChartDataServer;
import io.gisbi.commons.utils.ExcelWatermarkUtils; import io.gisbi.commons.utils.ExcelWatermarkUtils;
import io.gisbi.dataset.dao.auto.entity.CoreDatasetGroup; import io.gisbi.constant.LogOT;
import io.gisbi.dataset.dao.auto.mapper.CoreDatasetGroupMapper; import io.gisbi.constant.LogST;
import io.gisbi.dataset.manage.*; import io.gisbi.dataset.manage.*;
import io.gisbi.datasource.utils.DatasourceUtils;
import io.gisbi.constant.DeTypeConstants;
import io.gisbi.engine.sql.SQLProvider;
import io.gisbi.engine.trans.Field2SQLObj;
import io.gisbi.engine.trans.Order2SQLObj;
import io.gisbi.engine.trans.Table2SQLObj;
import io.gisbi.engine.trans.WhereTree2Str;
import io.gisbi.engine.utils.Utils;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.exportCenter.dao.auto.entity.CoreExportDownloadTask;
import io.gisbi.exportCenter.dao.auto.entity.CoreExportTask; import io.gisbi.exportCenter.dao.auto.entity.CoreExportTask;
import io.gisbi.exportCenter.dao.auto.mapper.CoreExportDownloadTaskMapper;
import io.gisbi.exportCenter.dao.auto.mapper.CoreExportTaskMapper; import io.gisbi.exportCenter.dao.auto.mapper.CoreExportTaskMapper;
import io.gisbi.exportCenter.util.ExportCenterUtils; import io.gisbi.exportCenter.dao.ext.mapper.ExportTaskExtMapper;
import io.gisbi.extensions.datasource.api.PluginManageApi; import io.gisbi.log.DeLog;
import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO;
import io.gisbi.extensions.datasource.dto.DatasourceRequest;
import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO;
import io.gisbi.extensions.datasource.factory.ProviderFactory;
import io.gisbi.extensions.datasource.model.SQLMeta;
import io.gisbi.extensions.datasource.provider.Provider;
import io.gisbi.extensions.view.dto.*;
import io.gisbi.i18n.Translator;
import io.gisbi.model.ExportTaskDTO; import io.gisbi.model.ExportTaskDTO;
import io.gisbi.system.manage.CoreUserManage;
import io.gisbi.system.manage.SysParameterManage; import io.gisbi.system.manage.SysParameterManage;
import io.gisbi.utils.*; import io.gisbi.utils.*;
import io.gisbi.visualization.dao.auto.entity.VisualizationWatermark; import io.gisbi.visualization.dao.auto.entity.VisualizationWatermark;
import io.gisbi.visualization.dao.auto.mapper.VisualizationWatermarkMapper; import io.gisbi.visualization.dao.auto.mapper.VisualizationWatermarkMapper;
import io.gisbi.visualization.dao.ext.mapper.ExtDataVisualizationMapper; import io.gisbi.visualization.dao.ext.mapper.ExtDataVisualizationMapper;
import io.gisbi.visualization.server.DataVisualizationServer; import io.gisbi.visualization.server.DataVisualizationServer;
import io.gisbi.websocket.WsMessage;
import io.gisbi.websocket.WsService;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.collections4.CollectionUtils; import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import io.gisbi.visualization.dto.WatermarkContentDTO; import io.gisbi.visualization.dto.WatermarkContentDTO;
import io.gisbi.api.permissions.user.vo.UserFormVO;
import java.io.*;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.DecimalFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Component @Component
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -83,55 +48,30 @@ public class ExportCenterManage implements BaseExportApi {
@Resource @Resource
private CoreExportTaskMapper exportTaskMapper; private CoreExportTaskMapper exportTaskMapper;
@Resource @Resource
private CoreExportDownloadTaskMapper coreExportDownloadTaskMapper;
@Resource
private ExportTaskExtMapper exportTaskExtMapper;
@Resource
private DatasetGroupManage datasetGroupManage; private DatasetGroupManage datasetGroupManage;
@Resource @Resource
DataVisualizationServer dataVisualizationServer; DataVisualizationServer dataVisualizationServer;
@Resource @Resource
private CoreChartViewMapper coreChartViewMapper; private ExportCenterDownLoadManage exportCenterDownLoadManage;
@Autowired
private WsService wsService;
@Autowired(required = false)
private PluginManageApi pluginManage;
@Resource @Resource
private SysParameterManage sysParameterManage; private SysParameterManage sysParameterManage;
@Value("${dataease.export.core.size:10}") @Value("${gisbi.export.core.size:10}")
private int core; private int core;
@Value("${dataease.export.max.size:10}") @Value("${gisbi.export.max.size:10}")
private int max; private int max;
@Value("${gisbi.path.exportData:/opt/gisbi2.0/data/exportData/}")
private final static String DATA_URL_TITLE = "data:image/jpeg;base64,";
@Value("${gisbi.path.exportData:/opt/gisbi/data/exportData/}")
private String exportData_path; private String exportData_path;
@Resource @Resource
private VisualizationWatermarkMapper watermarkMapper; private VisualizationWatermarkMapper watermarkMapper;
@Resource @Resource
private ExtDataVisualizationMapper visualizationMapper; private ExtDataVisualizationMapper visualizationMapper;
public Integer getExtractPageSize() {
return extractPageSize;
}
@Value("${dataease.export.page.size:50000}")
private Integer extractPageSize;
static private List<String> STATUS = Arrays.asList("SUCCESS", "FAILED", "PENDING", "IN_PROGRESS", "ALL"); static private List<String> STATUS = Arrays.asList("SUCCESS", "FAILED", "PENDING", "IN_PROGRESS", "ALL");
private ScheduledThreadPoolExecutor scheduledThreadPoolExecutor;
private int keepAliveSeconds = 600;
private Map<String, Future> Running_Task = new HashMap<>(); private Map<String, Future> Running_Task = new HashMap<>();
@Resource
private ChartDataServer chartDataServer;
@Resource
private CoreDatasetGroupMapper coreDatasetGroupMapper;
@Resource
private CoreUserManage coreUserManage;
@Resource
private DatasetSQLManage datasetSQLManage;
@Resource
private DatasetTableFieldManage datasetTableFieldManage;
@Resource
private DatasetDataManage datasetDataManage;
private final Long sheetLimit = 1000000L;
@Autowired(required = false) @Autowired(required = false)
private DataFillingApi dataFillingApi = null; private DataFillingApi dataFillingApi = null;
@ -140,56 +80,12 @@ public class ExportCenterManage implements BaseExportApi {
} }
@PostConstruct
public void init() {
scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(core);
scheduledThreadPoolExecutor.setKeepAliveTime(keepAliveSeconds, TimeUnit.SECONDS);
scheduledThreadPoolExecutor.setMaximumPoolSize(max);
}
@Scheduled(fixedRate = 5000)
public void checkRunningTask() {
Iterator<Map.Entry<String, Future>> iterator = Running_Task.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Future> entry = iterator.next();
if (entry.getValue().isDone()) {
iterator.remove();
try {
CoreExportTask exportTask = exportTaskMapper.selectById(entry.getKey());
ExportTaskDTO exportTaskDTO = new ExportTaskDTO();
BeanUtils.copyBean(exportTaskDTO, exportTask);
setExportFromName(exportTaskDTO);
WsMessage message = new WsMessage(exportTask.getUserId(), "/task-export-topic", exportTaskDTO);
wsService.releaseMessage(message);
} catch (Exception e) {
}
}
}
}
public void download(String id, HttpServletResponse response) throws Exception { public void download(String id, HttpServletResponse response) throws Exception {
if (coreExportDownloadTaskMapper.selectById(id) == null) {
DEException.throwException("任务不存在");
}
CoreExportTask exportTask = exportTaskMapper.selectById(id); CoreExportTask exportTask = exportTaskMapper.selectById(id);
OutputStream outputStream = response.getOutputStream(); exportCenterDownLoadManage.download(exportTask, response);
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(exportTask.getFileName(), StandardCharsets.UTF_8));
InputStream fileInputStream;
if (exportTask.getExportTime() < 1730277243491L) {
fileInputStream = new FileInputStream(exportData_path + id + "/" + exportTask.getFileName());
} else {
fileInputStream = new FileInputStream(exportData_path + id + "/" + id + ".xlsx");
}
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
outputStream.close();
fileInputStream.close();
response.flushBuffer();
} }
public void delete(String id) { public void delete(String id) {
@ -247,39 +143,69 @@ public class ExportCenterManage implements BaseExportApi {
FileUtils.deleteDirectoryRecursively(exportData_path + id); FileUtils.deleteDirectoryRecursively(exportData_path + id);
if (exportTask.getExportFromType().equalsIgnoreCase("chart")) { if (exportTask.getExportFromType().equalsIgnoreCase("chart")) {
ChartExcelRequest request = JsonUtil.parseObject(exportTask.getParams(), ChartExcelRequest.class); ChartExcelRequest request = JsonUtil.parseObject(exportTask.getParams(), ChartExcelRequest.class);
startViewTask(exportTask, request); exportCenterDownLoadManage.startViewTask(exportTask, request);
} }
if (exportTask.getExportFromType().equalsIgnoreCase("dataset")) { if (exportTask.getExportFromType().equalsIgnoreCase("dataset")) {
DataSetExportRequest request = JsonUtil.parseObject(exportTask.getParams(), DataSetExportRequest.class); DataSetExportRequest request = JsonUtil.parseObject(exportTask.getParams(), DataSetExportRequest.class);
startDatasetTask(exportTask, request); exportCenterDownLoadManage.startDatasetTask(exportTask, request);
} }
if (exportTask.getExportFromType().equalsIgnoreCase("data_filling")) { if (exportTask.getExportFromType().equalsIgnoreCase("data_filling")) {
HashMap request = JsonUtil.parseObject(exportTask.getParams(), HashMap.class); HashMap request = JsonUtil.parseObject(exportTask.getParams(), HashMap.class);
startDataFillingTask(exportTask, request); exportCenterDownLoadManage.startDataFillingTask(exportTask, request);
} }
} }
public List<ExportTaskDTO> exportTasks(String status) { public IPage<ExportTaskDTO> pager(Page<ExportTaskDTO> page, String status) {
if (!STATUS.contains(status)) { if (!STATUS.contains(status)) {
DEException.throwException("Invalid status: " + status); DEException.throwException("Invalid status: " + status);
} }
QueryWrapper<CoreExportTask> queryWrapper = new QueryWrapper<>(); QueryWrapper<CoreExportTask> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", AuthUtils.getUser().getUserId()); queryWrapper.eq("user_id", AuthUtils.getUser().getUserId());
if (!status.equalsIgnoreCase("ALL")) {
queryWrapper.eq("export_status", status);
}
queryWrapper.orderByDesc("export_time"); queryWrapper.orderByDesc("export_time");
List<CoreExportTask> exportTasks = exportTaskMapper.selectList(queryWrapper); IPage<ExportTaskDTO> pager = exportTaskExtMapper.pager(page, queryWrapper);
List<ExportTaskDTO> result = new ArrayList<>();
exportTasks.forEach(exportTask -> { List<ExportTaskDTO> records = pager.getRecords();
ExportTaskDTO exportTaskDTO = new ExportTaskDTO(); records.forEach(exportTask -> {
BeanUtils.copyBean(exportTaskDTO, exportTask); if (status.equalsIgnoreCase("ALL") || status.equalsIgnoreCase(exportTask.getExportStatus())) {
if (status.equalsIgnoreCase("ALL") || status.equalsIgnoreCase(exportTaskDTO.getExportStatus())) { setExportFromAbsName(exportTask);
setExportFromAbsName(exportTaskDTO);
} }
if (status.equalsIgnoreCase("ALL") || status.equalsIgnoreCase(exportTaskDTO.getExportStatus())) { if (status.equalsIgnoreCase("ALL") || status.equalsIgnoreCase(exportTask.getExportStatus())) {
proxy().setOrg(exportTaskDTO); proxy().setOrg(exportTask);
} }
result.add(exportTaskDTO);
}); });
return pager;
}
public Map<String, Long> exportTasks() {
Map<String, Long> result = new HashMap<>();
QueryWrapper<CoreExportTask> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", AuthUtils.getUser().getUserId());
queryWrapper.eq("export_status", "IN_PROGRESS");
result.put("IN_PROGRESS", exportTaskMapper.selectCount(queryWrapper));
queryWrapper.clear();
queryWrapper.eq("user_id", AuthUtils.getUser().getUserId());
queryWrapper.eq("export_status", "SUCCESS");
result.put("SUCCESS", exportTaskMapper.selectCount(queryWrapper));
queryWrapper.clear();
queryWrapper.eq("user_id", AuthUtils.getUser().getUserId());
queryWrapper.eq("export_status", "FAILED");
result.put("FAILED", exportTaskMapper.selectCount(queryWrapper));
queryWrapper.clear();
queryWrapper.eq("user_id", AuthUtils.getUser().getUserId());
queryWrapper.eq("export_status", "PENDING");
result.put("PENDING", exportTaskMapper.selectCount(queryWrapper));
queryWrapper.clear();
queryWrapper.eq("user_id", AuthUtils.getUser().getUserId());
result.put("ALL", exportTaskMapper.selectCount(queryWrapper));
return result; return result;
} }
@ -311,18 +237,6 @@ public class ExportCenterManage implements BaseExportApi {
} }
} }
private void setExportFromName(ExportTaskDTO exportTaskDTO) {
if (exportTaskDTO.getExportFromType().equalsIgnoreCase("chart")) {
exportTaskDTO.setExportFromName(coreChartViewMapper.selectById(exportTaskDTO.getExportFrom()).getTitle());
}
if (exportTaskDTO.getExportFromType().equalsIgnoreCase("dataset")) {
exportTaskDTO.setExportFromName(coreDatasetGroupMapper.selectById(exportTaskDTO.getExportFrom()).getName());
}
if (exportTaskDTO.getExportFromType().equalsIgnoreCase("data_filling")) {
exportTaskDTO.setExportFromName(getDataFillingApi().get(Long.parseLong(exportTaskDTO.getExportFrom())).getName());
}
}
private String hostName() { private String hostName() {
String hostname = null; String hostname = null;
try { try {
@ -334,11 +248,11 @@ public class ExportCenterManage implements BaseExportApi {
return hostname; return hostname;
} }
public void addTask(String exportFrom, String exportFromType, ChartExcelRequest request) { public void addTask(String exportFrom, String exportFromType, ChartExcelRequest request, String busiFlag) {
CoreExportTask exportTask = new CoreExportTask(); CoreExportTask exportTask = new CoreExportTask();
exportTask.setId(UUID.randomUUID().toString()); exportTask.setId(IDUtils.snowID().toString());
exportTask.setUserId(AuthUtils.getUser().getUserId()); exportTask.setUserId(AuthUtils.getUser().getUserId());
exportTask.setExportFrom(exportFrom); exportTask.setExportFrom(Long.valueOf(exportFrom));
exportTask.setExportFromType(exportFromType); exportTask.setExportFromType(exportFromType);
exportTask.setExportStatus("PENDING"); exportTask.setExportStatus("PENDING");
exportTask.setFileName(request.getViewName() + ".xlsx"); exportTask.setFileName(request.getViewName() + ".xlsx");
@ -347,15 +261,20 @@ public class ExportCenterManage implements BaseExportApi {
exportTask.setParams(JsonUtil.toJSONString(request).toString()); exportTask.setParams(JsonUtil.toJSONString(request).toString());
exportTask.setExportMachineName(hostName()); exportTask.setExportMachineName(hostName());
exportTaskMapper.insert(exportTask); exportTaskMapper.insert(exportTask);
startViewTask(exportTask, request); if (busiFlag.equalsIgnoreCase("dashboard")) {
exportCenterDownLoadManage.startPanelViewTask(exportTask, request);
} else {
exportCenterDownLoadManage.startDataVViewTask(exportTask, request);
}
} }
public void addTask(Long exportFrom, String exportFromType, DataSetExportRequest request) throws Exception { public void addTask(Long exportFrom, String exportFromType, DataSetExportRequest request) throws Exception {
datasetGroupManage.getDatasetGroupInfoDTO(exportFrom, null); datasetGroupManage.getDatasetGroupInfoDTO(exportFrom, null);
CoreExportTask exportTask = new CoreExportTask(); CoreExportTask exportTask = new CoreExportTask();
exportTask.setId(UUID.randomUUID().toString()); exportTask.setId(IDUtils.snowID().toString());
exportTask.setUserId(AuthUtils.getUser().getUserId()); exportTask.setUserId(AuthUtils.getUser().getUserId());
exportTask.setExportFrom(String.valueOf(exportFrom)); exportTask.setExportFrom(exportFrom);
exportTask.setExportFromType(exportFromType); exportTask.setExportFromType(exportFromType);
exportTask.setExportStatus("PENDING"); exportTask.setExportStatus("PENDING");
exportTask.setFileName(request.getFilename() + ".xlsx"); exportTask.setFileName(request.getFilename() + ".xlsx");
@ -364,16 +283,16 @@ public class ExportCenterManage implements BaseExportApi {
exportTask.setParams(JsonUtil.toJSONString(request).toString()); exportTask.setParams(JsonUtil.toJSONString(request).toString());
exportTask.setExportMachineName(hostName()); exportTask.setExportMachineName(hostName());
exportTaskMapper.insert(exportTask); exportTaskMapper.insert(exportTask);
startDatasetTask(exportTask, request); exportCenterDownLoadManage.startDatasetTask(exportTask, request);
} }
@Override @Override
public void addTask(String exportFromId, String exportFromType, HashMap<String, Object> request, Long userId, Long org) { public void addTask(String exportFromId, String exportFromType, HashMap<String, Object> request, Long userId, Long org) {
CoreExportTask exportTask = new CoreExportTask(); CoreExportTask exportTask = new CoreExportTask();
request.put("org", org); request.put("org", org);
exportTask.setId(UUID.randomUUID().toString()); exportTask.setId(IDUtils.snowID().toString());
exportTask.setUserId(userId); exportTask.setUserId(userId);
exportTask.setExportFrom(exportFromId); exportTask.setExportFrom(Long.valueOf(exportFromId));
exportTask.setExportFromType(exportFromType); exportTask.setExportFromType(exportFromType);
exportTask.setExportStatus("PENDING"); exportTask.setExportStatus("PENDING");
exportTask.setFileName(request.get("name") + ".xlsx"); exportTask.setFileName(request.get("name") + ".xlsx");
@ -383,399 +302,10 @@ public class ExportCenterManage implements BaseExportApi {
exportTask.setExportMachineName(hostName()); exportTask.setExportMachineName(hostName());
exportTaskMapper.insert(exportTask); exportTaskMapper.insert(exportTask);
if (StringUtils.equals(exportFromType, "data_filling")) { if (StringUtils.equals(exportFromType, "data_filling")) {
startDataFillingTask(exportTask, request); exportCenterDownLoadManage.startDataFillingTask(exportTask, request);
} }
} }
private void startDataFillingTask(CoreExportTask exportTask, HashMap<String, Object> request) {
if (ObjectUtils.isEmpty(getDataFillingApi())) {
return;
}
String dataPath = exportData_path + exportTask.getId();
File directory = new File(dataPath);
boolean isCreated = directory.mkdir();
TokenUserBO tokenUserBO = AuthUtils.getUser();
Future future = scheduledThreadPoolExecutor.submit(() -> {
AuthUtils.setUser(tokenUserBO);
try {
exportTask.setExportStatus("IN_PROGRESS");
exportTaskMapper.updateById(exportTask);
getDataFillingApi().writeExcel(dataPath + "/" + exportTask.getId() + ".xlsx", new DataFillFormTableDataRequest().setId(Long.parseLong(exportTask.getExportFrom())).setWithoutLogs(true), exportTask.getUserId(), Long.parseLong(request.get("org").toString()));
exportTask.setExportProgress("100");
exportTask.setExportStatus("SUCCESS");
setFileSize(dataPath + "/" + exportTask.getId() + ".xlsx", exportTask);
} catch (Exception e) {
exportTask.setMsg(e.getMessage());
LogUtil.error("Failed to export data", e);
exportTask.setExportStatus("FAILED");
} finally {
exportTaskMapper.updateById(exportTask);
}
});
Running_Task.put(exportTask.getId(), future);
}
private void startDatasetTask(CoreExportTask exportTask, DataSetExportRequest request) {
String dataPath = exportData_path + exportTask.getId();
File directory = new File(dataPath);
boolean isCreated = directory.mkdir();
TokenUserBO tokenUserBO = AuthUtils.getUser();
Future future = scheduledThreadPoolExecutor.submit(() -> {
AuthUtils.setUser(tokenUserBO);
try {
exportTask.setExportStatus("IN_PROGRESS");
exportTaskMapper.updateById(exportTask);
CoreDatasetGroup coreDatasetGroup = coreDatasetGroupMapper.selectById(exportTask.getExportFrom());
if (coreDatasetGroup == null) {
throw new Exception("Not found dataset group: " + exportTask.getExportFrom());
}
DatasetGroupInfoDTO dto = new DatasetGroupInfoDTO();
BeanUtils.copyBean(dto, coreDatasetGroup);
dto.setUnionSql(null);
List<UnionDTO> unionDTOList = JsonUtil.parseList(coreDatasetGroup.getInfo(), new TypeReference<>() {
});
dto.setUnion(unionDTOList);
List<DatasetTableFieldDTO> dsFields = datasetTableFieldManage.selectByDatasetGroupId(Long.valueOf(exportTask.getExportFrom()));
List<DatasetTableFieldDTO> allFields = dsFields.stream().map(ele -> {
DatasetTableFieldDTO datasetTableFieldDTO = new DatasetTableFieldDTO();
BeanUtils.copyBean(datasetTableFieldDTO, ele);
datasetTableFieldDTO.setFieldShortName(ele.getDataeaseName());
return datasetTableFieldDTO;
}).collect(Collectors.toList());
Map<String, Object> sqlMap = datasetSQLManage.getUnionSQLForEdit(dto, null);
String sql = (String) sqlMap.get("sql");
if (ObjectUtils.isEmpty(allFields)) {
DEException.throwException(Translator.get("i18n_no_fields"));
}
Map<String, ColumnPermissionItem> desensitizationList = new HashMap<>();
// allFields = permissionManage.filterColumnPermissions(allFields, desensitizationList, dto.getId(), null);
if (ObjectUtils.isEmpty(allFields)) {
DEException.throwException(Translator.get("i18n_no_column_permission"));
}
dto.setAllFields(allFields);
datasetDataManage.buildFieldName(sqlMap, allFields);
Map<Long, DatasourceSchemaDTO> dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
DatasourceUtils.checkDsStatus(dsMap);
List<String> dsList = new ArrayList<>();
for (Map.Entry<Long, DatasourceSchemaDTO> next : dsMap.entrySet()) {
dsList.add(next.getValue().getType());
}
boolean needOrder = Utils.isNeedOrder(dsList);
boolean crossDs = Utils.isCrossDs(dsMap);
if (!crossDs) {
if (datasetDataManage.notFullDs.contains(dsMap.entrySet().iterator().next().getValue().getType()) && (boolean) sqlMap.get("isFullJoin")) {
DEException.throwException(Translator.get("i18n_not_full"));
}
sql = Utils.replaceSchemaAlias(sql, dsMap);
}
// List<DataSetRowPermissionsTreeDTO> rowPermissionsTree = new ArrayList<>();
// TokenUserBO user = AuthUtils.getUser();
// if (user != null) {
// rowPermissionsTree = permissionManage.getRowPermissionsTree(dto.getId(), user.getUserId());
// }
// if (StringUtils.isNotEmpty(request.getExpressionTree())) {
// Gson gson = new Gson();
// DatasetRowPermissionsTreeObj datasetRowPermissionsTreeObj = JsonUtil.parseObject(request.getExpressionTree(), DatasetRowPermissionsTreeObj.class);
// permissionManage.getField(datasetRowPermissionsTreeObj);
// DataSetRowPermissionsTreeDTO dataSetRowPermissionsTreeDTO = new DataSetRowPermissionsTreeDTO();
// dataSetRowPermissionsTreeDTO.setTree(datasetRowPermissionsTreeObj);
// dataSetRowPermissionsTreeDTO.setExportData(true);
// rowPermissionsTree.add(dataSetRowPermissionsTreeDTO);
// }
Provider provider;
if (crossDs) {
provider = ProviderFactory.getDefaultProvider();
} else {
provider = ProviderFactory.getProvider(dsList.getFirst());
}
SQLMeta sqlMeta = new SQLMeta();
Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs);
Field2SQLObj.field2sqlObj(sqlMeta, allFields, allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage);
// WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage);
Order2SQLObj.getOrders(sqlMeta, dto.getSortFields(), allFields, crossDs, dsMap, Utils.getParams(allFields), null, pluginManage);
String replaceSql = provider.rebuildSQL(SQLProvider.createQuerySQL(sqlMeta, false, false, false), sqlMeta, crossDs, dsMap);
Long totalCount = datasetDataManage.getDatasetTotal(dto, replaceSql, null);
Long curLimit = ExportCenterUtils.getExportLimit("dataset");
totalCount = totalCount > curLimit ? curLimit : totalCount;
Long sheetCount = (totalCount / sheetLimit) + (totalCount % sheetLimit > 0 ? 1 : 0);
Workbook wb = new SXSSFWorkbook();
CellStyle cellStyle = wb.createCellStyle();
Font font = wb.createFont();
font.setFontHeightInPoints((short) 12);
font.setBold(true);
cellStyle.setFont(font);
cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
for (Long s = 1L; s < sheetCount + 1; s++) {
Long sheetSize;
if (s.equals(sheetCount)) {
sheetSize = totalCount - (s - 1) * sheetLimit;
} else {
sheetSize = sheetLimit;
}
Long pageSize = (sheetSize / extractPageSize) + (sheetSize % extractPageSize > 0 ? 1 : 0);
Sheet detailsSheet = null;
List<List<String>> details = new ArrayList<>();
for (Long p = 0L; p < pageSize; p++) {
int beforeCount = (int) ((s - 1) * sheetLimit);
String querySQL = SQLProvider.createQuerySQLWithLimit(sqlMeta, false, needOrder, false, beforeCount + p.intValue() * extractPageSize, extractPageSize);
if (pageSize == 1) {
querySQL = SQLProvider.createQuerySQLWithLimit(sqlMeta, false, needOrder, false, 0, sheetSize.intValue());
}
querySQL = provider.rebuildSQL(querySQL, sqlMeta, crossDs, dsMap);
DatasourceRequest datasourceRequest = new DatasourceRequest();
datasourceRequest.setQuery(querySQL);
datasourceRequest.setDsList(dsMap);
Map<String, Object> previewData = datasetDataManage.buildPreviewData(provider.fetchResultField(datasourceRequest), allFields, desensitizationList);
List<Map<String, Object>> data = (List<Map<String, Object>>) previewData.get("data");
if (p.equals(0L)) {
detailsSheet = wb.createSheet("数据" + s);
List<String> header = new ArrayList<>();
for (DatasetTableFieldDTO field : allFields) {
header.add(field.getName());
}
details.add(header);
for (Map<String, Object> obj : data) {
List<String> row = new ArrayList<>();
for (DatasetTableFieldDTO field : allFields) {
String string = (String) obj.get(field.getDataeaseName());
row.add(string);
}
details.add(row);
}
if (CollectionUtils.isNotEmpty(details)) {
for (int i = 0; i < details.size(); i++) {
Row row = detailsSheet.createRow(i);
List<String> rowData = details.get(i);
if (rowData != null) {
for (int j = 0; j < rowData.size(); j++) {
Cell cell = row.createCell(j);
if (i == 0) {
cell.setCellValue(rowData.get(j));
cell.setCellStyle(cellStyle);
detailsSheet.setColumnWidth(j, 255 * 20);
} else {
if ((allFields.get(j).getDeType().equals(DeTypeConstants.DE_INT) || allFields.get(j).getDeType() == DeTypeConstants.DE_FLOAT) && StringUtils.isNotEmpty(rowData.get(j))) {
try {
cell.setCellValue(Double.valueOf(rowData.get(j)));
} catch (Exception e) {
cell.setCellValue(rowData.get(j));
}
} else {
cell.setCellValue(rowData.get(j));
}
}
}
}
}
}
} else {
details.clear();
for (Map<String, Object> obj : data) {
List<String> row = new ArrayList<>();
for (DatasetTableFieldDTO field : allFields) {
String string = (String) obj.get(field.getDataeaseName());
row.add(string);
}
details.add(row);
}
int lastNum = detailsSheet.getLastRowNum();
for (int i = 0; i < details.size(); i++) {
Row row = detailsSheet.createRow(i + lastNum + 1);
List<String> rowData = details.get(i);
if (rowData != null) {
for (int j = 0; j < rowData.size(); j++) {
Cell cell = row.createCell(j);
cell.setCellValue(rowData.get(j));
}
}
}
}
exportTask.setExportStatus("IN_PROGRESS");
double exportRogress2 = (double) ((double) s - 1) / ((double) sheetCount);
double exportRogress = (double) ((double) (p + 1) / (double) pageSize) * ((double) 1 / sheetCount);
DecimalFormat df = new DecimalFormat("#.##");
String formattedResult = df.format((exportRogress + exportRogress2) * 100);
exportTask.setExportProgress(formattedResult);
exportTaskMapper.updateById(exportTask);
}
}
this.addWatermarkTools(wb);
FileOutputStream fileOutputStream = new FileOutputStream(dataPath + "/" + exportTask.getId() + ".xlsx");
wb.write(fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
wb.close();
exportTask.setExportProgress("100");
exportTask.setExportStatus("SUCCESS");
setFileSize(dataPath + "/" + exportTask.getId() + ".xlsx", exportTask);
} catch (Exception e) {
LogUtil.error("Failed to export data", e);
exportTask.setMsg(e.getMessage());
exportTask.setExportStatus("FAILED");
} finally {
exportTaskMapper.updateById(exportTask);
}
});
Running_Task.put(exportTask.getId(), future);
}
private void startViewTask(CoreExportTask exportTask, ChartExcelRequest request) {
String dataPath = exportData_path + exportTask.getId();
File directory = new File(dataPath);
boolean isCreated = directory.mkdir();
TokenUserBO tokenUserBO = AuthUtils.getUser();
Future future = scheduledThreadPoolExecutor.submit(() -> {
// LicenseUtil.validate();
AuthUtils.setUser(tokenUserBO);
try {
exportTask.setExportStatus("IN_PROGRESS");
exportTaskMapper.updateById(exportTask);
Workbook wb = new SXSSFWorkbook();
CellStyle cellStyle = wb.createCellStyle();
Font font = wb.createFont();
font.setFontHeightInPoints((short) 12);
font.setBold(true);
cellStyle.setFont(font);
cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
List<Object[]> details = new ArrayList<>();
Sheet detailsSheet;
Integer sheetIndex = 1;
if ("dataset".equals(request.getDownloadType()) || request.getViewInfo().getType().equalsIgnoreCase("table-info")) {
request.getViewInfo().getChartExtRequest().setPageSize(Long.valueOf(extractPageSize));
ChartViewDTO chartViewDTO = chartDataServer.findExcelData(request);
for (long i = 1; i < chartViewDTO.getTotalPage() + 1; i++) {
request.getViewInfo().getChartExtRequest().setGoPage(i);
chartDataServer.findExcelData(request);
details.addAll(request.getDetails());
if (((details.size() + extractPageSize) > sheetLimit) || i == chartViewDTO.getTotalPage()) {
detailsSheet = wb.createSheet("数据" + sheetIndex);
Integer[] excelTypes = request.getExcelTypes();
details.add(0, request.getHeader());
ViewDetailField[] detailFields = request.getDetailFields();
Object[] header = request.getHeader();
ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), wb);
sheetIndex++;
details.clear();
exportTask.setExportStatus("IN_PROGRESS");
double exportRogress = (double) (i / (chartViewDTO.getTotalPage() + 1));
DecimalFormat df = new DecimalFormat("#.##");
String formattedResult = df.format((exportRogress) * 100);
exportTask.setExportProgress(formattedResult);
exportTaskMapper.updateById(exportTask);
}
}
} else {
downloadNotTableInfoData(request, wb);
}
this.addWatermarkTools(wb);
try (FileOutputStream outputStream = new FileOutputStream(dataPath + "/" + exportTask.getId() + ".xlsx")) {
wb.write(outputStream);
outputStream.flush();
}
wb.close();
exportTask.setExportProgress("100");
exportTask.setExportStatus("SUCCESS");
setFileSize(dataPath + "/" + exportTask.getId() + ".xlsx", exportTask);
} catch (Exception e) {
exportTask.setMsg(e.getMessage());
LogUtil.error("Failed to export data", e);
exportTask.setExportStatus("FAILED");
} finally {
exportTaskMapper.updateById(exportTask);
}
});
Running_Task.put(exportTask.getId(), future);
}
private void downloadNotTableInfoData(ChartExcelRequest request, Workbook wb) {
chartDataServer.findExcelData(request);
//给单元格设置样式
CellStyle cellStyle = wb.createCellStyle();
Font font = wb.createFont();
//设置字体大小
font.setFontHeightInPoints((short) 12);
//设置字体加粗
font.setBold(true);
//给字体设置样式
cellStyle.setFont(font);
//设置单元格背景颜色
cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
//设置单元格填充样式(使用纯色背景颜色填充)
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
if (CollectionUtils.isEmpty(request.getMultiInfo())) {
if (request.getViewInfo().getType().equalsIgnoreCase("chart-mix-dual-line")) {
} else {
List<Object[]> details = request.getDetails();
Integer[] excelTypes = request.getExcelTypes();
details.add(0, request.getHeader());
ViewDetailField[] detailFields = request.getDetailFields();
Object[] header = request.getHeader();
Sheet detailsSheet = wb.createSheet("数据");
if (request.getViewInfo().getType().equalsIgnoreCase("table-normal")) {
ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), wb);
} else {
ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), null);
}
}
} else {
//多个sheet
for (int i = 0; i < request.getMultiInfo().size(); i++) {
ChartExcelRequestInner requestInner = request.getMultiInfo().get(i);
List<Object[]> details = requestInner.getDetails();
Integer[] excelTypes = requestInner.getExcelTypes();
details.add(0, requestInner.getHeader());
ViewDetailField[] detailFields = requestInner.getDetailFields();
Object[] header = requestInner.getHeader();
//明细sheet
Sheet detailsSheet = wb.createSheet("数据 " + (i + 1));
ChartDataServer.setExcelData(detailsSheet, cellStyle, header, details, detailFields, excelTypes, request.getViewInfo(), null);
}
}
}
private void setFileSize(String filePath, CoreExportTask exportTask) {
File file = new File(filePath);
long length = file.length();
String unit = "Mb";
Double size = 0.0;
if ((double) length / 1024 / 1024 > 1) {
if ((double) length / 1024 / 1024 / 1024 > 1) {
unit = "Gb";
size = Double.valueOf(String.format("%.2f", (double) length / 1024 / 1024 / 1024));
} else {
size = Double.valueOf(String.format("%.2f", (double) length / 1024 / 1024));
}
} else {
unit = "Kb";
size = Double.valueOf(String.format("%.2f", (double) length / 1024));
}
exportTask.setFileSize(size);
exportTask.setFileSizeUnit(unit);
}
private static final String LOG_RETENTION = "30";
public void cleanLog() { public void cleanLog() {
String key = "basic.exportFileLiveTime"; String key = "basic.exportFileLiveTime";
String val = sysParameterManage.singleVal(key); String val = sysParameterManage.singleVal(key);
@ -795,14 +325,46 @@ public class ExportCenterManage implements BaseExportApi {
public void addWatermarkTools(Workbook wb) { public void addWatermarkTools(Workbook wb) {
VisualizationWatermark watermark = watermarkMapper.selectById("system_default"); VisualizationWatermark watermark = watermarkMapper.selectById("system_default");
WatermarkContentDTO watermarkContent = JsonUtil.parseObject(watermark.getSettingContent(), WatermarkContentDTO.class); WatermarkContentDTO watermarkContent = JsonUtil.parseObject(watermark.getSettingContent(), WatermarkContentDTO.class);
// if (watermarkContent.getEnable() && watermarkContent.getExcelEnable()) { if (watermarkContent.getEnable() && watermarkContent.getExcelEnable()) {
// UserFormVO userInfo = visualizationMapper.queryInnerUserInfo(AuthUtils.getUser().getUserId()); UserFormVO userInfo = visualizationMapper.queryInnerUserInfo(AuthUtils.getUser().getUserId());
// // 在主逻辑中添加水印 // 在主逻辑中添加水印
// int watermarkPictureIdx = ExcelWatermarkUtils.addWatermarkImage(wb, watermarkContent, userInfo); // 生成水印图片并获取 ID int watermarkPictureIdx = ExcelWatermarkUtils.addWatermarkImage(wb, watermarkContent, userInfo); // 生成水印图片并获取 ID
// for (Sheet sheet : wb) { for (Sheet sheet : wb) {
// ExcelWatermarkUtils.addWatermarkToSheet(sheet, watermarkPictureIdx); // 为每个 Sheet 添加水印 ExcelWatermarkUtils.addWatermarkToSheet(sheet, watermarkPictureIdx); // 为每个 Sheet 添加水印
// } }
// } }
}
@DeLog(id = "#p0", ot = LogOT.DOWNLOAD, st = LogST.DATA)
public void generateDownloadUri(String id) {
CoreExportDownloadTask coreExportDownloadTask = coreExportDownloadTaskMapper.selectById(id);
if (coreExportDownloadTask != null) {
coreExportDownloadTask.setCreateTime(System.currentTimeMillis());
coreExportDownloadTaskMapper.updateById(coreExportDownloadTask);
} else {
coreExportDownloadTask = new CoreExportDownloadTask();
coreExportDownloadTask.setId(id);
coreExportDownloadTask.setCreateTime(System.currentTimeMillis());
coreExportDownloadTask.setValidTime(5L);
coreExportDownloadTaskMapper.insert(coreExportDownloadTask);
}
}
@Scheduled(fixedRate = 60 * 60 * 1000)
public void checkDownLoadInfos() {
coreExportDownloadTaskMapper.selectList(null).forEach(downLoadInfo -> {
if (System.currentTimeMillis() - downLoadInfo.getCreateTime() > downLoadInfo.getValidTime() * 60 * 1000) {
coreExportDownloadTaskMapper.deleteById(downLoadInfo.getId());
}
});
}
@Data
public class DownLoadInfo {
String id;
Long validTime; // 单位minutes
Long createTime;
} }
} }

View File

@ -1,5 +1,7 @@
package io.gisbi.exportCenter.server; package io.gisbi.exportCenter.server;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.gisbi.api.exportCenter.ExportCenterApi; import io.gisbi.api.exportCenter.ExportCenterApi;
import io.gisbi.exportCenter.manage.ExportCenterManage; import io.gisbi.exportCenter.manage.ExportCenterManage;
import io.gisbi.exportCenter.util.ExportCenterUtils; import io.gisbi.exportCenter.util.ExportCenterUtils;
@ -11,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
import java.util.Map;
@RestController @RestController
@RequestMapping("/exportCenter") @RequestMapping("/exportCenter")
@ -20,8 +23,14 @@ public class ExportCenterServer implements ExportCenterApi {
private ExportCenterManage exportCenterManage; private ExportCenterManage exportCenterManage;
@Override @Override
public List<ExportTaskDTO> exportTasks(String status) { public Map<String, Long> exportTasks() {
return exportCenterManage.exportTasks(status); return exportCenterManage.exportTasks();
}
@Override
public IPage<ExportTaskDTO> pager(int goPage, int pageSize, String status) {
Page<ExportTaskDTO> page = new Page<>(goPage, pageSize);
return exportCenterManage.pager(page, status);
} }
@Override @Override
@ -44,6 +53,12 @@ public class ExportCenterServer implements ExportCenterApi {
exportCenterManage.download(id, response); exportCenterManage.download(id, response);
} }
@Override
public String generateDownloadUri(String id) throws Exception {
exportCenterManage.generateDownloadUri(id);
return "";
}
@Override @Override
public void retry(String id) { public void retry(String id) {
exportCenterManage.retry(id); exportCenterManage.retry(id);

View File

@ -32,7 +32,7 @@ import java.util.UUID;
@Component @Component
public class FontManage { public class FontManage {
@Value("${gisbi.path.font:/opt/gisbi/data/font/}") @Value("${gisbi.path.font:/opt/gisbi2.0/data/font/}")
private String path; private String path;
@Resource @Resource

View File

@ -6,7 +6,7 @@ import org.springframework.stereotype.Component;
@Component @Component
public class CoreLicManage { public class CoreLicManage {
@Value("1.0.0") @Value("2.0.0")
private String version; private String version;
public String getVersion() { public String getVersion() {

View File

@ -18,6 +18,6 @@ public class LicenseServer {
@GetMapping("/version") @GetMapping("/version")
public String version() { public String version() {
return "1.0.0"; return "2.0.0";
} }
} }

View File

@ -2,24 +2,16 @@ package io.gisbi.listener;
import io.gisbi.utils.ConfigUtils; import io.gisbi.utils.ConfigUtils;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import java.util.Objects;
public class EhCacheStartListener implements ApplicationContextInitializer<ConfigurableApplicationContext> { public class EhCacheStartListener implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override @Override
public void initialize(ConfigurableApplicationContext applicationContext) { public void initialize(ConfigurableApplicationContext applicationContext) {
Resource resource = new ClassPathResource("application.yml"); String property = applicationContext.getEnvironment().getProperty("gisbi.login_timeout", String.class, "480");
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource);
String property = Objects.requireNonNull(factory.getObject()).getProperty("gisbi.login_timeout", "480");
System.setProperty("gisbi.login_timeout", property); System.setProperty("gisbi.login_timeout", property);
String ehcache = ConfigUtils.getConfig("gisbi.path.ehcache", "/opt/gisbi/cache"); String ehcache = ConfigUtils.getConfig("gisbi.path.ehcache", "/opt/gisbi2.0/cache");
System.setProperty("gisbi.path.ehcache", ehcache); System.setProperty("gisbi.path.ehcache", ehcache);
} }
} }

View File

@ -19,7 +19,6 @@ public class MenuServer implements MenuApi {
@Resource @Resource
private MenuManage menuManage; private MenuManage menuManage;
@I18n
@Override @Override
public List<MenuVO> query() { public List<MenuVO> query() {
List<CoreMenu> coreMenus = menuManage.coreMenus(); List<CoreMenu> coreMenus = menuManage.coreMenus();

View File

@ -2,6 +2,7 @@ package io.gisbi.resource;
import io.gisbi.api.permissions.auth.dto.BusiPerCheckDTO; import io.gisbi.api.permissions.auth.dto.BusiPerCheckDTO;
import io.gisbi.constant.AuthEnum; import io.gisbi.constant.AuthEnum;
import io.gisbi.system.manage.CorePermissionManage;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -10,11 +11,19 @@ import org.springframework.stereotype.Component;
*/ */
@Component @Component
public class ResourceService { public class ResourceService {
@Resource
private CorePermissionManage corePermissionManage;
public boolean checkPermission(Long id) { public boolean checkPermission(Long id) {
BusiPerCheckDTO dto = new BusiPerCheckDTO(); BusiPerCheckDTO dto = new BusiPerCheckDTO();
dto.setId(id); dto.setId(id);
dto.setAuthEnum(AuthEnum.READ); dto.setAuthEnum(AuthEnum.READ);
return true; boolean b;
try {
b = corePermissionManage.checkAuth(dto);
} catch (Exception e) {
b = false;
}
return b;
} }
} }

View File

@ -18,6 +18,7 @@ public interface XpackShareExtMapper {
s.id as share_id, s.id as share_id,
v.id as resource_id, v.id as resource_id,
v.mobile_layout as ext_flag, v.mobile_layout as ext_flag,
v.status as ext_flag1,
v.type, v.type,
s.creator, s.creator,
s.time, s.time,

View File

@ -30,4 +30,6 @@ public class XpackSharePO implements Serializable {
private Integer extFlag; private Integer extFlag;
private Integer extFlag1;
} }

View File

@ -19,8 +19,14 @@ import java.util.List;
@Component @Component
public class LinkInterceptor implements HandlerInterceptor { public class LinkInterceptor implements HandlerInterceptor {
private final static String whiteListText = "/user/ipInfo, /apisix/check, /datasetData/enumValue, /datasetData/enumValueObj, /datasetData/getFieldTree, /dekey, /symmetricKey, /share/validate, /sysParameter/queryOnlineMap, /xpackComponent/viewPlugins, /v3/api-docs, /v3/api-docs/**, /swagger-ui, /swagger-ui/**, /swagger-ui.html, /swagger-resources"; private final static String whiteListText = "/user/ipInfo, /apisix/check, /datasetData/enumValue, /datasetData/enumValueObj, /datasetData/getFieldTree, /dekey, /symmetricKey, /share/validate, /sysParameter/queryOnlineMap, /xpackComponent/viewPlugins";
private final static String whiteStartListText = "/dataVisualization/findDvType/";
private boolean isWhiteStart(String url) {
List<String> whiteStartList = Arrays.stream(StringUtils.split(whiteStartListText, ",")).map(String::trim).toList();
return whiteStartList.stream().anyMatch(item -> StringUtils.startsWith(url, item));
}
@Override @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
@ -33,6 +39,7 @@ public class LinkInterceptor implements HandlerInterceptor {
if (deLinkPermit == null) { if (deLinkPermit == null) {
List<String> whiteList = Arrays.stream(StringUtils.split(whiteListText, ",")).map(String::trim).toList(); List<String> whiteList = Arrays.stream(StringUtils.split(whiteListText, ",")).map(String::trim).toList();
String requestURI = ServletUtils.request().getRequestURI(); String requestURI = ServletUtils.request().getRequestURI();
if (StringUtils.startsWith(requestURI, WhitelistUtils.getContextPath())) { if (StringUtils.startsWith(requestURI, WhitelistUtils.getContextPath())) {
requestURI = requestURI.replaceFirst(WhitelistUtils.getContextPath(), ""); requestURI = requestURI.replaceFirst(WhitelistUtils.getContextPath(), "");
@ -40,7 +47,7 @@ public class LinkInterceptor implements HandlerInterceptor {
if (StringUtils.startsWith(requestURI, AuthConstant.DE_API_PREFIX)) { if (StringUtils.startsWith(requestURI, AuthConstant.DE_API_PREFIX)) {
requestURI = requestURI.replaceFirst(AuthConstant.DE_API_PREFIX, ""); requestURI = requestURI.replaceFirst(AuthConstant.DE_API_PREFIX, "");
} }
boolean valid = whiteList.contains(requestURI) || WhitelistUtils.match(requestURI); boolean valid = whiteList.contains(requestURI) || isWhiteStart(requestURI) || WhitelistUtils.match(requestURI);
if (!valid) { if (!valid) {
DEException.throwException("分享链接Token不支持访问当前url[" + requestURI + "]"); DEException.throwException("分享链接Token不支持访问当前url[" + requestURI + "]");
} }

View File

@ -204,7 +204,7 @@ public class XpackShareManage {
return pos.stream().map(po -> return pos.stream().map(po ->
new XpackShareGridVO( new XpackShareGridVO(
po.getShareId(), po.getResourceId(), po.getName(), po.getCreator().toString(), po.getShareId(), po.getResourceId(), po.getName(), po.getCreator().toString(),
po.getTime(), po.getExp(), 9, po.getExtFlag(), po.getType())).toList(); po.getTime(), po.getExp(), 9, po.getExtFlag(),po.getExtFlag1(), po.getType())).toList();
} }
private XpackShareManage proxy() { private XpackShareManage proxy() {

View File

@ -11,6 +11,7 @@ import io.gisbi.share.dao.auto.entity.XpackShare;
import io.gisbi.share.manage.XpackShareManage; import io.gisbi.share.manage.XpackShareManage;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;

View File

@ -13,12 +13,12 @@ import io.gisbi.utils.CommonBeanFactory;
import io.gisbi.utils.IDUtils; import io.gisbi.utils.IDUtils;
import io.gisbi.utils.SystemSettingUtils; import io.gisbi.utils.SystemSettingUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -26,10 +26,10 @@ import java.util.stream.Collectors;
@Component @Component
public class SysParameterManage { public class SysParameterManage {
@Value("${dataease.show-demo-tips:false}") @Value("${gisbi.show-demo-tips:false}")
private boolean showDemoTips; private boolean showDemoTips;
@Value("${dataease.demo-tips-content:#{null}}") @Value("${gisbi.demo-tips-content:#{null}}")
private String demoTipsContent; private String demoTipsContent;
private static final String MAP_KEY_PREFIX = "map."; private static final String MAP_KEY_PREFIX = "map.";
@ -52,30 +52,61 @@ public class SysParameterManage {
return null; return null;
} }
public OnlineMapEditor queryOnlineMap() { public OnlineMapEditor queryOnlineMap(String mapType) {
if (StringUtils.isBlank(mapType)) {
List<CoreSysSetting> typeList = groupList(MAP_KEY_PREFIX + "mapType");
mapType = "gaode";
if (!CollectionUtils.isEmpty(typeList)) {
mapType = typeList.getFirst().getPval();
}
}
String prefix;
if (!StringUtils.equals(mapType, "gaode")) {
prefix = mapType + "." + MAP_KEY_PREFIX;
} else {
prefix = MAP_KEY_PREFIX;
}
var editor = new OnlineMapEditor(); var editor = new OnlineMapEditor();
List<String> fields = BeanUtils.getFieldNames(OnlineMapEditor.class); List<String> fields = BeanUtils.getFieldNames(OnlineMapEditor.class);
Map<String, String> mapVal = groupVal(MAP_KEY_PREFIX); Map<String, String> mapVal = groupVal(prefix);
fields.forEach(field -> { fields.forEach(field -> {
String val = mapVal.get(MAP_KEY_PREFIX + field); String val = mapVal.get(prefix + field);
if (StringUtils.isNotBlank(val)) { if (StringUtils.isNotBlank(val)) {
BeanUtils.setFieldValueByName(editor, field, val, String.class); BeanUtils.setFieldValueByName(editor, field, val, String.class);
} }
}); });
editor.setMapType(mapType);
return editor; return editor;
} }
public void saveOnlineMap(OnlineMapEditor editor) { public void saveOnlineMap(OnlineMapEditor editor) {
String mapType = editor.getMapType();
if (StringUtils.isBlank(mapType)) {
List<CoreSysSetting> typeList = groupList(MAP_KEY_PREFIX + "mapType");
mapType = "gaode";
if (!CollectionUtils.isEmpty(typeList)) {
mapType = typeList.getFirst().getPval();
}
}
List<String> fieldNames = BeanUtils.getFieldNames(OnlineMapEditor.class); List<String> fieldNames = BeanUtils.getFieldNames(OnlineMapEditor.class);
String finalMapType = mapType;
fieldNames.forEach(field -> { fieldNames.forEach(field -> {
String prefix = MAP_KEY_PREFIX;
if (!(StringUtils.equals(field, "mapType") || StringUtils.equals(finalMapType, "gaode"))) {
prefix = finalMapType + "." + MAP_KEY_PREFIX;
}
QueryWrapper<CoreSysSetting> queryWrapper = new QueryWrapper<>(); QueryWrapper<CoreSysSetting> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("pkey", MAP_KEY_PREFIX + field); queryWrapper.eq("pkey", prefix + field);
CoreSysSetting sysSetting = coreSysSettingMapper.selectOne(queryWrapper); CoreSysSetting sysSetting = coreSysSettingMapper.selectOne(queryWrapper);
var val = (String) BeanUtils.getFieldValueByName(field, editor); var val = (String) BeanUtils.getFieldValueByName(field, editor);
if (ObjectUtils.isEmpty(sysSetting)) { if (ObjectUtils.isEmpty(sysSetting)) {
sysSetting = new CoreSysSetting(); sysSetting = new CoreSysSetting();
sysSetting.setId(IDUtils.snowID()); sysSetting.setId(IDUtils.snowID());
sysSetting.setPkey(MAP_KEY_PREFIX + field); sysSetting.setPkey(prefix + field);
sysSetting.setPval(val == null ? "" : val); sysSetting.setPval(val == null ? "" : val);
sysSetting.setType("text"); sysSetting.setType("text");
sysSetting.setSort(1); sysSetting.setSort(1);
@ -135,15 +166,20 @@ public class SysParameterManage {
@Transactional @Transactional
public void saveGroup(List<SettingItemVO> vos, String groupKey) { public void saveGroup(List<SettingItemVO> vos, String groupKey) {
QueryWrapper<CoreSysSetting> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("pkey", groupKey);
coreSysSettingMapper.delete(queryWrapper);
List<CoreSysSetting> sysSettings = vos.stream().filter(vo -> !SystemSettingUtils.xpackSetting(vo.getPkey())).map(item -> { List<CoreSysSetting> sysSettings = vos.stream().filter(vo -> !SystemSettingUtils.xpackSetting(vo.getPkey())).map(item -> {
CoreSysSetting sysSetting = BeanUtils.copyBean(new CoreSysSetting(), item); CoreSysSetting sysSetting = BeanUtils.copyBean(new CoreSysSetting(), item);
sysSetting.setId(IDUtils.snowID()); sysSetting.setId(IDUtils.snowID());
return sysSetting; return sysSetting;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(sysSettings)) {
QueryWrapper<CoreSysSetting> queryWrapper = new QueryWrapper<>();
sysSettings.forEach(sysSetting -> {
queryWrapper.clear();
queryWrapper.eq("pkey", sysSetting.getPkey());
coreSysSettingMapper.delete(queryWrapper);
});
extCoreSysSettingMapper.saveBatch(sysSettings); extCoreSysSettingMapper.saveBatch(sysSettings);
}
datasourceServer.addJob(sysSettings); datasourceServer.addJob(sysSettings);
} }

View File

@ -38,7 +38,12 @@ public class SysParameterServer implements SysParameterApi {
@Override @Override
public OnlineMapEditor queryOnlineMap() { public OnlineMapEditor queryOnlineMap() {
return sysParameterManage.queryOnlineMap(); return sysParameterManage.queryOnlineMap(null);
}
@Override
public OnlineMapEditor queryOnlineMapByMapType(String type) {
return sysParameterManage.queryOnlineMap(type);
} }
@Override @Override

View File

@ -7,12 +7,14 @@ import io.gisbi.api.template.dto.TemplateMarketPreviewInfoDTO;
import io.gisbi.api.template.response.*; import io.gisbi.api.template.response.*;
import io.gisbi.api.template.vo.MarketApplicationMetaDataVO; import io.gisbi.api.template.vo.MarketApplicationMetaDataVO;
import io.gisbi.api.template.vo.MarketApplicationSpecVO; import io.gisbi.api.template.vo.MarketApplicationSpecVO;
import io.gisbi.api.template.vo.MarketLatestReleaseVO;
import io.gisbi.api.template.vo.MarketMetaDataVO; import io.gisbi.api.template.vo.MarketMetaDataVO;
import io.gisbi.constant.CommonConstants; import io.gisbi.constant.CommonConstants;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.i18n.Translator; import io.gisbi.i18n.Translator;
import io.gisbi.operation.manage.CoreOptRecentManage; import io.gisbi.operation.manage.CoreOptRecentManage;
import io.gisbi.system.manage.SysParameterManage; import io.gisbi.system.manage.SysParameterManage;
import io.gisbi.template.dao.auto.entity.VisualizationTemplateCategoryMap;
import io.gisbi.template.dao.auto.mapper.VisualizationTemplateCategoryMapMapper; import io.gisbi.template.dao.auto.mapper.VisualizationTemplateCategoryMapMapper;
import io.gisbi.template.dao.ext.ExtVisualizationTemplateMapper; import io.gisbi.template.dao.ext.ExtVisualizationTemplateMapper;
import io.gisbi.utils.HttpClientConfig; import io.gisbi.utils.HttpClientConfig;
@ -67,7 +69,6 @@ public class TemplateCenterManage {
} }
/** /**
* @param templateUrl template url
* @Description Get template file from template market * @Description Get template file from template market
*/ */
public TemplateManageFileDTO getTemplateFromMarketV2(String templateName) { public TemplateManageFileDTO getTemplateFromMarketV2(String templateName) {
@ -101,7 +102,8 @@ public class TemplateCenterManage {
config.setConnectTimeout(5000); config.setConnectTimeout(5000);
config.setSocketTimeout(10000); config.setSocketTimeout(10000);
config.setConnectionRequestTimeout(5000); config.setConnectionRequestTimeout(5000);
return HttpClientUtil.get(url, config); return HttpClientUtil.
get(url, config);
} }
private MarketTemplateV2BaseResponse templateQuery(Map<String, String> templateParams) { private MarketTemplateV2BaseResponse templateQuery(Map<String, String> templateParams) {

View File

@ -22,7 +22,7 @@ import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
/** /**
* @Author bi-coder * @author : WangJiaHao
* @date : 2024/5/7 * @date : 2024/5/7
*/ */
@Service @Service

View File

@ -17,10 +17,7 @@ public class DataVisualizationInfo implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private Long id; private Long id;
/**
* 应用ID
*/
private String appId;
/** /**
* 名称 * 名称
*/ */
@ -345,7 +342,6 @@ public class DataVisualizationInfo implements Serializable {
public String toString() { public String toString() {
return "DataVisualizationInfo{" + return "DataVisualizationInfo{" +
"id = " + id + "id = " + id +
", appId = " + appId +
", name = " + name + ", name = " + name +
", pid = " + pid + ", pid = " + pid +
", orgId = " + orgId + ", orgId = " + orgId +
@ -372,12 +368,4 @@ public class DataVisualizationInfo implements Serializable {
", checkVersion = " + checkVersion + ", checkVersion = " + checkVersion +
"}"; "}";
} }
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
} }

View File

@ -3,6 +3,7 @@ package io.gisbi.visualization.dao.auto.mapper;
import io.gisbi.visualization.dao.auto.entity.VisualizationWatermark; import io.gisbi.visualization.dao.auto.entity.VisualizationWatermark;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;
/** /**
* <p> * <p>
@ -15,4 +16,8 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface VisualizationWatermarkMapper extends BaseMapper<VisualizationWatermark> { public interface VisualizationWatermarkMapper extends BaseMapper<VisualizationWatermark> {
@Update("""
UPDATE `visualization_watermark` set `setting_content` = REPLACE(`setting_content`,'"enable":true','"enable":false')
""")
void disable();
} }

View File

@ -19,7 +19,8 @@ public interface CoreStoreExtMapper {
v.update_by as editor, v.update_by as editor,
v.update_time as edit_time, v.update_time as edit_time,
v.name, v.name,
v.mobile_layout as ext_flag v.mobile_layout as ext_flag,
v.status as ext_flag1
from core_store s from core_store s
inner join data_visualization_info v on s.resource_id = v.id inner join data_visualization_info v on s.resource_id = v.id
${ew.customSqlSegment} ${ew.customSqlSegment}

View File

@ -14,7 +14,7 @@ import java.util.Set;
public interface CoreVisualiationExtMapper { public interface CoreVisualiationExtMapper {
@Select(""" @Select("""
select id, name, pid, node_type, mobile_layout as extraFlag from data_visualization_info select id, name, pid, node_type, mobile_layout as extraFlag, status as extraFlag1 from data_visualization_info
${ew.customSqlSegment} ${ew.customSqlSegment}
""") """)
List<VisualizationNodePO> queryNodes(@Param("ew") QueryWrapper<Object> queryWrapper); List<VisualizationNodePO> queryNodes(@Param("ew") QueryWrapper<Object> queryWrapper);

View File

@ -7,13 +7,16 @@ import io.gisbi.api.visualization.dto.VisualizationViewTableDTO;
import io.gisbi.api.visualization.vo.DataVisualizationBaseVO; import io.gisbi.api.visualization.vo.DataVisualizationBaseVO;
import io.gisbi.api.visualization.vo.DataVisualizationVO; import io.gisbi.api.visualization.vo.DataVisualizationVO;
import io.gisbi.api.visualization.vo.VisualizationReportFilterVO; import io.gisbi.api.visualization.vo.VisualizationReportFilterVO;
import io.gisbi.api.visualization.vo.VisualizationResourceVO;
import io.gisbi.chart.dao.auto.entity.CoreChartView; import io.gisbi.chart.dao.auto.entity.CoreChartView;
import io.gisbi.visualization.dao.ext.po.StorePO;
import io.gisbi.visualization.dao.ext.po.VisualizationResourcePO; import io.gisbi.visualization.dao.ext.po.VisualizationResourcePO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
@Mapper @Mapper
@ -29,12 +32,12 @@ public interface ExtDataVisualizationMapper {
String findDvType(@Param("dvId") Long dvId); String findDvType(@Param("dvId") Long dvId);
void dvCopy(@Param("sourceDvId") Long sourceDvId,@Param("newDvId") Long newDvId,@Param("copyId") Long copyId); void dvCopy(@Param("sourceDvId") Long sourceDvId,@Param("newDvId") Long newDvId,@Param("copyId") Long copyId);
void viewCopyWithDv(@Param("sourceDvId") Long sourceDvId,@Param("newDvId") Long newDvId,@Param("copyId") Long copyId); void viewCopyWithDv(@Param("sourceDvId") Long sourceDvId,@Param("newDvId") Long newDvId,@Param("copyId") Long copyId,@Param("resourceTable") String resourceTable);
List<CoreChartView> findViewInfoByCopyId(@Param("copyId") Long copyId); List<CoreChartView> findViewInfoByCopyId(@Param("copyId") Long copyId);
DataVisualizationVO findDvInfo(@Param("dvId") Long dvId,@Param("dvType") String dvType); DataVisualizationVO findDvInfo(@Param("dvId") Long dvId,@Param("dvType") String dvType,@Param("resourceTable") String resourceTable);
IPage<VisualizationResourcePO> findRecent(IPage<VisualizationResourcePO> page, @Param("uid") Long uid, @Param("keyword") String keyword, @Param("ew") QueryWrapper<Object> ew); IPage<VisualizationResourcePO> findRecent(IPage<VisualizationResourcePO> page, @Param("uid") Long uid, @Param("keyword") String keyword, @Param("ew") Map ew);
void copyLinkJump(@Param("copyId") Long copyId); void copyLinkJump(@Param("copyId") Long copyId);
@ -50,9 +53,52 @@ public interface ExtDataVisualizationMapper {
List<VisualizationReportFilterVO> queryReportFilter(@Param("dvId") Long dvId,@Param("taskId") Long taskId); List<VisualizationReportFilterVO> queryReportFilter(@Param("dvId") Long dvId,@Param("taskId") Long taskId);
void deleteDataVBatch(@Param("ids") Set<Long> ids); void deleteDataVBatch(@Param("ids") Set<Long> ids,@Param("resourceTable") String resourceTable);
void deleteViewsBatch(@Param("ids") Set<Long> ids); void deleteViewsBatch(@Param("ids") Set<Long> ids,@Param("resourceTable") String resourceTable);
UserFormVO queryInnerUserInfo(@Param("id") Long id); UserFormVO queryInnerUserInfo(@Param("id") Long id);
void snapshotDataV(@Param("dvId") Long dvId);
void snapshotViews(@Param("dvId") Long dvId);
void snapshotLinkJumpTargetViewInfo(@Param("dvId") Long dvId);
void snapshotLinkJumpInfo(@Param("dvId") Long dvId);
void snapshotLinkJump(@Param("dvId") Long dvId);
void snapshotLinkageField(@Param("dvId") Long dvId);
void snapshotLinkage(@Param("dvId") Long dvId);
void snapshotOuterParamsTargetViewInfo(@Param("dvId") Long dvId);
void snapshotOuterParamsInfo(@Param("dvId") Long dvId);
void snapshotOuterParams(@Param("dvId") Long dvId);
void restoreDataV(@Param("dvId") Long dvId);
void restoreViews(@Param("dvId") Long dvId);
void restoreLinkJumpTargetViewInfo(@Param("dvId") Long dvId);
void restoreLinkJumpInfo(@Param("dvId") Long dvId);
void restoreLinkJump(@Param("dvId") Long dvId);
void restoreLinkageField(@Param("dvId") Long dvId);
void restoreLinkage(@Param("dvId") Long dvId);
void restoreOuterParamsTargetViewInfo(@Param("dvId") Long dvId);
void restoreOuterParamsInfo(@Param("dvId") Long dvId);
void restoreOuterParams(@Param("dvId") Long dvId);
@Select("select status from data_visualization_info where id = #{dvId}")
Integer findDvInfoStats(@Param("dvId") Long dvId);
} }

View File

@ -14,13 +14,15 @@ import java.util.List;
public interface ExtVisualizationLinkJumpMapper { public interface ExtVisualizationLinkJumpMapper {
List<VisualizationLinkJumpDTO> queryWithDvId(@Param("dvId") Long dvId,@Param("uid") Long uid,@Param("isDesktop") Boolean isDesktop); List<VisualizationLinkJumpDTO> queryWithDvId(@Param("dvId") Long dvId,@Param("uid") Long uid,@Param("isDesktop") Boolean isDesktop);
List<VisualizationLinkJumpDTO> queryWithDvIdSnapshot(@Param("dvId") Long dvId,@Param("uid") Long uid,@Param("isDesktop") Boolean isDesktop);
VisualizationLinkJumpDTO queryWithViewId(@Param("dvId") Long dvId,@Param("viewId") Long viewId,@Param("uid") Long uid,@Param("isDesktop") Boolean isDesktop); VisualizationLinkJumpDTO queryWithViewId(@Param("dvId") Long dvId,@Param("viewId") Long viewId,@Param("uid") Long uid,@Param("isDesktop") Boolean isDesktop);
void deleteJumpTargetViewInfo(@Param("dvId") Long dvId,@Param("viewId") Long viewId); void deleteJumpTargetViewInfoSnapshot(@Param("dvId") Long dvId,@Param("viewId") Long viewId);
void deleteJumpInfo(@Param("dvId") Long dvId,@Param("viewId") Long viewId); void deleteJumpInfoSnapshot(@Param("dvId") Long dvId,@Param("viewId") Long viewId);
void deleteJump(@Param("dvId") Long dvId,@Param("viewId") Long viewId); void deleteJumpSnapshot(@Param("dvId") Long dvId,@Param("viewId") Long viewId);
void deleteJumpTargetViewInfoWithVisualization(@Param("dvId") Long dvId); void deleteJumpTargetViewInfoWithVisualization(@Param("dvId") Long dvId);
@ -28,8 +30,16 @@ public interface ExtVisualizationLinkJumpMapper {
void deleteJumpWithVisualization(@Param("dvId") Long dvId); void deleteJumpWithVisualization(@Param("dvId") Long dvId);
void deleteJumpTargetViewInfoWithVisualizationSnapshot(@Param("dvId") Long dvId);
void deleteJumpInfoWithVisualizationSnapshot(@Param("dvId") Long dvId);
void deleteJumpWithVisualizationSnapshot(@Param("dvId") Long dvId);
List<VisualizationLinkJumpDTO> getTargetVisualizationJumpInfo(@Param("request") VisualizationLinkJumpBaseRequest request); List<VisualizationLinkJumpDTO> getTargetVisualizationJumpInfo(@Param("request") VisualizationLinkJumpBaseRequest request);
List<VisualizationLinkJumpDTO> getTargetVisualizationJumpInfoSnapshot(@Param("request") VisualizationLinkJumpBaseRequest request);
void copyLinkJump(@Param("copyId")Long copyId); void copyLinkJump(@Param("copyId")Long copyId);
void copyLinkJumpInfo(@Param("copyId")Long copyId); void copyLinkJumpInfo(@Param("copyId")Long copyId);

View File

@ -17,6 +17,10 @@ public interface ExtVisualizationLinkageMapper {
List<LinkageInfoDTO> getPanelAllLinkageInfo(@Param("dvId") Long dvId); List<LinkageInfoDTO> getPanelAllLinkageInfo(@Param("dvId") Long dvId);
List<VisualizationLinkageDTO> getViewLinkageGatherSnapshot(@Param("dvId") Long dvId, @Param("sourceViewId") Long sourceViewId, @Param("targetViewIds") List<String> targetViewIds);
List<LinkageInfoDTO> getPanelAllLinkageInfoSnapshot(@Param("dvId") Long dvId);
List<DatasetTableFieldDTO> queryTableField(@Param("table_id") Long tableId); List<DatasetTableFieldDTO> queryTableField(@Param("table_id") Long tableId);
List<DatasetTableFieldDTO> queryTableFieldWithViewId(@Param("viewId") Long viewId); List<DatasetTableFieldDTO> queryTableFieldWithViewId(@Param("viewId") Long viewId);
@ -25,6 +29,10 @@ public interface ExtVisualizationLinkageMapper {
void deleteViewLinkageField(@Param("dvId") Long dvId,@Param("sourceViewId") Long sourceViewId); void deleteViewLinkageField(@Param("dvId") Long dvId,@Param("sourceViewId") Long sourceViewId);
void deleteViewLinkageSnapshot(@Param("dvId") Long dvId,@Param("sourceViewId") Long sourceViewId);
void deleteViewLinkageFieldSnapshot(@Param("dvId") Long dvId,@Param("sourceViewId") Long sourceViewId);
void copyViewLinkage(@Param("copyId") Long copyId); void copyViewLinkage(@Param("copyId") Long copyId);
void copyViewLinkageField(@Param("copyId") Long copyId); void copyViewLinkageField(@Param("copyId") Long copyId);

View File

@ -4,6 +4,7 @@ package io.gisbi.visualization.dao.ext.mapper;
import io.gisbi.api.dataset.vo.CoreDatasetGroupVO; import io.gisbi.api.dataset.vo.CoreDatasetGroupVO;
import io.gisbi.api.visualization.dto.VisualizationOuterParamsDTO; import io.gisbi.api.visualization.dto.VisualizationOuterParamsDTO;
import io.gisbi.api.visualization.dto.VisualizationOuterParamsInfoDTO; import io.gisbi.api.visualization.dto.VisualizationOuterParamsInfoDTO;
import io.gisbi.visualization.dao.auto.entity.SnapshotVisualizationOuterParamsInfo;
import io.gisbi.visualization.dao.auto.entity.VisualizationOuterParamsInfo; import io.gisbi.visualization.dao.auto.entity.VisualizationOuterParamsInfo;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -13,7 +14,7 @@ import java.util.List;
@Mapper @Mapper
public interface ExtVisualizationOuterParamsMapper { public interface ExtVisualizationOuterParamsMapper {
VisualizationOuterParamsDTO queryWithVisualizationId(@Param("visualizationId") String visualizationId); VisualizationOuterParamsDTO queryWithVisualizationIdSnapshot(@Param("visualizationId") String visualizationId);
void deleteOuterParamsTargetWithVisualizationId(@Param("visualizationId") String visualizationId); void deleteOuterParamsTargetWithVisualizationId(@Param("visualizationId") String visualizationId);
@ -21,9 +22,15 @@ public interface ExtVisualizationOuterParamsMapper {
void deleteOuterParamsWithVisualizationId(@Param("visualizationId") String visualizationId); void deleteOuterParamsWithVisualizationId(@Param("visualizationId") String visualizationId);
void deleteOuterParamsTargetWithVisualizationIdSnapshot(@Param("visualizationId") String visualizationId);
void deleteOuterParamsInfoWithVisualizationIdSnapshot(@Param("visualizationId") String visualizationId);
void deleteOuterParamsWithVisualizationIdSnapshot(@Param("visualizationId") String visualizationId);
List<VisualizationOuterParamsInfoDTO> getVisualizationOuterParamsInfo(@Param("visualizationId") String visualizationId); List<VisualizationOuterParamsInfoDTO> getVisualizationOuterParamsInfo(@Param("visualizationId") String visualizationId);
List<VisualizationOuterParamsInfo> getVisualizationOuterParamsInfoBase(@Param("visualizationId") String visualizationId); List<SnapshotVisualizationOuterParamsInfo> getVisualizationOuterParamsInfoBase(@Param("visualizationId") String visualizationId);
List<CoreDatasetGroupVO> queryDsWithVisualizationId(@Param("visualizationId") String visualizationId); List<CoreDatasetGroupVO> queryDsWithVisualizationId(@Param("visualizationId") String visualizationId);
} }

View File

@ -26,4 +26,6 @@ public class StorePO implements Serializable {
private Integer extFlag; private Integer extFlag;
private Integer extFlag1;
} }

View File

@ -15,5 +15,7 @@ public class VisualizationNodePO implements Serializable {
private String nodeType; private String nodeType;
@Schema(description = "额外标识") @Schema(description = "额外标识")
private int extraFlag; private int extraFlag;
@Schema(description = "额外标识1")
private int extraFlag1;
} }

View File

@ -20,6 +20,7 @@ public class VisualizationNodeBO implements TreeBaseModel {
private Integer weight = 3; private Integer weight = 3;
private Long pid; private Long pid;
private Integer extraFlag; private Integer extraFlag;
private Integer extraFlag1;
} }

View File

@ -6,8 +6,8 @@ import io.gisbi.chart.constant.ChartConstants;
import io.gisbi.chart.manage.ChartDataManage; import io.gisbi.chart.manage.ChartDataManage;
import io.gisbi.chart.manage.ChartViewManege; import io.gisbi.chart.manage.ChartViewManege;
import io.gisbi.constant.CommonConstants; import io.gisbi.constant.CommonConstants;
import io.gisbi.dataset.server.DatasetFieldServer;
import io.gisbi.constant.DeTypeConstants; import io.gisbi.constant.DeTypeConstants;
import io.gisbi.dataset.server.DatasetFieldServer;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.exportCenter.util.ExportCenterUtils; import io.gisbi.exportCenter.util.ExportCenterUtils;
import io.gisbi.extensions.view.dto.ChartExtFilterDTO; import io.gisbi.extensions.view.dto.ChartExtFilterDTO;
@ -52,15 +52,15 @@ public class CoreVisualizationExportManage {
private DatasetFieldServer datasetFieldServer; private DatasetFieldServer datasetFieldServer;
public String getResourceName(Long dvId, String busiFlag) { public String getResourceName(Long dvId, String busiFlag) {
DataVisualizationVO visualization = extDataVisualizationMapper.findDvInfo(dvId, busiFlag); DataVisualizationVO visualization = extDataVisualizationMapper.findDvInfo(dvId, busiFlag, "core");
if (ObjectUtils.isEmpty(visualization)) DEException.throwException("资源不存在或已经被删除..."); if (ObjectUtils.isEmpty(visualization)) DEException.throwException("资源不存在或已经被删除...");
return visualization.getName(); return visualization.getName();
} }
public File exportExcel(Long dvId, String busiFlag, List<Long> viewIdList, boolean onlyDisplay) throws Exception { public File exportExcel(Long dvId, String busiFlag, List<Long> viewIdList, boolean onlyDisplay, String filterJson) throws Exception {
DataVisualizationVO visualization = extDataVisualizationMapper.findDvInfo(dvId, busiFlag); DataVisualizationVO visualization = extDataVisualizationMapper.findDvInfo(dvId, busiFlag, "core");
if (ObjectUtils.isEmpty(visualization)) DEException.throwException("资源不存在或已经被删除..."); if (ObjectUtils.isEmpty(visualization)) DEException.throwException("资源不存在或已经被删除...");
List<ChartViewDTO> chartViewDTOS = chartViewManege.listBySceneId(dvId); List<ChartViewDTO> chartViewDTOS = chartViewManege.listBySceneId(dvId, CommonConstants.RESOURCE_TABLE.CORE);
String componentsJson = visualization.getComponentData(); String componentsJson = visualization.getComponentData();
List<Map<String, Object>> components = JsonUtil.parseList(componentsJson, tokenType); List<Map<String, Object>> components = JsonUtil.parseList(componentsJson, tokenType);
@ -70,13 +70,15 @@ public class CoreVisualizationExportManage {
chartViewDTOS = chartViewDTOS.stream().filter(item -> idList.contains(item.getId()) && viewIdList.contains(item.getId())).collect(Collectors.toList()); chartViewDTOS = chartViewDTOS.stream().filter(item -> idList.contains(item.getId()) && viewIdList.contains(item.getId())).collect(Collectors.toList());
} }
if (CollectionUtils.isEmpty(chartViewDTOS)) return null; if (CollectionUtils.isEmpty(chartViewDTOS)) return null;
Map<String, ChartExtRequest> chartExtRequestMap = buildViewRequest(visualization, onlyDisplay); Map<Long, ChartExtRequest> chartExtRequestMap = buildViewRequest(filterJson);
List<ExcelSheetModel> sheets = new ArrayList<>(); List<ExcelSheetModel> sheets = new ArrayList<>();
for (int i = 0; i < chartViewDTOS.size(); i++) { for (int i = 0; i < chartViewDTOS.size(); i++) {
ChartViewDTO view = chartViewDTOS.get(i); ChartViewDTO view = chartViewDTOS.get(i);
ChartExtRequest extRequest = chartExtRequestMap.get(view.getId().toString()); ChartExtRequest extRequest = chartExtRequestMap.get(view.getId());
if (ObjectUtils.isNotEmpty(extRequest)) { if (ObjectUtils.isNotEmpty(extRequest)) {
view.setChartExtRequest(extRequest); view.setChartExtRequest(extRequest);
} else {
view.setChartExtRequest(buildDefaultRequest());
} }
view.getChartExtRequest().setUser(AuthUtils.getUser().getUserId()); view.getChartExtRequest().setUser(AuthUtils.getUser().getUserId());
view.setTitle((i + 1) + "-" + view.getTitle()); view.setTitle((i + 1) + "-" + view.getTitle());
@ -96,11 +98,11 @@ public class CoreVisualizationExportManage {
if (CollectionUtils.isNotEmpty(fields)) { if (CollectionUtils.isNotEmpty(fields)) {
fields.forEach(field -> { fields.forEach(field -> {
Object name = field.getName(); Object name = field.getName();
Object dataeaseName = field.getDataeaseName(); Object gisbiName = field.getGisbiName();
Object deType = field.getDeType(); Object deType = field.getDeType();
if (ObjectUtils.isNotEmpty(name) && ObjectUtils.isNotEmpty(dataeaseName)) { if (ObjectUtils.isNotEmpty(name) && ObjectUtils.isNotEmpty(gisbiName)) {
heads.add(name.toString()); heads.add(name.toString());
headKeys.add(dataeaseName.toString()); headKeys.add(gisbiName.toString());
if (deType == null) { if (deType == null) {
field.setDeType(DeTypeConstants.DE_STRING); field.setDeType(DeTypeConstants.DE_STRING);
deType = DeTypeConstants.DE_STRING; deType = DeTypeConstants.DE_STRING;
@ -187,6 +189,30 @@ public class CoreVisualizationExportManage {
private final TypeReference<List<Map<String, Object>>> tokenType = new TypeReference<List<Map<String, Object>>>() { private final TypeReference<List<Map<String, Object>>> tokenType = new TypeReference<List<Map<String, Object>>>() {
}; };
private Map<Long, ChartExtRequest> buildViewRequest(String filterJson) {
if (StringUtils.isBlank(filterJson)) {
return new HashMap<>();
}
Map<Long, ChartExtRequest> extRequestMap = JsonUtil.parseObject(filterJson, new TypeReference<Map<Long, ChartExtRequest>>() {
});
extRequestMap.forEach((key, chartExtRequest) -> {
chartExtRequest.setQueryFrom("panel");
chartExtRequest.setResultCount(Math.toIntExact(ExportCenterUtils.getExportLimit("view")));
chartExtRequest.setResultMode(ChartConstants.VIEW_RESULT_MODE.ALL);
chartExtRequest.setPageSize(ExportCenterUtils.getExportLimit("view"));
});
return extRequestMap;
}
private ChartExtRequest buildDefaultRequest() {
ChartExtRequest chartExtRequest = new ChartExtRequest();
chartExtRequest.setQueryFrom("panel");
chartExtRequest.setFilter(new ArrayList<>());
chartExtRequest.setResultCount(Math.toIntExact(ExportCenterUtils.getExportLimit("view")));
chartExtRequest.setResultMode(ChartConstants.VIEW_RESULT_MODE.ALL);
chartExtRequest.setPageSize(ExportCenterUtils.getExportLimit("view"));
return chartExtRequest;
}
private Map<String, ChartExtRequest> buildViewRequest(DataVisualizationVO panelDto, Boolean justView) { private Map<String, ChartExtRequest> buildViewRequest(DataVisualizationVO panelDto, Boolean justView) {
String componentsJson = panelDto.getComponentData(); String componentsJson = panelDto.getComponentData();

View File

@ -6,18 +6,23 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.gisbi.api.visualization.request.DataVisualizationBaseRequest; import io.gisbi.api.visualization.request.DataVisualizationBaseRequest;
import io.gisbi.api.visualization.request.VisualizationWorkbranchQueryRequest; import io.gisbi.api.visualization.request.VisualizationWorkbranchQueryRequest;
import io.gisbi.api.visualization.vo.VisualizationResourceVO; import io.gisbi.api.visualization.vo.VisualizationResourceVO;
import io.gisbi.chart.dao.ext.mapper.ExtChartViewMapper;
import io.gisbi.chart.manage.ChartViewManege;
import io.gisbi.commons.constants.DataVisualizationConstants; import io.gisbi.commons.constants.DataVisualizationConstants;
import io.gisbi.commons.constants.OptConstants; import io.gisbi.commons.constants.OptConstants;
import io.gisbi.constant.BusiResourceEnum; import io.gisbi.constant.BusiResourceEnum;
import io.gisbi.constant.CommonConstants;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.license.config.XpackInteract;
import io.gisbi.model.BusiNodeRequest; import io.gisbi.model.BusiNodeRequest;
import io.gisbi.model.BusiNodeVO; import io.gisbi.model.BusiNodeVO;
import io.gisbi.operation.manage.CoreOptRecentManage; import io.gisbi.operation.manage.CoreOptRecentManage;
import io.gisbi.utils.*; import io.gisbi.utils.*;
import io.gisbi.visualization.dao.auto.entity.DataVisualizationInfo; import io.gisbi.visualization.dao.auto.entity.DataVisualizationInfo;
import io.gisbi.visualization.dao.auto.entity.SnapshotDataVisualizationInfo;
import io.gisbi.visualization.dao.auto.mapper.DataVisualizationInfoMapper; import io.gisbi.visualization.dao.auto.mapper.DataVisualizationInfoMapper;
import io.gisbi.visualization.dao.ext.mapper.CoreVisualiationExtMapper; import io.gisbi.visualization.dao.auto.mapper.SnapshotDataVisualizationInfoMapper;
import io.gisbi.visualization.dao.ext.mapper.ExtDataVisualizationMapper; import io.gisbi.visualization.dao.ext.mapper.*;
import io.gisbi.visualization.dao.ext.po.VisualizationNodePO; import io.gisbi.visualization.dao.ext.po.VisualizationNodePO;
import io.gisbi.visualization.dao.ext.po.VisualizationResourcePO; import io.gisbi.visualization.dao.ext.po.VisualizationResourcePO;
import io.gisbi.visualization.dto.VisualizationNodeBO; import io.gisbi.visualization.dto.VisualizationNodeBO;
@ -41,13 +46,31 @@ public class CoreVisualizationManage {
@Resource @Resource
private DataVisualizationInfoMapper mapper; private DataVisualizationInfoMapper mapper;
@Resource
private SnapshotDataVisualizationInfoMapper snapshotMapper;
@Resource
private ExtVisualizationLinkageMapper linkageMapper;
@Resource
private ExtVisualizationLinkJumpMapper linkJumpMapper;
@Resource
private ExtVisualizationOuterParamsMapper outerParamsMapper;
@Resource @Resource
private ExtDataVisualizationMapper extDataVisualizationMapper; private ExtDataVisualizationMapper extDataVisualizationMapper;
@Resource @Resource
private CoreOptRecentManage coreOptRecentManage; private CoreOptRecentManage coreOptRecentManage;
@Resource
private ExtChartViewMapper extCoreChartMapper;
@Resource
private ChartViewManege chartViewManege;
@XpackInteract(value = "visualizationResourceTree", replace = true, invalid = true)
public List<BusiNodeVO> tree(BusiNodeRequest request) { public List<BusiNodeVO> tree(BusiNodeRequest request) {
List<VisualizationNodeBO> nodes = new ArrayList<>(); List<VisualizationNodeBO> nodes = new ArrayList<>();
if (ObjectUtils.isEmpty(request.getLeaf()) || !request.getLeaf()) { if (ObjectUtils.isEmpty(request.getLeaf()) || !request.getLeaf()) {
@ -62,6 +85,10 @@ public class CoreVisualizationManage {
if (StringUtils.isNotBlank(info)) { if (StringUtils.isNotBlank(info)) {
queryWrapper.notExists(String.format(info, "data_visualization_info.id")); queryWrapper.notExists(String.format(info, "data_visualization_info.id"));
} }
// 如果是编辑界面 只展示已发布的资源
if(CommonConstants.RESOURCE_TABLE.SNAPSHOT.equals(request.getResourceTable())){
queryWrapper.in("status", Arrays.asList(1,2));
}
queryWrapper.orderByDesc("create_time"); queryWrapper.orderByDesc("create_time");
List<VisualizationNodePO> pos = extMapper.queryNodes(queryWrapper); List<VisualizationNodePO> pos = extMapper.queryNodes(queryWrapper);
if (CollectionUtils.isNotEmpty(pos)) { if (CollectionUtils.isNotEmpty(pos)) {
@ -70,7 +97,7 @@ public class CoreVisualizationManage {
return TreeUtils.mergeTree(nodes, BusiNodeVO.class, false); return TreeUtils.mergeTree(nodes, BusiNodeVO.class, false);
} }
@XpackInteract(value = "visualizationResourceTree", before = false)
public void delete(Long id) { public void delete(Long id) {
DataVisualizationInfo info = mapper.selectById(id); DataVisualizationInfo info = mapper.selectById(id);
if (ObjectUtils.isEmpty(info)) { if (ObjectUtils.isEmpty(info)) {
@ -93,14 +120,16 @@ public class CoreVisualizationManage {
} }
} }
// 删除可视化资源 // 删除可视化资源
extDataVisualizationMapper.deleteDataVBatch(delIds); extDataVisualizationMapper.deleteDataVBatch(delIds,CommonConstants.RESOURCE_TABLE.CORE);
extDataVisualizationMapper.deleteDataVBatch(delIds,CommonConstants.RESOURCE_TABLE.SNAPSHOT);
// 删除图表信息 // 删除图表信息
extDataVisualizationMapper.deleteViewsBatch(delIds); extDataVisualizationMapper.deleteViewsBatch(delIds,CommonConstants.RESOURCE_TABLE.CORE);
extDataVisualizationMapper.deleteViewsBatch(delIds,CommonConstants.RESOURCE_TABLE.SNAPSHOT);
coreOptRecentManage.saveOpt(id, OptConstants.OPT_RESOURCE_TYPE.VISUALIZATION, OptConstants.OPT_TYPE.DELETE); coreOptRecentManage.saveOpt(id, OptConstants.OPT_RESOURCE_TYPE.VISUALIZATION, OptConstants.OPT_TYPE.DELETE);
} }
@XpackInteract(value = "visualizationResourceTree", before = false)
public void move(DataVisualizationBaseRequest request) { public void move(DataVisualizationBaseRequest request) {
if (!request.getMoveFromUpdate()) { if (!request.getMoveFromUpdate()) {
DataVisualizationInfo visualizationInfo = new DataVisualizationInfo(); DataVisualizationInfo visualizationInfo = new DataVisualizationInfo();
@ -109,12 +138,15 @@ public class CoreVisualizationManage {
DEException.throwException("resource not exist"); DEException.throwException("resource not exist");
} }
visualizationInfo.setUpdateTime(System.currentTimeMillis()); visualizationInfo.setUpdateTime(System.currentTimeMillis());
SnapshotDataVisualizationInfo snapshotVisualizationInfo = new SnapshotDataVisualizationInfo();
BeanUtils.copyBean(snapshotVisualizationInfo, visualizationInfo);
coreOptRecentManage.saveOpt(visualizationInfo.getId(), OptConstants.OPT_RESOURCE_TYPE.VISUALIZATION, OptConstants.OPT_TYPE.UPDATE); coreOptRecentManage.saveOpt(visualizationInfo.getId(), OptConstants.OPT_RESOURCE_TYPE.VISUALIZATION, OptConstants.OPT_TYPE.UPDATE);
mapper.updateById(visualizationInfo); mapper.updateById(visualizationInfo);
snapshotMapper.updateById(snapshotVisualizationInfo);
} }
} }
@XpackInteract(value = "visualizationResourceTree", before = false)
public Long innerSave(DataVisualizationInfo visualizationInfo) { public Long innerSave(DataVisualizationInfo visualizationInfo) {
visualizationInfo.setVersion(3); visualizationInfo.setVersion(3);
return preInnerSave(visualizationInfo); return preInnerSave(visualizationInfo);
@ -126,22 +158,42 @@ public class CoreVisualizationManage {
visualizationInfo.setId(id); visualizationInfo.setId(id);
} }
visualizationInfo.setDeleteFlag(DataVisualizationConstants.DELETE_FLAG.AVAILABLE); visualizationInfo.setDeleteFlag(DataVisualizationConstants.DELETE_FLAG.AVAILABLE);
visualizationInfo.setStatus(visualizationInfo.getStatus());
visualizationInfo.setCreateBy(AuthUtils.getUser().getUserId().toString()); visualizationInfo.setCreateBy(AuthUtils.getUser().getUserId().toString());
visualizationInfo.setUpdateBy(AuthUtils.getUser().getUserId().toString()); visualizationInfo.setUpdateBy(AuthUtils.getUser().getUserId().toString());
visualizationInfo.setCreateTime(System.currentTimeMillis()); visualizationInfo.setCreateTime(System.currentTimeMillis());
visualizationInfo.setUpdateTime(System.currentTimeMillis()); visualizationInfo.setUpdateTime(System.currentTimeMillis());
visualizationInfo.setOrgId(AuthUtils.getUser().getDefaultOid()); visualizationInfo.setOrgId(AuthUtils.getUser().getDefaultOid());
mapper.insert(visualizationInfo); mapper.insert(visualizationInfo);
// 镜像文件插入
SnapshotDataVisualizationInfo snapshotVisualizationInfo = new SnapshotDataVisualizationInfo();
BeanUtils.copyBean(snapshotVisualizationInfo,visualizationInfo);
snapshotMapper.insert(snapshotVisualizationInfo);
coreOptRecentManage.saveOpt(visualizationInfo.getId(), OptConstants.OPT_RESOURCE_TYPE.VISUALIZATION, OptConstants.OPT_TYPE.NEW); coreOptRecentManage.saveOpt(visualizationInfo.getId(), OptConstants.OPT_RESOURCE_TYPE.VISUALIZATION, OptConstants.OPT_TYPE.NEW);
return visualizationInfo.getId(); return visualizationInfo.getId();
} }
@XpackInteract(value = "visualizationResourceTree", before = false)
public void innerEdit(DataVisualizationInfo visualizationInfo) { public void innerEdit(DataVisualizationInfo visualizationInfo) {
// 镜像和主表保持名称一致
visualizationInfo.setUpdateTime(System.currentTimeMillis()); visualizationInfo.setUpdateTime(System.currentTimeMillis());
visualizationInfo.setUpdateBy(AuthUtils.getUser().getUserId().toString()); visualizationInfo.setUpdateBy(AuthUtils.getUser().getUserId().toString());
visualizationInfo.setVersion(3); visualizationInfo.setVersion(3);
mapper.updateById(visualizationInfo); // 更新镜像
SnapshotDataVisualizationInfo snapshotVisualizationInfo = new SnapshotDataVisualizationInfo();
BeanUtils.copyBean(snapshotVisualizationInfo,visualizationInfo);
snapshotMapper.updateById(snapshotVisualizationInfo);
// 更新主表名称
DataVisualizationInfo coreVisualizationInfo = new DataVisualizationInfo();
coreVisualizationInfo.setId(visualizationInfo.getId());
coreVisualizationInfo.setStatus(visualizationInfo.getStatus());
coreVisualizationInfo.setPid(visualizationInfo.getPid());
coreVisualizationInfo.setContentId(visualizationInfo.getContentId());
coreVisualizationInfo.setName(visualizationInfo.getName());
coreVisualizationInfo.setUpdateTime(System.currentTimeMillis());
coreVisualizationInfo.setUpdateBy(AuthUtils.getUser().getUserId().toString());
coreVisualizationInfo.setVersion(3);
mapper.updateById(coreVisualizationInfo);
coreOptRecentManage.saveOpt(visualizationInfo.getId(), OptConstants.OPT_RESOURCE_TYPE.VISUALIZATION, OptConstants.OPT_TYPE.UPDATE); coreOptRecentManage.saveOpt(visualizationInfo.getId(), OptConstants.OPT_RESOURCE_TYPE.VISUALIZATION, OptConstants.OPT_TYPE.UPDATE);
} }
@ -150,18 +202,18 @@ public class CoreVisualizationManage {
} }
private VisualizationNodeBO rootNode() { private VisualizationNodeBO rootNode() {
return new VisualizationNodeBO(0L, "root", false, 7, -1L, 0); return new VisualizationNodeBO(0L, "root", false, 7, -1L, 0,1);
} }
private VisualizationNodeBO convert(VisualizationNodePO po) { private VisualizationNodeBO convert(VisualizationNodePO po) {
return new VisualizationNodeBO(po.getId(), po.getName(), StringUtils.equals(po.getNodeType(), "leaf"), 9, po.getPid(), po.getExtraFlag()); return new VisualizationNodeBO(po.getId(), po.getName(), StringUtils.equals(po.getNodeType(), "leaf"), 9, po.getPid(), po.getExtraFlag(),po.getExtraFlag1());
} }
public CoreVisualizationManage proxy() { public CoreVisualizationManage proxy() {
return CommonBeanFactory.getBean(this.getClass()); return CommonBeanFactory.getBean(this.getClass());
} }
@XpackInteract(value = "perFilterManage", recursion = true, invalid = true)
public IPage<VisualizationResourceVO> query(int pageNum, int pageSize, VisualizationWorkbranchQueryRequest request) { public IPage<VisualizationResourceVO> query(int pageNum, int pageSize, VisualizationWorkbranchQueryRequest request) {
IPage<VisualizationResourcePO> visualizationResourcePOPageIPage = proxy().queryVisualizationPage(pageNum, pageSize, request); IPage<VisualizationResourcePO> visualizationResourcePOPageIPage = proxy().queryVisualizationPage(pageNum, pageSize, request);
if (ObjectUtils.isEmpty(visualizationResourcePOPageIPage)) { if (ObjectUtils.isEmpty(visualizationResourcePOPageIPage)) {
@ -190,20 +242,98 @@ public class CoreVisualizationManage {
public IPage<VisualizationResourcePO> queryVisualizationPage(int goPage, int pageSize, VisualizationWorkbranchQueryRequest request) { public IPage<VisualizationResourcePO> queryVisualizationPage(int goPage, int pageSize, VisualizationWorkbranchQueryRequest request) {
Long uid = AuthUtils.getUser().getUserId(); Long uid = AuthUtils.getUser().getUserId();
QueryWrapper<Object> queryWrapper = new QueryWrapper<>(); Map<String,Object> params = new HashMap<>();
if (StringUtils.isNotBlank(request.getType())) { if (StringUtils.isNotBlank(request.getType())) {
BusiResourceEnum busiResourceEnum = BusiResourceEnum.valueOf(request.getType().toUpperCase()); BusiResourceEnum busiResourceEnum = BusiResourceEnum.valueOf(request.getType().toUpperCase());
if (ObjectUtils.isEmpty(busiResourceEnum)) { if (ObjectUtils.isEmpty(busiResourceEnum)) {
DEException.throwException("type is invalid"); DEException.throwException("type is invalid");
} }
queryWrapper.eq("dvResource.type", request.getType()); params.put("type",request.getType());
} }
String info = CommunityUtils.getInfo(); String info = CommunityUtils.getInfo();
if (StringUtils.isNotBlank(info)) { if (StringUtils.isNotBlank(info)) {
queryWrapper.notExists(String.format(info, "core_opt_recent.resource_id")); params.put("info",info);
} }
queryWrapper.orderBy(true, request.isAsc(), "core_opt_recent.time"); params.put("isAsc",request.isAsc());
Page<VisualizationResourcePO> page = new Page<>(goPage, pageSize); Page<VisualizationResourcePO> page = new Page<>(goPage, pageSize);
return extDataVisualizationMapper.findRecent(page, uid, request.getKeyword(), queryWrapper); return extDataVisualizationMapper.findRecent(page, uid, request.getKeyword(), params);
} }
@Transactional
public void removeSnapshot(Long dvId){
if(dvId != null){
// 清理历史数据
Set<Long> dvIds = new HashSet<>();
dvIds.add(dvId);
extDataVisualizationMapper.deleteDataVBatch(dvIds,CommonConstants.RESOURCE_TABLE.SNAPSHOT);
extCoreChartMapper.deleteViewsBySceneId(dvId,CommonConstants.RESOURCE_TABLE.SNAPSHOT);
linkageMapper.deleteViewLinkageFieldSnapshot(dvId,null);
linkageMapper.deleteViewLinkageSnapshot(dvId,null);
linkJumpMapper.deleteJumpTargetViewInfoWithVisualizationSnapshot(dvId);
linkJumpMapper.deleteJumpInfoWithVisualizationSnapshot(dvId);
linkJumpMapper.deleteJumpWithVisualizationSnapshot(dvId);
outerParamsMapper.deleteOuterParamsTargetWithVisualizationIdSnapshot(dvId.toString());
outerParamsMapper.deleteOuterParamsInfoWithVisualizationIdSnapshot(dvId.toString());
outerParamsMapper.deleteOuterParamsWithVisualizationIdSnapshot(dvId.toString());
//xpack 阈值告警
chartViewManege.removeThreshold(dvId,CommonConstants.RESOURCE_TABLE.SNAPSHOT);
}
}
@Transactional
public void removeDvCore(Long dvId){
if(dvId != null){
// 清理历史数据
Set<Long> dvIds = new HashSet<>();
dvIds.add(dvId);
extDataVisualizationMapper.deleteDataVBatch(dvIds,CommonConstants.RESOURCE_TABLE.CORE);
extCoreChartMapper.deleteViewsBySceneId(dvId,CommonConstants.RESOURCE_TABLE.CORE);
linkageMapper.deleteViewLinkageField(dvId,null);
linkageMapper.deleteViewLinkage(dvId,null);
linkJumpMapper.deleteJumpTargetViewInfoWithVisualization(dvId);
linkJumpMapper.deleteJumpInfoWithVisualization(dvId);
linkJumpMapper.deleteJumpWithVisualization(dvId);
outerParamsMapper.deleteOuterParamsTargetWithVisualizationId(dvId.toString());
outerParamsMapper.deleteOuterParamsInfoWithVisualizationId(dvId.toString());
outerParamsMapper.deleteOuterParamsWithVisualizationId(dvId.toString());
//xpack 阈值告警
chartViewManege.removeThreshold(dvId,CommonConstants.RESOURCE_TABLE.CORE);
}
}
@Transactional
public void dvSnapshotRecover(Long dvId){
// 清理历史数据
CoreVisualizationManage proxy = CommonBeanFactory.proxy(this.getClass());
assert proxy != null;
proxy.removeSnapshot(dvId);
// 导入新数据
extDataVisualizationMapper.snapshotDataV(dvId);
extDataVisualizationMapper.snapshotViews(dvId);
extDataVisualizationMapper.snapshotLinkJumpTargetViewInfo(dvId);
extDataVisualizationMapper.snapshotLinkJumpInfo(dvId);
extDataVisualizationMapper.snapshotLinkJump(dvId);
extDataVisualizationMapper.snapshotLinkageField(dvId);
extDataVisualizationMapper.snapshotLinkage(dvId);
extDataVisualizationMapper.snapshotOuterParamsTargetViewInfo(dvId);
extDataVisualizationMapper.snapshotOuterParamsInfo(dvId);
extDataVisualizationMapper.snapshotOuterParams(dvId);
//xpack 阈值告警
chartViewManege.restoreThreshold(dvId,CommonConstants.RESOURCE_TABLE.SNAPSHOT);
}
@Transactional
public void dvRestore(Long dvId){
extDataVisualizationMapper.restoreDataV(dvId);
extDataVisualizationMapper.restoreViews(dvId);
extDataVisualizationMapper.restoreLinkJumpTargetViewInfo(dvId);
extDataVisualizationMapper.restoreLinkJumpInfo(dvId);
extDataVisualizationMapper.restoreLinkJump(dvId);
extDataVisualizationMapper.restoreLinkageField(dvId);
extDataVisualizationMapper.restoreLinkage(dvId);
extDataVisualizationMapper.restoreOuterParamsTargetViewInfo(dvId);
extDataVisualizationMapper.restoreOuterParamsInfo(dvId);
extDataVisualizationMapper.restoreOuterParams(dvId);
//xpack 阈值告警
chartViewManege.restoreThreshold(dvId,CommonConstants.RESOURCE_TABLE.CORE);
}
} }

View File

@ -8,6 +8,7 @@ import io.gisbi.api.visualization.request.VisualizationWorkbranchQueryRequest;
import io.gisbi.api.visualization.vo.VisualizationStoreVO; import io.gisbi.api.visualization.vo.VisualizationStoreVO;
import io.gisbi.constant.BusiResourceEnum; import io.gisbi.constant.BusiResourceEnum;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.license.config.XpackInteract;
import io.gisbi.utils.AuthUtils; import io.gisbi.utils.AuthUtils;
import io.gisbi.utils.CommonBeanFactory; import io.gisbi.utils.CommonBeanFactory;
import io.gisbi.utils.CommunityUtils; import io.gisbi.utils.CommunityUtils;
@ -65,6 +66,7 @@ public class VisualizationStoreManage {
return coreStoreMapper.exists(queryWrapper); return coreStoreMapper.exists(queryWrapper);
} }
@XpackInteract(value = "perFilterManage", recursion = true, invalid = true)
public IPage<VisualizationStoreVO> query(int pageNum, int pageSize, VisualizationWorkbranchQueryRequest request) { public IPage<VisualizationStoreVO> query(int pageNum, int pageSize, VisualizationWorkbranchQueryRequest request) {
IPage<StorePO> storePOIPage = proxy().queryStorePage(pageNum, pageSize, request); IPage<StorePO> storePOIPage = proxy().queryStorePage(pageNum, pageSize, request);
if (ObjectUtils.isEmpty(storePOIPage)) return null; if (ObjectUtils.isEmpty(storePOIPage)) return null;
@ -88,7 +90,7 @@ public class VisualizationStoreManage {
new VisualizationStoreVO( new VisualizationStoreVO(
po.getStoreId(), po.getResourceId(), po.getName(), po.getStoreId(), po.getResourceId(), po.getName(),
po.getType(), String.valueOf(po.getCreator()), ObjectUtils.isEmpty(po.getEditor()) ? null : String.valueOf(po.getEditor()), po.getType(), String.valueOf(po.getCreator()), ObjectUtils.isEmpty(po.getEditor()) ? null : String.valueOf(po.getEditor()),
po.getEditTime(), 9, po.getExtFlag())).toList(); po.getEditTime(), 9, po.getExtFlag(), po.getExtFlag1())).toList();
} }
public IPage<StorePO> queryStorePage(int goPage, int pageSize, VisualizationWorkbranchQueryRequest request) { public IPage<StorePO> queryStorePage(int goPage, int pageSize, VisualizationWorkbranchQueryRequest request) {

View File

@ -15,7 +15,7 @@ import java.util.List;
/** /**
* @Author bi-coder * @author : WangJiaHao
* @date : 2023/11/13 13:25 * @date : 2023/11/13 13:25
*/ */
@Service @Service

View File

@ -2,7 +2,10 @@ package io.gisbi.visualization.server;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fasterxml.jackson.core.type.TypeReference;
import io.gisbi.api.dataset.union.DatasetGroupInfoDTO; import io.gisbi.api.dataset.union.DatasetGroupInfoDTO;
import io.gisbi.api.dataset.union.DatasetTableInfoDTO;
import io.gisbi.api.dataset.union.UnionDTO;
import io.gisbi.api.template.dto.TemplateManageFileDTO; import io.gisbi.api.template.dto.TemplateManageFileDTO;
import io.gisbi.api.template.dto.VisualizationTemplateExtendDataDTO; import io.gisbi.api.template.dto.VisualizationTemplateExtendDataDTO;
import io.gisbi.api.visualization.DataVisualizationApi; import io.gisbi.api.visualization.DataVisualizationApi;
@ -14,6 +17,7 @@ import io.gisbi.api.visualization.vo.*;
import io.gisbi.auth.DeLinkPermit; import io.gisbi.auth.DeLinkPermit;
import io.gisbi.chart.dao.auto.entity.CoreChartView; import io.gisbi.chart.dao.auto.entity.CoreChartView;
import io.gisbi.chart.dao.auto.mapper.CoreChartViewMapper; import io.gisbi.chart.dao.auto.mapper.CoreChartViewMapper;
import io.gisbi.chart.dao.ext.mapper.ExtChartViewMapper;
import io.gisbi.chart.manage.ChartDataManage; import io.gisbi.chart.manage.ChartDataManage;
import io.gisbi.chart.manage.ChartViewManege; import io.gisbi.chart.manage.ChartViewManege;
import io.gisbi.commons.constants.DataVisualizationConstants; import io.gisbi.commons.constants.DataVisualizationConstants;
@ -28,11 +32,14 @@ import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper;
import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableMapper; import io.gisbi.dataset.dao.auto.mapper.CoreDatasetTableMapper;
import io.gisbi.dataset.manage.DatasetDataManage; import io.gisbi.dataset.manage.DatasetDataManage;
import io.gisbi.dataset.manage.DatasetGroupManage; import io.gisbi.dataset.manage.DatasetGroupManage;
import io.gisbi.dataset.manage.DatasetSQLManage;
import io.gisbi.dataset.utils.DatasetUtils;
import io.gisbi.datasource.dao.auto.entity.CoreDatasource; import io.gisbi.datasource.dao.auto.entity.CoreDatasource;
import io.gisbi.datasource.dao.auto.mapper.CoreDatasourceMapper; import io.gisbi.datasource.dao.auto.mapper.CoreDatasourceMapper;
import io.gisbi.datasource.provider.ExcelUtils; import io.gisbi.datasource.provider.ExcelUtils;
import io.gisbi.datasource.server.DatasourceServer; import io.gisbi.datasource.server.DatasourceServer;
import io.gisbi.exception.DEException; import io.gisbi.exception.DEException;
import io.gisbi.extensions.datasource.dto.DatasetTableDTO;
import io.gisbi.extensions.datasource.vo.DatasourceConfiguration; import io.gisbi.extensions.datasource.vo.DatasourceConfiguration;
import io.gisbi.extensions.view.dto.ChartViewDTO; import io.gisbi.extensions.view.dto.ChartViewDTO;
import io.gisbi.i18n.Translator; import io.gisbi.i18n.Translator;
@ -50,19 +57,23 @@ import io.gisbi.template.dao.ext.ExtVisualizationTemplateMapper;
import io.gisbi.template.manage.TemplateCenterManage; import io.gisbi.template.manage.TemplateCenterManage;
import io.gisbi.utils.*; import io.gisbi.utils.*;
import io.gisbi.visualization.dao.auto.entity.DataVisualizationInfo; import io.gisbi.visualization.dao.auto.entity.DataVisualizationInfo;
import io.gisbi.visualization.dao.auto.entity.SnapshotDataVisualizationInfo;
import io.gisbi.visualization.dao.auto.entity.VisualizationWatermark; import io.gisbi.visualization.dao.auto.entity.VisualizationWatermark;
import io.gisbi.visualization.dao.auto.mapper.DataVisualizationInfoMapper; import io.gisbi.visualization.dao.auto.mapper.DataVisualizationInfoMapper;
import io.gisbi.visualization.dao.auto.mapper.SnapshotCoreChartViewMapper;
import io.gisbi.visualization.dao.auto.mapper.SnapshotDataVisualizationInfoMapper;
import io.gisbi.visualization.dao.auto.mapper.VisualizationWatermarkMapper; import io.gisbi.visualization.dao.auto.mapper.VisualizationWatermarkMapper;
import io.gisbi.visualization.dao.ext.mapper.ExtDataVisualizationMapper; import io.gisbi.visualization.dao.ext.mapper.ExtDataVisualizationMapper;
import io.gisbi.visualization.manage.CoreBusiManage; import io.gisbi.visualization.manage.CoreBusiManage;
import io.gisbi.visualization.manage.CoreVisualizationManage; import io.gisbi.visualization.manage.CoreVisualizationManage;
import io.gisbi.visualization.utils.VisualizationUtils; import io.gisbi.visualization.utils.VisualizationUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -129,7 +140,8 @@ public class DataVisualizationServer implements DataVisualizationApi {
@Resource @Resource
private CoreDatasetTableFieldMapper coreDatasetTableFieldMapper; private CoreDatasetTableFieldMapper coreDatasetTableFieldMapper;
@Autowired
@Resource
private CoreDatasourceMapper coreDatasourceMapper; private CoreDatasourceMapper coreDatasourceMapper;
@Resource @Resource
@ -143,9 +155,16 @@ public class DataVisualizationServer implements DataVisualizationApi {
@Resource @Resource
private DatasourceServer datasourceServer; private DatasourceServer datasourceServer;
@Resource
private SnapshotDataVisualizationInfoMapper snapshotMapper;
@Resource
private ExtChartViewMapper extChartViewMapper;
@Resource
private DatasetSQLManage datasetSQLManage;
@Override @Override
public DataVisualizationVO findCopyResource(Long dvId, String busiFlag) { public DataVisualizationVO findCopyResource(Long dvId, String busiFlag) {
DataVisualizationVO result = Objects.requireNonNull(CommonBeanFactory.proxy(this.getClass())).findById(new DataVisualizationBaseRequest(dvId, busiFlag)); DataVisualizationVO result = Objects.requireNonNull(CommonBeanFactory.proxy(this.getClass())).findById(new DataVisualizationBaseRequest(dvId, busiFlag, CommonConstants.RESOURCE_TABLE.SNAPSHOT,DataVisualizationConstants.QUERY_SOURCE.MAIN_EDIT));
if (result != null && result.getPid() == -1) { if (result != null && result.getPid() == -1) {
return result; return result;
} else { } else {
@ -159,7 +178,17 @@ public class DataVisualizationServer implements DataVisualizationApi {
public DataVisualizationVO findById(DataVisualizationBaseRequest request) { public DataVisualizationVO findById(DataVisualizationBaseRequest request) {
Long dvId = request.getId(); Long dvId = request.getId();
String busiFlag = request.getBusiFlag(); String busiFlag = request.getBusiFlag();
DataVisualizationVO result = extDataVisualizationMapper.findDvInfo(dvId, busiFlag); String resourceTable = request.getResourceTable();
// 如果是编辑查询 则进行镜像检查
if (DataVisualizationConstants.QUERY_SOURCE.MAIN_EDIT.equals(request.getSource())) {
QueryWrapper<SnapshotDataVisualizationInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", dvId);
queryWrapper.in("status", Arrays.asList(CommonConstants.DV_STATUS.UNPUBLISHED, CommonConstants.DV_STATUS.SAVED_UNPUBLISHED)); // 状态为0 未发布 2 已保存未发布的 不需要重置镜像
if (!snapshotMapper.exists(queryWrapper)) {
coreVisualizationManage.dvSnapshotRecover(dvId);
}
}
DataVisualizationVO result = extDataVisualizationMapper.findDvInfo(dvId, busiFlag, resourceTable);
if (result != null) { if (result != null) {
// get creator // get creator
String userName = coreUserManage.getUserName(Long.valueOf(result.getCreateBy())); String userName = coreUserManage.getUserName(Long.valueOf(result.getCreateBy()));
@ -167,9 +196,10 @@ public class DataVisualizationServer implements DataVisualizationApi {
result.setCreatorName(userName); result.setCreatorName(userName);
} }
//获取图表信息 //获取图表信息
List<ChartViewDTO> chartViewDTOS = chartViewManege.listBySceneId(dvId); List<ChartViewDTO> chartViewDTOS = chartViewManege.listBySceneId(dvId, resourceTable);
if (!CollectionUtils.isEmpty(chartViewDTOS)) { if (!CollectionUtils.isEmpty(chartViewDTOS)) {
Map<Long, ChartViewDTO> viewInfo = chartViewDTOS.stream().collect(Collectors.toMap(ChartViewDTO::getId, chartView -> chartView)); // 增加过滤当前使用的图表信息
Map<Long, ChartViewDTO> viewInfo = chartViewDTOS.stream().filter(item -> result.getComponentData().indexOf("\"id\":\"" + item.getId()) > 0).collect(Collectors.toMap(ChartViewDTO::getId, chartView -> chartView));
result.setCanvasViewInfo(viewInfo); result.setCanvasViewInfo(viewInfo);
} }
VisualizationWatermark watermark = watermarkMapper.selectById("system_default"); VisualizationWatermark watermark = watermarkMapper.selectById("system_default");
@ -208,6 +238,14 @@ public class DataVisualizationServer implements DataVisualizationApi {
@Override @Override
@Transactional @Transactional
public String saveCanvas(DataVisualizationBaseRequest request) throws Exception { public String saveCanvas(DataVisualizationBaseRequest request) throws Exception {
/*
* 发布兼容逻辑
* saveCanvas 为初次保存 包括 模板 应用 普通创建 所有变更操作都走snapshot表
* 1.如果是文件夹直接保存在主表中如果是仪表板数据大屏主表和镜像表各保存一份 主表仅作为权限和预览控制此时主表状态为未发布
* 2.编辑检查如果存在未发布的仪表板snapshot则默认加载snapshot进行编辑所有操作均为snapshot操作
* 3.发布重新发布将snapshot表中的所有数据复制到主表中同时变更主表状态为已发布
* 4.如果对已发布的仪表板编辑并存在已保存的镜像此时仪表板状态为已保存未发布
*/
boolean isAppSave = false; boolean isAppSave = false;
Long time = System.currentTimeMillis(); Long time = System.currentTimeMillis();
// 如果是应用 则新进行应用校验 数据集名称和 数据源名称校验 // 如果是应用 则新进行应用校验 数据集名称和 数据源名称校验
@ -220,18 +258,21 @@ public class DataVisualizationServer implements DataVisualizationApi {
Map<Long, Long> datasourceIdMap = new HashMap<>(); Map<Long, Long> datasourceIdMap = new HashMap<>();
Map<Long, Map<String, String>> dsTableNamesMap = new HashMap<>(); Map<Long, Map<String, String>> dsTableNamesMap = new HashMap<>();
List<Long> newDatasourceId = new ArrayList<>(); List<Long> newDatasourceId = new ArrayList<>();
List<Long> excelDatasourceId = new ArrayList<>();
Map<String, String> excelTableNamesMap = new HashMap<>();
if (appData != null) { if (appData != null) {
isAppSave = true; isAppSave = true;
try { try {
List<AppCoreDatasourceVO> appCoreDatasourceVO = appData.getDatasourceInfo(); List<AppCoreDatasourceVO> appCoreDatasourceVO = appData.getDatasourceInfo();
// app 数据源 excel 表名映射 // app 数据源 excel 表名映射
appCoreDatasourceVO.forEach(datasourceOld -> { appCoreDatasourceVO.forEach(datasourceOld -> {
newDatasourceId.add(datasourceOld.getSystemDatasourceId()); newDatasourceId.add(datasourceOld.getSystemDatasourceId());
// Excel 数据表明映射 // Excel 数据表明映射
if (StringUtils.isNotEmpty(datasourceOld.getConfiguration())) { if (StringUtils.isNotEmpty(datasourceOld.getConfiguration())) {
if (datasourceOld.getType().equals(DatasourceConfiguration.DatasourceType.Excel.name())) { if (datasourceOld.getType().equals(DatasourceConfiguration.DatasourceType.API.name())) {
dsTableNamesMap.put(datasourceOld.getId(), ExcelUtils.getTableNamesMap(datasourceOld.getConfiguration())); DEException.throwException(Translator.get("i18n_app_error_no_api"));
} else if (datasourceOld.getType().equals(DatasourceConfiguration.DatasourceType.Excel.name())) {
dsTableNamesMap.put(datasourceOld.getId(), ExcelUtils.getTableNamesMap(datasourceOld.getType(), datasourceOld.getConfiguration()));
} else if (datasourceOld.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { } else if (datasourceOld.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
dsTableNamesMap.put(datasourceOld.getId(), (Map<String, String>) datasourceServer.invokeMethod(datasourceOld.getType(), "getTableNamesMap", String.class, datasourceOld.getConfiguration())); dsTableNamesMap.put(datasourceOld.getId(), (Map<String, String>) datasourceServer.invokeMethod(datasourceOld.getType(), "getTableNamesMap", String.class, datasourceOld.getConfiguration()));
} }
@ -243,7 +284,8 @@ public class DataVisualizationServer implements DataVisualizationApi {
// Excel 数据表明映射 // Excel 数据表明映射
if (StringUtils.isNotEmpty(datasourceNew.getConfiguration())) { if (StringUtils.isNotEmpty(datasourceNew.getConfiguration())) {
if (datasourceNew.getType().equals(DatasourceConfiguration.DatasourceType.Excel.name())) { if (datasourceNew.getType().equals(DatasourceConfiguration.DatasourceType.Excel.name())) {
dsTableNamesMap.put(datasourceNew.getId(), ExcelUtils.getTableNamesMap(datasourceNew.getConfiguration())); dsTableNamesMap.put(datasourceNew.getId(), ExcelUtils.getTableNamesMap(datasourceNew.getType(), datasourceNew.getConfiguration()));
excelDatasourceId.add(datasourceNew.getId());
} else if (datasourceNew.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { } else if (datasourceNew.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) {
dsTableNamesMap.put(datasourceNew.getId(), (Map<String, String>) datasourceServer.invokeMethod(datasourceNew.getType(), "getTableNamesMap", String.class, datasourceNew.getConfiguration())); dsTableNamesMap.put(datasourceNew.getId(), (Map<String, String>) datasourceServer.invokeMethod(datasourceNew.getType(), "getTableNamesMap", String.class, datasourceNew.getConfiguration()));
} }
@ -257,7 +299,7 @@ public class DataVisualizationServer implements DataVisualizationApi {
datasetFolderNewRequest.setName(datasetFolderName); datasetFolderNewRequest.setName(datasetFolderName);
datasetFolderNewRequest.setNodeType("folder"); datasetFolderNewRequest.setNodeType("folder");
datasetFolderNewRequest.setPid(datasetFolderPid); datasetFolderNewRequest.setPid(datasetFolderPid);
DatasetGroupInfoDTO datasetFolderNew = datasetGroupManage.save(datasetFolderNewRequest, false); DatasetGroupInfoDTO datasetFolderNew = datasetGroupManage.save(datasetFolderNewRequest, false, false);
Long datasetFolderNewId = datasetFolderNew.getId(); Long datasetFolderNewId = datasetFolderNew.getId();
//新建数据集 //新建数据集
appData.getDatasetGroupsInfo().forEach(appDatasetGroup -> { appData.getDatasetGroupsInfo().forEach(appDatasetGroup -> {
@ -332,10 +374,13 @@ public class DataVisualizationServer implements DataVisualizationApi {
//表名映射更新 //表名映射更新
Map<String, String> appDsTableNamesMap = dsTableNamesMap.get(key); Map<String, String> appDsTableNamesMap = dsTableNamesMap.get(key);
Map<String, String> systemDsTableNamesMap = dsTableNamesMap.get(value); Map<String, String> systemDsTableNamesMap = dsTableNamesMap.get(value);
if (!CollectionUtils.isEmpty(appDsTableNamesMap) && !CollectionUtils.isEmpty(systemDsTableNamesMap)) { if (MapUtils.isNotEmpty(appDsTableNamesMap)) {
appDsTableNamesMap.forEach((keyName, valueName) -> { appDsTableNamesMap.forEach((keyName, valueName) -> {
if (StringUtils.isNotEmpty(systemDsTableNamesMap.get(keyName))) { if (MapUtils.isNotEmpty(systemDsTableNamesMap) && StringUtils.isNotEmpty(systemDsTableNamesMap.get(keyName))) {
dsGroup.setInfo(dsGroup.getInfo().replaceAll(valueName, systemDsTableNamesMap.get(keyName))); dsGroup.setInfo(dsGroup.getInfo().replaceAll(valueName, systemDsTableNamesMap.get(keyName)));
excelTableNamesMap.put(valueName, systemDsTableNamesMap.get(keyName));
} else {
dsGroup.setInfo(dsGroup.getInfo().replaceAll(valueName, "excel_can_not_find"));
} }
}); });
} }
@ -345,6 +390,14 @@ public class DataVisualizationServer implements DataVisualizationApi {
dsGroup.setName(dsGroup.getName() + "-" + UUID.randomUUID().toString()); dsGroup.setName(dsGroup.getName() + "-" + UUID.randomUUID().toString());
} }
dsGroupNameSave.add(dsGroup.getName()); dsGroupNameSave.add(dsGroup.getName());
if(dsGroup.getIsCross() == null){
if(dsGroup.getUnion() == null){
dsGroup.setUnion(JsonUtil.parseList(dsGroup.getInfo(), new TypeReference<>() {
}));
}
datasetSQLManage.mergeDatasetCrossDefault(dsGroup);
}
excelAdaptor(dsGroup,excelTableNamesMap,excelDatasourceId);
datasetGroupManage.innerSave(dsGroup); datasetGroupManage.innerSave(dsGroup);
}); });
@ -370,7 +423,7 @@ public class DataVisualizationServer implements DataVisualizationApi {
//表名映射更新 //表名映射更新
Map<String, String> appDsTableNamesMap = dsTableNamesMap.get(key); Map<String, String> appDsTableNamesMap = dsTableNamesMap.get(key);
Map<String, String> systemDsTableNamesMap = dsTableNamesMap.get(value); Map<String, String> systemDsTableNamesMap = dsTableNamesMap.get(value);
if (!CollectionUtils.isEmpty(appDsTableNamesMap) && !CollectionUtils.isEmpty(systemDsTableNamesMap)) { if (MapUtils.isNotEmpty(appDsTableNamesMap) && MapUtils.isNotEmpty(systemDsTableNamesMap)) {
appDsTableNamesMap.forEach((keyName, valueName) -> { appDsTableNamesMap.forEach((keyName, valueName) -> {
if (StringUtils.isNotEmpty(systemDsTableNamesMap.get(keyName))) { if (StringUtils.isNotEmpty(systemDsTableNamesMap.get(keyName))) {
componentDataStr.set(componentDataStr.get().replaceAll(key.toString(), value.toString())); componentDataStr.set(componentDataStr.get().replaceAll(key.toString(), value.toString()));
@ -392,8 +445,12 @@ public class DataVisualizationServer implements DataVisualizationApi {
if (DataVisualizationConstants.RESOURCE_OPT_TYPE.COPY.equals(request.getOptType())) { if (DataVisualizationConstants.RESOURCE_OPT_TYPE.COPY.equals(request.getOptType())) {
// 复制更新 新建权限插入 // 复制更新 新建权限插入
visualizationInfoMapper.deleteById(request.getId()); visualizationInfoMapper.deleteById(request.getId());
snapshotMapper.deleteById(request.getId());
visualizationInfo.setNodeType(DataVisualizationConstants.NODE_TYPE.LEAF); visualizationInfo.setNodeType(DataVisualizationConstants.NODE_TYPE.LEAF);
} }
// 文件夹走默认发布 非文件夹默认未发布
visualizationInfo.setStatus(DataVisualizationConstants.NODE_TYPE.FOLDER.equals(visualizationInfo.getNodeType())
? CommonConstants.DV_STATUS.PUBLISHED : CommonConstants.DV_STATUS.UNPUBLISHED);
Long newDvId = coreVisualizationManage.innerSave(visualizationInfo); Long newDvId = coreVisualizationManage.innerSave(visualizationInfo);
request.setId(newDvId); request.setId(newDvId);
// 还原ID信息 // 还原ID信息
@ -429,6 +486,26 @@ public class DataVisualizationServer implements DataVisualizationApi {
return newDvId.toString(); return newDvId.toString();
} }
private void excelAdaptor(DatasetGroupInfoDTO dsInfo,Map<String, String> excelTableNamesMap ,List<Long> excelDsId) {
List<UnionDTO> unionDTOList = JsonUtil.parseList(dsInfo.getInfo(), new TypeReference<>() {
});
if(CollectionUtils.isNotEmpty(excelDsId) && MapUtils.isNotEmpty(excelTableNamesMap)){
for(UnionDTO unionDTO : unionDTOList) {
DatasetTableDTO tableDTO =unionDTO.getCurrentDs();
if(excelDsId.contains(tableDTO.getDatasourceId())){
DatasetTableInfoDTO infoDTO = JsonUtil.parseObject(tableDTO.getInfo(), DatasetTableInfoDTO.class);
String s = new String(Base64.getDecoder().decode(infoDTO.getSql()));
excelTableNamesMap.forEach((key, value) -> {
infoDTO.setSql(Base64.getEncoder().encodeToString(s.replaceAll(key, value).getBytes()));
});
tableDTO.setInfo((String)JsonUtil.toJSONString(infoDTO));
}
}
}
dsInfo.setInfo((String)JsonUtil.toJSONString(unionDTOList));
}
@Override @Override
public String appCanvasNameCheck(DataVisualizationBaseRequest request) throws Exception { public String appCanvasNameCheck(DataVisualizationBaseRequest request) throws Exception {
Long datasetFolderPid = request.getDatasetFolderPid(); Long datasetFolderPid = request.getDatasetFolderPid();
@ -436,6 +513,7 @@ public class DataVisualizationServer implements DataVisualizationApi {
QueryWrapper<CoreDatasetGroup> queryWrapper = new QueryWrapper<>(); QueryWrapper<CoreDatasetGroup> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", datasetFolderName); queryWrapper.eq("name", datasetFolderName);
queryWrapper.eq("pid", datasetFolderPid); queryWrapper.eq("pid", datasetFolderPid);
queryWrapper.eq("node_type", DataVisualizationConstants.NODE_TYPE.FOLDER);
if (coreDatasetGroupMapper.exists(queryWrapper)) { if (coreDatasetGroupMapper.exists(queryWrapper)) {
return "repeat"; return "repeat";
} else { } else {
@ -462,7 +540,10 @@ public class DataVisualizationServer implements DataVisualizationApi {
@DeLog(id = "#p0.id", ot = LogOT.MODIFY, stExp = "#p0.type") @DeLog(id = "#p0.id", ot = LogOT.MODIFY, stExp = "#p0.type")
@Override @Override
@Transactional @Transactional
public void updateCanvas(DataVisualizationBaseRequest request) { public DataVisualizationVO updateCanvas(DataVisualizationBaseRequest request) {
for (Map.Entry<Long, ChartViewDTO> ele : request.getCanvasViewInfo().entrySet()) {
DatasetUtils.viewDecode(ele.getValue());
}
Long dvId = request.getId(); Long dvId = request.getId();
if (dvId == null) { if (dvId == null) {
DEException.throwException("ID can not be null"); DEException.throwException("ID can not be null");
@ -485,10 +566,48 @@ public class DataVisualizationServer implements DataVisualizationApi {
coreVisualizationManage.move(request); coreVisualizationManage.move(request);
} }
} }
// 状态修改统一为后端操作历史状态检查 如果 状态为 0未发布 或者 2已发布未保存则状态不变
// 如果当前状态为 1 则状态修改为 2已发布未保存
Integer curStatus = extDataVisualizationMapper.findDvInfoStats(dvId);
visualizationInfo.setStatus(curStatus == 1 ? CommonConstants.DV_STATUS.SAVED_UNPUBLISHED : curStatus);
coreVisualizationManage.innerEdit(visualizationInfo); coreVisualizationManage.innerEdit(visualizationInfo);
//保存图表信息 //保存图表信息
chartDataManage.saveChartViewFromVisualization(request.getComponentData(), dvId, request.getCanvasViewInfo()); chartDataManage.saveChartViewFromVisualization(request.getComponentData(), dvId, request.getCanvasViewInfo());
return new DataVisualizationVO(visualizationInfo.getStatus());
}
@Override
@Transactional
public void updatePublishStatus(DataVisualizationBaseRequest request) {
/**
* 如果当前传入状态是1已发布则原始状态0未发布-1已发布2已保存未发布-1已发布
* 统一处理为1.删除主表数据2.将镜像表数据统一copy到主表 不删除镜像数据发布状态后镜像数据和主表数据是保持一致的
* 其他状态仅更新主表和镜像表状态
* */
Long dvId = request.getId();
DataVisualizationInfo visualizationInfo = new DataVisualizationInfo();
visualizationInfo.setMobileLayout(request.getMobileLayout());
visualizationInfo.setId(dvId);
visualizationInfo.setName(request.getName());
visualizationInfo.setStatus(request.getStatus());
coreVisualizationManage.innerEdit(visualizationInfo);
if (CommonConstants.DV_STATUS.PUBLISHED == request.getStatus()) {
coreVisualizationManage.removeDvCore(dvId);
coreVisualizationManage.dvRestore(dvId);
// chartViewManege.publishThreshold(dvId, request.getActiveViewIds());
} else if (CommonConstants.DV_STATUS.UNPUBLISHED == request.getStatus()) {
// chartViewManege.publishThreshold(dvId, request.getActiveViewIds());
}
}
@Override
public void recoverToPublished(DataVisualizationBaseRequest request) {
coreVisualizationManage.dvSnapshotRecover(request.getId());
DataVisualizationInfo visualizationInfo = new DataVisualizationInfo();
visualizationInfo.setId(request.getId());
visualizationInfo.setName(request.getName());
visualizationInfo.setStatus(CommonConstants.DV_STATUS.PUBLISHED);
coreVisualizationManage.innerEdit(visualizationInfo);
} }
/** /**
@ -527,6 +646,9 @@ public class DataVisualizationServer implements DataVisualizationApi {
@Override @Override
public List<BusiNodeVO> tree(BusiNodeRequest request) { public List<BusiNodeVO> tree(BusiNodeRequest request) {
if (StringUtils.isEmpty(request.getResourceTable())) {
request.setResourceTable(CommonConstants.RESOURCE_TABLE.SNAPSHOT);
}
String busiFlag = request.getBusiFlag(); String busiFlag = request.getBusiFlag();
if (busiFlag.equals("dashboard-dataV")) { if (busiFlag.equals("dashboard-dataV")) {
BusiNodeRequest requestDv = new BusiNodeRequest(); BusiNodeRequest requestDv = new BusiNodeRequest();
@ -609,7 +731,8 @@ public class DataVisualizationServer implements DataVisualizationApi {
newDv.setPid(request.getPid()); newDv.setPid(request.getPid());
newDv.setCreateTime(System.currentTimeMillis()); newDv.setCreateTime(System.currentTimeMillis());
// 复制图表 chart_view // 复制图表 chart_view
extDataVisualizationMapper.viewCopyWithDv(sourceDvId, newDvId, copyId); extDataVisualizationMapper.viewCopyWithDv(sourceDvId, newDvId, copyId, CommonConstants.RESOURCE_TABLE.CORE);
extDataVisualizationMapper.viewCopyWithDv(sourceDvId, newDvId, copyId, CommonConstants.RESOURCE_TABLE.SNAPSHOT);
List<CoreChartView> viewList = extDataVisualizationMapper.findViewInfoByCopyId(copyId); List<CoreChartView> viewList = extDataVisualizationMapper.findViewInfoByCopyId(copyId);
if (!CollectionUtils.isEmpty(viewList)) { if (!CollectionUtils.isEmpty(viewList)) {
String componentData = newDv.getComponentData(); String componentData = newDv.getComponentData();
@ -660,7 +783,6 @@ public class DataVisualizationServer implements DataVisualizationApi {
String name = null; String name = null;
String dvType = null; String dvType = null;
Integer version = null; Integer version = null;
//内部模板新建 //内部模板新建
if (DataVisualizationConstants.NEW_PANEL_FROM.NEW_INNER_TEMPLATE.equals(newFrom)) { if (DataVisualizationConstants.NEW_PANEL_FROM.NEW_INNER_TEMPLATE.equals(newFrom)) {
VisualizationTemplate visualizationTemplate = templateMapper.selectById(request.getTemplateId()); VisualizationTemplate visualizationTemplate = templateMapper.selectById(request.getTemplateId());
@ -776,10 +898,10 @@ public class DataVisualizationServer implements DataVisualizationApi {
@Override @Override
public List<VisualizationViewTableDTO> detailList(Long dvId) { public List<VisualizationViewTableDTO> detailList(Long dvId) {
List<VisualizationViewTableDTO> result = extDataVisualizationMapper.getVisualizationViewDetails(dvId); List<VisualizationViewTableDTO> result = extDataVisualizationMapper.getVisualizationViewDetails(dvId);
DataVisualizationInfo dvInfo = visualizationInfoMapper.selectById(dvId); SnapshotDataVisualizationInfo dvInfo = snapshotMapper.selectById(dvId);
if (dvInfo != null && !CollectionUtils.isEmpty(result)) { if (dvInfo != null && !CollectionUtils.isEmpty(result)) {
String componentData = dvInfo.getComponentData(); String componentData = dvInfo.getComponentData();
return result.stream().filter(item -> componentData.indexOf(String.valueOf(item.getId())) > 0).toList(); return result.stream().filter(item -> componentData.indexOf("\"id\":\"" + item.getId()) > 0).toList();
} else { } else {
return result; return result;
} }
@ -810,6 +932,9 @@ public class DataVisualizationServer implements DataVisualizationApi {
if (CollectionUtils.isEmpty(datasourceVOInfo)) { if (CollectionUtils.isEmpty(datasourceVOInfo)) {
DEException.throwException("当前不存在数据源无法导出"); DEException.throwException("当前不存在数据源无法导出");
} else if (datasourceVOInfo.stream()
.anyMatch(datasource -> DatasourceConfiguration.DatasourceType.API.name().equals(datasource.getType()))) {
DEException.throwException(Translator.get("i18n_app_error_no_api"));
} }
List<VisualizationLinkageVO> linkageVOInfo = appTemplateMapper.findAppLinkageInfo(dvId); List<VisualizationLinkageVO> linkageVOInfo = appTemplateMapper.findAppLinkageInfo(dvId);
@ -843,27 +968,28 @@ public class DataVisualizationServer implements DataVisualizationApi {
if (AuthUtils.getUser().getDefaultOid() != null) { if (AuthUtils.getUser().getDefaultOid() != null) {
wrapper.eq("org_id", AuthUtils.getUser().getDefaultOid()); wrapper.eq("org_id", AuthUtils.getUser().getDefaultOid());
} }
if (visualizationInfoMapper.exists(wrapper)) { List<DataVisualizationInfo> existList = visualizationInfoMapper.selectList(wrapper);
if (CollectionUtils.isNotEmpty(existList) && existList.stream().anyMatch(item -> item.getName().equals(request.getName().trim()))) {
DEException.throwException("当前名称已经存在"); DEException.throwException("当前名称已经存在");
} }
} }
public String getAbsPath(String id) { public String getAbsPath(Long id) {
CoreChartView coreChartView = coreChartViewMapper.selectById(id); ChartViewDTO viewDTO = chartViewManege.findChartViewAround(String.valueOf(id));
if (coreChartView == null) { if (viewDTO == null) {
return null; return null;
} }
if (coreChartView.getSceneId() == null) { if (viewDTO.getPid() == null) {
return coreChartView.getTitle(); return viewDTO.getTitle();
} }
List<DataVisualizationInfo> parents = getParents(coreChartView.getSceneId()); List<DataVisualizationInfo> parents = getParents(viewDTO.getPid());
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
parents.forEach(ele -> { parents.forEach(ele -> {
if (ObjectUtils.isNotEmpty(ele)) { if (ObjectUtils.isNotEmpty(ele)) {
stringBuilder.append(ele.getName()).append("/"); stringBuilder.append(ele.getName()).append("/");
} }
}); });
stringBuilder.append(coreChartView.getTitle()); stringBuilder.append(viewDTO.getTitle());
return stringBuilder.toString(); return stringBuilder.toString();
} }
@ -887,4 +1013,16 @@ public class DataVisualizationServer implements DataVisualizationApi {
} }
} }
public List<Long> getEnabledViewIds(Long dvId, String resourceTable) {
List<Long> result = new ArrayList<>();
DataVisualizationVO dvInfo = extDataVisualizationMapper.findDvInfo(dvId, null, resourceTable);
List<CoreChartView> views = extChartViewMapper.selectListCustom(dvId, resourceTable);
if (CollectionUtils.isNotEmpty(views) && dvInfo != null) {
String componentData = dvInfo.getComponentData();
result = views.stream().filter(item -> componentData.indexOf("\"id\":\"" + item.getId()) > 0).map(CoreChartView::getId)
.collect(Collectors.toList());
}
return result;
}
} }

View File

@ -34,7 +34,7 @@ import java.util.Map;
@RequestMapping("/staticResource") @RequestMapping("/staticResource")
public class StaticResourceServer implements StaticResourceApi { public class StaticResourceServer implements StaticResourceApi {
@Value("${gisbi.path.static-resource:/opt/gisbi/data/static-resource/}") @Value("${gisbi.path.static-resource:/opt/gisbi2.0/data/static-resource/}")
private String staticDir; private String staticDir;
@Override @Override
@ -113,11 +113,6 @@ public class StaticResourceServer implements StaticResourceApi {
return result; return result;
} }
@Override
public Map<String, String> urlTest() {
return null;
}
private static boolean isValidSVG(MultipartFile file){ private static boolean isValidSVG(MultipartFile file){
if (file == null || file.isEmpty()) { if (file == null || file.isEmpty()) {
return false; return false;

View File

@ -11,19 +11,14 @@ import io.gisbi.api.visualization.vo.VisualizationViewTableVO;
import io.gisbi.auth.DeLinkPermit; import io.gisbi.auth.DeLinkPermit;
import io.gisbi.chart.dao.auto.entity.CoreChartView; import io.gisbi.chart.dao.auto.entity.CoreChartView;
import io.gisbi.chart.dao.auto.mapper.CoreChartViewMapper; import io.gisbi.chart.dao.auto.mapper.CoreChartViewMapper;
import io.gisbi.constant.CommonConstants;
import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO; import io.gisbi.extensions.datasource.dto.DatasetTableFieldDTO;
import io.gisbi.utils.AuthUtils; import io.gisbi.utils.AuthUtils;
import io.gisbi.utils.BeanUtils; import io.gisbi.utils.BeanUtils;
import io.gisbi.utils.IDUtils; import io.gisbi.utils.IDUtils;
import io.gisbi.utils.ModelUtils; import io.gisbi.utils.ModelUtils;
import io.gisbi.visualization.dao.auto.entity.DataVisualizationInfo; import io.gisbi.visualization.dao.auto.entity.*;
import io.gisbi.visualization.dao.auto.entity.VisualizationLinkJump; import io.gisbi.visualization.dao.auto.mapper.*;
import io.gisbi.visualization.dao.auto.entity.VisualizationLinkJumpInfo;
import io.gisbi.visualization.dao.auto.entity.VisualizationLinkJumpTargetViewInfo;
import io.gisbi.visualization.dao.auto.mapper.DataVisualizationInfoMapper;
import io.gisbi.visualization.dao.auto.mapper.VisualizationLinkJumpInfoMapper;
import io.gisbi.visualization.dao.auto.mapper.VisualizationLinkJumpMapper;
import io.gisbi.visualization.dao.auto.mapper.VisualizationLinkJumpTargetViewInfoMapper;
import io.gisbi.visualization.dao.ext.mapper.ExtVisualizationLinkJumpMapper; import io.gisbi.visualization.dao.ext.mapper.ExtVisualizationLinkJumpMapper;
import io.gisbi.visualization.dao.ext.mapper.ExtVisualizationLinkageMapper; import io.gisbi.visualization.dao.ext.mapper.ExtVisualizationLinkageMapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -59,9 +54,22 @@ public class VisualizationLinkJumpService implements VisualizationLinkJumpApi {
@Resource @Resource
private VisualizationLinkJumpTargetViewInfoMapper visualizationLinkJumpTargetViewInfoMapper; private VisualizationLinkJumpTargetViewInfoMapper visualizationLinkJumpTargetViewInfoMapper;
@Resource
private SnapshotVisualizationLinkJumpMapper snapshotVisualizationLinkJumpMapper;
@Resource
private SnapshotVisualizationLinkJumpInfoMapper snapshotVisualizationLinkJumpInfoMapper;
@Resource
private SnapshotVisualizationLinkJumpTargetViewInfoMapper snapshotVisualizationLinkJumpTargetViewInfoMapper;
@Resource @Resource
private CoreChartViewMapper coreChartViewMapper; private CoreChartViewMapper coreChartViewMapper;
@Resource
private SnapshotCoreChartViewMapper snapshotCoreChartViewMapper;
@Resource @Resource
private DataVisualizationInfoMapper dataVisualizationInfoMapper; private DataVisualizationInfoMapper dataVisualizationInfoMapper;
@ -73,9 +81,14 @@ public class VisualizationLinkJumpService implements VisualizationLinkJumpApi {
@DeLinkPermit @DeLinkPermit
//获取仪表板的跳转信息 //获取仪表板的跳转信息
@Override @Override
public VisualizationLinkJumpBaseResponse queryVisualizationJumpInfo(Long dvId) { public VisualizationLinkJumpBaseResponse queryVisualizationJumpInfo(Long dvId, String resourceTable) {
Map<String, VisualizationLinkJumpInfoDTO> resultBase = new HashMap<>(); Map<String, VisualizationLinkJumpInfoDTO> resultBase = new HashMap<>();
List<VisualizationLinkJumpDTO> resultLinkJumpList = extVisualizationLinkJumpMapper.queryWithDvId(dvId, AuthUtils.getUser().getUserId(), ModelUtils.isDesktop()); List<VisualizationLinkJumpDTO> resultLinkJumpList = null;
if (CommonConstants.RESOURCE_TABLE.SNAPSHOT.equals(resourceTable)) {
resultLinkJumpList = extVisualizationLinkJumpMapper.queryWithDvIdSnapshot(dvId, AuthUtils.getUser().getUserId(), ModelUtils.isDesktop());
} else {
resultLinkJumpList = extVisualizationLinkJumpMapper.queryWithDvId(dvId, AuthUtils.getUser().getUserId(), ModelUtils.isDesktop());
}
Optional.ofNullable(resultLinkJumpList).orElse(new ArrayList<>()).forEach(resultLinkJump -> { Optional.ofNullable(resultLinkJumpList).orElse(new ArrayList<>()).forEach(resultLinkJump -> {
if (resultLinkJump.getChecked()) { if (resultLinkJump.getChecked()) {
Long sourceViewId = resultLinkJump.getSourceViewId(); Long sourceViewId = resultLinkJump.getSourceViewId();
@ -111,30 +124,30 @@ public class VisualizationLinkJumpService implements VisualizationLinkJumpApi {
Assert.notNull(dvId, "dvId cannot be null"); Assert.notNull(dvId, "dvId cannot be null");
Assert.notNull(viewId, "viewId cannot be null"); Assert.notNull(viewId, "viewId cannot be null");
//清理原有数据 //清理原有数据
extVisualizationLinkJumpMapper.deleteJumpTargetViewInfo(dvId, viewId); extVisualizationLinkJumpMapper.deleteJumpTargetViewInfoSnapshot(dvId, viewId);
extVisualizationLinkJumpMapper.deleteJumpInfo(dvId, viewId); extVisualizationLinkJumpMapper.deleteJumpInfoSnapshot(dvId, viewId);
extVisualizationLinkJumpMapper.deleteJump(dvId, viewId); extVisualizationLinkJumpMapper.deleteJumpSnapshot(dvId, viewId);
// 插入新的数据 // 插入新的数据
Long linkJumpId = IDUtils.snowID(); Long linkJumpId = IDUtils.snowID();
jumpDTO.setId(linkJumpId); jumpDTO.setId(linkJumpId);
VisualizationLinkJump insertParam = new VisualizationLinkJump(); SnapshotVisualizationLinkJump insertParam = new SnapshotVisualizationLinkJump();
BeanUtils.copyBean(insertParam, jumpDTO); BeanUtils.copyBean(insertParam, jumpDTO);
visualizationLinkJumpMapper.insert(insertParam); snapshotVisualizationLinkJumpMapper.insert(insertParam);
Optional.ofNullable(jumpDTO.getLinkJumpInfoArray()).orElse(new ArrayList<>()).forEach(linkJumpInfo -> { Optional.ofNullable(jumpDTO.getLinkJumpInfoArray()).orElse(new ArrayList<>()).forEach(linkJumpInfo -> {
Long linkJumpInfoId = IDUtils.snowID(); Long linkJumpInfoId = IDUtils.snowID();
linkJumpInfo.setId(linkJumpInfoId); linkJumpInfo.setId(linkJumpInfoId);
linkJumpInfo.setLinkJumpId(linkJumpId); linkJumpInfo.setLinkJumpId(linkJumpId);
VisualizationLinkJumpInfo insertJumpInfoParam = new VisualizationLinkJumpInfo(); SnapshotVisualizationLinkJumpInfo insertJumpInfoParam = new SnapshotVisualizationLinkJumpInfo();
BeanUtils.copyBean(insertJumpInfoParam, linkJumpInfo); BeanUtils.copyBean(insertJumpInfoParam, linkJumpInfo);
visualizationLinkJumpInfoMapper.insert(insertJumpInfoParam); snapshotVisualizationLinkJumpInfoMapper.insert(insertJumpInfoParam);
Optional.ofNullable(linkJumpInfo.getTargetViewInfoList()).orElse(new ArrayList<>()).forEach(targetViewInfo -> { Optional.ofNullable(linkJumpInfo.getTargetViewInfoList()).orElse(new ArrayList<>()).forEach(targetViewInfo -> {
Long targetViewInfoId = IDUtils.snowID(); Long targetViewInfoId = IDUtils.snowID();
targetViewInfo.setTargetId(targetViewInfoId); targetViewInfo.setTargetId(targetViewInfoId);
targetViewInfo.setLinkJumpInfoId(linkJumpInfoId); targetViewInfo.setLinkJumpInfoId(linkJumpInfoId);
VisualizationLinkJumpTargetViewInfo insertTargetViewInfoParam = new VisualizationLinkJumpTargetViewInfo(); SnapshotVisualizationLinkJumpTargetViewInfo insertTargetViewInfoParam = new SnapshotVisualizationLinkJumpTargetViewInfo();
BeanUtils.copyBean(insertTargetViewInfoParam, targetViewInfo); BeanUtils.copyBean(insertTargetViewInfoParam, targetViewInfo);
visualizationLinkJumpTargetViewInfoMapper.insert(insertTargetViewInfoParam); snapshotVisualizationLinkJumpTargetViewInfoMapper.insert(insertTargetViewInfoParam);
}); });
}); });
} }
@ -142,7 +155,12 @@ public class VisualizationLinkJumpService implements VisualizationLinkJumpApi {
@DeLinkPermit("#p0.targetDvId") @DeLinkPermit("#p0.targetDvId")
@Override @Override
public VisualizationLinkJumpBaseResponse queryTargetVisualizationJumpInfo(VisualizationLinkJumpBaseRequest request) { public VisualizationLinkJumpBaseResponse queryTargetVisualizationJumpInfo(VisualizationLinkJumpBaseRequest request) {
List<VisualizationLinkJumpDTO> result = extVisualizationLinkJumpMapper.getTargetVisualizationJumpInfo(request); List<VisualizationLinkJumpDTO> result = null;
if (CommonConstants.RESOURCE_TABLE.SNAPSHOT.equals(request.getResourceTable())) {
result = extVisualizationLinkJumpMapper.getTargetVisualizationJumpInfoSnapshot(request);
} else {
result = extVisualizationLinkJumpMapper.getTargetVisualizationJumpInfo(request);
}
return new VisualizationLinkJumpBaseResponse(null, Optional.ofNullable(result).orElse(new ArrayList<>()).stream().filter(item -> StringUtils.isNotEmpty(item.getSourceInfo())).collect(Collectors.toMap(VisualizationLinkJumpDTO::getSourceInfo, VisualizationLinkJumpDTO::getTargetInfoList))); return new VisualizationLinkJumpBaseResponse(null, Optional.ofNullable(result).orElse(new ArrayList<>()).stream().filter(item -> StringUtils.isNotEmpty(item.getSourceInfo())).collect(Collectors.toMap(VisualizationLinkJumpDTO::getSourceInfo, VisualizationLinkJumpDTO::getTargetInfoList)));
} }
@ -161,25 +179,25 @@ public class VisualizationLinkJumpService implements VisualizationLinkJumpApi {
outParamsJumpInfo = new ArrayList<>(); outParamsJumpInfo = new ArrayList<>();
componentData = "[]"; componentData = "[]";
} }
return new VisualizationComponentDTO(componentData,result,outParamsJumpInfo); return new VisualizationComponentDTO(componentData, result, outParamsJumpInfo);
} }
@Override @Override
public VisualizationLinkJumpBaseResponse updateJumpSetActive(VisualizationLinkJumpBaseRequest request) { public VisualizationLinkJumpBaseResponse updateJumpSetActive(VisualizationLinkJumpBaseRequest request) {
CoreChartView coreChartView = new CoreChartView(); SnapshotCoreChartView coreChartView = new SnapshotCoreChartView();
coreChartView.setId(Long.valueOf(request.getSourceViewId())); coreChartView.setId(Long.valueOf(request.getSourceViewId()));
coreChartView.setJumpActive(request.getActiveStatus()); coreChartView.setJumpActive(request.getActiveStatus());
coreChartViewMapper.updateById(coreChartView); snapshotCoreChartViewMapper.updateById(coreChartView);
return queryVisualizationJumpInfo(request.getSourceDvId()); return queryVisualizationJumpInfo(request.getSourceDvId(), CommonConstants.RESOURCE_TABLE.SNAPSHOT);
} }
@Override @Override
public void removeJumpSet(VisualizationLinkJumpDTO jumpDTO) { public void removeJumpSet(VisualizationLinkJumpDTO jumpDTO) {
//清理原有数据 //清理原有数据
extVisualizationLinkJumpMapper.deleteJumpTargetViewInfo(jumpDTO.getSourceDvId(), jumpDTO.getSourceViewId()); extVisualizationLinkJumpMapper.deleteJumpTargetViewInfoSnapshot(jumpDTO.getSourceDvId(), jumpDTO.getSourceViewId());
extVisualizationLinkJumpMapper.deleteJumpInfo(jumpDTO.getSourceDvId(), jumpDTO.getSourceViewId()); extVisualizationLinkJumpMapper.deleteJumpInfoSnapshot(jumpDTO.getSourceDvId(), jumpDTO.getSourceViewId());
extVisualizationLinkJumpMapper.deleteJump(jumpDTO.getSourceDvId(), jumpDTO.getSourceViewId()); extVisualizationLinkJumpMapper.deleteJumpSnapshot(jumpDTO.getSourceDvId(), jumpDTO.getSourceViewId());
} }
} }

Some files were not shown because too many files have changed in this diff Show More