diff --git a/backend/src/main/java/com/stdproject/service/manage/DefaultChartHandler.java b/backend/src/main/java/com/stdproject/charts/impl/DefaultChartHandler.java similarity index 99% rename from backend/src/main/java/com/stdproject/service/manage/DefaultChartHandler.java rename to backend/src/main/java/com/stdproject/charts/impl/DefaultChartHandler.java index 63dcbad..4863472 100644 --- a/backend/src/main/java/com/stdproject/service/manage/DefaultChartHandler.java +++ b/backend/src/main/java/com/stdproject/charts/impl/DefaultChartHandler.java @@ -1,8 +1,9 @@ -package com.stdproject.service.manage; +package com.stdproject.charts.impl; import com.beust.jcommander.Strings; import com.stdproject.constant.ChartConstants; import com.stdproject.entity.union.DatasetGroupInfoDTO; +import com.stdproject.service.manage.*; import com.stdproject.service.provider.SQLProvider; import com.stdproject.utils.Utils; import com.stdproject.utils.trans.Dimension2SQLObj; diff --git a/backend/src/main/java/com/stdproject/charts/impl/ExtQuotaChartHandler.java b/backend/src/main/java/com/stdproject/charts/impl/ExtQuotaChartHandler.java index 46e4a77..b5caddc 100644 --- a/backend/src/main/java/com/stdproject/charts/impl/ExtQuotaChartHandler.java +++ b/backend/src/main/java/com/stdproject/charts/impl/ExtQuotaChartHandler.java @@ -1,12 +1,8 @@ package com.stdproject.charts.impl; -import com.stdproject.service.manage.DefaultChartHandler; 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.ChartViewFieldDTO; - -import java.util.ArrayList; public class ExtQuotaChartHandler extends DefaultChartHandler { @Override diff --git a/backend/src/main/java/com/stdproject/charts/impl/YoyChartHandler.java b/backend/src/main/java/com/stdproject/charts/impl/YoyChartHandler.java index 93d9c3a..8aa6dff 100644 --- a/backend/src/main/java/com/stdproject/charts/impl/YoyChartHandler.java +++ b/backend/src/main/java/com/stdproject/charts/impl/YoyChartHandler.java @@ -3,7 +3,6 @@ package com.stdproject.charts.impl; import com.fasterxml.jackson.core.type.TypeReference; import com.stdproject.entity.union.DatasetGroupInfoDTO; -import com.stdproject.service.manage.DefaultChartHandler; import com.stdproject.service.provider.SQLProvider; import com.stdproject.utils.Utils; import com.stdproject.utils.trans.ExtWhere2Str; @@ -20,7 +19,6 @@ import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; -import java.util.stream.Stream; /** * 带同环比计算的图表处理器 diff --git a/backend/src/main/java/com/stdproject/charts/impl/map/HeatMapHandler.java b/backend/src/main/java/com/stdproject/charts/impl/map/HeatMapHandler.java index 10f6eac..ad4e93e 100644 --- a/backend/src/main/java/com/stdproject/charts/impl/map/HeatMapHandler.java +++ b/backend/src/main/java/com/stdproject/charts/impl/map/HeatMapHandler.java @@ -1,6 +1,6 @@ package com.stdproject.charts.impl.map; -import com.stdproject.service.manage.DefaultChartHandler; +import com.stdproject.charts.impl.DefaultChartHandler; import com.stdproject.utils.ChartDataBuild; import io.gisbi.extensions.view.dto.*; import lombok.Getter; diff --git a/backend/src/main/java/com/stdproject/charts/impl/map/SymbolicMapHandler.java b/backend/src/main/java/com/stdproject/charts/impl/map/SymbolicMapHandler.java new file mode 100644 index 0000000..7ac7c28 --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/map/SymbolicMapHandler.java @@ -0,0 +1,195 @@ +package com.stdproject.charts.impl.map; + + +import com.stdproject.charts.impl.GroupChartHandler; +import com.stdproject.constant.ExtFieldConstant; +import com.stdproject.entity.union.DatasetGroupInfoDTO; +import com.stdproject.service.provider.SQLProvider; +import com.stdproject.utils.ChartDataBuild; +import com.stdproject.utils.TableUtils; +import com.stdproject.utils.Utils; +import com.stdproject.utils.trans.Dimension2SQLObj; +import com.stdproject.utils.trans.Field2SQLObj; +import com.stdproject.utils.trans.Quota2SQLObj; +import com.stdproject.utils.trans.Table2SQLObj; +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.model.SQLMeta; +import io.gisbi.extensions.datasource.provider.Provider; +import io.gisbi.extensions.view.dto.*; +import io.gisbi.extensions.view.util.ChartDataUtil; +import io.gisbi.extensions.view.util.FieldUtil; +import io.gisbi.utils.BeanUtils; +import jakarta.annotation.Resource; +import lombok.Getter; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.stream.Collectors; + +@Component +public class SymbolicMapHandler extends GroupChartHandler { +// @Resource +// private DatasetDataManage datasetDataManage; + + @Getter + private String type = "symbolic-map"; + + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var result = super.formatAxis(view); + result.getAxisMap().put(ChartAxis.extBubble, view.getExtBubble()); + return result; + } + + + private Map customBuildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data, List detailFields, List detailData) { + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var extBubble = formatResult.getAxisMap().get(ChartAxis.extBubble); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + return ChartDataBuild.transSymbolicMapNormalWithDetail(view, xAxis, yAxis, extBubble, data, detailFields, detailData); + } + + @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 = Utils.isCrossDs(dsMap); + DatasourceRequest datasourceRequest = new DatasourceRequest(); + datasourceRequest.setIsCross(((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross()); + datasourceRequest.setDsList(dsMap); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var extBubble = formatResult.getAxisMap().get(ChartAxis.extBubble); + var allFields = (List) filterResult.getContext().get("allFields"); + List countField = chartViewManege.transFieldDTO(Collections.singletonList(chartViewManege.createCountField(view.getTableId()))); + List datasetTableFieldDTOList = FieldUtil.transFields(allFields); + SQLMeta sqlMeta1 = new SQLMeta(); + BeanUtils.copyBean(sqlMeta1, sqlMeta); + Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, datasetTableFieldDTOList, crossDs, dsMap, Utils.getParams(datasetTableFieldDTOList), view.getCalParams(), pluginManage); + List yAxis = new ArrayList<>(); + if (!extBubble.isEmpty() && !"*".equals(extBubble.get(0).getGisbiName())) { + yAxis.addAll(extBubble); + } + yAxis.addAll(countField); + datasetTableFieldDTOList.addAll(FieldUtil.transFields(countField)); + formatResult.getAxisMap().put(ChartAxis.yAxis, countField); + Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, datasetTableFieldDTOList, crossDs, dsMap, Utils.getParams(datasetTableFieldDTOList), view.getCalParams(), pluginManage); + String querySql = SQLProvider.createQuerySQL(sqlMeta, true, needOrder, view); + querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap); + datasourceRequest.setQuery(querySql); + logger.debug("calcite chart sql: " + querySql); + List data = (List) provider.fetchResultField(datasourceRequest).get("data"); + // 获取所有字段数据作为数据详情返回 + List detailData = new ArrayList<>(); + List xAxisIds = xAxis.stream().map(ChartViewFieldDTO::getId).toList(); + List detailFields = new ArrayList<>(); + detailFields.addAll(xAxis); + detailFields.addAll(allFields.stream().filter(field -> !xAxisIds.contains(field.getId())).toList()); + if (ObjectUtils.isNotEmpty(detailFields)) { + List allFieldsTmp = FieldUtil.transFields(detailFields); + buildFieldName(sqlMap, allFieldsTmp); + 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, Utils.getParams(allFieldsTmp), null, pluginManage);// todo chartParam从视图里取 + String querySQL; + querySQL = SQLProvider.createQuerySQL(sqlMeta2, false, needOrder, false); + querySQL = provider.rebuildSQL(querySQL, sqlMeta2, crossDs, dsMap); + logger.debug("calcite data preview sql: " + querySQL); + // 调用数据源的calcite获得data + DatasourceRequest datasourceRequest1 = new DatasourceRequest(); + datasourceRequest1.setIsCross(((DatasetGroupInfoDTO) formatResult.getContext().get("dataset")).getIsCross()); + datasourceRequest1.setQuery(querySQL); + datasourceRequest1.setDsList(dsMap); + detailData = (List) provider.fetchResultField(datasourceRequest1).get("data"); + } + //自定义排序 + data = ChartDataUtil.resultCustomSort(xAxis, yAxis, view.getSortPriority(), data); + //数据重组逻辑可重载 + var result = customBuildResult(view, formatResult, filterResult, data, detailFields, detailData); + T calcResult = (T) new ChartCalcDataResult(); + calcResult.setData(result); + calcResult.setContext(filterResult.getContext()); + calcResult.setQuerySql(querySql); + calcResult.setOriginData(data); + formatResult.getAxisMap().put(ChartAxis.yAxis, new ArrayList<>()); + return calcResult; + } + + public void buildFieldName(Map sqlMap, List fields) { + // 获取内层union sql和字段 + List unionFields = (List) sqlMap.get("field"); + for (DatasetTableFieldDTO datasetTableFieldDTO : fields) { + DatasetTableFieldDTO dto = datasetTableFieldManage.selectById(datasetTableFieldDTO.getId()); + if (ObjectUtils.isEmpty(dto)) { + if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_NORMAL)) { + for (DatasetTableFieldDTO fieldDTO : unionFields) { + if (Objects.equals(datasetTableFieldDTO.getDatasetTableId(), fieldDTO.getDatasetTableId()) + && Objects.equals(datasetTableFieldDTO.getOriginName(), fieldDTO.getOriginName())) { + datasetTableFieldDTO.setGisbiName(fieldDTO.getGisbiName()); + datasetTableFieldDTO.setFieldShortName(fieldDTO.getFieldShortName()); + } + } + } + if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_CALC)) { + String gisbiName = TableUtils.fieldNameShort(datasetTableFieldDTO.getId() + "_" + datasetTableFieldDTO.getOriginName()); + datasetTableFieldDTO.setGisbiName(gisbiName); + datasetTableFieldDTO.setFieldShortName(gisbiName); + datasetTableFieldDTO.setDeExtractType(datasetTableFieldDTO.getDeType()); + } + if (Objects.equals(datasetTableFieldDTO.getExtField(), ExtFieldConstant.EXT_GROUP)) { + String gisbiName = TableUtils.fieldNameShort(datasetTableFieldDTO.getId() + "_" + datasetTableFieldDTO.getOriginName()); + datasetTableFieldDTO.setGisbiName(gisbiName); + datasetTableFieldDTO.setFieldShortName(gisbiName); + datasetTableFieldDTO.setDeExtractType(0); + datasetTableFieldDTO.setDeType(0); + datasetTableFieldDTO.setGroupType("d"); + } + } else { + datasetTableFieldDTO.setGisbiName(dto.getGisbiName()); + datasetTableFieldDTO.setFieldShortName(dto.getFieldShortName()); + } + } + } + + + @Override + public ChartViewDTO buildChart(ChartViewDTO view, ChartCalcDataResult calcResult, AxisFormatResult formatResult, CustomFilterResult filterResult) { + var desensitizationList = (Map) filterResult.getContext().get("desensitizationList"); + var allFields = (List) filterResult.getContext().get("allFields"); + var xAxis = formatResult.getAxisMap().get(ChartAxis.xAxis); + var extBubble = formatResult.getAxisMap().get(ChartAxis.extBubble); + // 如果是表格导出查询 则在此处直接就可以返回 + var extStack = formatResult.getAxisMap().get(ChartAxis.extStack); + if (view.getIsExcelExport()) { + Map sourceInfo = ChartDataBuild.transTableNormal(xAxis, extBubble, view, calcResult.getOriginData(), extStack, desensitizationList); + sourceInfo.put("sourceData", calcResult.getOriginData()); + view.setData(sourceInfo); + return view; + } + // 图表组件可再扩展 + Map mapTableNormal = calcResult.getData(); + var drillFilters = filterResult.getFilterList().stream().filter(f -> f.getFilterType() == 1).collect(Collectors.toList()); + var isDrill = CollectionUtils.isNotEmpty(drillFilters); + // 构建结果 + Map dataMap = new TreeMap<>(); + dataMap.putAll(calcResult.getData()); + dataMap.putAll(mapTableNormal); + dataMap.put("sourceFields", allFields); + List chartSeniorAssistDTOS = mergeAssistField(calcResult.getDynamicAssistFields(), calcResult.getAssistData(), calcResult.getDynamicAssistFieldsOriginList(), calcResult.getAssistDataOriginList()); + dataMap.put("dynamicAssistLines", chartSeniorAssistDTOS); + view.setData(dataMap); + view.setSql(Base64.getEncoder().encodeToString(calcResult.getQuerySql().getBytes())); + view.setDrill(isDrill); + view.setDrillFilters(drillFilters); + return view; + } +} diff --git a/backend/src/main/java/com/stdproject/charts/impl/numeric/NumericalChartHandler.java b/backend/src/main/java/com/stdproject/charts/impl/numeric/NumericalChartHandler.java index 9ea76e1..179ed5a 100644 --- a/backend/src/main/java/com/stdproject/charts/impl/numeric/NumericalChartHandler.java +++ b/backend/src/main/java/com/stdproject/charts/impl/numeric/NumericalChartHandler.java @@ -1,7 +1,7 @@ package com.stdproject.charts.impl.numeric; +import com.stdproject.charts.impl.DefaultChartHandler; import com.stdproject.entity.union.DatasetGroupInfoDTO; -import com.stdproject.service.manage.DefaultChartHandler; import com.stdproject.service.provider.SQLProvider; import com.stdproject.utils.ChartDataBuild; import com.stdproject.utils.Utils; diff --git a/backend/src/main/java/com/stdproject/charts/impl/table/PageInfo.java b/backend/src/main/java/com/stdproject/charts/impl/table/PageInfo.java new file mode 100644 index 0000000..d92380b --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/table/PageInfo.java @@ -0,0 +1,10 @@ +package com.stdproject.charts.impl.table; + +import lombok.Data; + +@Data +public class PageInfo { + private Long goPage; + private Long pageSize; + private String dsVersion; +} diff --git a/backend/src/main/java/com/stdproject/charts/impl/table/TableHeatmapHandler.java b/backend/src/main/java/com/stdproject/charts/impl/table/TableHeatmapHandler.java index d4a75a0..766cdd5 100644 --- a/backend/src/main/java/com/stdproject/charts/impl/table/TableHeatmapHandler.java +++ b/backend/src/main/java/com/stdproject/charts/impl/table/TableHeatmapHandler.java @@ -1,8 +1,8 @@ package com.stdproject.charts.impl.table; +import com.stdproject.charts.impl.DefaultChartHandler; import com.stdproject.entity.union.DatasetGroupInfoDTO; -import com.stdproject.service.manage.DefaultChartHandler; import com.stdproject.service.provider.SQLProvider; import com.stdproject.utils.ChartDataBuild; import com.stdproject.utils.Utils; diff --git a/backend/src/main/java/com/stdproject/charts/impl/table/TableInfoHandler.java b/backend/src/main/java/com/stdproject/charts/impl/table/TableInfoHandler.java new file mode 100644 index 0000000..36651f7 --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/table/TableInfoHandler.java @@ -0,0 +1,188 @@ +package com.stdproject.charts.impl.table; + + +import com.stdproject.charts.impl.DefaultChartHandler; +import com.stdproject.entity.union.DatasetGroupInfoDTO; +import com.stdproject.service.provider.SQLProvider; +import com.stdproject.utils.Utils; +import com.stdproject.utils.trans.Dimension2SQLObj; +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 io.gisbi.extensions.view.util.ChartDataUtil; +import io.gisbi.extensions.view.util.FieldUtil; +import io.gisbi.utils.BeanUtils; +import lombok.Getter; +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.*; +import java.util.stream.Collectors; + +@Component +public class TableInfoHandler extends DefaultChartHandler { + @Getter + private String type = "table-info"; + + @Override + public AxisFormatResult formatAxis(ChartViewDTO view) { + var result = super.formatAxis(view); + result.getAxisMap().put(ChartAxis.yAxis, new ArrayList<>()); + return result; + } + + @Override + public T customFilter(ChartViewDTO view, List filterList, AxisFormatResult formatResult) { + var chartExtRequest = view.getChartExtRequest(); + Map mapAttr = view.getCustomAttr(); + Map mapSize = (Map) mapAttr.get("basicStyle"); + var tablePageMode = (String) mapSize.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) mapSize.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); + } + } + return (T) new CustomFilterResult(filterList, formatResult.getContext()); + } + + @Override + public Map buildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) { + return new HashMap<>(); + } + + @Override + public T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, Provider provider) { + var chartExtRequest = view.getChartExtRequest(); + var dsMap = (Map) sqlMap.get("dsMap"); + List dsList = new ArrayList<>(); + for (Map.Entry next : dsMap.entrySet()) { + dsList.add(next.getValue().getType()); + } + 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 allFields = (List) 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); + if (view.getIsExcelExport()) { + for (int i = 0; i < xAxis.size(); i++) { + ChartViewFieldDTO fieldDTO = null; + for (ChartViewFieldDTO allField : allFields) { + if (allField.getId().equals(xAxis.get(i).getId())) { + fieldDTO = allField; + } + } + if (fieldDTO != null && fieldDTO.isAgg()) { + sqlMeta.getXFields().get(i).setFieldName("'-'"); + } + } + } + + String originSql = SQLProvider.createQuerySQL(sqlMeta, false, !StringUtils.equalsIgnoreCase(dsMap.entrySet().iterator().next().getValue().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, false, 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 tmpData = (List) 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 data = (List) provider.fetchResultField(datasourceRequest).get("data"); + //自定义排序 + data = ChartDataUtil.resultCustomSort(xAxis, Collections.emptyList(), view.getSortPriority(), 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); + Set fieldIds = xAxis.stream().map(ChartViewFieldDTO::getId).collect(Collectors.toSet()); + List finalXAxis = xAxis; + dynamicAssistFields.forEach(i -> { + if (!fieldIds.contains(i.getFieldId())) { + ChartViewFieldDTO fieldDTO = new ChartViewFieldDTO(); + BeanUtils.copyBean(fieldDTO, i.getCurField()); + finalXAxis.add(fieldDTO); + } + }); + var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis); + var assistFields = getAssistFields(dynamicAssistFields, yAxis, xAxis); + if (CollectionUtils.isNotEmpty(assistFields)) { + var req = new DatasourceRequest(); + 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); + var tmpSql = provider.rebuildSQL(assistSql, sqlMeta, crossDs, dsMap); + req.setQuery(tmpSql); + logger.debug("calcite assistSql sql: " + tmpSql); + var assistData = (List) provider.fetchResultField(req).get("data"); + calcResult.setAssistData(assistData); + calcResult.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); + var tmpSql = provider.rebuildSQL(assistSqlOriginList, sqlMeta, crossDs, dsMap); + req.setQuery(tmpSql); + logger.debug("calcite assistSql sql origin list: " + tmpSql); + var assistDataOriginList = (List) provider.fetchResultField(req).get("data"); + calcResult.setAssistDataOriginList(assistDataOriginList); + calcResult.setDynamicAssistFieldsOriginList(assistsOriginList); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return calcResult; + } +} diff --git a/backend/src/main/java/com/stdproject/charts/impl/table/TableNormalHandler.java b/backend/src/main/java/com/stdproject/charts/impl/table/TableNormalHandler.java new file mode 100644 index 0000000..b757770 --- /dev/null +++ b/backend/src/main/java/com/stdproject/charts/impl/table/TableNormalHandler.java @@ -0,0 +1,212 @@ +package com.stdproject.charts.impl.table; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.stdproject.charts.impl.DefaultChartHandler; +import com.stdproject.entity.union.DatasetGroupInfoDTO; +import com.stdproject.service.provider.SQLProvider; +import com.stdproject.utils.Utils; +import com.stdproject.utils.trans.Dimension2SQLObj; +import com.stdproject.utils.trans.ExtWhere2Str; +import com.stdproject.utils.trans.Quota2SQLObj; +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 io.gisbi.extensions.view.util.ChartDataUtil; +import io.gisbi.extensions.view.util.FieldUtil; +import io.gisbi.utils.JsonUtil; +import lombok.Getter; +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.*; + +/** + * @author jianneng + * @date 2024/9/11 11:37 + **/ +@Component +public class TableNormalHandler extends DefaultChartHandler { + @Getter + private final String type = "table-normal"; + + @Override + public T customFilter(ChartViewDTO view, List filterList, AxisFormatResult formatResult) { + var chartExtRequest = view.getChartExtRequest(); + Map mapAttr = view.getCustomAttr(); + Map basicStyle = (Map) 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 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 buildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List data) { + return new HashMap<>(); + } + + @Override + public T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map sqlMap, SQLMeta sqlMeta, Provider provider) { + var chartExtRequest = view.getChartExtRequest(); + var dsMap = (Map) sqlMap.get("dsMap"); + List dsList = new ArrayList<>(); + for (Map.Entry next : dsMap.entrySet()) { + dsList.add(next.getValue().getType()); + } + 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 allFields = (List) 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 tmpData = (List) 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 data = (List) 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) 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) provider.fetchResultField(expandedReq).get("data"); + logger.debug("expanded data: " + expandedData); + quickCalc(xAxis, yAxis, Collections.emptyList(), Collections.emptyList(), view.getType(), expandedData); + var resultData = new ArrayList(); + 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)) { + 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); + var tmpSql = provider.rebuildSQL(assistSql, sqlMeta, crossDs, dsMap); + req.setQuery(tmpSql); + logger.debug("calcite assistSql sql: " + tmpSql); + var assistData = (List) provider.fetchResultField(req).get("data"); + calcResult.setAssistData(assistData); + calcResult.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); + var tmpSql = provider.rebuildSQL(assistSqlOriginList, sqlMeta, crossDs, dsMap); + req.setQuery(tmpSql); + logger.debug("calcite assistSql sql origin list: " + tmpSql); + var assistDataOriginList = (List) provider.fetchResultField(req).get("data"); + calcResult.setAssistDataOriginList(assistDataOriginList); + calcResult.setDynamicAssistFieldsOriginList(assistsOriginList); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return calcResult; + } +} diff --git a/backend/src/main/java/com/stdproject/controller/CoreSysSettingController.java b/backend/src/main/java/com/stdproject/controller/CoreSysSettingController.java new file mode 100644 index 0000000..5e32993 --- /dev/null +++ b/backend/src/main/java/com/stdproject/controller/CoreSysSettingController.java @@ -0,0 +1,26 @@ +package com.stdproject.controller; + +import com.stdproject.config.ResponseResult; +import com.stdproject.request.OnlineMapEditor; +import com.stdproject.service.manage.SysParameterManage; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Date: 2025/7/7 16:57 + * @Description: + */ +@RestController +@RequestMapping("/sysParameter") +public class CoreSysSettingController { + @Resource + private SysParameterManage sysParameterManage; + @Operation(summary = "查询在线地图") + @GetMapping("/queryOnlineMap") + public ResponseResult queryOnlineMap(){ + return ResponseResult.successData(sysParameterManage.queryOnlineMap(null)); + } +} diff --git a/backend/src/main/java/com/stdproject/entity/CoreSysSetting.java b/backend/src/main/java/com/stdproject/entity/CoreSysSetting.java new file mode 100644 index 0000000..8362f72 --- /dev/null +++ b/backend/src/main/java/com/stdproject/entity/CoreSysSetting.java @@ -0,0 +1,95 @@ +package com.stdproject.entity; + +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @Author bi-coder + * @since 2023-10-27 + */ +@TableName("core_sys_setting") +public class CoreSysSetting implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + private Long id; + + /** + * 键 + */ + private String pkey; + + /** + * 值 + */ + private String pval; + + /** + * 类型 + */ + private String type; + + /** + * 顺序 + */ + private Integer sort; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPkey() { + return pkey; + } + + public void setPkey(String pkey) { + this.pkey = pkey; + } + + public String getPval() { + return pval; + } + + public void setPval(String pval) { + this.pval = pval; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + @Override + public String toString() { + return "CoreSysSetting{" + + "id = " + id + + ", pkey = " + pkey + + ", pval = " + pval + + ", type = " + type + + ", sort = " + sort + + "}"; + } +} diff --git a/backend/src/main/java/com/stdproject/mapper/CoreSysSettingMapper.java b/backend/src/main/java/com/stdproject/mapper/CoreSysSettingMapper.java new file mode 100644 index 0000000..93ea913 --- /dev/null +++ b/backend/src/main/java/com/stdproject/mapper/CoreSysSettingMapper.java @@ -0,0 +1,18 @@ +package com.stdproject.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.stdproject.entity.CoreSysSetting; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @Author bi-coder + * @since 2023-10-27 + */ +@Mapper +public interface CoreSysSettingMapper extends BaseMapper { + +} diff --git a/backend/src/main/java/com/stdproject/mapper/MenuMapper.java b/backend/src/main/java/com/stdproject/mapper/MenuMapper.java index 5c82137..2200d05 100644 --- a/backend/src/main/java/com/stdproject/mapper/MenuMapper.java +++ b/backend/src/main/java/com/stdproject/mapper/MenuMapper.java @@ -19,4 +19,7 @@ public interface MenuMapper extends BaseMapper { @Select("") List listMenuByIds(@Param("menuIds") List menuIds); + @Select("") + List listAllMenu(); + } diff --git a/backend/src/main/java/com/stdproject/request/OnlineMapEditor.java b/backend/src/main/java/com/stdproject/request/OnlineMapEditor.java new file mode 100644 index 0000000..03c56d6 --- /dev/null +++ b/backend/src/main/java/com/stdproject/request/OnlineMapEditor.java @@ -0,0 +1,17 @@ +package com.stdproject.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +@Schema(description = "在线地图构造器") +@Data +public class OnlineMapEditor implements Serializable { + @Schema(description = "在线地图类型", requiredMode = Schema.RequiredMode.REQUIRED) + private String mapType; + @Schema(description = "在线地图key", requiredMode = Schema.RequiredMode.REQUIRED) + private String key; + @Schema(description = "在线地图安全密钥", requiredMode = Schema.RequiredMode.NOT_REQUIRED) + private String securityCode; +} diff --git a/backend/src/main/java/com/stdproject/service/CustomUserDetailsService.java b/backend/src/main/java/com/stdproject/service/CustomUserDetailsService.java index 2281292..39cfae1 100644 --- a/backend/src/main/java/com/stdproject/service/CustomUserDetailsService.java +++ b/backend/src/main/java/com/stdproject/service/CustomUserDetailsService.java @@ -1,5 +1,6 @@ package com.stdproject.service; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.stdproject.entity.LoginUser; import com.stdproject.entity.Menu; import com.stdproject.entity.Role; @@ -51,9 +52,9 @@ public class CustomUserDetailsService implements UserDetailsService { if (appUser == null) { throw new UsernameNotFoundException("用户不存在: " + username); } - String app_name=applicationMapper.getAppName(appUser.getAppId()); + String app_name = applicationMapper.getAppName(appUser.getAppId()); Set permissions = buildUserAuthorities(appUser); - LoginUser loginUser = new LoginUser(appUser,app_name,permissions); + LoginUser loginUser = new LoginUser(appUser, app_name, permissions); return loginUser; @@ -67,22 +68,26 @@ public class CustomUserDetailsService implements UserDetailsService { */ private Set buildUserAuthorities(User appUser) { Set permissions = new HashSet<>(); - try { + if (("admin").equals(appUser.getUsername())) { + List menus = menuMapper.listAllMenu(); + permissions.addAll(menus); + return permissions; + } // 使用RoleMapper直接查询用户的角色信息 List roles = roleMapper.getRoleByUserId(appUser.getId()); if (!roles.isEmpty()) { // 获取角色ID列表 List roleIds = roles.stream() - .map(Role::getId) - .collect(Collectors.toList()); - + .map(Role::getId) + .collect(Collectors.toList()); + // 处理每个角色的菜单权限 for (String roleId : roleIds) { // 使用MenuMapper直接查询角色关联的菜单ID List menuIds = menuMapper.selectMenuByRoleId(appUser.getAppId(), roleId); - + if (!menuIds.isEmpty()) { // 查询菜单信息并添加菜单权限 List menus = menuMapper.listMenuByIds(menuIds); @@ -91,14 +96,12 @@ public class CustomUserDetailsService implements UserDetailsService { } } - } catch (Exception e) { log.error("构建用户权限失败: {}", e.getMessage(), e); permissions.clear(); } - + return permissions; } - -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/stdproject/service/manage/ChartHandlerManager.java b/backend/src/main/java/com/stdproject/service/manage/ChartHandlerManager.java index f973c53..802f947 100644 --- a/backend/src/main/java/com/stdproject/service/manage/ChartHandlerManager.java +++ b/backend/src/main/java/com/stdproject/service/manage/ChartHandlerManager.java @@ -1,4 +1,5 @@ package com.stdproject.service.manage; +import com.stdproject.charts.impl.DefaultChartHandler; import io.gisbi.extensions.view.plugin.AbstractChartPlugin; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; diff --git a/backend/src/main/java/com/stdproject/service/manage/SysParameterManage.java b/backend/src/main/java/com/stdproject/service/manage/SysParameterManage.java new file mode 100644 index 0000000..05651e3 --- /dev/null +++ b/backend/src/main/java/com/stdproject/service/manage/SysParameterManage.java @@ -0,0 +1,159 @@ +package com.stdproject.service.manage; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.stdproject.entity.CoreSysSetting; +import com.stdproject.mapper.CoreSysSettingMapper; +import com.stdproject.request.OnlineMapEditor; +import io.gisbi.utils.BeanUtils; +import io.gisbi.utils.IDUtils; +import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Component +public class SysParameterManage { + + @Value("${gisbi.show-demo-tips:false}") + private boolean showDemoTips; + + @Value("${gisbi.demo-tips-content:#{null}}") + private String demoTipsContent; + + private static final String MAP_KEY_PREFIX = "map."; + + @Resource + private CoreSysSettingMapper coreSysSettingMapper; + + + public String singleVal(String key) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("pkey", key); + CoreSysSetting sysSetting = coreSysSettingMapper.selectOne(queryWrapper); + if (ObjectUtils.isNotEmpty(sysSetting)) { + return sysSetting.getPval(); + } + return null; + } + + public OnlineMapEditor queryOnlineMap(String mapType) { + if (StringUtils.isBlank(mapType)) { + List 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(); + List fields = BeanUtils.getFieldNames(OnlineMapEditor.class); + Map mapVal = groupVal(prefix); + fields.forEach(field -> { + String val = mapVal.get(prefix + field); + if (StringUtils.isNotBlank(val)) { + BeanUtils.setFieldValueByName(editor, field, val, String.class); + } + }); + + editor.setMapType(mapType); + + return editor; + } + + public void saveOnlineMap(OnlineMapEditor editor) { + String mapType = editor.getMapType(); + if (StringUtils.isBlank(mapType)) { + List typeList = groupList(MAP_KEY_PREFIX + "mapType"); + mapType = "gaode"; + if (!CollectionUtils.isEmpty(typeList)) { + mapType = typeList.getFirst().getPval(); + } + } + + List fieldNames = BeanUtils.getFieldNames(OnlineMapEditor.class); + String finalMapType = mapType; + fieldNames.forEach(field -> { + String prefix = MAP_KEY_PREFIX; + if (!(StringUtils.equals(field, "mapType") || StringUtils.equals(finalMapType, "gaode"))) { + prefix = finalMapType + "." + MAP_KEY_PREFIX; + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("pkey", prefix + field); + CoreSysSetting sysSetting = coreSysSettingMapper.selectOne(queryWrapper); + var val = (String) BeanUtils.getFieldValueByName(field, editor); + if (ObjectUtils.isEmpty(sysSetting)) { + sysSetting = new CoreSysSetting(); + sysSetting.setId(IDUtils.snowID()); + sysSetting.setPkey(prefix + field); + sysSetting.setPval(val == null ? "" : val); + sysSetting.setType("text"); + sysSetting.setSort(1); + coreSysSettingMapper.insert(sysSetting); + return; + } + sysSetting.setPval(val); + coreSysSettingMapper.updateById(sysSetting); + }); + } + + + public Map groupVal(String groupKey) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.likeRight("pkey", groupKey); + queryWrapper.orderByAsc("sort"); + List sysSettings = coreSysSettingMapper.selectList(queryWrapper); + if (!CollectionUtils.isEmpty(sysSettings)) { + return sysSettings.stream().collect(Collectors.toMap(CoreSysSetting::getPkey, CoreSysSetting::getPval)); + } + return new HashMap<>(); + } + + public List groupList(String groupKey) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.likeRight("pkey", groupKey); + queryWrapper.orderByAsc("sort"); + return coreSysSettingMapper.selectList(queryWrapper); + } + + + + public List getUiList() { + List result = new ArrayList<>(); + result.add(buildSettingItem("community", true)); + result.add(buildSettingItem("showDemoTips", showDemoTips)); + result.add(buildSettingItem("demoTipsContent", demoTipsContent)); + return result; + } + + + public Integer defaultLogin() { + return 0; + } + + private Map buildSettingItem(String pkey, Object pval) { + Map item = new HashMap<>(); + item.put("pkey", pkey); + item.put("pval", pval); + return item; + } + + + public void insert(CoreSysSetting coreSysSetting) { + coreSysSettingMapper.insert(coreSysSetting); + } + +} diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 888b3f8..718c7a9 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -19,7 +19,7 @@ spring: main: allow-bean-definition-overriding: true datasource: - url: ${DB_URL:jdbc:mysql://192.168.1.58:3306/gisbi-demodb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true} + url: ${DB_URL:jdbc:mysql://192.168.1.58:3306/gis_test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true} username: ${DB_USERNAME:root} password: ${DB_PASSWORD:123456} driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/backend/src/main/resources/mybatis/ExtVisualizationLinkJumpMapper.xml b/backend/src/main/resources/mybatis/ExtVisualizationLinkJumpMapper.xml index 458b11b..85e0bda 100644 --- a/backend/src/main/resources/mybatis/ExtVisualizationLinkJumpMapper.xml +++ b/backend/src/main/resources/mybatis/ExtVisualizationLinkJumpMapper.xml @@ -108,5 +108,47 @@ and ccv.jump_active = 1 - + diff --git a/frontend/components.d.ts b/frontend/components.d.ts index ec78696..842ad5f 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -35,6 +35,7 @@ declare module '@vue/runtime-core' { ElMain: typeof import('element-plus-secondary/es')['ElMain'] ElOption: typeof import('element-plus-secondary/es')['ElOption'] ElOptionGroup: typeof import('element-plus-secondary/es')['ElOptionGroup'] + ElPagination: typeof import('element-plus-secondary/es')['ElPagination'] ElPopover: typeof import('element-plus-secondary/es')['ElPopover'] ElRadio: typeof import('element-plus-secondary/es')['ElRadio'] ElRadioGroup: typeof import('element-plus-secondary/es')['ElRadioGroup'] @@ -44,6 +45,7 @@ declare module '@vue/runtime-core' { ElSelectV2: typeof import('element-plus-secondary/es')['ElSelectV2'] ElSpace: typeof import('element-plus-secondary/es')['ElSpace'] ElSwitch: typeof import('element-plus-secondary/es')['ElSwitch'] + ElTableColumn: typeof import('element-plus-secondary/es')['ElTableColumn'] ElTabPane: typeof import('element-plus-secondary/es')['ElTabPane'] ElTabs: typeof import('element-plus-secondary/es')['ElTabs'] ElTimePicker: typeof import('element-plus-secondary/es')['ElTimePicker']