diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java index 448c10e224..a965aa2726 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/DefaultChartHandler.java @@ -105,8 +105,8 @@ public class DefaultChartHandler extends AbstractChartPlugin { var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); var allFields = (List) filterResult.getContext().get("allFields"); - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap); - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams()); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams()); String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap); datasourceRequest.setQuery(querySql); diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/YoyChartHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/YoyChartHandler.java index 1b2cb55999..72a7da1c02 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/YoyChartHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/YoyChartHandler.java @@ -81,7 +81,7 @@ public class YoyChartHandler extends DefaultChartHandler { if (yoyFiltered) { var originFilter = (List) filterResult.getContext().get("originFilter"); var allFields = (List) filterResult.getContext().get("allFields"); - ExtWhere2Str.extWhere2sqlOjb(sqlMeta, originFilter, FieldUtil.transFields(allFields), crossDs, dsMap); + ExtWhere2Str.extWhere2sqlOjb(sqlMeta, originFilter, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams()); var originSql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); originSql = provider.rebuildSQL(originSql, sqlMeta, crossDs, dsMap); var request = new DatasourceRequest(); diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java index a477fcce74..ed6eeba61e 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/map/SymbolicMapHandler.java @@ -71,11 +71,11 @@ public class SymbolicMapHandler extends GroupChartHandler { var allFields = (List) filterResult.getContext().get("allFields"); SQLMeta sqlMeta1 = new SQLMeta(); BeanUtils.copyBean(sqlMeta1, sqlMeta); - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams()); List yFields = new ArrayList<>(); yFields.addAll(chartViewManege.transFieldDTO(Collections.singletonList(chartViewManege.createCountField(view.getTableId())))); yAxis.addAll(yFields); - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams()); String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap); datasourceRequest.setQuery(querySql); @@ -93,8 +93,8 @@ public class SymbolicMapHandler extends GroupChartHandler { String sql = (String) sqlMap.get("sql"); sql = Utils.replaceSchemaAlias(sql, dsMap); SQLMeta sqlMeta2 = new SQLMeta(); - Table2SQLObj.table2sqlobj(sqlMeta2, null, "(" + sql + ")", crossDs); - Field2SQLObj.field2sqlObj(sqlMeta2, allFieldsTmp, allFieldsTmp, crossDs, dsMap); + Table2SQLObj.table2sqlobj(sqlMeta2, null, "(" + sql + ")", crossDs); + Field2SQLObj.field2sqlObj(sqlMeta2, allFieldsTmp, allFieldsTmp, crossDs, dsMap, Utils.getParams(allFieldsTmp), null);// todo chartParam从视图里取 String querySQL; querySQL = SQLProvider.createQuerySQL(sqlMeta2, false, needOrder, false); querySQL = provider.rebuildSQL(querySQL, sqlMeta2, crossDs, dsMap); diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/numeric/NumericalChartHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/numeric/NumericalChartHandler.java index fe558dd171..e7083b1283 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/numeric/NumericalChartHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/numeric/NumericalChartHandler.java @@ -37,7 +37,7 @@ public class NumericalChartHandler extends DefaultChartHandler { var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); var allFields = (List) filterResult.getContext().get("allFields"); - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams()); String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap); datasourceRequest.setQuery(querySql); diff --git a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java index ac7116a81b..f19484b26c 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java +++ b/core/core-backend/src/main/java/io/dataease/chart/charts/impl/table/TableInfoHandler.java @@ -84,7 +84,7 @@ public class TableInfoHandler extends DefaultChartHandler { } else { pageInfo.setPageSize(chartExtRequest.getPageSize()); } - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams()); String originSql = SQLProvider.createQuerySQL(sqlMeta, false, true, view);// 明细表强制加排序 String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " OFFSET " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() : ""); var querySql = originSql + limit; diff --git a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java index d0bf82adf6..9e2321cf94 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java +++ b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartDataManage.java @@ -347,11 +347,15 @@ public class ChartDataManage { provider = ProviderFactory.getProvider(dsMap.entrySet().iterator().next().getValue().getType()); } + if (ObjectUtils.isEmpty(view.getCalParams())) { + view.setCalParams(Utils.getParams(transFields(allFields))); + } + SQLMeta sqlMeta = new SQLMeta(); Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs); - CustomWhere2Str.customWhere2sqlObj(sqlMeta, fieldCustomFilter, transFields(allFields), crossDs, dsMap); - ExtWhere2Str.extWhere2sqlOjb(sqlMeta, extFilterList, transFields(allFields), crossDs, dsMap); - WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap); + CustomWhere2Str.customWhere2sqlObj(sqlMeta, fieldCustomFilter, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); + ExtWhere2Str.extWhere2sqlOjb(sqlMeta, extFilterList, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); + WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); // TODO 數據源插件化之後放到插件裡面組裝SQL if (BooleanUtils.isTrue(view.getIsPlugin())) { List dsList = new ArrayList<>(); @@ -359,8 +363,8 @@ public class ChartDataManage { dsList.add(next.getValue().getType()); } boolean needOrder = Utils.isNeedOrder(dsList); - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap); - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams()); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams()); String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap); filterResult.getContext().put("querySql", querySql); @@ -691,31 +695,31 @@ public class ChartDataManage { SQLMeta sqlMeta = new SQLMeta(); Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs); - WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap); + WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); if (StringUtils.equalsAnyIgnoreCase(view.getType(), "indicator", "gauge", "liquid")) { - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { List xFields = new ArrayList<>(); xFields.addAll(xAxis); xFields.addAll(extStack); - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xFields, transFields(allFields), crossDs, dsMap); - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xFields, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { List yFields = new ArrayList<>(); yFields.addAll(yAxis); yFields.addAll(extBubble); - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap); - Quota2SQLObj.quota2sqlObj(sqlMeta, yFields, transFields(allFields), crossDs, dsMap); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); + Quota2SQLObj.quota2sqlObj(sqlMeta, yFields, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); querySql = SQLProvider.createQuerySQL(sqlMeta, false, true, view); } else { - Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap); - Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, transFields(allFields), crossDs, dsMap, Utils.getParams(transFields(allFields)), view.getCalParams()); querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); } diff --git a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java index 8938200d42..e63177409f 100644 --- a/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java +++ b/core/core-backend/src/main/java/io/dataease/chart/manage/ChartViewManege.java @@ -159,10 +159,12 @@ public class ChartViewManege { for (ChartViewFieldDTO ele : list) { if (Objects.equals(ele.getExtField(), ExtFieldConstant.EXT_CALC)) { - String originField = Utils.calcFieldRegex(ele.getOriginName(), tableObj, list.stream().peek(e -> { + List f = list.stream().map(e -> { DatasetTableFieldDTO dto = new DatasetTableFieldDTO(); BeanUtils.copyBean(dto, e); - }).collect(Collectors.toList()), true, null); + return dto; + }).collect(Collectors.toList()); + String originField = Utils.calcFieldRegex(ele.getOriginName(), tableObj, f, true, null, Utils.mergeParam(Utils.getParams(f), null)); for (String func : FunctionConstant.AGG_FUNC) { if (Utils.matchFunction(func, originField)) { ele.setSummary(""); @@ -327,10 +329,10 @@ public class ChartViewManege { public List viewOption(Long resourceId) { List result = extChartViewMapper.queryViewOption(resourceId); DataVisualizationInfo dvInfo = visualizationInfoMapper.selectById(resourceId); - if(dvInfo != null && !CollectionUtils.isEmpty(result)){ + if (dvInfo != null && !CollectionUtils.isEmpty(result)) { String componentData = dvInfo.getComponentData(); - return result.stream().filter(item ->componentData.indexOf(String.valueOf(item.getId()))>0).toList(); - }else{ + return result.stream().filter(item -> componentData.indexOf(String.valueOf(item.getId())) > 0).toList(); + } else { return result; } } diff --git a/core/core-backend/src/main/java/io/dataease/dataset/dao/auto/entity/CoreDatasetTableField.java b/core/core-backend/src/main/java/io/dataease/dataset/dao/auto/entity/CoreDatasetTableField.java index 38f51af146..de0197ecd9 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/dao/auto/entity/CoreDatasetTableField.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/dao/auto/entity/CoreDatasetTableField.java @@ -5,11 +5,11 @@ import java.io.Serializable; /** *

- * + * table数据集表字段 *

* * @author fit2cloud - * @since 2023-07-10 + * @since 2024-08-07 */ @TableName("core_dataset_table_field") public class CoreDatasetTableField implements Serializable { @@ -37,7 +37,7 @@ public class CoreDatasetTableField implements Serializable { private Long datasetGroupId; /** - * 图表ID + * 视图ID */ private Long chartId; @@ -76,6 +76,9 @@ public class CoreDatasetTableField implements Serializable { */ private String type; + /** + * 字段长度(允许为空,默认0) + */ private Integer size; /** @@ -113,6 +116,9 @@ public class CoreDatasetTableField implements Serializable { */ private Integer accuracy; + /** + * 时间字段类型 + */ private String dateFormat; /** @@ -120,6 +126,11 @@ public class CoreDatasetTableField implements Serializable { */ private String dateFormatType; + /** + * 计算字段参数 + */ + private String params; + public Long getId() { return id; } @@ -296,6 +307,14 @@ public class CoreDatasetTableField implements Serializable { this.dateFormatType = dateFormatType; } + public String getParams() { + return params; + } + + public void setParams(String params) { + this.params = params; + } + @Override public String toString() { return "CoreDatasetTableField{" + @@ -321,6 +340,7 @@ public class CoreDatasetTableField implements Serializable { ", accuracy = " + accuracy + ", dateFormat = " + dateFormat + ", dateFormatType = " + dateFormatType + + ", params = " + params + "}"; } } diff --git a/core/core-backend/src/main/java/io/dataease/dataset/dao/auto/mapper/CoreDatasetTableFieldMapper.java b/core/core-backend/src/main/java/io/dataease/dataset/dao/auto/mapper/CoreDatasetTableFieldMapper.java index 23f7b4e260..f4d97206d7 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/dao/auto/mapper/CoreDatasetTableFieldMapper.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/dao/auto/mapper/CoreDatasetTableFieldMapper.java @@ -6,11 +6,11 @@ import org.apache.ibatis.annotations.Mapper; /** *

- * Mapper 接口 + * table数据集表字段 Mapper 接口 *

* * @author fit2cloud - * @since 2023-04-20 + * @since 2024-08-07 */ @Mapper public interface CoreDatasetTableFieldMapper extends BaseMapper { diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java index 3cb3b7b3f8..681dec641e 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java @@ -218,9 +218,9 @@ public class DatasetDataManage { // build query sql SQLMeta sqlMeta = new SQLMeta(); Table2SQLObj.table2sqlobj(sqlMeta, null, "(" + sql + ")", crossDs); - Field2SQLObj.field2sqlObj(sqlMeta, fields, fields, crossDs, dsMap); - WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, fields, crossDs, dsMap); - Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), fields, crossDs, dsMap); + Field2SQLObj.field2sqlObj(sqlMeta, fields, fields, crossDs, dsMap, Utils.getParams(fields), null); + WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, fields, crossDs, dsMap, Utils.getParams(fields), null); + Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), fields, crossDs, dsMap, Utils.getParams(fields), null); String querySQL; if (start == null || count == null) { querySQL = SQLProvider.createQuerySQL(sqlMeta, false, needOrder, false); @@ -509,9 +509,9 @@ public class DatasetDataManage { provider = ProviderFactory.getProvider(dsList.getFirst()); } - Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap); - WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap); - Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap); + Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap, Utils.getParams(allFields), null); + WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap, Utils.getParams(allFields), null); + Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap, Utils.getParams(allFields), null); String querySQL; if (multFieldValuesRequest.getResultMode() == 0) { querySQL = SQLProvider.createQuerySQLWithLimit(sqlMeta, false, needOrder, true, 0, 1000); @@ -756,10 +756,10 @@ public class DatasetDataManage { provider = ProviderFactory.getProvider(dsList.getFirst()); } - Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap); - ExtWhere2Str.extWhere2sqlOjb(sqlMeta, extFilterList, allFields, crossDs, dsMap); - WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap); - Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap); + Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap, Utils.getParams(allFields), null); + ExtWhere2Str.extWhere2sqlOjb(sqlMeta, extFilterList, allFields, crossDs, dsMap, Utils.getParams(allFields), null); + WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap, Utils.getParams(allFields), null); + Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap, Utils.getParams(allFields), null); String querySQL; if (request.getResultMode() == 0) { querySQL = SQLProvider.createQuerySQLWithLimit(sqlMeta, false, needOrder, sortDistinct && ids.size() == 1, 0, 1000); @@ -888,9 +888,9 @@ public class DatasetDataManage { provider = ProviderFactory.getProvider(dsList.getFirst()); } - Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap); - WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap); - Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap); + Field2SQLObj.field2sqlObj(sqlMeta, fields, allFields, crossDs, dsMap, Utils.getParams(allFields), null); + WhereTree2Str.transFilterTrees(sqlMeta, rowPermissionsTree, allFields, crossDs, dsMap, Utils.getParams(allFields), null); + Order2SQLObj.getOrders(sqlMeta, datasetGroupInfoDTO.getSortFields(), allFields, crossDs, dsMap, Utils.getParams(allFields), null); String querySQL; if (multFieldValuesRequest.getResultMode() == 0) { querySQL = SQLProvider.createQuerySQLWithLimit(sqlMeta, false, needOrder, false, 0, 1000); diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java index 609208cefa..804acfde4e 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetTableFieldManage.java @@ -1,6 +1,7 @@ package io.dataease.dataset.manage; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.fasterxml.jackson.core.type.TypeReference; import io.dataease.api.dataset.union.DatasetGroupInfoDTO; import io.dataease.dataset.dao.auto.entity.CoreDatasetTableField; import io.dataease.dataset.dao.auto.mapper.CoreDatasetTableFieldMapper; @@ -9,6 +10,7 @@ import io.dataease.engine.constant.ExtFieldConstant; import io.dataease.engine.func.FunctionConstant; import io.dataease.engine.utils.Utils; import io.dataease.exception.DEException; +import io.dataease.extensions.datasource.dto.CalParam; import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; import io.dataease.extensions.datasource.model.SQLObj; @@ -17,6 +19,7 @@ import io.dataease.i18n.Translator; import io.dataease.utils.AuthUtils; import io.dataease.utils.BeanUtils; import io.dataease.utils.IDUtils; +import io.dataease.utils.JsonUtil; import jakarta.annotation.Resource; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -78,8 +81,7 @@ public class DatasetTableFieldManage { public DatasetTableFieldDTO save(DatasetTableFieldDTO datasetTableFieldDTO) { checkNameLength(datasetTableFieldDTO.getName()); CoreDatasetTableField coreDatasetTableField = coreDatasetTableFieldMapper.selectById(datasetTableFieldDTO.getId()); - CoreDatasetTableField record = new CoreDatasetTableField(); - BeanUtils.copyBean(record, datasetTableFieldDTO); + CoreDatasetTableField record = transDTO2Record(datasetTableFieldDTO); if (ObjectUtils.isEmpty(record.getDataeaseName())) { String n = TableUtils.fieldNameShort(record.getId() + ""); record.setFieldShortName(n); @@ -256,7 +258,7 @@ public class DatasetTableFieldManage { .filter(ele -> { boolean flag = true; if (Objects.equals(ele.getExtField(), ExtFieldConstant.EXT_CALC)) { - String originField = Utils.calcFieldRegex(ele.getOriginName(), tableObj, fields, true, null); + String originField = Utils.calcFieldRegex(ele.getOriginName(), tableObj, fields, true, null, Utils.mergeParam(Utils.getParams(fields), null)); for (String func : FunctionConstant.AGG_FUNC) { if (Utils.matchFunction(func, originField)) { flag = false; @@ -277,10 +279,25 @@ public class DatasetTableFieldManage { DatasetTableFieldDTO dto = new DatasetTableFieldDTO(); if (ele == null) return null; BeanUtils.copyBean(dto, ele); + if (StringUtils.isNotEmpty(ele.getParams())) { + TypeReference> tokenType = new TypeReference<>() { + }; + List calParams = JsonUtil.parseList(ele.getParams(), tokenType); + dto.setParams(calParams); + } return dto; }).collect(Collectors.toList()); } + private CoreDatasetTableField transDTO2Record(DatasetTableFieldDTO dto) { + CoreDatasetTableField record = new CoreDatasetTableField(); + BeanUtils.copyBean(record, dto); + if (ObjectUtils.isNotEmpty(dto.getParams())) { + record.setParams(JsonUtil.toJSONString(dto.getParams()).toString()); + } + return record; + } + private void checkNameLength(String name) { if (name != null && name.length() > 100) { DEException.throwException(Translator.get("i18n_name_limit_100")); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java index 778f11fc2f..63c3283076 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/CustomWhere2Str.java @@ -3,6 +3,7 @@ package io.dataease.engine.trans; import io.dataease.engine.constant.SQLConstants; import io.dataease.engine.utils.Utils; import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; +import io.dataease.extensions.datasource.dto.CalParam; import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; import io.dataease.extensions.datasource.model.SQLMeta; @@ -21,7 +22,7 @@ import java.util.*; */ public class CustomWhere2Str { - public static void customWhere2sqlObj(SQLMeta meta, FilterTreeObj tree, List originFields, boolean isCross, Map dsMap) { + public static void customWhere2sqlObj(SQLMeta meta, FilterTreeObj tree, List originFields, boolean isCross, Map dsMap, List fieldParam, List chartParam) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; @@ -34,7 +35,7 @@ public class CustomWhere2Str { return; } Map fieldsDialect = new HashMap<>(); - String treeExp = transTreeToWhere(tableObj, tree, fieldsDialect, originFields, isCross, dsMap); + String treeExp = transTreeToWhere(tableObj, tree, fieldsDialect, originFields, isCross, dsMap, fieldParam, chartParam); if (StringUtils.isNotEmpty(treeExp)) { res.add(treeExp); } @@ -42,7 +43,7 @@ public class CustomWhere2Str { meta.setCustomWheresDialect(fieldsDialect); } - private static String transTreeToWhere(SQLObj tableObj, FilterTreeObj tree, Map fieldsDialect, List originFields, boolean isCross, Map dsMap) { + private static String transTreeToWhere(SQLObj tableObj, FilterTreeObj tree, Map fieldsDialect, List originFields, boolean isCross, Map dsMap, List fieldParam, List chartParam) { if (ObjectUtils.isEmpty(tree)) { return null; } @@ -55,10 +56,10 @@ public class CustomWhere2Str { String exp = null; if (StringUtils.equalsIgnoreCase(item.getType(), "item")) { // 单个item拼接SQL,最后根据logic汇总 - exp = transTreeItem(tableObj, item, fieldsDialect, originFields, isCross, dsMap); + exp = transTreeItem(tableObj, item, fieldsDialect, originFields, isCross, dsMap, fieldParam, chartParam); } else if (StringUtils.equalsIgnoreCase(item.getType(), "tree")) { // 递归tree - exp = transTreeToWhere(tableObj, item.getSubTree(), fieldsDialect, originFields, isCross, dsMap); + exp = transTreeToWhere(tableObj, item.getSubTree(), fieldsDialect, originFields, isCross, dsMap, fieldParam, chartParam); } if (StringUtils.isNotEmpty(exp)) { list.add(exp); @@ -68,18 +69,19 @@ public class CustomWhere2Str { return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + logic + " ", list) + ")" : null; } - private static String transTreeItem(SQLObj tableObj, FilterTreeItem item, Map fieldsDialect, List originFields, boolean isCross, Map dsMap) { + private static String transTreeItem(SQLObj tableObj, FilterTreeItem item, Map fieldsDialect, List originFields, boolean isCross, Map dsMap, List fieldParam, List chartParam) { String res = null; DatasetTableFieldDTO field = item.getField(); if (ObjectUtils.isEmpty(field)) { return null; } + Map paramMap = Utils.mergeParam(fieldParam, chartParam); String whereName = ""; String originName; if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 - String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap); + String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); fieldsDialect.put(originName, calcFieldExp); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java index e52d29d48f..5493026ee6 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Dimension2SQLObj.java @@ -1,15 +1,16 @@ package io.dataease.engine.trans; -import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; -import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; -import io.dataease.extensions.datasource.model.SQLMeta; -import io.dataease.extensions.datasource.model.SQLObj; -import io.dataease.extensions.view.dto.ChartViewFieldDTO; -import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; import io.dataease.engine.constant.DeTypeConstants; import io.dataease.engine.constant.ExtFieldConstant; import io.dataease.engine.constant.SQLConstants; import io.dataease.engine.utils.Utils; +import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; +import io.dataease.extensions.datasource.dto.CalParam; +import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; +import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; +import io.dataease.extensions.datasource.model.SQLMeta; +import io.dataease.extensions.datasource.model.SQLObj; +import io.dataease.extensions.view.dto.ChartViewFieldDTO; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -22,11 +23,12 @@ import java.util.*; public class Dimension2SQLObj { public static void dimension2sqlObj(SQLMeta meta, List fields, List originFields, - boolean isCross, Map dsMap) { + boolean isCross, Map dsMap, List fieldParam, List chartParam) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; } + Map paramMap = Utils.mergeParam(fieldParam, chartParam); List xFields = new ArrayList<>(); List xOrders = new ArrayList<>(); Map fieldsDialect = new HashMap<>(); @@ -36,7 +38,7 @@ public class Dimension2SQLObj { String originField; if (ObjectUtils.isNotEmpty(x.getExtField()) && Objects.equals(x.getExtField(), ExtFieldConstant.EXT_CALC)) { // 解析origin name中有关联的字段生成sql表达式 - String calcFieldExp = Utils.calcFieldRegex(x.getOriginName(), tableObj, originFields, isCross, dsMap); + String calcFieldExp = Utils.calcFieldRegex(x.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId()); fieldsDialect.put(originField, calcFieldExp); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java index 080f96cee1..b1bcec936e 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/ExtWhere2Str.java @@ -1,13 +1,14 @@ package io.dataease.engine.trans; +import io.dataease.engine.constant.SQLConstants; +import io.dataease.engine.utils.Utils; import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; +import io.dataease.extensions.datasource.dto.CalParam; +import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; import io.dataease.extensions.datasource.model.SQLMeta; import io.dataease.extensions.datasource.model.SQLObj; import io.dataease.extensions.view.dto.ChartExtFilterDTO; -import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; -import io.dataease.engine.constant.SQLConstants; -import io.dataease.engine.utils.Utils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -21,11 +22,12 @@ import java.util.Map; */ public class ExtWhere2Str { - public static void extWhere2sqlOjb(SQLMeta meta, List fields, List originFields, boolean isCross, Map dsMap) { + public static void extWhere2sqlOjb(SQLMeta meta, List fields, List originFields, boolean isCross, Map dsMap, List fieldParam, List chartParam) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; } + Map paramMap = Utils.mergeParam(fieldParam, chartParam); List list = new ArrayList<>(); Map fieldsDialect = new HashMap<>(); if (ObjectUtils.isNotEmpty(fields)) { @@ -49,7 +51,7 @@ public class ExtWhere2Str { String originName; if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 - String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap); + String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); fieldsDialect.put(originName, calcFieldExp); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java index f7e5b148f0..ef1a69b78f 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Field2SQLObj.java @@ -1,13 +1,14 @@ package io.dataease.engine.trans; -import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; -import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; -import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; import io.dataease.engine.constant.DeTypeConstants; import io.dataease.engine.constant.ExtFieldConstant; import io.dataease.engine.constant.SQLConstants; import io.dataease.engine.func.FunctionConstant; import io.dataease.engine.utils.Utils; +import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; +import io.dataease.extensions.datasource.dto.CalParam; +import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; +import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; import io.dataease.extensions.datasource.model.SQLMeta; import io.dataease.extensions.datasource.model.SQLObj; import org.apache.commons.lang3.ObjectUtils; @@ -20,11 +21,12 @@ import java.util.*; */ public class Field2SQLObj { - public static void field2sqlObj(SQLMeta meta, List fields, List originFields, boolean isCross, Map dsMap) { + public static void field2sqlObj(SQLMeta meta, List fields, List originFields, boolean isCross, Map dsMap, List fieldParam, List chartParam) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; } + Map paramMap = Utils.mergeParam(fieldParam, chartParam); List xFields = new ArrayList<>(); Map fieldsDialect = new HashMap<>(); if (ObjectUtils.isNotEmpty(fields)) { @@ -33,7 +35,7 @@ public class Field2SQLObj { String originField; if (ObjectUtils.isNotEmpty(x.getExtField()) && Objects.equals(x.getExtField(), ExtFieldConstant.EXT_CALC)) { // 解析origin name中有关联的字段生成sql表达式 - String calcFieldExp = Utils.calcFieldRegex(x.getOriginName(), tableObj, originFields, isCross, dsMap); + String calcFieldExp = Utils.calcFieldRegex(x.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, x.getId()); fieldsDialect.put(originField, calcFieldExp); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java index 1186bd15a6..55b820bee9 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Order2SQLObj.java @@ -1,6 +1,7 @@ package io.dataease.engine.trans; import io.dataease.api.chart.dto.DeSortField; +import io.dataease.extensions.datasource.dto.CalParam; import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; import io.dataease.engine.constant.DeTypeConstants; @@ -22,7 +23,7 @@ import java.util.Objects; */ public class Order2SQLObj { - public static void getOrders(SQLMeta meta, List sortFields, List originFields, boolean isCross, Map dsMap) { + public static void getOrders(SQLMeta meta, List sortFields, List originFields, boolean isCross, Map dsMap, List fieldParam, List chartParam) { SQLObj tableObj = meta.getTable(); List xOrders = meta.getXOrders() == null ? new ArrayList<>() : meta.getXOrders(); if (ObjectUtils.isEmpty(tableObj)) { @@ -32,18 +33,19 @@ public class Order2SQLObj { int step = originFields.size(); for (int i = step; i < (step + sortFields.size()); i++) { DeSortField deSortField = sortFields.get(i - step); - SQLObj order = buildSortField(deSortField, tableObj, i, originFields, isCross, dsMap); + SQLObj order = buildSortField(deSortField, tableObj, i, originFields, isCross, dsMap, fieldParam, chartParam); xOrders.add(order); } meta.setXOrders(xOrders); } } - private static SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i, List originFields, boolean isCross, Map dsMap) { + private static SQLObj buildSortField(DeSortField f, SQLObj tableObj, int i, List originFields, boolean isCross, Map dsMap, List fieldParam, List chartParam) { + Map paramMap = Utils.mergeParam(fieldParam, chartParam); String originField; if (ObjectUtils.isNotEmpty(f.getExtField()) && Objects.equals(f.getExtField(), ExtFieldConstant.EXT_CALC)) { // 解析origin name中有关联的字段生成sql表达式 - originField = Utils.calcFieldRegex(f.getOriginName(), tableObj, originFields, isCross, dsMap); + originField = Utils.calcFieldRegex(f.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap); } else if (ObjectUtils.isNotEmpty(f.getExtField()) && Objects.equals(f.getExtField(), ExtFieldConstant.EXT_COPY)) { originField = String.format(SQLConstants.FIELD_NAME, tableObj.getTableAlias(), f.getDataeaseName()); } else { diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java b/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java index 2a8c50e0a7..37533eec74 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/Quota2SQLObj.java @@ -1,15 +1,16 @@ package io.dataease.engine.trans; -import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; -import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; -import io.dataease.extensions.datasource.model.SQLMeta; -import io.dataease.extensions.datasource.model.SQLObj; -import io.dataease.extensions.view.dto.ChartViewFieldDTO; -import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; import io.dataease.engine.constant.DeTypeConstants; import io.dataease.engine.constant.ExtFieldConstant; import io.dataease.engine.constant.SQLConstants; import io.dataease.engine.utils.Utils; +import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; +import io.dataease.extensions.datasource.dto.CalParam; +import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; +import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; +import io.dataease.extensions.datasource.model.SQLMeta; +import io.dataease.extensions.datasource.model.SQLObj; +import io.dataease.extensions.view.dto.ChartViewFieldDTO; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.util.CollectionUtils; @@ -21,11 +22,12 @@ import java.util.*; */ public class Quota2SQLObj { - public static void quota2sqlObj(SQLMeta meta, List fields, List originFields, boolean isCross, Map dsMap) { + public static void quota2sqlObj(SQLMeta meta, List fields, List originFields, boolean isCross, Map dsMap, List fieldParam, List chartParam) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; } + Map paramMap = Utils.mergeParam(fieldParam, chartParam); List yFields = new ArrayList<>(); List yWheres = new ArrayList<>(); List yOrders = new ArrayList<>(); @@ -36,7 +38,7 @@ public class Quota2SQLObj { String originField; if (ObjectUtils.isNotEmpty(y.getExtField()) && Objects.equals(y.getExtField(), ExtFieldConstant.EXT_CALC)) { // 解析origin name中有关联的字段生成sql表达式 - String calcFieldExp = Utils.calcFieldRegex(y.getOriginName(), tableObj, originFields, isCross, dsMap); + String calcFieldExp = Utils.calcFieldRegex(y.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originField = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, y.getId()); fieldsDialect.put(originField, calcFieldExp); diff --git a/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java b/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java index 073e124576..774468e435 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java +++ b/core/core-backend/src/main/java/io/dataease/engine/trans/WhereTree2Str.java @@ -1,16 +1,17 @@ package io.dataease.engine.trans; -import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; -import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; import io.dataease.api.permissions.dataset.dto.DataSetRowPermissionsTreeDTO; +import io.dataease.engine.constant.ExtFieldConstant; +import io.dataease.engine.constant.SQLConstants; +import io.dataease.engine.utils.Utils; +import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; +import io.dataease.extensions.datasource.dto.CalParam; +import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; +import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; import io.dataease.extensions.datasource.model.SQLMeta; import io.dataease.extensions.datasource.model.SQLObj; import io.dataease.extensions.view.dto.DatasetRowPermissionsTreeItem; import io.dataease.extensions.view.dto.DatasetRowPermissionsTreeObj; -import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; -import io.dataease.engine.constant.ExtFieldConstant; -import io.dataease.engine.constant.SQLConstants; -import io.dataease.engine.utils.Utils; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -21,7 +22,7 @@ import java.util.*; * @Author Junjun */ public class WhereTree2Str { - public static void transFilterTrees(SQLMeta meta, List requestList, List originFields, boolean isCross, Map dsMap) { + public static void transFilterTrees(SQLMeta meta, List requestList, List originFields, boolean isCross, Map dsMap, List fieldParam, List chartParam) { SQLObj tableObj = meta.getTable(); if (ObjectUtils.isEmpty(tableObj)) { return; @@ -39,7 +40,7 @@ public class WhereTree2Str { if (ObjectUtils.isEmpty(tree)) { continue; } - String treeExp = transTreeToWhere(tableObj, tree, originFields, fieldsDialect, isCross, dsMap); + String treeExp = transTreeToWhere(tableObj, tree, originFields, fieldsDialect, isCross, dsMap, fieldParam, chartParam); if (StringUtils.isNotEmpty(treeExp)) { res.add(treeExp); } @@ -48,7 +49,7 @@ public class WhereTree2Str { meta.setWhereTreesDialect(fieldsDialect); } - private static String transTreeToWhere(SQLObj tableObj, DatasetRowPermissionsTreeObj tree, List originFields, Map fieldsDialect, boolean isCross, Map dsMap) { + private static String transTreeToWhere(SQLObj tableObj, DatasetRowPermissionsTreeObj tree, List originFields, Map fieldsDialect, boolean isCross, Map dsMap, List fieldParam, List chartParam) { if (ObjectUtils.isEmpty(tree)) { return null; } @@ -61,10 +62,10 @@ public class WhereTree2Str { String exp = null; if (StringUtils.equalsIgnoreCase(item.getType(), "item")) { // 单个item拼接SQL,最后根据logic汇总 - exp = transTreeItem(tableObj, item, originFields, fieldsDialect, isCross, dsMap); + exp = transTreeItem(tableObj, item, originFields, fieldsDialect, isCross, dsMap, fieldParam, chartParam); } else if (StringUtils.equalsIgnoreCase(item.getType(), "tree")) { // 递归tree - exp = transTreeToWhere(tableObj, item.getSubTree(), originFields, fieldsDialect, isCross, dsMap); + exp = transTreeToWhere(tableObj, item.getSubTree(), originFields, fieldsDialect, isCross, dsMap, fieldParam, chartParam); } if (StringUtils.isNotEmpty(exp)) { list.add(exp); @@ -74,17 +75,18 @@ public class WhereTree2Str { return CollectionUtils.isNotEmpty(list) ? "(" + String.join(" " + logic + " ", list) + ")" : null; } - public static String transTreeItem(SQLObj tableObj, DatasetRowPermissionsTreeItem item, List originFields, Map fieldsDialect, boolean isCross, Map dsMap) { + public static String transTreeItem(SQLObj tableObj, DatasetRowPermissionsTreeItem item, List originFields, Map fieldsDialect, boolean isCross, Map dsMap, List fieldParam, List chartParam) { String res = null; DatasetTableFieldDTO field = item.getField(); if (ObjectUtils.isEmpty(field)) { return null; } + Map paramMap = Utils.mergeParam(fieldParam, chartParam); String whereName = ""; String originName; if (ObjectUtils.isNotEmpty(field.getExtField()) && Objects.equals(field.getExtField(), ExtFieldConstant.EXT_CALC)) { // 解析origin name中有关联的字段生成sql表达式 - String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap); + String calcFieldExp = Utils.calcFieldRegex(field.getOriginName(), tableObj, originFields, isCross, dsMap, paramMap); // 给计算字段处加一个占位符,后续SQL方言转换后再替换 originName = String.format(SqlPlaceholderConstants.CALC_FIELD_PLACEHOLDER, field.getId()); fieldsDialect.put(originName, calcFieldExp); diff --git a/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java b/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java index a53e462eb4..d3f8f5e971 100644 --- a/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java +++ b/core/core-backend/src/main/java/io/dataease/engine/utils/Utils.java @@ -4,6 +4,7 @@ import io.dataease.engine.constant.ExtFieldConstant; import io.dataease.engine.constant.SQLConstants; import io.dataease.exception.DEException; import io.dataease.extensions.datasource.constant.SqlPlaceholderConstants; +import io.dataease.extensions.datasource.dto.CalParam; import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; import io.dataease.extensions.datasource.model.SQLObj; @@ -26,7 +27,7 @@ public class Utils { } // 解析计算字段 - public static String calcFieldRegex(String originField, SQLObj tableObj, List originFields, boolean isCross, Map dsMap) { + public static String calcFieldRegex(String originField, SQLObj tableObj, List originFields, boolean isCross, Map dsMap, Map paramMap) { try { int i = 0; DatasourceConfiguration.DatasourceType datasourceType = null; @@ -34,7 +35,7 @@ public class Utils { Map.Entry next = dsMap.entrySet().iterator().next(); datasourceType = DatasourceConfiguration.DatasourceType.valueOf(next.getValue().getType()); } - return buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType); + return buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType, paramMap); } catch (Exception e) { DEException.throwException(Translator.get("i18n_field_circular_ref")); } @@ -49,14 +50,14 @@ public class Utils { Map.Entry next = dsTypeMap.entrySet().iterator().next(); datasourceType = DatasourceConfiguration.DatasourceType.valueOf(next.getValue()); } - return buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType); + return buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType, null); } catch (Exception e) { DEException.throwException(Translator.get("i18n_field_circular_ref")); } return null; } - public static String buildCalcField(String originField, SQLObj tableObj, List originFields, int i, boolean isCross, DatasourceConfiguration.DatasourceType datasourceType) throws Exception { + public static String buildCalcField(String originField, SQLObj tableObj, List originFields, int i, boolean isCross, DatasourceConfiguration.DatasourceType datasourceType, Map paramMap) throws Exception { try { i++; if (i > 100) { @@ -75,6 +76,14 @@ public class Utils { if (CollectionUtils.isEmpty(ids)) { return originField; } + // 替换参数 + if (ObjectUtils.isNotEmpty(paramMap)) { + Set> entries = paramMap.entrySet(); + for (Map.Entry ele : entries) { + originField = originField.replaceAll("\\[" + ele.getKey() + "]", ele.getValue()); + } + } + // 替换字段引用 for (DatasetTableFieldDTO ele : originFields) { if (StringUtils.containsIgnoreCase(originField, ele.getId() + "")) { // 计算字段允许二次引用,这里递归查询完整引用链 @@ -86,7 +95,7 @@ public class Utils { } } else { originField = originField.replaceAll("\\[" + ele.getId() + "]", "(" + ele.getOriginName() + ")"); - originField = buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType); + originField = buildCalcField(originField, tableObj, originFields, i, isCross, datasourceType, paramMap); } } } @@ -406,4 +415,30 @@ public class Utils { map.put("endTime", endTime); return map; } + + public static List getParams(List list) { + if (ObjectUtils.isNotEmpty(list)) return Collections.emptyList(); + List param = new ArrayList<>(); + for (DatasetTableFieldDTO dto : list) { + if (Objects.equals(dto.getExtField(), ExtFieldConstant.EXT_CALC) && ObjectUtils.isNotEmpty(dto.getParams())) { + param.addAll(dto.getParams()); + } + } + return param; + } + + public static Map mergeParam(List fieldParam, List chartParam) { + Map map = new HashMap<>(); + if (ObjectUtils.isNotEmpty(fieldParam)) { + for (CalParam param : fieldParam) { + map.put(param.getId(), param.getValue()); + } + } + if (ObjectUtils.isNotEmpty(chartParam)) { + for (CalParam param : chartParam) { + map.put(param.getId(), param.getValue()); + } + } + return map; + } } diff --git a/core/core-backend/src/main/resources/db/desktop/V2.10__ddl.sql b/core/core-backend/src/main/resources/db/desktop/V2.10__ddl.sql index e47e7c76d2..f6a904983a 100644 --- a/core/core-backend/src/main/resources/db/desktop/V2.10__ddl.sql +++ b/core/core-backend/src/main/resources/db/desktop/V2.10__ddl.sql @@ -2,5 +2,7 @@ BEGIN; INSERT INTO `core_sys_startup_job` VALUES ('chartFilterDynamic', 'chartFilterDynamic', 'ready'); COMMIT; +alter table `core_dataset_table_field` add params text null comment '计算字段参数'; + alter table `core_datasource` add `enable_data_fill` tinyint default 0 null comment '启用数据填报功能'; diff --git a/core/core-backend/src/main/resources/db/migration/V2.10__ddl.sql b/core/core-backend/src/main/resources/db/migration/V2.10__ddl.sql index e47e7c76d2..f6a904983a 100644 --- a/core/core-backend/src/main/resources/db/migration/V2.10__ddl.sql +++ b/core/core-backend/src/main/resources/db/migration/V2.10__ddl.sql @@ -2,5 +2,7 @@ BEGIN; INSERT INTO `core_sys_startup_job` VALUES ('chartFilterDynamic', 'chartFilterDynamic', 'ready'); COMMIT; +alter table `core_dataset_table_field` add params text null comment '计算字段参数'; + alter table `core_datasource` add `enable_data_fill` tinyint default 0 null comment '启用数据填报功能'; diff --git a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/CalParam.java b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/CalParam.java new file mode 100644 index 0000000000..b24f585a51 --- /dev/null +++ b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/CalParam.java @@ -0,0 +1,18 @@ +package io.dataease.extensions.datasource.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author Junjun + */ +@Data +public class CalParam implements Serializable { + @JsonSerialize(using = ToStringSerializer.class) + private String id; + private String name; + private String value; +} diff --git a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasetTableFieldDTO.java b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasetTableFieldDTO.java index 5fb7508128..a3f3f8a14e 100644 --- a/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasetTableFieldDTO.java +++ b/sdk/extensions/extensions-datasource/src/main/java/io/dataease/extensions/datasource/dto/DatasetTableFieldDTO.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; import java.io.Serializable; +import java.util.List; /** * @Author Junjun @@ -126,4 +127,9 @@ public class DatasetTableFieldDTO implements Serializable { * 是否脱敏 */ private Boolean desensitized; + + /** + * 计算字段参数 + */ + private List params; } diff --git a/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/ChartViewBaseDTO.java b/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/ChartViewBaseDTO.java index 2cf27bab16..f72c935b13 100644 --- a/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/ChartViewBaseDTO.java +++ b/sdk/extensions/extensions-view/src/main/java/io/dataease/extensions/view/dto/ChartViewBaseDTO.java @@ -3,6 +3,7 @@ package io.dataease.extensions.view.dto; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.dataease.extensions.datasource.dto.CalParam; import io.dataease.extensions.view.filter.FilterTreeObj; import lombok.Data; @@ -218,4 +219,9 @@ public class ChartViewBaseDTO implements Serializable { */ private List flowMapEndName; + /** + * 计算字段参数值 + */ + private List calParams; + }