fix(图表): 修复仪表盘、水波图拖入计算字段报错的问题 #14466

This commit is contained in:
jianneng-fit2cloud
2025-01-13 13:47:40 +08:00
committed by jianneng-fit2cloud
parent 860e278083
commit da26ae071a
2 changed files with 127 additions and 79 deletions

View File

@@ -5,7 +5,7 @@ import { useI18n } from '@/hooks/web/useI18n'
import { DEFAULT_MISC } from '@/views/chart/components/editor/util/chart'
import { ElRow } from 'element-plus-secondary'
import { fieldType } from '@/utils/attr'
import { cloneDeep, defaultsDeep } from 'lodash-es'
import { cloneDeep, defaultsDeep, isEmpty } from 'lodash-es'
import { useEmitt } from '@/hooks/web/useEmitt'
import { iconFieldMap } from '@/components/icon-group/field-list'
@@ -37,7 +37,7 @@ useEmitt({
const emit = defineEmits(['onMiscChange'])
watch(
() => props.chart,
() => props.chart.customAttr.misc,
() => {
init()
initField()
@@ -98,112 +98,118 @@ const init = () => {
}
const initField = () => {
state.quotaData = props.quotaFields.filter(ele => ele.summary !== '' && ele.id !== '-1')
if (state.miscForm.gaugeMinField.id) {
state.quotaData = props.quotaFields.filter(ele => ele.id !== '-1')
if (!isEmpty(state.miscForm.gaugeMinField.id)) {
state.minField = getQuotaField(state.miscForm.gaugeMinField.id)
}
if (state.miscForm.gaugeMaxField.id) {
if (!isEmpty(state.miscForm.gaugeMaxField.id)) {
state.maxField = getQuotaField(state.miscForm.gaugeMaxField.id)
}
if (state.miscForm.liquidMaxField.id) {
if (!isEmpty(state.miscForm.liquidMaxField.id)) {
state.liquidMaxField = getQuotaField(state.miscForm.liquidMaxField.id)
}
initDynamicDefaultField()
}
const COUNT_DE_TYPE = [0, 1, 5]
const NUMBER_DE_TYPE = [1, 2, 3]
const getFieldSummaryByDeType = (deType: number) => {
return COUNT_DE_TYPE.includes(deType) || !deType ? 'count' : 'sum'
}
const initDynamicDefaultField = () => {
const yAxisId = props.chart.yAxis?.[0]?.id
if (yAxisId !== '-1' && state.quotaData.length) {
// 查找 quotaData 中是否存在 chart.yAxis[0].id
const yAxisExists = state.quotaData.find(ele => ele.id === yAxisId)
// 如果不存在
if (!yAxisExists && (state.miscForm.liquidMaxField.id || state.miscForm.gaugeMaxField.id)) {
if (props.chart.type === 'liquid' && !state.liquidProcessedNoYAxis) {
state.liquidProcessedNoYAxis = true
state.miscForm.liquidMaxField.id = ''
state.miscForm.liquidMaxField.summary = ''
state.liquidMaxField = getQuotaField(state.miscForm.liquidMaxField.id)
changeMisc('liquidMaxField', false)
} else {
if (!state.gaugeProcessedNoYAxis) {
state.gaugeProcessedNoYAxis = true
state.miscForm.gaugeMaxField.id = ''
state.miscForm.gaugeMaxField.summary = ''
state.maxField = {}
changeMisc('gaugeMaxField', false)
const yAxisField = props.chart.yAxis?.[0]
const yAxisId = yAxisField?.id
if (quotaData.value?.length === 0 || yAxisField?.id === '-1') {
state.miscForm.liquidMaxType = 'fix'
state.miscForm.liquidMaxField.id = ''
state.miscForm.gaugeMaxType = 'fix'
state.miscForm.gaugeMaxField.id = ''
state.miscForm.gaugeMinType = 'fix'
state.miscForm.gaugeMinField.id = ''
} else {
if (state.quotaData.length) {
// 查找 quotaData 中是否存在 chart.yAxis[0].id
const yAxisExists = state.quotaData.find(ele => ele.id === yAxisId)
// 如果不存在
if (!yAxisExists) {
if (props.chart.type === 'liquid' && !state.liquidProcessedNoYAxis) {
state.liquidProcessedNoYAxis = true
state.miscForm.liquidMaxField.id = ''
state.miscForm.liquidMaxField.summary = ''
state.liquidMaxField = {}
changeMisc('liquidMaxField', false)
} else {
if (!state.gaugeProcessedNoYAxis) {
state.gaugeProcessedNoYAxis = true
state.miscForm.gaugeMaxField.id = ''
state.miscForm.gaugeMaxField.summary = ''
state.maxField = {}
changeMisc('gaugeMaxField', false)
}
}
}
} else {
if (props.chart.type === 'liquid') {
if (state.miscForm.liquidMaxType === 'dynamic') {
state.miscForm.liquidMax = undefined
// 查找 quotaData 中是否存在 liquidMaxField.id
const liquidMaxFieldExists = state.quotaData.find(
ele => ele.id === state.miscForm.liquidMaxField.id
)
if (!liquidMaxFieldExists) {
if (yAxisId) {
} else {
if (props.chart.type === 'liquid') {
if (state.miscForm.liquidMaxType === 'dynamic') {
state.miscForm.liquidMax = undefined
// 拖入的字段是计算字段,并且当前选择的是该字段时,取其他字段
if (
yAxisId &&
(yAxisField.extField === 2 || !NUMBER_DE_TYPE.includes(yAxisField.deType)) &&
(state.miscForm.liquidMaxField.id === yAxisId || !state.miscForm.liquidMaxField.id)
) {
state.liquidProcessedNoYAxis = false
// 根据查找结果设置 liquidMaxField.id
state.miscForm.liquidMaxField.id = yAxisExists ? yAxisId : state.quotaData[0]?.id
state.miscForm.liquidMaxField.id = getDynamicFieldId()
state.liquidMaxField = getQuotaField(state.miscForm.liquidMaxField.id)
// 设置 summary 和 maxField
state.miscForm.liquidMaxField.summary = getFieldSummaryByDeType(
state.liquidMaxField?.deType
)
// 触发 changeMisc 事件
if (yAxisExists) {
changeMisc('liquidMaxField', true)
}
changeMisc('liquidMaxField', true)
}
}
}
if (!state.miscForm.liquidMax && state.miscForm.liquidMaxType === 'fix') {
state.miscForm.liquidMax = cloneDeep(defaultMaxValue.liquidMax)
}
} else {
if (state.miscForm.gaugeMaxType === 'dynamic') {
state.miscForm.gaugeMax = undefined
if (!state.miscForm.liquidMax && state.miscForm.liquidMaxType === 'fix') {
state.miscForm.liquidMax = cloneDeep(defaultMaxValue.liquidMax)
}
} else {
if (state.miscForm.gaugeMaxType === 'dynamic') {
state.miscForm.gaugeMax = undefined
// 查找 quotaData 中是否存在 gaugeMaxField.id
const gaugeMaxFieldExists = state.quotaData.find(
ele => ele.id === state.miscForm.gaugeMaxField.id
)
if (!gaugeMaxFieldExists) {
if (yAxisId) {
// 拖入的字段是计算字段,并且当前选择的是该字段时,取其他字段
if (
yAxisId &&
(yAxisField.extField === 2 || !NUMBER_DE_TYPE.includes(yAxisField.deType)) &&
(state.miscForm.gaugeMaxField.id === yAxisId || !state.miscForm.gaugeMaxField.id)
) {
state.gaugeProcessedNoYAxis = false
// 根据查找结果设置 gaugeMaxField.id
state.miscForm.gaugeMaxField.id = yAxisExists ? yAxisId : state.quotaData[0]?.id
state.miscForm.gaugeMaxField.id = getDynamicFieldId()
state.maxField = getQuotaField(state.miscForm.gaugeMaxField.id)
// 设置 summary 和 maxField
state.miscForm.gaugeMaxField.summary = getFieldSummaryByDeType(state.maxField?.deType)
if (yAxisExists) {
// 触发 changeMisc 事件
changeMisc('gaugeMaxField', true)
}
changeMisc('gaugeMaxField', true)
}
}
}
if (!state.miscForm.gaugeMax && state.miscForm.gaugeMaxType === 'fix') {
state.miscForm.gaugeMax = cloneDeep(defaultMaxValue.gaugeMax)
if (!state.miscForm.gaugeMax && state.miscForm.gaugeMaxType === 'fix') {
state.miscForm.gaugeMax = cloneDeep(defaultMaxValue.gaugeMax)
}
}
}
}
}
}
const getDynamicFieldId = () => {
return quotaData.value?.filter(
item => item.extField !== 2 && NUMBER_DE_TYPE.includes(item.deType)
)?.[0]?.id
}
const changeQuotaField = (type: string, resetSummary?: boolean) => {
let isCountField = props.chart.yAxis?.[0]?.id === '-1'
if (type === 'min') {
if (state.miscForm.gaugeMinType === 'dynamic') {
if (isCountField && state.quotaData.length) {
state.miscForm.gaugeMinField.id = state.quotaData[0]?.id
}
if (!state.miscForm.gaugeMinField.id && !isCountField) {
state.miscForm.gaugeMinField.id = props.chart.yAxis?.[0]?.id
setDynamicFieldId(state.miscForm.gaugeMinField)
}
if (!state.miscForm.gaugeMinField.summary) {
state.miscForm.gaugeMinField.summary = 'count'
@@ -226,16 +232,13 @@ const changeQuotaField = (type: string, resetSummary?: boolean) => {
}
} else if (type === 'max') {
if (props.chart.type === 'liquid') {
if (isCountField && state.quotaData.length) {
state.miscForm.liquidMaxField.id = state.quotaData[0]?.id
}
if (state.miscForm.liquidMaxType === 'dynamic') {
state.miscForm.liquidMax = undefined
} else if (!state.miscForm.liquidMax) {
state.miscForm.liquidMax = cloneDeep(defaultMaxValue.liquidMax)
}
if (!state.miscForm.liquidMaxField.id) {
state.miscForm.liquidMaxField.id = props.chart.yAxis?.[0]?.id
setDynamicFieldId(state.miscForm.liquidMaxField)
}
if (!state.miscForm.liquidMaxField.summary) {
state.miscForm.liquidMaxField.summary = 'count'
@@ -249,12 +252,9 @@ const changeQuotaField = (type: string, resetSummary?: boolean) => {
}
} else {
if (state.miscForm.gaugeMaxType === 'dynamic') {
if (isCountField && state.quotaData.length) {
state.miscForm.gaugeMaxField.id = state.quotaData[0]?.id
}
state.miscForm.gaugeMax = undefined
if (!state.miscForm.gaugeMaxField.id && !isCountField) {
state.miscForm.gaugeMaxField.id = props.chart.yAxis?.[0]?.id
setDynamicFieldId(state.miscForm.gaugeMaxField)
}
if (!state.miscForm.gaugeMaxField.summary) {
state.miscForm.gaugeMaxField.summary = 'count'
@@ -282,6 +282,18 @@ const changeQuotaField = (type: string, resetSummary?: boolean) => {
}
}
const setDynamicFieldId = fieldObj => {
if (
props.chart.yAxis?.[0]?.extField === 2 ||
props.chart.yAxis?.[0]?.id === '-1' ||
!NUMBER_DE_TYPE.includes(props.chart.yAxis?.[0]?.deType)
) {
fieldObj.id = getDynamicFieldId()
} else {
fieldObj.id = props.chart.yAxis?.[0]?.id
}
}
const getQuotaField = id => {
if (!id) {
return {}
@@ -340,14 +352,22 @@ const changeMaxValidate = prop => {
changeMisc(prop, true)
}
const addAxis = (form: AxisEditForm) => {
if (form.axis[0]?.id && !form.quotaData?.length) {
const uniqueIds = new Set(state.quotaData.map(item => item.id))
state.quotaData = [
...state.quotaData,
...props.quotaFields.filter(ele => ele.id !== '-1' && !uniqueIds.has(ele.id))
]
}
const maxTypeKey = props.chart.type === 'liquid' ? 'liquidMaxType' : 'gaugeMaxType'
const maxValueKey = props.chart.type === 'liquid' ? 'liquidMax' : 'gaugeMax'
if (form.axis[0]?.id === '-1') {
state.miscForm[maxTypeKey] = 'fix'
state.miscForm[maxValueKey] = cloneDeep(defaultMaxValue[maxValueKey])
changeMisc(maxValueKey + 'Field')
} else {
state.miscForm[maxTypeKey] = 'dynamic'
state.miscForm[maxValueKey + 'Field']['id'] = getDynamicFieldId()
state.miscForm[maxValueKey + 'Field']['summary'] = 'sum'
}
if (props.chart.type === 'gauge') {
state.miscForm.gaugeMinType = 'fix'
@@ -355,11 +375,33 @@ const addAxis = (form: AxisEditForm) => {
state.miscForm.gaugeMinField.id = ''
state.miscForm.gaugeMinField.summary = ''
}
if (!quotaData.value.length) {
state.miscForm[maxTypeKey] = 'fix'
state.miscForm[maxValueKey] = cloneDeep(defaultMaxValue[maxValueKey])
}
changeMisc(maxValueKey + 'Field', false)
}
const changeChartType = () => {
const maxTypeKey = props.chart.type === 'liquid' ? 'liquidMaxType' : 'gaugeMaxType'
const yAxisField = props.chart.yAxis?.[0]
if (quotaData.value?.length === 0 || yAxisField?.id === '-1') {
state.miscForm.liquidMaxType = 'fix'
state.miscForm.liquidMaxField.id = ''
state.miscForm.gaugeMaxType = 'fix'
state.miscForm.gaugeMaxField.id = ''
state.miscForm.gaugeMinType = 'fix'
state.miscForm.gaugeMinField.id = ''
changeMisc(null, true)
}
}
onMounted(() => {
init()
initField()
useEmitt({ name: 'addAxis', callback: addAxis })
useEmitt({ name: 'chart-type-change', callback: changeChartType })
})
const quotaData = computed(() => {
return state.quotaData.filter(item => NUMBER_DE_TYPE.includes(item.deType) && item.extField !== 2)
})
</script>
@@ -415,6 +457,7 @@ onMounted(() => {
v-model="state.miscForm.gaugeMinType"
size="small"
@change="changeQuotaField('min')"
:disabled="quotaData.length === 0"
>
<el-radio :effect="themes" label="fix">{{ t('chart.fix') }}</el-radio>
<el-radio :effect="themes" label="dynamic">{{ t('chart.dynamic') }}</el-radio>
@@ -448,7 +491,7 @@ onMounted(() => {
>
<el-option
class="series-select-option"
v-for="item in state.quotaData"
v-for="item in quotaData"
:key="item.id"
:label="item.name"
:value="item.id"
@@ -513,6 +556,7 @@ onMounted(() => {
v-model="state.miscForm.gaugeMaxType"
size="small"
@change="changeQuotaField('max')"
:disabled="quotaData.length === 0"
>
<el-radio :effect="themes" label="fix">{{ t('chart.fix') }}</el-radio>
<el-radio :effect="themes" label="dynamic">{{ t('chart.dynamic') }}</el-radio>
@@ -546,7 +590,7 @@ onMounted(() => {
>
<el-option
class="series-select-option"
v-for="item in state.quotaData"
v-for="item in quotaData"
:key="item.id"
:label="item.name"
:value="item.id"
@@ -659,6 +703,7 @@ onMounted(() => {
v-model="state.miscForm.liquidMaxType"
size="small"
@change="changeQuotaField('max')"
:disabled="quotaData.length === 0"
>
<el-radio :effect="themes" label="fix">
{{ t('chart.fix') }}
@@ -697,7 +742,7 @@ onMounted(() => {
>
<el-option
class="series-select-option"
v-for="item in state.quotaData"
v-for="item in quotaData"
:key="item.id"
:label="item.name"
:value="item.id"

View File

@@ -761,10 +761,13 @@ const addAxis = (e, axis: AxisType) => {
}
} else {
if (!dup && typeValid) {
const isGaugeOrLiquid = view.value.type === 'gauge' || view.value.type === 'liquid'
const quotaData = cloneDeep(state.quotaData)
emitter.emit('addAxis', {
axisType: axis,
axis: [view.value[axis][e.newDraggableIndex]],
editType: 'add'
editType: 'add',
...(isGaugeOrLiquid ? { quotaData: quotaData } : {})
})
}
}