Merge pull request #12100 from dataease/pr@dev-v2@refactor_outer-params

refactor: 外部必填参数逻辑优化
This commit is contained in:
王嘉豪 2024-09-09 16:59:58 +08:00 committed by GitHub
commit f61d99e57b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 180 additions and 70 deletions

View File

@ -58,6 +58,11 @@ public class VisualizationOuterParamsInfo implements Serializable {
*/
private String defaultValue;
/**
* 是否启用默认值
*/
private Boolean enabledDefault;
public String getParamsInfoId() {
return paramsInfoId;
}
@ -122,6 +127,14 @@ public class VisualizationOuterParamsInfo implements Serializable {
this.defaultValue = defaultValue;
}
public Boolean getEnabledDefault() {
return enabledDefault;
}
public void setEnabledDefault(Boolean enabledDefault) {
this.enabledDefault = enabledDefault;
}
@Override
public String toString() {
return "VisualizationOuterParamsInfo{" +
@ -133,6 +146,7 @@ public class VisualizationOuterParamsInfo implements Serializable {
", copyId = " + copyId +
", required = " + required +
", defaultValue = " + defaultValue +
", enabledDefault = " + enabledDefault +
"}";
}
}

View File

@ -56,7 +56,7 @@ public class VisualizationOuterParamsService implements VisualizationOuterParams
@Override
public VisualizationOuterParamsDTO queryWithVisualizationId(String visualizationId) {
VisualizationOuterParamsDTO visualizationOuterParamsDTO = extOuterParamsMapper.queryWithVisualizationId(visualizationId);
VisualizationOuterParamsDTO visualizationOuterParamsDTO = extOuterParamsMapper.queryWithVisualizationId(visualizationId);
return visualizationOuterParamsDTO;
}
@ -77,21 +77,21 @@ public class VisualizationOuterParamsService implements VisualizationOuterParams
String paramsId = UUID.randomUUID().toString();
outerParamsDTO.setParamsId(paramsId);
VisualizationOuterParams newOuterParams = new VisualizationOuterParams();
BeanUtils.copyBean(newOuterParams,outerParamsDTO);
BeanUtils.copyBean(newOuterParams, outerParamsDTO);
outerParamsMapper.insert(newOuterParams);
Optional.ofNullable(outerParamsDTO.getOuterParamsInfoArray()).orElse(new ArrayList<>()).forEach(outerParamsInfo -> {
String paramsInfoId = UUID.randomUUID().toString();
outerParamsInfo.setParamsInfoId(paramsInfoId);
outerParamsInfo.setParamsId(paramsId);
VisualizationOuterParamsInfo newOuterParamsInfo = new VisualizationOuterParamsInfo();
BeanUtils.copyBean(newOuterParamsInfo,outerParamsInfo);
BeanUtils.copyBean(newOuterParamsInfo, outerParamsInfo);
outerParamsInfoMapper.insert(newOuterParamsInfo);
Optional.ofNullable(outerParamsInfo.getTargetViewInfoList()).orElse(new ArrayList<>()).forEach(targetViewInfo -> {
String targetViewInfoId = UUID.randomUUID().toString();
targetViewInfo.setTargetId(targetViewInfoId);
targetViewInfo.setParamsInfoId(paramsInfoId);
VisualizationOuterParamsTargetViewInfo newOuterParamsTargetViewInfo = new VisualizationOuterParamsTargetViewInfo();
BeanUtils.copyBean(newOuterParamsTargetViewInfo,targetViewInfo);
BeanUtils.copyBean(newOuterParamsTargetViewInfo, targetViewInfo);
outerParamsTargetViewInfoMapper.insert(newOuterParamsTargetViewInfo);
});
});
@ -101,28 +101,30 @@ public class VisualizationOuterParamsService implements VisualizationOuterParams
@Override
public VisualizationOuterParamsBaseResponse getOuterParamsInfo(String visualizationId) {
List<VisualizationOuterParamsInfoDTO> result = extOuterParamsMapper.getVisualizationOuterParamsInfo(visualizationId);
return new VisualizationOuterParamsBaseResponse(Optional.ofNullable(result).orElse(new ArrayList<>()).stream().collect(Collectors.toMap(VisualizationOuterParamsInfoDTO::getSourceInfo, VisualizationOuterParamsInfoDTO::getTargetInfoList)));
return new VisualizationOuterParamsBaseResponse(Optional.ofNullable(result).orElse(new ArrayList<>()).stream().collect(Collectors.toMap(VisualizationOuterParamsInfoDTO::getSourceInfo, VisualizationOuterParamsInfoDTO::getTargetInfoList)),
Optional.ofNullable(result).orElse(new ArrayList<>()).stream().collect(Collectors.toMap(VisualizationOuterParamsInfoDTO::getSourceInfo, paramsInfo -> paramsInfo))
);
}
@Override
public List<CoreDatasetGroupVO> queryDsWithVisualizationId(String visualizationId) {
List<CoreDatasetGroupVO> result = extOuterParamsMapper.queryDsWithVisualizationId(visualizationId);
if(!CollectionUtils.isEmpty(result)){
List<CoreDatasetGroupVO> result = extOuterParamsMapper.queryDsWithVisualizationId(visualizationId);
if (!CollectionUtils.isEmpty(result)) {
result.forEach(coreDatasetGroupVO -> {
List<CoreDatasetTableFieldVO> fields = coreDatasetGroupVO.getDatasetFields();
QueryWrapper<CoreDatasetTable> wrapper = new QueryWrapper<>();
wrapper.eq("dataset_group_id", coreDatasetGroupVO.getId());
List<CoreDatasetTable> tableResult = coreDatasetTableMapper.selectList(wrapper);
if(!CollectionUtils.isEmpty(tableResult)){
if (!CollectionUtils.isEmpty(tableResult)) {
tableResult.forEach(coreDatasetTable -> {
String sqlVarDetail = coreDatasetTable.getSqlVariableDetails();
if(StringUtils.isNotEmpty(sqlVarDetail)){
if (StringUtils.isNotEmpty(sqlVarDetail)) {
TypeReference<List<SqlVariableDetails>> listTypeReference = new TypeReference<List<SqlVariableDetails>>() {
};
List<SqlVariableDetails> defaultsSqlVariableDetails = JsonUtil.parseList(sqlVarDetail, listTypeReference);
defaultsSqlVariableDetails.forEach(sqlVariableDetails -> {
String varFieldId = coreDatasetTable.getId()+"|DE|"+sqlVariableDetails.getVariableName();
fields.add(new CoreDatasetTableFieldVO(varFieldId,sqlVariableDetails.getVariableName(), DeTypeConstants.DE_STRING));
String varFieldId = coreDatasetTable.getId() + "|DE|" + sqlVariableDetails.getVariableName();
fields.add(new CoreDatasetTableFieldVO(varFieldId, sqlVariableDetails.getVariableName(), DeTypeConstants.DE_STRING));
});
}
});

View File

@ -1,4 +1,5 @@
ALTER TABLE `visualization_outer_params_info`
ADD COLUMN `required` tinyint(1) DEFAULT 0 COMMENT '是否必填',
ADD COLUMN `default_value` longtext NULL COMMENT '默认值 JSON格式';
ADD COLUMN `enabled_default` tinyint(1) NULL DEFAULT 0 COMMENT '是否启用默认值';
update visualization_outer_params_info set required =0;

View File

@ -1,4 +1,5 @@
ALTER TABLE `visualization_outer_params_info`
ADD COLUMN `required` tinyint(1) DEFAULT 0 COMMENT '是否必填',
ADD COLUMN `default_value` longtext NULL COMMENT '默认值 JSON格式';
ADD COLUMN `enabled_default` tinyint(1) NULL DEFAULT 0 COMMENT '是否启用默认值';
update visualization_outer_params_info set required =0;

View File

@ -16,8 +16,9 @@
<result column="params_id" jdbcType="VARCHAR" property="paramsId" />
<result column="param_name" jdbcType="VARCHAR" property="paramName" />
<result column="checked" jdbcType="BIT" property="checked" />
<result column="required" jdbcType="BIT" property="checked" />
<result column="default_value" jdbcType="VARCHAR" property="copyFrom" />
<result column="required" jdbcType="BIT" property="required" />
<result column="default_value" jdbcType="VARCHAR" property="defaultValue" />
<result column="enabled_default" jdbcType="BIT" property="enabledDefault" />
<result column="copy_from" jdbcType="VARCHAR" property="copyFrom" />
<result column="copy_id" jdbcType="VARCHAR" property="copyId" />
</resultMap>
@ -51,6 +52,9 @@
<resultMap id="AllOuterParamsMap" type="io.dataease.api.visualization.dto.VisualizationOuterParamsInfoDTO">
<result column="sourceInfo" jdbcType="VARCHAR" property="sourceInfo"/>
<result column="required" jdbcType="VARCHAR" property="required"/>
<result column="default_value" jdbcType="VARCHAR" property="defaultValue"/>
<result column="enabled_default" jdbcType="VARCHAR" property="enabledDefault"/>
<collection property="targetInfoList" ofType="String">
<result column="targetInfo" jdbcType="VARCHAR"/>
</collection>
@ -61,6 +65,9 @@
pop.visualization_id,
popi.params_info_id,
popi.param_name,
popi.enabled_default,
popi.required,
popi.default_value,
ifnull( popi.checked, 0 ) AS checked,
poptvi.target_view_id,
poptvi.target_ds_id,
@ -118,7 +125,10 @@
<select id="getVisualizationOuterParamsInfo" resultMap="AllOuterParamsMap">
SELECT DISTINCT
param_name AS sourceInfo,
popi.param_name AS sourceInfo,
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
FROM
visualization_outer_params pop

View File

@ -68,7 +68,7 @@
</el-tree>
</el-row>
</el-col>
<el-col :span="14" class="preview-show">
<el-col :span="13" class="preview-show">
<el-row v-if="state.curNodeId">
<el-row class="new-params-title"> 选择参数关联组件 </el-row>
<el-row class="new-params-filter" v-if="state.outerParamsInfo?.filterInfo?.length">
@ -246,9 +246,31 @@
<empty-background description="请配置参数" img-type="noneWhite" />
</div>
</el-col>
<el-col :span="4" class="params-attach-setting">
<el-col :span="5" class="params-attach-setting">
<el-row v-if="state.curNodeId">
<el-row class="new-params-title"> 参数配置 </el-row>
<el-row class="params-attach-content">
<el-row>
<el-checkbox v-model="state.outerParamsInfo.required">必填 </el-checkbox>
</el-row>
<el-row>
<el-checkbox v-model="state.outerParamsInfo.enabledDefault">默认值 </el-checkbox>
</el-row>
<el-input
:ref="el => setArgRef(el, state.outerParamsInfo.paramsInfoId)"
:placeholder="'请输入参数'"
v-model="state.outerParamsInfo.defaultValue"
type="textarea"
:autosize="{ minRows: 4, maxRows: 8 }"
@change="
val =>
validateArgs(
state.outerParamsInfo.defaultValue,
state.outerParamsInfo.paramsInfoId
)
"
/>
</el-row>
</el-row>
</el-col>
</el-row>
@ -265,13 +287,12 @@
import { ref, reactive, computed, nextTick } from 'vue'
import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain'
import { storeToRefs } from 'pinia'
import { ElCol, ElMessage } from 'element-plus-secondary'
import { ElCol, ElInput, ElMessage } from 'element-plus-secondary'
import { useI18n } from '@/hooks/web/useI18n'
import { deepCopy } from '@/utils/utils'
import generateID from '@/utils/generateID'
import { queryWithVisualizationId, updateOuterParamsSet } from '@/api/visualization/outerParams'
import { queryOuterParamsDsInfo, viewDetailList } from '@/api/visualization/dataVisualization'
import checkArrayRepeat from '@/utils/check'
import HandleMore from '@/components/handle-more/src/HandleMore.vue'
import { fieldType } from '@/utils/attr'
import EmptyBackground from '@/components/empty-background/src/EmptyBackground.vue'
@ -318,6 +339,9 @@ const state = reactive({
outerParamsInfo: {
content: '',
linkType: '',
required: false,
enabledDefault: false,
defaultValue: null,
targetViewInfoList: [],
paramsInfoId: null
},
@ -326,7 +350,8 @@ const state = reactive({
paramName: '',
checked: true,
required: false,
defaultValue: {},
enabledDefault: false,
defaultValue: null,
targetViewInfoList: []
},
defaultTargetViewInfo: {
@ -350,6 +375,49 @@ const state = reactive({
}
})
const argRefs = ref({})
const setArgRef = (el, id) => {
if (el) {
argRefs.value[id] = el
}
}
const validateArgs = (val, id) => {
const cref = argRefs.value[id]
const e = cref.input
if (val === null || val === '' || typeof val === 'undefined') {
e.style.color = null
e.parentNode.removeAttribute('style')
const child = e.parentNode.querySelector('.error-msg')
if (child) {
e.parentNode.removeChild(child)
}
return true
}
try {
JSON.parse(val)
e.style.color = null
e.parentNode.removeAttribute('style')
const child = e.parentNode.querySelector('.error-msg')
if (child) {
e.parentNode.removeChild(child)
}
return true
} catch (error) {
e.style.color = 'red'
e.parentNode.setAttribute('style', 'box-shadow: 0 0 0 1px red inset;')
const child = e.parentNode.querySelector('.error-msg')
if (!child) {
const errorDom = document.createElement('div')
errorDom.className = 'error-msg'
errorDom.innerText = '格式错误'
e.parentNode.appendChild(errorDom)
}
return false
}
}
const viewSelectedField = computed(() =>
state.outerParamsInfo?.targetViewInfoList?.map(targetViewInfo => targetViewInfo.targetViewId)
)
@ -983,4 +1051,18 @@ defineExpose({
.params-attach-setting {
border-left: 1px solid #e6e6e6;
}
.params-attach-content {
padding: 16px;
}
:deep(.error-msg) {
color: red;
position: fixed;
z-index: 9;
font-size: 10px;
height: 10px;
margin-bottom: 12px;
margin-right: -80px;
}
</style>

View File

@ -68,6 +68,7 @@ onBeforeMount(async () => {
} catch (e) {
console.error(e)
ElMessage.error(t('visualization.outer_param_decode_error'))
return
}
}
if (tokenInfo && Object.keys(tokenInfo).length) {

View File

@ -72,6 +72,7 @@ onBeforeMount(async () => {
} catch (e) {
console.error(e)
ElMessage.error(t('visualization.outer_param_decode_error'))
return
}
}
const chartId = embeddedParams?.chartId || embeddedStore.chartId

View File

@ -24,6 +24,7 @@ import {
import { get, set } from 'lodash-es'
import { viewFieldTimeTrans } from '@/utils/viewUtils'
import { useAppearanceStoreWithOut } from '@/store/modules/appearance'
import { ElMessage } from 'element-plus-secondary'
export const dvMainStore = defineStore('dataVisualization', {
state: () => {
@ -114,6 +115,8 @@ export const dvMainStore = defineStore('dataVisualization', {
nowPanelJumpInfoTargetPanel: {},
// 当前仪表板的外部参数信息
nowPanelOuterParamsInfo: {},
// 当前仪表板的外部参数基础信息
nowPanelOuterParamsBaseInfo: null,
// 拖拽的组件信息
dragComponentInfo: null,
// 移动端布局状态
@ -887,6 +890,7 @@ export const dvMainStore = defineStore('dataVisualization', {
},
setNowPanelOuterParamsInfo(outerParamsInfo) {
this.nowPanelOuterParamsInfo = outerParamsInfo.outerParamsInfoMap
this.nowPanelOuterParamsBaseInfo = outerParamsInfo.outerParamsInfoBaseMap
},
// 添加联动 下钻 等查询组件
addViewTrackFilter(data) {
@ -939,8 +943,40 @@ export const dvMainStore = defineStore('dataVisualization', {
})
},
// 添加外部参数的过滤条件
addOuterParamsFilter(params, curComponentData = this.componentData, source = 'inner') {
addOuterParamsFilter(paramsPre, curComponentData = this.componentData, source = 'inner') {
// params 结构 {key1:value1,key2:value2}
const params = {}
if (this.nowPanelOuterParamsBaseInfo) {
let errorCount = 0
let errorMes = ''
Object.keys(this.nowPanelOuterParamsBaseInfo).forEach(key => {
const targetInfo = this.nowPanelOuterParamsBaseInfo[key]
const userParams = paramsPre[key]
const userParamsIsNull = !userParams || userParams.length === 0
if (targetInfo.required && userParamsIsNull) {
// 要求用户必填 但是用户没有输入参数
errorCount++
errorMes = errorMes + key + ';'
} else if (
userParamsIsNull &&
targetInfo.enabledDefault &&
targetInfo.defaultValue &&
targetInfo.defaultValue.length > 0
) {
// 非必填时 用户没有填写参数 但是启用默认值且有预设默认值时
params[key] = JSON.parse(targetInfo.defaultValue)
} else if (!userParamsIsNull) {
params[key] = paramsPre[key]
}
})
if (errorCount > 0) {
ElMessage.error('参数错误 ' + errorMes + '为必填参数')
return
}
} else {
return
}
if (params) {
const preActiveComponentIds = []
const trackInfo = this.nowPanelOuterParamsInfo

View File

@ -86,6 +86,7 @@ const loadCanvasDataAsync = async (dvId, dvType) => {
} catch (e) {
console.error(e)
ElMessage.error(t('visualization.outer_param_decode_error'))
return
}
}
initCanvasDataMobile(

View File

@ -1,5 +1,6 @@
package io.dataease.api.visualization.response;
import io.dataease.api.visualization.dto.VisualizationOuterParamsInfoDTO;
import lombok.Data;
import java.util.List;
@ -15,8 +16,11 @@ public class VisualizationOuterParamsBaseResponse {
// 获取仪表板外部参数映射信息
private Map<String, List<String>> outerParamsInfoMap;
public VisualizationOuterParamsBaseResponse(Map<String, List<String>> outerParamsInfoMap) {
private Map<String,VisualizationOuterParamsInfoDTO> outerParamsInfoBaseMap;
public VisualizationOuterParamsBaseResponse(Map<String, List<String>> outerParamsInfoMap,Map<String,VisualizationOuterParamsInfoDTO> outerParamsInfoBaseMap) {
this.outerParamsInfoMap = outerParamsInfoMap;
this.outerParamsInfoBaseMap = outerParamsInfoBaseMap;
}
public VisualizationOuterParamsBaseResponse() {

View File

@ -1,6 +1,7 @@
package io.dataease.api.visualization.vo;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
@ -12,6 +13,7 @@ import java.io.Serializable;
* @author fit2cloud
* @since 2024-03-08
*/
@Data
public class VisualizationOuterParamsInfoVO implements Serializable {
private static final long serialVersionUID = 1L;
@ -47,7 +49,10 @@ public class VisualizationOuterParamsInfoVO implements Serializable {
*/
private String defaultValue;
/**
* 是否启用默认值
*/
private Boolean enabledDefault;
/**
* 复制来源
*/
@ -58,54 +63,6 @@ public class VisualizationOuterParamsInfoVO implements Serializable {
*/
private String copyId;
public String getParamsInfoId() {
return paramsInfoId;
}
public void setParamsInfoId(String paramsInfoId) {
this.paramsInfoId = paramsInfoId;
}
public String getParamsId() {
return paramsId;
}
public void setParamsId(String paramsId) {
this.paramsId = paramsId;
}
public String getParamName() {
return paramName;
}
public void setParamName(String paramName) {
this.paramName = paramName;
}
public Boolean getChecked() {
return checked;
}
public void setChecked(Boolean checked) {
this.checked = checked;
}
public String getCopyFrom() {
return copyFrom;
}
public void setCopyFrom(String copyFrom) {
this.copyFrom = copyFrom;
}
public String getCopyId() {
return copyId;
}
public void setCopyId(String copyId) {
this.copyId = copyId;
}
@Override
public String toString() {
return "VisualizationOuterParamsInfo{" +