diff --git a/backend/src/main/java/com/stdproject/charts/impl/bar/BarHandler.java b/backend/src/main/java/com/stdproject/charts/impl/bar/BarHandler.java new file mode 100644 index 0000000..52e2dd4 --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/bar/BarHandler.java @@ -0,0 +1,87 @@ +package com.stdproject.charts.impl.bar; + + +import com.stdproject.charts.impl.YoyChartHandler; +import com.stdproject.entity.union.DatasetGroupInfoDTO; +import com.stdproject.utils.Utils; +import io.gisbi.extensions.datasource.dto.DatasourceRequest; +import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO; +import io.gisbi.extensions.datasource.model.SQLMeta; +import io.gisbi.extensions.datasource.provider.Provider; +import io.gisbi.extensions.view.dto.*; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +public class BarHandler extends YoyChartHandler { + + @Override + public void init() { + chartHandlerManager.registerChartHandler(this.getRender(), "bar", this); + chartHandlerManager.registerChartHandler(this.getRender(), "bar-horizontal", this); + } + + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var result = super.formatAxis(view); + var yAxis = result.getAxisMap().get(ChartAxis.yAxis); + yAxis.addAll(view.getExtLabel()); + yAxis.addAll(view.getExtTooltip()); + result.getAxisMap().put(ChartAxis.extLabel, view.getExtLabel()); + result.getAxisMap().put(ChartAxis.extTooltip, view.getExtTooltip()); + return result; + } + + @Override + public T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, Provider provider) { + var dsMap = (Map) sqlMap.get("dsMap"); + List dsList = new ArrayList<>(); + for (Map.Entry next : dsMap.entrySet()) { + dsList.add(next.getValue().getType()); + } + boolean needOrder = Utils.isNeedOrder(dsList); + boolean crossDs = ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross(); + var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); + try { + //如果有同环比过滤,应该用原始sql + var originSql = result.getQuerySql(); + var dynamicAssistFields = getDynamicAssistFields(view); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + var assistFields = getAssistFields(dynamicAssistFields, yAxis); + if (CollectionUtils.isNotEmpty(assistFields)) { + var req = new DatasourceRequest(); + req.setIsCross(crossDs); + req.setDsList(dsMap); + + List 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); + logger.debug("calcite assistSql sql: " + assistSql); + var assistData = (List) provider.fetchResultField(req).get("data"); + result.setAssistData(assistData); + result.setDynamicAssistFields(assists); + } + + List 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) provider.fetchResultField(req).get("data"); + result.setAssistDataOriginList(assistDataOriginList); + result.setDynamicAssistFieldsOriginList(assistsOriginList); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } +} diff --git a/backend/src/main/java/com/stdproject/charts/impl/bar/BidirectionalBarHandler.java b/backend/src/main/java/com/stdproject/charts/impl/bar/BidirectionalBarHandler.java new file mode 100644 index 0000000..0ed25c0 --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/bar/BidirectionalBarHandler.java @@ -0,0 +1,10 @@ +package com.stdproject.charts.impl.bar; + +import lombok.Getter; +import org.springframework.stereotype.Component; + +@Component +public class BidirectionalBarHandler extends ProgressBarHandler { + @Getter + private String type = "bidirectional-bar"; +} diff --git a/backend/src/main/java/com/stdproject/charts/impl/bar/BulletGraphHandler.java b/backend/src/main/java/com/stdproject/charts/impl/bar/BulletGraphHandler.java new file mode 100644 index 0000000..91f0a59 --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/bar/BulletGraphHandler.java @@ -0,0 +1,81 @@ +package com.stdproject.charts.impl.bar; + + +import com.stdproject.charts.impl.YoyChartHandler; +import com.stdproject.entity.union.DatasetGroupInfoDTO; +import com.stdproject.utils.ChartDataBuild; +import io.gisbi.extensions.datasource.dto.DatasourceRequest; +import io.gisbi.extensions.datasource.dto.DatasourceSchemaDTO; +import io.gisbi.extensions.datasource.model.SQLMeta; +import io.gisbi.extensions.datasource.provider.Provider; +import io.gisbi.extensions.view.dto.*; +import lombok.Getter; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +public class BulletGraphHandler extends YoyChartHandler { + @Getter + private String type = "bullet-graph"; + + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var result = super.formatAxis(view); + var yAxis = result.getAxisMap().get(ChartAxis.yAxis); + yAxis.addAll(view.getYAxisExt()); + yAxis.addAll(view.getExtBubble()); + yAxis.addAll(view.getExtTooltip()); + result.getAxisMap().put(ChartAxis.yAxis, yAxis); + result.getAxisMap().put(ChartAxis.yAxisExt, view.getYAxisExt()); + result.getAxisMap().put(ChartAxis.extBubble, view.getExtBubble()); + result.getAxisMap().put(ChartAxis.extTooltip, view.getExtTooltip()); + return result; + } + + @Override + public Map buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) { + boolean isDrill = filterResult + .getFilterList() + .stream() + .anyMatch(ele -> ele.getFilterType() == 1); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + return ChartDataBuild.transChartData(xAxis, yAxis, view, data, isDrill); + } + + @Override + public T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, Provider provider) { + var dsMap = (Map) sqlMap.get("dsMap"); + List dsList = new ArrayList<>(); + for (Map.Entry next : dsMap.entrySet()) { + dsList.add(next.getValue().getType()); + } + var result = (T) super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); + try { + //如果有同环比过滤,应该用原始sql + var originSql = result.getQuerySql(); + var dynamicAssistFields = getDynamicAssistFields(view); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + var assistFields = getAssistFields(dynamicAssistFields, yAxis); + if (CollectionUtils.isNotEmpty(assistFields)) { + var req = new DatasourceRequest(); + req.setIsCross(((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross()); + req.setDsList(dsMap); + var assistSql = assistSQL(originSql, assistFields, dsMap, ((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross()); + req.setQuery(assistSql); + logger.debug("calcite assistSql sql: " + assistSql); + var assistData = (List) provider.fetchResultField(req).get("data"); + result.setAssistData(assistData); + result.setDynamicAssistFields(dynamicAssistFields); + } + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + +} diff --git a/backend/src/main/java/com/stdproject/charts/impl/bar/GroupBarHandler.java b/backend/src/main/java/com/stdproject/charts/impl/bar/GroupBarHandler.java new file mode 100644 index 0000000..11fdb34 --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/bar/GroupBarHandler.java @@ -0,0 +1,76 @@ +package com.stdproject.charts.impl.bar; + +import com.stdproject.utils.ChartDataBuild; +import io.gisbi.extensions.view.dto.*; +import lombok.Getter; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +@Component +public class GroupBarHandler extends BarHandler { + @Getter + private String type = "bar-group"; + + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var result = super.formatAxis(view); + var xAxis = result.getAxisMap().get(ChartAxis.xAxis); + xAxis.addAll(view.getXAxisExt()); + result.getAxisMap().put(ChartAxis.xAxisExt, view.getXAxisExt()); + return result; + } + + @Override + public void init() { + chartHandlerManager.registerChartHandler(this.getRender(), this.getType(), this); + } + + @Override + public T customFilter(ChartViewDTO view, List filterList, AxisFormatResult formatResult) { + var result = super.customFilter(view, filterList, formatResult); + List drillRequestList = view.getChartExtRequest().getDrill(); + var drillFields = formatResult.getAxisMap().get(ChartAxis.drill); + // 分组维度下钻 + if (ObjectUtils.isNotEmpty(drillRequestList) && (drillFields.size() > drillRequestList.size())) { + List noDrillFilterList = filterList + .stream() + .filter(ele -> ele.getFilterType() != 1) + .collect(Collectors.toList()); + var noDrillFieldAxis = formatResult.getAxisMap().get(ChartAxis.xAxis) + .stream() + .filter(ele -> ele.getSource() != FieldSource.DRILL) + .collect(Collectors.toList()); + List drillFilters = new ArrayList<>(); + ArrayList fieldsToFilter = new ArrayList<>(); + var xAxisExt = formatResult.getAxisMap().get(ChartAxis.xAxisExt); + if (ObjectUtils.isNotEmpty(xAxisExt) && + Objects.equals(drillFields.get(0).getId(), xAxisExt.get(0).getId())) { + fieldsToFilter.addAll(view.getXAxis()); + groupStackDrill(noDrillFieldAxis, noDrillFilterList, fieldsToFilter, drillFields, drillRequestList); + formatResult.getAxisMap().put(ChartAxis.xAxis, noDrillFieldAxis); + result.setFilterList(noDrillFilterList); + } + } + return (T) result; + } + + @Override + public Map buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) { + boolean isDrill = filterResult + .getFilterList() + .stream() + .anyMatch(ele -> ele.getFilterType() == 1); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var xAxisExt = formatResult.getAxisMap().get(ChartAxis.xAxisExt); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + var drillAxis = xAxis.stream().filter(axis -> FieldSource.DRILL == axis.getSource()).toList(); + var xAxisBase = xAxis.subList(0, xAxis.size() - xAxisExt.size() - drillAxis.size()); + return ChartDataBuild.transBaseGroupDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, view, data, isDrill); + } +} diff --git a/backend/src/main/java/com/stdproject/charts/impl/bar/ProgressBarHandler.java b/backend/src/main/java/com/stdproject/charts/impl/bar/ProgressBarHandler.java new file mode 100644 index 0000000..74f86d4 --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/bar/ProgressBarHandler.java @@ -0,0 +1,47 @@ +package com.stdproject.charts.impl.bar; + +import com.stdproject.utils.ChartDataBuild; +import io.gisbi.extensions.view.dto.AxisFormatResult; +import io.gisbi.extensions.view.dto.ChartAxis; +import io.gisbi.extensions.view.dto.ChartViewDTO; +import io.gisbi.extensions.view.dto.CustomFilterResult; +import lombok.Getter; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +public class ProgressBarHandler extends BarHandler { + @Getter + private String type = "progress-bar"; + + @Override + public void init() { + chartHandlerManager.registerChartHandler(this.getRender(), this.getType(), this); + } + + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var result = super.formatAxis(view); + var yAxis = new ArrayList<>(view.getYAxis()); + yAxis.addAll(view.getYAxisExt()); + yAxis.addAll(view.getExtTooltip()); + result.getAxisMap().put(ChartAxis.yAxis, yAxis); + result.getAxisMap().put(ChartAxis.yAxisExt, view.getYAxisExt()); + return result; + } + + @Override + public Map buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) { + boolean isDrill = filterResult + .getFilterList() + .stream() + .anyMatch(ele -> ele.getFilterType() == 1); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + Map result = ChartDataBuild.transMixChartDataAntV(xAxis, xAxis, new ArrayList<>(), yAxis, view, data, isDrill); + return result; + } +} diff --git a/backend/src/main/java/com/stdproject/charts/impl/bar/RangeBarHandler.java b/backend/src/main/java/com/stdproject/charts/impl/bar/RangeBarHandler.java new file mode 100644 index 0000000..350979d --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/bar/RangeBarHandler.java @@ -0,0 +1,83 @@ +package com.stdproject.charts.impl.bar; + +import com.stdproject.charts.impl.YoyChartHandler; +import com.stdproject.utils.ChartDataBuild; +import io.gisbi.extensions.datasource.model.SQLMeta; +import io.gisbi.extensions.datasource.provider.Provider; +import io.gisbi.extensions.view.dto.*; +import lombok.Getter; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +public class RangeBarHandler extends YoyChartHandler { + @Getter + private final String type = "bar-range"; + + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var result = super.formatAxis(view); + var yAxis = new ArrayList(); + var xAxis = new ArrayList(view.getXAxis()); + var xAxisBase = new ArrayList(view.getXAxis()); + boolean skipBarRange = false; + boolean barRangeDate = false; + if (CollectionUtils.isNotEmpty(view.getYAxis()) && CollectionUtils.isNotEmpty(view.getYAxisExt())) { + ChartViewFieldDTO axis1 = view.getYAxis().get(0); + ChartViewFieldDTO axis2 = view.getYAxisExt().get(0); + + if (StringUtils.equalsIgnoreCase(axis1.getGroupType(), "q") && StringUtils.equalsIgnoreCase(axis2.getGroupType(), "q")) { + yAxis.add(axis1); + yAxis.add(axis2); + } else if (StringUtils.equalsIgnoreCase(axis1.getGroupType(), "d") && axis1.getDeType() == 1 && StringUtils.equalsIgnoreCase(axis2.getGroupType(), "d") && axis2.getDeType() == 1) { + barRangeDate = true; + if (BooleanUtils.isTrue(view.getAggregate())) { + axis1.setSummary("min"); + axis2.setSummary("max"); + yAxis.add(axis1); + yAxis.add(axis2); + } else { + xAxis.add(axis1); + xAxis.add(axis2); + } + } else { + skipBarRange = true; + } + } else { + skipBarRange = true; + } + result.getContext().put("skipBarRange", skipBarRange); + result.getContext().put("barRangeDate", barRangeDate); + result.getAxisMap().put(ChartAxis.xAxis, xAxis); + result.getAxisMap().put(ChartAxis.yAxis, yAxis); + result.getContext().put("xAxisBase", xAxisBase); + return result; + } + + @Override + public Map buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) { + boolean isDrill = filterResult + .getFilterList() + .stream() + .anyMatch(ele -> ele.getFilterType() == 1); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + var xAxisBase = (List) formatResult.getContext().get("xAxisBase"); + var skipBarRange = (boolean) formatResult.getContext().get("skipBarRange"); + var barRangeDate = (boolean) formatResult.getContext().get("barRangeDate"); + Map result = ChartDataBuild.transBarRangeDataAntV(skipBarRange, barRangeDate, xAxisBase, xAxis, yAxis, view, data, isDrill); + return result; + } + + @Override + public T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, Provider provider) { + sqlMeta.setChartType(this.type); + return super.calcChartResult(view, formatResult, filterResult, sqlMap, sqlMeta, provider); + } +} diff --git a/backend/src/main/java/com/stdproject/charts/impl/bar/StackBarHandler.java b/backend/src/main/java/com/stdproject/charts/impl/bar/StackBarHandler.java new file mode 100644 index 0000000..2e48705 --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/bar/StackBarHandler.java @@ -0,0 +1,72 @@ +package com.stdproject.charts.impl.bar; + +import com.stdproject.utils.ChartDataBuild; +import io.gisbi.extensions.view.dto.*; +import lombok.Getter; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +@Component +public class StackBarHandler extends BarHandler { + @Getter + private String type = "bar-stack"; + @Override + public void init() { + chartHandlerManager.registerChartHandler(this.getRender(), "bar-stack", this); + chartHandlerManager.registerChartHandler(this.getRender(), "bar-stack-horizontal", this); + chartHandlerManager.registerChartHandler(this.getRender(), "percentage-bar-stack", this); + chartHandlerManager.registerChartHandler(this.getRender(), "percentage-bar-stack-horizontal", this); + } + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var result = super.formatAxis(view); + var xAxis = result.getAxisMap().get(ChartAxis.xAxis); + xAxis.addAll(view.getExtStack()); + result.getAxisMap().put(ChartAxis.extStack, view.getExtStack()); + return result; + } + @Override + public T customFilter(ChartViewDTO view, List filterList, AxisFormatResult formatResult) { + var result = super.customFilter(view, filterList, formatResult); + List drillRequestList = view.getChartExtRequest().getDrill(); + var drillFields = formatResult.getAxisMap().get(ChartAxis.drill); + // 堆叠维度下钻 + if (ObjectUtils.isNotEmpty(drillRequestList) && (drillFields.size() > drillRequestList.size())) { + List noDrillFilterList = filterList + .stream() + .filter(ele -> ele.getFilterType() != 1) + .collect(Collectors.toList()); + var noDrillFieldAxis = formatResult.getAxisMap().get(ChartAxis.xAxis) + .stream() + .filter(ele -> ele.getSource() != FieldSource.DRILL) + .collect(Collectors.toList()); + List drillFilters = new ArrayList<>(); + ArrayList fieldsToFilter = new ArrayList<>(); + var extStack = formatResult.getAxisMap().get(ChartAxis.extStack); + if (ObjectUtils.isNotEmpty(extStack) && + Objects.equals(drillFields.get(0).getId(), extStack.get(0).getId())) { + fieldsToFilter.addAll(view.getXAxis()); + groupStackDrill(noDrillFieldAxis, noDrillFilterList, fieldsToFilter, drillFields, drillRequestList); + formatResult.getAxisMap().put(ChartAxis.xAxis, noDrillFieldAxis); + result.setFilterList(noDrillFilterList); + } + } + return (T) result; + } + @Override + public Map buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) { + boolean isDrill = filterResult.getFilterList().stream().anyMatch(ele -> ele.getFilterType() == 1); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var extStack = formatResult.getAxisMap().get(ChartAxis.extStack); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + var drillAxis = xAxis.stream().filter(axis -> FieldSource.DRILL == axis.getSource()).toList(); + var xAxisBase = xAxis.subList(0, xAxis.size() - extStack.size() - drillAxis.size()); + return ChartDataBuild.transStackChartDataAntV(xAxisBase, xAxis, yAxis, view, data, extStack, isDrill); + } +} diff --git a/backend/src/main/java/com/stdproject/charts/impl/bar/StackGroupBarHandler.java b/backend/src/main/java/com/stdproject/charts/impl/bar/StackGroupBarHandler.java new file mode 100644 index 0000000..7a5a263 --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/bar/StackGroupBarHandler.java @@ -0,0 +1,85 @@ +package com.stdproject.charts.impl.bar; + +import com.stdproject.utils.ChartDataBuild; +import io.gisbi.extensions.view.dto.*; +import lombok.Getter; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +@Component +public class StackGroupBarHandler extends BarHandler { + @Getter + private String type = "bar-group-stack"; + + @Override + public void init() { + chartHandlerManager.registerChartHandler(this.getRender(), this.getType(), this); + } + + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var result = super.formatAxis(view); + var xAxis = result.getAxisMap().get(ChartAxis.xAxis); + xAxis.addAll(view.getXAxisExt()); + xAxis.addAll(view.getExtStack()); + result.getAxisMap().put(ChartAxis.extStack, view.getExtStack()); + result.getAxisMap().put(ChartAxis.xAxisExt, view.getXAxisExt()); + return result; + } + + @Override + public T customFilter(ChartViewDTO view, List filterList, AxisFormatResult formatResult) { + var result = super.customFilter(view, filterList, formatResult); + List drillRequestList = view.getChartExtRequest().getDrill(); + var drillFields = formatResult.getAxisMap().get(ChartAxis.drill); + // 分组维度下钻 + if (ObjectUtils.isNotEmpty(drillRequestList) && (drillFields.size() > drillRequestList.size())) { + List noDrillFilterList = filterList + .stream() + .filter(ele -> ele.getFilterType() != 1) + .collect(Collectors.toList()); + var noDrillFieldAxis = formatResult.getAxisMap().get(ChartAxis.xAxis) + .stream() + .filter(ele -> ele.getSource() != FieldSource.DRILL) + .collect(Collectors.toList()); + ArrayList fieldsToFilter = new ArrayList<>(); + var xAxisExt = formatResult.getAxisMap().get(ChartAxis.xAxisExt); + var extStack = formatResult.getAxisMap().get(ChartAxis.extStack); + if (ObjectUtils.isNotEmpty(xAxisExt) && ObjectUtils.isNotEmpty(extStack)) { + if (Objects.equals(drillFields.get(0).getId(), xAxisExt.get(0).getId())) { + fieldsToFilter.addAll(view.getXAxis()); + fieldsToFilter.addAll(extStack); + } + if (Objects.equals(drillFields.get(0).getId(), extStack.get(0).getId())) { + fieldsToFilter.addAll(view.getXAxis()); + fieldsToFilter.addAll(xAxisExt); + } + groupStackDrill(noDrillFieldAxis, noDrillFilterList, fieldsToFilter, drillFields, drillRequestList); + formatResult.getAxisMap().put(ChartAxis.xAxis, noDrillFieldAxis); + result.setFilterList(noDrillFilterList); + } + } + return (T) result; + } + + @Override + public Map buildNormalResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) { + boolean isDrill = filterResult + .getFilterList() + .stream() + .anyMatch(ele -> ele.getFilterType() == 1); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var xAxisExt = formatResult.getAxisMap().get(ChartAxis.xAxisExt); + var extStack = formatResult.getAxisMap().get(ChartAxis.extStack); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + var drillAxis = xAxis.stream().filter(axis -> FieldSource.DRILL == axis.getSource()).toList(); + var xAxisBase = xAxis.subList(0, xAxis.size() - xAxisExt.size() - extStack.size() - drillAxis.size()); + return ChartDataBuild.transGroupStackDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, extStack, data, view, isDrill); + } +} diff --git a/backend/src/main/java/com/stdproject/config/WebConfig.java b/backend/src/main/java/com/stdproject/config/WebConfig.java index e26735b..09d5d19 100644 --- a/backend/src/main/java/com/stdproject/config/WebConfig.java +++ b/backend/src/main/java/com/stdproject/config/WebConfig.java @@ -2,11 +2,15 @@ package com.stdproject.config; import cn.hutool.cache.Cache; import cn.hutool.cache.CacheUtil; +import com.stdproject.constant.AuthConstant; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import static com.stdproject.constant.StaticResourceConstants.*; +import static com.stdproject.utils.StaticResourceUtils.ensureBoth; +import static com.stdproject.utils.StaticResourceUtils.ensureSuffix; /** * Web配置类 @@ -39,5 +43,22 @@ public class WebConfig implements WebMvcConfigurer { // 其他静态资源 registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/"); + + String workDir = FILE_PROTOCOL + ensureSuffix(WORK_DIR, FILE_SEPARATOR); + String uploadUrlPattern = ensureBoth(URL_SEPARATOR + UPLOAD_URL_PREFIX, AuthConstant.DE_API_PREFIX, URL_SEPARATOR) + "**"; + registry.addResourceHandler(uploadUrlPattern).addResourceLocations(workDir); + + // map + String mapDir = FILE_PROTOCOL + ensureSuffix(MAP_DIR, FILE_SEPARATOR); + String mapUrlPattern = ensureBoth(MAP_URL, AuthConstant.DE_API_PREFIX, URL_SEPARATOR) + "**"; + registry.addResourceHandler(mapUrlPattern).addResourceLocations(mapDir); + + String geoDir = FILE_PROTOCOL + ensureSuffix(CUSTOM_MAP_DIR, FILE_SEPARATOR); + String geoUrlPattern = ensureBoth(GEO_URL, AuthConstant.DE_API_PREFIX, URL_SEPARATOR) + "**"; + registry.addResourceHandler(geoUrlPattern).addResourceLocations(geoDir); + + String i18nDir = FILE_PROTOCOL + ensureSuffix(I18N_DIR, FILE_SEPARATOR); + String i18nUrlPattern = ensureBoth(I18N_URL, AuthConstant.DE_API_PREFIX, URL_SEPARATOR) + "**"; + registry.addResourceHandler(i18nUrlPattern).addResourceLocations(i18nDir); } } diff --git a/backend/src/main/java/com/stdproject/constant/AuthConstant.java b/backend/src/main/java/com/stdproject/constant/AuthConstant.java new file mode 100644 index 0000000..85a1c68 --- /dev/null +++ b/backend/src/main/java/com/stdproject/constant/AuthConstant.java @@ -0,0 +1,29 @@ +package com.stdproject.constant; + +public class AuthConstant { + + public final static String TOKEN_KEY = "X-DE-TOKEN"; + + public final static String EMBEDDED_TOKEN_KEY = "X-EMBEDDED-TOKEN"; + public final static String APISIX_FLAG_KEY = "APISIX_CHECK"; + + public final static String OIDC_X_USER = "X-Userinfo"; + + public final static String CAS_X_USER = "X-CAS-USER"; + + public final static String DE_API_PREFIX = "/"; + public final static String DE_CASAPI_PREFIX = "/casbi/de2api"; + public final static String DE_OIDCAPI_PREFIX = "/oidcbi/de2api"; + + // public final static String REFRESH_TOKEN_KEY = "X-DE-REFRESH-TOKEN"; + + public final static String USER_IMPORT_ERROR_KEY = "USER-IMPORT-ERROR-KEY"; + + public final static String LINK_TOKEN_KEY = "X-DE-LINK-TOKEN"; + public final static String ASK_TOKEN_KEY = "X-DE-ASK-TOKEN"; + + public final static String DE_EXECUTE_VERSION = "X-DE-EXECUTE-VERSION"; + public final static String DE_LDAP_AUTHORIZATION = "Authorization"; + + +} diff --git a/backend/src/main/java/com/stdproject/constant/StaticResourceConstants.java b/backend/src/main/java/com/stdproject/constant/StaticResourceConstants.java new file mode 100644 index 0000000..642993b --- /dev/null +++ b/backend/src/main/java/com/stdproject/constant/StaticResourceConstants.java @@ -0,0 +1,45 @@ +package com.stdproject.constant; +import java.io.File; + +import static com.stdproject.utils.StaticResourceUtils.ensureSuffix; + +public class StaticResourceConstants { + + public static final String FILE_PROTOCOL = "file:"; + + public static final String FILE_SEPARATOR = File.separator; + + public static final String USER_HOME = getHomeData(); + + public static String WORK_DIR = ensureSuffix(USER_HOME, FILE_SEPARATOR) + "static-resource" + FILE_SEPARATOR; + + public static String MAP_DIR = ensureSuffix(USER_HOME, FILE_SEPARATOR) + "map"; + public static String CUSTOM_MAP_DIR = ensureSuffix(USER_HOME, FILE_SEPARATOR) + "geo"; + public static String APPEARANCE_DIR = ensureSuffix(USER_HOME, FILE_SEPARATOR) + "appearance"; + public static String REPORT_DIR = ensureSuffix(USER_HOME, FILE_SEPARATOR) + "report"; + public static String PLUGIN_DIR = ensureSuffix(USER_HOME, FILE_SEPARATOR) + "plugin"; + public static String I18N_DIR = ensureSuffix(USER_HOME, FILE_SEPARATOR) + "i18n/front"; + + public static String MAP_URL = "/map"; + public static String GEO_URL = "/geo"; + public static String I18N_URL = "/i18n"; + + /** + * Upload prefix. + */ + public final static String UPLOAD_URL_PREFIX = "static-resource"; + + /** + * url separator. + */ + public static final String URL_SEPARATOR = "/"; + + public static String getHomeData() { + return "E:/opt/gisbi2.0/data"; +// if (ModelUtils.isDesktop()) { +// return ConfigUtils.getConfig("gisbi.path.data", "/opt/gisbi2.0/data"); +// } else { +// return "/opt/gisbi2.0/data"; +// } + } +} diff --git a/backend/src/main/java/com/stdproject/utils/StaticResourceUtils.java b/backend/src/main/java/com/stdproject/utils/StaticResourceUtils.java new file mode 100644 index 0000000..c4edfa6 --- /dev/null +++ b/backend/src/main/java/com/stdproject/utils/StaticResourceUtils.java @@ -0,0 +1,96 @@ +package com.stdproject.utils; + +import io.gisbi.utils.LogUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.lang.NonNull; +import org.springframework.util.Assert; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Base64; + +import static com.stdproject.constant.StaticResourceConstants.*; + +public class StaticResourceUtils { + + private final static String FILE_BASE_PATH = USER_HOME + FILE_SEPARATOR + UPLOAD_URL_PREFIX; + + public static String ensureBoth(@NonNull String string, @NonNull String bothfix) { + return ensureBoth(string, bothfix, bothfix); + } + + public static String ensureBoth(@NonNull String string, @NonNull String prefix, + @NonNull String suffix) { + return ensureSuffix(ensurePrefix(string, prefix), suffix); + } + + /** + * Ensures the string contain prefix. + * + * @param string string must not be blank + * @param prefix prefix must not be blank + * @return string contain prefix specified + */ + public static String ensurePrefix(@NonNull String string, @NonNull String prefix) { + Assert.hasText(string, "String must not be blank"); + Assert.hasText(prefix, "Prefix must not be blank"); + + return prefix + StringUtils.removeStart(string, prefix); + } + + + /** + * Ensures the string contain suffix. + * + * @param string string must not be blank + * @param suffix suffix must not be blank + * @return string contain suffix specified + */ + public static String ensureSuffix(@NonNull String string, @NonNull String suffix) { + Assert.hasText(string, "String must not be blank"); + Assert.hasText(suffix, "Suffix must not be blank"); + + return StringUtils.removeEnd(string, suffix) + suffix; + } + + /** + * @param imgFile local storage path + * @return + */ + public static String getImgFileToBase64(String imgFile) { + //Convert the picture file into byte array and encode it with Base64 + InputStream inputStream = null; + byte[] buffer = null; + //Read picture byte array + try { + inputStream = new FileInputStream(FILE_BASE_PATH + FILE_SEPARATOR + imgFile); + int count = 0; + while (count == 0) { + count = inputStream.available(); + } + buffer = new byte[count]; + inputStream.read(buffer); + } catch (IOException e) { + LogUtil.error(e); + } catch (Exception e) { + LogUtil.error(e); + } finally { + if (inputStream != null) { + try { + // Close InputStream + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + // Encode byte array as Base64 + if (buffer != null) { + return Base64.getEncoder().encodeToString(buffer); + } else { + return null; + } + } + +} diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index ffcd210..888b3f8 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -153,7 +153,7 @@ logging: org.hibernate.type.descriptor.sql.BasicBinder: TRACE mybatis-plus: configuration: - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #org.apache.ibatis.logging.nologging.NoLoggingImpl + log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl #org.apache.ibatis.logging.stdout.StdOutImpl #org.apache.ibatis.logging.nologging.NoLoggingImpl springdoc: swagger-ui: enabled: true