diff --git a/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java b/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java index 5cb65dbda2..78322fe558 100644 --- a/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java +++ b/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java @@ -15,6 +15,8 @@ public class ChartViewWithBLOBs extends ChartView implements Serializable { private String extStack; + private String extBubble; + private String customAttr; private String customStyle; diff --git a/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java b/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java index 07a400d6d1..41b807625e 100644 --- a/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java +++ b/backend/src/main/java/io/dataease/base/domain/DatasetTableField.java @@ -2,11 +2,15 @@ package io.dataease.base.domain; import java.io.Serializable; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; @Data @Builder +@AllArgsConstructor //全参构造函数 +@NoArgsConstructor //无参构造函数 public class DatasetTableField implements Serializable { private String id; @@ -39,4 +43,4 @@ public class DatasetTableField implements Serializable { private Long lastSyncTime; private static final long serialVersionUID = 1L; -} \ No newline at end of file +} diff --git a/backend/src/main/java/io/dataease/base/domain/PanelViewLinkageField.java b/backend/src/main/java/io/dataease/base/domain/PanelViewLinkageField.java index 47b537a9ab..eb9a0ec102 100644 --- a/backend/src/main/java/io/dataease/base/domain/PanelViewLinkageField.java +++ b/backend/src/main/java/io/dataease/base/domain/PanelViewLinkageField.java @@ -9,9 +9,9 @@ public class PanelViewLinkageField implements Serializable { private String linkageId; - private String sourceFiled; + private String sourceField; - private String targetFiled; + private String targetField; private Long updateTime; diff --git a/backend/src/main/java/io/dataease/base/domain/PanelViewLinkageFieldExample.java b/backend/src/main/java/io/dataease/base/domain/PanelViewLinkageFieldExample.java index 2f02872bab..5fda7906ed 100644 --- a/backend/src/main/java/io/dataease/base/domain/PanelViewLinkageFieldExample.java +++ b/backend/src/main/java/io/dataease/base/domain/PanelViewLinkageFieldExample.java @@ -244,143 +244,143 @@ public class PanelViewLinkageFieldExample { return (Criteria) this; } - public Criteria andSourceFiledIsNull() { - addCriterion("source_filed is null"); + public Criteria andSourceFieldIsNull() { + addCriterion("source_field is null"); return (Criteria) this; } - public Criteria andSourceFiledIsNotNull() { - addCriterion("source_filed is not null"); + public Criteria andSourceFieldIsNotNull() { + addCriterion("source_field is not null"); return (Criteria) this; } - public Criteria andSourceFiledEqualTo(String value) { - addCriterion("source_filed =", value, "sourceFiled"); + public Criteria andSourceFieldEqualTo(String value) { + addCriterion("source_field =", value, "sourceField"); return (Criteria) this; } - public Criteria andSourceFiledNotEqualTo(String value) { - addCriterion("source_filed <>", value, "sourceFiled"); + public Criteria andSourceFieldNotEqualTo(String value) { + addCriterion("source_field <>", value, "sourceField"); return (Criteria) this; } - public Criteria andSourceFiledGreaterThan(String value) { - addCriterion("source_filed >", value, "sourceFiled"); + public Criteria andSourceFieldGreaterThan(String value) { + addCriterion("source_field >", value, "sourceField"); return (Criteria) this; } - public Criteria andSourceFiledGreaterThanOrEqualTo(String value) { - addCriterion("source_filed >=", value, "sourceFiled"); + public Criteria andSourceFieldGreaterThanOrEqualTo(String value) { + addCriterion("source_field >=", value, "sourceField"); return (Criteria) this; } - public Criteria andSourceFiledLessThan(String value) { - addCriterion("source_filed <", value, "sourceFiled"); + public Criteria andSourceFieldLessThan(String value) { + addCriterion("source_field <", value, "sourceField"); return (Criteria) this; } - public Criteria andSourceFiledLessThanOrEqualTo(String value) { - addCriterion("source_filed <=", value, "sourceFiled"); + public Criteria andSourceFieldLessThanOrEqualTo(String value) { + addCriterion("source_field <=", value, "sourceField"); return (Criteria) this; } - public Criteria andSourceFiledLike(String value) { - addCriterion("source_filed like", value, "sourceFiled"); + public Criteria andSourceFieldLike(String value) { + addCriterion("source_field like", value, "sourceField"); return (Criteria) this; } - public Criteria andSourceFiledNotLike(String value) { - addCriterion("source_filed not like", value, "sourceFiled"); + public Criteria andSourceFieldNotLike(String value) { + addCriterion("source_field not like", value, "sourceField"); return (Criteria) this; } - public Criteria andSourceFiledIn(List values) { - addCriterion("source_filed in", values, "sourceFiled"); + public Criteria andSourceFieldIn(List values) { + addCriterion("source_field in", values, "sourceField"); return (Criteria) this; } - public Criteria andSourceFiledNotIn(List values) { - addCriterion("source_filed not in", values, "sourceFiled"); + public Criteria andSourceFieldNotIn(List values) { + addCriterion("source_field not in", values, "sourceField"); return (Criteria) this; } - public Criteria andSourceFiledBetween(String value1, String value2) { - addCriterion("source_filed between", value1, value2, "sourceFiled"); + public Criteria andSourceFieldBetween(String value1, String value2) { + addCriterion("source_field between", value1, value2, "sourceField"); return (Criteria) this; } - public Criteria andSourceFiledNotBetween(String value1, String value2) { - addCriterion("source_filed not between", value1, value2, "sourceFiled"); + public Criteria andSourceFieldNotBetween(String value1, String value2) { + addCriterion("source_field not between", value1, value2, "sourceField"); return (Criteria) this; } - public Criteria andTargetFiledIsNull() { - addCriterion("target_filed is null"); + public Criteria andTargetFieldIsNull() { + addCriterion("target_field is null"); return (Criteria) this; } - public Criteria andTargetFiledIsNotNull() { - addCriterion("target_filed is not null"); + public Criteria andTargetFieldIsNotNull() { + addCriterion("target_field is not null"); return (Criteria) this; } - public Criteria andTargetFiledEqualTo(String value) { - addCriterion("target_filed =", value, "targetFiled"); + public Criteria andTargetFieldEqualTo(String value) { + addCriterion("target_field =", value, "targetField"); return (Criteria) this; } - public Criteria andTargetFiledNotEqualTo(String value) { - addCriterion("target_filed <>", value, "targetFiled"); + public Criteria andTargetFieldNotEqualTo(String value) { + addCriterion("target_field <>", value, "targetField"); return (Criteria) this; } - public Criteria andTargetFiledGreaterThan(String value) { - addCriterion("target_filed >", value, "targetFiled"); + public Criteria andTargetFieldGreaterThan(String value) { + addCriterion("target_field >", value, "targetField"); return (Criteria) this; } - public Criteria andTargetFiledGreaterThanOrEqualTo(String value) { - addCriterion("target_filed >=", value, "targetFiled"); + public Criteria andTargetFieldGreaterThanOrEqualTo(String value) { + addCriterion("target_field >=", value, "targetField"); return (Criteria) this; } - public Criteria andTargetFiledLessThan(String value) { - addCriterion("target_filed <", value, "targetFiled"); + public Criteria andTargetFieldLessThan(String value) { + addCriterion("target_field <", value, "targetField"); return (Criteria) this; } - public Criteria andTargetFiledLessThanOrEqualTo(String value) { - addCriterion("target_filed <=", value, "targetFiled"); + public Criteria andTargetFieldLessThanOrEqualTo(String value) { + addCriterion("target_field <=", value, "targetField"); return (Criteria) this; } - public Criteria andTargetFiledLike(String value) { - addCriterion("target_filed like", value, "targetFiled"); + public Criteria andTargetFieldLike(String value) { + addCriterion("target_field like", value, "targetField"); return (Criteria) this; } - public Criteria andTargetFiledNotLike(String value) { - addCriterion("target_filed not like", value, "targetFiled"); + public Criteria andTargetFieldNotLike(String value) { + addCriterion("target_field not like", value, "targetField"); return (Criteria) this; } - public Criteria andTargetFiledIn(List values) { - addCriterion("target_filed in", values, "targetFiled"); + public Criteria andTargetFieldIn(List values) { + addCriterion("target_field in", values, "targetField"); return (Criteria) this; } - public Criteria andTargetFiledNotIn(List values) { - addCriterion("target_filed not in", values, "targetFiled"); + public Criteria andTargetFieldNotIn(List values) { + addCriterion("target_field not in", values, "targetField"); return (Criteria) this; } - public Criteria andTargetFiledBetween(String value1, String value2) { - addCriterion("target_filed between", value1, value2, "targetFiled"); + public Criteria andTargetFieldBetween(String value1, String value2) { + addCriterion("target_field between", value1, value2, "targetField"); return (Criteria) this; } - public Criteria andTargetFiledNotBetween(String value1, String value2) { - addCriterion("target_filed not between", value1, value2, "targetFiled"); + public Criteria andTargetFieldNotBetween(String value1, String value2) { + addCriterion("target_field not between", value1, value2, "targetField"); return (Criteria) this; } diff --git a/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml index c5c452beef..10137408e3 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml @@ -17,6 +17,7 @@ + @@ -86,8 +87,8 @@ style_priority - x_axis, y_axis, ext_stack, custom_attr, custom_style, custom_filter, drill_fields, - snapshot + x_axis, y_axis, ext_stack, ext_bubble, custom_attr, custom_style, custom_filter, + drill_fields, snapshot select @@ -100,10 +100,10 @@ - insert into panel_view_linkage_field (id, linkage_id, source_filed, - target_filed, update_time) - values (#{id,jdbcType=VARCHAR}, #{linkageId,jdbcType=VARCHAR}, #{sourceFiled,jdbcType=VARCHAR}, - #{targetFiled,jdbcType=VARCHAR}, #{updateTime,jdbcType=BIGINT}) + insert into panel_view_linkage_field (id, linkage_id, source_field, + target_field, update_time) + values (#{id,jdbcType=VARCHAR}, #{linkageId,jdbcType=VARCHAR}, #{sourceField,jdbcType=VARCHAR}, + #{targetField,jdbcType=VARCHAR}, #{updateTime,jdbcType=BIGINT}) insert into panel_view_linkage_field @@ -114,11 +114,11 @@ linkage_id, - - source_filed, + + source_field, - - target_filed, + + target_field, update_time, @@ -131,11 +131,11 @@ #{linkageId,jdbcType=VARCHAR}, - - #{sourceFiled,jdbcType=VARCHAR}, + + #{sourceField,jdbcType=VARCHAR}, - - #{targetFiled,jdbcType=VARCHAR}, + + #{targetField,jdbcType=VARCHAR}, #{updateTime,jdbcType=BIGINT}, @@ -157,11 +157,11 @@ linkage_id = #{record.linkageId,jdbcType=VARCHAR}, - - source_filed = #{record.sourceFiled,jdbcType=VARCHAR}, + + source_field = #{record.sourceField,jdbcType=VARCHAR}, - - target_filed = #{record.targetFiled,jdbcType=VARCHAR}, + + target_field = #{record.targetField,jdbcType=VARCHAR}, update_time = #{record.updateTime,jdbcType=BIGINT}, @@ -175,8 +175,8 @@ update panel_view_linkage_field set id = #{record.id,jdbcType=VARCHAR}, linkage_id = #{record.linkageId,jdbcType=VARCHAR}, - source_filed = #{record.sourceFiled,jdbcType=VARCHAR}, - target_filed = #{record.targetFiled,jdbcType=VARCHAR}, + source_field = #{record.sourceField,jdbcType=VARCHAR}, + target_field = #{record.targetField,jdbcType=VARCHAR}, update_time = #{record.updateTime,jdbcType=BIGINT} @@ -188,11 +188,11 @@ linkage_id = #{linkageId,jdbcType=VARCHAR}, - - source_filed = #{sourceFiled,jdbcType=VARCHAR}, + + source_field = #{sourceField,jdbcType=VARCHAR}, - - target_filed = #{targetFiled,jdbcType=VARCHAR}, + + target_field = #{targetField,jdbcType=VARCHAR}, update_time = #{updateTime,jdbcType=BIGINT}, @@ -203,8 +203,8 @@ update panel_view_linkage_field set linkage_id = #{linkageId,jdbcType=VARCHAR}, - source_filed = #{sourceFiled,jdbcType=VARCHAR}, - target_filed = #{targetFiled,jdbcType=VARCHAR}, + source_field = #{sourceField,jdbcType=VARCHAR}, + target_field = #{targetField,jdbcType=VARCHAR}, update_time = #{updateTime,jdbcType=BIGINT} where id = #{id,jdbcType=VARCHAR} diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.java index d2a96192bb..82cea4163a 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.java @@ -9,6 +9,11 @@ import java.util.List; public interface ExtPanelViewLinkageMapper { List getViewLinkageGather(@Param("panelId") String panelId,@Param("sourceViewId") String sourceViewId,@Param("targetViewIds") List targetViewIds); - List queryTableField(@Param("tableId") String tableId); + + List queryTableField(@Param("table_id") String tableId); + + void deleteViewLinkage(@Param("panelId") String panelId,@Param("sourceViewId") String sourceViewId); + + void deleteViewLinkageField(@Param("panelId") String panelId,@Param("sourceViewId") String sourceViewId); } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.xml index d8e4944525..f81e6c76ea 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewLinkageMapper.xml @@ -3,7 +3,7 @@ - + @@ -15,12 +15,12 @@ - - - - - - + + + + + @@ -30,14 +30,14 @@ chart_view.id as 'target_view_id', chart_view.table_id, (case when panel_view_linkage.target_view_id is null then 0 else 1 end) as 'linkageActive', - panel_view_linkage_field.source_filed, - panel_view_linkage_field.target_filed + panel_view_linkage_field.source_field, + panel_view_linkage_field.target_field FROM chart_view LEFT JOIN panel_view_linkage ON chart_view.id = panel_view_linkage.target_view_id - LEFT JOIN panel_view_linkage_field ON panel_view_linkage.id = panel_view_linkage_field.linkage_id AND panel_view_linkage.panel_id = #{panelId} AND panel_view_linkage.source_view_id = #{sourceViewId} + LEFT JOIN panel_view_linkage_field ON panel_view_linkage.id = panel_view_linkage_field.linkage_id where chart_view.id in #{targetViewId} @@ -49,9 +49,33 @@ dataset_table_field.id, dataset_table_field.table_id, dataset_table_field.origin_name, - dataset_table_field.name, + dataset_table_field.`name`, dataset_table_field.de_type - from dataset_table_field where table_id = #{tableId} + from dataset_table_field where table_id = #{table_id} + + + delete from panel_view_linkage where panel_view_linkage.panel_id = #{panelId} + AND panel_view_linkage.source_view_id = #{sourceViewId} + + + + + DELETE pvl + FROM + panel_view_linkage pvl, + panel_view_linkage_field pvlf + WHERE + pvl.id = pvlf.linkage_id + AND pvl.source_view_id = #{panelId} + AND pvl.panel_id = #{panelId} + + + + INSERT INTO `panel_view_linkage` ( menu_id, title, pid, sub_count, permission, hidden,i_frame ) VALUES + + (#{menu.menuId},#{menu.title},#{menu.pid},#{menu.subCount},#{menu.permission},#{menu.hidden},ifnull(#{menu.hidden},0)) + + diff --git a/backend/src/main/java/io/dataease/controller/panel/PanelViewLinkageController.java b/backend/src/main/java/io/dataease/controller/panel/PanelViewLinkageController.java index 2b99e08576..b74b33a97f 100644 --- a/backend/src/main/java/io/dataease/controller/panel/PanelViewLinkageController.java +++ b/backend/src/main/java/io/dataease/controller/panel/PanelViewLinkageController.java @@ -2,6 +2,7 @@ package io.dataease.controller.panel; import com.github.xiaoymin.knife4j.annotations.ApiSupport; import io.dataease.controller.request.panel.PanelLinkageRequest; +import io.dataease.dto.PanelViewLinkageDTO; import io.dataease.service.panel.PanelViewLinkageService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -30,4 +31,13 @@ public class PanelViewLinkageController { return panelViewLinkageService.getViewLinkageGather(request); } + + @ApiOperation("获取仪表板视图联动信息") + @PostMapping("/saveLinkage") + public void saveLinkage(@RequestBody PanelLinkageRequest request){ + panelViewLinkageService.saveLinkage(request); + } + + + } diff --git a/backend/src/main/java/io/dataease/controller/request/panel/PanelLinkageRequest.java b/backend/src/main/java/io/dataease/controller/request/panel/PanelLinkageRequest.java index 2829eaf14d..e7c164fab0 100644 --- a/backend/src/main/java/io/dataease/controller/request/panel/PanelLinkageRequest.java +++ b/backend/src/main/java/io/dataease/controller/request/panel/PanelLinkageRequest.java @@ -1,6 +1,9 @@ package io.dataease.controller.request.panel; +import io.dataease.dto.PanelViewLinkageDTO; + import java.util.List; +import java.util.Map; /** * Author: wangjiahao @@ -15,6 +18,16 @@ public class PanelLinkageRequest { private List targetViewIds; + private Map linkageInfo; + + public Map getLinkageInfo() { + return linkageInfo; + } + + public void setLinkageInfo(Map linkageInfo) { + this.linkageInfo = linkageInfo; + } + public String getPanelId() { return panelId; } diff --git a/backend/src/main/java/io/dataease/dto/PanelViewLinkageDTO.java b/backend/src/main/java/io/dataease/dto/PanelViewLinkageDTO.java index 83e8f4cb4a..c265d4aecd 100644 --- a/backend/src/main/java/io/dataease/dto/PanelViewLinkageDTO.java +++ b/backend/src/main/java/io/dataease/dto/PanelViewLinkageDTO.java @@ -2,6 +2,7 @@ package io.dataease.dto; import io.dataease.base.domain.DatasetTableField; import io.dataease.base.domain.PanelViewLinkage; +import io.dataease.base.domain.PanelViewLinkageField; import java.util.ArrayList; import java.util.List; @@ -19,7 +20,7 @@ public class PanelViewLinkageDTO extends PanelViewLinkage { //关联状态 private boolean linkageActive = false; - private List linkageFields = new ArrayList<>(); + private List linkageFields = new ArrayList<>(); private List targetViewFields = new ArrayList<>(); @@ -68,11 +69,11 @@ public class PanelViewLinkageDTO extends PanelViewLinkage { this.linkageActive = linkageActive; } - public List getLinkageFields() { + public List getLinkageFields() { return linkageFields; } - public void setLinkageFields(List linkageFields) { + public void setLinkageFields(List linkageFields) { this.linkageFields = linkageFields; } } diff --git a/backend/src/main/java/io/dataease/dto/chart/Series.java b/backend/src/main/java/io/dataease/dto/chart/Series.java index bfbb353f71..2052dca0cd 100644 --- a/backend/src/main/java/io/dataease/dto/chart/Series.java +++ b/backend/src/main/java/io/dataease/dto/chart/Series.java @@ -15,5 +15,5 @@ import java.util.List; public class Series { private String name; private String type; - private List data; + private List data; } diff --git a/backend/src/main/java/io/dataease/provider/QueryProvider.java b/backend/src/main/java/io/dataease/provider/QueryProvider.java index b6c97d0a31..b0ba96cb2c 100644 --- a/backend/src/main/java/io/dataease/provider/QueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/QueryProvider.java @@ -40,6 +40,10 @@ public abstract class QueryProvider { public abstract String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack); + public abstract String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble); + + public abstract String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble); + public abstract String searchTable(String table); public abstract String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList); diff --git a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java index fc995d6e11..96d22045fe 100644 --- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java @@ -407,6 +407,120 @@ public class DorisQueryProvider extends QueryProvider { return getSQLStack("(" + table + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack); } + @Override + public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(DorisConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + List xWheres = new ArrayList<>(); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(xAxis)) { + for (int i = 0; i < xAxis.size(); i++) { + ChartViewFieldDTO x = xAxis.get(i); + String originField; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName()); + } else { + originField = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + // 处理横轴字段 + xFields.add(getXFields(x, originField, fieldAlias)); + // 处理横轴过滤 +// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yFields = new ArrayList<>(); + List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); + List yList = new ArrayList<>(); + yList.addAll(yAxis); + yList.addAll(extBubble); + if (CollectionUtils.isNotEmpty(yList)) { + for (int i = 0; i < yList.size(); i++) { + ChartViewFieldDTO y = yList.get(i); + String originField; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getDataeaseName()); + } else { + originField = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getDataeaseName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(y, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.addAll(getYWheres(y, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(y.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + List customWheres = transCustomFilterList(tableObj, customFilter); + // 处理仪表板字段过滤 + List extWheres = transExtFilterList(tableObj, extFilterRequestList); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + wheres.addAll(xWheres); + if (customWheres != null) wheres.addAll(customWheres); + if (extWheres != null) wheres.addAll(extWheres); + List groups = new ArrayList<>(); + groups.addAll(xFields); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(DorisConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return st.render(); + } + + @Override + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble) { + return getSQLScatter("(" + table + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; diff --git a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java index 13ba47b27f..56ad71c2f8 100644 --- a/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/mysql/MysqlQueryProvider.java @@ -354,29 +354,116 @@ public class MysqlQueryProvider extends QueryProvider { } } } - List stackFields = new ArrayList<>(); - List stackOrders = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(extStack)) { - for (int i = 0; i < extStack.size(); i++) { - ChartViewFieldDTO stack = extStack.get(i); + // 处理视图中字段过滤 + List customWheres = transCustomFilterList(tableObj, customFilter); + // 处理仪表板字段过滤 + List extWheres = transExtFilterList(tableObj, extFilterRequestList); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + wheres.addAll(xWheres); + if (customWheres != null) wheres.addAll(customWheres); + if (extWheres != null) wheres.addAll(extWheres); + List groups = new ArrayList<>(); + groups.addAll(xFields); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(MySQLConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return st.render(); + } + + @Override + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack); + } + + @Override + public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MySQLConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + List xWheres = new ArrayList<>(); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(xAxis)) { + for (int i = 0; i < xAxis.size(); i++) { + ChartViewFieldDTO x = xAxis.get(i); String originField; - if (ObjectUtils.isNotEmpty(stack.getExtField()) && stack.getExtField() == 2) { + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 - originField = calcFieldRegex(stack.getOriginName(), tableObj); - } else if (ObjectUtils.isNotEmpty(stack.getExtField()) && stack.getExtField() == 1) { - originField = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), stack.getOriginName()); + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); } else { - originField = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), stack.getOriginName()); + originField = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); } String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 - stackFields.add(getXFields(stack, originField, fieldAlias)); + xFields.add(getXFields(x, originField, fieldAlias)); + // 处理横轴过滤 +// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 - if (StringUtils.isNotEmpty(stack.getSort()) && !StringUtils.equalsIgnoreCase(stack.getSort(), "none")) { - stackOrders.add(SQLObj.builder() + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() .orderField(originField) .orderAlias(fieldAlias) - .orderDirection(stack.getSort()) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yFields = new ArrayList<>(); + List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); + List yList = new ArrayList<>(); + yList.addAll(yAxis); + yList.addAll(extBubble); + if (CollectionUtils.isNotEmpty(yList)) { + for (int i = 0; i < yList.size(); i++) { + ChartViewFieldDTO y = yList.get(i); + String originField; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(MySQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(y, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.addAll(getYWheres(y, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(y.getSort()) .build()); } } @@ -422,8 +509,8 @@ public class MysqlQueryProvider extends QueryProvider { } @Override - public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack) { - return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack); + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble); } @Override diff --git a/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java b/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java index 124c383736..140387a1d3 100644 --- a/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/oracle/OracleQueryProvider.java @@ -432,6 +432,120 @@ public class OracleQueryProvider extends QueryProvider { return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack); } + @Override + public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(OracleConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(OracleConstants.ALIAS_FIX, String.format(TABLE_ALIAS_PREFIX, 0))) + .build(); + List xFields = new ArrayList<>(); + List xWheres = new ArrayList<>(); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(xAxis)) { + for (int i = 0; i < xAxis.size(); i++) { + ChartViewFieldDTO x = xAxis.get(i); + String originField; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(OracleConstants.ALIAS_FIX, String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i)); + // 处理横轴字段 + xFields.add(getXFields(x, originField, fieldAlias)); + // 处理横轴过滤 +// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yFields = new ArrayList<>(); + List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); + List yList = new ArrayList<>(); + yList.addAll(yAxis); + yList.addAll(extBubble); + if (CollectionUtils.isNotEmpty(yList)) { + for (int i = 0; i < yList.size(); i++) { + ChartViewFieldDTO y = yList.get(i); + String originField; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } + String fieldAlias = String.format(OracleConstants.ALIAS_FIX, String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i)); + // 处理纵轴字段 + yFields.add(getYFields(y, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.addAll(getYWheres(y, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(y.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + List customWheres = transCustomFilterList(tableObj, customFilter); + // 处理仪表板字段过滤 + List extWheres = transExtFilterList(tableObj, extFilterRequestList); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + wheres.addAll(xWheres); + if (customWheres != null) wheres.addAll(customWheres); + if (extWheres != null) wheres.addAll(extWheres); + List groups = new ArrayList<>(); + groups.addAll(xFields); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields); + if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(OracleConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return st.render(); + } + + @Override + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble); + } + @Override public String searchTable(String table) { return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 40405655c2..89c08d91e7 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -193,6 +193,8 @@ public class ChartViewService { }.getType()); List extStack = new Gson().fromJson(view.getExtStack(), new TypeToken>() { }.getType()); + List extBubble = new Gson().fromJson(view.getExtBubble(), new TypeToken>() { + }.getType()); List fieldCustomFilter = new Gson().fromJson(view.getCustomFilter(), new TypeToken>() { }.getType()); List customFilter = new ArrayList<>(); @@ -262,6 +264,8 @@ public class ChartViewService { datasourceRequest.setQuery(qp.getSQLSummary(dataTableInfoDTO.getTable(), yAxis, customFilter, extFilterList)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { datasourceRequest.setQuery(qp.getSQLStack(dataTableInfoDTO.getTable(), xAxis, yAxis, customFilter, extFilterList, extStack)); + } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { + datasourceRequest.setQuery(qp.getSQLScatter(dataTableInfoDTO.getTable(), xAxis, yAxis, customFilter, extFilterList, extBubble)); } else { datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, customFilter, extFilterList)); } @@ -270,6 +274,8 @@ public class ChartViewService { datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(dataTableInfoDTO.getSql(), yAxis, customFilter, extFilterList)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { datasourceRequest.setQuery(qp.getSQLAsTmpStack(dataTableInfoDTO.getSql(), xAxis, yAxis, customFilter, extFilterList, extStack)); + } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { + datasourceRequest.setQuery(qp.getSQLAsTmpScatter(dataTableInfoDTO.getSql(), xAxis, yAxis, customFilter, extFilterList, extBubble)); } else { datasourceRequest.setQuery(qp.getSQLAsTmp(dataTableInfoDTO.getSql(), xAxis, yAxis, customFilter, extFilterList)); } @@ -281,6 +287,8 @@ public class ChartViewService { datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, customFilter, extFilterList)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, customFilter, extFilterList, extStack)); + } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { + datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, customFilter, extFilterList, extBubble)); } else { datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, customFilter, extFilterList)); } @@ -309,6 +317,8 @@ public class ChartViewService { datasourceRequest.setQuery(qp.getSQLSummary(tableName, yAxis, customFilter, extFilterList)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { datasourceRequest.setQuery(qp.getSQLStack(tableName, xAxis, yAxis, customFilter, extFilterList, extStack)); + } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { + datasourceRequest.setQuery(qp.getSQLScatter(tableName, xAxis, yAxis, customFilter, extFilterList, extBubble)); } else { datasourceRequest.setQuery(qp.getSQL(tableName, xAxis, yAxis, customFilter, extFilterList)); } @@ -353,6 +363,8 @@ public class ChartViewService { Map mapChart; if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { mapChart = transStackChartData(xAxis, yAxis, view, data, extStack); + } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { + mapChart = transScatterData(xAxis, yAxis, view, data, extBubble); } else { mapChart = transChartData(xAxis, yAxis, view, data); } @@ -405,6 +417,7 @@ public class ChartViewService { return result; } + // 基础图形 private Map transChartData(List xAxis, List yAxis, ChartViewWithBLOBs view, List data) { Map map = new HashMap<>(); @@ -442,6 +455,7 @@ public class ChartViewService { return map; } + // 堆叠图 private Map transStackChartData(List xAxis, List yAxis, ChartViewWithBLOBs view, List data, List extStack) { Map map = new HashMap<>(); @@ -473,7 +487,7 @@ public class ChartViewService { Series series1 = new Series(); series1.setName(s); series1.setType(view.getType()); - List list = new ArrayList<>(); + List list = new ArrayList<>(); for (int i = 0; i < x.size(); i++) { list.add(defaultValue); } @@ -540,6 +554,60 @@ public class ChartViewService { return map; } + // 散点图 + private Map transScatterData(List xAxis, List yAxis, ChartViewWithBLOBs view, List data, List extBubble) { + Map map = new HashMap<>(); + + List x = new ArrayList<>(); + List series = new ArrayList<>(); + for (ChartViewFieldDTO y : yAxis) { + Series series1 = new Series(); + series1.setName(y.getName()); + series1.setType(view.getType()); + series1.setData(new ArrayList<>()); + series.add(series1); + } + for (String[] d : data) { + StringBuilder a = new StringBuilder(); + for (int i = 0; i < xAxis.size(); i++) { + if (i == xAxis.size() - 1) { + a.append(d[i]); + } else { + a.append(d[i]).append("\n"); + } + } + x.add(a.toString()); + for (int i = xAxis.size(); i < xAxis.size() + yAxis.size(); i++) { + int j = i - xAxis.size(); + if (CollectionUtils.isNotEmpty(extBubble) && extBubble.size() > 0) { + try { + series.get(j).getData().add(new Object[]{ + a.toString(), + new BigDecimal(StringUtils.isEmpty(d[i]) ? "0" : d[i]), + new BigDecimal(StringUtils.isEmpty(d[xAxis.size() + yAxis.size()]) ? "0" : d[xAxis.size() + yAxis.size()]) + }); + } catch (Exception e) { + series.get(j).getData().add(new Object[]{a.toString(), new BigDecimal(0), new BigDecimal(0)}); + } + } else { + try { + series.get(j).getData().add(new Object[]{ + a.toString(), + new BigDecimal(StringUtils.isEmpty(d[i]) ? "0" : d[i]) + }); + } catch (Exception e) { + series.get(j).getData().add(new Object[]{a.toString(), new BigDecimal(0)}); + } + } + } + } + + map.put("x", x); + map.put("series", series); + return map; + } + + // 表格 private Map transTableNormal(List xAxis, List yAxis, ChartViewWithBLOBs view, List data, List extStack) { Map map = new TreeMap<>(); List fields = new ArrayList<>(); diff --git a/backend/src/main/java/io/dataease/service/panel/PanelViewLinkageService.java b/backend/src/main/java/io/dataease/service/panel/PanelViewLinkageService.java index 031029a489..792ada85de 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelViewLinkageService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelViewLinkageService.java @@ -1,11 +1,19 @@ package io.dataease.service.panel; +import io.dataease.base.domain.PanelViewLinkage; +import io.dataease.base.domain.PanelViewLinkageExample; +import io.dataease.base.domain.PanelViewLinkageField; +import io.dataease.base.mapper.PanelViewLinkageFieldMapper; import io.dataease.base.mapper.PanelViewLinkageMapper; import io.dataease.base.mapper.ext.ExtPanelViewLinkageMapper; +import io.dataease.commons.utils.AuthUtils; import io.dataease.controller.request.panel.PanelLinkageRequest; import io.dataease.dto.PanelViewLinkageDTO; +import io.dataease.dto.PanelViewLinkageFieldDTO; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; import javax.annotation.Resource; import java.util.*; @@ -22,6 +30,9 @@ public class PanelViewLinkageService { @Resource private PanelViewLinkageMapper panelViewLinkageMapper; + @Resource + private PanelViewLinkageFieldMapper panelViewLinkageFieldMapper; + @Resource private ExtPanelViewLinkageMapper extPanelViewLinkageMapper; @@ -29,9 +40,6 @@ public class PanelViewLinkageService { public Map getViewLinkageGather(PanelLinkageRequest request) { if(CollectionUtils.isNotEmpty(request.getTargetViewIds())){ List linkageDTOList = extPanelViewLinkageMapper.getViewLinkageGather(request.getPanelId(),request.getSourceViewId(),request.getTargetViewIds()); - linkageDTOList.stream().forEach(linkage ->{ - linkage.setTargetViewFields(extPanelViewLinkageMapper.queryTableField(linkage.getTableId())); - }); Map result = linkageDTOList.stream() .collect(Collectors.toMap(PanelViewLinkageDTO::getTargetViewId,PanelViewLinkageDTO->PanelViewLinkageDTO)); return result; @@ -39,5 +47,61 @@ public class PanelViewLinkageService { return new HashMap<>(); } + @Transactional + public void saveLinkage(PanelLinkageRequest request){ + Long updateTime = System.currentTimeMillis(); + Map linkageInfo = request.getLinkageInfo(); + String sourceViewId = request.getSourceViewId(); + String panelId = request.getPanelId(); + + Assert.notNull(sourceViewId,"source View ID can not be null"); + Assert.notNull(panelId,"panelId can not be null"); + + //去掉source view 的信息 + linkageInfo.remove(sourceViewId); + + // 清理原有关系 + extPanelViewLinkageMapper.deleteViewLinkageField(panelId,sourceViewId); + extPanelViewLinkageMapper.deleteViewLinkage(panelId,sourceViewId); + + //重新建立关系 + for(Map.Entry entry : linkageInfo.entrySet()){ + String targetViewId = entry.getKey(); + PanelViewLinkageDTO linkageDTO = entry.getValue(); + List linkageFields = linkageDTO.getLinkageFields(); + + if(CollectionUtils.isNotEmpty(linkageFields)&&linkageDTO.isLinkageActive()){ + String linkageId = UUID.randomUUID().toString(); + PanelViewLinkage linkage = new PanelViewLinkage(); + linkage.setId(linkageId); + linkage.setPanelId(panelId); + linkage.setSourceViewId(sourceViewId); + linkage.setTargetViewId(targetViewId); + linkage.setUpdatePeople(AuthUtils.getUser().getUsername()); + linkage.setUpdateTime(updateTime); + panelViewLinkageMapper.insert(linkage); + + linkageFields.stream().forEach(linkageField->{ + linkageField.setId(UUID.randomUUID().toString()); + linkageField.setLinkageId(linkageId); + linkageField.setUpdateTime(updateTime); + panelViewLinkageFieldMapper.insert(linkageField); + }); + + } + + + + + } + + + + + + + + + } } diff --git a/backend/src/main/resources/db/migration/V19__area_mapping.sql b/backend/src/main/resources/db/migration/V19__area_mapping.sql index adc3708806..93f5f7394e 100644 --- a/backend/src/main/resources/db/migration/V19__area_mapping.sql +++ b/backend/src/main/resources/db/migration/V19__area_mapping.sql @@ -1,5 +1,7 @@ ALTER TABLE `chart_view` ADD COLUMN `ext_stack` LONGTEXT COMMENT '堆叠项' AFTER `y_axis`; UPDATE `chart_view` SET `ext_stack` = '[]'; +ALTER TABLE `chart_view` ADD COLUMN `ext_bubble` LONGTEXT COMMENT '气泡大小' AFTER `ext_stack`; +UPDATE `chart_view` SET `ext_bubble` = '[]'; ALTER TABLE `dataset_table_field` MODIFY COLUMN `origin_name` LONGTEXT; diff --git a/backend/src/main/resources/db/migration/V20__linkage_table.sql b/backend/src/main/resources/db/migration/V20__linkage_table.sql new file mode 100644 index 0000000000..31fafdf176 --- /dev/null +++ b/backend/src/main/resources/db/migration/V20__linkage_table.sql @@ -0,0 +1,33 @@ +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for panel_view_linkage +-- ---------------------------- +DROP TABLE IF EXISTS `panel_view_linkage`; +CREATE TABLE `panel_view_linkage` ( + `id` varchar(50) NOT NULL, + `panel_id` varchar(50) DEFAULT NULL, + `source_view_id` varchar(50) DEFAULT NULL COMMENT '源视图id', + `target_view_id` varchar(50) DEFAULT NULL COMMENT '联动视图id', + `update_time` bigint(13) DEFAULT NULL COMMENT '更新时间', + `update_people` varchar(255) DEFAULT NULL COMMENT '更新人', + `ext1` varchar(2000) DEFAULT NULL, + `ext2` varchar(2000) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Table structure for panel_view_linkage_field +-- ---------------------------- +DROP TABLE IF EXISTS `panel_view_linkage_field`; +CREATE TABLE `panel_view_linkage_field` ( + `id` varchar(50) NOT NULL, + `linkage_id` varchar(50) DEFAULT NULL COMMENT '联动ID', + `source_field` varchar(255) DEFAULT NULL COMMENT '源视图字段', + `target_field` varchar(255) DEFAULT NULL COMMENT '目标视图字段', + `update_time` bigint(13) DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/backend/src/main/resources/generatorConfig.xml b/backend/src/main/resources/generatorConfig.xml index 40d5d81156..d1fa9176c7 100644 --- a/backend/src/main/resources/generatorConfig.xml +++ b/backend/src/main/resources/generatorConfig.xml @@ -64,7 +64,7 @@ - + diff --git a/frontend/src/api/panel/linkage.js b/frontend/src/api/panel/linkage.js index 9bbbc0fde9..4a0f0ecc4a 100644 --- a/frontend/src/api/panel/linkage.js +++ b/frontend/src/api/panel/linkage.js @@ -9,3 +9,12 @@ export function getViewLinkageGather(requestInfo) { }) } +export function saveLinkage(requestInfo) { + return request({ + url: '/linkage/saveLinkage', + method: 'post', + data: requestInfo, + loading: true + }) +} + diff --git a/frontend/src/components/canvas/components/Editor/LinkageField.vue b/frontend/src/components/canvas/components/Editor/LinkageField.vue index 08333d082f..d4f50e9421 100644 --- a/frontend/src/components/canvas/components/Editor/LinkageField.vue +++ b/frontend/src/components/canvas/components/Editor/LinkageField.vue @@ -1,22 +1,68 @@