feat: 新增charts图表逻辑
新增和修改图标handler处理器逻辑,优化admin用户登录没有权限问题
This commit is contained in:
parent
697dfb97c6
commit
1a9718050f
@ -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;
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
* 带同环比计算的图表处理器
|
||||
|
@ -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;
|
||||
|
@ -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<String, Object> customBuildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List<String[]> data, List<ChartViewFieldDTO> detailFields, List<String[]> 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 extends ChartCalcDataResult> T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, Provider provider) {
|
||||
var dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
|
||||
List<String> dsList = new ArrayList<>();
|
||||
for (Map.Entry<Long, DatasourceSchemaDTO> next : dsMap.entrySet()) {
|
||||
dsList.add(next.getValue().getType());
|
||||
}
|
||||
boolean needOrder = Utils.isNeedOrder(dsList);
|
||||
boolean crossDs = Utils.isCrossDs(dsMap);
|
||||
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<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
|
||||
List<ChartViewFieldDTO> countField = chartViewManege.transFieldDTO(Collections.singletonList(chartViewManege.createCountField(view.getTableId())));
|
||||
List<DatasetTableFieldDTO> 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<ChartViewFieldDTO> 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<String[]> data = (List<String[]>) provider.fetchResultField(datasourceRequest).get("data");
|
||||
// 获取所有字段数据作为数据详情返回
|
||||
List<String[]> detailData = new ArrayList<>();
|
||||
List<Long> xAxisIds = xAxis.stream().map(ChartViewFieldDTO::getId).toList();
|
||||
List<ChartViewFieldDTO> detailFields = new ArrayList<>();
|
||||
detailFields.addAll(xAxis);
|
||||
detailFields.addAll(allFields.stream().filter(field -> !xAxisIds.contains(field.getId())).toList());
|
||||
if (ObjectUtils.isNotEmpty(detailFields)) {
|
||||
List<DatasetTableFieldDTO> 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<String[]>) 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<String, Object> sqlMap, List<DatasetTableFieldDTO> fields) {
|
||||
// 获取内层union sql和字段
|
||||
List<DatasetTableFieldDTO> unionFields = (List<DatasetTableFieldDTO>) 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<String, ColumnPermissionItem>) filterResult.getContext().get("desensitizationList");
|
||||
var allFields = (List<ChartViewFieldDTO>) 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<String, Object> sourceInfo = ChartDataBuild.transTableNormal(xAxis, extBubble, view, calcResult.getOriginData(), extStack, desensitizationList);
|
||||
sourceInfo.put("sourceData", calcResult.getOriginData());
|
||||
view.setData(sourceInfo);
|
||||
return view;
|
||||
}
|
||||
// 图表组件可再扩展
|
||||
Map<String, Object> mapTableNormal = calcResult.getData();
|
||||
var drillFilters = filterResult.getFilterList().stream().filter(f -> f.getFilterType() == 1).collect(Collectors.toList());
|
||||
var isDrill = CollectionUtils.isNotEmpty(drillFilters);
|
||||
// 构建结果
|
||||
Map<String, Object> dataMap = new TreeMap<>();
|
||||
dataMap.putAll(calcResult.getData());
|
||||
dataMap.putAll(mapTableNormal);
|
||||
dataMap.put("sourceFields", allFields);
|
||||
List<ChartSeniorAssistDTO> 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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
|
@ -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 extends CustomFilterResult> T customFilter(ChartViewDTO view, List<ChartExtFilterDTO> filterList, AxisFormatResult formatResult) {
|
||||
var chartExtRequest = view.getChartExtRequest();
|
||||
Map<String, Object> mapAttr = view.getCustomAttr();
|
||||
Map<String, Object> mapSize = (Map<String, Object>) 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<String, Object> buildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List<String[]> data) {
|
||||
return new HashMap<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends ChartCalcDataResult> T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, Provider provider) {
|
||||
var chartExtRequest = view.getChartExtRequest();
|
||||
var dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
|
||||
List<String> dsList = new ArrayList<>();
|
||||
for (Map.Entry<Long, DatasourceSchemaDTO> 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<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
|
||||
PageInfo pageInfo = new PageInfo();
|
||||
pageInfo.setGoPage(chartExtRequest.getGoPage());
|
||||
if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
|
||||
pageInfo.setPageSize(Math.min(view.getResultCount() - (chartExtRequest.getGoPage() - 1) * chartExtRequest.getPageSize(), chartExtRequest.getPageSize()));
|
||||
} else {
|
||||
pageInfo.setPageSize(chartExtRequest.getPageSize());
|
||||
}
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
|
||||
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<String[]> tmpData = (List<String[]>) provider.fetchResultField(datasourceRequest).get("data");
|
||||
var totalItems = ObjectUtils.isEmpty(tmpData) ? 0 : Long.valueOf(tmpData.get(0)[0]);
|
||||
if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
|
||||
totalItems = totalItems <= view.getResultCount() ? totalItems : view.getResultCount();
|
||||
}
|
||||
var totalPage = (totalItems / pageInfo.getPageSize()) + (totalItems % pageInfo.getPageSize() > 0 ? 1 : 0);
|
||||
view.setTotalItems(totalItems);
|
||||
view.setTotalPage(totalPage);
|
||||
}
|
||||
|
||||
querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap);
|
||||
datasourceRequest.setQuery(querySql);
|
||||
logger.debug("calcite chart sql: " + querySql);
|
||||
List<String[]> data = (List<String[]>) provider.fetchResultField(datasourceRequest).get("data");
|
||||
//自定义排序
|
||||
data = ChartDataUtil.resultCustomSort(xAxis, 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<Long> fieldIds = xAxis.stream().map(ChartViewFieldDTO::getId).collect(Collectors.toSet());
|
||||
List<ChartViewFieldDTO> 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<ChartSeniorAssistDTO> 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<String[]>) provider.fetchResultField(req).get("data");
|
||||
calcResult.setAssistData(assistData);
|
||||
calcResult.setDynamicAssistFields(assists);
|
||||
}
|
||||
|
||||
List<ChartSeniorAssistDTO> assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
|
||||
if (ObjectUtils.isNotEmpty(assistsOriginList)) {
|
||||
var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
|
||||
var tmpSql = provider.rebuildSQL(assistSqlOriginList, sqlMeta, crossDs, dsMap);
|
||||
req.setQuery(tmpSql);
|
||||
logger.debug("calcite assistSql sql origin list: " + tmpSql);
|
||||
var assistDataOriginList = (List<String[]>) provider.fetchResultField(req).get("data");
|
||||
calcResult.setAssistDataOriginList(assistDataOriginList);
|
||||
calcResult.setDynamicAssistFieldsOriginList(assistsOriginList);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return calcResult;
|
||||
}
|
||||
}
|
@ -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 extends CustomFilterResult> T customFilter(ChartViewDTO view, List<ChartExtFilterDTO> filterList, AxisFormatResult formatResult) {
|
||||
var chartExtRequest = view.getChartExtRequest();
|
||||
Map<String, Object> mapAttr = view.getCustomAttr();
|
||||
Map<String, Object> basicStyle = (Map<String, Object>) mapAttr.get("basicStyle");
|
||||
var tablePageMode = (String) basicStyle.get("tablePageMode");
|
||||
formatResult.getContext().put("tablePageMode", tablePageMode);
|
||||
if (StringUtils.equalsIgnoreCase(tablePageMode, "page")) {
|
||||
if (chartExtRequest.getGoPage() == null) {
|
||||
chartExtRequest.setGoPage(1L);
|
||||
}
|
||||
if (chartExtRequest.getPageSize() == null) {
|
||||
int pageSize = (int) basicStyle.get("tablePageSize");
|
||||
if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
|
||||
chartExtRequest.setPageSize(Math.min(pageSize, view.getResultCount().longValue()));
|
||||
} else {
|
||||
chartExtRequest.setPageSize((long) pageSize);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
|
||||
chartExtRequest.setGoPage(1L);
|
||||
chartExtRequest.setPageSize(view.getResultCount().longValue());
|
||||
} else if (!view.getIsExcelExport()) {
|
||||
chartExtRequest.setGoPage(null);
|
||||
chartExtRequest.setPageSize(null);
|
||||
}
|
||||
}
|
||||
var yAxis = formatResult.getAxisMap().get(ChartAxis.yAxis);
|
||||
String originFilterJson = (String) JsonUtil.toJSONString(filterList);
|
||||
List<ChartExtFilterDTO> originFilter = JsonUtil.parseList(originFilterJson, new TypeReference<>() {
|
||||
});
|
||||
boolean yoyFiltered = checkYoyFilter(originFilter, yAxis);
|
||||
if (yoyFiltered) {
|
||||
formatResult.getContext().put("expandedFilter", originFilter);
|
||||
formatResult.getContext().put("yoyFiltered", true);
|
||||
}
|
||||
return (T) new CustomFilterResult(filterList, formatResult.getContext());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> buildResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, List<String[]> data) {
|
||||
return new HashMap<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends ChartCalcDataResult> T calcChartResult(ChartViewDTO view, AxisFormatResult formatResult, CustomFilterResult filterResult, Map<String, Object> sqlMap, SQLMeta sqlMeta, Provider provider) {
|
||||
var chartExtRequest = view.getChartExtRequest();
|
||||
var dsMap = (Map<Long, DatasourceSchemaDTO>) sqlMap.get("dsMap");
|
||||
List<String> dsList = new ArrayList<>();
|
||||
for (Map.Entry<Long, DatasourceSchemaDTO> 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<ChartViewFieldDTO>) filterResult.getContext().get("allFields");
|
||||
PageInfo pageInfo = new PageInfo();
|
||||
pageInfo.setGoPage(chartExtRequest.getGoPage());
|
||||
if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
|
||||
pageInfo.setPageSize(Math.min(view.getResultCount() - (chartExtRequest.getGoPage() - 1) * chartExtRequest.getPageSize(), chartExtRequest.getPageSize()));
|
||||
} else {
|
||||
pageInfo.setPageSize(chartExtRequest.getPageSize());
|
||||
}
|
||||
Dimension2SQLObj.dimension2sqlObj(sqlMeta, xAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
|
||||
Quota2SQLObj.quota2sqlObj(sqlMeta, yAxis, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
|
||||
String originSql = SQLProvider.createQuerySQL(sqlMeta, true, !StringUtils.equalsIgnoreCase(dsMap.values().iterator().next().getType(), "es"), view);// 分页强制加排序
|
||||
String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " OFFSET " + (pageInfo.getGoPage() - 1) * chartExtRequest.getPageSize() : "");
|
||||
var querySql = originSql + limit;
|
||||
|
||||
var tablePageMode = (String) filterResult.getContext().get("tablePageMode");
|
||||
var totalPageSql = "SELECT COUNT(*) FROM (" + SQLProvider.createQuerySQLNoSort(sqlMeta, true, view) + ") COUNT_TEMP";
|
||||
if (StringUtils.isNotEmpty(totalPageSql) && StringUtils.equalsIgnoreCase(tablePageMode, "page")) {
|
||||
totalPageSql = provider.rebuildSQL(totalPageSql, sqlMeta, crossDs, dsMap);
|
||||
datasourceRequest.setQuery(totalPageSql);
|
||||
datasourceRequest.setTotalPageFlag(true);
|
||||
logger.debug("calcite total sql: " + totalPageSql);
|
||||
List<String[]> tmpData = (List<String[]>) provider.fetchResultField(datasourceRequest).get("data");
|
||||
var totalItems = ObjectUtils.isEmpty(tmpData) ? 0 : Long.valueOf(tmpData.get(0)[0]);
|
||||
if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) {
|
||||
totalItems = totalItems <= view.getResultCount() ? totalItems : view.getResultCount();
|
||||
}
|
||||
var totalPage = (totalItems / pageInfo.getPageSize()) + (totalItems % pageInfo.getPageSize() > 0 ? 1 : 0);
|
||||
view.setTotalItems(totalItems);
|
||||
view.setTotalPage(totalPage);
|
||||
}
|
||||
|
||||
querySql = provider.rebuildSQL(querySql, sqlMeta, crossDs, dsMap);
|
||||
datasourceRequest.setQuery(querySql);
|
||||
logger.debug("calcite chart sql: " + querySql);
|
||||
List<String[]> data = (List<String[]>) provider.fetchResultField(datasourceRequest).get("data");
|
||||
//自定义排序
|
||||
data = ChartDataUtil.resultCustomSort(xAxis, yAxis, view.getSortPriority(), data);
|
||||
|
||||
var yoyFiltered = filterResult.getContext().get("yoyFiltered") != null;
|
||||
if (yoyFiltered) {
|
||||
// 这里没加分页,因为加了分页参数可能会把原始数据挤出去
|
||||
var expandedFilter = (List<ChartExtFilterDTO>) filterResult.getContext().get("expandedFilter");
|
||||
ExtWhere2Str.extWhere2sqlOjb(sqlMeta, expandedFilter, FieldUtil.transFields(allFields), crossDs, dsMap, Utils.getParams(FieldUtil.transFields(allFields)), view.getCalParams(), pluginManage);
|
||||
var expandedSql = SQLProvider.createQuerySQL(sqlMeta, true, !StringUtils.equalsIgnoreCase(dsMap.values().iterator().next().getType(), "es"), view);
|
||||
expandedSql = provider.rebuildSQL(expandedSql, sqlMeta, crossDs, dsMap);
|
||||
var expandedReq = new DatasourceRequest();
|
||||
expandedReq.setIsCross(crossDs);
|
||||
expandedReq.setDsList(dsMap);
|
||||
expandedReq.setQuery(expandedSql);
|
||||
logger.debug("expanded sql: " + expandedSql);
|
||||
var expandedData = (List<String[]>) provider.fetchResultField(expandedReq).get("data");
|
||||
logger.debug("expanded data: " + expandedData);
|
||||
quickCalc(xAxis, yAxis, Collections.emptyList(), Collections.emptyList(), view.getType(), expandedData);
|
||||
var resultData = new ArrayList<String[]>();
|
||||
for (String[] originDataLine : data) {
|
||||
var originDim = new StringBuilder();
|
||||
for (int i = 0; i < xAxis.size(); i++) {
|
||||
originDim.append(originDataLine[i]);
|
||||
}
|
||||
for (String[] expandedDataLine : expandedData) {
|
||||
var expandedDim = new StringBuilder();
|
||||
for (int i = 0; i < xAxis.size(); i++) {
|
||||
expandedDim.append(expandedDataLine[i]);
|
||||
}
|
||||
if (StringUtils.equals(originDim, expandedDim)) {
|
||||
resultData.add(expandedDataLine);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
data = resultData;
|
||||
} else {
|
||||
quickCalc(xAxis, yAxis, Collections.emptyList(), Collections.emptyList(), view.getType(), data);
|
||||
}
|
||||
//数据重组逻辑可重载
|
||||
var result = this.buildResult(view, formatResult, filterResult, data);
|
||||
T calcResult = (T) new ChartCalcDataResult();
|
||||
calcResult.setData(result);
|
||||
calcResult.setContext(filterResult.getContext());
|
||||
calcResult.setQuerySql(querySql);
|
||||
calcResult.setOriginData(data);
|
||||
try {
|
||||
var dynamicAssistFields = getDynamicThresholdFields(view);
|
||||
var assistFields = getAssistFields(dynamicAssistFields, yAxis, xAxis);
|
||||
if (CollectionUtils.isNotEmpty(assistFields)) {
|
||||
var req = new DatasourceRequest();
|
||||
req.setIsCross(crossDs);
|
||||
req.setDsList(dsMap);
|
||||
|
||||
List<ChartSeniorAssistDTO> assists = dynamicAssistFields.stream().filter(ele -> !StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
|
||||
if (ObjectUtils.isNotEmpty(assists)) {
|
||||
var assistSql = assistSQL(originSql, assistFields, dsMap, crossDs);
|
||||
var tmpSql = provider.rebuildSQL(assistSql, sqlMeta, crossDs, dsMap);
|
||||
req.setQuery(tmpSql);
|
||||
logger.debug("calcite assistSql sql: " + tmpSql);
|
||||
var assistData = (List<String[]>) provider.fetchResultField(req).get("data");
|
||||
calcResult.setAssistData(assistData);
|
||||
calcResult.setDynamicAssistFields(assists);
|
||||
}
|
||||
|
||||
List<ChartSeniorAssistDTO> assistsOriginList = dynamicAssistFields.stream().filter(ele -> StringUtils.equalsIgnoreCase(ele.getSummary(), "last_item")).toList();
|
||||
if (ObjectUtils.isNotEmpty(assistsOriginList)) {
|
||||
var assistSqlOriginList = assistSQLOriginList(originSql, assistFields, dsMap, crossDs);
|
||||
var tmpSql = provider.rebuildSQL(assistSqlOriginList, sqlMeta, crossDs, dsMap);
|
||||
req.setQuery(tmpSql);
|
||||
logger.debug("calcite assistSql sql origin list: " + tmpSql);
|
||||
var assistDataOriginList = (List<String[]>) provider.fetchResultField(req).get("data");
|
||||
calcResult.setAssistDataOriginList(assistDataOriginList);
|
||||
calcResult.setDynamicAssistFieldsOriginList(assistsOriginList);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return calcResult;
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -0,0 +1,95 @@
|
||||
package com.stdproject.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
*
|
||||
* </p>
|
||||
*
|
||||
* @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 +
|
||||
"}";
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @Author bi-coder
|
||||
* @since 2023-10-27
|
||||
*/
|
||||
@Mapper
|
||||
public interface CoreSysSettingMapper extends BaseMapper<CoreSysSetting> {
|
||||
|
||||
}
|
@ -19,4 +19,7 @@ public interface MenuMapper extends BaseMapper<Menu> {
|
||||
|
||||
@Select("<script>select me.id,me.type,me.code,me.name,me.parentid,me.module_id,mo.type module_type FROM app_menu me LEFT JOIN app_module mo on me.module_id = mo.id where me.id in <foreach collection='menuIds' item='id' open='(' separator=',' close=')'>#{id}</foreach> and me.isdisplay='1' order by me.code</script>")
|
||||
List<Map> listMenuByIds(@Param("menuIds") List<String> menuIds);
|
||||
@Select("<script>select me.id,me.type,me.code,me.name,me.parentid,me.module_id,mo.type module_type FROM app_menu me LEFT JOIN app_module mo on me.module_id = mo.id where me.isdisplay='1' order by me.code</script>")
|
||||
List<Map> listAllMenu();
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
@ -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<Map> permissions = buildUserAuthorities(appUser);
|
||||
LoginUser loginUser = new LoginUser(appUser,app_name,permissions);
|
||||
LoginUser loginUser = new LoginUser(appUser, app_name, permissions);
|
||||
|
||||
return loginUser;
|
||||
|
||||
@ -67,16 +68,20 @@ public class CustomUserDetailsService implements UserDetailsService {
|
||||
*/
|
||||
private Set<Map> buildUserAuthorities(User appUser) {
|
||||
Set<Map> permissions = new HashSet<>();
|
||||
|
||||
try {
|
||||
if (("admin").equals(appUser.getUsername())) {
|
||||
List<Map> menus = menuMapper.listAllMenu();
|
||||
permissions.addAll(menus);
|
||||
return permissions;
|
||||
}
|
||||
// 使用RoleMapper直接查询用户的角色信息
|
||||
List<Role> roles = roleMapper.getRoleByUserId(appUser.getId());
|
||||
|
||||
if (!roles.isEmpty()) {
|
||||
// 获取角色ID列表
|
||||
List<String> roleIds = roles.stream()
|
||||
.map(Role::getId)
|
||||
.collect(Collectors.toList());
|
||||
.map(Role::getId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 处理每个角色的菜单权限
|
||||
for (String roleId : roleIds) {
|
||||
@ -91,7 +96,6 @@ public class CustomUserDetailsService implements UserDetailsService {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("构建用户权限失败: {}", e.getMessage(), e);
|
||||
permissions.clear();
|
||||
@ -100,5 +104,4 @@ public class CustomUserDetailsService implements UserDetailsService {
|
||||
return permissions;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -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;
|
||||
|
@ -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<CoreSysSetting> 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<CoreSysSetting> typeList = groupList(MAP_KEY_PREFIX + "mapType");
|
||||
mapType = "gaode";
|
||||
if (!CollectionUtils.isEmpty(typeList)) {
|
||||
mapType = typeList.getFirst().getPval();
|
||||
}
|
||||
}
|
||||
String prefix;
|
||||
if (!StringUtils.equals(mapType, "gaode")) {
|
||||
prefix = mapType + "." + MAP_KEY_PREFIX;
|
||||
} else {
|
||||
prefix = MAP_KEY_PREFIX;
|
||||
}
|
||||
var editor = new OnlineMapEditor();
|
||||
List<String> fields = BeanUtils.getFieldNames(OnlineMapEditor.class);
|
||||
Map<String, String> 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<CoreSysSetting> typeList = groupList(MAP_KEY_PREFIX + "mapType");
|
||||
mapType = "gaode";
|
||||
if (!CollectionUtils.isEmpty(typeList)) {
|
||||
mapType = typeList.getFirst().getPval();
|
||||
}
|
||||
}
|
||||
|
||||
List<String> 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<CoreSysSetting> 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<String, String> groupVal(String groupKey) {
|
||||
QueryWrapper<CoreSysSetting> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.likeRight("pkey", groupKey);
|
||||
queryWrapper.orderByAsc("sort");
|
||||
List<CoreSysSetting> sysSettings = coreSysSettingMapper.selectList(queryWrapper);
|
||||
if (!CollectionUtils.isEmpty(sysSettings)) {
|
||||
return sysSettings.stream().collect(Collectors.toMap(CoreSysSetting::getPkey, CoreSysSetting::getPval));
|
||||
}
|
||||
return new HashMap<>();
|
||||
}
|
||||
|
||||
public List<CoreSysSetting> groupList(String groupKey) {
|
||||
QueryWrapper<CoreSysSetting> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.likeRight("pkey", groupKey);
|
||||
queryWrapper.orderByAsc("sort");
|
||||
return coreSysSettingMapper.selectList(queryWrapper);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public List<Object> getUiList() {
|
||||
List<Object> 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<String, Object> buildSettingItem(String pkey, Object pval) {
|
||||
Map<String, Object> item = new HashMap<>();
|
||||
item.put("pkey", pkey);
|
||||
item.put("pval", pval);
|
||||
return item;
|
||||
}
|
||||
|
||||
|
||||
public void insert(CoreSysSetting coreSysSetting) {
|
||||
coreSysSettingMapper.insert(coreSysSetting);
|
||||
}
|
||||
|
||||
}
|
@ -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
|
||||
|
@ -108,5 +108,47 @@
|
||||
and ccv.jump_active = 1
|
||||
</select>
|
||||
|
||||
|
||||
<select id="getLinkJumpInfoSnapshot" resultMap="LinkJumpInfoMap">
|
||||
SELECT
|
||||
cdtf.id AS source_field_id,
|
||||
cdtf.de_type AS source_de_type,
|
||||
cdtf.NAME AS source_field_name,
|
||||
vlji.id,
|
||||
vlji.link_jump_id,
|
||||
vlji.link_type,
|
||||
vlji.jump_type,
|
||||
vlji.window_size,
|
||||
vlji.target_dv_id,
|
||||
dvi.type as target_dv_type,
|
||||
vlji.content,
|
||||
ifnull( vlji.checked, 0 ) AS checked,
|
||||
ifnull( vlji.attach_params, 0 ) AS attach_params,
|
||||
vljtvi.target_id,
|
||||
vljtvi.target_view_id,
|
||||
vljtvi.target_field_id,
|
||||
vljtvi.target_type,
|
||||
vljtvi.source_field_active_id,
|
||||
vopi.param_name as outer_params_name
|
||||
FROM
|
||||
snapshot_core_chart_view ccv
|
||||
LEFT JOIN core_dataset_table_field cdtf ON ccv.table_id = cdtf.dataset_group_id
|
||||
LEFT JOIN snapshot_visualization_link_jump vlj ON ccv.id = vlj.source_view_id
|
||||
AND vlj.id = #{id}
|
||||
LEFT JOIN snapshot_visualization_link_jump_info vlji ON vlj.id = vlji.link_jump_id
|
||||
AND cdtf.id = vlji.source_field_id
|
||||
LEFT JOIN data_visualization_info dvi ON vlji.target_dv_id = dvi.id
|
||||
LEFT JOIN snapshot_visualization_link_jump_target_view_info vljtvi ON vlji.id = vljtvi.link_jump_info_id
|
||||
left join snapshot_visualization_outer_params_info vopi on vopi.params_info_id = vljtvi.target_view_id
|
||||
WHERE
|
||||
ccv.id = #{source_view_id}
|
||||
AND ccv.type != 'VQuery'
|
||||
<if test="!isDesktop">
|
||||
ORDER BY
|
||||
CONVERT (
|
||||
cdtf.NAME USING gbk)
|
||||
</if>
|
||||
<if test="isDesktop">
|
||||
ORDER BY cdtf.name;
|
||||
</if>
|
||||
</select>
|
||||
</mapper>
|
||||
|
2
frontend/components.d.ts
vendored
2
frontend/components.d.ts
vendored
@ -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']
|
||||
|
Loading…
Reference in New Issue
Block a user