feat(数据大屏、数据大屏): 外部参数关联查询组件,支持控制查询组件选项值范围 (#17739)

This commit is contained in:
王嘉豪
2026-01-04 17:14:28 +08:00
committed by GitHub
parent c0d0ad12a1
commit 16983e606e
12 changed files with 153 additions and 69 deletions

View File

@@ -53,6 +53,16 @@ public class SnapshotVisualizationOuterParamsTargetViewInfo implements Serializa
*/
private String targetDsId;
private String matchMode;
public String getMatchMode() {
return matchMode;
}
public void setMatchMode(String matchMode) {
this.matchMode = matchMode;
}
public String getTargetId() {
return targetId;
}

View File

@@ -53,6 +53,16 @@ public class VisualizationOuterParamsTargetViewInfo implements Serializable {
*/
private String copyId;
private String matchMode;
public String getMatchMode() {
return matchMode;
}
public void setMatchMode(String matchMode) {
this.matchMode = matchMode;
}
public String getTargetId() {
return targetId;
}

View File

@@ -4,3 +4,8 @@ ALTER TABLE `xpack_threshold_info`
ALTER TABLE `xpack_threshold_info_snapshot`
ADD COLUMN `show_field_value` tinyint(1) NOT NULL DEFAULT 0 COMMENT '显示字段值' AFTER `repeat_send`;
ALTER TABLE `snapshot_visualization_outer_params_target_view_info`
ADD COLUMN `match_mode` varchar(255) NULL DEFAULT 'self' COMMENT '匹配方式' AFTER `target_ds_id`;
ALTER TABLE `visualization_outer_params_target_view_info`
ADD COLUMN `match_mode` varchar(255) NULL DEFAULT 'self' COMMENT '匹配方式' AFTER `target_ds_id`;

View File

@@ -816,7 +816,8 @@
`target_field_id`,
`copy_from`,
`copy_id`,
`target_ds_id`
`target_ds_id`,
`match_mode`
) SELECT
voptvi.`target_id`,
voptvi.`params_info_id`,
@@ -824,7 +825,8 @@
voptvi.`target_field_id`,
voptvi.`copy_from`,
voptvi.`copy_id`,
voptvi.`target_ds_id`
voptvi.`target_ds_id`,
voptvi.`match_mode`
FROM
visualization_outer_params_target_view_info voptvi
LEFT JOIN visualization_outer_params_info vopi ON vopi.params_info_id = voptvi.params_info_id
@@ -1181,7 +1183,8 @@
`target_field_id`,
`copy_from`,
`copy_id`,
`target_ds_id`
`target_ds_id`,
`match_mode`
) SELECT
voptvi.`target_id`,
voptvi.`params_info_id`,
@@ -1189,7 +1192,8 @@
voptvi.`target_field_id`,
voptvi.`copy_from`,
voptvi.`copy_id`,
voptvi.`target_ds_id`
voptvi.`target_ds_id`,
voptvi.`match_mode`
FROM
snapshot_visualization_outer_params_target_view_info voptvi
LEFT JOIN snapshot_visualization_outer_params_info vopi ON vopi.params_info_id = voptvi.params_info_id

View File

@@ -46,6 +46,7 @@
<collection property="targetViewInfoList" ofType="io.dataease.visualization.dao.auto.entity.VisualizationOuterParamsTargetViewInfo">
<result column="target_view_id" jdbcType="VARCHAR" property="targetViewId"/>
<result column="target_ds_id" jdbcType="VARCHAR" property="targetDsId"/>
<result column="match_mode" jdbcType="VARCHAR" property="matchMode"/>
<result column="target_field_id" jdbcType="VARCHAR" property="targetFieldId"/>
</collection>
</resultMap>
@@ -71,6 +72,7 @@
ifnull( popi.checked, 0 ) AS checked,
poptvi.target_view_id,
poptvi.target_ds_id,
poptvi.match_mode,
poptvi.target_field_id
FROM
snapshot_visualization_outer_params pop
@@ -178,7 +180,7 @@
popi.required AS required,
popi.default_value AS default_value,
popi.enabled_default AS enabled_default,
CONCAT( poptvi.target_view_id, '#', poptvi.target_field_id ) AS targetInfo
CONCAT( poptvi.target_view_id, '#', poptvi.target_field_id, '#', poptvi.match_mode ) AS targetInfo
FROM
visualization_outer_params pop
LEFT JOIN visualization_outer_params_info popi ON pop.params_id = popi.params_id

View File

@@ -89,7 +89,8 @@
</el-icon>
</div>
</div>
<div style="flex: 1">{{ t('visualization.filter_component') }}</div>
<div style="width: 120px">{{ t('visualization.filter_component') }}</div>
<div style="width: 160px">{{ t('visualization.outer_params_type') }}</div>
<div style="flex: 1">{{ t('visualization.connection_condition') }}</div>
</div>
<div class="outer-filter-content">
@@ -101,12 +102,31 @@
:key="index"
>
<div style="width: 16px"></div>
<div style="flex: 1; line-height: 32px">
<div style="width: 120px; line-height: 32px">
<Icon name="filter-params"
><filterParams style="margin-top: 4px" class="svg-icon view-type-icon"
/></Icon>
<span>{{ findFilterName(baseFilter.id) }}</span>
</div>
<div style="width: 152px; margin-right: 12px">
<el-select
v-model="baseFilter.matchMode"
filterable
style="width: 100%"
:placeholder="t('v_query.select_query_condition')"
clearable
>
<el-option
:label="t('visualization.outer_params_type_self')"
value="self"
></el-option>
<el-option
:label="t('visualization.outer_params_type_filter')"
value="filter"
>
</el-option>
</el-select>
</div>
<div style="flex: 1">
<el-select
v-model="baseFilter.filterSelected"
@@ -567,9 +587,11 @@ const datasetInfoChange = datasetInfo => {
const paramsCheckedAdaptor = (outerParamsInfo, newBaseFilterInfo, newBaseDatasetInfo) => {
const dsFieldIdSelected = {}
const dsFilterMatchMode = {}
const viewMatchIds = []
outerParamsInfo.targetViewInfoList.forEach(targetViewInfo => {
viewMatchIds.push(targetViewInfo.targetViewId)
dsFilterMatchMode[targetViewInfo.targetDsId] = targetViewInfo.matchMode || 'self'
dsFieldIdSelected[targetViewInfo.targetDsId] =
targetViewInfo.targetFieldId === 'empty'
? targetViewInfo.targetViewId
@@ -601,6 +623,7 @@ const paramsCheckedAdaptor = (outerParamsInfo, newBaseFilterInfo, newBaseDataset
if (newBaseFilterInfo) {
newBaseFilterInfo.forEach(filterInfo => {
filterInfo['filterSelected'] = dsFieldIdSelected[filterInfo.id]
filterInfo['matchMode'] = dsFilterMatchMode[filterInfo.id] || 'self'
})
}
outerParamsInfo['filterInfo'] = newBaseFilterInfo
@@ -642,6 +665,7 @@ const save = () => {
outerParamsInfo.targetViewInfoList.push({
targetViewId: baseFilterInfo.filterSelected,
targetDsId: baseFilterInfo.id,
matchMode: baseFilterInfo.matchMode,
targetFieldId: 'empty'
})
}

View File

@@ -58,6 +58,7 @@ interface SelectConfig {
label: string
value: string
}[]
optionFilter: []
}
const { t } = useI18n()
@@ -76,7 +77,8 @@ const props = defineProps({
defaultValueCheck: false,
optionValueSource: 0,
multiple: false,
checkedFieldsMap: {}
checkedFieldsMap: {},
optionFilter: []
}
}
},
@@ -271,7 +273,16 @@ const handleFieldIdDefaultChange = (val: string[]) => {
})
.then(res => {
options.value = (res || [])
.filter(ele => ele !== null)
.filter(ele => {
return (
ele !== null &&
((config.value.optionFilter &&
config.value.optionFilter.length > 0 &&
config.value.optionFilter.includes(ele)) ||
!config.value.optionFilter ||
config.value.optionFilter.length === 0)
)
})
.map(ele => {
return {
label: `${ele}`,

View File

@@ -2945,6 +2945,9 @@ export default {
column_name: 'Field name'
},
visualization: {
outer_params_type: 'Type',
outer_params_type_self: 'Assignment',
outer_params_type_filter: 'Filter',
number_formatter: 'Number Content Format',
jump_dialog_background: 'Dialog Background Color',
jump_dialog_button: 'Dialog Font Color',

View File

@@ -2864,6 +2864,9 @@ export default {
column_name: '欄位名稱'
},
visualization: {
outer_params_type: '類型',
outer_params_type_self: '賦值',
outer_params_type_filter: '過濾',
number_formatter: '數字內容格式',
jump_dialog_background: '彈框背景色',
jump_dialog_button: '彈框字體色',

View File

@@ -2870,6 +2870,9 @@ export default {
column_name: '字段名称'
},
visualization: {
outer_params_type: '类型',
outer_params_type_self: '赋值',
outer_params_type_filter: '过滤',
number_formatter: '数字内容格式',
jump_dialog_background: '弹框背景色',
jump_dialog_button: '弹框字体色',

View File

@@ -1265,72 +1265,78 @@ export const dvMainStore = defineStore('dataVisualization', {
element.propValue?.forEach(filterItem => {
if (filterItem.id === targetViewId) {
let queryParams = paramValue
if (!['1', '7'].includes(filterItem.displayType)) {
// 查询组件除了时间组件 其他入参只支持文本 这里全部转为文本
queryParams = paramValue.map(number => String(number))
}
filterItem.defaultMapValue = []
filterItem.mapValue = []
filterItem.defaultValueCheck = true
filterItem.defaultValueFirstItem = false
filterItem.timeType = 'fixed'
if (['0', '2'].includes(filterItem.displayType)) {
const { optionValueSource, field, displayId } = filterItem
const queryMapFlag = optionValueSource === 1 && field.id !== displayId
let queryMapParams = queryParams
if (queryMapFlag) {
queryParams = filterEnumParamsReduce(queryParams, field.id)
queryMapParams = filterEnumParams(queryParams, field.id)
const targetMatchMode = targetInfoArray[2] // 目标匹配模式
if (targetMatchMode === 'filter') {
// do filter
filterItem['optionFilter'] = queryParams
} else {
if (!['1', '7'].includes(filterItem.displayType)) {
// 查询组件除了时间组件 其他入参只支持文本 这里全部转为文本
queryParams = paramValue.map(number => String(number))
}
// 0 文本类型 1 数字类型
if (filterItem.multiple) {
// multiple === true 多选
filterItem['selectValue'] = queryParams
filterItem['defaultValue'] = queryParams
} else {
// 单选
filterItem.defaultMapValue = []
filterItem.mapValue = []
filterItem.defaultValueCheck = true
filterItem.defaultValueFirstItem = false
filterItem.timeType = 'fixed'
if (['0', '2'].includes(filterItem.displayType)) {
const { optionValueSource, field, displayId } = filterItem
const queryMapFlag = optionValueSource === 1 && field.id !== displayId
let queryMapParams = queryParams
if (queryMapFlag) {
queryParams = filterEnumParamsReduce(queryParams, field.id)
queryMapParams = filterEnumParams(queryParams, field.id)
}
// 0 文本类型 1 数字类型
if (filterItem.multiple) {
// multiple === true 多选
filterItem['selectValue'] = queryParams
filterItem['defaultValue'] = queryParams
} else {
// 单选
filterItem['selectValue'] = queryParams[0]
filterItem['defaultValue'] = queryParams[0]
}
filterItem['defaultMapValue'] = queryMapParams
filterItem['mapValue'] = queryMapParams
} else if (filterItem.displayType === '1') {
// 1 时间类型
filterItem['selectValue'] = queryParams[0]
filterItem['defaultValue'] = queryParams[0]
}
filterItem['defaultMapValue'] = queryMapParams
filterItem['mapValue'] = queryMapParams
} else if (filterItem.displayType === '1') {
// 1 时间类型
filterItem['selectValue'] = queryParams[0]
filterItem['defaultValue'] = queryParams[0]
} else if (filterItem.displayType === '7') {
// 7 时间范围类型
filterItem['selectValue'] = queryParams
filterItem['defaultValue'] = queryParams
} else if (filterItem.displayType === '8') {
// 8 文本搜索
filterItem['conditionValueF'] = parmaValueSource + ''
filterItem['defaultConditionValueF'] = parmaValueSource + ''
} else if (filterItem.displayType === '9') {
// 9 下拉树
if (filterItem.multiple) {
// multiple === true 多选
} else if (filterItem.displayType === '7') {
// 7 时间范围类型
filterItem['selectValue'] = queryParams
filterItem['defaultValue'] = queryParams
} else {
// 单选
filterItem['selectValue'] = queryParams[0]
filterItem['defaultValue'] = queryParams[0]
} else if (filterItem.displayType === '8') {
// 8 文本搜索
filterItem['conditionValueF'] = parmaValueSource + ''
filterItem['defaultConditionValueF'] = parmaValueSource + ''
} else if (filterItem.displayType === '9') {
// 9 下拉树
if (filterItem.multiple) {
// multiple === true 多选
filterItem['selectValue'] = queryParams
filterItem['defaultValue'] = queryParams
} else {
// 单选
filterItem['selectValue'] = queryParams[0]
filterItem['defaultValue'] = queryParams[0]
}
} else if (filterItem.displayType === '22') {
filterItem['defaultNumValueStart'] = queryParams[0]
filterItem['defaultNumValueEnd'] = queryParams[1]
filterItem['numValueStart'] = queryParams[0]
filterItem['numValueEnd'] = queryParams[1]
}
if ('DE_EMPTY' === paramValueStr) {
filterItem['selectValue'] = null
filterItem['defaultValue'] = null
filterItem['conditionValueF'] = null
filterItem['defaultConditionValueF'] = null
}
if (filterItem['defaultValue']) {
defaultValueMap[filterItem.id] = filterItem['defaultValue']
}
} else if (filterItem.displayType === '22') {
filterItem['defaultNumValueStart'] = queryParams[0]
filterItem['defaultNumValueEnd'] = queryParams[1]
filterItem['numValueStart'] = queryParams[0]
filterItem['numValueEnd'] = queryParams[1]
}
if ('DE_EMPTY' === paramValueStr) {
filterItem['selectValue'] = null
filterItem['defaultValue'] = null
filterItem['conditionValueF'] = null
filterItem['defaultConditionValueF'] = null
}
if (filterItem['defaultValue']) {
defaultValueMap[filterItem.id] = filterItem['defaultValue']
}
}
})

View File

@@ -51,4 +51,7 @@ public class VisualizationOuterParamsTargetViewInfoVO implements Serializable {
* 复制来源ID
*/
private String copyId;
private String matchMode;
}